Feature/upgrade to angular 16 (#2156)
* Upgrade Angular, NestJS and Nx * Replace executor to @nx/angular:webpack-browser and @nx/angular:webpack-dev-server * Add target for copying assets * Improve redirection of home page * Update changelog
This commit is contained in:
parent
c0f130a077
commit
43d0b55004
2
.github/workflows/build-code.yml
vendored
2
.github/workflows/build-code.yml
vendored
@ -33,4 +33,4 @@ jobs:
|
|||||||
run: yarn test
|
run: yarn test
|
||||||
|
|
||||||
- name: Build application
|
- name: Build application
|
||||||
run: yarn build:all
|
run: yarn build:production
|
||||||
|
13
CHANGELOG.md
13
CHANGELOG.md
@ -5,6 +5,19 @@ 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 a `copy-assets` `Nx` target to the client build
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Improved the redirection of the home page to the localized home page
|
||||||
|
- Upgraded `angular` from version `15.2.5` to `16.1.8`
|
||||||
|
- Upgraded `nestjs` from version `9.1.4` to `10.1.3`
|
||||||
|
- Upgraded `Nx` from version `16.0.3` to `16.5.5`
|
||||||
|
|
||||||
## 1.296.0 - 2023-08-01
|
## 1.296.0 - 2023-08-01
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
@ -33,7 +33,7 @@ COPY ./tsconfig.base.json tsconfig.base.json
|
|||||||
COPY ./libs libs
|
COPY ./libs libs
|
||||||
COPY ./apps apps
|
COPY ./apps apps
|
||||||
|
|
||||||
RUN yarn build:all
|
RUN yarn build:production
|
||||||
|
|
||||||
# Prepare the dist image with additional node_modules
|
# Prepare the dist image with additional node_modules
|
||||||
WORKDIR /ghostfolio/dist/apps/api
|
WORKDIR /ghostfolio/dist/apps/api
|
||||||
@ -58,4 +58,4 @@ RUN apt update && apt install -y \
|
|||||||
COPY --from=builder /ghostfolio/dist/apps /ghostfolio/apps
|
COPY --from=builder /ghostfolio/dist/apps /ghostfolio/apps
|
||||||
WORKDIR /ghostfolio/apps/api
|
WORKDIR /ghostfolio/apps/api
|
||||||
EXPOSE ${PORT:-3333}
|
EXPOSE ${PORT:-3333}
|
||||||
CMD [ "yarn", "start:prod" ]
|
CMD [ "yarn", "start:production" ]
|
||||||
|
@ -153,7 +153,6 @@ Please follow the instructions of the Ghostfolio [Unraid Community App](https://
|
|||||||
### Setup
|
### Setup
|
||||||
|
|
||||||
1. Run `yarn install`
|
1. Run `yarn install`
|
||||||
1. Run `yarn build:dev` to build the source code including the assets
|
|
||||||
1. Run `docker-compose --env-file ./.env -f docker/docker-compose.dev.yml up -d` to start [PostgreSQL](https://www.postgresql.org) and [Redis](https://redis.io)
|
1. Run `docker-compose --env-file ./.env -f docker/docker-compose.dev.yml up -d` to start [PostgreSQL](https://www.postgresql.org) and [Redis](https://redis.io)
|
||||||
1. Run `yarn database:setup` to initialize the database schema
|
1. Run `yarn database:setup` to initialize the database schema
|
||||||
1. Start the server and the client (see [_Development_](#Development))
|
1. Start the server and the client (see [_Development_](#Development))
|
||||||
|
@ -33,7 +33,7 @@
|
|||||||
"outputs": ["{options.outputPath}"]
|
"outputs": ["{options.outputPath}"]
|
||||||
},
|
},
|
||||||
"serve": {
|
"serve": {
|
||||||
"executor": "@nx/node:node",
|
"executor": "@nx/js:node",
|
||||||
"options": {
|
"options": {
|
||||||
"buildTarget": "api:build"
|
"buildTarget": "api:build"
|
||||||
}
|
}
|
||||||
|
@ -35,6 +35,11 @@ import { RedisCacheModule } from './redis-cache/redis-cache.module';
|
|||||||
import { SubscriptionModule } from './subscription/subscription.module';
|
import { SubscriptionModule } from './subscription/subscription.module';
|
||||||
import { SymbolModule } from './symbol/symbol.module';
|
import { SymbolModule } from './symbol/symbol.module';
|
||||||
import { UserModule } from './user/user.module';
|
import { UserModule } from './user/user.module';
|
||||||
|
import {
|
||||||
|
DEFAULT_LANGUAGE_CODE,
|
||||||
|
SUPPORTED_LANGUAGE_CODES
|
||||||
|
} from '@ghostfolio/common/config';
|
||||||
|
import { StatusCodes } from 'http-status-codes';
|
||||||
|
|
||||||
@Module({
|
@Module({
|
||||||
imports: [
|
imports: [
|
||||||
@ -71,14 +76,24 @@ import { UserModule } from './user/user.module';
|
|||||||
ScheduleModule.forRoot(),
|
ScheduleModule.forRoot(),
|
||||||
ServeStaticModule.forRoot({
|
ServeStaticModule.forRoot({
|
||||||
serveStaticOptions: {
|
serveStaticOptions: {
|
||||||
/*etag: false // Disable etag header to fix PWA
|
setHeaders: (res) => {
|
||||||
setHeaders: (res, path) => {
|
if (res.req?.path === '/') {
|
||||||
if (path.includes('ngsw.json')) {
|
let languageCode = DEFAULT_LANGUAGE_CODE;
|
||||||
// Disable cache (https://stackoverflow.com/questions/22632593/how-to-disable-webpage-caching-in-expressjs-nodejs/39775595)
|
|
||||||
// https://gertjans.home.xs4all.nl/javascript/cache-control.html#no-cache
|
try {
|
||||||
res.set('Cache-Control', 'no-cache, no-store, must-revalidate');
|
const code = res.req.headers['accept-language']
|
||||||
|
.split(',')[0]
|
||||||
|
.split('-')[0];
|
||||||
|
|
||||||
|
if (SUPPORTED_LANGUAGE_CODES.includes(code)) {
|
||||||
|
languageCode = code;
|
||||||
|
}
|
||||||
|
} catch {}
|
||||||
|
|
||||||
|
res.set('Location', `/${languageCode}`);
|
||||||
|
res.statusCode = StatusCodes.MOVED_PERMANENTLY;
|
||||||
}
|
}
|
||||||
}*/
|
}
|
||||||
},
|
},
|
||||||
rootPath: join(__dirname, '..', 'client'),
|
rootPath: join(__dirname, '..', 'client'),
|
||||||
exclude: ['/api*']
|
exclude: ['/api*']
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
import { Store } from 'cache-manager';
|
import { Store } from 'cache-manager';
|
||||||
import { RedisClient } from 'redis';
|
import { createClient } from 'redis';
|
||||||
|
|
||||||
export interface RedisStore extends Store {
|
export interface RedisStore extends Store {
|
||||||
getClient: () => RedisClient;
|
getClient: () => ReturnType<typeof createClient>;
|
||||||
isCacheableValue: (value: any) => boolean;
|
isCacheableValue: (value: any) => boolean;
|
||||||
name: 'redis';
|
name: 'redis';
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module';
|
import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module';
|
||||||
import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service';
|
import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service';
|
||||||
import { CacheManagerOptions, CacheModule, Module } from '@nestjs/common';
|
import { CacheModule } from '@nestjs/cache-manager';
|
||||||
import * as redisStore from 'cache-manager-redis-store';
|
import { Module } from '@nestjs/common';
|
||||||
|
import { redisStore } from 'cache-manager-redis-store';
|
||||||
|
import type { RedisClientOptions } from 'redis';
|
||||||
|
|
||||||
import { RedisCacheService } from './redis-cache.service';
|
import { RedisCacheService } from './redis-cache.service';
|
||||||
|
|
||||||
@ -11,7 +13,7 @@ import { RedisCacheService } from './redis-cache.service';
|
|||||||
imports: [ConfigurationModule],
|
imports: [ConfigurationModule],
|
||||||
inject: [ConfigurationService],
|
inject: [ConfigurationService],
|
||||||
useFactory: async (configurationService: ConfigurationService) => {
|
useFactory: async (configurationService: ConfigurationService) => {
|
||||||
return <CacheManagerOptions>{
|
return <RedisClientOptions>{
|
||||||
host: configurationService.get('REDIS_HOST'),
|
host: configurationService.get('REDIS_HOST'),
|
||||||
max: configurationService.get('MAX_ITEM_IN_CACHE'),
|
max: configurationService.get('MAX_ITEM_IN_CACHE'),
|
||||||
password: configurationService.get('REDIS_PASSWORD'),
|
password: configurationService.get('REDIS_PASSWORD'),
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service';
|
import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service';
|
||||||
import { getAssetProfileIdentifier } from '@ghostfolio/common/helper';
|
import { getAssetProfileIdentifier } from '@ghostfolio/common/helper';
|
||||||
import { UniqueAsset } from '@ghostfolio/common/interfaces';
|
import { UniqueAsset } from '@ghostfolio/common/interfaces';
|
||||||
import { CACHE_MANAGER, Inject, Injectable, Logger } from '@nestjs/common';
|
import { CACHE_MANAGER } from '@nestjs/cache-manager';
|
||||||
|
import { Inject, Injectable, Logger } from '@nestjs/common';
|
||||||
|
|
||||||
import type { RedisCache } from './interfaces/redis-cache.interface';
|
import type { RedisCache } from './interfaces/redis-cache.interface';
|
||||||
|
|
||||||
@ -35,8 +36,10 @@ export class RedisCacheService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public async set(key: string, value: string, ttlInSeconds?: number) {
|
public async set(key: string, value: string, ttlInSeconds?: number) {
|
||||||
await this.cache.set(key, value, {
|
await this.cache.set(
|
||||||
ttl: ttlInSeconds ?? this.configurationService.get('CACHE_TTL')
|
key,
|
||||||
});
|
value,
|
||||||
|
ttlInSeconds ?? this.configurationService.get('CACHE_TTL')
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
"outDir": "../../dist/out-tsc",
|
"outDir": "../../dist/out-tsc",
|
||||||
"types": ["node"],
|
"types": ["node"],
|
||||||
"emitDecoratorMetadata": true,
|
"emitDecoratorMetadata": true,
|
||||||
"target": "es2015"
|
"target": "es2021"
|
||||||
},
|
},
|
||||||
"exclude": ["**/*.spec.ts", "**/*.test.ts", "jest.config.ts"],
|
"exclude": ["**/*.spec.ts", "**/*.test.ts", "jest.config.ts"],
|
||||||
"include": ["**/*.ts"]
|
"include": ["**/*.ts"]
|
||||||
|
@ -11,60 +11,15 @@
|
|||||||
"prefix": "gf",
|
"prefix": "gf",
|
||||||
"targets": {
|
"targets": {
|
||||||
"build": {
|
"build": {
|
||||||
"executor": "@angular-devkit/build-angular:browser",
|
"executor": "@nx/angular:webpack-browser",
|
||||||
"options": {
|
"options": {
|
||||||
|
"localize": true,
|
||||||
"outputPath": "dist/apps/client",
|
"outputPath": "dist/apps/client",
|
||||||
"index": "apps/client/src/index.html",
|
"index": "apps/client/src/index.html",
|
||||||
"main": "apps/client/src/main.ts",
|
"main": "apps/client/src/main.ts",
|
||||||
"polyfills": "apps/client/src/polyfills.ts",
|
"polyfills": "apps/client/src/polyfills.ts",
|
||||||
"tsConfig": "apps/client/tsconfig.app.json",
|
"tsConfig": "apps/client/tsconfig.app.json",
|
||||||
"assets": [
|
"assets": [],
|
||||||
{
|
|
||||||
"glob": "assetlinks.json",
|
|
||||||
"input": "apps/client/src/assets",
|
|
||||||
"output": "./../.well-known"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"glob": "CHANGELOG.md",
|
|
||||||
"input": "",
|
|
||||||
"output": "./../assets"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"glob": "favicon.ico",
|
|
||||||
"input": "apps/client/src/assets",
|
|
||||||
"output": "./../"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"glob": "LICENSE",
|
|
||||||
"input": "",
|
|
||||||
"output": "./../assets"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"glob": "robots.txt",
|
|
||||||
"input": "apps/client/src/assets",
|
|
||||||
"output": "./../"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"glob": "site.webmanifest",
|
|
||||||
"input": "apps/client/src/assets",
|
|
||||||
"output": "./../"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"glob": "**/*",
|
|
||||||
"input": "node_modules/ionicons/dist/ionicons",
|
|
||||||
"output": "./../ionicons"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"glob": "**/*.js",
|
|
||||||
"input": "node_modules/ionicons/dist/",
|
|
||||||
"output": "./../"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"glob": "**/*",
|
|
||||||
"input": "apps/client/src/assets",
|
|
||||||
"output": "./../assets/"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"styles": [
|
"styles": [
|
||||||
"apps/client/src/styles/theme.scss",
|
"apps/client/src/styles/theme.scss",
|
||||||
"apps/client/src/styles.scss"
|
"apps/client/src/styles.scss"
|
||||||
@ -139,8 +94,48 @@
|
|||||||
"outputs": ["{options.outputPath}"],
|
"outputs": ["{options.outputPath}"],
|
||||||
"defaultConfiguration": ""
|
"defaultConfiguration": ""
|
||||||
},
|
},
|
||||||
|
"copy-assets": {
|
||||||
|
"executor": "nx:run-commands",
|
||||||
|
"options": {
|
||||||
|
"commands": [
|
||||||
|
{
|
||||||
|
"command": "mkdir -p dist/apps/client"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"command": "cp -r apps/client/src/assets dist/apps/client"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"command": "cp -r apps/client/src/assets/.well-known dist/apps/client"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"command": "cp apps/client/src/assets/favicon.ico dist/apps/client"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"command": "cp apps/client/src/assets/robots.txt dist/apps/client"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"command": "cp apps/client/src/assets/site.webmanifest dist/apps/client"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"command": "cp node_modules/ionicons/dist/index.js dist/apps/client"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"command": "cp node_modules/ionicons/dist/ionicons.js dist/apps/client"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"command": "cp -r node_modules/ionicons/dist/ionicons dist/apps/client/ionicons"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"command": "cp CHANGELOG.md dist/apps/client/assets"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"command": "cp LICENSE dist/apps/client/assets"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
"serve": {
|
"serve": {
|
||||||
"executor": "@angular-devkit/build-angular:dev-server",
|
"executor": "@nx/angular:webpack-dev-server",
|
||||||
"options": {
|
"options": {
|
||||||
"browserTarget": "client:build",
|
"browserTarget": "client:build",
|
||||||
"proxyConfig": "apps/client/proxy.conf.json"
|
"proxyConfig": "apps/client/proxy.conf.json"
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
import { Injectable } from '@angular/core';
|
import { Injectable } from '@angular/core';
|
||||||
import {
|
import {
|
||||||
ActivatedRouteSnapshot,
|
ActivatedRouteSnapshot,
|
||||||
CanActivate,
|
|
||||||
Router,
|
Router,
|
||||||
RouterStateSnapshot
|
RouterStateSnapshot
|
||||||
} from '@angular/router';
|
} from '@angular/router';
|
||||||
@ -12,7 +11,7 @@ import { EMPTY } from 'rxjs';
|
|||||||
import { catchError } from 'rxjs/operators';
|
import { catchError } from 'rxjs/operators';
|
||||||
|
|
||||||
@Injectable({ providedIn: 'root' })
|
@Injectable({ providedIn: 'root' })
|
||||||
export class AuthGuard implements CanActivate {
|
export class AuthGuard {
|
||||||
private static PUBLIC_PAGE_ROUTES = [
|
private static PUBLIC_PAGE_ROUTES = [
|
||||||
'/about',
|
'/about',
|
||||||
'/about/changelog',
|
'/about/changelog',
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"outDir": "../../dist/out-tsc",
|
"outDir": "../../dist/out-tsc",
|
||||||
"types": ["node"],
|
"types": ["node"],
|
||||||
"typeRoots": ["../node_modules/@types"],
|
"typeRoots": ["../../node_modules/@types"],
|
||||||
"target": "ES2022",
|
"target": "ES2022",
|
||||||
"useDefineForClassFields": false
|
"useDefineForClassFields": false
|
||||||
},
|
},
|
||||||
|
@ -91,4 +91,14 @@ export const QUEUE_JOB_STATUS_LIST = <JobStatus[]>[
|
|||||||
'waiting'
|
'waiting'
|
||||||
];
|
];
|
||||||
|
|
||||||
|
export const SUPPORTED_LANGUAGE_CODES = [
|
||||||
|
'de',
|
||||||
|
'en',
|
||||||
|
'es',
|
||||||
|
'fr',
|
||||||
|
'it',
|
||||||
|
'nl',
|
||||||
|
'pt'
|
||||||
|
];
|
||||||
|
|
||||||
export const UNKNOWN_KEY = 'UNKNOWN';
|
export const UNKNOWN_KEY = 'UNKNOWN';
|
||||||
|
7
nx.json
7
nx.json
@ -50,7 +50,8 @@
|
|||||||
"default",
|
"default",
|
||||||
"^production",
|
"^production",
|
||||||
"{workspaceRoot}/.storybook/**/*",
|
"{workspaceRoot}/.storybook/**/*",
|
||||||
"!{projectRoot}/.storybook/**/*"
|
"{projectRoot}/.storybook/**/*",
|
||||||
|
"{projectRoot}/tsconfig.storybook.json"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -67,7 +68,9 @@
|
|||||||
"!{projectRoot}/tsconfig.spec.json",
|
"!{projectRoot}/tsconfig.spec.json",
|
||||||
"!{projectRoot}/jest.config.[jt]s",
|
"!{projectRoot}/jest.config.[jt]s",
|
||||||
"!{projectRoot}/.storybook/**/*",
|
"!{projectRoot}/.storybook/**/*",
|
||||||
"!{projectRoot}/**/*.stories.@(js|jsx|ts|tsx|mdx)"
|
"!{projectRoot}/**/*.stories.@(js|jsx|ts|tsx|mdx)",
|
||||||
|
"!{projectRoot}/tsconfig.storybook.json",
|
||||||
|
"!{projectRoot}/src/test-setup.[jt]s"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
123
package.json
123
package.json
@ -13,8 +13,8 @@
|
|||||||
"affected:lint": "nx affected:lint",
|
"affected:lint": "nx affected:lint",
|
||||||
"affected:test": "nx affected:test",
|
"affected:test": "nx affected:test",
|
||||||
"angular": "node --max_old_space_size=32768 ./node_modules/@angular/cli/bin/ng",
|
"angular": "node --max_old_space_size=32768 ./node_modules/@angular/cli/bin/ng",
|
||||||
"build:all": "nx run api:build:production && nx run client:build:production --localize && yarn replace-placeholders-in-build",
|
"build:dev": "nx run api:build && nx run client:build && nx run client:copy-assets && yarn replace-placeholders-in-build",
|
||||||
"build:dev": "nx run api:build && nx run client:build --localize && yarn replace-placeholders-in-build",
|
"build:production": "nx run api:build:production && nx run client:build:production && nx run client:copy-assets && yarn replace-placeholders-in-build",
|
||||||
"build:storybook": "nx run ui:build-storybook",
|
"build:storybook": "nx run ui:build-storybook",
|
||||||
"database:format-schema": "prisma format",
|
"database:format-schema": "prisma format",
|
||||||
"database:generate-typings": "prisma generate",
|
"database:generate-typings": "prisma generate",
|
||||||
@ -36,11 +36,11 @@
|
|||||||
"lint": "nx workspace-lint && ng lint",
|
"lint": "nx workspace-lint && ng lint",
|
||||||
"ng": "nx",
|
"ng": "nx",
|
||||||
"nx": "nx",
|
"nx": "nx",
|
||||||
"postinstall": "prisma generate && ngcc --properties es2020 browser module main",
|
"postinstall": "prisma generate",
|
||||||
"replace-placeholders-in-build": "node ./replace.build.js",
|
"replace-placeholders-in-build": "node ./replace.build.js",
|
||||||
"start": "node dist/apps/api/main",
|
"start": "node dist/apps/api/main",
|
||||||
"start:client": "nx run client:serve --configuration=development-en --hmr -o",
|
"start:client": "nx run client:copy-assets && nx run client:serve --configuration=development-en --hmr -o",
|
||||||
"start:prod": "yarn database:migrate && yarn database:seed && node main",
|
"start:production": "yarn database:migrate && yarn database:seed && node main",
|
||||||
"start:server": "nx run api:serve --watch",
|
"start:server": "nx run api:serve --watch",
|
||||||
"start:storybook": "nx run ui:storybook",
|
"start:storybook": "nx run ui:storybook",
|
||||||
"test": "npx dotenv-cli -e .env.example -- nx test",
|
"test": "npx dotenv-cli -e .env.example -- nx test",
|
||||||
@ -52,17 +52,17 @@
|
|||||||
"workspace-generator": "nx workspace-generator"
|
"workspace-generator": "nx workspace-generator"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@angular/animations": "15.2.5",
|
"@angular/animations": "16.1.8",
|
||||||
"@angular/cdk": "15.2.6",
|
"@angular/cdk": "16.1.7",
|
||||||
"@angular/common": "15.2.5",
|
"@angular/common": "16.1.8",
|
||||||
"@angular/compiler": "15.2.5",
|
"@angular/compiler": "16.1.8",
|
||||||
"@angular/core": "15.2.5",
|
"@angular/core": "16.1.8",
|
||||||
"@angular/forms": "15.2.5",
|
"@angular/forms": "16.1.8",
|
||||||
"@angular/material": "15.2.6",
|
"@angular/material": "16.1.7",
|
||||||
"@angular/platform-browser": "15.2.5",
|
"@angular/platform-browser": "16.1.8",
|
||||||
"@angular/platform-browser-dynamic": "15.2.5",
|
"@angular/platform-browser-dynamic": "16.1.8",
|
||||||
"@angular/router": "15.2.5",
|
"@angular/router": "16.1.8",
|
||||||
"@angular/service-worker": "15.2.5",
|
"@angular/service-worker": "16.1.8",
|
||||||
"@codewithdan/observable-store": "2.2.15",
|
"@codewithdan/observable-store": "2.2.15",
|
||||||
"@dfinity/agent": "0.15.7",
|
"@dfinity/agent": "0.15.7",
|
||||||
"@dfinity/auth-client": "0.15.7",
|
"@dfinity/auth-client": "0.15.7",
|
||||||
@ -70,15 +70,16 @@
|
|||||||
"@dfinity/identity": "0.15.7",
|
"@dfinity/identity": "0.15.7",
|
||||||
"@dfinity/principal": "0.15.7",
|
"@dfinity/principal": "0.15.7",
|
||||||
"@dinero.js/currencies": "2.0.0-alpha.8",
|
"@dinero.js/currencies": "2.0.0-alpha.8",
|
||||||
"@nestjs/bull": "0.6.3",
|
"@nestjs/bull": "10.0.1",
|
||||||
"@nestjs/common": "9.1.4",
|
"@nestjs/cache-manager": "2.1.0",
|
||||||
"@nestjs/config": "2.2.0",
|
"@nestjs/common": "10.1.3",
|
||||||
"@nestjs/core": "9.1.4",
|
"@nestjs/config": "3.0.0",
|
||||||
"@nestjs/jwt": "9.0.0",
|
"@nestjs/core": "10.1.3",
|
||||||
"@nestjs/passport": "9.0.0",
|
"@nestjs/jwt": "10.1.0",
|
||||||
"@nestjs/platform-express": "9.1.4",
|
"@nestjs/passport": "10.0.0",
|
||||||
"@nestjs/schedule": "2.1.0",
|
"@nestjs/platform-express": "10.1.3",
|
||||||
"@nestjs/serve-static": "3.0.0",
|
"@nestjs/schedule": "3.0.2",
|
||||||
|
"@nestjs/serve-static": "4.0.0",
|
||||||
"@prisma/client": "4.16.2",
|
"@prisma/client": "4.16.2",
|
||||||
"@simplewebauthn/browser": "5.2.1",
|
"@simplewebauthn/browser": "5.2.1",
|
||||||
"@simplewebauthn/server": "5.2.1",
|
"@simplewebauthn/server": "5.2.1",
|
||||||
@ -89,8 +90,8 @@
|
|||||||
"body-parser": "1.20.1",
|
"body-parser": "1.20.1",
|
||||||
"bootstrap": "4.6.0",
|
"bootstrap": "4.6.0",
|
||||||
"bull": "4.10.4",
|
"bull": "4.10.4",
|
||||||
"cache-manager": "3.4.3",
|
"cache-manager": "5.2.3",
|
||||||
"cache-manager-redis-store": "2.0.0",
|
"cache-manager-redis-store": "3.0.1",
|
||||||
"chart.js": "4.2.0",
|
"chart.js": "4.2.0",
|
||||||
"chartjs-adapter-date-fns": "3.0.0",
|
"chartjs-adapter-date-fns": "3.0.0",
|
||||||
"chartjs-plugin-annotation": "2.1.2",
|
"chartjs-plugin-annotation": "2.1.2",
|
||||||
@ -128,37 +129,37 @@
|
|||||||
"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.3",
|
||||||
"zone.js": "0.12.0"
|
"zone.js": "0.13.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@angular-devkit/build-angular": "15.2.5",
|
"@angular-devkit/build-angular": "16.1.8",
|
||||||
"@angular-devkit/core": "15.2.5",
|
"@angular-devkit/core": "16.1.8",
|
||||||
"@angular-devkit/schematics": "15.2.5",
|
"@angular-devkit/schematics": "16.1.8",
|
||||||
"@angular-eslint/eslint-plugin": "15.2.0",
|
"@angular-eslint/eslint-plugin": "16.0.3",
|
||||||
"@angular-eslint/eslint-plugin-template": "15.2.0",
|
"@angular-eslint/eslint-plugin-template": "16.0.3",
|
||||||
"@angular-eslint/template-parser": "15.2.0",
|
"@angular-eslint/template-parser": "16.0.3",
|
||||||
"@angular/cli": "15.2.5",
|
"@angular/cli": "16.1.8",
|
||||||
"@angular/compiler-cli": "15.2.5",
|
"@angular/compiler-cli": "16.1.8",
|
||||||
"@angular/language-service": "15.2.5",
|
"@angular/language-service": "16.1.8",
|
||||||
"@angular/localize": "15.2.5",
|
"@angular/localize": "16.1.8",
|
||||||
"@angular/pwa": "15.2.5",
|
"@angular/pwa": "16.1.8",
|
||||||
"@nestjs/schematics": "9.1.0",
|
"@nestjs/schematics": "10.0.1",
|
||||||
"@nestjs/testing": "9.4.0",
|
"@nestjs/testing": "10.1.3",
|
||||||
"@nx/angular": "16.0.3",
|
"@nx/angular": "16.5.5",
|
||||||
"@nx/cypress": "16.0.3",
|
"@nx/cypress": "16.5.5",
|
||||||
"@nx/eslint-plugin": "16.0.3",
|
"@nx/eslint-plugin": "16.5.5",
|
||||||
"@nx/jest": "16.0.3",
|
"@nx/jest": "16.5.5",
|
||||||
"@nx/js": "16.0.3",
|
"@nx/js": "16.5.5",
|
||||||
"@nx/nest": "16.0.3",
|
"@nx/nest": "16.5.5",
|
||||||
"@nx/node": "16.0.3",
|
"@nx/node": "16.5.5",
|
||||||
"@nx/storybook": "16.0.3",
|
"@nx/storybook": "16.5.5",
|
||||||
"@nx/web": "16.0.3",
|
"@nx/web": "16.5.5",
|
||||||
"@nx/workspace": "16.0.3",
|
"@nx/workspace": "16.5.5",
|
||||||
"@schematics/angular": "15.2.5",
|
"@schematics/angular": "16.1.8",
|
||||||
"@simplewebauthn/typescript-types": "5.2.1",
|
"@simplewebauthn/typescript-types": "5.2.1",
|
||||||
"@storybook/addon-essentials": "7.0.9",
|
"@storybook/addon-essentials": "7.0.27",
|
||||||
"@storybook/angular": "7.0.9",
|
"@storybook/angular": "7.0.27",
|
||||||
"@storybook/core-server": "7.0.9",
|
"@storybook/core-server": "7.0.27",
|
||||||
"@types/big.js": "6.1.6",
|
"@types/big.js": "6.1.6",
|
||||||
"@types/body-parser": "1.19.2",
|
"@types/body-parser": "1.19.2",
|
||||||
"@types/cache-manager": "3.4.2",
|
"@types/cache-manager": "3.4.2",
|
||||||
@ -167,7 +168,7 @@
|
|||||||
"@types/jest": "29.4.4",
|
"@types/jest": "29.4.4",
|
||||||
"@types/lodash": "4.14.195",
|
"@types/lodash": "4.14.195",
|
||||||
"@types/marked": "4.0.8",
|
"@types/marked": "4.0.8",
|
||||||
"@types/node": "18.11.18",
|
"@types/node": "20.4.2",
|
||||||
"@types/papaparse": "5.3.7",
|
"@types/papaparse": "5.3.7",
|
||||||
"@types/passport-google-oauth20": "2.0.11",
|
"@types/passport-google-oauth20": "2.0.11",
|
||||||
"@typescript-eslint/eslint-plugin": "5.51.0",
|
"@typescript-eslint/eslint-plugin": "5.51.0",
|
||||||
@ -184,9 +185,9 @@
|
|||||||
"import-sort-style-module": "6.0.0",
|
"import-sort-style-module": "6.0.0",
|
||||||
"jest": "29.4.3",
|
"jest": "29.4.3",
|
||||||
"jest-environment-jsdom": "29.4.3",
|
"jest-environment-jsdom": "29.4.3",
|
||||||
"jest-preset-angular": "13.0.0",
|
"jest-preset-angular": "13.1.1",
|
||||||
"nx": "16.0.3",
|
"nx": "16.5.5",
|
||||||
"nx-cloud": "16.0.5",
|
"nx-cloud": "16.1.1",
|
||||||
"prettier": "2.8.4",
|
"prettier": "2.8.4",
|
||||||
"prettier-plugin-organize-attributes": "0.0.5",
|
"prettier-plugin-organize-attributes": "0.0.5",
|
||||||
"react": "18.2.0",
|
"react": "18.2.0",
|
||||||
@ -195,8 +196,8 @@
|
|||||||
"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",
|
||||||
"tslib": "2.0.0",
|
"tslib": "2.6.0",
|
||||||
"typescript": "4.9.5"
|
"typescript": "5.1.6"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=18"
|
"node": ">=18"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user