From 4d79df90a735abd0acc06104724502380a737da2 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Wed, 20 Dec 2023 19:24:03 +0100 Subject: [PATCH 01/38] Feature/support search by asset profile id (#2765) * Add support to search for an asset profile by id * Update changelog --- CHANGELOG.md | 4 ++++ apps/api/src/app/admin/admin.service.ts | 1 + 2 files changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6ddc7802b..717cf02a0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +### Added + +- Added support to search for an asset profile by `id` as an administrator + ### Changed - Set the select column of the lazy-loaded activities table to stick at the end (experimental) diff --git a/apps/api/src/app/admin/admin.service.ts b/apps/api/src/app/admin/admin.service.ts index b46a0a13a..40aaf286e 100644 --- a/apps/api/src/app/admin/admin.service.ts +++ b/apps/api/src/app/admin/admin.service.ts @@ -176,6 +176,7 @@ export class AdminService { if (searchQuery) { where.OR = [ + { id: { mode: 'insensitive', startsWith: searchQuery } }, { isin: { mode: 'insensitive', startsWith: searchQuery } }, { name: { mode: 'insensitive', startsWith: searchQuery } }, { symbol: { mode: 'insensitive', startsWith: searchQuery } } From beb9e2c43f9612481cb057b09b047b49938d9519 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Thu, 21 Dec 2023 11:44:36 +0100 Subject: [PATCH 02/38] Feature/modernize nx executors (#2767) * Modernize Nx executors * @nx/eslint:lint * @nx/webpack:webpack * Update changelog --- CHANGELOG.md | 3 +++ apps/api/project.json | 4 ++-- apps/client/project.json | 2 +- apps/ui-e2e/project.json | 2 +- libs/common/project.json | 2 +- libs/ui/project.json | 2 +- 6 files changed, 9 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 717cf02a0..4fd49a7ab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Set the select column of the lazy-loaded activities table to stick at the end (experimental) - Improved the validation of the currency management in the admin control panel - Improved the performance of the value redaction interceptor for the impersonation mode by eliminating `cloneDeep` +- Modernized the `Nx` executors + - `@nx/eslint:lint` + - `@nx/webpack:webpack` ### Fixed diff --git a/apps/api/project.json b/apps/api/project.json index 81f887f41..f3c8bd1e0 100644 --- a/apps/api/project.json +++ b/apps/api/project.json @@ -7,7 +7,7 @@ "generators": {}, "targets": { "build": { - "executor": "@nrwl/webpack:webpack", + "executor": "@nx/webpack:webpack", "options": { "outputPath": "dist/apps/api", "main": "apps/api/src/main.ts", @@ -40,7 +40,7 @@ } }, "lint": { - "executor": "@nrwl/linter:eslint", + "executor": "@nx/eslint:lint", "options": { "lintFilePatterns": ["apps/api/**/*.ts"] } diff --git a/apps/client/project.json b/apps/client/project.json index 7563b3a75..26292ffee 100644 --- a/apps/client/project.json +++ b/apps/client/project.json @@ -207,7 +207,7 @@ } }, "lint": { - "executor": "@nrwl/linter:eslint", + "executor": "@nx/eslint:lint", "options": { "lintFilePatterns": ["apps/client/**/*.ts"] } diff --git a/apps/ui-e2e/project.json b/apps/ui-e2e/project.json index ab447db1b..4595b6c66 100644 --- a/apps/ui-e2e/project.json +++ b/apps/ui-e2e/project.json @@ -18,7 +18,7 @@ } }, "lint": { - "executor": "@nrwl/linter:eslint", + "executor": "@nx/eslint:lint", "options": { "lintFilePatterns": ["apps/ui-e2e/**/*.{js,ts}"] } diff --git a/libs/common/project.json b/libs/common/project.json index cee21720d..3bed072ff 100644 --- a/libs/common/project.json +++ b/libs/common/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nrwl/linter:eslint", + "executor": "@nx/eslint:lint", "options": { "lintFilePatterns": ["libs/common/**/*.ts"] } diff --git a/libs/ui/project.json b/libs/ui/project.json index 8f7529974..58e959344 100644 --- a/libs/ui/project.json +++ b/libs/ui/project.json @@ -18,7 +18,7 @@ } }, "lint": { - "executor": "@nrwl/linter:eslint", + "executor": "@nx/eslint:lint", "options": { "lintFilePatterns": ["libs/ui/src/**/*.ts", "libs/ui/src/**/*.html"] } From 337ca328c32b69f74cf8ca7f323bdc38404c3e47 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Fri, 22 Dec 2023 20:16:02 +0100 Subject: [PATCH 03/38] Feature/drop activity id on import (#2769) * Drop activity id on import * Update changelog --- CHANGELOG.md | 1 + .../import-activities-dialog.component.ts | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4fd49a7ab..ada43f294 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Set the select column of the lazy-loaded activities table to stick at the end (experimental) +- Dropped the activity id in the activities import - Improved the validation of the currency management in the admin control panel - Improved the performance of the value redaction interceptor for the impersonation mode by eliminating `cloneDeep` - Modernized the `Nx` executors diff --git a/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts b/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts index fcc2decd8..7fc4b234b 100644 --- a/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts +++ b/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts @@ -260,6 +260,14 @@ export class ImportActivitiesDialog implements OnDestroy { } } + content.activities = content.activities.map((activity) => { + if (activity.id) { + delete activity.id; + } + + return activity; + }); + try { const { activities } = await this.importActivitiesService.importJson({ From f27e21f9a0d8930b1251568a735e12151695aabb Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sat, 23 Dec 2023 17:45:37 +0100 Subject: [PATCH 04/38] Extend issue template (#2776) --- .github/ISSUE_TEMPLATE/bug_report.md | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 0d93138f6..1fabe2f48 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -6,7 +6,13 @@ labels: '' assignees: '' --- -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). +**Important Notice** + +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). + +Incomplete or non-reproducible issues may be closed, but we are here to help! If you encounter difficulties reproducing the bug or need assistance, please reach out to our community channels mentioned above. + +Thank you for your understanding and cooperation! **Bug Description** @@ -36,8 +42,9 @@ The Issue tracker is **ONLY** used for reporting bugs. New features should be di -- Cloud or Self-hosted - Ghostfolio Version X.Y.Z +- Cloud or Self-hosted +- Experimental Features enabled or disabled - Browser - OS From 3c5affce884751148ce5570d224606aeac31027e Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 24 Dec 2023 16:23:17 +0100 Subject: [PATCH 05/38] Feature/upgrade prettier to version 3.1.1 (#2768) * Upgrade prettier to version 3.1.1 * Update changelog --- CHANGELOG.md | 1 + package.json | 2 +- yarn.lock | 8 ++++---- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ada43f294..d5b70ce05 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Modernized the `Nx` executors - `@nx/eslint:lint` - `@nx/webpack:webpack` +- Upgraded `prettier` from version `3.1.0` to `3.1.1` ### Fixed diff --git a/package.json b/package.json index 1fee6fd2f..ca7b90ec6 100644 --- a/package.json +++ b/package.json @@ -187,7 +187,7 @@ "jest-environment-jsdom": "29.4.3", "jest-preset-angular": "13.1.4", "nx": "17.2.5", - "prettier": "3.1.0", + "prettier": "3.1.1", "prettier-plugin-organize-attributes": "1.0.0", "react": "18.2.0", "react-dom": "18.2.0", diff --git a/yarn.lock b/yarn.lock index 379b23802..db157c1b3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16858,10 +16858,10 @@ prettier-plugin-organize-attributes@1.0.0: resolved "https://registry.yarnpkg.com/prettier-plugin-organize-attributes/-/prettier-plugin-organize-attributes-1.0.0.tgz#037870ee3111b3c1d6371f677b64888de353cc63" integrity sha512-+NmameaLxbCcylEXsKPmawtzla5EE6ECqvGkpfQz4KM847fXDifB1gFnPQEpoADAq6IXg+cMI8Z0ISJEXa6fhg== -prettier@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.1.0.tgz#c6d16474a5f764ea1a4a373c593b779697744d5e" - integrity sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw== +prettier@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.1.1.tgz#6ba9f23165d690b6cbdaa88cb0807278f7019848" + integrity sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw== prettier@^2.8.0: version "2.8.8" From d152187ee8e08e40e84b6c8538aef274acf46b0d Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Tue, 26 Dec 2023 10:16:20 +0100 Subject: [PATCH 06/38] Feature/upgrade prisma to version 5.7.1 (#2780) * Upgrade prisma to version 5.7.1 * Update changelog --- CHANGELOG.md | 1 + package.json | 4 +-- yarn.lock | 90 ++++++++++++++++++++++++++-------------------------- 3 files changed, 48 insertions(+), 47 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d5b70ce05..cdb2b12b4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `@nx/eslint:lint` - `@nx/webpack:webpack` - Upgraded `prettier` from version `3.1.0` to `3.1.1` +- Upgraded `prisma` from version `5.7.0` to `5.7.1` ### Fixed diff --git a/package.json b/package.json index ca7b90ec6..5394988f9 100644 --- a/package.json +++ b/package.json @@ -81,7 +81,7 @@ "@nestjs/platform-express": "10.1.3", "@nestjs/schedule": "3.0.2", "@nestjs/serve-static": "4.0.0", - "@prisma/client": "5.7.0", + "@prisma/client": "5.7.1", "@simplewebauthn/browser": "8.3.1", "@simplewebauthn/server": "8.3.2", "@stripe/stripe-js": "1.47.0", @@ -122,7 +122,7 @@ "passport": "0.6.0", "passport-google-oauth20": "2.0.0", "passport-jwt": "4.0.0", - "prisma": "5.7.0", + "prisma": "5.7.1", "reflect-metadata": "0.1.13", "rxjs": "7.5.6", "stripe": "11.12.0", diff --git a/yarn.lock b/yarn.lock index db157c1b3..9174ff735 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4795,46 +4795,46 @@ resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== -"@prisma/client@5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@prisma/client/-/client-5.7.0.tgz#c29dd9a16e100902eb2d2443d90fee2482d2aeac" - integrity sha512-cZmglCrfNbYpzUtz7HscVHl38e9CrUs31nrVoGUK1nIPXGgt8hT4jj2s657UXcNdQ/jBUxDgGmHyu2Nyrq1txg== - -"@prisma/debug@5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@prisma/debug/-/debug-5.7.0.tgz#abdb2060be4fe819e73e2683cf1b039841566198" - integrity sha512-tZ+MOjWlVvz1kOEhNYMa4QUGURY+kgOUBqLHYIV8jmCsMuvA1tWcn7qtIMLzYWCbDcQT4ZS8xDgK0R2gl6/0wA== - -"@prisma/engines-version@5.7.0-41.79fb5193cf0a8fdbef536e4b4a159cad677ab1b9": - version "5.7.0-41.79fb5193cf0a8fdbef536e4b4a159cad677ab1b9" - resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-5.7.0-41.79fb5193cf0a8fdbef536e4b4a159cad677ab1b9.tgz#777827898f1bfe6a76b17fbe7d9600cf543c4cc1" - integrity sha512-V6tgRVi62jRwTm0Hglky3Scwjr/AKFBFtS+MdbsBr7UOuiu1TKLPc6xfPiyEN1+bYqjEtjxwGsHgahcJsd1rNg== - -"@prisma/engines@5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-5.7.0.tgz#a32e232819b66bd9dee7500b455781742dc54b2f" - integrity sha512-TkOMgMm60n5YgEKPn9erIvFX2/QuWnl3GBo6yTRyZKk5O5KQertXiNnrYgSLy0SpsKmhovEPQb+D4l0SzyE7XA== - dependencies: - "@prisma/debug" "5.7.0" - "@prisma/engines-version" "5.7.0-41.79fb5193cf0a8fdbef536e4b4a159cad677ab1b9" - "@prisma/fetch-engine" "5.7.0" - "@prisma/get-platform" "5.7.0" - -"@prisma/fetch-engine@5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@prisma/fetch-engine/-/fetch-engine-5.7.0.tgz#7d2795828b692b02707e7ab6876f6227a68fc309" - integrity sha512-zIn/qmO+N/3FYe7/L9o+yZseIU8ivh4NdPKSkQRIHfg2QVTVMnbhGoTcecbxfVubeTp+DjcbjS0H9fCuM4W04w== - dependencies: - "@prisma/debug" "5.7.0" - "@prisma/engines-version" "5.7.0-41.79fb5193cf0a8fdbef536e4b4a159cad677ab1b9" - "@prisma/get-platform" "5.7.0" - -"@prisma/get-platform@5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@prisma/get-platform/-/get-platform-5.7.0.tgz#eb81011f537c2d10c0225278cd5165a82d0b57c8" - integrity sha512-ZeV/Op4bZsWXuw5Tg05WwRI8BlKiRFhsixPcAM+5BKYSiUZiMKIi713tfT3drBq8+T0E1arNZgYSA9QYcglWNA== - dependencies: - "@prisma/debug" "5.7.0" +"@prisma/client@5.7.1": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@prisma/client/-/client-5.7.1.tgz#a124afd05663267f7255a639a81d28303684a063" + integrity sha512-TUSa4nUcC4nf/e7X3jyO1pEd6XcI/TLRCA0KjkA46RDIpxUaRsBYEOqITwXRW2c0bMFyKcCRXrH4f7h4q9oOlg== + +"@prisma/debug@5.7.1": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@prisma/debug/-/debug-5.7.1.tgz#064177066e630beb43492ffa608acc21a118e2ce" + integrity sha512-yrVSO/YZOxdeIxcBtZ5BaNqUfPrZkNsAKQIQg36cJKMxj/VYK3Vk5jMKkI+gQLl0KReo1YvX8GWKfV788SELjw== + +"@prisma/engines-version@5.7.1-1.0ca5ccbcfa6bdc81c003cf549abe4269f59c41e5": + version "5.7.1-1.0ca5ccbcfa6bdc81c003cf549abe4269f59c41e5" + resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-5.7.1-1.0ca5ccbcfa6bdc81c003cf549abe4269f59c41e5.tgz#b7845425313e5395a3a3e64f3e0d04c1f320fa92" + integrity sha512-dIR5IQK/ZxEoWRBDOHF87r1Jy+m2ih3Joi4vzJRP+FOj5yxCwS2pS5SBR3TWoVnEK1zxtLI/3N7BjHyGF84fgw== + +"@prisma/engines@5.7.1": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-5.7.1.tgz#631c27daa326bbacd5d7119446e0d3f15c0f274c" + integrity sha512-R+Pqbra8tpLP2cvyiUpx+SIKglav3nTCpA+rn6826CThviQ8yvbNG0s8jNpo51vS9FuZO3pOkARqG062vKX7uA== + dependencies: + "@prisma/debug" "5.7.1" + "@prisma/engines-version" "5.7.1-1.0ca5ccbcfa6bdc81c003cf549abe4269f59c41e5" + "@prisma/fetch-engine" "5.7.1" + "@prisma/get-platform" "5.7.1" + +"@prisma/fetch-engine@5.7.1": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@prisma/fetch-engine/-/fetch-engine-5.7.1.tgz#d7baa3493867c6f7cedfc41df477cfd0963059ca" + integrity sha512-9ELauIEBkIaEUpMIYPRlh5QELfoC6pyHolHVQgbNxglaINikZ9w9X7r1TIePAcm05pCNp2XPY1ObQIJW5nYfBQ== + dependencies: + "@prisma/debug" "5.7.1" + "@prisma/engines-version" "5.7.1-1.0ca5ccbcfa6bdc81c003cf549abe4269f59c41e5" + "@prisma/get-platform" "5.7.1" + +"@prisma/get-platform@5.7.1": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@prisma/get-platform/-/get-platform-5.7.1.tgz#bc2fe43838c7d47b321aa4728a0f60990d02bc9e" + integrity sha512-eDlswr3a1m5z9D/55Iyt/nZqS5UpD+DZ9MooBB3hvrcPhDQrcf9m4Tl7buy4mvAtrubQ626ECtb8c6L/f7rGSQ== + dependencies: + "@prisma/debug" "5.7.1" "@radix-ui/number@1.0.1": version "1.0.1" @@ -16895,12 +16895,12 @@ pretty-hrtime@^1.0.3: resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" integrity sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A== -prisma@5.7.0: - version "5.7.0" - resolved "https://registry.yarnpkg.com/prisma/-/prisma-5.7.0.tgz#3c1c56d392b5d1137de954edefa4533fa092663e" - integrity sha512-0rcfXO2ErmGAtxnuTNHQT9ztL0zZheQjOI/VNJzdq87C3TlGPQtMqtM+KCwU6XtmkoEr7vbCQqA7HF9IY0ST+Q== +prisma@5.7.1: + version "5.7.1" + resolved "https://registry.yarnpkg.com/prisma/-/prisma-5.7.1.tgz#af60ed90531adc0ab8a683c9b1fc86d841c39864" + integrity sha512-ekho7ziH0WEJvC4AxuJz+ewRTMskrebPcrKuBwcNzVDniYxx+dXOGcorNeIb9VEMO5vrKzwNYvhD271Ui2jnNw== dependencies: - "@prisma/engines" "5.7.0" + "@prisma/engines" "5.7.1" prismjs@^1.28.0: version "1.29.0" From 0953c072fe1609e1dc00dcbf19ec03c53e340567 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Tue, 26 Dec 2023 10:18:32 +0100 Subject: [PATCH 07/38] Release 2.32.0 (#2784) --- CHANGELOG.md | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cdb2b12b4..dee565cc8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 2.32.0 - 2023-12-26 ### Added diff --git a/package.json b/package.json index 5394988f9..9bf415e08 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "2.31.0", + "version": "2.32.0", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "repository": "https://github.com/ghostfolio/ghostfolio", From 7d68905f1ba3f35b34dc5e3a8f37fa1e33504ab6 Mon Sep 17 00:00:00 2001 From: underwater Date: Tue, 26 Dec 2023 19:23:25 +0100 Subject: [PATCH 08/38] Feature/use has permission annotation in endpoints (#2771) * Use HasPermission in endpoints * Update changelog --- CHANGELOG.md | 6 + apps/api/src/app/access/access.controller.ts | 27 +-- .../account-balance.controller.ts | 16 +- .../api/src/app/account/account.controller.ts | 58 ++--- apps/api/src/app/admin/admin.controller.ts | 226 +++--------------- .../src/app/admin/queue/queue.controller.ts | 59 +---- .../app/auth-device/auth-device.controller.ts | 36 +-- apps/api/src/app/auth/auth.controller.ts | 5 +- .../src/app/benchmark/benchmark.controller.ts | 43 +--- apps/api/src/app/cache/cache.controller.ts | 35 +-- .../exchange-rate/exchange-rate.controller.ts | 3 +- apps/api/src/app/export/export.controller.ts | 3 +- apps/api/src/app/import/import.controller.ts | 13 +- apps/api/src/app/order/order.controller.ts | 39 +-- .../src/app/platform/platform.controller.ts | 50 +--- .../src/app/portfolio/portfolio.controller.ts | 15 +- .../subscription/subscription.controller.ts | 5 +- apps/api/src/app/symbol/symbol.controller.ts | 5 +- apps/api/src/app/tag/tag.controller.ts | 44 +--- apps/api/src/app/user/user.controller.ts | 14 +- .../src/guards/has-permission.guard.spec.ts | 9 +- apps/api/src/guards/has-permission.guard.ts | 6 +- 22 files changed, 172 insertions(+), 545 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dee565cc8..c9f94abe8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### Changed + +- Used the `HasPermission` annotation in endpoints + ## 2.32.0 - 2023-12-26 ### Added diff --git a/apps/api/src/app/access/access.controller.ts b/apps/api/src/app/access/access.controller.ts index 59fd8605c..47f6c08b8 100644 --- a/apps/api/src/app/access/access.controller.ts +++ b/apps/api/src/app/access/access.controller.ts @@ -1,5 +1,7 @@ +import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorator'; +import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; import { Access } from '@ghostfolio/common/interfaces'; -import { hasPermission, permissions } from '@ghostfolio/common/permissions'; +import { permissions } from '@ghostfolio/common/permissions'; import type { RequestWithUser } from '@ghostfolio/common/types'; import { Body, @@ -28,7 +30,7 @@ export class AccessController { ) {} @Get() - @UseGuards(AuthGuard('jwt')) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async getAllAccesses(): Promise { const accessesWithGranteeUser = await this.accessService.accesses({ include: { @@ -57,20 +59,12 @@ export class AccessController { }); } + @HasPermission(permissions.createAccess) @Post() - @UseGuards(AuthGuard('jwt')) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async createAccess( @Body() data: CreateAccessDto ): Promise { - if ( - !hasPermission(this.request.user.permissions, permissions.createAccess) - ) { - throw new HttpException( - getReasonPhrase(StatusCodes.FORBIDDEN), - StatusCodes.FORBIDDEN - ); - } - return this.accessService.createAccess({ alias: data.alias || undefined, GranteeUser: data.granteeUserId @@ -81,15 +75,12 @@ export class AccessController { } @Delete(':id') - @UseGuards(AuthGuard('jwt')) + @HasPermission(permissions.deleteAccess) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async deleteAccess(@Param('id') id: string): Promise { const access = await this.accessService.access({ id }); - if ( - !hasPermission(this.request.user.permissions, permissions.deleteAccess) || - !access || - access.userId !== this.request.user.id - ) { + if (!access || access.userId !== this.request.user.id) { throw new HttpException( getReasonPhrase(StatusCodes.FORBIDDEN), StatusCodes.FORBIDDEN diff --git a/apps/api/src/app/account-balance/account-balance.controller.ts b/apps/api/src/app/account-balance/account-balance.controller.ts index b12249827..aca528c5f 100644 --- a/apps/api/src/app/account-balance/account-balance.controller.ts +++ b/apps/api/src/app/account-balance/account-balance.controller.ts @@ -1,4 +1,6 @@ -import { hasPermission, permissions } from '@ghostfolio/common/permissions'; +import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorator'; +import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; +import { permissions } from '@ghostfolio/common/permissions'; import type { RequestWithUser } from '@ghostfolio/common/types'; import { Controller, @@ -22,8 +24,9 @@ export class AccountBalanceController { @Inject(REQUEST) private readonly request: RequestWithUser ) {} + @HasPermission(permissions.deleteAccountBalance) @Delete(':id') - @UseGuards(AuthGuard('jwt')) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async deleteAccountBalance( @Param('id') id: string ): Promise { @@ -31,14 +34,7 @@ export class AccountBalanceController { id }); - if ( - !hasPermission( - this.request.user.permissions, - permissions.deleteAccountBalance - ) || - !accountBalance || - accountBalance.userId !== this.request.user.id - ) { + if (!accountBalance || accountBalance.userId !== this.request.user.id) { throw new HttpException( getReasonPhrase(StatusCodes.FORBIDDEN), StatusCodes.FORBIDDEN diff --git a/apps/api/src/app/account/account.controller.ts b/apps/api/src/app/account/account.controller.ts index 772a66e4c..ddbe02fcc 100644 --- a/apps/api/src/app/account/account.controller.ts +++ b/apps/api/src/app/account/account.controller.ts @@ -1,5 +1,7 @@ import { AccountBalanceService } from '@ghostfolio/api/app/account-balance/account-balance.service'; import { PortfolioService } from '@ghostfolio/api/app/portfolio/portfolio.service'; +import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorator'; +import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; 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'; @@ -7,7 +9,7 @@ import { AccountBalancesResponse, Accounts } from '@ghostfolio/common/interfaces'; -import { hasPermission, permissions } from '@ghostfolio/common/permissions'; +import { permissions } from '@ghostfolio/common/permissions'; import type { AccountWithValue, RequestWithUser @@ -47,17 +49,9 @@ export class AccountController { ) {} @Delete(':id') - @UseGuards(AuthGuard('jwt')) + @HasPermission(permissions.deleteAccount) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async deleteAccount(@Param('id') id: string): Promise { - if ( - !hasPermission(this.request.user.permissions, permissions.deleteAccount) - ) { - throw new HttpException( - getReasonPhrase(StatusCodes.FORBIDDEN), - StatusCodes.FORBIDDEN - ); - } - const account = await this.accountService.accountWithOrders( { id_userId: { @@ -87,7 +81,7 @@ export class AccountController { } @Get() - @UseGuards(AuthGuard('jwt')) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) @UseInterceptors(RedactValuesInResponseInterceptor) public async getAllAccounts( @Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId @@ -102,7 +96,7 @@ export class AccountController { } @Get(':id') - @UseGuards(AuthGuard('jwt')) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) @UseInterceptors(RedactValuesInResponseInterceptor) public async getAccountById( @Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId, @@ -122,7 +116,7 @@ export class AccountController { } @Get(':id/balances') - @UseGuards(AuthGuard('jwt')) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) @UseInterceptors(RedactValuesInResponseInterceptor) public async getAccountBalancesById( @Param('id') id: string @@ -133,20 +127,12 @@ export class AccountController { }); } + @HasPermission(permissions.createAccount) @Post() - @UseGuards(AuthGuard('jwt')) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async createAccount( @Body() data: CreateAccountDto ): Promise { - if ( - !hasPermission(this.request.user.permissions, permissions.createAccount) - ) { - throw new HttpException( - getReasonPhrase(StatusCodes.FORBIDDEN), - StatusCodes.FORBIDDEN - ); - } - if (data.platformId) { const platformId = data.platformId; delete data.platformId; @@ -172,20 +158,12 @@ export class AccountController { } } + @HasPermission(permissions.updateAccount) @Post('transfer-balance') - @UseGuards(AuthGuard('jwt')) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async transferAccountBalance( @Body() { accountIdFrom, accountIdTo, balance }: TransferBalanceDto ) { - if ( - !hasPermission(this.request.user.permissions, permissions.updateAccount) - ) { - throw new HttpException( - getReasonPhrase(StatusCodes.FORBIDDEN), - StatusCodes.FORBIDDEN - ); - } - const accountsOfUser = await this.accountService.getAccounts( this.request.user.id ); @@ -234,18 +212,10 @@ export class AccountController { }); } + @HasPermission(permissions.updateAccount) @Put(':id') - @UseGuards(AuthGuard('jwt')) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async update(@Param('id') id: string, @Body() data: UpdateAccountDto) { - if ( - !hasPermission(this.request.user.permissions, permissions.updateAccount) - ) { - throw new HttpException( - getReasonPhrase(StatusCodes.FORBIDDEN), - StatusCodes.FORBIDDEN - ); - } - const originalAccount = await this.accountService.account({ id_userId: { id, diff --git a/apps/api/src/app/admin/admin.controller.ts b/apps/api/src/app/admin/admin.controller.ts index e277e77e4..cc4da298b 100644 --- a/apps/api/src/app/admin/admin.controller.ts +++ b/apps/api/src/app/admin/admin.controller.ts @@ -1,3 +1,5 @@ +import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorator'; +import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; import { TransformDataSourceInRequestInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-request.interceptor'; import { ApiService } from '@ghostfolio/api/services/api/api.service'; import { DataGatheringService } from '@ghostfolio/api/services/data-gathering/data-gathering.service'; @@ -59,56 +61,23 @@ export class AdminController { ) {} @Get() - @UseGuards(AuthGuard('jwt')) + @HasPermission(permissions.accessAdminControl) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async getAdminData(): Promise { - if ( - !hasPermission( - this.request.user.permissions, - permissions.accessAdminControl - ) - ) { - throw new HttpException( - getReasonPhrase(StatusCodes.FORBIDDEN), - StatusCodes.FORBIDDEN - ); - } - return this.adminService.get(); } + @HasPermission(permissions.accessAdminControl) @Post('gather') - @UseGuards(AuthGuard('jwt')) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async gather7Days(): Promise { - if ( - !hasPermission( - this.request.user.permissions, - permissions.accessAdminControl - ) - ) { - throw new HttpException( - getReasonPhrase(StatusCodes.FORBIDDEN), - StatusCodes.FORBIDDEN - ); - } - this.dataGatheringService.gather7Days(); } + @HasPermission(permissions.accessAdminControl) @Post('gather/max') - @UseGuards(AuthGuard('jwt')) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async gatherMax(): Promise { - if ( - !hasPermission( - this.request.user.permissions, - permissions.accessAdminControl - ) - ) { - throw new HttpException( - getReasonPhrase(StatusCodes.FORBIDDEN), - StatusCodes.FORBIDDEN - ); - } - const uniqueAssets = await this.dataGatheringService.getUniqueAssets(); await this.dataGatheringService.addJobsToQueue( @@ -130,21 +99,10 @@ export class AdminController { this.dataGatheringService.gatherMax(); } + @HasPermission(permissions.accessAdminControl) @Post('gather/profile-data') - @UseGuards(AuthGuard('jwt')) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async gatherProfileData(): Promise { - if ( - !hasPermission( - this.request.user.permissions, - permissions.accessAdminControl - ) - ) { - throw new HttpException( - getReasonPhrase(StatusCodes.FORBIDDEN), - StatusCodes.FORBIDDEN - ); - } - const uniqueAssets = await this.dataGatheringService.getUniqueAssets(); await this.dataGatheringService.addJobsToQueue( @@ -164,24 +122,13 @@ export class AdminController { ); } + @HasPermission(permissions.accessAdminControl) @Post('gather/profile-data/:dataSource/:symbol') - @UseGuards(AuthGuard('jwt')) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async gatherProfileDataForSymbol( @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 - ); - } - await this.dataGatheringService.addJobToQueue({ data: { dataSource, @@ -196,47 +143,25 @@ export class AdminController { } @Post('gather/:dataSource/:symbol') - @UseGuards(AuthGuard('jwt')) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) + @HasPermission(permissions.accessAdminControl) public async gatherSymbol( @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 - ); - } - this.dataGatheringService.gatherSymbol({ dataSource, symbol }); return; } + @HasPermission(permissions.accessAdminControl) @Post('gather/:dataSource/:symbol/:dateString') - @UseGuards(AuthGuard('jwt')) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async gatherSymbolForDate( @Param('dataSource') dataSource: DataSource, @Param('dateString') dateString: string, @Param('symbol') symbol: string ): Promise { - if ( - !hasPermission( - this.request.user.permissions, - permissions.accessAdminControl - ) - ) { - throw new HttpException( - getReasonPhrase(StatusCodes.FORBIDDEN), - StatusCodes.FORBIDDEN - ); - } - const date = parseISO(dateString); if (!isDate(date)) { @@ -254,7 +179,8 @@ export class AdminController { } @Get('market-data') - @UseGuards(AuthGuard('jwt')) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) + @HasPermission(permissions.accessAdminControl) public async getMarketData( @Query('assetSubClasses') filterByAssetSubClasses?: string, @Query('presetId') presetId?: MarketDataPreset, @@ -264,18 +190,6 @@ export class AdminController { @Query('sortDirection') sortDirection?: Prisma.SortOrder, @Query('take') take?: number ): Promise { - if ( - !hasPermission( - this.request.user.permissions, - permissions.accessAdminControl - ) - ) { - throw new HttpException( - getReasonPhrase(StatusCodes.FORBIDDEN), - StatusCodes.FORBIDDEN - ); - } - const filters = this.apiService.buildFiltersFromQueryParams({ filterByAssetSubClasses, filterBySearchQuery @@ -292,45 +206,23 @@ export class AdminController { } @Get('market-data/:dataSource/:symbol') - @UseGuards(AuthGuard('jwt')) + @HasPermission(permissions.accessAdminControl) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async getMarketDataBySymbol( @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.getMarketDataBySymbol({ dataSource, symbol }); } + @HasPermission(permissions.accessAdminControl) @Post('market-data/:dataSource/:symbol') - @UseGuards(AuthGuard('jwt')) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async updateMarketData( @Body() data: UpdateBulkMarketDataDto, @Param('dataSource') dataSource: DataSource, @Param('symbol') symbol: string ) { - if ( - !hasPermission( - this.request.user.permissions, - permissions.accessAdminControl - ) - ) { - throw new HttpException( - getReasonPhrase(StatusCodes.FORBIDDEN), - StatusCodes.FORBIDDEN - ); - } - const dataBulkUpdate: Prisma.MarketDataUpdateInput[] = data.marketData.map( ({ date, marketPrice }) => ({ dataSource, @@ -349,26 +241,15 @@ export class AdminController { /** * @deprecated */ + @HasPermission(permissions.accessAdminControl) @Put('market-data/:dataSource/:symbol/:dateString') - @UseGuards(AuthGuard('jwt')) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async update( @Param('dataSource') dataSource: DataSource, @Param('dateString') dateString: string, @Param('symbol') symbol: string, @Body() data: UpdateMarketDataDto ) { - if ( - !hasPermission( - this.request.user.permissions, - permissions.accessAdminControl - ) - ) { - throw new HttpException( - getReasonPhrase(StatusCodes.FORBIDDEN), - StatusCodes.FORBIDDEN - ); - } - const date = parseISO(dateString); return this.marketDataService.updateMarketData({ @@ -383,24 +264,14 @@ export class AdminController { }); } + @HasPermission(permissions.accessAdminControl) @Post('profile-data/:dataSource/:symbol') - @UseGuards(AuthGuard('jwt')) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) @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, @@ -409,45 +280,23 @@ export class AdminController { } @Delete('profile-data/:dataSource/:symbol') - @UseGuards(AuthGuard('jwt')) + @HasPermission(permissions.accessAdminControl) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async deleteProfileData( @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.deleteProfileData({ dataSource, symbol }); } + @HasPermission(permissions.accessAdminControl) @Patch('profile-data/:dataSource/:symbol') - @UseGuards(AuthGuard('jwt')) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) 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, @@ -455,24 +304,13 @@ export class AdminController { }); } + @HasPermission(permissions.accessAdminControl) @Put('settings/:key') - @UseGuards(AuthGuard('jwt')) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async updateProperty( @Param('key') key: string, @Body() data: PropertyDto ) { - if ( - !hasPermission( - this.request.user.permissions, - permissions.accessAdminControl - ) - ) { - throw new HttpException( - getReasonPhrase(StatusCodes.FORBIDDEN), - StatusCodes.FORBIDDEN - ); - } - return await this.adminService.putSetting(key, data.value); } } diff --git a/apps/api/src/app/admin/queue/queue.controller.ts b/apps/api/src/app/admin/queue/queue.controller.ts index 1dce79c9d..e146804ef 100644 --- a/apps/api/src/app/admin/queue/queue.controller.ts +++ b/apps/api/src/app/admin/queue/queue.controller.ts @@ -1,87 +1,48 @@ +import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorator'; +import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; import { AdminJobs } from '@ghostfolio/common/interfaces'; -import { hasPermission, permissions } from '@ghostfolio/common/permissions'; -import type { RequestWithUser } from '@ghostfolio/common/types'; +import { permissions } from '@ghostfolio/common/permissions'; import { Controller, Delete, Get, - HttpException, - Inject, Param, Query, UseGuards } from '@nestjs/common'; -import { REQUEST } from '@nestjs/core'; import { AuthGuard } from '@nestjs/passport'; import { JobStatus } from 'bull'; -import { StatusCodes, getReasonPhrase } from 'http-status-codes'; import { QueueService } from './queue.service'; @Controller('admin/queue') export class QueueController { - public constructor( - private readonly queueService: QueueService, - @Inject(REQUEST) private readonly request: RequestWithUser - ) {} + public constructor(private readonly queueService: QueueService) {} @Delete('job') - @UseGuards(AuthGuard('jwt')) + @HasPermission(permissions.accessAdminControl) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async deleteJobs( @Query('status') filterByStatus?: string ): Promise { - if ( - !hasPermission( - this.request.user.permissions, - permissions.accessAdminControl - ) - ) { - throw new HttpException( - getReasonPhrase(StatusCodes.FORBIDDEN), - StatusCodes.FORBIDDEN - ); - } - const status = filterByStatus?.split(',') ?? undefined; return this.queueService.deleteJobs({ status }); } @Get('job') - @UseGuards(AuthGuard('jwt')) + @HasPermission(permissions.accessAdminControl) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async getJobs( @Query('status') filterByStatus?: string ): Promise { - if ( - !hasPermission( - this.request.user.permissions, - permissions.accessAdminControl - ) - ) { - throw new HttpException( - getReasonPhrase(StatusCodes.FORBIDDEN), - StatusCodes.FORBIDDEN - ); - } - const status = filterByStatus?.split(',') ?? undefined; return this.queueService.getJobs({ status }); } @Delete('job/:id') - @UseGuards(AuthGuard('jwt')) + @HasPermission(permissions.accessAdminControl) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async deleteJob(@Param('id') id: string): Promise { - if ( - !hasPermission( - this.request.user.permissions, - permissions.accessAdminControl - ) - ) { - throw new HttpException( - getReasonPhrase(StatusCodes.FORBIDDEN), - StatusCodes.FORBIDDEN - ); - } - return this.queueService.deleteJob(id); } } diff --git a/apps/api/src/app/auth-device/auth-device.controller.ts b/apps/api/src/app/auth-device/auth-device.controller.ts index 33eae0cc0..ed936c88d 100644 --- a/apps/api/src/app/auth-device/auth-device.controller.ts +++ b/apps/api/src/app/auth-device/auth-device.controller.ts @@ -1,40 +1,18 @@ import { AuthDeviceService } from '@ghostfolio/api/app/auth-device/auth-device.service'; -import { hasPermission, permissions } from '@ghostfolio/common/permissions'; -import type { RequestWithUser } from '@ghostfolio/common/types'; -import { - Controller, - Delete, - HttpException, - Inject, - Param, - UseGuards -} from '@nestjs/common'; -import { REQUEST } from '@nestjs/core'; +import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorator'; +import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; +import { permissions } from '@ghostfolio/common/permissions'; +import { Controller, Delete, Param, UseGuards } from '@nestjs/common'; import { AuthGuard } from '@nestjs/passport'; -import { StatusCodes, getReasonPhrase } from 'http-status-codes'; @Controller('auth-device') export class AuthDeviceController { - public constructor( - private readonly authDeviceService: AuthDeviceService, - @Inject(REQUEST) private readonly request: RequestWithUser - ) {} + public constructor(private readonly authDeviceService: AuthDeviceService) {} @Delete(':id') - @UseGuards(AuthGuard('jwt')) + @HasPermission(permissions.deleteAuthDevice) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async deleteAuthDevice(@Param('id') id: string): Promise { - if ( - !hasPermission( - this.request.user.permissions, - permissions.deleteAuthDevice - ) - ) { - throw new HttpException( - getReasonPhrase(StatusCodes.FORBIDDEN), - StatusCodes.FORBIDDEN - ); - } - await this.authDeviceService.deleteAuthDevice({ id }); } } diff --git a/apps/api/src/app/auth/auth.controller.ts b/apps/api/src/app/auth/auth.controller.ts index 376109b8d..5c4131a56 100644 --- a/apps/api/src/app/auth/auth.controller.ts +++ b/apps/api/src/app/auth/auth.controller.ts @@ -1,4 +1,5 @@ import { WebAuthService } from '@ghostfolio/api/app/auth/web-auth.service'; +import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { DEFAULT_LANGUAGE_CODE } from '@ghostfolio/common/config'; import { OAuthResponse } from '@ghostfolio/common/interfaces'; @@ -118,13 +119,13 @@ export class AuthController { } @Get('webauthn/generate-registration-options') - @UseGuards(AuthGuard('jwt')) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async generateRegistrationOptions() { return this.webAuthService.generateRegistrationOptions(); } @Post('webauthn/verify-attestation') - @UseGuards(AuthGuard('jwt')) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async verifyAttestation( @Body() body: { deviceName: string; credential: AttestationCredentialJSON } ) { diff --git a/apps/api/src/app/benchmark/benchmark.controller.ts b/apps/api/src/app/benchmark/benchmark.controller.ts index 2230ff42b..0fd47f4e2 100644 --- a/apps/api/src/app/benchmark/benchmark.controller.ts +++ b/apps/api/src/app/benchmark/benchmark.controller.ts @@ -1,3 +1,5 @@ +import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorator'; +import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; 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 type { @@ -5,8 +7,7 @@ import type { BenchmarkResponse, UniqueAsset } from '@ghostfolio/common/interfaces'; -import { hasPermission, permissions } from '@ghostfolio/common/permissions'; -import type { RequestWithUser } from '@ghostfolio/common/types'; +import { permissions } from '@ghostfolio/common/permissions'; import { Body, Controller, @@ -19,7 +20,6 @@ import { 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'; @@ -28,26 +28,12 @@ import { BenchmarkService } from './benchmark.service'; @Controller('benchmark') export class BenchmarkController { - public constructor( - private readonly benchmarkService: BenchmarkService, - @Inject(REQUEST) private readonly request: RequestWithUser - ) {} + public constructor(private readonly benchmarkService: BenchmarkService) {} + @HasPermission(permissions.accessAdminControl) @Post() - @UseGuards(AuthGuard('jwt')) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) 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, @@ -71,23 +57,12 @@ export class BenchmarkController { } @Delete(':dataSource/:symbol') - @UseGuards(AuthGuard('jwt')) + @HasPermission(permissions.accessAdminControl) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async deleteBenchmark( @Param('dataSource') dataSource: DataSource, @Param('symbol') symbol: string ) { - if ( - !hasPermission( - this.request.user.permissions, - permissions.accessAdminControl - ) - ) { - throw new HttpException( - getReasonPhrase(StatusCodes.FORBIDDEN), - StatusCodes.FORBIDDEN - ); - } - try { const benchmark = await this.benchmarkService.deleteBenchmark({ dataSource, @@ -120,7 +95,7 @@ export class BenchmarkController { } @Get(':dataSource/:symbol/:startDateString') - @UseGuards(AuthGuard('jwt')) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) @UseInterceptors(TransformDataSourceInRequestInterceptor) public async getBenchmarkMarketDataBySymbol( @Param('dataSource') dataSource: DataSource, diff --git a/apps/api/src/app/cache/cache.controller.ts b/apps/api/src/app/cache/cache.controller.ts index 4d8aac5d3..de46c4551 100644 --- a/apps/api/src/app/cache/cache.controller.ts +++ b/apps/api/src/app/cache/cache.controller.ts @@ -1,39 +1,18 @@ import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.service'; -import { hasPermission, permissions } from '@ghostfolio/common/permissions'; -import type { RequestWithUser } from '@ghostfolio/common/types'; -import { - Controller, - HttpException, - Inject, - Post, - UseGuards -} from '@nestjs/common'; -import { REQUEST } from '@nestjs/core'; +import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorator'; +import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; +import { permissions } from '@ghostfolio/common/permissions'; +import { Controller, Post, UseGuards } from '@nestjs/common'; import { AuthGuard } from '@nestjs/passport'; -import { StatusCodes, getReasonPhrase } from 'http-status-codes'; @Controller('cache') export class CacheController { - public constructor( - private readonly redisCacheService: RedisCacheService, - @Inject(REQUEST) private readonly request: RequestWithUser - ) {} + public constructor(private readonly redisCacheService: RedisCacheService) {} + @HasPermission(permissions.accessAdminControl) @Post('flush') - @UseGuards(AuthGuard('jwt')) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async flushCache(): Promise { - if ( - !hasPermission( - this.request.user.permissions, - permissions.accessAdminControl - ) - ) { - throw new HttpException( - getReasonPhrase(StatusCodes.FORBIDDEN), - StatusCodes.FORBIDDEN - ); - } - return this.redisCacheService.reset(); } } diff --git a/apps/api/src/app/exchange-rate/exchange-rate.controller.ts b/apps/api/src/app/exchange-rate/exchange-rate.controller.ts index 8e01c4ca9..c66dd08e6 100644 --- a/apps/api/src/app/exchange-rate/exchange-rate.controller.ts +++ b/apps/api/src/app/exchange-rate/exchange-rate.controller.ts @@ -1,3 +1,4 @@ +import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; import { IDataProviderHistoricalResponse } from '@ghostfolio/api/services/interfaces/interfaces'; import { Controller, @@ -19,7 +20,7 @@ export class ExchangeRateController { ) {} @Get(':symbol/:dateString') - @UseGuards(AuthGuard('jwt')) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async getExchangeRate( @Param('dateString') dateString: string, @Param('symbol') symbol: string diff --git a/apps/api/src/app/export/export.controller.ts b/apps/api/src/app/export/export.controller.ts index 51b7bf632..88ba79989 100644 --- a/apps/api/src/app/export/export.controller.ts +++ b/apps/api/src/app/export/export.controller.ts @@ -1,3 +1,4 @@ +import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; import { Export } from '@ghostfolio/common/interfaces'; import type { RequestWithUser } from '@ghostfolio/common/types'; import { Controller, Get, Inject, Query, UseGuards } from '@nestjs/common'; @@ -14,7 +15,7 @@ export class ExportController { ) {} @Get() - @UseGuards(AuthGuard('jwt')) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async export( @Query('activityIds') activityIds?: string[] ): Promise { diff --git a/apps/api/src/app/import/import.controller.ts b/apps/api/src/app/import/import.controller.ts index 9fbc8075c..3697afb25 100644 --- a/apps/api/src/app/import/import.controller.ts +++ b/apps/api/src/app/import/import.controller.ts @@ -1,3 +1,5 @@ +import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorator'; +import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; 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'; @@ -34,7 +36,8 @@ export class ImportController { ) {} @Post() - @UseGuards(AuthGuard('jwt')) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) + @HasPermission(permissions.createOrder) @UseInterceptors(TransformDataSourceInRequestInterceptor) @UseInterceptors(TransformDataSourceInResponseInterceptor) public async import( @@ -42,11 +45,7 @@ export class ImportController { @Query('dryRun') isDryRun?: boolean ): Promise { if ( - !hasPermission( - this.request.user.permissions, - permissions.createAccount - ) || - !hasPermission(this.request.user.permissions, permissions.createOrder) + !hasPermission(this.request.user.permissions, permissions.createAccount) ) { throw new HttpException( getReasonPhrase(StatusCodes.FORBIDDEN), @@ -92,7 +91,7 @@ export class ImportController { } @Get('dividends/:dataSource/:symbol') - @UseGuards(AuthGuard('jwt')) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) @UseInterceptors(TransformDataSourceInRequestInterceptor) @UseInterceptors(TransformDataSourceInResponseInterceptor) public async gatherDividends( diff --git a/apps/api/src/app/order/order.controller.ts b/apps/api/src/app/order/order.controller.ts index 7e37f22b7..d1e4eadeb 100644 --- a/apps/api/src/app/order/order.controller.ts +++ b/apps/api/src/app/order/order.controller.ts @@ -1,3 +1,5 @@ +import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorator'; +import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; 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'; @@ -44,24 +46,16 @@ export class OrderController { ) {} @Delete() - @UseGuards(AuthGuard('jwt')) + @HasPermission(permissions.deleteOrder) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) 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')) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async deleteOrder(@Param('id') id: string): Promise { const order = await this.orderService.order({ id }); @@ -82,7 +76,7 @@ export class OrderController { } @Get() - @UseGuards(AuthGuard('jwt')) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) @UseInterceptors(RedactValuesInResponseInterceptor) @UseInterceptors(TransformDataSourceInResponseInterceptor) public async getAllOrders( @@ -120,19 +114,11 @@ export class OrderController { return { activities, count }; } + @HasPermission(permissions.createOrder) @Post() - @UseGuards(AuthGuard('jwt')) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) @UseInterceptors(TransformDataSourceInRequestInterceptor) public async createOrder(@Body() data: CreateOrderDto): Promise { - if ( - !hasPermission(this.request.user.permissions, permissions.createOrder) - ) { - throw new HttpException( - getReasonPhrase(StatusCodes.FORBIDDEN), - StatusCodes.FORBIDDEN - ); - } - const order = await this.orderService.createOrder({ ...data, date: parseISO(data.date), @@ -170,19 +156,16 @@ export class OrderController { return order; } + @HasPermission(permissions.updateOrder) @Put(':id') - @UseGuards(AuthGuard('jwt')) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) @UseInterceptors(TransformDataSourceInRequestInterceptor) public async update(@Param('id') id: string, @Body() data: UpdateOrderDto) { const originalOrder = await this.orderService.order({ id }); - if ( - !hasPermission(this.request.user.permissions, permissions.updateOrder) || - !originalOrder || - originalOrder.userId !== this.request.user.id - ) { + if (!originalOrder || originalOrder.userId !== this.request.user.id) { throw new HttpException( getReasonPhrase(StatusCodes.FORBIDDEN), StatusCodes.FORBIDDEN diff --git a/apps/api/src/app/platform/platform.controller.ts b/apps/api/src/app/platform/platform.controller.ts index 0369da8a3..3bdebd94c 100644 --- a/apps/api/src/app/platform/platform.controller.ts +++ b/apps/api/src/app/platform/platform.controller.ts @@ -1,18 +1,17 @@ -import { hasPermission, permissions } from '@ghostfolio/common/permissions'; -import type { RequestWithUser } from '@ghostfolio/common/types'; +import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorator'; +import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; +import { permissions } from '@ghostfolio/common/permissions'; import { Body, Controller, 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'; @@ -23,49 +22,30 @@ import { UpdatePlatformDto } from './update-platform.dto'; @Controller('platform') export class PlatformController { - public constructor( - private readonly platformService: PlatformService, - @Inject(REQUEST) private readonly request: RequestWithUser - ) {} + public constructor(private readonly platformService: PlatformService) {} @Get() - @UseGuards(AuthGuard('jwt')) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async getPlatforms() { return this.platformService.getPlatformsWithAccountCount(); } + @HasPermission(permissions.createPlatform) @Post() - @UseGuards(AuthGuard('jwt')) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) 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); } + @HasPermission(permissions.updatePlatform) @Put(':id') - @UseGuards(AuthGuard('jwt')) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) 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 }); @@ -88,17 +68,9 @@ export class PlatformController { } @Delete(':id') - @UseGuards(AuthGuard('jwt')) + @HasPermission(permissions.deletePlatform) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) 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 }); diff --git a/apps/api/src/app/portfolio/portfolio.controller.ts b/apps/api/src/app/portfolio/portfolio.controller.ts index dd013989f..e6e7def77 100644 --- a/apps/api/src/app/portfolio/portfolio.controller.ts +++ b/apps/api/src/app/portfolio/portfolio.controller.ts @@ -1,5 +1,6 @@ import { AccessService } from '@ghostfolio/api/app/access/access.service'; import { UserService } from '@ghostfolio/api/app/user/user.service'; +import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; import { hasNotDefinedValuesInObject, nullifyValuesInObject @@ -61,7 +62,7 @@ export class PortfolioController { ) {} @Get('details') - @UseGuards(AuthGuard('jwt')) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) @UseInterceptors(RedactValuesInResponseInterceptor) @UseInterceptors(TransformDataSourceInResponseInterceptor) public async getDetails( @@ -204,7 +205,7 @@ export class PortfolioController { } @Get('dividends') - @UseGuards(AuthGuard('jwt')) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async getDividends( @Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId: string, @Query('accounts') filterByAccounts?: string, @@ -254,7 +255,7 @@ export class PortfolioController { } @Get('investments') - @UseGuards(AuthGuard('jwt')) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async getInvestments( @Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId: string, @Query('accounts') filterByAccounts?: string, @@ -315,7 +316,7 @@ export class PortfolioController { } @Get('performance') - @UseGuards(AuthGuard('jwt')) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) @UseInterceptors(TransformDataSourceInResponseInterceptor) @Version('2') public async getPerformanceV2( @@ -405,7 +406,7 @@ export class PortfolioController { } @Get('positions') - @UseGuards(AuthGuard('jwt')) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) @UseInterceptors(RedactValuesInResponseInterceptor) @UseInterceptors(TransformDataSourceInResponseInterceptor) public async getPositions( @@ -500,7 +501,7 @@ export class PortfolioController { @UseInterceptors(RedactValuesInResponseInterceptor) @UseInterceptors(TransformDataSourceInRequestInterceptor) @UseInterceptors(TransformDataSourceInResponseInterceptor) - @UseGuards(AuthGuard('jwt')) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async getPosition( @Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId: string, @Param('dataSource') dataSource, @@ -523,7 +524,7 @@ export class PortfolioController { } @Get('report') - @UseGuards(AuthGuard('jwt')) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async getReport( @Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId: string ): Promise { diff --git a/apps/api/src/app/subscription/subscription.controller.ts b/apps/api/src/app/subscription/subscription.controller.ts index 299f32fe0..89a675b99 100644 --- a/apps/api/src/app/subscription/subscription.controller.ts +++ b/apps/api/src/app/subscription/subscription.controller.ts @@ -1,3 +1,4 @@ +import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { PropertyService } from '@ghostfolio/api/services/property/property.service'; import { @@ -37,7 +38,7 @@ export class SubscriptionController { @Post('redeem-coupon') @HttpCode(StatusCodes.OK) - @UseGuards(AuthGuard('jwt')) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async redeemCoupon(@Body() { couponCode }: { couponCode: string }) { if (!this.request.user) { throw new HttpException( @@ -109,7 +110,7 @@ export class SubscriptionController { } @Post('stripe/checkout-session') - @UseGuards(AuthGuard('jwt')) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async createCheckoutSession( @Body() { couponId, priceId }: { couponId: string; priceId: string } ) { diff --git a/apps/api/src/app/symbol/symbol.controller.ts b/apps/api/src/app/symbol/symbol.controller.ts index ad9042991..2aa2f61df 100644 --- a/apps/api/src/app/symbol/symbol.controller.ts +++ b/apps/api/src/app/symbol/symbol.controller.ts @@ -1,3 +1,4 @@ +import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; 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'; @@ -34,7 +35,7 @@ export class SymbolController { * Must be before /:symbol */ @Get('lookup') - @UseGuards(AuthGuard('jwt')) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) @UseInterceptors(TransformDataSourceInResponseInterceptor) public async lookupSymbol( @Query('includeIndices') includeIndices: boolean = false, @@ -88,7 +89,7 @@ export class SymbolController { } @Get(':dataSource/:symbol/:dateString') - @UseGuards(AuthGuard('jwt')) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async gatherSymbolForDate( @Param('dataSource') dataSource: DataSource, @Param('dateString') dateString: string, diff --git a/apps/api/src/app/tag/tag.controller.ts b/apps/api/src/app/tag/tag.controller.ts index 950719201..36fb3be20 100644 --- a/apps/api/src/app/tag/tag.controller.ts +++ b/apps/api/src/app/tag/tag.controller.ts @@ -1,18 +1,17 @@ -import { hasPermission, permissions } from '@ghostfolio/common/permissions'; -import type { RequestWithUser } from '@ghostfolio/common/types'; +import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorator'; +import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; +import { permissions } from '@ghostfolio/common/permissions'; import { Body, Controller, Delete, Get, HttpException, - Inject, Param, Post, Put, UseGuards } from '@nestjs/common'; -import { REQUEST } from '@nestjs/core'; import { AuthGuard } from '@nestjs/passport'; import { Tag } from '@prisma/client'; import { StatusCodes, getReasonPhrase } from 'http-status-codes'; @@ -23,40 +22,25 @@ import { UpdateTagDto } from './update-tag.dto'; @Controller('tag') export class TagController { - public constructor( - @Inject(REQUEST) private readonly request: RequestWithUser, - private readonly tagService: TagService - ) {} + public constructor(private readonly tagService: TagService) {} @Get() - @UseGuards(AuthGuard('jwt')) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async getTags() { return this.tagService.getTagsWithActivityCount(); } @Post() - @UseGuards(AuthGuard('jwt')) + @HasPermission(permissions.createTag) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async createTag(@Body() data: CreateTagDto): Promise { - if (!hasPermission(this.request.user.permissions, permissions.createTag)) { - throw new HttpException( - getReasonPhrase(StatusCodes.FORBIDDEN), - StatusCodes.FORBIDDEN - ); - } - return this.tagService.createTag(data); } + @HasPermission(permissions.updateTag) @Put(':id') - @UseGuards(AuthGuard('jwt')) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async updateTag(@Param('id') id: string, @Body() data: UpdateTagDto) { - if (!hasPermission(this.request.user.permissions, permissions.updateTag)) { - throw new HttpException( - getReasonPhrase(StatusCodes.FORBIDDEN), - StatusCodes.FORBIDDEN - ); - } - const originalTag = await this.tagService.getTag({ id }); @@ -79,15 +63,9 @@ export class TagController { } @Delete(':id') - @UseGuards(AuthGuard('jwt')) + @HasPermission(permissions.deleteTag) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async deleteTag(@Param('id') id: string) { - if (!hasPermission(this.request.user.permissions, permissions.deleteTag)) { - throw new HttpException( - getReasonPhrase(StatusCodes.FORBIDDEN), - StatusCodes.FORBIDDEN - ); - } - const originalTag = await this.tagService.getTag({ id }); diff --git a/apps/api/src/app/user/user.controller.ts b/apps/api/src/app/user/user.controller.ts index 44d21e9c9..97d5aa195 100644 --- a/apps/api/src/app/user/user.controller.ts +++ b/apps/api/src/app/user/user.controller.ts @@ -1,3 +1,5 @@ +import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorator'; +import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; import { PropertyService } from '@ghostfolio/api/services/property/property.service'; import { User, UserSettings } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; @@ -36,12 +38,10 @@ export class UserController { ) {} @Delete(':id') - @UseGuards(AuthGuard('jwt')) + @HasPermission(permissions.deleteUser) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async deleteUser(@Param('id') id: string): Promise { - if ( - !hasPermission(this.request.user.permissions, permissions.deleteUser) || - id === this.request.user.id - ) { + if (id === this.request.user.id) { throw new HttpException( getReasonPhrase(StatusCodes.FORBIDDEN), StatusCodes.FORBIDDEN @@ -54,7 +54,7 @@ export class UserController { } @Get() - @UseGuards(AuthGuard('jwt')) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async getUser( @Headers('accept-language') acceptLanguage: string ): Promise { @@ -92,7 +92,7 @@ export class UserController { } @Put('setting') - @UseGuards(AuthGuard('jwt')) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async updateUserSetting(@Body() data: UpdateUserSettingDto) { if ( size(data) === 1 && diff --git a/apps/api/src/guards/has-permission.guard.spec.ts b/apps/api/src/guards/has-permission.guard.spec.ts index 7f5f90de9..d205a28f4 100644 --- a/apps/api/src/guards/has-permission.guard.spec.ts +++ b/apps/api/src/guards/has-permission.guard.spec.ts @@ -1,7 +1,6 @@ import { HttpException } from '@nestjs/common'; import { Reflector } from '@nestjs/core'; import { ExecutionContextHost } from '@nestjs/core/helpers/execution-context-host'; -import { Test, TestingModule } from '@nestjs/testing'; import { HasPermissionGuard } from './has-permission.guard'; @@ -10,12 +9,8 @@ describe('HasPermissionGuard', () => { let reflector: Reflector; beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ - providers: [HasPermissionGuard, Reflector] - }).compile(); - - guard = module.get(HasPermissionGuard); - reflector = module.get(Reflector); + reflector = new Reflector(); + guard = new HasPermissionGuard(reflector); }); function setupReflectorSpy(returnValue: string) { diff --git a/apps/api/src/guards/has-permission.guard.ts b/apps/api/src/guards/has-permission.guard.ts index 298992d06..871b29f13 100644 --- a/apps/api/src/guards/has-permission.guard.ts +++ b/apps/api/src/guards/has-permission.guard.ts @@ -14,17 +14,17 @@ export class HasPermissionGuard implements CanActivate { public constructor(private reflector: Reflector) {} public canActivate(context: ExecutionContext): boolean { + const { user } = context.switchToHttp().getRequest(); const requiredPermission = this.reflector.get( HAS_PERMISSION_KEY, context.getHandler() ); if (!requiredPermission) { - return true; // No specific permissions required + // No specific permissions required + return true; } - const { user } = context.switchToHttp().getRequest(); - if (!user || !hasPermission(user.permissions, requiredPermission)) { throw new HttpException( getReasonPhrase(StatusCodes.FORBIDDEN), From b183c45027ac68eb8c1a4bb4afc55ffae7851e13 Mon Sep 17 00:00:00 2001 From: gizmodus Date: Wed, 27 Dec 2023 15:55:35 +0100 Subject: [PATCH 09/38] Time weighted portfolio performance calculation (#2778) * Implement time weighted portfolio performance calculation * Update changelog --- CHANGELOG.md | 1 + ...folio-calculator-baln-buy-and-sell.spec.ts | 1 + .../portfolio-calculator-baln-buy.spec.ts | 1 + ...ator-btcusd-buy-and-sell-partially.spec.ts | 9 +- ...ulator-novn-buy-and-sell-partially.spec.ts | 9 +- ...folio-calculator-novn-buy-and-sell.spec.ts | 1 + .../src/app/portfolio/portfolio-calculator.ts | 271 +++++++++++------- .../interfaces/timeline-position.interface.ts | 1 + 8 files changed, 185 insertions(+), 109 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c9f94abe8..7b6a834af 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- Changed the performance calculation to a time-weighted approach - Used the `HasPermission` annotation in endpoints ## 2.32.0 - 2023-12-26 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 c66323c72..f4fec026a 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 @@ -92,6 +92,7 @@ describe('PortfolioCalculator', () => { marketPrice: 148.9, quantity: new Big('0'), symbol: 'BALN.SW', + timeWeightedInvestment: new Big('285.8'), transactionCount: 2 } ], 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 9f49c13e0..e2560cfbb 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 @@ -81,6 +81,7 @@ describe('PortfolioCalculator', () => { marketPrice: 148.9, quantity: new Big('2'), symbol: 'BALN.SW', + timeWeightedInvestment: new Big('273.2'), transactionCount: 1 } ], 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 e0761ebe5..4f1bc8cdc 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 @@ -73,10 +73,10 @@ describe('PortfolioCalculator', () => { currentValue: new Big('13657.2'), errors: [], grossPerformance: new Big('27172.74'), - grossPerformancePercentage: new Big('42.40043067128546016291'), + grossPerformancePercentage: new Big('42.41978276196153750666'), hasErrors: false, netPerformance: new Big('27172.74'), - netPerformancePercentage: new Big('42.40043067128546016291'), + netPerformancePercentage: new Big('42.41978276196153750666'), positions: [ { averagePrice: new Big('320.43'), @@ -85,13 +85,14 @@ describe('PortfolioCalculator', () => { fee: new Big('0'), firstBuyDate: '2015-01-01', grossPerformance: new Big('27172.74'), - grossPerformancePercentage: new Big('42.40043067128546016291'), + grossPerformancePercentage: new Big('42.41978276196153750666'), investment: new Big('320.43'), netPerformance: new Big('27172.74'), - netPerformancePercentage: new Big('42.40043067128546016291'), + netPerformancePercentage: new Big('42.41978276196153750666'), marketPrice: 13657.2, quantity: new Big('1'), symbol: 'BTCUSD', + timeWeightedInvestment: new Big('640.56763686131386861314'), transactionCount: 2 } ], 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 6adfc9347..2c8bff238 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 @@ -73,10 +73,10 @@ describe('PortfolioCalculator', () => { currentValue: new Big('87.8'), errors: [], grossPerformance: new Big('21.93'), - grossPerformancePercentage: new Big('0.14465699208443271768'), + grossPerformancePercentage: new Big('0.15113417083448194384'), hasErrors: false, netPerformance: new Big('17.68'), - netPerformancePercentage: new Big('0.11662269129287598945'), + netPerformancePercentage: new Big('0.12184460284330327256'), positions: [ { averagePrice: new Big('75.80'), @@ -85,13 +85,14 @@ describe('PortfolioCalculator', () => { fee: new Big('4.25'), firstBuyDate: '2022-03-07', grossPerformance: new Big('21.93'), - grossPerformancePercentage: new Big('0.14465699208443271768'), + grossPerformancePercentage: new Big('0.15113417083448194384'), investment: new Big('75.80'), netPerformance: new Big('17.68'), - netPerformancePercentage: new Big('0.11662269129287598945'), + netPerformancePercentage: new Big('0.12184460284330327256'), marketPrice: 87.8, quantity: new Big('1'), symbol: 'NOVN.SW', + timeWeightedInvestment: new Big('145.10285714285714285714'), transactionCount: 2 } ], diff --git a/apps/api/src/app/portfolio/portfolio-calculator-novn-buy-and-sell.spec.ts b/apps/api/src/app/portfolio/portfolio-calculator-novn-buy-and-sell.spec.ts index feed5923b..3b34a0e34 100644 --- a/apps/api/src/app/portfolio/portfolio-calculator-novn-buy-and-sell.spec.ts +++ b/apps/api/src/app/portfolio/portfolio-calculator-novn-buy-and-sell.spec.ts @@ -112,6 +112,7 @@ describe('PortfolioCalculator', () => { marketPrice: 87.8, quantity: new Big('0'), symbol: 'NOVN.SW', + timeWeightedInvestment: new Big('151.6'), transactionCount: 2 } ], diff --git a/apps/api/src/app/portfolio/portfolio-calculator.ts b/apps/api/src/app/portfolio/portfolio-calculator.ts index c11e514e4..06a5ca6ae 100644 --- a/apps/api/src/app/portfolio/portfolio-calculator.ts +++ b/apps/api/src/app/portfolio/portfolio-calculator.ts @@ -15,6 +15,7 @@ import { addMilliseconds, addMonths, addYears, + differenceInDays, endOfDay, format, isAfter, @@ -43,7 +44,7 @@ import { TransactionPointSymbol } from './interfaces/transaction-point-symbol.in import { TransactionPoint } from './interfaces/transaction-point.interface'; export class PortfolioCalculator { - private static readonly CALCULATE_PERCENTAGE_PERFORMANCE_WITH_MAX_INVESTMENT = + private static readonly CALCULATE_PERCENTAGE_PERFORMANCE_WITH_TIME_WEIGHTED_INVESTMENT = true; private static readonly ENABLE_LOGGING = false; @@ -238,12 +239,13 @@ export class PortfolioCalculator { } } - const valuesByDate: { + const accumulatedValuesByDate: { [date: string]: { maxTotalInvestmentValue: Big; totalCurrentValue: Big; totalInvestmentValue: Big; totalNetPerformanceValue: Big; + totalTimeWeightedInvestmentValue: Big; }; } = {}; @@ -253,6 +255,7 @@ export class PortfolioCalculator { investmentValues: { [date: string]: Big }; maxInvestmentValues: { [date: string]: Big }; netPerformanceValues: { [date: string]: Big }; + timeWeightedInvestmentValues: { [date: string]: Big }; }; } = {}; @@ -261,7 +264,8 @@ export class PortfolioCalculator { currentValues, investmentValues, maxInvestmentValues, - netPerformanceValues + netPerformanceValues, + timeWeightedInvestmentValues } = this.getSymbolMetrics({ end, marketSymbolMap, @@ -275,7 +279,8 @@ export class PortfolioCalculator { currentValues, investmentValues, maxInvestmentValues, - netPerformanceValues + netPerformanceValues, + timeWeightedInvestmentValues }; } @@ -293,38 +298,50 @@ export class PortfolioCalculator { symbolValues.maxInvestmentValues?.[dateString] ?? new Big(0); const netPerformanceValue = symbolValues.netPerformanceValues?.[dateString] ?? new Big(0); + const timeWeightedInvestmentValue = + symbolValues.timeWeightedInvestmentValues?.[dateString] ?? new Big(0); - valuesByDate[dateString] = { + accumulatedValuesByDate[dateString] = { totalCurrentValue: ( - valuesByDate[dateString]?.totalCurrentValue ?? new Big(0) + accumulatedValuesByDate[dateString]?.totalCurrentValue ?? new Big(0) ).add(currentValue), totalInvestmentValue: ( - valuesByDate[dateString]?.totalInvestmentValue ?? new Big(0) + accumulatedValuesByDate[dateString]?.totalInvestmentValue ?? + new Big(0) ).add(investmentValue), + totalTimeWeightedInvestmentValue: ( + accumulatedValuesByDate[dateString] + ?.totalTimeWeightedInvestmentValue ?? new Big(0) + ).add(timeWeightedInvestmentValue), maxTotalInvestmentValue: ( - valuesByDate[dateString]?.maxTotalInvestmentValue ?? new Big(0) + accumulatedValuesByDate[dateString]?.maxTotalInvestmentValue ?? + new Big(0) ).add(maxInvestmentValue), totalNetPerformanceValue: ( - valuesByDate[dateString]?.totalNetPerformanceValue ?? new Big(0) + accumulatedValuesByDate[dateString]?.totalNetPerformanceValue ?? + new Big(0) ).add(netPerformanceValue) }; } } - return Object.entries(valuesByDate).map(([date, values]) => { + return Object.entries(accumulatedValuesByDate).map(([date, values]) => { const { maxTotalInvestmentValue, totalCurrentValue, totalInvestmentValue, - totalNetPerformanceValue + totalNetPerformanceValue, + totalTimeWeightedInvestmentValue } = values; - const netPerformanceInPercentage = maxTotalInvestmentValue.eq(0) + let investmentValue = + PortfolioCalculator.CALCULATE_PERCENTAGE_PERFORMANCE_WITH_TIME_WEIGHTED_INVESTMENT + ? totalTimeWeightedInvestmentValue + : maxTotalInvestmentValue; + + const netPerformanceInPercentage = investmentValue.eq(0) ? 0 - : totalNetPerformanceValue - .div(maxTotalInvestmentValue) - .mul(100) - .toNumber(); + : totalNetPerformanceValue.div(investmentValue).mul(100).toNumber(); return { date, @@ -447,7 +464,6 @@ export class PortfolioCalculator { if (firstIndex > 0) { firstIndex--; } - const initialValues: { [symbol: string]: Big } = {}; const positions: TimelinePosition[] = []; let hasAnySymbolMetricsErrors = false; @@ -461,9 +477,9 @@ export class PortfolioCalculator { grossPerformance, grossPerformancePercentage, hasErrors, - initialValue, netPerformance, - netPerformancePercentage + netPerformancePercentage, + timeWeightedInvestment } = this.getSymbolMetrics({ end, marketSymbolMap, @@ -472,9 +488,9 @@ export class PortfolioCalculator { }); hasAnySymbolMetricsErrors = hasAnySymbolMetricsErrors || hasErrors; - initialValues[item.symbol] = initialValue; positions.push({ + timeWeightedInvestment, averagePrice: item.quantity.eq(0) ? new Big(0) : item.investment.div(item.quantity), @@ -509,7 +525,7 @@ export class PortfolioCalculator { } } - const overall = this.calculateOverallPerformance(positions, initialValues); + const overall = this.calculateOverallPerformance(positions); return { ...overall, @@ -732,18 +748,13 @@ export class PortfolioCalculator { }; } - private calculateOverallPerformance( - positions: TimelinePosition[], - initialValues: { [symbol: string]: Big } - ) { + private calculateOverallPerformance(positions: TimelinePosition[]) { let currentValue = new Big(0); let grossPerformance = new Big(0); - let grossPerformancePercentage = new Big(0); let hasErrors = false; let netPerformance = new Big(0); - let netPerformancePercentage = new Big(0); - let sumOfWeights = new Big(0); let totalInvestment = new Big(0); + let totalTimeWeightedInvestment = new Big(0); for (const currentPosition of positions) { if (currentPosition.marketPrice) { @@ -766,21 +777,9 @@ export class PortfolioCalculator { hasErrors = true; } - if (currentPosition.grossPerformancePercentage) { - // Use the average from the initial value and the current investment as - // a weight - const weight = (initialValues[currentPosition.symbol] ?? new Big(0)) - .plus(currentPosition.investment) - .div(2); - - sumOfWeights = sumOfWeights.plus(weight); - - grossPerformancePercentage = grossPerformancePercentage.plus( - currentPosition.grossPerformancePercentage.mul(weight) - ); - - netPerformancePercentage = netPerformancePercentage.plus( - currentPosition.netPerformancePercentage.mul(weight) + if (currentPosition.timeWeightedInvestment) { + totalTimeWeightedInvestment = totalTimeWeightedInvestment.plus( + currentPosition.timeWeightedInvestment ); } else if (!currentPosition.quantity.eq(0)) { Logger.warn( @@ -791,22 +790,18 @@ export class PortfolioCalculator { } } - if (sumOfWeights.gt(0)) { - grossPerformancePercentage = grossPerformancePercentage.div(sumOfWeights); - netPerformancePercentage = netPerformancePercentage.div(sumOfWeights); - } else { - grossPerformancePercentage = new Big(0); - netPerformancePercentage = new Big(0); - } - return { currentValue, grossPerformance, - grossPerformancePercentage, hasErrors, netPerformance, - netPerformancePercentage, - totalInvestment + totalInvestment, + netPerformancePercentage: totalTimeWeightedInvestment.eq(0) + ? new Big(0) + : netPerformance.div(totalTimeWeightedInvestment), + grossPerformancePercentage: totalTimeWeightedInvestment.eq(0) + ? new Big(0) + : grossPerformance.div(totalTimeWeightedInvestment) }; } @@ -1018,6 +1013,7 @@ export class PortfolioCalculator { let averagePriceAtEndDate = new Big(0); let averagePriceAtStartDate = new Big(0); + const currentValues: { [date: string]: Big } = {}; let feesAtStartDate = new Big(0); let fees = new Big(0); let grossPerformance = new Big(0); @@ -1025,12 +1021,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 maxTotalInvestment = new Big(0); const netPerformanceValues: { [date: string]: Big } = {}; + const timeWeightedInvestmentValues: { [date: string]: Big } = {}; let totalInvestment = new Big(0); let totalInvestmentWithGrossPerformanceFromSell = new Big(0); let totalUnits = new Big(0); @@ -1122,6 +1118,9 @@ export class PortfolioCalculator { return order.itemType === 'end'; }); + let totalInvestmentDays = 0; + let sumOfTimeWeightedInvestments = new Big(0); + for (let i = 0; i < orders.length; i += 1) { const order = orders[i]; @@ -1162,11 +1161,11 @@ export class PortfolioCalculator { order.type === 'BUY' ? order.quantity.mul(order.unitPrice).mul(this.getFactor(order.type)) : totalUnits.gt(0) - ? totalInvestment - .div(totalUnits) - .mul(order.quantity) - .mul(this.getFactor(order.type)) - : new Big(0); + ? totalInvestment + .div(totalUnits) + .mul(order.quantity) + .mul(this.getFactor(order.type)) + : new Big(0); if (PortfolioCalculator.ENABLE_LOGGING) { console.log('totalInvestment', totalInvestment.toNumber()); @@ -1174,6 +1173,7 @@ export class PortfolioCalculator { console.log('transactionInvestment', transactionInvestment.toNumber()); } + const totalInvestmentBeforeTransaction = totalInvestment; totalInvestment = totalInvestment.plus(transactionInvestment); if (i >= indexOfStartOrder && totalInvestment.gt(maxTotalInvestment)) { @@ -1243,14 +1243,48 @@ export class PortfolioCalculator { grossPerformanceAtStartDate = grossPerformance; } - if (isChartMode && i > indexOfStartOrder) { - currentValues[order.date] = valueOfInvestment; - netPerformanceValues[order.date] = grossPerformance - .minus(grossPerformanceAtStartDate) - .minus(fees.minus(feesAtStartDate)); + if (i > indexOfStartOrder) { + // Only consider periods with an investment for the calculation of + // the time weighted investment + if (totalInvestmentBeforeTransaction.gt(0)) { + // Calculate the number of days since the previous order + const orderDate = new Date(order.date); + const previousOrderDate = new Date(orders[i - 1].date); + + let daysSinceLastOrder = differenceInDays( + orderDate, + previousOrderDate + ); + + // Set to at least 1 day, otherwise the transactions on the same day + // would not be considered in the time weighted calculation + if (daysSinceLastOrder <= 0) { + daysSinceLastOrder = 1; + } + + // Sum up the total investment days since the start date to calculate + // the time weighted investment + totalInvestmentDays += daysSinceLastOrder; - investmentValues[order.date] = totalInvestment; - maxInvestmentValues[order.date] = maxTotalInvestment; + sumOfTimeWeightedInvestments = sumOfTimeWeightedInvestments.add( + totalInvestmentBeforeTransaction.mul(daysSinceLastOrder) + ); + } + + if (isChartMode) { + currentValues[order.date] = valueOfInvestment; + netPerformanceValues[order.date] = grossPerformance + .minus(grossPerformanceAtStartDate) + .minus(fees.minus(feesAtStartDate)); + + investmentValues[order.date] = totalInvestment; + maxInvestmentValues[order.date] = maxTotalInvestment; + + timeWeightedInvestmentValues[order.date] = + totalInvestmentDays > 0 + ? sumOfTimeWeightedInvestments.div(totalInvestmentDays) + : new Big(0); + } } if (PortfolioCalculator.ENABLE_LOGGING) { @@ -1274,50 +1308,79 @@ export class PortfolioCalculator { .minus(grossPerformanceAtStartDate) .minus(fees.minus(feesAtStartDate)); + const timeWeightedAverageInvestmentBetweenStartAndEndDate = + totalInvestmentDays > 0 + ? sumOfTimeWeightedInvestments.div(totalInvestmentDays) + : new Big(0); + const maxInvestmentBetweenStartAndEndDate = valueAtStartDate.plus( maxTotalInvestment.minus(investmentAtStartDate) ); - const grossPerformancePercentage = - PortfolioCalculator.CALCULATE_PERCENTAGE_PERFORMANCE_WITH_MAX_INVESTMENT || - averagePriceAtStartDate.eq(0) || - averagePriceAtEndDate.eq(0) || - orders[indexOfStartOrder].unitPrice.eq(0) - ? maxInvestmentBetweenStartAndEndDate.gt(0) - ? totalGrossPerformance.div(maxInvestmentBetweenStartAndEndDate) - : new Big(0) - : // This formula has the issue that buying more units with a price - // lower than the average buying price results in a positive - // performance even if the market price stays constant - unitPriceAtEndDate - .div(averagePriceAtEndDate) - .div( - orders[indexOfStartOrder].unitPrice.div(averagePriceAtStartDate) + let grossPerformancePercentage: Big; + + if ( + PortfolioCalculator.CALCULATE_PERCENTAGE_PERFORMANCE_WITH_TIME_WEIGHTED_INVESTMENT + ) { + grossPerformancePercentage = + timeWeightedAverageInvestmentBetweenStartAndEndDate.gt(0) + ? totalGrossPerformance.div( + timeWeightedAverageInvestmentBetweenStartAndEndDate ) - .minus(1); + : new Big(0); + } else { + grossPerformancePercentage = + averagePriceAtStartDate.eq(0) || + averagePriceAtEndDate.eq(0) || + orders[indexOfStartOrder].unitPrice.eq(0) + ? maxInvestmentBetweenStartAndEndDate.gt(0) + ? totalGrossPerformance.div(maxInvestmentBetweenStartAndEndDate) + : new Big(0) + : // This formula has the issue that buying more units with a price + // lower than the average buying price results in a positive + // performance even if the market price stays constant + unitPriceAtEndDate + .div(averagePriceAtEndDate) + .div( + orders[indexOfStartOrder].unitPrice.div(averagePriceAtStartDate) + ) + .minus(1); + } const feesPerUnit = totalUnits.gt(0) ? fees.minus(feesAtStartDate).div(totalUnits) : new Big(0); - const netPerformancePercentage = - PortfolioCalculator.CALCULATE_PERCENTAGE_PERFORMANCE_WITH_MAX_INVESTMENT || - averagePriceAtStartDate.eq(0) || - averagePriceAtEndDate.eq(0) || - orders[indexOfStartOrder].unitPrice.eq(0) - ? maxInvestmentBetweenStartAndEndDate.gt(0) - ? totalNetPerformance.div(maxInvestmentBetweenStartAndEndDate) - : new Big(0) - : // This formula has the issue that buying more units with a price - // lower than the average buying price results in a positive - // performance even if the market price stays constant - unitPriceAtEndDate - .minus(feesPerUnit) - .div(averagePriceAtEndDate) - .div( - orders[indexOfStartOrder].unitPrice.div(averagePriceAtStartDate) + let netPerformancePercentage: Big; + + if ( + PortfolioCalculator.CALCULATE_PERCENTAGE_PERFORMANCE_WITH_TIME_WEIGHTED_INVESTMENT + ) { + netPerformancePercentage = + timeWeightedAverageInvestmentBetweenStartAndEndDate.gt(0) + ? totalNetPerformance.div( + timeWeightedAverageInvestmentBetweenStartAndEndDate ) - .minus(1); + : new Big(0); + } else { + netPerformancePercentage = + averagePriceAtStartDate.eq(0) || + averagePriceAtEndDate.eq(0) || + orders[indexOfStartOrder].unitPrice.eq(0) + ? maxInvestmentBetweenStartAndEndDate.gt(0) + ? totalNetPerformance.div(maxInvestmentBetweenStartAndEndDate) + : new Big(0) + : // This formula has the issue that buying more units with a price + // lower than the average buying price results in a positive + // performance even if the market price stays constant + unitPriceAtEndDate + .minus(feesPerUnit) + .div(averagePriceAtEndDate) + .div( + orders[indexOfStartOrder].unitPrice.div(averagePriceAtStartDate) + ) + .minus(1); + } if (PortfolioCalculator.ENABLE_LOGGING) { console.log( @@ -1330,6 +1393,9 @@ export class PortfolioCalculator { 2 )} -> ${averagePriceAtEndDate.toFixed(2)} Total investment: ${totalInvestment.toFixed(2)} + Time weighted investment: ${timeWeightedAverageInvestmentBetweenStartAndEndDate.toFixed( + 2 + )} Max. total investment: ${maxTotalInvestment.toFixed(2)} Gross performance: ${totalGrossPerformance.toFixed( 2 @@ -1349,9 +1415,12 @@ export class PortfolioCalculator { maxInvestmentValues, netPerformancePercentage, netPerformanceValues, + timeWeightedInvestmentValues, grossPerformance: totalGrossPerformance, hasErrors: totalUnits.gt(0) && (!initialValue || !unitPriceAtEndDate), - netPerformance: totalNetPerformance + netPerformance: totalNetPerformance, + timeWeightedInvestment: + timeWeightedAverageInvestmentBetweenStartAndEndDate }; } diff --git a/libs/common/src/lib/interfaces/timeline-position.interface.ts b/libs/common/src/lib/interfaces/timeline-position.interface.ts index de4c3ff19..1b27de8dc 100644 --- a/libs/common/src/lib/interfaces/timeline-position.interface.ts +++ b/libs/common/src/lib/interfaces/timeline-position.interface.ts @@ -16,5 +16,6 @@ export interface TimelinePosition { quantity: Big; symbol: string; tags?: Tag[]; + timeWeightedInvestment: Big; transactionCount: number; } From 0034776b3445ab53139bb509a779d6cbd7110430 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Fri, 29 Dec 2023 11:26:24 +0100 Subject: [PATCH 10/38] Feature/upgrade nx to version 17.2.7 (#2781) * Upgrade Nx to version 17.2.7 * Update changelog --- CHANGELOG.md | 1 + package.json | 22 +-- yarn.lock | 533 ++++++++++++++++++++++++++++----------------------- 3 files changed, 302 insertions(+), 254 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7b6a834af..853d6d4aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Changed the performance calculation to a time-weighted approach - Used the `HasPermission` annotation in endpoints +- Upgraded `Nx` from version `17.2.5` to `17.2.7` ## 2.32.0 - 2023-12-26 diff --git a/package.json b/package.json index 9bf415e08..aa3b8c913 100644 --- a/package.json +++ b/package.json @@ -146,16 +146,16 @@ "@angular/pwa": "17.0.7", "@nestjs/schematics": "10.0.1", "@nestjs/testing": "10.1.3", - "@nx/angular": "17.2.5", - "@nx/cypress": "17.2.5", - "@nx/eslint-plugin": "17.2.5", - "@nx/jest": "17.2.5", - "@nx/js": "17.2.5", - "@nx/nest": "17.2.5", - "@nx/node": "17.2.5", - "@nx/storybook": "17.2.5", - "@nx/web": "17.2.5", - "@nx/workspace": "17.2.5", + "@nx/angular": "17.2.7", + "@nx/cypress": "17.2.7", + "@nx/eslint-plugin": "17.2.7", + "@nx/jest": "17.2.7", + "@nx/js": "17.2.7", + "@nx/nest": "17.2.7", + "@nx/node": "17.2.7", + "@nx/storybook": "17.2.7", + "@nx/web": "17.2.7", + "@nx/workspace": "17.2.7", "@schematics/angular": "17.0.0", "@simplewebauthn/typescript-types": "8.0.0", "@storybook/addon-essentials": "7.6.5", @@ -186,7 +186,7 @@ "jest": "29.4.3", "jest-environment-jsdom": "29.4.3", "jest-preset-angular": "13.1.4", - "nx": "17.2.5", + "nx": "17.2.7", "prettier": "3.1.1", "prettier-plugin-organize-attributes": "1.0.0", "react": "18.2.0", diff --git a/yarn.lock b/yarn.lock index 9174ff735..c78d70302 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4332,98 +4332,98 @@ read-package-json-fast "^3.0.0" which "^4.0.0" -"@nrwl/angular@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nrwl/angular/-/angular-17.2.5.tgz#e2eb955d2fe6333bfbd1a6ae98f3208a63bac517" - integrity sha512-UhXFeQJg6/m5UMzPVnxsuWYRhHApAPkrMf7Z9oSbTHNnfZ6LPGfuzTlWl72NjSG2xcSE0hhP4Et/7M+U2/Qv1A== +"@nrwl/angular@17.2.7": + version "17.2.7" + resolved "https://registry.yarnpkg.com/@nrwl/angular/-/angular-17.2.7.tgz#7cb7b98216288176ea6fd5407fb2d2a500f608bf" + integrity sha512-DjEpECm0ipw7q9xhj+pX1y9Gc3J64gLBCUVf1ib+h3g2Y3tFbC+RLlQGwmAqU8WelAdJHrPqPtAYHKf4vqqgbQ== dependencies: - "@nx/angular" v17.2.5 + "@nx/angular" "17.2.7" tslib "^2.3.0" -"@nrwl/cypress@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nrwl/cypress/-/cypress-17.2.5.tgz#26bbe35a51118e02f375b1621225488ccba182f6" - integrity sha512-3juSy+fZ+pxQE1Tx/BO+f1u9iUXbF2Vc6biq2rIh/d8Eo7YlDS/9clrLLWCZ4ytT5nzesrnZS0viuRavvNih8g== +"@nrwl/cypress@17.2.7": + version "17.2.7" + resolved "https://registry.yarnpkg.com/@nrwl/cypress/-/cypress-17.2.7.tgz#5cdd37f52c48f823f358b571afc9040353884241" + integrity sha512-Av89Er9r0kMf8YL9dNSTkHohYhAKYmxAB3Q8eVv8NmSb7FZXvY065HIoFby+6VtQnBFP+sT1YSQL/Tp+h4Bwfw== dependencies: - "@nx/cypress" v17.2.5 + "@nx/cypress" "17.2.7" -"@nrwl/devkit@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-17.2.5.tgz#990918387fb192732c1803c0015bac171f402685" - integrity sha512-rXZDkJMzbViCfxZ19ndLZX9MZhQ50qgQOR6kahYugTcJ6HRV1i/FsKRyKXk1JefMCo8qdw/F5aw9zl0WwOiPdA== +"@nrwl/devkit@17.2.7": + version "17.2.7" + resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-17.2.7.tgz#20c5fd8e0a2813940fdfb34523d4d77788b524ff" + integrity sha512-TISLlIH3xSWre2NLg0aMUBmTvMus+xUicaMeg8DWvwSXJJIMC5QFlB1hjw0VkyLsSraHpd5PWtyDqldHWRfKUQ== dependencies: - "@nx/devkit" v17.2.5 + "@nx/devkit" "17.2.7" -"@nrwl/eslint-plugin-nx@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nrwl/eslint-plugin-nx/-/eslint-plugin-nx-17.2.5.tgz#9b906ad4a4c377e0a6461deb44bae43a0bad43d2" - integrity sha512-uvqGdOCqz/A1Ak27pBBcOCI9Ct/rdXfUhmYMDSAPNUx1gzQRofJ3DD4q7uFjEHwc7Qjdqpc4HizYPBaIj4ZaBw== +"@nrwl/eslint-plugin-nx@17.2.7": + version "17.2.7" + resolved "https://registry.yarnpkg.com/@nrwl/eslint-plugin-nx/-/eslint-plugin-nx-17.2.7.tgz#5762b3dce6acb806c8c95bfa0610e79a0e74ecc7" + integrity sha512-YGH3FL4Dz+a9r2xmZx/SMUFOUl/An6IsZeTqkG5gC+ErejX9nT1KWOXMNh5bkl+jz0b4NvkiVvgQw+W4q2K9sg== dependencies: - "@nx/eslint-plugin" v17.2.5 + "@nx/eslint-plugin" "17.2.7" -"@nrwl/jest@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nrwl/jest/-/jest-17.2.5.tgz#1f973ed5d3504a871e70e64d9aa41879f33c762a" - integrity sha512-zWVk+L+oAgWQovooL+ynehDUTqm6TschYh5utL11N8kMuKPrF/aFSoiE4J47VS6TmO/sQ6hrRVMJfXibMlnZeQ== +"@nrwl/jest@17.2.7": + version "17.2.7" + resolved "https://registry.yarnpkg.com/@nrwl/jest/-/jest-17.2.7.tgz#acd89e1cd3d99ae75431c60216b4e7b1d9bb35e6" + integrity sha512-jYeBQbS9iaybLxmxFv6N9qftRHyRpG3YlDxiHXXmWPX0OrgDjNSY3QCCReM8iqADk2TaxoIw1WDKp4tKzft2xA== dependencies: - "@nx/jest" v17.2.5 + "@nx/jest" "17.2.7" -"@nrwl/js@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nrwl/js/-/js-17.2.5.tgz#af3d50e1cf155b2dc2306646c68f1f07a87dbb04" - integrity sha512-Pcw5f1yqT6yJe3DRtdoYmHVngNFy+oWkOkukDbB3MySGyA760NYyFI49/jMuzGd91dV9vCjEjncLQNKYJTKeBg== +"@nrwl/js@17.2.7": + version "17.2.7" + resolved "https://registry.yarnpkg.com/@nrwl/js/-/js-17.2.7.tgz#b791009476584ae0a6665a5e6fafccbe7fe6b29f" + integrity sha512-8AAUmqESQ89Cbark8DlkElINMmDpEJLivan6RPksUUEK6lrZQwVnHf4eWLQzN2/C4i5XkfdxavzluuDPCqHQSQ== dependencies: - "@nx/js" v17.2.5 + "@nx/js" "17.2.7" -"@nrwl/nest@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nrwl/nest/-/nest-17.2.5.tgz#ea77baf32db271a9aebdd3ebb47388de676e76bf" - integrity sha512-SnyapR9wDxpn5p9bF7j2xyxRV5bppdMJOFAsOndh5QFcTGUDhRuuCFZf9vlWSVENyxt0r702jd+vV0pa1uUJVg== +"@nrwl/nest@17.2.7": + version "17.2.7" + resolved "https://registry.yarnpkg.com/@nrwl/nest/-/nest-17.2.7.tgz#442443b59a02ddbaaafbc8b91caa11bb9b286583" + integrity sha512-BbJMdB5+PKPhrYW78jvNizipcUya2DlXNddwruW6GZ8QAYMRaVg9xFxbX7nMO4rRBBqCqmE00Two3aGiMm5L2Q== dependencies: - "@nx/nest" v17.2.5 + "@nx/nest" "17.2.7" -"@nrwl/node@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nrwl/node/-/node-17.2.5.tgz#e35116ecbe72df1784d643f079ce269e10c73a50" - integrity sha512-Dl14XmGjibT1FNpPYIMsL3r/4JAiYyvWmKYdD3lDQCWYVlQ3nBYnA8ApYHGFoiJ9wMNfnLFtdJjGXknLqes2pw== +"@nrwl/node@17.2.7": + version "17.2.7" + resolved "https://registry.yarnpkg.com/@nrwl/node/-/node-17.2.7.tgz#a68616fdfdb67a7227a70c1841c6b6f5a3f9ef2b" + integrity sha512-tWc9tFnQ2ue0Wv2NcMV3fJD1Kqh/vHeV/81ppeLtoYa5GBXViRJPdUinGlez0qiYegEdUbieWjDp255GIEifTw== dependencies: - "@nx/node" v17.2.5 + "@nx/node" "17.2.7" -"@nrwl/storybook@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nrwl/storybook/-/storybook-17.2.5.tgz#c0b7147f97a32ba0cf5a0b5b74282d896f71d2f8" - integrity sha512-zoLqGgw5giLkfKL1jGt0TuP82ox6AR1aLbxjmnThnUQeeot+6JWw/8f3ZIoJ9boi4nWxVkT9Ao9pxW4u4P/T5w== +"@nrwl/storybook@17.2.7": + version "17.2.7" + resolved "https://registry.yarnpkg.com/@nrwl/storybook/-/storybook-17.2.7.tgz#289b3b6e1f1b3f6d5ad6594729e70373051d01fa" + integrity sha512-LGIJfg4JCHQa7ttjlxnBOCLWWYNhBWwZerpnwCgWYWus4w/56hXUd21yN19XVDbABpxOV50HTWXmpHkCU6iiuQ== dependencies: - "@nx/storybook" v17.2.5 + "@nx/storybook" "17.2.7" -"@nrwl/tao@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-17.2.5.tgz#48b941569f83a1669023aeecaaf64f0ea09b5aec" - integrity sha512-hA89BirzFb2MBm26ZPTTJ/RWRjmZ9R39J8321kVEldehStluA4E5zobNd7MJVp77fBK/CCTlIhFeUEP9qmxhZA== +"@nrwl/tao@17.2.7": + version "17.2.7" + resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-17.2.7.tgz#a4df2089559bce0af66fbe785324c1f8abe752ec" + integrity sha512-06YYR1Ndb+nAJaQuvi2J3bX7i2dStQvDHkT+qprUXKxOrggFcPcs+7e2LwNWKDGdCu4r0qFHPlamj7y5d6qM2Q== dependencies: - nx v17.2.5 + nx "17.2.7" tslib "^2.3.0" -"@nrwl/web@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nrwl/web/-/web-17.2.5.tgz#88cf4b351f6db2f536913a86008513f56af32755" - integrity sha512-43wKLPYylyu+w/Ive+Pl0VvyEWnWUjYK+o8D62WuHx+JCcp+bZUKSdueC38U860SJiE1hoa/YRy57W6ZbP9tVg== +"@nrwl/web@17.2.7": + version "17.2.7" + resolved "https://registry.yarnpkg.com/@nrwl/web/-/web-17.2.7.tgz#82a3b8e053edbb2be1ec99f6d5e03a854069b9e5" + integrity sha512-ZlGkmth0qqqQ0WyV6JhdNswSbgOEiDR0G8XJXeoHkDFeThlaU20JyMrqTGNDpQ04d9EpvItvv+bAueg/BLASOw== dependencies: - "@nx/web" v17.2.5 + "@nx/web" "17.2.7" -"@nrwl/webpack@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nrwl/webpack/-/webpack-17.2.5.tgz#eaa790e109d6e317e2409c339cad499509db40b6" - integrity sha512-anjnBvtMQu9kHrVqClXS/x1aTm+xLLr7gmONZBiWr4VSLxO8AO1NuNG9iOC2/i49j+xQ+CfDDauxVwL/X1CUgw== +"@nrwl/webpack@17.2.7": + version "17.2.7" + resolved "https://registry.yarnpkg.com/@nrwl/webpack/-/webpack-17.2.7.tgz#9afa4a12d440515cdbec8555aceba8df1644dce1" + integrity sha512-Ornp2N/cdUNnht0ojjQrtE3ko+JpvAvWvStdZCVfXULMzy96CpGjPzRBkrX+iNee1GYEJXiHFUZhA+n6NlKB3A== dependencies: - "@nx/webpack" v17.2.5 + "@nx/webpack" "17.2.7" -"@nrwl/workspace@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nrwl/workspace/-/workspace-17.2.5.tgz#92cc6c8214c1cb2f2fbc798e2f6da8b11224f2be" - integrity sha512-xDyM/P6ggSW3efEgJ6GoYbErJX1uU14h8OXOS0jK5YLeDiJc7AYiW5JrMoZ1IQl4Pp+p2OrYE6nkc8l2zBXjAQ== +"@nrwl/workspace@17.2.7": + version "17.2.7" + resolved "https://registry.yarnpkg.com/@nrwl/workspace/-/workspace-17.2.7.tgz#7494d6774e45b1b9f2bf57b2fafa33ad3cd2c2db" + integrity sha512-qYb2iLliBfS4IwS1aGqeXgyFzdEcXvu+4jxZpROTcg4THJLYni3XhI/Y8gfi4OVzzCadKILMxiOukZKjjIDPlA== dependencies: - "@nx/workspace" v17.2.5 + "@nx/workspace" "17.2.7" "@nuxtjs/opencollective@0.3.2": version "0.3.2" @@ -4434,20 +4434,20 @@ consola "^2.15.0" node-fetch "^2.6.1" -"@nx/angular@17.2.5", "@nx/angular@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nx/angular/-/angular-17.2.5.tgz#7a25a306f48a338fa791175bd16f3ddb4fd113f8" - integrity sha512-7VT9nMrvla0aDuVHtY2AwCTjovwZ79eOFrengA2MfAwxDUaUGx9qZS7q+CgTtFTxzHhfhoz1EUZvA9s5/KfuXg== - dependencies: - "@nrwl/angular" v17.2.5 - "@nx/cypress" v17.2.5 - "@nx/devkit" v17.2.5 - "@nx/eslint" v17.2.5 - "@nx/jest" v17.2.5 - "@nx/js" v17.2.5 - "@nx/web" v17.2.5 - "@nx/webpack" v17.2.5 - "@nx/workspace" v17.2.5 +"@nx/angular@17.2.7": + version "17.2.7" + resolved "https://registry.yarnpkg.com/@nx/angular/-/angular-17.2.7.tgz#495fe00f01d7c4c9980f2b62851d42b832c45277" + integrity sha512-zRJZa4BqKuXbn9nPgoL/WxXmKSl7iK8v9wGD5jU8eGQk2AZ96rr/yOZZlGZECfKE5ygim6xoM83mW5Ly1z8J+w== + dependencies: + "@nrwl/angular" "17.2.7" + "@nx/cypress" "17.2.7" + "@nx/devkit" "17.2.7" + "@nx/eslint" "17.2.7" + "@nx/jest" "17.2.7" + "@nx/js" "17.2.7" + "@nx/web" "17.2.7" + "@nx/webpack" "17.2.7" + "@nx/workspace" "17.2.7" "@phenomnomnominal/tsquery" "~5.0.1" "@typescript-eslint/type-utils" "^6.9.1" chalk "^4.1.0" @@ -4460,26 +4460,26 @@ webpack "^5.80.0" webpack-merge "^5.8.0" -"@nx/cypress@17.2.5", "@nx/cypress@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nx/cypress/-/cypress-17.2.5.tgz#26027721f172532a6f3a421751d03901fa2491e8" - integrity sha512-sSvS60KOOO+K+Y+yokSOFpR+fNyOoI8262fGcOAoXhZFzgYSTUidtfdmza5KtHDTLDYiu3/nRCigcy6tB/NH0g== +"@nx/cypress@17.2.7": + version "17.2.7" + resolved "https://registry.yarnpkg.com/@nx/cypress/-/cypress-17.2.7.tgz#ccbc2c960e428936e4bbfc7cc9d37470028f5c58" + integrity sha512-MwzaWrIsMxjRPg5DQSBFNM+dNGru0jNjqGyMNlhAM0LPMB34I2bw5Sl6zE6GY2hm05oiFb5AbiSvc1M3ptfzmw== dependencies: - "@nrwl/cypress" v17.2.5 - "@nx/devkit" v17.2.5 - "@nx/eslint" v17.2.5 - "@nx/js" v17.2.5 + "@nrwl/cypress" "17.2.7" + "@nx/devkit" "17.2.7" + "@nx/eslint" "17.2.7" + "@nx/js" "17.2.7" "@phenomnomnominal/tsquery" "~5.0.1" detect-port "^1.5.1" semver "7.5.3" tslib "^2.3.0" -"@nx/devkit@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nx/devkit/-/devkit-17.2.5.tgz#3204483bcb71f14c4eb67e1e3e8b75e795b3df3c" - integrity sha512-eOIIziLA1AxRtRiDI+ZNGpXVtIwrYKeVTsGbLljaj3i5Ks753VMH340WNNlzMUXMseWG6XuQ4PkMhURza2tzog== +"@nx/devkit@17.2.7": + version "17.2.7" + resolved "https://registry.yarnpkg.com/@nx/devkit/-/devkit-17.2.7.tgz#aa5d2352a963a613e415b1d3167a5b87937b6fcb" + integrity sha512-RyJyFO5PkNhMrebpv93Bci6pRkrw6guyfX7Esl/5+O6UfN0ytnmaRIrbiVwftTQ6m/T08OWrJQHZMuByP0WWHQ== dependencies: - "@nrwl/devkit" v17.2.5 + "@nrwl/devkit" "17.2.7" ejs "^3.1.7" enquirer "~2.3.6" ignore "^5.0.4" @@ -4487,43 +4487,43 @@ tmp "~0.2.1" tslib "^2.3.0" -"@nx/eslint-plugin@17.2.5", "@nx/eslint-plugin@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nx/eslint-plugin/-/eslint-plugin-17.2.5.tgz#f454d9fcb87aec29c9f329196c2cb5107698c550" - integrity sha512-xd6IN0/9dt6+8Nd3HvqKnABe5ZcU5RAbVpr3m1t1YD0ZdDYVih492vNuLg4kaAYS+GYut/UQSBTSk+n2cLw9pg== +"@nx/eslint-plugin@17.2.7": + version "17.2.7" + resolved "https://registry.yarnpkg.com/@nx/eslint-plugin/-/eslint-plugin-17.2.7.tgz#749938e202b546efb9ae23df79ec2c065b8e7f88" + integrity sha512-emKsCaWDOPekCJvuE6QE6CHwSR4RKULdOHotnSaE3J65cgair9djsR8SNUELsqpTSfEmtfB53Z0oZYw4zdeiFQ== dependencies: - "@nrwl/eslint-plugin-nx" v17.2.5 - "@nx/devkit" v17.2.5 - "@nx/js" v17.2.5 - "@typescript-eslint/type-utils" "^6.13.2" - "@typescript-eslint/utils" "^6.13.2" + "@nrwl/eslint-plugin-nx" "17.2.7" + "@nx/devkit" "17.2.7" + "@nx/js" "17.2.7" + "@typescript-eslint/type-utils" "^6.9.1" + "@typescript-eslint/utils" "^6.9.1" chalk "^4.1.0" confusing-browser-globals "^1.0.9" jsonc-eslint-parser "^2.1.0" semver "7.5.3" tslib "^2.3.0" -"@nx/eslint@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nx/eslint/-/eslint-17.2.5.tgz#c627bcf4392c35f8c9e585333ee20dd4f5b86a3b" - integrity sha512-+S33U/AXvAygB72Dp646aGAJOhCAJRZGCiArq8nASERD6HWAQU4DMqcYflvTP1OqjPSHkVlaL/JIp7y+XzdTfQ== +"@nx/eslint@17.2.7": + version "17.2.7" + resolved "https://registry.yarnpkg.com/@nx/eslint/-/eslint-17.2.7.tgz#26a4ea6f074d1442e6868dc46b2366166c1a83b9" + integrity sha512-A/+J9rcb9FUwGpEc5yFjFWcoF36PfXc6twOGLceFwj+oOG65h7kUnpuJgWK8gTIh911lij3TdmE6MiqSXPu3tQ== dependencies: - "@nx/devkit" v17.2.5 - "@nx/js" v17.2.5 - "@nx/linter" v17.2.5 + "@nx/devkit" "17.2.7" + "@nx/js" "17.2.7" + "@nx/linter" "17.2.7" tslib "^2.3.0" typescript "~5.2.2" -"@nx/jest@17.2.5", "@nx/jest@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nx/jest/-/jest-17.2.5.tgz#1752a869af187627aef9bc2859eee2f949bba93d" - integrity sha512-Fl7RFLY/4k0AqwX8XibkyMd23yCFtRGW68NFk2I2PlaPwnhS9HEoTb4aMJ8PcTqKXyHg2dyGpjv5QMBEtq6yqA== +"@nx/jest@17.2.7": + version "17.2.7" + resolved "https://registry.yarnpkg.com/@nx/jest/-/jest-17.2.7.tgz#2d24fc70ac093e01f233aadf594ad36d4f5860f0" + integrity sha512-lfUBZ1eCdO2ML2AdPiuXkMcQvuHaevYHB4wrRoUEQp/jui8m8ZQtIaihEy+8nmnSQTSGpCxlILRLpaNQ8gqCoQ== dependencies: "@jest/reporters" "^29.4.1" "@jest/test-result" "^29.4.1" - "@nrwl/jest" v17.2.5 - "@nx/devkit" v17.2.5 - "@nx/js" v17.2.5 + "@nrwl/jest" "17.2.7" + "@nx/devkit" "17.2.7" + "@nx/js" "17.2.7" "@phenomnomnominal/tsquery" "~5.0.1" chalk "^4.1.0" identity-obj-proxy "3.0.0" @@ -4533,10 +4533,10 @@ resolve.exports "1.1.0" tslib "^2.3.0" -"@nx/js@17.2.5", "@nx/js@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nx/js/-/js-17.2.5.tgz#8082ea9ffcd99f7b49efe1259c932359707a9a6c" - integrity sha512-kgH7GRGE+c3RXhvY8C7Np5FWK4yk0mRjnL5X6r14ZYPZPwj0OAOGiFXUVy14epp1SHdyqK1gz878kdrpxomaCQ== +"@nx/js@17.2.7": + version "17.2.7" + resolved "https://registry.yarnpkg.com/@nx/js/-/js-17.2.7.tgz#f2f14bdcf5cd96e23dd2689641d8ce42e9c0b187" + integrity sha512-IghIrp26b9TprxDzJlqH1ZLer+dNmnSDjoT1jviQWcjNY/8wUxe3avd7niMCpfYD6+r7sSGPZ+KVQSRwT3L09g== dependencies: "@babel/core" "^7.22.9" "@babel/plugin-proposal-decorators" "^7.22.7" @@ -4545,9 +4545,9 @@ "@babel/preset-env" "^7.22.9" "@babel/preset-typescript" "^7.22.5" "@babel/runtime" "^7.22.6" - "@nrwl/js" v17.2.5 - "@nx/devkit" v17.2.5 - "@nx/workspace" v17.2.5 + "@nrwl/js" "17.2.7" + "@nx/devkit" "17.2.7" + "@nx/workspace" "17.2.7" "@phenomnomnominal/tsquery" "~5.0.1" babel-plugin-const-enum "^1.0.1" babel-plugin-macros "^2.8.0" @@ -4569,125 +4569,125 @@ tsconfig-paths "^4.1.2" tslib "^2.3.0" -"@nx/linter@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nx/linter/-/linter-17.2.5.tgz#564663a17ff05fa0e8589382d5c37f07be095c34" - integrity sha512-MbTDC3H5w6rOfPxDEKScYn9ByXlCwJEX9U6Bh6GGkVl+w0rZ0rwxtwR4i4EIbMNmuWVhQK1GE8gQf2kzndfOhg== +"@nx/linter@17.2.7": + version "17.2.7" + resolved "https://registry.yarnpkg.com/@nx/linter/-/linter-17.2.7.tgz#38364de5966bd8637ca830808c00fc8b7ab8406d" + integrity sha512-t85R1r+fiEV8wwU6mAD9kKq+YqAxwzBDp3Dx42cX5uokp2jsUKcTHYsibTJ7SVgViJicDLoVDonlJc8SxA0cfQ== dependencies: - "@nx/eslint" v17.2.5 + "@nx/eslint" "17.2.7" -"@nx/nest@17.2.5", "@nx/nest@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nx/nest/-/nest-17.2.5.tgz#bb2cf0d9fa03322d578abc47a2da69e18bf24c94" - integrity sha512-FuXS2VjE+LBMbEcWMHmQlWSkyb+NQypyBrK/oR2xbv2nUXV2qsT9lutVZMqdCJRovPsiPUgaBpVts+oUDaL9Ew== +"@nx/nest@17.2.7": + version "17.2.7" + resolved "https://registry.yarnpkg.com/@nx/nest/-/nest-17.2.7.tgz#1f2a1ad3a7a15b147601e427cd2d554cd75a20eb" + integrity sha512-Gjam5Bciq1AUv8VGtL56SeKv2NgZBgojSU85xJAfGbAUoOxgmiS2hbtORlScE0G22BU+mUFy0J7l9tlslq2amQ== dependencies: "@nestjs/schematics" "^9.1.0" - "@nrwl/nest" v17.2.5 - "@nx/devkit" v17.2.5 - "@nx/eslint" v17.2.5 - "@nx/js" v17.2.5 - "@nx/node" v17.2.5 + "@nrwl/nest" "17.2.7" + "@nx/devkit" "17.2.7" + "@nx/eslint" "17.2.7" + "@nx/js" "17.2.7" + "@nx/node" "17.2.7" "@phenomnomnominal/tsquery" "~5.0.1" tslib "^2.3.0" -"@nx/node@17.2.5", "@nx/node@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nx/node/-/node-17.2.5.tgz#6ffe2779070d4a0b6c180f32b8f9e6ba1fa1d575" - integrity sha512-vAe13g/pnM3QeNQezk+AqJ5u9gYftQg9KqVk1tojKL3eHKfuVs1ZCvFTaANStgao1bNysOZAzPXvfeHLj7MWbw== +"@nx/node@17.2.7": + version "17.2.7" + resolved "https://registry.yarnpkg.com/@nx/node/-/node-17.2.7.tgz#930897cdef951ce83ba698617fa6dc83750c9668" + integrity sha512-u3mChRmUliQENH4wBYNfqx/0Cfzj6PB9Eaj7lvOwwdquLgUgGgkFXFfYTLjHuIClYhyn2ATR84LZ+NLMaLCvdA== dependencies: - "@nrwl/node" v17.2.5 - "@nx/devkit" v17.2.5 - "@nx/eslint" v17.2.5 - "@nx/jest" v17.2.5 - "@nx/js" v17.2.5 + "@nrwl/node" "17.2.7" + "@nx/devkit" "17.2.7" + "@nx/eslint" "17.2.7" + "@nx/jest" "17.2.7" + "@nx/js" "17.2.7" tslib "^2.3.0" -"@nx/nx-darwin-arm64@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nx/nx-darwin-arm64/-/nx-darwin-arm64-17.2.5.tgz#411b861cb0a98540082b7639dbaaa9f48044a25a" - integrity sha512-AGF/XnMkXymS8xYMsbeyNKZWKflfU8TTqEJqlcADMHYcr8OD1Jyq1YYHp/vvPBWqEhUL4bx3GPspQn5YiiCrWw== - -"@nx/nx-darwin-x64@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nx/nx-darwin-x64/-/nx-darwin-x64-17.2.5.tgz#94900e137763b03abeb41f2279e214ea606ad9a8" - integrity sha512-YQQG+kijDNedE6bwEIeKWtVQOxJD+NHW69z6sb/S+ub8NO293YgNtYXgilet9RwOKBubeSyBqWr+yYbRhOuz+A== - -"@nx/nx-freebsd-x64@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nx/nx-freebsd-x64/-/nx-freebsd-x64-17.2.5.tgz#731ffa2f70142a28ce33fd59ef564e24ba94ee5f" - integrity sha512-AzcYELtNDukSTtO6zTAuu9pUI2634/2ZFLdS15C9cqUrK0XNvBcbj6R1KNGjgaBDUJc9H49+fqU8VnLPpJjBKQ== - -"@nx/nx-linux-arm-gnueabihf@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-17.2.5.tgz#4d21f74981baeb7528ff2259a5a433e14af6d8f8" - integrity sha512-24Q5N4krcSV6rbFYGRRgbHTc2eSDoJSWesvAtxAW5Sgh6+wAuqFKVwLwY9ZOn1GQwlySB87YwzH2BMkOfEuorw== - -"@nx/nx-linux-arm64-gnu@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-17.2.5.tgz#067d2e9adccbd1bff4dbad7ac1338c02ddb3bf9c" - integrity sha512-ty08Jnhk/eCVzxdm6o9EaGAZQ4t1WQCO9I/FjriEqtt4e5If6YKJPGjRzu/1OCvppv4d7j0SEN6FiyGkESpBPw== - -"@nx/nx-linux-arm64-musl@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-17.2.5.tgz#7257b80b3e36070136d06d38f7a45d5732146c80" - integrity sha512-iW/hOgkpELTTu53UYNYAUvs5dAXDR94P50HZFvTQeTQH6xr8igMdOBFdApYFZIjD7IrKqNBSeAiyl4TyI6vFag== - -"@nx/nx-linux-x64-gnu@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-17.2.5.tgz#21d0ed9ecb8fc3742ba5220a4f2a6f4e0d9780d4" - integrity sha512-BJi195AOHSHurMrPzT2mNGslIDn4LVxfKKdiRqVeOvQxT3cZij4fzPTUYxdOFnrWU5YPfW4A9p3ydFz8MDapOg== - -"@nx/nx-linux-x64-musl@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-17.2.5.tgz#ed68c1df2521259ef1e522f034af63eaa19771ea" - integrity sha512-r1TrCFvdAIvogNry3Oy0IrWT2Ed5nZHR0lcuW5ImF0HinMmH/o4Ey7Q4IRo5hB88gxq4AUTWt+WoQbImIvoGPg== - -"@nx/nx-win32-arm64-msvc@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-17.2.5.tgz#151c69871e59b061eace5ef9dedac2b684be4fa3" - integrity sha512-TyMH8mys+r4Vgq5LYE6zY70LsL2F7JC85O+jHeVPR0vDNGm5Nb/UHobT5Y/PLpLxIx0aIeRuu6VI3j3oh1JhNw== - -"@nx/nx-win32-x64-msvc@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-17.2.5.tgz#89d2ffa519f8ab4e17469b7d65e353d787feb52e" - integrity sha512-I/LWvNasB+iUEzIeejbuaeeezMCfMjpDBsiPdnS5nfHMVnTOrIbfzQOWLWUr+/7R0fYl1BXTp352iaD+M10Agw== - -"@nx/storybook@17.2.5", "@nx/storybook@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nx/storybook/-/storybook-17.2.5.tgz#c6c087686615036ba5ae51a1a485e9d075080991" - integrity sha512-usF+TxjIF9LmzOBVapp4CJ9Y8dD1rBxjdRpJVzjGfSnpUjvxKGxDZ1dYC2UPojaNAuMcYhQMTGjdwPGU3cJ4oA== - dependencies: - "@nrwl/storybook" v17.2.5 - "@nx/cypress" v17.2.5 - "@nx/devkit" v17.2.5 - "@nx/eslint" v17.2.5 - "@nx/js" v17.2.5 +"@nx/nx-darwin-arm64@17.2.7": + version "17.2.7" + resolved "https://registry.yarnpkg.com/@nx/nx-darwin-arm64/-/nx-darwin-arm64-17.2.7.tgz#8399b96591757367c45b5c8ee5725dcbe60007e2" + integrity sha512-d534L13VUlnSW61rabBl3TTuSpzHxtqy8eF5vsYkFSMonBDjqqNR6+vFfQEa7PW/3Qfeuw4MpmojtamCYLd/TA== + +"@nx/nx-darwin-x64@17.2.7": + version "17.2.7" + resolved "https://registry.yarnpkg.com/@nx/nx-darwin-x64/-/nx-darwin-x64-17.2.7.tgz#1b9cf367cfa035f1443ac0e78f8e60968ab4775f" + integrity sha512-K1pHWiSiYTJqk//ZJylvuQcNZR9HUKvOxuh2540+6X9ThQ7kzkC1abXJ4c9wwH3fYDwL29m7glh3AueJvyaXJA== + +"@nx/nx-freebsd-x64@17.2.7": + version "17.2.7" + resolved "https://registry.yarnpkg.com/@nx/nx-freebsd-x64/-/nx-freebsd-x64-17.2.7.tgz#731e7f8f311e6fdf50b8a8b2b060b322a9e92ad4" + integrity sha512-VyouszZjV7Ew4qNrNfG8JApm7/UcreRuC+W/YZ2ORGzM0KUnB/D4rXGmeTp1Ff+L5WUhoomwEnaBkbgqu+2wjA== + +"@nx/nx-linux-arm-gnueabihf@17.2.7": + version "17.2.7" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-17.2.7.tgz#a1db4a4898e0bb1e77bdf8dbf0959ca9d073dc23" + integrity sha512-YfwW8NYi33Li1Q7BDUusNlfpJNWfXOnHt6JKvQGc8fy8StmWq13zNnU0IxPQyqCDK5Ymx95IoctFrMLpeXPAwQ== + +"@nx/nx-linux-arm64-gnu@17.2.7": + version "17.2.7" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-17.2.7.tgz#7abd71cc615f4ec93fabc31ad410bd7d8eb9e668" + integrity sha512-oJyEf2q+5jj6ci6WEXvRUoU2Sj0Mo+J/0NwtPY6sRIhqgPwpmxc6Pja4zmB16iQ5ap48zstB9glfJ6qtr3iU0Q== + +"@nx/nx-linux-arm64-musl@17.2.7": + version "17.2.7" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-17.2.7.tgz#938ed7504ad1d0f305304250a71b8cf18bc10533" + integrity sha512-IzsCJgJCM61THBMDghz+EY5aCeO7wBWOWq2sTDek1ve67qZtu/E/Z5qBp93JRAvNYgQT7KbC40WhaXuE/NpWEA== + +"@nx/nx-linux-x64-gnu@17.2.7": + version "17.2.7" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-17.2.7.tgz#8a39bfdfc990a2fb4f1679f68195e8cea97d8c99" + integrity sha512-CCY3o9zs9ypsT40GyRGQMfl63Wy3Spu21ULcteoLTI2/py601XIdhv6zclzBqeYIWPVxMoGGlIq10m2rdEeAOA== + +"@nx/nx-linux-x64-musl@17.2.7": + version "17.2.7" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-17.2.7.tgz#0dac2eff58d11524192b2a8a36d70d7c2547e39e" + integrity sha512-hBzrXpoDg1OJBl/Ja5nU3oYTBk/FW6J+jTJM1zmXJOJ8Z7NR26I783qlVLQFDYkMynwGBE3kI4a7L87p633BRw== + +"@nx/nx-win32-arm64-msvc@17.2.7": + version "17.2.7" + resolved "https://registry.yarnpkg.com/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-17.2.7.tgz#f004b2fa0fe1af256c60ddfd90fe28348f1ed4e3" + integrity sha512-imLrVpeBXQwcYDUujBZRE9YG9lqM7F8Qw51JxmCxG2twijlVeofGWw0uVHM16t95cuizt/Ho+bTfNukV7Oza3g== + +"@nx/nx-win32-x64-msvc@17.2.7": + version "17.2.7" + resolved "https://registry.yarnpkg.com/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-17.2.7.tgz#5af5b3e6fe41f432831e809ba7efc02826af8ebe" + integrity sha512-MBQxvEE1sz47prRCid+axKwb6zqcbR4XBKj+l9V5NA7/0Rw5PHjrEfWv5Lr5TckYAdIZ1PVgPHlril6hX89evw== + +"@nx/storybook@17.2.7": + version "17.2.7" + resolved "https://registry.yarnpkg.com/@nx/storybook/-/storybook-17.2.7.tgz#1c43c0e1ed234c0c9f40406fc753321e869eab72" + integrity sha512-kDbk6oIWR/6ZesmJ2/cQQHz0fxG+4WBPHkbda4v8QevuGauPwaxoMXTqRTI0qtRK5nksAnfNIuvGgRfWqmBhpg== + dependencies: + "@nrwl/storybook" "17.2.7" + "@nx/cypress" "17.2.7" + "@nx/devkit" "17.2.7" + "@nx/eslint" "17.2.7" + "@nx/js" "17.2.7" "@phenomnomnominal/tsquery" "~5.0.1" semver "7.5.3" tslib "^2.3.0" -"@nx/web@17.2.5", "@nx/web@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nx/web/-/web-17.2.5.tgz#0a1fe4620534eacd502435ec49fd6aa72c624ac9" - integrity sha512-PP3HBnkhIiswFOYsoRNLsGgZBA4JPmPHNDgr7AxMDBvHpqxMv9sWjTAZq91iOWQB86cY3Bd0C/xEMU5zYjBQ2w== +"@nx/web@17.2.7": + version "17.2.7" + resolved "https://registry.yarnpkg.com/@nx/web/-/web-17.2.7.tgz#d571950ecc4c261879a4fa0430477ebb942ecfe9" + integrity sha512-UhLD84jCLNwY/dC32v3Q5gAkBuj1p6a0h1ihcXqZdMUYbV6sjJhDAnjnfHyPJWgjaoI5t6VNSTJOaMZM9EMfzg== dependencies: - "@nrwl/web" v17.2.5 - "@nx/devkit" v17.2.5 - "@nx/js" v17.2.5 + "@nrwl/web" "17.2.7" + "@nx/devkit" "17.2.7" + "@nx/js" "17.2.7" chalk "^4.1.0" detect-port "^1.5.1" http-server "^14.1.0" tslib "^2.3.0" -"@nx/webpack@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nx/webpack/-/webpack-17.2.5.tgz#ef4c7f52d769cd39e5ef0eafa051d820d324809b" - integrity sha512-SFm5kdyZGirsHaMReTuVAit38gwbNg7rYpwFzMfd1WXvhQ8m7NSLwxiL8+NvTir7iafMIbq7gU6oxUnbzsNQ1g== +"@nx/webpack@17.2.7": + version "17.2.7" + resolved "https://registry.yarnpkg.com/@nx/webpack/-/webpack-17.2.7.tgz#5c849942616c8f0ff60edbcc47b55b5bd65e051e" + integrity sha512-OUxUNxgzEyrn36V4+1T3oQNKyukJphgb+DBNc6NWA9dEWf3U48KdfJuALeKoRZ5J+/lS95L8b/2ygSyu0EdpLw== dependencies: "@babel/core" "^7.22.9" - "@nrwl/webpack" v17.2.5 - "@nx/devkit" v17.2.5 - "@nx/js" v17.2.5 + "@nrwl/webpack" "17.2.7" + "@nx/devkit" "17.2.7" + "@nx/js" "17.2.7" autoprefixer "^10.4.9" babel-loader "^9.1.2" browserslist "^4.21.4" @@ -4721,16 +4721,16 @@ webpack-node-externals "^3.0.0" webpack-subresource-integrity "^5.1.0" -"@nx/workspace@17.2.5", "@nx/workspace@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nx/workspace/-/workspace-17.2.5.tgz#52431c833a0b3295aa177ccfffefb6f99d1c95bc" - integrity sha512-2xcY9s8jK73JBNpXiFg17TwU4gHtOh59HdKFr7sjkCFVBPNPPv5E9/ZRHtsIC7qko6loM/i47NTP52nX7fhEfQ== +"@nx/workspace@17.2.7": + version "17.2.7" + resolved "https://registry.yarnpkg.com/@nx/workspace/-/workspace-17.2.7.tgz#1c930feceb3ca20750124afc03ea71b5fee7de9e" + integrity sha512-/4xrFEc6Hjl9KaB+e/RSaQ/6vHWGP1MmhdX+TRvdjNIMbZ6kdDixBjusJ6WoHXm3KhP95cSt2xmwCQNUzVn+vw== dependencies: - "@nrwl/workspace" v17.2.5 - "@nx/devkit" v17.2.5 + "@nrwl/workspace" "17.2.7" + "@nx/devkit" "17.2.7" chalk "^4.1.0" enquirer "~2.3.6" - nx v17.2.5 + nx "17.2.7" tslib "^2.3.0" yargs-parser "21.1.1" @@ -6986,6 +6986,14 @@ "@typescript-eslint/types" "6.14.0" "@typescript-eslint/visitor-keys" "6.14.0" +"@typescript-eslint/scope-manager@6.15.0": + version "6.15.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.15.0.tgz#40e5214a3e9e048aca55ce33381bc61b6b51c32a" + integrity sha512-+BdvxYBltqrmgCNu4Li+fGDIkW9n//NrruzG9X1vBzaNK+ExVXPoGB71kneaVw/Jp+4rH/vaMAGC6JfMbHstVg== + dependencies: + "@typescript-eslint/types" "6.15.0" + "@typescript-eslint/visitor-keys" "6.15.0" + "@typescript-eslint/type-utils@5.51.0": version "5.51.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.51.0.tgz#7af48005531700b62a20963501d47dfb27095988" @@ -7006,7 +7014,7 @@ debug "^4.3.4" ts-api-utils "^1.0.1" -"@typescript-eslint/type-utils@^6.13.2", "@typescript-eslint/type-utils@^6.9.1": +"@typescript-eslint/type-utils@^6.9.1": version "6.14.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.14.0.tgz#ac9cb5ba0615c837f1a6b172feeb273d36e4f8af" integrity sha512-x6OC9Q7HfYKqjnuNu5a7kffIYs3No30isapRBJl1iCHLitD8O0lFbRcVGiOcuyN837fqXzPZ1NS10maQzZMKqw== @@ -7036,6 +7044,11 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.14.0.tgz#935307f7a931016b7a5eb25d494ea3e1f613e929" integrity sha512-uty9H2K4Xs8E47z3SnXEPRNDfsis8JO27amp2GNCnzGETEW3yTqEIVg5+AI7U276oGF/tw6ZA+UesxeQ104ceA== +"@typescript-eslint/types@6.15.0": + version "6.15.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.15.0.tgz#a9f7b006aee52b0948be6e03f521814bf435ddd5" + integrity sha512-yXjbt//E4T/ee8Ia1b5mGlbNj9fB9lJP4jqLbZualwpP2BCQ5is6BcWwxpIsY4XKAhmdv3hrW92GdtJbatC6dQ== + "@typescript-eslint/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" @@ -7088,6 +7101,19 @@ semver "^7.5.4" ts-api-utils "^1.0.1" +"@typescript-eslint/typescript-estree@6.15.0": + version "6.15.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.15.0.tgz#2f8a513df1ce5e6e1ba8e5c6aa52f392ae023fc5" + integrity sha512-7mVZJN7Hd15OmGuWrp2T9UvqR2Ecg+1j/Bp1jXUEY2GZKV6FXlOIoqVDmLpBiEiq3katvj/2n2mR0SDwtloCew== + dependencies: + "@typescript-eslint/types" "6.15.0" + "@typescript-eslint/visitor-keys" "6.15.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.5.4" + ts-api-utils "^1.0.1" + "@typescript-eslint/utils@5.51.0": version "5.51.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.51.0.tgz#074f4fabd5b12afe9c8aa6fdee881c050f8b4d47" @@ -7115,7 +7141,7 @@ "@typescript-eslint/typescript-estree" "6.13.1" semver "^7.5.4" -"@typescript-eslint/utils@6.14.0", "@typescript-eslint/utils@^6.13.2": +"@typescript-eslint/utils@6.14.0": version "6.14.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.14.0.tgz#856a9e274367d99ffbd39c48128b93a86c4261e3" integrity sha512-XwRTnbvRr7Ey9a1NT6jqdKX8y/atWG+8fAIu3z73HSP8h06i3r/ClMhmaF/RGWGW1tHJEwij1uEg2GbEmPYvYg== @@ -7142,6 +7168,19 @@ eslint-scope "^5.1.1" semver "^7.3.7" +"@typescript-eslint/utils@^6.9.1": + version "6.15.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.15.0.tgz#f80dbb79f3b0f569077a8711dd44186a8933fa4c" + integrity sha512-eF82p0Wrrlt8fQSRL0bGXzK5nWPRV2dYQZdajcfzOD9+cQz9O7ugifrJxclB+xVOvWvagXfqS4Es7vpLP4augw== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@types/json-schema" "^7.0.12" + "@types/semver" "^7.5.0" + "@typescript-eslint/scope-manager" "6.15.0" + "@typescript-eslint/types" "6.15.0" + "@typescript-eslint/typescript-estree" "6.15.0" + semver "^7.5.4" + "@typescript-eslint/visitor-keys@5.51.0": version "5.51.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.51.0.tgz#c0147dd9a36c0de758aaebd5b48cae1ec59eba87" @@ -7174,6 +7213,14 @@ "@typescript-eslint/types" "6.14.0" eslint-visitor-keys "^3.4.1" +"@typescript-eslint/visitor-keys@6.15.0": + version "6.15.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.15.0.tgz#5baf97a7bfeec6f4894d400437055155a46b2330" + integrity sha512-1zvtdC1a9h5Tb5jU9x3ADNXO9yjP8rXlaoChu0DQX40vf5ACVpYIVIZhIMZ6d5sDXH7vq4dsZBT1fEGj8D2n2w== + dependencies: + "@typescript-eslint/types" "6.15.0" + eslint-visitor-keys "^3.4.1" + "@vitejs/plugin-basic-ssl@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.0.1.tgz#48c46eab21e0730921986ce742563ae83fe7fe34" @@ -15799,12 +15846,12 @@ nwsapi@^2.2.2: resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.7.tgz#738e0707d3128cb750dddcfe90e4610482df0f30" integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== -nx@17.2.5, nx@v17.2.5: - version "17.2.5" - resolved "https://registry.yarnpkg.com/nx/-/nx-17.2.5.tgz#fc34bda5fec6b5b0eb65d17c85cb7128e9b028f8" - integrity sha512-bMjl6V+h2Pb7k/iieebQskFqiB5Z7VQgdFJNI6ScMfoMhClWVuF+/fdhxrlN4IaiWHHnZ/KDr7h4kc7puFLr9w== +nx@17.2.7: + version "17.2.7" + resolved "https://registry.yarnpkg.com/nx/-/nx-17.2.7.tgz#ac7d73dea0bd23a332e9520cf4834f8421bbfbff" + integrity sha512-CnssDvDphAgyeoYzdPbz6vA/xac4BQeEiO7R9IBLIm+l1MV7boI4SpCS6abR4dbp4VTwI9uBQ9vgqNwCiEjoWg== dependencies: - "@nrwl/tao" v17.2.5 + "@nrwl/tao" "17.2.7" "@yarnpkg/lockfile" "^1.1.0" "@yarnpkg/parsers" "3.0.0-rc.46" "@zkochan/js-yaml" "0.0.6" @@ -15839,16 +15886,16 @@ nx@17.2.5, nx@v17.2.5: yargs "^17.6.2" yargs-parser "21.1.1" optionalDependencies: - "@nx/nx-darwin-arm64" v17.2.5 - "@nx/nx-darwin-x64" v17.2.5 - "@nx/nx-freebsd-x64" v17.2.5 - "@nx/nx-linux-arm-gnueabihf" v17.2.5 - "@nx/nx-linux-arm64-gnu" v17.2.5 - "@nx/nx-linux-arm64-musl" v17.2.5 - "@nx/nx-linux-x64-gnu" v17.2.5 - "@nx/nx-linux-x64-musl" v17.2.5 - "@nx/nx-win32-arm64-msvc" v17.2.5 - "@nx/nx-win32-x64-msvc" v17.2.5 + "@nx/nx-darwin-arm64" "17.2.7" + "@nx/nx-darwin-x64" "17.2.7" + "@nx/nx-freebsd-x64" "17.2.7" + "@nx/nx-linux-arm-gnueabihf" "17.2.7" + "@nx/nx-linux-arm64-gnu" "17.2.7" + "@nx/nx-linux-arm64-musl" "17.2.7" + "@nx/nx-linux-x64-gnu" "17.2.7" + "@nx/nx-linux-x64-musl" "17.2.7" + "@nx/nx-win32-arm64-msvc" "17.2.7" + "@nx/nx-win32-x64-msvc" "17.2.7" oauth@0.9.x: version "0.9.15" From df2be3ea784d698633229fbae9d385e44cae86c4 Mon Sep 17 00:00:00 2001 From: Daniel Devaud Date: Fri, 29 Dec 2023 12:01:18 +0100 Subject: [PATCH 11/38] Reverted Portfolio-Calc --- .../src/app/portfolio/portfolio-calculator.ts | 47 ++++++++++--------- .../interfaces/timeline-position.interface.ts | 1 - 2 files changed, 25 insertions(+), 23 deletions(-) diff --git a/apps/api/src/app/portfolio/portfolio-calculator.ts b/apps/api/src/app/portfolio/portfolio-calculator.ts index ba35a7670..b165ed5c6 100644 --- a/apps/api/src/app/portfolio/portfolio-calculator.ts +++ b/apps/api/src/app/portfolio/portfolio-calculator.ts @@ -16,7 +16,6 @@ import { addMilliseconds, addMonths, addYears, - differenceInDays, endOfDay, format, isAfter, @@ -45,7 +44,7 @@ import { TransactionPointSymbol } from './interfaces/transaction-point-symbol.in import { TransactionPoint } from './interfaces/transaction-point.interface'; export class PortfolioCalculator { - private static readonly CALCULATE_PERCENTAGE_PERFORMANCE_WITH_TIME_WEIGHTED_INVESTMENT = + private static readonly CALCULATE_PERCENTAGE_PERFORMANCE_WITH_MAX_INVESTMENT = true; private static readonly ENABLE_LOGGING = false; @@ -622,6 +621,7 @@ export class PortfolioCalculator { if (firstIndex > 0) { firstIndex--; } + const initialValues: { [symbol: string]: Big } = {}; const positions: TimelinePosition[] = []; let hasAnySymbolMetricsErrors = false; @@ -635,9 +635,9 @@ export class PortfolioCalculator { grossPerformance, grossPerformancePercentage, hasErrors, + initialValue, netPerformance, - netPerformancePercentage, - timeWeightedInvestment + netPerformancePercentage } = this.getSymbolMetrics({ end, marketSymbolMap, @@ -646,9 +646,9 @@ export class PortfolioCalculator { }); hasAnySymbolMetricsErrors = hasAnySymbolMetricsErrors || hasErrors; + initialValues[item.symbol] = initialValue; positions.push({ - timeWeightedInvestment, averagePrice: item.quantity.eq(0) ? new Big(0) : item.investment.div(item.quantity), @@ -683,7 +683,7 @@ export class PortfolioCalculator { } } - const overall = this.calculateOverallPerformance(positions); + const overall = this.calculateOverallPerformance(positions, initialValues); return { ...overall, @@ -906,13 +906,18 @@ export class PortfolioCalculator { }; } - private calculateOverallPerformance(positions: TimelinePosition[]) { + private calculateOverallPerformance( + positions: TimelinePosition[], + initialValues: { [symbol: string]: Big } + ) { let currentValue = new Big(0); let grossPerformance = new Big(0); + let grossPerformancePercentage = new Big(0); let hasErrors = false; let netPerformance = new Big(0); + let netPerformancePercentage = new Big(0); + let sumOfWeights = new Big(0); let totalInvestment = new Big(0); - let totalTimeWeightedInvestment = new Big(0); for (const currentPosition of positions) { if (currentPosition.marketPrice) { @@ -960,18 +965,22 @@ export class PortfolioCalculator { } } + if (sumOfWeights.gt(0)) { + grossPerformancePercentage = grossPerformancePercentage.div(sumOfWeights); + netPerformancePercentage = netPerformancePercentage.div(sumOfWeights); + } else { + grossPerformancePercentage = new Big(0); + netPerformancePercentage = new Big(0); + } + return { currentValue, grossPerformance, + grossPerformancePercentage, hasErrors, netPerformance, - totalInvestment, - netPerformancePercentage: totalTimeWeightedInvestment.eq(0) - ? new Big(0) - : netPerformance.div(totalTimeWeightedInvestment), - grossPerformancePercentage: totalTimeWeightedInvestment.eq(0) - ? new Big(0) - : grossPerformance.div(totalTimeWeightedInvestment) + netPerformancePercentage, + totalInvestment }; } @@ -1185,7 +1194,6 @@ export class PortfolioCalculator { let averagePriceAtEndDate = new Big(0); let averagePriceAtStartDate = new Big(0); - const currentValues: { [date: string]: Big } = {}; let feesAtStartDate = new Big(0); let fees = new Big(0); let grossPerformance = new Big(0); @@ -1193,6 +1201,7 @@ 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); @@ -1240,9 +1249,6 @@ export class PortfolioCalculator { return order.itemType === 'end'; }); - let totalInvestmentDays = 0; - let sumOfTimeWeightedInvestments = new Big(0); - return this.calculatePerformanceOfSymbol( orders, indexOfStartOrder, @@ -1974,9 +1980,6 @@ export class PortfolioCalculator { 2 )} -> ${averagePriceAtEndDate.toFixed(2)} Total investment: ${totalInvestment.toFixed(2)} - Time weighted investment: ${timeWeightedAverageInvestmentBetweenStartAndEndDate.toFixed( - 2 - )} Max. total investment: ${maxTotalInvestment.toFixed(2)} Gross performance: ${totalGrossPerformance.toFixed( 2 diff --git a/libs/common/src/lib/interfaces/timeline-position.interface.ts b/libs/common/src/lib/interfaces/timeline-position.interface.ts index 1b27de8dc..de4c3ff19 100644 --- a/libs/common/src/lib/interfaces/timeline-position.interface.ts +++ b/libs/common/src/lib/interfaces/timeline-position.interface.ts @@ -16,6 +16,5 @@ export interface TimelinePosition { quantity: Big; symbol: string; tags?: Tag[]; - timeWeightedInvestment: Big; transactionCount: number; } From 34b02210df60143be9049baae7a501c971c9bbf6 Mon Sep 17 00:00:00 2001 From: miles Date: Sat, 30 Dec 2023 00:29:33 +0800 Subject: [PATCH 12/38] Feature/expose the environment variable `REQUEST_TIMEOUT` (#2792) * Expose the environment variable `REQUEST_TIMEOUT` * Update changelog --- CHANGELOG.md | 1 + README.md | 1 + apps/api/src/app/info/info.service.ts | 9 +++--- apps/api/src/app/logo/logo.service.ts | 5 ++-- .../configuration/configuration.service.ts | 1 + .../alpha-vantage/alpha-vantage.service.ts | 3 +- .../coingecko/coingecko.service.ts | 30 +++++++++++-------- .../openfigi/openfigi.service.ts | 3 +- .../trackinsight/trackinsight.service.ts | 14 +++++---- .../yahoo-finance.service.spec.ts | 4 +++ .../yahoo-finance/yahoo-finance.service.ts | 10 +++---- .../eod-historical-data.service.ts | 19 ++++++------ .../financial-modeling-prep.service.ts | 19 ++++++------ .../google-sheets/google-sheets.service.ts | 3 +- .../data-provider/manual/manual.service.ts | 7 +++-- .../rapid-api/rapid-api.service.ts | 13 ++++---- .../yahoo-finance/yahoo-finance.service.ts | 9 +++--- .../interfaces/environment.interface.ts | 1 + libs/common/src/lib/config.ts | 1 - 19 files changed, 83 insertions(+), 70 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 853d6d4aa..ab4a0db12 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Changed the performance calculation to a time-weighted approach +- Exposed the environment variable `REQUEST_TIMEOUT` - Used the `HasPermission` annotation in endpoints - Upgraded `Nx` from version `17.2.5` to `17.2.7` diff --git a/README.md b/README.md index 0a2053e43..09270e529 100644 --- a/README.md +++ b/README.md @@ -100,6 +100,7 @@ We provide official container images hosted on [Docker Hub](https://hub.docker.c | `REDIS_HOST` | | The host where _Redis_ is running | | `REDIS_PASSWORD` | | The password of _Redis_ | | `REDIS_PORT` | | The port where _Redis_ is running | +| `REQUEST_TIMEOUT` | `2000` | The timeout of network requests to data providers in milliseconds | ### Run with Docker Compose diff --git a/apps/api/src/app/info/info.service.ts b/apps/api/src/app/info/info.service.ts index 744e86c9c..a93070cd1 100644 --- a/apps/api/src/app/info/info.service.ts +++ b/apps/api/src/app/info/info.service.ts @@ -8,7 +8,6 @@ import { PropertyService } from '@ghostfolio/api/services/property/property.serv import { TagService } from '@ghostfolio/api/services/tag/tag.service'; import { DEFAULT_CURRENCY, - DEFAULT_REQUEST_TIMEOUT, PROPERTY_BETTER_UPTIME_MONITOR_ID, PROPERTY_COUNTRIES_OF_SUBSCRIBERS, PROPERTY_DEMO_USER_ID, @@ -162,7 +161,7 @@ export class InfoService { setTimeout(() => { abortController.abort(); - }, DEFAULT_REQUEST_TIMEOUT); + }, this.configurationService.get('REQUEST_TIMEOUT')); const { pull_count } = await got( `https://hub.docker.com/v2/repositories/ghostfolio/ghostfolio`, @@ -187,7 +186,7 @@ export class InfoService { setTimeout(() => { abortController.abort(); - }, DEFAULT_REQUEST_TIMEOUT); + }, this.configurationService.get('REQUEST_TIMEOUT')); const { body } = await got('https://github.com/ghostfolio/ghostfolio', { // @ts-ignore @@ -214,7 +213,7 @@ export class InfoService { setTimeout(() => { abortController.abort(); - }, DEFAULT_REQUEST_TIMEOUT); + }, this.configurationService.get('REQUEST_TIMEOUT')); const { stargazers_count } = await got( `https://api.github.com/repos/ghostfolio/ghostfolio`, @@ -342,7 +341,7 @@ export class InfoService { setTimeout(() => { abortController.abort(); - }, DEFAULT_REQUEST_TIMEOUT); + }, this.configurationService.get('REQUEST_TIMEOUT')); const { data } = await got( `https://uptime.betterstack.com/api/v2/monitors/${monitorId}/sla?from=${format( diff --git a/apps/api/src/app/logo/logo.service.ts b/apps/api/src/app/logo/logo.service.ts index 80ae1d6a9..91aaa2cbc 100644 --- a/apps/api/src/app/logo/logo.service.ts +++ b/apps/api/src/app/logo/logo.service.ts @@ -1,5 +1,5 @@ +import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service'; -import { DEFAULT_REQUEST_TIMEOUT } from '@ghostfolio/common/config'; import { UniqueAsset } from '@ghostfolio/common/interfaces'; import { HttpException, Injectable } from '@nestjs/common'; import { DataSource } from '@prisma/client'; @@ -9,6 +9,7 @@ import { StatusCodes, getReasonPhrase } from 'http-status-codes'; @Injectable() export class LogoService { public constructor( + private readonly configurationService: ConfigurationService, private readonly symbolProfileService: SymbolProfileService ) {} @@ -46,7 +47,7 @@ export class LogoService { setTimeout(() => { abortController.abort(); - }, DEFAULT_REQUEST_TIMEOUT); + }, this.configurationService.get('REQUEST_TIMEOUT')); return got( `https://t0.gstatic.com/faviconV2?client=SOCIAL&type=FAVICON&fallback_opts=TYPE,SIZE,URL&url=${aUrl}&size=64`, diff --git a/apps/api/src/services/configuration/configuration.service.ts b/apps/api/src/services/configuration/configuration.service.ts index b355d5a20..5b76055c1 100644 --- a/apps/api/src/services/configuration/configuration.service.ts +++ b/apps/api/src/services/configuration/configuration.service.ts @@ -44,6 +44,7 @@ export class ConfigurationService { REDIS_HOST: str({ default: 'localhost' }), REDIS_PASSWORD: str({ default: '' }), REDIS_PORT: port({ default: 6379 }), + REQUEST_TIMEOUT: num({ default: 2000 }), ROOT_URL: str({ default: DEFAULT_ROOT_URL }), STRIPE_PUBLIC_KEY: str({ default: '' }), STRIPE_SECRET_KEY: str({ default: '' }), 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 2b03f519d..b40f35b36 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 @@ -5,7 +5,6 @@ import { IDataProviderHistoricalResponse, IDataProviderResponse } from '@ghostfolio/api/services/interfaces/interfaces'; -import { DEFAULT_REQUEST_TIMEOUT } from '@ghostfolio/common/config'; import { DATE_FORMAT } from '@ghostfolio/common/helper'; import { Granularity } from '@ghostfolio/common/types'; import { Injectable } from '@nestjs/common'; @@ -107,7 +106,7 @@ export class AlphaVantageService implements DataProviderInterface { } public async getQuotes({ - requestTimeout = DEFAULT_REQUEST_TIMEOUT, + requestTimeout = this.configurationService.get('REQUEST_TIMEOUT'), symbols }: { requestTimeout?: number; diff --git a/apps/api/src/services/data-provider/coingecko/coingecko.service.ts b/apps/api/src/services/data-provider/coingecko/coingecko.service.ts index a9eb44405..d2156ed3b 100644 --- a/apps/api/src/services/data-provider/coingecko/coingecko.service.ts +++ b/apps/api/src/services/data-provider/coingecko/coingecko.service.ts @@ -1,13 +1,11 @@ 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 { - DEFAULT_CURRENCY, - DEFAULT_REQUEST_TIMEOUT -} from '@ghostfolio/common/config'; +import { DEFAULT_CURRENCY } from '@ghostfolio/common/config'; import { DATE_FORMAT } from '@ghostfolio/common/helper'; import { DataProviderInfo } from '@ghostfolio/common/interfaces'; import { Granularity } from '@ghostfolio/common/types'; @@ -25,7 +23,9 @@ import got from 'got'; export class CoinGeckoService implements DataProviderInterface { private readonly URL = 'https://api.coingecko.com/api/v3'; - public constructor() {} + public constructor( + private readonly configurationService: ConfigurationService + ) {} public canHandle(symbol: string) { return true; @@ -47,7 +47,7 @@ export class CoinGeckoService implements DataProviderInterface { setTimeout(() => { abortController.abort(); - }, DEFAULT_REQUEST_TIMEOUT); + }, this.configurationService.get('REQUEST_TIMEOUT')); const { name } = await got(`${this.URL}/coins/${aSymbol}`, { // @ts-ignore @@ -59,7 +59,9 @@ export class CoinGeckoService implements DataProviderInterface { let message = error; if (error?.code === 'ABORT_ERR') { - message = `RequestError: The operation was aborted because the request to the data provider took more than ${DEFAULT_REQUEST_TIMEOUT}ms`; + message = `RequestError: The operation was aborted because the request to the data provider took more than ${this.configurationService.get( + 'REQUEST_TIMEOUT' + )}ms`; } Logger.error(message, 'CoinGeckoService'); @@ -95,7 +97,7 @@ export class CoinGeckoService implements DataProviderInterface { setTimeout(() => { abortController.abort(); - }, DEFAULT_REQUEST_TIMEOUT); + }, this.configurationService.get('REQUEST_TIMEOUT')); const { prices } = await got( `${ @@ -141,7 +143,7 @@ export class CoinGeckoService implements DataProviderInterface { } public async getQuotes({ - requestTimeout = DEFAULT_REQUEST_TIMEOUT, + requestTimeout = this.configurationService.get('REQUEST_TIMEOUT'), symbols }: { requestTimeout?: number; @@ -183,7 +185,9 @@ export class CoinGeckoService implements DataProviderInterface { let message = error; if (error?.code === 'ABORT_ERR') { - message = `RequestError: The operation was aborted because the request to the data provider took more than ${DEFAULT_REQUEST_TIMEOUT}ms`; + message = `RequestError: The operation was aborted because the request to the data provider took more than ${this.configurationService.get( + 'REQUEST_TIMEOUT' + )}ms`; } Logger.error(message, 'CoinGeckoService'); @@ -210,7 +214,7 @@ export class CoinGeckoService implements DataProviderInterface { setTimeout(() => { abortController.abort(); - }, DEFAULT_REQUEST_TIMEOUT); + }, this.configurationService.get('REQUEST_TIMEOUT')); const { coins } = await got(`${this.URL}/search?query=${query}`, { // @ts-ignore @@ -231,7 +235,9 @@ export class CoinGeckoService implements DataProviderInterface { let message = error; if (error?.code === 'ABORT_ERR') { - message = `RequestError: The operation was aborted because the request to the data provider took more than ${DEFAULT_REQUEST_TIMEOUT}ms`; + message = `RequestError: The operation was aborted because the request to the data provider took more than ${this.configurationService.get( + 'REQUEST_TIMEOUT' + )}ms`; } Logger.error(message, 'CoinGeckoService'); diff --git a/apps/api/src/services/data-provider/data-enhancer/openfigi/openfigi.service.ts b/apps/api/src/services/data-provider/data-enhancer/openfigi/openfigi.service.ts index dda30ba1a..5e4f01c22 100644 --- a/apps/api/src/services/data-provider/data-enhancer/openfigi/openfigi.service.ts +++ b/apps/api/src/services/data-provider/data-enhancer/openfigi/openfigi.service.ts @@ -1,6 +1,5 @@ import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { DataEnhancerInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-enhancer.interface'; -import { DEFAULT_REQUEST_TIMEOUT } from '@ghostfolio/common/config'; import { parseSymbol } from '@ghostfolio/common/helper'; import { Injectable } from '@nestjs/common'; import { SymbolProfile } from '@prisma/client'; @@ -15,7 +14,7 @@ export class OpenFigiDataEnhancerService implements DataEnhancerInterface { ) {} public async enhance({ - requestTimeout = DEFAULT_REQUEST_TIMEOUT, + requestTimeout = this.configurationService.get('REQUEST_TIMEOUT'), response, symbol }: { 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 c949a1f22..9a79fa694 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,5 +1,5 @@ +import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { DataEnhancerInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-enhancer.interface'; -import { DEFAULT_REQUEST_TIMEOUT } from '@ghostfolio/common/config'; import { Country } from '@ghostfolio/common/interfaces/country.interface'; import { Sector } from '@ghostfolio/common/interfaces/sector.interface'; import { Injectable } from '@nestjs/common'; @@ -21,8 +21,12 @@ export class TrackinsightDataEnhancerService implements DataEnhancerInterface { 'Information Technology': 'Technology' }; + public constructor( + private readonly configurationService: ConfigurationService + ) {} + public async enhance({ - requestTimeout = DEFAULT_REQUEST_TIMEOUT, + requestTimeout = this.configurationService.get('REQUEST_TIMEOUT'), response, symbol }: { @@ -55,7 +59,7 @@ export class TrackinsightDataEnhancerService implements DataEnhancerInterface { setTimeout(() => { abortController.abort(); - }, DEFAULT_REQUEST_TIMEOUT); + }, this.configurationService.get('REQUEST_TIMEOUT')); return got( `${TrackinsightDataEnhancerService.baseUrl}/funds/${symbol.split( @@ -82,7 +86,7 @@ export class TrackinsightDataEnhancerService implements DataEnhancerInterface { setTimeout(() => { abortController.abort(); - }, DEFAULT_REQUEST_TIMEOUT); + }, this.configurationService.get('REQUEST_TIMEOUT')); const holdings = await got( `${TrackinsightDataEnhancerService.baseUrl}/holdings/${symbol}.json`, @@ -97,7 +101,7 @@ export class TrackinsightDataEnhancerService implements DataEnhancerInterface { setTimeout(() => { abortController.abort(); - }, DEFAULT_REQUEST_TIMEOUT); + }, this.configurationService.get('REQUEST_TIMEOUT')); return got( `${TrackinsightDataEnhancerService.baseUrl}/holdings/${symbol.split( diff --git a/apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.spec.ts b/apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.spec.ts index 8a8ab1f08..951a623d0 100644 --- a/apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.spec.ts +++ b/apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.spec.ts @@ -1,3 +1,4 @@ +import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { CryptocurrencyService } from '@ghostfolio/api/services/cryptocurrency/cryptocurrency.service'; import { YahooFinanceDataEnhancerService } from './yahoo-finance.service'; @@ -25,13 +26,16 @@ jest.mock( ); describe('YahooFinanceDataEnhancerService', () => { + let configurationService: ConfigurationService; let cryptocurrencyService: CryptocurrencyService; let yahooFinanceDataEnhancerService: YahooFinanceDataEnhancerService; beforeAll(async () => { + configurationService = new ConfigurationService(); cryptocurrencyService = new CryptocurrencyService(); yahooFinanceDataEnhancerService = new YahooFinanceDataEnhancerService( + configurationService, cryptocurrencyService ); }); diff --git a/apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.ts b/apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.ts index 67fc0a9c1..0ef622c42 100644 --- a/apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.ts +++ b/apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.ts @@ -1,10 +1,7 @@ +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 { - DEFAULT_CURRENCY, - DEFAULT_REQUEST_TIMEOUT, - UNKNOWN_KEY -} from '@ghostfolio/common/config'; +import { DEFAULT_CURRENCY, UNKNOWN_KEY } from '@ghostfolio/common/config'; import { isCurrency } from '@ghostfolio/common/helper'; import { Injectable, Logger } from '@nestjs/common'; import { @@ -22,6 +19,7 @@ import type { Price } from 'yahoo-finance2/dist/esm/src/modules/quoteSummary-ifa @Injectable() export class YahooFinanceDataEnhancerService implements DataEnhancerInterface { public constructor( + private readonly configurationService: ConfigurationService, private readonly cryptocurrencyService: CryptocurrencyService ) {} @@ -76,7 +74,7 @@ export class YahooFinanceDataEnhancerService implements DataEnhancerInterface { } public async enhance({ - requestTimeout = DEFAULT_REQUEST_TIMEOUT, + requestTimeout = this.configurationService.get('REQUEST_TIMEOUT'), response, symbol }: { diff --git a/apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts b/apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts index 448d54b25..f9cd7be71 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 @@ -5,10 +5,7 @@ import { IDataProviderHistoricalResponse, IDataProviderResponse } from '@ghostfolio/api/services/interfaces/interfaces'; -import { - DEFAULT_CURRENCY, - DEFAULT_REQUEST_TIMEOUT -} from '@ghostfolio/common/config'; +import { DEFAULT_CURRENCY } from '@ghostfolio/common/config'; import { DATE_FORMAT, isCurrency } from '@ghostfolio/common/helper'; import { Granularity } from '@ghostfolio/common/types'; import { Injectable, Logger } from '@nestjs/common'; @@ -82,7 +79,7 @@ export class EodHistoricalDataService implements DataProviderInterface { setTimeout(() => { abortController.abort(); - }, DEFAULT_REQUEST_TIMEOUT); + }, this.configurationService.get('REQUEST_TIMEOUT')); const response = await got( `${this.URL}/eod/${symbol}?api_token=${ @@ -132,7 +129,7 @@ export class EodHistoricalDataService implements DataProviderInterface { } public async getQuotes({ - requestTimeout = DEFAULT_REQUEST_TIMEOUT, + requestTimeout = this.configurationService.get('REQUEST_TIMEOUT'), symbols }: { requestTimeout?: number; @@ -232,7 +229,9 @@ export class EodHistoricalDataService implements DataProviderInterface { let message = error; if (error?.code === 'ABORT_ERR') { - message = `RequestError: The operation was aborted because the request to the data provider took more than ${DEFAULT_REQUEST_TIMEOUT}ms`; + message = `RequestError: The operation was aborted because the request to the data provider took more than ${this.configurationService.get( + 'REQUEST_TIMEOUT' + )}ms`; } Logger.error(message, 'EodHistoricalDataService'); @@ -359,7 +358,7 @@ export class EodHistoricalDataService implements DataProviderInterface { setTimeout(() => { abortController.abort(); - }, DEFAULT_REQUEST_TIMEOUT); + }, this.configurationService.get('REQUEST_TIMEOUT')); const response = await got( `${this.URL}/search/${aQuery}?api_token=${this.apiKey}`, @@ -391,7 +390,9 @@ export class EodHistoricalDataService implements DataProviderInterface { let message = error; if (error?.code === 'ABORT_ERR') { - message = `RequestError: The operation was aborted because the request to the data provider took more than ${DEFAULT_REQUEST_TIMEOUT}ms`; + message = `RequestError: The operation was aborted because the request to the data provider took more than ${this.configurationService.get( + 'REQUEST_TIMEOUT' + )}ms`; } Logger.error(message, 'EodHistoricalDataService'); diff --git a/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts b/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts index 1c3db1520..e16093d3e 100644 --- a/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts +++ b/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts @@ -5,10 +5,7 @@ import { IDataProviderHistoricalResponse, IDataProviderResponse } from '@ghostfolio/api/services/interfaces/interfaces'; -import { - DEFAULT_CURRENCY, - DEFAULT_REQUEST_TIMEOUT -} from '@ghostfolio/common/config'; +import { DEFAULT_CURRENCY } from '@ghostfolio/common/config'; import { DATE_FORMAT, parseDate } from '@ghostfolio/common/helper'; import { DataProviderInfo } from '@ghostfolio/common/interfaces'; import { Granularity } from '@ghostfolio/common/types'; @@ -70,7 +67,7 @@ export class FinancialModelingPrepService implements DataProviderInterface { setTimeout(() => { abortController.abort(); - }, DEFAULT_REQUEST_TIMEOUT); + }, this.configurationService.get('REQUEST_TIMEOUT')); const { historical } = await got( `${this.URL}/historical-price-full/${aSymbol}?apikey=${this.apiKey}`, @@ -114,7 +111,7 @@ export class FinancialModelingPrepService implements DataProviderInterface { } public async getQuotes({ - requestTimeout = DEFAULT_REQUEST_TIMEOUT, + requestTimeout = this.configurationService.get('REQUEST_TIMEOUT'), symbols }: { requestTimeout?: number; @@ -154,7 +151,9 @@ export class FinancialModelingPrepService implements DataProviderInterface { let message = error; if (error?.code === 'ABORT_ERR') { - message = `RequestError: The operation was aborted because the request to the data provider took more than ${DEFAULT_REQUEST_TIMEOUT}ms`; + message = `RequestError: The operation was aborted because the request to the data provider took more than ${this.configurationService.get( + 'REQUEST_TIMEOUT' + )}ms`; } Logger.error(message, 'FinancialModelingPrepService'); @@ -181,7 +180,7 @@ export class FinancialModelingPrepService implements DataProviderInterface { setTimeout(() => { abortController.abort(); - }, DEFAULT_REQUEST_TIMEOUT); + }, this.configurationService.get('REQUEST_TIMEOUT')); const result = await got( `${this.URL}/search?query=${query}&apikey=${this.apiKey}`, @@ -205,7 +204,9 @@ export class FinancialModelingPrepService implements DataProviderInterface { let message = error; if (error?.code === 'ABORT_ERR') { - message = `RequestError: The operation was aborted because the request to the data provider took more than ${DEFAULT_REQUEST_TIMEOUT}ms`; + message = `RequestError: The operation was aborted because the request to the data provider took more than ${this.configurationService.get( + 'REQUEST_TIMEOUT' + )}ms`; } Logger.error(message, 'FinancialModelingPrepService'); 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 6dc8dc80b..e753db3a3 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 @@ -7,7 +7,6 @@ import { } 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 { DEFAULT_REQUEST_TIMEOUT } from '@ghostfolio/common/config'; import { DATE_FORMAT, parseDate } from '@ghostfolio/common/helper'; import { Granularity } from '@ghostfolio/common/types'; import { Injectable, Logger } from '@nestjs/common'; @@ -101,7 +100,7 @@ export class GoogleSheetsService implements DataProviderInterface { } public async getQuotes({ - requestTimeout = DEFAULT_REQUEST_TIMEOUT, + requestTimeout = this.configurationService.get('REQUEST_TIMEOUT'), symbols }: { requestTimeout?: number; 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 1464a526d..9a0ff82d9 100644 --- a/apps/api/src/services/data-provider/manual/manual.service.ts +++ b/apps/api/src/services/data-provider/manual/manual.service.ts @@ -1,4 +1,5 @@ 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, @@ -6,7 +7,6 @@ import { } 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 { DEFAULT_REQUEST_TIMEOUT } from '@ghostfolio/common/config'; import { DATE_FORMAT, extractNumberFromString, @@ -23,6 +23,7 @@ import got from 'got'; @Injectable() export class ManualService implements DataProviderInterface { public constructor( + private readonly configurationService: ConfigurationService, private readonly prismaService: PrismaService, private readonly symbolProfileService: SymbolProfileService ) {} @@ -100,7 +101,7 @@ export class ManualService implements DataProviderInterface { setTimeout(() => { abortController.abort(); - }, DEFAULT_REQUEST_TIMEOUT); + }, this.configurationService.get('REQUEST_TIMEOUT')); const { body } = await got(url, { headers, @@ -134,7 +135,7 @@ export class ManualService implements DataProviderInterface { } public async getQuotes({ - requestTimeout = DEFAULT_REQUEST_TIMEOUT, + requestTimeout = this.configurationService.get('REQUEST_TIMEOUT'), symbols }: { requestTimeout?: number; 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 5c2df222c..ba746ebbe 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 @@ -5,10 +5,7 @@ import { IDataProviderHistoricalResponse, IDataProviderResponse } from '@ghostfolio/api/services/interfaces/interfaces'; -import { - DEFAULT_REQUEST_TIMEOUT, - ghostfolioFearAndGreedIndexSymbol -} from '@ghostfolio/common/config'; +import { ghostfolioFearAndGreedIndexSymbol } from '@ghostfolio/common/config'; import { DATE_FORMAT, getYesterday } from '@ghostfolio/common/helper'; import { Granularity } from '@ghostfolio/common/types'; import { Injectable, Logger } from '@nestjs/common'; @@ -88,7 +85,7 @@ export class RapidApiService implements DataProviderInterface { } public async getQuotes({ - requestTimeout = DEFAULT_REQUEST_TIMEOUT, + requestTimeout = this.configurationService.get('REQUEST_TIMEOUT'), symbols }: { requestTimeout?: number; @@ -146,7 +143,7 @@ export class RapidApiService implements DataProviderInterface { setTimeout(() => { abortController.abort(); - }, DEFAULT_REQUEST_TIMEOUT); + }, this.configurationService.get('REQUEST_TIMEOUT')); const { fgi } = await got( `https://fear-and-greed-index.p.rapidapi.com/v1/fgi`, @@ -166,7 +163,9 @@ export class RapidApiService implements DataProviderInterface { let message = error; if (error?.code === 'ABORT_ERR') { - message = `RequestError: The operation was aborted because the request to the data provider took more than ${DEFAULT_REQUEST_TIMEOUT}ms`; + message = `RequestError: The operation was aborted because the request to the data provider took more than ${this.configurationService.get( + 'REQUEST_TIMEOUT' + )}ms`; } Logger.error(message, 'RapidApiService'); 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 96bffa7ea..2a972d176 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,4 +1,5 @@ import { LookupItem } from '@ghostfolio/api/app/symbol/interfaces/lookup-item.interface'; +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'; @@ -6,10 +7,7 @@ import { IDataProviderHistoricalResponse, IDataProviderResponse } from '@ghostfolio/api/services/interfaces/interfaces'; -import { - DEFAULT_CURRENCY, - DEFAULT_REQUEST_TIMEOUT -} from '@ghostfolio/common/config'; +import { DEFAULT_CURRENCY } from '@ghostfolio/common/config'; import { DATE_FORMAT } from '@ghostfolio/common/helper'; import { Granularity } from '@ghostfolio/common/types'; import { Injectable, Logger } from '@nestjs/common'; @@ -22,6 +20,7 @@ import { Quote } from 'yahoo-finance2/dist/esm/src/modules/quote'; @Injectable() export class YahooFinanceService implements DataProviderInterface { public constructor( + private readonly configurationService: ConfigurationService, private readonly cryptocurrencyService: CryptocurrencyService, private readonly yahooFinanceDataEnhancerService: YahooFinanceDataEnhancerService ) {} @@ -160,7 +159,7 @@ export class YahooFinanceService implements DataProviderInterface { } public async getQuotes({ - requestTimeout = DEFAULT_REQUEST_TIMEOUT, + requestTimeout = this.configurationService.get('REQUEST_TIMEOUT'), symbols }: { requestTimeout?: number; diff --git a/apps/api/src/services/interfaces/environment.interface.ts b/apps/api/src/services/interfaces/environment.interface.ts index 9b10a3205..a410070a0 100644 --- a/apps/api/src/services/interfaces/environment.interface.ts +++ b/apps/api/src/services/interfaces/environment.interface.ts @@ -32,6 +32,7 @@ export interface Environment extends CleanedEnvAccessors { REDIS_HOST: string; REDIS_PASSWORD: string; REDIS_PORT: number; + REQUEST_TIMEOUT: number; ROOT_URL: string; STRIPE_PUBLIC_KEY: string; STRIPE_SECRET_KEY: string; diff --git a/libs/common/src/lib/config.ts b/libs/common/src/lib/config.ts index b8369d60a..18926f0b8 100644 --- a/libs/common/src/lib/config.ts +++ b/libs/common/src/lib/config.ts @@ -39,7 +39,6 @@ export const DEFAULT_CURRENCY = 'USD'; export const DEFAULT_DATE_FORMAT_MONTH_YEAR = 'MMM yyyy'; export const DEFAULT_LANGUAGE_CODE = 'en'; export const DEFAULT_PAGE_SIZE = 50; -export const DEFAULT_REQUEST_TIMEOUT = ms('2 seconds'); export const DEFAULT_ROOT_URL = 'http://localhost:4200'; export const EMERGENCY_FUND_TAG_ID = '4452656d-9fa4-4bd0-ba38-70492e31d180'; From 01b6c14bcc35054ad786040a93ac0b74079f50eb Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Fri, 29 Dec 2023 17:31:50 +0100 Subject: [PATCH 13/38] Feature/improve handling of derived currency usx (#2788) * Improve handling of USX * Update changelog --- CHANGELOG.md | 4 ++++ .../eod-historical-data.service.ts | 17 ++++++++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ab4a0db12..6d9c4284b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Used the `HasPermission` annotation in endpoints - Upgraded `Nx` from version `17.2.5` to `17.2.7` +### Fixed + +- Improved the handling of derived currencies (`USX`) + ## 2.32.0 - 2023-12-26 ### Added 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 f9cd7be71..76e8ce9c6 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 @@ -191,7 +191,9 @@ export class EodHistoricalDataService implements DataProviderInterface { })?.currency; result[this.convertFromEodSymbol(code)] = { - currency: currency ?? DEFAULT_CURRENCY, + currency: + currency ?? + this.convertFromEodSymbol(code)?.replace(DEFAULT_CURRENCY, ''), dataSource: DataSource.EOD_HISTORICAL_DATA, marketPrice: close, marketState: isToday(new Date(timestamp * 1000)) ? 'open' : 'closed' @@ -205,7 +207,7 @@ export class EodHistoricalDataService implements DataProviderInterface { if (response[`${DEFAULT_CURRENCY}GBP`]) { response[`${DEFAULT_CURRENCY}GBp`] = { ...response[`${DEFAULT_CURRENCY}GBP`], - currency: `${DEFAULT_CURRENCY}GBp`, + currency: 'GBp', marketPrice: this.getConvertedValue({ symbol: `${DEFAULT_CURRENCY}GBp`, value: response[`${DEFAULT_CURRENCY}GBP`].marketPrice @@ -216,7 +218,7 @@ export class EodHistoricalDataService implements DataProviderInterface { if (response[`${DEFAULT_CURRENCY}ILS`]) { response[`${DEFAULT_CURRENCY}ILA`] = { ...response[`${DEFAULT_CURRENCY}ILS`], - currency: `${DEFAULT_CURRENCY}ILA`, + currency: 'ILA', marketPrice: this.getConvertedValue({ symbol: `${DEFAULT_CURRENCY}ILA`, value: response[`${DEFAULT_CURRENCY}ILS`].marketPrice @@ -224,6 +226,15 @@ export class EodHistoricalDataService implements DataProviderInterface { }; } + if (response[`${DEFAULT_CURRENCY}USX`]) { + response[`${DEFAULT_CURRENCY}USX`] = { + currency: 'USX', + dataSource: this.getName(), + marketPrice: new Big(1).mul(100).toNumber(), + marketState: 'open' + }; + } + return response; } catch (error) { let message = error; From e465f1b7915d69a3edac0c191790240463487ceb Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Fri, 29 Dec 2023 19:55:51 +0100 Subject: [PATCH 14/38] Feature/add support to edit currency of asset profile with data source manual (#2789) * Add support to edit currency * Update changelog --- CHANGELOG.md | 4 ++++ apps/api/src/app/admin/admin.service.ts | 2 ++ .../src/app/admin/update-asset-profile.dto.ts | 4 ++++ .../symbol-profile/symbol-profile.service.ts | 2 ++ .../asset-profile-dialog.component.ts | 21 +++++++++++++++---- .../asset-profile-dialog.html | 9 ++++++++ .../asset-profile-dialog.module.ts | 2 ++ ...eate-or-update-account-dialog.component.ts | 2 +- apps/client/src/app/services/admin.service.ts | 2 ++ libs/common/src/lib/interfaces/index.ts | 6 ++++-- .../currency-selector.component.ts | 2 +- 11 files changed, 48 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6d9c4284b..513f6266c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +### Added + +- Added support to edit the currency of asset profiles with `MANUAL` data source in the asset profile details dialog of the admin control panel + ### Changed - Changed the performance calculation to a time-weighted approach diff --git a/apps/api/src/app/admin/admin.service.ts b/apps/api/src/app/admin/admin.service.ts index 40aaf286e..51b93517f 100644 --- a/apps/api/src/app/admin/admin.service.ts +++ b/apps/api/src/app/admin/admin.service.ts @@ -321,6 +321,7 @@ export class AdminService { assetClass, assetSubClass, comment, + currency, dataSource, name, scraperConfiguration, @@ -331,6 +332,7 @@ export class AdminService { assetClass, assetSubClass, comment, + currency, dataSource, name, scraperConfiguration, diff --git a/apps/api/src/app/admin/update-asset-profile.dto.ts b/apps/api/src/app/admin/update-asset-profile.dto.ts index a39f8db81..56794606c 100644 --- a/apps/api/src/app/admin/update-asset-profile.dto.ts +++ b/apps/api/src/app/admin/update-asset-profile.dto.ts @@ -14,6 +14,10 @@ export class UpdateAssetProfileDto { @IsOptional() comment?: string; + @IsString() + @IsOptional() + currency?: string; + @IsString() @IsOptional() name?: string; diff --git a/apps/api/src/services/symbol-profile/symbol-profile.service.ts b/apps/api/src/services/symbol-profile/symbol-profile.service.ts index 46a6991cb..37671c4e2 100644 --- a/apps/api/src/services/symbol-profile/symbol-profile.service.ts +++ b/apps/api/src/services/symbol-profile/symbol-profile.service.ts @@ -89,6 +89,7 @@ export class SymbolProfileService { assetClass, assetSubClass, comment, + currency, dataSource, name, scraperConfiguration, @@ -100,6 +101,7 @@ export class SymbolProfileService { assetClass, assetSubClass, comment, + currency, name, scraperConfiguration, symbolMapping 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 03dc717d5..6421e888b 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 @@ -15,6 +15,7 @@ import { DataService } from '@ghostfolio/client/services/data.service'; import { DATE_FORMAT, parseDate } from '@ghostfolio/common/helper'; import { AdminMarketDataDetails, + Currency, UniqueAsset } from '@ghostfolio/common/interfaces'; import { translate } from '@ghostfolio/ui/i18n'; @@ -51,6 +52,7 @@ export class AssetProfileDialog implements OnDestroy, OnInit { assetClass: new FormControl(undefined), assetSubClass: new FormControl(undefined), comment: '', + currency: '', historicalData: this.formBuilder.group({ csvString: '' }), @@ -63,6 +65,7 @@ export class AssetProfileDialog implements OnDestroy, OnInit { public countries: { [code: string]: { name: string; value: number }; }; + public currencies: Currency[] = []; public isBenchmark = false; public marketDataDetails: MarketData[] = []; public sectors: { @@ -86,7 +89,13 @@ export class AssetProfileDialog implements OnDestroy, OnInit { ) {} public ngOnInit(): void { - this.benchmarks = this.dataService.fetchInfo().benchmarks; + const { benchmarks, currencies } = this.dataService.fetchInfo(); + + this.benchmarks = benchmarks; + this.currencies = currencies.map((currency) => ({ + label: currency, + value: currency + })); this.initialize(); } @@ -132,6 +141,7 @@ export class AssetProfileDialog implements OnDestroy, OnInit { assetClass: this.assetProfile.assetClass ?? null, assetSubClass: this.assetProfile.assetSubClass ?? null, comment: this.assetProfile?.comment ?? '', + currency: this.assetProfile?.currency, historicalData: { csvString: AssetProfileDialog.HISTORICAL_DATA_TEMPLATE }, @@ -245,12 +255,15 @@ export class AssetProfileDialog implements OnDestroy, OnInit { } catch {} const assetProfileData: UpdateAssetProfileDto = { + scraperConfiguration, + symbolMapping, assetClass: this.assetProfileForm.controls['assetClass'].value, assetSubClass: this.assetProfileForm.controls['assetSubClass'].value, comment: this.assetProfileForm.controls['comment'].value ?? null, - name: this.assetProfileForm.controls['name'].value, - scraperConfiguration, - symbolMapping + currency: (( + (this.assetProfileForm.controls['currency'].value) + ))?.value, + name: this.assetProfileForm.controls['name'].value }; this.adminService 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 72d673776..08051a0ef 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 @@ -183,6 +183,15 @@ +
+ + Currency + + +
Asset Class diff --git a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.module.ts b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.module.ts index 0f9fdaaca..8cbe21ef3 100644 --- a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.module.ts +++ b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.module.ts @@ -10,6 +10,7 @@ import { MatMenuModule } from '@angular/material/menu'; import { MatSelectModule } from '@angular/material/select'; import { MatSnackBarModule } from '@angular/material/snack-bar'; import { GfAdminMarketDataDetailModule } from '@ghostfolio/client/components/admin-market-data-detail/admin-market-data-detail.module'; +import { GfCurrencySelectorModule } from '@ghostfolio/ui/currency-selector/currency-selector.module'; import { GfPortfolioProportionChartModule } from '@ghostfolio/ui/portfolio-proportion-chart/portfolio-proportion-chart.module'; import { GfValueModule } from '@ghostfolio/ui/value'; @@ -21,6 +22,7 @@ import { AssetProfileDialog } from './asset-profile-dialog.component'; CommonModule, FormsModule, GfAdminMarketDataDetailModule, + GfCurrencySelectorModule, GfPortfolioProportionChartModule, GfValueModule, MatButtonModule, diff --git a/apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.component.ts b/apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.component.ts index 9e153d173..760eb1f03 100644 --- a/apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.component.ts +++ b/apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.component.ts @@ -15,7 +15,7 @@ import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import { CreateAccountDto } from '@ghostfolio/api/app/account/create-account.dto'; import { UpdateAccountDto } from '@ghostfolio/api/app/account/update-account.dto'; import { DataService } from '@ghostfolio/client/services/data.service'; -import { Currency } from '@ghostfolio/common/interfaces/currency.interface'; +import { Currency } from '@ghostfolio/common/interfaces'; import { Platform } from '@prisma/client'; import { Observable, Subject } from 'rxjs'; import { map, startWith } from 'rxjs/operators'; diff --git a/apps/client/src/app/services/admin.service.ts b/apps/client/src/app/services/admin.service.ts index 2854a2379..9f8fc9d13 100644 --- a/apps/client/src/app/services/admin.service.ts +++ b/apps/client/src/app/services/admin.service.ts @@ -206,6 +206,7 @@ export class AdminService { assetClass, assetSubClass, comment, + currency, dataSource, name, scraperConfiguration, @@ -218,6 +219,7 @@ export class AdminService { assetClass, assetSubClass, comment, + currency, name, scraperConfiguration, symbolMapping diff --git a/libs/common/src/lib/interfaces/index.ts b/libs/common/src/lib/interfaces/index.ts index 7d76c419e..2875cb305 100644 --- a/libs/common/src/lib/interfaces/index.ts +++ b/libs/common/src/lib/interfaces/index.ts @@ -11,6 +11,7 @@ import type { BenchmarkMarketDataDetails } from './benchmark-market-data-details import type { BenchmarkProperty } from './benchmark-property.interface'; import type { Benchmark } from './benchmark.interface'; import type { Coupon } from './coupon.interface'; +import type { Currency } from './currency.interface'; import type { DataProviderInfo } from './data-provider-info.interface'; import type { EnhancedSymbolProfile } from './enhanced-symbol-profile.interface'; import type { Export } from './export.interface'; @@ -42,8 +43,8 @@ import type { PortfolioPerformanceResponse } from './responses/portfolio-perform import type { ScraperConfiguration } from './scraper-configuration.interface'; import type { Statistics } from './statistics.interface'; import type { Subscription } from './subscription.interface'; -import { SystemMessage } from './system-message.interface'; -import { TabConfiguration } from './tab-configuration.interface'; +import type { SystemMessage } from './system-message.interface'; +import type { TabConfiguration } from './tab-configuration.interface'; import type { TimelinePosition } from './timeline-position.interface'; import type { UniqueAsset } from './unique-asset.interface'; import type { UserSettings } from './user-settings.interface'; @@ -63,6 +64,7 @@ export { BenchmarkProperty, BenchmarkResponse, Coupon, + Currency, DataProviderInfo, EnhancedSymbolProfile, Export, diff --git a/libs/ui/src/lib/currency-selector/currency-selector.component.ts b/libs/ui/src/lib/currency-selector/currency-selector.component.ts index f75b684dd..b86ff44da 100644 --- a/libs/ui/src/lib/currency-selector/currency-selector.component.ts +++ b/libs/ui/src/lib/currency-selector/currency-selector.component.ts @@ -16,7 +16,7 @@ import { } from '@angular/material/autocomplete'; import { MatFormFieldControl } from '@angular/material/form-field'; import { MatInput } from '@angular/material/input'; -import { Currency } from '@ghostfolio/common/interfaces/currency.interface'; +import { Currency } from '@ghostfolio/common/interfaces'; import { AbstractMatFormField } from '@ghostfolio/ui/shared/abstract-mat-form-field'; import { Subject } from 'rxjs'; import { map, startWith, takeUntil } from 'rxjs/operators'; From 61ecc48d0ec2ee3c25f5a2f8c260bdf994a7ad9a Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sat, 30 Dec 2023 10:34:17 +0100 Subject: [PATCH 15/38] Feature/improve language localization for de 20231229 (#2796) * Improve language localizations * Update changelog --- CHANGELOG.md | 1 + apps/client/project.json | 2 +- apps/client/src/locales/messages.de.xlf | 176 +- apps/client/src/locales/messages.es.xlf | 176 +- apps/client/src/locales/messages.fr.xlf | 176 +- apps/client/src/locales/messages.it.xlf | 176 +- apps/client/src/locales/messages.nl.xlf | 176 +- apps/client/src/locales/messages.pl.xlf | 176 +- apps/client/src/locales/messages.pt.xlf | 176 +- apps/client/src/locales/messages.tr.xlf | 226 +- apps/client/src/locales/messages.xlf | 6153 ++++++++++++----------- 11 files changed, 4303 insertions(+), 3311 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 513f6266c..c591dceb1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Changed the performance calculation to a time-weighted approach - Exposed the environment variable `REQUEST_TIMEOUT` - Used the `HasPermission` annotation in endpoints +- Improved the language localization for German (`de`) - Upgraded `Nx` from version `17.2.5` to `17.2.7` ### Fixed diff --git a/apps/client/project.json b/apps/client/project.json index 26292ffee..4eb03df3c 100644 --- a/apps/client/project.json +++ b/apps/client/project.json @@ -191,7 +191,7 @@ "extract-i18n": { "executor": "ng-extract-i18n-merge:ng-extract-i18n-merge", "options": { - "buildTarget": "client:build", + "browserTarget": "client:build", "includeContext": true, "outputPath": "src/locales", "targetFiles": [ diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index 3f6f209de..aa03e3ee6 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -52,6 +52,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 12 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 154 + libs/ui/src/lib/activities-table/activities-table.component.html 164 @@ -156,6 +160,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 114 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 130 + libs/ui/src/lib/activities-table/activities-table.component.html 179 @@ -224,6 +232,14 @@ libs/ui/src/lib/account-balances/account-balances.component.html 20 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 250 + + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 286 + libs/ui/src/lib/activities-table/activities-table.component.html 321 @@ -260,6 +276,10 @@ apps/client/src/app/components/admin-tag/admin-tag.component.html 71 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 415 + libs/ui/src/lib/activities-table/activities-table.component.html 507 @@ -296,6 +316,10 @@ libs/ui/src/lib/account-balances/account-balances.component.html 50 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 437 + libs/ui/src/lib/activities-table/activities-table.component.html 529 @@ -448,6 +472,10 @@ libs/ui/src/lib/account-balances/account-balances.component.html 11 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 163 + libs/ui/src/lib/activities-table/activities-table.component.html 152 @@ -474,7 +502,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 260 + 269 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -518,7 +546,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 267 + 276 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -598,7 +626,7 @@ Möchtest du diesen Gutscheincode wirklich löschen? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 133 + 137 @@ -606,7 +634,7 @@ Möchtest du diese Währung wirklich löschen? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 146 + 150 @@ -614,7 +642,7 @@ Möchtest du den Cache wirklich leeren? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 169 + 173 @@ -622,7 +650,7 @@ Bitte gebe deine Systemmeldung ein: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 200 + 204 @@ -1504,7 +1532,7 @@ apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html - 270 + 289 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -1516,7 +1544,7 @@ Datenfehler melden apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html - 287 + 306 @@ -1624,7 +1652,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 132 + 138 @@ -1824,7 +1852,7 @@ Möchtest du diese Anmeldemethode wirklich löschen? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 182 + 183 @@ -1834,6 +1862,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 69 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 301 + libs/ui/src/lib/activities-table/activities-table.component.html 387 @@ -2010,6 +2042,10 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 91 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 188 + apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html 22 @@ -2018,6 +2054,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 120 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 269 + libs/ui/src/lib/activities-table/activities-table.component.html 209 @@ -2394,6 +2434,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 153 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 179 + libs/ui/src/lib/activities-table/activities-table.component.html 230 @@ -2410,6 +2454,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 228 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 203 + libs/ui/src/lib/activities-table/activities-table.component.html 259 @@ -2426,6 +2474,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 267 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 227 + libs/ui/src/lib/activities-table/activities-table.component.html 288 @@ -2436,7 +2488,7 @@ Kommentar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 247 + 256 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2460,7 +2512,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 188 + 197 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2488,7 +2540,7 @@ Daten importieren... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 113 + 119 @@ -2496,7 +2548,7 @@ Der Import wurde abgeschlossen apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 121 + 127 @@ -2626,6 +2678,10 @@ Draft Geplant + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 140 + libs/ui/src/lib/activities-table/activities-table.component.html 189 @@ -2636,12 +2692,20 @@ Aktivitäten importieren apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 40 + 43 Export Activities Aktivitäten exportieren + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 39 + + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 384 + libs/ui/src/lib/activities-table/activities-table.component.html 47 @@ -2654,6 +2718,14 @@ Export Drafts as ICS Geplante Aktivitäten als ICS exportieren + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 51 + + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 396 + libs/ui/src/lib/activities-table/activities-table.component.html 59 @@ -2666,6 +2738,10 @@ Clone Kopieren + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 421 + libs/ui/src/lib/activities-table/activities-table.component.html 513 @@ -2674,6 +2750,10 @@ Export Draft as ICS Geplante Aktivität als ICS exportieren + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 431 + libs/ui/src/lib/activities-table/activities-table.component.html 523 @@ -2682,6 +2762,10 @@ Do you really want to delete this activity? Möchtest du diese Aktivität wirklich löschen? + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.ts + 176 + libs/ui/src/lib/activities-table/activities-table.component.ts 227 @@ -2764,7 +2848,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 131 + 137 @@ -2776,7 +2860,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 129 + 135 @@ -2824,7 +2908,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 201 + 210 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -3088,7 +3172,7 @@ Automatisch apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 31 + 32 @@ -3368,11 +3452,11 @@ Zurück apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 141 + 162 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 178 + 199 @@ -3436,7 +3520,7 @@ Symbol Zuordnung apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 225 + 234 @@ -3480,7 +3564,7 @@ Daten validieren... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 224 + 232 @@ -3492,11 +3576,11 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 150 + 171 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 186 + 207 @@ -3576,7 +3660,7 @@ Dividenden importieren apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 79 + 85 @@ -4076,7 +4160,7 @@ Möchtest du wirklich alle Aktivitäten löschen? apps/client/src/app/pages/portfolio/activities/activities-page.component.ts - 140 + 183 @@ -4090,6 +4174,10 @@ Delete all Activities Alle Aktivitäten löschen + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 61 + libs/ui/src/lib/activities-table/activities-table.component.html 69 @@ -4258,6 +4346,14 @@ Import Activities Aktivitäten importieren + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 8 + + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 361 + libs/ui/src/lib/activities-table/activities-table.component.html 16 @@ -4270,6 +4366,14 @@ Import Dividends Dividenden importieren + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 27 + + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 372 + libs/ui/src/lib/activities-table/activities-table.component.html 35 @@ -4504,7 +4608,7 @@ Scraper Konfiguration apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 236 + 245 @@ -12864,7 +12968,7 @@ Benchmark apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 219 + 228 @@ -13284,7 +13388,7 @@ Ups! Die historischen Daten konnten nicht geparsed werden. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 205 + 215 @@ -13292,7 +13396,7 @@ Möchtest du diese Systemmeldung wirklich löschen? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 159 + 163 @@ -13316,7 +13420,7 @@ Cash-Bestände apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 88 + 106 @@ -14087,6 +14191,14 @@ 56 + + is an invalid currency! + ist eine ungültige Währung! + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 126 + + diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index f50cded65..22553ab4c 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -53,6 +53,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 12 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 154 + libs/ui/src/lib/activities-table/activities-table.component.html 164 @@ -157,6 +161,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 114 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 130 + libs/ui/src/lib/activities-table/activities-table.component.html 179 @@ -225,6 +233,14 @@ libs/ui/src/lib/account-balances/account-balances.component.html 20 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 250 + + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 286 + libs/ui/src/lib/activities-table/activities-table.component.html 321 @@ -261,6 +277,10 @@ apps/client/src/app/components/admin-tag/admin-tag.component.html 71 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 415 + libs/ui/src/lib/activities-table/activities-table.component.html 507 @@ -297,6 +317,10 @@ libs/ui/src/lib/account-balances/account-balances.component.html 50 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 437 + libs/ui/src/lib/activities-table/activities-table.component.html 529 @@ -449,6 +473,10 @@ libs/ui/src/lib/account-balances/account-balances.component.html 11 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 163 + libs/ui/src/lib/activities-table/activities-table.component.html 152 @@ -475,7 +503,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 260 + 269 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -519,7 +547,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 267 + 276 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -599,7 +627,7 @@ ¿Estás seguro de eliminar este cupón? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 133 + 137 @@ -607,7 +635,7 @@ ¿Estás seguro de eliminar esta divisa? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 146 + 150 @@ -615,7 +643,7 @@ ¿Estás seguro de limpiar la caché? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 169 + 173 @@ -623,7 +651,7 @@ Por favor, establece tu mensaje del sistema: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 200 + 204 @@ -1502,7 +1530,7 @@ apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html - 270 + 289 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -1514,7 +1542,7 @@ Reporta un anomalía de los datos apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html - 287 + 306 @@ -1622,7 +1650,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 132 + 138 @@ -1822,7 +1850,7 @@ ¿Estás seguro de eliminar este método de acceso? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 182 + 183 @@ -1832,6 +1860,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 69 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 301 + libs/ui/src/lib/activities-table/activities-table.component.html 387 @@ -2008,6 +2040,10 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 91 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 188 + apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html 22 @@ -2016,6 +2052,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 120 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 269 + libs/ui/src/lib/activities-table/activities-table.component.html 209 @@ -2392,6 +2432,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 153 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 179 + libs/ui/src/lib/activities-table/activities-table.component.html 230 @@ -2408,6 +2452,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 228 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 203 + libs/ui/src/lib/activities-table/activities-table.component.html 259 @@ -2424,6 +2472,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 267 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 227 + libs/ui/src/lib/activities-table/activities-table.component.html 288 @@ -2434,7 +2486,7 @@ Nota apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 247 + 256 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2458,7 +2510,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 188 + 197 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2486,7 +2538,7 @@ Importando datos... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 113 + 119 @@ -2494,7 +2546,7 @@ La importación se ha completado apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 121 + 127 @@ -2624,6 +2676,10 @@ Draft Borrador + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 140 + libs/ui/src/lib/activities-table/activities-table.component.html 189 @@ -2634,12 +2690,20 @@ Importar operaciones apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 40 + 43 Export Activities Exportar operaciones + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 39 + + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 384 + libs/ui/src/lib/activities-table/activities-table.component.html 47 @@ -2652,6 +2716,14 @@ Export Drafts as ICS Exportar borrador como ICS + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 51 + + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 396 + libs/ui/src/lib/activities-table/activities-table.component.html 59 @@ -2664,6 +2736,10 @@ Clone Clonar + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 421 + libs/ui/src/lib/activities-table/activities-table.component.html 513 @@ -2672,6 +2748,10 @@ Export Draft as ICS Exportar borrador como ICS + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 431 + libs/ui/src/lib/activities-table/activities-table.component.html 523 @@ -2680,6 +2760,10 @@ Do you really want to delete this activity? ¿Estás seguro de eliminar esta operación? + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.ts + 176 + libs/ui/src/lib/activities-table/activities-table.component.ts 227 @@ -2758,7 +2842,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 129 + 135 @@ -2774,7 +2858,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 131 + 137 @@ -2810,7 +2894,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 201 + 210 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -3086,7 +3170,7 @@ Automático apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 31 + 32 @@ -3366,11 +3450,11 @@ Volver apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 141 + 162 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 178 + 199 @@ -3434,7 +3518,7 @@ Mapeo de símbolos apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 225 + 234 @@ -3478,7 +3562,7 @@ Validating data... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 224 + 232 @@ -3490,11 +3574,11 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 150 + 171 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 186 + 207 @@ -3574,7 +3658,7 @@ Import Dividends apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 79 + 85 @@ -4074,7 +4158,7 @@ Do you really want to delete all your activities? apps/client/src/app/pages/portfolio/activities/activities-page.component.ts - 140 + 183 @@ -4088,6 +4172,10 @@ Delete all Activities Delete all Activities + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 61 + libs/ui/src/lib/activities-table/activities-table.component.html 69 @@ -4256,6 +4344,14 @@ Import Activities Import Activities + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 8 + + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 361 + libs/ui/src/lib/activities-table/activities-table.component.html 16 @@ -4268,6 +4364,14 @@ Import Dividends Import Dividends + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 27 + + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 372 + libs/ui/src/lib/activities-table/activities-table.component.html 35 @@ -4502,7 +4606,7 @@ Scraper Configuration apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 236 + 245 @@ -12862,7 +12966,7 @@ Benchmark apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 219 + 228 @@ -13282,7 +13386,7 @@ Oops! Could not parse historical data. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 205 + 215 @@ -13290,7 +13394,7 @@ Do you really want to delete this system message? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 159 + 163 @@ -13314,7 +13418,7 @@ Cash Balances apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 88 + 106 @@ -14085,6 +14189,14 @@ 56 + + is an invalid currency! + is an invalid currency! + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 126 + + diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index c107d8b50..1a8ddb194 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -48,6 +48,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 12 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 154 + libs/ui/src/lib/activities-table/activities-table.component.html 164 @@ -168,6 +172,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 114 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 130 + libs/ui/src/lib/activities-table/activities-table.component.html 179 @@ -200,6 +208,10 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 91 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 188 + apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html 22 @@ -208,6 +220,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 120 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 269 + libs/ui/src/lib/activities-table/activities-table.component.html 209 @@ -276,6 +292,14 @@ libs/ui/src/lib/account-balances/account-balances.component.html 20 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 250 + + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 286 + libs/ui/src/lib/activities-table/activities-table.component.html 321 @@ -312,6 +336,10 @@ apps/client/src/app/components/admin-tag/admin-tag.component.html 71 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 415 + libs/ui/src/lib/activities-table/activities-table.component.html 507 @@ -348,6 +376,10 @@ libs/ui/src/lib/account-balances/account-balances.component.html 50 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 437 + libs/ui/src/lib/activities-table/activities-table.component.html 529 @@ -500,6 +532,10 @@ libs/ui/src/lib/account-balances/account-balances.component.html 11 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 163 + libs/ui/src/lib/activities-table/activities-table.component.html 152 @@ -526,7 +562,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 260 + 269 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -570,7 +606,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 267 + 276 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -618,7 +654,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 188 + 197 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -642,7 +678,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 201 + 210 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -806,7 +842,7 @@ Équivalence de Symboles apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 225 + 234 @@ -814,7 +850,7 @@ Note apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 247 + 256 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -838,7 +874,7 @@ Voulez-vous vraiment supprimer ce code promotionnel ? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 133 + 137 @@ -846,7 +882,7 @@ Voulez-vous vraiment supprimer cette devise ? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 146 + 150 @@ -854,7 +890,7 @@ Voulez-vous vraiment vider le cache ? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 169 + 173 @@ -862,7 +898,7 @@ Veuillez définir votre message système : apps/client/src/app/components/admin-overview/admin-overview.component.ts - 200 + 204 @@ -914,7 +950,7 @@ apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html - 270 + 289 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -1863,6 +1899,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 153 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 179 + libs/ui/src/lib/activities-table/activities-table.component.html 230 @@ -1873,7 +1913,7 @@ Signaler une Erreur de Données apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html - 287 + 306 @@ -1937,7 +1977,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 131 + 137 @@ -1949,7 +1989,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 129 + 135 @@ -1961,7 +2001,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 132 + 138 @@ -2041,7 +2081,7 @@ Auto apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 31 + 32 @@ -2081,7 +2121,7 @@ Voulez-vous vraiment supprimer cette méthode de connexion ? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 182 + 183 @@ -2091,6 +2131,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 69 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 301 + libs/ui/src/lib/activities-table/activities-table.component.html 387 @@ -2631,6 +2675,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 228 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 203 + libs/ui/src/lib/activities-table/activities-table.component.html 259 @@ -2647,6 +2695,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 267 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 227 + libs/ui/src/lib/activities-table/activities-table.component.html 288 @@ -2657,7 +2709,7 @@ Import des données... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 113 + 119 @@ -2665,7 +2717,7 @@ L'import est terminé apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 121 + 127 @@ -2673,7 +2725,7 @@ Validation des données... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 224 + 232 @@ -2689,11 +2741,11 @@ Retour apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 141 + 162 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 178 + 199 @@ -2705,11 +2757,11 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 150 + 171 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 186 + 207 @@ -3175,6 +3227,10 @@ Draft Brouillon + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 140 + libs/ui/src/lib/activities-table/activities-table.component.html 189 @@ -3185,12 +3241,20 @@ Importer Activités apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 40 + 43 Export Activities Exporter Activités + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 39 + + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 384 + libs/ui/src/lib/activities-table/activities-table.component.html 47 @@ -3203,6 +3267,14 @@ Export Drafts as ICS Exporter Brouillons sous ICS + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 51 + + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 396 + libs/ui/src/lib/activities-table/activities-table.component.html 59 @@ -3215,6 +3287,10 @@ Clone Dupliquer + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 421 + libs/ui/src/lib/activities-table/activities-table.component.html 513 @@ -3223,6 +3299,10 @@ Export Draft as ICS Exporter Brouillon sous ICS + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 431 + libs/ui/src/lib/activities-table/activities-table.component.html 523 @@ -3231,6 +3311,10 @@ Do you really want to delete this activity? Voulez-vous vraiment supprimer cette activité ? + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.ts + 176 + libs/ui/src/lib/activities-table/activities-table.component.ts 227 @@ -3573,7 +3657,7 @@ Importer Dividendes apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 79 + 85 @@ -4073,7 +4157,7 @@ Voulez-vous vraiment supprimer toutes vos activités ? apps/client/src/app/pages/portfolio/activities/activities-page.component.ts - 140 + 183 @@ -4087,6 +4171,10 @@ Delete all Activities Supprimer toutes les Activités + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 61 + libs/ui/src/lib/activities-table/activities-table.component.html 69 @@ -4255,6 +4343,14 @@ Import Activities Importer les Activités + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 8 + + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 361 + libs/ui/src/lib/activities-table/activities-table.component.html 16 @@ -4267,6 +4363,14 @@ Import Dividends Importer les Dividendes + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 27 + + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 372 + libs/ui/src/lib/activities-table/activities-table.component.html 35 @@ -4501,7 +4605,7 @@ Scraper Configuration apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 236 + 245 @@ -12861,7 +12965,7 @@ Benchmark apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 219 + 228 @@ -13281,7 +13385,7 @@ Oops! Could not parse historical data. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 205 + 215 @@ -13289,7 +13393,7 @@ Do you really want to delete this system message? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 159 + 163 @@ -13313,7 +13417,7 @@ Cash Balances apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 88 + 106 @@ -14084,6 +14188,14 @@ 56 + + is an invalid currency! + is an invalid currency! + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 126 + + diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index fa83ef57a..b0c23308b 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -53,6 +53,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 12 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 154 + libs/ui/src/lib/activities-table/activities-table.component.html 164 @@ -157,6 +161,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 114 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 130 + libs/ui/src/lib/activities-table/activities-table.component.html 179 @@ -225,6 +233,14 @@ libs/ui/src/lib/account-balances/account-balances.component.html 20 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 250 + + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 286 + libs/ui/src/lib/activities-table/activities-table.component.html 321 @@ -261,6 +277,10 @@ apps/client/src/app/components/admin-tag/admin-tag.component.html 71 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 415 + libs/ui/src/lib/activities-table/activities-table.component.html 507 @@ -297,6 +317,10 @@ libs/ui/src/lib/account-balances/account-balances.component.html 50 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 437 + libs/ui/src/lib/activities-table/activities-table.component.html 529 @@ -449,6 +473,10 @@ libs/ui/src/lib/account-balances/account-balances.component.html 11 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 163 + libs/ui/src/lib/activities-table/activities-table.component.html 152 @@ -475,7 +503,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 260 + 269 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -519,7 +547,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 267 + 276 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -599,7 +627,7 @@ Vuoi davvero eliminare questo buono? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 133 + 137 @@ -607,7 +635,7 @@ Vuoi davvero eliminare questa valuta? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 146 + 150 @@ -615,7 +643,7 @@ Vuoi davvero svuotare la cache? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 169 + 173 @@ -623,7 +651,7 @@ Imposta il messaggio di sistema: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 200 + 204 @@ -1502,7 +1530,7 @@ apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html - 270 + 289 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -1514,7 +1542,7 @@ Segnala un'anomalia dei dati apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html - 287 + 306 @@ -1622,7 +1650,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 132 + 138 @@ -1822,7 +1850,7 @@ Vuoi davvero rimuovere questo metodo di accesso? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 182 + 183 @@ -1832,6 +1860,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 69 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 301 + libs/ui/src/lib/activities-table/activities-table.component.html 387 @@ -2008,6 +2040,10 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 91 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 188 + apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html 22 @@ -2016,6 +2052,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 120 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 269 + libs/ui/src/lib/activities-table/activities-table.component.html 209 @@ -2392,6 +2432,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 153 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 179 + libs/ui/src/lib/activities-table/activities-table.component.html 230 @@ -2408,6 +2452,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 228 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 203 + libs/ui/src/lib/activities-table/activities-table.component.html 259 @@ -2424,6 +2472,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 267 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 227 + libs/ui/src/lib/activities-table/activities-table.component.html 288 @@ -2434,7 +2486,7 @@ Nota apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 247 + 256 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2458,7 +2510,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 188 + 197 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2486,7 +2538,7 @@ Importazione dei dati... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 113 + 119 @@ -2494,7 +2546,7 @@ L'importazione è stata completata apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 121 + 127 @@ -2624,6 +2676,10 @@ Draft Bozza + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 140 + libs/ui/src/lib/activities-table/activities-table.component.html 189 @@ -2634,12 +2690,20 @@ Importa le attività apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 40 + 43 Export Activities Esporta le attività + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 39 + + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 384 + libs/ui/src/lib/activities-table/activities-table.component.html 47 @@ -2652,6 +2716,14 @@ Export Drafts as ICS Esporta le bozze come ICS + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 51 + + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 396 + libs/ui/src/lib/activities-table/activities-table.component.html 59 @@ -2664,6 +2736,10 @@ Clone Clona + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 421 + libs/ui/src/lib/activities-table/activities-table.component.html 513 @@ -2672,6 +2748,10 @@ Export Draft as ICS Esporta la bozza come ICS + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 431 + libs/ui/src/lib/activities-table/activities-table.component.html 523 @@ -2680,6 +2760,10 @@ Do you really want to delete this activity? Vuoi davvero eliminare questa attività? + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.ts + 176 + libs/ui/src/lib/activities-table/activities-table.component.ts 227 @@ -2758,7 +2842,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 129 + 135 @@ -2774,7 +2858,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 131 + 137 @@ -2810,7 +2894,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 201 + 210 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -3086,7 +3170,7 @@ Auto apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 31 + 32 @@ -3366,11 +3450,11 @@ Indietro apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 141 + 162 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 178 + 199 @@ -3434,7 +3518,7 @@ Mappatura dei simboli apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 225 + 234 @@ -3478,7 +3562,7 @@ Convalida dei dati... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 224 + 232 @@ -3490,11 +3574,11 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 150 + 171 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 186 + 207 @@ -3574,7 +3658,7 @@ Importa i dividendi apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 79 + 85 @@ -4074,7 +4158,7 @@ Vuoi davvero eliminare tutte le tue attività? apps/client/src/app/pages/portfolio/activities/activities-page.component.ts - 140 + 183 @@ -4088,6 +4172,10 @@ Delete all Activities Elimina tutte le attività + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 61 + libs/ui/src/lib/activities-table/activities-table.component.html 69 @@ -4256,6 +4344,14 @@ Import Activities Importa le attività + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 8 + + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 361 + libs/ui/src/lib/activities-table/activities-table.component.html 16 @@ -4268,6 +4364,14 @@ Import Dividends Importa i dividendi + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 27 + + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 372 + libs/ui/src/lib/activities-table/activities-table.component.html 35 @@ -4502,7 +4606,7 @@ Configurazione dello scraper apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 236 + 245 @@ -12862,7 +12966,7 @@ Benchmark apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 219 + 228 @@ -13282,7 +13386,7 @@ Oops! Could not parse historical data. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 205 + 215 @@ -13290,7 +13394,7 @@ Do you really want to delete this system message? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 159 + 163 @@ -13314,7 +13418,7 @@ Cash Balances apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 88 + 106 @@ -14085,6 +14189,14 @@ 56 + + is an invalid currency! + is an invalid currency! + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 126 + + diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index b103891ca..c15a7caef 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -52,6 +52,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 12 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 154 + libs/ui/src/lib/activities-table/activities-table.component.html 164 @@ -156,6 +160,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 114 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 130 + libs/ui/src/lib/activities-table/activities-table.component.html 179 @@ -224,6 +232,14 @@ libs/ui/src/lib/account-balances/account-balances.component.html 20 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 250 + + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 286 + libs/ui/src/lib/activities-table/activities-table.component.html 321 @@ -260,6 +276,10 @@ apps/client/src/app/components/admin-tag/admin-tag.component.html 71 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 415 + libs/ui/src/lib/activities-table/activities-table.component.html 507 @@ -296,6 +316,10 @@ libs/ui/src/lib/account-balances/account-balances.component.html 50 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 437 + libs/ui/src/lib/activities-table/activities-table.component.html 529 @@ -448,6 +472,10 @@ libs/ui/src/lib/account-balances/account-balances.component.html 11 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 163 + libs/ui/src/lib/activities-table/activities-table.component.html 152 @@ -474,7 +502,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 260 + 269 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -518,7 +546,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 267 + 276 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -598,7 +626,7 @@ Wil je deze coupon echt verwijderen? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 133 + 137 @@ -606,7 +634,7 @@ Wil je deze valuta echt verwijderen? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 146 + 150 @@ -614,7 +642,7 @@ Wil je echt de cache legen? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 169 + 173 @@ -622,7 +650,7 @@ Stel je systeemboodschap in: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 200 + 204 @@ -1501,7 +1529,7 @@ apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html - 270 + 289 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -1513,7 +1541,7 @@ Gegevensstoring melden apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html - 287 + 306 @@ -1621,7 +1649,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 132 + 138 @@ -1821,7 +1849,7 @@ Wil je deze aanmeldingsmethode echt verwijderen? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 182 + 183 @@ -1831,6 +1859,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 69 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 301 + libs/ui/src/lib/activities-table/activities-table.component.html 387 @@ -2007,6 +2039,10 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 91 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 188 + apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html 22 @@ -2015,6 +2051,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 120 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 269 + libs/ui/src/lib/activities-table/activities-table.component.html 209 @@ -2391,6 +2431,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 153 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 179 + libs/ui/src/lib/activities-table/activities-table.component.html 230 @@ -2407,6 +2451,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 228 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 203 + libs/ui/src/lib/activities-table/activities-table.component.html 259 @@ -2423,6 +2471,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 267 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 227 + libs/ui/src/lib/activities-table/activities-table.component.html 288 @@ -2433,7 +2485,7 @@ Opmerking apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 247 + 256 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2457,7 +2509,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 188 + 197 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2485,7 +2537,7 @@ Gegevens importeren... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 113 + 119 @@ -2493,7 +2545,7 @@ Importeren is voltooid apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 121 + 127 @@ -2623,6 +2675,10 @@ Draft Concept + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 140 + libs/ui/src/lib/activities-table/activities-table.component.html 189 @@ -2633,12 +2689,20 @@ Activiteiten importeren apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 40 + 43 Export Activities Activiteiten exporteren + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 39 + + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 384 + libs/ui/src/lib/activities-table/activities-table.component.html 47 @@ -2651,6 +2715,14 @@ Export Drafts as ICS Concept exporteren als ICS + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 51 + + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 396 + libs/ui/src/lib/activities-table/activities-table.component.html 59 @@ -2663,6 +2735,10 @@ Clone Kloon + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 421 + libs/ui/src/lib/activities-table/activities-table.component.html 513 @@ -2671,6 +2747,10 @@ Export Draft as ICS Concept exporteren als ICS + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 431 + libs/ui/src/lib/activities-table/activities-table.component.html 523 @@ -2679,6 +2759,10 @@ Do you really want to delete this activity? Wil je deze activiteit echt verwijderen? + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.ts + 176 + libs/ui/src/lib/activities-table/activities-table.component.ts 227 @@ -2757,7 +2841,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 129 + 135 @@ -2773,7 +2857,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 131 + 137 @@ -2809,7 +2893,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 201 + 210 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -3085,7 +3169,7 @@ Automatisch apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 31 + 32 @@ -3365,11 +3449,11 @@ Terug apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 141 + 162 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 178 + 199 @@ -3433,7 +3517,7 @@ Symbool toewijzen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 225 + 234 @@ -3477,7 +3561,7 @@ Gegevens valideren... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 224 + 232 @@ -3489,11 +3573,11 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 150 + 171 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 186 + 207 @@ -3573,7 +3657,7 @@ Importeer dividenden apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 79 + 85 @@ -4073,7 +4157,7 @@ Wil je echt al je activiteiten verwijderen? apps/client/src/app/pages/portfolio/activities/activities-page.component.ts - 140 + 183 @@ -4087,6 +4171,10 @@ Delete all Activities Alle activiteiten verwijderen + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 61 + libs/ui/src/lib/activities-table/activities-table.component.html 69 @@ -4255,6 +4343,14 @@ Import Activities Importeer activiteiten + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 8 + + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 361 + libs/ui/src/lib/activities-table/activities-table.component.html 16 @@ -4267,6 +4363,14 @@ Import Dividends Importeer dividenden + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 27 + + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 372 + libs/ui/src/lib/activities-table/activities-table.component.html 35 @@ -4501,7 +4605,7 @@ Scraper instellingen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 236 + 245 @@ -12861,7 +12965,7 @@ Benchmark apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 219 + 228 @@ -13281,7 +13385,7 @@ Oops! Could not parse historical data. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 205 + 215 @@ -13289,7 +13393,7 @@ Do you really want to delete this system message? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 159 + 163 @@ -13313,7 +13417,7 @@ Cash Balances apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 88 + 106 @@ -14084,6 +14188,14 @@ 56 + + is an invalid currency! + is an invalid currency! + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 126 + + diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index 3971bd557..314593fe7 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -1472,6 +1472,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 12 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 154 + libs/ui/src/lib/activities-table/activities-table.component.html 164 @@ -1628,6 +1632,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 114 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 130 + libs/ui/src/lib/activities-table/activities-table.component.html 179 @@ -1660,6 +1668,10 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 91 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 188 + apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html 22 @@ -1668,6 +1680,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 120 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 269 + libs/ui/src/lib/activities-table/activities-table.component.html 209 @@ -1720,6 +1736,14 @@ libs/ui/src/lib/account-balances/account-balances.component.html 20 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 250 + + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 286 + libs/ui/src/lib/activities-table/activities-table.component.html 321 @@ -1756,6 +1780,10 @@ apps/client/src/app/components/admin-tag/admin-tag.component.html 71 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 415 + libs/ui/src/lib/activities-table/activities-table.component.html 507 @@ -1792,6 +1820,10 @@ libs/ui/src/lib/account-balances/account-balances.component.html 50 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 437 + libs/ui/src/lib/activities-table/activities-table.component.html 529 @@ -1944,6 +1976,10 @@ libs/ui/src/lib/account-balances/account-balances.component.html 11 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 163 + libs/ui/src/lib/activities-table/activities-table.component.html 152 @@ -1970,7 +2006,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 260 + 269 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -2014,7 +2050,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 267 + 276 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -2094,7 +2130,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 188 + 197 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2118,7 +2154,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 201 + 210 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2218,7 +2254,7 @@ Oops! Could not parse historical data. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 205 + 215 @@ -2246,11 +2282,11 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 150 + 171 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 186 + 207 @@ -2314,7 +2350,7 @@ Benchmark apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 219 + 228 @@ -2322,7 +2358,7 @@ Symbol Mapping apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 225 + 234 @@ -2330,7 +2366,7 @@ Scraper Configuration apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 236 + 245 @@ -2338,7 +2374,7 @@ Note apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 247 + 256 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2398,7 +2434,7 @@ Do you really want to delete this coupon? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 133 + 137 @@ -2406,7 +2442,7 @@ Do you really want to delete this currency? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 146 + 150 @@ -2414,7 +2450,7 @@ Do you really want to delete this system message? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 159 + 163 @@ -2422,7 +2458,7 @@ Do you really want to flush the cache? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 169 + 173 @@ -2430,7 +2466,7 @@ Please set your system message: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 200 + 204 @@ -2630,7 +2666,7 @@ apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html - 270 + 289 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -3414,6 +3450,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 153 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 179 + libs/ui/src/lib/activities-table/activities-table.component.html 230 @@ -3424,7 +3464,7 @@ Report Data Glitch apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html - 287 + 306 @@ -3712,7 +3752,7 @@ Auto apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 31 + 32 @@ -3720,7 +3760,7 @@ Do you really want to remove this sign in method? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 182 + 183 @@ -3900,7 +3940,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 131 + 137 @@ -3912,7 +3952,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 129 + 135 @@ -3924,7 +3964,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 132 + 138 @@ -4832,7 +4872,7 @@ Do you really want to delete all your activities? apps/client/src/app/pages/portfolio/activities/activities-page.component.ts - 140 + 183 @@ -4902,6 +4942,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 69 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 301 + libs/ui/src/lib/activities-table/activities-table.component.html 387 @@ -4926,6 +4970,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 228 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 203 + libs/ui/src/lib/activities-table/activities-table.component.html 259 @@ -4950,6 +4998,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 267 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 227 + libs/ui/src/lib/activities-table/activities-table.component.html 288 @@ -4968,7 +5020,7 @@ Import Activities apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 40 + 43 @@ -4976,7 +5028,7 @@ Import Dividends apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 79 + 85 @@ -4984,7 +5036,7 @@ Importing data... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 113 + 119 @@ -4992,7 +5044,7 @@ Import has been completed apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 121 + 127 @@ -5000,7 +5052,7 @@ Validating data... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 224 + 232 @@ -5072,11 +5124,11 @@ Back apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 141 + 162 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 178 + 199 @@ -12626,6 +12678,14 @@ Import Activities Import Activities + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 8 + + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 361 + libs/ui/src/lib/activities-table/activities-table.component.html 16 @@ -12638,6 +12698,14 @@ Import Dividends Import Dividends + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 27 + + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 372 + libs/ui/src/lib/activities-table/activities-table.component.html 35 @@ -12650,6 +12718,14 @@ Export Activities Export Activities + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 39 + + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 384 + libs/ui/src/lib/activities-table/activities-table.component.html 47 @@ -12662,6 +12738,14 @@ Export Drafts as ICS Export Drafts as ICS + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 51 + + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 396 + libs/ui/src/lib/activities-table/activities-table.component.html 59 @@ -12674,6 +12758,10 @@ Delete all Activities Delete all Activities + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 61 + libs/ui/src/lib/activities-table/activities-table.component.html 69 @@ -12682,6 +12770,10 @@ Draft Draft + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 140 + libs/ui/src/lib/activities-table/activities-table.component.html 189 @@ -12690,6 +12782,10 @@ Clone Clone + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 421 + libs/ui/src/lib/activities-table/activities-table.component.html 513 @@ -12698,6 +12794,10 @@ Export Draft as ICS Export Draft as ICS + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 431 + libs/ui/src/lib/activities-table/activities-table.component.html 523 @@ -12706,6 +12806,10 @@ Do you really want to delete this activity? Do you really want to delete this activity? + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.ts + 176 + libs/ui/src/lib/activities-table/activities-table.component.ts 227 @@ -13316,7 +13420,7 @@ Cash Balances apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 88 + 106 @@ -14087,6 +14191,14 @@ 56 + + is an invalid currency! + is an invalid currency! + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 126 + + diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index 2c358c8cd..e8fd14fd8 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -48,6 +48,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 12 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 154 + libs/ui/src/lib/activities-table/activities-table.component.html 164 @@ -168,6 +172,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 114 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 130 + libs/ui/src/lib/activities-table/activities-table.component.html 179 @@ -200,6 +208,10 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 91 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 188 + apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html 22 @@ -208,6 +220,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 120 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 269 + libs/ui/src/lib/activities-table/activities-table.component.html 209 @@ -276,6 +292,14 @@ libs/ui/src/lib/account-balances/account-balances.component.html 20 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 250 + + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 286 + libs/ui/src/lib/activities-table/activities-table.component.html 321 @@ -312,6 +336,10 @@ apps/client/src/app/components/admin-tag/admin-tag.component.html 71 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 415 + libs/ui/src/lib/activities-table/activities-table.component.html 507 @@ -348,6 +376,10 @@ libs/ui/src/lib/account-balances/account-balances.component.html 50 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 437 + libs/ui/src/lib/activities-table/activities-table.component.html 529 @@ -500,6 +532,10 @@ libs/ui/src/lib/account-balances/account-balances.component.html 11 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 163 + libs/ui/src/lib/activities-table/activities-table.component.html 152 @@ -526,7 +562,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 260 + 269 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -570,7 +606,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 267 + 276 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -618,7 +654,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 188 + 197 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -642,7 +678,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 201 + 210 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -750,7 +786,7 @@ Deseja realmente eliminar este cupão? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 133 + 137 @@ -758,7 +794,7 @@ Deseja realmente excluir esta moeda? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 146 + 150 @@ -766,7 +802,7 @@ Deseja realmente limpar a cache? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 169 + 173 @@ -774,7 +810,7 @@ Por favor, defina a sua mensagem do sistema: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 200 + 204 @@ -1759,6 +1795,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 153 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 179 + libs/ui/src/lib/activities-table/activities-table.component.html 230 @@ -1829,7 +1869,7 @@ apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html - 270 + 289 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -1841,7 +1881,7 @@ Dados do Relatório com Problema apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html - 287 + 306 @@ -1921,7 +1961,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 131 + 137 @@ -1933,7 +1973,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 129 + 135 @@ -1945,7 +1985,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 132 + 138 @@ -2025,7 +2065,7 @@ Auto apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 31 + 32 @@ -2065,7 +2105,7 @@ Deseja realmente remover este método de início de sessão? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 182 + 183 @@ -2075,6 +2115,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 69 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 301 + libs/ui/src/lib/activities-table/activities-table.component.html 387 @@ -2547,6 +2591,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 228 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 203 + libs/ui/src/lib/activities-table/activities-table.component.html 259 @@ -2563,6 +2611,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 267 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 227 + libs/ui/src/lib/activities-table/activities-table.component.html 288 @@ -2573,7 +2625,7 @@ Nota apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 247 + 256 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2589,7 +2641,7 @@ A importar dados... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 113 + 119 @@ -2597,7 +2649,7 @@ A importação foi concluída apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 121 + 127 @@ -2613,11 +2665,11 @@ Anterior apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 141 + 162 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 178 + 199 @@ -3051,6 +3103,10 @@ Draft Rascunho + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 140 + libs/ui/src/lib/activities-table/activities-table.component.html 189 @@ -3061,12 +3117,20 @@ Importar Atividades apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 40 + 43 Export Activities Exportar Atividades + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 39 + + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 384 + libs/ui/src/lib/activities-table/activities-table.component.html 47 @@ -3079,6 +3143,14 @@ Export Drafts as ICS Exportar Rascunhos como ICS + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 51 + + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 396 + libs/ui/src/lib/activities-table/activities-table.component.html 59 @@ -3091,6 +3163,10 @@ Clone Clonar + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 421 + libs/ui/src/lib/activities-table/activities-table.component.html 513 @@ -3099,6 +3175,10 @@ Export Draft as ICS Exportar Rascunho como ICS + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 431 + libs/ui/src/lib/activities-table/activities-table.component.html 523 @@ -3107,6 +3187,10 @@ Do you really want to delete this activity? Deseja realmente eliminar esta atividade? + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.ts + 176 + libs/ui/src/lib/activities-table/activities-table.component.ts 227 @@ -3417,7 +3501,7 @@ Mapeamento de Símbolo apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 225 + 234 @@ -3497,7 +3581,7 @@ A validar dados... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 224 + 232 @@ -3509,11 +3593,11 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 150 + 171 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 186 + 207 @@ -3573,7 +3657,7 @@ Importar Dividendos apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 79 + 85 @@ -4073,7 +4157,7 @@ Deseja mesmo eliminar todas as suas atividades? apps/client/src/app/pages/portfolio/activities/activities-page.component.ts - 140 + 183 @@ -4087,6 +4171,10 @@ Delete all Activities Apagar todas as Atividades + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 61 + libs/ui/src/lib/activities-table/activities-table.component.html 69 @@ -4255,6 +4343,14 @@ Import Activities Importar Atividades + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 8 + + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 361 + libs/ui/src/lib/activities-table/activities-table.component.html 16 @@ -4267,6 +4363,14 @@ Import Dividends Importar Dividendos + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 27 + + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 372 + libs/ui/src/lib/activities-table/activities-table.component.html 35 @@ -4501,7 +4605,7 @@ Scraper Configuration apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 236 + 245 @@ -12861,7 +12965,7 @@ Benchmark apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 219 + 228 @@ -13281,7 +13385,7 @@ Oops! Could not parse historical data. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 205 + 215 @@ -13289,7 +13393,7 @@ Do you really want to delete this system message? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 159 + 163 @@ -13313,7 +13417,7 @@ Cash Balances apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 88 + 106 @@ -14084,6 +14188,14 @@ 56 + + is an invalid currency! + is an invalid currency! + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 126 + + diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index 33f91edd1..87e293626 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -1448,6 +1448,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 12 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 154 + libs/ui/src/lib/activities-table/activities-table.component.html 164 @@ -1592,6 +1596,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 114 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 130 + libs/ui/src/lib/activities-table/activities-table.component.html 179 @@ -1624,6 +1632,10 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 91 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 188 + apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html 22 @@ -1632,6 +1644,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 120 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 269 + libs/ui/src/lib/activities-table/activities-table.component.html 209 @@ -1684,6 +1700,14 @@ libs/ui/src/lib/account-balances/account-balances.component.html 20 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 250 + + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 286 + libs/ui/src/lib/activities-table/activities-table.component.html 321 @@ -1720,6 +1744,10 @@ apps/client/src/app/components/admin-tag/admin-tag.component.html 71 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 415 + libs/ui/src/lib/activities-table/activities-table.component.html 507 @@ -1756,6 +1784,10 @@ libs/ui/src/lib/account-balances/account-balances.component.html 50 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 437 + libs/ui/src/lib/activities-table/activities-table.component.html 529 @@ -1908,6 +1940,10 @@ libs/ui/src/lib/account-balances/account-balances.component.html 11 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 163 + libs/ui/src/lib/activities-table/activities-table.component.html 152 @@ -1934,7 +1970,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 260 + 269 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -1978,7 +2014,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 267 + 276 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -2050,7 +2086,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 188 + 197 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2074,7 +2110,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 201 + 210 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2246,7 +2282,7 @@ Sembol Eşleştirme apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 225 + 234 @@ -2254,7 +2290,7 @@ Veri Toplayıcı Yapılandırması apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 236 + 245 @@ -2262,7 +2298,7 @@ Not apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 247 + 256 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2306,7 +2342,7 @@ Önbelleği temizlemeyi gerçekten istiyor musunuz? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 133 + 137 @@ -2314,7 +2350,7 @@ Bu para birimini silmeyi gerçekten istiyor musunuz? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 146 + 150 @@ -2322,7 +2358,7 @@ Önbelleği temizlemeyi gerçekten istiyor musunuz apps/client/src/app/components/admin-overview/admin-overview.component.ts - 169 + 173 @@ -2330,7 +2366,7 @@ Lütfen sistem mesajınızı belirleyin: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 200 + 204 @@ -2382,7 +2418,7 @@ apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html - 270 + 289 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -3239,6 +3275,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 153 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 179 + libs/ui/src/lib/activities-table/activities-table.component.html 230 @@ -3257,22 +3297,6 @@ apps/client/src/app/pages/portfolio/fire/fire-page.html - 137 - - - - First Buy Date - İlk Alım Tarihi - - apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html - 158 - - - - Transactions - İşlemler - - apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html 150 @@ -3281,7 +3305,7 @@ Rapor Veri Sorunu apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html - 287 + 306 @@ -3294,7 +3318,7 @@ Upgrade to Ghostfolio Premium today and gain access to exclusive features to enhance your investment experience: - Bugün Ghostfolio Premium'a yükseltin ve yatırım deneyiminizi geliştirmek için ayrıcalıklı özelliklere erişim kazanın: + Bugün Ghostfolio Premium'a yükseltin ve yatırım deneyiminizi geliştirmek için ayrıcalıklı özelliklere erişim kazanın: apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 18 @@ -3414,7 +3438,7 @@ Upgrade Plan - <Üyeliğinizi Yükseltin> + Üyeliğinizi Yükseltin apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 62 @@ -3485,7 +3509,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 131 + 137 @@ -3497,7 +3521,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 129 + 135 @@ -3509,7 +3533,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 132 + 138 @@ -3754,7 +3778,7 @@ Check out the numerous features of Ghostfolio to manage your wealth - Varlığınızı yönetmek için Ghostfolio'nun pek çok özelliğini keşfedin + Varlığınızı yönetmek için Ghostfolio'nun pek çok özelliğini keşfedin apps/client/src/app/pages/features/features-page.html 6 @@ -3770,7 +3794,7 @@ ETFs - ETF'ler + ETF'ler apps/client/src/app/pages/features/features-page.html 25 @@ -3998,7 +4022,7 @@ Stars on GitHub - GitHub'daki Beğeniler + GitHub'daki Beğeniler apps/client/src/app/pages/landing/landing-page.html 93 @@ -4010,7 +4034,7 @@ Pulls on Docker Hub - Docker Hub'ta Çekmeler + Docker Hub'ta Çekmeler apps/client/src/app/pages/landing/landing-page.html 111 @@ -4038,7 +4062,7 @@ Ghostfolio empowers busy people to keep track of stocks, ETFs or cryptocurrencies without being tracked. - Ghostfolio, takip edilmeden hisse senetleri, ETF'ler veya kripto paraları izlemek isteyen yoğun insanlara güç verir. + Ghostfolio, takip edilmeden hisse senetleri, ETF'ler veya kripto paraları izlemek isteyen yoğun insanlara güç verir. apps/client/src/app/pages/landing/landing-page.html 225 @@ -4070,7 +4094,7 @@ Use Ghostfolio anonymously and own your financial data. - Ghostfolio'yu anonim olarak kullanın ve finansal verilerinize sahip çıkın. + Ghostfolio'yu anonim olarak kullanın ve finansal verilerinize sahip çıkın. apps/client/src/app/pages/landing/landing-page.html 249 @@ -4270,7 +4294,7 @@ At Ghostfolio, transparency is at the core of our values. We publish the source code as open source software (OSS) under the AGPL-3.0 license and we openly share aggregated key metrics of the platform’s operational status. - Ghostfolio'da şeffaflık, değerlerimizin temelinde yer alır. Kaynak kodunu açık kaynak yazılım (OSS) olarak AGPL-3.0 lisansı altında yayınlıyoruz ve platformun işletme durumunun toplu anahtar metriklerini açıkça paylaşıyoruz. + Ghostfolio'da şeffaflık, değerlerimizin temelinde yer alır. Kaynak kodunu açık kaynak yazılım (OSS) olarak AGPL-3.0 lisansı altında yayınlıyoruz ve platformun işletme durumunun toplu anahtar metriklerini açıkça paylaşıyoruz. apps/client/src/app/pages/open/open-page.html 6 @@ -4306,7 +4330,7 @@ Contributors on GitHub - GitHub'da Katkıda Bulunanlar + GitHub'da Katkıda Bulunanlar apps/client/src/app/pages/open/open-page.html 89 @@ -4337,7 +4361,7 @@ Tüm işlemlerinizi silmeyi gerçekten istiyor musunuz? apps/client/src/app/pages/portfolio/activities/activities-page.component.ts - 140 + 183 @@ -4350,7 +4374,7 @@ Stocks, ETFs, bonds, cryptocurrencies, commodities - Hisse senetleri, ETF'ler, tahviller, kripto paralar, emtialar + Hisse senetleri, ETF'ler, tahviller, kripto paralar, emtialar apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 21 @@ -4383,6 +4407,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 69 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 301 + libs/ui/src/lib/activities-table/activities-table.component.html 387 @@ -4407,6 +4435,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 228 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 203 + libs/ui/src/lib/activities-table/activities-table.component.html 259 @@ -4431,6 +4463,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 267 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 227 + libs/ui/src/lib/activities-table/activities-table.component.html 288 @@ -4441,7 +4477,7 @@ İşlemleri İçe Aktar apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 40 + 43 @@ -4449,7 +4485,7 @@ Temettüleri İçe Aktar apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 79 + 85 @@ -4457,7 +4493,7 @@ Veri içe aktarılıyor... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 113 + 119 @@ -4465,7 +4501,7 @@ İçe aktarma tamamlandı apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 121 + 127 @@ -4473,7 +4509,7 @@ Veri doğrulanıyor... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 224 + 232 @@ -4537,11 +4573,11 @@ Geri apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 141 + 162 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 178 + 199 @@ -4553,11 +4589,11 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 150 + 171 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 186 + 207 @@ -4938,7 +4974,7 @@ Our official Ghostfolio Premium cloud offering is the easiest way to get started. Due to the time it saves, this will be the best option for most people. Revenue is used to cover the costs of the hosting infrastructure and to fund ongoing development. - Resmi Ghostfolio Premium bulut teklifimiz bir başlangıç yapmanın en kolay yoludur. Zaman tasarrufu sağladığı için çoğu insan için en iyi seçenek olacaktır. Gelir, barındırma altyapısının maliyetlerini karşılamak ve süregiden geliştirme işlerini finanse etmek için kullanılmaktadır. + Resmi Ghostfolio Premium bulut teklifimiz bir başlangıç yapmanın en kolay yoludur. Zaman tasarrufu sağladığı için çoğu insan için en iyi seçenek olacaktır. Gelir, barındırma altyapısının maliyetlerini karşılamak ve süregiden geliştirme işlerini finanse etmek için kullanılmaktadır. apps/client/src/app/pages/pricing/pricing-page.html 6 @@ -4946,7 +4982,7 @@ If you prefer to run Ghostfolio on your own infrastructure, please find the source code and further instructions on GitHub. - Ghostfolio'yu kendi altyapınızda çalıştırmayı tercih ederseniz, lütfen kaynak kodunu ve daha fazla talimatı GitHub adresinde bulun. + Ghostfolio'yu kendi altyapınızda çalıştırmayı tercih ederseniz, lütfen kaynak kodunu ve daha fazla talimatı GitHub adresinde bulun. apps/client/src/app/pages/pricing/pricing-page.html 24 @@ -4954,7 +4990,7 @@ For tech-savvy investors who prefer to run Ghostfolio on their own infrastructure. - Kendi altyapılarında Ghostfolio'yu çalıştırmayı tercih eden teknolojiye hakim yatırımcılar için. + Kendi altyapılarında Ghostfolio'yu çalıştırmayı tercih eden teknolojiye hakim yatırımcılar için. apps/client/src/app/pages/pricing/pricing-page.html 36 @@ -5034,7 +5070,7 @@ Self-hosted, update manually. - Tarafınızca barındırılıyor, elle güncelleyiniz. + Tarafınızca barındırılıyor, elle güncelleyiniz. apps/client/src/app/pages/pricing/pricing-page.html 122 @@ -11818,7 +11854,7 @@ My Ghostfolio - Benim Ghostfolio'm + Benim Ghostfolio'm apps/client/src/app/pages/user-account/user-account-page-routing.module.ts 32 @@ -11829,7 +11865,7 @@ Otomatik apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 31 + 32 @@ -11869,7 +11905,7 @@ Bu giriş yöntemini kaldırmayı gerçekten istiyor musunuz? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 182 + 183 @@ -11918,7 +11954,7 @@ Try Premium - Premium'u Deneyin + Premium'u Deneyin apps/client/src/app/components/user-account-membership/user-account-membership.html 42 @@ -12103,6 +12139,14 @@ Import Activities İşlemleri İçe Aktar + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 8 + + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 361 + libs/ui/src/lib/activities-table/activities-table.component.html 16 @@ -12115,6 +12159,14 @@ Import Dividends Temettüleri İçe Aktar + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 27 + + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 372 + libs/ui/src/lib/activities-table/activities-table.component.html 35 @@ -12127,6 +12179,14 @@ Export Activities İşlemleri Dışa Aktar + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 39 + + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 384 + libs/ui/src/lib/activities-table/activities-table.component.html 47 @@ -12139,6 +12199,14 @@ Export Drafts as ICS Taslakları ICS Olarak Dışa Aktar + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 51 + + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 396 + libs/ui/src/lib/activities-table/activities-table.component.html 59 @@ -12151,6 +12219,10 @@ Delete all Activities Tüm İşlemleri sil + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 61 + libs/ui/src/lib/activities-table/activities-table.component.html 69 @@ -12159,6 +12231,10 @@ Draft Taslak + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 140 + libs/ui/src/lib/activities-table/activities-table.component.html 189 @@ -12167,6 +12243,10 @@ Clone Klonla + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 421 + libs/ui/src/lib/activities-table/activities-table.component.html 513 @@ -12175,6 +12255,10 @@ Export Draft as ICS Taslakları ICS Olarak Dışa Aktar + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 431 + libs/ui/src/lib/activities-table/activities-table.component.html 523 @@ -12183,6 +12267,10 @@ Do you really want to delete this activity? TBu işlemi silmeyi gerçekten istiyor musunuz? + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.ts + 176 + libs/ui/src/lib/activities-table/activities-table.component.ts 227 @@ -12877,7 +12965,7 @@ Benchmark apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 219 + 228 @@ -13297,7 +13385,7 @@ Oops! Could not parse historical data. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 205 + 215 @@ -13305,7 +13393,7 @@ Do you really want to delete this system message? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 159 + 163 @@ -13329,7 +13417,7 @@ Cash Balances apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 88 + 106 @@ -14100,6 +14188,14 @@ 56 + + is an invalid currency! + is an invalid currency! + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 126 + + diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index 2c04c01a4..5389769f7 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -933,6 +933,28 @@ 17 + + You are using the Live Demo. + + apps/client/src/app/app.component.html + 17 + + + + Create Account + + apps/client/src/app/app.component.html + 18 + + + apps/client/src/app/pages/register/register-page.html + 26 + + + apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html + 2 + + Personal Finance @@ -1424,6 +1446,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 12 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 154 + libs/ui/src/lib/activities-table/activities-table.component.html 164 @@ -1472,21 +1498,6 @@ 54 - - Platform - - apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 63 - - - apps/client/src/app/components/accounts-table/accounts-table.component.html - 77 - - - apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 45 - - Activities @@ -1522,6 +1533,39 @@ 4 + + Platform + + apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html + 63 + + + apps/client/src/app/components/accounts-table/accounts-table.component.html + 77 + + + apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html + 45 + + + + Cash Balances + + apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html + 106 + + + + Transfer Cash Balance + + apps/client/src/app/components/accounts-table/accounts-table.component.html + 9 + + + apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html + 7 + + Name @@ -1560,6 +1604,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 114 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 130 + libs/ui/src/lib/activities-table/activities-table.component.html 179 @@ -1590,6 +1638,10 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 91 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 188 + apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html 22 @@ -1598,6 +1650,10 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 120 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 269 + libs/ui/src/lib/activities-table/activities-table.component.html 209 @@ -1649,6 +1705,14 @@ libs/ui/src/lib/account-balances/account-balances.component.html 20 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 250 + + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 286 + libs/ui/src/lib/activities-table/activities-table.component.html 321 @@ -1684,6 +1748,10 @@ apps/client/src/app/components/admin-tag/admin-tag.component.html 71 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 415 + libs/ui/src/lib/activities-table/activities-table.component.html 507 @@ -1719,6 +1787,10 @@ libs/ui/src/lib/account-balances/account-balances.component.html 50 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 437 + libs/ui/src/lib/activities-table/activities-table.component.html 529 @@ -1731,6 +1803,20 @@ 83 + + Asset Profile + + apps/client/src/app/components/admin-jobs/admin-jobs.html + 31 + + + + Historical Market Data + + apps/client/src/app/components/admin-jobs/admin-jobs.html + 37 + + Symbol @@ -1800,20 +1886,6 @@ 135 - - Asset Profiles - - libs/ui/src/lib/assistant/assistant.html - 67 - - - - Historical Market Data - - apps/client/src/app/components/admin-jobs/admin-jobs.html - 37 - - View Data @@ -1856,6 +1928,10 @@ libs/ui/src/lib/account-balances/account-balances.component.html 11 + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 163 + libs/ui/src/lib/activities-table/activities-table.component.html 152 @@ -1880,7 +1956,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 260 + 269 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -1923,7 +1999,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 267 + 276 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -1971,6 +2047,13 @@ 76 + + Do you really want to delete this asset profile? + + apps/client/src/app/components/admin-market-data/admin-market-data.component.ts + 184 + + Filter by... @@ -1990,7 +2073,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 188 + 197 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2013,7 +2096,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 201 + 210 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2100,6 +2183,13 @@ 38 + + Oops! Could not parse historical data. + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 215 + + Refresh @@ -2114,6 +2204,21 @@ 30 + + Import + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 79 + + + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html + 171 + + + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html + 207 + + Sector @@ -2166,25 +2271,32 @@ 228 + + Benchmark + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 228 + + Symbol Mapping apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 225 + 234 Scraper Configuration apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 236 + 245 Note apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 247 + 256 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2202,6 +2314,20 @@ 7 + + Search + + apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html + 16 + + + + Add Manually + + apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html + 19 + + Name, symbol or ISIN @@ -2220,32 +2346,53 @@ 119 + + is an invalid currency! + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 126 + + Do you really want to delete this coupon? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 133 + 137 Do you really want to delete this currency? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 146 + 150 + + + + Do you really want to delete this system message? + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 163 Do you really want to flush the cache? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 169 + 173 Please set your system message: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 200 + 204 + + + + Version + + apps/client/src/app/components/admin-overview/admin-overview.html + 7 @@ -2283,21 +2430,6 @@ 113 - - Tags - - apps/client/src/app/components/admin-settings/admin-settings.component.html - 10 - - - apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html - 270 - - - apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 320 - - User Signup @@ -2423,36 +2555,79 @@ 4 - - Do you really want to delete this user? + + Tags - apps/client/src/app/components/admin-users/admin-users.component.ts - 112 + apps/client/src/app/components/admin-settings/admin-settings.component.html + 10 - - - User - apps/client/src/app/components/header/header.component.html - 192 + apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html + 289 - - - Registration - apps/client/src/app/components/admin-users/admin-users.html - 82 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 320 - - Engagement per Day + + Add Tag - apps/client/src/app/components/admin-users/admin-users.html - 144 + apps/client/src/app/components/admin-tag/admin-tag.component.html + 11 - - Last Request + + Do you really want to delete this tag? + + apps/client/src/app/components/admin-tag/admin-tag.component.ts + 78 + + + + Update tag + + apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html + 2 + + + + Add tag + + apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html + 3 + + + + Do you really want to delete this user? + + apps/client/src/app/components/admin-users/admin-users.component.ts + 112 + + + + User + + apps/client/src/app/components/admin-users/admin-users.html + 29 + + + + Registration + + apps/client/src/app/components/admin-users/admin-users.html + 82 + + + + Engagement per Day + + apps/client/src/app/components/admin-users/admin-users.html + 144 + + + + Last Request apps/client/src/app/components/admin-users/admin-users.html 169 @@ -2566,6 +2741,13 @@ 173 + + User + + apps/client/src/app/components/header/header.component.html + 192 + + My Ghostfolio @@ -2839,6 +3021,23 @@ 3 + + + + + + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 12 + + + + {VAR_PLURAL, plural, =1 {transaction} other {transactions}} + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 13 + + Buy @@ -2878,21 +3077,19 @@ 72 - - - - - + + Fees apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 12 + 87 - - - {VAR_PLURAL, plural, =1 {transaction} other {transactions}} - apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 13 + apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html + 148 + + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 150 @@ -2991,6 +3188,13 @@ 262 + + Interest + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 280 + + Dividend @@ -3060,30 +3264,19 @@ 153 - libs/ui/src/lib/activities-table/activities-table.component.html - 230 - - - - Fees - - apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 87 - - - apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html - 148 + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 179 - apps/client/src/app/pages/portfolio/fire/fire-page.html - 150 + libs/ui/src/lib/activities-table/activities-table.component.html + 230 Report Data Glitch apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html - 287 + 306 @@ -3250,1818 +3443,2122 @@ 25 - - This feature is currently unavailable. + + Grant access - apps/client/src/app/core/http-response.interceptor.ts - 59 + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html + 7 - - Please try again later. - - apps/client/src/app/core/http-response.interceptor.ts - 61 - - - apps/client/src/app/core/http-response.interceptor.ts - 88 - + + Public - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 131 + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html + 24 - - Oops! Something went wrong. + + Granted Access - apps/client/src/app/core/http-response.interceptor.ts - 86 + apps/client/src/app/components/user-account-access/user-account-access.html + 5 + + + Please enter your coupon code: - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 129 + apps/client/src/app/components/user-account-membership/user-account-membership.component.ts + 110 - - Okay + + Could not redeem coupon code - apps/client/src/app/core/http-response.interceptor.ts - 89 + apps/client/src/app/components/user-account-membership/user-account-membership.component.ts + 120 + + + Coupon code has been redeemed - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts + apps/client/src/app/components/user-account-membership/user-account-membership.component.ts 132 - - About + + Reload - apps/client/src/app/pages/about/about-page-routing.module.ts - 52 + apps/client/src/app/components/user-account-membership/user-account-membership.component.ts + 133 + + + Upgrade - apps/client/src/app/pages/about/about-page.component.ts - 43 + apps/client/src/app/components/user-account-membership/user-account-membership.html + 18 + + + Renew - apps/client/src/app/pages/about/overview/about-overview-page-routing.module.ts - 12 + apps/client/src/app/components/user-account-membership/user-account-membership.html + 21 - - Changelog + + per year - apps/client/src/app/pages/about/about-page.component.ts - 48 + apps/client/src/app/components/user-account-membership/user-account-membership.html + 33 - apps/client/src/app/pages/about/changelog/changelog-page-routing.module.ts - 12 + apps/client/src/app/pages/pricing/pricing-page.html + 332 - - License + + Try Premium - apps/client/src/app/pages/about/about-page.component.ts - 53 + apps/client/src/app/components/user-account-membership/user-account-membership.html + 42 + + + Redeem Coupon - apps/client/src/app/pages/about/license/license-page-routing.module.ts - 12 + apps/client/src/app/components/user-account-membership/user-account-membership.html + 55 - - Privacy Policy + + Auto - apps/client/src/app/pages/about/about-page.component.ts - 61 + apps/client/src/app/components/user-account-settings/user-account-settings.component.ts + 32 + + + Do you really want to remove this sign in method? - apps/client/src/app/pages/about/privacy-policy/privacy-policy-page-routing.module.ts - 12 + apps/client/src/app/components/user-account-settings/user-account-settings.component.ts + 183 - - Our + + Settings - apps/client/src/app/pages/about/oss-friends/oss-friends-page.html - 6 + apps/client/src/app/components/user-account-settings/user-account-settings.html + 2 - - Discover other exciting Open Source Software projects + + Presenter View - apps/client/src/app/pages/about/oss-friends/oss-friends-page.html - 9 + apps/client/src/app/components/user-account-settings/user-account-settings.html + 7 - - Visit + + Protection for sensitive information like absolute performances and quantity values - apps/client/src/app/pages/about/oss-friends/oss-friends-page.html - 28 + apps/client/src/app/components/user-account-settings/user-account-settings.html + 8 - - Accounts + + Base Currency - apps/client/src/app/pages/accounts/accounts-page-routing.module.ts - 12 + apps/client/src/app/components/user-account-settings/user-account-settings.html + 27 - - Update account + + Language - apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 7 + apps/client/src/app/components/user-account-settings/user-account-settings.html + 48 - - Add account + + Locale - apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 8 + apps/client/src/app/components/user-account-settings/user-account-settings.html + 95 - - Account ID + + Date and number format - apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 90 + apps/client/src/app/components/user-account-settings/user-account-settings.html + 97 - - Admin Control + + Appearance - apps/client/src/app/pages/admin/admin-page-routing.module.ts - 19 + apps/client/src/app/components/user-account-settings/user-account-settings.html + 118 - - Jobs - - apps/client/src/app/pages/admin/admin-page-routing.module.ts - 21 - + + Auto - apps/client/src/app/pages/admin/admin-page.component.ts - 41 + apps/client/src/app/components/user-account-settings/user-account-settings.html + 130 - - Market Data - - apps/client/src/app/pages/admin/admin-page-routing.module.ts - 25 - + + Light - apps/client/src/app/pages/admin/admin-page.component.ts - 36 + apps/client/src/app/components/user-account-settings/user-account-settings.html + 131 - - Settings - - apps/client/src/app/pages/admin/admin-page-routing.module.ts - 30 - + + Dark - apps/client/src/app/pages/admin/admin-page.component.ts - 31 + apps/client/src/app/components/user-account-settings/user-account-settings.html + 132 + + + Zen Mode - apps/client/src/app/pages/user-account/user-account-page-routing.module.ts - 17 + apps/client/src/app/components/user-account-settings/user-account-settings.html + 141 - apps/client/src/app/pages/user-account/user-account-page.component.ts - 34 + apps/client/src/app/pages/features/features-page.html + 192 - - Users + + Distraction-free experience for turbulent times - apps/client/src/app/pages/admin/admin-page-routing.module.ts - 35 + apps/client/src/app/components/user-account-settings/user-account-settings.html + 142 + + + Biometric Authentication - apps/client/src/app/pages/admin/admin-page.component.ts - 46 + apps/client/src/app/components/user-account-settings/user-account-settings.html + 158 - - Overview + + Sign in with fingerprint - apps/client/src/app/pages/admin/admin-page.component.ts - 26 + apps/client/src/app/components/user-account-settings/user-account-settings.html + 159 + + + Experimental Features - apps/client/src/app/pages/home/home-page.component.ts - 33 + apps/client/src/app/components/user-account-settings/user-account-settings.html + 176 + + + Sneak peek at upcoming functionality - apps/client/src/app/pages/zen/zen-page-routing.module.ts - 18 + apps/client/src/app/components/user-account-settings/user-account-settings.html + 177 + + + User ID - apps/client/src/app/pages/zen/zen-page.component.ts - 33 + apps/client/src/app/components/user-account-settings/user-account-settings.html + 192 - - Blog + + Export Data - apps/client/src/app/pages/blog/blog-page-routing.module.ts - 12 + apps/client/src/app/components/user-account-settings/user-account-settings.html + 199 - - Discover the latest Ghostfolio updates and insights on personal finance + + This feature is currently unavailable. - apps/client/src/app/pages/blog/blog-page.html - 7 + apps/client/src/app/core/http-response.interceptor.ts + 59 - - As you are already logged in, you cannot access the demo account. + + Please try again later. - apps/client/src/app/pages/demo/demo-page.component.ts - 31 + apps/client/src/app/core/http-response.interceptor.ts + 61 - - - Frequently Asked Questions (FAQ) - apps/client/src/app/pages/faq/faq-page-routing.module.ts - 12 + apps/client/src/app/core/http-response.interceptor.ts + 88 - - - Frequently Asked Questions (FAQ) - apps/client/src/app/pages/faq/faq-page.html - 4 + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts + 137 - - Features + + Oops! Something went wrong. - apps/client/src/app/pages/features/features-page-routing.module.ts - 12 + apps/client/src/app/core/http-response.interceptor.ts + 86 - - - Check out the numerous features of Ghostfolio to manage your wealth - apps/client/src/app/pages/features/features-page.html - 6 + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts + 135 - - Stocks + + Okay - apps/client/src/app/pages/features/features-page.html - 15 + apps/client/src/app/core/http-response.interceptor.ts + 89 - - - ETFs - apps/client/src/app/pages/features/features-page.html - 25 + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts + 138 - - Bonds + + About - apps/client/src/app/pages/features/features-page.html - 38 + apps/client/src/app/pages/about/about-page-routing.module.ts + 52 - - - Cryptocurrencies - apps/client/src/app/pages/features/features-page.html - 51 + apps/client/src/app/pages/about/about-page.component.ts + 43 - - - Wealth Items - apps/client/src/app/pages/features/features-page.html - 76 + apps/client/src/app/pages/about/overview/about-overview-page-routing.module.ts + 12 - - Import and Export + + Changelog - apps/client/src/app/pages/features/features-page.html - 115 + apps/client/src/app/pages/about/about-page.component.ts + 48 - - - Multi-Accounts - apps/client/src/app/pages/features/features-page.html - 127 + apps/client/src/app/pages/about/changelog/changelog-page-routing.module.ts + 12 - - Portfolio Calculations + + License - apps/client/src/app/pages/features/features-page.html - 141 + apps/client/src/app/pages/about/about-page.component.ts + 53 - - - Dark Mode - apps/client/src/app/pages/features/features-page.html - 179 + apps/client/src/app/pages/about/license/license-page-routing.module.ts + 12 - - Zen Mode + + Privacy Policy - apps/client/src/app/components/user-account-settings/user-account-settings.html - 141 + apps/client/src/app/pages/about/about-page.component.ts + 61 - apps/client/src/app/pages/features/features-page.html - 192 + apps/client/src/app/pages/about/privacy-policy/privacy-policy-page-routing.module.ts + 12 - - Market Mood + + Our - apps/client/src/app/pages/features/features-page.html - 209 + apps/client/src/app/pages/about/oss-friends/oss-friends-page.html + 6 - - Static Analysis + + Discover other exciting Open Source Software projects - apps/client/src/app/pages/features/features-page.html - 227 + apps/client/src/app/pages/about/oss-friends/oss-friends-page.html + 9 - - Multi-Language + + Visit - apps/client/src/app/pages/features/features-page.html - 245 + apps/client/src/app/pages/about/oss-friends/oss-friends-page.html + 28 - - Open Source Software + + Accounts - apps/client/src/app/pages/features/features-page.html - 279 + apps/client/src/app/pages/accounts/accounts-page-routing.module.ts + 12 - - Get Started - - apps/client/src/app/pages/features/features-page.html - 299 - + + Oops, cash balance transfer has failed. - apps/client/src/app/pages/public/public-page.html - 152 + apps/client/src/app/pages/accounts/accounts-page.component.ts + 305 - - Holdings - - apps/client/src/app/pages/home/home-page-routing.module.ts - 22 - + + Update account - apps/client/src/app/pages/home/home-page.component.ts - 38 + apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html + 7 + + + Add account - apps/client/src/app/pages/portfolio/holdings/holdings-page-routing.module.ts - 12 + apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html + 8 + + + Account ID - apps/client/src/app/pages/portfolio/portfolio-page.component.ts - 38 + apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html + 90 + + + From - apps/client/src/app/pages/zen/zen-page.component.ts - 38 + apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html + 11 - - Summary + + To - apps/client/src/app/pages/home/home-page-routing.module.ts - 27 + apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html + 29 + + + Transfer - apps/client/src/app/pages/home/home-page.component.ts - 43 + apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html + 66 - - Markets + + Admin Control - apps/client/src/app/pages/home/home-page-routing.module.ts - 32 + apps/client/src/app/pages/admin/admin-page-routing.module.ts + 19 + + + Jobs - apps/client/src/app/pages/home/home-page.component.ts - 48 + apps/client/src/app/pages/admin/admin-page-routing.module.ts + 21 - apps/client/src/app/pages/markets/markets-page-routing.module.ts - 12 + apps/client/src/app/pages/admin/admin-page.component.ts + 41 - - New + + Market Data - apps/client/src/app/pages/landing/landing-page.html - 7 + apps/client/src/app/pages/admin/admin-page-routing.module.ts + 25 - - - Manage your wealth like a boss - apps/client/src/app/pages/landing/landing-page.html - 11 + apps/client/src/app/pages/admin/admin-page.component.ts + 36 - - Ghostfolio is a privacy-first, open source dashboard for your personal finances. Break down your asset allocation, know your net worth and make solid, data-driven investment decisions. + + Settings - apps/client/src/app/pages/landing/landing-page.html - 15 + apps/client/src/app/pages/admin/admin-page-routing.module.ts + 30 - - - Get Started - apps/client/src/app/pages/landing/landing-page.html - 47 + apps/client/src/app/pages/admin/admin-page.component.ts + 31 - apps/client/src/app/pages/landing/landing-page.html - 431 + apps/client/src/app/pages/user-account/user-account-page-routing.module.ts + 17 - - - or - apps/client/src/app/pages/landing/landing-page.html - 52 + apps/client/src/app/pages/user-account/user-account-page.component.ts + 34 - - Live Demo - - apps/client/src/app/pages/landing/landing-page.html - 55 - + + Users - apps/client/src/app/pages/landing/landing-page.html - 436 + apps/client/src/app/pages/admin/admin-page-routing.module.ts + 35 - - - Monthly Active Users - apps/client/src/app/pages/landing/landing-page.html - 75 + apps/client/src/app/pages/admin/admin-page.component.ts + 46 - - Stars on GitHub + + Overview - apps/client/src/app/pages/landing/landing-page.html - 93 + apps/client/src/app/pages/admin/admin-page.component.ts + 26 - apps/client/src/app/pages/open/open-page.html - 103 + apps/client/src/app/pages/home/home-page.component.ts + 33 - - - Pulls on Docker Hub - apps/client/src/app/pages/landing/landing-page.html - 111 + apps/client/src/app/pages/zen/zen-page-routing.module.ts + 18 - apps/client/src/app/pages/open/open-page.html - 117 + apps/client/src/app/pages/zen/zen-page.component.ts + 33 - - As seen in + + Blog - apps/client/src/app/pages/landing/landing-page.html - 119 + apps/client/src/app/pages/blog/blog-page-routing.module.ts + 12 - - Protect your assets. Refine your personal investment strategy. + + Discover the latest Ghostfolio updates and insights on personal finance - apps/client/src/app/pages/landing/landing-page.html - 221 + apps/client/src/app/pages/blog/blog-page.html + 7 - - Ghostfolio empowers busy people to keep track of stocks, ETFs or cryptocurrencies without being tracked. + + As you are already logged in, you cannot access the demo account. - apps/client/src/app/pages/landing/landing-page.html - 225 + apps/client/src/app/pages/demo/demo-page.component.ts + 31 - - 360° View + + Frequently Asked Questions (FAQ) - apps/client/src/app/pages/landing/landing-page.html - 236 + apps/client/src/app/pages/faq/faq-page-routing.module.ts + 12 - - Get the full picture of your personal finances across multiple platforms. + + Frequently Asked Questions (FAQ) - apps/client/src/app/pages/landing/landing-page.html - 238 + apps/client/src/app/pages/faq/faq-page.html + 4 - - Web3 Ready + + Features - apps/client/src/app/pages/landing/landing-page.html - 247 + apps/client/src/app/pages/features/features-page-routing.module.ts + 12 - - Use Ghostfolio anonymously and own your financial data. + + Check out the numerous features of Ghostfolio to manage your wealth - apps/client/src/app/pages/landing/landing-page.html - 249 + apps/client/src/app/pages/features/features-page.html + 6 - - Open Source + + Stocks - apps/client/src/app/pages/landing/landing-page.html - 257 + apps/client/src/app/pages/features/features-page.html + 15 - - Benefit from continuous improvements through a strong community. + + ETFs - apps/client/src/app/pages/landing/landing-page.html - 259 + apps/client/src/app/pages/features/features-page.html + 25 - - Why Ghostfolio? + + Bonds - apps/client/src/app/pages/landing/landing-page.html - 268 + apps/client/src/app/pages/features/features-page.html + 38 - - Ghostfolio is for you if you are... + + Cryptocurrencies - apps/client/src/app/pages/landing/landing-page.html - 269 + apps/client/src/app/pages/features/features-page.html + 51 - - trading stocks, ETFs or cryptocurrencies on multiple platforms + + Wealth Items - apps/client/src/app/pages/landing/landing-page.html - 276 + apps/client/src/app/pages/features/features-page.html + 76 - - pursuing a buy & hold strategy + + Import and Export - apps/client/src/app/pages/landing/landing-page.html - 282 + apps/client/src/app/pages/features/features-page.html + 115 - - interested in getting insights of your portfolio composition + + Multi-Accounts - apps/client/src/app/pages/landing/landing-page.html - 287 + apps/client/src/app/pages/features/features-page.html + 127 - - valuing privacy and data ownership + + Portfolio Calculations - apps/client/src/app/pages/landing/landing-page.html - 292 + apps/client/src/app/pages/features/features-page.html + 141 - - into minimalism + + Dark Mode - apps/client/src/app/pages/landing/landing-page.html - 295 + apps/client/src/app/pages/features/features-page.html + 179 - - caring about diversifying your financial resources + + Market Mood - apps/client/src/app/pages/landing/landing-page.html - 299 + apps/client/src/app/pages/features/features-page.html + 209 - - interested in financial independence + + Static Analysis - apps/client/src/app/pages/landing/landing-page.html - 303 + apps/client/src/app/pages/features/features-page.html + 227 - - saying no to spreadsheets in + + Multi-Language - apps/client/src/app/pages/landing/landing-page.html - 307 + apps/client/src/app/pages/features/features-page.html + 245 - - still reading this list + + Open Source Software - apps/client/src/app/pages/landing/landing-page.html - 310 + apps/client/src/app/pages/features/features-page.html + 279 - - Learn more about Ghostfolio + + Get Started - apps/client/src/app/pages/landing/landing-page.html - 315 + apps/client/src/app/pages/features/features-page.html + 299 + + + apps/client/src/app/pages/public/public-page.html + 152 - - What our users are saying + + Holdings - apps/client/src/app/pages/landing/landing-page.html - 323 + apps/client/src/app/pages/home/home-page-routing.module.ts + 22 + + + apps/client/src/app/pages/home/home-page.component.ts + 38 + + + apps/client/src/app/pages/portfolio/holdings/holdings-page-routing.module.ts + 12 + + + apps/client/src/app/pages/portfolio/portfolio-page.component.ts + 38 + + + apps/client/src/app/pages/zen/zen-page.component.ts + 38 - - Members from around the globe are using Ghostfolio Premium + + Summary - apps/client/src/app/pages/landing/landing-page.html - 358 + apps/client/src/app/pages/home/home-page-routing.module.ts + 27 + + + apps/client/src/app/pages/home/home-page.component.ts + 43 - - How does Ghostfolio work? + + Markets - apps/client/src/app/pages/landing/landing-page.html - 373 + apps/client/src/app/pages/home/home-page-routing.module.ts + 32 + + + apps/client/src/app/pages/home/home-page.component.ts + 48 + + + apps/client/src/app/pages/markets/markets-page-routing.module.ts + 12 - - Get started in only 3 steps + + Ghostfolio is a personal finance dashboard to keep track of your net worth including cash, stocks, ETFs and cryptocurrencies across multiple platforms. - apps/client/src/app/pages/landing/landing-page.html - 376 + apps/client/src/app/pages/i18n/i18n-page.html + 4 - - Sign up anonymously* + + app, asset, cryptocurrency, dashboard, etf, finance, management, performance, portfolio, software, stock, trading, wealth, web3 - apps/client/src/app/pages/landing/landing-page.html - 382 + apps/client/src/app/pages/i18n/i18n-page.html + 9 - - * no e-mail address nor credit card required + + Open Source Wealth Management Software - apps/client/src/app/pages/landing/landing-page.html - 384 + apps/client/src/app/pages/i18n/i18n-page.html + 13 - - Add any of your historical transactions + + New apps/client/src/app/pages/landing/landing-page.html - 395 + 7 - - Get valuable insights of your portfolio composition + + Manage your wealth like a boss apps/client/src/app/pages/landing/landing-page.html - 407 + 11 - - Are you ready? + + Ghostfolio is a privacy-first, open source dashboard for your personal finances. Break down your asset allocation, know your net worth and make solid, data-driven investment decisions. apps/client/src/app/pages/landing/landing-page.html - 419 + 15 - - Join now or check out the example account + + Get Started apps/client/src/app/pages/landing/landing-page.html - 420 + 47 - - - At Ghostfolio, transparency is at the core of our values. We publish the source code as open source software (OSS) under the AGPL-3.0 license and we openly share aggregated key metrics of the platform’s operational status. - apps/client/src/app/pages/open/open-page.html - 6 + apps/client/src/app/pages/landing/landing-page.html + 431 - - (Last 24 hours) + + or - apps/client/src/app/pages/open/open-page.html - 37 + apps/client/src/app/pages/landing/landing-page.html + 52 - - Active Users + + Live Demo - apps/client/src/app/pages/open/open-page.html - 40 + apps/client/src/app/pages/landing/landing-page.html + 55 - apps/client/src/app/pages/open/open-page.html - 62 + apps/client/src/app/pages/landing/landing-page.html + 436 - - (Last 30 days) + + Monthly Active Users - apps/client/src/app/pages/open/open-page.html - 48 - - - apps/client/src/app/pages/open/open-page.html - 59 + apps/client/src/app/pages/landing/landing-page.html + 75 - - New Users + + Stars on GitHub - apps/client/src/app/pages/open/open-page.html - 51 + apps/client/src/app/pages/landing/landing-page.html + 93 - - - Users in Slack community apps/client/src/app/pages/open/open-page.html - 75 + 103 - - Contributors on GitHub + + Pulls on Docker Hub - apps/client/src/app/pages/open/open-page.html - 89 + apps/client/src/app/pages/landing/landing-page.html + 111 - - - (Last 90 days) apps/client/src/app/pages/open/open-page.html - 127 + 117 - - Uptime + + As seen in - apps/client/src/app/pages/open/open-page.html - 132 + apps/client/src/app/pages/landing/landing-page.html + 119 - - Activities + + Protect your assets. Refine your personal investment strategy. - apps/client/src/app/pages/portfolio/activities/activities-page-routing.module.ts - 12 + apps/client/src/app/pages/landing/landing-page.html + 221 + + + Ghostfolio empowers busy people to keep track of stocks, ETFs or cryptocurrencies without being tracked. - apps/client/src/app/pages/portfolio/portfolio-page.component.ts - 43 + apps/client/src/app/pages/landing/landing-page.html + 225 - - Do you really want to delete all your activities? + + 360° View - apps/client/src/app/pages/portfolio/activities/activities-page.component.ts - 140 + apps/client/src/app/pages/landing/landing-page.html + 236 - - Update activity + + Get the full picture of your personal finances across multiple platforms. - apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 7 + apps/client/src/app/pages/landing/landing-page.html + 238 - - Stocks, ETFs, bonds, cryptocurrencies, commodities + + Web3 Ready - apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 21 + apps/client/src/app/pages/landing/landing-page.html + 247 + + + Use Ghostfolio anonymously and own your financial data. - apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 51 + apps/client/src/app/pages/landing/landing-page.html + 249 - - Mortgages, personal loans, credit cards + + Open Source - apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 45 + apps/client/src/app/pages/landing/landing-page.html + 257 - - Luxury items, real estate, private companies + + Benefit from continuous improvements through a strong community. - apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 57 + apps/client/src/app/pages/landing/landing-page.html + 259 - - Account + + Why Ghostfolio? - apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 69 + apps/client/src/app/pages/landing/landing-page.html + 268 + + + Ghostfolio is for you if you are... - libs/ui/src/lib/activities-table/activities-table.component.html - 387 + apps/client/src/app/pages/landing/landing-page.html + 269 - - Update Cash Balance + + trading stocks, ETFs or cryptocurrencies on multiple platforms - apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 94 + apps/client/src/app/pages/landing/landing-page.html + 276 - - Unit Price + + pursuing a buy & hold strategy - apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 173 + apps/client/src/app/pages/landing/landing-page.html + 282 + + + interested in getting insights of your portfolio composition - apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 228 + apps/client/src/app/pages/landing/landing-page.html + 287 + + + valuing privacy and data ownership - libs/ui/src/lib/activities-table/activities-table.component.html - 259 + apps/client/src/app/pages/landing/landing-page.html + 292 - - Oops! Could not get the historical exchange rate from + + into minimalism - apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 258 + apps/client/src/app/pages/landing/landing-page.html + 295 - - Fee + + caring about diversifying your financial resources - apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 242 + apps/client/src/app/pages/landing/landing-page.html + 299 + + + interested in financial independence - apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 267 + apps/client/src/app/pages/landing/landing-page.html + 303 + + + saying no to spreadsheets in - libs/ui/src/lib/activities-table/activities-table.component.html - 288 + apps/client/src/app/pages/landing/landing-page.html + 307 - - Import Activities + + still reading this list - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 40 + apps/client/src/app/pages/landing/landing-page.html + 310 - - Import Dividends + + Learn more about Ghostfolio - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 79 + apps/client/src/app/pages/landing/landing-page.html + 315 - - Importing data... + + What our users are saying - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 113 + apps/client/src/app/pages/landing/landing-page.html + 323 - - Import has been completed + + Members from around the globe are using Ghostfolio Premium - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 121 + apps/client/src/app/pages/landing/landing-page.html + 358 - - Validating data... + + How does Ghostfolio work? - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 224 + apps/client/src/app/pages/landing/landing-page.html + 373 - - Select Holding + + Get started in only 3 steps - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 20 + apps/client/src/app/pages/landing/landing-page.html + 376 - - Select File + + Sign up anonymously* - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 23 + apps/client/src/app/pages/landing/landing-page.html + 382 - - Holding + + * no e-mail address nor credit card required - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 33 + apps/client/src/app/pages/landing/landing-page.html + 384 - - Load Dividends + + Add any of your historical transactions - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 65 + apps/client/src/app/pages/landing/landing-page.html + 395 - - The following file formats are supported: + + Get valuable insights of your portfolio composition - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 91 + apps/client/src/app/pages/landing/landing-page.html + 407 - - Select Dividends + + Are you ready? - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 114 + apps/client/src/app/pages/landing/landing-page.html + 419 - - Select Activities + + Join now or check out the example account - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 117 + apps/client/src/app/pages/landing/landing-page.html + 420 - - Back - - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 141 - + + At Ghostfolio, transparency is at the core of our values. We publish the source code as open source software (OSS) under the AGPL-3.0 license and we openly share aggregated key metrics of the platform’s operational status. - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 178 + apps/client/src/app/pages/open/open-page.html + 6 - - Import + + (Last 24 hours) - apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 79 + apps/client/src/app/pages/open/open-page.html + 37 + + + Active Users - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 150 + apps/client/src/app/pages/open/open-page.html + 40 - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 186 + apps/client/src/app/pages/open/open-page.html + 62 - - Allocations + + (Last 30 days) - apps/client/src/app/pages/portfolio/allocations/allocations-page-routing.module.ts - 12 + apps/client/src/app/pages/open/open-page.html + 48 - apps/client/src/app/pages/portfolio/portfolio-page.component.ts - 48 + apps/client/src/app/pages/open/open-page.html + 59 - - Filter by account or tag... + + New Users - apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts - 146 + apps/client/src/app/pages/open/open-page.html + 51 + + + Users in Slack community - apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 126 + apps/client/src/app/pages/open/open-page.html + 75 + + + Contributors on GitHub - apps/client/src/app/pages/portfolio/holdings/holdings-page.component.ts - 86 + apps/client/src/app/pages/open/open-page.html + 89 - - Allocations + + (Last 90 days) - apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 4 + apps/client/src/app/pages/open/open-page.html + 127 - - Proportion of Net Worth + + Uptime - apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 18 + apps/client/src/app/pages/open/open-page.html + 132 - - By Platform + + Activities - apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 42 + apps/client/src/app/pages/portfolio/activities/activities-page-routing.module.ts + 12 - - - By Currency - apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 61 + apps/client/src/app/pages/portfolio/portfolio-page.component.ts + 43 - - By Asset Class + + Do you really want to delete all your activities? - apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 84 + apps/client/src/app/pages/portfolio/activities/activities-page.component.ts + 183 - - By Holding + + Update activity - apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 107 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 7 - - By Sector + + Stocks, ETFs, bonds, cryptocurrencies, commodities - apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 130 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 21 - - - By Continent - apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 154 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 51 - - By Market + + One-time fee, annual account fees - apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 177 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 27 - - Regions + + Distribution of corporate earnings - apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 201 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 33 + + + Revenue for lending out money - apps/client/src/app/pages/public/public-page.html - 76 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 39 - - Developed Markets + + Mortgages, personal loans, credit cards - apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 224 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 45 + + + Luxury items, real estate, private companies - apps/client/src/app/pages/public/public-page.html - 93 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 57 - - Emerging Markets + + Account - apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 233 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 69 - apps/client/src/app/pages/public/public-page.html - 102 + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 301 - - - Other Markets - apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 242 + libs/ui/src/lib/activities-table/activities-table.component.html + 387 + + + Update Cash Balance - apps/client/src/app/pages/public/public-page.html - 111 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 94 - - No data available + + Unit Price - apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 254 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 173 - apps/client/src/app/pages/public/public-page.html - 123 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 228 - - - By Account - apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 266 + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 203 - - - By ETF Provider - apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 286 + libs/ui/src/lib/activities-table/activities-table.component.html + 259 - - By Country + + Oops! Could not get the historical exchange rate from - apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 309 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 198 - - Analysis + + Fee - apps/client/src/app/pages/portfolio/analysis/analysis-page-routing.module.ts - 12 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 242 - apps/client/src/app/pages/portfolio/portfolio-page.component.ts - 33 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 267 - - - Dividend - apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 43 + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 227 - libs/ui/src/lib/i18n.ts - 31 + libs/ui/src/lib/activities-table/activities-table.component.html + 288 - - Deposit + + Oops! Could not get the historical exchange rate from - apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 48 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 258 + + + Import Activities - apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 60 + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts + 43 + + + Import Dividends - libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 331 + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts + 85 - - Monthly + + Importing data... - apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 54 + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts + 119 - - Yearly + + Import has been completed - apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 55 + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts + 127 - - Analysis + + Validating data... - apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 2 + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts + 232 - - Top + + Select Holding - apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 40 + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html + 20 - - Bottom + + Select File - apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 86 + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html + 23 - - Portfolio Evolution + + Holding - apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 136 + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html + 33 - - Investment Timeline + + Load Dividends - apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 166 + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html + 65 - - Current Streak + + Choose or drop a file here - apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 187 + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html + 85 - - Longest Streak + + The following file formats are supported: - apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 196 + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html + 91 - - Dividend Timeline + + Select Dividends - apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 223 + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html + 114 - - FIRE + + Select Activities - apps/client/src/app/pages/portfolio/fire/fire-page-routing.module.ts - 12 + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html + 117 - - FIRE + + Back - apps/client/src/app/pages/portfolio/fire/fire-page.html - 4 + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html + 162 - - - Calculator - apps/client/src/app/pages/portfolio/fire/fire-page.html - 7 + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html + 199 - - 4% Rule + + Allocations - apps/client/src/app/pages/portfolio/fire/fire-page.html - 34 + apps/client/src/app/pages/portfolio/allocations/allocations-page-routing.module.ts + 12 - - - If you retire today, you would be able to withdraw per year or per month, based on your total assets of and a withdrawal rate of 4%. - apps/client/src/app/pages/portfolio/fire/fire-page.html - 57 + apps/client/src/app/pages/portfolio/portfolio-page.component.ts + 48 - - Holdings + + Filter by account or tag... - apps/client/src/app/pages/portfolio/holdings/holdings-page.html - 4 + apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts + 146 - apps/client/src/app/pages/public/public-page.html - 14 + apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts + 126 - libs/ui/src/lib/assistant/assistant.html - 46 + apps/client/src/app/pages/portfolio/holdings/holdings-page.component.ts + 86 - - Pricing + + Allocations - apps/client/src/app/pages/pricing/pricing-page-routing.module.ts - 12 + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 4 - - Pricing Plans + + Proportion of Net Worth - apps/client/src/app/pages/pricing/pricing-page.html - 4 + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 18 - - Our official Ghostfolio Premium cloud offering is the easiest way to get started. Due to the time it saves, this will be the best option for most people. Revenue is used to cover the costs of the hosting infrastructure and to fund ongoing development. + + By Platform - apps/client/src/app/pages/pricing/pricing-page.html - 6 + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 42 - - If you prefer to run Ghostfolio on your own infrastructure, please find the source code and further instructions on GitHub. + + By Currency - apps/client/src/app/pages/pricing/pricing-page.html - 24 + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 61 - - For tech-savvy investors who prefer to run Ghostfolio on their own infrastructure. + + By Asset Class - apps/client/src/app/pages/pricing/pricing-page.html - 36 + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 84 - - Unlimited Transactions + + By Holding - apps/client/src/app/pages/pricing/pricing-page.html - 46 + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 107 + + + By Sector - apps/client/src/app/pages/pricing/pricing-page.html - 159 + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 130 + + + By Continent - apps/client/src/app/pages/pricing/pricing-page.html - 235 + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 154 - - Unlimited Accounts + + By Market - apps/client/src/app/pages/pricing/pricing-page.html - 53 + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 177 + + + Regions - apps/client/src/app/pages/pricing/pricing-page.html - 166 + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 201 - apps/client/src/app/pages/pricing/pricing-page.html - 242 + apps/client/src/app/pages/public/public-page.html + 76 - - Portfolio Performance - - apps/client/src/app/pages/pricing/pricing-page.html - 60 - + + Developed Markets - apps/client/src/app/pages/pricing/pricing-page.html - 173 + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 224 - apps/client/src/app/pages/pricing/pricing-page.html - 249 + apps/client/src/app/pages/public/public-page.html + 93 - - Data Import and Export - - apps/client/src/app/pages/pricing/pricing-page.html - 95 - + + Emerging Markets - apps/client/src/app/pages/pricing/pricing-page.html - 180 + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 233 - apps/client/src/app/pages/pricing/pricing-page.html - 284 + apps/client/src/app/pages/public/public-page.html + 102 - - Community Support + + Other Markets - apps/client/src/app/pages/pricing/pricing-page.html - 118 + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 242 - - - Self-hosted, update manually. - apps/client/src/app/pages/pricing/pricing-page.html - 122 + apps/client/src/app/pages/public/public-page.html + 111 - - Free + + No data available - apps/client/src/app/pages/pricing/pricing-page.html - 123 + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 254 - apps/client/src/app/pages/pricing/pricing-page.html - 192 + apps/client/src/app/pages/public/public-page.html + 123 - - For new investors who are just getting started with trading. + + By Account - apps/client/src/app/pages/pricing/pricing-page.html - 150 + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 266 - - Fully managed Ghostfolio cloud offering. + + By ETF Provider - apps/client/src/app/pages/pricing/pricing-page.html - 191 + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 286 + + + By Country - apps/client/src/app/pages/pricing/pricing-page.html - 318 + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 309 - - For ambitious investors who need the full picture of their financial assets. + + Analysis - apps/client/src/app/pages/pricing/pricing-page.html - 225 + apps/client/src/app/pages/portfolio/analysis/analysis-page-routing.module.ts + 12 - - - Email and Chat Support - apps/client/src/app/pages/pricing/pricing-page.html - 314 + apps/client/src/app/pages/portfolio/portfolio-page.component.ts + 33 - - per year + + Dividend - apps/client/src/app/components/user-account-membership/user-account-membership.html - 33 + apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts + 43 - apps/client/src/app/pages/pricing/pricing-page.html - 332 + libs/ui/src/lib/i18n.ts + 31 - - Renew Plan + + Deposit - apps/client/src/app/pages/pricing/pricing-page.html - 348 + apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts + 48 - - - One-time payment, no auto-renewal. - apps/client/src/app/pages/pricing/pricing-page.html - 352 + apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts + 60 - - - Get Started - apps/client/src/app/pages/pricing/pricing-page.html - 363 + libs/ui/src/lib/fire-calculator/fire-calculator.component.ts + 331 - - It’s free. + + Monthly - apps/client/src/app/pages/pricing/pricing-page.html - 366 + apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts + 54 - - Hello, has shared a Portfolio with you! + + Yearly - apps/client/src/app/pages/public/public-page.html - 4 + apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts + 55 - - Currencies + + Analysis - apps/client/src/app/pages/public/public-page.html - 30 + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 2 - - Continents + + Top - apps/client/src/app/pages/public/public-page.html - 60 + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 40 - - Ghostfolio empowers you to keep track of your wealth. + + Bottom - apps/client/src/app/pages/public/public-page.html - 147 + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 86 - - Registration + + Portfolio Evolution - apps/client/src/app/pages/register/register-page-routing.module.ts - 12 + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 136 - - Create Account + + Investment Timeline - apps/client/src/app/app.component.html - 18 + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 166 + + + Current Streak - apps/client/src/app/pages/register/register-page.html - 26 + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 187 + + + Longest Streak - apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html - 2 + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 196 - - Continue with Internet Identity + + Dividend Timeline - apps/client/src/app/pages/register/register-page.html - 41 + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 223 - - Continue with Google + + FIRE - apps/client/src/app/pages/register/register-page.html - 51 + apps/client/src/app/pages/portfolio/fire/fire-page-routing.module.ts + 12 - - Copy to clipboard + + FIRE - apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html - 26 + apps/client/src/app/pages/portfolio/fire/fire-page.html + 4 - - I agree to have stored my Security Token from above in a secure place. If I lose it, I cannot get my account back. + + Calculator - apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html - 31 + apps/client/src/app/pages/portfolio/fire/fire-page.html + 7 - - Agree and continue + + 4% Rule - apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html - 44 + apps/client/src/app/pages/portfolio/fire/fire-page.html + 34 - - Personal Finance Tools + + If you retire today, you would be able to withdraw per year or per month, based on your total assets of and a withdrawal rate of 4%. - apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page-routing.module.ts - 13 + apps/client/src/app/pages/portfolio/fire/fire-page.html + 57 - - open-source-alternative-to + + Ghostfolio X-ray uses static analysis to identify potential issues and risks in your portfolio. - apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page-routing.module.ts - 22 + apps/client/src/app/pages/portfolio/fire/fire-page.html + 100 + + + Currency Cluster Risks - apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.component.ts - 13 + apps/client/src/app/pages/portfolio/fire/fire-page.html + 124 - - Open Source Alternative to + + Account Cluster Risks - apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page-routing.module.ts - 25 + apps/client/src/app/pages/portfolio/fire/fire-page.html + 137 - - Discover Open Source Alternatives for Personal Finance Tools + + Holdings - apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.html + apps/client/src/app/pages/portfolio/holdings/holdings-page.html 4 - - - This overview page features a curated collection of personal finance tools compared to the open source alternative Ghostfolio. If you value transparency, data privacy, and community collaboration, Ghostfolio provides an excellent opportunity to take control of your financial management. - apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.html - 8 + apps/client/src/app/pages/public/public-page.html + 14 - - - Explore the links below to compare a variety of personal finance tools with Ghostfolio. - apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.html - 16 + libs/ui/src/lib/assistant/assistant.html + 46 - - Open Source Alternative to + + Pricing - apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.html - 35 + apps/client/src/app/pages/pricing/pricing-page-routing.module.ts + 12 - - The Open Source Alternative to + + Pricing Plans - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 8 + apps/client/src/app/pages/pricing/pricing-page.html + 4 + + + Our official Ghostfolio Premium cloud offering is the easiest way to get started. Due to the time it saves, this will be the best option for most people. Revenue is used to cover the costs of the hosting infrastructure and to fund ongoing development. - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 8 + apps/client/src/app/pages/pricing/pricing-page.html + 6 + + + If you prefer to run Ghostfolio on your own infrastructure, please find the source code and further instructions on GitHub. - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 8 + apps/client/src/app/pages/pricing/pricing-page.html + 24 + + + For tech-savvy investors who prefer to run Ghostfolio on their own infrastructure. - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 8 + apps/client/src/app/pages/pricing/pricing-page.html + 36 + + + Unlimited Transactions - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 8 + apps/client/src/app/pages/pricing/pricing-page.html + 46 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 8 + apps/client/src/app/pages/pricing/pricing-page.html + 159 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 8 + apps/client/src/app/pages/pricing/pricing-page.html + 235 + + + Unlimited Accounts - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 8 + apps/client/src/app/pages/pricing/pricing-page.html + 53 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 8 + apps/client/src/app/pages/pricing/pricing-page.html + 166 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 8 + apps/client/src/app/pages/pricing/pricing-page.html + 242 + + + Portfolio Performance - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 8 + apps/client/src/app/pages/pricing/pricing-page.html + 60 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 8 + apps/client/src/app/pages/pricing/pricing-page.html + 173 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 8 + apps/client/src/app/pages/pricing/pricing-page.html + 249 + + + Data Import and Export - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 8 + apps/client/src/app/pages/pricing/pricing-page.html + 95 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 8 + apps/client/src/app/pages/pricing/pricing-page.html + 180 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 8 + apps/client/src/app/pages/pricing/pricing-page.html + 284 + + + Community Support - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 8 + apps/client/src/app/pages/pricing/pricing-page.html + 118 + + + Self-hosted, update manually. - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 8 + apps/client/src/app/pages/pricing/pricing-page.html + 122 + + + Free - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 8 + apps/client/src/app/pages/pricing/pricing-page.html + 123 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 8 + apps/client/src/app/pages/pricing/pricing-page.html + 192 + + + For new investors who are just getting started with trading. - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 8 + apps/client/src/app/pages/pricing/pricing-page.html + 150 + + + Fully managed Ghostfolio cloud offering. - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 8 + apps/client/src/app/pages/pricing/pricing-page.html + 191 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 8 + apps/client/src/app/pages/pricing/pricing-page.html + 318 + + + For ambitious investors who need the full picture of their financial assets. - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 8 + apps/client/src/app/pages/pricing/pricing-page.html + 225 + + + Email and Chat Support - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 8 + apps/client/src/app/pages/pricing/pricing-page.html + 314 + + + Renew Plan - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 8 + apps/client/src/app/pages/pricing/pricing-page.html + 348 + + + One-time payment, no auto-renewal. - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 8 + apps/client/src/app/pages/pricing/pricing-page.html + 352 + + + Get Started - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 8 + apps/client/src/app/pages/pricing/pricing-page.html + 363 + + + It’s free. - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 8 + apps/client/src/app/pages/pricing/pricing-page.html + 366 + + + Hello, has shared a Portfolio with you! - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 8 + apps/client/src/app/pages/public/public-page.html + 4 + + + Currencies - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 8 + apps/client/src/app/pages/public/public-page.html + 30 + + + Continents - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 8 + apps/client/src/app/pages/public/public-page.html + 60 + + + Ghostfolio empowers you to keep track of your wealth. - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 8 + apps/client/src/app/pages/public/public-page.html + 147 + + + Registration - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 8 + apps/client/src/app/pages/register/register-page-routing.module.ts + 12 + + + Continue with Internet Identity - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 8 + apps/client/src/app/pages/register/register-page.html + 41 + + + Continue with Google - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 8 + apps/client/src/app/pages/register/register-page.html + 51 + + + Copy to clipboard - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 8 + apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html + 26 + + + + I agree to have stored my Security Token from above in a secure place. If I lose it, I cannot get my account back. + + apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html + 31 + + + + Agree and continue + + apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html + 44 + + + + Personal Finance Tools + + apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page-routing.module.ts + 13 + + + + open-source-alternative-to + + apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page-routing.module.ts + 22 + + + apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.component.ts + 13 + + + + Open Source Alternative to + + apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page-routing.module.ts + 25 + + + + Discover Open Source Alternatives for Personal Finance Tools + + apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.html + 4 + + + + This overview page features a curated collection of personal finance tools compared to the open source alternative Ghostfolio. If you value transparency, data privacy, and community collaboration, Ghostfolio provides an excellent opportunity to take control of your financial management. + + apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.html + 8 + + + + Explore the links below to compare a variety of personal finance tools with Ghostfolio. + + apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.html + 16 + + + + Open Source Alternative to + + apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.html + 35 + + + + The Open Source Alternative to + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 8 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html @@ -5677,75 +6174,266 @@ 37 - - Founded + + Ghostfolio vs comparison table apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 67 + 48 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 67 + 48 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 67 + 48 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 67 + 48 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 67 + 48 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 67 + 48 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 67 + 48 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 67 + 48 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 67 + 48 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 67 + 48 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 67 + 48 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 67 + 48 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 67 + 48 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 67 + 48 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 67 + 48 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 67 + 48 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 67 + 48 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 48 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 48 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 48 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 48 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 48 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 48 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 48 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 48 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 48 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 48 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 48 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 48 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 48 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 48 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 48 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 48 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 48 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 48 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 48 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 48 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 48 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 48 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 48 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 48 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 48 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 48 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 48 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 48 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 48 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 48 + + + + Founded + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 67 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 67 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 67 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 67 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 67 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 67 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 67 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 67 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 67 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 67 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 67 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 67 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 67 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 67 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 67 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 67 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 67 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html @@ -10031,3469 +10719,2892 @@ 164 - - Notes + + Starting from apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 196 + 185 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 196 + 185 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 196 + 185 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 196 + 185 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 196 + 185 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 196 + 185 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 196 + 185 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 196 + 185 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 196 + 185 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 196 + 185 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 196 + 185 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 196 + 185 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 196 + 185 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 196 + 185 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 196 + 185 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 196 + 185 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 196 + 185 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 196 + 185 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 196 + 185 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 196 + 185 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 196 + 185 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 196 + 185 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 196 + 185 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 196 + 185 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 196 + 185 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 196 + 185 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 196 + 185 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 196 + 185 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 196 + 185 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 196 + 185 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 196 + 185 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 196 + 185 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 196 + 185 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 196 + 185 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 196 + 185 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 196 + 185 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 196 + 185 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 196 + 185 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 196 + 185 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 196 + 185 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 196 + 185 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 196 + 185 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 196 + 185 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 196 + 185 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 196 + 185 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 196 + 185 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 196 + 185 - - - Please note that the information provided in the Ghostfolio vs comparison table is based on our independent research and analysis. This website is not affiliated with 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. apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 204 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 204 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 204 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 204 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 204 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 204 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 204 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 204 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 204 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 204 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 204 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 204 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 204 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 204 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 204 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 204 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 204 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 204 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 204 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 204 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 204 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 204 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 204 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 204 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 204 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 204 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 204 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 204 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 204 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 204 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 204 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 204 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 204 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 204 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 204 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 204 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 204 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 204 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 204 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 204 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 204 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 204 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 204 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 204 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 204 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 204 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 204 + 190 - - Ready to take your investments to the next level? + + year apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 217 + 186 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 217 + 186 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 217 + 186 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 217 + 186 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 217 + 186 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 217 + 186 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 217 + 186 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 217 + 186 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 217 + 186 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 217 + 186 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 217 + 186 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 217 + 186 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 217 + 186 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 217 + 186 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 217 + 186 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 217 + 186 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 217 + 186 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 217 + 186 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 217 + 186 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 217 + 186 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 217 + 186 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 217 + 186 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 217 + 186 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 217 + 186 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 217 + 186 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 217 + 186 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 217 + 186 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 217 + 186 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 217 + 186 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 217 + 186 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 217 + 186 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 217 + 186 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 217 + 186 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 217 + 186 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 217 + 186 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 217 + 186 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 217 + 186 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 217 + 186 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 217 + 186 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 217 + 186 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 217 + 186 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 217 + 186 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 217 + 186 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 217 + 186 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 217 + 186 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 217 + 186 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 217 + 186 - - - Effortlessly track, analyze, and visualize your wealth with Ghostfolio. apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 221 + 191 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 221 + 191 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 221 + 191 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 221 + 191 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 221 + 191 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 221 + 191 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 221 + 191 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 221 + 191 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 221 + 191 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 221 + 191 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 221 + 191 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 221 + 191 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 221 + 191 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 221 + 191 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 221 + 191 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 221 + 191 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 221 + 191 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 221 + 191 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 221 + 191 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 221 + 191 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 221 + 191 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 221 + 191 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 221 + 191 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 221 + 191 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 221 + 191 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 221 + 191 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 221 + 191 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 221 + 191 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 221 + 191 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 221 + 191 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 221 + 191 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 221 + 191 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 221 + 191 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 221 + 191 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 221 + 191 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 221 + 191 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 221 + 191 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 221 + 191 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 221 + 191 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 221 + 191 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 221 + 191 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 221 + 191 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 221 + 191 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 221 + 191 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 221 + 191 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 221 + 191 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 221 + 191 - - Get Started + + Notes apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 226 + 196 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 226 + 196 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 226 + 196 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 226 + 196 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 226 + 196 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 226 + 196 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 226 + 196 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 226 + 196 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 226 + 196 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 226 + 196 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 226 + 196 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 226 + 196 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 226 + 196 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 226 + 196 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 226 + 196 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 226 + 196 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 226 + 196 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 226 + 196 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 226 + 196 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 226 + 196 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 226 + 196 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 226 + 196 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 226 + 196 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 226 + 196 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 226 + 196 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 226 + 196 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 226 + 196 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 226 + 196 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 226 + 196 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 226 + 196 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 226 + 196 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 226 + 196 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 226 + 196 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 226 + 196 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 226 + 196 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 226 + 196 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 226 + 196 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 226 + 196 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 226 + 196 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 226 + 196 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 226 + 196 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 226 + 196 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 226 + 196 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 226 + 196 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 226 + 196 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 226 + 196 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 226 + 196 - - Personal Finance Tools + + Please note that the information provided in the Ghostfolio vs comparison table is based on our independent research and analysis. This website is not affiliated with 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. apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 302 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 302 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 302 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 302 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 302 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 302 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 302 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 302 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 302 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 302 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 302 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 302 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 302 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 302 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 302 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 302 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 302 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 302 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 302 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 302 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 302 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 302 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 302 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 302 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 302 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 302 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 302 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 302 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 302 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 302 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 302 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 302 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 302 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 302 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 302 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 302 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 302 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 302 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 302 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 302 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 302 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 302 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 302 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 302 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 302 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 302 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 302 + 204 - - Switzerland + + Ready to take your investments to the next level? - apps/client/src/app/pages/resources/personal-finance-tools/products.ts - 69 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 217 - apps/client/src/app/pages/resources/personal-finance-tools/products.ts - 90 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 217 - apps/client/src/app/pages/resources/personal-finance-tools/products.ts - 506 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 217 - apps/client/src/app/pages/resources/personal-finance-tools/products.ts - 548 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 217 - - - Global - apps/client/src/app/pages/resources/personal-finance-tools/products.ts - 70 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 217 - apps/client/src/app/pages/resources/personal-finance-tools/products.ts - 317 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 217 - apps/client/src/app/pages/resources/personal-finance-tools/products.ts - 438 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 217 - apps/client/src/app/pages/resources/personal-finance-tools/products.ts - 549 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 217 - - - United States - apps/client/src/app/pages/resources/personal-finance-tools/products.ts - 81 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 217 - apps/client/src/app/pages/resources/personal-finance-tools/products.ts - 137 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 217 - apps/client/src/app/pages/resources/personal-finance-tools/products.ts - 147 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 217 - apps/client/src/app/pages/resources/personal-finance-tools/products.ts - 189 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 217 - apps/client/src/app/pages/resources/personal-finance-tools/products.ts - 198 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 217 - apps/client/src/app/pages/resources/personal-finance-tools/products.ts - 208 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 217 - apps/client/src/app/pages/resources/personal-finance-tools/products.ts - 218 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 217 - apps/client/src/app/pages/resources/personal-finance-tools/products.ts - 270 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 217 - apps/client/src/app/pages/resources/personal-finance-tools/products.ts - 292 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 217 - apps/client/src/app/pages/resources/personal-finance-tools/products.ts - 303 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 217 - apps/client/src/app/pages/resources/personal-finance-tools/products.ts - 328 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 217 - apps/client/src/app/pages/resources/personal-finance-tools/products.ts - 330 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 217 - apps/client/src/app/pages/resources/personal-finance-tools/products.ts - 340 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 217 - apps/client/src/app/pages/resources/personal-finance-tools/products.ts - 405 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 217 - apps/client/src/app/pages/resources/personal-finance-tools/products.ts - 415 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 217 - apps/client/src/app/pages/resources/personal-finance-tools/products.ts - 425 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 217 - apps/client/src/app/pages/resources/personal-finance-tools/products.ts - 494 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 217 - apps/client/src/app/pages/resources/personal-finance-tools/products.ts - 517 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 217 - apps/client/src/app/pages/resources/personal-finance-tools/products.ts - 537 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 217 - apps/client/src/app/pages/resources/personal-finance-tools/products.ts - 559 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 217 - - - Belgium - apps/client/src/app/pages/resources/personal-finance-tools/products.ts - 167 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 217 - - - Germany - apps/client/src/app/pages/resources/personal-finance-tools/products.ts - 128 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 217 - apps/client/src/app/pages/resources/personal-finance-tools/products.ts - 178 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 217 - apps/client/src/app/pages/resources/personal-finance-tools/products.ts - 250 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 217 - apps/client/src/app/pages/resources/personal-finance-tools/products.ts - 260 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 217 - apps/client/src/app/pages/resources/personal-finance-tools/products.ts - 281 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 217 - apps/client/src/app/pages/resources/personal-finance-tools/products.ts - 315 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 217 - apps/client/src/app/pages/resources/personal-finance-tools/products.ts - 361 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 217 - - - Austria - apps/client/src/app/pages/resources/personal-finance-tools/products.ts - 238 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 217 - - - Italy - apps/client/src/app/pages/resources/personal-finance-tools/products.ts - 372 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 217 - - - Netherlands - apps/client/src/app/pages/resources/personal-finance-tools/products.ts - 382 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 217 - - - Thailand - apps/client/src/app/pages/resources/personal-finance-tools/products.ts - 394 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 217 - - - New Zealand - apps/client/src/app/pages/resources/personal-finance-tools/products.ts - 436 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 217 - - - Czech Republic - apps/client/src/app/pages/resources/personal-finance-tools/products.ts - 447 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 217 - apps/client/src/app/pages/resources/personal-finance-tools/products.ts - 484 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 217 - - - Resources - apps/client/src/app/pages/resources/resources-page-routing.module.ts - 12 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 217 - - - Guides - apps/client/src/app/pages/resources/resources-page.html - 5 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 217 - - - Glossary - apps/client/src/app/pages/resources/resources-page.html - 75 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 217 - - - Grant access - apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 7 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 217 - - Public + + Effortlessly track, analyze, and visualize your wealth with Ghostfolio. - apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 24 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 221 - - - My Ghostfolio - apps/client/src/app/pages/user-account/user-account-page-routing.module.ts - 32 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 221 - - - Auto - apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 31 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 221 - - - Please enter your coupon code: - apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 110 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 221 - - - Could not redeem coupon code - apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 120 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 221 - - - Coupon code has been redeemed - apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 132 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 221 - - - Reload - apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 133 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 221 - - - Do you really want to remove this sign in method? - apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 182 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 221 - - - Membership - libs/ui/src/lib/membership-card/membership-card.component.html - 18 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 221 - - - Valid until - libs/ui/src/lib/membership-card/membership-card.component.html - 22 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 221 - - - Upgrade - apps/client/src/app/components/user-account-membership/user-account-membership.html - 18 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 221 - - - Renew - apps/client/src/app/components/user-account-membership/user-account-membership.html - 21 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 221 - - - Try Premium - apps/client/src/app/components/user-account-membership/user-account-membership.html - 42 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 221 - - - Redeem Coupon - apps/client/src/app/components/user-account-membership/user-account-membership.html - 55 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 221 - - - Presenter View - apps/client/src/app/components/user-account-settings/user-account-settings.html - 7 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 221 - - - Protection for sensitive information like absolute performances and quantity values - apps/client/src/app/components/user-account-settings/user-account-settings.html - 8 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 221 - - - Base Currency - apps/client/src/app/components/user-account-settings/user-account-settings.html - 27 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 221 - - - Language - apps/client/src/app/components/user-account-settings/user-account-settings.html - 48 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 221 - - - Locale - apps/client/src/app/components/user-account-settings/user-account-settings.html - 95 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 221 - - - Date and number format - apps/client/src/app/components/user-account-settings/user-account-settings.html - 97 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 221 - - - Appearance - apps/client/src/app/components/user-account-settings/user-account-settings.html - 118 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 221 - - - Auto - apps/client/src/app/components/user-account-settings/user-account-settings.html - 130 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 221 - - - Light - apps/client/src/app/components/user-account-settings/user-account-settings.html - 131 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 221 - - - Dark - apps/client/src/app/components/user-account-settings/user-account-settings.html - 132 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 221 - - - Distraction-free experience for turbulent times - apps/client/src/app/components/user-account-settings/user-account-settings.html - 142 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 221 - - - Biometric Authentication - apps/client/src/app/components/user-account-settings/user-account-settings.html - 158 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 221 - - - Sign in with fingerprint - apps/client/src/app/components/user-account-settings/user-account-settings.html - 159 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 221 - - - Experimental Features - apps/client/src/app/components/user-account-settings/user-account-settings.html - 176 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 221 - - - Sneak peek at upcoming functionality - apps/client/src/app/components/user-account-settings/user-account-settings.html - 177 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 221 - - - User ID - apps/client/src/app/components/user-account-settings/user-account-settings.html - 192 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 221 - - - Export Data - apps/client/src/app/components/user-account-settings/user-account-settings.html - 199 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 221 - - - Granted Access - apps/client/src/app/components/user-account-access/user-account-access.html - 5 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 221 - - - Oops, authentication has failed. - apps/client/src/app/pages/webauthn/webauthn-page.html - 18 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 221 - - - Try again - apps/client/src/app/pages/webauthn/webauthn-page.html - 26 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 221 - - - Go back to Home Page - apps/client/src/app/pages/webauthn/webauthn-page.html - 30 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 221 - - - Import Activities - libs/ui/src/lib/activities-table/activities-table.component.html - 16 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 221 - libs/ui/src/lib/activities-table/activities-table.component.html - 453 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 221 - - - Import Dividends - libs/ui/src/lib/activities-table/activities-table.component.html - 35 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 221 - libs/ui/src/lib/activities-table/activities-table.component.html - 464 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 221 - - - Export Activities - libs/ui/src/lib/activities-table/activities-table.component.html - 47 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 221 - libs/ui/src/lib/activities-table/activities-table.component.html - 476 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 221 - - - Export Drafts as ICS - libs/ui/src/lib/activities-table/activities-table.component.html - 59 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 221 - libs/ui/src/lib/activities-table/activities-table.component.html - 488 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 221 - - - Delete all Activities - libs/ui/src/lib/activities-table/activities-table.component.html - 69 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 221 - - - Draft - libs/ui/src/lib/activities-table/activities-table.component.html - 189 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 221 - - - Clone - libs/ui/src/lib/activities-table/activities-table.component.html - 513 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 221 - - - Export Draft as ICS - libs/ui/src/lib/activities-table/activities-table.component.html - 523 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 221 - - Do you really want to delete this activity? + + Get Started - libs/ui/src/lib/activities-table/activities-table.component.ts - 227 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 226 - - - Filter by account, currency, symbol or type... - libs/ui/src/lib/activities-table/activities-table.component.ts - 427 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 226 - - - Index - libs/ui/src/lib/benchmark/benchmark.component.html - 3 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 226 - - - Change from All Time High - libs/ui/src/lib/benchmark/benchmark.component.html - 79 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 226 - - - from ATH - libs/ui/src/lib/benchmark/benchmark.component.html - 81 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 226 - - - Market data provided by - libs/ui/src/lib/data-provider-credits/data-provider-credits.component.html - 2 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 226 - - - Savings Rate per Month - libs/ui/src/lib/fire-calculator/fire-calculator.component.html - 10 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 226 - - - Annual Interest Rate - libs/ui/src/lib/fire-calculator/fire-calculator.component.html - 21 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 226 - - - Retirement Date - libs/ui/src/lib/fire-calculator/fire-calculator.component.html - 32 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 226 - - - Projected Total Amount - libs/ui/src/lib/fire-calculator/fire-calculator.component.html - 60 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 226 - - - Interest - libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 341 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 226 - libs/ui/src/lib/i18n.ts - 33 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 226 - - - Savings - libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 351 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 226 - - - Allocation - libs/ui/src/lib/holdings-table/holdings-table.component.html - 98 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 226 - - - Show all - libs/ui/src/lib/holdings-table/holdings-table.component.html - 172 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 226 - - - Account - libs/ui/src/lib/i18n.ts - 4 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 226 - - - Asia-Pacific - libs/ui/src/lib/i18n.ts - 5 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 226 - - - Asset Class - libs/ui/src/lib/i18n.ts - 6 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 226 - - - Asset Sub Class - libs/ui/src/lib/i18n.ts - 7 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 226 - - - Core - libs/ui/src/lib/i18n.ts - 8 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 226 - - - Switch to Ghostfolio Premium or Ghostfolio Open Source easily - libs/ui/src/lib/i18n.ts - 9 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 226 - - - Switch to Ghostfolio Premium easily - libs/ui/src/lib/i18n.ts - 10 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 226 - - - Switch to Ghostfolio Open Source or Ghostfolio Basic easily - libs/ui/src/lib/i18n.ts - 11 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 226 - - - Emergency Fund - libs/ui/src/lib/i18n.ts - 12 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 226 - - - Grant - libs/ui/src/lib/i18n.ts - 13 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 226 - - - Higher Risk - libs/ui/src/lib/i18n.ts - 14 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 226 - - - This activity already exists. - libs/ui/src/lib/i18n.ts - 15 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 226 - - - Japan - libs/ui/src/lib/i18n.ts - 16 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 226 - - - Lower Risk - libs/ui/src/lib/i18n.ts - 17 - - - - Month - - libs/ui/src/lib/i18n.ts - 18 - - - - Months - - libs/ui/src/lib/i18n.ts - 19 - - - - Other - - libs/ui/src/lib/i18n.ts - 20 - - - libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 384 - - - - Preset - - libs/ui/src/lib/i18n.ts - 21 - - - - Retirement Provision - - libs/ui/src/lib/i18n.ts - 22 - - - - Satellite - - libs/ui/src/lib/i18n.ts - 23 - - - - Symbol - - libs/ui/src/lib/i18n.ts - 24 - - - - Tag - - libs/ui/src/lib/i18n.ts - 25 - - - - Year - - libs/ui/src/lib/i18n.ts - 26 - - - - Years - - libs/ui/src/lib/i18n.ts - 27 - - - - Buy - - libs/ui/src/lib/i18n.ts - 30 - - - - Valuable - - libs/ui/src/lib/i18n.ts - 34 - - - - Liability - - libs/ui/src/lib/i18n.ts - 35 - - - - Sell - - libs/ui/src/lib/i18n.ts - 36 - - - - Cash - - libs/ui/src/lib/i18n.ts - 39 - - - - Commodity - - libs/ui/src/lib/i18n.ts - 40 - - - - Equity - - libs/ui/src/lib/i18n.ts - 41 - - - - Fixed Income - - libs/ui/src/lib/i18n.ts - 42 - - - - Real Estate - - libs/ui/src/lib/i18n.ts - 43 - - - - Bond - - libs/ui/src/lib/i18n.ts - 46 - - - - Cryptocurrency - - libs/ui/src/lib/i18n.ts - 47 - - - - ETF - - libs/ui/src/lib/i18n.ts - 48 - - - - Mutual Fund - - libs/ui/src/lib/i18n.ts - 49 - - - - Precious Metal - - libs/ui/src/lib/i18n.ts - 50 - - - - Private Equity - - libs/ui/src/lib/i18n.ts - 51 - - - - Stock - - libs/ui/src/lib/i18n.ts - 52 - - - - Africa - - libs/ui/src/lib/i18n.ts - 55 - - - - Asia - - libs/ui/src/lib/i18n.ts - 56 - - - - Europe - - libs/ui/src/lib/i18n.ts - 57 - - - - North America - - libs/ui/src/lib/i18n.ts - 58 - - - - Oceania - - libs/ui/src/lib/i18n.ts - 59 - - - - South America - - libs/ui/src/lib/i18n.ts - 60 - - - - Time to add your first activity. - - libs/ui/src/lib/no-transactions-info/no-transactions-info.component.html - 12 - - - - No data available - - libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 386 - - - libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 399 - - - - Choose or drop a file here - - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 85 - - - - You are using the Live Demo. - - apps/client/src/app/app.component.html - 17 - - - - Fee - - libs/ui/src/lib/i18n.ts - 32 - - - - Distribution of corporate earnings - - apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 33 - - - - Oops! Could not get the historical exchange rate from - - apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 198 - - - - One-time fee, annual account fees - - apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 27 - - - - Revenue for lending out money - - apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 39 - - - - Interest - - apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 280 - - - - Add tag - - apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html - 3 - - - - Do you really want to delete this tag? - - apps/client/src/app/components/admin-tag/admin-tag.component.ts - 78 - - - - France - - apps/client/src/app/pages/resources/personal-finance-tools/products.ts - 109 - - - apps/client/src/app/pages/resources/personal-finance-tools/products.ts - 458 - - - apps/client/src/app/pages/resources/personal-finance-tools/products.ts - 474 - - - - Update tag - - apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html - 2 - - - - Add Tag - - apps/client/src/app/components/admin-tag/admin-tag.component.html - 11 - - - - Ghostfolio X-ray uses static analysis to identify potential issues and risks in your portfolio. - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 100 - - - - Currency Cluster Risks - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 124 - - - - Account Cluster Risks - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 137 - - - - Benchmark - - apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 219 - - - - Settings - - apps/client/src/app/components/user-account-settings/user-account-settings.html - 2 - - - - Membership - - apps/client/src/app/pages/user-account/user-account-page-routing.module.ts - 22 - - - apps/client/src/app/pages/user-account/user-account-page.component.ts - 39 - - - - Find holding... - - libs/ui/src/lib/assistant/assistant.component.ts - 89 - - - - Transfer Cash Balance - - apps/client/src/app/components/accounts-table/accounts-table.component.html - 9 - - - apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html - 7 - - - - Access - - apps/client/src/app/pages/user-account/user-account-page-routing.module.ts - 27 - - - apps/client/src/app/pages/user-account/user-account-page.component.ts - 45 - - - - To - - apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html - 29 - - - - Transfer - - apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html - 66 - - - - Finland - - apps/client/src/app/pages/resources/personal-finance-tools/products.ts - 466 - - - - Version - - apps/client/src/app/components/admin-overview/admin-overview.html - 7 - - - - No entries... - - libs/ui/src/lib/assistant/assistant.html - 63 - - - libs/ui/src/lib/assistant/assistant.html - 84 - - - - From - - apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html - 11 - - - - Asset Profile - - apps/client/src/app/components/admin-jobs/admin-jobs.html - 31 - - - - Last All Time High - - libs/ui/src/lib/benchmark/benchmark.component.html - 63 - - - - Add Manually - - apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 19 - - - - Do you really want to delete this asset profile? - - apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 184 - - - - Search - - apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 16 - - - - Ghostfolio is a personal finance dashboard to keep track of your net worth including cash, stocks, ETFs and cryptocurrencies across multiple platforms. - - apps/client/src/app/pages/i18n/i18n-page.html - 4 - - - - User - - apps/client/src/app/components/admin-users/admin-users.html - 29 - - - - Ghostfolio vs comparison table - - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 48 - - - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 48 - - - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 48 - - - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 48 - - - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 48 - - - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 48 - - - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 48 - - - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 48 - - - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 48 + apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html + 226 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 48 + 226 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 48 + 226 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 48 + 226 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 48 + 226 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 48 + 226 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 48 + 226 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 48 + 226 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 48 + 226 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 48 + 226 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 48 + 226 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 48 + 226 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 48 + 226 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 48 + 226 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 48 + 226 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 48 + 226 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 48 + 226 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 48 + 226 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 48 + 226 + + + Personal Finance Tools apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 48 + 302 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 48 + 302 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 48 + 302 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 48 + 302 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 48 + 302 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 48 + 302 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 48 + 302 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 48 + 302 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 48 + 302 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 48 + 302 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 48 + 302 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 48 + 302 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 48 + 302 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 48 + 302 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 48 + 302 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 48 + 302 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 48 + 302 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 48 + 302 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 48 + 302 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 48 - - - - Canada - - apps/client/src/app/pages/resources/personal-finance-tools/products.ts - 529 - - - - Open Source Wealth Management Software - - apps/client/src/app/pages/i18n/i18n-page.html - 13 - - - - app, asset, cryptocurrency, dashboard, etf, finance, management, performance, portfolio, software, stock, trading, wealth, web3 - - apps/client/src/app/pages/i18n/i18n-page.html - 9 - - - - Oops, cash balance transfer has failed. - - apps/client/src/app/pages/accounts/accounts-page.component.ts - 305 - - - - Poland - - apps/client/src/app/pages/resources/personal-finance-tools/products.ts - 119 - - - - Extreme Fear - - libs/ui/src/lib/i18n.ts - 63 - - - - Extreme Greed - - libs/ui/src/lib/i18n.ts - 64 - - - - Neutral - - libs/ui/src/lib/i18n.ts - 67 - - - - South Africa - - apps/client/src/app/pages/resources/personal-finance-tools/products.ts - 227 - - - - Oops! Could not parse historical data. - - apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 205 - - - - Do you really want to delete this system message? - - apps/client/src/app/components/admin-overview/admin-overview.component.ts - 159 - - - - 200-Day Trend - - libs/ui/src/lib/benchmark/benchmark.component.html - 39 - - - - 50-Day Trend - - libs/ui/src/lib/benchmark/benchmark.component.html - 15 - - - - Cash Balances - - apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 88 - - - - Do you really want to delete this account balance? - - libs/ui/src/lib/account-balances/account-balances.component.ts - 56 + 302 - - - year apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 186 + 302 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 186 + 302 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 186 + 302 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 186 + 302 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 186 + 302 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 186 + 302 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 186 + 302 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 186 + 302 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 186 + 302 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 186 + 302 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 186 + 302 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 186 + 302 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 186 + 302 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 186 + 302 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 186 + 302 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 186 + 302 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 186 + 302 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 186 + 302 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 186 + 302 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 186 + 302 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 186 + 302 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 186 + 302 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 186 + 302 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 186 + 302 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 186 + 302 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 186 + 302 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 186 + 302 + + + Switzerland - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 186 + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 69 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 186 + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 90 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 186 + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 506 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 186 + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 548 + + + Global - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 186 + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 70 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 186 + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 317 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 186 + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 438 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 186 + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 549 + + + United States - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 186 + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 81 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 186 + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 137 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 186 + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 147 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 186 + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 189 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 186 + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 198 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 186 + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 208 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 186 + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 218 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 186 + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 270 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 186 + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 292 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 186 + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 303 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 186 + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 328 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 186 + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 330 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 191 + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 340 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 191 + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 405 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 191 + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 415 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 191 + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 425 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 191 + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 494 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 191 + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 517 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 191 + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 537 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 191 + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 559 + + + France - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 191 + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 109 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 191 + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 458 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 191 + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 474 + + + + Poland + + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 119 + + + Germany - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 191 + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 128 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 191 + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 178 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 191 + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 250 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 191 + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 260 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 191 + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 281 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 191 + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 315 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 191 + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 361 + + + Belgium - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 191 + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 167 + + + South Africa - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 191 + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 227 + + + + Austria + + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 238 + + + + Italy + + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 372 + + + Netherlands - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 191 + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 382 + + + Thailand - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 191 + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 394 + + + New Zealand - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 191 + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 436 + + + Czech Republic - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 191 + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 447 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 191 + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 484 + + + Finland - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 191 + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 466 + + + Canada - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 191 + apps/client/src/app/pages/resources/personal-finance-tools/products.ts + 529 + + + Resources - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 191 + apps/client/src/app/pages/resources/resources-page-routing.module.ts + 12 + + + Guides - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 191 + apps/client/src/app/pages/resources/resources-page.html + 5 + + + Glossary - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 191 + apps/client/src/app/pages/resources/resources-page.html + 75 + + + Membership - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 191 + apps/client/src/app/pages/user-account/user-account-page-routing.module.ts + 22 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 191 + apps/client/src/app/pages/user-account/user-account-page.component.ts + 39 + + + Access - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 191 + apps/client/src/app/pages/user-account/user-account-page-routing.module.ts + 27 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 191 + apps/client/src/app/pages/user-account/user-account-page.component.ts + 45 + + + My Ghostfolio - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 191 + apps/client/src/app/pages/user-account/user-account-page-routing.module.ts + 32 + + + Oops, authentication has failed. - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 191 + apps/client/src/app/pages/webauthn/webauthn-page.html + 18 + + + Try again - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 191 + apps/client/src/app/pages/webauthn/webauthn-page.html + 26 + + + Go back to Home Page - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 191 + apps/client/src/app/pages/webauthn/webauthn-page.html + 30 + + + Do you really want to delete this account balance? - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 191 + libs/ui/src/lib/account-balances/account-balances.component.ts + 56 + + + Import Activities - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 191 + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 8 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 191 + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 361 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 191 + libs/ui/src/lib/activities-table/activities-table.component.html + 16 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 191 + libs/ui/src/lib/activities-table/activities-table.component.html + 453 + + + Import Dividends - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 191 + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 27 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 191 + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 372 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 191 + libs/ui/src/lib/activities-table/activities-table.component.html + 35 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 191 + libs/ui/src/lib/activities-table/activities-table.component.html + 464 - - Starting from + + Export Activities - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 185 + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 39 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 185 + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 384 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 185 + libs/ui/src/lib/activities-table/activities-table.component.html + 47 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 185 + libs/ui/src/lib/activities-table/activities-table.component.html + 476 + + + Export Drafts as ICS - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 185 + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 51 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 185 + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 396 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 185 + libs/ui/src/lib/activities-table/activities-table.component.html + 59 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 185 + libs/ui/src/lib/activities-table/activities-table.component.html + 488 + + + Delete all Activities - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 185 + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 61 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 185 + libs/ui/src/lib/activities-table/activities-table.component.html + 69 + + + Draft - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 185 + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 140 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 185 + libs/ui/src/lib/activities-table/activities-table.component.html + 189 + + + Clone - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 185 + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 421 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 185 + libs/ui/src/lib/activities-table/activities-table.component.html + 513 + + + + Export Draft as ICS + + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html + 431 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 185 + libs/ui/src/lib/activities-table/activities-table.component.html + 523 + + + Do you really want to delete this activity? - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 185 + libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.ts + 176 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 185 + libs/ui/src/lib/activities-table/activities-table.component.ts + 227 + + + Filter by account, currency, symbol or type... - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 185 + libs/ui/src/lib/activities-table/activities-table.component.ts + 427 + + + Find holding... - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 185 + libs/ui/src/lib/assistant/assistant.component.ts + 89 + + + No entries... - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 185 + libs/ui/src/lib/assistant/assistant.html + 63 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 185 + libs/ui/src/lib/assistant/assistant.html + 84 + + + Asset Profiles - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 185 + libs/ui/src/lib/assistant/assistant.html + 67 + + + Index - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 185 + libs/ui/src/lib/benchmark/benchmark.component.html + 3 + + + 50-Day Trend - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 185 + libs/ui/src/lib/benchmark/benchmark.component.html + 15 + + + 200-Day Trend - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 185 + libs/ui/src/lib/benchmark/benchmark.component.html + 39 + + + Last All Time High - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 185 + libs/ui/src/lib/benchmark/benchmark.component.html + 63 + + + Change from All Time High - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 185 + libs/ui/src/lib/benchmark/benchmark.component.html + 79 + + + from ATH - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 185 + libs/ui/src/lib/benchmark/benchmark.component.html + 81 + + + Market data provided by - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 185 + libs/ui/src/lib/data-provider-credits/data-provider-credits.component.html + 2 + + + Savings Rate per Month - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 185 + libs/ui/src/lib/fire-calculator/fire-calculator.component.html + 10 + + + Annual Interest Rate - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 185 + libs/ui/src/lib/fire-calculator/fire-calculator.component.html + 21 + + + Retirement Date - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 185 + libs/ui/src/lib/fire-calculator/fire-calculator.component.html + 32 + + + Projected Total Amount - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 185 + libs/ui/src/lib/fire-calculator/fire-calculator.component.html + 60 + + + Interest - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 185 + libs/ui/src/lib/fire-calculator/fire-calculator.component.ts + 341 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 185 + libs/ui/src/lib/i18n.ts + 33 + + + Savings - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 185 + libs/ui/src/lib/fire-calculator/fire-calculator.component.ts + 351 + + + Allocation - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 185 + libs/ui/src/lib/holdings-table/holdings-table.component.html + 98 + + + Show all - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 185 + libs/ui/src/lib/holdings-table/holdings-table.component.html + 172 + + + Account - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 185 + libs/ui/src/lib/i18n.ts + 4 + + + Asia-Pacific - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 185 + libs/ui/src/lib/i18n.ts + 5 + + + Asset Class - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 185 + libs/ui/src/lib/i18n.ts + 6 + + + Asset Sub Class - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 185 + libs/ui/src/lib/i18n.ts + 7 + + + Core - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 185 + libs/ui/src/lib/i18n.ts + 8 + + + Switch to Ghostfolio Premium or Ghostfolio Open Source easily - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 185 + libs/ui/src/lib/i18n.ts + 9 + + + Switch to Ghostfolio Premium easily - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 185 + libs/ui/src/lib/i18n.ts + 10 + + + Switch to Ghostfolio Open Source or Ghostfolio Basic easily - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 185 + libs/ui/src/lib/i18n.ts + 11 + + + Emergency Fund - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 185 + libs/ui/src/lib/i18n.ts + 12 + + + Grant - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 190 + libs/ui/src/lib/i18n.ts + 13 + + + Higher Risk - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 190 + libs/ui/src/lib/i18n.ts + 14 + + + This activity already exists. - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 190 + libs/ui/src/lib/i18n.ts + 15 + + + Japan - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 190 + libs/ui/src/lib/i18n.ts + 16 + + + Lower Risk - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 190 + libs/ui/src/lib/i18n.ts + 17 + + + Month - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 190 + libs/ui/src/lib/i18n.ts + 18 + + + Months - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 190 + libs/ui/src/lib/i18n.ts + 19 + + + Other - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 190 + libs/ui/src/lib/i18n.ts + 20 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 190 + libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts + 384 + + + Preset - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 190 + libs/ui/src/lib/i18n.ts + 21 + + + Retirement Provision - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 190 + libs/ui/src/lib/i18n.ts + 22 + + + Satellite - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 190 + libs/ui/src/lib/i18n.ts + 23 + + + Symbol - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 190 + libs/ui/src/lib/i18n.ts + 24 + + + Tag - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 190 + libs/ui/src/lib/i18n.ts + 25 + + + Year - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 190 + libs/ui/src/lib/i18n.ts + 26 + + + Years - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 190 + libs/ui/src/lib/i18n.ts + 27 + + + Buy - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 190 + libs/ui/src/lib/i18n.ts + 30 + + + Fee - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 190 + libs/ui/src/lib/i18n.ts + 32 + + + Valuable - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 190 + libs/ui/src/lib/i18n.ts + 34 + + + Liability - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 190 + libs/ui/src/lib/i18n.ts + 35 + + + Sell - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 190 + libs/ui/src/lib/i18n.ts + 36 + + + Cash - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 190 + libs/ui/src/lib/i18n.ts + 39 + + + Commodity - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 190 + libs/ui/src/lib/i18n.ts + 40 + + + Equity - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 190 + libs/ui/src/lib/i18n.ts + 41 + + + Fixed Income - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 190 + libs/ui/src/lib/i18n.ts + 42 + + + Real Estate - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 190 + libs/ui/src/lib/i18n.ts + 43 + + + Bond - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 190 + libs/ui/src/lib/i18n.ts + 46 + + + Cryptocurrency - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 190 + libs/ui/src/lib/i18n.ts + 47 + + + ETF - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 190 + libs/ui/src/lib/i18n.ts + 48 + + + Mutual Fund - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 190 + libs/ui/src/lib/i18n.ts + 49 + + + Precious Metal - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 190 + libs/ui/src/lib/i18n.ts + 50 + + + Private Equity - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 190 + libs/ui/src/lib/i18n.ts + 51 + + + Stock - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 190 + libs/ui/src/lib/i18n.ts + 52 + + + Africa - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 190 + libs/ui/src/lib/i18n.ts + 55 + + + Asia - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 190 + libs/ui/src/lib/i18n.ts + 56 + + + Europe - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 190 + libs/ui/src/lib/i18n.ts + 57 + + + North America - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 190 + libs/ui/src/lib/i18n.ts + 58 + + + Oceania - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 190 + libs/ui/src/lib/i18n.ts + 59 + + + South America - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 190 + libs/ui/src/lib/i18n.ts + 60 + + + Extreme Fear - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 190 + libs/ui/src/lib/i18n.ts + 63 + + + Extreme Greed - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 190 + libs/ui/src/lib/i18n.ts + 64 + + + Neutral - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 190 + libs/ui/src/lib/i18n.ts + 67 + + + Membership - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 190 + libs/ui/src/lib/membership-card/membership-card.component.html + 18 + + + Valid until - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 190 + libs/ui/src/lib/membership-card/membership-card.component.html + 22 + + + Time to add your first activity. - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 190 + libs/ui/src/lib/no-transactions-info/no-transactions-info.component.html + 12 + + + No data available - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 190 + libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts + 386 - apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html - 190 + libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts + 399 From efcd9539dd9902b6224eabb1db7d5372185b0c9b Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sat, 30 Dec 2023 10:54:04 +0100 Subject: [PATCH 16/38] Feature/upgrade ng extract i18n merge to 2.9.1 (#2797) * Upgrade ng-extract-i18n-merge to version 2.9.1 * Update changelog --- CHANGELOG.md | 1 + package.json | 2 +- yarn.lock | 8 ++++---- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c591dceb1..54cbd3d07 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Exposed the environment variable `REQUEST_TIMEOUT` - Used the `HasPermission` annotation in endpoints - Improved the language localization for German (`de`) +- Upgraded `ng-extract-i18n-merge` from version `2.9.0` to `2.9.1` - Upgraded `Nx` from version `17.2.5` to `17.2.7` ### Fixed diff --git a/package.json b/package.json index aa3b8c913..0a6d96ab9 100644 --- a/package.json +++ b/package.json @@ -113,7 +113,7 @@ "lodash": "4.17.21", "marked": "9.1.6", "ms": "3.0.0-canary.1", - "ng-extract-i18n-merge": "2.9.0", + "ng-extract-i18n-merge": "2.9.1", "ngx-device-detector": "5.0.1", "ngx-markdown": "17.1.1", "ngx-skeleton-loader": "7.0.0", diff --git a/yarn.lock b/yarn.lock index c78d70302..e6f7751da 100644 --- a/yarn.lock +++ b/yarn.lock @@ -15547,10 +15547,10 @@ neo-async@^2.5.0, neo-async@^2.6.2: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== -ng-extract-i18n-merge@2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/ng-extract-i18n-merge/-/ng-extract-i18n-merge-2.9.0.tgz#a487e3cec76a266c7bb61985de62f87828ee2e21" - integrity sha512-xKdkegJcJCzbvsy07IaSxz2AmkHdF3l0UR5mLr5CHai2g1VHD0xhoHPk/6kFFDNJ42fQT8EybPH/YcqZUt2iQg== +ng-extract-i18n-merge@2.9.1: + version "2.9.1" + resolved "https://registry.yarnpkg.com/ng-extract-i18n-merge/-/ng-extract-i18n-merge-2.9.1.tgz#f8e4431a8672d27be6508c72f3cf47a318b1ecab" + integrity sha512-EJAgJrV2ZSRoH1njMI9lLLtLJkwabkk41ZZyV+U+6h8e5vDCM4zPGjm0NNZFy+YP+/ST+nlvi2CxprDXnjS8BQ== dependencies: "@angular-devkit/architect" "^0.1301.0 || ^0.1401.0 || ^0.1501.0 || ^0.1601.0 || ^0.1700.0" "@angular-devkit/core" "^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" From 7020fc2a9346b96bb4a48542286f4140a97930d0 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sat, 30 Dec 2023 10:55:11 +0100 Subject: [PATCH 17/38] Feature/add hint for community language support (#2793) * Add hint * Update changelog --- CHANGELOG.md | 1 + .../user-account-settings.component.ts | 4 ++++ .../user-account-settings/user-account-settings.html | 12 ++++++++++++ .../user-account-settings/user-account-settings.scss | 9 +++++++++ 4 files changed, 26 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 54cbd3d07..05ad3599c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - Added support to edit the currency of asset profiles with `MANUAL` data source in the asset profile details dialog of the admin control panel +- Added a hint for the community languages in the user settings ### Changed diff --git a/apps/client/src/app/components/user-account-settings/user-account-settings.component.ts b/apps/client/src/app/components/user-account-settings/user-account-settings.component.ts index eaf16e015..b4c2b4556 100644 --- a/apps/client/src/app/components/user-account-settings/user-account-settings.component.ts +++ b/apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -93,6 +93,10 @@ export class UserAccountSettingsComponent implements OnDestroy, OnInit { this.update(); } + public isCommunityLanguage() { + return !(this.language === 'de' || this.language === 'en'); + } + public onChangeUserSetting(aKey: string, aValue: string) { this.dataService .putUserSetting({ [aKey]: aValue }) diff --git a/apps/client/src/app/components/user-account-settings/user-account-settings.html b/apps/client/src/app/components/user-account-settings/user-account-settings.html index 4d55bbc27..b77b5e94c 100644 --- a/apps/client/src/app/components/user-account-settings/user-account-settings.html +++ b/apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -46,6 +46,18 @@
Language
+
+ If a translation is missing, kindly support us in extending it + here. +
diff --git a/apps/client/src/app/components/user-account-settings/user-account-settings.scss b/apps/client/src/app/components/user-account-settings/user-account-settings.scss index 1bcd1c65a..22555407a 100644 --- a/apps/client/src/app/components/user-account-settings/user-account-settings.scss +++ b/apps/client/src/app/components/user-account-settings/user-account-settings.scss @@ -2,6 +2,15 @@ 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); + } + } + .hint-text { font-size: 90%; line-height: 1.2; From e9ac9057ff63311b1a37fef9f35051dc164d022e Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sat, 30 Dec 2023 21:11:56 +0100 Subject: [PATCH 18/38] Fix debug instructions (#2802) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 09270e529..0ee4434a1 100644 --- a/README.md +++ b/README.md @@ -166,7 +166,7 @@ Ghostfolio is available for various home server systems, including [Runtipi](htt #### Debug -Run `yarn watch:server` and click _Launch Program_ in [Visual Studio Code](https://code.visualstudio.com) +Run `yarn watch:server` and click _Debug API_ in [Visual Studio Code](https://code.visualstudio.com) #### Serve From 53ce37a83a58a093ef9f86f5f93b1ed12ec153c8 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 31 Dec 2023 10:23:13 +0100 Subject: [PATCH 19/38] Update OSS friends (#2799) --- apps/client/src/assets/oss-friends.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/apps/client/src/assets/oss-friends.json b/apps/client/src/assets/oss-friends.json index d22f4c030..ffa759f0d 100644 --- a/apps/client/src/assets/oss-friends.json +++ b/apps/client/src/assets/oss-friends.json @@ -1,5 +1,5 @@ { - "createdAt": "2023-11-30T00:00:00.000Z", + "createdAt": "2023-12-30T00:00:00.000Z", "data": [ { "name": "BoxyHQ", @@ -71,6 +71,11 @@ "description": "HTMX is a dependency-free JavaScript library that allows you to access AJAX, CSS Transitions, WebSockets, and Server Sent Events directly in HTML.", "href": "https://htmx.org" }, + { + "name": "Inbox Zero", + "description": "Inbox Zero makes it easy to clean up your inbox and reach inbox zero fast. It provides bulk newsletter unsubscribe, cold email blocking, email analytics, and AI automations.", + "href": "https://getinboxzero.com" + }, { "name": "Infisical", "description": "Open source, end-to-end encrypted platform that lets you securely manage secrets and configs across your team, devices, and infrastructure.", From b89bf1d5e80b4c17c7e110ecd88fdc56cabcb122 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 31 Dec 2023 10:23:56 +0100 Subject: [PATCH 20/38] Feature/increase timeout to load currencies (#2800) * Increase timeout * Update changelog --- CHANGELOG.md | 1 + .../services/exchange-rate-data/exchange-rate-data.service.ts | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 05ad3599c..744f3f6f7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Changed the performance calculation to a time-weighted approach +- Increased the timeout to load currencies in the exchange rate data service - Exposed the environment variable `REQUEST_TIMEOUT` - Used the `HasPermission` annotation in endpoints - Improved the language localization for German (`de`) diff --git a/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts b/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts index cf61786c9..9eecd400d 100644 --- a/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts +++ b/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts @@ -11,6 +11,7 @@ import { DATE_FORMAT, getYesterday } from '@ghostfolio/common/helper'; import { Injectable, Logger } from '@nestjs/common'; import { format, isToday } from 'date-fns'; import { isNumber, uniq } from 'lodash'; +import ms from 'ms'; @Injectable() export class ExchangeRateDataService { @@ -75,7 +76,8 @@ export class ExchangeRateDataService { const quotes = await this.dataProviderService.getQuotes({ items: this.currencyPairs.map(({ dataSource, symbol }) => { return { dataSource, symbol }; - }) + }), + requestTimeout: ms('30 seconds') }); for (const symbol of Object.keys(quotes)) { From cb664774c092f5d02298c288ea15c1ce648f3632 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 31 Dec 2023 10:33:12 +0100 Subject: [PATCH 21/38] Update translations (#2798) * Update translations --- apps/client/src/locales/messages.de.xlf | 54 ++++++++++++++----------- apps/client/src/locales/messages.es.xlf | 52 ++++++++++++++---------- apps/client/src/locales/messages.fr.xlf | 52 ++++++++++++++---------- apps/client/src/locales/messages.it.xlf | 52 ++++++++++++++---------- apps/client/src/locales/messages.nl.xlf | 52 ++++++++++++++---------- apps/client/src/locales/messages.pl.xlf | 52 ++++++++++++++---------- apps/client/src/locales/messages.pt.xlf | 52 ++++++++++++++---------- apps/client/src/locales/messages.tr.xlf | 52 ++++++++++++++---------- apps/client/src/locales/messages.xlf | 51 +++++++++++++---------- 9 files changed, 270 insertions(+), 199 deletions(-) diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index aa03e3ee6..2081eb3fd 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -1852,7 +1852,7 @@ Möchtest du diese Anmeldemethode wirklich löschen? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 183 + 187 @@ -1936,7 +1936,7 @@ Lokalität apps/client/src/app/components/user-account-settings/user-account-settings.html - 95 + 107 @@ -1944,7 +1944,7 @@ Datums- und Zahlenformat apps/client/src/app/components/user-account-settings/user-account-settings.html - 97 + 109 @@ -1952,7 +1952,7 @@ Zen Modus apps/client/src/app/components/user-account-settings/user-account-settings.html - 141 + 153 apps/client/src/app/pages/features/features-page.html @@ -1964,7 +1964,7 @@ Einloggen mit Fingerabdruck apps/client/src/app/components/user-account-settings/user-account-settings.html - 159 + 171 @@ -1972,7 +1972,7 @@ Benutzer ID apps/client/src/app/components/user-account-settings/user-account-settings.html - 192 + 204 @@ -3132,7 +3132,7 @@ Experimentelle Funktionen apps/client/src/app/components/user-account-settings/user-account-settings.html - 176 + 188 @@ -3180,7 +3180,7 @@ Aussehen apps/client/src/app/components/user-account-settings/user-account-settings.html - 118 + 130 @@ -3188,7 +3188,7 @@ Automatisch apps/client/src/app/components/user-account-settings/user-account-settings.html - 130 + 142 @@ -3196,7 +3196,7 @@ Hell apps/client/src/app/components/user-account-settings/user-account-settings.html - 131 + 143 @@ -3204,7 +3204,7 @@ Dunkel apps/client/src/app/components/user-account-settings/user-account-settings.html - 132 + 144 @@ -3468,31 +3468,31 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 62 + 74 apps/client/src/app/components/user-account-settings/user-account-settings.html - 66 + 78 apps/client/src/app/components/user-account-settings/user-account-settings.html - 70 + 82 apps/client/src/app/components/user-account-settings/user-account-settings.html - 74 + 86 apps/client/src/app/components/user-account-settings/user-account-settings.html - 78 + 90 apps/client/src/app/components/user-account-settings/user-account-settings.html - 82 + 94 apps/client/src/app/components/user-account-settings/user-account-settings.html - 86 + 98 apps/client/src/app/pages/features/features-page.html @@ -3732,7 +3732,7 @@ Unbeschwertes Erlebnis für turbulente Zeiten apps/client/src/app/components/user-account-settings/user-account-settings.html - 142 + 154 @@ -3740,7 +3740,7 @@ Vorschau auf kommende Funktionalität apps/client/src/app/components/user-account-settings/user-account-settings.html - 177 + 189 @@ -9780,7 +9780,7 @@ Biometrische Authentifizierung apps/client/src/app/components/user-account-settings/user-account-settings.html - 158 + 170 @@ -9864,7 +9864,7 @@ Daten exportieren apps/client/src/app/components/user-account-settings/user-account-settings.html - 199 + 211 @@ -14193,12 +14193,20 @@ is an invalid currency! - ist eine ungültige Währung! + ist eine ungültige Währung! apps/client/src/app/components/admin-overview/admin-overview.component.ts 126 + + If a translation is missing, kindly support us in extending it here. + Wenn eine Übersetzung fehlt, unterstütze uns bitte dabei, sie hier zu ergänzen. + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 53 + + diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index 22553ab4c..8485e8464 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -1850,7 +1850,7 @@ ¿Estás seguro de eliminar este método de acceso? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 183 + 187 @@ -1934,7 +1934,7 @@ Ubicación apps/client/src/app/components/user-account-settings/user-account-settings.html - 95 + 107 @@ -1942,7 +1942,7 @@ Formato de fecha y número apps/client/src/app/components/user-account-settings/user-account-settings.html - 97 + 109 @@ -1950,7 +1950,7 @@ Modo Zen apps/client/src/app/components/user-account-settings/user-account-settings.html - 141 + 153 apps/client/src/app/pages/features/features-page.html @@ -1962,7 +1962,7 @@ Accede con huella digital apps/client/src/app/components/user-account-settings/user-account-settings.html - 159 + 171 @@ -1970,7 +1970,7 @@ ID usuario apps/client/src/app/components/user-account-settings/user-account-settings.html - 192 + 204 @@ -3130,7 +3130,7 @@ Funcionalidades experimentales apps/client/src/app/components/user-account-settings/user-account-settings.html - 176 + 188 @@ -3178,7 +3178,7 @@ Apariencia apps/client/src/app/components/user-account-settings/user-account-settings.html - 118 + 130 @@ -3186,7 +3186,7 @@ Automático apps/client/src/app/components/user-account-settings/user-account-settings.html - 130 + 142 @@ -3194,7 +3194,7 @@ Claro apps/client/src/app/components/user-account-settings/user-account-settings.html - 131 + 143 @@ -3202,7 +3202,7 @@ Oscuro apps/client/src/app/components/user-account-settings/user-account-settings.html - 132 + 144 @@ -3466,31 +3466,31 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 62 + 74 apps/client/src/app/components/user-account-settings/user-account-settings.html - 66 + 78 apps/client/src/app/components/user-account-settings/user-account-settings.html - 70 + 82 apps/client/src/app/components/user-account-settings/user-account-settings.html - 74 + 86 apps/client/src/app/components/user-account-settings/user-account-settings.html - 78 + 90 apps/client/src/app/components/user-account-settings/user-account-settings.html - 82 + 94 apps/client/src/app/components/user-account-settings/user-account-settings.html - 86 + 98 apps/client/src/app/pages/features/features-page.html @@ -3730,7 +3730,7 @@ Distraction-free experience for turbulent times apps/client/src/app/components/user-account-settings/user-account-settings.html - 142 + 154 @@ -3738,7 +3738,7 @@ Sneak peek at upcoming functionality apps/client/src/app/components/user-account-settings/user-account-settings.html - 177 + 189 @@ -9778,7 +9778,7 @@ Biometric Authentication apps/client/src/app/components/user-account-settings/user-account-settings.html - 158 + 170 @@ -9862,7 +9862,7 @@ Export Data apps/client/src/app/components/user-account-settings/user-account-settings.html - 199 + 211 @@ -14197,6 +14197,14 @@ 126 + + If a translation is missing, kindly support us in extending it here. + If a translation is missing, kindly support us in extending it here. + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 53 + + diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index 1a8ddb194..f3f9d5dc7 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -2121,7 +2121,7 @@ Voulez-vous vraiment supprimer cette méthode de connexion ? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 183 + 187 @@ -2217,31 +2217,31 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 62 + 74 apps/client/src/app/components/user-account-settings/user-account-settings.html - 66 + 78 apps/client/src/app/components/user-account-settings/user-account-settings.html - 70 + 82 apps/client/src/app/components/user-account-settings/user-account-settings.html - 74 + 86 apps/client/src/app/components/user-account-settings/user-account-settings.html - 78 + 90 apps/client/src/app/components/user-account-settings/user-account-settings.html - 82 + 94 apps/client/src/app/components/user-account-settings/user-account-settings.html - 86 + 98 apps/client/src/app/pages/features/features-page.html @@ -2253,7 +2253,7 @@ Paramètres régionaux apps/client/src/app/components/user-account-settings/user-account-settings.html - 95 + 107 @@ -2261,7 +2261,7 @@ Format de date et d'heure apps/client/src/app/components/user-account-settings/user-account-settings.html - 97 + 109 @@ -2269,7 +2269,7 @@ Apparence apps/client/src/app/components/user-account-settings/user-account-settings.html - 118 + 130 @@ -2277,7 +2277,7 @@ Auto apps/client/src/app/components/user-account-settings/user-account-settings.html - 130 + 142 @@ -2285,7 +2285,7 @@ Clair apps/client/src/app/components/user-account-settings/user-account-settings.html - 131 + 143 @@ -2293,7 +2293,7 @@ Sombre apps/client/src/app/components/user-account-settings/user-account-settings.html - 132 + 144 @@ -2301,7 +2301,7 @@ Mode Zen apps/client/src/app/components/user-account-settings/user-account-settings.html - 141 + 153 apps/client/src/app/pages/features/features-page.html @@ -2313,7 +2313,7 @@ Se connecter avec empreinte apps/client/src/app/components/user-account-settings/user-account-settings.html - 159 + 171 @@ -2321,7 +2321,7 @@ Fonctionnalités expérimentales apps/client/src/app/components/user-account-settings/user-account-settings.html - 176 + 188 @@ -2329,7 +2329,7 @@ ID d'utilisateur apps/client/src/app/components/user-account-settings/user-account-settings.html - 192 + 204 @@ -3729,7 +3729,7 @@ Expérience sans distraction pour les périodes tumultueuses apps/client/src/app/components/user-account-settings/user-account-settings.html - 142 + 154 @@ -3737,7 +3737,7 @@ Avant-première de fonctionnalités futures apps/client/src/app/components/user-account-settings/user-account-settings.html - 177 + 189 @@ -9777,7 +9777,7 @@ Biometric Authentication apps/client/src/app/components/user-account-settings/user-account-settings.html - 158 + 170 @@ -9861,7 +9861,7 @@ Export Data apps/client/src/app/components/user-account-settings/user-account-settings.html - 199 + 211 @@ -14196,6 +14196,14 @@ 126 + + If a translation is missing, kindly support us in extending it here. + If a translation is missing, kindly support us in extending it here. + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 53 + + diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index b0c23308b..2696d9336 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -1850,7 +1850,7 @@ Vuoi davvero rimuovere questo metodo di accesso? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 183 + 187 @@ -1934,7 +1934,7 @@ Locale apps/client/src/app/components/user-account-settings/user-account-settings.html - 95 + 107 @@ -1942,7 +1942,7 @@ Formato data e numero apps/client/src/app/components/user-account-settings/user-account-settings.html - 97 + 109 @@ -1950,7 +1950,7 @@ Modalità Zen apps/client/src/app/components/user-account-settings/user-account-settings.html - 141 + 153 apps/client/src/app/pages/features/features-page.html @@ -1962,7 +1962,7 @@ Accesso con impronta digitale apps/client/src/app/components/user-account-settings/user-account-settings.html - 159 + 171 @@ -1970,7 +1970,7 @@ ID utente apps/client/src/app/components/user-account-settings/user-account-settings.html - 192 + 204 @@ -3130,7 +3130,7 @@ Funzionalità sperimentali apps/client/src/app/components/user-account-settings/user-account-settings.html - 176 + 188 @@ -3178,7 +3178,7 @@ Aspetto apps/client/src/app/components/user-account-settings/user-account-settings.html - 118 + 130 @@ -3186,7 +3186,7 @@ Auto apps/client/src/app/components/user-account-settings/user-account-settings.html - 130 + 142 @@ -3194,7 +3194,7 @@ Chiaro apps/client/src/app/components/user-account-settings/user-account-settings.html - 131 + 143 @@ -3202,7 +3202,7 @@ Scuro apps/client/src/app/components/user-account-settings/user-account-settings.html - 132 + 144 @@ -3466,31 +3466,31 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 62 + 74 apps/client/src/app/components/user-account-settings/user-account-settings.html - 66 + 78 apps/client/src/app/components/user-account-settings/user-account-settings.html - 70 + 82 apps/client/src/app/components/user-account-settings/user-account-settings.html - 74 + 86 apps/client/src/app/components/user-account-settings/user-account-settings.html - 78 + 90 apps/client/src/app/components/user-account-settings/user-account-settings.html - 82 + 94 apps/client/src/app/components/user-account-settings/user-account-settings.html - 86 + 98 apps/client/src/app/pages/features/features-page.html @@ -3730,7 +3730,7 @@ Esperienza priva di distrazioni per i periodi più turbolenti apps/client/src/app/components/user-account-settings/user-account-settings.html - 142 + 154 @@ -3738,7 +3738,7 @@ Un'anteprima delle funzionalità in arrivo apps/client/src/app/components/user-account-settings/user-account-settings.html - 177 + 189 @@ -9778,7 +9778,7 @@ Autenticazione biometrica apps/client/src/app/components/user-account-settings/user-account-settings.html - 158 + 170 @@ -9862,7 +9862,7 @@ Esporta dati apps/client/src/app/components/user-account-settings/user-account-settings.html - 199 + 211 @@ -14197,6 +14197,14 @@ 126 + + If a translation is missing, kindly support us in extending it here. + If a translation is missing, kindly support us in extending it here. + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 53 + + diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index c15a7caef..e1b51deff 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -1849,7 +1849,7 @@ Wil je deze aanmeldingsmethode echt verwijderen? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 183 + 187 @@ -1933,7 +1933,7 @@ Locatie apps/client/src/app/components/user-account-settings/user-account-settings.html - 95 + 107 @@ -1941,7 +1941,7 @@ Datum- en getalnotatie apps/client/src/app/components/user-account-settings/user-account-settings.html - 97 + 109 @@ -1949,7 +1949,7 @@ Zen-modus apps/client/src/app/components/user-account-settings/user-account-settings.html - 141 + 153 apps/client/src/app/pages/features/features-page.html @@ -1961,7 +1961,7 @@ Aanmelden met vingerafdruk apps/client/src/app/components/user-account-settings/user-account-settings.html - 159 + 171 @@ -1969,7 +1969,7 @@ Gebruikers-ID apps/client/src/app/components/user-account-settings/user-account-settings.html - 192 + 204 @@ -3129,7 +3129,7 @@ Experimentele functies apps/client/src/app/components/user-account-settings/user-account-settings.html - 176 + 188 @@ -3177,7 +3177,7 @@ Weergave apps/client/src/app/components/user-account-settings/user-account-settings.html - 118 + 130 @@ -3185,7 +3185,7 @@ Automatisch apps/client/src/app/components/user-account-settings/user-account-settings.html - 130 + 142 @@ -3193,7 +3193,7 @@ Licht apps/client/src/app/components/user-account-settings/user-account-settings.html - 131 + 143 @@ -3201,7 +3201,7 @@ Donker apps/client/src/app/components/user-account-settings/user-account-settings.html - 132 + 144 @@ -3465,31 +3465,31 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 62 + 74 apps/client/src/app/components/user-account-settings/user-account-settings.html - 66 + 78 apps/client/src/app/components/user-account-settings/user-account-settings.html - 70 + 82 apps/client/src/app/components/user-account-settings/user-account-settings.html - 74 + 86 apps/client/src/app/components/user-account-settings/user-account-settings.html - 78 + 90 apps/client/src/app/components/user-account-settings/user-account-settings.html - 82 + 94 apps/client/src/app/components/user-account-settings/user-account-settings.html - 86 + 98 apps/client/src/app/pages/features/features-page.html @@ -3729,7 +3729,7 @@ Afleidingsvrije ervaring voor roerige tijden apps/client/src/app/components/user-account-settings/user-account-settings.html - 142 + 154 @@ -3737,7 +3737,7 @@ Voorproefje van nieuwe functionaliteit apps/client/src/app/components/user-account-settings/user-account-settings.html - 177 + 189 @@ -9777,7 +9777,7 @@ Biometrische authenticatie apps/client/src/app/components/user-account-settings/user-account-settings.html - 158 + 170 @@ -9861,7 +9861,7 @@ Exporteer Data apps/client/src/app/components/user-account-settings/user-account-settings.html - 199 + 211 @@ -14196,6 +14196,14 @@ 126 + + If a translation is missing, kindly support us in extending it here. + If a translation is missing, kindly support us in extending it here. + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 53 + + diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index 314593fe7..7246fded1 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -1394,31 +1394,31 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 62 + 74 apps/client/src/app/components/user-account-settings/user-account-settings.html - 66 + 78 apps/client/src/app/components/user-account-settings/user-account-settings.html - 70 + 82 apps/client/src/app/components/user-account-settings/user-account-settings.html - 74 + 86 apps/client/src/app/components/user-account-settings/user-account-settings.html - 78 + 90 apps/client/src/app/components/user-account-settings/user-account-settings.html - 82 + 94 apps/client/src/app/components/user-account-settings/user-account-settings.html - 86 + 98 apps/client/src/app/pages/features/features-page.html @@ -3760,7 +3760,7 @@ Do you really want to remove this sign in method? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 183 + 187 @@ -3808,7 +3808,7 @@ Locale apps/client/src/app/components/user-account-settings/user-account-settings.html - 95 + 107 @@ -3816,7 +3816,7 @@ Date and number format apps/client/src/app/components/user-account-settings/user-account-settings.html - 97 + 109 @@ -3824,7 +3824,7 @@ Appearance apps/client/src/app/components/user-account-settings/user-account-settings.html - 118 + 130 @@ -3832,7 +3832,7 @@ Auto apps/client/src/app/components/user-account-settings/user-account-settings.html - 130 + 142 @@ -3840,7 +3840,7 @@ Light apps/client/src/app/components/user-account-settings/user-account-settings.html - 131 + 143 @@ -3848,7 +3848,7 @@ Dark apps/client/src/app/components/user-account-settings/user-account-settings.html - 132 + 144 @@ -3856,7 +3856,7 @@ Zen Mode apps/client/src/app/components/user-account-settings/user-account-settings.html - 141 + 153 apps/client/src/app/pages/features/features-page.html @@ -3868,7 +3868,7 @@ Distraction-free experience for turbulent times apps/client/src/app/components/user-account-settings/user-account-settings.html - 142 + 154 @@ -3876,7 +3876,7 @@ Biometric Authentication apps/client/src/app/components/user-account-settings/user-account-settings.html - 158 + 170 @@ -3884,7 +3884,7 @@ Sign in with fingerprint apps/client/src/app/components/user-account-settings/user-account-settings.html - 159 + 171 @@ -3892,7 +3892,7 @@ Experimental Features apps/client/src/app/components/user-account-settings/user-account-settings.html - 176 + 188 @@ -3900,7 +3900,7 @@ Sneak peek at upcoming functionality apps/client/src/app/components/user-account-settings/user-account-settings.html - 177 + 189 @@ -3908,7 +3908,7 @@ User ID apps/client/src/app/components/user-account-settings/user-account-settings.html - 192 + 204 @@ -3916,7 +3916,7 @@ Export Data apps/client/src/app/components/user-account-settings/user-account-settings.html - 199 + 211 @@ -14199,6 +14199,14 @@ 126 + + If a translation is missing, kindly support us in extending it here. + If a translation is missing, kindly support us in extending it here. + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 53 + + diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index e8fd14fd8..087db364a 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -2105,7 +2105,7 @@ Deseja realmente remover este método de início de sessão? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 183 + 187 @@ -2209,7 +2209,7 @@ Localidade apps/client/src/app/components/user-account-settings/user-account-settings.html - 95 + 107 @@ -2217,7 +2217,7 @@ Formato de números e datas apps/client/src/app/components/user-account-settings/user-account-settings.html - 97 + 109 @@ -2225,7 +2225,7 @@ Modo Zen apps/client/src/app/components/user-account-settings/user-account-settings.html - 141 + 153 apps/client/src/app/pages/features/features-page.html @@ -2237,7 +2237,7 @@ Aparência apps/client/src/app/components/user-account-settings/user-account-settings.html - 118 + 130 @@ -2245,7 +2245,7 @@ Auto apps/client/src/app/components/user-account-settings/user-account-settings.html - 130 + 142 @@ -2253,7 +2253,7 @@ Claro apps/client/src/app/components/user-account-settings/user-account-settings.html - 131 + 143 @@ -2261,7 +2261,7 @@ Escuro apps/client/src/app/components/user-account-settings/user-account-settings.html - 132 + 144 @@ -2269,7 +2269,7 @@ Iniciar sessão com impressão digital apps/client/src/app/components/user-account-settings/user-account-settings.html - 159 + 171 @@ -2277,7 +2277,7 @@ Funcionalidades Experimentais apps/client/src/app/components/user-account-settings/user-account-settings.html - 176 + 188 @@ -2285,7 +2285,7 @@ ID do Utilizador apps/client/src/app/components/user-account-settings/user-account-settings.html - 192 + 204 @@ -3521,31 +3521,31 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 62 + 74 apps/client/src/app/components/user-account-settings/user-account-settings.html - 66 + 78 apps/client/src/app/components/user-account-settings/user-account-settings.html - 70 + 82 apps/client/src/app/components/user-account-settings/user-account-settings.html - 74 + 86 apps/client/src/app/components/user-account-settings/user-account-settings.html - 78 + 90 apps/client/src/app/components/user-account-settings/user-account-settings.html - 82 + 94 apps/client/src/app/components/user-account-settings/user-account-settings.html - 86 + 98 apps/client/src/app/pages/features/features-page.html @@ -3729,7 +3729,7 @@ Experiência sem distrações para tempos turbulentos apps/client/src/app/components/user-account-settings/user-account-settings.html - 142 + 154 @@ -3737,7 +3737,7 @@ Acesso antecipado a funcionalidades futuras apps/client/src/app/components/user-account-settings/user-account-settings.html - 177 + 189 @@ -9777,7 +9777,7 @@ Biometric Authentication apps/client/src/app/components/user-account-settings/user-account-settings.html - 158 + 170 @@ -9861,7 +9861,7 @@ Export Data apps/client/src/app/components/user-account-settings/user-account-settings.html - 199 + 211 @@ -14196,6 +14196,14 @@ 126 + + If a translation is missing, kindly support us in extending it here. + If a translation is missing, kindly support us in extending it here. + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 53 + + diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index 87e293626..452005ea1 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -1370,31 +1370,31 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 62 + 74 apps/client/src/app/components/user-account-settings/user-account-settings.html - 66 + 78 apps/client/src/app/components/user-account-settings/user-account-settings.html - 70 + 82 apps/client/src/app/components/user-account-settings/user-account-settings.html - 74 + 86 apps/client/src/app/components/user-account-settings/user-account-settings.html - 78 + 90 apps/client/src/app/components/user-account-settings/user-account-settings.html - 82 + 94 apps/client/src/app/components/user-account-settings/user-account-settings.html - 86 + 98 apps/client/src/app/pages/features/features-page.html @@ -3861,7 +3861,7 @@ Zen Modu apps/client/src/app/components/user-account-settings/user-account-settings.html - 141 + 153 apps/client/src/app/pages/features/features-page.html @@ -11905,7 +11905,7 @@ Bu giriş yöntemini kaldırmayı gerçekten istiyor musunuz? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 183 + 187 @@ -12005,7 +12005,7 @@ Yerel Ayarlar apps/client/src/app/components/user-account-settings/user-account-settings.html - 95 + 107 @@ -12013,7 +12013,7 @@ Tarih ve Sayı Formatları apps/client/src/app/components/user-account-settings/user-account-settings.html - 97 + 109 @@ -12021,7 +12021,7 @@ Görünüm apps/client/src/app/components/user-account-settings/user-account-settings.html - 118 + 130 @@ -12029,7 +12029,7 @@ Otomatik apps/client/src/app/components/user-account-settings/user-account-settings.html - 130 + 142 @@ -12037,7 +12037,7 @@ Açık apps/client/src/app/components/user-account-settings/user-account-settings.html - 131 + 143 @@ -12045,7 +12045,7 @@ Koyu apps/client/src/app/components/user-account-settings/user-account-settings.html - 132 + 144 @@ -12053,7 +12053,7 @@ Çalkantılı zamanlar için dikkat dağıtmayan bir deneyim apps/client/src/app/components/user-account-settings/user-account-settings.html - 142 + 154 @@ -12061,7 +12061,7 @@ Biyometrik Kimlik Doğrulama apps/client/src/app/components/user-account-settings/user-account-settings.html - 158 + 170 @@ -12069,7 +12069,7 @@ Parmak iziyle oturum aç apps/client/src/app/components/user-account-settings/user-account-settings.html - 159 + 171 @@ -12077,7 +12077,7 @@ Deneysel Özellikler apps/client/src/app/components/user-account-settings/user-account-settings.html - 176 + 188 @@ -12085,7 +12085,7 @@ Gelecek özelliklere göz atın apps/client/src/app/components/user-account-settings/user-account-settings.html - 177 + 189 @@ -12093,7 +12093,7 @@ Kullanıcı Kimliği apps/client/src/app/components/user-account-settings/user-account-settings.html - 192 + 204 @@ -12101,7 +12101,7 @@ Verileri Dışa Aktar apps/client/src/app/components/user-account-settings/user-account-settings.html - 199 + 211 @@ -14196,6 +14196,14 @@ 126 + + If a translation is missing, kindly support us in extending it here. + If a translation is missing, kindly support us in extending it here. + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 53 + + diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index 5389769f7..9172b7fb6 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -1372,31 +1372,31 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 62 + 74 apps/client/src/app/components/user-account-settings/user-account-settings.html - 66 + 78 apps/client/src/app/components/user-account-settings/user-account-settings.html - 70 + 82 apps/client/src/app/components/user-account-settings/user-account-settings.html - 74 + 86 apps/client/src/app/components/user-account-settings/user-account-settings.html - 78 + 90 apps/client/src/app/components/user-account-settings/user-account-settings.html - 82 + 94 apps/client/src/app/components/user-account-settings/user-account-settings.html - 86 + 98 apps/client/src/app/pages/features/features-page.html @@ -3542,7 +3542,7 @@ Do you really want to remove this sign in method? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 183 + 187 @@ -3584,49 +3584,49 @@ Locale apps/client/src/app/components/user-account-settings/user-account-settings.html - 95 + 107 Date and number format apps/client/src/app/components/user-account-settings/user-account-settings.html - 97 + 109 Appearance apps/client/src/app/components/user-account-settings/user-account-settings.html - 118 + 130 Auto apps/client/src/app/components/user-account-settings/user-account-settings.html - 130 + 142 Light apps/client/src/app/components/user-account-settings/user-account-settings.html - 131 + 143 Dark apps/client/src/app/components/user-account-settings/user-account-settings.html - 132 + 144 Zen Mode apps/client/src/app/components/user-account-settings/user-account-settings.html - 141 + 153 apps/client/src/app/pages/features/features-page.html @@ -3637,49 +3637,49 @@ Distraction-free experience for turbulent times apps/client/src/app/components/user-account-settings/user-account-settings.html - 142 + 154 Biometric Authentication apps/client/src/app/components/user-account-settings/user-account-settings.html - 158 + 170 Sign in with fingerprint apps/client/src/app/components/user-account-settings/user-account-settings.html - 159 + 171 Experimental Features apps/client/src/app/components/user-account-settings/user-account-settings.html - 176 + 188 Sneak peek at upcoming functionality apps/client/src/app/components/user-account-settings/user-account-settings.html - 177 + 189 User ID apps/client/src/app/components/user-account-settings/user-account-settings.html - 192 + 204 Export Data apps/client/src/app/components/user-account-settings/user-account-settings.html - 199 + 211 @@ -13607,6 +13607,13 @@ 399 + + If a translation is missing, kindly support us in extending it here. + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 53 + + From 9f7fcb8f6e7803980c99dd9d332ddfa93797bcc8 Mon Sep 17 00:00:00 2001 From: Daniel Devaud Date: Sun, 31 Dec 2023 11:55:23 +0100 Subject: [PATCH 22/38] Revert "Feature/upgrade to nx version 17.2.5 (#2756)" This reverts commit 7dc8f80fdf75dfd109db4a1227bdadbfbd8d8917. --- CHANGELOG.md | 2 - apps/api/project.json | 3 +- apps/api/webpack.config.js | 6 - apps/client/project.json | 26 +- package.json | 78 +- yarn.lock | 2400 +++++++++++++----------------------- 6 files changed, 892 insertions(+), 1623 deletions(-) delete mode 100644 apps/api/webpack.config.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 7b6a834af..216ab0b13 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -43,9 +43,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Introduced the lazy-loaded activities table to the position detail dialog (experimental) - Improved the font weight in the value component - Improved the language localization for Türkçe (`tr`) -- Upgraded `angular` from version `17.0.4` to `17.0.7` - Upgraded to _Inter_ 4 font family -- Upgraded `Nx` from version `17.0.2` to `17.2.5` ### Fixed diff --git a/apps/api/project.json b/apps/api/project.json index f3c8bd1e0..397a753ec 100644 --- a/apps/api/project.json +++ b/apps/api/project.json @@ -14,8 +14,7 @@ "tsConfig": "apps/api/tsconfig.app.json", "assets": ["apps/api/src/assets"], "target": "node", - "compiler": "tsc", - "webpackConfig": "apps/api/webpack.config.js" + "compiler": "tsc" }, "configurations": { "production": { diff --git a/apps/api/webpack.config.js b/apps/api/webpack.config.js deleted file mode 100644 index 2cc38b985..000000000 --- a/apps/api/webpack.config.js +++ /dev/null @@ -1,6 +0,0 @@ -const { composePlugins, withNx } = require('@nx/webpack'); - -module.exports = composePlugins(withNx(), (config, { options, context }) => { - // Customize webpack config here - return config; -}); diff --git a/apps/client/project.json b/apps/client/project.json index 26292ffee..b61f02535 100644 --- a/apps/client/project.json +++ b/apps/client/project.json @@ -150,48 +150,48 @@ } }, "serve": { - "executor": "@nx/angular:dev-server", + "executor": "@nx/angular:webpack-dev-server", "options": { "proxyConfig": "apps/client/proxy.conf.json", - "buildTarget": "client:build" + "browserTarget": "client:build" }, "configurations": { "development-de": { - "buildTarget": "client:build:development-de" + "browserTarget": "client:build:development-de" }, "development-en": { - "buildTarget": "client:build:development-en" + "browserTarget": "client:build:development-en" }, "development-es": { - "buildTarget": "client:build:development-es" + "browserTarget": "client:build:development-es" }, "development-fr": { - "buildTarget": "client:build:development-fr" + "browserTarget": "client:build:development-fr" }, "development-it": { - "buildTarget": "client:build:development-it" + "browserTarget": "client:build:development-it" }, "development-nl": { - "buildTarget": "client:build:development-nl" + "browserTarget": "client:build:development-nl" }, "development-pl": { - "buildTarget": "client:build:development-pl" + "browserTarget": "client:build:development-pl" }, "development-pt": { - "buildTarget": "client:build:development-pt" + "browserTarget": "client:build:development-pt" }, "development-tr": { - "buildTarget": "client:build:development-tr" + "browserTarget": "client:build:development-tr" }, "production": { - "buildTarget": "client:build:production" + "browserTarget": "client:build:production" } } }, "extract-i18n": { "executor": "ng-extract-i18n-merge:ng-extract-i18n-merge", "options": { - "buildTarget": "client:build", + "browserTarget": "client:build", "includeContext": true, "outputPath": "src/locales", "targetFiles": [ diff --git a/package.json b/package.json index d79e377ca..8fcf54808 100644 --- a/package.json +++ b/package.json @@ -53,17 +53,17 @@ "workspace-generator": "nx workspace-generator" }, "dependencies": { - "@angular/animations": "17.0.7", - "@angular/cdk": "17.0.4", - "@angular/common": "17.0.7", - "@angular/compiler": "17.0.7", - "@angular/core": "17.0.7", - "@angular/forms": "17.0.7", - "@angular/material": "17.0.4", - "@angular/platform-browser": "17.0.7", - "@angular/platform-browser-dynamic": "17.0.7", - "@angular/router": "17.0.7", - "@angular/service-worker": "17.0.7", + "@angular/animations": "17.0.4", + "@angular/cdk": "17.0.1", + "@angular/common": "17.0.4", + "@angular/compiler": "17.0.4", + "@angular/core": "17.0.4", + "@angular/forms": "17.0.4", + "@angular/material": "17.0.1", + "@angular/platform-browser": "17.0.4", + "@angular/platform-browser-dynamic": "17.0.4", + "@angular/router": "17.0.4", + "@angular/service-worker": "17.0.4", "@codewithdan/observable-store": "2.2.15", "@dfinity/agent": "0.15.7", "@dfinity/auth-client": "0.15.7", @@ -134,34 +134,34 @@ "zone.js": "0.14.2" }, "devDependencies": { - "@angular-devkit/build-angular": "17.0.7", - "@angular-devkit/core": "17.0.7", - "@angular-devkit/schematics": "17.0.7", - "@angular-eslint/eslint-plugin": "17.1.1", - "@angular-eslint/eslint-plugin-template": "17.1.1", - "@angular-eslint/template-parser": "17.1.1", - "@angular/cli": "17.0.7", - "@angular/compiler-cli": "17.0.7", - "@angular/language-service": "17.0.7", - "@angular/localize": "17.0.7", - "@angular/pwa": "17.0.7", + "@angular-devkit/build-angular": "17.0.3", + "@angular-devkit/core": "17.0.3", + "@angular-devkit/schematics": "17.0.3", + "@angular-eslint/eslint-plugin": "17.1.0", + "@angular-eslint/eslint-plugin-template": "17.1.0", + "@angular-eslint/template-parser": "17.1.0", + "@angular/cli": "17.0.3", + "@angular/compiler-cli": "17.0.4", + "@angular/language-service": "17.0.4", + "@angular/localize": "17.0.4", + "@angular/pwa": "17.0.3", "@nestjs/schematics": "10.0.1", "@nestjs/testing": "10.1.3", - "@nx/angular": "17.2.5", - "@nx/cypress": "17.2.5", - "@nx/eslint-plugin": "17.2.5", - "@nx/jest": "17.2.5", - "@nx/js": "17.2.5", - "@nx/nest": "17.2.5", - "@nx/node": "17.2.5", - "@nx/storybook": "17.2.5", - "@nx/web": "17.2.5", - "@nx/workspace": "17.2.5", + "@nx/angular": "17.0.2", + "@nx/cypress": "17.0.2", + "@nx/eslint-plugin": "17.0.2", + "@nx/jest": "17.0.2", + "@nx/js": "17.0.2", + "@nx/nest": "17.0.2", + "@nx/node": "17.0.2", + "@nx/storybook": "17.0.2", + "@nx/web": "17.0.2", + "@nx/workspace": "17.0.2", "@schematics/angular": "17.0.0", "@simplewebauthn/typescript-types": "8.0.0", - "@storybook/addon-essentials": "7.6.5", - "@storybook/angular": "7.6.5", - "@storybook/core-server": "7.6.5", + "@storybook/addon-essentials": "7.5.3", + "@storybook/angular": "7.5.3", + "@storybook/core-server": "7.5.3", "@types/big.js": "6.1.6", "@types/body-parser": "1.19.2", "@types/cache-manager": "3.4.2", @@ -169,7 +169,7 @@ "@types/google-spreadsheet": "3.1.5", "@types/jest": "29.4.4", "@types/lodash": "4.14.195", - "@types/node": "18.16.9", + "@types/node": "20.4.2", "@types/papaparse": "5.3.7", "@types/passport-google-oauth20": "2.0.11", "@typescript-eslint/eslint-plugin": "5.51.0", @@ -186,9 +186,9 @@ "import-sort-style-module": "6.0.0", "jest": "29.4.3", "jest-environment-jsdom": "29.4.3", - "jest-preset-angular": "13.1.4", - "nx": "17.2.5", - "prettier": "3.1.1", + "jest-preset-angular": "13.1.3", + "nx": "17.0.2", + "prettier": "3.1.0", "prettier-plugin-organize-attributes": "1.0.0", "react": "18.2.0", "react-dom": "18.2.0", diff --git a/yarn.lock b/yarn.lock index 23d2381bd..56a38aebe 100644 --- a/yarn.lock +++ b/yarn.lock @@ -20,12 +20,12 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@angular-devkit/architect@0.1700.7": - version "0.1700.7" - resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1700.7.tgz#6137deee169704de6c675023cddb3f4e1d6ae2e9" - integrity sha512-32uitQKsYLGXAKoXBsmOnPsTt9pS+b9cnFI9ZvBFVhJ31I2EOM7vGcMFalhTxdB/DkVHk4TyO78efV0V26DwCA== +"@angular-devkit/architect@0.1700.3": + version "0.1700.3" + resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1700.3.tgz#da4ea29ace15f54306e9b9d1b6216300e9693f93" + integrity sha512-HUjx7vD16paWXHKHYc2LsSn/kaYbFr2YNnlzuSr9C0kauKS1e7sRpRvtGwQzXfohzgyKi81AAU5uA2KLRGq83w== dependencies: - "@angular-devkit/core" "17.0.7" + "@angular-devkit/core" "17.0.3" rxjs "7.8.1" "@angular-devkit/architect@^0.1301.0 || ^0.1401.0 || ^0.1501.0 || ^0.1601.0 || ^0.1700.0": @@ -36,15 +36,15 @@ "@angular-devkit/core" "17.0.0" rxjs "7.8.1" -"@angular-devkit/build-angular@17.0.7": - version "17.0.7" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-17.0.7.tgz#0edbda90050efe7e0c9d9500144af05eebfc347b" - integrity sha512-AtEzLk6n6BXqQzk0Bsupe6GV0IgUe7RbpBfqROi+NZqMA7OUAHCX3xA6M68Qu+5KxBtW7T5lHeZZ7iP/y39wtQ== +"@angular-devkit/build-angular@17.0.3": + version "17.0.3" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-17.0.3.tgz#d0e284d22363e780e97bc9f7de3fb41b4af9115f" + integrity sha512-1lx0mERC1eTHX4vf8q7kUHZNHS0jwZxbwYHAISOplwHjkzRociX0W6rx04yMXn2NCSNhK+w3xbWyAIgyYbP9nA== dependencies: "@ampproject/remapping" "2.2.1" - "@angular-devkit/architect" "0.1700.7" - "@angular-devkit/build-webpack" "0.1700.7" - "@angular-devkit/core" "17.0.7" + "@angular-devkit/architect" "0.1700.3" + "@angular-devkit/build-webpack" "0.1700.3" + "@angular-devkit/core" "17.0.3" "@babel/core" "7.23.2" "@babel/generator" "7.23.0" "@babel/helper-annotate-as-pure" "7.22.5" @@ -55,7 +55,7 @@ "@babel/preset-env" "7.23.2" "@babel/runtime" "7.23.2" "@discoveryjs/json-ext" "0.5.7" - "@ngtools/webpack" "17.0.7" + "@ngtools/webpack" "17.0.3" "@vitejs/plugin-basic-ssl" "1.0.1" ansi-colors "4.1.3" autoprefixer "10.4.16" @@ -100,7 +100,7 @@ tree-kill "1.2.2" tslib "2.6.2" undici "5.27.2" - vite "4.5.1" + vite "4.5.0" webpack "5.89.0" webpack-dev-middleware "6.1.1" webpack-dev-server "4.15.1" @@ -109,12 +109,12 @@ optionalDependencies: esbuild "0.19.5" -"@angular-devkit/build-webpack@0.1700.7": - version "0.1700.7" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.1700.7.tgz#896520220b5b09f8e9a9c617ee0d9caabb489766" - integrity sha512-B9Mg/qYDpE5my8PJ3VPQyRSUV0Oq1bFUzU8s0ZpqEZl1URKc04pm0LtLmebrMIcUZgDiGk0RHaD+O1E9IV/bdQ== +"@angular-devkit/build-webpack@0.1700.3": + version "0.1700.3" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.1700.3.tgz#17ae76a0666d9df612e3727f3a617c86a7daf668" + integrity sha512-r8nVakAnwV5Yy2AjWDpdcGUjHRQBcPljZDhX5tX2H7M3bxD6zG5owXDy8XmG64A7U1jd6D7dQv7zoW/tZwpYvw== dependencies: - "@angular-devkit/architect" "0.1700.7" + "@angular-devkit/architect" "0.1700.3" rxjs "7.8.1" "@angular-devkit/core@16.0.1": @@ -151,10 +151,10 @@ rxjs "7.8.1" source-map "0.7.4" -"@angular-devkit/core@17.0.7": - version "17.0.7" - resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-17.0.7.tgz#a11b04b4d51103ce456c49739a34d129e34a9dc5" - integrity sha512-vATobHo5O5tJba424hJfQWLb40GzvZPNsI74dcgSUTgrDph8ksmk5xB9OvEvf0INorQZ2IMphj/VIWj4/+JqSA== +"@angular-devkit/core@17.0.3": + version "17.0.3" + resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-17.0.3.tgz#c89af851efb52698827d005b223bf74364144aad" + integrity sha512-SOngD3rKnwZWhhUV68AYlH8M3LRGvF69jnDrYKwtRy1ESqSH7tt+1vexGC290gKvqH7bNMgYv8f5BS1AASRfzw== dependencies: ajv "8.12.0" ajv-formats "2.1.1" @@ -196,83 +196,83 @@ ora "5.4.1" rxjs "7.8.1" -"@angular-devkit/schematics@17.0.7": - version "17.0.7" - resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-17.0.7.tgz#35f085d5b3da249c3d8513be5613d02219fedb2e" - integrity sha512-BY11OkJkM3xyXcvyD7x5kGY/c8Ufd4AfPvI0D9imhVxbns45Q48b1DlvCQvSnCJ/s+OwnkrYb/Efa70ZiaGu8A== +"@angular-devkit/schematics@17.0.3": + version "17.0.3" + resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-17.0.3.tgz#854877856751b2e8350eaa24645ee92ad9f6c6a9" + integrity sha512-gNocyYuNJRd24+JSM5kpO7g9Vg4THcoH5It8nJmS3muelLHDzegvDzXB7iPBjVR8Lxts6sbifYdIkKencUc4vg== dependencies: - "@angular-devkit/core" "17.0.7" + "@angular-devkit/core" "17.0.3" jsonc-parser "3.2.0" magic-string "0.30.5" ora "5.4.1" rxjs "7.8.1" -"@angular-eslint/bundled-angular-compiler@17.1.1": - version "17.1.1" - resolved "https://registry.yarnpkg.com/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-17.1.1.tgz#fdd9c0b7497efc6ee918502dd008290625afb903" - integrity sha512-xRlSh9qjdUdUKAy/0UQsxX7wf1tHApAsHsfismebPriqfmVAPyEg4HBrM8ImWaZxiqaTGC1AyHsUBQD5FK8o6w== +"@angular-eslint/bundled-angular-compiler@17.1.0": + version "17.1.0" + resolved "https://registry.yarnpkg.com/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-17.1.0.tgz#71494f60ddb0cfabb047446a1d8a914f6a83eae4" + integrity sha512-Y+CN/8nQZaYjsb2b2sXbkQr0LrgBWhCzyLZ+rLfnLE60B9k4GeDt5b7z/OdSObi1xozXfqiaAZ1eXo0iQMN3JA== -"@angular-eslint/eslint-plugin-template@17.1.1": - version "17.1.1" - resolved "https://registry.yarnpkg.com/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-17.1.1.tgz#18862e2c5361a8ba885e975e8fd6706e63420f09" - integrity sha512-unZ6QNwtxuB8Eni7UPdw7uK6iZipZUXIsH+ZuLMOxwFgGMqeRnpv8SW0212rto3d/Ec0jESzVHKcwZ9pT+jxgw== +"@angular-eslint/eslint-plugin-template@17.1.0": + version "17.1.0" + resolved "https://registry.yarnpkg.com/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-17.1.0.tgz#34aba27cd5054dc63561349aad0aa7534b53cd77" + integrity sha512-nL9VhChwFQLIRQM4xbTY8Vo095Q4/D77hPtqt3ShYIrORjYTwaWa8+neexToAqXVMapce7oFmFa/OqtxvEerLg== dependencies: - "@angular-eslint/bundled-angular-compiler" "17.1.1" - "@angular-eslint/utils" "17.1.1" - "@typescript-eslint/type-utils" "6.13.1" - "@typescript-eslint/utils" "6.13.1" + "@angular-eslint/bundled-angular-compiler" "17.1.0" + "@angular-eslint/utils" "17.1.0" + "@typescript-eslint/type-utils" "6.11.0" + "@typescript-eslint/utils" "6.11.0" aria-query "5.3.0" axobject-query "4.0.0" -"@angular-eslint/eslint-plugin@17.1.1": - version "17.1.1" - resolved "https://registry.yarnpkg.com/@angular-eslint/eslint-plugin/-/eslint-plugin-17.1.1.tgz#d17cec6d7a4575d0c6bc6a306e4b7b57b64c23e4" - integrity sha512-fFOBlCOVObVu3gjLj+0BypqO1ZR/0bfJnDElqMdYwJG7zRaFT8NNQbrOo/q/GQoqOFoNna6mw3teTGsd5JnL2A== +"@angular-eslint/eslint-plugin@17.1.0": + version "17.1.0" + resolved "https://registry.yarnpkg.com/@angular-eslint/eslint-plugin/-/eslint-plugin-17.1.0.tgz#461be368ba0558a4a648a1da0eca0cbb56407e48" + integrity sha512-pQac5h+XwsquDzaasK/xs9tjdQ/f9eLq8e5An9eXJGHWy4KcrMmQ1XrpaMMMg503LF3rRG/dHKBskGsYgSN9oQ== dependencies: - "@angular-eslint/utils" "17.1.1" - "@typescript-eslint/utils" "6.13.1" + "@angular-eslint/utils" "17.1.0" + "@typescript-eslint/utils" "6.11.0" -"@angular-eslint/template-parser@17.1.1": - version "17.1.1" - resolved "https://registry.yarnpkg.com/@angular-eslint/template-parser/-/template-parser-17.1.1.tgz#a3a52d18cae276c9d1d67a69a663dd0b404ffaf5" - integrity sha512-ofL46rNhRVeSxrSQF0vwhKMco+vJuo+ZGjSOzFmT9N3KAMB0j+WXTbpyGGMy0gQSBc4W6p+j+zxGa2CR2xb6wA== +"@angular-eslint/template-parser@17.1.0": + version "17.1.0" + resolved "https://registry.yarnpkg.com/@angular-eslint/template-parser/-/template-parser-17.1.0.tgz#27b670b6ec1b1b8d1fc01a23d3ab53cc54bc1e3c" + integrity sha512-CTxzB3stjynngTabdO8xTkiPc6Jvo15C2fxb1pYIlDIH2LgPJJxxCHi+IAt9oJpJOPa8QjLVF9VAXE3fLKAcpg== dependencies: - "@angular-eslint/bundled-angular-compiler" "17.1.1" + "@angular-eslint/bundled-angular-compiler" "17.1.0" eslint-scope "^7.0.0" -"@angular-eslint/utils@17.1.1": - version "17.1.1" - resolved "https://registry.yarnpkg.com/@angular-eslint/utils/-/utils-17.1.1.tgz#e24a01a797285c4bac468cfbc3fd862b480652b6" - integrity sha512-CTNPOb05S/DII/Fm8JYUvKo+B4u/ctHjGJ0X1YXUR0q31oaGqTE3KePGq76+Y6swRDf9NjUIcfcnZp3u3j4CBQ== +"@angular-eslint/utils@17.1.0": + version "17.1.0" + resolved "https://registry.yarnpkg.com/@angular-eslint/utils/-/utils-17.1.0.tgz#eb8a8855d6ae30649cccdf869d0b556a6f6ed7ba" + integrity sha512-AmG0xpRtnBQwrbHObonSilmD3hiFEtZHwFY3LT28VWxznB6WIAHFE7SrKWrRsRsXlib8LaRo4uobR5+MO8aLpw== dependencies: - "@angular-eslint/bundled-angular-compiler" "17.1.1" - "@typescript-eslint/utils" "6.13.1" + "@angular-eslint/bundled-angular-compiler" "17.1.0" + "@typescript-eslint/utils" "6.11.0" -"@angular/animations@17.0.7": - version "17.0.7" - resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-17.0.7.tgz#0a9f212ea615014c0e646978fd8a5a52cb85a179" - integrity sha512-IjZjPGMxvi2a9o7fzjwNO44FvhTZlVSgcPtqM6Glq0+WVeQcnZxf1Onj68M/FGx2AunS8elRbrgPxTexVeSo7A== +"@angular/animations@17.0.4": + version "17.0.4" + resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-17.0.4.tgz#8c12976c2f80bff53095dd86f4c421a8f6bd17d9" + integrity sha512-XHkTBZAoYf1t4Hb06RkYa6cgtjEA5JGq1ArXu/DckOS6G/ZuY+dwWULEmaf9ejJem8O78ol223ZQ5d7sXqpixQ== dependencies: tslib "^2.3.0" -"@angular/cdk@17.0.4": - version "17.0.4" - resolved "https://registry.yarnpkg.com/@angular/cdk/-/cdk-17.0.4.tgz#02ea9ae9b85d29b6eb1ac4c63a3fc175767b4d59" - integrity sha512-mh/EuIR0NPfpNqAXBSZWuJeBMXUvUDYdKhiFWZet5NLO1bDgFe1MGLBjtW4us95k4BZsMLbCKNxJgc+4JqwUvg== +"@angular/cdk@17.0.1": + version "17.0.1" + resolved "https://registry.yarnpkg.com/@angular/cdk/-/cdk-17.0.1.tgz#f1852c79ed0c34ef5f76014c048d1184174b5b50" + integrity sha512-0hrXm2D0s0/vUtDoLFRWTs75k5WY/hQmfnsaJXHeqinbE3eKOxmQxL1i7ymnMSQthEWzgRAhzS3Nfs7Alw3dQA== dependencies: tslib "^2.3.0" optionalDependencies: parse5 "^7.1.2" -"@angular/cli@17.0.7": - version "17.0.7" - resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-17.0.7.tgz#ecdcbf4cd3400d56871b64b644195a4a2a6cb580" - integrity sha512-oSa0GVAQNA7wFbLJYeaO3kV4iUcbKEqXDLxcIE8s1GfHddBOlXH2P1T4fXonCBl5qvV+joP0G0+fs7I0w2utZQ== +"@angular/cli@17.0.3": + version "17.0.3" + resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-17.0.3.tgz#2a2450c5e26f6bc19f0b9086ef541d2ef466374d" + integrity sha512-pRGXms87aEqmB4yPdcPI/VM7JegjDcBIeLadms0wrBkoyQiv+jL5LesxODhid6ujXZOj1xqMCYbCnX7HY+mLcQ== dependencies: - "@angular-devkit/architect" "0.1700.7" - "@angular-devkit/core" "17.0.7" - "@angular-devkit/schematics" "17.0.7" - "@schematics/angular" "17.0.7" + "@angular-devkit/architect" "0.1700.3" + "@angular-devkit/core" "17.0.3" + "@angular-devkit/schematics" "17.0.3" + "@schematics/angular" "17.0.3" "@yarnpkg/lockfile" "1.1.0" ansi-colors "4.1.3" ini "4.1.1" @@ -288,17 +288,17 @@ symbol-observable "4.0.0" yargs "17.7.2" -"@angular/common@17.0.7": - version "17.0.7" - resolved "https://registry.yarnpkg.com/@angular/common/-/common-17.0.7.tgz#8222a94f3ffae119920c0857118d8fa01cc89740" - integrity sha512-bPPL6x0KOAOTxKSE2j4EWmEUOnqZYzOYiHzroa5b9UEyA9NvGkd9bm3zIxw8xcndRj1Ehcmvpi6KBLcYBBbWfg== +"@angular/common@17.0.4": + version "17.0.4" + resolved "https://registry.yarnpkg.com/@angular/common/-/common-17.0.4.tgz#d15ee599560c5d1bed2412498eae6d9728e90e21" + integrity sha512-/y38PbuiaWOuOmP5ZELTlJSjZGijc6Nq2XQloT5pKsaH935prxPjyWazwlY6cUnJMQgSRU644/ULosDJec7Zxw== dependencies: tslib "^2.3.0" -"@angular/compiler-cli@17.0.7": - version "17.0.7" - resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-17.0.7.tgz#7fa39624bbc2e5b2311087ecffdc83aed5d84f1b" - integrity sha512-YnL38idjIYtl3BXYpv+sVJKWGbUjHT6eyQSQVAfO/1AwWqVa21K9hnE+Q37VmUKEcKFMnQembeuErA+KVsGI6A== +"@angular/compiler-cli@17.0.4": + version "17.0.4" + resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-17.0.4.tgz#fcb0f89e346188ebaa7aa01725a1f54bc350bdbb" + integrity sha512-ywj8XNI+hvHHYGcNWvXaVHSRtcd3S7MqJNgXWfnb0JjAb282oGSvjEc7wnH4ERqkvnSrpk1kQ2Fj3uJ2P5zfmQ== dependencies: "@babel/core" "7.23.2" "@jridgewell/sourcemap-codec" "^1.4.14" @@ -309,10 +309,10 @@ tslib "^2.3.0" yargs "^17.2.1" -"@angular/compiler@17.0.7": - version "17.0.7" - resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-17.0.7.tgz#cb695fccaa5dbb51f380f835d81dddb9039d8bcb" - integrity sha512-QHPuLti2c2tGZmOGZ0cfCHo4LxiHUkC27I0aZFDyQSSQqEI5obQGVlEREHysw0nsS3sYIcLvqcwcKcRtXlXtxQ== +"@angular/compiler@17.0.4": + version "17.0.4" + resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-17.0.4.tgz#9e8ad18b59acf9d5b05239cee06e3cb3e6af302f" + integrity sha512-OweJui9EWCa1ZcZjkJHS5z1gqICqyryR1Gdmyr8vIa6HD8wU/5BaeBJPCDgYgt+qJkvcT/sPxgZQsc2pVeUwbQ== dependencies: tslib "^2.3.0" @@ -321,10 +321,10 @@ resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-9.0.0.tgz#87e0bef4c369b6cadae07e3a4295778fc93799d5" integrity sha512-ctjwuntPfZZT2mNj2NDIVu51t9cvbhl/16epc5xEwyzyDt76pX9UgwvY+MbXrf/C/FWwdtmNtfP698BKI+9leQ== -"@angular/core@17.0.7": - version "17.0.7" - resolved "https://registry.yarnpkg.com/@angular/core/-/core-17.0.7.tgz#ab1a38824d60fd07e533c0f03386c4a5a84f3749" - integrity sha512-mEkelXkzEi6+A9GjdKOSGGzQAfo1iAjVTn6YsplNUeGE5JgDZYZ7sXGQqs0Lin7dzJxnPAgGjCOl7SpWLXIPSQ== +"@angular/core@17.0.4": + version "17.0.4" + resolved "https://registry.yarnpkg.com/@angular/core/-/core-17.0.4.tgz#92af147b2160dafaecc87397da7ccc93066681f8" + integrity sha512-zk+z5sYPZd87pLxECx27quB5FvSmoi9PjJlcSlaBwwqaGnh/tPJI14u3q1dRY/CoZgP9egEiwc428+DzvOzJew== dependencies: tslib "^2.3.0" @@ -333,31 +333,31 @@ resolved "https://registry.yarnpkg.com/@angular/core/-/core-9.0.0.tgz#227dc53e1ac81824f998c6e76000b7efc522641e" integrity sha512-6Pxgsrf0qF9iFFqmIcWmjJGkkCaCm6V5QNnxMy2KloO3SDq6QuMVRbN9RtC8Urmo25LP+eZ6ZgYqFYpdD8Hd9w== -"@angular/forms@17.0.7": - version "17.0.7" - resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-17.0.7.tgz#b8d1ffbe565567c529b0b9ac3e9f7cb51f24c655" - integrity sha512-28BxRxEmgZIofGwVp6s2v3ri/kuWW+/EY/ZXhavlWKJEh4ATJl72k0RkRWNcQi4wnvn0Qb8tFdnVJnvRZvvKEw== +"@angular/forms@17.0.4": + version "17.0.4" + resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-17.0.4.tgz#a5aafcf99893710741c6ee5f20370643f59c42f7" + integrity sha512-R5J87dfJNWwi5SESD7tRkZnqG4u8KNAT4vImX4oG70/6vWioKUSWpLoSp1gpzy9UW51E85AKb8DNvIex7LclSg== dependencies: tslib "^2.3.0" -"@angular/language-service@17.0.7": - version "17.0.7" - resolved "https://registry.yarnpkg.com/@angular/language-service/-/language-service-17.0.7.tgz#2bc73f177bfe90b79d3011964633364b0670f21f" - integrity sha512-03EXeBZgyGNnEDLiABwEw0lpAcqLxSgl+bXQahOO4OnBSYQWGEiqfs3ymNbNj0chUfQVadG4FWghwGTGbj77Iw== +"@angular/language-service@17.0.4": + version "17.0.4" + resolved "https://registry.yarnpkg.com/@angular/language-service/-/language-service-17.0.4.tgz#447b3cad29f841d805ab2345e5327fcb05108c7b" + integrity sha512-foS5HLIj6rZ/WMg1Zo1BPCaFP93GdJ6vG3f7ieHodiSeOexxzi2WqB7uh0yDYMqoemu/+YNYbOgrxBTkOpsoLg== -"@angular/localize@17.0.7": - version "17.0.7" - resolved "https://registry.yarnpkg.com/@angular/localize/-/localize-17.0.7.tgz#46b6623734c7e46070125f5ff29bf34dc83cad36" - integrity sha512-avYYQ8zin2thzvsH2YP3WxlwkvOzjNEXxjv4yyZBx6wul68e/753kQK/0RmSUYaBpDTUEZYzrPpDay00TKwBOA== +"@angular/localize@17.0.4": + version "17.0.4" + resolved "https://registry.yarnpkg.com/@angular/localize/-/localize-17.0.4.tgz#f7454e955a15a90a76c2bfbd3df5db7768d066cd" + integrity sha512-4kLvkwAI9lVaxKzMVjF/0do/Xfn4r3W1bk9Xzb7fYLS21wz11ouL0aV7umtHT5DOZiwkY/F8rOYaJm5Fkz8ubw== dependencies: "@babel/core" "7.23.2" fast-glob "3.3.1" yargs "^17.2.1" -"@angular/material@17.0.4": - version "17.0.4" - resolved "https://registry.yarnpkg.com/@angular/material/-/material-17.0.4.tgz#d3d7b093ae09662f18b04a27cfccfab8f4182895" - integrity sha512-IKkys4EavE1TMHApPMbFLvJU4pP8S8XNfY2eS7/kFwW7eyTcz0zV/IKeBbxkpej19MaouozU+KWeRJtxHg6x8g== +"@angular/material@17.0.1": + version "17.0.1" + resolved "https://registry.yarnpkg.com/@angular/material/-/material-17.0.1.tgz#ecfd1b88eb8838c4f59a2baaa49081a6954badd4" + integrity sha512-avicxHCJAeg26Tg8z6+g54tMTQZPP5kaaRmkd97QGtJn3wKiAen6WOgmEhlrA4jPJ71CsdyxcUruEX+BHB6X4Q== dependencies: "@material/animation" "15.0.0-canary.a246a4439.0" "@material/auto-init" "15.0.0-canary.a246a4439.0" @@ -408,40 +408,40 @@ "@material/typography" "15.0.0-canary.a246a4439.0" tslib "^2.3.0" -"@angular/platform-browser-dynamic@17.0.7": - version "17.0.7" - resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-17.0.7.tgz#a2404d4625f17078c6de595bbddb6011eda2f74a" - integrity sha512-OquwUX9fLWA2JUZW5Jm6atk0CPt0sA7Tg24eGLsr6g1XfTS7jRZprlGaa72NgPLnQVV6m84o/ZiNYS6yPmq1Gg== +"@angular/platform-browser-dynamic@17.0.4": + version "17.0.4" + resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-17.0.4.tgz#71ccbbee8c76e72a469c23671b5ab9a25705b93c" + integrity sha512-mZZNH+iFzFug0z7rBQKdFz375sR6Y4iBbHu2aJD2BpgA2/SJaZ0WHGlF4bHbtpCYkZi3f4wKF2+Cwe4G5ebPOQ== dependencies: tslib "^2.3.0" -"@angular/platform-browser@17.0.7": - version "17.0.7" - resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-17.0.7.tgz#9f7f048be9b584254d468cc4d1be772ff2b08288" - integrity sha512-bm9/wt51nc/MPjft/FlRNIgFSeLjDtfJOT7M32Rt6kOHhNKSK7ZTPWdMe9ahuHSbAhLzd0G/4NsT5sKrWSeVZg== +"@angular/platform-browser@17.0.4": + version "17.0.4" + resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-17.0.4.tgz#aa52dd99adaabf363b0329abe9c310950bea0672" + integrity sha512-lApUzVPfCEz/4aot77qzWUNg7yQgT0JSzy3BrBm95+2TbgH894J9Fswhig0sEN9jxGSkc3A5Yp5fs1HJcPqUiw== dependencies: tslib "^2.3.0" -"@angular/pwa@17.0.7": - version "17.0.7" - resolved "https://registry.yarnpkg.com/@angular/pwa/-/pwa-17.0.7.tgz#45ddec964364e6c6dd0f765351b31d7aef215d10" - integrity sha512-VY5uuoC/NWpoFVSfoTYduQlMxdMLCJConPmK39NxOkhMW7KSphNwwY8tYjoDEUZwyhAooBT7QMi6EnSOrEi9Bg== +"@angular/pwa@17.0.3": + version "17.0.3" + resolved "https://registry.yarnpkg.com/@angular/pwa/-/pwa-17.0.3.tgz#ad0afcf9d09df531e5acbc708b66dbe3395df9a5" + integrity sha512-iEZytW23EzDIAl6dkFd468a8lJB9DyBa3gSmijH11jQuqfY/NqAUfjEnoA9vS+IEgwiHUzDuLl+3HykjAsB1Gg== dependencies: - "@angular-devkit/schematics" "17.0.7" - "@schematics/angular" "17.0.7" + "@angular-devkit/schematics" "17.0.3" + "@schematics/angular" "17.0.3" parse5-html-rewriting-stream "7.0.0" -"@angular/router@17.0.7": - version "17.0.7" - resolved "https://registry.yarnpkg.com/@angular/router/-/router-17.0.7.tgz#a1bc4f49ad2f0bb1f6e1ab0a0e63d92836d7cbea" - integrity sha512-rUFPe1uDlYYw6+3Gq68czW7WxBH7zT/D3UsT1otqwUV4RnQQsVze4fIit9FqJh7tuP4y3WpB4XBNf7p7Oi6TJw== +"@angular/router@17.0.4": + version "17.0.4" + resolved "https://registry.yarnpkg.com/@angular/router/-/router-17.0.4.tgz#2cc0c79c26206ac4085f2d452b39712e4230f799" + integrity sha512-hQ+T+h6YE9NqyOmjqAIHe/k8xtW+yh0Mp8FCcl8REBezNyLXmOdsScCIOOc7GeFtbjRnQyJrBo4QxZ81acHP7Q== dependencies: tslib "^2.3.0" -"@angular/service-worker@17.0.7": - version "17.0.7" - resolved "https://registry.yarnpkg.com/@angular/service-worker/-/service-worker-17.0.7.tgz#3d0e26f04b61af9e0360d1ead50335d11bee69f8" - integrity sha512-R/KDgnq5gV9XRv1B8zQqWz64pJ3fb0oFwCkB+w07llbxC9KDUS4MLbMmN3q/TSLOshGzs4sszNVyWGKAiTP13g== +"@angular/service-worker@17.0.4": + version "17.0.4" + resolved "https://registry.yarnpkg.com/@angular/service-worker/-/service-worker-17.0.4.tgz#d8e0c9655b8afd18f97f9e847dd23e258d86b8b4" + integrity sha512-xfQ5jXeLAJnMUhv9121sD7tTRXrc53mt3BxilLP5TfrjCpYyZtaad9ZpQj6vUOTKA+qDJ5AmLF/G9iXAPiV56A== dependencies: tslib "^2.3.0" @@ -472,25 +472,12 @@ "@babel/highlight" "^7.22.13" chalk "^2.4.2" -"@babel/code-frame@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244" - integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== - dependencies: - "@babel/highlight" "^7.23.4" - chalk "^2.4.2" - "@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.21.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9", "@babel/compat-data@^7.23.2": version "7.23.2" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.2.tgz#6a12ced93455827037bfb5ed8492820d60fc32cc" integrity sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ== -"@babel/compat-data@^7.23.3", "@babel/compat-data@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.5.tgz#ffb878728bb6bdcb6f4510aa51b1be9afb8cfd98" - integrity sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw== - -"@babel/core@7.23.2", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.13.16", "@babel/core@^7.2.2", "@babel/core@^7.20.2", "@babel/core@^7.22.9": +"@babel/core@7.23.2", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.13.16", "@babel/core@^7.2.2", "@babel/core@^7.20.2", "@babel/core@^7.22.0", "@babel/core@^7.22.9": version "7.23.2" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.2.tgz#ed10df0d580fff67c5f3ee70fd22e2e4c90a9f94" integrity sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ== @@ -511,27 +498,6 @@ json5 "^2.2.3" semver "^6.3.1" -"@babel/core@^7.23.0", "@babel/core@^7.23.2": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.6.tgz#8be77cd77c55baadcc1eae1c33df90ab6d2151d4" - integrity sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.23.5" - "@babel/generator" "^7.23.6" - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helpers" "^7.23.6" - "@babel/parser" "^7.23.6" - "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.6" - "@babel/types" "^7.23.6" - convert-source-map "^2.0.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.3" - semver "^6.3.1" - "@babel/core@~7.21.0": version "7.21.8" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.8.tgz#2a8c7f0f53d60100ba4c32470ba0281c92aa9aa4" @@ -553,7 +519,7 @@ json5 "^2.2.2" semver "^6.3.0" -"@babel/generator@7.23.0", "@babel/generator@^7.21.5", "@babel/generator@^7.23.0", "@babel/generator@^7.7.2": +"@babel/generator@7.23.0", "@babel/generator@^7.21.5", "@babel/generator@^7.22.9", "@babel/generator@^7.23.0", "@babel/generator@^7.7.2": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== @@ -563,16 +529,6 @@ "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" -"@babel/generator@^7.23.6": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.6.tgz#9e1fca4811c77a10580d17d26b57b036133f3c2e" - integrity sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw== - dependencies: - "@babel/types" "^7.23.6" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" - "@babel/generator@~7.21.1": version "7.21.9" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.9.tgz#3a1b706e07d836e204aee0650e8ee878d3aaa241" @@ -590,7 +546,7 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.15", "@babel/helper-builder-binary-assignment-operator-visitor@^7.22.5": +"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.5": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz#5426b109cf3ad47b91120f8328d8ab1be8b0b956" integrity sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw== @@ -608,17 +564,6 @@ lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-compilation-targets@^7.23.6": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991" - integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== - dependencies: - "@babel/compat-data" "^7.23.5" - "@babel/helper-validator-option" "^7.23.5" - browserslist "^4.22.2" - lru-cache "^5.1.1" - semver "^6.3.1" - "@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.21.0", "@babel/helper-create-class-features-plugin@^7.22.11", "@babel/helper-create-class-features-plugin@^7.22.15", "@babel/helper-create-class-features-plugin@^7.22.5": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz#97a61b385e57fe458496fad19f8e63b63c867de4" @@ -634,22 +579,7 @@ "@babel/helper-split-export-declaration" "^7.22.6" semver "^6.3.1" -"@babel/helper-create-class-features-plugin@^7.23.6": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.6.tgz#b04d915ce92ce363666f816a884cdcfc9be04953" - integrity sha512-cBXU1vZni/CpGF29iTu4YRbOZt3Wat6zCoMDxRF1MayiEc4URxOj31tT65HUM0CRpMowA3HCJaAOVOUnMf96cw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-member-expression-to-functions" "^7.23.0" - "@babel/helper-optimise-call-expression" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.20" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - semver "^6.3.1" - -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.15", "@babel/helper-create-regexp-features-plugin@^7.22.5": +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.5": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz#5ee90093914ea09639b01c711db0d6775e558be1" integrity sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w== @@ -701,7 +631,7 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-member-expression-to-functions@^7.22.15", "@babel/helper-member-expression-to-functions@^7.23.0": +"@babel/helper-member-expression-to-functions@^7.22.15": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366" integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA== @@ -726,17 +656,6 @@ "@babel/helper-split-export-declaration" "^7.22.6" "@babel/helper-validator-identifier" "^7.22.20" -"@babel/helper-module-transforms@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" - integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== - dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-module-imports" "^7.22.15" - "@babel/helper-simple-access" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/helper-validator-identifier" "^7.22.20" - "@babel/helper-optimise-call-expression@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" @@ -793,11 +712,6 @@ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== -"@babel/helper-string-parser@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz#9478c707febcbbe1ddb38a3d91a2e054ae622d83" - integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ== - "@babel/helper-validator-identifier@^7.19.1", "@babel/helper-validator-identifier@^7.22.20": version "7.22.20" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" @@ -808,11 +722,6 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz#694c30dfa1d09a6534cdfcafbe56789d36aba040" integrity sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA== -"@babel/helper-validator-option@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" - integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== - "@babel/helper-wrap-function@^7.22.20": version "7.22.20" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz#15352b0b9bfb10fc9c76f79f6342c00e3411a569" @@ -831,15 +740,6 @@ "@babel/traverse" "^7.23.2" "@babel/types" "^7.23.0" -"@babel/helpers@^7.23.6": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.6.tgz#d03af2ee5fb34691eec0cda90f5ecbb4d4da145a" - integrity sha512-wCfsbN4nBidDRhpDhvcKlzHWCTlgJYUUdSJfzXb2NuBssDSIjc3xcb+znA7l+zYsFljAcGM0aFkN40cR3lXiGA== - dependencies: - "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.6" - "@babel/types" "^7.23.6" - "@babel/highlight@^7.22.13": version "7.22.20" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" @@ -849,25 +749,11 @@ chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/highlight@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b" - integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A== - dependencies: - "@babel/helper-validator-identifier" "^7.22.20" - chalk "^2.4.2" - js-tokens "^4.0.0" - -"@babel/parser@^7.0.0-beta.54", "@babel/parser@^7.1.0", "@babel/parser@^7.13.16", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.21.5", "@babel/parser@^7.21.8", "@babel/parser@^7.22.15", "@babel/parser@^7.23.0": +"@babel/parser@^7.0.0-beta.54", "@babel/parser@^7.1.0", "@babel/parser@^7.13.16", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.21.5", "@babel/parser@^7.21.8", "@babel/parser@^7.22.15", "@babel/parser@^7.22.7", "@babel/parser@^7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== -"@babel/parser@^7.23.6": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.6.tgz#ba1c9e512bda72a47e285ae42aff9d2a635a9e3b" - integrity sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ== - "@babel/parser@~7.21.2": version "7.21.9" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.9.tgz#ab18ea3b85b4bc33ba98a8d4c2032c557d23cf14" @@ -880,13 +766,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.23.3": - version "7.23.3" - 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.23.3.tgz#5cd1c87ba9380d0afb78469292c954fee5d2411a" - integrity sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.20.7", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.15": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz#2aeb91d337d4e1a1e7ce85b76a37f5301781200f" @@ -896,23 +775,6 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" "@babel/plugin-transform-optional-chaining" "^7.22.15" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz#f6652bb16b94f8f9c20c50941e16e9756898dc5d" - integrity sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/plugin-transform-optional-chaining" "^7.23.3" - -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.3.tgz#20c60d4639d18f7da8602548512e9d3a4c8d7098" - integrity sha512-XaJak1qcityzrX0/IU5nKHb34VaibwP3saKqG6a/tppelgllOH13LUann4ZCIBcVOeE6H18K4Vx9QKkVww3z/w== - dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-proposal-async-generator-functions@^7.20.7": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326" @@ -1114,13 +976,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-syntax-flow@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.23.3.tgz#084564e0f3cc21ea6c70c44cff984a1c0509729a" - integrity sha512-YZiAIpkJAwQXBJLIQbRFayR5c+gJ35Vcz3bg954k7cd73zqjvhacJuL9RbrzPz8qPmZdgqP6EUKwy0PCNhaaPA== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-import-assertions@^7.20.0", "@babel/plugin-syntax-import-assertions@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz#07d252e2aa0bc6125567f742cd58619cb14dce98" @@ -1128,13 +983,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-syntax-import-assertions@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz#9c05a7f592982aff1a2768260ad84bcd3f0c77fc" - integrity sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-import-attributes@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz#ab840248d834410b829f569f5262b9e517555ecb" @@ -1142,13 +990,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-syntax-import-attributes@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz#992aee922cf04512461d7dae3ff6951b90a2dc06" - integrity sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@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" @@ -1170,13 +1011,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-syntax-jsx@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz#8f2e4f8a9b5f9aa16067e142c1ac9cd9f810f473" - integrity sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" @@ -1240,13 +1074,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-syntax-typescript@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz#24f460c85dbbc983cd2b9c4994178bcc01df958f" - integrity sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-unicode-sets-regex@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" @@ -1262,13 +1089,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-arrow-functions@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz#94c6dcfd731af90f27a79509f9ab7fb2120fc38b" - integrity sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-transform-async-generator-functions@7.23.2", "@babel/plugin-transform-async-generator-functions@^7.23.2": version "7.23.2" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.2.tgz#054afe290d64c6f576f371ccc321772c8ea87ebb" @@ -1279,16 +1099,6 @@ "@babel/helper-remap-async-to-generator" "^7.22.20" "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-transform-async-generator-functions@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.4.tgz#93ac8e3531f347fba519b4703f9ff2a75c6ae27a" - integrity sha512-efdkfPhHYTtn0G6n2ddrESE91fgXxjlqLsnUtPWnJs4a4mZIbUaK7ffqKIIUKXSHwcDvaCVX6GXkaJJFqtX7jw== - dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-remap-async-to-generator" "^7.22.20" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-transform-async-to-generator@7.22.5", "@babel/plugin-transform-async-to-generator@^7.20.7", "@babel/plugin-transform-async-to-generator@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz#c7a85f44e46f8952f6d27fe57c2ed3cc084c3775" @@ -1298,15 +1108,6 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-remap-async-to-generator" "^7.22.5" -"@babel/plugin-transform-async-to-generator@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz#d1f513c7a8a506d43f47df2bf25f9254b0b051fa" - integrity sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw== - dependencies: - "@babel/helper-module-imports" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-remap-async-to-generator" "^7.22.20" - "@babel/plugin-transform-block-scoped-functions@^7.18.6", "@babel/plugin-transform-block-scoped-functions@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz#27978075bfaeb9fa586d3cb63a3d30c1de580024" @@ -1314,13 +1115,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-block-scoped-functions@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz#fe1177d715fb569663095e04f3598525d98e8c77" - integrity sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-transform-block-scoping@^7.21.0", "@babel/plugin-transform-block-scoping@^7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.0.tgz#8744d02c6c264d82e1a4bc5d2d501fd8aff6f022" @@ -1328,13 +1122,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-block-scoping@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz#b2d38589531c6c80fbe25e6b58e763622d2d3cf5" - integrity sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-transform-class-properties@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz#97a56e31ad8c9dc06a0b3710ce7803d5a48cca77" @@ -1343,14 +1130,6 @@ "@babel/helper-create-class-features-plugin" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-class-properties@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz#35c377db11ca92a785a718b6aa4e3ed1eb65dc48" - integrity sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-transform-class-static-block@^7.22.11": version "7.22.11" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz#dc8cc6e498f55692ac6b4b89e56d87cec766c974" @@ -1360,15 +1139,6 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-class-static-block" "^7.14.5" -"@babel/plugin-transform-class-static-block@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz#2a202c8787a8964dd11dfcedf994d36bfc844ab5" - integrity sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-transform-classes@^7.21.0", "@babel/plugin-transform-classes@^7.22.15": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz#aaf4753aee262a232bbc95451b4bdf9599c65a0b" @@ -1384,21 +1154,6 @@ "@babel/helper-split-export-declaration" "^7.22.6" globals "^11.1.0" -"@babel/plugin-transform-classes@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.5.tgz#e7a75f815e0c534cc4c9a39c56636c84fc0d64f2" - integrity sha512-jvOTR4nicqYC9yzOHIhXG5emiFEOpappSJAl73SDSEDcybD+Puuze8Tnpb9p9qEyYup24tq891gkaygIFvWDqg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-compilation-targets" "^7.22.15" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-optimise-call-expression" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.20" - "@babel/helper-split-export-declaration" "^7.22.6" - globals "^11.1.0" - "@babel/plugin-transform-computed-properties@^7.21.5", "@babel/plugin-transform-computed-properties@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz#cd1e994bf9f316bd1c2dafcd02063ec261bb3869" @@ -1407,14 +1162,6 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/template" "^7.22.5" -"@babel/plugin-transform-computed-properties@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz#652e69561fcc9d2b50ba4f7ac7f60dcf65e86474" - integrity sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/template" "^7.22.15" - "@babel/plugin-transform-destructuring@^7.21.3", "@babel/plugin-transform-destructuring@^7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.0.tgz#6447aa686be48b32eaf65a73e0e2c0bd010a266c" @@ -1422,13 +1169,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-destructuring@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz#8c9ee68228b12ae3dff986e56ed1ba4f3c446311" - integrity sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.22.5", "@babel/plugin-transform-dotall-regex@^7.4.4": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz#dbb4f0e45766eb544e193fb00e65a1dd3b2a4165" @@ -1437,14 +1177,6 @@ "@babel/helper-create-regexp-features-plugin" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-dotall-regex@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz#3f7af6054882ede89c378d0cf889b854a993da50" - integrity sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-transform-duplicate-keys@^7.18.9", "@babel/plugin-transform-duplicate-keys@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz#b6e6428d9416f5f0bba19c70d1e6e7e0b88ab285" @@ -1452,13 +1184,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-duplicate-keys@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz#664706ca0a5dfe8d066537f99032fc1dc8b720ce" - integrity sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-transform-dynamic-import@^7.22.11": version "7.22.11" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz#2c7722d2a5c01839eaf31518c6ff96d408e447aa" @@ -1467,14 +1192,6 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-transform-dynamic-import@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz#c7629e7254011ac3630d47d7f34ddd40ca535143" - integrity sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-transform-exponentiation-operator@^7.18.6", "@babel/plugin-transform-exponentiation-operator@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz#402432ad544a1f9a480da865fda26be653e48f6a" @@ -1483,14 +1200,6 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-exponentiation-operator@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz#ea0d978f6b9232ba4722f3dbecdd18f450babd18" - integrity sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ== - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-transform-export-namespace-from@^7.22.11": version "7.22.11" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz#b3c84c8f19880b6c7440108f8929caf6056db26c" @@ -1499,14 +1208,6 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-transform-export-namespace-from@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz#084c7b25e9a5c8271e987a08cf85807b80283191" - integrity sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-transform-flow-strip-types@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.22.5.tgz#0bb17110c7bf5b35a60754b2f00c58302381dee2" @@ -1515,14 +1216,6 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-flow" "^7.22.5" -"@babel/plugin-transform-flow-strip-types@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.23.3.tgz#cfa7ca159cc3306fab526fc67091556b51af26ff" - integrity sha512-26/pQTf9nQSNVJCrLB1IkHUKyPxR+lMrH2QDPG89+Znu9rAMbtrybdbWeE9bb7gzjmE5iXHEY+e0HUwM6Co93Q== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-flow" "^7.23.3" - "@babel/plugin-transform-for-of@^7.21.5", "@babel/plugin-transform-for-of@^7.22.15": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz#f64b4ccc3a4f131a996388fae7680b472b306b29" @@ -1530,14 +1223,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-for-of@^7.23.6": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz#81c37e24171b37b370ba6aaffa7ac86bcb46f94e" - integrity sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/plugin-transform-function-name@^7.18.9", "@babel/plugin-transform-function-name@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz#935189af68b01898e0d6d99658db6b164205c143" @@ -1547,15 +1232,6 @@ "@babel/helper-function-name" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-function-name@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz#8f424fcd862bf84cb9a1a6b42bc2f47ed630f8dc" - integrity sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw== - dependencies: - "@babel/helper-compilation-targets" "^7.22.15" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-transform-json-strings@^7.22.11": version "7.22.11" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz#689a34e1eed1928a40954e37f74509f48af67835" @@ -1564,14 +1240,6 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-transform-json-strings@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz#a871d9b6bd171976efad2e43e694c961ffa3714d" - integrity sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-transform-literals@^7.18.9", "@babel/plugin-transform-literals@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz#e9341f4b5a167952576e23db8d435849b1dd7920" @@ -1579,13 +1247,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-literals@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz#8214665f00506ead73de157eba233e7381f3beb4" - integrity sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-transform-logical-assignment-operators@^7.22.11": version "7.22.11" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz#24c522a61688bde045b7d9bc3c2597a4d948fc9c" @@ -1594,14 +1255,6 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-transform-logical-assignment-operators@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz#e599f82c51d55fac725f62ce55d3a0886279ecb5" - integrity sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-transform-member-expression-literals@^7.18.6", "@babel/plugin-transform-member-expression-literals@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz#4fcc9050eded981a468347dd374539ed3e058def" @@ -1609,13 +1262,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-member-expression-literals@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz#e37b3f0502289f477ac0e776b05a833d853cabcc" - integrity sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-transform-modules-amd@^7.20.11", "@babel/plugin-transform-modules-amd@^7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.0.tgz#05b2bc43373faa6d30ca89214731f76f966f3b88" @@ -1624,14 +1270,6 @@ "@babel/helper-module-transforms" "^7.23.0" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-modules-amd@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz#e19b55436a1416829df0a1afc495deedfae17f7d" - integrity sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw== - dependencies: - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-transform-modules-commonjs@^7.13.8", "@babel/plugin-transform-modules-commonjs@^7.21.5", "@babel/plugin-transform-modules-commonjs@^7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz#b3dba4757133b2762c00f4f94590cf6d52602481" @@ -1641,15 +1279,6 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-simple-access" "^7.22.5" -"@babel/plugin-transform-modules-commonjs@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz#661ae831b9577e52be57dd8356b734f9700b53b4" - integrity sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA== - dependencies: - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-simple-access" "^7.22.5" - "@babel/plugin-transform-modules-systemjs@^7.20.11", "@babel/plugin-transform-modules-systemjs@^7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.0.tgz#77591e126f3ff4132a40595a6cccd00a6b60d160" @@ -1660,16 +1289,6 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-validator-identifier" "^7.22.20" -"@babel/plugin-transform-modules-systemjs@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz#fa7e62248931cb15b9404f8052581c302dd9de81" - integrity sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ== - dependencies: - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.20" - "@babel/plugin-transform-modules-umd@^7.18.6", "@babel/plugin-transform-modules-umd@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz#4694ae40a87b1745e3775b6a7fe96400315d4f98" @@ -1678,14 +1297,6 @@ "@babel/helper-module-transforms" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-modules-umd@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz#5d4395fccd071dfefe6585a4411aa7d6b7d769e9" - integrity sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg== - dependencies: - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-transform-named-capturing-groups-regex@^7.20.5", "@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz#67fe18ee8ce02d57c855185e27e3dc959b2e991f" @@ -1701,13 +1312,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-new-target@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz#5491bb78ed6ac87e990957cea367eab781c4d980" - integrity sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-transform-nullish-coalescing-operator@^7.22.11": version "7.22.11" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz#debef6c8ba795f5ac67cd861a81b744c5d38d9fc" @@ -1716,14 +1320,6 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-transform-nullish-coalescing-operator@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz#45556aad123fc6e52189ea749e33ce090637346e" - integrity sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-transform-numeric-separator@^7.22.11": version "7.22.11" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz#498d77dc45a6c6db74bb829c02a01c1d719cbfbd" @@ -1732,14 +1328,6 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-transform-numeric-separator@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz#03d08e3691e405804ecdd19dd278a40cca531f29" - integrity sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-transform-object-rest-spread@^7.22.15": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz#21a95db166be59b91cde48775310c0df6e1da56f" @@ -1751,17 +1339,6 @@ "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-transform-parameters" "^7.22.15" -"@babel/plugin-transform-object-rest-spread@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz#2b9c2d26bf62710460bdc0d1730d4f1048361b83" - integrity sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g== - dependencies: - "@babel/compat-data" "^7.23.3" - "@babel/helper-compilation-targets" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.23.3" - "@babel/plugin-transform-object-super@^7.18.6", "@babel/plugin-transform-object-super@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz#794a8d2fcb5d0835af722173c1a9d704f44e218c" @@ -1770,14 +1347,6 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-replace-supers" "^7.22.5" -"@babel/plugin-transform-object-super@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz#81fdb636dcb306dd2e4e8fd80db5b2362ed2ebcd" - integrity sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.20" - "@babel/plugin-transform-optional-catch-binding@^7.22.11": version "7.22.11" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz#461cc4f578a127bb055527b3e77404cad38c08e0" @@ -1786,14 +1355,6 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-transform-optional-catch-binding@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz#318066de6dacce7d92fa244ae475aa8d91778017" - integrity sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-transform-optional-chaining@^7.22.15", "@babel/plugin-transform-optional-chaining@^7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.0.tgz#73ff5fc1cf98f542f09f29c0631647d8ad0be158" @@ -1803,15 +1364,6 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-transform-optional-chaining@^7.23.3", "@babel/plugin-transform-optional-chaining@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz#6acf61203bdfc4de9d4e52e64490aeb3e52bd017" - integrity sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-transform-parameters@^7.20.7", "@babel/plugin-transform-parameters@^7.21.3", "@babel/plugin-transform-parameters@^7.22.15": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz#719ca82a01d177af358df64a514d64c2e3edb114" @@ -1819,13 +1371,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-parameters@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz#83ef5d1baf4b1072fa6e54b2b0999a7b2527e2af" - integrity sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-transform-private-methods@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz#21c8af791f76674420a147ae62e9935d790f8722" @@ -1834,14 +1379,6 @@ "@babel/helper-create-class-features-plugin" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-private-methods@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz#b2d7a3c97e278bfe59137a978d53b2c2e038c0e4" - integrity sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-transform-private-property-in-object@^7.22.11": version "7.22.11" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz#ad45c4fc440e9cb84c718ed0906d96cf40f9a4e1" @@ -1852,16 +1389,6 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" -"@babel/plugin-transform-private-property-in-object@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz#3ec711d05d6608fd173d9b8de39872d8dbf68bf5" - integrity sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-create-class-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-transform-property-literals@^7.18.6", "@babel/plugin-transform-property-literals@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz#b5ddabd73a4f7f26cd0e20f5db48290b88732766" @@ -1869,13 +1396,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-property-literals@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz#54518f14ac4755d22b92162e4a852d308a560875" - integrity sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-transform-regenerator@^7.21.5", "@babel/plugin-transform-regenerator@^7.22.10": version "7.22.10" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz#8ceef3bd7375c4db7652878b0241b2be5d0c3cca" @@ -1884,14 +1404,6 @@ "@babel/helper-plugin-utils" "^7.22.5" regenerator-transform "^0.15.2" -"@babel/plugin-transform-regenerator@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz#141afd4a2057298602069fce7f2dc5173e6c561c" - integrity sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - regenerator-transform "^0.15.2" - "@babel/plugin-transform-reserved-words@^7.18.6", "@babel/plugin-transform-reserved-words@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz#832cd35b81c287c4bcd09ce03e22199641f964fb" @@ -1899,13 +1411,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-reserved-words@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz#4130dcee12bd3dd5705c587947eb715da12efac8" - integrity sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-transform-runtime@7.23.2", "@babel/plugin-transform-runtime@^7.22.9": version "7.23.2" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.2.tgz#c956a3f8d1aa50816ff6c30c6288d66635c12990" @@ -1925,13 +1430,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-shorthand-properties@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz#97d82a39b0e0c24f8a981568a8ed851745f59210" - integrity sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-transform-spread@^7.20.7", "@babel/plugin-transform-spread@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz#6487fd29f229c95e284ba6c98d65eafb893fea6b" @@ -1940,14 +1438,6 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" -"@babel/plugin-transform-spread@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz#41d17aacb12bde55168403c6f2d6bdca563d362c" - integrity sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/plugin-transform-sticky-regex@^7.18.6", "@babel/plugin-transform-sticky-regex@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz#295aba1595bfc8197abd02eae5fc288c0deb26aa" @@ -1955,13 +1445,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-sticky-regex@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz#dec45588ab4a723cb579c609b294a3d1bd22ff04" - integrity sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-transform-template-literals@^7.18.9", "@babel/plugin-transform-template-literals@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz#8f38cf291e5f7a8e60e9f733193f0bcc10909bff" @@ -1969,13 +1452,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-template-literals@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz#5f0f028eb14e50b5d0f76be57f90045757539d07" - integrity sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-transform-typeof-symbol@^7.18.9", "@babel/plugin-transform-typeof-symbol@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz#5e2ba478da4b603af8673ff7c54f75a97b716b34" @@ -1983,13 +1459,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-typeof-symbol@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz#9dfab97acc87495c0c449014eb9c547d8966bca4" - integrity sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-transform-typescript@^7.22.15": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.15.tgz#15adef906451d86349eb4b8764865c960eb54127" @@ -2000,16 +1469,6 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-typescript" "^7.22.5" -"@babel/plugin-transform-typescript@^7.23.3": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.6.tgz#aa36a94e5da8d94339ae3a4e22d40ed287feb34c" - integrity sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-create-class-features-plugin" "^7.23.6" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-typescript" "^7.23.3" - "@babel/plugin-transform-unicode-escapes@^7.21.5", "@babel/plugin-transform-unicode-escapes@^7.22.10": version "7.22.10" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz#c723f380f40a2b2f57a62df24c9005834c8616d9" @@ -2017,13 +1476,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-unicode-escapes@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz#1f66d16cab01fab98d784867d24f70c1ca65b925" - integrity sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-transform-unicode-property-regex@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz#098898f74d5c1e86660dc112057b2d11227f1c81" @@ -2032,14 +1484,6 @@ "@babel/helper-create-regexp-features-plugin" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-unicode-property-regex@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz#19e234129e5ffa7205010feec0d94c251083d7ad" - integrity sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-transform-unicode-regex@^7.18.6", "@babel/plugin-transform-unicode-regex@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz#ce7e7bb3ef208c4ff67e02a22816656256d7a183" @@ -2048,14 +1492,6 @@ "@babel/helper-create-regexp-features-plugin" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-unicode-regex@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz#26897708d8f42654ca4ce1b73e96140fbad879dc" - integrity sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-transform-unicode-sets-regex@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz#77788060e511b708ffc7d42fdfbc5b37c3004e91" @@ -2064,14 +1500,6 @@ "@babel/helper-create-regexp-features-plugin" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-unicode-sets-regex@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz#4fb6f0a719c2c5859d11f6b55a050cc987f3799e" - integrity sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/preset-env@7.23.2", "@babel/preset-env@^7.20.2", "@babel/preset-env@^7.22.9": version "7.23.2" resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.23.2.tgz#1f22be0ff0e121113260337dbc3e58fafce8d059" @@ -2158,92 +1586,6 @@ core-js-compat "^3.31.0" semver "^6.3.1" -"@babel/preset-env@^7.23.2": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.23.6.tgz#ad0ea799d5a3c07db5b9a172819bbd444092187a" - integrity sha512-2XPn/BqKkZCpzYhUUNZ1ssXw7DcXfKQEjv/uXZUXgaebCMYmkEsfZ2yY+vv+xtXv50WmL5SGhyB6/xsWxIvvOQ== - dependencies: - "@babel/compat-data" "^7.23.5" - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-validator-option" "^7.23.5" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.23.3" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.23.3" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.23.3" - "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.23.3" - "@babel/plugin-syntax-import-attributes" "^7.23.3" - "@babel/plugin-syntax-import-meta" "^7.10.4" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" - "@babel/plugin-transform-arrow-functions" "^7.23.3" - "@babel/plugin-transform-async-generator-functions" "^7.23.4" - "@babel/plugin-transform-async-to-generator" "^7.23.3" - "@babel/plugin-transform-block-scoped-functions" "^7.23.3" - "@babel/plugin-transform-block-scoping" "^7.23.4" - "@babel/plugin-transform-class-properties" "^7.23.3" - "@babel/plugin-transform-class-static-block" "^7.23.4" - "@babel/plugin-transform-classes" "^7.23.5" - "@babel/plugin-transform-computed-properties" "^7.23.3" - "@babel/plugin-transform-destructuring" "^7.23.3" - "@babel/plugin-transform-dotall-regex" "^7.23.3" - "@babel/plugin-transform-duplicate-keys" "^7.23.3" - "@babel/plugin-transform-dynamic-import" "^7.23.4" - "@babel/plugin-transform-exponentiation-operator" "^7.23.3" - "@babel/plugin-transform-export-namespace-from" "^7.23.4" - "@babel/plugin-transform-for-of" "^7.23.6" - "@babel/plugin-transform-function-name" "^7.23.3" - "@babel/plugin-transform-json-strings" "^7.23.4" - "@babel/plugin-transform-literals" "^7.23.3" - "@babel/plugin-transform-logical-assignment-operators" "^7.23.4" - "@babel/plugin-transform-member-expression-literals" "^7.23.3" - "@babel/plugin-transform-modules-amd" "^7.23.3" - "@babel/plugin-transform-modules-commonjs" "^7.23.3" - "@babel/plugin-transform-modules-systemjs" "^7.23.3" - "@babel/plugin-transform-modules-umd" "^7.23.3" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" - "@babel/plugin-transform-new-target" "^7.23.3" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.23.4" - "@babel/plugin-transform-numeric-separator" "^7.23.4" - "@babel/plugin-transform-object-rest-spread" "^7.23.4" - "@babel/plugin-transform-object-super" "^7.23.3" - "@babel/plugin-transform-optional-catch-binding" "^7.23.4" - "@babel/plugin-transform-optional-chaining" "^7.23.4" - "@babel/plugin-transform-parameters" "^7.23.3" - "@babel/plugin-transform-private-methods" "^7.23.3" - "@babel/plugin-transform-private-property-in-object" "^7.23.4" - "@babel/plugin-transform-property-literals" "^7.23.3" - "@babel/plugin-transform-regenerator" "^7.23.3" - "@babel/plugin-transform-reserved-words" "^7.23.3" - "@babel/plugin-transform-shorthand-properties" "^7.23.3" - "@babel/plugin-transform-spread" "^7.23.3" - "@babel/plugin-transform-sticky-regex" "^7.23.3" - "@babel/plugin-transform-template-literals" "^7.23.3" - "@babel/plugin-transform-typeof-symbol" "^7.23.3" - "@babel/plugin-transform-unicode-escapes" "^7.23.3" - "@babel/plugin-transform-unicode-property-regex" "^7.23.3" - "@babel/plugin-transform-unicode-regex" "^7.23.3" - "@babel/plugin-transform-unicode-sets-regex" "^7.23.3" - "@babel/preset-modules" "0.1.6-no-external-plugins" - babel-plugin-polyfill-corejs2 "^0.4.6" - babel-plugin-polyfill-corejs3 "^0.8.5" - babel-plugin-polyfill-regenerator "^0.5.3" - core-js-compat "^3.31.0" - semver "^6.3.1" - "@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" @@ -2335,15 +1677,6 @@ "@babel/helper-validator-option" "^7.22.15" "@babel/plugin-transform-flow-strip-types" "^7.22.5" -"@babel/preset-flow@^7.22.15": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.23.3.tgz#8084e08b9ccec287bd077ab288b286fab96ffab1" - integrity sha512-7yn6hl8RIv+KNk6iIrGZ+D06VhVY35wLVf23Cz/mMu1zOr7u4MMP4j0nZ9tLf8+4ZFpnib8cFYgB/oYg9hfswA== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-validator-option" "^7.22.15" - "@babel/plugin-transform-flow-strip-types" "^7.23.3" - "@babel/preset-modules@0.1.6-no-external-plugins": version "0.1.6-no-external-plugins" resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a" @@ -2375,18 +1708,7 @@ "@babel/plugin-transform-modules-commonjs" "^7.23.0" "@babel/plugin-transform-typescript" "^7.22.15" -"@babel/preset-typescript@^7.23.0": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.23.3.tgz#14534b34ed5b6d435aa05f1ae1c5e7adcc01d913" - integrity sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-validator-option" "^7.22.15" - "@babel/plugin-syntax-jsx" "^7.23.3" - "@babel/plugin-transform-modules-commonjs" "^7.23.3" - "@babel/plugin-transform-typescript" "^7.23.3" - -"@babel/register@^7.13.16", "@babel/register@^7.22.15": +"@babel/register@^7.13.16": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.22.15.tgz#c2c294a361d59f5fa7bcc8b97ef7319c32ecaec7" integrity sha512-V3Q3EqoQdn65RCgTLwauZaTfd1ShhwPmbBv+1dkZV/HpCGMKVyn6oFcRlI7RaKqiDQjX2Qd3AuoEguBgdjIKlg== @@ -2418,7 +1740,7 @@ "@babel/parser" "^7.22.15" "@babel/types" "^7.22.15" -"@babel/traverse@^7.0.0-beta.54", "@babel/traverse@^7.16.0", "@babel/traverse@^7.21.5", "@babel/traverse@^7.23.2": +"@babel/traverse@^7.0.0-beta.54", "@babel/traverse@^7.16.0", "@babel/traverse@^7.21.5", "@babel/traverse@^7.22.8", "@babel/traverse@^7.23.2": version "7.23.2" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== @@ -2434,22 +1756,6 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/traverse@^7.23.6": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.6.tgz#b53526a2367a0dd6edc423637f3d2d0f2521abc5" - integrity sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ== - dependencies: - "@babel/code-frame" "^7.23.5" - "@babel/generator" "^7.23.6" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.23.6" - "@babel/types" "^7.23.6" - debug "^4.3.1" - globals "^11.1.0" - "@babel/traverse@~7.21.2": version "7.21.5" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.5.tgz#ad22361d352a5154b498299d523cf72998a4b133" @@ -2475,15 +1781,6 @@ "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" -"@babel/types@^7.23.6": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.6.tgz#be33fdb151e1f5a56877d704492c240fc71c7ccd" - integrity sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg== - dependencies: - "@babel/helper-string-parser" "^7.23.4" - "@babel/helper-validator-identifier" "^7.22.20" - to-fast-properties "^2.0.0" - "@babel/types@~7.21.2": version "7.21.5" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.5.tgz#18dfbd47c39d3904d5db3d3dc2cc80bedb60e5b6" @@ -4238,10 +3535,10 @@ dependencies: tslib "2.6.1" -"@ngtools/webpack@17.0.7": - version "17.0.7" - resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-17.0.7.tgz#21e457c8ac9645990589df2ed9e536bde58697e6" - integrity sha512-gwhUhpwXn0trwwKdSu9WlJbEcLt+s/2fPwoD9lZ0y3wXfrOogsfcNBJKeO5BZf1h+A3AWt7ePmgrZXSJM+865Q== +"@ngtools/webpack@17.0.3": + version "17.0.3" + resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-17.0.3.tgz#3be3358353df2cad8daad089187a6bcc2e59d0e7" + integrity sha512-H39WQ/tM6kOErfiyU6QkPasMtuOZHbm6INkirSR3ol4e93o6gLJ0ptwg3IQlyGtZK2QexWagPC6jzsdGIaN3iw== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -4332,98 +3629,98 @@ read-package-json-fast "^3.0.0" which "^4.0.0" -"@nrwl/angular@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nrwl/angular/-/angular-17.2.5.tgz#e2eb955d2fe6333bfbd1a6ae98f3208a63bac517" - integrity sha512-UhXFeQJg6/m5UMzPVnxsuWYRhHApAPkrMf7Z9oSbTHNnfZ6LPGfuzTlWl72NjSG2xcSE0hhP4Et/7M+U2/Qv1A== +"@nrwl/angular@17.0.2": + version "17.0.2" + resolved "https://registry.yarnpkg.com/@nrwl/angular/-/angular-17.0.2.tgz#df4c25b2ed1eca8b61523360916ba239a783a679" + integrity sha512-GheVvG6IiOWfJySLvJY8JMf+O9vaM5KDn4eWaFvT5Vx41UCk1/h36ePlWiOA5Is9wboKCBbijzc9TgW/F3QkiA== dependencies: - "@nx/angular" v17.2.5 + "@nx/angular" "17.0.2" tslib "^2.3.0" -"@nrwl/cypress@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nrwl/cypress/-/cypress-17.2.5.tgz#26bbe35a51118e02f375b1621225488ccba182f6" - integrity sha512-3juSy+fZ+pxQE1Tx/BO+f1u9iUXbF2Vc6biq2rIh/d8Eo7YlDS/9clrLLWCZ4ytT5nzesrnZS0viuRavvNih8g== +"@nrwl/cypress@17.0.2": + version "17.0.2" + resolved "https://registry.yarnpkg.com/@nrwl/cypress/-/cypress-17.0.2.tgz#ebdfd97671bcdc9a4069359fd6091f8b8a49569e" + integrity sha512-lV3JCBtB7QZXIp3BDmnDbtUDTYt9LHgUePoEG1ohO7D+J71hsx4s8iRo6lOr+HxemlxdBmhSLJlqMTKZv4B1iQ== dependencies: - "@nx/cypress" v17.2.5 + "@nx/cypress" "17.0.2" -"@nrwl/devkit@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-17.2.5.tgz#990918387fb192732c1803c0015bac171f402685" - integrity sha512-rXZDkJMzbViCfxZ19ndLZX9MZhQ50qgQOR6kahYugTcJ6HRV1i/FsKRyKXk1JefMCo8qdw/F5aw9zl0WwOiPdA== +"@nrwl/devkit@17.0.2": + version "17.0.2" + resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-17.0.2.tgz#f9d2bab38c625e3a5edb5e4f04a27c1c56aa8693" + integrity sha512-zgqTFYmvs80D3T/TwmR/EBdV1OU2c96YYHngAe3DX8kXhjlV3dq+VPZVBROM0AzYLGaSckW3mHBhgL+JrDp5Pg== dependencies: - "@nx/devkit" v17.2.5 + "@nx/devkit" "17.0.2" -"@nrwl/eslint-plugin-nx@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nrwl/eslint-plugin-nx/-/eslint-plugin-nx-17.2.5.tgz#9b906ad4a4c377e0a6461deb44bae43a0bad43d2" - integrity sha512-uvqGdOCqz/A1Ak27pBBcOCI9Ct/rdXfUhmYMDSAPNUx1gzQRofJ3DD4q7uFjEHwc7Qjdqpc4HizYPBaIj4ZaBw== +"@nrwl/eslint-plugin-nx@17.0.2": + version "17.0.2" + resolved "https://registry.yarnpkg.com/@nrwl/eslint-plugin-nx/-/eslint-plugin-nx-17.0.2.tgz#256b9797162ba08e8a09dc4ddda0143fc2abef85" + integrity sha512-kVsyHqaFgWPgCk7C+aimctq1MNnmqQEqCwmB/EC7kPYWPLvF5l7JqlTrDZAmIaCDBKIUUqJsZLO9d46vT5Z9xw== dependencies: - "@nx/eslint-plugin" v17.2.5 + "@nx/eslint-plugin" "17.0.2" -"@nrwl/jest@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nrwl/jest/-/jest-17.2.5.tgz#1f973ed5d3504a871e70e64d9aa41879f33c762a" - integrity sha512-zWVk+L+oAgWQovooL+ynehDUTqm6TschYh5utL11N8kMuKPrF/aFSoiE4J47VS6TmO/sQ6hrRVMJfXibMlnZeQ== +"@nrwl/jest@17.0.2": + version "17.0.2" + resolved "https://registry.yarnpkg.com/@nrwl/jest/-/jest-17.0.2.tgz#9d7d3a041b421e84a003d34ed46b89e442f6ec52" + integrity sha512-917A/kc3OvwZxi6f5LByp5/j1cByARc7t1yQx+qHW4vl4wtMPcK1Pcl619tLb+DURI/z5Zz9MQvSsdzr4F6ZWg== dependencies: - "@nx/jest" v17.2.5 + "@nx/jest" "17.0.2" -"@nrwl/js@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nrwl/js/-/js-17.2.5.tgz#af3d50e1cf155b2dc2306646c68f1f07a87dbb04" - integrity sha512-Pcw5f1yqT6yJe3DRtdoYmHVngNFy+oWkOkukDbB3MySGyA760NYyFI49/jMuzGd91dV9vCjEjncLQNKYJTKeBg== +"@nrwl/js@17.0.2": + version "17.0.2" + resolved "https://registry.yarnpkg.com/@nrwl/js/-/js-17.0.2.tgz#d9338b58b063b96f02fb12241f83d743d9e9378c" + integrity sha512-qHqZ6V6IP3piyzb9s7HUlcV3X2O/BDmqikg0yoZGitRpyugY5K1BNZITGRmFEzLklfHxVUqI1qsURnClgax+pA== dependencies: - "@nx/js" v17.2.5 + "@nx/js" "17.0.2" -"@nrwl/nest@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nrwl/nest/-/nest-17.2.5.tgz#ea77baf32db271a9aebdd3ebb47388de676e76bf" - integrity sha512-SnyapR9wDxpn5p9bF7j2xyxRV5bppdMJOFAsOndh5QFcTGUDhRuuCFZf9vlWSVENyxt0r702jd+vV0pa1uUJVg== +"@nrwl/nest@17.0.2": + version "17.0.2" + resolved "https://registry.yarnpkg.com/@nrwl/nest/-/nest-17.0.2.tgz#5f819c1060340eb343307dfc3c09f441dd4011b1" + integrity sha512-uwvIY23mxfNqLW7r5nJATzofRJR23hajdqbQ3J9a0J9ssJ1kIjrLPU+IEUkyldRQ+tbJTEB7vzvrZ6XW2vPjuw== dependencies: - "@nx/nest" v17.2.5 + "@nx/nest" "17.0.2" -"@nrwl/node@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nrwl/node/-/node-17.2.5.tgz#e35116ecbe72df1784d643f079ce269e10c73a50" - integrity sha512-Dl14XmGjibT1FNpPYIMsL3r/4JAiYyvWmKYdD3lDQCWYVlQ3nBYnA8ApYHGFoiJ9wMNfnLFtdJjGXknLqes2pw== +"@nrwl/node@17.0.2": + version "17.0.2" + resolved "https://registry.yarnpkg.com/@nrwl/node/-/node-17.0.2.tgz#e1ef75e3c8cc9ecb59e30e6aa5e3084f45040e43" + integrity sha512-G7nOcwnSV+fP/WahBo6Rl9q6uelFeCSHP5sm9UcPhMFb0TC8UeFMK4XkrqW4HA+tyHMeHzNZ92De31wHMfVfgg== dependencies: - "@nx/node" v17.2.5 + "@nx/node" "17.0.2" -"@nrwl/storybook@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nrwl/storybook/-/storybook-17.2.5.tgz#c0b7147f97a32ba0cf5a0b5b74282d896f71d2f8" - integrity sha512-zoLqGgw5giLkfKL1jGt0TuP82ox6AR1aLbxjmnThnUQeeot+6JWw/8f3ZIoJ9boi4nWxVkT9Ao9pxW4u4P/T5w== +"@nrwl/storybook@17.0.2": + version "17.0.2" + resolved "https://registry.yarnpkg.com/@nrwl/storybook/-/storybook-17.0.2.tgz#82f5eb91fda49c6ed90cbf90588440761e4fe507" + integrity sha512-vdMIdH0oCNjzNp+LQDaK2cqvRe1Tpti7uCrVin9Jv2aM3+d0oguSO7f99x4nueK0Z7bB1qCvpfXXJVxD6E7Puw== dependencies: - "@nx/storybook" v17.2.5 + "@nx/storybook" "17.0.2" -"@nrwl/tao@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-17.2.5.tgz#48b941569f83a1669023aeecaaf64f0ea09b5aec" - integrity sha512-hA89BirzFb2MBm26ZPTTJ/RWRjmZ9R39J8321kVEldehStluA4E5zobNd7MJVp77fBK/CCTlIhFeUEP9qmxhZA== +"@nrwl/tao@17.0.2": + version "17.0.2" + resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-17.0.2.tgz#998f9188dd319e73e5123b068c06b8fb2fc56f12" + integrity sha512-H+htIRzQR6Ibael34rhQkpNkpFFFmaSTsIzdqkBqL4j5+FzSpZh67NJnWSY8vsYQGQL8Ncc+MHvpQC+7pyfgGw== dependencies: - nx v17.2.5 + nx "17.0.2" tslib "^2.3.0" -"@nrwl/web@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nrwl/web/-/web-17.2.5.tgz#88cf4b351f6db2f536913a86008513f56af32755" - integrity sha512-43wKLPYylyu+w/Ive+Pl0VvyEWnWUjYK+o8D62WuHx+JCcp+bZUKSdueC38U860SJiE1hoa/YRy57W6ZbP9tVg== +"@nrwl/web@17.0.2": + version "17.0.2" + resolved "https://registry.yarnpkg.com/@nrwl/web/-/web-17.0.2.tgz#564786ee874f45cbd58f2406b89f14e47f21e4b8" + integrity sha512-+kSGZ0DOEl6MoWmfCtxcDlmZV/+mqY+pGS+qSB3kZGwfRkpwbv1spAPcYyfUB2wNed9js/lSRGt9sBcwWcIY0Q== dependencies: - "@nx/web" v17.2.5 + "@nx/web" "17.0.2" -"@nrwl/webpack@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nrwl/webpack/-/webpack-17.2.5.tgz#eaa790e109d6e317e2409c339cad499509db40b6" - integrity sha512-anjnBvtMQu9kHrVqClXS/x1aTm+xLLr7gmONZBiWr4VSLxO8AO1NuNG9iOC2/i49j+xQ+CfDDauxVwL/X1CUgw== +"@nrwl/webpack@17.0.2": + version "17.0.2" + resolved "https://registry.yarnpkg.com/@nrwl/webpack/-/webpack-17.0.2.tgz#4fc28a0308b36f89c011f7dff096a58bb237c1e5" + integrity sha512-5Kx9drlEGchWDlE8x7uxRIqZEzm8TZll07NUTm++wKWukHhCZZksqojRQkRLq28iO2BFQm12boa78Ku0u3Ob4g== dependencies: - "@nx/webpack" v17.2.5 + "@nx/webpack" "17.0.2" -"@nrwl/workspace@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nrwl/workspace/-/workspace-17.2.5.tgz#92cc6c8214c1cb2f2fbc798e2f6da8b11224f2be" - integrity sha512-xDyM/P6ggSW3efEgJ6GoYbErJX1uU14h8OXOS0jK5YLeDiJc7AYiW5JrMoZ1IQl4Pp+p2OrYE6nkc8l2zBXjAQ== +"@nrwl/workspace@17.0.2": + version "17.0.2" + resolved "https://registry.yarnpkg.com/@nrwl/workspace/-/workspace-17.0.2.tgz#9840eae5ee0c35e693cfbce152ce6c3db6c8c4fa" + integrity sha512-ntX+cE6Gs1MOdG027MHkueyEze4yNbRy54uXhWhOCUy5gcP4eNmsrxOOccajP7tVrvAW83wrp9PXJ1wQhNWOYA== dependencies: - "@nx/workspace" v17.2.5 + "@nx/workspace" "17.0.2" "@nuxtjs/opencollective@0.3.2": version "0.3.2" @@ -4434,23 +3731,24 @@ consola "^2.15.0" node-fetch "^2.6.1" -"@nx/angular@17.2.5", "@nx/angular@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nx/angular/-/angular-17.2.5.tgz#7a25a306f48a338fa791175bd16f3ddb4fd113f8" - integrity sha512-7VT9nMrvla0aDuVHtY2AwCTjovwZ79eOFrengA2MfAwxDUaUGx9qZS7q+CgTtFTxzHhfhoz1EUZvA9s5/KfuXg== - dependencies: - "@nrwl/angular" v17.2.5 - "@nx/cypress" v17.2.5 - "@nx/devkit" v17.2.5 - "@nx/eslint" v17.2.5 - "@nx/jest" v17.2.5 - "@nx/js" v17.2.5 - "@nx/web" v17.2.5 - "@nx/webpack" v17.2.5 - "@nx/workspace" v17.2.5 +"@nx/angular@17.0.2": + version "17.0.2" + resolved "https://registry.yarnpkg.com/@nx/angular/-/angular-17.0.2.tgz#063627fd1ed61b1ef77055da5f0e89f0ce43ff28" + integrity sha512-I3C9ImpFYChIVWrXLI2cZy1uiJ6zzoHTDd+y1tuhWF+OWMoeCi/iVKyk4DWucdU2AUlpgfJWRVWqCQcMR32U1Q== + dependencies: + "@nrwl/angular" "17.0.2" + "@nx/cypress" "17.0.2" + "@nx/devkit" "17.0.2" + "@nx/eslint" "17.0.2" + "@nx/jest" "17.0.2" + "@nx/js" "17.0.2" + "@nx/web" "17.0.2" + "@nx/webpack" "17.0.2" + "@nx/workspace" "17.0.2" "@phenomnomnominal/tsquery" "~5.0.1" - "@typescript-eslint/type-utils" "^6.9.1" + "@typescript-eslint/type-utils" "^5.36.1" chalk "^4.1.0" + enquirer "^2.3.6" find-cache-dir "^3.3.2" ignore "^5.0.4" magic-string "~0.30.2" @@ -4460,26 +3758,26 @@ webpack "^5.80.0" webpack-merge "^5.8.0" -"@nx/cypress@17.2.5", "@nx/cypress@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nx/cypress/-/cypress-17.2.5.tgz#26027721f172532a6f3a421751d03901fa2491e8" - integrity sha512-sSvS60KOOO+K+Y+yokSOFpR+fNyOoI8262fGcOAoXhZFzgYSTUidtfdmza5KtHDTLDYiu3/nRCigcy6tB/NH0g== +"@nx/cypress@17.0.2": + version "17.0.2" + resolved "https://registry.yarnpkg.com/@nx/cypress/-/cypress-17.0.2.tgz#6baa48294fa01101d73ef5c8257baa55c7364a1c" + integrity sha512-lkdhz6CHaLA/ZhNnqwXBp4Mlg1eTtCO09pYYHMx43D7EPObO1XbYtm6rivWg6kDzEmz84+Jwo0RucK7loMlHqA== dependencies: - "@nrwl/cypress" v17.2.5 - "@nx/devkit" v17.2.5 - "@nx/eslint" v17.2.5 - "@nx/js" v17.2.5 + "@nrwl/cypress" "17.0.2" + "@nx/devkit" "17.0.2" + "@nx/eslint" "17.0.2" + "@nx/js" "17.0.2" "@phenomnomnominal/tsquery" "~5.0.1" detect-port "^1.5.1" semver "7.5.3" tslib "^2.3.0" -"@nx/devkit@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nx/devkit/-/devkit-17.2.5.tgz#3204483bcb71f14c4eb67e1e3e8b75e795b3df3c" - integrity sha512-eOIIziLA1AxRtRiDI+ZNGpXVtIwrYKeVTsGbLljaj3i5Ks753VMH340WNNlzMUXMseWG6XuQ4PkMhURza2tzog== +"@nx/devkit@17.0.2": + version "17.0.2" + resolved "https://registry.yarnpkg.com/@nx/devkit/-/devkit-17.0.2.tgz#2f931d243dcc08e3cf4e238d782bc14ee40312f6" + integrity sha512-gtJNrFtGZa96qAM4ijAvoCLj/LuUr+Jq91QITsYE4cvYL0qan4zGcAOBMclzpaXVN9pwpko+veDwHwnmp/SXTg== dependencies: - "@nrwl/devkit" v17.2.5 + "@nrwl/devkit" "17.0.2" ejs "^3.1.7" enquirer "~2.3.6" ignore "^5.0.4" @@ -4487,43 +3785,43 @@ tmp "~0.2.1" tslib "^2.3.0" -"@nx/eslint-plugin@17.2.5", "@nx/eslint-plugin@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nx/eslint-plugin/-/eslint-plugin-17.2.5.tgz#f454d9fcb87aec29c9f329196c2cb5107698c550" - integrity sha512-xd6IN0/9dt6+8Nd3HvqKnABe5ZcU5RAbVpr3m1t1YD0ZdDYVih492vNuLg4kaAYS+GYut/UQSBTSk+n2cLw9pg== +"@nx/eslint-plugin@17.0.2": + version "17.0.2" + resolved "https://registry.yarnpkg.com/@nx/eslint-plugin/-/eslint-plugin-17.0.2.tgz#97775a11bd8b13cb00bac5489a7c33ffddc4cfa2" + integrity sha512-ZI/vthG7wYG9+xA3inYnJ+XP8itMlZpIYT63SZm4h05MRYQG4MkShkrOkSWYBtT2j5b1AgSzSemkpCGuG798pQ== dependencies: - "@nrwl/eslint-plugin-nx" v17.2.5 - "@nx/devkit" v17.2.5 - "@nx/js" v17.2.5 - "@typescript-eslint/type-utils" "^6.13.2" - "@typescript-eslint/utils" "^6.13.2" + "@nrwl/eslint-plugin-nx" "17.0.2" + "@nx/devkit" "17.0.2" + "@nx/js" "17.0.2" + "@typescript-eslint/type-utils" "^5.60.1" + "@typescript-eslint/utils" "^5.60.1" chalk "^4.1.0" confusing-browser-globals "^1.0.9" jsonc-eslint-parser "^2.1.0" semver "7.5.3" tslib "^2.3.0" -"@nx/eslint@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nx/eslint/-/eslint-17.2.5.tgz#c627bcf4392c35f8c9e585333ee20dd4f5b86a3b" - integrity sha512-+S33U/AXvAygB72Dp646aGAJOhCAJRZGCiArq8nASERD6HWAQU4DMqcYflvTP1OqjPSHkVlaL/JIp7y+XzdTfQ== +"@nx/eslint@17.0.2": + version "17.0.2" + resolved "https://registry.yarnpkg.com/@nx/eslint/-/eslint-17.0.2.tgz#f330aff5154fe11e3e8db73747c183a27e6d54d0" + integrity sha512-mZXavg/m+A0GqmWORq5jNRt7ku0q9OoX2212ldivvLYI1zHHr2VFYoRxhS+NzaZBK5/EiKs/5P8dHhYb4/v7Bw== dependencies: - "@nx/devkit" v17.2.5 - "@nx/js" v17.2.5 - "@nx/linter" v17.2.5 + "@nx/devkit" "17.0.2" + "@nx/js" "17.0.2" + "@nx/linter" "17.0.2" tslib "^2.3.0" - typescript "~5.2.2" + typescript "~5.1.3" -"@nx/jest@17.2.5", "@nx/jest@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nx/jest/-/jest-17.2.5.tgz#1752a869af187627aef9bc2859eee2f949bba93d" - integrity sha512-Fl7RFLY/4k0AqwX8XibkyMd23yCFtRGW68NFk2I2PlaPwnhS9HEoTb4aMJ8PcTqKXyHg2dyGpjv5QMBEtq6yqA== +"@nx/jest@17.0.2": + version "17.0.2" + resolved "https://registry.yarnpkg.com/@nx/jest/-/jest-17.0.2.tgz#0ab94d453cd27479d58824f175f0116fed20d352" + integrity sha512-kpkziUOZpKsVvi5iicirX4EVwfKXaGuiv5bgzj1uiexD83tlds5ne8J2qN/K1ea5jIC+bxHzqJF5s7rF52T0cg== dependencies: "@jest/reporters" "^29.4.1" "@jest/test-result" "^29.4.1" - "@nrwl/jest" v17.2.5 - "@nx/devkit" v17.2.5 - "@nx/js" v17.2.5 + "@nrwl/jest" "17.0.2" + "@nx/devkit" "17.0.2" + "@nx/js" "17.0.2" "@phenomnomnominal/tsquery" "~5.0.1" chalk "^4.1.0" identity-obj-proxy "3.0.0" @@ -4533,21 +3831,20 @@ resolve.exports "1.1.0" tslib "^2.3.0" -"@nx/js@17.2.5", "@nx/js@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nx/js/-/js-17.2.5.tgz#8082ea9ffcd99f7b49efe1259c932359707a9a6c" - integrity sha512-kgH7GRGE+c3RXhvY8C7Np5FWK4yk0mRjnL5X6r14ZYPZPwj0OAOGiFXUVy14epp1SHdyqK1gz878kdrpxomaCQ== +"@nx/js@17.0.2": + version "17.0.2" + resolved "https://registry.yarnpkg.com/@nx/js/-/js-17.0.2.tgz#5d277ab4439c3245abb246e0aedda241844de0a5" + integrity sha512-dYvWDd0jwNF4h4V8yjd1ZMSJ38GcpvwrDUVYGYNkZmDqYzkBvqykpY00hRLUYZspiR+iG7uWmyxItZYpCk0WyA== dependencies: "@babel/core" "^7.22.9" "@babel/plugin-proposal-decorators" "^7.22.7" - "@babel/plugin-transform-class-properties" "^7.22.5" "@babel/plugin-transform-runtime" "^7.22.9" "@babel/preset-env" "^7.22.9" "@babel/preset-typescript" "^7.22.5" "@babel/runtime" "^7.22.6" - "@nrwl/js" v17.2.5 - "@nx/devkit" v17.2.5 - "@nx/workspace" v17.2.5 + "@nrwl/js" "17.0.2" + "@nx/devkit" "17.0.2" + "@nx/workspace" "17.0.2" "@phenomnomnominal/tsquery" "~5.0.1" babel-plugin-const-enum "^1.0.1" babel-plugin-macros "^2.8.0" @@ -4569,125 +3866,125 @@ tsconfig-paths "^4.1.2" tslib "^2.3.0" -"@nx/linter@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nx/linter/-/linter-17.2.5.tgz#564663a17ff05fa0e8589382d5c37f07be095c34" - integrity sha512-MbTDC3H5w6rOfPxDEKScYn9ByXlCwJEX9U6Bh6GGkVl+w0rZ0rwxtwR4i4EIbMNmuWVhQK1GE8gQf2kzndfOhg== +"@nx/linter@17.0.2": + version "17.0.2" + resolved "https://registry.yarnpkg.com/@nx/linter/-/linter-17.0.2.tgz#28938d5e42854088fd3356ebd160613dfd4b3706" + integrity sha512-cXCrx/qcZc53GKqOLRIPTqACdby9/plOpfQlo0BlHMOrwvkkKjzXsnoJgR6XRWdegDKVkqUWHWDAjDI3/aMshA== dependencies: - "@nx/eslint" v17.2.5 + "@nx/eslint" "17.0.2" -"@nx/nest@17.2.5", "@nx/nest@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nx/nest/-/nest-17.2.5.tgz#bb2cf0d9fa03322d578abc47a2da69e18bf24c94" - integrity sha512-FuXS2VjE+LBMbEcWMHmQlWSkyb+NQypyBrK/oR2xbv2nUXV2qsT9lutVZMqdCJRovPsiPUgaBpVts+oUDaL9Ew== +"@nx/nest@17.0.2": + version "17.0.2" + resolved "https://registry.yarnpkg.com/@nx/nest/-/nest-17.0.2.tgz#3acad658c7ce99582793b724ed6b78331d91b0f8" + integrity sha512-dlvUaC1roqUWs8h0PJOIfbG0MZNwLDudZTsG/YiW94zvVm5NleQ6kwsvAvzSxiPHg6kIo61T6yIUp9OIjFru3g== dependencies: "@nestjs/schematics" "^9.1.0" - "@nrwl/nest" v17.2.5 - "@nx/devkit" v17.2.5 - "@nx/eslint" v17.2.5 - "@nx/js" v17.2.5 - "@nx/node" v17.2.5 + "@nrwl/nest" "17.0.2" + "@nx/devkit" "17.0.2" + "@nx/eslint" "17.0.2" + "@nx/js" "17.0.2" + "@nx/node" "17.0.2" "@phenomnomnominal/tsquery" "~5.0.1" tslib "^2.3.0" -"@nx/node@17.2.5", "@nx/node@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nx/node/-/node-17.2.5.tgz#6ffe2779070d4a0b6c180f32b8f9e6ba1fa1d575" - integrity sha512-vAe13g/pnM3QeNQezk+AqJ5u9gYftQg9KqVk1tojKL3eHKfuVs1ZCvFTaANStgao1bNysOZAzPXvfeHLj7MWbw== +"@nx/node@17.0.2": + version "17.0.2" + resolved "https://registry.yarnpkg.com/@nx/node/-/node-17.0.2.tgz#0545941a3a1aa09cb153b1a267bab1350e875201" + integrity sha512-//FC3FuSFcMg9j6r3EucCLxJCoLUK56xfLGy6iDilW7LsEX54SB8lau0kq2ymDbBRRT/piI1s7RH+Lk777yBIw== dependencies: - "@nrwl/node" v17.2.5 - "@nx/devkit" v17.2.5 - "@nx/eslint" v17.2.5 - "@nx/jest" v17.2.5 - "@nx/js" v17.2.5 + "@nrwl/node" "17.0.2" + "@nx/devkit" "17.0.2" + "@nx/eslint" "17.0.2" + "@nx/jest" "17.0.2" + "@nx/js" "17.0.2" tslib "^2.3.0" -"@nx/nx-darwin-arm64@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nx/nx-darwin-arm64/-/nx-darwin-arm64-17.2.5.tgz#411b861cb0a98540082b7639dbaaa9f48044a25a" - integrity sha512-AGF/XnMkXymS8xYMsbeyNKZWKflfU8TTqEJqlcADMHYcr8OD1Jyq1YYHp/vvPBWqEhUL4bx3GPspQn5YiiCrWw== - -"@nx/nx-darwin-x64@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nx/nx-darwin-x64/-/nx-darwin-x64-17.2.5.tgz#94900e137763b03abeb41f2279e214ea606ad9a8" - integrity sha512-YQQG+kijDNedE6bwEIeKWtVQOxJD+NHW69z6sb/S+ub8NO293YgNtYXgilet9RwOKBubeSyBqWr+yYbRhOuz+A== - -"@nx/nx-freebsd-x64@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nx/nx-freebsd-x64/-/nx-freebsd-x64-17.2.5.tgz#731ffa2f70142a28ce33fd59ef564e24ba94ee5f" - integrity sha512-AzcYELtNDukSTtO6zTAuu9pUI2634/2ZFLdS15C9cqUrK0XNvBcbj6R1KNGjgaBDUJc9H49+fqU8VnLPpJjBKQ== - -"@nx/nx-linux-arm-gnueabihf@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-17.2.5.tgz#4d21f74981baeb7528ff2259a5a433e14af6d8f8" - integrity sha512-24Q5N4krcSV6rbFYGRRgbHTc2eSDoJSWesvAtxAW5Sgh6+wAuqFKVwLwY9ZOn1GQwlySB87YwzH2BMkOfEuorw== - -"@nx/nx-linux-arm64-gnu@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-17.2.5.tgz#067d2e9adccbd1bff4dbad7ac1338c02ddb3bf9c" - integrity sha512-ty08Jnhk/eCVzxdm6o9EaGAZQ4t1WQCO9I/FjriEqtt4e5If6YKJPGjRzu/1OCvppv4d7j0SEN6FiyGkESpBPw== - -"@nx/nx-linux-arm64-musl@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-17.2.5.tgz#7257b80b3e36070136d06d38f7a45d5732146c80" - integrity sha512-iW/hOgkpELTTu53UYNYAUvs5dAXDR94P50HZFvTQeTQH6xr8igMdOBFdApYFZIjD7IrKqNBSeAiyl4TyI6vFag== - -"@nx/nx-linux-x64-gnu@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-17.2.5.tgz#21d0ed9ecb8fc3742ba5220a4f2a6f4e0d9780d4" - integrity sha512-BJi195AOHSHurMrPzT2mNGslIDn4LVxfKKdiRqVeOvQxT3cZij4fzPTUYxdOFnrWU5YPfW4A9p3ydFz8MDapOg== - -"@nx/nx-linux-x64-musl@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-17.2.5.tgz#ed68c1df2521259ef1e522f034af63eaa19771ea" - integrity sha512-r1TrCFvdAIvogNry3Oy0IrWT2Ed5nZHR0lcuW5ImF0HinMmH/o4Ey7Q4IRo5hB88gxq4AUTWt+WoQbImIvoGPg== - -"@nx/nx-win32-arm64-msvc@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-17.2.5.tgz#151c69871e59b061eace5ef9dedac2b684be4fa3" - integrity sha512-TyMH8mys+r4Vgq5LYE6zY70LsL2F7JC85O+jHeVPR0vDNGm5Nb/UHobT5Y/PLpLxIx0aIeRuu6VI3j3oh1JhNw== - -"@nx/nx-win32-x64-msvc@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-17.2.5.tgz#89d2ffa519f8ab4e17469b7d65e353d787feb52e" - integrity sha512-I/LWvNasB+iUEzIeejbuaeeezMCfMjpDBsiPdnS5nfHMVnTOrIbfzQOWLWUr+/7R0fYl1BXTp352iaD+M10Agw== - -"@nx/storybook@17.2.5", "@nx/storybook@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nx/storybook/-/storybook-17.2.5.tgz#c6c087686615036ba5ae51a1a485e9d075080991" - integrity sha512-usF+TxjIF9LmzOBVapp4CJ9Y8dD1rBxjdRpJVzjGfSnpUjvxKGxDZ1dYC2UPojaNAuMcYhQMTGjdwPGU3cJ4oA== - dependencies: - "@nrwl/storybook" v17.2.5 - "@nx/cypress" v17.2.5 - "@nx/devkit" v17.2.5 - "@nx/eslint" v17.2.5 - "@nx/js" v17.2.5 +"@nx/nx-darwin-arm64@17.0.2": + version "17.0.2" + resolved "https://registry.yarnpkg.com/@nx/nx-darwin-arm64/-/nx-darwin-arm64-17.0.2.tgz#01ad3267a904996987cd53aa105078a8c6451cbf" + integrity sha512-OSZLRfV8VplYPEqMcIg3mbAsJXlXEHKrdlJ0KUTk8Hih2+wl7cxuSEwG7X7qfBUOz+ognxaqicL+hueNrgwjlQ== + +"@nx/nx-darwin-x64@17.0.2": + version "17.0.2" + resolved "https://registry.yarnpkg.com/@nx/nx-darwin-x64/-/nx-darwin-x64-17.0.2.tgz#1752af6003c25f0c8360482da2e959a32e29b150" + integrity sha512-olGt5R2dWYwdl1+I2RfJ8LdZO1elqhr9yDPnMIx//ZuN6T6wJA+Wdp2P3qpM1bY0F1lI/6AgjqzRyrTLUZ9cDA== + +"@nx/nx-freebsd-x64@17.0.2": + version "17.0.2" + resolved "https://registry.yarnpkg.com/@nx/nx-freebsd-x64/-/nx-freebsd-x64-17.0.2.tgz#e97ec71c418e64d98e53c308cd2b72dcb203ede8" + integrity sha512-+mta0J2G2byd+rfZ275oZs0aYXC/s92nI9ySBFQFQZnKJ6bsAagdZHe+uETsnE4xdhFXD8kvNMJU1WTGlyFyjg== + +"@nx/nx-linux-arm-gnueabihf@17.0.2": + version "17.0.2" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-17.0.2.tgz#5ac923e09f5676d96fa0c869ea6aec37b0aba100" + integrity sha512-m80CmxHHyNAJ8j/0rkjc0hg/eGQlf6V2sLsV+gEJkz2sTEEdgSOK4DvnWcZRWO/SWBnqigxoHX4Kf5TH1nmoHA== + +"@nx/nx-linux-arm64-gnu@17.0.2": + version "17.0.2" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-17.0.2.tgz#f48b9ca7767dd63d3d51406c25561c598f815fc8" + integrity sha512-AsD1H6wt68MK1u6vkmtNaFaxDMcyuk6dpo5kq1YT9cfUd614ys3qMUjVp3P2CXxzXh+0UDZeGrc6qotNKOkpJw== + +"@nx/nx-linux-arm64-musl@17.0.2": + version "17.0.2" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-17.0.2.tgz#cb8839fecf83eb96d787fcccea12322a66bca742" + integrity sha512-f8pUFoZHBFQtHnopHgTEuwIiu0Rzem0dD7iK8SyyBy/lRAADtHCAHxaPAG+iatHAJ9h4DFIB50k9ybYxDtH2mg== + +"@nx/nx-linux-x64-gnu@17.0.2": + version "17.0.2" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-17.0.2.tgz#200b72d08baec0565494643c45a98bb7754283f9" + integrity sha512-PISrHjLTxv5w8bz50vPZH6puYos88xu28o4IbVyYWrUrhoFsAx9Zbn1D6gWDPMSaKJU32v1l+5bTciQjQJU8fQ== + +"@nx/nx-linux-x64-musl@17.0.2": + version "17.0.2" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-17.0.2.tgz#2c2da294dbd47ad616ec233e38ee62b30c740fdc" + integrity sha512-2wsqyBRjsxmAjxW+0lnGFtJLTk+AxgW7gjMv8NgLK8P1bc/sJYQB+g0o5op2z+szXRG3Noi0RZ9C0fG39EPFZw== + +"@nx/nx-win32-arm64-msvc@17.0.2": + version "17.0.2" + resolved "https://registry.yarnpkg.com/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-17.0.2.tgz#cb6d224ab1b05eaa6721bd599ff8eb3e99b1c925" + integrity sha512-Sc3sQUcS5xdk05PABe/knG6orG5rmHZdSUj6SMRpvYfN2tM3ziNn6/wCF/LJoW6n70OxrOEXXwLSRK/5WigXbA== + +"@nx/nx-win32-x64-msvc@17.0.2": + version "17.0.2" + resolved "https://registry.yarnpkg.com/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-17.0.2.tgz#64c330208df45608aaaf8784c141203bbe30c4b1" + integrity sha512-XhET0BDk6fbvTBCs7m5gZii8+2WhLpiC1sZchJw4LAJN2VJBiy3I3xnvpQYGFOAWaCb/iUGpuN/qP/NlQ+LNgA== + +"@nx/storybook@17.0.2": + version "17.0.2" + resolved "https://registry.yarnpkg.com/@nx/storybook/-/storybook-17.0.2.tgz#11af64a79dab6181969ce3708027372925876999" + integrity sha512-5yr2BEf1TILkp6WFgIBagYiL+sEj7KxRzVUBEL8MCbpJVUCw/lWN+K/PeQvrOBRc/tV8uiP5p+wRq9EJz6IUgg== + dependencies: + "@nrwl/storybook" "17.0.2" + "@nx/cypress" "17.0.2" + "@nx/devkit" "17.0.2" + "@nx/eslint" "17.0.2" + "@nx/js" "17.0.2" "@phenomnomnominal/tsquery" "~5.0.1" semver "7.5.3" tslib "^2.3.0" -"@nx/web@17.2.5", "@nx/web@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nx/web/-/web-17.2.5.tgz#0a1fe4620534eacd502435ec49fd6aa72c624ac9" - integrity sha512-PP3HBnkhIiswFOYsoRNLsGgZBA4JPmPHNDgr7AxMDBvHpqxMv9sWjTAZq91iOWQB86cY3Bd0C/xEMU5zYjBQ2w== +"@nx/web@17.0.2": + version "17.0.2" + resolved "https://registry.yarnpkg.com/@nx/web/-/web-17.0.2.tgz#5c1f60a5b740ba1044ab0a74686e38c54f283fa9" + integrity sha512-M8bausXzgkeFlNn43uO3pxtn/1EDoIs/7xgWPoGAdqV4l4RKG0JHqeLi68tP6YVA30RSAZ7UmvKQlKo14uDp0w== dependencies: - "@nrwl/web" v17.2.5 - "@nx/devkit" v17.2.5 - "@nx/js" v17.2.5 + "@nrwl/web" "17.0.2" + "@nx/devkit" "17.0.2" + "@nx/js" "17.0.2" chalk "^4.1.0" detect-port "^1.5.1" http-server "^14.1.0" tslib "^2.3.0" -"@nx/webpack@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nx/webpack/-/webpack-17.2.5.tgz#ef4c7f52d769cd39e5ef0eafa051d820d324809b" - integrity sha512-SFm5kdyZGirsHaMReTuVAit38gwbNg7rYpwFzMfd1WXvhQ8m7NSLwxiL8+NvTir7iafMIbq7gU6oxUnbzsNQ1g== +"@nx/webpack@17.0.2": + version "17.0.2" + resolved "https://registry.yarnpkg.com/@nx/webpack/-/webpack-17.0.2.tgz#677ee3fccc35bc1e4a1ba3b15e99586a531ad281" + integrity sha512-TnC+Cpg7MPc6vl1Vu2sVzav/F+6mhmev3tH3nCUFywTwHXrK+i/NQhuvXWEixVt+l77V4Di6VhMKfHaGryfU6Q== dependencies: "@babel/core" "^7.22.9" - "@nrwl/webpack" v17.2.5 - "@nx/devkit" v17.2.5 - "@nx/js" v17.2.5 + "@nrwl/webpack" "17.0.2" + "@nx/devkit" "17.0.2" + "@nx/js" "17.0.2" autoprefixer "^10.4.9" babel-loader "^9.1.2" browserslist "^4.21.4" @@ -4721,16 +4018,16 @@ webpack-node-externals "^3.0.0" webpack-subresource-integrity "^5.1.0" -"@nx/workspace@17.2.5", "@nx/workspace@v17.2.5": - version "17.2.5" - resolved "https://registry.yarnpkg.com/@nx/workspace/-/workspace-17.2.5.tgz#52431c833a0b3295aa177ccfffefb6f99d1c95bc" - integrity sha512-2xcY9s8jK73JBNpXiFg17TwU4gHtOh59HdKFr7sjkCFVBPNPPv5E9/ZRHtsIC7qko6loM/i47NTP52nX7fhEfQ== +"@nx/workspace@17.0.2": + version "17.0.2" + resolved "https://registry.yarnpkg.com/@nx/workspace/-/workspace-17.0.2.tgz#ce273f371c8fccb222e66decab2d4bf0de8d0799" + integrity sha512-z2xit36dxdJuQmBDadNbbaYCKUYNk6mUWG/GEeBdgGXvFixqAUZ4lbWARlauCQS/+rEjXGOxtvn+u2d8u9mTSA== dependencies: - "@nrwl/workspace" v17.2.5 - "@nx/devkit" v17.2.5 + "@nrwl/workspace" "17.0.2" + "@nx/devkit" "17.0.2" chalk "^4.1.0" enquirer "~2.3.6" - nx v17.2.5 + nx "17.0.2" tslib "^2.3.0" yargs-parser "21.1.1" @@ -5142,13 +4439,13 @@ "@angular-devkit/schematics" "17.0.0" jsonc-parser "3.2.0" -"@schematics/angular@17.0.7": - version "17.0.7" - resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-17.0.7.tgz#7e4e411f523413a6a80aad1309b5e278a2baca7b" - integrity sha512-d7QKmcKrM4owb/2bR7Ipf23roiNbvbD/x7reNhQAtKAPLSHJ3Ulkf1+Yv+dj+9f+K7y9SBviEUSrD27BQ9WaxQ== +"@schematics/angular@17.0.3": + version "17.0.3" + resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-17.0.3.tgz#58b6d2d67875136de1990560d8423e4a30baeea9" + integrity sha512-pFHAqHMNm2WLoquJD4osSA/OAgH+wsFayPuqQnKjDEzeVW/YfJSbUksJ2iFt+uSfrhc/VxPf6pmGBMzi+9d0ng== dependencies: - "@angular-devkit/core" "17.0.7" - "@angular-devkit/schematics" "17.0.7" + "@angular-devkit/core" "17.0.3" + "@angular-devkit/schematics" "17.0.3" jsonc-parser "3.2.0" "@sigstore/bundle@^2.1.0": @@ -5246,134 +4543,189 @@ resolved "https://registry.yarnpkg.com/@stencil/core/-/core-2.22.3.tgz#83987e20bba855c450f6d6780e3a20192603f13f" integrity sha512-kmVA0M/HojwsfkeHsifvHVIYe4l5tin7J5+DLgtl8h6WWfiMClND5K3ifCXXI2ETDNKiEk21p6jql3Fx9o2rng== -"@storybook/addon-actions@7.6.5": - version "7.6.5" - resolved "https://registry.yarnpkg.com/@storybook/addon-actions/-/addon-actions-7.6.5.tgz#276ed222cc038423cd5ee80441f88544a2663311" - integrity sha512-lW/m9YcaNfBZk+TZLxyzHdd563mBWpsUIveOKYjcPdl/q0FblWWZrRsFHqwLK1ldZ4AZXs8J/47G8CBr6Ew2uQ== +"@storybook/addon-actions@7.5.3": + version "7.5.3" + resolved "https://registry.yarnpkg.com/@storybook/addon-actions/-/addon-actions-7.5.3.tgz#e0d0d819488d1d19918b23469b3ea6610fee5f07" + integrity sha512-v3yL6Eq/jCiXfA24JjRdbEQUuorms6tmrywaKcd1tAy4Ftgof0KHB4tTcTyiajrI5bh6PVJoRBkE8IDqmNAHkA== dependencies: - "@storybook/core-events" "7.6.5" + "@storybook/client-logger" "7.5.3" + "@storybook/components" "7.5.3" + "@storybook/core-events" "7.5.3" "@storybook/global" "^5.0.0" - "@types/uuid" "^9.0.1" + "@storybook/manager-api" "7.5.3" + "@storybook/preview-api" "7.5.3" + "@storybook/theming" "7.5.3" + "@storybook/types" "7.5.3" dequal "^2.0.2" + lodash "^4.17.21" polished "^4.2.2" + prop-types "^15.7.2" + react-inspector "^6.0.0" + telejson "^7.2.0" + ts-dedent "^2.0.0" uuid "^9.0.0" -"@storybook/addon-backgrounds@7.6.5": - version "7.6.5" - resolved "https://registry.yarnpkg.com/@storybook/addon-backgrounds/-/addon-backgrounds-7.6.5.tgz#0b65a2163309b3768540301353e14878e27b7dcb" - integrity sha512-wZZOL19vg4TTRtOTl71XKqPe5hQx3XUh9Fle0wOi91FiFrBdqusrppnyS89wPS8RQG5lXEOFEUvYcMmdCcdZfw== +"@storybook/addon-backgrounds@7.5.3": + version "7.5.3" + resolved "https://registry.yarnpkg.com/@storybook/addon-backgrounds/-/addon-backgrounds-7.5.3.tgz#a6aa9df791220cff6290e7f93e04c546063f5407" + integrity sha512-UCOVd4UNIL5FRiwi9nyiWFocn/7ewwS6bIWnq66AaHg/sv92YwsPmgQJn0DMBGDOvUAWpiHdVsZNOTX6nvw4gA== dependencies: + "@storybook/client-logger" "7.5.3" + "@storybook/components" "7.5.3" + "@storybook/core-events" "7.5.3" "@storybook/global" "^5.0.0" + "@storybook/manager-api" "7.5.3" + "@storybook/preview-api" "7.5.3" + "@storybook/theming" "7.5.3" + "@storybook/types" "7.5.3" memoizerific "^1.11.3" ts-dedent "^2.0.0" -"@storybook/addon-controls@7.6.5": - version "7.6.5" - resolved "https://registry.yarnpkg.com/@storybook/addon-controls/-/addon-controls-7.6.5.tgz#1d7467da3d9d2eba7d325366ccbcd60d73803a5b" - integrity sha512-EdSZ2pYf74mOXZGGJ22lrDvdvL0YKc95iWv9FFEhUFOloMy/0OZPB2ybYmd2KVCy3SeIE4Zfeiw8pDXdCUniOQ== - dependencies: - "@storybook/blocks" "7.6.5" +"@storybook/addon-controls@7.5.3": + version "7.5.3" + resolved "https://registry.yarnpkg.com/@storybook/addon-controls/-/addon-controls-7.5.3.tgz#03ce5a31603b360fe906cefb3fe4945ef7188e62" + integrity sha512-KEuU4X5Xr6cJI9xrzOUVGEmUf1iHPfK7cj0GACKv0GElsdIsQryv+OZ7gRnvmNax/e2hm2t9cJcFxB24/p6rVg== + dependencies: + "@storybook/blocks" "7.5.3" + "@storybook/client-logger" "7.5.3" + "@storybook/components" "7.5.3" + "@storybook/core-common" "7.5.3" + "@storybook/core-events" "7.5.3" + "@storybook/manager-api" "7.5.3" + "@storybook/node-logger" "7.5.3" + "@storybook/preview-api" "7.5.3" + "@storybook/theming" "7.5.3" + "@storybook/types" "7.5.3" lodash "^4.17.21" ts-dedent "^2.0.0" -"@storybook/addon-docs@7.6.5": - version "7.6.5" - resolved "https://registry.yarnpkg.com/@storybook/addon-docs/-/addon-docs-7.6.5.tgz#60a658deb589db73c20dff4b1d8c6b30b4e22232" - integrity sha512-D9tZyD41IujCHiPYdfS2bKtZRJPNwO4EydzyqODXppomluhFbY3uTEaf0H1UFnJLQxWNXZ7rr3aS0V3O6yu8pA== +"@storybook/addon-docs@7.5.3": + version "7.5.3" + resolved "https://registry.yarnpkg.com/@storybook/addon-docs/-/addon-docs-7.5.3.tgz#36c28c9a54b28e3b4b1450e821d65e07be6da45b" + integrity sha512-JVQ6iCXKESij/SbE4Wq47dkSSgBRulvA8SUf8NWL5m9qpiHrg0lPSERHfoTLiB5uC/JwF0OKIlhxoWl+zCmtYg== dependencies: "@jest/transform" "^29.3.1" "@mdx-js/react" "^2.1.5" - "@storybook/blocks" "7.6.5" - "@storybook/client-logger" "7.6.5" - "@storybook/components" "7.6.5" - "@storybook/csf-plugin" "7.6.5" - "@storybook/csf-tools" "7.6.5" + "@storybook/blocks" "7.5.3" + "@storybook/client-logger" "7.5.3" + "@storybook/components" "7.5.3" + "@storybook/csf-plugin" "7.5.3" + "@storybook/csf-tools" "7.5.3" "@storybook/global" "^5.0.0" "@storybook/mdx2-csf" "^1.0.0" - "@storybook/node-logger" "7.6.5" - "@storybook/postinstall" "7.6.5" - "@storybook/preview-api" "7.6.5" - "@storybook/react-dom-shim" "7.6.5" - "@storybook/theming" "7.6.5" - "@storybook/types" "7.6.5" + "@storybook/node-logger" "7.5.3" + "@storybook/postinstall" "7.5.3" + "@storybook/preview-api" "7.5.3" + "@storybook/react-dom-shim" "7.5.3" + "@storybook/theming" "7.5.3" + "@storybook/types" "7.5.3" fs-extra "^11.1.0" remark-external-links "^8.0.0" remark-slug "^6.0.0" ts-dedent "^2.0.0" -"@storybook/addon-essentials@7.6.5": - version "7.6.5" - resolved "https://registry.yarnpkg.com/@storybook/addon-essentials/-/addon-essentials-7.6.5.tgz#0b785b58205eada1aa8374f2cba6bc39530147e9" - integrity sha512-VCLj1JAEpGoqF5iFJOo1CZFFck/tg4m/98DLdQuNuXvxT6jqaF0NI9UUQuJLIGteDCR7NKRbTFc1hV3/Ev+Ziw== - dependencies: - "@storybook/addon-actions" "7.6.5" - "@storybook/addon-backgrounds" "7.6.5" - "@storybook/addon-controls" "7.6.5" - "@storybook/addon-docs" "7.6.5" - "@storybook/addon-highlight" "7.6.5" - "@storybook/addon-measure" "7.6.5" - "@storybook/addon-outline" "7.6.5" - "@storybook/addon-toolbars" "7.6.5" - "@storybook/addon-viewport" "7.6.5" - "@storybook/core-common" "7.6.5" - "@storybook/manager-api" "7.6.5" - "@storybook/node-logger" "7.6.5" - "@storybook/preview-api" "7.6.5" +"@storybook/addon-essentials@7.5.3": + version "7.5.3" + resolved "https://registry.yarnpkg.com/@storybook/addon-essentials/-/addon-essentials-7.5.3.tgz#e6e3ea266181b42e15b4c57fc303adc238c102a4" + integrity sha512-PYj6swEI4nEzIbOTyHJB8u3K8ABYKoaW8XB5emMwsnrzB/TN7auHVhze2bQ/+ax5wyPKZpArPjxbWlSHtSws+A== + dependencies: + "@storybook/addon-actions" "7.5.3" + "@storybook/addon-backgrounds" "7.5.3" + "@storybook/addon-controls" "7.5.3" + "@storybook/addon-docs" "7.5.3" + "@storybook/addon-highlight" "7.5.3" + "@storybook/addon-measure" "7.5.3" + "@storybook/addon-outline" "7.5.3" + "@storybook/addon-toolbars" "7.5.3" + "@storybook/addon-viewport" "7.5.3" + "@storybook/core-common" "7.5.3" + "@storybook/manager-api" "7.5.3" + "@storybook/node-logger" "7.5.3" + "@storybook/preview-api" "7.5.3" ts-dedent "^2.0.0" -"@storybook/addon-highlight@7.6.5": - version "7.6.5" - resolved "https://registry.yarnpkg.com/@storybook/addon-highlight/-/addon-highlight-7.6.5.tgz#588818963c48cc1d0f06a20323e72e3f0077b7c4" - integrity sha512-CxzmIb30F9nLPQwT0lCPYhOAwGlGF4IkgkO8hYA7VfGCGUkJZEyyN/YkP/ZCUSdCIRChDBouR3KiFFd4mDFKzg== +"@storybook/addon-highlight@7.5.3": + version "7.5.3" + resolved "https://registry.yarnpkg.com/@storybook/addon-highlight/-/addon-highlight-7.5.3.tgz#ff1041aa1e9d76100ce6fb0b11e0d30078f858f7" + integrity sha512-jb+aNRhj+tFK7EqqTlNCjGkTrkWqWHGdD1ubgnj29v8XhRuCR9YboPS+306KYwBEkuF4kNCHZofLiEBPf6nCJg== dependencies: + "@storybook/core-events" "7.5.3" "@storybook/global" "^5.0.0" + "@storybook/preview-api" "7.5.3" -"@storybook/addon-measure@7.6.5": - version "7.6.5" - resolved "https://registry.yarnpkg.com/@storybook/addon-measure/-/addon-measure-7.6.5.tgz#f1b70c83166cfaa851808c9d73dca8e639860fc0" - integrity sha512-tlUudVQSrA+bwI4dhO8J7nYHtYdylcBZ86ybnqMmdTthsnyc7jnaFVQwbb6bbQJpPxvEvoNds5bVGUFocuvymQ== +"@storybook/addon-measure@7.5.3": + version "7.5.3" + resolved "https://registry.yarnpkg.com/@storybook/addon-measure/-/addon-measure-7.5.3.tgz#9cfc34d88807afba6bc36990aef26be8ca8f8567" + integrity sha512-fun9BqUTGXgcMpcbX9wUowGDkjCL8oKasZbjp/MvGM3vPTM6HQdwzHTLJGPBnmJ1xK92NhwFRs0BrQX6uF1yrg== dependencies: + "@storybook/client-logger" "7.5.3" + "@storybook/components" "7.5.3" + "@storybook/core-events" "7.5.3" "@storybook/global" "^5.0.0" + "@storybook/manager-api" "7.5.3" + "@storybook/preview-api" "7.5.3" + "@storybook/types" "7.5.3" tiny-invariant "^1.3.1" -"@storybook/addon-outline@7.6.5": - version "7.6.5" - resolved "https://registry.yarnpkg.com/@storybook/addon-outline/-/addon-outline-7.6.5.tgz#ad6ba7ce32e9fb2621c79a18dca7a791edbf5b85" - integrity sha512-P7X4+Z9L/l/RZW9UvvM+iuK2SUHD22KPc+dbYOifRXDovUqhfmcKVh1CUqTDMyZrg2ZAbropehMz1eI9BlQfxg== +"@storybook/addon-outline@7.5.3": + version "7.5.3" + resolved "https://registry.yarnpkg.com/@storybook/addon-outline/-/addon-outline-7.5.3.tgz#8b42758349ab07b5d39bf7e1b9cb2f83e173824a" + integrity sha512-c9vCi1SCGrtWr8qaOu/1GNWlrlrpl2lg4F9r+xtYf/KopenI3jSMz0YeTfmepZGAl+6Yc2Ywhm60jgpQ6SKciA== dependencies: + "@storybook/client-logger" "7.5.3" + "@storybook/components" "7.5.3" + "@storybook/core-events" "7.5.3" "@storybook/global" "^5.0.0" + "@storybook/manager-api" "7.5.3" + "@storybook/preview-api" "7.5.3" + "@storybook/types" "7.5.3" ts-dedent "^2.0.0" -"@storybook/addon-toolbars@7.6.5": - version "7.6.5" - resolved "https://registry.yarnpkg.com/@storybook/addon-toolbars/-/addon-toolbars-7.6.5.tgz#a7e49640daad1b45926e453e36d8d8fecd88becf" - integrity sha512-/zqWbVNE/SHc8I5Prnd2Q8U57RGEIYvHfeXjfkuLcE2Quc4Iss4x/9eU7SKu4jm+IOO2s0wlN6HcqI3XEf2XxA== +"@storybook/addon-toolbars@7.5.3": + version "7.5.3" + resolved "https://registry.yarnpkg.com/@storybook/addon-toolbars/-/addon-toolbars-7.5.3.tgz#754e818935f08f05d4e06aefafe40a1080c4d575" + integrity sha512-KdLr4sGMJzhtjNTNE2ocfu58yOHHUyZ/cI3BTp7a0gq9YbUpHmC3XTNr26/yOYYrdjkiMD26XusJUjXe+/V2xw== + dependencies: + "@storybook/client-logger" "7.5.3" + "@storybook/components" "7.5.3" + "@storybook/manager-api" "7.5.3" + "@storybook/preview-api" "7.5.3" + "@storybook/theming" "7.5.3" -"@storybook/addon-viewport@7.6.5": - version "7.6.5" - resolved "https://registry.yarnpkg.com/@storybook/addon-viewport/-/addon-viewport-7.6.5.tgz#c6472679828b0a77c0db12662e42d18f8999a6f5" - integrity sha512-9ghKTaduIUvQ6oShmWLuwMeTjtMR4RgKeKHrTJ7THMqvE/ydDPCYeL7ugF65ocXZSEz/QmxdK7uL686ZMKsqNA== +"@storybook/addon-viewport@7.5.3": + version "7.5.3" + resolved "https://registry.yarnpkg.com/@storybook/addon-viewport/-/addon-viewport-7.5.3.tgz#05fb97114d0186977e25a5a448dea5fba66042ce" + integrity sha512-gT2XX0NNBrzSs1nrxadl6LnvcwgN7z2R0LzTK8/hxvx4D0EnXrV3feXLzjewr8ZYjzfEeSpO+W+bQTVNm3fNsg== dependencies: + "@storybook/client-logger" "7.5.3" + "@storybook/components" "7.5.3" + "@storybook/core-events" "7.5.3" + "@storybook/global" "^5.0.0" + "@storybook/manager-api" "7.5.3" + "@storybook/preview-api" "7.5.3" + "@storybook/theming" "7.5.3" memoizerific "^1.11.3" + prop-types "^15.7.2" -"@storybook/angular@7.6.5": - version "7.6.5" - resolved "https://registry.yarnpkg.com/@storybook/angular/-/angular-7.6.5.tgz#9692892719fd092326be0b11fb6f4306e3d8b5da" - integrity sha512-Q+diFi5ct4aHSegBLlryzNs4/WpefaMG1kVs9if9CvOu/286Pr0UMF75ldb3b+6ORIxe88vxdmLLs4idH+MjMQ== - dependencies: - "@storybook/builder-webpack5" "7.6.5" - "@storybook/cli" "7.6.5" - "@storybook/client-logger" "7.6.5" - "@storybook/core-common" "7.6.5" - "@storybook/core-events" "7.6.5" - "@storybook/core-server" "7.6.5" - "@storybook/core-webpack" "7.6.5" - "@storybook/docs-tools" "7.6.5" +"@storybook/angular@7.5.3": + version "7.5.3" + resolved "https://registry.yarnpkg.com/@storybook/angular/-/angular-7.5.3.tgz#870d2b95efbdbce5cbbb361d14a2994120c0e07d" + integrity sha512-wGyebTb7hhdrhEopouFIsBS8SM/5nlTwxilaYbs9Cg3elSmsJyI3uLCHEeGKYupnzokQzP3xElWjwT2VYyW0fQ== + dependencies: + "@storybook/builder-webpack5" "7.5.3" + "@storybook/cli" "7.5.3" + "@storybook/client-logger" "7.5.3" + "@storybook/core-common" "7.5.3" + "@storybook/core-events" "7.5.3" + "@storybook/core-server" "7.5.3" + "@storybook/core-webpack" "7.5.3" + "@storybook/docs-tools" "7.5.3" "@storybook/global" "^5.0.0" - "@storybook/node-logger" "7.6.5" - "@storybook/preview-api" "7.6.5" - "@storybook/telemetry" "7.6.5" - "@storybook/types" "7.6.5" + "@storybook/manager-api" "7.5.3" + "@storybook/node-logger" "7.5.3" + "@storybook/preview-api" "7.5.3" + "@storybook/telemetry" "7.5.3" + "@storybook/types" "7.5.3" "@types/node" "^18.0.0" "@types/react" "^16.14.34" "@types/react-dom" "^16.9.14" @@ -5388,22 +4740,22 @@ util-deprecate "^1.0.2" webpack "5" -"@storybook/blocks@7.6.5": - version "7.6.5" - resolved "https://registry.yarnpkg.com/@storybook/blocks/-/blocks-7.6.5.tgz#402b99d7b6047c8eec75147b20f0878e14db8d73" - integrity sha512-/NjuYkPks5w9lKn47KLgVC5cBkwfc+ERAp0CY0Xe//BQJkP+bcI8lE8d9Qc9IXFbOTvYEULeQrFgCkesk5BmLg== - dependencies: - "@storybook/channels" "7.6.5" - "@storybook/client-logger" "7.6.5" - "@storybook/components" "7.6.5" - "@storybook/core-events" "7.6.5" - "@storybook/csf" "^0.1.2" - "@storybook/docs-tools" "7.6.5" +"@storybook/blocks@7.5.3": + version "7.5.3" + resolved "https://registry.yarnpkg.com/@storybook/blocks/-/blocks-7.5.3.tgz#be754f60a91e95b8c72cbeadf9c5c7e7ab78920f" + integrity sha512-Z8yF820v78clQWkwG5OA5qugbQn7rtutq9XCsd03NDB+IEfDaTFQAZG8gs62ZX2ZaXAJsqJSr/mL9oURzXto2A== + dependencies: + "@storybook/channels" "7.5.3" + "@storybook/client-logger" "7.5.3" + "@storybook/components" "7.5.3" + "@storybook/core-events" "7.5.3" + "@storybook/csf" "^0.1.0" + "@storybook/docs-tools" "7.5.3" "@storybook/global" "^5.0.0" - "@storybook/manager-api" "7.6.5" - "@storybook/preview-api" "7.6.5" - "@storybook/theming" "7.6.5" - "@storybook/types" "7.6.5" + "@storybook/manager-api" "7.5.3" + "@storybook/preview-api" "7.5.3" + "@storybook/theming" "7.5.3" + "@storybook/types" "7.5.3" "@types/lodash" "^4.14.167" color-convert "^2.0.1" dequal "^2.0.2" @@ -5439,15 +4791,15 @@ process "^0.11.10" util "^0.12.4" -"@storybook/builder-manager@7.6.5": - version "7.6.5" - resolved "https://registry.yarnpkg.com/@storybook/builder-manager/-/builder-manager-7.6.5.tgz#bf02a89c56522f89d652aa050d9934f8bdd1d79c" - integrity sha512-FQyI+tfzMam2XKXq7k921YVafIJs9Vqvos5qx8vyRnRffo55UU8tgunwjGn0PswtbMm6sThVqE0C0ZzVr7RG8A== +"@storybook/builder-manager@7.5.3": + version "7.5.3" + resolved "https://registry.yarnpkg.com/@storybook/builder-manager/-/builder-manager-7.5.3.tgz#dc667fd6d450988bc33c246686822a87c1b95558" + integrity sha512-uf4Vyj8ofHaq94m065SMvFKak1XrrxgI83VZAxc2QjiPcbRwcVOZd+wcKFdZydqqA6FlBDdJrU+k9INA4Qkfcw== dependencies: "@fal-works/esbuild-plugin-global-externals" "^2.1.2" - "@storybook/core-common" "7.6.5" - "@storybook/manager" "7.6.5" - "@storybook/node-logger" "7.6.5" + "@storybook/core-common" "7.5.3" + "@storybook/manager" "7.5.3" + "@storybook/node-logger" "7.5.3" "@types/ejs" "^3.1.1" "@types/find-cache-dir" "^3.2.1" "@yarnpkg/esbuild-plugin-pnp" "^3.0.0-rc.10" @@ -5461,34 +4813,33 @@ process "^0.11.10" util "^0.12.4" -"@storybook/builder-webpack5@7.6.5": - version "7.6.5" - resolved "https://registry.yarnpkg.com/@storybook/builder-webpack5/-/builder-webpack5-7.6.5.tgz#c5eb2d5282df4c97c56d71f77203e2db03aced93" - integrity sha512-Lf4jVHGTQRSLIcgXHG2webiFlNwEV8uo2CmDucU2IDV9p3NdloyOmCou40G6Du1hobBTflx8Zj2j9n3A5/+0GA== - dependencies: - "@babel/core" "^7.23.2" - "@storybook/channels" "7.6.5" - "@storybook/client-logger" "7.6.5" - "@storybook/core-common" "7.6.5" - "@storybook/core-events" "7.6.5" - "@storybook/core-webpack" "7.6.5" - "@storybook/node-logger" "7.6.5" - "@storybook/preview" "7.6.5" - "@storybook/preview-api" "7.6.5" +"@storybook/builder-webpack5@7.5.3": + version "7.5.3" + resolved "https://registry.yarnpkg.com/@storybook/builder-webpack5/-/builder-webpack5-7.5.3.tgz#7f392cae845c9c3c7de6e04045c531f8f70048e1" + integrity sha512-a2kHXFT61AV1+OPNTqXCsYk7Wk4XSqjAOQkSxWc1HK+kyMT+lahO4U06slji6XAVuXc/KY+naNUoaOfpB1hKVw== + dependencies: + "@babel/core" "^7.22.0" + "@storybook/channels" "7.5.3" + "@storybook/client-logger" "7.5.3" + "@storybook/core-common" "7.5.3" + "@storybook/core-events" "7.5.3" + "@storybook/core-webpack" "7.5.3" + "@storybook/node-logger" "7.5.3" + "@storybook/preview" "7.5.3" + "@storybook/preview-api" "7.5.3" "@swc/core" "^1.3.82" "@types/node" "^18.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.4.0" constants-browserify "^1.0.0" css-loader "^6.7.1" - es-module-lexer "^1.4.1" express "^4.17.3" fork-ts-checker-webpack-plugin "^8.0.0" fs-extra "^11.1.0" html-webpack-plugin "^5.5.0" - magic-string "^0.30.5" path-browserify "^1.0.1" process "^0.11.10" semver "^7.3.7" @@ -5521,13 +4872,13 @@ resolved "https://registry.yarnpkg.com/@storybook/channels/-/channels-7.0.9.tgz#0308c6a714daf1088228b554fd56dc72f2921b76" integrity sha512-LF/Mkr0/+VOawEAospLGUcfZIPak3yV/ZjEAe/lubvLPJ6s2FFOjDUsyDIa2oM4ZE9TI6AGVN51kddVToelM8A== -"@storybook/channels@7.6.5": - version "7.6.5" - resolved "https://registry.yarnpkg.com/@storybook/channels/-/channels-7.6.5.tgz#cd2c977052bc83b6d4980fe2d2e0da5c91eadd68" - integrity sha512-FIlNkyfQy9uHoJfAFL2/wO3ASGJELFvBzURBE2rcEF/TS7GcUiqWnBfiDxAbwSEjSOm2F0eEq3UXhaZEjpJHDw== +"@storybook/channels@7.5.3": + version "7.5.3" + resolved "https://registry.yarnpkg.com/@storybook/channels/-/channels-7.5.3.tgz#cbd178b0778f3484b970d0fd0edd294db6969e0f" + integrity sha512-dhWuV2o2lmxH0RKuzND8jxYzvSQTSmpE13P0IT/k8+I1up/rSNYOBQJT6SalakcNWXFAMXguo/8E7ApmnKKcEw== dependencies: - "@storybook/client-logger" "7.6.5" - "@storybook/core-events" "7.6.5" + "@storybook/client-logger" "7.5.3" + "@storybook/core-events" "7.5.3" "@storybook/global" "^5.0.0" qs "^6.10.0" telejson "^7.2.0" @@ -5577,23 +4928,23 @@ ts-dedent "^2.0.0" util-deprecate "^1.0.2" -"@storybook/cli@7.6.5": - version "7.6.5" - resolved "https://registry.yarnpkg.com/@storybook/cli/-/cli-7.6.5.tgz#7ef55649e3a407544060f5edeb2c93425caebfb2" - integrity sha512-w+Y8dx5oCLQVESOVmpsQuFksr/ewARKrnSKl9kwnVMN4sMgjOgoZ3zmV66J7SKexvwyuwlOjf840pmEglGdPPg== +"@storybook/cli@7.5.3": + version "7.5.3" + resolved "https://registry.yarnpkg.com/@storybook/cli/-/cli-7.5.3.tgz#127ae3bcad169bf8c3eb3e1e6c9d587ad5f57e81" + integrity sha512-XysHSnknZTAcTbQ0bQsbfv5J8ifHpOBsmXjk1HCA05E9WGGrn9JrQRCfpDUQJ6O6UWq0bpMqzP8gFLWXFE7hug== dependencies: - "@babel/core" "^7.23.2" - "@babel/preset-env" "^7.23.2" - "@babel/types" "^7.23.0" + "@babel/core" "^7.22.9" + "@babel/preset-env" "^7.22.9" + "@babel/types" "^7.22.5" "@ndelangen/get-tarball" "^3.0.7" - "@storybook/codemod" "7.6.5" - "@storybook/core-common" "7.6.5" - "@storybook/core-events" "7.6.5" - "@storybook/core-server" "7.6.5" - "@storybook/csf-tools" "7.6.5" - "@storybook/node-logger" "7.6.5" - "@storybook/telemetry" "7.6.5" - "@storybook/types" "7.6.5" + "@storybook/codemod" "7.5.3" + "@storybook/core-common" "7.5.3" + "@storybook/core-events" "7.5.3" + "@storybook/core-server" "7.5.3" + "@storybook/csf-tools" "7.5.3" + "@storybook/node-logger" "7.5.3" + "@storybook/telemetry" "7.5.3" + "@storybook/types" "7.5.3" "@types/semver" "^7.3.4" "@yarnpkg/fslib" "2.10.3" "@yarnpkg/libzip" "2.3.0" @@ -5610,7 +4961,7 @@ get-port "^5.1.1" giget "^1.0.0" globby "^11.0.2" - jscodeshift "^0.15.1" + jscodeshift "^0.14.0" leven "^3.1.0" ora "^5.4.1" prettier "^2.8.0" @@ -5631,10 +4982,10 @@ dependencies: "@storybook/global" "^5.0.0" -"@storybook/client-logger@7.6.5": - version "7.6.5" - resolved "https://registry.yarnpkg.com/@storybook/client-logger/-/client-logger-7.6.5.tgz#a9d11ce436134884ecfec908e8bb4a970e233789" - integrity sha512-S5aROWgssqg7tcs9lgW5wmCAz4SxMAtioiyVj5oFecmPCbQtFVIAREYzeoxE4GfJL+plrfRkum4BzziANn8EhQ== +"@storybook/client-logger@7.5.3": + version "7.5.3" + resolved "https://registry.yarnpkg.com/@storybook/client-logger/-/client-logger-7.5.3.tgz#5a33a8a1785dbe6beff60654bc8947724c0cd62e" + integrity sha512-vUFYALypjix5FoJ5M/XUP6KmyTnQJNW1poHdW7WXUVSg+lBM6E5eAtjTm0hdxNNDH8KSrdy24nCLra5h0X0BWg== dependencies: "@storybook/global" "^5.0.0" @@ -5657,38 +5008,38 @@ prettier "^2.8.0" recast "^0.23.1" -"@storybook/codemod@7.6.5": - version "7.6.5" - resolved "https://registry.yarnpkg.com/@storybook/codemod/-/codemod-7.6.5.tgz#7ae6245f02ed9b95f1c6a525a6fb877710f28132" - integrity sha512-K5C9ltBClZ0aSyujGt3RJFtRicrUZy8nzhHrcADUj27rrQD26jH/p+Y05jWKj9JcI8SyMg978GN5X/1aw2Y31A== +"@storybook/codemod@7.5.3": + version "7.5.3" + resolved "https://registry.yarnpkg.com/@storybook/codemod/-/codemod-7.5.3.tgz#8a294b8d12f304a2a9db902848977147394d451c" + integrity sha512-gzycFdqnF4drUjfzMTrLNHqi2jkw1lDeACUzQdug5uWxynZKAvMTHAgU0q9wvoYRR9Xhq8PhfKtXtYCCj2Er4Q== dependencies: - "@babel/core" "^7.23.2" - "@babel/preset-env" "^7.23.2" - "@babel/types" "^7.23.0" - "@storybook/csf" "^0.1.2" - "@storybook/csf-tools" "7.6.5" - "@storybook/node-logger" "7.6.5" - "@storybook/types" "7.6.5" + "@babel/core" "^7.22.9" + "@babel/preset-env" "^7.22.9" + "@babel/types" "^7.22.5" + "@storybook/csf" "^0.1.0" + "@storybook/csf-tools" "7.5.3" + "@storybook/node-logger" "7.5.3" + "@storybook/types" "7.5.3" "@types/cross-spawn" "^6.0.2" cross-spawn "^7.0.3" globby "^11.0.2" - jscodeshift "^0.15.1" + jscodeshift "^0.14.0" lodash "^4.17.21" prettier "^2.8.0" recast "^0.23.1" -"@storybook/components@7.6.5": - version "7.6.5" - resolved "https://registry.yarnpkg.com/@storybook/components/-/components-7.6.5.tgz#188a7f9ba75b04e7414b4b720d274700df286323" - integrity sha512-w4ZucbBBZ+NKMWlJKVj2I/bMBBq7gzDp9lzc4+8QaQ3vUPXKqc1ilIPYo/7UR5oxwDVMZocmMSgl9L8lvf7+Mw== +"@storybook/components@7.5.3": + version "7.5.3" + resolved "https://registry.yarnpkg.com/@storybook/components/-/components-7.5.3.tgz#3fa282252e02973ead9f537f5ae3b5aeee5be4c4" + integrity sha512-M3+cjvEsDGLUx8RvK5wyF6/13LNlUnKbMgiDE8Sxk/v/WPpyhOAIh/B8VmrU1psahS61Jd4MTkFmLf1cWau1vw== dependencies: "@radix-ui/react-select" "^1.2.2" "@radix-ui/react-toolbar" "^1.0.4" - "@storybook/client-logger" "7.6.5" - "@storybook/csf" "^0.1.2" + "@storybook/client-logger" "7.5.3" + "@storybook/csf" "^0.1.0" "@storybook/global" "^5.0.0" - "@storybook/theming" "7.6.5" - "@storybook/types" "7.6.5" + "@storybook/theming" "7.5.3" + "@storybook/types" "7.5.3" memoizerific "^1.11.3" use-resize-observer "^9.1.0" util-deprecate "^1.0.2" @@ -5718,14 +5069,14 @@ resolve-from "^5.0.0" ts-dedent "^2.0.0" -"@storybook/core-common@7.6.5": - version "7.6.5" - resolved "https://registry.yarnpkg.com/@storybook/core-common/-/core-common-7.6.5.tgz#51bda38a722507de5adfe2b05a82f4404188e898" - integrity sha512-z4EgzZSIVbID6Ib0jhh3jimKeaDWU8OOhoZYfn3galFmgQWowWOv1oMgipWiXfRLWw9DaLFQiCHIdLANH+VO2g== +"@storybook/core-common@7.5.3": + version "7.5.3" + resolved "https://registry.yarnpkg.com/@storybook/core-common/-/core-common-7.5.3.tgz#baaf4cb8e2e29ebd74626ee8cd5971f337ac4e23" + integrity sha512-WGMwjtVUxUzFwQz7Mgs0gLuNebIGNV55dCdZgurx2/y6QOkJ2v8D0b3iL+xKMV4B5Nwoc2DsM418Y+Hy3UQd+w== dependencies: - "@storybook/core-events" "7.6.5" - "@storybook/node-logger" "7.6.5" - "@storybook/types" "7.6.5" + "@storybook/core-events" "7.5.3" + "@storybook/node-logger" "7.5.3" + "@storybook/types" "7.5.3" "@types/find-cache-dir" "^3.2.1" "@types/node" "^18.0.0" "@types/node-fetch" "^2.6.4" @@ -5752,10 +5103,10 @@ resolved "https://registry.yarnpkg.com/@storybook/core-events/-/core-events-7.0.9.tgz#4aa5913cfa3ccb40b83bf4ffbb6ef832aa8f5402" integrity sha512-xJiyX7Gq/TgDdBv+8KbfTJ4Sc7fCMeIEUqWTtnYCHWB7Mp6Iui37+caDX3aGQRTz7FVgb7aL5QkQES9Ihc1+dg== -"@storybook/core-events@7.6.5": - version "7.6.5" - resolved "https://registry.yarnpkg.com/@storybook/core-events/-/core-events-7.6.5.tgz#bcac8a2625c1f63d290d4ca0b70bb7a953939750" - integrity sha512-zk2q/qicYXAzHA4oV3GDbIql+Kd4TOHUgDE8e4jPCOPp856z2ScqEKUAbiJizs6eEJOH4nW9Db1kuzgrBVEykQ== +"@storybook/core-events@7.5.3": + version "7.5.3" + resolved "https://registry.yarnpkg.com/@storybook/core-events/-/core-events-7.5.3.tgz#210089576844569a914cc0cd1e07119bac6eb0e4" + integrity sha512-DFOpyQ22JD5C1oeOFzL8wlqSWZzrqgDfDbUGP8xdO4wJu+FVTxnnWN6ZYLdTPB1u27DOhd7TzjQMfLDHLu7kbQ== dependencies: ts-dedent "^2.0.0" @@ -5807,26 +5158,26 @@ watchpack "^2.2.0" ws "^8.2.3" -"@storybook/core-server@7.6.5": - version "7.6.5" - resolved "https://registry.yarnpkg.com/@storybook/core-server/-/core-server-7.6.5.tgz#266b650a5dd7917faf1d23119b16ea5637e87fc8" - integrity sha512-BfKzK/ObTjUcPvE5/r1pogCifM/4nLRhOUYJl7XekwHkOQwn19e6H3/ku1W3jDoYXBu642Dc9X7l/ERjKTqxFg== +"@storybook/core-server@7.5.3": + version "7.5.3" + resolved "https://registry.yarnpkg.com/@storybook/core-server/-/core-server-7.5.3.tgz#23ea0757d6ffc0e9acc269b58efd7f75f5d781f6" + integrity sha512-Gmq1w7ulN/VIeTDboNcb6GNM+S8T0SqhJUqeoHzn0vLGnzxeuYRJ0V3ZJhGZiJfSmCNqYAjC8QUBf6uU1gLipw== dependencies: "@aw-web-design/x-default-browser" "1.4.126" "@discoveryjs/json-ext" "^0.5.3" - "@storybook/builder-manager" "7.6.5" - "@storybook/channels" "7.6.5" - "@storybook/core-common" "7.6.5" - "@storybook/core-events" "7.6.5" - "@storybook/csf" "^0.1.2" - "@storybook/csf-tools" "7.6.5" + "@storybook/builder-manager" "7.5.3" + "@storybook/channels" "7.5.3" + "@storybook/core-common" "7.5.3" + "@storybook/core-events" "7.5.3" + "@storybook/csf" "^0.1.0" + "@storybook/csf-tools" "7.5.3" "@storybook/docs-mdx" "^0.1.0" "@storybook/global" "^5.0.0" - "@storybook/manager" "7.6.5" - "@storybook/node-logger" "7.6.5" - "@storybook/preview-api" "7.6.5" - "@storybook/telemetry" "7.6.5" - "@storybook/types" "7.6.5" + "@storybook/manager" "7.5.3" + "@storybook/node-logger" "7.5.3" + "@storybook/preview-api" "7.5.3" + "@storybook/telemetry" "7.5.3" + "@storybook/types" "7.5.3" "@types/detect-port" "^1.3.0" "@types/node" "^18.0.0" "@types/pretty-hrtime" "^1.0.0" @@ -5854,23 +5205,23 @@ watchpack "^2.2.0" ws "^8.2.3" -"@storybook/core-webpack@7.6.5": - version "7.6.5" - resolved "https://registry.yarnpkg.com/@storybook/core-webpack/-/core-webpack-7.6.5.tgz#05f58b11cacaa51e6f5e02943640491ee5977737" - integrity sha512-if5ixN2W3e8vwYvgFHq+k0FOSVwgolbPRLDeOToPXHAJjH/TmgGEANZLFAVVwEzsS4KOfRGJQ48KzF0knTsqzA== +"@storybook/core-webpack@7.5.3": + version "7.5.3" + resolved "https://registry.yarnpkg.com/@storybook/core-webpack/-/core-webpack-7.5.3.tgz#40da9419c71d6e0134a4309cf0ed6f034baf5bdd" + integrity sha512-dhC94VeLwyPtZ2gvEND6J4alMaiFDsK8lJCYPNAahUr56f3nRDyVibE7prd94sAlfrdind1g5slP9VMP8cX+uQ== dependencies: - "@storybook/core-common" "7.6.5" - "@storybook/node-logger" "7.6.5" - "@storybook/types" "7.6.5" + "@storybook/core-common" "7.5.3" + "@storybook/node-logger" "7.5.3" + "@storybook/types" "7.5.3" "@types/node" "^18.0.0" ts-dedent "^2.0.0" -"@storybook/csf-plugin@7.6.5": - version "7.6.5" - resolved "https://registry.yarnpkg.com/@storybook/csf-plugin/-/csf-plugin-7.6.5.tgz#1a0ae37c692d182d9efa6435f7543952997d035c" - integrity sha512-iQ8Y/Qq1IUhHRddjDVicWJA2sM7OZA1FR97OvWUT2240WjCuQSCfy32JD8TQlYjqXgEolJeLPv3zW4qH5om4LQ== +"@storybook/csf-plugin@7.5.3": + version "7.5.3" + resolved "https://registry.yarnpkg.com/@storybook/csf-plugin/-/csf-plugin-7.5.3.tgz#803197a2042323323528014878e9f9f0cc50c193" + integrity sha512-yQ3S/IOT08Y7XTnlc3SPkrJKZ6Xld6liAlHn+ddjge4oZa0hUqwYLb+piXUhFMfL6Ij65cj4hu3vMbw89azIhg== dependencies: - "@storybook/csf-tools" "7.6.5" + "@storybook/csf-tools" "7.5.3" unplugin "^1.3.1" "@storybook/csf-tools@7.0.9": @@ -5888,17 +5239,17 @@ recast "^0.23.1" ts-dedent "^2.0.0" -"@storybook/csf-tools@7.6.5": - version "7.6.5" - resolved "https://registry.yarnpkg.com/@storybook/csf-tools/-/csf-tools-7.6.5.tgz#8e9e98f600ee651e8b63524662ce5a8a6a155fdf" - integrity sha512-1iaCh7nt+WE7Q5UwRhLLc5flMNoAV/vBr0tvDSCKiHaO+D3dZzlZOe/U+S6wegdyN2QNcvT2xs179CcrX6Qp6w== +"@storybook/csf-tools@7.5.3": + version "7.5.3" + resolved "https://registry.yarnpkg.com/@storybook/csf-tools/-/csf-tools-7.5.3.tgz#1b2a393b3402a4c2fdfb2eb4eb90c63463c106ae" + integrity sha512-676C3ISn7FQJKjb3DBWXhjGN2OQEv4s71dx+5D0TlmswDCOOGS8dYFjP8wVx51+mAIE8CROAw7vLHLtVKU7SwQ== dependencies: - "@babel/generator" "^7.23.0" - "@babel/parser" "^7.23.0" - "@babel/traverse" "^7.23.2" - "@babel/types" "^7.23.0" - "@storybook/csf" "^0.1.2" - "@storybook/types" "7.6.5" + "@babel/generator" "^7.22.9" + "@babel/parser" "^7.22.7" + "@babel/traverse" "^7.22.8" + "@babel/types" "^7.22.5" + "@storybook/csf" "^0.1.0" + "@storybook/types" "7.5.3" fs-extra "^11.1.0" recast "^0.23.1" ts-dedent "^2.0.0" @@ -5917,28 +5268,20 @@ dependencies: type-fest "^2.19.0" -"@storybook/csf@^0.1.2": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@storybook/csf/-/csf-0.1.2.tgz#8e7452f0097507f5841b5ade3f5da1525bc9afb2" - integrity sha512-ePrvE/pS1vsKR9Xr+o+YwdqNgHUyXvg+1Xjx0h9LrVx7Zq4zNe06pd63F5EvzTbCbJsHj7GHr9tkiaqm7U8WRA== - dependencies: - type-fest "^2.19.0" - "@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/docs-tools@7.6.5": - version "7.6.5" - resolved "https://registry.yarnpkg.com/@storybook/docs-tools/-/docs-tools-7.6.5.tgz#9ae11a592dec958004468c4aafbe7c1d73d054f0" - integrity sha512-UyHkHu5Af6jMpYsR4lZ69D32GQGeA0pLAn7jaBbQndgAjBdK1ykZcifiUC7Wz1hG7+YpuYspEGuDEddOh+X8FQ== +"@storybook/docs-tools@7.5.3": + version "7.5.3" + resolved "https://registry.yarnpkg.com/@storybook/docs-tools/-/docs-tools-7.5.3.tgz#1d1aec4a7546d70a2273ad99814a1dbecb8e80f7" + integrity sha512-f20EUQlwamcSPrOFn42fj9gpkZIDNCZkC3N19yGzLYiE4UMyaYQgRl18oLvqd3M6aBm6UW6SCoIIgeaOViBSqg== dependencies: - "@storybook/core-common" "7.6.5" - "@storybook/preview-api" "7.6.5" - "@storybook/types" "7.6.5" + "@storybook/core-common" "7.5.3" + "@storybook/preview-api" "7.5.3" + "@storybook/types" "7.5.3" "@types/doctrine" "^0.0.3" - assert "^2.1.0" doctrine "^3.0.0" lodash "^4.17.21" @@ -5947,19 +5290,19 @@ resolved "https://registry.yarnpkg.com/@storybook/global/-/global-5.0.0.tgz#b793d34b94f572c1d7d9e0f44fac4e0dbc9572ed" integrity sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ== -"@storybook/manager-api@7.6.5": - version "7.6.5" - resolved "https://registry.yarnpkg.com/@storybook/manager-api/-/manager-api-7.6.5.tgz#6ddcf6ee3903c119ca1a3fbd41d4fdbf15e5d73a" - integrity sha512-tE3OShOcs6A3XtI3NJd6hYQOZLaP++Fn0dCtowBwYh/vS1EN/AyroVmL97tsxn1DZTyoRt0GidwbB6dvLMBOwA== +"@storybook/manager-api@7.5.3": + version "7.5.3" + resolved "https://registry.yarnpkg.com/@storybook/manager-api/-/manager-api-7.5.3.tgz#6e9e791a8996631dc77f3a0cecc34ce4f4869647" + integrity sha512-d8mVLr/5BEG4bAS2ZeqYTy/aX4jPEpZHdcLaWoB4mAM+PAL9wcWsirUyApKtDVYLITJf/hd8bb2Dm2ok6E45gA== dependencies: - "@storybook/channels" "7.6.5" - "@storybook/client-logger" "7.6.5" - "@storybook/core-events" "7.6.5" - "@storybook/csf" "^0.1.2" + "@storybook/channels" "7.5.3" + "@storybook/client-logger" "7.5.3" + "@storybook/core-events" "7.5.3" + "@storybook/csf" "^0.1.0" "@storybook/global" "^5.0.0" - "@storybook/router" "7.6.5" - "@storybook/theming" "7.6.5" - "@storybook/types" "7.6.5" + "@storybook/router" "7.5.3" + "@storybook/theming" "7.5.3" + "@storybook/types" "7.5.3" dequal "^2.0.2" lodash "^4.17.21" memoizerific "^1.11.3" @@ -5973,10 +5316,10 @@ resolved "https://registry.yarnpkg.com/@storybook/manager/-/manager-7.0.9.tgz#7bc1e8d38f719365c3523cb39341e2ced6275070" integrity sha512-fyUb9DhTCnWBxjVQR0oTnXPStyIZh4DhQ1oXKEYKtV6ZeS+Qw4yXRDgciVXv6ifIBAdSEZOJ0o869c6NUt0iVQ== -"@storybook/manager@7.6.5": - version "7.6.5" - resolved "https://registry.yarnpkg.com/@storybook/manager/-/manager-7.6.5.tgz#0a662f8020bc0ea94ec7e3897dcbbf798af56aaf" - integrity sha512-y1KLH0O1PGPyMxGMvOhppzFSO7r4ibjTve5iqsI0JZwxUjNuBKRLYbrhXdAyC2iacvxYNrHgevae1k9XdD+FQw== +"@storybook/manager@7.5.3": + version "7.5.3" + resolved "https://registry.yarnpkg.com/@storybook/manager/-/manager-7.5.3.tgz#e185fc056546c19d255cdc26b6f2698e04d3f8ab" + integrity sha512-3ZZrHYcXWAQXpDQZBvKyScGgQaAaBc63i+KC2mXqzTdXuJhVDUiylvqLRprBnrEprgePQLFrxGC2JSHUwH7dqg== "@storybook/mdx2-csf@^1.0.0": version "1.1.0" @@ -5993,15 +5336,15 @@ npmlog "^5.0.1" pretty-hrtime "^1.0.3" -"@storybook/node-logger@7.6.5": - version "7.6.5" - resolved "https://registry.yarnpkg.com/@storybook/node-logger/-/node-logger-7.6.5.tgz#2836bcf90f34672535fb2d13d9799357d8e1cbc8" - integrity sha512-xKw6IH1wLkIssekdBv3bd13xYKUF1t8EwqDR8BYcN8AVjZlqJMTifssqG4bYV+G/B7J3tz4ugJ5nmtWg6RQ0Qw== +"@storybook/node-logger@7.5.3": + version "7.5.3" + resolved "https://registry.yarnpkg.com/@storybook/node-logger/-/node-logger-7.5.3.tgz#23133787f5b3427cef7301e10c6caf9132969fc1" + integrity sha512-7ZZDw/q3hakBj1FngsBjaHNIBguYAWojp7R1fFTvwkeunCi21EUzZjRBcqp10kB6BP3/NLX32bIQknsCWD76rQ== -"@storybook/postinstall@7.6.5": - version "7.6.5" - resolved "https://registry.yarnpkg.com/@storybook/postinstall/-/postinstall-7.6.5.tgz#24132c67b3b563b155bf76444b5c1279bd56b26a" - integrity sha512-12WxfpqGKsk7GQ3KWiZSbamsYK8vtRmhOTkavZ9IQkcJ/zuVfmqK80/Mds+njJMudUPzuREuSFGWACczo17EDA== +"@storybook/postinstall@7.5.3": + version "7.5.3" + resolved "https://registry.yarnpkg.com/@storybook/postinstall/-/postinstall-7.5.3.tgz#66b9add9e315646dde2289d77c87118c3c8596a6" + integrity sha512-r+H3xGMu2A9yOSsygc3bDFhku8wpOZF3SqO19B7eAML12viHwUtYfyGL74svw4TMcKukyQ+KPn5QsSG+4bjZMg== "@storybook/preview-api@7.0.9": version "7.0.9" @@ -6024,17 +5367,17 @@ ts-dedent "^2.0.0" util-deprecate "^1.0.2" -"@storybook/preview-api@7.6.5": - version "7.6.5" - resolved "https://registry.yarnpkg.com/@storybook/preview-api/-/preview-api-7.6.5.tgz#fe2a84d2538a6450395e715a6691926a45d3cdfa" - integrity sha512-9XzuDXXgNuA6dDZ3DXsUwEG6ElxeTbzLuYuzcjtS1FusSICZ2iYmxfS0GfSud9MjPPYOJYoSOvMdIHjorjgByA== +"@storybook/preview-api@7.5.3": + version "7.5.3" + resolved "https://registry.yarnpkg.com/@storybook/preview-api/-/preview-api-7.5.3.tgz#eaf70f9b6888d0dac42ce39a296afd6acacf6156" + integrity sha512-LNmEf7oBRnZ1wG3bQ+P+TO29+NN5pSDJiAA6FabZBrtIVm+psc2lxBCDQvFYyAFzQSlt60toGKNW8+RfFNdR5Q== dependencies: - "@storybook/channels" "7.6.5" - "@storybook/client-logger" "7.6.5" - "@storybook/core-events" "7.6.5" - "@storybook/csf" "^0.1.2" + "@storybook/channels" "7.5.3" + "@storybook/client-logger" "7.5.3" + "@storybook/core-events" "7.5.3" + "@storybook/csf" "^0.1.0" "@storybook/global" "^5.0.0" - "@storybook/types" "7.6.5" + "@storybook/types" "7.5.3" "@types/qs" "^6.9.5" dequal "^2.0.2" lodash "^4.17.21" @@ -6044,22 +5387,22 @@ ts-dedent "^2.0.0" util-deprecate "^1.0.2" -"@storybook/preview@7.6.5": - version "7.6.5" - resolved "https://registry.yarnpkg.com/@storybook/preview/-/preview-7.6.5.tgz#d86bfe0b528f238fee8a4384a49eb24945d5c5dc" - integrity sha512-zmLa7C7yFGTYhgGZXoecdww9rx0Z5HpNi/GDBRWoNSK+FEdE8Jj2jF5NJ2ncldtYIyegz9ku29JFMKbhMj9K5Q== +"@storybook/preview@7.5.3": + version "7.5.3" + resolved "https://registry.yarnpkg.com/@storybook/preview/-/preview-7.5.3.tgz#9abe434ea9fb280a7d2141b72be2958f7eb9cc5b" + integrity sha512-Hf90NlLaSrdMZXPOHDCMPjTywVrQKK0e5CtzqWx/ZQz91JDINxJD+sGj2wZU+wuBtQcTtlsXc9OewlJ+9ETwIw== -"@storybook/react-dom-shim@7.6.5": - version "7.6.5" - resolved "https://registry.yarnpkg.com/@storybook/react-dom-shim/-/react-dom-shim-7.6.5.tgz#070bbce6b49b97991a21ce99dba78cff7ba7377f" - integrity sha512-Qp3N3zENdvx20ikHmz5yI03z+mAWF8bUAwUofqXarVtZUkBNtvfTfUwgAezOAF0eClClH+ktIziIKd976tLSPw== +"@storybook/react-dom-shim@7.5.3": + version "7.5.3" + resolved "https://registry.yarnpkg.com/@storybook/react-dom-shim/-/react-dom-shim-7.5.3.tgz#54fc7bda589be5f630738fd08d2a37d5bb7815fa" + integrity sha512-9aNcKdhoP36jMrcXgfzE9jVg/SpqPpWnUJM70upYoZXytG2wQSPtawLHHyC6kycvTzwncyfF3rwUnOFBB8zmig== -"@storybook/router@7.6.5": - version "7.6.5" - resolved "https://registry.yarnpkg.com/@storybook/router/-/router-7.6.5.tgz#9dfc5f8844e254fc14524373d48e0c357f3ca553" - integrity sha512-QiTC86gRuoepzzmS6HNJZTwfz/n27NcqtaVEIxJi1Yvsx2/kLa9NkRhylNkfTuZ1gEry9stAlKWanMsB2aKyjQ== +"@storybook/router@7.5.3": + version "7.5.3" + resolved "https://registry.yarnpkg.com/@storybook/router/-/router-7.5.3.tgz#e024ad96bc4bbf7250239921a251e828729e4747" + integrity sha512-/iNYCFore7R5n6eFHbBYoB0P2/sybTVpA+uXTNUd3UEt7Ro6CEslTaFTEiH2RVQwOkceBp/NpyWon74xZuXhMg== dependencies: - "@storybook/client-logger" "7.6.5" + "@storybook/client-logger" "7.5.3" memoizerific "^1.11.3" qs "^6.10.0" @@ -6078,27 +5421,27 @@ nanoid "^3.3.1" read-pkg-up "^7.0.1" -"@storybook/telemetry@7.6.5": - version "7.6.5" - resolved "https://registry.yarnpkg.com/@storybook/telemetry/-/telemetry-7.6.5.tgz#e4ed139f86e196434a20f9bee27ce290a7d32441" - integrity sha512-FiLRh9k9LoGphqgBqPYySWdGqplihiZyDwqdo+Qs19RcQ/eiKg0W7fdA09nStcdcsHmDl/1cMfRhz9KUiMtwOw== +"@storybook/telemetry@7.5.3": + version "7.5.3" + resolved "https://registry.yarnpkg.com/@storybook/telemetry/-/telemetry-7.5.3.tgz#67d77c5cb33360c6f483a7cc89897fea160ca446" + integrity sha512-X6alII3o0jCb5xALuw+qcWmvyrbhlkmPeNZ6ZQXknOfB4DkwponFdWN5y6W7yGvr01xa5QBepJRV79isl97d8g== dependencies: - "@storybook/client-logger" "7.6.5" - "@storybook/core-common" "7.6.5" - "@storybook/csf-tools" "7.6.5" + "@storybook/client-logger" "7.5.3" + "@storybook/core-common" "7.5.3" + "@storybook/csf-tools" "7.5.3" chalk "^4.1.0" detect-package-manager "^2.0.1" fetch-retry "^5.0.2" fs-extra "^11.1.0" read-pkg-up "^7.0.1" -"@storybook/theming@7.6.5": - version "7.6.5" - resolved "https://registry.yarnpkg.com/@storybook/theming/-/theming-7.6.5.tgz#b73e81c6ca8b136d38bbb3bf4cd0d7a4e373d813" - integrity sha512-RpcWT0YEgiobO41McVPDfQQHHFnjyr1sJnNTPJIvOUgSfURdgSj17mQVxtD5xcXcPWUdle5UhIOrCixHbL/NNw== +"@storybook/theming@7.5.3": + version "7.5.3" + resolved "https://registry.yarnpkg.com/@storybook/theming/-/theming-7.5.3.tgz#bbcf547c8b3ec1e59e641c58155a44781d5f310d" + integrity sha512-Cjmthe1MAk0z4RKCZ7m72gAD8YD0zTAH97z5ryM1Qv84QXjiCQ143fGOmYz1xEQdNFpOThPcwW6FEccLHTkVcg== dependencies: "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0" - "@storybook/client-logger" "7.6.5" + "@storybook/client-logger" "7.5.3" "@storybook/global" "^5.0.0" memoizerific "^1.11.3" @@ -6112,12 +5455,12 @@ "@types/express" "^4.7.0" file-system-cache "^2.0.0" -"@storybook/types@7.6.5": - version "7.6.5" - resolved "https://registry.yarnpkg.com/@storybook/types/-/types-7.6.5.tgz#25c20d6bb350117f740b7f1f138f354f25d506bc" - integrity sha512-Q757v+fYZZSaEpks/zDL5YgXRozxkgKakXFc+BoQHK5q5sVhJ+0jvpLJiAQAniIIaMIkqY/G24Kd6Uo6UdKBCg== +"@storybook/types@7.5.3": + version "7.5.3" + resolved "https://registry.yarnpkg.com/@storybook/types/-/types-7.5.3.tgz#be956805dafc09fa9a7a3dd4e0e5097ef08e4fd4" + integrity sha512-iu5W0Kdd6nysN5CPkY4GRl+0BpxRTdSfBIJak7mb6xCIHSB5t1tw4BOuqMQ5EgpikRY3MWJ4gY647QkWBX3MNQ== dependencies: - "@storybook/channels" "7.6.5" + "@storybook/channels" "7.5.3" "@types/babel__core" "^7.0.0" "@types/express" "^4.7.0" file-system-cache "2.3.0" @@ -6674,10 +6017,10 @@ dependencies: undici-types "~5.26.4" -"@types/node@18.16.9": - version "18.16.9" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.16.9.tgz#e79416d778a8714597342bb87efb5a6e914f7a73" - integrity sha512-IeB32oIV4oGArLrd7znD2rkHQ6EDCM+2Sr76dJnrHwv9OHBTTM6nuDLK9bmikXzPa0ZlWMWtRGo/Uw4mrzQedA== +"@types/node@20.4.2": + version "20.4.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.2.tgz#129cc9ae69f93824f92fac653eebfb4812ab4af9" + integrity sha512-Dd0BYtWgnWJKwO1jkmTrzofjK2QXXcai0dmtzvIBhcA+RsG5h8R3xlyta0kGOZRNfL9GuRtb1knmPEhQrePCEw== "@types/node@>=10.0.0": version "20.9.0" @@ -6894,11 +6237,6 @@ resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.9.tgz#72e164381659a49557b0a078b28308f2c6a3e1ce" integrity sha512-zC0iXxAv1C1ERURduJueYzkzZ2zaGyc+P2c95hgkikHPr3z8EdUZOlgEQ5X0DRmwDZn+hekycQnoeiiRVrmilQ== -"@types/uuid@^9.0.1": - version "9.0.7" - resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.7.tgz#b14cebc75455eeeb160d5fe23c2fcc0c64f724d8" - integrity sha512-WUtIVRUZ9i5dYXefDEAI7sh9/O7jGvHg7Df/5O/gtH3Yabe5odI3UWopVR1qbPXQtvOxWu3mM4XxlYeZtMWF4g== - "@types/validator@^13.7.10": version "13.11.5" resolved "https://registry.yarnpkg.com/@types/validator/-/validator-13.11.5.tgz#1911964fd5556b08d3479d1ded977c06f89a44a7" @@ -6970,21 +6308,13 @@ "@typescript-eslint/types" "5.62.0" "@typescript-eslint/visitor-keys" "5.62.0" -"@typescript-eslint/scope-manager@6.13.1": - version "6.13.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.13.1.tgz#58c7c37c6a957d3d9f59bc4f64c2888e0cac1d70" - integrity sha512-BW0kJ7ceiKi56GbT2KKzZzN+nDxzQK2DS6x0PiSMPjciPgd/JRQGMibyaN2cPt2cAvuoH0oNvn2fwonHI+4QUQ== - dependencies: - "@typescript-eslint/types" "6.13.1" - "@typescript-eslint/visitor-keys" "6.13.1" - -"@typescript-eslint/scope-manager@6.14.0": - version "6.14.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.14.0.tgz#53d24363fdb5ee0d1d8cda4ed5e5321272ab3d48" - integrity sha512-VT7CFWHbZipPncAZtuALr9y3EuzY1b1t1AEkIq2bTXUPKw+pHoXflGNG5L+Gv6nKul1cz1VH8fz16IThIU0tdg== +"@typescript-eslint/scope-manager@6.11.0": + version "6.11.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.11.0.tgz#621f603537c89f4d105733d949aa4d55eee5cea8" + integrity sha512-0A8KoVvIURG4uhxAdjSaxy8RdRE//HztaZdG8KiHLP8WOXSk0vlF7Pvogv+vlJA5Rnjj/wDcFENvDaHb+gKd1A== dependencies: - "@typescript-eslint/types" "6.14.0" - "@typescript-eslint/visitor-keys" "6.14.0" + "@typescript-eslint/types" "6.11.0" + "@typescript-eslint/visitor-keys" "6.11.0" "@typescript-eslint/type-utils@5.51.0": version "5.51.0" @@ -6996,25 +6326,25 @@ debug "^4.3.4" tsutils "^3.21.0" -"@typescript-eslint/type-utils@6.13.1": - version "6.13.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.13.1.tgz#e6e5885e387841cae9c38fc0638fd8b7561973d6" - integrity sha512-A2qPlgpxx2v//3meMqQyB1qqTg1h1dJvzca7TugM3Yc2USDY+fsRBiojAEo92HO7f5hW5mjAUF6qobOPzlBCBQ== +"@typescript-eslint/type-utils@6.11.0": + version "6.11.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.11.0.tgz#d0b8b1ab6c26b974dbf91de1ebc5b11fea24e0d1" + integrity sha512-nA4IOXwZtqBjIoYrJcYxLRO+F9ri+leVGoJcMW1uqr4r1Hq7vW5cyWrA43lFbpRvQ9XgNrnfLpIkO3i1emDBIA== dependencies: - "@typescript-eslint/typescript-estree" "6.13.1" - "@typescript-eslint/utils" "6.13.1" + "@typescript-eslint/typescript-estree" "6.11.0" + "@typescript-eslint/utils" "6.11.0" debug "^4.3.4" ts-api-utils "^1.0.1" -"@typescript-eslint/type-utils@^6.13.2", "@typescript-eslint/type-utils@^6.9.1": - version "6.14.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.14.0.tgz#ac9cb5ba0615c837f1a6b172feeb273d36e4f8af" - integrity sha512-x6OC9Q7HfYKqjnuNu5a7kffIYs3No30isapRBJl1iCHLitD8O0lFbRcVGiOcuyN837fqXzPZ1NS10maQzZMKqw== +"@typescript-eslint/type-utils@^5.36.1", "@typescript-eslint/type-utils@^5.60.1": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" + integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew== dependencies: - "@typescript-eslint/typescript-estree" "6.14.0" - "@typescript-eslint/utils" "6.14.0" + "@typescript-eslint/typescript-estree" "5.62.0" + "@typescript-eslint/utils" "5.62.0" debug "^4.3.4" - ts-api-utils "^1.0.1" + tsutils "^3.21.0" "@typescript-eslint/types@5.51.0": version "5.51.0" @@ -7026,15 +6356,10 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== -"@typescript-eslint/types@6.13.1": - version "6.13.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.13.1.tgz#b56f26130e7eb8fa1e429c75fb969cae6ad7bb5c" - integrity sha512-gjeEskSmiEKKFIbnhDXUyiqVma1gRCQNbVZ1C8q7Zjcxh3WZMbzWVfGE9rHfWd1msQtPS0BVD9Jz9jded44eKg== - -"@typescript-eslint/types@6.14.0": - version "6.14.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.14.0.tgz#935307f7a931016b7a5eb25d494ea3e1f613e929" - integrity sha512-uty9H2K4Xs8E47z3SnXEPRNDfsis8JO27amp2GNCnzGETEW3yTqEIVg5+AI7U276oGF/tw6ZA+UesxeQ104ceA== +"@typescript-eslint/types@6.11.0": + version "6.11.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.11.0.tgz#8ad3aa000cbf4bdc4dcceed96e9b577f15e0bf53" + integrity sha512-ZbEzuD4DwEJxwPqhv3QULlRj8KYTAnNsXxmfuUXFCxZmO6CF2gM/y+ugBSAQhrqaJL3M+oe4owdWunaHM6beqA== "@typescript-eslint/typescript-estree@5.51.0": version "5.51.0" @@ -7062,26 +6387,13 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/typescript-estree@6.13.1": - version "6.13.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.13.1.tgz#d01dda78d2487434d1c503853fa00291c566efa4" - integrity sha512-sBLQsvOC0Q7LGcUHO5qpG1HxRgePbT6wwqOiGLpR8uOJvPJbfs0mW3jPA3ujsDvfiVwVlWUDESNXv44KtINkUQ== - dependencies: - "@typescript-eslint/types" "6.13.1" - "@typescript-eslint/visitor-keys" "6.13.1" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - semver "^7.5.4" - ts-api-utils "^1.0.1" - -"@typescript-eslint/typescript-estree@6.14.0": - version "6.14.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.14.0.tgz#90c7ddd45cd22139adf3d4577580d04c9189ac13" - integrity sha512-yPkaLwK0yH2mZKFE/bXkPAkkFgOv15GJAUzgUVonAbv0Hr4PK/N2yaA/4XQbTZQdygiDkpt5DkxPELqHguNvyw== +"@typescript-eslint/typescript-estree@6.11.0": + version "6.11.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.11.0.tgz#7b52c12a623bf7f8ec7f8a79901b9f98eb5c7990" + integrity sha512-Aezzv1o2tWJwvZhedzvD5Yv7+Lpu1by/U1LZ5gLc4tCx8jUmuSCMioPFRjliN/6SJIvY6HpTtJIWubKuYYYesQ== dependencies: - "@typescript-eslint/types" "6.14.0" - "@typescript-eslint/visitor-keys" "6.14.0" + "@typescript-eslint/types" "6.11.0" + "@typescript-eslint/visitor-keys" "6.11.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" @@ -7102,33 +6414,7 @@ eslint-utils "^3.0.0" semver "^7.3.7" -"@typescript-eslint/utils@6.13.1": - version "6.13.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.13.1.tgz#925b3a2453a71ada914ae329b7bb7e7d96634b2f" - integrity sha512-ouPn/zVoan92JgAegesTXDB/oUp6BP1v8WpfYcqh649ejNc9Qv+B4FF2Ff626kO1xg0wWwwG48lAJ4JuesgdOw== - dependencies: - "@eslint-community/eslint-utils" "^4.4.0" - "@types/json-schema" "^7.0.12" - "@types/semver" "^7.5.0" - "@typescript-eslint/scope-manager" "6.13.1" - "@typescript-eslint/types" "6.13.1" - "@typescript-eslint/typescript-estree" "6.13.1" - semver "^7.5.4" - -"@typescript-eslint/utils@6.14.0", "@typescript-eslint/utils@^6.13.2": - version "6.14.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.14.0.tgz#856a9e274367d99ffbd39c48128b93a86c4261e3" - integrity sha512-XwRTnbvRr7Ey9a1NT6jqdKX8y/atWG+8fAIu3z73HSP8h06i3r/ClMhmaF/RGWGW1tHJEwij1uEg2GbEmPYvYg== - dependencies: - "@eslint-community/eslint-utils" "^4.4.0" - "@types/json-schema" "^7.0.12" - "@types/semver" "^7.5.0" - "@typescript-eslint/scope-manager" "6.14.0" - "@typescript-eslint/types" "6.14.0" - "@typescript-eslint/typescript-estree" "6.14.0" - semver "^7.5.4" - -"@typescript-eslint/utils@^5.45.0": +"@typescript-eslint/utils@5.62.0", "@typescript-eslint/utils@^5.45.0", "@typescript-eslint/utils@^5.60.1": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== @@ -7142,6 +6428,19 @@ eslint-scope "^5.1.1" semver "^7.3.7" +"@typescript-eslint/utils@6.11.0": + version "6.11.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.11.0.tgz#11374f59ef4cea50857b1303477c08aafa2ca604" + integrity sha512-p23ibf68fxoZy605dc0dQAEoUsoiNoP3MD9WQGiHLDuTSOuqoTsa4oAy+h3KDkTcxbbfOtUjb9h3Ta0gT4ug2g== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@types/json-schema" "^7.0.12" + "@types/semver" "^7.5.0" + "@typescript-eslint/scope-manager" "6.11.0" + "@typescript-eslint/types" "6.11.0" + "@typescript-eslint/typescript-estree" "6.11.0" + semver "^7.5.4" + "@typescript-eslint/visitor-keys@5.51.0": version "5.51.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.51.0.tgz#c0147dd9a36c0de758aaebd5b48cae1ec59eba87" @@ -7158,20 +6457,12 @@ "@typescript-eslint/types" "5.62.0" eslint-visitor-keys "^3.3.0" -"@typescript-eslint/visitor-keys@6.13.1": - version "6.13.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.13.1.tgz#c4b692dcc23a4fc60685b718f10fde789d65a540" - integrity sha512-NDhQUy2tg6XGNBGDRm1XybOHSia8mcXmlbKWoQP+nm1BIIMxa55shyJfZkHpEBN62KNPLrocSM2PdPcaLgDKMQ== - dependencies: - "@typescript-eslint/types" "6.13.1" - eslint-visitor-keys "^3.4.1" - -"@typescript-eslint/visitor-keys@6.14.0": - version "6.14.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.14.0.tgz#1d1d486581819287de824a56c22f32543561138e" - integrity sha512-fB5cw6GRhJUz03MrROVuj5Zm/Q+XWlVdIsFj+Zb1Hvqouc8t+XP2H5y53QYU/MGtd2dPg6/vJJlhoX3xc2ehfw== +"@typescript-eslint/visitor-keys@6.11.0": + version "6.11.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.11.0.tgz#d991538788923f92ec40d44389e7075b359f3458" + integrity sha512-+SUN/W7WjBr05uRxPggJPSzyB8zUpaYo2hByKasWbqr3PM8AXfZt8UHdNpBS1v9SA62qnSSMF3380SwDqqprgQ== dependencies: - "@typescript-eslint/types" "6.14.0" + "@typescript-eslint/types" "6.11.0" eslint-visitor-keys "^3.4.1" "@vitejs/plugin-basic-ssl@1.0.1": @@ -7810,7 +7101,7 @@ 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@^2.0.0, assert@^2.1.0: +assert@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/assert/-/assert-2.1.0.tgz#6d92a238d05dc02e7427c881fb8be81c8448b2dd" integrity sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw== @@ -8019,6 +7310,11 @@ babel-plugin-macros@^2.8.0: 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.3: version "0.3.3" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz#5d1bd3836d0a19e1b84bbf2d9640ccb6f951c122" @@ -8422,16 +7718,6 @@ browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.21.10, browserslist@^ node-releases "^2.0.13" update-browserslist-db "^1.0.13" -browserslist@^4.22.2: - version "4.22.2" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.2.tgz#704c4943072bd81ea18997f3bd2180e89c77874b" - integrity sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A== - dependencies: - caniuse-lite "^1.0.30001565" - electron-to-chromium "^1.4.601" - node-releases "^2.0.14" - update-browserslist-db "^1.0.13" - bs-logger@0.x, bs-logger@^0.2.6: version "0.2.6" resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" @@ -8660,11 +7946,6 @@ caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001538, caniuse-lite@^1.0.30001541: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001554.tgz#ba80d88dff9acbc0cd4b7535fc30e0191c5e2e2a" integrity sha512-A2E3U//MBwbJVzebddm1YfNp7Nud5Ip+IPn4BozBmn4KqVX7AvluoIDFWjsv5OkGnKUXQVmMSoMKLa3ScCblcQ== -caniuse-lite@^1.0.30001565: - version "1.0.30001570" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001570.tgz#b4e5c1fa786f733ab78fc70f592df6b3f23244ca" - integrity sha512-+3e0ASu4sw1SWaoCtvPeyXp+5PsjigkSt8OXZbF9StH5pQWbxEjLAZE3n8Aup5udop1uRiKA7a4utUk/uoSpUw== - 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" @@ -10063,7 +9344,7 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: dependencies: ms "2.0.0" -debug@4, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2: +debug@4, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -10549,11 +9830,6 @@ electron-to-chromium@^1.4.535: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.567.tgz#c92e8fbc2bd15df3068d92571733a218a5413add" integrity sha512-8KR114CAYQ4/r5EIEsOmOMqQ9j0MRbJZR3aXD/KFA8RuKzyoUB4XrUCg+l8RUGqTVQgKNIgTpjaG8YHRPAbX2w== -electron-to-chromium@^1.4.601: - version "1.4.614" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.614.tgz#2fe789d61fa09cb875569f37c309d0c2701f91c0" - integrity sha512-X4ze/9Sc3QWs6h92yerwqv7aB/uU8vCjZcrMjA8N9R1pjMFRe44dLsck5FzLilOYvcXuDn93B+bpGYyufc70gQ== - elegant-spinner@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" @@ -10653,6 +9929,14 @@ enhanced-resolve@^5.0.0, enhanced-resolve@^5.15.0, enhanced-resolve@^5.7.0: graceful-fs "^4.2.4" tapable "^2.2.0" +enquirer@^2.3.6: + version "2.4.1" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" + integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== + dependencies: + ansi-colors "^4.1.1" + strip-ansi "^6.0.1" + enquirer@~2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" @@ -10756,11 +10040,6 @@ es-module-lexer@^1.2.1: resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.3.1.tgz#c1b0dd5ada807a3b3155315911f364dc4e909db1" integrity sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q== -es-module-lexer@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.4.1.tgz#41ea21b43908fe6a287ffcbe4300f790555331f5" - integrity sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w== - es-set-tostringtag@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz#11f7cc9f63376930a5f20be4915834f4bc74f9c9" @@ -13773,10 +13052,10 @@ jest-pnp-resolver@^1.2.2: resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== -jest-preset-angular@13.1.4: - version "13.1.4" - resolved "https://registry.yarnpkg.com/jest-preset-angular/-/jest-preset-angular-13.1.4.tgz#9013c96f2413e197e96890733c4bcdb11b583db4" - integrity sha512-XKeWa8Qt7p37SzlJ85qEXgig06SgkfrzV057X2GSMqfz/HLJmTUjMFkHJKe65ZaQumNQWCcXpxXREr6EfZ9bow== +jest-preset-angular@13.1.3: + version "13.1.3" + resolved "https://registry.yarnpkg.com/jest-preset-angular/-/jest-preset-angular-13.1.3.tgz#51760a2a44f96e15b7be4e4b3e82813e67186194" + integrity sha512-8b+RIakmmZcGwUtW+3gy42HUjzjOWaTudoEx1JJIEDscqDPYrpH0zY0MhjjAbuEDzxOMAv6uAS91I4AO3c12OQ== dependencies: bs-logger "^0.2.6" esbuild-wasm ">=0.13.8" @@ -14028,32 +13307,6 @@ jscodeshift@^0.14.0: temp "^0.8.4" write-file-atomic "^2.3.0" -jscodeshift@^0.15.1: - version "0.15.1" - resolved "https://registry.yarnpkg.com/jscodeshift/-/jscodeshift-0.15.1.tgz#6c7a9572acdfa4f54098e958f71a05716a4e546b" - integrity sha512-hIJfxUy8Rt4HkJn/zZPU9ChKfKZM1342waJ1QC2e2YsPcWhM+3BJ4dcfQCzArTrk1jJeNLB341H+qOcEHRxJZg== - dependencies: - "@babel/core" "^7.23.0" - "@babel/parser" "^7.23.0" - "@babel/plugin-transform-class-properties" "^7.22.5" - "@babel/plugin-transform-modules-commonjs" "^7.23.0" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.22.11" - "@babel/plugin-transform-optional-chaining" "^7.23.0" - "@babel/plugin-transform-private-methods" "^7.22.5" - "@babel/preset-flow" "^7.22.15" - "@babel/preset-typescript" "^7.23.0" - "@babel/register" "^7.22.15" - 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.23.3" - 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" @@ -14677,7 +13930,7 @@ log-update@^2.3.0: cli-cursor "^2.0.0" wrap-ansi "^3.0.1" -loose-envify@^1.0.0, loose-envify@^1.1.0: +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== @@ -14727,7 +13980,7 @@ magic-string@0.30.0: dependencies: "@jridgewell/sourcemap-codec" "^1.4.13" -magic-string@0.30.5, magic-string@^0.30.5, magic-string@~0.30.2: +magic-string@0.30.5, magic-string@~0.30.2: version "0.30.5" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.5.tgz#1994d980bd1c8835dc6e78db7cbd4ae4f24746f9" integrity sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA== @@ -15652,11 +14905,6 @@ node-releases@^2.0.13: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== -node-releases@^2.0.14: - version "2.0.14" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" - integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== - 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" @@ -15804,12 +15052,12 @@ nwsapi@^2.2.2: resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.7.tgz#738e0707d3128cb750dddcfe90e4610482df0f30" integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== -nx@17.2.5, nx@v17.2.5: - version "17.2.5" - resolved "https://registry.yarnpkg.com/nx/-/nx-17.2.5.tgz#fc34bda5fec6b5b0eb65d17c85cb7128e9b028f8" - integrity sha512-bMjl6V+h2Pb7k/iieebQskFqiB5Z7VQgdFJNI6ScMfoMhClWVuF+/fdhxrlN4IaiWHHnZ/KDr7h4kc7puFLr9w== +nx@17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/nx/-/nx-17.0.2.tgz#bbc941f9e8ddc886902605f414cda41a21e4cc77" + integrity sha512-utk9ufxLlRd210nEV6cKjMLVK0gup2ZMlNT41lLgUX/gp3Q59G1NkyLo3o29DxBh3AhNJ9q5MKgybmzDNdpudA== dependencies: - "@nrwl/tao" v17.2.5 + "@nrwl/tao" "17.0.2" "@yarnpkg/lockfile" "^1.1.0" "@yarnpkg/parsers" "3.0.0-rc.46" "@zkochan/js-yaml" "0.0.6" @@ -15841,19 +15089,20 @@ nx@17.2.5, nx@v17.2.5: tmp "~0.2.1" tsconfig-paths "^4.1.2" tslib "^2.3.0" + v8-compile-cache "2.3.0" yargs "^17.6.2" yargs-parser "21.1.1" optionalDependencies: - "@nx/nx-darwin-arm64" v17.2.5 - "@nx/nx-darwin-x64" v17.2.5 - "@nx/nx-freebsd-x64" v17.2.5 - "@nx/nx-linux-arm-gnueabihf" v17.2.5 - "@nx/nx-linux-arm64-gnu" v17.2.5 - "@nx/nx-linux-arm64-musl" v17.2.5 - "@nx/nx-linux-x64-gnu" v17.2.5 - "@nx/nx-linux-x64-musl" v17.2.5 - "@nx/nx-win32-arm64-msvc" v17.2.5 - "@nx/nx-win32-x64-msvc" v17.2.5 + "@nx/nx-darwin-arm64" "17.0.2" + "@nx/nx-darwin-x64" "17.0.2" + "@nx/nx-freebsd-x64" "17.0.2" + "@nx/nx-linux-arm-gnueabihf" "17.0.2" + "@nx/nx-linux-arm64-gnu" "17.0.2" + "@nx/nx-linux-arm64-musl" "17.0.2" + "@nx/nx-linux-x64-gnu" "17.0.2" + "@nx/nx-linux-x64-musl" "17.0.2" + "@nx/nx-win32-arm64-msvc" "17.0.2" + "@nx/nx-win32-x64-msvc" "17.0.2" oauth@0.9.x: version "0.9.15" @@ -16953,6 +16202,15 @@ prompts@^2.0.1, prompts@^2.4.0: kleur "^3.0.3" sisteransi "^1.0.5" +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== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + proxy-addr@~2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" @@ -17135,6 +16393,16 @@ react-dom@18.2.0: loose-envify "^1.1.0" scheduler "^0.23.0" +react-inspector@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/react-inspector/-/react-inspector-6.0.2.tgz#aa3028803550cb6dbd7344816d5c80bf39d07e9d" + integrity sha512-x+b7LxhmHXjHoU/VrFAzw5iutsILRoYyDq97EDYdFpPLcvqtEzk4ZSZSQjnFPbr5T57tLXnHcqFYoN1pI6u8uQ== + +react-is@^16.13.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + react-is@^18.0.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" @@ -17258,7 +16526,7 @@ recast@^0.21.0: source-map "~0.6.1" tslib "^2.0.1" -recast@^0.23.1, recast@^0.23.3: +recast@^0.23.1: version "0.23.4" resolved "https://registry.yarnpkg.com/recast/-/recast-0.23.4.tgz#ca1bac7bfd3011ea5a28dfecb5df678559fb1ddf" integrity sha512-qtEDqIZGVcSZCHniWwZWbRy79Dc6Wp3kT/UmDA2RJKBPg7+7k51aQBZirHmUGn5uvHf2rg8DkjizrN26k61ATw== @@ -19296,7 +18564,7 @@ types-ramda@^0.29.4: dependencies: ts-toolbelt "^9.6.0" -typescript@5.2.2, typescript@~5.2.2: +typescript@5.2.2: version "5.2.2" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78" integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w== @@ -19306,6 +18574,11 @@ typescript@^3.2.4: resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.10.tgz#70f3910ac7a51ed6bef79da7800690b19bf778b8" integrity sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q== +typescript@~5.1.3: + version "5.1.6" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.6.tgz#02f8ac202b6dad2c0dd5e0913745b47a37998274" + integrity sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA== + ua-parser-js@^1.0.33: version "1.0.37" resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.37.tgz#b5dc7b163a5c1f0c510b08446aed4da92c46373f" @@ -19612,6 +18885,11 @@ v8-compile-cache-lib@^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: + 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.1: version "9.1.3" resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.1.3.tgz#ea456604101cd18005ac2cae3cdd1aa058a6306b" @@ -19655,10 +18933,10 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" -vite@4.5.1: - version "4.5.1" - resolved "https://registry.yarnpkg.com/vite/-/vite-4.5.1.tgz#3370986e1ed5dbabbf35a6c2e1fb1e18555b968a" - integrity sha512-AXXFaAJ8yebyqzoNB9fu2pHoo/nWX+xZlaRwoeYUxEqBO+Zj4msE5G+BhGBll9lYEKv9Hfks52PAF2X7qDYXQA== +vite@4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/vite/-/vite-4.5.0.tgz#ec406295b4167ac3bc23e26f9c8ff559287cff26" + integrity sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw== dependencies: esbuild "^0.18.10" postcss "^8.4.27" From 726e727c7d69c22286509af1a051282971755b2d Mon Sep 17 00:00:00 2001 From: gizmodus Date: Sun, 31 Dec 2023 13:28:11 +0100 Subject: [PATCH 23/38] Feature/benchmark currency correction (#2790) * Convert benchmark performance to base currency * Introduce getExchangeRates() for multiple dates * Update changelog --------- Co-authored-by: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> --- CHANGELOG.md | 1 + .../src/app/benchmark/benchmark.controller.ts | 11 +- .../api/src/app/benchmark/benchmark.module.ts | 2 + .../app/benchmark/benchmark.service.spec.ts | 1 + .../src/app/benchmark/benchmark.service.ts | 128 +++++++++++++----- .../exchange-rate-data.service.ts | 119 ++++++++++++++++ 6 files changed, 229 insertions(+), 33 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 744f3f6f7..6344c815f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Changed the performance calculation to a time-weighted approach +- Normalized the benchmark by currency in the benchmark comparator - Increased the timeout to load currencies in the exchange rate data service - Exposed the environment variable `REQUEST_TIMEOUT` - Used the `HasPermission` annotation in endpoints diff --git a/apps/api/src/app/benchmark/benchmark.controller.ts b/apps/api/src/app/benchmark/benchmark.controller.ts index 0fd47f4e2..ebee6ab8e 100644 --- a/apps/api/src/app/benchmark/benchmark.controller.ts +++ b/apps/api/src/app/benchmark/benchmark.controller.ts @@ -8,6 +8,7 @@ import type { UniqueAsset } from '@ghostfolio/common/interfaces'; import { permissions } from '@ghostfolio/common/permissions'; +import type { RequestWithUser } from '@ghostfolio/common/types'; import { Body, Controller, @@ -20,6 +21,7 @@ import { 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'; @@ -28,7 +30,10 @@ 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 + ) {} @HasPermission(permissions.accessAdminControl) @Post() @@ -103,11 +108,13 @@ export class BenchmarkController { @Param('symbol') symbol: string ): Promise { const startDate = new Date(startDateString); + const userCurrency = this.request.user.Settings.settings.baseCurrency; return this.benchmarkService.getMarketDataBySymbol({ dataSource, startDate, - symbol + symbol, + userCurrency }); } } diff --git a/apps/api/src/app/benchmark/benchmark.module.ts b/apps/api/src/app/benchmark/benchmark.module.ts index c2cc3fbb5..b3a4d8f2e 100644 --- a/apps/api/src/app/benchmark/benchmark.module.ts +++ b/apps/api/src/app/benchmark/benchmark.module.ts @@ -2,6 +2,7 @@ import { RedisCacheModule } from '@ghostfolio/api/app/redis-cache/redis-cache.mo import { SymbolModule } from '@ghostfolio/api/app/symbol/symbol.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/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'; @@ -17,6 +18,7 @@ import { BenchmarkService } from './benchmark.service'; imports: [ ConfigurationModule, DataProviderModule, + ExchangeRateDataModule, MarketDataModule, PrismaModule, PropertyModule, diff --git a/apps/api/src/app/benchmark/benchmark.service.spec.ts b/apps/api/src/app/benchmark/benchmark.service.spec.ts index 5fa2c3e7b..42a29e6d1 100644 --- a/apps/api/src/app/benchmark/benchmark.service.spec.ts +++ b/apps/api/src/app/benchmark/benchmark.service.spec.ts @@ -11,6 +11,7 @@ describe('BenchmarkService', () => { null, null, null, + null, null ); }); diff --git a/apps/api/src/app/benchmark/benchmark.service.ts b/apps/api/src/app/benchmark/benchmark.service.ts index cbd5e7e1f..75cb52ea6 100644 --- a/apps/api/src/app/benchmark/benchmark.service.ts +++ b/apps/api/src/app/benchmark/benchmark.service.ts @@ -1,6 +1,7 @@ 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 { 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'; @@ -11,7 +12,8 @@ import { } from '@ghostfolio/common/config'; import { DATE_FORMAT, - calculateBenchmarkTrend + calculateBenchmarkTrend, + parseDate } from '@ghostfolio/common/helper'; import { Benchmark, @@ -21,11 +23,11 @@ import { UniqueAsset } from '@ghostfolio/common/interfaces'; import { BenchmarkTrend } from '@ghostfolio/common/types'; -import { Injectable } from '@nestjs/common'; +import { Injectable, Logger } from '@nestjs/common'; import { SymbolProfile } from '@prisma/client'; import Big from 'big.js'; -import { format, subDays } from 'date-fns'; -import { uniqBy } from 'lodash'; +import { format, isSameDay, subDays } from 'date-fns'; +import { isNumber, last, uniqBy } from 'lodash'; import ms from 'ms'; @Injectable() @@ -34,6 +36,7 @@ export class BenchmarkService { public constructor( private readonly dataProviderService: DataProviderService, + private readonly exchangeRateDataService: ExchangeRateDataService, private readonly marketDataService: MarketDataService, private readonly prismaService: PrismaService, private readonly propertyService: PropertyService, @@ -203,8 +206,14 @@ export class BenchmarkService { public async getMarketDataBySymbol({ dataSource, startDate, - symbol - }: { startDate: Date } & UniqueAsset): Promise { + symbol, + userCurrency + }: { + startDate: Date; + userCurrency: string; + } & UniqueAsset): Promise { + const marketData: { date: string; value: number }[] = []; + const [currentSymbolItem, marketDataItems] = await Promise.all([ this.symbolService.get({ dataGatheringItem: { @@ -226,44 +235,101 @@ export class BenchmarkService { }) ]); + const exchangeRates = await this.exchangeRateDataService.getExchangeRates({ + currencyFrom: currentSymbolItem.currency, + currencyTo: userCurrency, + dates: marketDataItems.map(({ date }) => { + return date; + }) + }); + + const exchangeRateAtStartDate = + exchangeRates[format(startDate, DATE_FORMAT)]; + + if (!exchangeRateAtStartDate) { + Logger.error( + `No exchange rate has been found for ${ + currentSymbolItem.currency + }${userCurrency} at ${format(startDate, DATE_FORMAT)}`, + 'BenchmarkService' + ); + + return { marketData }; + } + + const marketPriceAtStartDate = marketDataItems?.find(({ date }) => { + return isSameDay(date, startDate); + })?.marketPrice; + + if (!marketPriceAtStartDate) { + Logger.error( + `No historical market data has been found for ${symbol} (${dataSource}) at ${format( + startDate, + DATE_FORMAT + )}`, + 'BenchmarkService' + ); + + return { marketData }; + } + const step = Math.round( marketDataItems.length / Math.min(marketDataItems.length, MAX_CHART_ITEMS) ); - const marketPriceAtStartDate = marketDataItems?.[0]?.marketPrice ?? 0; - const response = { - marketData: [ - ...marketDataItems - .filter((marketDataItem, index) => { - return index % step === 0; - }) - .map((marketDataItem) => { - return { - date: format(marketDataItem.date, DATE_FORMAT), - value: - marketPriceAtStartDate === 0 - ? 0 - : this.calculateChangeInPercentage( - marketPriceAtStartDate, - marketDataItem.marketPrice - ) * 100 - }; - }) - ] - }; + let i = 0; - if (currentSymbolItem?.marketPrice) { - response.marketData.push({ + for (let marketDataItem of marketDataItems) { + if (i % step !== 0) { + continue; + } + + const exchangeRate = + exchangeRates[format(marketDataItem.date, DATE_FORMAT)]; + + const exchangeRateFactor = + isNumber(exchangeRateAtStartDate) && isNumber(exchangeRate) + ? exchangeRate / exchangeRateAtStartDate + : 1; + + marketData.push({ + date: format(marketDataItem.date, DATE_FORMAT), + value: + marketPriceAtStartDate === 0 + ? 0 + : this.calculateChangeInPercentage( + marketPriceAtStartDate, + marketDataItem.marketPrice * exchangeRateFactor + ) * 100 + }); + } + + const includesToday = isSameDay( + parseDate(last(marketData).date), + new Date() + ); + + if (currentSymbolItem?.marketPrice && !includesToday) { + const exchangeRate = exchangeRates[format(new Date(), DATE_FORMAT)]; + + const exchangeRateFactor = + isNumber(exchangeRateAtStartDate) && isNumber(exchangeRate) + ? exchangeRate / exchangeRateAtStartDate + : 1; + + marketData.push({ date: format(new Date(), DATE_FORMAT), value: this.calculateChangeInPercentage( marketPriceAtStartDate, - currentSymbolItem.marketPrice + currentSymbolItem.marketPrice * exchangeRateFactor ) * 100 }); } - return response; + return { + marketData + }; } public async addBenchmark({ diff --git a/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts b/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts index 9eecd400d..5ddef02a5 100644 --- a/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts +++ b/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts @@ -34,6 +34,125 @@ export class ExchangeRateDataService { return this.currencyPairs; } + public async getExchangeRates({ + currencyFrom, + currencyTo, + dates + }: { + currencyFrom: string; + currencyTo: string; + dates: Date[]; + }) { + let factors: { [dateString: string]: number } = {}; + + if (currencyFrom === currencyTo) { + for (const date of dates) { + factors[format(date, DATE_FORMAT)] = 1; + } + } else { + const dataSource = + this.dataProviderService.getDataSourceForExchangeRates(); + const symbol = `${currencyFrom}${currencyTo}`; + + const marketData = await this.marketDataService.getRange({ + dateQuery: { in: dates }, + uniqueAssets: [ + { + dataSource, + symbol + } + ] + }); + + if (marketData?.length > 0) { + for (const { date, marketPrice } of marketData) { + factors[format(date, DATE_FORMAT)] = marketPrice; + } + } else { + // Calculate indirectly via base currency + + let marketPriceBaseCurrencyFromCurrency: { + [dateString: string]: number; + } = {}; + let marketPriceBaseCurrencyToCurrency: { + [dateString: string]: number; + } = {}; + + try { + if (currencyFrom === DEFAULT_CURRENCY) { + for (const date of dates) { + marketPriceBaseCurrencyFromCurrency[format(date, DATE_FORMAT)] = + 1; + } + } else { + const marketData = await this.marketDataService.getRange({ + dateQuery: { in: dates }, + uniqueAssets: [ + { + dataSource, + symbol: `${DEFAULT_CURRENCY}${currencyFrom}` + } + ] + }); + + for (const { date, marketPrice } of marketData) { + marketPriceBaseCurrencyFromCurrency[format(date, DATE_FORMAT)] = + marketPrice; + } + } + } catch {} + + try { + if (currencyTo === DEFAULT_CURRENCY) { + for (const date of dates) { + marketPriceBaseCurrencyToCurrency[format(date, DATE_FORMAT)] = 1; + } + } else { + const marketData = await this.marketDataService.getRange({ + dateQuery: { + in: dates + }, + uniqueAssets: [ + { + dataSource, + symbol: `${DEFAULT_CURRENCY}${currencyTo}` + } + ] + }); + + for (const { date, marketPrice } of marketData) { + marketPriceBaseCurrencyToCurrency[format(date, DATE_FORMAT)] = + marketPrice; + } + } + } catch {} + + for (const date of dates) { + try { + const factor = + (1 / + marketPriceBaseCurrencyFromCurrency[ + format(date, DATE_FORMAT) + ]) * + marketPriceBaseCurrencyToCurrency[format(date, DATE_FORMAT)]; + + factors[format(date, DATE_FORMAT)] = factor; + } catch { + Logger.error( + `No exchange rate has been found for ${currencyFrom}${currencyTo} at ${format( + date, + DATE_FORMAT + )}`, + 'ExchangeRateDataService' + ); + } + } + } + } + + return factors; + } + public hasCurrencyPair(currency1: string, currency2: string) { return this.currencyPairs.some(({ symbol }) => { return ( From 265d4d0450832283167820b1b69667833950c5f3 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 31 Dec 2023 13:30:27 +0100 Subject: [PATCH 24/38] Release 2.33.0 (#2806) --- CHANGELOG.md | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6344c815f..9d9406281 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 2.33.0 - 2023-12-31 ### Added diff --git a/package.json b/package.json index 0a6d96ab9..fc1d4e02b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "2.32.0", + "version": "2.33.0", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "repository": "https://github.com/ghostfolio/ghostfolio", From 3717e388450223b2a1131beb3bc6615382cbf02c Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Mon, 1 Jan 2024 10:11:04 +0100 Subject: [PATCH 25/38] Update year (#2803) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0ee4434a1..dc5f2d25f 100644 --- a/README.md +++ b/README.md @@ -279,6 +279,6 @@ If you like to support this project, get [**Ghostfolio Premium**](https://ghostf ## License -© 2021 - 2023 [Ghostfolio](https://ghostfol.io) +© 2021 - 2024 [Ghostfolio](https://ghostfol.io) Licensed under the [AGPLv3 License](https://www.gnu.org/licenses/agpl-3.0.html). From 43b4f14acebb46cbc1e00c69676e844193fe092f Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Mon, 1 Jan 2024 11:53:42 +0100 Subject: [PATCH 26/38] Feature/add button to test scraper configuration (#2808) * Add button to test scraper configuration * Update changelog --------- Co-authored-by: Manushreshta B L Co-authored-by: Hugo Persson --- CHANGELOG.md | 6 ++ apps/api/src/app/admin/admin.controller.ts | 29 +++++++++- .../data-provider/data-provider.module.ts | 2 +- .../data-provider/manual/manual.service.ts | 56 +++++++++++++------ .../asset-profile-dialog.component.ts | 28 ++++++++++ .../asset-profile-dialog.html | 24 ++++++-- apps/client/src/app/services/admin.service.ts | 13 +++++ 7 files changed, 134 insertions(+), 24 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9d9406281..c985bcaca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### Added + +- Added a button to test the scraper configuration in the asset profile details dialog of the admin control + ## 2.33.0 - 2023-12-31 ### Added diff --git a/apps/api/src/app/admin/admin.controller.ts b/apps/api/src/app/admin/admin.controller.ts index cc4da298b..634bbbfdc 100644 --- a/apps/api/src/app/admin/admin.controller.ts +++ b/apps/api/src/app/admin/admin.controller.ts @@ -3,6 +3,7 @@ import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard' import { TransformDataSourceInRequestInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-request.interceptor'; import { ApiService } from '@ghostfolio/api/services/api/api.service'; import { DataGatheringService } from '@ghostfolio/api/services/data-gathering/data-gathering.service'; +import { ManualService } from '@ghostfolio/api/services/data-provider/manual/manual.service'; import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service'; import { PropertyDto } from '@ghostfolio/api/services/property/property.dto'; import { @@ -31,6 +32,7 @@ import { Get, HttpException, Inject, + Logger, Param, Patch, Post, @@ -56,6 +58,7 @@ export class AdminController { private readonly adminService: AdminService, private readonly apiService: ApiService, private readonly dataGatheringService: DataGatheringService, + private readonly manualService: ManualService, private readonly marketDataService: MarketDataService, @Inject(REQUEST) private readonly request: RequestWithUser ) {} @@ -179,8 +182,8 @@ export class AdminController { } @Get('market-data') - @UseGuards(AuthGuard('jwt'), HasPermissionGuard) @HasPermission(permissions.accessAdminControl) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async getMarketData( @Query('assetSubClasses') filterByAssetSubClasses?: string, @Query('presetId') presetId?: MarketDataPreset, @@ -215,6 +218,30 @@ export class AdminController { return this.adminService.getMarketDataBySymbol({ dataSource, symbol }); } + @HasPermission(permissions.accessAdminControl) + @Post('market-data/:dataSource/:symbol/test') + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) + public async testMarketData( + @Body() data: { scraperConfiguration: string }, + @Param('dataSource') dataSource: DataSource, + @Param('symbol') symbol: string + ): Promise<{ price: number }> { + try { + const { headers, selector, url } = JSON.parse(data.scraperConfiguration); + const price = await this.manualService.test({ headers, selector, url }); + + if (price) { + return { price }; + } + + throw new Error('Could not parse the current market price'); + } catch (error) { + Logger.error(error); + + throw new HttpException(error.message, StatusCodes.BAD_REQUEST); + } + } + @HasPermission(permissions.accessAdminControl) @Post('market-data/:dataSource/:symbol') @UseGuards(AuthGuard('jwt'), HasPermissionGuard) 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 b3a219a50..e63ec0807 100644 --- a/apps/api/src/services/data-provider/data-provider.module.ts +++ b/apps/api/src/services/data-provider/data-provider.module.ts @@ -74,6 +74,6 @@ import { DataProviderService } from './data-provider.service'; }, YahooFinanceDataEnhancerService ], - exports: [DataProviderService, YahooFinanceService] + exports: [DataProviderService, ManualService, YahooFinanceService] }) export class DataProviderModule {} 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 9a0ff82d9..d5a5c7eb3 100644 --- a/apps/api/src/services/data-provider/manual/manual.service.ts +++ b/apps/api/src/services/data-provider/manual/manual.service.ts @@ -18,7 +18,7 @@ import { DataSource, SymbolProfile } from '@prisma/client'; import * as cheerio from 'cheerio'; import { isUUID } from 'class-validator'; import { addDays, format, isBefore } from 'date-fns'; -import got from 'got'; +import got, { Headers } from 'got'; @Injectable() export class ManualService implements DataProviderInterface { @@ -97,21 +97,7 @@ export class ManualService implements DataProviderInterface { return {}; } - const abortController = new AbortController(); - - setTimeout(() => { - abortController.abort(); - }, this.configurationService.get('REQUEST_TIMEOUT')); - - const { body } = await got(url, { - headers, - // @ts-ignore - signal: abortController.signal - }); - - const $ = cheerio.load(body); - - const value = extractNumberFromString($(selector).text()); + const value = await this.scrape({ headers, selector, url }); return { [symbol]: { @@ -233,4 +219,42 @@ export class ManualService implements DataProviderInterface { return { items }; } + + public async test(params: any) { + return this.scrape({ + headers: params.headers, + selector: params.selector, + url: params.url + }); + } + + private async scrape({ + headers = {}, + selector, + url + }: { + headers?: Headers; + selector: string; + url: string; + }): Promise { + try { + const abortController = new AbortController(); + + setTimeout(() => { + abortController.abort(); + }, this.configurationService.get('REQUEST_TIMEOUT')); + + const { body } = await got(url, { + headers, + // @ts-ignore + signal: abortController.signal + }); + + const $ = cheerio.load(body); + + return extractNumberFromString($(selector).first().text()); + } catch (error) { + throw error; + } + } } 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 6421e888b..6a6e4e64a 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 @@ -277,6 +277,34 @@ export class AssetProfileDialog implements OnDestroy, OnInit { }); } + public onTestMarketData() { + this.adminService + .testMarketData({ + dataSource: this.data.dataSource, + scraperConfiguration: + this.assetProfileForm.controls['scraperConfiguration'].value, + symbol: this.data.symbol + }) + .pipe( + catchError(({ error }) => { + alert(`Error: ${error?.message}`); + return EMPTY; + }), + takeUntil(this.unsubscribeSubject) + ) + .subscribe(({ price }) => { + alert( + $localize`The current market price is` + + ' ' + + price + + ' ' + + (( + (this.assetProfileForm.controls['currency'].value) + ))?.value + ); + }); + } + public onUnsetBenchmark({ dataSource, symbol }: UniqueAsset) { this.dataService .deleteBenchmark({ dataSource, symbol }) 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 08051a0ef..3ff71154f 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 @@ -243,12 +243,24 @@
Scraper Configuration - +
+ + +
diff --git a/apps/client/src/app/services/admin.service.ts b/apps/client/src/app/services/admin.service.ts index 9f8fc9d13..a1c7d626a 100644 --- a/apps/client/src/app/services/admin.service.ts +++ b/apps/client/src/app/services/admin.service.ts @@ -259,4 +259,17 @@ export class AdminService { public putTag(aTag: UpdateTagDto) { return this.http.put(`/api/v1/tag/${aTag.id}`, aTag); } + + public testMarketData({ + dataSource, + scraperConfiguration, + symbol + }: UniqueAsset & UpdateAssetProfileDto['scraperConfiguration']) { + return this.http.post( + `/api/v1/admin/market-data/${dataSource}/${symbol}/test`, + { + scraperConfiguration + } + ); + } } From 8c1c336fc6d5d39df51a3d138801aac952f30435 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Mon, 1 Jan 2024 17:14:53 +0100 Subject: [PATCH 27/38] Feature/upgrade nx to version 17.2.8 (#2809) * Upgrade Nx to version 17.2.8 * Update changelog --- CHANGELOG.md | 4 + package.json | 22 +-- yarn.lock | 478 +++++++++++++++++++++++++-------------------------- 3 files changed, 254 insertions(+), 250 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c985bcaca..3c3ea595e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added a button to test the scraper configuration in the asset profile details dialog of the admin control +### Changed + +- Upgraded `Nx` from version `17.2.7` to `17.2.8` + ## 2.33.0 - 2023-12-31 ### Added diff --git a/package.json b/package.json index fc1d4e02b..3d1d235f8 100644 --- a/package.json +++ b/package.json @@ -146,16 +146,16 @@ "@angular/pwa": "17.0.7", "@nestjs/schematics": "10.0.1", "@nestjs/testing": "10.1.3", - "@nx/angular": "17.2.7", - "@nx/cypress": "17.2.7", - "@nx/eslint-plugin": "17.2.7", - "@nx/jest": "17.2.7", - "@nx/js": "17.2.7", - "@nx/nest": "17.2.7", - "@nx/node": "17.2.7", - "@nx/storybook": "17.2.7", - "@nx/web": "17.2.7", - "@nx/workspace": "17.2.7", + "@nx/angular": "17.2.8", + "@nx/cypress": "17.2.8", + "@nx/eslint-plugin": "17.2.8", + "@nx/jest": "17.2.8", + "@nx/js": "17.2.8", + "@nx/nest": "17.2.8", + "@nx/node": "17.2.8", + "@nx/storybook": "17.2.8", + "@nx/web": "17.2.8", + "@nx/workspace": "17.2.8", "@schematics/angular": "17.0.0", "@simplewebauthn/typescript-types": "8.0.0", "@storybook/addon-essentials": "7.6.5", @@ -186,7 +186,7 @@ "jest": "29.4.3", "jest-environment-jsdom": "29.4.3", "jest-preset-angular": "13.1.4", - "nx": "17.2.7", + "nx": "17.2.8", "prettier": "3.1.1", "prettier-plugin-organize-attributes": "1.0.0", "react": "18.2.0", diff --git a/yarn.lock b/yarn.lock index e6f7751da..ce4304e00 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4332,98 +4332,98 @@ read-package-json-fast "^3.0.0" which "^4.0.0" -"@nrwl/angular@17.2.7": - version "17.2.7" - resolved "https://registry.yarnpkg.com/@nrwl/angular/-/angular-17.2.7.tgz#7cb7b98216288176ea6fd5407fb2d2a500f608bf" - integrity sha512-DjEpECm0ipw7q9xhj+pX1y9Gc3J64gLBCUVf1ib+h3g2Y3tFbC+RLlQGwmAqU8WelAdJHrPqPtAYHKf4vqqgbQ== +"@nrwl/angular@17.2.8": + version "17.2.8" + resolved "https://registry.yarnpkg.com/@nrwl/angular/-/angular-17.2.8.tgz#5e50fa7d4faac7eabbc41b383129464df2235616" + integrity sha512-hMTKcZDjsnyQojJ33IaCwoPVdFLqTLfCe/e52mn8ecELBSY3/ARZfmUpkSPSZ+261uEHjk0pTfQhu0CF7r2/HQ== dependencies: - "@nx/angular" "17.2.7" + "@nx/angular" "17.2.8" tslib "^2.3.0" -"@nrwl/cypress@17.2.7": - version "17.2.7" - resolved "https://registry.yarnpkg.com/@nrwl/cypress/-/cypress-17.2.7.tgz#5cdd37f52c48f823f358b571afc9040353884241" - integrity sha512-Av89Er9r0kMf8YL9dNSTkHohYhAKYmxAB3Q8eVv8NmSb7FZXvY065HIoFby+6VtQnBFP+sT1YSQL/Tp+h4Bwfw== +"@nrwl/cypress@17.2.8": + version "17.2.8" + resolved "https://registry.yarnpkg.com/@nrwl/cypress/-/cypress-17.2.8.tgz#0fcdece62e35ed7a02fc7b92c0dfc9d1743726e7" + integrity sha512-32owq2ybkkKOIeqQ/mkwBzFH4HPukmHEJyJ4v95sUgY8qrnj/Ca89vozdJ6WEvUiqcAb7ebrmp/nqFCz7PIWbg== dependencies: - "@nx/cypress" "17.2.7" + "@nx/cypress" "17.2.8" -"@nrwl/devkit@17.2.7": - version "17.2.7" - resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-17.2.7.tgz#20c5fd8e0a2813940fdfb34523d4d77788b524ff" - integrity sha512-TISLlIH3xSWre2NLg0aMUBmTvMus+xUicaMeg8DWvwSXJJIMC5QFlB1hjw0VkyLsSraHpd5PWtyDqldHWRfKUQ== +"@nrwl/devkit@17.2.8": + version "17.2.8" + resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-17.2.8.tgz#dd3467b484c4611454a45541ffb29e4de5b2ebe7" + integrity sha512-l2dFy5LkWqSA45s6pee6CoqJeluH+sjRdVnAAQfjLHRNSx6mFAKblyzq5h1f4P0EUCVVVqLs+kVqmNx5zxYqvw== dependencies: - "@nx/devkit" "17.2.7" + "@nx/devkit" "17.2.8" -"@nrwl/eslint-plugin-nx@17.2.7": - version "17.2.7" - resolved "https://registry.yarnpkg.com/@nrwl/eslint-plugin-nx/-/eslint-plugin-nx-17.2.7.tgz#5762b3dce6acb806c8c95bfa0610e79a0e74ecc7" - integrity sha512-YGH3FL4Dz+a9r2xmZx/SMUFOUl/An6IsZeTqkG5gC+ErejX9nT1KWOXMNh5bkl+jz0b4NvkiVvgQw+W4q2K9sg== +"@nrwl/eslint-plugin-nx@17.2.8": + version "17.2.8" + resolved "https://registry.yarnpkg.com/@nrwl/eslint-plugin-nx/-/eslint-plugin-nx-17.2.8.tgz#bf3a3c0820eb9a6bf42355ec1012799136595801" + integrity sha512-g76ZzBvJ7jenvLXQuXdBUs7p3KP2vr00u7TV4A/J01eDJMFHYVZhYfQNjLhr4nnE4NvNRr8WdrMD2KeGYtdycQ== dependencies: - "@nx/eslint-plugin" "17.2.7" + "@nx/eslint-plugin" "17.2.8" -"@nrwl/jest@17.2.7": - version "17.2.7" - resolved "https://registry.yarnpkg.com/@nrwl/jest/-/jest-17.2.7.tgz#acd89e1cd3d99ae75431c60216b4e7b1d9bb35e6" - integrity sha512-jYeBQbS9iaybLxmxFv6N9qftRHyRpG3YlDxiHXXmWPX0OrgDjNSY3QCCReM8iqADk2TaxoIw1WDKp4tKzft2xA== +"@nrwl/jest@17.2.8": + version "17.2.8" + resolved "https://registry.yarnpkg.com/@nrwl/jest/-/jest-17.2.8.tgz#188644e3177c47e1160cb135662b7697bb152467" + integrity sha512-suyAm+5dj03ZevZW0fEZJSn+au1k6+OGPo4LKQ9Y4u/QJW52d2k0nOzrKu79CwkdKP5PFhjnvPP4Oo93RbNNnA== dependencies: - "@nx/jest" "17.2.7" + "@nx/jest" "17.2.8" -"@nrwl/js@17.2.7": - version "17.2.7" - resolved "https://registry.yarnpkg.com/@nrwl/js/-/js-17.2.7.tgz#b791009476584ae0a6665a5e6fafccbe7fe6b29f" - integrity sha512-8AAUmqESQ89Cbark8DlkElINMmDpEJLivan6RPksUUEK6lrZQwVnHf4eWLQzN2/C4i5XkfdxavzluuDPCqHQSQ== +"@nrwl/js@17.2.8": + version "17.2.8" + resolved "https://registry.yarnpkg.com/@nrwl/js/-/js-17.2.8.tgz#d10795206769bd30faaf9e137e971ae402977731" + integrity sha512-ZfTGNSmSBqvEfP8NOfOHcnqKwhXsfqBrN4IhthQR02sqTA9GkrjSfSUtcGXY01fUitsNUDOn6RZjgX6UysDCXg== dependencies: - "@nx/js" "17.2.7" + "@nx/js" "17.2.8" -"@nrwl/nest@17.2.7": - version "17.2.7" - resolved "https://registry.yarnpkg.com/@nrwl/nest/-/nest-17.2.7.tgz#442443b59a02ddbaaafbc8b91caa11bb9b286583" - integrity sha512-BbJMdB5+PKPhrYW78jvNizipcUya2DlXNddwruW6GZ8QAYMRaVg9xFxbX7nMO4rRBBqCqmE00Two3aGiMm5L2Q== +"@nrwl/nest@17.2.8": + version "17.2.8" + resolved "https://registry.yarnpkg.com/@nrwl/nest/-/nest-17.2.8.tgz#52ed0729cfece3a763b337e5a00183eb5be9a4ef" + integrity sha512-pj2UNE7XM/7JdKlGhywXOVaCXZE3Fpd7eoZNZc8fBq+pcxvX3ylh4KLmnCwcSaKlcqFsYkWbmj6xDBJx8xSGoA== dependencies: - "@nx/nest" "17.2.7" + "@nx/nest" "17.2.8" -"@nrwl/node@17.2.7": - version "17.2.7" - resolved "https://registry.yarnpkg.com/@nrwl/node/-/node-17.2.7.tgz#a68616fdfdb67a7227a70c1841c6b6f5a3f9ef2b" - integrity sha512-tWc9tFnQ2ue0Wv2NcMV3fJD1Kqh/vHeV/81ppeLtoYa5GBXViRJPdUinGlez0qiYegEdUbieWjDp255GIEifTw== +"@nrwl/node@17.2.8": + version "17.2.8" + resolved "https://registry.yarnpkg.com/@nrwl/node/-/node-17.2.8.tgz#f2cd32f92979096698c18a361a598e3a98fbf06f" + integrity sha512-DGwPAasjDgSrNJcB2qcCA7y02licJFCNyiGhEnIhLEUCWOyPCrAsuPmBy4/QYFoiEP6YOsIpJac/1p+9QWeJ7Q== dependencies: - "@nx/node" "17.2.7" + "@nx/node" "17.2.8" -"@nrwl/storybook@17.2.7": - version "17.2.7" - resolved "https://registry.yarnpkg.com/@nrwl/storybook/-/storybook-17.2.7.tgz#289b3b6e1f1b3f6d5ad6594729e70373051d01fa" - integrity sha512-LGIJfg4JCHQa7ttjlxnBOCLWWYNhBWwZerpnwCgWYWus4w/56hXUd21yN19XVDbABpxOV50HTWXmpHkCU6iiuQ== +"@nrwl/storybook@17.2.8": + version "17.2.8" + resolved "https://registry.yarnpkg.com/@nrwl/storybook/-/storybook-17.2.8.tgz#7e4f4b5bcf6f19b5dd759c4e729d6443e6b78aa6" + integrity sha512-YBedhVfpylP48lG7VqB7xdiPp5DsEY6aFeabiZC3DQWK+oaMAIOYUKFD6+LiviDoPGpIJCeoJRC0UcnAuaLO7g== dependencies: - "@nx/storybook" "17.2.7" + "@nx/storybook" "17.2.8" -"@nrwl/tao@17.2.7": - version "17.2.7" - resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-17.2.7.tgz#a4df2089559bce0af66fbe785324c1f8abe752ec" - integrity sha512-06YYR1Ndb+nAJaQuvi2J3bX7i2dStQvDHkT+qprUXKxOrggFcPcs+7e2LwNWKDGdCu4r0qFHPlamj7y5d6qM2Q== +"@nrwl/tao@17.2.8": + version "17.2.8" + resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-17.2.8.tgz#41ff3d715a0763e95cf5c35e7f79cd3be358dc5f" + integrity sha512-Qpk5YKeJ+LppPL/wtoDyNGbJs2MsTi6qyX/RdRrEc8lc4bk6Cw3Oul1qTXCI6jT0KzTz+dZtd0zYD/G7okkzvg== dependencies: - nx "17.2.7" + nx "17.2.8" tslib "^2.3.0" -"@nrwl/web@17.2.7": - version "17.2.7" - resolved "https://registry.yarnpkg.com/@nrwl/web/-/web-17.2.7.tgz#82a3b8e053edbb2be1ec99f6d5e03a854069b9e5" - integrity sha512-ZlGkmth0qqqQ0WyV6JhdNswSbgOEiDR0G8XJXeoHkDFeThlaU20JyMrqTGNDpQ04d9EpvItvv+bAueg/BLASOw== +"@nrwl/web@17.2.8": + version "17.2.8" + resolved "https://registry.yarnpkg.com/@nrwl/web/-/web-17.2.8.tgz#5ff1c388a5e26a345d445eb52d8e5474e3d48bd3" + integrity sha512-oBiuSQ7Q6hOXHuZW5Gf8m0gcrLTV78jxhSjmhC5F6yzgvBvnfMpCdrJn7W1G+O+kEg3byko8v+Rz39tfc8YPjg== dependencies: - "@nx/web" "17.2.7" + "@nx/web" "17.2.8" -"@nrwl/webpack@17.2.7": - version "17.2.7" - resolved "https://registry.yarnpkg.com/@nrwl/webpack/-/webpack-17.2.7.tgz#9afa4a12d440515cdbec8555aceba8df1644dce1" - integrity sha512-Ornp2N/cdUNnht0ojjQrtE3ko+JpvAvWvStdZCVfXULMzy96CpGjPzRBkrX+iNee1GYEJXiHFUZhA+n6NlKB3A== +"@nrwl/webpack@17.2.8": + version "17.2.8" + resolved "https://registry.yarnpkg.com/@nrwl/webpack/-/webpack-17.2.8.tgz#e0d5061c62f6896c6ff0b2b2d4fbda950cc9afa7" + integrity sha512-HcwdfjXVz1NrZZnx1Fv48vleOTlsDAgTRHnQL02xYWT6ElhuKRQsqJGvDduQIFAp4KrnEEhEKEx6oDAEZKUkDg== dependencies: - "@nx/webpack" "17.2.7" + "@nx/webpack" "17.2.8" -"@nrwl/workspace@17.2.7": - version "17.2.7" - resolved "https://registry.yarnpkg.com/@nrwl/workspace/-/workspace-17.2.7.tgz#7494d6774e45b1b9f2bf57b2fafa33ad3cd2c2db" - integrity sha512-qYb2iLliBfS4IwS1aGqeXgyFzdEcXvu+4jxZpROTcg4THJLYni3XhI/Y8gfi4OVzzCadKILMxiOukZKjjIDPlA== +"@nrwl/workspace@17.2.8": + version "17.2.8" + resolved "https://registry.yarnpkg.com/@nrwl/workspace/-/workspace-17.2.8.tgz#79d0c143d38087c3e8ee1401c1f977696e5055cd" + integrity sha512-RiTDTuzdueZ+++kNQAENHdHbYToOhzO56XWxKOGoMEUSpcmbKRAFReFBzNqD91Fnv562vkW1VNRIb6Ey7X1YHQ== dependencies: - "@nx/workspace" "17.2.7" + "@nx/workspace" "17.2.8" "@nuxtjs/opencollective@0.3.2": version "0.3.2" @@ -4434,20 +4434,20 @@ consola "^2.15.0" node-fetch "^2.6.1" -"@nx/angular@17.2.7": - version "17.2.7" - resolved "https://registry.yarnpkg.com/@nx/angular/-/angular-17.2.7.tgz#495fe00f01d7c4c9980f2b62851d42b832c45277" - integrity sha512-zRJZa4BqKuXbn9nPgoL/WxXmKSl7iK8v9wGD5jU8eGQk2AZ96rr/yOZZlGZECfKE5ygim6xoM83mW5Ly1z8J+w== - dependencies: - "@nrwl/angular" "17.2.7" - "@nx/cypress" "17.2.7" - "@nx/devkit" "17.2.7" - "@nx/eslint" "17.2.7" - "@nx/jest" "17.2.7" - "@nx/js" "17.2.7" - "@nx/web" "17.2.7" - "@nx/webpack" "17.2.7" - "@nx/workspace" "17.2.7" +"@nx/angular@17.2.8": + version "17.2.8" + resolved "https://registry.yarnpkg.com/@nx/angular/-/angular-17.2.8.tgz#3112e13a4d1f122da6c81faac56d42baa7582fb8" + integrity sha512-vznuo8z9n/xcuZ4j2wv6lg4GT/SGSBQM+dAyG/8GFm34gEato75rhtbjDlsOzZc4gUEBJXRwtuntnfa7pvW88w== + dependencies: + "@nrwl/angular" "17.2.8" + "@nx/cypress" "17.2.8" + "@nx/devkit" "17.2.8" + "@nx/eslint" "17.2.8" + "@nx/jest" "17.2.8" + "@nx/js" "17.2.8" + "@nx/web" "17.2.8" + "@nx/webpack" "17.2.8" + "@nx/workspace" "17.2.8" "@phenomnomnominal/tsquery" "~5.0.1" "@typescript-eslint/type-utils" "^6.9.1" chalk "^4.1.0" @@ -4460,26 +4460,26 @@ webpack "^5.80.0" webpack-merge "^5.8.0" -"@nx/cypress@17.2.7": - version "17.2.7" - resolved "https://registry.yarnpkg.com/@nx/cypress/-/cypress-17.2.7.tgz#ccbc2c960e428936e4bbfc7cc9d37470028f5c58" - integrity sha512-MwzaWrIsMxjRPg5DQSBFNM+dNGru0jNjqGyMNlhAM0LPMB34I2bw5Sl6zE6GY2hm05oiFb5AbiSvc1M3ptfzmw== +"@nx/cypress@17.2.8": + version "17.2.8" + resolved "https://registry.yarnpkg.com/@nx/cypress/-/cypress-17.2.8.tgz#354fb0b1308499d2580ec270ebfcd565b0ef6f90" + integrity sha512-RjDD2AjDg7D743/+hSgzllLlSi4RwP196Nm0C8ltG5udPK1W+3S0qcERgHgtTuYr6+WVZIMtcZF2Vq09zcbtyg== dependencies: - "@nrwl/cypress" "17.2.7" - "@nx/devkit" "17.2.7" - "@nx/eslint" "17.2.7" - "@nx/js" "17.2.7" + "@nrwl/cypress" "17.2.8" + "@nx/devkit" "17.2.8" + "@nx/eslint" "17.2.8" + "@nx/js" "17.2.8" "@phenomnomnominal/tsquery" "~5.0.1" detect-port "^1.5.1" semver "7.5.3" tslib "^2.3.0" -"@nx/devkit@17.2.7": - version "17.2.7" - resolved "https://registry.yarnpkg.com/@nx/devkit/-/devkit-17.2.7.tgz#aa5d2352a963a613e415b1d3167a5b87937b6fcb" - integrity sha512-RyJyFO5PkNhMrebpv93Bci6pRkrw6guyfX7Esl/5+O6UfN0ytnmaRIrbiVwftTQ6m/T08OWrJQHZMuByP0WWHQ== +"@nx/devkit@17.2.8": + version "17.2.8" + resolved "https://registry.yarnpkg.com/@nx/devkit/-/devkit-17.2.8.tgz#49b6c94a3c12fba63eae6514fb37a468d0570e2e" + integrity sha512-6LtiQihtZwqz4hSrtT5cCG5XMCWppG6/B8c1kNksg97JuomELlWyUyVF+sxmeERkcLYFaKPTZytP0L3dmCFXaw== dependencies: - "@nrwl/devkit" "17.2.7" + "@nrwl/devkit" "17.2.8" ejs "^3.1.7" enquirer "~2.3.6" ignore "^5.0.4" @@ -4487,14 +4487,14 @@ tmp "~0.2.1" tslib "^2.3.0" -"@nx/eslint-plugin@17.2.7": - version "17.2.7" - resolved "https://registry.yarnpkg.com/@nx/eslint-plugin/-/eslint-plugin-17.2.7.tgz#749938e202b546efb9ae23df79ec2c065b8e7f88" - integrity sha512-emKsCaWDOPekCJvuE6QE6CHwSR4RKULdOHotnSaE3J65cgair9djsR8SNUELsqpTSfEmtfB53Z0oZYw4zdeiFQ== +"@nx/eslint-plugin@17.2.8": + version "17.2.8" + resolved "https://registry.yarnpkg.com/@nx/eslint-plugin/-/eslint-plugin-17.2.8.tgz#bb190ce2152fc4a1999b7fa3b5a0930b87d22a5d" + integrity sha512-SOF/Q1g9SNZnwPpwcZNCYeYU670s1X1hgwHCWisw3jGPTYHvpAMQVGwPyU28OyY4PBrqEOVqLTWsuWQYpUjLOw== dependencies: - "@nrwl/eslint-plugin-nx" "17.2.7" - "@nx/devkit" "17.2.7" - "@nx/js" "17.2.7" + "@nrwl/eslint-plugin-nx" "17.2.8" + "@nx/devkit" "17.2.8" + "@nx/js" "17.2.8" "@typescript-eslint/type-utils" "^6.9.1" "@typescript-eslint/utils" "^6.9.1" chalk "^4.1.0" @@ -4503,27 +4503,27 @@ semver "7.5.3" tslib "^2.3.0" -"@nx/eslint@17.2.7": - version "17.2.7" - resolved "https://registry.yarnpkg.com/@nx/eslint/-/eslint-17.2.7.tgz#26a4ea6f074d1442e6868dc46b2366166c1a83b9" - integrity sha512-A/+J9rcb9FUwGpEc5yFjFWcoF36PfXc6twOGLceFwj+oOG65h7kUnpuJgWK8gTIh911lij3TdmE6MiqSXPu3tQ== +"@nx/eslint@17.2.8": + version "17.2.8" + resolved "https://registry.yarnpkg.com/@nx/eslint/-/eslint-17.2.8.tgz#426010f88aa5518454311b2c7d194444a973e662" + integrity sha512-P6s85cIK7LYHixCJFZ+tLCPDxeOt9m2bQQOLxBCLEy5mqaGmjMHzWkLaoQBueCSntE6PSao0MMA+1TeeZjOoDw== dependencies: - "@nx/devkit" "17.2.7" - "@nx/js" "17.2.7" - "@nx/linter" "17.2.7" + "@nx/devkit" "17.2.8" + "@nx/js" "17.2.8" + "@nx/linter" "17.2.8" tslib "^2.3.0" typescript "~5.2.2" -"@nx/jest@17.2.7": - version "17.2.7" - resolved "https://registry.yarnpkg.com/@nx/jest/-/jest-17.2.7.tgz#2d24fc70ac093e01f233aadf594ad36d4f5860f0" - integrity sha512-lfUBZ1eCdO2ML2AdPiuXkMcQvuHaevYHB4wrRoUEQp/jui8m8ZQtIaihEy+8nmnSQTSGpCxlILRLpaNQ8gqCoQ== +"@nx/jest@17.2.8": + version "17.2.8" + resolved "https://registry.yarnpkg.com/@nx/jest/-/jest-17.2.8.tgz#6c0e33b4cbdfdd357230e5a28a093e626bbf01a8" + integrity sha512-FnwwURXmG+uv5ELHjHd9uVbUioCPjefAOtENcasLJMs2WYeu3zePsru5B8GO9BBM5g2eTmw10Y5f0riAikZjcw== dependencies: "@jest/reporters" "^29.4.1" "@jest/test-result" "^29.4.1" - "@nrwl/jest" "17.2.7" - "@nx/devkit" "17.2.7" - "@nx/js" "17.2.7" + "@nrwl/jest" "17.2.8" + "@nx/devkit" "17.2.8" + "@nx/js" "17.2.8" "@phenomnomnominal/tsquery" "~5.0.1" chalk "^4.1.0" identity-obj-proxy "3.0.0" @@ -4533,10 +4533,10 @@ resolve.exports "1.1.0" tslib "^2.3.0" -"@nx/js@17.2.7": - version "17.2.7" - resolved "https://registry.yarnpkg.com/@nx/js/-/js-17.2.7.tgz#f2f14bdcf5cd96e23dd2689641d8ce42e9c0b187" - integrity sha512-IghIrp26b9TprxDzJlqH1ZLer+dNmnSDjoT1jviQWcjNY/8wUxe3avd7niMCpfYD6+r7sSGPZ+KVQSRwT3L09g== +"@nx/js@17.2.8": + version "17.2.8" + resolved "https://registry.yarnpkg.com/@nx/js/-/js-17.2.8.tgz#9f1a620b016ac014125151beacffab18c11952f7" + integrity sha512-M91tw9tfSnkoC8pZaC9wNxrgaFU4MeQcgdT08ievaroo77kH4RheySsU1uNc0J58Jk4X4315wu/X7Bf/35m0Mw== dependencies: "@babel/core" "^7.22.9" "@babel/plugin-proposal-decorators" "^7.22.7" @@ -4545,9 +4545,9 @@ "@babel/preset-env" "^7.22.9" "@babel/preset-typescript" "^7.22.5" "@babel/runtime" "^7.22.6" - "@nrwl/js" "17.2.7" - "@nx/devkit" "17.2.7" - "@nx/workspace" "17.2.7" + "@nrwl/js" "17.2.8" + "@nx/devkit" "17.2.8" + "@nx/workspace" "17.2.8" "@phenomnomnominal/tsquery" "~5.0.1" babel-plugin-const-enum "^1.0.1" babel-plugin-macros "^2.8.0" @@ -4569,125 +4569,125 @@ tsconfig-paths "^4.1.2" tslib "^2.3.0" -"@nx/linter@17.2.7": - version "17.2.7" - resolved "https://registry.yarnpkg.com/@nx/linter/-/linter-17.2.7.tgz#38364de5966bd8637ca830808c00fc8b7ab8406d" - integrity sha512-t85R1r+fiEV8wwU6mAD9kKq+YqAxwzBDp3Dx42cX5uokp2jsUKcTHYsibTJ7SVgViJicDLoVDonlJc8SxA0cfQ== +"@nx/linter@17.2.8": + version "17.2.8" + resolved "https://registry.yarnpkg.com/@nx/linter/-/linter-17.2.8.tgz#bafc71b40a36b492e538898b254a8932433096b4" + integrity sha512-dwqE742TIw1+/djzlikKakIfComq8nFnhupWjvl7KrU9r8ytcKyQbxHw7KGMUT9HAEG4xSNuwiaELr/8w4MM2Q== dependencies: - "@nx/eslint" "17.2.7" + "@nx/eslint" "17.2.8" -"@nx/nest@17.2.7": - version "17.2.7" - resolved "https://registry.yarnpkg.com/@nx/nest/-/nest-17.2.7.tgz#1f2a1ad3a7a15b147601e427cd2d554cd75a20eb" - integrity sha512-Gjam5Bciq1AUv8VGtL56SeKv2NgZBgojSU85xJAfGbAUoOxgmiS2hbtORlScE0G22BU+mUFy0J7l9tlslq2amQ== +"@nx/nest@17.2.8": + version "17.2.8" + resolved "https://registry.yarnpkg.com/@nx/nest/-/nest-17.2.8.tgz#6e84f2e802f961fa05e04b7a9fff7b55854519de" + integrity sha512-VZ84VBWACcABjU4djWHHVxY83g3VTkg13AjAeZWyvPAMkNqS05e2jj3CpPVd4EAbwqXX3/CLM/bLKRuGWpYCWg== dependencies: "@nestjs/schematics" "^9.1.0" - "@nrwl/nest" "17.2.7" - "@nx/devkit" "17.2.7" - "@nx/eslint" "17.2.7" - "@nx/js" "17.2.7" - "@nx/node" "17.2.7" + "@nrwl/nest" "17.2.8" + "@nx/devkit" "17.2.8" + "@nx/eslint" "17.2.8" + "@nx/js" "17.2.8" + "@nx/node" "17.2.8" "@phenomnomnominal/tsquery" "~5.0.1" tslib "^2.3.0" -"@nx/node@17.2.7": - version "17.2.7" - resolved "https://registry.yarnpkg.com/@nx/node/-/node-17.2.7.tgz#930897cdef951ce83ba698617fa6dc83750c9668" - integrity sha512-u3mChRmUliQENH4wBYNfqx/0Cfzj6PB9Eaj7lvOwwdquLgUgGgkFXFfYTLjHuIClYhyn2ATR84LZ+NLMaLCvdA== +"@nx/node@17.2.8": + version "17.2.8" + resolved "https://registry.yarnpkg.com/@nx/node/-/node-17.2.8.tgz#57668ee77197423560971596540ba6c61295bde3" + integrity sha512-MxvJ2MlbpHeB5ZnlSAbSvBXAYoxCre4fsAwwCpysz1OWkf9dDGYzvlV4ovnu6jET7/ZQzzDvaKD9CvVSDk/amg== dependencies: - "@nrwl/node" "17.2.7" - "@nx/devkit" "17.2.7" - "@nx/eslint" "17.2.7" - "@nx/jest" "17.2.7" - "@nx/js" "17.2.7" + "@nrwl/node" "17.2.8" + "@nx/devkit" "17.2.8" + "@nx/eslint" "17.2.8" + "@nx/jest" "17.2.8" + "@nx/js" "17.2.8" tslib "^2.3.0" -"@nx/nx-darwin-arm64@17.2.7": - version "17.2.7" - resolved "https://registry.yarnpkg.com/@nx/nx-darwin-arm64/-/nx-darwin-arm64-17.2.7.tgz#8399b96591757367c45b5c8ee5725dcbe60007e2" - integrity sha512-d534L13VUlnSW61rabBl3TTuSpzHxtqy8eF5vsYkFSMonBDjqqNR6+vFfQEa7PW/3Qfeuw4MpmojtamCYLd/TA== - -"@nx/nx-darwin-x64@17.2.7": - version "17.2.7" - resolved "https://registry.yarnpkg.com/@nx/nx-darwin-x64/-/nx-darwin-x64-17.2.7.tgz#1b9cf367cfa035f1443ac0e78f8e60968ab4775f" - integrity sha512-K1pHWiSiYTJqk//ZJylvuQcNZR9HUKvOxuh2540+6X9ThQ7kzkC1abXJ4c9wwH3fYDwL29m7glh3AueJvyaXJA== - -"@nx/nx-freebsd-x64@17.2.7": - version "17.2.7" - resolved "https://registry.yarnpkg.com/@nx/nx-freebsd-x64/-/nx-freebsd-x64-17.2.7.tgz#731e7f8f311e6fdf50b8a8b2b060b322a9e92ad4" - integrity sha512-VyouszZjV7Ew4qNrNfG8JApm7/UcreRuC+W/YZ2ORGzM0KUnB/D4rXGmeTp1Ff+L5WUhoomwEnaBkbgqu+2wjA== - -"@nx/nx-linux-arm-gnueabihf@17.2.7": - version "17.2.7" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-17.2.7.tgz#a1db4a4898e0bb1e77bdf8dbf0959ca9d073dc23" - integrity sha512-YfwW8NYi33Li1Q7BDUusNlfpJNWfXOnHt6JKvQGc8fy8StmWq13zNnU0IxPQyqCDK5Ymx95IoctFrMLpeXPAwQ== - -"@nx/nx-linux-arm64-gnu@17.2.7": - version "17.2.7" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-17.2.7.tgz#7abd71cc615f4ec93fabc31ad410bd7d8eb9e668" - integrity sha512-oJyEf2q+5jj6ci6WEXvRUoU2Sj0Mo+J/0NwtPY6sRIhqgPwpmxc6Pja4zmB16iQ5ap48zstB9glfJ6qtr3iU0Q== - -"@nx/nx-linux-arm64-musl@17.2.7": - version "17.2.7" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-17.2.7.tgz#938ed7504ad1d0f305304250a71b8cf18bc10533" - integrity sha512-IzsCJgJCM61THBMDghz+EY5aCeO7wBWOWq2sTDek1ve67qZtu/E/Z5qBp93JRAvNYgQT7KbC40WhaXuE/NpWEA== - -"@nx/nx-linux-x64-gnu@17.2.7": - version "17.2.7" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-17.2.7.tgz#8a39bfdfc990a2fb4f1679f68195e8cea97d8c99" - integrity sha512-CCY3o9zs9ypsT40GyRGQMfl63Wy3Spu21ULcteoLTI2/py601XIdhv6zclzBqeYIWPVxMoGGlIq10m2rdEeAOA== - -"@nx/nx-linux-x64-musl@17.2.7": - version "17.2.7" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-17.2.7.tgz#0dac2eff58d11524192b2a8a36d70d7c2547e39e" - integrity sha512-hBzrXpoDg1OJBl/Ja5nU3oYTBk/FW6J+jTJM1zmXJOJ8Z7NR26I783qlVLQFDYkMynwGBE3kI4a7L87p633BRw== - -"@nx/nx-win32-arm64-msvc@17.2.7": - version "17.2.7" - resolved "https://registry.yarnpkg.com/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-17.2.7.tgz#f004b2fa0fe1af256c60ddfd90fe28348f1ed4e3" - integrity sha512-imLrVpeBXQwcYDUujBZRE9YG9lqM7F8Qw51JxmCxG2twijlVeofGWw0uVHM16t95cuizt/Ho+bTfNukV7Oza3g== - -"@nx/nx-win32-x64-msvc@17.2.7": - version "17.2.7" - resolved "https://registry.yarnpkg.com/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-17.2.7.tgz#5af5b3e6fe41f432831e809ba7efc02826af8ebe" - integrity sha512-MBQxvEE1sz47prRCid+axKwb6zqcbR4XBKj+l9V5NA7/0Rw5PHjrEfWv5Lr5TckYAdIZ1PVgPHlril6hX89evw== - -"@nx/storybook@17.2.7": - version "17.2.7" - resolved "https://registry.yarnpkg.com/@nx/storybook/-/storybook-17.2.7.tgz#1c43c0e1ed234c0c9f40406fc753321e869eab72" - integrity sha512-kDbk6oIWR/6ZesmJ2/cQQHz0fxG+4WBPHkbda4v8QevuGauPwaxoMXTqRTI0qtRK5nksAnfNIuvGgRfWqmBhpg== - dependencies: - "@nrwl/storybook" "17.2.7" - "@nx/cypress" "17.2.7" - "@nx/devkit" "17.2.7" - "@nx/eslint" "17.2.7" - "@nx/js" "17.2.7" +"@nx/nx-darwin-arm64@17.2.8": + version "17.2.8" + resolved "https://registry.yarnpkg.com/@nx/nx-darwin-arm64/-/nx-darwin-arm64-17.2.8.tgz#26645c9548d5e387b43c06fccfa18e2c1f08055e" + integrity sha512-dMb0uxug4hM7tusISAU1TfkDK3ixYmzc1zhHSZwpR7yKJIyKLtUpBTbryt8nyso37AS1yH+dmfh2Fj2WxfBHTg== + +"@nx/nx-darwin-x64@17.2.8": + version "17.2.8" + resolved "https://registry.yarnpkg.com/@nx/nx-darwin-x64/-/nx-darwin-x64-17.2.8.tgz#5143d6d01d24e338cb3d39076fe2af95146cb538" + integrity sha512-0cXzp1tGr7/6lJel102QiLA4NkaLCkQJj6VzwbwuvmuCDxPbpmbz7HC1tUteijKBtOcdXit1/MEoEU007To8Bw== + +"@nx/nx-freebsd-x64@17.2.8": + version "17.2.8" + resolved "https://registry.yarnpkg.com/@nx/nx-freebsd-x64/-/nx-freebsd-x64-17.2.8.tgz#82a018a1855170e0243b8fe7b0032af279c3fb83" + integrity sha512-YFMgx5Qpp2btCgvaniDGdu7Ctj56bfFvbbaHQWmOeBPK1krNDp2mqp8HK6ZKOfEuDJGOYAp7HDtCLvdZKvJxzA== + +"@nx/nx-linux-arm-gnueabihf@17.2.8": + version "17.2.8" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-17.2.8.tgz#18b9c324221ff6a30589f3fc272a843aca57b70f" + integrity sha512-iN2my6MrhLRkVDtdivQHugK8YmR7URo1wU9UDuHQ55z3tEcny7LV3W9NSsY9UYPK/FrxdDfevj0r2hgSSdhnzA== + +"@nx/nx-linux-arm64-gnu@17.2.8": + version "17.2.8" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-17.2.8.tgz#54a08640a2babe78bcf3283565b00eb487db595e" + integrity sha512-Iy8BjoW6mOKrSMiTGujUcNdv+xSM1DALTH6y3iLvNDkGbjGK1Re6QNnJAzqcXyDpv32Q4Fc57PmuexyysZxIGg== + +"@nx/nx-linux-arm64-musl@17.2.8": + version "17.2.8" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-17.2.8.tgz#cd7b673bb9f45fec7aa1b6c880a0d23d658e927f" + integrity sha512-9wkAxWzknjpzdofL1xjtU6qPFF1PHlvKCZI3hgEYJDo4mQiatGI+7Ttko+lx/ZMP6v4+Umjtgq7+qWrApeKamQ== + +"@nx/nx-linux-x64-gnu@17.2.8": + version "17.2.8" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-17.2.8.tgz#009eb75c77bf075bc9c13ec4f9caf77821eee639" + integrity sha512-sjG1bwGsjLxToasZ3lShildFsF0eyeGu+pOQZIp9+gjFbeIkd19cTlCnHrOV9hoF364GuKSXQyUlwtFYFR4VTQ== + +"@nx/nx-linux-x64-musl@17.2.8": + version "17.2.8" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-17.2.8.tgz#8ee2324068732a135ca4b01081942d5956885167" + integrity sha512-QiakXZ1xBCIptmkGEouLHQbcM4klQkcr+kEaz2PlNwy/sW3gH1b/1c0Ed5J1AN9xgQxWspriAONpScYBRgxdhA== + +"@nx/nx-win32-arm64-msvc@17.2.8": + version "17.2.8" + resolved "https://registry.yarnpkg.com/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-17.2.8.tgz#9bdce5b4d1f9cec7ef326eaf43b99e68576398b0" + integrity sha512-XBWUY/F/GU3vKN9CAxeI15gM4kr3GOBqnzFZzoZC4qJt2hKSSUEWsMgeZtsMgeqEClbi4ZyCCkY7YJgU32WUGA== + +"@nx/nx-win32-x64-msvc@17.2.8": + version "17.2.8" + resolved "https://registry.yarnpkg.com/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-17.2.8.tgz#8a86ff250021ad47686b58f1840b348a209b1158" + integrity sha512-HTqDv+JThlLzbcEm/3f+LbS5/wYQWzb5YDXbP1wi7nlCTihNZOLNqGOkEmwlrR5tAdNHPRpHSmkYg4305W0CtA== + +"@nx/storybook@17.2.8": + version "17.2.8" + resolved "https://registry.yarnpkg.com/@nx/storybook/-/storybook-17.2.8.tgz#b8d3152bdbc95a13414498d0aba0ded532f32038" + integrity sha512-8fQck3mP2i3XWCnq/p5l+Y11TQTr8Gv4L64Rggq6nPuZOk6RbinCPG+VMztqGgQET8q4XTTGt8yw5VOUG0cIyw== + dependencies: + "@nrwl/storybook" "17.2.8" + "@nx/cypress" "17.2.8" + "@nx/devkit" "17.2.8" + "@nx/eslint" "17.2.8" + "@nx/js" "17.2.8" "@phenomnomnominal/tsquery" "~5.0.1" semver "7.5.3" tslib "^2.3.0" -"@nx/web@17.2.7": - version "17.2.7" - resolved "https://registry.yarnpkg.com/@nx/web/-/web-17.2.7.tgz#d571950ecc4c261879a4fa0430477ebb942ecfe9" - integrity sha512-UhLD84jCLNwY/dC32v3Q5gAkBuj1p6a0h1ihcXqZdMUYbV6sjJhDAnjnfHyPJWgjaoI5t6VNSTJOaMZM9EMfzg== +"@nx/web@17.2.8": + version "17.2.8" + resolved "https://registry.yarnpkg.com/@nx/web/-/web-17.2.8.tgz#9fb21757715a7f3f799790541094e81e75f12918" + integrity sha512-ovPvFVJOiB/ZmOxnCOOyT+ibbdgazXjpa4506hLJxRohDZQw/6jwbCWkTBy/ch6Y8NSN6uNUpB5XUdscfrp52A== dependencies: - "@nrwl/web" "17.2.7" - "@nx/devkit" "17.2.7" - "@nx/js" "17.2.7" + "@nrwl/web" "17.2.8" + "@nx/devkit" "17.2.8" + "@nx/js" "17.2.8" chalk "^4.1.0" detect-port "^1.5.1" http-server "^14.1.0" tslib "^2.3.0" -"@nx/webpack@17.2.7": - version "17.2.7" - resolved "https://registry.yarnpkg.com/@nx/webpack/-/webpack-17.2.7.tgz#5c849942616c8f0ff60edbcc47b55b5bd65e051e" - integrity sha512-OUxUNxgzEyrn36V4+1T3oQNKyukJphgb+DBNc6NWA9dEWf3U48KdfJuALeKoRZ5J+/lS95L8b/2ygSyu0EdpLw== +"@nx/webpack@17.2.8": + version "17.2.8" + resolved "https://registry.yarnpkg.com/@nx/webpack/-/webpack-17.2.8.tgz#ec5f9a7405bbbdffd82fd7194fbb777f52297c44" + integrity sha512-Gud9Z+VO0dlLpVEJLfPxkEV5wG+ebZ1mv0S0cfTBdD24Fj4MAs0W8QWhRQBtLd2SayU9KMfJr+8gJjkNT6D3Kw== dependencies: "@babel/core" "^7.22.9" - "@nrwl/webpack" "17.2.7" - "@nx/devkit" "17.2.7" - "@nx/js" "17.2.7" + "@nrwl/webpack" "17.2.8" + "@nx/devkit" "17.2.8" + "@nx/js" "17.2.8" autoprefixer "^10.4.9" babel-loader "^9.1.2" browserslist "^4.21.4" @@ -4721,16 +4721,16 @@ webpack-node-externals "^3.0.0" webpack-subresource-integrity "^5.1.0" -"@nx/workspace@17.2.7": - version "17.2.7" - resolved "https://registry.yarnpkg.com/@nx/workspace/-/workspace-17.2.7.tgz#1c930feceb3ca20750124afc03ea71b5fee7de9e" - integrity sha512-/4xrFEc6Hjl9KaB+e/RSaQ/6vHWGP1MmhdX+TRvdjNIMbZ6kdDixBjusJ6WoHXm3KhP95cSt2xmwCQNUzVn+vw== +"@nx/workspace@17.2.8": + version "17.2.8" + resolved "https://registry.yarnpkg.com/@nx/workspace/-/workspace-17.2.8.tgz#61fdfc7757231c423f8a98713c0df65241721592" + integrity sha512-QCriI4CFCuG+0WTbpu3fHljVR1x6bjNSrbq8nqu8Z/3y+si2/O+7lVNSTkQNr1X2eBPqtIX74APS7ExG8c4vog== dependencies: - "@nrwl/workspace" "17.2.7" - "@nx/devkit" "17.2.7" + "@nrwl/workspace" "17.2.8" + "@nx/devkit" "17.2.8" chalk "^4.1.0" enquirer "~2.3.6" - nx "17.2.7" + nx "17.2.8" tslib "^2.3.0" yargs-parser "21.1.1" @@ -15846,12 +15846,12 @@ nwsapi@^2.2.2: resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.7.tgz#738e0707d3128cb750dddcfe90e4610482df0f30" integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== -nx@17.2.7: - version "17.2.7" - resolved "https://registry.yarnpkg.com/nx/-/nx-17.2.7.tgz#ac7d73dea0bd23a332e9520cf4834f8421bbfbff" - integrity sha512-CnssDvDphAgyeoYzdPbz6vA/xac4BQeEiO7R9IBLIm+l1MV7boI4SpCS6abR4dbp4VTwI9uBQ9vgqNwCiEjoWg== +nx@17.2.8: + version "17.2.8" + resolved "https://registry.yarnpkg.com/nx/-/nx-17.2.8.tgz#09482acd5d9b64c115d5ccf12417f1af2787d4d1" + integrity sha512-rM5zXbuXLEuqQqcjVjClyvHwRJwt+NVImR2A6KFNG40Z60HP6X12wAxxeLHF5kXXTDRU0PFhf/yACibrpbPrAw== dependencies: - "@nrwl/tao" "17.2.7" + "@nrwl/tao" "17.2.8" "@yarnpkg/lockfile" "^1.1.0" "@yarnpkg/parsers" "3.0.0-rc.46" "@zkochan/js-yaml" "0.0.6" @@ -15886,16 +15886,16 @@ nx@17.2.7: yargs "^17.6.2" yargs-parser "21.1.1" optionalDependencies: - "@nx/nx-darwin-arm64" "17.2.7" - "@nx/nx-darwin-x64" "17.2.7" - "@nx/nx-freebsd-x64" "17.2.7" - "@nx/nx-linux-arm-gnueabihf" "17.2.7" - "@nx/nx-linux-arm64-gnu" "17.2.7" - "@nx/nx-linux-arm64-musl" "17.2.7" - "@nx/nx-linux-x64-gnu" "17.2.7" - "@nx/nx-linux-x64-musl" "17.2.7" - "@nx/nx-win32-arm64-msvc" "17.2.7" - "@nx/nx-win32-x64-msvc" "17.2.7" + "@nx/nx-darwin-arm64" "17.2.8" + "@nx/nx-darwin-x64" "17.2.8" + "@nx/nx-freebsd-x64" "17.2.8" + "@nx/nx-linux-arm-gnueabihf" "17.2.8" + "@nx/nx-linux-arm64-gnu" "17.2.8" + "@nx/nx-linux-arm64-musl" "17.2.8" + "@nx/nx-linux-x64-gnu" "17.2.8" + "@nx/nx-linux-x64-musl" "17.2.8" + "@nx/nx-win32-arm64-msvc" "17.2.8" + "@nx/nx-win32-x64-msvc" "17.2.8" oauth@0.9.x: version "0.9.15" From d089662dab3c0ba258d29cbce80720b51f285f3a Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Tue, 2 Jan 2024 09:44:15 +0100 Subject: [PATCH 28/38] Feature/improve the style of the top 3 and bottom 3 performers (#2807) * Refactor to ordered list * Update changelog --- CHANGELOG.md | 27 +++--- .../portfolio/analysis/analysis-page.html | 88 ++++++++++--------- 2 files changed, 60 insertions(+), 55 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3c3ea595e..4d0ec0935 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- Improved the style of the _Top 3_ and _Bottom 3_ performers on the analysis page - Upgraded `Nx` from version `17.2.7` to `17.2.8` ## 2.33.0 - 2023-12-31 @@ -336,7 +337,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Changed the users table in the admin control panel to an `@angular/material` data table -- Improved the styling of the membership status +- Improved the style of the membership status ### Fixed @@ -1511,7 +1512,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed -- Improved the styling in the admin control panel +- Improved the style in the admin control panel - Removed the _Google Play_ badge from the landing page - Upgraded `eslint` dependencies @@ -2266,7 +2267,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Simplified the initialization of the exchange rate service - Improved the orders query for `assetClass` with symbol profile overrides -- Improved the styling of the benchmarks in the markets overview +- Improved the style of the benchmarks in the markets overview ### Todo @@ -2600,7 +2601,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed -- Fixed a styling issue in the benchmark component on mobile +- Fixed a style issue in the benchmark component on mobile ## 1.152.0 - 26.05.2022 @@ -3207,7 +3208,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed -- Fixed the styling in the footer row of the activities table +- Fixed the style in the footer row of the activities table ## 1.106.0 - 23.01.2022 @@ -3975,7 +3976,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Improved the wording for the _Restricted View_: _Presenter View_ -- Improved the styling of the tables +- Improved the style of the tables - Ignored cash assets in the allocation chart by sector, continent and country ### Fixed @@ -4178,8 +4179,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed -- Improved the styling of the current pricing plan -- Improved the styling of the transaction type badge +- Improved the style of the current pricing plan +- Improved the style of the transaction type badge - Set the public _Stripe_ key dynamically - Upgraded `angular-material-css-vars` from version `2.0.0` to `2.1.0` @@ -4539,7 +4540,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed -- Improved the users table styling of the admin control panel +- Improved the users table style of the admin control panel - Improved the background colors in the dark mode ## 0.92.0 - 25.04.2021 @@ -4563,7 +4564,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed -- Improved the styling of the rules in the _X-ray_ section +- Improved the style of the rules in the _X-ray_ section ## 0.90.0 - 22.04.2021 @@ -4758,7 +4759,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Improved the alignment of the _Why Ghostfolio?_ section -- Improved the styling of the _Fear & Greed Index_ (market mood) +- Improved the style of the _Fear & Greed Index_ (market mood) ## 0.73.0 - 31.03.2021 @@ -4804,7 +4805,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed -- Improved the styling in the _X-ray_ section +- Improved the style in the _X-ray_ section ## 0.70.0 - 27.03.2021 @@ -5099,7 +5100,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - Only show relevant data in the position detail dialog -- Improved the performance chart styling in Safari +- Improved the performance chart style in Safari ## 0.40.0 - 01.03.2021 diff --git a/apps/client/src/app/pages/portfolio/analysis/analysis-page.html b/apps/client/src/app/pages/portfolio/analysis/analysis-page.html index f875907bb..cc073ff62 100644 --- a/apps/client/src/app/pages/portfolio/analysis/analysis-page.html +++ b/apps/client/src/app/pages/portfolio/analysis/analysis-page.html @@ -41,31 +41,33 @@ > - + [routerLink]="[]" + > +
+ {{ position.name }} +
+
+ +
+ + +
- + [routerLink]="[]" + > +
+ {{ position.name }} +
+
+ +
+ + +
Date: Tue, 2 Jan 2024 10:05:31 +0100 Subject: [PATCH 29/38] Clean up (#2787) --- apps/api/src/app/admin/admin.controller.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/api/src/app/admin/admin.controller.ts b/apps/api/src/app/admin/admin.controller.ts index 634bbbfdc..e769325ef 100644 --- a/apps/api/src/app/admin/admin.controller.ts +++ b/apps/api/src/app/admin/admin.controller.ts @@ -20,7 +20,7 @@ import { AdminMarketDataDetails, EnhancedSymbolProfile } from '@ghostfolio/common/interfaces'; -import { hasPermission, permissions } from '@ghostfolio/common/permissions'; +import { permissions } from '@ghostfolio/common/permissions'; import type { MarketDataPreset, RequestWithUser From 0ad734262a64c6ba1ec9aed6893aa8db66d0dcbc Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Tue, 2 Jan 2024 10:06:13 +0100 Subject: [PATCH 30/38] Bugfix/improve tabs on ios (#2811) * Improve tabs on iOS (Add to Home Screen) * Update changelog --- CHANGELOG.md | 4 ++++ apps/client/src/app/app.component.scss | 6 +++--- apps/client/src/styles.scss | 8 ++++---- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4d0ec0935..bb13ba072 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Improved the style of the _Top 3_ and _Bottom 3_ performers on the analysis page - Upgraded `Nx` from version `17.2.7` to `17.2.8` +### Fixed + +- Improved the tabs on iOS (_Add to Home Screen_) + ## 2.33.0 - 2023-12-31 ### Added diff --git a/apps/client/src/app/app.component.scss b/apps/client/src/app/app.component.scss index 2cc6d9a17..21d33e3c9 100644 --- a/apps/client/src/app/app.component.scss +++ b/apps/client/src/app/app.component.scss @@ -2,7 +2,7 @@ :host { display: block; - min-height: 100vh; + min-height: 100svh; &.has-info-message { header { @@ -30,7 +30,7 @@ } main { - min-height: calc(100vh - 2 * var(--mat-toolbar-standard-height)); + min-height: calc(100svh - 2 * var(--mat-toolbar-standard-height)); } } @@ -44,7 +44,7 @@ } main { - min-height: calc(100vh - var(--mat-toolbar-standard-height)); + min-height: calc(100svh - var(--mat-toolbar-standard-height)); } } diff --git a/apps/client/src/styles.scss b/apps/client/src/styles.scss index fbcc5e73f..3aaf768c2 100644 --- a/apps/client/src/styles.scss +++ b/apps/client/src/styles.scss @@ -385,7 +385,7 @@ ngx-skeleton-loader { .has-info-message { .page.has-tabs { - height: calc(100vh - 2 * var(--mat-toolbar-standard-height)); + height: calc(100svh - 2 * var(--mat-toolbar-standard-height)); } } @@ -505,6 +505,8 @@ ngx-skeleton-loader { display: flex; flex-direction: column; overflow-y: auto; + padding-bottom: env(safe-area-inset-bottom); + padding-bottom: constant(safe-area-inset-bottom); .fab-container { bottom: 2rem; @@ -520,9 +522,7 @@ ngx-skeleton-loader { } &.has-tabs { - height: calc(100vh - var(--mat-toolbar-standard-height)); - padding-bottom: env(safe-area-inset-bottom); - padding-bottom: constant(safe-area-inset-bottom); + height: calc(100svh - var(--mat-toolbar-standard-height)); .fab-container { @media (max-width: 575.98px) { From 23d323073d9f5cdfb6624e325cf9a78664c1072c Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Tue, 2 Jan 2024 14:10:08 +0100 Subject: [PATCH 31/38] Fix performance percentage for 1d (#2814) * Fix performance percentage for 1d * Improve response of positions endpoint * Update changelog --- CHANGELOG.md | 1 + .../src/app/portfolio/portfolio-calculator.ts | 7 ++- .../src/app/portfolio/portfolio.service.ts | 57 ++++++++++++------- 3 files changed, 44 insertions(+), 21 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bb13ba072..35560bf95 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed +- Improved the time-weighted performance calculation for `1D` - Improved the tabs on iOS (_Add to Home Screen_) ## 2.33.0 - 2023-12-31 diff --git a/apps/api/src/app/portfolio/portfolio-calculator.ts b/apps/api/src/app/portfolio/portfolio-calculator.ts index 06a5ca6ae..71ddbb6dd 100644 --- a/apps/api/src/app/portfolio/portfolio-calculator.ts +++ b/apps/api/src/app/portfolio/portfolio-calculator.ts @@ -1246,7 +1246,7 @@ export class PortfolioCalculator { if (i > indexOfStartOrder) { // Only consider periods with an investment for the calculation of // the time weighted investment - if (totalInvestmentBeforeTransaction.gt(0)) { + if (valueOfInvestmentBeforeTransaction.gt(0)) { // Calculate the number of days since the previous order const orderDate = new Date(order.date); const previousOrderDate = new Date(orders[i - 1].date); @@ -1267,7 +1267,10 @@ export class PortfolioCalculator { totalInvestmentDays += daysSinceLastOrder; sumOfTimeWeightedInvestments = sumOfTimeWeightedInvestments.add( - totalInvestmentBeforeTransaction.mul(daysSinceLastOrder) + valueAtStartDate + .minus(investmentAtStartDate) + .plus(totalInvestmentBeforeTransaction) + .mul(daysSinceLastOrder) ); } diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index 050559c85..cd4fa0bae 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -1035,25 +1035,44 @@ export class PortfolioService { return { hasErrors: currentPositions.hasErrors, - positions: positions.map((position) => { - return { - ...position, - assetClass: symbolProfileMap[position.symbol].assetClass, - assetSubClass: symbolProfileMap[position.symbol].assetSubClass, - averagePrice: new Big(position.averagePrice).toNumber(), - grossPerformance: position.grossPerformance?.toNumber() ?? null, - grossPerformancePercentage: - position.grossPerformancePercentage?.toNumber() ?? null, - investment: new Big(position.investment).toNumber(), - marketState: - dataProviderResponses[position.symbol]?.marketState ?? 'delayed', - name: symbolProfileMap[position.symbol].name, - netPerformance: position.netPerformance?.toNumber() ?? null, - netPerformancePercentage: - position.netPerformancePercentage?.toNumber() ?? null, - quantity: new Big(position.quantity).toNumber() - }; - }) + positions: positions.map( + ({ + averagePrice, + currency, + dataSource, + firstBuyDate, + investment, + grossPerformance, + grossPerformancePercentage, + netPerformance, + netPerformancePercentage, + quantity, + symbol, + transactionCount + }) => { + return { + currency, + dataSource, + firstBuyDate, + symbol, + transactionCount, + assetClass: symbolProfileMap[symbol].assetClass, + assetSubClass: symbolProfileMap[symbol].assetSubClass, + averagePrice: averagePrice.toNumber(), + grossPerformance: grossPerformance?.toNumber() ?? null, + grossPerformancePercentage: + grossPerformancePercentage?.toNumber() ?? null, + investment: investment.toNumber(), + marketState: + dataProviderResponses[symbol]?.marketState ?? 'delayed', + name: symbolProfileMap[symbol].name, + netPerformance: netPerformance?.toNumber() ?? null, + netPerformancePercentage: + netPerformancePercentage?.toNumber() ?? null, + quantity: quantity.toNumber() + }; + } + ) }; } From 4c30e9459d87c7523c52c74feaba2c47b22ec571 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Tue, 2 Jan 2024 17:02:15 +0100 Subject: [PATCH 32/38] Feature/extend assistant by date range selector (#2815) * Extend assistant by date range selector * Update changelog --- CHANGELOG.md | 1 + .../components/header/header.component.html | 8 +- .../components/header/header.component.scss | 4 + .../app/components/header/header.component.ts | 19 +++- .../home-holdings/home-holdings.html | 2 +- .../home-overview/home-overview.html | 5 +- .../portfolio/analysis/analysis-page.html | 2 +- apps/client/src/locales/messages.de.xlf | 102 +++++++++++------- apps/client/src/locales/messages.es.xlf | 102 +++++++++++------- apps/client/src/locales/messages.fr.xlf | 102 +++++++++++------- apps/client/src/locales/messages.it.xlf | 102 +++++++++++------- apps/client/src/locales/messages.nl.xlf | 102 +++++++++++------- apps/client/src/locales/messages.pl.xlf | 102 +++++++++++------- apps/client/src/locales/messages.pt.xlf | 102 +++++++++++------- apps/client/src/locales/messages.tr.xlf | 102 +++++++++++------- apps/client/src/locales/messages.xlf | 99 ++++++++++------- .../src/lib/assistant/assistant.component.ts | 10 ++ libs/ui/src/lib/assistant/assistant.html | 20 ++++ libs/ui/src/lib/assistant/assistant.module.ts | 4 + 19 files changed, 634 insertions(+), 356 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 35560bf95..02b050482 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added +- Extended the assistant by a date range selector (experimental) - Added a button to test the scraper configuration in the asset profile details dialog of the admin control ### Changed diff --git a/apps/client/src/app/components/header/header.component.html b/apps/client/src/app/components/header/header.component.html index 4d606f591..f078b5028 100644 --- a/apps/client/src/app/components/header/header.component.html +++ b/apps/client/src/app/components/header/header.component.html @@ -119,7 +119,11 @@ [matMenuTriggerRestoreFocus]="false" (menuOpened)="onOpenAssistant()" > - + @if (user?.settings?.isExperimentalFeatures) { + + } @else { + + } diff --git a/apps/client/src/app/components/header/header.component.scss b/apps/client/src/app/components/header/header.component.scss index 2e5b583c2..9a39cbdea 100644 --- a/apps/client/src/app/components/header/header.component.scss +++ b/apps/client/src/app/components/header/header.component.scss @@ -32,6 +32,10 @@ ion-icon { font-size: 1.5rem; + + &.rotate-90 { + transform: rotate(-90deg); + } } } diff --git a/apps/client/src/app/components/header/header.component.ts b/apps/client/src/app/components/header/header.component.ts index a1f65f244..5218e2870 100644 --- a/apps/client/src/app/components/header/header.component.ts +++ b/apps/client/src/app/components/header/header.component.ts @@ -19,8 +19,10 @@ import { SettingsStorageService } from '@ghostfolio/client/services/settings-storage.service'; import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service'; +import { UserService } from '@ghostfolio/client/services/user/user.service'; import { InfoItem, User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; +import { DateRange } from '@ghostfolio/common/types'; import { AssistantComponent } from '@ghostfolio/ui/assistant/assistant.component'; import { EMPTY, Subject } from 'rxjs'; import { catchError, takeUntil } from 'rxjs/operators'; @@ -88,7 +90,8 @@ export class HeaderComponent implements OnChanges { private impersonationStorageService: ImpersonationStorageService, private router: Router, private settingsStorageService: SettingsStorageService, - private tokenStorageService: TokenStorageService + private tokenStorageService: TokenStorageService, + private userService: UserService ) { this.impersonationStorageService .onChangeHasImpersonation() @@ -144,6 +147,20 @@ export class HeaderComponent implements OnChanges { window.location.reload(); } + public onDateRangeChange(dateRange: DateRange) { + this.dataService + .putUserSetting({ dateRange }) + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe(() => { + this.userService.remove(); + + this.userService + .get() + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe(); + }); + } + public onMenuClosed() { this.isMenuOpen = false; } 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 79828f6b7..d83f53f68 100644 --- a/apps/client/src/app/components/home-holdings/home-holdings.html +++ b/apps/client/src/app/components/home-holdings/home-holdings.html @@ -1,5 +1,5 @@
-
+
-
+

Analysis

-
+
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 269 + 281 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -546,7 +546,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 276 + 288 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -782,7 +782,7 @@ Benutzer apps/client/src/app/components/header/header.component.html - 192 + 198 @@ -826,7 +826,7 @@ apps/client/src/app/components/header/header.component.html - 206 + 212 @@ -838,7 +838,7 @@ apps/client/src/app/components/header/header.component.html - 216 + 222 @@ -858,7 +858,7 @@ apps/client/src/app/components/header/header.component.html - 224 + 230 apps/client/src/app/pages/accounts/accounts-page.html @@ -874,7 +874,7 @@ apps/client/src/app/components/header/header.component.html - 240 + 246 @@ -890,7 +890,7 @@ apps/client/src/app/components/header/header.component.html - 251 + 257 apps/client/src/app/pages/resources/resources-page.html @@ -910,11 +910,11 @@ apps/client/src/app/components/header/header.component.html - 263 + 269 apps/client/src/app/components/header/header.component.html - 332 + 338 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html @@ -1118,7 +1118,7 @@ apps/client/src/app/components/header/header.component.html - 319 + 325 @@ -1126,7 +1126,7 @@ Ich apps/client/src/app/components/header/header.component.html - 173 + 179 @@ -1134,7 +1134,7 @@ Mein Ghostfolio apps/client/src/app/components/header/header.component.html - 231 + 237 @@ -1142,7 +1142,7 @@ Über Ghostfolio apps/client/src/app/components/header/header.component.html - 271 + 277 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -1158,7 +1158,7 @@ apps/client/src/app/components/header/header.component.html - 306 + 312 apps/client/src/app/pages/features/features-page.html @@ -1174,7 +1174,7 @@ apps/client/src/app/components/header/header.component.html - 348 + 354 apps/client/src/app/components/home-market/home-market.html @@ -1202,7 +1202,7 @@ Einloggen apps/client/src/app/components/header/header.component.ts - 169 + 186 apps/client/src/app/pages/webauthn/webauthn-page-routing.module.ts @@ -1214,7 +1214,7 @@ Ups! Falsches Sicherheits-Token. apps/client/src/app/components/header/header.component.ts - 183 + 200 @@ -1310,7 +1310,7 @@ Einloggen apps/client/src/app/components/header/header.component.html - 361 + 367 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -2292,7 +2292,7 @@ Zeitstrahl der Investitionen apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 166 + 170 @@ -2308,7 +2308,7 @@ Verlierer apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 86 + 88 @@ -2488,7 +2488,7 @@ Kommentar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 256 + 268 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2824,7 +2824,7 @@ Registrieren apps/client/src/app/components/header/header.component.html - 373 + 379 @@ -3220,7 +3220,7 @@ Portfolio Wertentwicklung apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 136 + 140 @@ -3528,7 +3528,7 @@ Zeitstrahl der Dividenden apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 223 + 227 @@ -4404,7 +4404,7 @@ Aktueller Streak apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 187 + 191 @@ -4412,7 +4412,7 @@ Längster Streak apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 196 + 200 @@ -10264,11 +10264,11 @@ apps/client/src/app/components/header/header.component.ts - 72 + 74 apps/client/src/app/components/header/header.component.ts - 77 + 79 apps/client/src/app/pages/about/overview/about-overview-page.component.ts @@ -10524,11 +10524,11 @@ apps/client/src/app/components/header/header.component.ts - 71 + 73 apps/client/src/app/components/header/header.component.ts - 76 + 78 apps/client/src/app/pages/about/about-page.component.ts @@ -10812,11 +10812,11 @@ apps/client/src/app/components/header/header.component.ts - 73 + 75 apps/client/src/app/components/header/header.component.ts - 78 + 80 apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.component.ts @@ -10844,11 +10844,11 @@ apps/client/src/app/components/header/header.component.ts - 74 + 76 apps/client/src/app/components/header/header.component.ts - 79 + 81 apps/client/src/app/components/home-summary/home-summary.component.ts @@ -10916,7 +10916,7 @@ apps/client/src/app/components/header/header.component.ts - 80 + 82 apps/client/src/app/core/auth.guard.ts @@ -10952,11 +10952,11 @@ apps/client/src/app/components/header/header.component.ts - 75 + 77 apps/client/src/app/components/header/header.component.ts - 81 + 83 apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.component.ts @@ -13048,7 +13048,7 @@ Finde Position... libs/ui/src/lib/assistant/assistant.component.ts - 89 + 95 @@ -14207,6 +14207,30 @@ 53 + + The current market price is + Der aktuelle Marktpreis ist + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 297 + + + + Test + Test + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 261 + + + + Date Range + Zeitraum + + libs/ui/src/lib/assistant/assistant.html + 96 + + diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index 8485e8464..12d39c082 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -503,7 +503,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 269 + 281 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -547,7 +547,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 276 + 288 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -783,7 +783,7 @@ Usuario apps/client/src/app/components/header/header.component.html - 192 + 198 @@ -827,7 +827,7 @@ apps/client/src/app/components/header/header.component.html - 206 + 212 @@ -839,7 +839,7 @@ apps/client/src/app/components/header/header.component.html - 216 + 222 @@ -859,7 +859,7 @@ apps/client/src/app/components/header/header.component.html - 224 + 230 apps/client/src/app/pages/accounts/accounts-page.html @@ -875,7 +875,7 @@ apps/client/src/app/components/header/header.component.html - 240 + 246 @@ -891,7 +891,7 @@ apps/client/src/app/components/header/header.component.html - 251 + 257 apps/client/src/app/pages/resources/resources-page.html @@ -911,11 +911,11 @@ apps/client/src/app/components/header/header.component.html - 263 + 269 apps/client/src/app/components/header/header.component.html - 332 + 338 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html @@ -1119,7 +1119,7 @@ apps/client/src/app/components/header/header.component.html - 319 + 325 @@ -1127,7 +1127,7 @@ apps/client/src/app/components/header/header.component.html - 173 + 179 @@ -1135,7 +1135,7 @@ Mi Ghostfolio apps/client/src/app/components/header/header.component.html - 231 + 237 @@ -1143,7 +1143,7 @@ Sobre Ghostfolio apps/client/src/app/components/header/header.component.html - 271 + 277 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -1159,7 +1159,7 @@ apps/client/src/app/components/header/header.component.html - 306 + 312 apps/client/src/app/pages/features/features-page.html @@ -1175,7 +1175,7 @@ apps/client/src/app/components/header/header.component.html - 348 + 354 apps/client/src/app/components/home-market/home-market.html @@ -1203,7 +1203,7 @@ Iniciar sesión apps/client/src/app/components/header/header.component.ts - 169 + 186 apps/client/src/app/pages/webauthn/webauthn-page-routing.module.ts @@ -1215,7 +1215,7 @@ Vaya! Token de seguridad incorrecto. apps/client/src/app/components/header/header.component.ts - 183 + 200 @@ -1311,7 +1311,7 @@ Iniciar sesión apps/client/src/app/components/header/header.component.html - 361 + 367 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -2290,7 +2290,7 @@ Cronología de la inversión apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 166 + 170 @@ -2306,7 +2306,7 @@ Lo peor apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 86 + 88 @@ -2486,7 +2486,7 @@ Nota apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 256 + 268 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2822,7 +2822,7 @@ Comenzar apps/client/src/app/components/header/header.component.html - 373 + 379 @@ -3218,7 +3218,7 @@ Evolución cartera apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 136 + 140 @@ -3538,7 +3538,7 @@ Dividend Timeline apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 223 + 227 @@ -4402,7 +4402,7 @@ Current Streak apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 187 + 191 @@ -4410,7 +4410,7 @@ Longest Streak apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 196 + 200 @@ -10262,11 +10262,11 @@ apps/client/src/app/components/header/header.component.ts - 72 + 74 apps/client/src/app/components/header/header.component.ts - 77 + 79 apps/client/src/app/pages/about/overview/about-overview-page.component.ts @@ -10522,11 +10522,11 @@ apps/client/src/app/components/header/header.component.ts - 71 + 73 apps/client/src/app/components/header/header.component.ts - 76 + 78 apps/client/src/app/pages/about/about-page.component.ts @@ -10810,11 +10810,11 @@ apps/client/src/app/components/header/header.component.ts - 73 + 75 apps/client/src/app/components/header/header.component.ts - 78 + 80 apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.component.ts @@ -10842,11 +10842,11 @@ apps/client/src/app/components/header/header.component.ts - 74 + 76 apps/client/src/app/components/header/header.component.ts - 79 + 81 apps/client/src/app/components/home-summary/home-summary.component.ts @@ -10914,7 +10914,7 @@ apps/client/src/app/components/header/header.component.ts - 80 + 82 apps/client/src/app/core/auth.guard.ts @@ -10950,11 +10950,11 @@ apps/client/src/app/components/header/header.component.ts - 75 + 77 apps/client/src/app/components/header/header.component.ts - 81 + 83 apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.component.ts @@ -13046,7 +13046,7 @@ Find holding... libs/ui/src/lib/assistant/assistant.component.ts - 89 + 95 @@ -14205,6 +14205,30 @@ 53 + + The current market price is + The current market price is + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 297 + + + + Test + Test + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 261 + + + + Date Range + Date Range + + libs/ui/src/lib/assistant/assistant.html + 96 + + diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index f3f9d5dc7..5b7244ac7 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -562,7 +562,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 269 + 281 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -606,7 +606,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 276 + 288 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -850,7 +850,7 @@ Note apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 256 + 268 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1034,7 +1034,7 @@ Utilisateur apps/client/src/app/components/header/header.component.html - 192 + 198 @@ -1062,7 +1062,7 @@ apps/client/src/app/components/header/header.component.html - 224 + 230 apps/client/src/app/pages/accounts/accounts-page.html @@ -1146,7 +1146,7 @@ apps/client/src/app/components/header/header.component.html - 206 + 212 @@ -1158,7 +1158,7 @@ apps/client/src/app/components/header/header.component.html - 216 + 222 @@ -1170,7 +1170,7 @@ apps/client/src/app/components/header/header.component.html - 240 + 246 @@ -1186,7 +1186,7 @@ apps/client/src/app/components/header/header.component.html - 251 + 257 apps/client/src/app/pages/resources/resources-page.html @@ -1206,11 +1206,11 @@ apps/client/src/app/components/header/header.component.html - 263 + 269 apps/client/src/app/components/header/header.component.html - 332 + 338 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html @@ -1414,7 +1414,7 @@ apps/client/src/app/components/header/header.component.html - 319 + 325 @@ -1422,7 +1422,7 @@ Moi apps/client/src/app/components/header/header.component.html - 173 + 179 @@ -1430,7 +1430,7 @@ Mon Ghostfolio apps/client/src/app/components/header/header.component.html - 231 + 237 @@ -1438,7 +1438,7 @@ À propos de Ghostfolio apps/client/src/app/components/header/header.component.html - 271 + 277 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -1454,7 +1454,7 @@ apps/client/src/app/components/header/header.component.html - 306 + 312 apps/client/src/app/pages/features/features-page.html @@ -1470,7 +1470,7 @@ apps/client/src/app/components/header/header.component.html - 348 + 354 apps/client/src/app/components/home-market/home-market.html @@ -1486,7 +1486,7 @@ Se connecter apps/client/src/app/components/header/header.component.html - 361 + 367 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -1498,7 +1498,7 @@ Démarrer apps/client/src/app/components/header/header.component.html - 373 + 379 @@ -1506,7 +1506,7 @@ Se connecter apps/client/src/app/components/header/header.component.ts - 169 + 186 apps/client/src/app/pages/webauthn/webauthn-page-routing.module.ts @@ -1518,7 +1518,7 @@ Oups! Jeton de Sécurité Incorrect. apps/client/src/app/components/header/header.component.ts - 183 + 200 @@ -2981,7 +2981,7 @@ Bas apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 86 + 88 @@ -2989,7 +2989,7 @@ Évolution du Portefeuille apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 136 + 140 @@ -2997,7 +2997,7 @@ Historique des Investissements apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 166 + 170 @@ -3005,7 +3005,7 @@ Historique des Dividendes apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 223 + 227 @@ -4401,7 +4401,7 @@ Série en cours apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 187 + 191 @@ -4409,7 +4409,7 @@ Série la plus longue apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 196 + 200 @@ -10261,11 +10261,11 @@ apps/client/src/app/components/header/header.component.ts - 72 + 74 apps/client/src/app/components/header/header.component.ts - 77 + 79 apps/client/src/app/pages/about/overview/about-overview-page.component.ts @@ -10521,11 +10521,11 @@ apps/client/src/app/components/header/header.component.ts - 71 + 73 apps/client/src/app/components/header/header.component.ts - 76 + 78 apps/client/src/app/pages/about/about-page.component.ts @@ -10809,11 +10809,11 @@ apps/client/src/app/components/header/header.component.ts - 73 + 75 apps/client/src/app/components/header/header.component.ts - 78 + 80 apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.component.ts @@ -10841,11 +10841,11 @@ apps/client/src/app/components/header/header.component.ts - 74 + 76 apps/client/src/app/components/header/header.component.ts - 79 + 81 apps/client/src/app/components/home-summary/home-summary.component.ts @@ -10913,7 +10913,7 @@ apps/client/src/app/components/header/header.component.ts - 80 + 82 apps/client/src/app/core/auth.guard.ts @@ -10949,11 +10949,11 @@ apps/client/src/app/components/header/header.component.ts - 75 + 77 apps/client/src/app/components/header/header.component.ts - 81 + 83 apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.component.ts @@ -13045,7 +13045,7 @@ Find holding... libs/ui/src/lib/assistant/assistant.component.ts - 89 + 95 @@ -14204,6 +14204,30 @@ 53 + + The current market price is + The current market price is + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 297 + + + + Test + Test + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 261 + + + + Date Range + Date Range + + libs/ui/src/lib/assistant/assistant.html + 96 + + diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index 2696d9336..a72368a19 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -503,7 +503,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 269 + 281 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -547,7 +547,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 276 + 288 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -783,7 +783,7 @@ Utente apps/client/src/app/components/header/header.component.html - 192 + 198 @@ -827,7 +827,7 @@ apps/client/src/app/components/header/header.component.html - 206 + 212 @@ -839,7 +839,7 @@ apps/client/src/app/components/header/header.component.html - 216 + 222 @@ -859,7 +859,7 @@ apps/client/src/app/components/header/header.component.html - 224 + 230 apps/client/src/app/pages/accounts/accounts-page.html @@ -875,7 +875,7 @@ apps/client/src/app/components/header/header.component.html - 240 + 246 @@ -891,7 +891,7 @@ apps/client/src/app/components/header/header.component.html - 251 + 257 apps/client/src/app/pages/resources/resources-page.html @@ -911,11 +911,11 @@ apps/client/src/app/components/header/header.component.html - 263 + 269 apps/client/src/app/components/header/header.component.html - 332 + 338 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html @@ -1119,7 +1119,7 @@ apps/client/src/app/components/header/header.component.html - 319 + 325 @@ -1127,7 +1127,7 @@ Io apps/client/src/app/components/header/header.component.html - 173 + 179 @@ -1135,7 +1135,7 @@ Il mio Ghostfolio apps/client/src/app/components/header/header.component.html - 231 + 237 @@ -1143,7 +1143,7 @@ Informazioni su Ghostfolio apps/client/src/app/components/header/header.component.html - 271 + 277 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -1159,7 +1159,7 @@ apps/client/src/app/components/header/header.component.html - 306 + 312 apps/client/src/app/pages/features/features-page.html @@ -1175,7 +1175,7 @@ apps/client/src/app/components/header/header.component.html - 348 + 354 apps/client/src/app/components/home-market/home-market.html @@ -1203,7 +1203,7 @@ Accedi apps/client/src/app/components/header/header.component.ts - 169 + 186 apps/client/src/app/pages/webauthn/webauthn-page-routing.module.ts @@ -1215,7 +1215,7 @@ Ops! Token di sicurezza errato. apps/client/src/app/components/header/header.component.ts - 183 + 200 @@ -1311,7 +1311,7 @@ Accedi apps/client/src/app/components/header/header.component.html - 361 + 367 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -2290,7 +2290,7 @@ Cronologia degli investimenti apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 166 + 170 @@ -2306,7 +2306,7 @@ In basso apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 86 + 88 @@ -2486,7 +2486,7 @@ Nota apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 256 + 268 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2822,7 +2822,7 @@ Inizia apps/client/src/app/components/header/header.component.html - 373 + 379 @@ -3218,7 +3218,7 @@ Evoluzione del portafoglio apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 136 + 140 @@ -3538,7 +3538,7 @@ Cronologia dei dividendi apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 223 + 227 @@ -4402,7 +4402,7 @@ Serie attuale apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 187 + 191 @@ -4410,7 +4410,7 @@ Serie più lunga apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 196 + 200 @@ -10262,11 +10262,11 @@ apps/client/src/app/components/header/header.component.ts - 72 + 74 apps/client/src/app/components/header/header.component.ts - 77 + 79 apps/client/src/app/pages/about/overview/about-overview-page.component.ts @@ -10522,11 +10522,11 @@ apps/client/src/app/components/header/header.component.ts - 71 + 73 apps/client/src/app/components/header/header.component.ts - 76 + 78 apps/client/src/app/pages/about/about-page.component.ts @@ -10810,11 +10810,11 @@ apps/client/src/app/components/header/header.component.ts - 73 + 75 apps/client/src/app/components/header/header.component.ts - 78 + 80 apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.component.ts @@ -10842,11 +10842,11 @@ apps/client/src/app/components/header/header.component.ts - 74 + 76 apps/client/src/app/components/header/header.component.ts - 79 + 81 apps/client/src/app/components/home-summary/home-summary.component.ts @@ -10914,7 +10914,7 @@ apps/client/src/app/components/header/header.component.ts - 80 + 82 apps/client/src/app/core/auth.guard.ts @@ -10950,11 +10950,11 @@ apps/client/src/app/components/header/header.component.ts - 75 + 77 apps/client/src/app/components/header/header.component.ts - 81 + 83 apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.component.ts @@ -13046,7 +13046,7 @@ Find holding... libs/ui/src/lib/assistant/assistant.component.ts - 89 + 95 @@ -14205,6 +14205,30 @@ 53 + + The current market price is + The current market price is + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 297 + + + + Test + Test + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 261 + + + + Date Range + Date Range + + libs/ui/src/lib/assistant/assistant.html + 96 + + diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index e1b51deff..0ed7e09e0 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -502,7 +502,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 269 + 281 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -546,7 +546,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 276 + 288 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -782,7 +782,7 @@ Gebruiker apps/client/src/app/components/header/header.component.html - 192 + 198 @@ -826,7 +826,7 @@ apps/client/src/app/components/header/header.component.html - 206 + 212 @@ -838,7 +838,7 @@ apps/client/src/app/components/header/header.component.html - 216 + 222 @@ -858,7 +858,7 @@ apps/client/src/app/components/header/header.component.html - 224 + 230 apps/client/src/app/pages/accounts/accounts-page.html @@ -874,7 +874,7 @@ apps/client/src/app/components/header/header.component.html - 240 + 246 @@ -890,7 +890,7 @@ apps/client/src/app/components/header/header.component.html - 251 + 257 apps/client/src/app/pages/resources/resources-page.html @@ -910,11 +910,11 @@ apps/client/src/app/components/header/header.component.html - 263 + 269 apps/client/src/app/components/header/header.component.html - 332 + 338 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html @@ -1118,7 +1118,7 @@ apps/client/src/app/components/header/header.component.html - 319 + 325 @@ -1126,7 +1126,7 @@ Ik apps/client/src/app/components/header/header.component.html - 173 + 179 @@ -1134,7 +1134,7 @@ Mijn Ghostfolio apps/client/src/app/components/header/header.component.html - 231 + 237 @@ -1142,7 +1142,7 @@ Over Ghostfolio apps/client/src/app/components/header/header.component.html - 271 + 277 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -1158,7 +1158,7 @@ apps/client/src/app/components/header/header.component.html - 306 + 312 apps/client/src/app/pages/features/features-page.html @@ -1174,7 +1174,7 @@ apps/client/src/app/components/header/header.component.html - 348 + 354 apps/client/src/app/components/home-market/home-market.html @@ -1202,7 +1202,7 @@ Aanmelden apps/client/src/app/components/header/header.component.ts - 169 + 186 apps/client/src/app/pages/webauthn/webauthn-page-routing.module.ts @@ -1214,7 +1214,7 @@ Oeps! Onjuiste beveiligingstoken. apps/client/src/app/components/header/header.component.ts - 183 + 200 @@ -1310,7 +1310,7 @@ Aanmelden apps/client/src/app/components/header/header.component.html - 361 + 367 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -2289,7 +2289,7 @@ Tijdlijn investeringen apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 166 + 170 @@ -2305,7 +2305,7 @@ Verliezers apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 86 + 88 @@ -2485,7 +2485,7 @@ Opmerking apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 256 + 268 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2821,7 +2821,7 @@ Aan de slag apps/client/src/app/components/header/header.component.html - 373 + 379 @@ -3217,7 +3217,7 @@ Waardeontwikkeling van portefeuille apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 136 + 140 @@ -3537,7 +3537,7 @@ Tijdlijn dividend apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 223 + 227 @@ -4401,7 +4401,7 @@ Huidige reeks apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 187 + 191 @@ -4409,7 +4409,7 @@ Langste reeks apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 196 + 200 @@ -10261,11 +10261,11 @@ apps/client/src/app/components/header/header.component.ts - 72 + 74 apps/client/src/app/components/header/header.component.ts - 77 + 79 apps/client/src/app/pages/about/overview/about-overview-page.component.ts @@ -10521,11 +10521,11 @@ apps/client/src/app/components/header/header.component.ts - 71 + 73 apps/client/src/app/components/header/header.component.ts - 76 + 78 apps/client/src/app/pages/about/about-page.component.ts @@ -10809,11 +10809,11 @@ apps/client/src/app/components/header/header.component.ts - 73 + 75 apps/client/src/app/components/header/header.component.ts - 78 + 80 apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.component.ts @@ -10841,11 +10841,11 @@ apps/client/src/app/components/header/header.component.ts - 74 + 76 apps/client/src/app/components/header/header.component.ts - 79 + 81 apps/client/src/app/components/home-summary/home-summary.component.ts @@ -10913,7 +10913,7 @@ apps/client/src/app/components/header/header.component.ts - 80 + 82 apps/client/src/app/core/auth.guard.ts @@ -10949,11 +10949,11 @@ apps/client/src/app/components/header/header.component.ts - 75 + 77 apps/client/src/app/components/header/header.component.ts - 81 + 83 apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.component.ts @@ -13045,7 +13045,7 @@ Find holding... libs/ui/src/lib/assistant/assistant.component.ts - 89 + 95 @@ -14204,6 +14204,30 @@ 53 + + The current market price is + The current market price is + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 297 + + + + Test + Test + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 261 + + + + Date Range + Date Range + + libs/ui/src/lib/assistant/assistant.html + 96 + + diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index 7246fded1..d0fd17ce5 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -26,11 +26,11 @@ apps/client/src/app/components/header/header.component.ts - 71 + 73 apps/client/src/app/components/header/header.component.ts - 76 + 78 apps/client/src/app/pages/about/about-page.component.ts @@ -298,11 +298,11 @@ apps/client/src/app/components/header/header.component.ts - 72 + 74 apps/client/src/app/components/header/header.component.ts - 77 + 79 apps/client/src/app/pages/about/overview/about-overview-page.component.ts @@ -562,11 +562,11 @@ apps/client/src/app/components/header/header.component.ts - 73 + 75 apps/client/src/app/components/header/header.component.ts - 78 + 80 apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.component.ts @@ -594,11 +594,11 @@ apps/client/src/app/components/header/header.component.ts - 74 + 76 apps/client/src/app/components/header/header.component.ts - 79 + 81 apps/client/src/app/components/home-summary/home-summary.component.ts @@ -682,7 +682,7 @@ apps/client/src/app/components/header/header.component.ts - 80 + 82 apps/client/src/app/core/auth.guard.ts @@ -718,11 +718,11 @@ apps/client/src/app/components/header/header.component.ts - 75 + 77 apps/client/src/app/components/header/header.component.ts - 81 + 83 apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.component.ts @@ -982,7 +982,7 @@ apps/client/src/app/components/header/header.component.html - 348 + 354 apps/client/src/app/components/home-market/home-market.html @@ -1006,7 +1006,7 @@ apps/client/src/app/components/header/header.component.html - 251 + 257 apps/client/src/app/pages/resources/resources-page.html @@ -1026,7 +1026,7 @@ apps/client/src/app/components/header/header.component.html - 319 + 325 @@ -1138,7 +1138,7 @@ apps/client/src/app/components/header/header.component.html - 306 + 312 apps/client/src/app/pages/features/features-page.html @@ -1178,11 +1178,11 @@ apps/client/src/app/components/header/header.component.html - 263 + 269 apps/client/src/app/components/header/header.component.html - 332 + 338 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html @@ -2006,7 +2006,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 269 + 281 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -2050,7 +2050,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 276 + 288 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -2374,7 +2374,7 @@ Note apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 256 + 268 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2618,7 +2618,7 @@ apps/client/src/app/components/header/header.component.html - 224 + 230 apps/client/src/app/pages/accounts/accounts-page.html @@ -2830,7 +2830,7 @@ apps/client/src/app/components/header/header.component.html - 206 + 212 @@ -2842,7 +2842,7 @@ apps/client/src/app/components/header/header.component.html - 216 + 222 @@ -2854,7 +2854,7 @@ apps/client/src/app/components/header/header.component.html - 240 + 246 @@ -2862,7 +2862,7 @@ Me apps/client/src/app/components/header/header.component.html - 173 + 179 @@ -2870,7 +2870,7 @@ User apps/client/src/app/components/header/header.component.html - 192 + 198 @@ -2878,7 +2878,7 @@ My Ghostfolio apps/client/src/app/components/header/header.component.html - 231 + 237 @@ -2886,7 +2886,7 @@ About Ghostfolio apps/client/src/app/components/header/header.component.html - 271 + 277 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -2898,7 +2898,7 @@ Sign in apps/client/src/app/components/header/header.component.html - 361 + 367 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -2910,7 +2910,7 @@ Get started apps/client/src/app/components/header/header.component.html - 373 + 379 @@ -2918,7 +2918,7 @@ Sign in apps/client/src/app/components/header/header.component.ts - 169 + 186 apps/client/src/app/pages/webauthn/webauthn-page-routing.module.ts @@ -2930,7 +2930,7 @@ Oops! Incorrect Security Token. apps/client/src/app/components/header/header.component.ts - 183 + 200 @@ -5392,7 +5392,7 @@ Bottom apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 86 + 88 @@ -5400,7 +5400,7 @@ Portfolio Evolution apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 136 + 140 @@ -5408,7 +5408,7 @@ Investment Timeline apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 166 + 170 @@ -5416,7 +5416,7 @@ Current Streak apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 187 + 191 @@ -5424,7 +5424,7 @@ Longest Streak apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 196 + 200 @@ -5432,7 +5432,7 @@ Dividend Timeline apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 223 + 227 @@ -12828,7 +12828,7 @@ Find holding... libs/ui/src/lib/assistant/assistant.component.ts - 89 + 95 @@ -14207,6 +14207,30 @@ 53 + + The current market price is + The current market price is + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 297 + + + + Test + Test + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 261 + + + + Date Range + Date Range + + libs/ui/src/lib/assistant/assistant.html + 96 + + diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index 087db364a..7aa2906d0 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -562,7 +562,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 269 + 281 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -606,7 +606,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 276 + 288 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -914,7 +914,7 @@ Utilizador apps/client/src/app/components/header/header.component.html - 192 + 198 @@ -942,7 +942,7 @@ apps/client/src/app/components/header/header.component.html - 224 + 230 apps/client/src/app/pages/accounts/accounts-page.html @@ -1026,7 +1026,7 @@ apps/client/src/app/components/header/header.component.html - 206 + 212 @@ -1038,7 +1038,7 @@ apps/client/src/app/components/header/header.component.html - 216 + 222 @@ -1050,7 +1050,7 @@ apps/client/src/app/components/header/header.component.html - 240 + 246 @@ -1066,7 +1066,7 @@ apps/client/src/app/components/header/header.component.html - 251 + 257 apps/client/src/app/pages/resources/resources-page.html @@ -1086,11 +1086,11 @@ apps/client/src/app/components/header/header.component.html - 263 + 269 apps/client/src/app/components/header/header.component.html - 332 + 338 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html @@ -1294,7 +1294,7 @@ apps/client/src/app/components/header/header.component.html - 319 + 325 @@ -1302,7 +1302,7 @@ Eu apps/client/src/app/components/header/header.component.html - 173 + 179 @@ -1310,7 +1310,7 @@ O meu Ghostfolio apps/client/src/app/components/header/header.component.html - 231 + 237 @@ -1318,7 +1318,7 @@ Sobre o Ghostfolio apps/client/src/app/components/header/header.component.html - 271 + 277 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -1334,7 +1334,7 @@ apps/client/src/app/components/header/header.component.html - 306 + 312 apps/client/src/app/pages/features/features-page.html @@ -1350,7 +1350,7 @@ apps/client/src/app/components/header/header.component.html - 348 + 354 apps/client/src/app/components/home-market/home-market.html @@ -1366,7 +1366,7 @@ Iniciar sessão apps/client/src/app/components/header/header.component.html - 361 + 367 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -1378,7 +1378,7 @@ Começar apps/client/src/app/components/header/header.component.html - 373 + 379 @@ -1386,7 +1386,7 @@ Iniciar sessão apps/client/src/app/components/header/header.component.ts - 169 + 186 apps/client/src/app/pages/webauthn/webauthn-page-routing.module.ts @@ -1398,7 +1398,7 @@ Oops! Token de Segurança Incorreto. apps/client/src/app/components/header/header.component.ts - 183 + 200 @@ -2625,7 +2625,7 @@ Nota apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 256 + 268 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2861,7 +2861,7 @@ Fundo apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 86 + 88 @@ -2869,7 +2869,7 @@ Evolução do Portefólio apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 136 + 140 @@ -2877,7 +2877,7 @@ Cronograma de Investimento apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 166 + 170 @@ -3617,7 +3617,7 @@ Cronograma de Dividendos apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 223 + 227 @@ -4401,7 +4401,7 @@ Série Atual apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 187 + 191 @@ -4409,7 +4409,7 @@ Série mais Longa apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 196 + 200 @@ -10261,11 +10261,11 @@ apps/client/src/app/components/header/header.component.ts - 72 + 74 apps/client/src/app/components/header/header.component.ts - 77 + 79 apps/client/src/app/pages/about/overview/about-overview-page.component.ts @@ -10521,11 +10521,11 @@ apps/client/src/app/components/header/header.component.ts - 71 + 73 apps/client/src/app/components/header/header.component.ts - 76 + 78 apps/client/src/app/pages/about/about-page.component.ts @@ -10809,11 +10809,11 @@ apps/client/src/app/components/header/header.component.ts - 73 + 75 apps/client/src/app/components/header/header.component.ts - 78 + 80 apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.component.ts @@ -10841,11 +10841,11 @@ apps/client/src/app/components/header/header.component.ts - 74 + 76 apps/client/src/app/components/header/header.component.ts - 79 + 81 apps/client/src/app/components/home-summary/home-summary.component.ts @@ -10913,7 +10913,7 @@ apps/client/src/app/components/header/header.component.ts - 80 + 82 apps/client/src/app/core/auth.guard.ts @@ -10949,11 +10949,11 @@ apps/client/src/app/components/header/header.component.ts - 75 + 77 apps/client/src/app/components/header/header.component.ts - 81 + 83 apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.component.ts @@ -13045,7 +13045,7 @@ Find holding... libs/ui/src/lib/assistant/assistant.component.ts - 89 + 95 @@ -14204,6 +14204,30 @@ 53 + + The current market price is + The current market price is + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 297 + + + + Test + Test + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 261 + + + + Date Range + Date Range + + libs/ui/src/lib/assistant/assistant.html + 96 + + diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index 452005ea1..d189d49a2 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -26,11 +26,11 @@ apps/client/src/app/components/header/header.component.ts - 71 + 73 apps/client/src/app/components/header/header.component.ts - 76 + 78 apps/client/src/app/pages/about/about-page.component.ts @@ -298,11 +298,11 @@ apps/client/src/app/components/header/header.component.ts - 72 + 74 apps/client/src/app/components/header/header.component.ts - 77 + 79 apps/client/src/app/pages/about/overview/about-overview-page.component.ts @@ -562,11 +562,11 @@ apps/client/src/app/components/header/header.component.ts - 73 + 75 apps/client/src/app/components/header/header.component.ts - 78 + 80 apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.component.ts @@ -594,11 +594,11 @@ apps/client/src/app/components/header/header.component.ts - 74 + 76 apps/client/src/app/components/header/header.component.ts - 79 + 81 apps/client/src/app/components/home-summary/home-summary.component.ts @@ -682,7 +682,7 @@ apps/client/src/app/components/header/header.component.ts - 80 + 82 apps/client/src/app/core/auth.guard.ts @@ -718,11 +718,11 @@ apps/client/src/app/components/header/header.component.ts - 75 + 77 apps/client/src/app/components/header/header.component.ts - 81 + 83 apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.component.ts @@ -958,7 +958,7 @@ apps/client/src/app/components/header/header.component.html - 348 + 354 apps/client/src/app/components/home-market/home-market.html @@ -982,7 +982,7 @@ apps/client/src/app/components/header/header.component.html - 251 + 257 apps/client/src/app/pages/resources/resources-page.html @@ -1002,7 +1002,7 @@ apps/client/src/app/components/header/header.component.html - 319 + 325 @@ -1114,7 +1114,7 @@ apps/client/src/app/components/header/header.component.html - 306 + 312 apps/client/src/app/pages/features/features-page.html @@ -1154,11 +1154,11 @@ apps/client/src/app/components/header/header.component.html - 263 + 269 apps/client/src/app/components/header/header.component.html - 332 + 338 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html @@ -1970,7 +1970,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 269 + 281 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -2014,7 +2014,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 276 + 288 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -2298,7 +2298,7 @@ Not apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 256 + 268 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2526,7 +2526,7 @@ apps/client/src/app/components/header/header.component.html - 224 + 230 apps/client/src/app/pages/accounts/accounts-page.html @@ -2578,7 +2578,7 @@ Kullanıcı apps/client/src/app/components/header/header.component.html - 192 + 198 @@ -2690,7 +2690,7 @@ apps/client/src/app/components/header/header.component.html - 206 + 212 @@ -2702,7 +2702,7 @@ apps/client/src/app/components/header/header.component.html - 216 + 222 @@ -2714,7 +2714,7 @@ apps/client/src/app/components/header/header.component.html - 240 + 246 @@ -2722,7 +2722,7 @@ Ben apps/client/src/app/components/header/header.component.html - 173 + 179 @@ -2730,7 +2730,7 @@ Ghostfolio'm apps/client/src/app/components/header/header.component.html - 231 + 237 @@ -2738,7 +2738,7 @@ Ghostfolio Hakkında apps/client/src/app/components/header/header.component.html - 271 + 277 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -2750,7 +2750,7 @@ Giriş apps/client/src/app/components/header/header.component.html - 361 + 367 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -2762,7 +2762,7 @@ Haydi Başlayalım apps/client/src/app/components/header/header.component.html - 373 + 379 @@ -2770,7 +2770,7 @@ Giriş apps/client/src/app/components/header/header.component.ts - 169 + 186 apps/client/src/app/pages/webauthn/webauthn-page-routing.module.ts @@ -2782,7 +2782,7 @@ Hay Allah! Güvenlik anahtarı yanlış. apps/client/src/app/components/header/header.component.ts - 183 + 200 @@ -4857,7 +4857,7 @@ Alt apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 86 + 88 @@ -4865,7 +4865,7 @@ Portföyün Gelişimi apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 136 + 140 @@ -4873,7 +4873,7 @@ Yatırım Zaman Çizelgesi apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 166 + 170 @@ -4881,7 +4881,7 @@ Güncel Seri apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 187 + 191 @@ -4889,7 +4889,7 @@ En Uzun Seri apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 196 + 200 @@ -4897,7 +4897,7 @@ Temettü Zaman Çizelgesi apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 223 + 227 @@ -13045,7 +13045,7 @@ Find holding... libs/ui/src/lib/assistant/assistant.component.ts - 89 + 95 @@ -14204,6 +14204,30 @@ 53 + + The current market price is + The current market price is + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 297 + + + + Test + Test + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 261 + + + + Date Range + Date Range + + libs/ui/src/lib/assistant/assistant.html + 96 + + diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index 9172b7fb6..f90f577e0 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -26,11 +26,11 @@ apps/client/src/app/components/header/header.component.ts - 71 + 73 apps/client/src/app/components/header/header.component.ts - 76 + 78 apps/client/src/app/pages/about/about-page.component.ts @@ -296,11 +296,11 @@ apps/client/src/app/components/header/header.component.ts - 72 + 74 apps/client/src/app/components/header/header.component.ts - 77 + 79 apps/client/src/app/pages/about/overview/about-overview-page.component.ts @@ -558,11 +558,11 @@ apps/client/src/app/components/header/header.component.ts - 73 + 75 apps/client/src/app/components/header/header.component.ts - 78 + 80 apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.component.ts @@ -589,11 +589,11 @@ apps/client/src/app/components/header/header.component.ts - 74 + 76 apps/client/src/app/components/header/header.component.ts - 79 + 81 apps/client/src/app/components/home-summary/home-summary.component.ts @@ -675,7 +675,7 @@ apps/client/src/app/components/header/header.component.ts - 80 + 82 apps/client/src/app/core/auth.guard.ts @@ -710,11 +710,11 @@ apps/client/src/app/components/header/header.component.ts - 75 + 77 apps/client/src/app/components/header/header.component.ts - 81 + 83 apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.component.ts @@ -970,7 +970,7 @@ apps/client/src/app/components/header/header.component.html - 348 + 354 apps/client/src/app/components/home-market/home-market.html @@ -993,7 +993,7 @@ apps/client/src/app/components/header/header.component.html - 251 + 257 apps/client/src/app/pages/resources/resources-page.html @@ -1012,7 +1012,7 @@ apps/client/src/app/components/header/header.component.html - 319 + 325 @@ -1121,7 +1121,7 @@ apps/client/src/app/components/header/header.component.html - 306 + 312 apps/client/src/app/pages/features/features-page.html @@ -1158,11 +1158,11 @@ apps/client/src/app/components/header/header.component.html - 263 + 269 apps/client/src/app/components/header/header.component.html - 332 + 338 apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html @@ -1956,7 +1956,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 269 + 281 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -1999,7 +1999,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 276 + 288 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -2296,7 +2296,7 @@ Note apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 256 + 268 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2520,7 +2520,7 @@ apps/client/src/app/components/header/header.component.html - 224 + 230 apps/client/src/app/pages/accounts/accounts-page.html @@ -2709,7 +2709,7 @@ apps/client/src/app/components/header/header.component.html - 206 + 212 @@ -2720,7 +2720,7 @@ apps/client/src/app/components/header/header.component.html - 216 + 222 @@ -2731,35 +2731,35 @@ apps/client/src/app/components/header/header.component.html - 240 + 246 Me apps/client/src/app/components/header/header.component.html - 173 + 179 User apps/client/src/app/components/header/header.component.html - 192 + 198 My Ghostfolio apps/client/src/app/components/header/header.component.html - 231 + 237 About Ghostfolio apps/client/src/app/components/header/header.component.html - 271 + 277 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -2770,7 +2770,7 @@ Sign in apps/client/src/app/components/header/header.component.html - 361 + 367 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -2781,14 +2781,14 @@ Get started apps/client/src/app/components/header/header.component.html - 373 + 379 Sign in apps/client/src/app/components/header/header.component.ts - 169 + 186 apps/client/src/app/pages/webauthn/webauthn-page-routing.module.ts @@ -2799,7 +2799,7 @@ Oops! Incorrect Security Token. apps/client/src/app/components/header/header.component.ts - 183 + 200 @@ -4998,42 +4998,42 @@ Bottom apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 86 + 88 Portfolio Evolution apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 136 + 140 Investment Timeline apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 166 + 170 Current Streak apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 187 + 191 Longest Streak apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 196 + 200 Dividend Timeline apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 223 + 227 @@ -13091,7 +13091,7 @@ Find holding... libs/ui/src/lib/assistant/assistant.component.ts - 89 + 95 @@ -13614,6 +13614,27 @@ 53 + + Date Range + + libs/ui/src/lib/assistant/assistant.html + 96 + + + + The current market price is + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 297 + + + + Test + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 261 + + diff --git a/libs/ui/src/lib/assistant/assistant.component.ts b/libs/ui/src/lib/assistant/assistant.component.ts index 2cfd9eff2..4cb67dcf5 100644 --- a/libs/ui/src/lib/assistant/assistant.component.ts +++ b/libs/ui/src/lib/assistant/assistant.component.ts @@ -16,8 +16,11 @@ import { } from '@angular/core'; import { FormControl } from '@angular/forms'; import { MatMenuTrigger } from '@angular/material/menu'; +import { ToggleComponent } from '@ghostfolio/client/components/toggle/toggle.component'; import { AdminService } from '@ghostfolio/client/services/admin.service'; import { DataService } from '@ghostfolio/client/services/data.service'; +import { User } from '@ghostfolio/common/interfaces'; +import { DateRange } from '@ghostfolio/common/types'; import { translate } from '@ghostfolio/ui/i18n'; import { EMPTY, Observable, Subject, lastValueFrom } from 'rxjs'; import { @@ -73,8 +76,10 @@ export class AssistantComponent implements OnDestroy, OnInit { @Input() deviceType: string; @Input() hasPermissionToAccessAdminControl: boolean; + @Input() user: User; @Output() closed = new EventEmitter(); + @Output() dateRangeChanged = new EventEmitter(); @ViewChild('menuTrigger') menuTriggerElement: MatMenuTrigger; @ViewChild('search', { static: true }) searchElement: ElementRef; @@ -84,6 +89,7 @@ export class AssistantComponent implements OnDestroy, OnInit { public static readonly SEARCH_RESULTS_DEFAULT_LIMIT = 5; + public dateRangeOptions = ToggleComponent.DEFAULT_DATE_RANGE_OPTIONS; public isLoading = false; public isOpen = false; public placeholder = $localize`Find holding...`; @@ -165,6 +171,10 @@ export class AssistantComponent implements OnDestroy, OnInit { this.changeDetectorRef.markForCheck(); } + public onChangeDateRange(dateRangeString: string) { + this.dateRangeChanged.emit(dateRangeString as DateRange); + } + public onCloseAssistant() { this.setIsOpen(false); diff --git a/libs/ui/src/lib/assistant/assistant.html b/libs/ui/src/lib/assistant/assistant.html index 0644c945e..4f16d5d2d 100644 --- a/libs/ui/src/lib/assistant/assistant.html +++ b/libs/ui/src/lib/assistant/assistant.html @@ -86,3 +86,23 @@
+
+ + + Date Range +
+ +
+
+
+
diff --git a/libs/ui/src/lib/assistant/assistant.module.ts b/libs/ui/src/lib/assistant/assistant.module.ts index e4f48e8f3..abeb3aa75 100644 --- a/libs/ui/src/lib/assistant/assistant.module.ts +++ b/libs/ui/src/lib/assistant/assistant.module.ts @@ -2,7 +2,9 @@ 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 { MatTabsModule } from '@angular/material/tabs'; import { RouterModule } from '@angular/router'; +import { GfToggleModule } from '@ghostfolio/client/components/toggle/toggle.module'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { GfAssistantListItemModule } from './assistant-list-item/assistant-list-item.module'; @@ -15,7 +17,9 @@ import { AssistantComponent } from './assistant.component'; CommonModule, FormsModule, GfAssistantListItemModule, + GfToggleModule, MatButtonModule, + MatTabsModule, NgxSkeletonLoaderModule, ReactiveFormsModule, RouterModule From 3723a1d8b89fcdc6345610ec4396f79e63bf3cd4 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Tue, 2 Jan 2024 17:05:12 +0100 Subject: [PATCH 33/38] Release 2.34.0 (#2817) --- CHANGELOG.md | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 02b050482..05ab8d208 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 2.34.0 - 2024-01-02 ### Added diff --git a/package.json b/package.json index 3d1d235f8..8b761b2ac 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "2.33.0", + "version": "2.34.0", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "repository": "https://github.com/ghostfolio/ghostfolio", From 1552d51cbc8a3d7e0feb93d1e2daba71ec97bb87 Mon Sep 17 00:00:00 2001 From: Daniel Devaud Date: Wed, 3 Jan 2024 17:24:48 +0100 Subject: [PATCH 34/38] Fix errors --- apps/api/src/app/admin/admin.controller.ts | 12 ------------ apps/api/src/app/portfolio/portfolio.service.ts | 2 +- 2 files changed, 1 insertion(+), 13 deletions(-) diff --git a/apps/api/src/app/admin/admin.controller.ts b/apps/api/src/app/admin/admin.controller.ts index 8729d4b7f..34a11bce0 100644 --- a/apps/api/src/app/admin/admin.controller.ts +++ b/apps/api/src/app/admin/admin.controller.ts @@ -324,18 +324,6 @@ export class AdminController { @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 - ); - } - if (dataSource === 'MANUAL') { await this.adminService.patchAssetProfileData({ dataSource, diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index 0cb379b25..14d4d8b63 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -1157,7 +1157,7 @@ export class PortfolioService { dataProviderResponses[symbol]?.marketState ?? 'delayed', name: symbolProfileMap[symbol].name, netPerformance: netPerformance?.toNumber() ?? null, - tags: symbolProfileMap[position.symbol].tags, + tags: symbolProfileMap[symbol].tags, netPerformancePercentage: netPerformancePercentage?.toNumber() ?? null, quantity: quantity.toNumber() From 95f0e3aa4b3b409a708cd27275aced1235f7c287 Mon Sep 17 00:00:00 2001 From: Daniel Devaud Date: Wed, 3 Jan 2024 17:34:04 +0100 Subject: [PATCH 35/38] Fix Frontend --- .../asset-profile-dialog/asset-profile-dialog.component.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) 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 bc318d15a..97faf7051 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 @@ -285,12 +285,9 @@ export class AssetProfileDialog implements OnDestroy, OnInit { comment: this.assetProfileForm.controls['comment'].value ?? null, name: this.assetProfileForm.controls['name'].value, tags: this.assetProfileForm.controls['tags'].value, - scraperConfiguration, - symbolMapping currency: (( (this.assetProfileForm.controls['currency'].value) - ))?.value, - name: this.assetProfileForm.controls['name'].value + ))?.value }; this.adminService From 942ba13ff15521c174d406dbaca9e2ab71ba45b0 Mon Sep 17 00:00:00 2001 From: Daniel Devaud Date: Wed, 3 Jan 2024 17:40:16 +0100 Subject: [PATCH 36/38] Updated Lock file --- yarn.lock | 127 ++++++++++++++++++++---------------------------------- 1 file changed, 47 insertions(+), 80 deletions(-) diff --git a/yarn.lock b/yarn.lock index 6caa1b82e..efa168308 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3746,9 +3746,8 @@ "@nx/webpack" "17.2.8" "@nx/workspace" "17.2.8" "@phenomnomnominal/tsquery" "~5.0.1" - "@typescript-eslint/type-utils" "^5.36.1" + "@typescript-eslint/type-utils" "^6.9.1" chalk "^4.1.0" - enquirer "^2.3.6" find-cache-dir "^3.3.2" ignore "^5.0.4" magic-string "~0.30.2" @@ -3810,7 +3809,7 @@ "@nx/js" "17.2.8" "@nx/linter" "17.2.8" tslib "^2.3.0" - typescript "~5.1.3" + typescript "~5.2.2" "@nx/jest@17.2.8": version "17.2.8" @@ -3838,6 +3837,7 @@ dependencies: "@babel/core" "^7.22.9" "@babel/plugin-proposal-decorators" "^7.22.7" + "@babel/plugin-transform-class-properties" "^7.22.5" "@babel/plugin-transform-runtime" "^7.22.9" "@babel/preset-env" "^7.22.9" "@babel/preset-typescript" "^7.22.5" @@ -6313,16 +6313,8 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.11.0.tgz#621f603537c89f4d105733d949aa4d55eee5cea8" integrity sha512-0A8KoVvIURG4uhxAdjSaxy8RdRE//HztaZdG8KiHLP8WOXSk0vlF7Pvogv+vlJA5Rnjj/wDcFENvDaHb+gKd1A== dependencies: - "@typescript-eslint/types" "6.13.1" - "@typescript-eslint/visitor-keys" "6.13.1" - -"@typescript-eslint/scope-manager@6.14.0": - version "6.14.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.14.0.tgz#53d24363fdb5ee0d1d8cda4ed5e5321272ab3d48" - integrity sha512-VT7CFWHbZipPncAZtuALr9y3EuzY1b1t1AEkIq2bTXUPKw+pHoXflGNG5L+Gv6nKul1cz1VH8fz16IThIU0tdg== - dependencies: - "@typescript-eslint/types" "6.14.0" - "@typescript-eslint/visitor-keys" "6.14.0" + "@typescript-eslint/types" "6.11.0" + "@typescript-eslint/visitor-keys" "6.11.0" "@typescript-eslint/scope-manager@6.15.0": version "6.15.0" @@ -6352,15 +6344,25 @@ debug "^4.3.4" ts-api-utils "^1.0.1" +"@typescript-eslint/type-utils@^5.36.1": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" + integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew== + dependencies: + "@typescript-eslint/typescript-estree" "5.62.0" + "@typescript-eslint/utils" "5.62.0" + debug "^4.3.4" + tsutils "^3.21.0" + "@typescript-eslint/type-utils@^6.9.1": version "6.14.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.14.0.tgz#ac9cb5ba0615c837f1a6b172feeb273d36e4f8af" integrity sha512-x6OC9Q7HfYKqjnuNu5a7kffIYs3No30isapRBJl1iCHLitD8O0lFbRcVGiOcuyN837fqXzPZ1NS10maQzZMKqw== dependencies: - "@typescript-eslint/typescript-estree" "5.62.0" - "@typescript-eslint/utils" "5.62.0" + "@typescript-eslint/typescript-estree" "6.14.0" + "@typescript-eslint/utils" "6.14.0" debug "^4.3.4" - tsutils "^3.21.0" + ts-api-utils "^1.0.1" "@typescript-eslint/types@5.51.0": version "5.51.0" @@ -6372,16 +6374,16 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== +"@typescript-eslint/types@6.11.0": + version "6.11.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.11.0.tgz#8ad3aa000cbf4bdc4dcceed96e9b577f15e0bf53" + integrity sha512-ZbEzuD4DwEJxwPqhv3QULlRj8KYTAnNsXxmfuUXFCxZmO6CF2gM/y+ugBSAQhrqaJL3M+oe4owdWunaHM6beqA== + "@typescript-eslint/types@6.13.1": version "6.13.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.13.1.tgz#b56f26130e7eb8fa1e429c75fb969cae6ad7bb5c" integrity sha512-gjeEskSmiEKKFIbnhDXUyiqVma1gRCQNbVZ1C8q7Zjcxh3WZMbzWVfGE9rHfWd1msQtPS0BVD9Jz9jded44eKg== -"@typescript-eslint/types@6.14.0": - version "6.14.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.14.0.tgz#935307f7a931016b7a5eb25d494ea3e1f613e929" - integrity sha512-uty9H2K4Xs8E47z3SnXEPRNDfsis8JO27amp2GNCnzGETEW3yTqEIVg5+AI7U276oGF/tw6ZA+UesxeQ104ceA== - "@typescript-eslint/types@6.15.0": version "6.15.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.15.0.tgz#a9f7b006aee52b0948be6e03f521814bf435ddd5" @@ -6418,21 +6420,8 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.11.0.tgz#7b52c12a623bf7f8ec7f8a79901b9f98eb5c7990" integrity sha512-Aezzv1o2tWJwvZhedzvD5Yv7+Lpu1by/U1LZ5gLc4tCx8jUmuSCMioPFRjliN/6SJIvY6HpTtJIWubKuYYYesQ== dependencies: - "@typescript-eslint/types" "6.13.1" - "@typescript-eslint/visitor-keys" "6.13.1" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - semver "^7.5.4" - ts-api-utils "^1.0.1" - -"@typescript-eslint/typescript-estree@6.14.0": - version "6.14.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.14.0.tgz#90c7ddd45cd22139adf3d4577580d04c9189ac13" - integrity sha512-yPkaLwK0yH2mZKFE/bXkPAkkFgOv15GJAUzgUVonAbv0Hr4PK/N2yaA/4XQbTZQdygiDkpt5DkxPELqHguNvyw== - dependencies: - "@typescript-eslint/types" "6.14.0" - "@typescript-eslint/visitor-keys" "6.14.0" + "@typescript-eslint/types" "6.11.0" + "@typescript-eslint/visitor-keys" "6.11.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" @@ -6466,33 +6455,7 @@ eslint-utils "^3.0.0" semver "^7.3.7" -"@typescript-eslint/utils@6.13.1": - version "6.13.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.13.1.tgz#925b3a2453a71ada914ae329b7bb7e7d96634b2f" - integrity sha512-ouPn/zVoan92JgAegesTXDB/oUp6BP1v8WpfYcqh649ejNc9Qv+B4FF2Ff626kO1xg0wWwwG48lAJ4JuesgdOw== - dependencies: - "@eslint-community/eslint-utils" "^4.4.0" - "@types/json-schema" "^7.0.12" - "@types/semver" "^7.5.0" - "@typescript-eslint/scope-manager" "6.13.1" - "@typescript-eslint/types" "6.13.1" - "@typescript-eslint/typescript-estree" "6.13.1" - semver "^7.5.4" - -"@typescript-eslint/utils@6.14.0": - version "6.14.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.14.0.tgz#856a9e274367d99ffbd39c48128b93a86c4261e3" - integrity sha512-XwRTnbvRr7Ey9a1NT6jqdKX8y/atWG+8fAIu3z73HSP8h06i3r/ClMhmaF/RGWGW1tHJEwij1uEg2GbEmPYvYg== - dependencies: - "@eslint-community/eslint-utils" "^4.4.0" - "@types/json-schema" "^7.0.12" - "@types/semver" "^7.5.0" - "@typescript-eslint/scope-manager" "6.14.0" - "@typescript-eslint/types" "6.14.0" - "@typescript-eslint/typescript-estree" "6.14.0" - semver "^7.5.4" - -"@typescript-eslint/utils@^5.45.0": +"@typescript-eslint/utils@5.62.0", "@typescript-eslint/utils@^5.45.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== @@ -6506,6 +6469,19 @@ eslint-scope "^5.1.1" semver "^7.3.7" +"@typescript-eslint/utils@6.11.0": + version "6.11.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.11.0.tgz#11374f59ef4cea50857b1303477c08aafa2ca604" + integrity sha512-p23ibf68fxoZy605dc0dQAEoUsoiNoP3MD9WQGiHLDuTSOuqoTsa4oAy+h3KDkTcxbbfOtUjb9h3Ta0gT4ug2g== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@types/json-schema" "^7.0.12" + "@types/semver" "^7.5.0" + "@typescript-eslint/scope-manager" "6.11.0" + "@typescript-eslint/types" "6.11.0" + "@typescript-eslint/typescript-estree" "6.11.0" + semver "^7.5.4" + "@typescript-eslint/utils@^6.9.1": version "6.15.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.15.0.tgz#f80dbb79f3b0f569077a8711dd44186a8933fa4c" @@ -6535,22 +6511,14 @@ "@typescript-eslint/types" "5.62.0" eslint-visitor-keys "^3.3.0" -"@typescript-eslint/visitor-keys@6.11.0": - version "6.11.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.11.0.tgz#d991538788923f92ec40d44389e7075b359f3458" - integrity sha512-+SUN/W7WjBr05uRxPggJPSzyB8zUpaYo2hByKasWbqr3PM8AXfZt8UHdNpBS1v9SA62qnSSMF3380SwDqqprgQ== +"@typescript-eslint/visitor-keys@6.13.1": + version "6.13.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.13.1.tgz#c4b692dcc23a4fc60685b718f10fde789d65a540" + integrity sha512-NDhQUy2tg6XGNBGDRm1XybOHSia8mcXmlbKWoQP+nm1BIIMxa55shyJfZkHpEBN62KNPLrocSM2PdPcaLgDKMQ== dependencies: "@typescript-eslint/types" "6.13.1" eslint-visitor-keys "^3.4.1" -"@typescript-eslint/visitor-keys@6.14.0": - version "6.14.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.14.0.tgz#1d1d486581819287de824a56c22f32543561138e" - integrity sha512-fB5cw6GRhJUz03MrROVuj5Zm/Q+XWlVdIsFj+Zb1Hvqouc8t+XP2H5y53QYU/MGtd2dPg6/vJJlhoX3xc2ehfw== - dependencies: - "@typescript-eslint/types" "6.14.0" - eslint-visitor-keys "^3.4.1" - "@typescript-eslint/visitor-keys@6.15.0": version "6.15.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.15.0.tgz#5baf97a7bfeec6f4894d400437055155a46b2330" @@ -13146,10 +13114,10 @@ jest-pnp-resolver@^1.2.2: resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== -jest-preset-angular@13.1.3: - version "13.1.3" - resolved "https://registry.yarnpkg.com/jest-preset-angular/-/jest-preset-angular-13.1.3.tgz#51760a2a44f96e15b7be4e4b3e82813e67186194" - integrity sha512-8b+RIakmmZcGwUtW+3gy42HUjzjOWaTudoEx1JJIEDscqDPYrpH0zY0MhjjAbuEDzxOMAv6uAS91I4AO3c12OQ== +jest-preset-angular@13.1.4: + version "13.1.4" + resolved "https://registry.yarnpkg.com/jest-preset-angular/-/jest-preset-angular-13.1.4.tgz#9013c96f2413e197e96890733c4bcdb11b583db4" + integrity sha512-XKeWa8Qt7p37SzlJ85qEXgig06SgkfrzV057X2GSMqfz/HLJmTUjMFkHJKe65ZaQumNQWCcXpxXREr6EfZ9bow== dependencies: bs-logger "^0.2.6" esbuild-wasm ">=0.13.8" @@ -15183,7 +15151,6 @@ nx@17.2.8: tmp "~0.2.1" tsconfig-paths "^4.1.2" tslib "^2.3.0" - v8-compile-cache "2.3.0" yargs "^17.6.2" yargs-parser "21.1.1" optionalDependencies: From 8a53d42a5bd318659c652307888a864a1d08ac5c Mon Sep 17 00:00:00 2001 From: Daniel Devaud Date: Wed, 3 Jan 2024 18:36:53 +0100 Subject: [PATCH 37/38] Test fixes --- .../portfolio-calculator-baln-buy-and-sell.spec.ts | 2 +- .../portfolio/portfolio-calculator-baln-buy.spec.ts | 2 +- ...io-calculator-btcusd-buy-and-sell-partially.spec.ts | 10 +++++----- ...olio-calculator-novn-buy-and-sell-partially.spec.ts | 10 +++++----- .../portfolio-calculator-novn-buy-and-sell.spec.ts | 2 +- 5 files changed, 13 insertions(+), 13 deletions(-) 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 f4fec026a..0bf8da70b 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 @@ -92,7 +92,7 @@ describe('PortfolioCalculator', () => { marketPrice: 148.9, quantity: new Big('0'), symbol: 'BALN.SW', - timeWeightedInvestment: new Big('285.8'), + tags: undefined, transactionCount: 2 } ], 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 e2560cfbb..62cc01b2a 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 @@ -81,7 +81,7 @@ describe('PortfolioCalculator', () => { marketPrice: 148.9, quantity: new Big('2'), symbol: 'BALN.SW', - timeWeightedInvestment: new Big('273.2'), + tags: undefined, transactionCount: 1 } ], 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 4f1bc8cdc..cf0b7bfb9 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 @@ -73,10 +73,10 @@ describe('PortfolioCalculator', () => { currentValue: new Big('13657.2'), errors: [], grossPerformance: new Big('27172.74'), - grossPerformancePercentage: new Big('42.41978276196153750666'), + grossPerformancePercentage: new Big('42.40043067128546016291'), hasErrors: false, netPerformance: new Big('27172.74'), - netPerformancePercentage: new Big('42.41978276196153750666'), + netPerformancePercentage: new Big('42.40043067128546016291'), positions: [ { averagePrice: new Big('320.43'), @@ -85,14 +85,14 @@ describe('PortfolioCalculator', () => { fee: new Big('0'), firstBuyDate: '2015-01-01', grossPerformance: new Big('27172.74'), - grossPerformancePercentage: new Big('42.41978276196153750666'), + grossPerformancePercentage: new Big('42.40043067128546016291'), investment: new Big('320.43'), netPerformance: new Big('27172.74'), - netPerformancePercentage: new Big('42.41978276196153750666'), + netPerformancePercentage: new Big('42.40043067128546016291'), marketPrice: 13657.2, quantity: new Big('1'), symbol: 'BTCUSD', - timeWeightedInvestment: new Big('640.56763686131386861314'), + tags: undefined, transactionCount: 2 } ], 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 2c8bff238..2d42d8528 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 @@ -73,10 +73,10 @@ describe('PortfolioCalculator', () => { currentValue: new Big('87.8'), errors: [], grossPerformance: new Big('21.93'), - grossPerformancePercentage: new Big('0.15113417083448194384'), + grossPerformancePercentage: new Big('0.14465699208443271768'), hasErrors: false, netPerformance: new Big('17.68'), - netPerformancePercentage: new Big('0.12184460284330327256'), + netPerformancePercentage: new Big('0.11662269129287598945'), positions: [ { averagePrice: new Big('75.80'), @@ -85,14 +85,14 @@ describe('PortfolioCalculator', () => { fee: new Big('4.25'), firstBuyDate: '2022-03-07', grossPerformance: new Big('21.93'), - grossPerformancePercentage: new Big('0.15113417083448194384'), + grossPerformancePercentage: new Big('0.14465699208443271768'), investment: new Big('75.80'), netPerformance: new Big('17.68'), - netPerformancePercentage: new Big('0.12184460284330327256'), + netPerformancePercentage: new Big('0.11662269129287598945'), marketPrice: 87.8, quantity: new Big('1'), symbol: 'NOVN.SW', - timeWeightedInvestment: new Big('145.10285714285714285714'), + tags: undefined, transactionCount: 2 } ], diff --git a/apps/api/src/app/portfolio/portfolio-calculator-novn-buy-and-sell.spec.ts b/apps/api/src/app/portfolio/portfolio-calculator-novn-buy-and-sell.spec.ts index 9838848a8..d0f009264 100644 --- a/apps/api/src/app/portfolio/portfolio-calculator-novn-buy-and-sell.spec.ts +++ b/apps/api/src/app/portfolio/portfolio-calculator-novn-buy-and-sell.spec.ts @@ -114,7 +114,7 @@ describe('PortfolioCalculator', () => { marketPrice: 87.8, quantity: new Big('0'), symbol: 'NOVN.SW', - timeWeightedInvestment: new Big('151.6'), + tags: undefined, transactionCount: 2 } ], From 6ab9b1c435c8e59fa2446cec896a9888ab70fa8f Mon Sep 17 00:00:00 2001 From: Daniel Devaud Date: Wed, 3 Jan 2024 18:45:54 +0100 Subject: [PATCH 38/38] Readd modernized NX Executors --- apps/api/project.json | 3 ++- apps/api/webpack.config.js | 6 ++++++ 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 apps/api/webpack.config.js diff --git a/apps/api/project.json b/apps/api/project.json index 397a753ec..f3c8bd1e0 100644 --- a/apps/api/project.json +++ b/apps/api/project.json @@ -14,7 +14,8 @@ "tsConfig": "apps/api/tsconfig.app.json", "assets": ["apps/api/src/assets"], "target": "node", - "compiler": "tsc" + "compiler": "tsc", + "webpackConfig": "apps/api/webpack.config.js" }, "configurations": { "production": { diff --git a/apps/api/webpack.config.js b/apps/api/webpack.config.js new file mode 100644 index 000000000..2cc38b985 --- /dev/null +++ b/apps/api/webpack.config.js @@ -0,0 +1,6 @@ +const { composePlugins, withNx } = require('@nx/webpack'); + +module.exports = composePlugins(withNx(), (config, { options, context }) => { + // Customize webpack config here + return config; +});