Browse Source

Merge branch 'main' into task/upgrade-ngx-skeleton-loader-to-version-12.0.0

pull/6304/head
Thomas Kaul 2 months ago
committed by GitHub
parent
commit
63c8aec12b
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 1
      CHANGELOG.md
  2. 4
      README.md
  3. 1
      apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
  4. 8
      apps/client/src/app/pages/about/overview/about-overview-page.html
  5. 1
      apps/client/src/app/pages/accounts/accounts-page.html
  6. 38
      libs/ui/src/lib/accounts-table/accounts-table.component.html
  7. 3
      libs/ui/src/lib/accounts-table/accounts-table.component.stories.ts
  8. 161
      libs/ui/src/lib/accounts-table/accounts-table.component.ts
  9. 26
      libs/ui/src/lib/activities-table/activities-table.component.stories.ts
  10. 8
      package-lock.json
  11. 2
      package.json

1
CHANGELOG.md

@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed ### Changed
- Upgraded `ngx-skeleton-loader` from version `11.3.0` to `12.0.0` - Upgraded `ngx-skeleton-loader` from version `11.3.0` to `12.0.0`
- Upgraded `twitter-api-v2` from version `1.27.0` to `1.29.0`
## 2.237.0 - 2026-02-08 ## 2.237.0 - 2026-02-08

4
README.md

@ -318,8 +318,8 @@ If you like to support this project, become a [**Sponsor**](https://github.com/s
## Sponsors ## Sponsors
<div align="center"> <div align="center">
<a href="https://www.testmu.ai?utm_medium=sponsor&utm_source=ghostfolio" target="_blank" title="TestMu AI - AI Powered Testing Tool"> <a href="https://www.testmuai.com?utm_medium=sponsor&utm_source=ghostfolio" target="_blank" title="TestMu AI - AI Powered Testing Tool">
<img alt="TestMu AI Logo" height="45" src="https://assets.testmu.ai/resources/images/logos/logo.svg" /> <img alt="TestMu AI Logo" height="45" src="https://assets.testmuai.com/resources/images/logos/logo.svg" />
</a> </a>
</div> </div>

1
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html

@ -377,7 +377,6 @@
<gf-accounts-table <gf-accounts-table
[accounts]="accounts" [accounts]="accounts"
[baseCurrency]="user?.settings?.baseCurrency" [baseCurrency]="user?.settings?.baseCurrency"
[deviceType]="data.deviceType"
[hasPermissionToOpenDetails]="false" [hasPermissionToOpenDetails]="false"
[locale]="user?.settings?.locale" [locale]="user?.settings?.locale"
[showActivitiesCount]="false" [showActivitiesCount]="false"

8
apps/client/src/app/pages/about/overview/about-overview-page.html

@ -209,7 +209,7 @@
<div class="text-center"> <div class="text-center">
<div class="mb-2 small">Browser testing via</div> <div class="mb-2 small">Browser testing via</div>
<a <a
href="https://www.testmu.ai?utm_medium=sponsor&utm_source=ghostfolio" href="https://www.testmuai.com?utm_medium=sponsor&utm_source=ghostfolio"
target="_blank" target="_blank"
title="TestMu AI - AI Powered Testing Tool" title="TestMu AI - AI Powered Testing Tool"
> >
@ -217,9 +217,9 @@
alt="TestMu AI Logo" alt="TestMu AI Logo"
height="32" height="32"
[src]=" [src]="
user?.settings?.colorScheme === 'LIGHT' user?.settings?.colorScheme === 'DARK'
? '../assets/images/sponsors/logo-testmu-dark.svg' ? '../assets/images/sponsors/logo-testmu-light.svg'
: '../assets/images/sponsors/logo-testmu-light.svg' : '../assets/images/sponsors/logo-testmu-dark.svg'
" "
/> />
</a> </a>

1
apps/client/src/app/pages/accounts/accounts-page.html

@ -6,7 +6,6 @@
[accounts]="accounts" [accounts]="accounts"
[activitiesCount]="activitiesCount" [activitiesCount]="activitiesCount"
[baseCurrency]="user?.settings?.baseCurrency" [baseCurrency]="user?.settings?.baseCurrency"
[deviceType]="deviceType"
[locale]="user?.settings?.locale" [locale]="user?.settings?.locale"
[showActions]=" [showActions]="
!hasImpersonationId && !hasImpersonationId &&

38
libs/ui/src/lib/accounts-table/accounts-table.component.html

@ -1,4 +1,4 @@
@if (showActions) { @if (showActions()) {
<div class="d-flex justify-content-end"> <div class="d-flex justify-content-end">
<button <button
class="align-items-center d-flex" class="align-items-center d-flex"
@ -79,7 +79,7 @@
{{ element.currency }} {{ element.currency }}
</td> </td>
<td *matFooterCellDef class="d-none d-lg-table-cell px-1" mat-footer-cell> <td *matFooterCellDef class="d-none d-lg-table-cell px-1" mat-footer-cell>
{{ baseCurrency }} {{ baseCurrency() }}
</td> </td>
</ng-container> </ng-container>
@ -129,7 +129,7 @@
{{ element.activitiesCount }} {{ element.activitiesCount }}
</td> </td>
<td *matFooterCellDef class="px-1 text-right" mat-footer-cell> <td *matFooterCellDef class="px-1 text-right" mat-footer-cell>
{{ activitiesCount }} {{ activitiesCount() }}
</td> </td>
</ng-container> </ng-container>
@ -150,7 +150,7 @@
<gf-value <gf-value
class="d-inline-block justify-content-end" class="d-inline-block justify-content-end"
[isCurrency]="true" [isCurrency]="true"
[locale]="locale" [locale]="locale()"
[value]="element.balance" [value]="element.balance"
/> />
</td> </td>
@ -162,8 +162,8 @@
<gf-value <gf-value
class="d-inline-block justify-content-end" class="d-inline-block justify-content-end"
[isCurrency]="true" [isCurrency]="true"
[locale]="locale" [locale]="locale()"
[value]="totalBalanceInBaseCurrency" [value]="totalBalanceInBaseCurrency()"
/> />
</td> </td>
</ng-container> </ng-container>
@ -185,7 +185,7 @@
<gf-value <gf-value
class="d-inline-block justify-content-end" class="d-inline-block justify-content-end"
[isCurrency]="true" [isCurrency]="true"
[locale]="locale" [locale]="locale()"
[value]="element.value" [value]="element.value"
/> />
</td> </td>
@ -197,8 +197,8 @@
<gf-value <gf-value
class="d-inline-block justify-content-end" class="d-inline-block justify-content-end"
[isCurrency]="true" [isCurrency]="true"
[locale]="locale" [locale]="locale()"
[value]="totalValueInBaseCurrency" [value]="totalValueInBaseCurrency()"
/> />
</td> </td>
</ng-container> </ng-container>
@ -220,7 +220,7 @@
<gf-value <gf-value
class="d-inline-block justify-content-end" class="d-inline-block justify-content-end"
[isCurrency]="true" [isCurrency]="true"
[locale]="locale" [locale]="locale()"
[value]="element.valueInBaseCurrency" [value]="element.valueInBaseCurrency"
/> />
</td> </td>
@ -232,8 +232,8 @@
<gf-value <gf-value
class="d-inline-block justify-content-end" class="d-inline-block justify-content-end"
[isCurrency]="true" [isCurrency]="true"
[locale]="locale" [locale]="locale()"
[value]="totalValueInBaseCurrency" [value]="totalValueInBaseCurrency()"
/> />
</td> </td>
</ng-container> </ng-container>
@ -255,7 +255,7 @@
<gf-value <gf-value
class="d-inline-block justify-content-end" class="d-inline-block justify-content-end"
[isPercent]="true" [isPercent]="true"
[locale]="locale" [locale]="locale()"
[precision]="2" [precision]="2"
[value]="element.allocationInPercentage" [value]="element.allocationInPercentage"
/> />
@ -336,24 +336,24 @@
<td *matFooterCellDef class="px-1" mat-footer-cell></td> <td *matFooterCellDef class="px-1" mat-footer-cell></td>
</ng-container> </ng-container>
<tr *matHeaderRowDef="displayedColumns" mat-header-row></tr> <tr *matHeaderRowDef="displayedColumns()" mat-header-row></tr>
<tr <tr
*matRowDef="let row; columns: displayedColumns" *matRowDef="let row; columns: displayedColumns()"
mat-row mat-row
[ngClass]="{ [ngClass]="{
'cursor-pointer': hasPermissionToOpenDetails 'cursor-pointer': hasPermissionToOpenDetails()
}" }"
(click)="onOpenAccountDetailDialog(row.id)" (click)="onOpenAccountDetailDialog(row.id)"
></tr> ></tr>
<tr <tr
*matFooterRowDef="displayedColumns" *matFooterRowDef="displayedColumns()"
mat-footer-row mat-footer-row
[ngClass]="{ 'd-none': isLoading || !showFooter }" [ngClass]="{ 'd-none': isLoading() || !showFooter() }"
></tr> ></tr>
</table> </table>
</div> </div>
@if (isLoading) { @if (isLoading()) {
<ngx-skeleton-loader <ngx-skeleton-loader
animation="pulse" animation="pulse"
class="px-4 py-3" class="px-4 py-3"

3
libs/ui/src/lib/accounts-table/accounts-table.component.stories.ts

@ -111,7 +111,6 @@ export const Loading: Story = {
args: { args: {
accounts: undefined, accounts: undefined,
baseCurrency: 'USD', baseCurrency: 'USD',
deviceType: 'desktop',
hasPermissionToOpenDetails: false, hasPermissionToOpenDetails: false,
locale: 'en-US', locale: 'en-US',
showActions: false, showActions: false,
@ -129,7 +128,6 @@ export const Default: Story = {
accounts, accounts,
activitiesCount: 12, activitiesCount: 12,
baseCurrency: 'USD', baseCurrency: 'USD',
deviceType: 'desktop',
hasPermissionToOpenDetails: false, hasPermissionToOpenDetails: false,
locale: 'en-US', locale: 'en-US',
showActions: false, showActions: false,
@ -149,7 +147,6 @@ export const WithoutFooter: Story = {
accounts, accounts,
activitiesCount: 12, activitiesCount: 12,
baseCurrency: 'USD', baseCurrency: 'USD',
deviceType: 'desktop',
hasPermissionToOpenDetails: false, hasPermissionToOpenDetails: false,
locale: 'en-US', locale: 'en-US',
showActions: false, showActions: false,

161
libs/ui/src/lib/accounts-table/accounts-table.component.ts

@ -8,12 +8,12 @@ import { CommonModule } from '@angular/common';
import { import {
ChangeDetectionStrategy, ChangeDetectionStrategy,
Component, Component,
EventEmitter, computed,
Input, effect,
OnChanges, inject,
OnDestroy, input,
Output, output,
ViewChild viewChild
} from '@angular/core'; } from '@angular/core';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
import { MatMenuModule } from '@angular/material/menu'; import { MatMenuModule } from '@angular/material/menu';
@ -33,7 +33,6 @@ import {
walletOutline walletOutline
} from 'ionicons/icons'; } from 'ionicons/icons';
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
import { Subject, Subscription } from 'rxjs';
@Component({ @Component({
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
@ -53,95 +52,94 @@ import { Subject, Subscription } from 'rxjs';
styleUrls: ['./accounts-table.component.scss'], styleUrls: ['./accounts-table.component.scss'],
templateUrl: './accounts-table.component.html' templateUrl: './accounts-table.component.html'
}) })
export class GfAccountsTableComponent implements OnChanges, OnDestroy { export class GfAccountsTableComponent {
@Input() accounts: Account[]; public readonly accounts = input.required<Account[] | undefined>();
@Input() activitiesCount: number; public readonly activitiesCount = input<number>();
@Input() baseCurrency: string; public readonly baseCurrency = input<string>();
@Input() deviceType: string; public readonly hasPermissionToOpenDetails = input(true);
@Input() hasPermissionToOpenDetails = true; public readonly locale = input(getLocale());
@Input() locale = getLocale(); public readonly showActions = input<boolean>();
@Input() showActions: boolean; public readonly showActivitiesCount = input(true);
@Input() showActivitiesCount = true; public readonly showAllocationInPercentage = input<boolean>();
@Input() showAllocationInPercentage: boolean; public readonly showBalance = input(true);
@Input() showBalance = true; public readonly showFooter = input(true);
@Input() showFooter = true; public readonly showValue = input(true);
@Input() showValue = true; public readonly showValueInBaseCurrency = input(false);
@Input() showValueInBaseCurrency = true; public readonly totalBalanceInBaseCurrency = input<number>();
@Input() totalBalanceInBaseCurrency: number; public readonly totalValueInBaseCurrency = input<number>();
@Input() totalValueInBaseCurrency: number;
public readonly accountDeleted = output<string>();
@Output() accountDeleted = new EventEmitter<string>(); public readonly accountToUpdate = output<Account>();
@Output() accountToUpdate = new EventEmitter<Account>(); public readonly transferBalance = output<void>();
@Output() transferBalance = new EventEmitter<void>();
public readonly sort = viewChild.required(MatSort);
@ViewChild(MatSort) sort: MatSort;
public dataSource = new MatTableDataSource<Account>();
public displayedColumns = [];
public isLoading = true;
public routeQueryParams: Subscription;
private unsubscribeSubject = new Subject<void>();
public constructor(
private notificationService: NotificationService,
private router: Router
) {
addIcons({
arrowRedoOutline,
createOutline,
documentTextOutline,
ellipsisHorizontal,
eyeOffOutline,
trashOutline,
walletOutline
});
}
public ngOnChanges() { protected readonly dataSource = new MatTableDataSource<Account>([]);
this.displayedColumns = ['status', 'account', 'platform'];
if (this.showActivitiesCount) { protected readonly displayedColumns = computed(() => {
this.displayedColumns.push('activitiesCount'); const columns = ['status', 'account', 'platform'];
if (this.showActivitiesCount()) {
columns.push('activitiesCount');
} }
if (this.showBalance) { if (this.showBalance()) {
this.displayedColumns.push('balance'); columns.push('balance');
} }
if (this.showValue) { if (this.showValue()) {
this.displayedColumns.push('value'); columns.push('value');
} }
this.displayedColumns.push('currency'); columns.push('currency');
if (this.showValueInBaseCurrency) { if (this.showValueInBaseCurrency()) {
this.displayedColumns.push('valueInBaseCurrency'); columns.push('valueInBaseCurrency');
} }
if (this.showAllocationInPercentage) { if (this.showAllocationInPercentage()) {
this.displayedColumns.push('allocation'); columns.push('allocation');
} }
this.displayedColumns.push('comment'); columns.push('comment');
if (this.showActions) { if (this.showActions()) {
this.displayedColumns.push('actions'); columns.push('actions');
} }
this.isLoading = true; return columns;
});
protected readonly isLoading = computed(() => !this.accounts());
private readonly notificationService = inject(NotificationService);
private readonly router = inject(Router);
public constructor() {
addIcons({
arrowRedoOutline,
createOutline,
documentTextOutline,
ellipsisHorizontal,
eyeOffOutline,
trashOutline,
walletOutline
});
this.dataSource = new MatTableDataSource(this.accounts);
this.dataSource.sortingDataAccessor = getLowercase; this.dataSource.sortingDataAccessor = getLowercase;
this.dataSource.sort = this.sort; // Reactive data update
effect(() => {
this.dataSource.data = this.accounts();
});
if (this.accounts) { // Reactive view connection
this.isLoading = false; effect(() => {
} this.dataSource.sort = this.sort();
});
} }
public onDeleteAccount(aId: string) { protected onDeleteAccount(aId: string) {
this.notificationService.confirm({ this.notificationService.confirm({
confirmFn: () => { confirmFn: () => {
this.accountDeleted.emit(aId); this.accountDeleted.emit(aId);
@ -151,30 +149,25 @@ export class GfAccountsTableComponent implements OnChanges, OnDestroy {
}); });
} }
public onOpenAccountDetailDialog(accountId: string) { protected onOpenAccountDetailDialog(accountId: string) {
if (this.hasPermissionToOpenDetails) { if (this.hasPermissionToOpenDetails()) {
this.router.navigate([], { this.router.navigate([], {
queryParams: { accountId, accountDetailDialog: true } queryParams: { accountId, accountDetailDialog: true }
}); });
} }
} }
public onOpenComment(aComment: string) { protected onOpenComment(aComment: string) {
this.notificationService.alert({ this.notificationService.alert({
title: aComment title: aComment
}); });
} }
public onTransferBalance() { protected onTransferBalance() {
this.transferBalance.emit(); this.transferBalance.emit();
} }
public onUpdateAccount(aAccount: Account) { protected onUpdateAccount(aAccount: Account) {
this.accountToUpdate.emit(aAccount); this.accountToUpdate.emit(aAccount);
} }
public ngOnDestroy() {
this.unsubscribeSubject.next();
this.unsubscribeSubject.complete();
}
} }

26
libs/ui/src/lib/activities-table/activities-table.component.stories.ts

@ -59,7 +59,7 @@ const activities: Activity[] = [
SymbolProfile: { SymbolProfile: {
assetClass: 'EQUITY', assetClass: 'EQUITY',
assetSubClass: 'ETF', assetSubClass: 'ETF',
comment: null, comment: undefined,
countries: [], countries: [],
createdAt: new Date('2021-06-06T16:12:20.982Z'), createdAt: new Date('2021-06-06T16:12:20.982Z'),
currency: 'USD', currency: 'USD',
@ -74,12 +74,12 @@ const activities: Activity[] = [
isin: 'US9220427424', isin: 'US9220427424',
name: 'Vanguard Total World Stock Index Fund ETF Shares', name: 'Vanguard Total World Stock Index Fund ETF Shares',
updatedAt: new Date('2025-10-01T20:09:39.500Z'), updatedAt: new Date('2025-10-01T20:09:39.500Z'),
scraperConfiguration: null, scraperConfiguration: undefined,
sectors: [], sectors: [],
symbol: 'VT', symbol: 'VT',
symbolMapping: {}, symbolMapping: {},
url: 'https://www.vanguard.com', url: 'https://www.vanguard.com',
userId: null, userId: undefined,
activitiesCount: 267, activitiesCount: 267,
dateOfFirstActivity: new Date('2018-05-31T16:00:00.000Z') dateOfFirstActivity: new Date('2018-05-31T16:00:00.000Z')
}, },
@ -126,7 +126,7 @@ const activities: Activity[] = [
SymbolProfile: { SymbolProfile: {
assetClass: 'EQUITY', assetClass: 'EQUITY',
assetSubClass: 'ETF', assetSubClass: 'ETF',
comment: null, comment: undefined,
countries: [], countries: [],
createdAt: new Date('2021-06-06T16:12:20.982Z'), createdAt: new Date('2021-06-06T16:12:20.982Z'),
currency: 'USD', currency: 'USD',
@ -141,12 +141,12 @@ const activities: Activity[] = [
isin: 'US9220427424', isin: 'US9220427424',
name: 'Vanguard Total World Stock Index Fund ETF Shares', name: 'Vanguard Total World Stock Index Fund ETF Shares',
updatedAt: new Date('2025-10-01T20:09:39.500Z'), updatedAt: new Date('2025-10-01T20:09:39.500Z'),
scraperConfiguration: null, scraperConfiguration: undefined,
sectors: [], sectors: [],
symbol: 'VT', symbol: 'VT',
symbolMapping: {}, symbolMapping: {},
url: 'https://www.vanguard.com', url: 'https://www.vanguard.com',
userId: null, userId: undefined,
activitiesCount: 267, activitiesCount: 267,
dateOfFirstActivity: new Date('2018-05-31T16:00:00.000Z') dateOfFirstActivity: new Date('2018-05-31T16:00:00.000Z')
}, },
@ -193,7 +193,7 @@ const activities: Activity[] = [
SymbolProfile: { SymbolProfile: {
assetClass: 'LIQUIDITY', assetClass: 'LIQUIDITY',
assetSubClass: 'CRYPTOCURRENCY', assetSubClass: 'CRYPTOCURRENCY',
comment: null, comment: undefined,
countries: [], countries: [],
createdAt: new Date('2024-03-12T15:15:21.217Z'), createdAt: new Date('2024-03-12T15:15:21.217Z'),
currency: 'USD', currency: 'USD',
@ -208,12 +208,12 @@ const activities: Activity[] = [
isin: 'CA4639181029', isin: 'CA4639181029',
name: 'iShares Bitcoin Trust', name: 'iShares Bitcoin Trust',
updatedAt: new Date('2025-09-29T03:14:07.742Z'), updatedAt: new Date('2025-09-29T03:14:07.742Z'),
scraperConfiguration: null, scraperConfiguration: undefined,
sectors: [], sectors: [],
symbol: 'IBIT', symbol: 'IBIT',
symbolMapping: {}, symbolMapping: {},
url: 'https://www.ishares.com', url: 'https://www.ishares.com',
userId: null, userId: undefined,
activitiesCount: 6, activitiesCount: 6,
dateOfFirstActivity: new Date('2024-01-01T08:00:00.000Z') dateOfFirstActivity: new Date('2024-01-01T08:00:00.000Z')
}, },
@ -280,7 +280,7 @@ const activities: Activity[] = [
symbol: 'BNDW', symbol: 'BNDW',
symbolMapping: {}, symbolMapping: {},
url: 'https://vanguard.com', url: 'https://vanguard.com',
userId: null, userId: undefined,
activitiesCount: 38, activitiesCount: 38,
dateOfFirstActivity: new Date('2022-04-13T20:05:48.742Z') dateOfFirstActivity: new Date('2022-04-13T20:05:48.742Z')
}, },
@ -327,7 +327,7 @@ const activities: Activity[] = [
SymbolProfile: { SymbolProfile: {
assetClass: 'EQUITY', assetClass: 'EQUITY',
assetSubClass: 'ETF', assetSubClass: 'ETF',
comment: null, comment: undefined,
countries: [], countries: [],
createdAt: new Date('2021-06-06T16:12:20.982Z'), createdAt: new Date('2021-06-06T16:12:20.982Z'),
currency: 'USD', currency: 'USD',
@ -342,12 +342,12 @@ const activities: Activity[] = [
isin: 'US9220427424', isin: 'US9220427424',
name: 'Vanguard Total World Stock Index Fund ETF Shares', name: 'Vanguard Total World Stock Index Fund ETF Shares',
updatedAt: new Date('2025-10-01T20:09:39.500Z'), updatedAt: new Date('2025-10-01T20:09:39.500Z'),
scraperConfiguration: null, scraperConfiguration: undefined,
sectors: [], sectors: [],
symbol: 'VT', symbol: 'VT',
symbolMapping: {}, symbolMapping: {},
url: 'https://www.vanguard.com', url: 'https://www.vanguard.com',
userId: null, userId: undefined,
activitiesCount: 267, activitiesCount: 267,
dateOfFirstActivity: new Date('2018-05-31T16:00:00.000Z') dateOfFirstActivity: new Date('2018-05-31T16:00:00.000Z')
}, },

8
package-lock.json

@ -88,7 +88,7 @@
"stripe": "20.3.0", "stripe": "20.3.0",
"svgmap": "2.14.0", "svgmap": "2.14.0",
"tablemark": "4.1.0", "tablemark": "4.1.0",
"twitter-api-v2": "1.27.0", "twitter-api-v2": "1.29.0",
"yahoo-finance2": "3.13.0", "yahoo-finance2": "3.13.0",
"zone.js": "0.16.0" "zone.js": "0.16.0"
}, },
@ -33383,9 +33383,9 @@
} }
}, },
"node_modules/twitter-api-v2": { "node_modules/twitter-api-v2": {
"version": "1.27.0", "version": "1.29.0",
"resolved": "https://registry.npmjs.org/twitter-api-v2/-/twitter-api-v2-1.27.0.tgz", "resolved": "https://registry.npmjs.org/twitter-api-v2/-/twitter-api-v2-1.29.0.tgz",
"integrity": "sha512-hbIFwzg0NeOcFOdmJqtKMCXjLjc0INff/7NwhnZ2zpnw65oku8i+0eMxo5M0iTc1hs+inD/IpDw3S0Xh2c45QQ==", "integrity": "sha512-v473q5bwme4N+DWSg6qY+JCvfg1nSJRWwui3HUALafxfqCvVkKiYmS/5x/pVeJwTmyeBxexMbzHwnzrH4h6oYQ==",
"license": "Apache-2.0" "license": "Apache-2.0"
}, },
"node_modules/type-check": { "node_modules/type-check": {

2
package.json

@ -132,7 +132,7 @@
"stripe": "20.3.0", "stripe": "20.3.0",
"svgmap": "2.14.0", "svgmap": "2.14.0",
"tablemark": "4.1.0", "tablemark": "4.1.0",
"twitter-api-v2": "1.27.0", "twitter-api-v2": "1.29.0",
"yahoo-finance2": "3.13.0", "yahoo-finance2": "3.13.0",
"zone.js": "0.16.0" "zone.js": "0.16.0"
}, },

Loading…
Cancel
Save