Browse Source

Merge pull request #24 from dandevaud/main

Main - Latest Upstream Changes
pull/5027/head
dandevaud 2 years ago
committed by GitHub
parent
commit
cc70437d00
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 29
      CHANGELOG.md
  2. 5
      apps/api/src/assets/cryptocurrencies/cryptocurrencies.json
  3. 1
      apps/api/src/assets/cryptocurrencies/custom.json
  4. 104
      apps/api/src/assets/sitemap.xml
  5. 1
      apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts
  6. 69
      apps/client/src/app/components/header/header.component.html
  7. 8
      apps/client/src/app/components/header/header.component.scss
  8. 8
      apps/client/src/app/pages/landing/landing-page.html
  9. 5
      apps/client/src/app/pages/landing/landing-page.scss
  10. 2
      apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page-routing.module.ts
  11. 1
      apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.component.ts
  12. 2
      apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.html
  13. 16
      apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html
  14. 82
      apps/client/src/app/pages/resources/personal-finance-tools/products.ts
  15. 5
      apps/client/src/app/services/page-title.strategy.ts
  16. 3
      apps/client/src/assets/images/logo-hacker-news.svg
  17. 14
      apps/client/src/assets/oss-friends.json
  18. 1026
      apps/client/src/locales/messages.de.xlf
  19. 1026
      apps/client/src/locales/messages.es.xlf
  20. 1026
      apps/client/src/locales/messages.fr.xlf
  21. 1026
      apps/client/src/locales/messages.it.xlf
  22. 1026
      apps/client/src/locales/messages.nl.xlf
  23. 1026
      apps/client/src/locales/messages.pt.xlf
  24. 1006
      apps/client/src/locales/messages.xlf
  25. 10
      package.json
  26. 60
      yarn.lock

29
CHANGELOG.md

@ -5,6 +5,35 @@ 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/), 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). and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## Unreleased
### Added
- Added support for the cryptocurrency _CyberConnect_
### Changed
- Refreshed the cryptocurrencies list
## 1.305.0 - 2023-09-03
### Added
- Added _Hacker News_ to the _As seen in_ section on the landing page
### Changed
- Shortened the page titles
- Improved the language localization for German (`de`)
- Upgraded `prisma` from version `4.16.2` to `5.2.0`
- Upgraded `replace-in-file` from version `6.3.5` to `7.0.1`
- Upgraded `yahoo-finance2` from version `2.4.3` to `2.4.4`
### Fixed
- Fixed the alignment in the header navigation
- Fixed the alignment in the menu of the impersonation mode
## 1.304.0 - 2023-08-27 ## 1.304.0 - 2023-08-27
### Added ### Added

5
apps/api/src/assets/cryptocurrencies/cryptocurrencies.json

@ -1293,6 +1293,7 @@
"BZKY": "Bizkey", "BZKY": "Bizkey",
"BZL": "BZLCoin", "BZL": "BZLCoin",
"BZNT": "Bezant", "BZNT": "Bezant",
"BZR": "Bazaars",
"BZRX": "bZx Protocol", "BZRX": "bZx Protocol",
"BZX": "Bitcoin Zero", "BZX": "Bitcoin Zero",
"BZZ": "Swarmv", "BZZ": "Swarmv",
@ -2564,7 +2565,7 @@
"ELONGT": "Elon GOAT", "ELONGT": "Elon GOAT",
"ELONONE": "AstroElon", "ELONONE": "AstroElon",
"ELP": "Ellerium", "ELP": "Ellerium",
"ELS": "Elysium", "ELS": "Ethlas",
"ELT": "Element Black", "ELT": "Element Black",
"ELTC2": "eLTC", "ELTC2": "eLTC",
"ELTCOIN": "ELTCOIN", "ELTCOIN": "ELTCOIN",
@ -2573,6 +2574,7 @@
"ELVN": "11Minutes", "ELVN": "11Minutes",
"ELX": "Energy Ledger", "ELX": "Energy Ledger",
"ELY": "Elysian", "ELY": "Elysian",
"ELYSIUM": "Elysium",
"EM": "Eminer", "EM": "Eminer",
"EMANATE": "EMANATE", "EMANATE": "EMANATE",
"EMAR": "EmaratCoin", "EMAR": "EmaratCoin",
@ -2890,6 +2892,7 @@
"FDO": "Firdaos", "FDO": "Firdaos",
"FDR": "French Digital Reserve", "FDR": "French Digital Reserve",
"FDT": "Frutti Dino", "FDT": "Frutti Dino",
"FDUSD": "First Digital USD",
"FDX": "fidentiaX", "FDX": "fidentiaX",
"FDZ": "Friendz", "FDZ": "Friendz",
"FEAR": "Fear", "FEAR": "Fear",

1
apps/api/src/assets/cryptocurrencies/custom.json

@ -1,4 +1,5 @@
{ {
"CYBER24781": "CyberConnect",
"LUNA1": "Terra", "LUNA1": "Terra",
"LUNA2": "Terra", "LUNA2": "Terra",
"SGB1": "Songbird", "SGB1": "Songbird",

104
apps/api/src/assets/sitemap.xml

@ -50,6 +50,110 @@
<loc>https://ghostfol.io/de/ressourcen</loc> <loc>https://ghostfol.io/de/ressourcen</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod> <lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url> </url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-altoo</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-copilot-money</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-delta</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-divvydiary</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-exirio</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-folishare</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-getquin</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-gospatz</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-justetf</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-kubera</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-markets.sh</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-maybe-finance</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-monse</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-parqet</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-plannix</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-portfolio-dividend-tracker</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-portseido</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-projectionlab</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-seeking-alpha</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-sharesight</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-simple-portfolio</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-snowball-analytics</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-sumio</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-utluna</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-yeekatee</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url> <url>
<loc>https://ghostfol.io/de/ueber-uns</loc> <loc>https://ghostfol.io/de/ueber-uns</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod> <lastmod>${currentDate}T00:00:00+00:00</lastmod>

1
apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts

@ -18,7 +18,6 @@ import {
import Big from 'big.js'; import Big from 'big.js';
import { format, isToday } from 'date-fns'; import { format, isToday } from 'date-fns';
import got from 'got'; import got from 'got';
import ms from 'ms';
@Injectable() @Injectable()
export class EodHistoricalDataService implements DataProviderInterface { export class EodHistoricalDataService implements DataProviderInterface {

69
apps/client/src/app/components/header/header.component.html

@ -26,7 +26,7 @@
</li> </li>
<li class="list-inline-item"> <li class="list-inline-item">
<a <a
class="d-none d-sm-block mx-1" class="d-none d-sm-block"
i18n i18n
mat-flat-button mat-flat-button
[ngClass]="{ [ngClass]="{
@ -39,7 +39,7 @@
</li> </li>
<li class="list-inline-item"> <li class="list-inline-item">
<a <a
class="d-none d-sm-block mx-1" class="d-none d-sm-block"
i18n i18n
mat-flat-button mat-flat-button
[ngClass]="{ [ngClass]="{
@ -52,7 +52,7 @@
</li> </li>
<li *ngIf="hasPermissionToAccessAdminControl" class="list-inline-item"> <li *ngIf="hasPermissionToAccessAdminControl" class="list-inline-item">
<a <a
class="d-none d-sm-block mx-1" class="d-none d-sm-block"
i18n i18n
mat-flat-button mat-flat-button
[ngClass]="{ [ngClass]="{
@ -65,7 +65,7 @@
</li> </li>
<li class="list-inline-item"> <li class="list-inline-item">
<a <a
class="d-none d-sm-block mx-1" class="d-none d-sm-block"
i18n i18n
mat-flat-button mat-flat-button
[ngClass]="{ [ngClass]="{
@ -83,7 +83,7 @@
class="list-inline-item" class="list-inline-item"
> >
<a <a
class="d-none d-sm-block mx-1" class="d-none d-sm-block"
i18n i18n
mat-flat-button mat-flat-button
[ngClass]="{ [ngClass]="{
@ -96,7 +96,7 @@
</li> </li>
<li class="list-inline-item"> <li class="list-inline-item">
<a <a
class="d-none d-sm-block mx-1" class="d-none d-sm-block"
i18n i18n
mat-flat-button mat-flat-button
[ngClass]="{ [ngClass]="{
@ -129,33 +129,37 @@
<mat-menu #accountMenu="matMenu" xPosition="before"> <mat-menu #accountMenu="matMenu" xPosition="before">
<ng-container *ngIf="user?.access?.length > 0"> <ng-container *ngIf="user?.access?.length > 0">
<button mat-menu-item (click)="impersonateAccount(null)"> <button mat-menu-item (click)="impersonateAccount(null)">
<ion-icon <span class="align-items-center d-flex">
*ngIf="user?.access?.length > 0" <ion-icon
class="mr-2" *ngIf="user?.access?.length > 0"
[name]=" class="mr-2"
impersonationId [name]="
? 'radio-button-off-outline' impersonationId
: 'radio-button-on-outline' ? 'radio-button-off-outline'
" : 'radio-button-on-outline'
></ion-icon> "
<span i18n>Me</span> ></ion-icon>
<span i18n>Me</span>
</span>
</button> </button>
<button <button
*ngFor="let accessItem of user?.access" *ngFor="let accessItem of user?.access"
mat-menu-item mat-menu-item
(click)="impersonateAccount(accessItem.id)" (click)="impersonateAccount(accessItem.id)"
> >
<ion-icon <span class="align-items-center d-flex">
class="mr-2" <ion-icon
name="square-outline" class="mr-2"
[name]=" name="square-outline"
accessItem.id === impersonationId [name]="
? 'radio-button-on-outline' accessItem.id === impersonationId
: 'radio-button-off-outline' ? 'radio-button-on-outline'
" : 'radio-button-off-outline'
></ion-icon> "
<span *ngIf="accessItem.alias">{{ accessItem.alias }}</span> ></ion-icon>
<span *ngIf="!accessItem.alias" i18n>User</span> <span *ngIf="accessItem.alias">{{ accessItem.alias }}</span>
<span *ngIf="!accessItem.alias" i18n>User</span>
</span>
</button> </button>
<hr class="m-0" /> <hr class="m-0" />
</ng-container> </ng-container>
@ -256,7 +260,7 @@
<ul class="alig-items-center d-flex list-inline m-0"> <ul class="alig-items-center d-flex list-inline m-0">
<li class="list-inline-item"> <li class="list-inline-item">
<a <a
class="d-none d-sm-block mx-1" class="d-none d-sm-block"
i18n i18n
mat-flat-button mat-flat-button
[ngClass]="{ [ngClass]="{
@ -269,7 +273,7 @@
</li> </li>
<li class="list-inline-item"> <li class="list-inline-item">
<a <a
class="d-none d-sm-block mx-1" class="d-none d-sm-block"
i18n i18n
mat-flat-button mat-flat-button
[ngClass]="{ [ngClass]="{
@ -282,6 +286,7 @@
</li> </li>
<li *ngIf="hasPermissionForSubscription" class="list-inline-item"> <li *ngIf="hasPermissionForSubscription" class="list-inline-item">
<a <a
class="d-sm-block"
i18n i18n
mat-flat-button mat-flat-button
[ngClass]="{ [ngClass]="{
@ -297,7 +302,7 @@
class="list-inline-item" class="list-inline-item"
> >
<a <a
class="d-none d-sm-block mx-1" class="d-none d-sm-block"
i18n i18n
mat-flat-button mat-flat-button
[ngClass]="{ [ngClass]="{
@ -317,13 +322,13 @@
></a> ></a>
</li> </li>
<li class="list-inline-item"> <li class="list-inline-item">
<button class="mx-1" mat-flat-button (click)="openLoginDialog()"> <button class="d-sm-block" mat-flat-button (click)="openLoginDialog()">
<ng-container i18n>Sign in</ng-container> <ng-container i18n>Sign in</ng-container>
</button> </button>
</li> </li>
<li <li
*ngIf="currentRoute !== 'register' && hasPermissionToCreateUser" *ngIf="currentRoute !== 'register' && hasPermissionToCreateUser"
class="list-inline-item" class="list-inline-item ml-1"
> >
<a <a
class="d-none d-sm-block" class="d-none d-sm-block"

8
apps/client/src/app/components/header/header.component.scss

@ -7,8 +7,8 @@
.mat-toolbar { .mat-toolbar {
background-color: var(--light-background); background-color: var(--light-background);
.spacer { .list-inline-item {
flex: 1 1 auto; margin: 0;
} }
.mdc-button { .mdc-button {
@ -24,6 +24,10 @@
font-size: 1.5rem; font-size: 1.5rem;
} }
} }
.spacer {
flex: 1 1 auto;
}
} }
} }

8
apps/client/src/app/pages/landing/landing-page.html

@ -134,6 +134,14 @@
title="DEV Community - A constructive and inclusive social network for software developers" title="DEV Community - A constructive and inclusive social network for software developers"
></a> ></a>
</div> </div>
<div class="col-md-3 d-flex justify-content-center my-1">
<a
class="d-block logo logo-hacker-news mask"
href="https://news.ycombinator.com"
target="_blank"
title="Hacker News"
></a>
</div>
<div class="col-md-3 d-flex justify-content-center my-1"> <div class="col-md-3 d-flex justify-content-center my-1">
<a <a
class="d-block logo logo-openstartup" class="d-block logo logo-openstartup"

5
apps/client/src/app/pages/landing/landing-page.scss

@ -53,6 +53,10 @@
mask-image: url('/assets/images/logo-dev-community.svg'); mask-image: url('/assets/images/logo-dev-community.svg');
} }
&.logo-hacker-news {
mask-image: url('/assets/images/logo-hacker-news.svg');
}
&.logo-openstartup { &.logo-openstartup {
background-image: url('/assets/images/logo-openstartup.png'); background-image: url('/assets/images/logo-openstartup.png');
background-position: center; background-position: center;
@ -128,6 +132,7 @@
&.logo-agplv3, &.logo-agplv3,
&.logo-alternative-to, &.logo-alternative-to,
&.logo-dev-community, &.logo-dev-community,
&.logo-hacker-news,
&.logo-privacy-tools, &.logo-privacy-tools,
&.logo-reddit, &.logo-reddit,
&.logo-sackgeld, &.logo-sackgeld,

2
apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page-routing.module.ts

@ -19,7 +19,7 @@ const routes: Routes = [
.map(({ component, key, name }) => { .map(({ component, key, name }) => {
return { return {
canActivate: [AuthGuard], canActivate: [AuthGuard],
path: `open-source-alternative-to-${key}`, path: $localize`open-source-alternative-to` + `-${key}`,
loadComponent: () => loadComponent: () =>
import(`./products/${key}-page.component`).then(() => component), import(`./products/${key}-page.component`).then(() => component),
title: $localize`Open Source Alternative to ${name}` title: $localize`Open Source Alternative to ${name}`

1
apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.component.ts

@ -10,6 +10,7 @@ import { products } from './products';
templateUrl: './personal-finance-tools-page.html' templateUrl: './personal-finance-tools-page.html'
}) })
export class PersonalFinanceToolsPageComponent implements OnDestroy { export class PersonalFinanceToolsPageComponent implements OnDestroy {
public pathAlternativeTo = $localize`open-source-alternative-to` + '-';
public pathResources = '/' + $localize`resources`; public pathResources = '/' + $localize`resources`;
public products = products.filter(({ key }) => { public products = products.filter(({ key }) => {
return key !== 'ghostfolio'; return key !== 'ghostfolio';

2
apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.html

@ -29,7 +29,7 @@
<a <a
class="d-flex overflow-hidden w-100" class="d-flex overflow-hidden w-100"
title="Compare Ghostfolio to {{ product.name }}" title="Compare Ghostfolio to {{ product.name }}"
[routerLink]="[pathResources, 'personal-finance-tools', 'open-source-alternative-to-' + product.key]" [routerLink]="[pathResources, 'personal-finance-tools', pathAlternativeTo + product.key]"
> >
<div class="flex-grow-1 overflow-hidden"> <div class="flex-grow-1 overflow-hidden">
<div class="h6 m-0 text-truncate" i18n> <div class="h6 m-0 text-truncate" i18n>

16
apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html

@ -10,7 +10,7 @@
</h1> </h1>
</div> </div>
<section class="mb-4"> <section class="mb-4">
<p> <p i18n>
Are you looking for an open source alternative to {{ product2.name Are you looking for an open source alternative to {{ product2.name
}}? <a [routerLink]="routerLinkAbout">Ghostfolio</a> is a powerful }}? <a [routerLink]="routerLinkAbout">Ghostfolio</a> is a powerful
portfolio management tool that provides individuals with a portfolio management tool that provides individuals with a
@ -23,7 +23,7 @@
to help you make informed decisions and take control of your to help you make informed decisions and take control of your
financial future. financial future.
</p> </p>
<p> <p i18n>
Ghostfolio is an open source software (OSS), providing a Ghostfolio is an open source software (OSS), providing a
cost-effective alternative to {{ product2.name }} making it cost-effective alternative to {{ product2.name }} making it
particularly suitable for individuals on a tight budget, such as particularly suitable for individuals on a tight budget, such as
@ -34,7 +34,7 @@
and personal finance enthusiasts, Ghostfolio continuously enhances and personal finance enthusiasts, Ghostfolio continuously enhances
its capabilities, security, and user experience. its capabilities, security, and user experience.
</p> </p>
<p> <p i18n>
Let’s dive deeper into the detailed comparison table below to gain a Let’s dive deeper into the detailed comparison table below to gain a
thorough understanding of how Ghostfolio positions itself relative thorough understanding of how Ghostfolio positions itself relative
to {{ product2.name }}. We will explore various aspects such as to {{ product2.name }}. We will explore various aspects such as
@ -177,11 +177,11 @@
</tr> </tr>
<tr class="mat-mdc-row"> <tr class="mat-mdc-row">
<td class="mat-mdc-cell px-3 py-2 text-right" i18n>Pricing</td> <td class="mat-mdc-cell px-3 py-2 text-right" i18n>Pricing</td>
<td class="mat-mdc-cell px-1 py-2"> <td class="mat-mdc-cell px-1 py-2" i18n>
Starting from {{ product1.pricingPerYear }} / year Starting from {{ product1.pricingPerYear }} / year
</td> </td>
<td class="mat-mdc-cell px-1 py-2"> <td class="mat-mdc-cell px-1 py-2">
<ng-container *ngIf="product2.pricingPerYear" <ng-container *ngIf="product2.pricingPerYear" i18n
>Starting from {{ product2.pricingPerYear }} / >Starting from {{ product2.pricingPerYear }} /
year</ng-container year</ng-container
> >
@ -196,7 +196,7 @@
</table> </table>
</section> </section>
<section class="mb-4"> <section class="mb-4">
<p> <p i18n>
Please note that the information provided is based on our Please note that the information provided is based on our
independent research and analysis. This website is not affiliated independent research and analysis. This website is not affiliated
with {{ product2.name }} or any other product mentioned in the with {{ product2.name }} or any other product mentioned in the
@ -208,7 +208,7 @@
</p> </p>
</section> </section>
<section class="call-to-action mb-4 py-3 rounded"> <section class="call-to-action mb-4 py-3 rounded">
<h2 class="h4 mb-0 text-center"> <h2 class="h4 mb-0 text-center" i18n>
Ready to take your <strong>investments</strong> to the Ready to take your <strong>investments</strong> to the
<strong>next level</strong>? <strong>next level</strong>?
</h2> </h2>
@ -217,7 +217,7 @@
Ghostfolio. Ghostfolio.
</p> </p>
<div class="text-center"> <div class="text-center">
<a color="primary" href="https://ghostfol.io" mat-flat-button> <a color="primary" href="https://ghostfol.io" i18n mat-flat-button>
Get Started Get Started
</a> </a>
</div> </div>

82
apps/client/src/app/pages/resources/personal-finance-tools/products.ts

@ -35,18 +35,18 @@ export const products: Product[] = [
isOpenSource: true, isOpenSource: true,
key: 'ghostfolio', key: 'ghostfolio',
languages: [ languages: [
'Dutch', 'Deutsch',
'English', 'English',
'French', 'Español',
'German', 'Français',
'Italian', 'Italiano',
'Portuguese', 'Nederlands',
'Spanish' 'Português'
], ],
name: 'Ghostfolio', name: 'Ghostfolio',
origin: 'Switzerland', origin: $localize`Switzerland`,
pricingPerYear: '$19', pricingPerYear: '$19',
region: 'Global', region: $localize`Global`,
slogan: 'Open Source Wealth Management', slogan: 'Open Source Wealth Management',
useAnonymously: true useAnonymously: true
}, },
@ -57,7 +57,7 @@ export const products: Product[] = [
isOpenSource: false, isOpenSource: false,
key: 'altoo', key: 'altoo',
name: 'Altoo Wealth Platform', name: 'Altoo Wealth Platform',
origin: 'Switzerland', origin: $localize`Switzerland`,
slogan: 'Simplicity for Complex Wealth' slogan: 'Simplicity for Complex Wealth'
}, },
{ {
@ -68,7 +68,7 @@ export const products: Product[] = [
isOpenSource: false, isOpenSource: false,
key: 'copilot-money', key: 'copilot-money',
name: 'Copilot Money', name: 'Copilot Money',
origin: 'United States', origin: $localize`United States`,
pricingPerYear: '$70', pricingPerYear: '$70',
slogan: 'Do money better with Copilot' slogan: 'Do money better with Copilot'
}, },
@ -81,7 +81,7 @@ export const products: Product[] = [
key: 'delta', key: 'delta',
name: 'Delta Investment Tracker', name: 'Delta Investment Tracker',
note: 'Acquired by eToro', note: 'Acquired by eToro',
origin: 'Belgium', origin: $localize`Belgium`,
slogan: 'The app to track all your investments. Make smart moves only.' slogan: 'The app to track all your investments. Make smart moves only.'
}, },
{ {
@ -91,9 +91,9 @@ export const products: Product[] = [
hasSelfHostingAbility: false, hasSelfHostingAbility: false,
isOpenSource: false, isOpenSource: false,
key: 'divvydiary', key: 'divvydiary',
languages: ['English', 'German'], languages: ['Deutsch', 'English'],
name: 'DivvyDiary', name: 'DivvyDiary',
origin: 'Germany', origin: $localize`Germany`,
pricingPerYear: '€65', pricingPerYear: '€65',
slogan: 'Your personal Dividend Calendar' slogan: 'Your personal Dividend Calendar'
}, },
@ -105,7 +105,7 @@ export const products: Product[] = [
isOpenSource: false, isOpenSource: false,
key: 'exirio', key: 'exirio',
name: 'Exirio', name: 'Exirio',
origin: 'United States', origin: $localize`United States`,
pricingPerYear: '$100', pricingPerYear: '$100',
slogan: 'All your wealth, in one place.' slogan: 'All your wealth, in one place.'
}, },
@ -115,9 +115,9 @@ export const products: Product[] = [
hasSelfHostingAbility: false, hasSelfHostingAbility: false,
isOpenSource: false, isOpenSource: false,
key: 'folishare', key: 'folishare',
languages: ['English', 'German'], languages: ['Deutsch', 'English'],
name: 'folishare', name: 'folishare',
origin: 'Austria', origin: $localize`Austria`,
pricingPerYear: '$65', pricingPerYear: '$65',
slogan: 'Take control over your investments' slogan: 'Take control over your investments'
}, },
@ -128,9 +128,9 @@ export const products: Product[] = [
hasSelfHostingAbility: false, hasSelfHostingAbility: false,
isOpenSource: false, isOpenSource: false,
key: 'getquin', key: 'getquin',
languages: ['English', 'German'], languages: ['Deutsch', 'English'],
name: 'getquin', name: 'getquin',
origin: 'Germany', origin: $localize`Germany`,
pricingPerYear: '€48', pricingPerYear: '€48',
slogan: 'Portfolio Tracker, Analysis & Community' slogan: 'Portfolio Tracker, Analysis & Community'
}, },
@ -141,7 +141,7 @@ export const products: Product[] = [
isOpenSource: false, isOpenSource: false,
key: 'gospatz', key: 'gospatz',
name: 'goSPATZ', name: 'goSPATZ',
origin: 'Germany', origin: $localize`Germany`,
slogan: 'Volle Kontrolle über deine Investitionen' slogan: 'Volle Kontrolle über deine Investitionen'
}, },
{ {
@ -152,7 +152,7 @@ export const products: Product[] = [
isOpenSource: false, isOpenSource: false,
key: 'justetf', key: 'justetf',
name: 'justETF', name: 'justETF',
origin: 'Germany', origin: $localize`Germany`,
pricingPerYear: '€119', pricingPerYear: '€119',
slogan: 'ETF portfolios made simple' slogan: 'ETF portfolios made simple'
}, },
@ -164,7 +164,7 @@ export const products: Product[] = [
isOpenSource: false, isOpenSource: false,
key: 'kubera', key: 'kubera',
name: 'Kubera®', name: 'Kubera®',
origin: 'United States', origin: $localize`United States`,
pricingPerYear: '$150', pricingPerYear: '$150',
slogan: 'The Time Machine for your Net Worth' slogan: 'The Time Machine for your Net Worth'
}, },
@ -177,9 +177,9 @@ export const products: Product[] = [
key: 'markets.sh', key: 'markets.sh',
languages: ['English'], languages: ['English'],
name: 'markets.sh', name: 'markets.sh',
origin: 'Germany', origin: $localize`Germany`,
pricingPerYear: '€168', pricingPerYear: '€168',
region: 'Global', region: $localize`Global`,
slogan: 'Track your investments' slogan: 'Track your investments'
}, },
{ {
@ -191,9 +191,9 @@ export const products: Product[] = [
languages: ['English'], languages: ['English'],
name: 'Maybe Finance', name: 'Maybe Finance',
note: 'Sunset in 2023', note: 'Sunset in 2023',
origin: 'United States', origin: $localize`United States`,
pricingPerYear: '$145', pricingPerYear: '$145',
region: 'United States', region: $localize`United States`,
slogan: 'Your financial future, in your control' slogan: 'Your financial future, in your control'
}, },
{ {
@ -215,7 +215,7 @@ export const products: Product[] = [
key: 'parqet', key: 'parqet',
name: 'Parqet', name: 'Parqet',
note: 'Originally named as Tresor One', note: 'Originally named as Tresor One',
origin: 'Germany', origin: $localize`Germany`,
pricingPerYear: '€88', pricingPerYear: '€88',
region: 'Austria, Germany, Switzerland', region: 'Austria, Germany, Switzerland',
slogan: 'Dein Vermögen immer im Blick' slogan: 'Dein Vermögen immer im Blick'
@ -227,7 +227,7 @@ export const products: Product[] = [
isOpenSource: false, isOpenSource: false,
key: 'plannix', key: 'plannix',
name: 'Plannix', name: 'Plannix',
origin: 'Italy', origin: $localize`Italy`,
slogan: 'Your Personal Finance Hub' slogan: 'Your Personal Finance Hub'
}, },
{ {
@ -236,9 +236,9 @@ export const products: Product[] = [
hasSelfHostingAbility: false, hasSelfHostingAbility: false,
isOpenSource: false, isOpenSource: false,
key: 'portfolio-dividend-tracker', key: 'portfolio-dividend-tracker',
languages: ['English', 'Dutch'], languages: ['English', 'Nederlands'],
name: 'Portfolio Dividend Tracker', name: 'Portfolio Dividend Tracker',
origin: 'Netherlands', origin: $localize`Netherlands`,
pricingPerYear: '€60', pricingPerYear: '€60',
slogan: 'Manage all your portfolios' slogan: 'Manage all your portfolios'
}, },
@ -249,9 +249,9 @@ export const products: Product[] = [
hasSelfHostingAbility: false, hasSelfHostingAbility: false,
isOpenSource: false, isOpenSource: false,
key: 'portseido', key: 'portseido',
languages: ['Dutch', 'English', 'French', 'German'], languages: ['Deutsch', 'English', 'Français', 'Nederlands'],
name: 'Portseido', name: 'Portseido',
origin: 'Thailand', origin: $localize`Thailand`,
pricingPerYear: '$96', pricingPerYear: '$96',
slogan: 'Portfolio Performance and Dividend Tracker' slogan: 'Portfolio Performance and Dividend Tracker'
}, },
@ -263,7 +263,7 @@ export const products: Product[] = [
isOpenSource: false, isOpenSource: false,
key: 'projectionlab', key: 'projectionlab',
name: 'ProjectionLab', name: 'ProjectionLab',
origin: 'United States', origin: $localize`United States`,
pricingPerYear: '$108', pricingPerYear: '$108',
slogan: 'Build Financial Plans You Love.' slogan: 'Build Financial Plans You Love.'
}, },
@ -275,7 +275,7 @@ export const products: Product[] = [
isOpenSource: false, isOpenSource: false,
key: 'seeking-alpha', key: 'seeking-alpha',
name: 'Seeking Alpha', name: 'Seeking Alpha',
origin: 'United States', origin: $localize`United States`,
pricingPerYear: '$239', pricingPerYear: '$239',
slogan: 'Stock Market Analysis & Tools for Investors' slogan: 'Stock Market Analysis & Tools for Investors'
}, },
@ -287,9 +287,9 @@ export const products: Product[] = [
isOpenSource: false, isOpenSource: false,
key: 'sharesight', key: 'sharesight',
name: 'Sharesight', name: 'Sharesight',
origin: 'New Zealand', origin: $localize`New Zealand`,
pricingPerYear: '$135', pricingPerYear: '$135',
region: 'Global', region: $localize`Global`,
slogan: 'Stock Portfolio Tracker' slogan: 'Stock Portfolio Tracker'
}, },
{ {
@ -299,7 +299,7 @@ export const products: Product[] = [
isOpenSource: false, isOpenSource: false,
key: 'simple-portfolio', key: 'simple-portfolio',
name: 'Simple Portfolio', name: 'Simple Portfolio',
origin: 'Czech Republic', origin: $localize`Czech Republic`,
pricingPerYear: '€80', pricingPerYear: '€80',
slogan: 'Stock Portfolio Tracker' slogan: 'Stock Portfolio Tracker'
}, },
@ -322,7 +322,7 @@ export const products: Product[] = [
isOpenSource: false, isOpenSource: false,
key: 'sumio', key: 'sumio',
name: 'Sumio', name: 'Sumio',
origin: 'Czech Republic', origin: $localize`Czech Republic`,
pricingPerYear: '$20', pricingPerYear: '$20',
slogan: 'Sum up and build your wealth.' slogan: 'Sum up and build your wealth.'
}, },
@ -332,9 +332,9 @@ export const products: Product[] = [
hasSelfHostingAbility: false, hasSelfHostingAbility: false,
isOpenSource: false, isOpenSource: false,
key: 'utluna', key: 'utluna',
languages: ['English', 'French', 'German'], languages: ['Deutsch', 'English', 'Français'],
name: 'Utluna', name: 'Utluna',
origin: 'Switzerland', origin: $localize`Switzerland`,
pricingPerYear: '$300', pricingPerYear: '$300',
slogan: 'Your Portfolio. Revealed.', slogan: 'Your Portfolio. Revealed.',
useAnonymously: true useAnonymously: true
@ -346,8 +346,8 @@ export const products: Product[] = [
isOpenSource: false, isOpenSource: false,
key: 'yeekatee', key: 'yeekatee',
name: 'yeekatee', name: 'yeekatee',
origin: 'Switzerland', origin: $localize`Switzerland`,
region: 'Switzerland', region: $localize`Switzerland`,
slogan: 'Connect. Share. Invest.' slogan: 'Connect. Share. Invest.'
} }
]; ];

5
apps/client/src/app/services/page-title.strategy.ts

@ -6,6 +6,7 @@ import { RouterStateSnapshot, TitleStrategy } from '@angular/router';
export class PageTitleStrategy extends TitleStrategy { export class PageTitleStrategy extends TitleStrategy {
private static readonly DEFAULT_TITLE = private static readonly DEFAULT_TITLE =
'Ghostfolio – Open Source Wealth Management Software'; 'Ghostfolio – Open Source Wealth Management Software';
private static readonly DEFAULT_TITLE_SHORT = 'Ghostfolio';
public constructor(private readonly title: Title) { public constructor(private readonly title: Title) {
super(); super();
@ -15,7 +16,9 @@ export class PageTitleStrategy extends TitleStrategy {
const title = this.buildTitle(routerState); const title = this.buildTitle(routerState);
if (title) { if (title) {
this.title.setTitle(`${title}${PageTitleStrategy.DEFAULT_TITLE}`); this.title.setTitle(
`${title}${PageTitleStrategy.DEFAULT_TITLE_SHORT}`
);
} else { } else {
this.title.setTitle(`${PageTitleStrategy.DEFAULT_TITLE}`); this.title.setTitle(`${PageTitleStrategy.DEFAULT_TITLE}`);
} }

3
apps/client/src/assets/images/logo-hacker-news.svg

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="256px" height="256px">
<path d="M 1 1 L 1 14 L 14 14 L 14 1 Z M 2 2 L 13 2 L 13 13 L 2 13 Z M 4.644531 4 L 7 8.125 L 7 11 L 8 11 L 8 8.140625 L 10.367188 4 L 9.21875 4 L 7.507813 6.992188 L 5.796875 4 Z"/>
</svg>

After

Width:  |  Height:  |  Size: 282 B

14
apps/client/src/assets/oss-friends.json

@ -1,5 +1,5 @@
{ {
"createdAt": "2023-08-22T06:39:23.320Z", "createdAt": "2023-09-02T07:02:24.422Z",
"data": [ "data": [
{ {
"name": "Appsmith", "name": "Appsmith",
@ -76,6 +76,11 @@
"description": "Democratizing investment research through an open source financial ecosystem. The OpenBB Terminal allows everyone to perform investment research, from everywhere.", "description": "Democratizing investment research through an open source financial ecosystem. The OpenBB Terminal allows everyone to perform investment research, from everywhere.",
"href": "https://openbb.co" "href": "https://openbb.co"
}, },
{
"name": "Rivet",
"description": "Open-source solution to deploy, scale, and operate your multiplayer game.",
"href": "https://rivet.gg"
},
{ {
"name": "Sniffnet", "name": "Sniffnet",
"description": "Sniffnet is a network monitoring tool to help you easily keep track of your Internet traffic.", "description": "Sniffnet is a network monitoring tool to help you easily keep track of your Internet traffic.",
@ -84,7 +89,7 @@
{ {
"name": "Tolgee", "name": "Tolgee",
"description": "Software localization from A to Z made really easy.", "description": "Software localization from A to Z made really easy.",
"href": "https://tolgee.io/" "href": "https://tolgee.io"
}, },
{ {
"name": "Trigger.dev", "name": "Trigger.dev",
@ -110,6 +115,11 @@
"name": "Webstudio", "name": "Webstudio",
"description": "Webstudio is an open source alternative to Webflow", "description": "Webstudio is an open source alternative to Webflow",
"href": "https://webstudio.is" "href": "https://webstudio.is"
},
{
"name": "Spark.NET",
"description": "The .NET Web Framework for Makers. Build production ready, full-stack web applications fast without sweating the small stuff.",
"href": "https://spark-framework.net"
} }
], ],
"source": "https://formbricks.com/api/oss-friends" "source": "https://formbricks.com/api/oss-friends"

1026
apps/client/src/locales/messages.de.xlf

File diff suppressed because it is too large

1026
apps/client/src/locales/messages.es.xlf

File diff suppressed because it is too large

1026
apps/client/src/locales/messages.fr.xlf

File diff suppressed because it is too large

1026
apps/client/src/locales/messages.it.xlf

File diff suppressed because it is too large

1026
apps/client/src/locales/messages.nl.xlf

File diff suppressed because it is too large

1026
apps/client/src/locales/messages.pt.xlf

File diff suppressed because it is too large

1006
apps/client/src/locales/messages.xlf

File diff suppressed because it is too large

10
package.json

@ -1,6 +1,6 @@
{ {
"name": "ghostfolio", "name": "ghostfolio",
"version": "1.304.0", "version": "1.305.0",
"homepage": "https://ghostfol.io", "homepage": "https://ghostfol.io",
"license": "AGPL-3.0", "license": "AGPL-3.0",
"repository": "https://github.com/ghostfolio/ghostfolio", "repository": "https://github.com/ghostfolio/ghostfolio",
@ -81,7 +81,7 @@
"@nestjs/platform-express": "10.1.3", "@nestjs/platform-express": "10.1.3",
"@nestjs/schedule": "3.0.2", "@nestjs/schedule": "3.0.2",
"@nestjs/serve-static": "4.0.0", "@nestjs/serve-static": "4.0.0",
"@prisma/client": "4.16.2", "@prisma/client": "5.2.0",
"@simplewebauthn/browser": "5.2.1", "@simplewebauthn/browser": "5.2.1",
"@simplewebauthn/server": "5.2.1", "@simplewebauthn/server": "5.2.1",
"@stripe/stripe-js": "1.47.0", "@stripe/stripe-js": "1.47.0",
@ -122,14 +122,14 @@
"passport": "0.6.0", "passport": "0.6.0",
"passport-google-oauth20": "2.0.0", "passport-google-oauth20": "2.0.0",
"passport-jwt": "4.0.0", "passport-jwt": "4.0.0",
"prisma": "4.16.2", "prisma": "5.2.0",
"reflect-metadata": "0.1.13", "reflect-metadata": "0.1.13",
"rxjs": "7.5.6", "rxjs": "7.5.6",
"stripe": "11.12.0", "stripe": "11.12.0",
"svgmap": "2.6.0", "svgmap": "2.6.0",
"twitter-api-v2": "1.14.2", "twitter-api-v2": "1.14.2",
"uuid": "9.0.0", "uuid": "9.0.0",
"yahoo-finance2": "2.4.3", "yahoo-finance2": "2.4.4",
"zone.js": "0.13.1" "zone.js": "0.13.1"
}, },
"devDependencies": { "devDependencies": {
@ -193,7 +193,7 @@
"prettier-plugin-organize-attributes": "1.0.0", "prettier-plugin-organize-attributes": "1.0.0",
"react": "18.2.0", "react": "18.2.0",
"react-dom": "18.2.0", "react-dom": "18.2.0",
"replace-in-file": "6.3.5", "replace-in-file": "7.0.1",
"storybook": "7.0.9", "storybook": "7.0.9",
"ts-jest": "29.1.0", "ts-jest": "29.1.0",
"ts-node": "10.9.1", "ts-node": "10.9.1",

60
yarn.lock

@ -4293,22 +4293,22 @@
resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33"
integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==
"@prisma/client@4.16.2": "@prisma/client@5.2.0":
version "4.16.2" version "5.2.0"
resolved "https://registry.yarnpkg.com/@prisma/client/-/client-4.16.2.tgz#3bb9ebd49b35c8236b3d468d0215192267016e2b" resolved "https://registry.yarnpkg.com/@prisma/client/-/client-5.2.0.tgz#cbfdd440614b38736563a7999f39922fcde0ed50"
integrity sha512-qCoEyxv1ZrQ4bKy39GnylE8Zq31IRmm8bNhNbZx7bF2cU5aiCCnSa93J2imF88MBjn7J9eUQneNxUQVJdl/rPQ== integrity sha512-AiTjJwR4J5Rh6Z/9ZKrBBLel3/5DzUNntMohOy7yObVnVoTNVFi2kvpLZlFuKO50d7yDspOtW6XBpiAd0BVXbQ==
dependencies: dependencies:
"@prisma/engines-version" "4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81" "@prisma/engines-version" "5.2.0-25.2804dc98259d2ea960602aca6b8e7fdc03c1758f"
"@prisma/engines-version@4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81": "@prisma/engines-version@5.2.0-25.2804dc98259d2ea960602aca6b8e7fdc03c1758f":
version "4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81" version "5.2.0-25.2804dc98259d2ea960602aca6b8e7fdc03c1758f"
resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81.tgz#d3b5dcf95b6d220e258cbf6ae19b06d30a7e9f14" resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-5.2.0-25.2804dc98259d2ea960602aca6b8e7fdc03c1758f.tgz#11366e7ff031c908debf4983248d40046016de37"
integrity sha512-q617EUWfRIDTriWADZ4YiWRZXCa/WuhNgLTVd+HqWLffjMSPzyM5uOWoauX91wvQClSKZU4pzI4JJLQ9Kl62Qg== integrity sha512-jsnKT5JIDIE01lAeCj2ghY9IwxkedhKNvxQeoyLs6dr4ZXynetD0vTy7u6wMJt8vVPv8I5DPy/I4CFaoXAgbtg==
"@prisma/engines@4.16.2": "@prisma/engines@5.2.0":
version "4.16.2" version "5.2.0"
resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-4.16.2.tgz#5ec8dd672c2173d597e469194916ad4826ce2e5f" resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-5.2.0.tgz#e5dff48eb324c8137393933292d44ea5c3bc2ce7"
integrity sha512-vx1nxVvN4QeT/cepQce68deh/Turxy5Mr+4L4zClFuK1GlxN3+ivxfuv+ej/gvidWn1cE1uAhW7ALLNlYbRUAw== integrity sha512-dT7FOLUCdZmq+AunLqB1Iz+ZH/IIS1Fz2THmKZQ6aFONrQD/BQ5ecJ7g2wGS2OgyUFf4OaLam6/bxmgdOBDqig==
"@radix-ui/number@1.0.1": "@radix-ui/number@1.0.1":
version "1.0.1" version "1.0.1"
@ -11352,7 +11352,7 @@ glob@^10.0.0, glob@^10.2.2:
minipass "^5.0.0 || ^6.0.2 || ^7.0.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0"
path-scurry "^1.10.1" path-scurry "^1.10.1"
glob@^7.0.0, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0: glob@^7.0.0, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6:
version "7.2.3" version "7.2.3"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
@ -15918,12 +15918,12 @@ pretty-hrtime@^1.0.3:
resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1"
integrity sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A== integrity sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==
prisma@4.16.2: prisma@5.2.0:
version "4.16.2" version "5.2.0"
resolved "https://registry.yarnpkg.com/prisma/-/prisma-4.16.2.tgz#469e0a0991c6ae5bcde289401726bb012253339e" resolved "https://registry.yarnpkg.com/prisma/-/prisma-5.2.0.tgz#a302dc2635cdec1d22d552ece837fb29a03563b9"
integrity sha512-SYCsBvDf0/7XSJyf2cHTLjLeTLVXYfqp7pG5eEVafFLeT0u/hLFz/9W196nDRGUOo1JfPatAEb+uEnTQImQC1g== integrity sha512-FfFlpjVCkZwrqxDnP4smlNYSH1so+CbfjgdpioFzGGqlQAEm6VHAYSzV7jJgC3ebtY9dNOhDMS2+4/1DDSM7bQ==
dependencies: dependencies:
"@prisma/engines" "4.16.2" "@prisma/engines" "5.2.0"
prismjs@^1.28.0: prismjs@^1.28.0:
version "1.29.0" version "1.29.0"
@ -16466,14 +16466,14 @@ repeat-string@^1.6.1:
resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==
replace-in-file@6.3.5: replace-in-file@7.0.1:
version "6.3.5" version "7.0.1"
resolved "https://registry.yarnpkg.com/replace-in-file/-/replace-in-file-6.3.5.tgz#ff956b0ab5bc96613207d603d197cd209400a654" resolved "https://registry.yarnpkg.com/replace-in-file/-/replace-in-file-7.0.1.tgz#1bb69a2e5596341cc6f0f581309add6c1d364b71"
integrity sha512-arB9d3ENdKva2fxRnSjwBEXfK1npgyci7ZZuwysgAp7ORjHSyxz6oqIjTEv8R0Ydl4Ll7uOAZXL4vbkhGIizCg== integrity sha512-KbhgPq04eA+TxXuUxpgWIH9k/TjF+28ofon2PXP7vq6izAILhxOtksCVcLuuQLtyjouBaPdlH6RJYYcSPVxCOA==
dependencies: dependencies:
chalk "^4.1.2" chalk "^4.1.2"
glob "^7.2.0" glob "^8.1.0"
yargs "^17.2.1" yargs "^17.7.2"
request-progress@^3.0.0: request-progress@^3.0.0:
version "3.0.0" version "3.0.0"
@ -19035,10 +19035,10 @@ y18n@^5.0.5:
resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"
integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==
yahoo-finance2@2.4.3: yahoo-finance2@2.4.4:
version "2.4.3" version "2.4.4"
resolved "https://registry.yarnpkg.com/yahoo-finance2/-/yahoo-finance2-2.4.3.tgz#be4099182dc0a2e2908779e04d7b802688c15f0e" resolved "https://registry.yarnpkg.com/yahoo-finance2/-/yahoo-finance2-2.4.4.tgz#3149a4f2e6fab04430aabe7758bfbc70f240503e"
integrity sha512-LVcl+h4XBMe3N/l8BOZdDFoK7AGMiblSBE00dU9t2zB0Zfxa6QQMESnUkJ1m35RWBr8QXFJyJnToPt+qKiEQXQ== integrity sha512-dL8bz3ubmPYRHd2M85hyL8kcVVlvpTGdzqeuewMH6X1Ej/lo4/2qlbAqZVT4qlcFeuEdlEIZ1N/mFp6SFnW8Uw==
dependencies: dependencies:
"@types/tough-cookie" "^4.0.2" "@types/tough-cookie" "^4.0.2"
ajv "8.10.0" ajv "8.10.0"
@ -19074,7 +19074,7 @@ yargs-parser@^11.1.1:
camelcase "^5.0.0" camelcase "^5.0.0"
decamelize "^1.2.0" decamelize "^1.2.0"
yargs@17.7.2, yargs@^17.2.1, yargs@^17.3.1, yargs@^17.6.2: yargs@17.7.2, yargs@^17.2.1, yargs@^17.3.1, yargs@^17.6.2, yargs@^17.7.2:
version "17.7.2" version "17.7.2"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269"
integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==

Loading…
Cancel
Save