From b101ccf6b6b5f9ccbaf1ab0cef56f29462e0b865 Mon Sep 17 00:00:00 2001 From: Peter Rossa Date: Wed, 10 May 2023 15:02:48 +0200 Subject: [PATCH] Init webapp --- rossa-tech-cli/README.md | 4 +- rossa-tech-cli/angular.json | 25 +- rossa-tech-cli/karma.conf.sj | 44 + rossa-tech-cli/package-lock.json | 1554 ++++++++++------- rossa-tech-cli/package.json | 28 +- rossa-tech-cli/src/app/app-routing.module.ts | 25 +- rossa-tech-cli/src/app/app.component.css | 0 rossa-tech-cli/src/app/app.component.html | 2 +- rossa-tech-cli/src/app/app.component.spec.ts | 28 +- rossa-tech-cli/src/app/app.component.ts | 10 +- rossa-tech-cli/src/app/app.module.ts | 82 +- rossa-tech-cli/src/app/auth/auth.guard.ts | 32 + rossa-tech-cli/src/app/auth/auth.service.ts | 30 + rossa-tech-cli/src/app/auth/login.service.ts | 99 ++ .../dashboard/dashboard.component.ts | 52 +- .../components/header/header.component.html | 7 +- .../app/components/header/header.component.ts | 76 +- .../components/indexPage/index.component.css | 3 + .../components/indexPage/index.component.html | 28 + .../components/indexPage/index.component.ts | 90 + .../components/loginPage/login.component.html | 23 + .../components/loginPage/login.component.scss | 17 + .../components/loginPage/login.component.ts | 95 + .../snackbar/snackbar-component.scss | 42 + .../snackbar/snackbar.component.html | 7 + .../components/snackbar/snackbar.component.ts | 30 + .../consumption-last-year.component.html | 47 +- .../consumption-last-year.component.ts | 42 +- .../meter-data-list.component.html | 2 - .../meter-data-list.component.ts | 22 +- .../meter-data-wrapper.component.ts | 20 +- rossa-tech-cli/src/app/dataModels/Meter.ts | 16 + .../src/app/dataModels/Meterdata.ts | 23 + .../src/app/dataModels/UsageType.ts | 4 + .../src/app/dataModels/gameTitle.type.ts | 49 + rossa-tech-cli/src/app/dataModels/info.md | 15 + .../src/app/dataModels/loginUser.type.ts | 19 + .../src/app/dataModels/userRole.type.ts | 19 + .../meter-data-add-dialog.component.html | 25 + .../meter-data-add-dialog.component.scss | 0 .../meter-data-add-dialog.component.spec.ts | 23 + .../meter-data-add-dialog.component.ts | 64 + .../src/app/services/database.service.ts | 36 +- .../src/app/services/error.service.ts | 63 + .../src/app/services/forms.service.ts | 23 + .../src/app/services/gameTitles.service.ts | 25 + .../src/app/services/global.service.ts | 6 +- .../src/app/services/notification.service.ts | 71 + .../src/app/services/pageSecurity.service.ts | 28 + rossa-tech-cli/src/custom-theme.scss | 146 ++ .../src/environments/environment.prod.ts | 4 +- .../src/environments/environment.ts | 11 +- rossa-tech-cli/src/index.html | 4 +- rossa-tech-cli/src/main.ts | 5 + rossa-tech-cli/src/polyfills.ts | 53 + rossa-tech-cli/src/styles.scss | 395 +---- rossa-tech-cli/src/test.ts | 14 + rossa-tech-cli/tsconfig.app.json | 3 +- rossa-tech-cli/tsconfig.json | 11 +- rossa-tech-cli/tsconfig.spec.json | 4 + 60 files changed, 2519 insertions(+), 1206 deletions(-) create mode 100644 rossa-tech-cli/karma.conf.sj create mode 100644 rossa-tech-cli/src/app/app.component.css create mode 100644 rossa-tech-cli/src/app/auth/auth.guard.ts create mode 100644 rossa-tech-cli/src/app/auth/auth.service.ts create mode 100644 rossa-tech-cli/src/app/auth/login.service.ts create mode 100644 rossa-tech-cli/src/app/components/indexPage/index.component.css create mode 100644 rossa-tech-cli/src/app/components/indexPage/index.component.html create mode 100644 rossa-tech-cli/src/app/components/indexPage/index.component.ts create mode 100644 rossa-tech-cli/src/app/components/loginPage/login.component.html create mode 100644 rossa-tech-cli/src/app/components/loginPage/login.component.scss create mode 100644 rossa-tech-cli/src/app/components/loginPage/login.component.ts create mode 100644 rossa-tech-cli/src/app/components/snackbar/snackbar-component.scss create mode 100644 rossa-tech-cli/src/app/components/snackbar/snackbar.component.html create mode 100644 rossa-tech-cli/src/app/components/snackbar/snackbar.component.ts create mode 100644 rossa-tech-cli/src/app/dataModels/Meter.ts create mode 100644 rossa-tech-cli/src/app/dataModels/Meterdata.ts create mode 100644 rossa-tech-cli/src/app/dataModels/UsageType.ts create mode 100644 rossa-tech-cli/src/app/dataModels/gameTitle.type.ts create mode 100644 rossa-tech-cli/src/app/dataModels/info.md create mode 100644 rossa-tech-cli/src/app/dataModels/loginUser.type.ts create mode 100644 rossa-tech-cli/src/app/dataModels/userRole.type.ts create mode 100644 rossa-tech-cli/src/app/dialogs/meter-data-add-dialog/meter-data-add-dialog.component.html create mode 100644 rossa-tech-cli/src/app/dialogs/meter-data-add-dialog/meter-data-add-dialog.component.scss create mode 100644 rossa-tech-cli/src/app/dialogs/meter-data-add-dialog/meter-data-add-dialog.component.spec.ts create mode 100644 rossa-tech-cli/src/app/dialogs/meter-data-add-dialog/meter-data-add-dialog.component.ts create mode 100644 rossa-tech-cli/src/app/services/error.service.ts create mode 100644 rossa-tech-cli/src/app/services/forms.service.ts create mode 100644 rossa-tech-cli/src/app/services/gameTitles.service.ts create mode 100644 rossa-tech-cli/src/app/services/notification.service.ts create mode 100644 rossa-tech-cli/src/app/services/pageSecurity.service.ts create mode 100644 rossa-tech-cli/src/custom-theme.scss create mode 100644 rossa-tech-cli/src/polyfills.ts create mode 100644 rossa-tech-cli/src/test.ts diff --git a/rossa-tech-cli/README.md b/rossa-tech-cli/README.md index d501401..bdbc75a 100644 --- a/rossa-tech-cli/README.md +++ b/rossa-tech-cli/README.md @@ -1,6 +1,6 @@ -# RossaTechCli +# RossaTechApp -This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 15.1.6. +This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 14.1.1. ## Development server diff --git a/rossa-tech-cli/angular.json b/rossa-tech-cli/angular.json index d4a50cb..1d2fa29 100644 --- a/rossa-tech-cli/angular.json +++ b/rossa-tech-cli/angular.json @@ -20,7 +20,7 @@ "outputPath": "dist/rossa-tech-cli", "index": "src/index.html", "main": "src/main.ts", - "polyfills": ["zone.js"], + "polyfills": "src/polyfills.ts", "tsConfig": "tsconfig.app.json", "inlineStyleLanguage": "scss", "assets": [ @@ -32,7 +32,7 @@ "output": "./assets" } ], - "styles": ["src/styles.scss"], + "styles": ["src/custom-theme.scss", "src/styles.scss"], "scripts": [] }, "configurations": { @@ -40,22 +40,22 @@ "budgets": [ { "type": "initial", - "maximumWarning": "500kb", - "maximumError": "1mb" + "maximumWarning": "100mb", + "maximumError": "300mb" }, { "type": "anyComponentStyle", - "maximumWarning": "2kb", - "maximumError": "4kb" + "maximumWarning": "50mb", + "maximumError": "100mb" } ], - "outputHashing": "all", "fileReplacements": [ { "replace": "src/environments/environment.ts", "with": "src/environments/environment.prod.ts" } - ] + ], + "outputHashing": "all" }, "development": { "buildOptimizer": false, @@ -70,10 +70,6 @@ }, "serve": { "builder": "@angular-devkit/build-angular:dev-server", - "options": { - "browserTarget": "rossa-tech-cli:build", - "proxyConfig": "src/proxy.conf.json" - }, "configurations": { "production": { "browserTarget": "rossa-tech-cli:build:production" @@ -93,8 +89,10 @@ "test": { "builder": "@angular-devkit/build-angular:karma", "options": { + "main": "src/test.ts", "polyfills": ["zone.js", "zone.js/testing"], "tsConfig": "tsconfig.spec.json", + "karmaConfig": "karma.conf.js", "inlineStyleLanguage": "scss", "assets": ["src/favicon.ico", "src/assets"], "styles": ["src/styles.scss"], @@ -103,5 +101,8 @@ } } } + }, + "cli": { + "analytics": false } } diff --git a/rossa-tech-cli/karma.conf.sj b/rossa-tech-cli/karma.conf.sj new file mode 100644 index 0000000..e5df58f --- /dev/null +++ b/rossa-tech-cli/karma.conf.sj @@ -0,0 +1,44 @@ +// Karma configuration file, see link for more information +// https://karma-runner.github.io/1.0/config/configuration-file.html + +module.exports = function (config) { + config.set({ + basePath: '', + frameworks: ['jasmine', '@angular-devkit/build-angular'], + plugins: [ + require('karma-jasmine'), + require('karma-chrome-launcher'), + require('karma-jasmine-html-reporter'), + require('karma-coverage'), + require('@angular-devkit/build-angular/plugins/karma') + ], + client: { + jasmine: { + // you can add configuration options for Jasmine here + // the possible options are listed at https://jasmine.github.io/api/edge/Configuration.html + // for example, you can disable the random execution with `random: false` + // or set a specific seed with `seed: 4321` + }, + clearContext: false // leave Jasmine Spec Runner output visible in browser + }, + jasmineHtmlReporter: { + suppressAll: true // removes the duplicated traces + }, + coverageReporter: { + dir: require('path').join(__dirname, './coverage/rossa-tech'), + subdir: '.', + reporters: [ + { type: 'html' }, + { type: 'text-summary' } + ] + }, + reporters: ['progress', 'kjhtml'], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['Chrome'], + singleRun: false, + restartOnFileChange: true + }); +}; diff --git a/rossa-tech-cli/package-lock.json b/rossa-tech-cli/package-lock.json index d30784f..a6ff158 100644 --- a/rossa-tech-cli/package-lock.json +++ b/rossa-tech-cli/package-lock.json @@ -1,40 +1,41 @@ { - "name": "rossa-tech-cli", + "name": "rossa-tech", "version": "0.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "rossa-tech-cli", + "name": "rossa-tech", "version": "0.0.0", "dependencies": { - "@angular/animations": "^15.1.0", - "@angular/cdk": "^15.2.4", - "@angular/common": "^15.1.0", - "@angular/compiler": "^15.1.0", - "@angular/core": "^15.1.0", - "@angular/forms": "^15.1.0", - "@angular/material": "^15.2.4", - "@angular/platform-browser": "^15.1.0", - "@angular/platform-browser-dynamic": "^15.1.0", - "@angular/router": "^15.1.0", + "@angular/animations": "^15.2.9", + "@angular/cdk": "~15.2.4", + "@angular/common": "^15.2.9", + "@angular/compiler": "^15.2.9", + "@angular/core": "^15.2.9", + "@angular/forms": "^15.2.9", + "@angular/material": "~15.2.4", + "@angular/platform-browser": "^15.2.9", + "@angular/platform-browser-dynamic": "^15.2.9", + "@angular/router": "^15.2.9", "@mdi/angular-material": "^7.2.96", - "rxjs": "~7.8.0", + "jquery": "^3.6.0", + "rxjs": "~7.5.0", "tslib": "^2.3.0", - "zone.js": "~0.12.0" + "zone.js": "~0.11.4" }, "devDependencies": { - "@angular-devkit/build-angular": "^15.1.6", - "@angular/cli": "~15.1.6", - "@angular/compiler-cli": "^15.1.0", - "@types/jasmine": "~4.3.0", - "jasmine-core": "~4.5.0", + "@angular-devkit/build-angular": "^15.2.8", + "@angular/cli": "~15.2.8", + "@angular/compiler-cli": "^15.2.9", + "@types/jasmine": "~4.0.0", + "jasmine-core": "~4.2.0", "karma": "~6.4.0", "karma-chrome-launcher": "~3.1.0", "karma-coverage": "~2.2.0", "karma-jasmine": "~5.1.0", "karma-jasmine-html-reporter": "~2.0.0", - "typescript": "~4.9.4" + "typescript": "~4.9.5" } }, "node_modules/@ampproject/remapping": { @@ -51,12 +52,12 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1502.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1502.4.tgz", - "integrity": "sha512-bDBcaRMBfXFfK9MpvfNO926F1rL0PEw+mveXxq3/SSql+1XP/hrc5TVGwnoim4g6DqsGmu9upS5DyJ6PnL/hHA==", + "version": "0.1502.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1502.8.tgz", + "integrity": "sha512-rTltw2ABHrcKc8EGimALvXmrDTP5hlNbEy6nYolJoXEI9EwHgriWrVLVPs3OEF+/ed47dbJi9EGOXUOgzgpB5A==", "dev": true, "dependencies": { - "@angular-devkit/core": "15.2.4", + "@angular-devkit/core": "15.2.8", "rxjs": "6.6.7" }, "engines": { @@ -84,15 +85,15 @@ "dev": true }, "node_modules/@angular-devkit/build-angular": { - "version": "15.2.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-15.2.4.tgz", - "integrity": "sha512-wt0S4oz0vxuW0/Ak5X0vQ7s7TSPynmktVNJblu9SFRgwCD3kplV2B693F+M6t8eLzSy0UCSbZp9h3Ae8gLEiEw==", + "version": "15.2.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-15.2.8.tgz", + "integrity": "sha512-TGDnXhhOG6h6TOrWWzfnkha7wYBOXi7iJc1o1w1VKCayE3T6TZZdF847aK66vL9KG7AKYVdGhWEGw2WBHUBUpg==", "dev": true, "dependencies": { "@ampproject/remapping": "2.2.0", - "@angular-devkit/architect": "0.1502.4", - "@angular-devkit/build-webpack": "0.1502.4", - "@angular-devkit/core": "15.2.4", + "@angular-devkit/architect": "0.1502.8", + "@angular-devkit/build-webpack": "0.1502.8", + "@angular-devkit/core": "15.2.8", "@babel/core": "7.20.12", "@babel/generator": "7.20.14", "@babel/helper-annotate-as-pure": "7.18.6", @@ -104,7 +105,7 @@ "@babel/runtime": "7.20.13", "@babel/template": "7.20.7", "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "15.2.4", + "@ngtools/webpack": "15.2.8", "ansi-colors": "4.1.3", "autoprefixer": "10.4.13", "babel-loader": "9.1.2", @@ -212,12 +213,12 @@ "dev": true }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.1502.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1502.4.tgz", - "integrity": "sha512-Bs/pxcY3517QAVyAalDxJgjc93KWQos+dFdgEQrKxj/VTs1BTYnLbb2M8Y7MoxVnfH4S+qqxGe5B57T+TlB3Eg==", + "version": "0.1502.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1502.8.tgz", + "integrity": "sha512-jWtNv+S03FFLDe/C8SPCcRvkz3bSb2R+919IT086Q9axIPQ1VowOEwzt2k3qXPSSrC7GSYuASM+X92dB47NTQQ==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1502.4", + "@angular-devkit/architect": "0.1502.8", "rxjs": "6.6.7" }, "engines": { @@ -249,9 +250,9 @@ "dev": true }, "node_modules/@angular-devkit/core": { - "version": "15.2.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-15.2.4.tgz", - "integrity": "sha512-yl+0j1bMwJLKShsyCXw77tbJG8Sd21+itisPLL2MgEpLNAO252kr9zG4TLlFRJyKVftm2l1h78KjqvM5nbOXNg==", + "version": "15.2.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-15.2.8.tgz", + "integrity": "sha512-Lo4XrbDMtXarKnMrFgWLmQdSX+3QPNAg4otG8cmp/U4jJyjV4dAYKEAsb1sCNGUSM4h4v09EQU/5ugVjDU29lQ==", "dev": true, "dependencies": { "ajv": "8.12.0", @@ -293,14 +294,14 @@ "dev": true }, "node_modules/@angular-devkit/schematics": { - "version": "15.1.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-15.1.6.tgz", - "integrity": "sha512-cwmJFpS43zrdlmfwfHIxG/Nzg5rzFdtKrHx64ZXxNFm6JdyK2JTs/qrHUwv1FYWAcqhdiHn+00jYklMmvsvPOA==", + "version": "15.2.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-15.2.8.tgz", + "integrity": "sha512-w6EUGC96kVsH9f8sEzajzbONMawezyVBiSo+JYp5r25rQArAz/a+KZntbuETWHQ0rQOEsKmUNKxwmr11BaptSQ==", "dev": true, "dependencies": { - "@angular-devkit/core": "15.1.6", + "@angular-devkit/core": "15.2.8", "jsonc-parser": "3.2.0", - "magic-string": "0.27.0", + "magic-string": "0.29.0", "ora": "5.4.1", "rxjs": "6.6.7" }, @@ -310,44 +311,6 @@ "yarn": ">= 1.13.0" } }, - "node_modules/@angular-devkit/schematics/node_modules/@angular-devkit/core": { - "version": "15.1.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-15.1.6.tgz", - "integrity": "sha512-jGgxyRjecVf6lEyqDxz7ltMEndNPxIg720pk6r40fgsu0dU8w9vjJSJe7k0XdJiXVRcN6wZa/J5nO/xcwWVIsA==", - "dev": true, - "dependencies": { - "ajv": "8.12.0", - "ajv-formats": "2.1.1", - "jsonc-parser": "3.2.0", - "rxjs": "6.6.7", - "source-map": "0.7.4" - }, - "engines": { - "node": "^14.20.0 || ^16.13.0 || >=18.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^3.5.2" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, - "node_modules/@angular-devkit/schematics/node_modules/magic-string": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", - "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.13" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/@angular-devkit/schematics/node_modules/rxjs": { "version": "6.6.7", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", @@ -367,9 +330,9 @@ "dev": true }, "node_modules/@angular/animations": { - "version": "15.2.4", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-15.2.4.tgz", - "integrity": "sha512-0qMtJgWWfqOaVp3BhoMWd2SNFaOWUjl1DYaNTfYiqMGWk6H2ULE2Yog4hZNJAkOsCApEF2BNlL1O8arPzTswCQ==", + "version": "15.2.9", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-15.2.9.tgz", + "integrity": "sha512-GQujLhI0cQFcl4Q8y0oSYKSRnW23GIeSL+Arl4eFufziJ9hGAAQNuesaNs/7i+9UlTHDMkPH3kd5ScXuYYz6wg==", "dependencies": { "tslib": "^2.3.0" }, @@ -377,13 +340,13 @@ "node": "^14.20.0 || ^16.13.0 || >=18.10.0" }, "peerDependencies": { - "@angular/core": "15.2.4" + "@angular/core": "15.2.9" } }, "node_modules/@angular/cdk": { - "version": "15.2.4", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-15.2.4.tgz", - "integrity": "sha512-E4ZjDG12NdXHhCtask/5qzlgDzQ72vEbDoDd4I4ueI1rSUxFVyzRBt2vJwsAHbblO9kQoi/BOCXkJunR/T7r6g==", + "version": "15.2.9", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-15.2.9.tgz", + "integrity": "sha512-koaM07N1AIQ5oHU27l0/FoQSSoYAwlAYwVZ4Di3bYrJsTBNCN2Xsby7wI8gZxdepMnV4Fe9si382BDBov+oO4Q==", "dependencies": { "tslib": "^2.3.0" }, @@ -397,15 +360,15 @@ } }, "node_modules/@angular/cli": { - "version": "15.1.6", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-15.1.6.tgz", - "integrity": "sha512-GmC9jZK2ipUWj0dlfTI5oEYia4y1fLfO3AtAKU5CylNYrGyB+DRytKY8Bx6Fs4kaNBY8V8YnyLi7E/78gziMdg==", + "version": "15.2.8", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-15.2.8.tgz", + "integrity": "sha512-3VlTfm6DUZfFHBY43vQSAaqmFTxy3VtRd/iDBCHcEPhHwYLWBvNwReJuJfNja8O105QQ6DBiYVBExEBtPmjQ4w==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1501.6", - "@angular-devkit/core": "15.1.6", - "@angular-devkit/schematics": "15.1.6", - "@schematics/angular": "15.1.6", + "@angular-devkit/architect": "0.1502.8", + "@angular-devkit/core": "15.2.8", + "@angular-devkit/schematics": "15.2.8", + "@schematics/angular": "15.2.8", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.3", "ini": "3.0.1", @@ -413,9 +376,9 @@ "jsonc-parser": "3.2.0", "npm-package-arg": "10.1.0", "npm-pick-manifest": "8.0.1", - "open": "8.4.0", + "open": "8.4.1", "ora": "5.4.1", - "pacote": "15.0.8", + "pacote": "15.1.0", "resolve": "1.22.1", "semver": "7.3.8", "symbol-observable": "4.0.0", @@ -430,86 +393,10 @@ "yarn": ">= 1.13.0" } }, - "node_modules/@angular/cli/node_modules/@angular-devkit/architect": { - "version": "0.1501.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1501.6.tgz", - "integrity": "sha512-u07zZFlfrg0Qn4mu5M9Nz0pH2Yd2028XF/73980PsZMxwkSm4diF08v4bHk3UyR7yPT7phwvt4znj6ryZhx1gw==", - "dev": true, - "dependencies": { - "@angular-devkit/core": "15.1.6", - "rxjs": "6.6.7" - }, - "engines": { - "node": "^14.20.0 || ^16.13.0 || >=18.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular/cli/node_modules/@angular-devkit/core": { - "version": "15.1.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-15.1.6.tgz", - "integrity": "sha512-jGgxyRjecVf6lEyqDxz7ltMEndNPxIg720pk6r40fgsu0dU8w9vjJSJe7k0XdJiXVRcN6wZa/J5nO/xcwWVIsA==", - "dev": true, - "dependencies": { - "ajv": "8.12.0", - "ajv-formats": "2.1.1", - "jsonc-parser": "3.2.0", - "rxjs": "6.6.7", - "source-map": "0.7.4" - }, - "engines": { - "node": "^14.20.0 || ^16.13.0 || >=18.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^3.5.2" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, - "node_modules/@angular/cli/node_modules/open": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", - "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", - "dev": true, - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@angular/cli/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/@angular/cli/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, "node_modules/@angular/common": { - "version": "15.2.4", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-15.2.4.tgz", - "integrity": "sha512-RT6bo3RB768alor27i4KG9rTcsya58f2Pda/MjcNC5iR7WpmA4tE4h9x4JnI/1GCR3U1KAa4qrDrEFUJZoFofw==", + "version": "15.2.9", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-15.2.9.tgz", + "integrity": "sha512-LM9/UHG2dRrOzlu2KovrFwWIziFMjRxHzSP3Igw6Symw/wIl0kXGq8Fn6RpFP78zmLqnv+IQOoRiby9MCXsI4g==", "dependencies": { "tslib": "^2.3.0" }, @@ -517,14 +404,14 @@ "node": "^14.20.0 || ^16.13.0 || >=18.10.0" }, "peerDependencies": { - "@angular/core": "15.2.4", + "@angular/core": "15.2.9", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "15.2.4", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-15.2.4.tgz", - "integrity": "sha512-M4zqNCiSsNH2tc12yux9ZpGfSQ4vJ08iYxq6RJmS3CFJtDIw0SFc14ycHX+8rXYfLw92j0UTaDEAhjruAM51Zw==", + "version": "15.2.9", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-15.2.9.tgz", + "integrity": "sha512-MoKugbjk+E0wRBj12uvIyDLELlVLonnqjA2+XiF+7FxALIeyds3/qQeEoMmYIqAbN3NnTT5pV92RxWwG4tHFwA==", "dependencies": { "tslib": "^2.3.0" }, @@ -532,7 +419,7 @@ "node": "^14.20.0 || ^16.13.0 || >=18.10.0" }, "peerDependencies": { - "@angular/core": "15.2.4" + "@angular/core": "15.2.9" }, "peerDependenciesMeta": { "@angular/core": { @@ -541,9 +428,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "15.2.4", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-15.2.4.tgz", - "integrity": "sha512-FCRNZ60PIKRt3rmjab7ca1E5Mc8Zt2izwD+VrzWeyBc51g5dVD+T/CRamJbmqRGw1hnn6BBM/VP9oDRcMVwGlg==", + "version": "15.2.9", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-15.2.9.tgz", + "integrity": "sha512-zsbI8G2xHOeYWI0hjFzrI//ZhZV9il/uQW5dAimfwJp06KZDeXZ3PdwY9JQslf6F+saLwOObxy6QMrIVvfjy9w==", "dev": true, "dependencies": { "@babel/core": "7.19.3", @@ -566,7 +453,7 @@ "node": "^14.20.0 || ^16.13.0 || >=18.10.0" }, "peerDependencies": { - "@angular/compiler": "15.2.4", + "@angular/compiler": "15.2.9", "typescript": ">=4.8.2 <5.0" } }, @@ -622,9 +509,9 @@ } }, "node_modules/@angular/core": { - "version": "15.2.4", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-15.2.4.tgz", - "integrity": "sha512-ApWxICIOK47F/yh0Di/SFR3qMXZPpVLFainlIEauwpULKCLrYSJSnlF+zaDB6mMI1754skZZE69lX4uS2Byi+w==", + "version": "15.2.9", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-15.2.9.tgz", + "integrity": "sha512-w46Z1yUXCQfKV7XfnamOoLA2VD0MVUUYVrUjO73mHSskDXSXxfZAEHO9kfUS71Cj35PvhP3mbkqWscpea2WeYg==", "dependencies": { "tslib": "^2.3.0" }, @@ -637,9 +524,9 @@ } }, "node_modules/@angular/forms": { - "version": "15.2.4", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-15.2.4.tgz", - "integrity": "sha512-6Q5GQl4lJFM7EDYXlge/D9yuQ5WwrWRh5Q/lo3j2UFqNpZTyTCGr/259Kq4exQyvYXSIwFmmJpk3873ThqOSNA==", + "version": "15.2.9", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-15.2.9.tgz", + "integrity": "sha512-sk0pC2EFi2Ohg5J0q0NYptbT+2WOkoiERSMYA39ncDvlSZBWsNlxpkbGUSck7NIxjK2QfcVN1ldGbHlZTFvtqg==", "dependencies": { "tslib": "^2.3.0" }, @@ -647,16 +534,16 @@ "node": "^14.20.0 || ^16.13.0 || >=18.10.0" }, "peerDependencies": { - "@angular/common": "15.2.4", - "@angular/core": "15.2.4", - "@angular/platform-browser": "15.2.4", + "@angular/common": "15.2.9", + "@angular/core": "15.2.9", + "@angular/platform-browser": "15.2.9", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/material": { - "version": "15.2.4", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-15.2.4.tgz", - "integrity": "sha512-sHEU+vygags4YZonUx55T7bExKV802YWQ+F5w6iBDpttx7Kf3wXUThVAnE408wA4GdZj3cgEU6eNDwxsrExHMg==", + "version": "15.2.9", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-15.2.9.tgz", + "integrity": "sha512-emuFF/7+91Jq+6kVCl3FiVoFLtAZoh+woFQWNuK8nhx0HmD4ckLFI8d9a6ERYR3zRuKhq5deSRE2kYsfpjrrsQ==", "dependencies": { "@material/animation": "15.0.0-canary.684e33d25.0", "@material/auto-init": "15.0.0-canary.684e33d25.0", @@ -709,7 +596,7 @@ }, "peerDependencies": { "@angular/animations": "^15.0.0 || ^16.0.0", - "@angular/cdk": "15.2.4", + "@angular/cdk": "15.2.9", "@angular/common": "^15.0.0 || ^16.0.0", "@angular/core": "^15.0.0 || ^16.0.0", "@angular/forms": "^15.0.0 || ^16.0.0", @@ -718,9 +605,9 @@ } }, "node_modules/@angular/platform-browser": { - "version": "15.2.4", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-15.2.4.tgz", - "integrity": "sha512-RVMqnVNy6kgtyZM7gRJF1nrsFBaGltySeyc4jvTIms7fpqxHvJFJ32r24h5QbgYbq18YwnWmcEkqZqg3nnyOaA==", + "version": "15.2.9", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-15.2.9.tgz", + "integrity": "sha512-ufCHeSX+U6d43YOMkn3igwfqtlozoCXADcbyfUEG8m2y9XASobqmCKvdSk/zfl62oyiA8msntWBJVBE2l4xKXg==", "dependencies": { "tslib": "^2.3.0" }, @@ -728,9 +615,9 @@ "node": "^14.20.0 || ^16.13.0 || >=18.10.0" }, "peerDependencies": { - "@angular/animations": "15.2.4", - "@angular/common": "15.2.4", - "@angular/core": "15.2.4" + "@angular/animations": "15.2.9", + "@angular/common": "15.2.9", + "@angular/core": "15.2.9" }, "peerDependenciesMeta": { "@angular/animations": { @@ -739,9 +626,9 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "15.2.4", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-15.2.4.tgz", - "integrity": "sha512-WNEIjzrgmaouXVkIoUwe/kl8IjpZS5Ar2zDx9Twx/onngc/Nta0X5xLYTNNVM4u8pJSHObupeTMF4CY7ZLEQ+Q==", + "version": "15.2.9", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-15.2.9.tgz", + "integrity": "sha512-ZIYDM6MShblb8OyV1m4+18lJJ2LCeICmeg2uSbpFYptYBSOClrTiYOOFVDJvn7HLvNzljLs16XPrgyaYVqNpcw==", "dependencies": { "tslib": "^2.3.0" }, @@ -749,16 +636,16 @@ "node": "^14.20.0 || ^16.13.0 || >=18.10.0" }, "peerDependencies": { - "@angular/common": "15.2.4", - "@angular/compiler": "15.2.4", - "@angular/core": "15.2.4", - "@angular/platform-browser": "15.2.4" + "@angular/common": "15.2.9", + "@angular/compiler": "15.2.9", + "@angular/core": "15.2.9", + "@angular/platform-browser": "15.2.9" } }, "node_modules/@angular/router": { - "version": "15.2.4", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-15.2.4.tgz", - "integrity": "sha512-9cE35O/uC3QcbWuvmv0gO+x57glMJTw4/HoKmjZdozTPq/6XLFhBnpqNzOyMVs9+VtFsvVuR/ah9aucyx4ISog==", + "version": "15.2.9", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-15.2.9.tgz", + "integrity": "sha512-UCbh5DLSDhybv0xKYT7kGQMfOVdyhHIHOZz5EYVebbhste6S+W1LE57vTHq7QtxJsyKBa/WSkaUkCLXD6ntCAg==", "dependencies": { "tslib": "^2.3.0" }, @@ -766,9 +653,9 @@ "node": "^14.20.0 || ^16.13.0 || >=18.10.0" }, "peerDependencies": { - "@angular/common": "15.2.4", - "@angular/core": "15.2.4", - "@angular/platform-browser": "15.2.4", + "@angular/common": "15.2.9", + "@angular/core": "15.2.9", + "@angular/platform-browser": "15.2.9", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -779,9 +666,9 @@ "dev": true }, "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", + "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", "dev": true, "dependencies": { "@babel/highlight": "^7.18.6" @@ -791,9 +678,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz", - "integrity": "sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==", + "version": "7.21.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.7.tgz", + "integrity": "sha512-KYMqFYTaenzMK4yUtf4EW9wc4N9ef80FsbMtkwool5zpwl4YrT1SdWYSTRcT94KO4hannogdS+LxY7L+arP3gA==", "dev": true, "engines": { "node": ">=6.9.0" @@ -853,9 +740,9 @@ } }, "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dev": true, "dependencies": { "@jridgewell/set-array": "^1.0.1", @@ -879,26 +766,25 @@ } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", - "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.21.5.tgz", + "integrity": "sha512-uNrjKztPLkUk7bpCNC0jEKDJzzkvel/W+HguzbN8krA+LPfC1CEobJEvAvGka2A/M+ViOqXdcRL0GqPUJSjx9g==", "dev": true, "dependencies": { - "@babel/helper-explode-assignable-expression": "^7.18.6", - "@babel/types": "^7.18.9" + "@babel/types": "^7.21.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", - "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.5.tgz", + "integrity": "sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-validator-option": "^7.18.6", + "@babel/compat-data": "^7.21.5", + "@babel/helper-validator-option": "^7.21.0", "browserslist": "^4.21.3", "lru-cache": "^5.1.1", "semver": "^6.3.0" @@ -920,19 +806,20 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.0.tgz", - "integrity": "sha512-Q8wNiMIdwsv5la5SPxNYzzkPnjgC0Sy0i7jLkVOCdllu/xcVNkr3TeZzbHBJrj+XXRqzX5uCyCoV9eu6xUG7KQ==", + "version": "7.21.8", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.8.tgz", + "integrity": "sha512-+THiN8MqiH2AczyuZrnrKL6cAxFRRQDKW9h1YkBvbgKmAm6mwiacig1qT73DHIWMGo40GRnsEfN3LA+E6NtmSw==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-environment-visitor": "^7.21.5", "@babel/helper-function-name": "^7.21.0", - "@babel/helper-member-expression-to-functions": "^7.21.0", + "@babel/helper-member-expression-to-functions": "^7.21.5", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.20.7", + "@babel/helper-replace-supers": "^7.21.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/helper-split-export-declaration": "^7.18.6" + "@babel/helper-split-export-declaration": "^7.18.6", + "semver": "^6.3.0" }, "engines": { "node": ">=6.9.0" @@ -941,14 +828,24 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.0.tgz", - "integrity": "sha512-N+LaFW/auRSWdx7SHD/HiARwXQju1vXTW4fKr4u5SgBUTm51OKEjKgj+cs00ggW3kEvNqwErnlwuq7Y3xBe4eg==", + "version": "7.21.8", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.8.tgz", + "integrity": "sha512-zGuSdedkFtsFHGbexAvNuipg1hbtitDLo2XE8/uf6Y9sOQV1xsYX/2pNbtedp/X0eU1pIt+kGvaqHCowkRbS5g==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.3.1" + "regexpu-core": "^5.3.1", + "semver": "^6.3.0" }, "engines": { "node": ">=6.9.0" @@ -957,6 +854,15 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/helper-define-polyfill-provider": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", @@ -984,26 +890,14 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz", + "integrity": "sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-explode-assignable-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", - "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-function-name": { "version": "7.21.0", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", @@ -1030,43 +924,43 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz", - "integrity": "sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.5.tgz", + "integrity": "sha512-nIcGfgwpH2u4n9GG1HpStW5Ogx7x7ekiFHbjjFRKXbn5zUvqO9ZgotCO4x1aNbKn/x/xOUaXEhyNHCwtFCpxWg==", "dev": true, "dependencies": { - "@babel/types": "^7.21.0" + "@babel/types": "^7.21.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", + "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.21.4" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", - "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz", + "integrity": "sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-environment-visitor": "^7.21.5", + "@babel/helper-module-imports": "^7.21.4", + "@babel/helper-simple-access": "^7.21.5", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/helper-validator-identifier": "^7.19.1", "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.2", - "@babel/types": "^7.21.2" + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5" }, "engines": { "node": ">=6.9.0" @@ -1085,9 +979,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz", + "integrity": "sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg==", "dev": true, "engines": { "node": ">=6.9.0" @@ -1112,29 +1006,29 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz", - "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.21.5.tgz", + "integrity": "sha512-/y7vBgsr9Idu4M6MprbOVUfH3vs7tsIfnVWv/Ml2xgwvyH6LTngdfbf5AdsKwkJy4zgy1X/kuNrEKvhhK28Yrg==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.20.7", + "@babel/helper-environment-visitor": "^7.21.5", + "@babel/helper-member-expression-to-functions": "^7.21.5", "@babel/helper-optimise-call-expression": "^7.18.6", "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz", + "integrity": "sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==", "dev": true, "dependencies": { - "@babel/types": "^7.20.2" + "@babel/types": "^7.21.5" }, "engines": { "node": ">=6.9.0" @@ -1165,9 +1059,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz", + "integrity": "sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==", "dev": true, "engines": { "node": ">=6.9.0" @@ -1207,14 +1101,14 @@ } }, "node_modules/@babel/helpers": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", - "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.5.tgz", + "integrity": "sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA==", "dev": true, "dependencies": { "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0" + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5" }, "engines": { "node": ">=6.9.0" @@ -1235,9 +1129,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.3.tgz", - "integrity": "sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==", + "version": "7.21.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.8.tgz", + "integrity": "sha512-6zavDGdzG3gUqAdWvlLFfk+36RilI+Pwyuuh7HItyeScCWP3k6i8vKclAQ0bM/0y/Kz/xiwvxhMv9MgTJP5gmA==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -1720,12 +1614,12 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz", - "integrity": "sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.21.5.tgz", + "integrity": "sha512-wb1mhwGOCaXHDTcsRYMKF9e5bbMgqwxtqa2Y1ifH96dXJPwbuLX9qHy3clhrxVqgMz7nyNXs8VkxdH8UBcjKqA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.21.5" }, "engines": { "node": ">=6.9.0" @@ -1805,12 +1699,12 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz", - "integrity": "sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.21.5.tgz", + "integrity": "sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-plugin-utils": "^7.21.5", "@babel/template": "^7.20.7" }, "engines": { @@ -1883,12 +1777,12 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz", - "integrity": "sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.5.tgz", + "integrity": "sha512-nYWpjKW/7j/I/mZkGVgHJXh4bA1sfdFnJoOXwJuj4m3Q2EraO/8ZyrkCau9P5tbHQk01RMSt6KYLCsW7730SXQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.21.5" }, "engines": { "node": ">=6.9.0" @@ -1961,14 +1855,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz", - "integrity": "sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.5.tgz", + "integrity": "sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.21.2", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-simple-access": "^7.20.2" + "@babel/helper-module-transforms": "^7.21.5", + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/helper-simple-access": "^7.21.5" }, "engines": { "node": ">=6.9.0" @@ -2089,12 +1983,12 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz", - "integrity": "sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.21.5.tgz", + "integrity": "sha512-ZoYBKDb6LyMi5yCsByQ5jmXsHAQDDYeexT1Szvlmui+lADvfSecr5Dxd/PkrTC3pAD182Fcju1VQkB4oCp9M+w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-plugin-utils": "^7.21.5", "regenerator-transform": "^0.15.1" }, "engines": { @@ -2225,12 +2119,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", - "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.21.5.tgz", + "integrity": "sha512-LYm/gTOwZqsYohlvFUe/8Tujz75LqqVC2w+2qPHLR+WyWHGCZPN1KBpJCJn+4Bk4gOkQy/IXKIge6az5MqwlOg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.21.5" }, "engines": { "node": ">=6.9.0" @@ -2402,19 +2296,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.3.tgz", - "integrity": "sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.5.tgz", + "integrity": "sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.3", - "@babel/helper-environment-visitor": "^7.18.9", + "@babel/code-frame": "^7.21.4", + "@babel/generator": "^7.21.5", + "@babel/helper-environment-visitor": "^7.21.5", "@babel/helper-function-name": "^7.21.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.3", - "@babel/types": "^7.21.3", + "@babel/parser": "^7.21.5", + "@babel/types": "^7.21.5", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -2423,12 +2317,12 @@ } }, "node_modules/@babel/traverse/node_modules/@babel/generator": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.3.tgz", - "integrity": "sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.5.tgz", + "integrity": "sha512-SrKK/sRv8GesIW1bDagf9cCG38IOMYZusoe1dfg0D8aiUe3Amvoj1QtjTPAWcfrZFvIwlleLb0gxzQidL9w14w==", "dev": true, "dependencies": { - "@babel/types": "^7.21.3", + "@babel/types": "^7.21.5", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -2438,9 +2332,9 @@ } }, "node_modules/@babel/traverse/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dev": true, "dependencies": { "@jridgewell/set-array": "^1.0.1", @@ -2452,12 +2346,12 @@ } }, "node_modules/@babel/types": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.3.tgz", - "integrity": "sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.5.tgz", + "integrity": "sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-string-parser": "^7.21.5", "@babel/helper-validator-identifier": "^7.19.1", "to-fast-properties": "^2.0.0" }, @@ -2841,6 +2735,102 @@ "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", "dev": true }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -2898,9 +2888,9 @@ } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz", + "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", @@ -2908,9 +2898,9 @@ } }, "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dev": true, "dependencies": { "@jridgewell/set-array": "^1.0.1", @@ -2922,21 +2912,27 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "3.1.0", "@jridgewell/sourcemap-codec": "1.4.14" } }, + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, "node_modules/@leichtgewicht/ip-codec": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", @@ -3700,9 +3696,9 @@ "integrity": "sha512-eBefrpwq+nbxSmQ866ph4XkNqHct0iYfuxWJpmvKkvcOoTfjQxZemRy1uRmbSz8Du++oO3TF66rLUX9S8Fmodw==" }, "node_modules/@ngtools/webpack": { - "version": "15.2.4", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-15.2.4.tgz", - "integrity": "sha512-cQ7MsRoGJgPOVnpvFgWhygeSe6zJ0ITiUhjmmuOgpNDfYkrgYxN3Ot/qvQefFei+oGZ1JJ9bRb8lcPKL/apoBQ==", + "version": "15.2.8", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-15.2.8.tgz", + "integrity": "sha512-BJexeT4FxMtToVBGa3wdl6rrkYXgilP0kkSH4Qzu4MPlLPbeBSr4XQalQriewlpC2uzG0r2SJfrAe2eDhtSykA==", "dev": true, "engines": { "node": "^14.20.0 || ^16.13.0 || >=18.10.0", @@ -3791,9 +3787,9 @@ } }, "node_modules/@npmcli/git/node_modules/which": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.0.tgz", - "integrity": "sha512-nla//68K9NU6yRiwDY/Q8aU6siKlSs64aEC7+IV56QoAuyQT2ovsJcgGYGyqMOmI/CGN1BOR6mM5EN0FBO+zyQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", "dev": true, "dependencies": { "isexe": "^2.0.0" @@ -3869,9 +3865,9 @@ } }, "node_modules/@npmcli/promise-spawn/node_modules/which": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.0.tgz", - "integrity": "sha512-nla//68K9NU6yRiwDY/Q8aU6siKlSs64aEC7+IV56QoAuyQT2ovsJcgGYGyqMOmI/CGN1BOR6mM5EN0FBO+zyQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", "dev": true, "dependencies": { "isexe": "^2.0.0" @@ -3884,9 +3880,9 @@ } }, "node_modules/@npmcli/run-script": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.0.tgz", - "integrity": "sha512-ql+AbRur1TeOdl1FY+RAwGW9fcr4ZwiVKabdvm93mujGREVuVLbdkXRJDrkTXSdCjaxYydr1wlA2v67jxWG5BQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.1.tgz", + "integrity": "sha512-Yi04ZSold8jcbBJD/ahKMJSQCQifH8DAbMwkBvoLaTpGFxzHC3B/5ZyoVR69q/4xedz84tvi9DJOJjNe17h+LA==", "dev": true, "dependencies": { "@npmcli/node-gyp": "^3.0.0", @@ -3900,9 +3896,9 @@ } }, "node_modules/@npmcli/run-script/node_modules/which": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.0.tgz", - "integrity": "sha512-nla//68K9NU6yRiwDY/Q8aU6siKlSs64aEC7+IV56QoAuyQT2ovsJcgGYGyqMOmI/CGN1BOR6mM5EN0FBO+zyQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", "dev": true, "dependencies": { "isexe": "^2.0.0" @@ -3914,14 +3910,24 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@schematics/angular": { - "version": "15.1.6", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-15.1.6.tgz", - "integrity": "sha512-y2kIQ1wJL0wR6v/LM5+PFJUivrYtdaIJVRdOXLLWl0AB5aLwObiWgLzAuBsbGm/9//WPPhw9PglS5EFFxTBDzg==", + "version": "15.2.8", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-15.2.8.tgz", + "integrity": "sha512-F49IEzCFxQlpaMIgTO/wF1l/CLQKif7VaiDdyiTKOeT22IMmyd61FUmWDyZYfCBqMlvBmvDGx64HaHWes1HYCg==", "dev": true, "dependencies": { - "@angular-devkit/core": "15.1.6", - "@angular-devkit/schematics": "15.1.6", + "@angular-devkit/core": "15.2.8", + "@angular-devkit/schematics": "15.2.8", "jsonc-parser": "3.2.0" }, "engines": { @@ -3930,50 +3936,15 @@ "yarn": ">= 1.13.0" } }, - "node_modules/@schematics/angular/node_modules/@angular-devkit/core": { - "version": "15.1.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-15.1.6.tgz", - "integrity": "sha512-jGgxyRjecVf6lEyqDxz7ltMEndNPxIg720pk6r40fgsu0dU8w9vjJSJe7k0XdJiXVRcN6wZa/J5nO/xcwWVIsA==", + "node_modules/@sigstore/protobuf-specs": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.1.0.tgz", + "integrity": "sha512-a31EnjuIDSX8IXBUib3cYLDRlPMU36AWX4xS8ysLaNu4ZzUesDiPt83pgrW2X1YLMe5L2HbDyaKK5BrL4cNKaQ==", "dev": true, - "dependencies": { - "ajv": "8.12.0", - "ajv-formats": "2.1.1", - "jsonc-parser": "3.2.0", - "rxjs": "6.6.7", - "source-map": "0.7.4" - }, "engines": { - "node": "^14.20.0 || ^16.13.0 || >=18.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^3.5.2" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@schematics/angular/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/@schematics/angular/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, "node_modules/@socket.io/component-emitter": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", @@ -3989,6 +3960,43 @@ "node": ">= 10" } }, + "node_modules/@tufjs/canonical-json": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz", + "integrity": "sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-1.0.4.tgz", + "integrity": "sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==", + "dev": true, + "dependencies": { + "@tufjs/canonical-json": "1.0.0", + "minimatch": "^9.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models/node_modules/minimatch": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.0.tgz", + "integrity": "sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@types/body-parser": { "version": "1.19.2", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", @@ -4018,9 +4026,9 @@ } }, "node_modules/@types/connect-history-api-fallback": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", - "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", + "integrity": "sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig==", "dev": true, "dependencies": { "@types/express-serve-static-core": "*", @@ -4043,9 +4051,9 @@ } }, "node_modules/@types/eslint": { - "version": "8.21.3", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.3.tgz", - "integrity": "sha512-fa7GkppZVEByMWGbTtE5MbmXWJTVbrjjaS8K6uQj+XtuuUv1fsuPAxhygfqLmsb/Ufb3CV8deFCpiMfAgi00Sw==", + "version": "8.37.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.37.0.tgz", + "integrity": "sha512-Piet7dG2JBuDIfohBngQ3rCt7MgO9xCO4xIMKxBThCq5PNRB91IjlJ10eJVwfoNtvTErmxLzwBZ7rHZtbOMmFQ==", "dev": true, "dependencies": { "@types/estree": "*", @@ -4081,29 +4089,30 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.33", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz", - "integrity": "sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==", + "version": "4.17.34", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.34.tgz", + "integrity": "sha512-fvr49XlCGoUj2Pp730AItckfjat4WNb0lb3kfrLWffd+RLeoGAMsq7UOy04PAPtoL01uKwcp6u8nhzpgpDYr3w==", "dev": true, "dependencies": { "@types/node": "*", "@types/qs": "*", - "@types/range-parser": "*" + "@types/range-parser": "*", + "@types/send": "*" } }, "node_modules/@types/http-proxy": { - "version": "1.17.10", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.10.tgz", - "integrity": "sha512-Qs5aULi+zV1bwKAg5z1PWnDXWmsn+LxIvUGv6E2+OOMYhclZMO+OXd9pYVf2gLykf2I7IV2u7oTHwChPNsvJ7g==", + "version": "1.17.11", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.11.tgz", + "integrity": "sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/jasmine": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-4.3.1.tgz", - "integrity": "sha512-Vu8l+UGcshYmV1VWwULgnV/2RDbBaO6i2Ptx7nd//oJPIZGhoI1YLST4VKagD2Pq/Bc2/7zvtvhM7F3p4SN7kQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-4.0.3.tgz", + "integrity": "sha512-Opp1LvvEuZdk8fSSvchK2mZwhVrsNT0JgJE9Di6MjnaIpmEXM8TLCPPrVtNTYh8+5MPdY8j9bAHMu2SSfwpZJg==", "dev": true }, "node_modules/@types/json-schema": { @@ -4113,15 +4122,15 @@ "dev": true }, "node_modules/@types/mime": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", - "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", "dev": true }, "node_modules/@types/node": { - "version": "18.15.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz", - "integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==", + "version": "20.1.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.1.0.tgz", + "integrity": "sha512-O+z53uwx64xY7D6roOi4+jApDGFg0qn6WHcxe5QeqjMaTezBO/mxdfFXIVAVVyNWKx84OmPB3L8kbVYOTeN34A==", "dev": true }, "node_modules/@types/parse-json": { @@ -4148,6 +4157,16 @@ "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", "dev": true }, + "node_modules/@types/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", + "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, "node_modules/@types/serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", @@ -5013,9 +5032,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001472", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001472.tgz", - "integrity": "sha512-xWC/0+hHHQgj3/vrKYY0AAzeIUgr7L9wlELIcAvZdDUHlhL/kNxMdnQLOSOQfP8R51ZzPhmHdyMkI0MMpmxCfg==", + "version": "1.0.30001486", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001486.tgz", + "integrity": "sha512-uv7/gXuHi10Whlj0pp5q/tsK/32J2QSqVRKQhs2j8VsDCjgyruAh/eEXHF822VqO9yT6iZKw3nRwZRSPBE9OQg==", "dev": true, "funding": [ { @@ -5119,9 +5138,9 @@ } }, "node_modules/cli-spinners": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz", - "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.0.tgz", + "integrity": "sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==", "dev": true, "engines": { "node": ">=6" @@ -5201,9 +5220,9 @@ } }, "node_modules/colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, "node_modules/commander": { @@ -5420,9 +5439,9 @@ } }, "node_modules/core-js-compat": { - "version": "3.29.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.29.1.tgz", - "integrity": "sha512-QmchCua884D8wWskMX8tW5ydINzd8oSJVx38lx/pVkFGqztxt73GYre3pm/hyYq8bPf+MW5In4I/uRShFDsbrA==", + "version": "3.30.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.30.2.tgz", + "integrity": "sha512-nriW1nuJjUgvkEjIot1Spwakz52V9YkYHZAQG6A1eCgC8AA1p0zngrQEP9R0+V6hji5XilWKG1Bd0YRppmGimA==", "dev": true, "dependencies": { "browserslist": "^4.21.5" @@ -5782,9 +5801,9 @@ "dev": true }, "node_modules/dns-packet": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.5.0.tgz", - "integrity": "sha512-USawdAUzRkV6xrqTjiAEp6M9YagZEzWcSUaZTcIFAiyQWW1SoI6KyId8y2+/71wbgHKQAKd+iupLv4YvEwYWvA==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz", + "integrity": "sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==", "dev": true, "dependencies": { "@leichtgewicht/ip-codec": "^2.0.1" @@ -5860,6 +5879,12 @@ "url": "https://github.com/fb55/domutils?sponsor=1" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -5867,9 +5892,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.342", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.342.tgz", - "integrity": "sha512-dTei3VResi5bINDENswBxhL+N0Mw5YnfWyTqO75KGsVldurEkhC9+CelJVAse8jycWyP8pv3VSj4BSyP8wTWJA==", + "version": "1.4.385", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.385.tgz", + "integrity": "sha512-L9zlje9bIw0h+CwPQumiuVlfMcV4boxRjFIWDcLfFqTZNbkwOExBzfmswytHawObQX4OUhtNv8gIiB21kOurIg==", "dev": true }, "node_modules/emoji-regex": { @@ -5920,9 +5945,9 @@ } }, "node_modules/engine.io": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.1.tgz", - "integrity": "sha512-JFYQurD/nbsA5BSPmbaOSLa3tSVj8L6o4srSwXXY3NqE+gGUNmmPTbhn8tjzcCtSqhFgIeqef81ngny8JM25hw==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.2.tgz", + "integrity": "sha512-FKn/3oMiJjrOEOeUub2WCox6JhxBXq/Zn3fZOMCBxKnNYtsdKjxhl7yR3fZhM9PV+rdE75SU5SYMc+2PGzo+Tg==", "dev": true, "dependencies": { "@types/cookie": "^0.4.1", @@ -5950,9 +5975,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", - "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.13.0.tgz", + "integrity": "sha512-eyV8f0y1+bzyfh8xAwW/WTSZpLbjhqc4ne9eGSH4Zo2ejdyiNG9pU6mf9DG8a7+Auk6MFTlNOT4Y2y/9k8GKVg==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -6547,6 +6572,34 @@ } } }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.1.tgz", + "integrity": "sha512-uUWsN4aOxJAS8KOuf3QMyFtgm1pkb6I+KRZbRF/ghdf5T7sM+B1lLLzPDxswUjkmHyxQAVzEgG35E3NzDM9GVw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -6593,17 +6646,26 @@ } }, "node_modules/fs-minipass": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.1.tgz", - "integrity": "sha512-MhaJDcFRTuLidHrIttu0RDGyyXs/IYHVmlcxfLAEFIWjc1vdLAkdwT7Ace2u7DbitWC0toKMl5eJZRYNVreIMw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.2.tgz", + "integrity": "sha512-2GAfyfoaCDRrM6jaOS3UsBts8yJ55VioXdWcOL7dK9zdAuKT71+WBA4ifnNYqVjYv+4SsPxjK0JT4yIIn4cA/g==", "dev": true, "dependencies": { - "minipass": "^4.0.0" + "minipass": "^5.0.0" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/fs-monkey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", @@ -6755,9 +6817,9 @@ } }, "node_modules/globby": { - "version": "13.1.3", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz", - "integrity": "sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==", + "version": "13.1.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.4.tgz", + "integrity": "sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==", "dev": true, "dependencies": { "dir-glob": "^3.0.1", @@ -7096,27 +7158,27 @@ } }, "node_modules/ignore-walk": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.2.tgz", - "integrity": "sha512-ezmQ1Dg2b3jVZh2Dh+ar6Eu2MqNSTkyb32HU2MAQQQX9tKM3q/UQ/9lf03lQ5hW+fOeoMnwxwkleZ0xcNp0/qg==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.3.tgz", + "integrity": "sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA==", "dev": true, "dependencies": { - "minimatch": "^7.4.2" + "minimatch": "^9.0.0" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/ignore-walk/node_modules/minimatch": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.3.tgz", - "integrity": "sha512-5UB4yYusDtkRPbRiy1cqZ1IpGNcJCGlEMG17RKzPddpyiPKoCdwohbED8g4QXT0ewCt8LTkQXuljsUfQ3FKM4A==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.0.tgz", + "integrity": "sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -7345,9 +7407,9 @@ } }, "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", + "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", "dev": true, "dependencies": { "has": "^1.0.3" @@ -7629,10 +7691,28 @@ "node": ">=8" } }, + "node_modules/jackspeak": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.0.tgz", + "integrity": "sha512-r5XBrqIJfwRIjRt/Xr5fv9Wh09qyhHfKnYddDlpM+ibRR20qrYActpCAgU6U+d53EOEjzkvxPMVHSlgR7leXrQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jasmine-core": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.5.0.tgz", - "integrity": "sha512-9PMzyvhtocxb3aXJVOPqBDswdgyAeSB81QnLop4npOpbqnheaTEwPc9ZloQeVswugPManznQBjD8kWDTjlnHuw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.2.0.tgz", + "integrity": "sha512-OcFpBrIhnbmb9wfI8cqPSJ50pv3Wg4/NSgoZIqHzIwO/2a9qivJWzv8hUvaREIMYYJBas6AvfXATFdVuzzCqVw==", "dev": true }, "node_modules/jest-worker": { @@ -7673,6 +7753,11 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/jquery": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.4.tgz", + "integrity": "sha512-v28EW9DWDFpzcD9O5iyJXg3R3+q+mET5JhnjJzQUZMHOv67bpSIHq81GEYpPNZHG+XXHsfSme3nxp/hndKEcsQ==" + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -7753,9 +7838,9 @@ ] }, "node_modules/karma": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.1.tgz", - "integrity": "sha512-Cj57NKOskK7wtFWSlMvZf459iX+kpYIPXmkNUzP2WAFcA7nhr/ALn5R7sw3w+1udFDcpMx/tuB8d5amgm3ijaA==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.2.tgz", + "integrity": "sha512-C6SU/53LB31BEgRg+omznBEMY4SjHU3ricV6zBcAe1EeILKkeScr+fZXtaI5WyDbkVowJxxAI6h73NcFPmXolQ==", "dev": true, "dependencies": { "@colors/colors": "1.5.0", @@ -8463,9 +8548,9 @@ } }, "node_modules/memfs": { - "version": "3.4.13", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.13.tgz", - "integrity": "sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.1.tgz", + "integrity": "sha512-UWbFJKvj5k+nETdteFndTpYxdeTMox/ULeqX5k/dpaQJCCFmj5EeKv3dBcyO2xmkRAx2vppRu5dVG7SOtsGOzA==", "dev": true, "dependencies": { "fs-monkey": "^1.0.3" @@ -8606,9 +8691,9 @@ } }, "node_modules/minipass": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.5.tgz", - "integrity": "sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q==", + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", + "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", "dev": true, "engines": { "node": ">=8" @@ -9130,9 +9215,9 @@ } }, "node_modules/npm-install-checks": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.1.0.tgz", - "integrity": "sha512-udSGENih/5xKh3Ex+L0PtZcOt0Pa+6ppDLnpG5D49/EhMja3LupaY9E/DtJTxyFBwE09ot7Fc+H4DywnZNWTVA==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.1.1.tgz", + "integrity": "sha512-dH3GmQL4vsPtld59cOn8uY0iOqRmqKvV+DLGwNXV/Q7MDgD2QfOADWd/mFXcIE5LVhYYGjA3baz6W9JneqnuCw==", "dev": true, "dependencies": { "semver": "^7.1.1" @@ -9142,9 +9227,9 @@ } }, "node_modules/npm-normalize-package-bin": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.0.tgz", - "integrity": "sha512-g+DPQSkusnk7HYXr75NtzkIP4+N81i3RPsGFidF3DzHd9MT9wWngmqoeg/fnHFz5MNdtG4w03s+QnhewSLTT2Q==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", "dev": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" @@ -9193,13 +9278,13 @@ } }, "node_modules/npm-registry-fetch": { - "version": "14.0.3", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.3.tgz", - "integrity": "sha512-YaeRbVNpnWvsGOjX2wk5s85XJ7l1qQBGAp724h8e2CZFFhMSuw9enom7K1mWVUtvXO1uUSFIAPofQK0pPN0ZcA==", + "version": "14.0.5", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz", + "integrity": "sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==", "dev": true, "dependencies": { "make-fetch-happen": "^11.0.0", - "minipass": "^4.0.0", + "minipass": "^5.0.0", "minipass-fetch": "^3.0.0", "minipass-json-stream": "^1.0.1", "minizlib": "^2.1.2", @@ -9220,9 +9305,9 @@ } }, "node_modules/npm-registry-fetch/node_modules/make-fetch-happen": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.0.3.tgz", - "integrity": "sha512-oPLh5m10lRNNZDjJ2kP8UpboUx2uFXVaVweVe/lWut4iHWcQEmfqSVJt2ihZsFI8HbpwyyocaXbCAWf0g1ukIA==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", "dev": true, "dependencies": { "agentkeepalive": "^4.2.1", @@ -9232,7 +9317,7 @@ "https-proxy-agent": "^5.0.0", "is-lambda": "^1.0.1", "lru-cache": "^7.7.1", - "minipass": "^4.0.0", + "minipass": "^5.0.0", "minipass-fetch": "^3.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", @@ -9245,13 +9330,22 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/npm-registry-fetch/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/npm-registry-fetch/node_modules/minipass-fetch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.1.tgz", - "integrity": "sha512-t9/wowtf7DYkwz8cfMSt0rMwiyNIBXf5CKZ3S5ZMqRqMYT0oLTp0x1WorMI9WTwvaPg21r1JbFxJMum8JrLGfw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.3.tgz", + "integrity": "sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==", "dev": true, "dependencies": { - "minipass": "^4.0.0", + "minipass": "^5.0.0", "minipass-sized": "^1.0.3", "minizlib": "^2.1.2" }, @@ -9563,9 +9657,9 @@ } }, "node_modules/pacote": { - "version": "15.0.8", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.0.8.tgz", - "integrity": "sha512-UlcumB/XS6xyyIMwg/WwMAyUmga+RivB5KgkRwA1hZNtrx+0Bt41KxHCvg1kr0pZ/ZeD8qjhW4fph6VaYRCbLw==", + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.1.0.tgz", + "integrity": "sha512-FFcjtIl+BQNfeliSm7MZz5cpdohvUV1yjGnqgVM4UnVF7JslRY0ImXAygdaCDV0jjUADEWu4y5xsDV8brtrTLg==", "dev": true, "dependencies": { "@npmcli/git": "^4.0.0", @@ -9583,6 +9677,7 @@ "promise-retry": "^2.0.1", "read-package-json": "^6.0.0", "read-package-json-fast": "^3.0.0", + "sigstore": "^1.0.0", "ssri": "^10.0.0", "tar": "^6.1.11" }, @@ -9665,9 +9760,9 @@ } }, "node_modules/parse5-html-rewriting-stream/node_modules/entities": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", - "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true, "engines": { "node": ">=0.12" @@ -9704,9 +9799,9 @@ } }, "node_modules/parse5/node_modules/entities": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", - "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "devOptional": true, "engines": { "node": ">=0.12" @@ -9758,13 +9853,13 @@ "dev": true }, "node_modules/path-scurry": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.6.3.tgz", - "integrity": "sha512-RAmB+n30SlN+HnNx6EbcpoDy9nwdpcGPnEKrJnu6GZoDWBdIjo1UQMVtW2ybtC7LC2oKLcMq8y5g8WnKLiod9g==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.7.0.tgz", + "integrity": "sha512-UkZUeDjczjYRE495+9thsgcVgsaCPkaw80slmfVFgllxY+IO8ubTsOpFVjDPROBqJdHfVPUFRHPBV/WciOVfWg==", "dev": true, "dependencies": { - "lru-cache": "^7.14.1", - "minipass": "^4.0.2" + "lru-cache": "^9.0.0", + "minipass": "^5.0.0" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -9774,12 +9869,21 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.1.tgz", + "integrity": "sha512-65/Jky17UwSb0BuB9V+MyDpsOtXKmYwzhyl+cOa9XUiI4uV2Ouy/2voFP3+al0BjZbJgMBD8FojMpAf+Z+qn4A==", "dev": true, "engines": { - "node": ">=12" + "node": "14 || >=16.14" + } + }, + "node_modules/path-scurry/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" } }, "node_modules/path-to-regexp": { @@ -9957,9 +10061,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", - "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", + "version": "6.0.12", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.12.tgz", + "integrity": "sha512-NdxGCAZdRrwVI1sy59+Wzrh+pMMHxapGnpfenDVlMEXoOcvt4pGE0JLK9YY2F5dLxcFYA/YbVQKhcGU+FtSYQg==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -10137,12 +10241,12 @@ } }, "node_modules/read-package-json": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.1.tgz", - "integrity": "sha512-AaHqXxfAVa+fNL07x8iAghfKOds/XXsu7zoouIVsbm7PEbQ3nMWXlvjcbrNLjElnUHWQtAo4QEa0RXuvD4XlpA==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.3.tgz", + "integrity": "sha512-4QbpReW4kxFgeBQ0vPAqh2y8sXEB3D4t3jsXbJKIhBiF80KT6XRo45reqwtftju5J6ru1ax06A2Gb/wM1qCOEQ==", "dev": true, "dependencies": { - "glob": "^9.3.0", + "glob": "^10.2.2", "json-parse-even-better-errors": "^3.0.0", "normalize-package-data": "^5.0.0", "npm-normalize-package-bin": "^3.0.0" @@ -10174,15 +10278,19 @@ } }, "node_modules/read-package-json/node_modules/glob": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.2.tgz", - "integrity": "sha512-BTv/JhKXFEHsErMte/AnfiSv8yYOLLiyH2lTg8vn02O21zWFgHPTfxtgn1QRe7NRgggUhC8hacR2Re94svHqeA==", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.2.tgz", + "integrity": "sha512-Xsa0BcxIC6th9UwNjZkhrMtNo/MnyRL8jGCP+uEwhA5oFOCY1f2s1/oNKY47xQ0Bg5nkjsfAEIej1VeH62bDDQ==", "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "minimatch": "^7.4.1", - "minipass": "^4.2.4", - "path-scurry": "^1.6.1" + "foreground-child": "^3.1.0", + "jackspeak": "^2.0.3", + "minimatch": "^9.0.0", + "minipass": "^5.0.0", + "path-scurry": "^1.7.0" + }, + "bin": { + "glob": "dist/cjs/src/bin.js" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -10201,20 +10309,29 @@ } }, "node_modules/read-package-json/node_modules/minimatch": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.3.tgz", - "integrity": "sha512-5UB4yYusDtkRPbRiy1cqZ1IpGNcJCGlEMG17RKzPddpyiPKoCdwohbED8g4QXT0ewCt8LTkQXuljsUfQ3FKM4A==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.0.tgz", + "integrity": "sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/read-package-json/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -10541,9 +10658,9 @@ } }, "node_modules/rxjs": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", - "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz", + "integrity": "sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==", "dependencies": { "tslib": "^2.1.0" } @@ -10642,15 +10759,15 @@ "optional": true }, "node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", + "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", + "ajv": "^8.9.0", "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" + "ajv-keywords": "^5.1.0" }, "engines": { "node": ">= 12.13.0" @@ -10935,6 +11052,84 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, + "node_modules/sigstore": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.4.0.tgz", + "integrity": "sha512-N7TRpSbFjY/TrFDg6yGAQSYBrQ5s6qmPiq4pD6fkv1LoyfMsLG0NwZWG2s5q+uttLHgyVyTa0Rogx2P78rN8kQ==", + "dev": true, + "dependencies": { + "@sigstore/protobuf-specs": "^0.1.0", + "make-fetch-happen": "^11.0.1", + "tuf-js": "^1.1.3" + }, + "bin": { + "sigstore": "bin/sigstore.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/sigstore/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/sigstore/node_modules/make-fetch-happen": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/sigstore/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/sigstore/node_modules/minipass-fetch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.3.tgz", + "integrity": "sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==", + "dev": true, + "dependencies": { + "minipass": "^5.0.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, "node_modules/slash": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", @@ -11174,17 +11369,26 @@ "dev": true }, "node_modules/ssri": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.1.tgz", - "integrity": "sha512-WVy6di9DlPOeBWEjMScpNipeSX2jIZBGEn5Uuo8Q7aIuFEuDX0pw8RxcOjlD1TWP4obi24ki7m/13+nFpcbXrw==", + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.4.tgz", + "integrity": "sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ==", "dev": true, "dependencies": { - "minipass": "^4.0.0" + "minipass": "^5.0.0" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/ssri/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -11231,6 +11435,21 @@ "node": ">=8" } }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -11243,6 +11462,19 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", @@ -11295,14 +11527,14 @@ } }, "node_modules/tar": { - "version": "6.1.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", - "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", + "version": "6.1.14", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.14.tgz", + "integrity": "sha512-piERznXu0U7/pW7cdSn7hjqySIVTYT6F76icmFk7ptU7dDYlXTm5r9A6K04R2vU3olYgoKeo1Cg3eeu5nhftAw==", "dev": true, "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", - "minipass": "^4.0.0", + "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" @@ -11335,6 +11567,15 @@ "node": ">=8" } }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/tar/node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -11372,16 +11613,16 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.7", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz", - "integrity": "sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==", + "version": "5.3.8", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.8.tgz", + "integrity": "sha512-WiHL3ElchZMsK27P8uIUh4604IgJyAW47LVXGbEoB21DbQcZ+OuMpGjVYnEUaqcWM6dO8uS2qUbA7LSCWqvsbg==", "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.17", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.1", - "terser": "^5.16.5" + "terser": "^5.16.8" }, "engines": { "node": ">= 10.13.0" @@ -11437,9 +11678,9 @@ "dev": true }, "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", + "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.8", @@ -11455,9 +11696,9 @@ } }, "node_modules/terser-webpack-plugin/node_modules/terser": { - "version": "5.16.8", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.8.tgz", - "integrity": "sha512-QI5g1E/ef7d+PsDifb+a6nnVgC4F22Bg6T0xrBrz6iloVB4PUkkunp6V8nzoOOZJIzjWVdAGqCdlKlhLq/TbIA==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.1.tgz", + "integrity": "sha512-hVl35zClmpisy6oaoKALOpS0rDYLxRFLHhRuDlEGTKey9qHjS1w9GMORjuwIMt70Wan4lwsLYyWDVnWgF+KUEw==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.2", @@ -11602,6 +11843,80 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" }, + "node_modules/tuf-js": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.5.tgz", + "integrity": "sha512-inqodgxdsmuxrtQVbu6tPNgRKWD1Boy3VB6GO7KczJZpAHiTukwhSzXUSzvDcw5pE2Jo8ua+e1ykpHv7VdPVlQ==", + "dev": true, + "dependencies": { + "@tufjs/models": "1.0.4", + "make-fetch-happen": "^11.1.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/tuf-js/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/tuf-js/node_modules/make-fetch-happen": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/tuf-js/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/tuf-js/node_modules/minipass-fetch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.3.tgz", + "integrity": "sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==", + "dev": true, + "dependencies": { + "minipass": "^5.0.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, "node_modules/type-fest": { "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", @@ -11647,9 +11962,9 @@ } }, "node_modules/ua-parser-js": { - "version": "0.7.34", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.34.tgz", - "integrity": "sha512-cJMeh/eOILyGu0ejgTKB95yKT3zOenSe9UGE3vj6WfiOwgGYnmATUsnDixMFvdU+rNMvWih83hrUP8VwhF9yXQ==", + "version": "0.7.35", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.35.tgz", + "integrity": "sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g==", "dev": true, "funding": [ { @@ -11748,9 +12063,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", "dev": true, "funding": [ { @@ -11760,6 +12075,10 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { @@ -11767,7 +12086,7 @@ "picocolors": "^1.0.0" }, "bin": { - "browserslist-lint": "cli.js" + "update-browserslist-db": "cli.js" }, "peerDependencies": { "browserslist": ">= 4.21.0" @@ -12100,9 +12419,9 @@ "dev": true }, "node_modules/webpack/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", + "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.8", @@ -12162,9 +12481,9 @@ } }, "node_modules/wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", "dev": true }, "node_modules/wrap-ansi": { @@ -12184,6 +12503,57 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -12296,9 +12666,9 @@ } }, "node_modules/zone.js": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.12.0.tgz", - "integrity": "sha512-XtC+I5dXU14HrzidAKBNMqneIVUykLEAA1x+v4KVrd6AUPWlwYORF8KgsVqvgdHiKZ4BkxxjvYi/ksEixTPR0Q==", + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.8.tgz", + "integrity": "sha512-82bctBg2hKcEJ21humWIkXRlLBBmrc3nN7DFh5LGGhcyycO2S7FN8NmdvlcKaGFDNVL4/9kFLmwmInTavdJERA==", "dependencies": { "tslib": "^2.3.0" } diff --git a/rossa-tech-cli/package.json b/rossa-tech-cli/package.json index a3925d8..b2e79fc 100644 --- a/rossa-tech-cli/package.json +++ b/rossa-tech-cli/package.json @@ -10,25 +10,25 @@ }, "private": true, "dependencies": { - "@angular/animations": "^15.1.0", - "@angular/cdk": "^15.2.4", - "@angular/common": "^15.1.0", - "@angular/compiler": "^15.1.0", - "@angular/core": "^15.1.0", - "@angular/forms": "^15.1.0", - "@angular/material": "^15.2.4", - "@angular/platform-browser": "^15.1.0", - "@angular/platform-browser-dynamic": "^15.1.0", - "@angular/router": "^15.1.0", + "@angular/animations": "^15.2.9", + "@angular/cdk": "~15.2.4", + "@angular/common": "^15.2.9", + "@angular/compiler": "^15.2.9", + "@angular/core": "^15.2.9", + "@angular/forms": "^15.2.9", + "@angular/material": "~15.2.4", + "@angular/platform-browser": "^15.2.9", + "@angular/platform-browser-dynamic": "^15.2.9", + "@angular/router": "^15.2.9", "@mdi/angular-material": "^7.2.96", "rxjs": "~7.8.0", "tslib": "^2.3.0", "zone.js": "~0.12.0" }, "devDependencies": { - "@angular-devkit/build-angular": "^15.1.6", - "@angular/cli": "~15.1.6", - "@angular/compiler-cli": "^15.1.0", + "@angular-devkit/build-angular": "^15.2.8", + "@angular/cli": "~15.2.8", + "@angular/compiler-cli": "^15.2.9", "@types/jasmine": "~4.3.0", "jasmine-core": "~4.5.0", "karma": "~6.4.0", @@ -36,6 +36,6 @@ "karma-coverage": "~2.2.0", "karma-jasmine": "~5.1.0", "karma-jasmine-html-reporter": "~2.0.0", - "typescript": "~4.9.4" + "typescript": "~4.9.5" } } diff --git a/rossa-tech-cli/src/app/app-routing.module.ts b/rossa-tech-cli/src/app/app-routing.module.ts index bd91ece..135bc24 100644 --- a/rossa-tech-cli/src/app/app-routing.module.ts +++ b/rossa-tech-cli/src/app/app-routing.module.ts @@ -1,14 +1,21 @@ -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; -import { DashboardComponent } from 'src/app/components/dashboard/dashboard.component'; -import { LoginComponent } from './components/login/login.component'; +// import { AuthGuard } from "./auth/auth.guard"; +import { NgModule, inject } from "@angular/core"; +import { RouterModule, Routes } from "@angular/router"; +import { LoginComponent } from "./components/loginPage/login.component"; +import { IndexComponent } from "./components/indexPage/index.component"; +import { DashboardComponent } from "./components/dashboard/dashboard.component"; +import { AuthService } from "./auth/auth.service"; +import { AuthGuard } from "./auth/auth.guard"; const routes: Routes = [ - { path: 'dashboard', component: DashboardComponent }, - { path: '', redirectTo: '/dashboard', pathMatch: 'full' }, - { path: '**', redirectTo: '/dashboard', pathMatch: 'full' }, - // { path: 'login', component: LoginComponent }, - // { path: '', component: LoginComponent }, + { path: "login", component: LoginComponent }, + // { path: "index", component: IndexComponent, canActivate: [AuthGuard] }, + { + path: "dashboard", + component: DashboardComponent, + canActivate: [AuthGuard], + }, + { path: "", redirectTo: "/dashboard", pathMatch: "full" }, ]; @NgModule({ diff --git a/rossa-tech-cli/src/app/app.component.css b/rossa-tech-cli/src/app/app.component.css new file mode 100644 index 0000000..e69de29 diff --git a/rossa-tech-cli/src/app/app.component.html b/rossa-tech-cli/src/app/app.component.html index 1dfafe3..09a2e25 100644 --- a/rossa-tech-cli/src/app/app.component.html +++ b/rossa-tech-cli/src/app/app.component.html @@ -1,3 +1,3 @@ - + \ No newline at end of file diff --git a/rossa-tech-cli/src/app/app.component.spec.ts b/rossa-tech-cli/src/app/app.component.spec.ts index ca671dd..813fc7b 100644 --- a/rossa-tech-cli/src/app/app.component.spec.ts +++ b/rossa-tech-cli/src/app/app.component.spec.ts @@ -1,35 +1,33 @@ -import { TestBed } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { AppComponent } from './app.component'; +import { TestBed } from "@angular/core/testing"; +import { RouterTestingModule } from "@angular/router/testing"; +import { AppComponent } from "./app.component"; -describe('AppComponent', () => { +describe("AppComponent", () => { beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [ - RouterTestingModule - ], - declarations: [ - AppComponent - ], + imports: [RouterTestingModule], + declarations: [AppComponent], }).compileComponents(); }); - it('should create the app', () => { + it("should create the app", () => { const fixture = TestBed.createComponent(AppComponent); const app = fixture.componentInstance; expect(app).toBeTruthy(); }); - it(`should have as title 'rossa-tech-cli'`, () => { + it(`should have as title 'rossa-tech'`, () => { const fixture = TestBed.createComponent(AppComponent); const app = fixture.componentInstance; - expect(app.title).toEqual('rossa-tech-cli'); + expect(app.title).toEqual("rossa-tech"); }); - it('should render title', () => { + it("should render title", () => { const fixture = TestBed.createComponent(AppComponent); fixture.detectChanges(); const compiled = fixture.nativeElement as HTMLElement; - expect(compiled.querySelector('.content span')?.textContent).toContain('rossa-tech-cli app is running!'); + expect(compiled.querySelector(".content span")?.textContent).toContain( + "rossa-tech app is running!" + ); }); }); diff --git a/rossa-tech-cli/src/app/app.component.ts b/rossa-tech-cli/src/app/app.component.ts index c5b66ec..d8fa771 100644 --- a/rossa-tech-cli/src/app/app.component.ts +++ b/rossa-tech-cli/src/app/app.component.ts @@ -1,10 +1,10 @@ -import { Component } from '@angular/core'; +import { Component } from "@angular/core"; @Component({ - selector: 'app-root', - templateUrl: './app.component.html', - styleUrls: ['./app.component.scss'] + selector: "app-root", + templateUrl: "./app.component.html", + styleUrls: ["./app.component.css"], }) export class AppComponent { - title = 'rossa-tech-cli'; + title = "rossa-tech"; } diff --git a/rossa-tech-cli/src/app/app.module.ts b/rossa-tech-cli/src/app/app.module.ts index f637416..80843e0 100644 --- a/rossa-tech-cli/src/app/app.module.ts +++ b/rossa-tech-cli/src/app/app.module.ts @@ -1,60 +1,59 @@ -import { NgModule } from '@angular/core'; -import { BrowserModule, DomSanitizer } from '@angular/platform-browser'; +import { NgModule } from "@angular/core"; +import { BrowserModule, DomSanitizer } from "@angular/platform-browser"; -import { AppRoutingModule } from './app-routing.module'; -import { AppComponent } from './app.component'; +import { FormsModule, ReactiveFormsModule } from "@angular/forms"; -import { MatCardModule } from '@angular/material/card'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatInputModule } from '@angular/material/input'; -import { MatSelectModule } from '@angular/material/select'; -import { MatTableModule } from '@angular/material/table'; -import { MatProgressBarModule } from '@angular/material/progress-bar'; -import { MatToolbarModule } from '@angular/material/toolbar'; -import { HTTP_INTERCEPTORS, HttpClientModule } from '@angular/common/http'; -import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { DashboardComponent } from './components/dashboard/dashboard.component'; -import { MetersComponent } from './components/meters/meters.component'; - -import { MatSidenavModule } from '@angular/material/sidenav'; -import { MatIconModule, MatIconRegistry } from '@angular/material/icon'; -import { MatListModule } from '@angular/material/list'; -import { LoaderComponent } from './components/loader/loader.component'; -import { HeaderComponent } from './components/header/header.component'; -import { MeterDataListComponent } from './components/subcomponents/meter-data-list/meter-data-list.component'; -import { MatGridListModule } from '@angular/material/grid-list'; -import { ConsumptionLastYearComponent } from './components/subcomponents/consumption-last-year/consumption-last-year.component'; -import { MeterDataWrapperComponent } from './components/subcomponents/meter-data-wrapper/meter-data-wrapper.component'; -import { MeterDataAddDialogComponent } from './components/dialogs/meter-data-add-dialog/meter-data-add-dialog.component'; -import { MatDialogModule } from '@angular/material/dialog'; -import { MatButtonModule } from '@angular/material/button'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatNativeDateModule } from '@angular/material/core'; -import { LoginComponent } from './components/login/login.component'; -import { LogoutComponent } from './components/logout/logout.component'; -// import { HttpInterceptorService } from './components/interceptors/httpInterceptor.service'; +import { AppRoutingModule } from "./app-routing.module"; +import { HttpClientModule } from "@angular/common/http"; +import { AppComponent } from "./app.component"; +import { LoginComponent } from "./components/loginPage/login.component"; +import { IndexComponent } from "./components/indexPage/index.component"; +import { DashboardComponent } from "./components/dashboard/dashboard.component"; +import { MeterDataListComponent } from "./components/subcomponents/meter-data-list/meter-data-list.component"; +import { ConsumptionLastYearComponent } from "./components/subcomponents/consumption-last-year/consumption-last-year.component"; +import { MeterDataWrapperComponent } from "./components/subcomponents/meter-data-wrapper/meter-data-wrapper.component"; +import { HeaderComponent } from "./components/header/header.component"; +import { LoaderComponent } from "./components/loader/loader.component"; +import { BrowserAnimationsModule } from "@angular/platform-browser/animations"; +import { MatCardModule } from "@angular/material/card"; +import { MatFormFieldModule } from "@angular/material/form-field"; +import { MatInputModule } from "@angular/material/input"; +import { MatSelectModule } from "@angular/material/select"; +import { MatTableModule } from "@angular/material/table"; +import { MatProgressBarModule } from "@angular/material/progress-bar"; +import { MatToolbarModule } from "@angular/material/toolbar"; +import { MatSidenavModule } from "@angular/material/sidenav"; +import { MatIconModule, MatIconRegistry } from "@angular/material/icon"; +import { MatListModule } from "@angular/material/list"; +import { MatGridListModule } from "@angular/material/grid-list"; +import { MatDialogModule } from "@angular/material/dialog"; +import { MatButtonModule } from "@angular/material/button"; +import { MatDatepickerModule } from "@angular/material/datepicker"; +import { MatNativeDateModule } from "@angular/material/core"; +import { MeterDataAddDialogComponent } from "./dialogs/meter-data-add-dialog/meter-data-add-dialog.component"; +import { SnackbarComponent } from "./components/snackbar/snackbar.component"; +import { MatSnackBarModule } from "@angular/material/snack-bar"; @NgModule({ declarations: [ AppComponent, + LoginComponent, + IndexComponent, DashboardComponent, - MetersComponent, LoaderComponent, HeaderComponent, MeterDataListComponent, ConsumptionLastYearComponent, MeterDataWrapperComponent, MeterDataAddDialogComponent, - LoginComponent, - LogoutComponent, + SnackbarComponent, ], imports: [ BrowserModule, - HttpClientModule, - BrowserAnimationsModule, - FormsModule, AppRoutingModule, + HttpClientModule, + FormsModule, + BrowserAnimationsModule, MatCardModule, MatFormFieldModule, MatInputModule, @@ -71,6 +70,7 @@ import { LogoutComponent } from './components/logout/logout.component'; ReactiveFormsModule, MatDatepickerModule, MatNativeDateModule, + MatSnackBarModule, ], providers: [ MatDatepickerModule, @@ -85,7 +85,7 @@ import { LogoutComponent } from './components/logout/logout.component'; export class AppModule { constructor(matIconRegistry: MatIconRegistry, domSanitizer: DomSanitizer) { matIconRegistry.addSvgIconSet( - domSanitizer.bypassSecurityTrustResourceUrl('./assets/mdi.svg') + domSanitizer.bypassSecurityTrustResourceUrl("./assets/mdi.svg") ); } } diff --git a/rossa-tech-cli/src/app/auth/auth.guard.ts b/rossa-tech-cli/src/app/auth/auth.guard.ts new file mode 100644 index 0000000..5853249 --- /dev/null +++ b/rossa-tech-cli/src/app/auth/auth.guard.ts @@ -0,0 +1,32 @@ +import { Observable } from "rxjs"; +import { Injectable } from "@angular/core"; +import { + ActivatedRouteSnapshot, + Router, + RouterStateSnapshot, +} from "@angular/router"; +import { AuthService } from "./auth.service"; + +@Injectable({ + providedIn: "root", +}) +export class AuthGuard { + constructor(private router: Router, private authService: AuthService) {} + + canActivate( + next: ActivatedRouteSnapshot, + state: RouterStateSnapshot + ): Observable | Promise | boolean { + console.log("authGuard"); + + if (this.authService.checkUserLoggedIn()) { + console.log("logged in"); + + return true; + } else { + console.log("not logged in"); + this.router.navigate(["/login"]); + return false; + } + } +} diff --git a/rossa-tech-cli/src/app/auth/auth.service.ts b/rossa-tech-cli/src/app/auth/auth.service.ts new file mode 100644 index 0000000..5ba1fe7 --- /dev/null +++ b/rossa-tech-cli/src/app/auth/auth.service.ts @@ -0,0 +1,30 @@ +import { Injectable } from "@angular/core"; + +@Injectable({ + providedIn: "root", +}) +export class AuthService { + constructor() {} + + public checkUserLoggedIn(): Boolean { + let retVal: Boolean = false, + currUserObj: any = null, + currUser: any; + if (sessionStorage.getItem("currentUser") != null) { + currUserObj = sessionStorage.getItem("currentUser"); + if ( + currUserObj != null && + currUserObj.toString() != null && + currUserObj.toString().trim() !== "" + ) { + currUser = JSON.parse(currUserObj.toString()); + if (currUser && currUser.userId && currUser.userId.trim() !== "") { + retVal = + currUser.tokenValue != null && currUser.tokenValue.trim() !== ""; + } + } + } + + return retVal; + } +} diff --git a/rossa-tech-cli/src/app/auth/login.service.ts b/rossa-tech-cli/src/app/auth/login.service.ts new file mode 100644 index 0000000..443327f --- /dev/null +++ b/rossa-tech-cli/src/app/auth/login.service.ts @@ -0,0 +1,99 @@ +import { Injectable } from "@angular/core"; +import { HttpClient, HttpHeaders } from "@angular/common/http"; +import { Observable } from "rxjs"; + +import { LoginUser } from "../dataModels/loginUser.type"; +import { environment } from "../../environments/environment"; + +@Injectable({ + providedIn: "root", +}) +export class LoginService { + constructor(private http: HttpClient) {} + + public login(userToLogin: LoginUser): Observable { + return this.http.post( + environment.apiBaseUrl + "/authenticate", + userToLogin + ); + } + + public signout(): Observable { + let jwtToken: String = this.getUserSecurityToken(), + headers: HttpHeaders = new HttpHeaders({ + authorization: "bearer " + jwtToken, + }), + options = { headers: headers }; + return this.http.post( + environment.apiBaseUrl + "/signOut", + null, + options + ); + } + + public setSessionCurrentUser(userToAdd: any): void { + if ( + userToAdd != null && + userToAdd.userId && + userToAdd.userId.trim() !== "" && + userToAdd.tokenValue && + userToAdd.tokenValue.trim() !== "" + ) { + if (sessionStorage.getItem("currentUser") != null) { + sessionStorage.removeItem("currentUser"); + } + + sessionStorage.setItem("currentUser", JSON.stringify(userToAdd)); + } + } + + public removeSessionCurrentUser(): void { + if (sessionStorage.getItem("currentUser") != null) { + sessionStorage.removeItem("currentUser"); + } + } + + public getLoggedinUser(): any | null { + let retVal: any | null = null, + currUser: any | null = null, + currUserObj: any = null; + + if (sessionStorage.getItem("currentUser") != null) { + currUserObj = sessionStorage.getItem("currentUser"); + if ( + currUserObj != null && + currUserObj.toString() != null && + currUserObj.toString().trim() !== "" + ) { + currUser = JSON.parse(currUserObj.toString()); + if (currUser && currUser.userId && currUser.userId.trim() !== "") { + retVal = currUser; + } + } + } + + return retVal; + } + + public getUserSecurityToken(): String { + let retVal: String = "", + currUser: any | null = null, + currUserObj: any = null; + + if (sessionStorage.getItem("currentUser") != null) { + currUserObj = sessionStorage.getItem("currentUser"); + if ( + currUserObj != null && + currUserObj.toString() != null && + currUserObj.toString().trim() !== "" + ) { + currUser = JSON.parse(currUserObj.toString()); + if (currUser && currUser.userId && currUser.userId.trim() !== "") { + retVal = currUser.tokenValue; + } + } + } + + return retVal; + } +} diff --git a/rossa-tech-cli/src/app/components/dashboard/dashboard.component.ts b/rossa-tech-cli/src/app/components/dashboard/dashboard.component.ts index 73100c6..44df06f 100644 --- a/rossa-tech-cli/src/app/components/dashboard/dashboard.component.ts +++ b/rossa-tech-cli/src/app/components/dashboard/dashboard.component.ts @@ -1,27 +1,25 @@ -import { Component } from '@angular/core'; -import { MatDialog } from '@angular/material/dialog'; -import { LoaderService } from 'src/app/components/loader/loader.service'; -import { MeterDataAddDialogComponent } from 'src/app/components/dialogs/meter-data-add-dialog/meter-data-add-dialog.component'; -import { DatabaseService } from 'src/app/services/database.service'; -import { GlobalService } from 'src/app/services/global.service'; -import { UsageType } from 'src/app/models/UsageType'; -import { MeterData } from 'src/app/models/Meterdata'; +import { HttpErrorResponse } from "@angular/common/http"; +import { Component } from "@angular/core"; +import { MatDialog } from "@angular/material/dialog"; +import { LoaderService } from "src/app/components/loader/loader.service"; +import { MeterData } from "src/app/dataModels/Meterdata"; +import { UsageType } from "src/app/dataModels/UsageType"; +import { MeterDataAddDialogComponent } from "src/app/dialogs/meter-data-add-dialog/meter-data-add-dialog.component"; +import { DatabaseService } from "src/app/services/database.service"; +import { ErrorService } from "src/app/services/error.service"; +import { GlobalService } from "src/app/services/global.service"; @Component({ - selector: 'app-dashboard', - templateUrl: './dashboard.component.html', - styleUrls: ['./dashboard.component.scss'], + selector: "app-dashboard", + templateUrl: "./dashboard.component.html", + styleUrls: ["./dashboard.component.scss"], }) export class DashboardComponent { usageTypes = UsageType; - // meterDataEnergy1Hem: MeterData[] = []; - // meterDataEnergy1Log: MeterData[] = []; meterDataEnergy: MeterData[] = []; meterDataWater: MeterData[] = []; - // meterDataEnergyDTO1Log: MeterData[] = []; - // meterDataEnergyDTO1Hem: MeterData[] = []; meterDataEnergyDTO: MeterData[] = []; meterDataWaterDTO: MeterData[] = []; @@ -29,12 +27,13 @@ export class DashboardComponent { energyAverageAmountLastYear1Hem: number = 0; waterAverageAmountLastYear: number = 0; - displayedColumns: string[] = ['date', 'amount', 'meter']; + displayedColumns: string[] = ["date", "amount", "meter"]; constructor( private dataService: DatabaseService, private loaderService: LoaderService, private globalService: GlobalService, + private errorService: ErrorService, private dialog: MatDialog ) { this.loadMeterData(); @@ -46,11 +45,11 @@ export class DashboardComponent { next: (data) => { this.splitMeterData(data); this.loaderService.hide(); - console.log('Meter data:', data); + console.log("Meter data:", data); }, - error: (err) => { + error: (error: HttpErrorResponse) => { + this.errorService.handleError(error); this.loaderService.hide(); - console.error(err); }, }); } @@ -70,16 +69,6 @@ export class DashboardComponent { } initEnergyMeterData(): void { - // this.meterDataEnergy1Log = this.globalService.sortMeterData( - // this.meterDataEnergy1Log - // ); - // this.meterDataEnergy1Hem = this.globalService.sortMeterData( - // this.meterDataEnergy1Hem - // ); - - // this.meterDataEnergyDTO1Log = this.meterDataEnergy1Log; - // this.meterDataEnergyDTO1Hem = this.meterDataEnergy1Hem; - this.meterDataEnergy = this.globalService.sortMeterData( this.meterDataEnergy ); @@ -103,8 +92,9 @@ export class DashboardComponent { next: (meterData: MeterData) => { console.log({ meterData }); }, - error: (err) => { - console.log('add meterData error', { err }); + error: (error: HttpErrorResponse) => { + this.errorService.handleError(error); + this.loaderService.hide(); }, }); } diff --git a/rossa-tech-cli/src/app/components/header/header.component.html b/rossa-tech-cli/src/app/components/header/header.component.html index e20798d..9e703f2 100644 --- a/rossa-tech-cli/src/app/components/header/header.component.html +++ b/rossa-tech-cli/src/app/components/header/header.component.html @@ -1,13 +1,14 @@ -
+
\ No newline at end of file diff --git a/rossa-tech-cli/src/app/components/header/header.component.ts b/rossa-tech-cli/src/app/components/header/header.component.ts index 913b282..eb12c36 100644 --- a/rossa-tech-cli/src/app/components/header/header.component.ts +++ b/rossa-tech-cli/src/app/components/header/header.component.ts @@ -1,10 +1,76 @@ -import { Component } from '@angular/core'; +import { HttpErrorResponse } from "@angular/common/http"; +import { Component, OnInit } from "@angular/core"; +import { AuthService } from "src/app/auth/auth.service"; +import { LoginService } from "src/app/auth/login.service"; +import { ErrorService } from "src/app/services/error.service"; +import { PageSecurityService } from "src/app/services/pageSecurity.service"; +import { LoaderService } from "../loader/loader.service"; +import { NotificationService } from "src/app/services/notification.service"; @Component({ - selector: 'app-header', - templateUrl: './header.component.html', - styleUrls: ['./header.component.scss'] + selector: "app-header", + templateUrl: "./header.component.html", + styleUrls: ["./header.component.scss"], }) -export class HeaderComponent { +export class HeaderComponent implements OnInit { + userLoggedIn: Boolean = false; + constructor( + private loginService: LoginService, + private pageSecurityService: PageSecurityService, + private errorService: ErrorService, + private loaderService: LoaderService, + private notificationService: NotificationService, + private authService: AuthService + ) {} + + ngOnInit(): void { + this.userLoggedIn = this.authService.checkUserLoggedIn(); + } + + public onClickLogout(): void { + this.loaderService.hide(); + + this.loginService.signout().subscribe({ + next: (resp: any) => { + if (resp != null) { + if (resp.successful) { + // alert("Signed out successfully"); /// XXX + this.notificationService.showSnackbar( + "Signed out successfully", + 3000, + "snackbar-success", + true, + "check" + ); + this.loginService.removeSessionCurrentUser(); + this.pageSecurityService.gotoLoginPage(); + } else { + // alert("Signed out failed with error. " + resp.detailedMessage); /// XXX + this.notificationService.showSnackbar( + "Signed out failed with error. " + resp.detailedMessage, + 3000, + "snackbar-warning", + true, + "information-slab-circle-outline" + ); + } + } else { + // alert("Signed out failed with error. Unknown error."); /// XXX + this.notificationService.showSnackbar( + "Signed out failed with error. Unknown error.", + 3000, + "snackbar-warning", + true, + "information-slab-circle-outline" + ); + } + this.loaderService.hide(); + }, + error: (error: HttpErrorResponse) => { + this.errorService.handleError(error); + this.loaderService.hide(); + }, + }); + } } diff --git a/rossa-tech-cli/src/app/components/indexPage/index.component.css b/rossa-tech-cli/src/app/components/indexPage/index.component.css new file mode 100644 index 0000000..9225045 --- /dev/null +++ b/rossa-tech-cli/src/app/components/indexPage/index.component.css @@ -0,0 +1,3 @@ +.link_click { + cursor:pointer; +} \ No newline at end of file diff --git a/rossa-tech-cli/src/app/components/indexPage/index.component.html b/rossa-tech-cli/src/app/components/indexPage/index.component.html new file mode 100644 index 0000000..f2bce89 --- /dev/null +++ b/rossa-tech-cli/src/app/components/indexPage/index.component.html @@ -0,0 +1,28 @@ +
+
+
+ + + + + + + + + + + + + + + + + + + + + +
#Game TitlePublisherDeveloped byPublishing YearRetail Price
{{i}}{{title.gameTitleValue}}{{title.publisherValue}}{{title.devStudioNameValue}}{{title.publishingYearValue}}${{title.retailPriceValue}}
+
+
+
\ No newline at end of file diff --git a/rossa-tech-cli/src/app/components/indexPage/index.component.ts b/rossa-tech-cli/src/app/components/indexPage/index.component.ts new file mode 100644 index 0000000..e415fc9 --- /dev/null +++ b/rossa-tech-cli/src/app/components/indexPage/index.component.ts @@ -0,0 +1,90 @@ +import { Component, OnInit } from "@angular/core"; +import { HttpErrorResponse } from "@angular/common/http"; +// import { PageSecurityService } from "../common/pageSecurity.service"; +import { GameTitlesService } from "../../services/gameTitles.service"; +import { LoginService } from "../../auth/login.service"; +import { GameTitle } from "../../dataModels/gameTitle.type"; +import { PageSecurityService } from "src/app/services/pageSecurity.service"; +import { AuthService } from "src/app/auth/auth.service"; + +@Component({ + selector: "app-root", + templateUrl: "./index.component.html", + styleUrls: ["./index.component.css"], +}) +export class IndexComponent implements OnInit { + private _allTitles: Array = []; + public testArray: Array = []; + + constructor( + private loginService: LoginService, + private pageSecurityService: PageSecurityService, + private gameTitlesService: GameTitlesService, + private authService: AuthService + ) { + this.testArray.push("Test1"); + this.testArray.push("Test2"); + this.testArray.push("Test3"); + this.testArray.push("Test4"); + this.testArray.push("Test5"); + } + + public get allTitles(): Array { + return this._allTitles; + } + + public set allTitles(val: Array) { + this._allTitles = val; + } + + ngOnInit(): void { + // let userLoggedIn: Boolean = this.authService.checkUserLoggedIn(); + // if (!userLoggedIn) { + // this.pageSecurityService.gotoLoginPage(); + // } else { + this.loadAllGameTitles(); + // } + } + + private loadAllGameTitles(): void { + let self = this; + self.gameTitlesService.getAllGameTitles().subscribe( + (resp: any) => { + if (resp && resp.length > 0) { + for (var itm of resp) { + if (itm) { + let titleToAdd: GameTitle = new GameTitle( + itm.gameTitle, + itm.publisher, + itm.devStudioName, + itm.publishingYear, + itm.retailPrice + ); + self._allTitles.push(titleToAdd); + } + } + } + }, + (error: HttpErrorResponse) => { + if (error != null) { + if (error.status === 0) { + // XXX + console.log("Client error."); + } else if (error.status === 401 || error.status === 403) { + // XXX + alert("You are not authorized."); + console.log("You are not authorized."); + self.loginService.removeSessionCurrentUser(); + self.pageSecurityService.gotoLoginPage(); + } else if (error.status === 500) { + alert("Server error."); + console.log("Server error occurred."); + } else { + alert("Unknown error."); + console.log("Unknown error: " + error.status); + } + } + } + ); + } +} diff --git a/rossa-tech-cli/src/app/components/loginPage/login.component.html b/rossa-tech-cli/src/app/components/loginPage/login.component.html new file mode 100644 index 0000000..b2f5771 --- /dev/null +++ b/rossa-tech-cli/src/app/components/loginPage/login.component.html @@ -0,0 +1,23 @@ + diff --git a/rossa-tech-cli/src/app/components/loginPage/login.component.scss b/rossa-tech-cli/src/app/components/loginPage/login.component.scss new file mode 100644 index 0000000..e4f03e2 --- /dev/null +++ b/rossa-tech-cli/src/app/components/loginPage/login.component.scss @@ -0,0 +1,17 @@ +mat-card { + max-width: 400px; + margin: 2em auto; + text-align: center; + color: #333333; +} + +mat-form-field { + display: block; +} + +login-form-wrapper { + display: flex; + flex-direction: column; + width: 100%; + justify-content: center; +} diff --git a/rossa-tech-cli/src/app/components/loginPage/login.component.ts b/rossa-tech-cli/src/app/components/loginPage/login.component.ts new file mode 100644 index 0000000..3fb13d1 --- /dev/null +++ b/rossa-tech-cli/src/app/components/loginPage/login.component.ts @@ -0,0 +1,95 @@ +import { Component, OnInit } from "@angular/core"; +import { HttpErrorResponse } from "@angular/common/http"; +import { Router } from "@angular/router"; + +import { LoginUser } from "../../dataModels/loginUser.type"; +import { LoginService } from "../../auth/login.service"; +import { FormsService } from "../../services/forms.service"; +import { AuthService } from "src/app/auth/auth.service"; +import { FormControl, FormGroup, Validators } from "@angular/forms"; +import { LoaderService } from "../loader/loader.service"; +import { NotificationService } from "src/app/services/notification.service"; + +@Component({ + selector: "app-root", + templateUrl: "./login.component.html", + styleUrls: ["./login.component.scss"], +}) +export class LoginComponent implements OnInit { + loginForm: FormGroup = new FormGroup({ + userName: new FormControl("", Validators.required), + userPass: new FormControl("", Validators.required), + }); + + constructor( + private loginService: LoginService, + private formsService: FormsService, + private authService: AuthService, + private loaderService: LoaderService, + private notificationService: NotificationService, + private router: Router + ) {} + + ngOnInit() { + let userLoggedIn: Boolean = this.authService.checkUserLoggedIn(); + if (userLoggedIn) { + this.router.navigate(["/index"]); + } + } + + public resetForm(): void { + this.loginForm.reset(); + this.formsService.makeFormFieldsClean(this.loginForm); + } + + public login(): void { + this.formsService.makeFormFieldsDirty(this.loginForm); + + if (this.loginForm.valid) { + this.loaderService.show(); + + let userToLogin: LoginUser = new LoginUser( + this.loginForm.value.userName, + this.loginForm.value.userPass + ); + + this.loginService.login(userToLogin).subscribe({ + next: (resp: any) => { + if ( + resp != null && + resp.userId != null && + resp.userId.trim() !== "" && + resp.tokenValue != null && + resp.tokenValue.trim() !== "" + ) { + this.loginService.setSessionCurrentUser(resp); + this.router.navigate(["/"]); + } + }, + error: (error: HttpErrorResponse) => { + if (error != null) { + if (error.status === 0) { + console.log("Client error."); + this.notificationService.showSnackbar( + "Client error", + 3000, + "snackbar-warning", + true, + "alert-circle-outline" + ); + } else if (error.status === 401 || error.status === 403) { + this.loginForm.reset(); + this.formsService.makeFormFieldsClean(this.loginForm); + console.log("You are not authorized."); + } else if (error.status === 500) { + console.log("Server error occurred."); + } else { + console.log("Unknown error: " + error.status); + } + this.loaderService.hide(); + } + }, + }); + } + } +} diff --git a/rossa-tech-cli/src/app/components/snackbar/snackbar-component.scss b/rossa-tech-cli/src/app/components/snackbar/snackbar-component.scss new file mode 100644 index 0000000..8b68f95 --- /dev/null +++ b/rossa-tech-cli/src/app/components/snackbar/snackbar-component.scss @@ -0,0 +1,42 @@ +snack-bar-container.mat-mdc-snack-bar-container { + background-color: white; + padding: 10px 16px 10px 12px; + border-radius: 3px; + box-shadow: 1px 2px 10px 2px rgba(0, 0, 0, 0.12); + min-width: 352px; + max-width: 544px; +} + +div.snackbar { + color: #595959; + display: flex; + align-items: center; + + mat-icon.snackbar-icon { + margin-right: 12px; + } + + span.snackbar-text { + flex: 1; + } + + mat-icon.snackbar-btn { + color: #595959; + height: 22px; + width: 22px; + cursor: pointer; + margin-left: 72px; + } + + &.snackbar-warning { + color: red; + } + + &.snackbar-success { + color: green; + } + + &.snackbar-primary { + color: blue; + } +} diff --git a/rossa-tech-cli/src/app/components/snackbar/snackbar.component.html b/rossa-tech-cli/src/app/components/snackbar/snackbar.component.html new file mode 100644 index 0000000..b594167 --- /dev/null +++ b/rossa-tech-cli/src/app/components/snackbar/snackbar.component.html @@ -0,0 +1,7 @@ +
+ + + {{data?.message}} + + +
diff --git a/rossa-tech-cli/src/app/components/snackbar/snackbar.component.ts b/rossa-tech-cli/src/app/components/snackbar/snackbar.component.ts new file mode 100644 index 0000000..a1e1c9e --- /dev/null +++ b/rossa-tech-cli/src/app/components/snackbar/snackbar.component.ts @@ -0,0 +1,30 @@ +import { Component, Inject } from "@angular/core"; +import { MAT_SNACK_BAR_DATA, MatSnackBar } from "@angular/material/snack-bar"; + +@Component({ + selector: "app-snackbar", + templateUrl: "./snackbar.component.html", + styleUrls: ["snackbar-component.scss"], +}) +export class SnackbarComponent { + /* + * data = { + * message: string; snackbar text + * className: string; snackbar class + * btnLabel: string; Button label text + * icon: boolean; show icon + * iconName: string; name of the icon + * } + * + * icons: + * check + * alert-circle-outline + * information-slab-circle-outline + * server-off + * + */ + constructor( + @Inject(MAT_SNACK_BAR_DATA) public data: any, + public snackBar: MatSnackBar + ) {} +} diff --git a/rossa-tech-cli/src/app/components/subcomponents/consumption-last-year/consumption-last-year.component.html b/rossa-tech-cli/src/app/components/subcomponents/consumption-last-year/consumption-last-year.component.html index b8c9286..a5b622a 100644 --- a/rossa-tech-cli/src/app/components/subcomponents/consumption-last-year/consumption-last-year.component.html +++ b/rossa-tech-cli/src/app/components/subcomponents/consumption-last-year/consumption-last-year.component.html @@ -1,20 +1,43 @@
-
energy
-
-
{{averageEnergy1Log}} kWh
-
{{averageEnergy1Hem}} kWh
-
+

{{type}}

+ + + + 1LOG - Hausstrom + + + 1HEM - Heizstrom + + +
{{averageEnergy1Log}} kWh
+
+ +
{{averageEnergy1Hem}} kWh
+
+
- -
+ +
+

{{type}}

- - - - \ No newline at end of file + + + Wasser + + + Abwasser + + +
xxxxx
+
+ +
xxxxx
+
+
+
+
\ No newline at end of file diff --git a/rossa-tech-cli/src/app/components/subcomponents/consumption-last-year/consumption-last-year.component.ts b/rossa-tech-cli/src/app/components/subcomponents/consumption-last-year/consumption-last-year.component.ts index b5b5bfe..97b1805 100644 --- a/rossa-tech-cli/src/app/components/subcomponents/consumption-last-year/consumption-last-year.component.ts +++ b/rossa-tech-cli/src/app/components/subcomponents/consumption-last-year/consumption-last-year.component.ts @@ -1,44 +1,46 @@ -import { Component, Input, OnChanges } from '@angular/core'; -import { Meters } from 'src/app/models/Meter'; -import { MeterData } from 'src/app/models/Meterdata'; -import { UsageType } from 'src/app/models/UsageType'; -import { GlobalService } from 'src/app/services/global.service'; +import { Component, Input, OnChanges } from "@angular/core"; +import { Meters } from "src/app/dataModels/Meter"; +import { MeterData } from "src/app/dataModels/Meterdata"; +import { UsageType } from "src/app/dataModels/UsageType"; +import { GlobalService } from "src/app/services/global.service"; @Component({ - selector: 'app-consumption-last-year', - templateUrl: './consumption-last-year.component.html', - styleUrls: ['./consumption-last-year.component.scss'], + selector: "app-consumption-last-year", + templateUrl: "./consumption-last-year.component.html", + styleUrls: ["./consumption-last-year.component.scss"], }) export class ConsumptionLastYearComponent implements OnChanges { - @Input() meterData: MeterData[]; - @Input() type: UsageType; + @Input() + meterData!: MeterData[]; + @Input() + type!: UsageType; usageTypes = UsageType; meters = Meters; meterDataEnergy1Hem: MeterData[] = []; - averageEnergy1Hem: number; + averageEnergy1Hem!: number; meterDataEnergy1Log: MeterData[] = []; - averageEnergy1Log: number; + averageEnergy1Log!: number; meterDataWasser: MeterData[] = []; - averageWasser: number; + averageWasser!: number; meterDataAbwasser: MeterData[] = []; - averageDirtyAbwasser: number; + averageDirtyAbwasser!: number; constructor(private globalService: GlobalService) {} ngOnChanges(): void { if (this.type && this.type === this.usageTypes.ENERGY) { - console.log('count energy'); + console.log("count energy"); if (this.meterData) { this.meterData.forEach((data) => { - if (data.meter.name === this.meters['1LOG']) { + if (data.meter.name === this.meters["1LOG"]) { this.meterDataEnergy1Log.push(data); - } else if (data.meter.name === this.meters['1HEM']) { + } else if (data.meter.name === this.meters["1HEM"]) { this.meterDataEnergy1Hem.push(data); } }); @@ -61,13 +63,13 @@ export class ConsumptionLastYearComponent implements OnChanges { ); } } else if (this.type && this.type === this.usageTypes.WATER) { - console.log('count water'); + console.log("count water"); if (this.meterData) { this.meterData.forEach((data) => { - if (data.meter.name === this.meters['WASSER']) { + if (data.meter.name === this.meters["WASSER"]) { this.meterDataWasser.push(data); - } else if (data.meter.name === this.meters['ABWASSER']) { + } else if (data.meter.name === this.meters["ABWASSER"]) { this.meterDataAbwasser.push(data); } }); diff --git a/rossa-tech-cli/src/app/components/subcomponents/meter-data-list/meter-data-list.component.html b/rossa-tech-cli/src/app/components/subcomponents/meter-data-list/meter-data-list.component.html index 6508c54..1ad852d 100644 --- a/rossa-tech-cli/src/app/components/subcomponents/meter-data-list/meter-data-list.component.html +++ b/rossa-tech-cli/src/app/components/subcomponents/meter-data-list/meter-data-list.component.html @@ -1,5 +1,3 @@ -

{{type}}

-
diff --git a/rossa-tech-cli/src/app/components/subcomponents/meter-data-list/meter-data-list.component.ts b/rossa-tech-cli/src/app/components/subcomponents/meter-data-list/meter-data-list.component.ts index 87bf9f5..ae6f263 100644 --- a/rossa-tech-cli/src/app/components/subcomponents/meter-data-list/meter-data-list.component.ts +++ b/rossa-tech-cli/src/app/components/subcomponents/meter-data-list/meter-data-list.component.ts @@ -1,18 +1,20 @@ -import { Component, Input, OnChanges, OnInit } from '@angular/core'; -import { MatTableDataSource } from '@angular/material/table'; -import { UsageType } from 'src/app/models/UsageType'; -import { MeterData } from 'src/app/models/Meterdata'; +import { Component, Input, OnChanges, OnInit } from "@angular/core"; +import { MatTableDataSource } from "@angular/material/table"; +import { UsageType } from "src/app/dataModels/UsageType"; +import { MeterData } from "src/app/dataModels/Meterdata"; @Component({ - selector: 'app-meter-data-list', - templateUrl: './meter-data-list.component.html', - styleUrls: ['./meter-data-list.component.scss'], + selector: "app-meter-data-list", + templateUrl: "./meter-data-list.component.html", + styleUrls: ["./meter-data-list.component.scss"], }) export class MeterDataListComponent implements OnInit, OnChanges { - @Input() meterData: MeterData[]; - @Input() type: UsageType; + @Input() + meterData: MeterData[] = []; + @Input() + type: UsageType = UsageType.ENERGY; - displayedColumns: string[] = ['id', 'date', 'amount', 'meter']; + displayedColumns: string[] = ["id", "date", "amount", "meter"]; dataSource = new MatTableDataSource(); // dataSource = [ diff --git a/rossa-tech-cli/src/app/components/subcomponents/meter-data-wrapper/meter-data-wrapper.component.ts b/rossa-tech-cli/src/app/components/subcomponents/meter-data-wrapper/meter-data-wrapper.component.ts index b7c0998..d74bf51 100644 --- a/rossa-tech-cli/src/app/components/subcomponents/meter-data-wrapper/meter-data-wrapper.component.ts +++ b/rossa-tech-cli/src/app/components/subcomponents/meter-data-wrapper/meter-data-wrapper.component.ts @@ -1,16 +1,18 @@ -import { Component, Input, OnChanges } from '@angular/core'; -import { MeterData } from 'src/app/models/Meterdata'; -import { UsageType } from 'src/app/models/UsageType'; -import { GlobalService } from 'src/app/services/global.service'; +import { Component, Input, OnChanges } from "@angular/core"; +import { MeterData } from "src/app/dataModels/Meterdata"; +import { UsageType } from "src/app/dataModels/UsageType"; +import { GlobalService } from "src/app/services/global.service"; @Component({ - selector: 'app-meter-data-wrapper', - templateUrl: './meter-data-wrapper.component.html', - styleUrls: ['./meter-data-wrapper.component.scss'], + selector: "app-meter-data-wrapper", + templateUrl: "./meter-data-wrapper.component.html", + styleUrls: ["./meter-data-wrapper.component.scss"], }) export class MeterDataWrapperComponent /* implements OnChanges */ { - @Input() meterData: MeterData[]; - @Input() type: UsageType; + @Input() + meterData: MeterData[] = []; + @Input() + type: UsageType = UsageType.ENERGY; // usageTypes = UsageType; // averageConsumptionLastYear: number; diff --git a/rossa-tech-cli/src/app/dataModels/Meter.ts b/rossa-tech-cli/src/app/dataModels/Meter.ts new file mode 100644 index 0000000..161a3a9 --- /dev/null +++ b/rossa-tech-cli/src/app/dataModels/Meter.ts @@ -0,0 +1,16 @@ +export class Meter { + id: number; + name: '1LOG' | '1HEM' | 'WASSER' | 'ABWASSER'; + + constructor(id: number, name: '1LOG' | '1HEM' | 'WASSER' | 'ABWASSER') { + this.id = id; + this.name = name; + } +} + +export enum Meters { + '1LOG' = '1LOG', + '1HEM' = '1HEM', + 'WASSER' = 'WASSER', + 'ABWASSER' = 'ABWASSER', +} diff --git a/rossa-tech-cli/src/app/dataModels/Meterdata.ts b/rossa-tech-cli/src/app/dataModels/Meterdata.ts new file mode 100644 index 0000000..8766848 --- /dev/null +++ b/rossa-tech-cli/src/app/dataModels/Meterdata.ts @@ -0,0 +1,23 @@ +import { Meter } from "./Meter"; + +export class MeterData { + id?: number; + type: "ENERGY" | "WATER"; + date: Date; + amount: number; + meter: Meter; + + constructor( + type: "ENERGY" | "WATER", + date: Date, + amount: number, + meter: Meter, + id?: number + ) { + this.id = id; + this.type = type; + this.date = date; + this.amount = amount; + this.meter = meter; + } +} diff --git a/rossa-tech-cli/src/app/dataModels/UsageType.ts b/rossa-tech-cli/src/app/dataModels/UsageType.ts new file mode 100644 index 0000000..7344aba --- /dev/null +++ b/rossa-tech-cli/src/app/dataModels/UsageType.ts @@ -0,0 +1,4 @@ +export enum UsageType { + ENERGY = 'ENERGY', + WATER = 'WATER' +} diff --git a/rossa-tech-cli/src/app/dataModels/gameTitle.type.ts b/rossa-tech-cli/src/app/dataModels/gameTitle.type.ts new file mode 100644 index 0000000..b69bd83 --- /dev/null +++ b/rossa-tech-cli/src/app/dataModels/gameTitle.type.ts @@ -0,0 +1,49 @@ +export class GameTitle { + constructor( + private gameTitle: String, + private publisher: String, + private devStudioName: String, + private publishingYear: Number, + private retailPrice: Number + ) {} + + public get gameTitleValue(): String { + return this.gameTitle; + } + + public set gameTitleValue(val: String) { + this.gameTitle = val; + } + + public get publisherValue(): String { + return this.publisher; + } + + public set publisherValue(val: String) { + this.publisher = val; + } + + public get devStudioNameValue(): String { + return this.devStudioName; + } + + public set devStudioNameValue(val: String) { + this.devStudioName = val; + } + + public get publishingYearValue(): Number { + return this.publishingYear; + } + + public set publishingYearValue(val: Number) { + this.publishingYearValue = val; + } + + public get retailPriceValue(): Number { + return this.retailPrice; + } + + public set retailPriceValue(val: Number) { + this.retailPrice = val; + } +} diff --git a/rossa-tech-cli/src/app/dataModels/info.md b/rossa-tech-cli/src/app/dataModels/info.md new file mode 100644 index 0000000..e17c3eb --- /dev/null +++ b/rossa-tech-cli/src/app/dataModels/info.md @@ -0,0 +1,15 @@ +CREATE TABLE meter ( + id INT NOT NULL AUTO_INCREMENT, + name VARCHAR(255) NOT NULL, + PRIMARY KEY (id) +); + +CREATE TABLE meterdata ( + id INT NOT NULL AUTO_INCREMENT, + type ENUM('energy', 'water') NOT NULL, + date DATETIME NOT NULL, + amount FLOAT NOT NULL, + meter_id INT NOT NULL, + PRIMARY KEY (id), + FOREIGN KEY (meter_id) REFERENCES meter(id) +); diff --git a/rossa-tech-cli/src/app/dataModels/loginUser.type.ts b/rossa-tech-cli/src/app/dataModels/loginUser.type.ts new file mode 100644 index 0000000..e6282fb --- /dev/null +++ b/rossa-tech-cli/src/app/dataModels/loginUser.type.ts @@ -0,0 +1,19 @@ +export class LoginUser { + constructor(private userName: String, private userPass: String) {} + + public get userNameValue() { + return this.userName; + } + + public set userNameValue(val: String) { + this.userName = val; + } + + public get userPassValue() { + return this.userPass; + } + + public set userPassValue(val: String) { + this.userPass = val; + } +} diff --git a/rossa-tech-cli/src/app/dataModels/userRole.type.ts b/rossa-tech-cli/src/app/dataModels/userRole.type.ts new file mode 100644 index 0000000..81170a0 --- /dev/null +++ b/rossa-tech-cli/src/app/dataModels/userRole.type.ts @@ -0,0 +1,19 @@ +export class UserRole { + constructor(private roleId: String, private roleName: String) {} + + public get roleIdValue(): String { + return this.roleId; + } + + public set roleIdValue(val: String) { + this.roleId = val; + } + + public get roleNameValue(): String { + return this.roleName; + } + + public set roleNameValue(val: String) { + this.roleName = val; + } +} diff --git a/rossa-tech-cli/src/app/dialogs/meter-data-add-dialog/meter-data-add-dialog.component.html b/rossa-tech-cli/src/app/dialogs/meter-data-add-dialog/meter-data-add-dialog.component.html new file mode 100644 index 0000000..5d579f3 --- /dev/null +++ b/rossa-tech-cli/src/app/dialogs/meter-data-add-dialog/meter-data-add-dialog.component.html @@ -0,0 +1,25 @@ +

Neuer Eintrag - Typ: {{usageType}}

+
+
+ + + + + + + + Meter + + {{el.name}} + + + + + + +
+ +
+ +
+ \ No newline at end of file diff --git a/rossa-tech-cli/src/app/dialogs/meter-data-add-dialog/meter-data-add-dialog.component.scss b/rossa-tech-cli/src/app/dialogs/meter-data-add-dialog/meter-data-add-dialog.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/rossa-tech-cli/src/app/dialogs/meter-data-add-dialog/meter-data-add-dialog.component.spec.ts b/rossa-tech-cli/src/app/dialogs/meter-data-add-dialog/meter-data-add-dialog.component.spec.ts new file mode 100644 index 0000000..46fe399 --- /dev/null +++ b/rossa-tech-cli/src/app/dialogs/meter-data-add-dialog/meter-data-add-dialog.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { MeterDataAddDialogComponent } from './meter-data-add-dialog.component'; + +describe('MeterDataAddDialogComponent', () => { + let component: MeterDataAddDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ MeterDataAddDialogComponent ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(MeterDataAddDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/rossa-tech-cli/src/app/dialogs/meter-data-add-dialog/meter-data-add-dialog.component.ts b/rossa-tech-cli/src/app/dialogs/meter-data-add-dialog/meter-data-add-dialog.component.ts new file mode 100644 index 0000000..3d048db --- /dev/null +++ b/rossa-tech-cli/src/app/dialogs/meter-data-add-dialog/meter-data-add-dialog.component.ts @@ -0,0 +1,64 @@ +import { Component, OnInit } from "@angular/core"; +import { FormBuilder, FormGroup, Validators } from "@angular/forms"; +import { MatDialogRef } from "@angular/material/dialog"; +import { Meter, Meters } from "src/app/dataModels/Meter"; +import { MeterData } from "src/app/dataModels/Meterdata"; +import { UsageType } from "src/app/dataModels/UsageType"; +import { DatabaseService } from "src/app/services/database.service"; + +@Component({ + selector: "app-meter-data-add-dialog", + templateUrl: "./meter-data-add-dialog.component.html", + styleUrls: ["./meter-data-add-dialog.component.scss"], +}) +export class MeterDataAddDialogComponent implements OnInit { + meters: Meter[] = []; + usageTypes = UsageType; + usageType: UsageType = UsageType.ENERGY; + + form: FormGroup = this.fb.group({ + date: [new Date(), Validators.required], + meter: ["", Validators.required], + amount: ["", Validators.required], + }); + + constructor( + private fb: FormBuilder, + private dialogRef: MatDialogRef, + private dataService: DatabaseService + ) {} + + ngOnInit(): void { + this.dataService.getMeters().subscribe({ + next: (meters: Meter[]) => { + console.log({ meters }); + this.meters = meters; + }, + error: (err) => { + console.log("get meters error", { err }); + }, + }); + } + + submit() { + if (this.form.valid) { + const formValues = this.form.value; + const newMeterData: MeterData = { + amount: formValues.amount, + date: formValues.date, + meter: formValues.meter, + type: this.usageType, + }; + + this.dialogRef.close(newMeterData); + } + } + + setUsageType(meterName: string): void { + if (meterName === Meters["1HEM"] || meterName === Meters["1LOG"]) { + this.usageType = this.usageTypes.ENERGY; + } else if (meterName === Meters.ABWASSER || meterName === Meters.WASSER) { + this.usageType = this.usageTypes.WATER; + } + } +} diff --git a/rossa-tech-cli/src/app/services/database.service.ts b/rossa-tech-cli/src/app/services/database.service.ts index d1a5e39..71fec86 100644 --- a/rossa-tech-cli/src/app/services/database.service.ts +++ b/rossa-tech-cli/src/app/services/database.service.ts @@ -1,22 +1,34 @@ -import { MeterData } from './../models/Meterdata'; -import { Injectable } from '@angular/core'; -import { HttpClient, HttpErrorResponse } from '@angular/common/http'; -import { Observable, throwError } from 'rxjs'; -import { catchError } from 'rxjs/operators'; -import { Meter } from 'src/app/models/Meter'; -import { environment } from 'src/environments/environment'; +import { Injectable } from "@angular/core"; +import { + HttpClient, + HttpErrorResponse, + HttpHeaders, +} from "@angular/common/http"; +import { Observable, throwError } from "rxjs"; +import { catchError } from "rxjs/operators"; +import { environment } from "src/environments/environment"; +import { MeterData } from "../dataModels/Meterdata"; +import { Meter } from "../dataModels/Meter"; +import { LoginService } from "../auth/login.service"; @Injectable({ - providedIn: 'root', + providedIn: "root", }) export class DatabaseService { - private baseUrl = environment.hostUrl + '/v1'; + private baseUrl = environment.apiBaseUrl; - constructor(private http: HttpClient) {} + constructor(private http: HttpClient, private userService: LoginService) {} getMeterData(): Observable { const url = `${this.baseUrl}/meter-data`; - return this.http.get(url).pipe(catchError(this.handleError)); + let jwtToken: String = this.userService.getUserSecurityToken(), + headers: HttpHeaders = new HttpHeaders({ + authorization: "bearer " + jwtToken, + }), + options = { headers: headers }; + return this.http + .get(url, options) + .pipe(catchError(this.handleError)); } getMeterDataByType(usageType: string): Observable { @@ -41,7 +53,7 @@ export class DatabaseService { if (error.error instanceof ErrorEvent) { // A client-side or network error occurred. Handle it accordingly. - console.error('An error occurred:', error.error.message); + console.error("An error occurred:", error.error.message); } else { // The backend returned an unsuccessful response code. // The response body may contain clues as to what went wrong. diff --git a/rossa-tech-cli/src/app/services/error.service.ts b/rossa-tech-cli/src/app/services/error.service.ts new file mode 100644 index 0000000..88ba530 --- /dev/null +++ b/rossa-tech-cli/src/app/services/error.service.ts @@ -0,0 +1,63 @@ +import { Injectable } from "@angular/core"; +import { HttpErrorResponse } from "@angular/common/http"; +import { NotificationService } from "./notification.service"; +import { LoginService } from "../auth/login.service"; +import { PageSecurityService } from "./pageSecurity.service"; + +@Injectable({ + providedIn: "root", +}) +export class ErrorService { + constructor( + private notificationService: NotificationService, + private loginService: LoginService, + private pageSecurityService: PageSecurityService + ) {} + + handleError(error: HttpErrorResponse): void { + if (error != null) { + if (error.status === 0) { + console.log("Client error."); + this.notificationService.showSnackbar( + "Client error", + 3000, + "snackbar-warning", + true, + "alert-circle-outline" + ); + } else if (error.status === 401 || error.status === 403) { + console.log("You are not authorized."); + // todo: redirect to login page? + + this.loginService.removeSessionCurrentUser(); + this.pageSecurityService.gotoLoginPage(); + + this.notificationService.showSnackbar( + "You are not authorized", + 3000, + "snackbar-warning", + true, + "cancel" + ); + } else if (error.status === 500) { + console.log("Server error occurred."); + this.notificationService.showSnackbar( + "Server error occurred", + 3000, + "snackbar-warning", + true, + "server-off" + ); + } else { + console.log("Unknown error: " + error.status); + this.notificationService.showSnackbar( + "Unknown error", + 3000, + "snackbar-warning", + true, + "alert-circle-outline" + ); + } + } + } +} diff --git a/rossa-tech-cli/src/app/services/forms.service.ts b/rossa-tech-cli/src/app/services/forms.service.ts new file mode 100644 index 0000000..a98b404 --- /dev/null +++ b/rossa-tech-cli/src/app/services/forms.service.ts @@ -0,0 +1,23 @@ +import { Injectable } from "@angular/core"; + +@Injectable({ + providedIn: "root", +}) +export class FormsService { + public makeFormFieldsClean(formToCheck: any): void { + if (formToCheck != null) { + Object.keys(formToCheck.controls).forEach((key) => { + formToCheck.controls[key].markAsUntouched({}); + formToCheck.controls[key].markAsPristine(); + }); + } + } + + public makeFormFieldsDirty(formToCheck: any): void { + if (formToCheck != null) { + Object.keys(formToCheck.controls).forEach((key) => { + formToCheck.controls[key].markAsDirty(); + }); + } + } +} diff --git a/rossa-tech-cli/src/app/services/gameTitles.service.ts b/rossa-tech-cli/src/app/services/gameTitles.service.ts new file mode 100644 index 0000000..3d31943 --- /dev/null +++ b/rossa-tech-cli/src/app/services/gameTitles.service.ts @@ -0,0 +1,25 @@ +import { Injectable } from "@angular/core"; +import { HttpClient, HttpHeaders } from "@angular/common/http"; +import { Observable } from "rxjs"; + +import { environment } from "../../environments/environment"; +import { LoginService } from "../auth/login.service"; + +@Injectable({ + providedIn: "root", +}) +export class GameTitlesService { + constructor(private http: HttpClient, private userService: LoginService) {} + + public getAllGameTitles(): Observable { + let jwtToken: String = this.userService.getUserSecurityToken(), + headers: HttpHeaders = new HttpHeaders({ + authorization: "bearer " + jwtToken, + }), + options = { headers: headers }; + return this.http.get( + environment.apiBaseUrl + "secure/allGameTitles", + options + ); + } +} diff --git a/rossa-tech-cli/src/app/services/global.service.ts b/rossa-tech-cli/src/app/services/global.service.ts index 3c63bbd..1dd41c2 100644 --- a/rossa-tech-cli/src/app/services/global.service.ts +++ b/rossa-tech-cli/src/app/services/global.service.ts @@ -1,8 +1,8 @@ -import { Injectable } from '@angular/core'; -import { MeterData } from '../models/Meterdata'; +import { Injectable } from "@angular/core"; +import { MeterData } from "../dataModels/Meterdata"; @Injectable({ - providedIn: 'root', + providedIn: "root", }) export class GlobalService { constructor() {} diff --git a/rossa-tech-cli/src/app/services/notification.service.ts b/rossa-tech-cli/src/app/services/notification.service.ts new file mode 100644 index 0000000..502776b --- /dev/null +++ b/rossa-tech-cli/src/app/services/notification.service.ts @@ -0,0 +1,71 @@ +import { Injectable, OnDestroy } from "@angular/core"; +import { MatSnackBar } from "@angular/material/snack-bar"; +import { Subscription } from "rxjs"; +import { SnackbarComponent } from "../components/snackbar/snackbar.component"; + +interface SnackbarData { + message: string; + className?: string; + icon?: boolean; + iconName?: string; +} + +@Injectable({ + providedIn: "root", +}) +export class NotificationService implements OnDestroy { + // Configuration api subscription + private configState!: Subscription; + + /** + * Constructor + * @param toast MatSnackBar + */ + constructor(private toast: MatSnackBar) {} + + /** + * Unsubscribe from the config state + * when the component is destroyed, and remove + * the in-memory parameters. + */ + ngOnDestroy(): void { + this.configState.unsubscribe(); + } + + /** + * Display a MatSnackbar notification and return the reference. + * @param message string + * @param durationTime number in milliceconds + * @param className string snackbar-warning, snackbar-success, snackbar-primary + * @param icon boolean + * @param iconName string name of the icon + */ + showSnackbar( + message: string, + durationTime?: number, + className?: string, + icon?: boolean, + iconName?: string + ): void { + const duration = durationTime || 8000; + + const data: SnackbarData = { + message, + }; + + if (icon && iconName) { + data.icon = icon; + data.iconName = iconName; + } + if (className) { + data.className = className; + } + + this.toast.openFromComponent(SnackbarComponent, { + data, + duration, + horizontalPosition: "left", + verticalPosition: "bottom", + }); + } +} diff --git a/rossa-tech-cli/src/app/services/pageSecurity.service.ts b/rossa-tech-cli/src/app/services/pageSecurity.service.ts new file mode 100644 index 0000000..7b080e5 --- /dev/null +++ b/rossa-tech-cli/src/app/services/pageSecurity.service.ts @@ -0,0 +1,28 @@ +import { Injectable } from "@angular/core"; +import { Router } from "@angular/router"; +import { HttpErrorResponse } from "@angular/common/http"; + +@Injectable({ + providedIn: "root", +}) +export class PageSecurityService { + constructor(private router: Router) {} + + public gotoLoginPage() { + this.router.navigate(["/login"]); + } + + public checkPageSecurityError(httpError: HttpErrorResponse) { + if (!httpError || httpError.status == null) { + throw new Error("Invalid http error object."); + } + + if (httpError.status === 401) { + this.gotoLoginPage(); + } + + if (httpError.status === 403) { + this.router.navigate(["/accessDenied"]); + } + } +} diff --git a/rossa-tech-cli/src/custom-theme.scss b/rossa-tech-cli/src/custom-theme.scss new file mode 100644 index 0000000..d2f3031 --- /dev/null +++ b/rossa-tech-cli/src/custom-theme.scss @@ -0,0 +1,146 @@ +@use "@angular/material" as mat; + +@import "https://fonts.googleapis.com/icon?family=Material+Icons"; +@import url("https://fonts.googleapis.com/css2?family=Open+Sans:wght@300;400;500&display=swap"); + +$mat-primary: ( + 50: #e0edf7, + 100: #b3d2ec, + 200: #80b4df, + 300: #4d96d2, + 400: #2680c9, + 500: #0069bf, + 600: #0061b9, + 700: #0056b1, + 800: #004ca9, + 900: #003b9b, + A100: #c6d7ff, + A200: #93b3ff, + A400: #6090ff, + A700: #477eff, + contrast: ( + 50: #333333, + 100: #333333, + 200: #333333, + 300: #333333, + 400: #ffffff, + 500: #ffffff, + 600: #ffffff, + 700: #ffffff, + 800: #ffffff, + 900: #ffffff, + A100: #333333, + A200: #333333, + A400: #333333, + A700: #ffffff, + ), +); + +$mat-accent: ( + 50: #f1f8e5, + 100: #ddedbf, + 200: #c6e194, + 300: #afd469, + 400: #9dcb49, + 500: #8cc229, + 600: #84bc24, + 700: #79b41f, + 800: #6fac19, + 900: #5c9f0f, + A100: #e7ffcf, + A200: #cdff9c, + A400: #b3ff69, + A700: #a6ff4f, + contrast: ( + 50: #333333, + 100: #333333, + 200: #333333, + 300: #333333, + 400: #333333, + 500: #333333, + 600: #333333, + 700: #333333, + 800: #333333, + 900: #ffffff, + A100: #333333, + A200: #333333, + A400: #333333, + A700: #333333, + ), +); + +$mat-warn: ( + 50: #fde8e8, + 100: #f9c6c6, + 200: #f6a0a0, + 300: #f27a7a, + 400: #ef5e5e, + 500: #ec4141, + 600: #ea3b3b, + 700: #e73232, + 800: #e42a2a, + 900: #df1c1c, + A100: #ffffff, + A200: #ffe0e0, + A400: #ffadad, + A700: #ff9494, + contrast: ( + 50: #333333, + 100: #333333, + 200: #333333, + 300: #333333, + 400: #333333, + 500: #ffffff, + 600: #ffffff, + 700: #ffffff, + 800: #ffffff, + 900: #ffffff, + A100: #333333, + A200: #333333, + A400: #333333, + A700: #333333, + ), +); + +// http://material-angular-dashboard.creativeit.io/ +$rossa-tech-typography: mat.define-typography-config( + $font-family: "Open Sans", + $body-1: mat.define-typography-level(14px, 20px, 400, $letter-spacing: normal), + $button: mat.define-typography-level(16px, 20px, 400, $letter-spacing: normal), +); + +// $fontConfig: ( +// display-4: mat.define-typography-level(112px, 112px, 300, 'Open Sans', -0.0134em), +// display-3: mat.define-typography-level(56px, 56px, 400, 'Open Sans', -0.0089em), +// display-2: mat.define-typography-level(45px, 48px, 400, 'Open Sans', 0.0000em), +// display-1: mat.define-typography-level(34px, 40px, 400, 'Open Sans', 0.0074em), +// headline: mat.define-typography-level(24px, 32px, 400, 'Open Sans', 0.0000em), +// title: mat.define-typography-level(20px, 32px, 500, 'Open Sans', 0.0075em), +// subheading-2: mat.define-typography-level(16px, 28px, 400, 'Open Sans', 0.0094em), +// subheading-1: mat.define-typography-level(15px, 24px, 500, 'Open Sans', 0.0067em), +// body-2: mat.define-typography-level(14px, 24px, 500, 'Open Sans', 0.0179em), +// body-1: mat.define-typography-level(14px, 20px, 400, 'Open Sans', 0.0179em), +// button: mat.define-typography-level(14px, 14px, 500, 'Open Sans', 0.0893em), +// caption: mat.define-typography-level(12px, 20px, 400, 'Open Sans', 0.0333em), +// input: mat.define-typography-level(inherit, 1.125, 400, 'Open Sans', 1.5px) +// ); + +$rossa-tech-primary: mat.define-palette($mat-primary); +$rossa-tech-accent: mat.define-palette($mat-accent); +$rossa-tech-warn: mat.define-palette($mat-warn); + +$rossa-tech-theme: mat.define-light-theme( + ( + color: ( + primary: $rossa-tech-primary, + accent: $rossa-tech-accent, + warn: $rossa-tech-warn, + ), + typography: $rossa-tech-typography, + ) +); + +@include mat.core(); + +@include mat.core-theme($rossa-tech-theme); +@include mat.all-component-themes($rossa-tech-theme); diff --git a/rossa-tech-cli/src/environments/environment.prod.ts b/rossa-tech-cli/src/environments/environment.prod.ts index 9448b2e..be3bac4 100644 --- a/rossa-tech-cli/src/environments/environment.prod.ts +++ b/rossa-tech-cli/src/environments/environment.prod.ts @@ -1,5 +1,5 @@ export const environment = { production: true, - env: 'prod', - hostUrl: 'http://192.168.178.21:8182/api', + env: "prod", + apiBaseUrl: "http://192.168.178.21:8182/api", }; diff --git a/rossa-tech-cli/src/environments/environment.ts b/rossa-tech-cli/src/environments/environment.ts index e112911..c54b49c 100644 --- a/rossa-tech-cli/src/environments/environment.ts +++ b/rossa-tech-cli/src/environments/environment.ts @@ -1,12 +1,13 @@ // This file can be replaced during build by using the `fileReplacements` array. -// `ng build --prod` replaces `environment.ts` with `environment.prod.ts`. +// `ng build` replaces `environment.ts` with `environment.prod.ts`. // The list of file replacements can be found in `angular.json`. export const environment = { - production: true, - env: 'prod', - hostUrl: 'http://localhost:8080/', + production: false, + env: "local", + apiBaseUrl: "http://localhost:8080", }; + /* * For easier debugging in development mode, you can import the following file * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`. @@ -14,4 +15,4 @@ export const environment = { * This import should be commented out in production mode because it will have a negative impact * on performance if an error is thrown. */ -import 'zone.js/dist/zone-error'; // Included with Angular CLI. +// import 'zone.js/plugins/zone-error'; // Included with Angular CLI. diff --git a/rossa-tech-cli/src/index.html b/rossa-tech-cli/src/index.html index 1fb1d01..84d6baa 100644 --- a/rossa-tech-cli/src/index.html +++ b/rossa-tech-cli/src/index.html @@ -3,11 +3,13 @@ - RossaTechCli + Rossa-Tech + + diff --git a/rossa-tech-cli/src/main.ts b/rossa-tech-cli/src/main.ts index c58dc05..c7b673c 100644 --- a/rossa-tech-cli/src/main.ts +++ b/rossa-tech-cli/src/main.ts @@ -1,7 +1,12 @@ +import { enableProdMode } from '@angular/core'; import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; import { AppModule } from './app/app.module'; +import { environment } from './environments/environment'; +if (environment.production) { + enableProdMode(); +} platformBrowserDynamic().bootstrapModule(AppModule) .catch(err => console.error(err)); diff --git a/rossa-tech-cli/src/polyfills.ts b/rossa-tech-cli/src/polyfills.ts new file mode 100644 index 0000000..429bb9e --- /dev/null +++ b/rossa-tech-cli/src/polyfills.ts @@ -0,0 +1,53 @@ +/** + * This file includes polyfills needed by Angular and is loaded before the app. + * You can add your own extra polyfills to this file. + * + * This file is divided into 2 sections: + * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. + * 2. Application imports. Files imported after ZoneJS that should be loaded before your main + * file. + * + * The current setup is for so-called "evergreen" browsers; the last versions of browsers that + * automatically update themselves. This includes recent versions of Safari, Chrome (including + * Opera), Edge on the desktop, and iOS and Chrome on mobile. + * + * Learn more in https://angular.io/guide/browser-support + */ + +/*************************************************************************************************** + * BROWSER POLYFILLS + */ + +/** + * By default, zone.js will patch all possible macroTask and DomEvents + * user can disable parts of macroTask/DomEvents patch by setting following flags + * because those flags need to be set before `zone.js` being loaded, and webpack + * will put import in the top of bundle, so user need to create a separate file + * in this directory (for example: zone-flags.ts), and put the following flags + * into that file, and then add the following code before importing zone.js. + * import './zone-flags'; + * + * The flags allowed in zone-flags.ts are listed here. + * + * The following flags will work for all browsers. + * + * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame + * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick + * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames + * + * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js + * with the following flag, it will bypass `zone.js` patch for IE/Edge + * + * (window as any).__Zone_enable_cross_context_check = true; + * + */ + +/*************************************************************************************************** + * Zone JS is required by default for Angular itself. + */ +import 'zone.js'; // Included with Angular CLI. + + +/*************************************************************************************************** + * APPLICATION IMPORTS + */ diff --git a/rossa-tech-cli/src/styles.scss b/rossa-tech-cli/src/styles.scss index 8d4e532..85d2853 100644 --- a/rossa-tech-cli/src/styles.scss +++ b/rossa-tech-cli/src/styles.scss @@ -1,151 +1,3 @@ -@use '@angular/material' as mat; - -@import 'https://fonts.googleapis.com/icon?family=Material+Icons'; -@import url('https://fonts.googleapis.com/css2?family=Open+Sans:wght@300;400;500&display=swap'); - -$mat-primary: ( - 50: #e0edf7, - 100: #b3d2ec, - 200: #80b4df, - 300: #4d96d2, - 400: #2680c9, - 500: #0069bf, - 600: #0061b9, - 700: #0056b1, - 800: #004ca9, - 900: #003b9b, - A100: #c6d7ff, - A200: #93b3ff, - A400: #6090ff, - A700: #477eff, - contrast: ( - 50: #333333, - 100: #333333, - 200: #333333, - 300: #333333, - 400: #ffffff, - 500: #ffffff, - 600: #ffffff, - 700: #ffffff, - 800: #ffffff, - 900: #ffffff, - A100: #333333, - A200: #333333, - A400: #333333, - A700: #ffffff, - ), -); - -$mat-accent: ( - 50: #f1f8e5, - 100: #ddedbf, - 200: #c6e194, - 300: #afd469, - 400: #9dcb49, - 500: #8cc229, - 600: #84bc24, - 700: #79b41f, - 800: #6fac19, - 900: #5c9f0f, - A100: #e7ffcf, - A200: #cdff9c, - A400: #b3ff69, - A700: #a6ff4f, - contrast: ( - 50: #333333, - 100: #333333, - 200: #333333, - 300: #333333, - 400: #333333, - 500: #333333, - 600: #333333, - 700: #333333, - 800: #333333, - 900: #ffffff, - A100: #333333, - A200: #333333, - A400: #333333, - A700: #333333, - ), -); - -$mat-warn: ( - 50: #fde8e8, - 100: #f9c6c6, - 200: #f6a0a0, - 300: #f27a7a, - 400: #ef5e5e, - 500: #ec4141, - 600: #ea3b3b, - 700: #e73232, - 800: #e42a2a, - 900: #df1c1c, - A100: #ffffff, - A200: #ffe0e0, - A400: #ffadad, - A700: #ff9494, - contrast: ( - 50: #333333, - 100: #333333, - 200: #333333, - 300: #333333, - 400: #333333, - 500: #ffffff, - 600: #ffffff, - 700: #ffffff, - 800: #ffffff, - 900: #ffffff, - A100: #333333, - A200: #333333, - A400: #333333, - A700: #333333, - ), -); - -// http://material-angular-dashboard.creativeit.io/ - -// define-typography-level(font-size, line-height, font-weight, letter-spacing) -$typography: mat.define-typography-config( - $font-family: 'Open Sans', - $body-1: mat.define-typography-level(14px, 20px, 400, $letter-spacing: normal), - $button: mat.define-typography-level(16px, 20px, 400, $letter-spacing: normal), -); - -// $fontConfig: ( -// display-4: mat.define-typography-level(112px, 112px, 300, 'Open Sans', -0.0134em), -// display-3: mat.define-typography-level(56px, 56px, 400, 'Open Sans', -0.0089em), -// display-2: mat.define-typography-level(45px, 48px, 400, 'Open Sans', 0.0000em), -// display-1: mat.define-typography-level(34px, 40px, 400, 'Open Sans', 0.0074em), -// headline: mat.define-typography-level(24px, 32px, 400, 'Open Sans', 0.0000em), -// title: mat.define-typography-level(20px, 32px, 500, 'Open Sans', 0.0075em), -// subheading-2: mat.define-typography-level(16px, 28px, 400, 'Open Sans', 0.0094em), -// subheading-1: mat.define-typography-level(15px, 24px, 500, 'Open Sans', 0.0067em), -// body-2: mat.define-typography-level(14px, 24px, 500, 'Open Sans', 0.0179em), -// body-1: mat.define-typography-level(14px, 20px, 400, 'Open Sans', 0.0179em), -// button: mat.define-typography-level(14px, 14px, 500, 'Open Sans', 0.0893em), -// caption: mat.define-typography-level(12px, 20px, 400, 'Open Sans', 0.0333em), -// input: mat.define-typography-level(inherit, 1.125, 400, 'Open Sans', 1.5px) -// ); - -$primary: mat.define-palette($mat-primary); -$accent: mat.define-palette($mat-accent); -$warn: mat.define-palette($mat-warn); - -$theme: mat.define-light-theme( - ( - color: ( - primary: $primary, - accent: $accent, - warn: $warn, - ), - typography: $typography, - ) -); - -@include mat.core(); -@include mat.core-theme($theme); -@include mat.all-component-themes($theme); - html, body { height: 100%; @@ -161,7 +13,7 @@ html.cdk-global-scrollblock { body { // margin: 0; - font-family: 'Open Sans', sans-serif; + font-family: "Open Sans", sans-serif; // height: 100vh; margin: 0; padding: 0; @@ -199,248 +51,3 @@ div.mat-grid-tile-content { overflow-y: auto; overflow-x: hidden; } -/*--------------------------------------------------*/ - -// /** -// * Generated theme by Material Theme Generator -// * https://materialtheme.arcsine.dev -// * Fork at: https://materialtheme.arcsine.dev/?c=YHBhbGV0dGU$YHByaW1hcnk$YF48IzQ0NDQ0NCIsIj9lcjwjYzdjN2M3IiwiO2VyPCMyZDJkMmR$LCIlPmBePCMyYTdhYWIiLCI~ZXI8I2JmZDdlNiIsIjtlcjwjMTk1ZDkxfiwid2Fybj5gXjwjZjE4ZTU0IiwiP2VyPCNmYmRkY2MiLCI7ZXI8I2ViNzEzYX4sIj9UZXh0PCMyYzJjMmMiLCI~PTwjZTllNGU0IiwiO1RleHQ8I2U5ZTRlNCIsIjs9PCMyYzJjMmN$LCJmb250cz5bYEA8KC00IiwiZmFtaWx5PE9wZW4gU2Fuc34sYEA8KC0zIiwiZmFtaWx5PE9wZW4gU2Fuc34sYEA8KC0yIiwiZmFtaWx5PE9wZW4gU2Fuc34sYEA8KC0xIiwiZmFtaWx5PE9wZW4gU2Fuc34sYEA8aGVhZGxpbmUiLCJmYW1pbHk8T3BlbiBTYW5zfixgQDx0aXRsZSIsImZhbWlseTxPcGVuIFNhbnN$LGBAPHN1YiktMiIsImZhbWlseTxPcGVuIFNhbnN$LGBAPHN1YiktMSIsImZhbWlseTxPcGVuIFNhbnN$LGBAPGJvZHktMiIsImZhbWlseTxPcGVuIFNhbnN$LGBAPGJvZHktMSIsImZhbWlseTxPcGVuIFNhbnN$LGBAPGJ1dHRvbiIsImZhbWlseTxPcGVuIFNhbnN$LGBAPGNhcHRpb24iLCJmYW1pbHk8T3BlbiBTYW5zfixgQDxpbnB1dCIsImZhbWlseTxPcGVuIFNhbnMiLCJzaXplPm51bGx9XSwiaWNvbnM8RmlsbGVkIiwiP25lc3M$ZmFsc2UsInZlcnNpb24$MTN9 -// */ - -// @use '@angular/material' as mat; - -// // Include the common styles for Angular Material. We include this here so that you only -// // have to load a single css file for Angular Material in your app. - -// // Fonts - -// // Foreground Elements - -// // Light Theme Text -// $dark-text: #2c2c2c; -// $dark-primary-text: rgba($dark-text, 0.87); -// $dark-accent-text: rgba($dark-primary-text, 0.54); -// $dark-disabled-text: rgba($dark-primary-text, 0.38); -// $dark-dividers: rgba($dark-primary-text, 0.12); -// $dark-focused: rgba($dark-primary-text, 0.12); - -// $mat-light-theme-foreground: ( -// base: black, -// divider: $dark-dividers, -// dividers: $dark-dividers, -// disabled: $dark-disabled-text, -// disabled-button: rgba($dark-text, 0.26), -// disabled-text: $dark-disabled-text, -// elevation: black, -// secondary-text: $dark-accent-text, -// hint-text: $dark-disabled-text, -// accent-text: $dark-accent-text, -// icon: $dark-accent-text, -// icons: $dark-accent-text, -// text: $dark-primary-text, -// slider-min: $dark-primary-text, -// slider-off: rgba($dark-text, 0.26), -// slider-off-active: $dark-disabled-text, -// ); - -// // Dark Theme text -// $light-text: #e9e4e4; -// $light-primary-text: $light-text; -// $light-accent-text: rgba($light-primary-text, 0.7); -// $light-disabled-text: rgba($light-primary-text, 0.5); -// $light-dividers: rgba($light-primary-text, 0.12); -// $light-focused: rgba($light-primary-text, 0.12); - -// $mat-dark-theme-foreground: ( -// base: $light-text, -// divider: $light-dividers, -// dividers: $light-dividers, -// disabled: $light-disabled-text, -// disabled-button: rgba($light-text, 0.3), -// disabled-text: $light-disabled-text, -// elevation: black, -// hint-text: $light-disabled-text, -// secondary-text: $light-accent-text, -// accent-text: $light-accent-text, -// icon: $light-text, -// icons: $light-text, -// text: $light-text, -// slider-min: $light-text, -// slider-off: rgba($light-text, 0.3), -// slider-off-active: rgba($light-text, 0.3), -// ); - -// // Background config -// // Light bg -// $light-background: #e9e4e4; -// $light-bg-darker-5: darken($light-background, 5%); -// $light-bg-darker-10: darken($light-background, 10%); -// $light-bg-darker-20: darken($light-background, 20%); -// $light-bg-darker-30: darken($light-background, 30%); -// $light-bg-lighter-5: lighten($light-background, 5%); -// $dark-bg-tooltip: lighten(#2c2c2c, 20%); -// $dark-bg-alpha-4: rgba(#2c2c2c, 0.04); -// $dark-bg-alpha-12: rgba(#2c2c2c, 0.12); - -// $mat-light-theme-background: ( -// background: $light-background, -// status-bar: $light-bg-darker-20, -// app-bar: $light-bg-darker-5, -// hover: $dark-bg-alpha-4, -// card: $light-bg-lighter-5, -// dialog: $light-bg-lighter-5, -// tooltip: $dark-bg-tooltip, -// disabled-button: $dark-bg-alpha-12, -// raised-button: $light-bg-lighter-5, -// focused-button: $dark-focused, -// selected-button: $light-bg-darker-20, -// selected-disabled-button: $light-bg-darker-30, -// disabled-button-toggle: $light-bg-darker-10, -// unselected-chip: $light-bg-darker-10, -// disabled-list-option: $light-bg-darker-10, -// ); - -// // Dark bg -// $dark-background: #2c2c2c; -// $dark-bg-lighter-5: lighten($dark-background, 5%); -// $dark-bg-lighter-10: lighten($dark-background, 10%); -// $dark-bg-lighter-20: lighten($dark-background, 20%); -// $dark-bg-lighter-30: lighten($dark-background, 30%); -// $light-bg-alpha-4: rgba(#e9e4e4, 0.04); -// $light-bg-alpha-12: rgba(#e9e4e4, 0.12); - -// // Background palette for dark themes. -// $mat-dark-theme-background: ( -// background: $dark-background, -// status-bar: $dark-bg-lighter-20, -// app-bar: $dark-bg-lighter-5, -// hover: $light-bg-alpha-4, -// card: $dark-bg-lighter-5, -// dialog: $dark-bg-lighter-5, -// tooltip: $dark-bg-lighter-20, -// disabled-button: $light-bg-alpha-12, -// raised-button: $dark-bg-lighter-5, -// focused-button: $light-focused, -// selected-button: $dark-bg-lighter-20, -// selected-disabled-button: $dark-bg-lighter-30, -// disabled-button-toggle: $dark-bg-lighter-10, -// unselected-chip: $dark-bg-lighter-20, -// disabled-list-option: $dark-bg-lighter-10, -// ); - -// // Compute font config -// @include mat.core(); -// // @include mat.core($fontConfig); - -// // Theme Config - -// body { -// --primary-color: #444444; -// --primary-lighter-color: #c7c7c7; -// --primary-darker-color: #2d2d2d; -// --text-primary-color: #{$light-primary-text}; -// --text-primary-lighter-color: #{$dark-primary-text}; -// --text-primary-darker-color: #{$light-primary-text}; -// } -// $mat-primary: ( -// main: #444444, -// lighter: #c7c7c7, -// darker: #2d2d2d, -// 200: #444444, // For slide toggle, -// contrast : ( -// main: $light-primary-text, -// lighter: $dark-primary-text, -// darker: $light-primary-text, -// ) -// ); -// $theme-primary: mat.define-palette($mat-primary, main, lighter, darker); - -// body { -// --accent-color: #2a7aab; -// --accent-lighter-color: #bfd7e6; -// --accent-darker-color: #195d91; -// --text-accent-color: #{$light-primary-text}; -// --text-accent-lighter-color: #{$dark-primary-text}; -// --text-accent-darker-color: #{$light-primary-text}; -// } -// $mat-accent: ( -// main: #2a7aab, -// lighter: #bfd7e6, -// darker: #195d91, -// 200: #2a7aab, // For slide toggle, -// contrast : ( -// main: $light-primary-text, -// lighter: $dark-primary-text, -// darker: $light-primary-text, -// ) -// ); -// $theme-accent: mat.define-palette($mat-accent, main, lighter, darker); - -// body { -// --warn-color: #f18e54; -// --warn-lighter-color: #fbddcc; -// --warn-darker-color: #eb713a; -// --text-warn-color: #{$dark-primary-text}; -// --text-warn-lighter-color: #{$dark-primary-text}; -// --text-warn-darker-color: #{$dark-primary-text}; -// } -// $mat-warn: ( -// main: #f18e54, -// lighter: #fbddcc, -// darker: #eb713a, -// 200: #f18e54, // For slide toggle, -// contrast : ( -// main: $dark-primary-text, -// lighter: $dark-primary-text, -// darker: $dark-primary-text, -// ) -// ); -// $theme-warn: mat.define-palette($mat-warn, main, lighter, darker); -// ; - -// $theme: ( -// primary: $theme-primary, -// accent: $theme-accent, -// warn: $theme-warn, -// is-dark: true, -// foreground: $mat-dark-theme-foreground, -// background: $mat-dark-theme-background, -// ); -// $altTheme: ( -// primary: $theme-primary, -// accent: $theme-accent, -// warn: $theme-warn, -// is-dark: false, -// foreground: $mat-light-theme-foreground, -// background: $mat-light-theme-background, -// ); - -// // Theme Init -// @include mat.all-component-themes($theme); - -// .theme-alternate { -// @include mat.all-component-themes($altTheme); -// } - -// // Specific component overrides, pieces that are not in line with the general theming - -// // Handle buttons appropriately, with respect to line-height -// .mat-raised-button, .mat-stroked-button, .mat-flat-button { -// padding: 0 1.15em; -// margin: 0 .65em; -// min-width: 3em; -// line-height: 36.4px -// } - -// .mat-standard-chip { -// padding: .5em .85em; -// min-height: 2.5em; -// } - -// .material-icons { -// font-size: 24px; -// font-family: 'Material Icons', 'Material Icons'; -// .mat-badge-content { -// font-family: 'Open Sans'; -// } -// } diff --git a/rossa-tech-cli/src/test.ts b/rossa-tech-cli/src/test.ts new file mode 100644 index 0000000..51bb020 --- /dev/null +++ b/rossa-tech-cli/src/test.ts @@ -0,0 +1,14 @@ +// This file is required by karma.conf.js and loads recursively all the .spec and framework files + +import 'zone.js/testing'; +import { getTestBed } from '@angular/core/testing'; +import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting +} from '@angular/platform-browser-dynamic/testing'; + +// First, initialize the Angular testing environment. +getTestBed().initTestEnvironment( + BrowserDynamicTestingModule, + platformBrowserDynamicTesting(), +); diff --git a/rossa-tech-cli/tsconfig.app.json b/rossa-tech-cli/tsconfig.app.json index 374cc9d..82d91dc 100644 --- a/rossa-tech-cli/tsconfig.app.json +++ b/rossa-tech-cli/tsconfig.app.json @@ -6,7 +6,8 @@ "types": [] }, "files": [ - "src/main.ts" + "src/main.ts", + "src/polyfills.ts" ], "include": [ "src/**/*.d.ts" diff --git a/rossa-tech-cli/tsconfig.json b/rossa-tech-cli/tsconfig.json index ae3ecb4..caa410f 100644 --- a/rossa-tech-cli/tsconfig.json +++ b/rossa-tech-cli/tsconfig.json @@ -1,4 +1,3 @@ -/* To learn more about this file see: https://angular.io/config/tsconfig. */ { "compileOnSave": false, "compilerOptions": { @@ -17,10 +16,12 @@ "moduleResolution": "node", "importHelpers": true, "target": "ES2022", - "module": "ES2022", - "useDefineForClassFields": false, - "lib": ["ES2022", "dom"], - "strictPropertyInitialization": false + "module": "es2020", + "lib": [ + "es2020", + "dom" + ], + "useDefineForClassFields": false }, "angularCompilerOptions": { "enableI18nLegacyMessageIdFormat": false, diff --git a/rossa-tech-cli/tsconfig.spec.json b/rossa-tech-cli/tsconfig.spec.json index be7e9da..092345b 100644 --- a/rossa-tech-cli/tsconfig.spec.json +++ b/rossa-tech-cli/tsconfig.spec.json @@ -7,6 +7,10 @@ "jasmine" ] }, + "files": [ + "src/test.ts", + "src/polyfills.ts" + ], "include": [ "src/**/*.spec.ts", "src/**/*.d.ts"