diff --git a/.claude/settings.json b/.claude/settings.json index dbb9d59..61f9eb6 100644 --- a/.claude/settings.json +++ b/.claude/settings.json @@ -1,12 +1,15 @@ { - "permissions": { - "allow": [ - "Bash(grep \" FAILED$\")", - "Bash(grep -A2 \" FAILED$\")", - "Bash(grep -A3 \" FAILED$\")", - "Bash(grep -v \"Executed\\\\|^--$\")", - "Bash(grep -E \"TOTAL:|FAILED$\")", - "Bash(node -e \"const c = require\\('chart.js'\\); console.log\\(Object.keys\\(c\\).filter\\(k => k.includes\\('Doughnut'\\) || k.includes\\('Controller'\\)\\)\\)\")" - ] - } + "permissions": { + "allow": [ + "Bash(grep \" FAILED$\")", + "Bash(grep -A2 \" FAILED$\")", + "Bash(grep -A3 \" FAILED$\")", + "Bash(grep -v \"Executed\\\\|^--$\")", + "Bash(grep -E \"TOTAL:|FAILED$\")", + "Bash(node -e \"const c = require\\('chart.js'\\); console.log\\(Object.keys\\(c\\).filter\\(k => k.includes\\('Doughnut'\\) || k.includes\\('Controller'\\)\\)\\)\")", + "Bash(npm list *)", + "Bash(ng update *)", + "Bash(npm run *)" + ] + } } diff --git a/angular.json b/angular.json index d38f09a..678f5d0 100644 --- a/angular.json +++ b/angular.json @@ -1,179 +1,155 @@ { - "$schema": "./node_modules/@angular/cli/lib/config/schema.json", - "version": 1, - "cli": { - "packageManager": "npm", - "analytics": false, - "schematicCollections": [ - "@angular-eslint/schematics" - ] - }, - "newProjectRoot": "projects", - "projects": { - "adastra_angular": { - "projectType": "application", - "schematics": { - "@schematics/angular:component": { - "style": "scss" - } - }, - "i18n": { - "sourceLocale": "fr" - }, - "root": "", - "sourceRoot": "src", - "prefix": "app", - "architect": { - "build": { - "builder": "@angular-devkit/build-angular:application", - "options": { - "outputPath": { - "base": "dist/adastra_angular" + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "cli": { + "packageManager": "npm", + "analytics": false, + "schematicCollections": ["@angular-eslint/schematics"] + }, + "newProjectRoot": "projects", + "projects": { + "adastra_angular": { + "projectType": "application", + "schematics": { + "@schematics/angular:component": { + "style": "scss" + } }, - "index": "src/index.html", - "tsConfig": "tsconfig.app.json", - "polyfills": [ - "@angular/localize/init", - "zone.js" - ], - "inlineStyleLanguage": "scss", - "assets": [ - "src/favicon.ico", - "src/assets", - "src/manifest.webmanifest", - { - "glob": "_redirects", - "input": "src", - "output": "/" - } - ], - "styles": [ - "node_modules/chartist/dist/index.scss", - "src/styles/styles.scss" - ], - "stylePreprocessorOptions": { - "includePaths": [ - "src/styles" - ] + "i18n": { + "sourceLocale": "fr" }, - "scripts": [], - "browser": "src/main.ts" - }, - "configurations": { - "production": { - "extractLicenses": true, - "namedChunks": false, - "optimization": true, - "outputHashing": "all", - "sourceMap": false, - "budgets": [ - { - "type": "initial", - "maximumWarning": "500kb", - "maximumError": "1mb" + "root": "", + "sourceRoot": "src", + "prefix": "app", + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:application", + "options": { + "outputPath": { + "base": "dist/adastra_angular" + }, + "index": "src/index.html", + "tsConfig": "tsconfig.app.json", + "polyfills": ["@angular/localize/init", "zone.js"], + "inlineStyleLanguage": "scss", + "assets": [ + "src/favicon.ico", + "src/assets", + "src/manifest.webmanifest", + { + "glob": "_redirects", + "input": "src", + "output": "/" + } + ], + "styles": ["node_modules/chartist/dist/index.scss", "src/styles/styles.scss"], + "stylePreprocessorOptions": { + "includePaths": ["src/styles"] + }, + "scripts": [], + "browser": "src/main.ts" + }, + "configurations": { + "production": { + "extractLicenses": true, + "namedChunks": false, + "optimization": true, + "outputHashing": "all", + "sourceMap": false, + "budgets": [ + { + "type": "initial", + "maximumWarning": "3mb", + "maximumError": "5mb" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "2kb", + "maximumError": "4kb" + } + ] + }, + "development": { + "extractLicenses": false, + "namedChunks": true, + "optimization": false, + "sourceMap": true, + "budgets": [ + { + "type": "anyComponentStyle", + "maximumWarning": "6kb" + } + ], + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.development.ts" + } + ] + }, + "local": { + "extractLicenses": false, + "namedChunks": true, + "optimization": false, + "sourceMap": true, + "budgets": [ + { + "type": "anyComponentStyle", + "maximumWarning": "6kb" + } + ], + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.local.ts" + } + ] + } + }, + "defaultConfiguration": "production" }, - { - "type": "anyComponentStyle", - "maximumWarning": "2kb", - "maximumError": "4kb" + "serve": { + "builder": "@angular-devkit/build-angular:dev-server", + "configurations": { + "production": { + "buildTarget": "adastra_angular:build:production" + }, + "development": { + "buildTarget": "adastra_angular:build:development" + }, + "local": { + "buildTarget": "adastra_angular:build:local" + } + }, + "defaultConfiguration": "development" + }, + "extract-i18n": { + "builder": "@angular-devkit/build-angular:extract-i18n", + "options": { + "buildTarget": "adastra_angular:build" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "polyfills": ["zone.js", "zone.js/testing"], + "tsConfig": "tsconfig.spec.json", + "inlineStyleLanguage": "scss", + "assets": ["src/favicon.ico", "src/assets", "src/manifest.webmanifest"], + "styles": ["src/styles/styles.scss"], + "scripts": [], + "stylePreprocessorOptions": { + "includePaths": ["src/styles"] + } + } + }, + "lint": { + "builder": "@angular-eslint/builder:lint", + "options": { + "lintFilePatterns": ["src/**/*.ts", "src/**/*.html"] + } } - ] - }, - "development": { - "extractLicenses": false, - "namedChunks": true, - "optimization": false, - "sourceMap": true, - "budgets": [ - { - "type": "anyComponentStyle", - "maximumWarning": "6kb" - } - ], - "fileReplacements": [ - { - "replace": "src/environments/environment.ts", - "with": "src/environments/environment.development.ts" - } - ] - }, - "local": { - "extractLicenses": false, - "namedChunks": true, - "optimization": false, - "sourceMap": true, - "budgets": [ - { - "type": "anyComponentStyle", - "maximumWarning": "6kb" - } - ], - "fileReplacements": [ - { - "replace": "src/environments/environment.ts", - "with": "src/environments/environment.local.ts" - } - ] } - }, - "defaultConfiguration": "production" - }, - "serve": { - "builder": "@angular-devkit/build-angular:dev-server", - "configurations": { - "production": { - "buildTarget": "adastra_angular:build:production" - }, - "development": { - "buildTarget": "adastra_angular:build:development" - }, - "local": { - "buildTarget": "adastra_angular:build:local" - } - }, - "defaultConfiguration": "development" - }, - "extract-i18n": { - "builder": "@angular-devkit/build-angular:extract-i18n", - "options": { - "buildTarget": "adastra_angular:build" - } - }, - "test": { - "builder": "@angular-devkit/build-angular:karma", - "options": { - "polyfills": [ - "zone.js", - "zone.js/testing" - ], - "tsConfig": "tsconfig.spec.json", - "inlineStyleLanguage": "scss", - "assets": [ - "src/favicon.ico", - "src/assets", - "src/manifest.webmanifest" - ], - "styles": [ - "src/styles/styles.scss" - ], - "scripts": [], - "stylePreprocessorOptions": { - "includePaths": [ - "src/styles" - ] - } - } - }, - "lint": { - "builder": "@angular-eslint/builder:lint", - "options": { - "lintFilePatterns": [ - "src/**/*.ts", - "src/**/*.html" - ] - } } - } } - } -} \ No newline at end of file +} diff --git a/package-lock.json b/package-lock.json index 156ae46..62b132c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,18 +8,18 @@ "name": "adastra-app", "version": "1.0.0", "dependencies": { - "@angular/animations": "^18.2.14", - "@angular/cdk": "^18.2.14", - "@angular/common": "^18.2.14", - "@angular/compiler": "^18.2.14", - "@angular/core": "^18.2.14", - "@angular/forms": "^18.2.14", + "@angular/animations": "^19.2.21", + "@angular/cdk": "^19.2.19", + "@angular/common": "^19.2.21", + "@angular/compiler": "^19.2.21", + "@angular/core": "^19.2.21", + "@angular/forms": "^19.2.21", "@angular/google-maps": "^17.3.8", - "@angular/localize": "^18.2.14", - "@angular/material": "^18.2.14", - "@angular/platform-browser": "^18.2.14", - "@angular/platform-browser-dynamic": "^18.2.14", - "@angular/router": "^18.2.14", + "@angular/localize": "^19.2.21", + "@angular/material": "^19.2.19", + "@angular/platform-browser": "^19.2.21", + "@angular/platform-browser-dynamic": "^19.2.21", + "@angular/router": "^19.2.21", "bootstrap": "^5.3.7", "chart.js": "^4.4.2", "chartist": "^1.3.0", @@ -28,17 +28,17 @@ "ngx-skeleton-loader": "^9.0.0", "rxjs": "~7.8.0", "tslib": "^2.3.0", - "zone.js": "^0.14.10" + "zone.js": "^0.15.1" }, "devDependencies": { - "@angular-devkit/build-angular": "^18.2.21", - "@angular-eslint/builder": "18.4.3", - "@angular-eslint/eslint-plugin": "18.4.3", - "@angular-eslint/eslint-plugin-template": "18.4.3", - "@angular-eslint/schematics": "18.4.3", - "@angular-eslint/template-parser": "18.4.3", - "@angular/cli": "^18.2.21", - "@angular/compiler-cli": "^18.2.14", + "@angular-devkit/build-angular": "^19.2.24", + "@angular-eslint/builder": "19.8.1", + "@angular-eslint/eslint-plugin": "19.8.1", + "@angular-eslint/eslint-plugin-template": "19.8.1", + "@angular-eslint/schematics": "19.8.1", + "@angular-eslint/template-parser": "19.8.1", + "@angular/cli": "^19.2.24", + "@angular/compiler-cli": "^19.2.21", "@types/jasmine": "~5.1.0", "@typescript-eslint/eslint-plugin": "7.2.0", "@typescript-eslint/parser": "7.2.0", @@ -71,12 +71,12 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1802.21", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1802.21.tgz", - "integrity": "sha512-+Ll+xtpKwZ3iLWN/YypvnCZV/F0MVbP+/7ZpMR+Xv/uB0OmribhBVj9WGaCd9I/bGgoYBw8wBV/NFNCKkf0k3Q==", + "version": "0.1902.24", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1902.24.tgz", + "integrity": "sha512-G63tV2EW15xCWfDhFYwLc1MWu2UbY6M+JaRfDr8NxwP9PZJyIkGHA9YUhnx+35x7aNb52sTPDW0uY4ukhOvYFg==", "dev": true, "dependencies": { - "@angular-devkit/core": "18.2.21", + "@angular-devkit/core": "19.2.24", "rxjs": "7.8.1" }, "engines": { @@ -85,6 +85,65 @@ "yarn": ">= 1.13.0" } }, + "node_modules/@angular-devkit/architect/node_modules/@angular-devkit/core": { + "version": "19.2.24", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.24.tgz", + "integrity": "sha512-Kd49warf6U/EyWe5BszF/eebN3zQ3bk7tgfEljAw8q/rX95UUtriJubWvp6pgzHfzBA4jwq8f+QiNZB8eBEXPA==", + "dev": true, + "dependencies": { + "ajv": "8.18.0", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.4", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^4.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/architect/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@angular-devkit/architect/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@angular-devkit/architect/node_modules/rxjs": { "version": "7.8.1", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", @@ -95,16 +154,16 @@ } }, "node_modules/@angular-devkit/build-angular": { - "version": "18.2.21", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-18.2.21.tgz", - "integrity": "sha512-0pJfURFpEUV2USgZ2TL3nNAaJmF9bICx9OVddBoC+F9FeOpVKxkcVIb+c8Km5zHFo1iyVtPZ6Rb25vFk9Zm/ug==", + "version": "19.2.24", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-19.2.24.tgz", + "integrity": "sha512-foSat36hPfGyrQnKSlvynTWY2HBVc2nEF/Tx3C0Yv+aVmMePBzrONiHs67yXB7C6rrYvrJtQuy+nAPvEOBV/0A==", "dev": true, "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1802.21", - "@angular-devkit/build-webpack": "0.1802.21", - "@angular-devkit/core": "18.2.21", - "@angular/build": "18.2.21", + "@angular-devkit/architect": "0.1902.24", + "@angular-devkit/build-webpack": "0.1902.24", + "@angular-devkit/core": "19.2.24", + "@angular/build": "19.2.24", "@babel/core": "7.26.10", "@babel/generator": "7.26.10", "@babel/helper-annotate-as-pure": "7.25.9", @@ -114,48 +173,43 @@ "@babel/plugin-transform-runtime": "7.26.10", "@babel/preset-env": "7.26.9", "@babel/runtime": "7.26.10", - "@discoveryjs/json-ext": "0.6.1", - "@ngtools/webpack": "18.2.21", + "@discoveryjs/json-ext": "0.6.3", + "@ngtools/webpack": "19.2.24", + "@vitejs/plugin-basic-ssl": "1.2.0", "ansi-colors": "4.1.3", "autoprefixer": "10.4.20", - "babel-loader": "9.1.3", + "babel-loader": "9.2.1", "browserslist": "^4.21.5", "copy-webpack-plugin": "12.0.2", - "critters": "0.0.24", "css-loader": "7.1.2", - "esbuild-wasm": "0.23.0", - "fast-glob": "3.3.2", + "esbuild-wasm": "0.25.4", + "fast-glob": "3.3.3", "http-proxy-middleware": "3.0.5", - "https-proxy-agent": "7.0.5", "istanbul-lib-instrument": "6.0.3", "jsonc-parser": "3.3.1", "karma-source-map-support": "1.4.0", - "less": "4.2.0", + "less": "4.2.2", "less-loader": "12.2.0", "license-webpack-plugin": "4.0.2", "loader-utils": "3.3.1", - "magic-string": "0.30.11", - "mini-css-extract-plugin": "2.9.0", - "mrmime": "2.0.0", + "mini-css-extract-plugin": "2.9.2", "open": "10.1.0", "ora": "5.4.1", - "parse5-html-rewriting-stream": "7.0.0", - "picomatch": "4.0.2", - "piscina": "4.6.1", - "postcss": "8.4.41", + "picomatch": "4.0.4", + "piscina": "4.8.0", + "postcss": "8.5.2", "postcss-loader": "8.1.1", "resolve-url-loader": "5.0.0", "rxjs": "7.8.1", - "sass": "1.77.6", - "sass-loader": "16.0.0", - "semver": "7.6.3", + "sass": "1.85.0", + "sass-loader": "16.0.5", + "semver": "7.7.1", "source-map-loader": "5.0.0", "source-map-support": "0.5.21", - "terser": "5.31.6", + "terser": "5.39.0", "tree-kill": "1.2.2", - "tslib": "2.6.3", - "watchpack": "2.4.1", - "webpack": "5.94.0", + "tslib": "2.8.1", + "webpack": "5.105.0", "webpack-dev-middleware": "7.4.2", "webpack-dev-server": "5.2.2", "webpack-merge": "6.0.1", @@ -167,22 +221,23 @@ "yarn": ">= 1.13.0" }, "optionalDependencies": { - "esbuild": "0.23.0" + "esbuild": "0.25.4" }, "peerDependencies": { - "@angular/compiler-cli": "^18.0.0", - "@angular/localize": "^18.0.0", - "@angular/platform-server": "^18.0.0", - "@angular/service-worker": "^18.0.0", - "@web/test-runner": "^0.18.0", + "@angular/compiler-cli": "^19.0.0 || ^19.2.0-next.0", + "@angular/localize": "^19.0.0 || ^19.2.0-next.0", + "@angular/platform-server": "^19.0.0 || ^19.2.0-next.0", + "@angular/service-worker": "^19.0.0 || ^19.2.0-next.0", + "@angular/ssr": "^19.2.24", + "@web/test-runner": "^0.20.0", "browser-sync": "^3.0.2", "jest": "^29.5.0", "jest-environment-jsdom": "^29.5.0", "karma": "^6.3.0", - "ng-packagr": "^18.0.0", + "ng-packagr": "^19.0.0 || ^19.2.0-next.0", "protractor": "^7.0.0", - "tailwindcss": "^2.0.0 || ^3.0.0", - "typescript": ">=5.4 <5.6" + "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", + "typescript": ">=5.5 <5.9" }, "peerDependenciesMeta": { "@angular/localize": { @@ -194,6 +249,9 @@ "@angular/service-worker": { "optional": true }, + "@angular/ssr": { + "optional": true + }, "@web/test-runner": { "optional": true }, @@ -220,6 +278,93 @@ } } }, + "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/core": { + "version": "19.2.24", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.24.tgz", + "integrity": "sha512-Kd49warf6U/EyWe5BszF/eebN3zQ3bk7tgfEljAw8q/rX95UUtriJubWvp6pgzHfzBA4jwq8f+QiNZB8eBEXPA==", + "dev": true, + "dependencies": { + "ajv": "8.18.0", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.4", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^4.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/postcss": { + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.2.tgz", + "integrity": "sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@angular-devkit/build-angular/node_modules/rxjs": { "version": "7.8.1", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", @@ -229,19 +374,13 @@ "tslib": "^2.1.0" } }, - "node_modules/@angular-devkit/build-angular/node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", - "dev": true - }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.1802.21", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1802.21.tgz", - "integrity": "sha512-2jSVRhA3N4Elg8OLcBktgi+CMSjlAm/bBQJE6TQYbdQWnniuT7JAWUHA/iPf7MYlQE5qj4rnAni1CI/c1Bk4HQ==", + "version": "0.1902.24", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1902.24.tgz", + "integrity": "sha512-txDA1cbmsD5+mcw74JCh0UiSZQKQzcDalkqPYpSA+9/uFGUSULSonlyCmg5UpyrpiOzM5ACI/++qJ1g52TqWWA==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1802.21", + "@angular-devkit/architect": "0.1902.24", "rxjs": "7.8.1" }, "engines": { @@ -263,16 +402,34 @@ "tslib": "^2.1.0" } }, - "node_modules/@angular-devkit/core": { - "version": "18.2.21", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-18.2.21.tgz", - "integrity": "sha512-Lno6GNbJME85wpc/uqn+wamBxvfZJZFYSH8+oAkkyjU/hk8r5+X8DuyqsKAa0m8t46zSTUsonHsQhVe5vgrZeQ==", + "node_modules/@angular-devkit/schematics": { + "version": "19.2.24", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.2.24.tgz", + "integrity": "sha512-lnw+ZM1Io+cJAkReC0NPDjqObL8NtKzKIkdgEEKC8CUmkhurYhedbicN8Y8NYHgG1uLd2GozW3+/QqPRZaN+Lw==", "dev": true, "dependencies": { - "ajv": "8.17.1", + "@angular-devkit/core": "19.2.24", + "jsonc-parser": "3.3.1", + "magic-string": "0.30.17", + "ora": "5.4.1", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/@angular-devkit/core": { + "version": "19.2.24", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.24.tgz", + "integrity": "sha512-Kd49warf6U/EyWe5BszF/eebN3zQ3bk7tgfEljAw8q/rX95UUtriJubWvp6pgzHfzBA4jwq8f+QiNZB8eBEXPA==", + "dev": true, + "dependencies": { + "ajv": "8.18.0", "ajv-formats": "3.0.1", "jsonc-parser": "3.3.1", - "picomatch": "4.0.2", + "picomatch": "4.0.4", "rxjs": "7.8.1", "source-map": "0.7.4" }, @@ -282,7 +439,7 @@ "yarn": ">= 1.13.0" }, "peerDependencies": { - "chokidar": "^3.5.2" + "chokidar": "^4.0.0" }, "peerDependenciesMeta": { "chokidar": { @@ -290,31 +447,36 @@ } } }, - "node_modules/@angular-devkit/core/node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "node_modules/@angular-devkit/schematics/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@angular-devkit/schematics": { - "version": "18.2.21", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-18.2.21.tgz", - "integrity": "sha512-yuC2vN4VL48JhnsaOa9J/o0Jl+cxOklRNQp5J2/ypMuRROaVCrZAPiX+ChSHh++kHYMpj8+ggNrrUwRNfMKACQ==", - "dev": true, - "dependencies": { - "@angular-devkit/core": "18.2.21", - "jsonc-parser": "3.3.1", - "magic-string": "0.30.11", - "ora": "5.4.1", - "rxjs": "7.8.1" + "readdirp": "^4.0.1" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, "node_modules/@angular-devkit/schematics/node_modules/rxjs": { @@ -327,33 +489,101 @@ } }, "node_modules/@angular-eslint/builder": { - "version": "18.4.3", - "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-18.4.3.tgz", - "integrity": "sha512-NzmrXlr7GFE+cjwipY/CxBscZXNqnuK0us1mO6Z2T6MeH6m+rRcdlY/rZyKoRniyNNvuzl6vpEsfMIMmnfebrA==", + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-19.8.1.tgz", + "integrity": "sha512-NOMkw0xgDoDVCLkL5nkkvdd3ouDYkOGqtEmabTR7N4/kQnk1R4coOTWGCqAgMXCFdxlyjuxquDwuJ+yni81pRg==", "dev": true, "dependencies": { - "@angular-devkit/architect": ">= 0.1800.0 < 0.1900.0", - "@angular-devkit/core": ">= 18.0.0 < 19.0.0" + "@angular-devkit/architect": ">= 0.1900.0 < 0.2000.0", + "@angular-devkit/core": ">= 19.0.0 < 20.0.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": "*" } }, + "node_modules/@angular-eslint/builder/node_modules/@angular-devkit/core": { + "version": "19.2.24", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.24.tgz", + "integrity": "sha512-Kd49warf6U/EyWe5BszF/eebN3zQ3bk7tgfEljAw8q/rX95UUtriJubWvp6pgzHfzBA4jwq8f+QiNZB8eBEXPA==", + "dev": true, + "dependencies": { + "ajv": "8.18.0", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.4", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^4.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-eslint/builder/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@angular-eslint/builder/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@angular-eslint/builder/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, "node_modules/@angular-eslint/bundled-angular-compiler": { - "version": "18.4.3", - "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-18.4.3.tgz", - "integrity": "sha512-zdrA8mR98X+U4YgHzUKmivRU+PxzwOL/j8G7eTOvBuq8GPzsP+hvak+tyxlgeGm9HsvpFj9ERHLtJ0xDUPs8fg==", + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-19.8.1.tgz", + "integrity": "sha512-WXi1YbSs7SIQo48u+fCcc5Nt14/T4QzYQPLZUnjtsUXPgQG7ZoahhcGf7PPQ+n0V3pSopHOlSHwqK+tSsYK87A==", "dev": true }, "node_modules/@angular-eslint/eslint-plugin": { - "version": "18.4.3", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-18.4.3.tgz", - "integrity": "sha512-AyJbupiwTBR81P6T59v+aULEnPpZBCBxL2S5QFWfAhNCwWhcof4GihvdK2Z87yhvzDGeAzUFSWl/beJfeFa+PA==", + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-19.8.1.tgz", + "integrity": "sha512-wZEBMPwD2TRhifG751hcj137EMIEaFmsxRB2EI+vfINCgPnFGSGGOHXqi8aInn9fXqHs7VbXkAzXYdBsvy1m4Q==", "dev": true, "dependencies": { - "@angular-eslint/bundled-angular-compiler": "18.4.3", - "@angular-eslint/utils": "18.4.3" + "@angular-eslint/bundled-angular-compiler": "19.8.1", + "@angular-eslint/utils": "19.8.1" }, "peerDependencies": { "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", @@ -362,17 +592,18 @@ } }, "node_modules/@angular-eslint/eslint-plugin-template": { - "version": "18.4.3", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-18.4.3.tgz", - "integrity": "sha512-ijGlX2N01ayMXTpeQivOA31AszO8OEbu9ZQUCxnu9AyMMhxyi2q50bujRChAvN9YXQfdQtbxuajxV6+aiWb5BQ==", + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-19.8.1.tgz", + "integrity": "sha512-0ZVQldndLrDfB0tzFe/uIwvkUcakw8qGxvkEU0l7kSbv/ngNQ/qrkRi7P64otB15inIDUNZI2jtmVat52dqSfQ==", "dev": true, "dependencies": { - "@angular-eslint/bundled-angular-compiler": "18.4.3", - "@angular-eslint/utils": "18.4.3", + "@angular-eslint/bundled-angular-compiler": "19.8.1", + "@angular-eslint/utils": "19.8.1", "aria-query": "5.3.2", "axobject-query": "4.1.0" }, "peerDependencies": { + "@angular-eslint/template-parser": "19.8.1", "@typescript-eslint/types": "^7.11.0 || ^8.0.0", "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", "eslint": "^8.57.0 || ^9.0.0", @@ -380,27 +611,107 @@ } }, "node_modules/@angular-eslint/schematics": { - "version": "18.4.3", - "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-18.4.3.tgz", - "integrity": "sha512-D5maKn5e6n58+8n7jLFLD4g+RGPOPeDSsvPc1sqial5tEKLxAJQJS9WZ28oef3bhkob6C60D+1H0mMmEEVvyVA==", + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-19.8.1.tgz", + "integrity": "sha512-MKzfO3puOCuQFgP8XDUkEr5eaqcCQLAdYLLMcywEO/iRs1eRHL46+rkW+SjDp1cUqlxKtu+rLiTYr0T/O4fi9Q==", "dev": true, "dependencies": { - "@angular-devkit/core": ">= 18.0.0 < 19.0.0", - "@angular-devkit/schematics": ">= 18.0.0 < 19.0.0", - "@angular-eslint/eslint-plugin": "18.4.3", - "@angular-eslint/eslint-plugin-template": "18.4.3", - "ignore": "6.0.2", - "semver": "7.6.3", + "@angular-devkit/core": ">= 19.0.0 < 20.0.0", + "@angular-devkit/schematics": ">= 19.0.0 < 20.0.0", + "@angular-eslint/eslint-plugin": "19.8.1", + "@angular-eslint/eslint-plugin-template": "19.8.1", + "ignore": "7.0.5", + "semver": "7.7.2", "strip-json-comments": "3.1.1" } }, - "node_modules/@angular-eslint/template-parser": { - "version": "18.4.3", - "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-18.4.3.tgz", - "integrity": "sha512-JZMPtEB8yNip3kg4WDEWQyObSo2Hwf+opq2ElYuwe85GQkGhfJSJ2CQYo4FSwd+c5MUQAqESNRg9QqGYauDsiw==", + "node_modules/@angular-eslint/schematics/node_modules/@angular-devkit/core": { + "version": "19.2.24", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.24.tgz", + "integrity": "sha512-Kd49warf6U/EyWe5BszF/eebN3zQ3bk7tgfEljAw8q/rX95UUtriJubWvp6pgzHfzBA4jwq8f+QiNZB8eBEXPA==", "dev": true, "dependencies": { - "@angular-eslint/bundled-angular-compiler": "18.4.3", + "ajv": "8.18.0", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.4", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^4.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-eslint/schematics/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@angular-eslint/schematics/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@angular-eslint/schematics/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@angular-eslint/schematics/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@angular-eslint/template-parser": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-19.8.1.tgz", + "integrity": "sha512-pQiOg+se1AU/ncMlnJ9V6xYnMQ84qI1BGWuJpbU6A99VTXJg90scg0+T7DWmKssR1YjP5qmmBtrZfKsHEcLW/A==", + "dev": true, + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "19.8.1", "eslint-scope": "^8.0.2" }, "peerDependencies": { @@ -409,12 +720,12 @@ } }, "node_modules/@angular-eslint/utils": { - "version": "18.4.3", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-18.4.3.tgz", - "integrity": "sha512-w0bJ9+ELAEiPBSTPPm9bvDngfu1d8JbzUhvs2vU+z7sIz/HMwUZT5S4naypj2kNN0gZYGYrW0lt+HIbW87zTAQ==", + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-19.8.1.tgz", + "integrity": "sha512-gVDKYWmAjeTPtaYmddT/HS03fCebXJtrk8G1MouQIviZbHqLjap6TbVlzlkBigRzaF0WnFnrDduQslkJzEdceA==", "dev": true, "dependencies": { - "@angular-eslint/bundled-angular-compiler": "18.4.3" + "@angular-eslint/bundled-angular-compiler": "19.8.1" }, "peerDependencies": { "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", @@ -423,9 +734,9 @@ } }, "node_modules/@angular/animations": { - "version": "18.2.14", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-18.2.14.tgz", - "integrity": "sha512-Kp/MWShoYYO+R3lrrZbZgszbbLGVXHB+39mdJZwnIuZMDkeL3JsIBlSOzyJRTnpS1vITc+9jgHvP/6uKbMrW1Q==", + "version": "19.2.21", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-19.2.21.tgz", + "integrity": "sha512-hZqLVGHauUCgw4rULF/IcjUcR+BpI3+7B/TVyvNEqvRplJg5e6LJJ9YKp3G+GyoAsGXNnFdLtENR2T6kQI7s9g==", "dependencies": { "tslib": "^2.3.0" }, @@ -433,55 +744,64 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "18.2.14" + "@angular/common": "19.2.21", + "@angular/core": "19.2.21" } }, "node_modules/@angular/build": { - "version": "18.2.21", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-18.2.21.tgz", - "integrity": "sha512-uvq3qP4cByJrUkV1ri0v3x6LxOFt4fDKiQdNwbQAqdxtfRs3ssEIoCGns4t89sTWXv6VZWBNDcDIKK9/Fa9mmg==", + "version": "19.2.24", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.2.24.tgz", + "integrity": "sha512-/Z6Ka0+xpmSXz5KHP94iRO5R1ZwbcJfj7Q7k/d6QH5Wk8rVFIoI/3a9nmLewjR/CxW8QaiziPYQpG1ezRgj9hQ==", "dev": true, "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1802.21", - "@babel/core": "7.25.2", - "@babel/helper-annotate-as-pure": "7.24.7", + "@angular-devkit/architect": "0.1902.24", + "@babel/core": "7.26.10", + "@babel/helper-annotate-as-pure": "7.25.9", "@babel/helper-split-export-declaration": "7.24.7", - "@babel/plugin-syntax-import-attributes": "7.24.7", - "@inquirer/confirm": "3.1.22", - "@vitejs/plugin-basic-ssl": "1.1.0", + "@babel/plugin-syntax-import-attributes": "7.26.0", + "@inquirer/confirm": "5.1.6", + "@vitejs/plugin-basic-ssl": "1.2.0", + "beasties": "0.3.2", "browserslist": "^4.23.0", - "critters": "0.0.24", - "esbuild": "0.23.0", - "fast-glob": "3.3.2", - "https-proxy-agent": "7.0.5", - "listr2": "8.2.4", - "lmdb": "3.0.13", - "magic-string": "0.30.11", - "mrmime": "2.0.0", + "esbuild": "0.25.4", + "fast-glob": "3.3.3", + "https-proxy-agent": "7.0.6", + "istanbul-lib-instrument": "6.0.3", + "listr2": "8.2.5", + "magic-string": "0.30.17", + "mrmime": "2.0.1", "parse5-html-rewriting-stream": "7.0.0", - "picomatch": "4.0.2", - "piscina": "4.6.1", - "rollup": "4.22.4", - "sass": "1.77.6", - "semver": "7.6.3", - "vite": "~5.4.17", - "watchpack": "2.4.1" + "picomatch": "4.0.4", + "piscina": "4.8.0", + "rollup": "4.59.0", + "sass": "1.85.0", + "semver": "7.7.1", + "source-map-support": "0.5.21", + "vite": "6.4.2", + "watchpack": "2.4.2" }, "engines": { "node": "^18.19.1 || ^20.11.1 || >=22.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, + "optionalDependencies": { + "lmdb": "3.2.6" + }, "peerDependencies": { - "@angular/compiler-cli": "^18.0.0", - "@angular/localize": "^18.0.0", - "@angular/platform-server": "^18.0.0", - "@angular/service-worker": "^18.0.0", + "@angular/compiler": "^19.0.0 || ^19.2.0-next.0", + "@angular/compiler-cli": "^19.0.0 || ^19.2.0-next.0", + "@angular/localize": "^19.0.0 || ^19.2.0-next.0", + "@angular/platform-server": "^19.0.0 || ^19.2.0-next.0", + "@angular/service-worker": "^19.0.0 || ^19.2.0-next.0", + "@angular/ssr": "^19.2.24", + "karma": "^6.4.0", "less": "^4.2.0", + "ng-packagr": "^19.0.0 || ^19.2.0-next.0", "postcss": "^8.4.0", - "tailwindcss": "^2.0.0 || ^3.0.0", - "typescript": ">=5.4 <5.6" + "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", + "typescript": ">=5.5 <5.9" }, "peerDependenciesMeta": { "@angular/localize": { @@ -493,9 +813,18 @@ "@angular/service-worker": { "optional": true }, + "@angular/ssr": { + "optional": true + }, + "karma": { + "optional": true + }, "less": { "optional": true }, + "ng-packagr": { + "optional": true + }, "postcss": { "optional": true }, @@ -504,100 +833,41 @@ } } }, - "node_modules/@angular/build/node_modules/@babel/core": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", - "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.0", - "@babel/helper-compilation-targets": "^7.25.2", - "@babel/helper-module-transforms": "^7.25.2", - "@babel/helpers": "^7.25.0", - "@babel/parser": "^7.25.0", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.2", - "@babel/types": "^7.25.2", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@angular/build/node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@angular/build/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", - "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@angular/build/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, "node_modules/@angular/cdk": { - "version": "18.2.14", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-18.2.14.tgz", - "integrity": "sha512-vDyOh1lwjfVk9OqoroZAP8pf3xxKUvyl+TVR8nJxL4c5fOfUFkD7l94HaanqKSRwJcI2xiztuu92IVoHn8T33Q==", + "version": "19.2.19", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-19.2.19.tgz", + "integrity": "sha512-PCpJagurPBqciqcq4Z8+3OtKLb7rSl4w/qBJoIMua8CgnrjvA1i+SWawhdtfI1zlY8FSwhzLwXV0CmWWfFzQPg==", "dependencies": { + "parse5": "^7.1.2", "tslib": "^2.3.0" }, - "optionalDependencies": { - "parse5": "^7.1.2" - }, "peerDependencies": { - "@angular/common": "^18.0.0 || ^19.0.0", - "@angular/core": "^18.0.0 || ^19.0.0", + "@angular/common": "^19.0.0 || ^20.0.0", + "@angular/core": "^19.0.0 || ^20.0.0", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/cli": { - "version": "18.2.21", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-18.2.21.tgz", - "integrity": "sha512-efweY4p8awRTbHs+HKdg6s44hl7Y0gdVlXYi3HeY8Z5JDC0abbka0K6sA/MrV9AXvn/5ovxYbxiL3AsOApjTpg==", + "version": "19.2.24", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.2.24.tgz", + "integrity": "sha512-HjU4r/Va9w868fKVeUNOgkHBVDQc2VFHWxj0I3WekGhYN3dlfTVNn0/3dNutkBBuCxxTb9Xl6E6wf6KrlA9wcQ==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1802.21", - "@angular-devkit/core": "18.2.21", - "@angular-devkit/schematics": "18.2.21", - "@inquirer/prompts": "5.3.8", - "@listr2/prompt-adapter-inquirer": "2.0.15", - "@schematics/angular": "18.2.21", + "@angular-devkit/architect": "0.1902.24", + "@angular-devkit/core": "19.2.24", + "@angular-devkit/schematics": "19.2.24", + "@inquirer/prompts": "7.3.2", + "@listr2/prompt-adapter-inquirer": "2.0.18", + "@schematics/angular": "19.2.24", "@yarnpkg/lockfile": "1.1.0", - "ini": "4.1.3", + "ini": "5.0.0", "jsonc-parser": "3.3.1", - "listr2": "8.2.4", - "npm-package-arg": "11.0.3", - "npm-pick-manifest": "9.1.0", - "pacote": "18.0.6", - "resolve": "1.22.8", - "semver": "7.6.3", + "listr2": "8.2.5", + "npm-package-arg": "12.0.2", + "npm-pick-manifest": "10.0.0", + "pacote": "20.0.0", + "resolve": "1.22.10", + "semver": "7.7.1", "symbol-observable": "4.0.0", "yargs": "17.7.2" }, @@ -610,46 +880,106 @@ "yarn": ">= 1.13.0" } }, - "node_modules/@angular/common": { - "version": "18.2.14", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-18.2.14.tgz", - "integrity": "sha512-ZPRswzaVRiqcfZoowuAM22Hr2/z10ajWOUoFDoQ9tWqz/fH/773kJv2F9VvePIekgNPCzaizqv9gF6tGNqaAwg==", + "node_modules/@angular/cli/node_modules/@angular-devkit/core": { + "version": "19.2.24", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.24.tgz", + "integrity": "sha512-Kd49warf6U/EyWe5BszF/eebN3zQ3bk7tgfEljAw8q/rX95UUtriJubWvp6pgzHfzBA4jwq8f+QiNZB8eBEXPA==", + "dev": true, "dependencies": { - "tslib": "^2.3.0" + "ajv": "8.18.0", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.4", + "rxjs": "7.8.1", + "source-map": "0.7.4" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" }, "peerDependencies": { - "@angular/core": "18.2.14", - "rxjs": "^6.5.3 || ^7.4.0" - } - }, - "node_modules/@angular/compiler": { - "version": "18.2.14", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-18.2.14.tgz", - "integrity": "sha512-Mpq3v/mztQzGAQAAFV+wAI1hlXxZ0m8eDBgaN2kD3Ue+r4S6bLm1Vlryw0iyUnt05PcFIdxPT6xkcphq5pl6lw==", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "@angular/core": "18.2.14" + "chokidar": "^4.0.0" }, "peerDependenciesMeta": { - "@angular/core": { + "chokidar": { "optional": true } } }, - "node_modules/@angular/compiler-cli": { - "version": "18.2.14", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-18.2.14.tgz", - "integrity": "sha512-BmmjyrFSBSYkm0tBSqpu4cwnJX/b/XvhM36mj2k8jah3tNS5zLDDx5w6tyHmaPJa/1D95MlXx2h6u7K9D+Mhew==", + "node_modules/@angular/cli/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "optional": true, + "peer": true, "dependencies": { - "@babel/core": "7.25.2", + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@angular/cli/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@angular/cli/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@angular/common": { + "version": "19.2.21", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.2.21.tgz", + "integrity": "sha512-L+X0AOc+8SN+1ys1/nzOlkdwB7FUz6ts3MKdWW6wIPSIB6LcDth+QcJzx+XbwZ+zfPFEQkKsRWjo/eF82JePcg==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + }, + "peerDependencies": { + "@angular/core": "19.2.21", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/compiler": { + "version": "19.2.21", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.2.21.tgz", + "integrity": "sha512-lLWXzeLPk+4kkXKpy/h0OAie3V2YImpDrzluufJ0xR8OlCffJNpanfBjm7R4tOZB7i0ONIxhsD67Z0oRhEECCQ==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + } + }, + "node_modules/@angular/compiler-cli": { + "version": "19.2.21", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.2.21.tgz", + "integrity": "sha512-eAs+krq6McyuoySyC0tbYuY+rtovdtmyNUAgxGANPYJMdkTYHcHdF0HVbbaxUpFDvRC6rV9NDpZUazgykLZoYA==", + "dependencies": { + "@babel/core": "7.26.9", "@jridgewell/sourcemap-codec": "^1.4.14", "chokidar": "^4.0.0", "convert-source-map": "^1.5.1", @@ -667,25 +997,25 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/compiler": "18.2.14", - "typescript": ">=5.4 <5.6" + "@angular/compiler": "19.2.21", + "typescript": ">=5.5 <5.9" } }, "node_modules/@angular/compiler-cli/node_modules/@babel/core": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", - "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.9.tgz", + "integrity": "sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.0", - "@babel/helper-compilation-targets": "^7.25.2", - "@babel/helper-module-transforms": "^7.25.2", - "@babel/helpers": "^7.25.0", - "@babel/parser": "^7.25.0", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.2", - "@babel/types": "^7.25.2", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.9", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.9", + "@babel/parser": "^7.26.9", + "@babel/template": "^7.26.9", + "@babel/traverse": "^7.26.9", + "@babel/types": "^7.26.9", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -717,7 +1047,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "license": "MIT", "dependencies": { "readdirp": "^4.0.1" }, @@ -732,7 +1061,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "license": "MIT", "engines": { "node": ">= 14.18.0" }, @@ -742,9 +1070,9 @@ } }, "node_modules/@angular/core": { - "version": "18.2.14", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-18.2.14.tgz", - "integrity": "sha512-BIPrCs93ZZTY9ym7yfoTgAQ5rs706yoYeAdrgc8kh/bDbM9DawxKlgeKBx2FLt09Y0YQ1bFhKVp0cV4gDEaMxQ==", + "version": "19.2.21", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.2.21.tgz", + "integrity": "sha512-jdOEwkvUyF7VdJMURXkSB1yQy595wt1lSfSgUux9tZftA7UwamCsMdidUsKqRbdaI9M3r+RdIM7qrDAWwqzz+A==", "dependencies": { "tslib": "^2.3.0" }, @@ -753,13 +1081,13 @@ }, "peerDependencies": { "rxjs": "^6.5.3 || ^7.4.0", - "zone.js": "~0.14.10" + "zone.js": "~0.15.0" } }, "node_modules/@angular/forms": { - "version": "18.2.14", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-18.2.14.tgz", - "integrity": "sha512-fZVwXctmBJa5VdopJae/T9MYKPXNd04+6j4k/6X819y+9fiyWLJt2QicSc5Rc+YD9mmhXag3xaljlrnotf9VGA==", + "version": "19.2.21", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.2.21.tgz", + "integrity": "sha512-2r5V8JyInrmpLhBDKCmF2ELWUXxEVxyIm5wDqD7RxWnuGtEr08QlJmiuyqM58xWFmcaSx7s2c62OdCqAAUSQGg==", "dependencies": { "tslib": "^2.3.0" }, @@ -767,9 +1095,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "18.2.14", - "@angular/core": "18.2.14", - "@angular/platform-browser": "18.2.14", + "@angular/common": "19.2.21", + "@angular/core": "19.2.21", + "@angular/platform-browser": "19.2.21", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -788,13 +1116,13 @@ } }, "node_modules/@angular/localize": { - "version": "18.2.14", - "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-18.2.14.tgz", - "integrity": "sha512-VRe169SRSKxJfxJ+oZONwph0llTQHGrH9MhMjoej7XqTH3EVzrYJBNcS9j7Jhd0O/aKSfPY/wIJBeKUn+4O4gQ==", + "version": "19.2.21", + "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-19.2.21.tgz", + "integrity": "sha512-iQIj9Qi92K0AndQxfRPyUEPkdwvRS9vJt2CBMDMakOhxci7ieQ6J/Z0y0MwnVTkSoxIjJRdrkS8uPSOq0bS/Pw==", "dependencies": { - "@babel/core": "7.25.2", + "@babel/core": "7.26.9", "@types/babel__core": "7.20.5", - "fast-glob": "3.3.2", + "fast-glob": "3.3.3", "yargs": "^17.2.1" }, "bin": { @@ -806,25 +1134,25 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/compiler": "18.2.14", - "@angular/compiler-cli": "18.2.14" + "@angular/compiler": "19.2.21", + "@angular/compiler-cli": "19.2.21" } }, "node_modules/@angular/localize/node_modules/@babel/core": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", - "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.9.tgz", + "integrity": "sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.0", - "@babel/helper-compilation-targets": "^7.25.2", - "@babel/helper-module-transforms": "^7.25.2", - "@babel/helpers": "^7.25.0", - "@babel/parser": "^7.25.0", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.2", - "@babel/types": "^7.25.2", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.9", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.9", + "@babel/parser": "^7.26.9", + "@babel/template": "^7.26.9", + "@babel/traverse": "^7.26.9", + "@babel/types": "^7.26.9", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -853,26 +1181,25 @@ } }, "node_modules/@angular/material": { - "version": "18.2.14", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-18.2.14.tgz", - "integrity": "sha512-28pxzJP49Mymt664WnCtPkKeg7kXUsQKTKGf/Kl95rNTEdTJLbnlcc8wV0rT0yQNR7kXgpfBnG7h0ETLv/iu5Q==", + "version": "19.2.19", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-19.2.19.tgz", + "integrity": "sha512-auIE6JUzTIA3LyYklh9J/T7u64crmphxUBgAa0zcOMDog6SYfwbNe9YeLQqua5ek4OUAOdK/BHHfVl5W5iaUoQ==", "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { - "@angular/animations": "^18.0.0 || ^19.0.0", - "@angular/cdk": "18.2.14", - "@angular/common": "^18.0.0 || ^19.0.0", - "@angular/core": "^18.0.0 || ^19.0.0", - "@angular/forms": "^18.0.0 || ^19.0.0", - "@angular/platform-browser": "^18.0.0 || ^19.0.0", + "@angular/cdk": "19.2.19", + "@angular/common": "^19.0.0 || ^20.0.0", + "@angular/core": "^19.0.0 || ^20.0.0", + "@angular/forms": "^19.0.0 || ^20.0.0", + "@angular/platform-browser": "^19.0.0 || ^20.0.0", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/platform-browser": { - "version": "18.2.14", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-18.2.14.tgz", - "integrity": "sha512-W+JTxI25su3RiZVZT3Yrw6KNUCmOIy7OZIZ+612skPgYK2f2qil7VclnW1oCwG896h50cMJU/lnAfxZxefQgyQ==", + "version": "19.2.21", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.2.21.tgz", + "integrity": "sha512-v5KhTTK9FWaYmo6auXftQx1ll+9kbDhD44v68CFaIgDQG82ZihWatcdeKmPrA6dmoRXzyyNWIVSk1cNRCPKZRg==", "dependencies": { "tslib": "^2.3.0" }, @@ -880,9 +1207,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/animations": "18.2.14", - "@angular/common": "18.2.14", - "@angular/core": "18.2.14" + "@angular/animations": "19.2.21", + "@angular/common": "19.2.21", + "@angular/core": "19.2.21" }, "peerDependenciesMeta": { "@angular/animations": { @@ -891,9 +1218,9 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "18.2.14", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-18.2.14.tgz", - "integrity": "sha512-QOv+o89u8HLN0LG8faTIVHKBxfkOBHVDB0UuXy19+HJofWZGGvho+vGjV0/IAkhZnMC4Sxdoy/mOHP2ytALX3A==", + "version": "19.2.21", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-19.2.21.tgz", + "integrity": "sha512-+jOSCdZ3sPiPS28Cu/82aYmJFo3HfEIPyRCEwcStzKiASzbqNsdQzn3lIoZCKsD6qdP4uPU7m/KelJNOKDzfDQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -901,16 +1228,16 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "18.2.14", - "@angular/compiler": "18.2.14", - "@angular/core": "18.2.14", - "@angular/platform-browser": "18.2.14" + "@angular/common": "19.2.21", + "@angular/compiler": "19.2.21", + "@angular/core": "19.2.21", + "@angular/platform-browser": "19.2.21" } }, "node_modules/@angular/router": { - "version": "18.2.14", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-18.2.14.tgz", - "integrity": "sha512-v/gweh8MBjjDfh1QssuyjISa+6SVVIvIZox7MaMs81RkaoVHwS9grDtPud1pTKHzms2KxSVpvwwyvkRJQplueg==", + "version": "19.2.21", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.2.21.tgz", + "integrity": "sha512-ktGPSjzWvSWMPtE8FyH9PTRZm0Qcjy+XOjAvGuj+Wdx4VBhdmEl4qa08Idd7MkWJH0n0LyPCupJdmcH0bsF1FA==", "dependencies": { "tslib": "^2.3.0" }, @@ -918,9 +1245,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "18.2.14", - "@angular/core": "18.2.14", - "@angular/platform-browser": "18.2.14", + "@angular/common": "19.2.21", + "@angular/core": "19.2.21", + "@angular/platform-browser": "19.2.21", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -1465,12 +1792,12 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz", - "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2537,18 +2864,18 @@ } }, "node_modules/@discoveryjs/json-ext": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.1.tgz", - "integrity": "sha512-boghen8F0Q8D+0/Q1/1r6DUEieUJ8w2a1gIknExMSHBsJFOr2+0KUfHiVYBvucPwl3+RU5PFBK833FjFCh3BhA==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz", + "integrity": "sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==", "dev": true, "engines": { "node": ">=14.17.0" } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.0.tgz", - "integrity": "sha512-3sG8Zwa5fMcA9bgqB8AfWPQ+HFke6uD3h1s3RIwUNK8EG7a4buxvuFTs3j1IMs2NXAk9F30C/FF4vxRgQCcmoQ==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz", + "integrity": "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==", "cpu": [ "ppc64" ], @@ -2562,9 +2889,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.0.tgz", - "integrity": "sha512-+KuOHTKKyIKgEEqKbGTK8W7mPp+hKinbMBeEnNzjJGyFcWsfrXjSTNluJHCY1RqhxFurdD8uNXQDei7qDlR6+g==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.4.tgz", + "integrity": "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==", "cpu": [ "arm" ], @@ -2578,9 +2905,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.0.tgz", - "integrity": "sha512-EuHFUYkAVfU4qBdyivULuu03FhJO4IJN9PGuABGrFy4vUuzk91P2d+npxHcFdpUnfYKy0PuV+n6bKIpHOB3prQ==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz", + "integrity": "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==", "cpu": [ "arm64" ], @@ -2594,9 +2921,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.0.tgz", - "integrity": "sha512-WRrmKidLoKDl56LsbBMhzTTBxrsVwTKdNbKDalbEZr0tcsBgCLbEtoNthOW6PX942YiYq8HzEnb4yWQMLQuipQ==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.4.tgz", + "integrity": "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==", "cpu": [ "x64" ], @@ -2610,9 +2937,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.0.tgz", - "integrity": "sha512-YLntie/IdS31H54Ogdn+v50NuoWF5BDkEUFpiOChVa9UnKpftgwzZRrI4J132ETIi+D8n6xh9IviFV3eXdxfow==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz", + "integrity": "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==", "cpu": [ "arm64" ], @@ -2626,9 +2953,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.0.tgz", - "integrity": "sha512-IMQ6eme4AfznElesHUPDZ+teuGwoRmVuuixu7sv92ZkdQcPbsNHzutd+rAfaBKo8YK3IrBEi9SLLKWJdEvJniQ==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz", + "integrity": "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==", "cpu": [ "x64" ], @@ -2642,9 +2969,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.0.tgz", - "integrity": "sha512-0muYWCng5vqaxobq6LB3YNtevDFSAZGlgtLoAc81PjUfiFz36n4KMpwhtAd4he8ToSI3TGyuhyx5xmiWNYZFyw==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz", + "integrity": "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==", "cpu": [ "arm64" ], @@ -2658,9 +2985,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.0.tgz", - "integrity": "sha512-XKDVu8IsD0/q3foBzsXGt/KjD/yTKBCIwOHE1XwiXmrRwrX6Hbnd5Eqn/WvDekddK21tfszBSrE/WMaZh+1buQ==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz", + "integrity": "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==", "cpu": [ "x64" ], @@ -2674,9 +3001,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.0.tgz", - "integrity": "sha512-SEELSTEtOFu5LPykzA395Mc+54RMg1EUgXP+iw2SJ72+ooMwVsgfuwXo5Fn0wXNgWZsTVHwY2cg4Vi/bOD88qw==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz", + "integrity": "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==", "cpu": [ "arm" ], @@ -2690,9 +3017,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.0.tgz", - "integrity": "sha512-j1t5iG8jE7BhonbsEg5d9qOYcVZv/Rv6tghaXM/Ug9xahM0nX/H2gfu6X6z11QRTMT6+aywOMA8TDkhPo8aCGw==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz", + "integrity": "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==", "cpu": [ "arm64" ], @@ -2706,9 +3033,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.0.tgz", - "integrity": "sha512-P7O5Tkh2NbgIm2R6x1zGJJsnacDzTFcRWZyTTMgFdVit6E98LTxO+v8LCCLWRvPrjdzXHx9FEOA8oAZPyApWUA==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz", + "integrity": "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==", "cpu": [ "ia32" ], @@ -2722,9 +3049,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.0.tgz", - "integrity": "sha512-InQwepswq6urikQiIC/kkx412fqUZudBO4SYKu0N+tGhXRWUqAx+Q+341tFV6QdBifpjYgUndV1hhMq3WeJi7A==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz", + "integrity": "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==", "cpu": [ "loong64" ], @@ -2738,9 +3065,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.0.tgz", - "integrity": "sha512-J9rflLtqdYrxHv2FqXE2i1ELgNjT+JFURt/uDMoPQLcjWQA5wDKgQA4t/dTqGa88ZVECKaD0TctwsUfHbVoi4w==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz", + "integrity": "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==", "cpu": [ "mips64el" ], @@ -2754,9 +3081,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.0.tgz", - "integrity": "sha512-cShCXtEOVc5GxU0fM+dsFD10qZ5UpcQ8AM22bYj0u/yaAykWnqXJDpd77ublcX6vdDsWLuweeuSNZk4yUxZwtw==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz", + "integrity": "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==", "cpu": [ "ppc64" ], @@ -2770,9 +3097,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.0.tgz", - "integrity": "sha512-HEtaN7Y5UB4tZPeQmgz/UhzoEyYftbMXrBCUjINGjh3uil+rB/QzzpMshz3cNUxqXN7Vr93zzVtpIDL99t9aRw==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz", + "integrity": "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==", "cpu": [ "riscv64" ], @@ -2786,9 +3113,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.0.tgz", - "integrity": "sha512-WDi3+NVAuyjg/Wxi+o5KPqRbZY0QhI9TjrEEm+8dmpY9Xir8+HE/HNx2JoLckhKbFopW0RdO2D72w8trZOV+Wg==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz", + "integrity": "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==", "cpu": [ "s390x" ], @@ -2802,9 +3129,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.0.tgz", - "integrity": "sha512-a3pMQhUEJkITgAw6e0bWA+F+vFtCciMjW/LPtoj99MhVt+Mfb6bbL9hu2wmTZgNd994qTAEw+U/r6k3qHWWaOQ==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz", + "integrity": "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==", "cpu": [ "x64" ], @@ -2817,10 +3144,26 @@ "node": ">=18" } }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz", + "integrity": "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.0.tgz", - "integrity": "sha512-cRK+YDem7lFTs2Q5nEv/HHc4LnrfBCbH5+JHu6wm2eP+d8OZNoSMYgPZJq78vqQ9g+9+nMuIsAO7skzphRXHyw==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz", + "integrity": "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==", "cpu": [ "x64" ], @@ -2834,9 +3177,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.0.tgz", - "integrity": "sha512-suXjq53gERueVWu0OKxzWqk7NxiUWSUlrxoZK7usiF50C6ipColGR5qie2496iKGYNLhDZkPxBI3erbnYkU0rQ==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz", + "integrity": "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==", "cpu": [ "arm64" ], @@ -2850,9 +3193,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.0.tgz", - "integrity": "sha512-6p3nHpby0DM/v15IFKMjAaayFhqnXV52aEmv1whZHX56pdkK+MEaLoQWj+H42ssFarP1PcomVhbsR4pkz09qBg==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz", + "integrity": "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==", "cpu": [ "x64" ], @@ -2866,9 +3209,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.0.tgz", - "integrity": "sha512-BFelBGfrBwk6LVrmFzCq1u1dZbG4zy/Kp93w2+y83Q5UGYF1d8sCzeLI9NXjKyujjBBniQa8R8PzLFAUrSM9OA==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz", + "integrity": "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==", "cpu": [ "x64" ], @@ -2882,9 +3225,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.0.tgz", - "integrity": "sha512-lY6AC8p4Cnb7xYHuIxQ6iYPe6MfO2CC43XXKo9nBXDb35krYt7KGhQnOkRGar5psxYkircpCqfbNDB4uJbS2jQ==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz", + "integrity": "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==", "cpu": [ "arm64" ], @@ -2898,9 +3241,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.0.tgz", - "integrity": "sha512-7L1bHlOTcO4ByvI7OXVI5pNN6HSu6pUQq9yodga8izeuB1KcT2UkHaH6118QJwopExPn0rMHIseCTx1CRo/uNA==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz", + "integrity": "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==", "cpu": [ "ia32" ], @@ -2914,9 +3257,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.0.tgz", - "integrity": "sha512-Arm+WgUFLUATuoxCJcahGuk6Yj9Pzxd6l11Zb/2aAuv5kWWvvfhLFo2fni4uSK5vzlUdCGZ/BdV5tH8klj8p8g==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz", + "integrity": "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==", "cpu": [ "x64" ], @@ -3098,96 +3441,166 @@ "deprecated": "Use @eslint/object-schema instead", "dev": true }, + "node_modules/@inquirer/ansi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", + "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==", + "dev": true, + "engines": { + "node": ">=18" + } + }, "node_modules/@inquirer/checkbox": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-2.5.0.tgz", - "integrity": "sha512-sMgdETOfi2dUHT8r7TT1BTKOwNvdDGFDXYWtQ2J69SvlYNntk9I/gJe7r5yvMwwsuKnYbuRs3pNhx4tgNck5aA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.2.tgz", + "integrity": "sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==", "dev": true, "dependencies": { - "@inquirer/core": "^9.1.0", - "@inquirer/figures": "^1.0.5", - "@inquirer/type": "^1.5.3", - "ansi-escapes": "^4.3.2", - "yoctocolors-cjs": "^2.1.2" + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" }, "engines": { "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/confirm": { - "version": "3.1.22", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-3.1.22.tgz", - "integrity": "sha512-gsAKIOWBm2Q87CDfs9fEo7wJT3fwWIJfnDGMn9Qy74gBnNFOACDNfhUzovubbJjWnKLGBln7/NcSmZwj5DuEXg==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.6.tgz", + "integrity": "sha512-6ZXYK3M1XmaVBZX6FCfChgtponnL0R6I7k8Nu+kaoNkT828FVZTcca1MqmWQipaW2oNREQl5AaPCUOOCVNdRMw==", "dev": true, "dependencies": { - "@inquirer/core": "^9.0.10", - "@inquirer/type": "^1.5.2" + "@inquirer/core": "^10.1.7", + "@inquirer/type": "^3.0.4" }, "engines": { "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/core": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.2.1.tgz", - "integrity": "sha512-F2VBt7W/mwqEU4bL0RnHNZmC/OxzNx9cOYxHqnXX3MP6ruYvZUZAW9imgN9+h/uBT/oP8Gh888J2OZSbjSeWcg==", + "version": "10.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", + "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", "dev": true, "dependencies": { - "@inquirer/figures": "^1.0.6", - "@inquirer/type": "^2.0.0", - "@types/mute-stream": "^0.0.4", - "@types/node": "^22.5.5", - "@types/wrap-ansi": "^3.0.0", - "ansi-escapes": "^4.3.2", + "@inquirer/ansi": "^1.0.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", "cli-width": "^4.1.0", - "mute-stream": "^1.0.0", + "mute-stream": "^2.0.0", "signal-exit": "^4.1.0", - "strip-ansi": "^6.0.1", "wrap-ansi": "^6.2.0", - "yoctocolors-cjs": "^2.1.2" + "yoctocolors-cjs": "^2.1.3" }, "engines": { "node": ">=18" - } - }, - "node_modules/@inquirer/core/node_modules/@inquirer/type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-2.0.0.tgz", - "integrity": "sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag==", - "dev": true, - "dependencies": { - "mute-stream": "^1.0.0" }, - "engines": { - "node": ">=18" + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/editor": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-2.2.0.tgz", - "integrity": "sha512-9KHOpJ+dIL5SZli8lJ6xdaYLPPzB8xB9GZItg39MBybzhxA16vxmszmQFrRwbOA918WA2rvu8xhDEg/p6LXKbw==", + "version": "4.2.23", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.23.tgz", + "integrity": "sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==", "dev": true, "dependencies": { - "@inquirer/core": "^9.1.0", - "@inquirer/type": "^1.5.3", - "external-editor": "^3.1.0" + "@inquirer/core": "^10.3.2", + "@inquirer/external-editor": "^1.0.3", + "@inquirer/type": "^3.0.10" }, "engines": { "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/expand": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-2.3.0.tgz", - "integrity": "sha512-qnJsUcOGCSG1e5DTOErmv2BPQqrtT6uzqn1vI/aYGiPKq+FgslGZmtdnXbhuI7IlT7OByDoEEqdnhUnVR2hhLw==", + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.23.tgz", + "integrity": "sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==", "dev": true, "dependencies": { - "@inquirer/core": "^9.1.0", - "@inquirer/type": "^1.5.3", - "yoctocolors-cjs": "^2.1.2" + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" }, "engines": { "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/external-editor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", + "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", + "dev": true, + "dependencies": { + "chardet": "^2.1.1", + "iconv-lite": "^0.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/external-editor/node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/@inquirer/figures": { @@ -3200,121 +3613,182 @@ } }, "node_modules/@inquirer/input": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-2.3.0.tgz", - "integrity": "sha512-XfnpCStx2xgh1LIRqPXrTNEEByqQWoxsWYzNRSEUxJ5c6EQlhMogJ3vHKu8aXuTacebtaZzMAHwEL0kAflKOBw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.3.1.tgz", + "integrity": "sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==", "dev": true, "dependencies": { - "@inquirer/core": "^9.1.0", - "@inquirer/type": "^1.5.3" + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" }, "engines": { "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/number": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-1.1.0.tgz", - "integrity": "sha512-ilUnia/GZUtfSZy3YEErXLJ2Sljo/mf9fiKc08n18DdwdmDbOzRcTv65H1jjDvlsAuvdFXf4Sa/aL7iw/NanVA==", + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.23.tgz", + "integrity": "sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==", "dev": true, "dependencies": { - "@inquirer/core": "^9.1.0", - "@inquirer/type": "^1.5.3" + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" }, "engines": { "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/password": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-2.2.0.tgz", - "integrity": "sha512-5otqIpgsPYIshqhgtEwSspBQE40etouR8VIxzpJkv9i0dVHIpyhiivbkH9/dGiMLdyamT54YRdGJLfl8TFnLHg==", + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.23.tgz", + "integrity": "sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==", "dev": true, "dependencies": { - "@inquirer/core": "^9.1.0", - "@inquirer/type": "^1.5.3", - "ansi-escapes": "^4.3.2" + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" }, "engines": { "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/prompts": { - "version": "5.3.8", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-5.3.8.tgz", - "integrity": "sha512-b2BudQY/Si4Y2a0PdZZL6BeJtl8llgeZa7U2j47aaJSCeAl1e4UI7y8a9bSkO3o/ZbZrgT5muy/34JbsjfIWxA==", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.3.2.tgz", + "integrity": "sha512-G1ytyOoHh5BphmEBxSwALin3n1KGNYB6yImbICcRQdzXfOGbuJ9Jske/Of5Sebk339NSGGNfUshnzK8YWkTPsQ==", "dev": true, "dependencies": { - "@inquirer/checkbox": "^2.4.7", - "@inquirer/confirm": "^3.1.22", - "@inquirer/editor": "^2.1.22", - "@inquirer/expand": "^2.1.22", - "@inquirer/input": "^2.2.9", - "@inquirer/number": "^1.0.10", - "@inquirer/password": "^2.1.22", - "@inquirer/rawlist": "^2.2.4", - "@inquirer/search": "^1.0.7", - "@inquirer/select": "^2.4.7" + "@inquirer/checkbox": "^4.1.2", + "@inquirer/confirm": "^5.1.6", + "@inquirer/editor": "^4.2.7", + "@inquirer/expand": "^4.0.9", + "@inquirer/input": "^4.1.6", + "@inquirer/number": "^3.0.9", + "@inquirer/password": "^4.0.9", + "@inquirer/rawlist": "^4.0.9", + "@inquirer/search": "^3.0.9", + "@inquirer/select": "^4.0.9" }, "engines": { "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/rawlist": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-2.3.0.tgz", - "integrity": "sha512-zzfNuINhFF7OLAtGHfhwOW2TlYJyli7lOUoJUXw/uyklcwalV6WRXBXtFIicN8rTRK1XTiPWB4UY+YuW8dsnLQ==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.11.tgz", + "integrity": "sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==", "dev": true, "dependencies": { - "@inquirer/core": "^9.1.0", - "@inquirer/type": "^1.5.3", - "yoctocolors-cjs": "^2.1.2" + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" }, "engines": { "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/search": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-1.1.0.tgz", - "integrity": "sha512-h+/5LSj51dx7hp5xOn4QFnUaKeARwUCLs6mIhtkJ0JYPBLmEYjdHSYh7I6GrLg9LwpJ3xeX0FZgAG1q0QdCpVQ==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.2.tgz", + "integrity": "sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==", "dev": true, "dependencies": { - "@inquirer/core": "^9.1.0", - "@inquirer/figures": "^1.0.5", - "@inquirer/type": "^1.5.3", - "yoctocolors-cjs": "^2.1.2" + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" }, "engines": { "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/select": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-2.5.0.tgz", - "integrity": "sha512-YmDobTItPP3WcEI86GvPo+T2sRHkxxOq/kXmsBjHS5BVXUgvgZ5AfJjkvQvZr03T81NnI3KrrRuMzeuYUQRFOA==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.2.tgz", + "integrity": "sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==", "dev": true, "dependencies": { - "@inquirer/core": "^9.1.0", - "@inquirer/figures": "^1.0.5", - "@inquirer/type": "^1.5.3", - "ansi-escapes": "^4.3.2", - "yoctocolors-cjs": "^2.1.2" + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" }, "engines": { "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/type": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.5.tgz", - "integrity": "sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", + "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", "dev": true, - "dependencies": { - "mute-stream": "^1.0.0" - }, "engines": { "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@isaacs/cliui": { @@ -3413,6 +3887,18 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dev": true, + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", @@ -3512,13 +3998,13 @@ } }, "node_modules/@jsonjoy.com/fs-core": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-core/-/fs-core-4.57.1.tgz", - "integrity": "sha512-YrEi/ZPmgc+GfdO0esBF04qv8boK9Dg9WpRQw/+vM8Qt3nnVIJWIa8HwZ/LXVZ0DB11XUROM8El/7yYTJX+WtA==", + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-core/-/fs-core-4.57.2.tgz", + "integrity": "sha512-SVjwklkpIV5wrynpYtuYnfYH1QF4/nDuLBX7VXdb+3miglcAgBVZb/5y0cOsehRV/9Vb+3UqhkMq3/NR3ztdkQ==", "dev": true, "dependencies": { - "@jsonjoy.com/fs-node-builtins": "4.57.1", - "@jsonjoy.com/fs-node-utils": "4.57.1", + "@jsonjoy.com/fs-node-builtins": "4.57.2", + "@jsonjoy.com/fs-node-utils": "4.57.2", "thingies": "^2.5.0" }, "engines": { @@ -3533,14 +4019,14 @@ } }, "node_modules/@jsonjoy.com/fs-fsa": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-fsa/-/fs-fsa-4.57.1.tgz", - "integrity": "sha512-ooEPvSW/HQDivPDPZMibHGKZf/QS4WRir1czGZmXmp3MsQqLECZEpN0JobrD8iV9BzsuwdIv+PxtWX9WpPLsIA==", + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-fsa/-/fs-fsa-4.57.2.tgz", + "integrity": "sha512-fhO8+iR2I+OCw668ISDJdn1aArc9zx033sWejIyzQ8RBeXa9bDSaUeA3ix0poYOfrj1KdOzytmYNv2/uLDfV6g==", "dev": true, "dependencies": { - "@jsonjoy.com/fs-core": "4.57.1", - "@jsonjoy.com/fs-node-builtins": "4.57.1", - "@jsonjoy.com/fs-node-utils": "4.57.1", + "@jsonjoy.com/fs-core": "4.57.2", + "@jsonjoy.com/fs-node-builtins": "4.57.2", + "@jsonjoy.com/fs-node-utils": "4.57.2", "thingies": "^2.5.0" }, "engines": { @@ -3555,16 +4041,16 @@ } }, "node_modules/@jsonjoy.com/fs-node": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node/-/fs-node-4.57.1.tgz", - "integrity": "sha512-3YaKhP8gXEKN+2O49GLNfNb5l2gbnCFHyAaybbA2JkkbQP3dpdef7WcUaHAulg/c5Dg4VncHsA3NWAUSZMR5KQ==", + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node/-/fs-node-4.57.2.tgz", + "integrity": "sha512-nX2AdL6cOFwLdju9G4/nbRnYevmCJbh7N7hvR3gGm97Cs60uEjyd0rpR+YBS7cTg175zzl22pGKXR5USaQMvKg==", "dev": true, "dependencies": { - "@jsonjoy.com/fs-core": "4.57.1", - "@jsonjoy.com/fs-node-builtins": "4.57.1", - "@jsonjoy.com/fs-node-utils": "4.57.1", - "@jsonjoy.com/fs-print": "4.57.1", - "@jsonjoy.com/fs-snapshot": "4.57.1", + "@jsonjoy.com/fs-core": "4.57.2", + "@jsonjoy.com/fs-node-builtins": "4.57.2", + "@jsonjoy.com/fs-node-utils": "4.57.2", + "@jsonjoy.com/fs-print": "4.57.2", + "@jsonjoy.com/fs-snapshot": "4.57.2", "glob-to-regex.js": "^1.0.0", "thingies": "^2.5.0" }, @@ -3580,9 +4066,9 @@ } }, "node_modules/@jsonjoy.com/fs-node-builtins": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-builtins/-/fs-node-builtins-4.57.1.tgz", - "integrity": "sha512-XHkFKQ5GSH3uxm8c3ZYXVrexGdscpWKIcMWKFQpMpMJc8gA3AwOMBJXJlgpdJqmrhPyQXxaY9nbkNeYpacC0Og==", + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-builtins/-/fs-node-builtins-4.57.2.tgz", + "integrity": "sha512-xhiegylRmhw43Ki2HO1ZBL7DQ5ja/qpRsL29VtQ2xuUHiuDGbgf2uD4p9Qd8hJI5P6RCtGYD50IXHXVq/Ocjcg==", "dev": true, "engines": { "node": ">=10.0" @@ -3596,14 +4082,14 @@ } }, "node_modules/@jsonjoy.com/fs-node-to-fsa": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-to-fsa/-/fs-node-to-fsa-4.57.1.tgz", - "integrity": "sha512-pqGHyWWzNck4jRfaGV39hkqpY5QjRUQ/nRbNT7FYbBa0xf4bDG+TE1Gt2KWZrSkrkZZDE3qZUjYMbjwSliX6pg==", + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-to-fsa/-/fs-node-to-fsa-4.57.2.tgz", + "integrity": "sha512-18LmWTSONhoAPW+IWRuf8w/+zRolPFGPeGwMxlAhhfY11EKzX+5XHDBPAw67dBF5dxDErHJbl40U+3IXSDRXSQ==", "dev": true, "dependencies": { - "@jsonjoy.com/fs-fsa": "4.57.1", - "@jsonjoy.com/fs-node-builtins": "4.57.1", - "@jsonjoy.com/fs-node-utils": "4.57.1" + "@jsonjoy.com/fs-fsa": "4.57.2", + "@jsonjoy.com/fs-node-builtins": "4.57.2", + "@jsonjoy.com/fs-node-utils": "4.57.2" }, "engines": { "node": ">=10.0" @@ -3617,12 +4103,12 @@ } }, "node_modules/@jsonjoy.com/fs-node-utils": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-utils/-/fs-node-utils-4.57.1.tgz", - "integrity": "sha512-vp+7ZzIB8v43G+GLXTS4oDUSQmhAsRz532QmmWBbdYA20s465JvwhkSFvX9cVTqRRAQg+vZ7zWDaIEh0lFe2gw==", + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-utils/-/fs-node-utils-4.57.2.tgz", + "integrity": "sha512-rsPSJgekz43IlNbLyAM/Ab+ouYLWGp5DDBfYBNNEqDaSpsbXfthBn29Q4muFA9L0F+Z3mKo+CWlgSCXrf+mOyQ==", "dev": true, "dependencies": { - "@jsonjoy.com/fs-node-builtins": "4.57.1" + "@jsonjoy.com/fs-node-builtins": "4.57.2" }, "engines": { "node": ">=10.0" @@ -3636,12 +4122,12 @@ } }, "node_modules/@jsonjoy.com/fs-print": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-print/-/fs-print-4.57.1.tgz", - "integrity": "sha512-Ynct7ZJmfk6qoXDOKfpovNA36ITUx8rChLmRQtW08J73VOiuNsU8PB6d/Xs7fxJC2ohWR3a5AqyjmLojfrw5yw==", + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-print/-/fs-print-4.57.2.tgz", + "integrity": "sha512-wK9NSow48i4DbDl9F1CQE5TqnyZOJ04elU3WFG5aJ76p+YxO/ulyBBQvKsessPxdo381Bc2pcEoyPujMOhcRqQ==", "dev": true, "dependencies": { - "@jsonjoy.com/fs-node-utils": "4.57.1", + "@jsonjoy.com/fs-node-utils": "4.57.2", "tree-dump": "^1.1.0" }, "engines": { @@ -3656,13 +4142,13 @@ } }, "node_modules/@jsonjoy.com/fs-snapshot": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-snapshot/-/fs-snapshot-4.57.1.tgz", - "integrity": "sha512-/oG8xBNFMbDXTq9J7vepSA1kerS5vpgd3p5QZSPd+nX59uwodGJftI51gDYyHRpP57P3WCQf7LHtBYPqwUg2Bg==", + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-snapshot/-/fs-snapshot-4.57.2.tgz", + "integrity": "sha512-GdduDZuoP5V/QCgJkx9+BZ6SC0EZ/smXAdTS7PfMqgMTGXLlt/bH/FqMYaqB9JmLf05sJPtO0XRbAwwkEEPbVw==", "dev": true, "dependencies": { "@jsonjoy.com/buffers": "^17.65.0", - "@jsonjoy.com/fs-node-utils": "4.57.1", + "@jsonjoy.com/fs-node-utils": "4.57.2", "@jsonjoy.com/json-pack": "^17.65.0", "@jsonjoy.com/util": "^17.65.0" }, @@ -3884,24 +4370,45 @@ "dev": true }, "node_modules/@listr2/prompt-adapter-inquirer": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-2.0.15.tgz", - "integrity": "sha512-MZrGem/Ujjd4cPTLYDfCZK2iKKeiO/8OX13S6jqxldLs0Prf2aGqVlJ77nMBqMv7fzqgXEgjrNHLXcKR8l9lOg==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-2.0.18.tgz", + "integrity": "sha512-0hz44rAcrphyXcA8IS7EJ2SCoaBZD2u5goE8S/e+q/DL+dOGpqpcLidVOFeLG3VgML62SXmfRLAhWt0zL1oW4Q==", "dev": true, "dependencies": { - "@inquirer/type": "^1.5.1" + "@inquirer/type": "^1.5.5" }, "engines": { "node": ">=18.0.0" }, "peerDependencies": { - "@inquirer/prompts": ">= 3 < 6" + "@inquirer/prompts": ">= 3 < 8" + } + }, + "node_modules/@listr2/prompt-adapter-inquirer/node_modules/@inquirer/type": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.5.tgz", + "integrity": "sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==", + "dev": true, + "dependencies": { + "mute-stream": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@listr2/prompt-adapter-inquirer/node_modules/mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/@lmdb/lmdb-darwin-arm64": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.0.13.tgz", - "integrity": "sha512-uiKPB0Fv6WEEOZjruu9a6wnW/8jrjzlZbxXscMB8kuCJ1k6kHpcBnuvaAWcqhbI7rqX5GKziwWEdD+wi2gNLfA==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.2.6.tgz", + "integrity": "sha512-yF/ih9EJJZc72psFQbwnn8mExIWfTnzWJg+N02hnpXtDPETYLmQswIMBn7+V88lfCaFrMozJsUvcEQIkEPU0Gg==", "cpu": [ "arm64" ], @@ -3912,9 +4419,9 @@ ] }, "node_modules/@lmdb/lmdb-darwin-x64": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.0.13.tgz", - "integrity": "sha512-bEVIIfK5mSQoG1R19qA+fJOvCB+0wVGGnXHT3smchBVahYBdlPn2OsZZKzlHWfb1E+PhLBmYfqB5zQXFP7hJig==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.2.6.tgz", + "integrity": "sha512-5BbCumsFLbCi586Bb1lTWQFkekdQUw8/t8cy++Uq251cl3hbDIGEwD9HAwh8H6IS2F6QA9KdKmO136LmipRNkg==", "cpu": [ "x64" ], @@ -3925,9 +4432,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-arm": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.0.13.tgz", - "integrity": "sha512-Yml1KlMzOnXj/tnW7yX8U78iAzTk39aILYvCPbqeewAq1kSzl+w59k/fiVkTBfvDi/oW/5YRxL+Fq+Y1Fr1r2Q==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.2.6.tgz", + "integrity": "sha512-+6XgLpMb7HBoWxXj+bLbiiB4s0mRRcDPElnRS3LpWRzdYSe+gFk5MT/4RrVNqd2MESUDmb53NUXw1+BP69bjiQ==", "cpu": [ "arm" ], @@ -3938,9 +4445,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-arm64": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.0.13.tgz", - "integrity": "sha512-afbVrsMgZ9dUTNUchFpj5VkmJRxvht/u335jUJ7o23YTbNbnpmXif3VKQGCtnjSh+CZaqm6N3CPG8KO3zwyZ1Q==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.2.6.tgz", + "integrity": "sha512-l5VmJamJ3nyMmeD1ANBQCQqy7do1ESaJQfKPSm2IG9/ADZryptTyCj8N6QaYgIWewqNUrcbdMkJajRQAt5Qjfg==", "cpu": [ "arm64" ], @@ -3951,9 +4458,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-x64": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.0.13.tgz", - "integrity": "sha512-vOtxu0xC0SLdQ2WRXg8Qgd8T32ak4SPqk5zjItRszrJk2BdeXqfGxBJbP7o4aOvSPSmSSv46Lr1EP4HXU8v7Kg==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.2.6.tgz", + "integrity": "sha512-nDYT8qN9si5+onHYYaI4DiauDMx24OAiuZAUsEqrDy+ja/3EbpXPX/VAkMV8AEaQhy3xc4dRC+KcYIvOFefJ4Q==", "cpu": [ "x64" ], @@ -3964,9 +4471,9 @@ ] }, "node_modules/@lmdb/lmdb-win32-x64": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.0.13.tgz", - "integrity": "sha512-UCrMJQY/gJnOl3XgbWRZZUvGGBuKy6i0YNSptgMzHBjs+QYDYR1Mt/RLTOPy4fzzves65O1EDmlL//OzEqoLlA==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.2.6.tgz", + "integrity": "sha512-XlqVtILonQnG+9fH2N3Aytria7P/1fwDgDhl29rde96uH2sLB8CHORIf2PfuLVzFQJ7Uqp8py9AYwr3ZUCFfWg==", "cpu": [ "x64" ], @@ -4054,10 +4561,315 @@ "win32" ] }, + "node_modules/@napi-rs/nice": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice/-/nice-1.1.1.tgz", + "integrity": "sha512-xJIPs+bYuc9ASBl+cvGsKbGrJmS6fAKaSZCnT0lhahT5rhA2VVy9/EcIgd2JhtEuFOJNx7UHNn/qiTPTY4nrQw==", + "dev": true, + "optional": true, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "optionalDependencies": { + "@napi-rs/nice-android-arm-eabi": "1.1.1", + "@napi-rs/nice-android-arm64": "1.1.1", + "@napi-rs/nice-darwin-arm64": "1.1.1", + "@napi-rs/nice-darwin-x64": "1.1.1", + "@napi-rs/nice-freebsd-x64": "1.1.1", + "@napi-rs/nice-linux-arm-gnueabihf": "1.1.1", + "@napi-rs/nice-linux-arm64-gnu": "1.1.1", + "@napi-rs/nice-linux-arm64-musl": "1.1.1", + "@napi-rs/nice-linux-ppc64-gnu": "1.1.1", + "@napi-rs/nice-linux-riscv64-gnu": "1.1.1", + "@napi-rs/nice-linux-s390x-gnu": "1.1.1", + "@napi-rs/nice-linux-x64-gnu": "1.1.1", + "@napi-rs/nice-linux-x64-musl": "1.1.1", + "@napi-rs/nice-openharmony-arm64": "1.1.1", + "@napi-rs/nice-win32-arm64-msvc": "1.1.1", + "@napi-rs/nice-win32-ia32-msvc": "1.1.1", + "@napi-rs/nice-win32-x64-msvc": "1.1.1" + } + }, + "node_modules/@napi-rs/nice-android-arm-eabi": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm-eabi/-/nice-android-arm-eabi-1.1.1.tgz", + "integrity": "sha512-kjirL3N6TnRPv5iuHw36wnucNqXAO46dzK9oPb0wj076R5Xm8PfUVA9nAFB5ZNMmfJQJVKACAPd/Z2KYMppthw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-android-arm64": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm64/-/nice-android-arm64-1.1.1.tgz", + "integrity": "sha512-blG0i7dXgbInN5urONoUCNf+DUEAavRffrO7fZSeoRMJc5qD+BJeNcpr54msPF6qfDD6kzs9AQJogZvT2KD5nw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-darwin-arm64": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-arm64/-/nice-darwin-arm64-1.1.1.tgz", + "integrity": "sha512-s/E7w45NaLqTGuOjC2p96pct4jRfo61xb9bU1unM/MJ/RFkKlJyJDx7OJI/O0ll/hrfpqKopuAFDV8yo0hfT7A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-darwin-x64": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-x64/-/nice-darwin-x64-1.1.1.tgz", + "integrity": "sha512-dGoEBnVpsdcC+oHHmW1LRK5eiyzLwdgNQq3BmZIav+9/5WTZwBYX7r5ZkQC07Nxd3KHOCkgbHSh4wPkH1N1LiQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-freebsd-x64": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-freebsd-x64/-/nice-freebsd-x64-1.1.1.tgz", + "integrity": "sha512-kHv4kEHAylMYmlNwcQcDtXjklYp4FCf0b05E+0h6nDHsZ+F0bDe04U/tXNOqrx5CmIAth4vwfkjjUmp4c4JktQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-arm-gnueabihf": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm-gnueabihf/-/nice-linux-arm-gnueabihf-1.1.1.tgz", + "integrity": "sha512-E1t7K0efyKXZDoZg1LzCOLxgolxV58HCkaEkEvIYQx12ht2pa8hoBo+4OB3qh7e+QiBlp1SRf+voWUZFxyhyqg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-arm64-gnu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-gnu/-/nice-linux-arm64-gnu-1.1.1.tgz", + "integrity": "sha512-CIKLA12DTIZlmTaaKhQP88R3Xao+gyJxNWEn04wZwC2wmRapNnxCUZkVwggInMJvtVElA+D4ZzOU5sX4jV+SmQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-arm64-musl": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-musl/-/nice-linux-arm64-musl-1.1.1.tgz", + "integrity": "sha512-+2Rzdb3nTIYZ0YJF43qf2twhqOCkiSrHx2Pg6DJaCPYhhaxbLcdlV8hCRMHghQ+EtZQWGNcS2xF4KxBhSGeutg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-ppc64-gnu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-ppc64-gnu/-/nice-linux-ppc64-gnu-1.1.1.tgz", + "integrity": "sha512-4FS8oc0GeHpwvv4tKciKkw3Y4jKsL7FRhaOeiPei0X9T4Jd619wHNe4xCLmN2EMgZoeGg+Q7GY7BsvwKpL22Tg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-riscv64-gnu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-riscv64-gnu/-/nice-linux-riscv64-gnu-1.1.1.tgz", + "integrity": "sha512-HU0nw9uD4FO/oGCCk409tCi5IzIZpH2agE6nN4fqpwVlCn5BOq0MS1dXGjXaG17JaAvrlpV5ZeyZwSon10XOXw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-s390x-gnu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-s390x-gnu/-/nice-linux-s390x-gnu-1.1.1.tgz", + "integrity": "sha512-2YqKJWWl24EwrX0DzCQgPLKQBxYDdBxOHot1KWEq7aY2uYeX+Uvtv4I8xFVVygJDgf6/92h9N3Y43WPx8+PAgQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-x64-gnu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-gnu/-/nice-linux-x64-gnu-1.1.1.tgz", + "integrity": "sha512-/gaNz3R92t+dcrfCw/96pDopcmec7oCcAQ3l/M+Zxr82KT4DljD37CpgrnXV+pJC263JkW572pdbP3hP+KjcIg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-x64-musl": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-musl/-/nice-linux-x64-musl-1.1.1.tgz", + "integrity": "sha512-xScCGnyj/oppsNPMnevsBe3pvNaoK7FGvMjT35riz9YdhB2WtTG47ZlbxtOLpjeO9SqqQ2J2igCmz6IJOD5JYw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-openharmony-arm64": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-openharmony-arm64/-/nice-openharmony-arm64-1.1.1.tgz", + "integrity": "sha512-6uJPRVwVCLDeoOaNyeiW0gp2kFIM4r7PL2MczdZQHkFi9gVlgm+Vn+V6nTWRcu856mJ2WjYJiumEajfSm7arPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-win32-arm64-msvc": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-arm64-msvc/-/nice-win32-arm64-msvc-1.1.1.tgz", + "integrity": "sha512-uoTb4eAvM5B2aj/z8j+Nv8OttPf2m+HVx3UjA5jcFxASvNhQriyCQF1OB1lHL43ZhW+VwZlgvjmP5qF3+59atA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-win32-ia32-msvc": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-ia32-msvc/-/nice-win32-ia32-msvc-1.1.1.tgz", + "integrity": "sha512-CNQqlQT9MwuCsg1Vd/oKXiuH+TcsSPJmlAFc5frFyX/KkOh0UpBLEj7aoY656d5UKZQMQFP7vJNa1DNUNORvug==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-win32-x64-msvc": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-x64-msvc/-/nice-win32-x64-msvc-1.1.1.tgz", + "integrity": "sha512-vB+4G/jBQCAh0jelMTY3+kgFy00Hlx2f2/1zjMoH821IbplbWZOkLiTYXQkygNTzQJTq5cvwBDgn2ppHD+bglQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, "node_modules/@ngtools/webpack": { - "version": "18.2.21", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-18.2.21.tgz", - "integrity": "sha512-mfLT7lXbyJRlsazuPyuF5AGsMcgzRJRwsDlgxFbiy1DBlaF1chRFsXrKYj1gQ/WXQWNcEd11aedU0Rt+iCNDVw==", + "version": "19.2.24", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-19.2.24.tgz", + "integrity": "sha512-lDWjW4lFwT0vbniJG7ziaDC2bX7rj8e4Fa59TpSLNHEjuPvK5chOTgT0+L63fEdfTfHoTy+ohAK1158UBXWt7g==", "dev": true, "engines": { "node": "^18.19.1 || ^20.11.1 || >=22.0.0", @@ -4065,8 +4877,8 @@ "yarn": ">= 1.13.0" }, "peerDependencies": { - "@angular/compiler-cli": "^18.0.0", - "typescript": ">=5.4 <5.6", + "@angular/compiler-cli": "^19.0.0 || ^19.2.0-next.0", + "typescript": ">=5.5 <5.9", "webpack": "^5.54.0" } }, @@ -4103,9 +4915,9 @@ } }, "node_modules/@npmcli/agent": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.2.tgz", - "integrity": "sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-3.0.0.tgz", + "integrity": "sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==", "dev": true, "dependencies": { "agent-base": "^7.1.0", @@ -4115,7 +4927,7 @@ "socks-proxy-agent": "^8.0.3" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@npmcli/agent/node_modules/lru-cache": { @@ -4125,35 +4937,34 @@ "dev": true }, "node_modules/@npmcli/fs": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", - "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-4.0.0.tgz", + "integrity": "sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==", "dev": true, "dependencies": { "semver": "^7.3.5" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@npmcli/git": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-5.0.8.tgz", - "integrity": "sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-6.0.3.tgz", + "integrity": "sha512-GUYESQlxZRAdhs3UhbB6pVRNUELQOHXwK9ruDkwmCv2aZ5y0SApQzUJCg02p3A7Ue2J5hxvlk1YI53c00NmRyQ==", "dev": true, "dependencies": { - "@npmcli/promise-spawn": "^7.0.0", - "ini": "^4.1.3", + "@npmcli/promise-spawn": "^8.0.0", + "ini": "^5.0.0", "lru-cache": "^10.0.1", - "npm-pick-manifest": "^9.0.0", - "proc-log": "^4.0.0", - "promise-inflight": "^1.0.1", + "npm-pick-manifest": "^10.0.0", + "proc-log": "^5.0.0", "promise-retry": "^2.0.1", "semver": "^7.3.5", - "which": "^4.0.0" + "which": "^5.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@npmcli/git/node_modules/isexe": { @@ -4172,9 +4983,9 @@ "dev": true }, "node_modules/@npmcli/git/node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", "dev": true, "dependencies": { "isexe": "^3.1.1" @@ -4183,50 +4994,50 @@ "node-which": "bin/which.js" }, "engines": { - "node": "^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@npmcli/installed-package-contents": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.1.0.tgz", - "integrity": "sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-3.0.0.tgz", + "integrity": "sha512-fkxoPuFGvxyrH+OQzyTkX2LUEamrF4jZSmxjAtPPHHGO0dqsQ8tTKjnIS8SAnPHdk2I03BDtSMR5K/4loKg79Q==", "dev": true, "dependencies": { - "npm-bundled": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" + "npm-bundled": "^4.0.0", + "npm-normalize-package-bin": "^4.0.0" }, "bin": { "installed-package-contents": "bin/index.js" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@npmcli/node-gyp": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", - "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-4.0.0.tgz", + "integrity": "sha512-+t5DZ6mO/QFh78PByMq1fGSAub/agLJZDRfJRMeOSNCt8s9YVlTjmGpIPwPhvXTGUIJk+WszlT0rQa1W33yzNA==", "dev": true, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@npmcli/package-json": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-5.2.1.tgz", - "integrity": "sha512-f7zYC6kQautXHvNbLEWgD/uGu1+xCn9izgqBfgItWSx22U0ZDekxN08A1vM8cTxj/cRVe0Q94Ode+tdoYmIOOQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-6.2.0.tgz", + "integrity": "sha512-rCNLSB/JzNvot0SEyXqWZ7tX2B5dD2a1br2Dp0vSYVo5jh8Z0EZ7lS9TsZ1UtziddB1UfNUaMCc538/HztnJGA==", "dev": true, "dependencies": { - "@npmcli/git": "^5.0.0", + "@npmcli/git": "^6.0.0", "glob": "^10.2.2", - "hosted-git-info": "^7.0.0", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^6.0.0", - "proc-log": "^4.0.0", - "semver": "^7.5.3" + "hosted-git-info": "^8.0.0", + "json-parse-even-better-errors": "^4.0.0", + "proc-log": "^5.0.0", + "semver": "^7.5.3", + "validate-npm-package-license": "^3.0.4" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@npmcli/package-json/node_modules/glob": { @@ -4266,15 +5077,15 @@ } }, "node_modules/@npmcli/promise-spawn": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-7.0.2.tgz", - "integrity": "sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-8.0.3.tgz", + "integrity": "sha512-Yb00SWaL4F8w+K8YGhQ55+xE4RUNdMHV43WZGsiTM92gS+lC0mGsn7I4hLug7pbao035S6bj3Y3w0cUNGLfmkg==", "dev": true, "dependencies": { - "which": "^4.0.0" + "which": "^5.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@npmcli/promise-spawn/node_modules/isexe": { @@ -4287,9 +5098,9 @@ } }, "node_modules/@npmcli/promise-spawn/node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", "dev": true, "dependencies": { "isexe": "^3.1.1" @@ -4298,33 +5109,33 @@ "node-which": "bin/which.js" }, "engines": { - "node": "^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@npmcli/redact": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-2.0.1.tgz", - "integrity": "sha512-YgsR5jCQZhVmTJvjduTOIHph0L73pK8xwMVaDY0PatySqVM9AZj93jpoXYSJqfHFxFkN9dmqTw6OiqExsS3LPw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-3.2.2.tgz", + "integrity": "sha512-7VmYAmk4csGv08QzrDKScdzn11jHPFGyqJW39FyPgPuAp3zIaUmuCo1yxw9aGs+NEJuTGQ9Gwqpt93vtJubucg==", "dev": true, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@npmcli/run-script": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-8.1.0.tgz", - "integrity": "sha512-y7efHHwghQfk28G2z3tlZ67pLG0XdfYbcVG26r7YIXALRsrVQcTq4/tdenSmdOrEsNahIYA/eh8aEVROWGFUDg==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-9.1.0.tgz", + "integrity": "sha512-aoNSbxtkePXUlbZB+anS1LqsJdctG5n3UVhfU47+CDdwMi6uNTBMF9gPcQRnqghQd2FGzcwwIFBruFMxjhBewg==", "dev": true, "dependencies": { - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/package-json": "^5.0.0", - "@npmcli/promise-spawn": "^7.0.0", - "node-gyp": "^10.0.0", - "proc-log": "^4.0.0", - "which": "^4.0.0" + "@npmcli/node-gyp": "^4.0.0", + "@npmcli/package-json": "^6.0.0", + "@npmcli/promise-spawn": "^8.0.0", + "node-gyp": "^11.0.0", + "proc-log": "^5.0.0", + "which": "^5.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@npmcli/run-script/node_modules/isexe": { @@ -4337,9 +5148,9 @@ } }, "node_modules/@npmcli/run-script/node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", "dev": true, "dependencies": { "isexe": "^3.1.1" @@ -4348,9 +5159,312 @@ "node-which": "bin/which.js" }, "engines": { - "node": "^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/@parcel/watcher": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.6.tgz", + "integrity": "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "dependencies": { + "detect-libc": "^2.0.3", + "is-glob": "^4.0.3", + "node-addon-api": "^7.0.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.6", + "@parcel/watcher-darwin-arm64": "2.5.6", + "@parcel/watcher-darwin-x64": "2.5.6", + "@parcel/watcher-freebsd-x64": "2.5.6", + "@parcel/watcher-linux-arm-glibc": "2.5.6", + "@parcel/watcher-linux-arm-musl": "2.5.6", + "@parcel/watcher-linux-arm64-glibc": "2.5.6", + "@parcel/watcher-linux-arm64-musl": "2.5.6", + "@parcel/watcher-linux-x64-glibc": "2.5.6", + "@parcel/watcher-linux-x64-musl": "2.5.6", + "@parcel/watcher-win32-arm64": "2.5.6", + "@parcel/watcher-win32-ia32": "2.5.6", + "@parcel/watcher-win32-x64": "2.5.6" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.6.tgz", + "integrity": "sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.6.tgz", + "integrity": "sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.6.tgz", + "integrity": "sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.6.tgz", + "integrity": "sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.6.tgz", + "integrity": "sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.6.tgz", + "integrity": "sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.6.tgz", + "integrity": "sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.6.tgz", + "integrity": "sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.6.tgz", + "integrity": "sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.6.tgz", + "integrity": "sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.6.tgz", + "integrity": "sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.6.tgz", + "integrity": "sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.6.tgz", + "integrity": "sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher/node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "optional": true + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -4372,9 +5486,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.4.tgz", - "integrity": "sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", + "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", "cpu": [ "arm" ], @@ -4385,9 +5499,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.4.tgz", - "integrity": "sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", + "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", "cpu": [ "arm64" ], @@ -4398,9 +5512,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.4.tgz", - "integrity": "sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", + "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", "cpu": [ "arm64" ], @@ -4411,9 +5525,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.4.tgz", - "integrity": "sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", + "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", "cpu": [ "x64" ], @@ -4423,10 +5537,36 @@ "darwin" ] }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", + "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", + "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.4.tgz", - "integrity": "sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", + "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", "cpu": [ "arm" ], @@ -4437,9 +5577,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.4.tgz", - "integrity": "sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", + "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", "cpu": [ "arm" ], @@ -4450,9 +5590,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.4.tgz", - "integrity": "sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", + "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", "cpu": [ "arm64" ], @@ -4463,9 +5603,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.4.tgz", - "integrity": "sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", + "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", "cpu": [ "arm64" ], @@ -4475,10 +5615,49 @@ "linux" ] }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.4.tgz", - "integrity": "sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==", + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", + "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", + "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", + "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", + "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", "cpu": [ "ppc64" ], @@ -4489,9 +5668,22 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.4.tgz", - "integrity": "sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", + "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", + "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", "cpu": [ "riscv64" ], @@ -4502,9 +5694,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.4.tgz", - "integrity": "sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", + "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", "cpu": [ "s390x" ], @@ -4515,9 +5707,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz", - "integrity": "sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", + "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", "cpu": [ "x64" ], @@ -4528,9 +5720,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.4.tgz", - "integrity": "sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", + "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", "cpu": [ "x64" ], @@ -4540,10 +5732,36 @@ "linux" ] }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", + "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", + "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openharmony" + ] + }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.4.tgz", - "integrity": "sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", + "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", "cpu": [ "arm64" ], @@ -4554,9 +5772,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.4.tgz", - "integrity": "sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", + "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", "cpu": [ "ia32" ], @@ -4566,10 +5784,23 @@ "win32" ] }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", + "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.4.tgz", - "integrity": "sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", + "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", "cpu": [ "x64" ], @@ -4580,13 +5811,13 @@ ] }, "node_modules/@schematics/angular": { - "version": "18.2.21", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-18.2.21.tgz", - "integrity": "sha512-5Ai+NEflQZi67y4NsQ3o04iEp7zT0/BUFVCrJ3CueU3uYQGs8jrN1Lk6tvQ9c5HzGcTDrMXuTrCswyR9o6ecpA==", + "version": "19.2.24", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.2.24.tgz", + "integrity": "sha512-RGHb7ebUQTOxtWfNcBXCzDog8LwJzvVp3/BptEI+78M+tCaBJM6BAS2vrDphJRjVbjV3DTwZcmlNRqCHJeSknA==", "dev": true, "dependencies": { - "@angular-devkit/core": "18.2.21", - "@angular-devkit/schematics": "18.2.21", + "@angular-devkit/core": "19.2.24", + "@angular-devkit/schematics": "19.2.24", "jsonc-parser": "3.3.1" }, "engines": { @@ -4595,78 +5826,146 @@ "yarn": ">= 1.13.0" } }, - "node_modules/@sigstore/bundle": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.3.2.tgz", - "integrity": "sha512-wueKWDk70QixNLB363yHc2D2ItTgYiMTdPwK8D9dKQMR3ZQ0c35IxP5xnwQ8cNLoCgCRcHf14kE+CLIvNX1zmA==", + "node_modules/@schematics/angular/node_modules/@angular-devkit/core": { + "version": "19.2.24", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.24.tgz", + "integrity": "sha512-Kd49warf6U/EyWe5BszF/eebN3zQ3bk7tgfEljAw8q/rX95UUtriJubWvp6pgzHfzBA4jwq8f+QiNZB8eBEXPA==", "dev": true, "dependencies": { - "@sigstore/protobuf-specs": "^0.3.2" + "ajv": "8.18.0", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.4", + "rxjs": "7.8.1", + "source-map": "0.7.4" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^4.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@schematics/angular/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@schematics/angular/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@schematics/angular/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@sigstore/bundle": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-3.1.0.tgz", + "integrity": "sha512-Mm1E3/CmDDCz3nDhFKTuYdB47EdRFRQMOE/EAbiG1MJW77/w1b3P7Qx7JSrVJs8PfwOLOVcKQCHErIwCTyPbag==", + "dev": true, + "dependencies": { + "@sigstore/protobuf-specs": "^0.4.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@sigstore/core": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-1.1.0.tgz", - "integrity": "sha512-JzBqdVIyqm2FRQCulY6nbQzMpJJpSiJ8XXWMhtOX9eKgaXXpfNOF53lzQEjIydlStnd/eFtuC1dW4VYdD93oRg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-2.0.0.tgz", + "integrity": "sha512-nYxaSb/MtlSI+JWcwTHQxyNmWeWrUXJJ/G4liLrGG7+tS4vAz6LF3xRXqLH6wPIVUoZQel2Fs4ddLx4NCpiIYg==", "dev": true, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@sigstore/protobuf-specs": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.3.tgz", - "integrity": "sha512-RpacQhBlwpBWd7KEJsRKcBQalbV28fvkxwTOJIqhIuDysMMaJW47V4OqW30iJB9uRpqOSxxEAQFdr8tTattReQ==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.4.3.tgz", + "integrity": "sha512-fk2zjD9117RL9BjqEwF7fwv7Q/P9yGsMV4MUJZ/DocaQJ6+3pKr+syBq1owU5Q5qGw5CUbXzm+4yJ2JVRDQeSA==", "dev": true, "engines": { "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@sigstore/sign": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-2.3.2.tgz", - "integrity": "sha512-5Vz5dPVuunIIvC5vBb0APwo7qKA4G9yM48kPWJT+OEERs40md5GoUR1yedwpekWZ4m0Hhw44m6zU+ObsON+iDA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-3.1.0.tgz", + "integrity": "sha512-knzjmaOHOov1Ur7N/z4B1oPqZ0QX5geUfhrVaqVlu+hl0EAoL4o+l0MSULINcD5GCWe3Z0+YJO8ues6vFlW0Yw==", "dev": true, "dependencies": { - "@sigstore/bundle": "^2.3.2", - "@sigstore/core": "^1.0.0", - "@sigstore/protobuf-specs": "^0.3.2", - "make-fetch-happen": "^13.0.1", - "proc-log": "^4.2.0", + "@sigstore/bundle": "^3.1.0", + "@sigstore/core": "^2.0.0", + "@sigstore/protobuf-specs": "^0.4.0", + "make-fetch-happen": "^14.0.2", + "proc-log": "^5.0.0", "promise-retry": "^2.0.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@sigstore/tuf": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.3.4.tgz", - "integrity": "sha512-44vtsveTPUpqhm9NCrbU8CWLe3Vck2HO1PNLw7RIajbB7xhtn5RBPm1VNSCMwqGYHhDsBJG8gDF0q4lgydsJvw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-3.1.1.tgz", + "integrity": "sha512-eFFvlcBIoGwVkkwmTi/vEQFSva3xs5Ot3WmBcjgjVdiaoelBLQaQ/ZBfhlG0MnG0cmTYScPpk7eDdGDWUcFUmg==", "dev": true, "dependencies": { - "@sigstore/protobuf-specs": "^0.3.2", - "tuf-js": "^2.2.1" + "@sigstore/protobuf-specs": "^0.4.1", + "tuf-js": "^3.0.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@sigstore/verify": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-1.2.1.tgz", - "integrity": "sha512-8iKx79/F73DKbGfRf7+t4dqrc0bRr0thdPrxAtCKWRm/F0tG71i6O1rvlnScncJLLBZHn3h8M3c1BSUAb9yu8g==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-2.1.1.tgz", + "integrity": "sha512-hVJD77oT67aowHxwT4+M6PGOp+E2LtLdTK3+FC0lBO9T7sYwItDMXZ7Z07IDCvR1M717a4axbIWckrW67KMP/w==", "dev": true, "dependencies": { - "@sigstore/bundle": "^2.3.2", - "@sigstore/core": "^1.1.0", - "@sigstore/protobuf-specs": "^0.3.2" + "@sigstore/bundle": "^3.1.0", + "@sigstore/core": "^2.0.0", + "@sigstore/protobuf-specs": "^0.4.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@sindresorhus/merge-streams": { @@ -4697,16 +5996,16 @@ } }, "node_modules/@tufjs/models": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-2.0.1.tgz", - "integrity": "sha512-92F7/SFyufn4DXsha9+QfKnN03JGqtMFMXgSHbZOo8JG59WkTni7UzAouNQDf7AuP9OAMxVOPQcqG3sB7w+kkg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-3.0.1.tgz", + "integrity": "sha512-UUYHISyhCU3ZgN8yaear3cGATHb3SMuKHsQ/nVbHXcmnBf+LzQ/cQfhNG+rfaSHgqGKNEm2cOCLVLELStUQ1JA==", "dev": true, "dependencies": { "@tufjs/canonical-json": "2.0.0", - "minimatch": "^9.0.4" + "minimatch": "^9.0.5" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@tufjs/models/node_modules/minimatch": { @@ -4808,10 +6107,30 @@ "@types/node": "*" } }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true }, "node_modules/@types/express": { @@ -4876,15 +6195,6 @@ "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", "dev": true }, - "node_modules/@types/mute-stream": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.4.tgz", - "integrity": "sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/node": { "version": "22.19.15", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.15.tgz", @@ -4975,12 +6285,6 @@ "@types/node": "*" } }, - "node_modules/@types/wrap-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz", - "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==", - "dev": true - }, "node_modules/@types/ws": { "version": "8.18.1", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", @@ -5505,15 +6809,15 @@ "dev": true }, "node_modules/@vitejs/plugin-basic-ssl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.1.0.tgz", - "integrity": "sha512-wO4Dk/rm8u7RNhOf95ZzcEmC9rYOncYgvq4z3duaJrCgjN8BxAnDVyndanfcJZ0O6XZzHz6Q0hTimxTg8Y9g/A==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.2.0.tgz", + "integrity": "sha512-mkQnxTkcldAzIsomk1UuLfAu9n+kpQ3JbHcpCp7d2Oo6ITtji8pHS3QToOWjhPFvNQSnhlkAjmGbhv2QvwO/7Q==", "dev": true, "engines": { - "node": ">=14.6.0" + "node": ">=14.21.3" }, "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" } }, "node_modules/@webassemblyjs/ast": { @@ -5681,12 +6985,12 @@ "dev": true }, "node_modules/abbrev": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", - "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz", + "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==", "dev": true, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/accepts": { @@ -5723,13 +7027,16 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-attributes": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", - "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", "dev": true, + "engines": { + "node": ">=10.13.0" + }, "peerDependencies": { - "acorn": "^8" + "acorn": "^8.14.0" } }, "node_modules/acorn-jsx": { @@ -5777,23 +7084,10 @@ "node": ">= 14" } }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.3", @@ -5844,21 +7138,6 @@ "node": ">=6" } }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/ansi-html-community": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", @@ -5995,9 +7274,9 @@ } }, "node_modules/babel-loader": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", - "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", + "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", "dev": true, "dependencies": { "find-cache-dir": "^4.0.0", @@ -6111,6 +7390,25 @@ "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", "dev": true }, + "node_modules/beasties": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.3.2.tgz", + "integrity": "sha512-p4AF8uYzm9Fwu8m/hSVTCPXrRBPmB34hQpHsec2KOaR9CZmgoU8IOv4Cvwq4hgz2p4hLMNbsdNl5XeA6XbAQwA==", + "dev": true, + "dependencies": { + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "htmlparser2": "^10.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.49", + "postcss-media-query-parser": "^0.2.3" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -6323,12 +7621,12 @@ } }, "node_modules/cacache": { - "version": "18.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.4.tgz", - "integrity": "sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==", + "version": "19.0.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-19.0.1.tgz", + "integrity": "sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==", "dev": true, "dependencies": { - "@npmcli/fs": "^3.1.0", + "@npmcli/fs": "^4.0.0", "fs-minipass": "^3.0.0", "glob": "^10.2.2", "lru-cache": "^10.0.1", @@ -6336,13 +7634,22 @@ "minipass-collect": "^2.0.1", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" + "p-map": "^7.0.2", + "ssri": "^12.0.0", + "tar": "^7.4.3", + "unique-filename": "^4.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/cacache/node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true, + "engines": { + "node": ">=18" } }, "node_modules/cacache/node_modules/glob": { @@ -6387,6 +7694,31 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/cacache/node_modules/tar": { + "version": "7.5.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.13.tgz", + "integrity": "sha512-tOG/7GyXpFevhXVh8jOPJrmtRpOTsYqUIkVdVooZYJS/z8WhfQUX8RJILmeuJNinGAMSu1veBr4asSHFt5/hng==", + "dev": true, + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/cacache/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "engines": { + "node": ">=18" + } + }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", @@ -6461,9 +7793,9 @@ } }, "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", + "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==", "dev": true }, "node_modules/chart.js": { @@ -6541,15 +7873,6 @@ "node": ">=6.0" } }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/cli-cursor": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", @@ -6771,6 +8094,15 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, + "node_modules/compression/node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -6893,34 +8225,6 @@ "webpack": "^5.1.0" } }, - "node_modules/copy-webpack-plugin/node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/copy-webpack-plugin/node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/copy-webpack-plugin/node_modules/globby": { "version": "14.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz", @@ -6941,15 +8245,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/copy-webpack-plugin/node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, "node_modules/copy-webpack-plugin/node_modules/path-type": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", @@ -7036,22 +8331,6 @@ } } }, - "node_modules/critters": { - "version": "0.0.24", - "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.24.tgz", - "integrity": "sha512-Oyqew0FGM0wYUSNqR0L6AteO5MpMoUU0rhKRieXeiKs+PmRTxiJMyaunYB2KF6fQ3dzChXKCpbFOEJx3OQ1v/Q==", - "deprecated": "Ownership of Critters has moved to the Nuxt team, who will be maintaining the project going forward. If you'd like to keep using Critters, please switch to the actively-maintained fork at https://github.com/danielroe/beasties", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "css-select": "^5.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.2", - "htmlparser2": "^8.0.2", - "postcss": "^8.4.23", - "postcss-media-query-parser": "^0.2.3" - } - }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -7254,6 +8533,7 @@ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "dev": true, + "optional": true, "engines": { "node": ">=8" } @@ -7589,9 +8869,9 @@ } }, "node_modules/es-module-lexer": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", + "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", "dev": true }, "node_modules/es-object-atoms": { @@ -7607,9 +8887,9 @@ } }, "node_modules/esbuild": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.0.tgz", - "integrity": "sha512-1lvV17H2bMYda/WaFb2jLPeHU3zml2k4/yagNMG8Q/YtfMjCwEUZa2eXXMgZTVSL5q1n4H7sQ0X6CdJDqqeCFA==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.4.tgz", + "integrity": "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==", "dev": true, "hasInstallScript": true, "bin": { @@ -7619,36 +8899,37 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.23.0", - "@esbuild/android-arm": "0.23.0", - "@esbuild/android-arm64": "0.23.0", - "@esbuild/android-x64": "0.23.0", - "@esbuild/darwin-arm64": "0.23.0", - "@esbuild/darwin-x64": "0.23.0", - "@esbuild/freebsd-arm64": "0.23.0", - "@esbuild/freebsd-x64": "0.23.0", - "@esbuild/linux-arm": "0.23.0", - "@esbuild/linux-arm64": "0.23.0", - "@esbuild/linux-ia32": "0.23.0", - "@esbuild/linux-loong64": "0.23.0", - "@esbuild/linux-mips64el": "0.23.0", - "@esbuild/linux-ppc64": "0.23.0", - "@esbuild/linux-riscv64": "0.23.0", - "@esbuild/linux-s390x": "0.23.0", - "@esbuild/linux-x64": "0.23.0", - "@esbuild/netbsd-x64": "0.23.0", - "@esbuild/openbsd-arm64": "0.23.0", - "@esbuild/openbsd-x64": "0.23.0", - "@esbuild/sunos-x64": "0.23.0", - "@esbuild/win32-arm64": "0.23.0", - "@esbuild/win32-ia32": "0.23.0", - "@esbuild/win32-x64": "0.23.0" + "@esbuild/aix-ppc64": "0.25.4", + "@esbuild/android-arm": "0.25.4", + "@esbuild/android-arm64": "0.25.4", + "@esbuild/android-x64": "0.25.4", + "@esbuild/darwin-arm64": "0.25.4", + "@esbuild/darwin-x64": "0.25.4", + "@esbuild/freebsd-arm64": "0.25.4", + "@esbuild/freebsd-x64": "0.25.4", + "@esbuild/linux-arm": "0.25.4", + "@esbuild/linux-arm64": "0.25.4", + "@esbuild/linux-ia32": "0.25.4", + "@esbuild/linux-loong64": "0.25.4", + "@esbuild/linux-mips64el": "0.25.4", + "@esbuild/linux-ppc64": "0.25.4", + "@esbuild/linux-riscv64": "0.25.4", + "@esbuild/linux-s390x": "0.25.4", + "@esbuild/linux-x64": "0.25.4", + "@esbuild/netbsd-arm64": "0.25.4", + "@esbuild/netbsd-x64": "0.25.4", + "@esbuild/openbsd-arm64": "0.25.4", + "@esbuild/openbsd-x64": "0.25.4", + "@esbuild/sunos-x64": "0.25.4", + "@esbuild/win32-arm64": "0.25.4", + "@esbuild/win32-ia32": "0.25.4", + "@esbuild/win32-x64": "0.25.4" } }, "node_modules/esbuild-wasm": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.23.0.tgz", - "integrity": "sha512-6jP8UmWy6R6TUUV8bMuC3ZyZ6lZKI56x0tkxyCIqWwRRJ/DgeQKneh/Oid5EoGoPFLrGNkz47ZEtWAYuiY/u9g==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.25.4.tgz", + "integrity": "sha512-2HlCS6rNvKWaSKhWaG/YIyRsTsL3gUrMP2ToZMBIjw9LM7vVcIs+rz8kE2vExvTJgvM8OKPqNpcHawY/BQc/qQ==", "dev": true, "bin": { "esbuild": "bin/esbuild" @@ -8043,20 +9324,6 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -8064,15 +9331,15 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" @@ -8142,7 +9409,6 @@ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, - "peer": true, "engines": { "node": ">=12.0.0" }, @@ -8683,15 +9949,15 @@ } }, "node_modules/hosted-git-info": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", - "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.1.0.tgz", + "integrity": "sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==", "dev": true, "dependencies": { "lru-cache": "^10.0.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/hosted-git-info/node_modules/lru-cache": { @@ -8749,9 +10015,9 @@ "dev": true }, "node_modules/htmlparser2": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz", + "integrity": "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==", "dev": true, "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", @@ -8763,8 +10029,20 @@ "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "entities": "^4.4.0" + "domutils": "^3.2.2", + "entities": "^7.0.1" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, "node_modules/http-cache-semantics": { @@ -8859,12 +10137,12 @@ } }, "node_modules/https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dev": true, "dependencies": { - "agent-base": "^7.0.2", + "agent-base": "^7.1.2", "debug": "4" }, "engines": { @@ -8925,24 +10203,24 @@ ] }, "node_modules/ignore": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-6.0.2.tgz", - "integrity": "sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "dev": true, "engines": { "node": ">= 4" } }, "node_modules/ignore-walk": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.5.tgz", - "integrity": "sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-7.0.0.tgz", + "integrity": "sha512-T4gbf83A4NH95zvhVYZc+qWocBBGlpzUXLPGurJggw/WIOwicfXJChLDP/iBZnN5WqROSu5Bm3hhle4z8a8YGQ==", "dev": true, "dependencies": { "minimatch": "^9.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/image-size": { @@ -8959,9 +10237,9 @@ } }, "node_modules/immutable": { - "version": "4.3.8", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.8.tgz", - "integrity": "sha512-d/Ld9aLbKpNwyl0KiM2CT1WYvkitQ1TSvmRtkcV8FKStiDoA7Slzgjmb/1G2yhKM1p0XeNOieaTbFZmU1d3Xuw==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.5.tgz", + "integrity": "sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==", "dev": true }, "node_modules/import-fresh": { @@ -8989,15 +10267,6 @@ "node": ">=0.8.19" } }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -9016,12 +10285,12 @@ "dev": true }, "node_modules/ini": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", - "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-5.0.0.tgz", + "integrity": "sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==", "dev": true, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/ip-address": { @@ -9148,12 +10417,6 @@ "node": ">=8" } }, - "node_modules/is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "dev": true - }, "node_modules/is-network-error": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.1.tgz", @@ -9457,12 +10720,12 @@ "dev": true }, "node_modules/json-parse-even-better-errors": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", - "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-4.0.0.tgz", + "integrity": "sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==", "dev": true, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/json-schema-traverse": { @@ -9829,9 +11092,9 @@ } }, "node_modules/less": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/less/-/less-4.2.0.tgz", - "integrity": "sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/less/-/less-4.2.2.tgz", + "integrity": "sha512-tkuLHQlvWUTeQ3doAqnHbNn8T6WX1KA8yvbKG9x4VtKtIjHsVKQZCH11zRgAfbDAXC2UNIg/K9BYAAcEzUIrNg==", "dev": true, "dependencies": { "copy-anything": "^2.0.1", @@ -10089,18 +11352,6 @@ "node": ">=20.0.0" } }, - "node_modules/lint-staged/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/lint-staged/node_modules/slice-ansi": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-8.0.0.tgz", @@ -10150,9 +11401,9 @@ } }, "node_modules/listr2": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.4.tgz", - "integrity": "sha512-opevsywziHd3zHCVQGAj8zu+Z3yHNkkoYhWIGnq54RrCVwLz0MozotJEDnKsIBLvkfLGN6BLOyAeRrYI0pKA4g==", + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.5.tgz", + "integrity": "sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==", "dev": true, "dependencies": { "cli-truncate": "^4.0.0", @@ -10229,28 +11480,29 @@ } }, "node_modules/lmdb": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.0.13.tgz", - "integrity": "sha512-UGe+BbaSUQtAMZobTb4nHvFMrmvuAQKSeaqAX2meTEQjfsbpl5sxdHD8T72OnwD4GU9uwNhYXIVe4QGs8N9Zyw==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.2.6.tgz", + "integrity": "sha512-SuHqzPl7mYStna8WRotY8XX/EUZBjjv3QyKIByeCLFfC9uXT/OIHByEcA07PzbMfQAM0KYJtLgtpMRlIe5dErQ==", "dev": true, "hasInstallScript": true, + "optional": true, "dependencies": { - "msgpackr": "^1.10.2", + "msgpackr": "^1.11.2", "node-addon-api": "^6.1.0", "node-gyp-build-optional-packages": "5.2.2", - "ordered-binary": "^1.4.1", + "ordered-binary": "^1.5.3", "weak-lru-cache": "^1.2.2" }, "bin": { "download-lmdb-prebuilds": "bin/download-prebuilds.js" }, "optionalDependencies": { - "@lmdb/lmdb-darwin-arm64": "3.0.13", - "@lmdb/lmdb-darwin-x64": "3.0.13", - "@lmdb/lmdb-linux-arm": "3.0.13", - "@lmdb/lmdb-linux-arm64": "3.0.13", - "@lmdb/lmdb-linux-x64": "3.0.13", - "@lmdb/lmdb-win32-x64": "3.0.13" + "@lmdb/lmdb-darwin-arm64": "3.2.6", + "@lmdb/lmdb-darwin-x64": "3.2.6", + "@lmdb/lmdb-linux-arm": "3.2.6", + "@lmdb/lmdb-linux-arm64": "3.2.6", + "@lmdb/lmdb-linux-x64": "3.2.6", + "@lmdb/lmdb-win32-x64": "3.2.6" } }, "node_modules/loader-runner": { @@ -10475,9 +11727,9 @@ } }, "node_modules/magic-string": { - "version": "0.30.11", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", - "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "dev": true, "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" @@ -10499,26 +11751,25 @@ } }, "node_modules/make-fetch-happen": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.1.tgz", - "integrity": "sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA==", + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-14.0.3.tgz", + "integrity": "sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==", "dev": true, "dependencies": { - "@npmcli/agent": "^2.0.0", - "cacache": "^18.0.0", + "@npmcli/agent": "^3.0.0", + "cacache": "^19.0.1", "http-cache-semantics": "^4.1.1", - "is-lambda": "^1.0.1", "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", + "minipass-fetch": "^4.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "proc-log": "^4.2.0", + "negotiator": "^1.0.0", + "proc-log": "^5.0.0", "promise-retry": "^2.0.1", - "ssri": "^10.0.0" + "ssri": "^12.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/math-intrinsics": { @@ -10540,19 +11791,19 @@ } }, "node_modules/memfs": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.57.1.tgz", - "integrity": "sha512-WvzrWPwMQT+PtbX2Et64R4qXKK0fj/8pO85MrUCzymX3twwCiJCdvntW3HdhG1teLJcHDDLIKx5+c3HckWYZtQ==", + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.57.2.tgz", + "integrity": "sha512-2nWzSsJzrukurSDna4Z0WywuScK4Id3tSKejgu74u8KCdW4uNrseKRSIDg75C6Yw5ZRqBe0F0EtMNlTbUq8bAQ==", "dev": true, "dependencies": { - "@jsonjoy.com/fs-core": "4.57.1", - "@jsonjoy.com/fs-fsa": "4.57.1", - "@jsonjoy.com/fs-node": "4.57.1", - "@jsonjoy.com/fs-node-builtins": "4.57.1", - "@jsonjoy.com/fs-node-to-fsa": "4.57.1", - "@jsonjoy.com/fs-node-utils": "4.57.1", - "@jsonjoy.com/fs-print": "4.57.1", - "@jsonjoy.com/fs-snapshot": "4.57.1", + "@jsonjoy.com/fs-core": "4.57.2", + "@jsonjoy.com/fs-fsa": "4.57.2", + "@jsonjoy.com/fs-node": "4.57.2", + "@jsonjoy.com/fs-node-builtins": "4.57.2", + "@jsonjoy.com/fs-node-to-fsa": "4.57.2", + "@jsonjoy.com/fs-node-utils": "4.57.2", + "@jsonjoy.com/fs-print": "4.57.2", + "@jsonjoy.com/fs-snapshot": "4.57.2", "@jsonjoy.com/json-pack": "^1.11.0", "@jsonjoy.com/util": "^1.9.0", "glob-to-regex.js": "^1.0.1", @@ -10678,9 +11929,9 @@ } }, "node_modules/mini-css-extract-plugin": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.0.tgz", - "integrity": "sha512-Zs1YsZVfemekSZG+44vBsYTLQORkPMwnlv+aehcxK/NLKC+EGhDB39/YePYYqx/sTk6NnYpuqikhSn7+JIevTA==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz", + "integrity": "sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==", "dev": true, "dependencies": { "schema-utils": "^4.0.0", @@ -10749,17 +12000,17 @@ } }, "node_modules/minipass-fetch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", - "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-4.0.1.tgz", + "integrity": "sha512-j7U11C5HXigVuutxebFadoYBbd7VSdZWggSe64NVdvWNBqGAiXPL2QVCehjmw7lY1oF9gOllYbORh+hiNgfPgQ==", "dev": true, "dependencies": { "minipass": "^7.0.3", "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" + "minizlib": "^3.0.1" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" }, "optionalDependencies": { "encoding": "^0.1.13" @@ -10856,36 +12107,17 @@ "dev": true }, "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "dev": true, "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" + "minipass": "^7.1.2" }, "engines": { - "node": ">= 8" + "node": ">= 18" } }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -10899,9 +12131,9 @@ } }, "node_modules/mrmime": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", - "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", "dev": true, "engines": { "node": ">=10" @@ -10913,10 +12145,11 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/msgpackr": { - "version": "1.11.9", - "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.9.tgz", - "integrity": "sha512-FkoAAyyA6HM8wL882EcEyFZ9s7hVADSwG9xrVx3dxxNQAtgADTrJoEWivID82Iv1zWDsv/OtbrrcZAzGzOMdNw==", + "version": "1.11.10", + "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.10.tgz", + "integrity": "sha512-iCZNq+HszvF+fC3anCm4nBmWEnbeIAfpDs6IStAEKhQ2YSgkjzVG2FF9XJqwwQh5bH3N9OUTUt4QwVN6MLMLtA==", "dev": true, + "optional": true, "optionalDependencies": { "msgpackr-extract": "^3.0.2" } @@ -10957,12 +12190,12 @@ } }, "node_modules/mute-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", - "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", "dev": true, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/nanoid": { @@ -11020,9 +12253,9 @@ } }, "node_modules/negotiator": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", - "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", "dev": true, "engines": { "node": ">= 0.6" @@ -11081,33 +12314,12 @@ "@angular/core": ">=16.0.0" } }, - "node_modules/nice-napi": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", - "integrity": "sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "!win32" - ], - "dependencies": { - "node-addon-api": "^3.0.0", - "node-gyp-build": "^4.2.2" - } - }, - "node_modules/nice-napi/node_modules/node-addon-api": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", - "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", - "dev": true, - "optional": true - }, "node_modules/node-addon-api": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", - "dev": true + "dev": true, + "optional": true }, "node_modules/node-forge": { "version": "1.4.0", @@ -11119,39 +12331,27 @@ } }, "node_modules/node-gyp": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.3.1.tgz", - "integrity": "sha512-Pp3nFHBThHzVtNY7U6JfPjvT/DTE8+o/4xKsLQtBoU+j2HLsGlhcfzflAoUreaJbNmYnX+LlLi0qjV8kpyO6xQ==", + "version": "11.5.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.5.0.tgz", + "integrity": "sha512-ra7Kvlhxn5V9Slyus0ygMa2h+UqExPqUIkfk7Pc8QTLT956JLSy51uWFwHtIYy0vI8cB4BDhc/S03+880My/LQ==", "dev": true, "dependencies": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", - "glob": "^10.3.10", "graceful-fs": "^4.2.6", - "make-fetch-happen": "^13.0.0", - "nopt": "^7.0.0", - "proc-log": "^4.1.0", + "make-fetch-happen": "^14.0.3", + "nopt": "^8.0.0", + "proc-log": "^5.0.0", "semver": "^7.3.5", - "tar": "^6.2.1", - "which": "^4.0.0" + "tar": "^7.4.3", + "tinyglobby": "^0.2.12", + "which": "^5.0.0" }, "bin": { "node-gyp": "bin/node-gyp.js" }, "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/node-gyp-build": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", - "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", - "dev": true, - "optional": true, - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/node-gyp-build-optional-packages": { @@ -11159,6 +12359,7 @@ "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", "dev": true, + "optional": true, "dependencies": { "detect-libc": "^2.0.1" }, @@ -11168,25 +12369,13 @@ "node-gyp-build-optional-packages-test": "build-test.js" } }, - "node_modules/node-gyp/node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "node_modules/node-gyp/node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": ">=18" } }, "node_modules/node-gyp/node_modules/isexe": { @@ -11198,25 +12387,26 @@ "node": ">=18" } }, - "node_modules/node-gyp/node_modules/minimatch": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "node_modules/node-gyp/node_modules/tar": { + "version": "7.5.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.13.tgz", + "integrity": "sha512-tOG/7GyXpFevhXVh8jOPJrmtRpOTsYqUIkVdVooZYJS/z8WhfQUX8RJILmeuJNinGAMSu1veBr4asSHFt5/hng==", "dev": true, "dependencies": { - "brace-expansion": "^2.0.2" + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=18" } }, "node_modules/node-gyp/node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", "dev": true, "dependencies": { "isexe": "^3.1.1" @@ -11225,7 +12415,16 @@ "node-which": "bin/which.js" }, "engines": { - "node": "^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/node-gyp/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "engines": { + "node": ">=18" } }, "node_modules/node-releases": { @@ -11234,32 +12433,18 @@ "integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==" }, "node_modules/nopt": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", - "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", + "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", "dev": true, "dependencies": { - "abbrev": "^2.0.0" + "abbrev": "^3.0.0" }, "bin": { "nopt": "bin/nopt.js" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/normalize-package-data": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", - "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", - "dev": true, - "dependencies": { - "hosted-git-info": "^7.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/normalize-path": { @@ -11281,97 +12466,97 @@ } }, "node_modules/npm-bundled": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.1.tgz", - "integrity": "sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-4.0.0.tgz", + "integrity": "sha512-IxaQZDMsqfQ2Lz37VvyyEtKLe8FsRZuysmedy/N06TU1RyVppYKXrO4xIhR0F+7ubIBox6Q7nir6fQI3ej39iA==", "dev": true, "dependencies": { - "npm-normalize-package-bin": "^3.0.0" + "npm-normalize-package-bin": "^4.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm-install-checks": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", - "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-7.1.2.tgz", + "integrity": "sha512-z9HJBCYw9Zr8BqXcllKIs5nI+QggAImbBdHphOzVYrz2CB4iQ6FzWyKmlqDZua+51nAu7FcemlbTc9VgQN5XDQ==", "dev": true, "dependencies": { "semver": "^7.1.1" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm-normalize-package-bin": { - "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==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-4.0.0.tgz", + "integrity": "sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==", "dev": true, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm-package-arg": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", - "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.2.tgz", + "integrity": "sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA==", "dev": true, "dependencies": { - "hosted-git-info": "^7.0.0", - "proc-log": "^4.0.0", + "hosted-git-info": "^8.0.0", + "proc-log": "^5.0.0", "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" + "validate-npm-package-name": "^6.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm-packlist": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-8.0.2.tgz", - "integrity": "sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-9.0.0.tgz", + "integrity": "sha512-8qSayfmHJQTx3nJWYbbUmflpyarbLMBc6LCAjYsiGtXxDB68HaZpb8re6zeaLGxZzDuMdhsg70jryJe+RrItVQ==", "dev": true, "dependencies": { - "ignore-walk": "^6.0.4" + "ignore-walk": "^7.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm-pick-manifest": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-9.1.0.tgz", - "integrity": "sha512-nkc+3pIIhqHVQr085X9d2JzPzLyjzQS96zbruppqC9aZRm/x8xx6xhI98gHtsfELP2bE+loHq8ZaHFHhe+NauA==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-10.0.0.tgz", + "integrity": "sha512-r4fFa4FqYY8xaM7fHecQ9Z2nE9hgNfJR+EmoKv0+chvzWkBcORX3r0FpTByP+CbOVJDladMXnPQGVN8PBLGuTQ==", "dev": true, "dependencies": { - "npm-install-checks": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "npm-package-arg": "^11.0.0", + "npm-install-checks": "^7.1.0", + "npm-normalize-package-bin": "^4.0.0", + "npm-package-arg": "^12.0.0", "semver": "^7.3.5" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm-registry-fetch": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-17.1.0.tgz", - "integrity": "sha512-5+bKQRH0J1xG1uZ1zMNvxW0VEyoNWgJpY9UDuluPFLKDfJ9u2JmmjmTJV1srBGQOROfdBMiVvnH2Zvpbm+xkVA==", + "version": "18.0.2", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-18.0.2.tgz", + "integrity": "sha512-LeVMZBBVy+oQb5R6FDV9OlJCcWDU+al10oKpe+nsvcHnG24Z3uM3SvJYKfGJlfGjVU8v9liejCrUR/M5HO5NEQ==", "dev": true, "dependencies": { - "@npmcli/redact": "^2.0.0", + "@npmcli/redact": "^3.0.0", "jsonparse": "^1.3.1", - "make-fetch-happen": "^13.0.0", + "make-fetch-happen": "^14.0.0", "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", - "minizlib": "^2.1.2", - "npm-package-arg": "^11.0.0", - "proc-log": "^4.0.0" + "minipass-fetch": "^4.0.0", + "minizlib": "^3.0.1", + "npm-package-arg": "^12.0.0", + "proc-log": "^5.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/nth-check": { @@ -11566,16 +12751,8 @@ "version": "1.6.1", "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.6.1.tgz", "integrity": "sha512-QkCdPooczexPLiXIrbVOPYkR3VO3T6v2OyKRkR1Xbhpy7/LAVXwahnRCgRp78Oe/Ehf0C/HATAxfSr6eA1oX+w==", - "dev": true - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "dev": true, - "engines": { - "node": ">=0.10.0" - } + "optional": true }, "node_modules/p-limit": { "version": "3.1.0", @@ -11608,15 +12785,12 @@ } }, "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", + "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -11655,34 +12829,34 @@ "dev": true }, "node_modules/pacote": { - "version": "18.0.6", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-18.0.6.tgz", - "integrity": "sha512-+eK3G27SMwsB8kLIuj4h1FUhHtwiEUo21Tw8wNjmvdlpOEr613edv+8FUsTj/4F/VN5ywGE19X18N7CC2EJk6A==", + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-20.0.0.tgz", + "integrity": "sha512-pRjC5UFwZCgx9kUFDVM9YEahv4guZ1nSLqwmWiLUnDbGsjs+U5w7z6Uc8HNR1a6x8qnu5y9xtGE6D1uAuYz+0A==", "dev": true, "dependencies": { - "@npmcli/git": "^5.0.0", - "@npmcli/installed-package-contents": "^2.0.1", - "@npmcli/package-json": "^5.1.0", - "@npmcli/promise-spawn": "^7.0.0", - "@npmcli/run-script": "^8.0.0", - "cacache": "^18.0.0", + "@npmcli/git": "^6.0.0", + "@npmcli/installed-package-contents": "^3.0.0", + "@npmcli/package-json": "^6.0.0", + "@npmcli/promise-spawn": "^8.0.0", + "@npmcli/run-script": "^9.0.0", + "cacache": "^19.0.0", "fs-minipass": "^3.0.0", "minipass": "^7.0.2", - "npm-package-arg": "^11.0.0", - "npm-packlist": "^8.0.0", - "npm-pick-manifest": "^9.0.0", - "npm-registry-fetch": "^17.0.0", - "proc-log": "^4.0.0", + "npm-package-arg": "^12.0.0", + "npm-packlist": "^9.0.0", + "npm-pick-manifest": "^10.0.0", + "npm-registry-fetch": "^18.0.0", + "proc-log": "^5.0.0", "promise-retry": "^2.0.1", - "sigstore": "^2.2.0", - "ssri": "^10.0.0", + "sigstore": "^3.0.0", + "ssri": "^12.0.0", "tar": "^6.1.11" }, "bin": { "pacote": "bin/index.js" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/parent-module": { @@ -11734,7 +12908,6 @@ "version": "7.3.0", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", - "devOptional": true, "dependencies": { "entities": "^6.0.0" }, @@ -11772,7 +12945,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", - "devOptional": true, "engines": { "node": ">=0.12" }, @@ -11865,9 +13037,9 @@ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" }, "node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "engines": { "node": ">=12" @@ -11887,12 +13059,12 @@ } }, "node_modules/piscina": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.6.1.tgz", - "integrity": "sha512-z30AwWGtQE+Apr+2WBZensP2lIvwoaMcOPkQlIEmSGMJNUvaYACylPYrQM6wSdUNJlnDVMSpLv7xTMJqlVshOA==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.8.0.tgz", + "integrity": "sha512-EZJb+ZxDrQf3dihsUL7p42pjNyrNIFJCrRHPMgxu/svsj+P3xS3fuEWp7k2+rfsavfl1N0G29b1HGs7J0m8rZA==", "dev": true, "optionalDependencies": { - "nice-napi": "^1.0.2" + "@napi-rs/nice": "^1.0.1" } }, "node_modules/pkg-dir": { @@ -11993,9 +13165,9 @@ } }, "node_modules/postcss": { - "version": "8.4.41", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", - "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.10.tgz", + "integrity": "sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==", "dev": true, "funding": [ { @@ -12012,9 +13184,9 @@ } ], "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -12160,12 +13332,12 @@ } }, "node_modules/proc-log": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", - "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", + "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", "dev": true, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/process-nextick-args": { @@ -12174,12 +13346,6 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "dev": true - }, "node_modules/promise-retry": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", @@ -12438,18 +13604,21 @@ "dev": true }, "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "dev": true, "dependencies": { - "is-core-module": "^2.13.0", + "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -12559,12 +13728,12 @@ } }, "node_modules/rollup": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.4.tgz", - "integrity": "sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", + "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", "dev": true, "dependencies": { - "@types/estree": "1.0.5" + "@types/estree": "1.0.8" }, "bin": { "rollup": "dist/bin/rollup" @@ -12574,22 +13743,31 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.22.4", - "@rollup/rollup-android-arm64": "4.22.4", - "@rollup/rollup-darwin-arm64": "4.22.4", - "@rollup/rollup-darwin-x64": "4.22.4", - "@rollup/rollup-linux-arm-gnueabihf": "4.22.4", - "@rollup/rollup-linux-arm-musleabihf": "4.22.4", - "@rollup/rollup-linux-arm64-gnu": "4.22.4", - "@rollup/rollup-linux-arm64-musl": "4.22.4", - "@rollup/rollup-linux-powerpc64le-gnu": "4.22.4", - "@rollup/rollup-linux-riscv64-gnu": "4.22.4", - "@rollup/rollup-linux-s390x-gnu": "4.22.4", - "@rollup/rollup-linux-x64-gnu": "4.22.4", - "@rollup/rollup-linux-x64-musl": "4.22.4", - "@rollup/rollup-win32-arm64-msvc": "4.22.4", - "@rollup/rollup-win32-ia32-msvc": "4.22.4", - "@rollup/rollup-win32-x64-msvc": "4.22.4", + "@rollup/rollup-android-arm-eabi": "4.59.0", + "@rollup/rollup-android-arm64": "4.59.0", + "@rollup/rollup-darwin-arm64": "4.59.0", + "@rollup/rollup-darwin-x64": "4.59.0", + "@rollup/rollup-freebsd-arm64": "4.59.0", + "@rollup/rollup-freebsd-x64": "4.59.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", + "@rollup/rollup-linux-arm-musleabihf": "4.59.0", + "@rollup/rollup-linux-arm64-gnu": "4.59.0", + "@rollup/rollup-linux-arm64-musl": "4.59.0", + "@rollup/rollup-linux-loong64-gnu": "4.59.0", + "@rollup/rollup-linux-loong64-musl": "4.59.0", + "@rollup/rollup-linux-ppc64-gnu": "4.59.0", + "@rollup/rollup-linux-ppc64-musl": "4.59.0", + "@rollup/rollup-linux-riscv64-gnu": "4.59.0", + "@rollup/rollup-linux-riscv64-musl": "4.59.0", + "@rollup/rollup-linux-s390x-gnu": "4.59.0", + "@rollup/rollup-linux-x64-gnu": "4.59.0", + "@rollup/rollup-linux-x64-musl": "4.59.0", + "@rollup/rollup-openbsd-x64": "4.59.0", + "@rollup/rollup-openharmony-arm64": "4.59.0", + "@rollup/rollup-win32-arm64-msvc": "4.59.0", + "@rollup/rollup-win32-ia32-msvc": "4.59.0", + "@rollup/rollup-win32-x64-gnu": "4.59.0", + "@rollup/rollup-win32-x64-msvc": "4.59.0", "fsevents": "~2.3.2" } }, @@ -12679,13 +13857,13 @@ "dev": true }, "node_modules/sass": { - "version": "1.77.6", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.6.tgz", - "integrity": "sha512-ByXE1oLD79GVq9Ht1PeHWCPMPB8XHpBuz1r85oByKHjZY6qV6rWnQovQzXJXuQ/XyE1Oj3iPk3lo28uzaRA2/Q==", + "version": "1.85.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.85.0.tgz", + "integrity": "sha512-3ToiC1xZ1Y8aU7+CkgCI/tqyuPXEmYGJXO7H4uqp0xkLXUqp88rQQ4j1HmP37xSJLbCJPaIiv+cT1y+grssrww==", "dev": true, "dependencies": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", + "chokidar": "^4.0.0", + "immutable": "^5.0.2", "source-map-js": ">=0.6.2 <2.0.0" }, "bin": { @@ -12693,12 +13871,15 @@ }, "engines": { "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" } }, "node_modules/sass-loader": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.0.tgz", - "integrity": "sha512-n13Z+3rU9A177dk4888czcVFiC8CL9dii4qpXWUg3YIIgZEvi9TCFKjOQcbK0kJM7DJu9VucrZFddvNfYCPwtw==", + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.5.tgz", + "integrity": "sha512-oL+CMBXrj6BZ/zOq4os+UECPL+bWqt6OAC6DWS8Ln8GZRcMDjlJ4JC3FBDuHJdYaFWIdKNIBYmtZtK2MaMkNIw==", "dev": true, "dependencies": { "neo-async": "^2.6.2" @@ -12735,6 +13916,34 @@ } } }, + "node_modules/sass/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/sass/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/sax": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", @@ -12801,9 +14010,9 @@ } }, "node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "bin": { "semver": "bin/semver.js" }, @@ -13111,20 +14320,20 @@ } }, "node_modules/sigstore": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-2.3.1.tgz", - "integrity": "sha512-8G+/XDU8wNsJOQS5ysDVO0Etg9/2uA5gR9l4ZwijjlwxBcrU6RPfwi2+jJmbP+Ap1Hlp/nVAaEO4Fj22/SL2gQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-3.1.0.tgz", + "integrity": "sha512-ZpzWAFHIFqyFE56dXqgX/DkDRZdz+rRcjoIk/RQU4IX0wiCv1l8S7ZrXDHcCc+uaf+6o7w3h2l3g6GYG5TKN9Q==", "dev": true, "dependencies": { - "@sigstore/bundle": "^2.3.2", - "@sigstore/core": "^1.0.0", - "@sigstore/protobuf-specs": "^0.3.2", - "@sigstore/sign": "^2.3.2", - "@sigstore/tuf": "^2.3.4", - "@sigstore/verify": "^1.2.1" + "@sigstore/bundle": "^3.1.0", + "@sigstore/core": "^2.0.0", + "@sigstore/protobuf-specs": "^0.4.0", + "@sigstore/sign": "^3.1.0", + "@sigstore/tuf": "^3.1.0", + "@sigstore/verify": "^2.1.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/slash": { @@ -13386,15 +14595,15 @@ } }, "node_modules/ssri": { - "version": "10.0.6", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", - "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-12.0.0.tgz", + "integrity": "sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==", "dev": true, "dependencies": { "minipass": "^7.0.3" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/statuses": { @@ -13645,6 +14854,31 @@ "node": ">=8" } }, + "node_modules/tar/node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/tar/node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/tar/node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -13664,9 +14898,9 @@ "dev": true }, "node_modules/terser": { - "version": "5.31.6", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.6.tgz", - "integrity": "sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.0.tgz", + "integrity": "sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -13756,7 +14990,6 @@ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "dev": true, - "peer": true, "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" @@ -13768,31 +15001,6 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "dev": true, - "peer": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -13856,17 +15064,17 @@ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, "node_modules/tuf-js": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-2.2.1.tgz", - "integrity": "sha512-GwIJau9XaA8nLVbUXsN3IlFi7WmQ48gBUrl3FTkkL/XLu/POhBzfmX9hd33FNMX1qAsfl6ozO1iMmW9NC8YniA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-3.1.0.tgz", + "integrity": "sha512-3T3T04WzowbwV2FDiGXBbr81t64g1MUGGJRgT4x5o97N+8ArdhVCAF9IxFrxuSJmM3E5Asn7nKHkao0ibcZXAg==", "dev": true, "dependencies": { - "@tufjs/models": "2.0.1", - "debug": "^4.3.4", - "make-fetch-happen": "^13.0.1" + "@tufjs/models": "3.0.1", + "debug": "^4.4.1", + "make-fetch-happen": "^14.0.3" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/type-check": { @@ -13881,18 +15089,6 @@ "node": ">= 0.8.0" } }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -14009,27 +15205,27 @@ } }, "node_modules/unique-filename": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", - "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-4.0.0.tgz", + "integrity": "sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==", "dev": true, "dependencies": { - "unique-slug": "^4.0.0" + "unique-slug": "^5.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/unique-slug": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", - "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-5.0.0.tgz", + "integrity": "sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==", "dev": true, "dependencies": { "imurmurhash": "^0.1.4" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/universalify": { @@ -14132,12 +15328,12 @@ } }, "node_modules/validate-npm-package-name": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", - "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.2.tgz", + "integrity": "sha512-IUoow1YUtvoBBC06dXs8bR8B9vuA3aJfmQNKMoaPG/OFsPmoQvw8xh+6Ye25Gx9DQhoEom3Pcu9MKHerm/NpUQ==", "dev": true, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/vary": { @@ -14150,20 +15346,23 @@ } }, "node_modules/vite": { - "version": "5.4.21", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", - "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.2.tgz", + "integrity": "sha512-2N/55r4JDJ4gdrCvGgINMy+HH3iRpNIz8K6SFwVsA+JbQScLiC+clmAxBgwiSPgcG9U15QmvqCGWzMbqda5zGQ==", "dev": true, "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -14172,19 +15371,25 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", - "terser": "^5.4.0" + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, + "jiti": { + "optional": true + }, "less": { "optional": true }, @@ -14205,441 +15410,13 @@ }, "terser": { "optional": true - } - } - }, - "node_modules/vite/node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, - "node_modules/vite/node_modules/postcss": { - "version": "8.5.8", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", - "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" + "tsx": { + "optional": true }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" + "yaml": { + "optional": true } - ], - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" } }, "node_modules/void-elements": { @@ -14652,9 +15429,9 @@ } }, "node_modules/watchpack": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", - "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "dev": true, "dependencies": { "glob-to-regexp": "^0.4.1", @@ -14686,37 +15463,40 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==", - "dev": true + "dev": true, + "optional": true }, "node_modules/webpack": { - "version": "5.94.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", - "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", + "version": "5.105.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.0.tgz", + "integrity": "sha512-gX/dMkRQc7QOMzgTe6KsYFM7DxeIONQSui1s0n/0xht36HvrgbxtM1xBlgx596NbpHuQU8P7QpKwrZYwUX48nw==", "dev": true, "dependencies": { - "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.12.1", - "@webassemblyjs/wasm-edit": "^1.12.1", - "@webassemblyjs/wasm-parser": "^1.12.1", - "acorn": "^8.7.1", - "acorn-import-attributes": "^1.9.5", - "browserslist": "^4.21.10", + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.28.1", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.1", - "es-module-lexer": "^1.2.1", + "enhanced-resolve": "^5.19.0", + "es-module-lexer": "^2.0.0", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", + "loader-runner": "^4.3.1", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.3.16", + "watchpack": "^2.5.1", + "webpack-sources": "^3.3.3" }, "bin": { "webpack": "bin/webpack.js" @@ -14888,31 +15668,6 @@ } } }, - "node_modules/webpack/node_modules/ajv": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", - "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, "node_modules/webpack/node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -14941,28 +15696,17 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, - "node_modules/webpack/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/webpack/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "node_modules/webpack/node_modules/watchpack": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", + "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" }, "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "node": ">=10.13.0" } }, "node_modules/websocket-driver": { @@ -15239,9 +15983,9 @@ } }, "node_modules/zone.js": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.14.10.tgz", - "integrity": "sha512-YGAhaO7J5ywOXW6InXNlLmfU194F8lVgu7bRntUF3TiG8Y3nBK0x1UJJuHUP/e8IyihkjCYqhCScpSwnlaSRkQ==" + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.15.1.tgz", + "integrity": "sha512-XE96n56IQpJM7NAoXswY3XRLcWFW83xe0BiAOeMD7K5k5xecOeul3Qcpx6GqEeeHNkW5DWL5zOyTbEfB4eti8w==" } } } diff --git a/package.json b/package.json index 87378d0..11031f7 100644 --- a/package.json +++ b/package.json @@ -21,18 +21,18 @@ }, "private": true, "dependencies": { - "@angular/animations": "^18.2.14", - "@angular/cdk": "^18.2.14", - "@angular/common": "^18.2.14", - "@angular/compiler": "^18.2.14", - "@angular/core": "^18.2.14", - "@angular/forms": "^18.2.14", + "@angular/animations": "^19.2.21", + "@angular/cdk": "^19.2.19", + "@angular/common": "^19.2.21", + "@angular/compiler": "^19.2.21", + "@angular/core": "^19.2.21", + "@angular/forms": "^19.2.21", "@angular/google-maps": "^17.3.8", - "@angular/localize": "^18.2.14", - "@angular/material": "^18.2.14", - "@angular/platform-browser": "^18.2.14", - "@angular/platform-browser-dynamic": "^18.2.14", - "@angular/router": "^18.2.14", + "@angular/localize": "^19.2.21", + "@angular/material": "^19.2.19", + "@angular/platform-browser": "^19.2.21", + "@angular/platform-browser-dynamic": "^19.2.21", + "@angular/router": "^19.2.21", "bootstrap": "^5.3.7", "chart.js": "^4.4.2", "chartist": "^1.3.0", @@ -41,17 +41,17 @@ "ngx-skeleton-loader": "^9.0.0", "rxjs": "~7.8.0", "tslib": "^2.3.0", - "zone.js": "^0.14.10" + "zone.js": "^0.15.1" }, "devDependencies": { - "@angular-devkit/build-angular": "^18.2.21", - "@angular-eslint/builder": "18.4.3", - "@angular-eslint/eslint-plugin": "18.4.3", - "@angular-eslint/eslint-plugin-template": "18.4.3", - "@angular-eslint/schematics": "18.4.3", - "@angular-eslint/template-parser": "18.4.3", - "@angular/cli": "^18.2.21", - "@angular/compiler-cli": "^18.2.14", + "@angular-devkit/build-angular": "^19.2.24", + "@angular-eslint/builder": "19.8.1", + "@angular-eslint/eslint-plugin": "19.8.1", + "@angular-eslint/eslint-plugin-template": "19.8.1", + "@angular-eslint/schematics": "19.8.1", + "@angular-eslint/template-parser": "19.8.1", + "@angular/cli": "^19.2.24", + "@angular/compiler-cli": "^19.2.21", "@types/jasmine": "~5.1.0", "@typescript-eslint/eslint-plugin": "7.2.0", "@typescript-eslint/parser": "7.2.0", diff --git a/src/app/app.component.ts b/src/app/app.component.ts index c38a264..5fa548f 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -3,7 +3,7 @@ import { MAT_DATE_LOCALE, MAT_DATE_FORMATS, provideNativeDateAdapter } from '@an import { Title } from '@angular/platform-browser'; import { FullComponent } from '@components/shared/layout'; -import { UserService } from "@services"; +import { UserService } from '@services'; export const MY_FORMATS = { parse: { @@ -19,23 +19,23 @@ export const MY_FORMATS = { @Component({ selector: 'app-root', - standalone: true, - imports: [ - FullComponent - ], + imports: [FullComponent], providers: [ { provide: MAT_DATE_LOCALE, useValue: 'fr-FR' }, { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS }, - provideNativeDateAdapter(MY_FORMATS) + provideNativeDateAdapter(MY_FORMATS), ], templateUrl: './app.component.html', - styleUrl: './app.component.scss' + styleUrl: './app.component.scss', }) export class AppComponent implements OnInit, AfterContentInit { public title = 'Ad Astra'; public appClass = 'grayscale'; - constructor(private userService: UserService, private titleService: Title) { } + constructor( + private userService: UserService, + private titleService: Title, + ) {} ngOnInit() { this.userService.populate(); @@ -45,4 +45,4 @@ export class AppComponent implements OnInit, AfterContentInit { ngAfterContentInit() { this.appClass = 'colored'; } -} \ No newline at end of file +} diff --git a/src/app/components/aeronefs/aeronefs.component.ts b/src/app/components/aeronefs/aeronefs.component.ts index 1367d73..e678ac8 100644 --- a/src/app/components/aeronefs/aeronefs.component.ts +++ b/src/app/components/aeronefs/aeronefs.component.ts @@ -1,7 +1,7 @@ import { DatePipe } from '@angular/common'; import { trigger, state, style, animate, transition } from '@angular/animations'; import { Component, DestroyRef, inject, OnInit, OnDestroy } from '@angular/core'; -import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { ActivatedRoute } from '@angular/router'; import { MatBadgeModule } from '@angular/material/badge'; import { MatButtonModule } from '@angular/material/button'; @@ -22,28 +22,29 @@ import { AeronefByImat, AeronefByYear } from '@models'; @Component({ selector: 'app-aeronefs', - standalone: true, imports: [ DatePipe, - MatBadgeModule, MatButtonModule, MatCardModule, MatDividerModule, - MatExpansionModule, MatGridListModule, MatIconModule, MatMenuModule, - BarsChartComponent, HistoryTableComponent, PieChartComponent + MatBadgeModule, + MatButtonModule, + MatCardModule, + MatDividerModule, + MatExpansionModule, + MatGridListModule, + MatIconModule, + MatMenuModule, + BarsChartComponent, + HistoryTableComponent, + PieChartComponent, ], templateUrl: './aeronefs.component.html', styleUrl: './aeronefs.component.scss', animations: [ trigger('flyInOut', [ state('in', style({ transform: 'translateX(0)' })), - transition('void => *', [ - style({ transform: 'translateX(-100%)' }), - animate(200) - ]), - transition('* => void', [ - style({ transform: 'translateX(100%)' }), - animate(200) - ]) - ]) - ] + transition('void => *', [style({ transform: 'translateX(-100%)' }), animate(200)]), + transition('* => void', [style({ transform: 'translateX(100%)' }), animate(200)]), + ]), + ], }) export class AeronefsComponent implements OnInit, OnDestroy { private _data: Subscription = new Subscription(); @@ -59,27 +60,31 @@ export class AeronefsComponent implements OnInit, OnDestroy { public seriesValue: number[] = []; public seriesRow: Array> = []; public seriesColor: { - backgroundColor: string[], - borderColor: string[] + backgroundColor: string[]; + borderColor: string[]; } = { backgroundColor: this._utilitiesService.getSeriesColors(0.8, 'all'), - borderColor: this._utilitiesService.getSeriesColors(1, 'all') + borderColor: this._utilitiesService.getSeriesColors(1, 'all'), }; public seriesColorClass: string[] = this._utilitiesService.getChartColors(); constructor( private route: ActivatedRoute, private _utilitiesService: UtilitiesService, - public menuItems: MenuItems - ) { } + public menuItems: MenuItems, + ) {} ngOnInit() { - const data$: Observable<{ aeronefsPageData: AeronefsPageData }> = this.route.data as Observable<{ aeronefsPageData: AeronefsPageData }>; - this._data = data$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((data: { aeronefsPageData: AeronefsPageData }) => { - const pageData: AeronefsPageData = data.aeronefsPageData; - this.lastJump = pageData.lastjump; - this._loadAeronefByImat(pageData); - }); + const data$: Observable<{ aeronefsPageData: AeronefsPageData }> = this.route.data as Observable<{ + aeronefsPageData: AeronefsPageData; + }>; + this._data = data$ + .pipe(takeUntilDestroyed(this.destroyRef)) + .subscribe((data: { aeronefsPageData: AeronefsPageData }) => { + const pageData: AeronefsPageData = data.aeronefsPageData; + this.lastJump = pageData.lastjump; + this._loadAeronefByImat(pageData); + }); } ngOnDestroy() { diff --git a/src/app/components/auth/auth.component.ts b/src/app/components/auth/auth.component.ts index 586e7a4..c72a880 100644 --- a/src/app/components/auth/auth.component.ts +++ b/src/app/components/auth/auth.component.ts @@ -1,6 +1,15 @@ import { Component, DestroyRef, inject, OnInit, OnDestroy } from '@angular/core'; -import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; -import { UntypedFormBuilder, UntypedFormGroup, AbstractControl, Validators, ValidatorFn, ValidationErrors, FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; +import { + UntypedFormBuilder, + UntypedFormGroup, + AbstractControl, + Validators, + ValidatorFn, + ValidationErrors, + FormsModule, + ReactiveFormsModule, +} from '@angular/forms'; import { Title } from '@angular/platform-browser'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { MatButtonModule } from '@angular/material/button'; @@ -15,7 +24,6 @@ import { UserService } from '@services'; import { ListErrorsComponent, ShowAuthedDirective } from '@components/shared'; @Component({ - standalone: true, imports: [ RouterLink, FormsModule, @@ -24,11 +32,11 @@ import { ListErrorsComponent, ShowAuthedDirective } from '@components/shared'; MatInputModule, MatButtonModule, ListErrorsComponent, - ShowAuthedDirective + ShowAuthedDirective, ], selector: 'app-auth', templateUrl: './auth.component.html', - styleUrl: './auth.component.scss' + styleUrl: './auth.component.scss', }) export class AuthComponent implements OnInit, OnDestroy { private _url: Subscription = new Subscription(); @@ -46,7 +54,7 @@ export class AuthComponent implements OnInit, OnDestroy { private router: Router, private titleService: Title, private userService: UserService, - private fb: UntypedFormBuilder + private fb: UntypedFormBuilder, ) { this._resetErrors(); // use FormBuilder to create a form group @@ -59,7 +67,7 @@ export class AuthComponent implements OnInit, OnDestroy { licence: '', poids: '', password: ['', Validators.required], - confirmPassword: '' + confirmPassword: '', }; this.authForm = this.fb.group(controlsConfig, { validators: this.checkPasswords }); } @@ -68,8 +76,7 @@ export class AuthComponent implements OnInit, OnDestroy { // you would normally unsubscribe from this observable subscription // the active route observables are exemptions from unsubribe always rule // see notes on: https://angular.io/guide/router#observable-parammap-and-component-reuse - this.route.url.pipe(take(1)) - .subscribe(data => { + this.route.url.pipe(take(1)).subscribe((data) => { // Get the last piece of the URL (it's either 'login' or 'register') this.authType = data[data.length - 1].path; // Set a title for the page accordingly @@ -104,14 +111,16 @@ export class AuthComponent implements OnInit, OnDestroy { if (this.authForm.valid) { this._resetErrors(); const credentials = this.authForm.value; - const user$ = this.userService.attemptAuth(this.authType, credentials).pipe(takeUntilDestroyed(this.destroyRef)); + const user$ = this.userService + .attemptAuth(this.authType, credentials) + .pipe(takeUntilDestroyed(this.destroyRef)); this._user = user$.subscribe({ next: () => void this.router.navigateByUrl('/'), error: (err) => { console.log(err); this.errors = err; this.isSubmitting = false; - } + }, }); } } @@ -157,12 +166,11 @@ export class AuthComponent implements OnInit, OnDestroy { return null; } const pass = group.get('password')!.value; - const confirmPass = group.get('confirmPassword')!.value - return (pass === confirmPass && pass !== '') ? null : { notSame: true } - } + const confirmPass = group.get('confirmPassword')!.value; + return pass === confirmPass && pass !== '' ? null : { notSame: true }; + }; private _resetErrors(): void { this.errors = { errors: {} }; } - } diff --git a/src/app/components/calculator/calculator.component.ts b/src/app/components/calculator/calculator.component.ts index 95efc2f..8dffc41 100644 --- a/src/app/components/calculator/calculator.component.ts +++ b/src/app/components/calculator/calculator.component.ts @@ -18,34 +18,49 @@ import { BaseChartDirective } from 'ng2-charts'; import { Observable, Subscription } from 'rxjs'; import { MenuItems } from '@components/shared'; -import { CalculatorInfo, CalculatorResult, CalculatorState, InputParams, Jump, LineConfig, WeightSizeRange, TableHeader, User, WeightSize, weightSizes } from '@models'; +import { + CalculatorInfo, + CalculatorResult, + CalculatorState, + InputParams, + Jump, + LineConfig, + WeightSizeRange, + TableHeader, + User, + WeightSize, + weightSizes, +} from '@models'; import { CalculatorService, JumpsService, UserService, UtilitiesService } from '@services'; @Component({ selector: 'app-calculator', - standalone: true, imports: [ - CommonModule, FormsModule, RouterModule, - MatButtonModule, MatCardModule, MatDividerModule, - MatFormFieldModule, MatInputModule, MatIconModule, MatMenuModule, - MatPaginatorModule, MatProgressBarModule, MatSortModule, MatTableModule, - BaseChartDirective + CommonModule, + FormsModule, + RouterModule, + MatButtonModule, + MatCardModule, + MatDividerModule, + MatFormFieldModule, + MatInputModule, + MatIconModule, + MatMenuModule, + MatPaginatorModule, + MatProgressBarModule, + MatSortModule, + MatTableModule, + BaseChartDirective, ], templateUrl: './calculator.component.html', styleUrl: './calculator.component.scss', animations: [ trigger('flyInOut', [ state('in', style({ transform: 'translateY(0)' })), - transition('void => *', [ - style({ transform: 'translateY(-100%)' }), - animate(200) - ]), - transition('* => void', [ - style({ transform: 'translateY(100%)' }), - animate(200) - ]) - ]) - ] + transition('void => *', [style({ transform: 'translateY(-100%)' }), animate(200)]), + transition('* => void', [style({ transform: 'translateY(100%)' }), animate(200)]), + ]), + ], }) export class CalculatorComponent implements OnInit, OnDestroy { //private _lastjump!: Subscription; // = new Subscription(); @@ -57,7 +72,7 @@ export class CalculatorComponent implements OnInit, OnDestroy { public currentRange: WeightSizeRange = {} as WeightSizeRange; public currentUser: User = {} as User; public displayedColumns: Array = ['weight']; - public tableHeader: Array = [{name: 'Poids nu en kg', active: ''}]; + public tableHeader: Array = [{ name: 'Poids nu en kg', active: '' }]; public sizesHeader: Array = []; public sizesValuesFeet: Array = []; public sizesMinValuesFeet: Array = []; @@ -71,41 +86,39 @@ export class CalculatorComponent implements OnInit, OnDestroy { charges: { current: 0, min: 0, min11: 0 }, sizesFeet: { current: 0, min: 0, min11: 0 }, sizesMeter: { current: 0, min: 0, min11: 0 }, - state: { color: 'danger' } - } + state: { color: 'danger' }, + }; @Input() canopy_size_table!: MatTableDataSource; - @Input() inputs: InputParams = { + @Input() inputs: InputParams = ({ jumps: 0, weight: 60, gear: 10, - current: 190 - } as InputParams; + current: 190, + }) as InputParams; @ViewChild(MatSort) sort!: MatSort; @ViewChild(MatPaginator) paginator!: MatPaginator; - + constructor( private _calculatorService: CalculatorService, private _jumpsService: JumpsService, private _userService: UserService, private _utilitiesService: UtilitiesService, - public menuItems: MenuItems - ) { } + public menuItems: MenuItems, + ) {} ngOnInit() { const currentUser$: Observable = this._userService.currentUser; const lastjump$: Observable = this._jumpsService.getLastJump(); weightSizes[0].ranges.forEach((range: WeightSizeRange) => { - const header: TableHeader = {name: range.label, active: range.active}; - this.tableHeader.push(header) + const header: TableHeader = { name: range.label, active: range.active }; + this.tableHeader.push(header); this.sizesHeader.push(header); this.displayedColumns.push(range.name); }); - this.chartConfig.lineChartData.labels = [...this.sizesHeader.map( - (data: TableHeader): string => data.name - )]; + this.chartConfig.lineChartData.labels = [...this.sizesHeader.map((data: TableHeader): string => data.name)]; this.chartConfig.lineChartData.datasets = [ { label: 'Tailles min -11%', @@ -114,7 +127,7 @@ export class CalculatorComponent implements OnInit, OnDestroy { stepped: true, pointStyle: false, borderColor: 'rgba(241, 80, 80, 1)', - backgroundColor: 'rgba(241, 80, 80, 0.3)' + backgroundColor: 'rgba(241, 80, 80, 0.3)', }, { label: 'Tailles min', @@ -123,8 +136,8 @@ export class CalculatorComponent implements OnInit, OnDestroy { stepped: true, pointStyle: false, borderColor: 'rgba(32, 182, 252, 1)', - backgroundColor: 'rgba(32, 182, 252, 0.3)' - } + backgroundColor: 'rgba(32, 182, 252, 0.3)', + }, ]; this._subscriptions.push( currentUser$.subscribe((userData: User) => { @@ -137,9 +150,9 @@ export class CalculatorComponent implements OnInit, OnDestroy { this.inputs.current = jump.taille!; this.canopy_size_table = new MatTableDataSource(weightSizes); this.refresh(); - }) + }), ); - }) + }), ); } @@ -149,7 +162,7 @@ export class CalculatorComponent implements OnInit, OnDestroy { }); } - public refresh():void { + public refresh(): void { this._refreshActive(); this._refreshSizes(); } @@ -159,25 +172,25 @@ export class CalculatorComponent implements OnInit, OnDestroy { if (this.inputs.weight < 60) { weight = 60; } - weightSizes.forEach(element => { + weightSizes.forEach((element) => { element.active = ''; - element.ranges.forEach(range => { + element.ranges.forEach((range) => { range.active = ''; }); }); - this.tableHeader.forEach(element => { + this.tableHeader.forEach((element) => { element.active = ''; }); if (weight >= 60 && weight <= 110) { - weightSizes[(weight - 60)].active = 'active'; + weightSizes[weight - 60].active = 'active'; } if (this.inputs.jumps >= 0) { const num = this._calculatorService.getRangeNum(this.inputs.jumps); this.tableHeader[num].active = 'active'; - weightSizes.forEach(element => { - element.ranges[(num-1)].active = 'active'; + weightSizes.forEach((element) => { + element.ranges[num - 1].active = 'active'; }); - this.currentRange = weightSizes[0].ranges[(num-1)]; + this.currentRange = weightSizes[0].ranges[num - 1]; } } @@ -200,13 +213,13 @@ export class CalculatorComponent implements OnInit, OnDestroy { this.info.sizesMeter = { current: this._calculatorService.convertFeet2Meters(this.inputs.current), min: this._calculatorService.convertFeet2Meters(this.info.sizesFeet.min), - min11: this._calculatorService.convertFeet2Meters(this.info.sizesFeet.min11) - } + min11: this._calculatorService.convertFeet2Meters(this.info.sizesFeet.min11), + }; this.info.charges = { current: this._calculatorService.getCharge(this.inputs.current, this.inputs.weight, this.inputs.gear), min: this._calculatorService.getCharge(this.info.sizesFeet.min, this.inputs.weight, this.inputs.gear), - min11: this._calculatorService.getCharge(this.info.sizesFeet.min11, this.inputs.weight, this.inputs.gear) - } + min11: this._calculatorService.getCharge(this.info.sizesFeet.min11, this.inputs.weight, this.inputs.gear), + }; this.info.state.color = this._calculatorService.getStateColor(this.info.sizesFeet); this.chartConfig.lineChartData.datasets[0].data = this.sizesMinValuesFeet; @@ -218,5 +231,4 @@ export class CalculatorComponent implements OnInit, OnDestroy { this.inputs.weight = weight; this.refresh(); } - } diff --git a/src/app/components/canopies/canopies.component.ts b/src/app/components/canopies/canopies.component.ts index bfbeebc..1c2dfb0 100644 --- a/src/app/components/canopies/canopies.component.ts +++ b/src/app/components/canopies/canopies.component.ts @@ -1,7 +1,7 @@ import { DatePipe } from '@angular/common'; import { trigger, state, style, animate, transition } from '@angular/animations'; import { Component, DestroyRef, inject, OnInit, OnDestroy } from '@angular/core'; -import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { ActivatedRoute } from '@angular/router'; import { MatButtonModule } from '@angular/material/button'; import { MatCardModule } from '@angular/material/card'; @@ -21,28 +21,28 @@ import { CanopyBySize, CanopyByYear, CanopyModelBySize, CanopyModelByYear } from @Component({ selector: 'app-canopies', - standalone: true, imports: [ DatePipe, - MatButtonModule, MatCardModule, MatDividerModule, MatExpansionModule, - MatGridListModule, MatIconModule, MatMenuModule, - HistoryTableComponent, BarsChartComponent, PieChartComponent + MatButtonModule, + MatCardModule, + MatDividerModule, + MatExpansionModule, + MatGridListModule, + MatIconModule, + MatMenuModule, + HistoryTableComponent, + BarsChartComponent, + PieChartComponent, ], templateUrl: './canopies.component.html', styleUrl: './canopies.component.scss', animations: [ trigger('flyInOut', [ state('in', style({ transform: 'translateX(0)' })), - transition('void => *', [ - style({ transform: 'translateX(-100%)' }), - animate(200) - ]), - transition('* => void', [ - style({ transform: 'translateX(100%)' }), - animate(200) - ]) - ]) - ] + transition('void => *', [style({ transform: 'translateX(-100%)' }), animate(200)]), + transition('* => void', [style({ transform: 'translateX(100%)' }), animate(200)]), + ]), + ], }) export class CanopiesComponent implements OnInit, OnDestroy { private _data: Subscription = new Subscription(); @@ -64,28 +64,32 @@ export class CanopiesComponent implements OnInit, OnDestroy { public seriesSizeValue: number[] = []; public seriesSizeRow: Array> = []; public seriesColor: { - backgroundColor: string[], - borderColor: string[] + backgroundColor: string[]; + borderColor: string[]; } = { backgroundColor: this._utilitiesService.getSeriesColors(0.8, 'all'), - borderColor: this._utilitiesService.getSeriesColors(1, 'all') + borderColor: this._utilitiesService.getSeriesColors(1, 'all'), }; public seriesColorClass: string[] = this._utilitiesService.getChartColors(); constructor( private route: ActivatedRoute, private _utilitiesService: UtilitiesService, - public menuItems: MenuItems - ) { } + public menuItems: MenuItems, + ) {} ngOnInit() { - const data$: Observable<{ canopiesPageData: CanopiesPageData }> = this.route.data as Observable<{ canopiesPageData: CanopiesPageData }>; - this._data = data$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((data: { canopiesPageData: CanopiesPageData }) => { - const pageData: CanopiesPageData = data.canopiesPageData; - this.lastJump = pageData.lastjump; - this._loadCanopyBySize(pageData); - this._loadCanopyModelBySize(pageData); - }); + const data$: Observable<{ canopiesPageData: CanopiesPageData }> = this.route.data as Observable<{ + canopiesPageData: CanopiesPageData; + }>; + this._data = data$ + .pipe(takeUntilDestroyed(this.destroyRef)) + .subscribe((data: { canopiesPageData: CanopiesPageData }) => { + const pageData: CanopiesPageData = data.canopiesPageData; + this.lastJump = pageData.lastjump; + this._loadCanopyBySize(pageData); + this._loadCanopyModelBySize(pageData); + }); } ngOnDestroy() { @@ -134,7 +138,9 @@ export class CanopiesComponent implements OnInit, OnDestroy { const voile: string = row.voile; const taille: string = row.taille.toString(); const year: string = row.year.toString(); - this.seriesModelRow[this.seriesModelName.indexOf(`${taille} - ${voile}`)][this.seriesModelHeader.indexOf(year)] = row.count; + this.seriesModelRow[this.seriesModelName.indexOf(`${taille} - ${voile}`)][ + this.seriesModelHeader.indexOf(year) + ] = row.count; return row; }); this.displayCharts = true; diff --git a/src/app/components/dashboard/dashboard.component.ts b/src/app/components/dashboard/dashboard.component.ts index 328f56d..2f18d83 100644 --- a/src/app/components/dashboard/dashboard.component.ts +++ b/src/app/components/dashboard/dashboard.component.ts @@ -7,29 +7,46 @@ import { ActivatedRoute, Data, Router } from '@angular/router'; import { Observable, Subscription } from 'rxjs'; import { take } from 'rxjs/operators'; -import { Aeronef, AeronefByImat, Canopy, CanopyModelBySize, DropZone, DropZoneByYear, Errors, Jump, User } from '@models'; +import { + Aeronef, + AeronefByImat, + Canopy, + CanopyModelBySize, + DropZone, + DropZoneByYear, + Errors, + Jump, + User, +} from '@models'; //import { AeronefsService, CanopiesService, DropZonesService, UserService } from '@services'; import { JumpsService, UserService } from '@services'; import { ShowAuthedDirective } from '@components/shared/show-authed.directive'; import { - AeronefsPieComponent, AeronefsBarComponent, - CanopiesModelsComponent, CanopiesSizesComponent, - DropzonesPieComponent, DropzonesBarComponent, - JumpsByMonthComponent + AeronefsPieComponent, + AeronefsBarComponent, + CanopiesModelsComponent, + CanopiesSizesComponent, + DropzonesPieComponent, + DropzonesBarComponent, + JumpsByMonthComponent, } from '@components/shared/dashboard-components'; @Component({ - standalone: true, imports: [ - DatePipe, ShowAuthedDirective, MatDividerModule, - AeronefsPieComponent, AeronefsBarComponent, - CanopiesModelsComponent, CanopiesSizesComponent, - DropzonesPieComponent, DropzonesBarComponent, - JumpsByMonthComponent + DatePipe, + ShowAuthedDirective, + MatDividerModule, + AeronefsPieComponent, + AeronefsBarComponent, + CanopiesModelsComponent, + CanopiesSizesComponent, + DropzonesPieComponent, + DropzonesBarComponent, + JumpsByMonthComponent, ], selector: 'app-dashboard', templateUrl: './dashboard.component.html', - styleUrl: './dashboard.component.scss' + styleUrl: './dashboard.component.scss', }) export class DashboardComponent implements OnInit, OnDestroy { private _currentUser: Subscription = new Subscription(); @@ -61,7 +78,7 @@ export class DashboardComponent implements OnInit, OnDestroy { private router: Router, private titleService: Title, private _userService: UserService, - private _jumpsService: JumpsService + private _jumpsService: JumpsService, /* private aeronefsService: AeronefsService, private canopiesService: CanopiesService, @@ -95,7 +112,6 @@ export class DashboardComponent implements OnInit, OnDestroy { this._loadCanopies(); this._loadDropzones(); */ - } ngOnDestroy() { diff --git a/src/app/components/demo/demo.component.ts b/src/app/components/demo/demo.component.ts index 3412223..375c5ea 100644 --- a/src/app/components/demo/demo.component.ts +++ b/src/app/components/demo/demo.component.ts @@ -1,5 +1,5 @@ import { Component, OnInit, OnDestroy } from '@angular/core'; -import {CdkDragDrop, CdkDropList, CdkDrag, CdkDragPlaceholder, moveItemInArray} from '@angular/cdk/drag-drop'; +import { CdkDragDrop, CdkDropList, CdkDrag, CdkDragPlaceholder, moveItemInArray } from '@angular/cdk/drag-drop'; import { Title } from '@angular/platform-browser'; import { RouterLink } from '@angular/router'; import { MatButtonModule } from '@angular/material/button'; @@ -17,30 +17,85 @@ import { ListErrorsComponent } from '@components/shared'; @Component({ selector: 'app-demo', - standalone: true, imports: [ - CdkDropList, CdkDrag, CdkDragPlaceholder, RouterLink, - MatButtonModule, MatCardModule, MatDividerModule, - MatIconModule, MatProgressBarModule, MatSliderModule, - ListErrorsComponent + CdkDropList, + CdkDrag, + CdkDragPlaceholder, + RouterLink, + MatButtonModule, + MatCardModule, + MatDividerModule, + MatIconModule, + MatProgressBarModule, + MatSliderModule, + ListErrorsComponent, ], templateUrl: './demo.component.html', - styleUrl: './demo.component.scss' + styleUrl: './demo.component.scss', }) export class DemoComponent implements OnInit, OnDestroy { private _user: Subscription = new Subscription(); private _colors: string[] = [ - "primary", "accent", "warn", "secondary", "megna", "raspberry", "success", "info", - "warning", "danger", "red", "orange", "yellow", "green", "teal", "turquoise", "cyan", - "blue", "navy", "navy-light", "pink", "magenta", "purple", "purple-light", "grey", "muted" + 'primary', + 'accent', + 'warn', + 'secondary', + 'megna', + 'raspberry', + 'success', + 'info', + 'warning', + 'danger', + 'red', + 'orange', + 'yellow', + 'green', + 'teal', + 'turquoise', + 'cyan', + 'blue', + 'navy', + 'navy-light', + 'pink', + 'magenta', + 'purple', + 'purple-light', + 'grey', + 'muted', ]; private _icons: string[] = [ - 'mode_edit', 'delete', 'bookmark', 'settings', 'home', 'person', - 'share', 'account_circle', 'public', 'search', 'favorite', 'done', - 'numbers', 'attach_file', 'insert_comment', 'format_list_bulleted', - 'filter', 'crop', 'edit_attributes', 'upload', 'download', 'expand_less', - 'expand_more', 'chevron_left', 'chevron_right', 'sync', 'power', - 'power_off', 'notifications', 'emoji_emotions', 'person_add', 'block' + 'mode_edit', + 'delete', + 'bookmark', + 'settings', + 'home', + 'person', + 'share', + 'account_circle', + 'public', + 'search', + 'favorite', + 'done', + 'numbers', + 'attach_file', + 'insert_comment', + 'format_list_bulleted', + 'filter', + 'crop', + 'edit_attributes', + 'upload', + 'download', + 'expand_less', + 'expand_more', + 'chevron_left', + 'chevron_right', + 'sync', + 'power', + 'power_off', + 'notifications', + 'emoji_emotions', + 'person_add', + 'block', ]; title = 'Demo'; @@ -51,8 +106,8 @@ export class DemoComponent implements OnInit, OnDestroy { constructor( private titleService: Title, - private userService: UserService - ) { } + private userService: UserService, + ) {} ngOnInit() { this.titleService.setTitle(`Ad Astra - ${this.title}`); @@ -79,5 +134,4 @@ export class DemoComponent implements OnInit, OnDestroy { drop(event: CdkDragDrop) { moveItemInArray(this._colors, event.previousIndex, event.currentIndex); } - } diff --git a/src/app/components/dropzones/dropzones.component.ts b/src/app/components/dropzones/dropzones.component.ts index 560c921..4d17de7 100644 --- a/src/app/components/dropzones/dropzones.component.ts +++ b/src/app/components/dropzones/dropzones.component.ts @@ -1,8 +1,8 @@ import { DatePipe } from '@angular/common'; import { trigger, state, style, animate, transition } from '@angular/animations'; import { Component, DestroyRef, inject, OnInit, OnDestroy } from '@angular/core'; -import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; -import { GoogleMap, MapKmlLayer} from '@angular/google-maps'; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; +import { GoogleMap, MapKmlLayer } from '@angular/google-maps'; import { ActivatedRoute } from '@angular/router'; import { MatButtonModule } from '@angular/material/button'; import { MatCardModule } from '@angular/material/card'; @@ -23,29 +23,31 @@ import { UtilitiesService } from '@services'; @Component({ selector: 'app-dropzones', - standalone: true, imports: [ - DatePipe, GoogleMap, MapKmlLayer, - MatButtonModule, MatCardModule, MatDividerModule, MatExpansionModule, - MatGridListModule, MatIconModule, MatMenuModule, + DatePipe, + GoogleMap, + MapKmlLayer, + MatButtonModule, + MatCardModule, + MatDividerModule, + MatExpansionModule, + MatGridListModule, + MatIconModule, + MatMenuModule, //ChartistModule, - HistoryTableComponent, BarsChartComponent, PieChartComponent + HistoryTableComponent, + BarsChartComponent, + PieChartComponent, ], templateUrl: './dropzones.component.html', styleUrl: './dropzones.component.scss', animations: [ trigger('flyInOut', [ state('in', style({ transform: 'translateX(0)' })), - transition('void => *', [ - style({ transform: 'translateX(-100%)' }), - animate(200) - ]), - transition('* => void', [ - style({ transform: 'translateX(100%)' }), - animate(200) - ]) - ]) - ] + transition('void => *', [style({ transform: 'translateX(-100%)' }), animate(200)]), + transition('* => void', [style({ transform: 'translateX(100%)' }), animate(200)]), + ]), + ], }) export class DropzonesComponent implements OnInit, OnDestroy { private _data: Subscription = new Subscription(); @@ -62,16 +64,16 @@ export class DropzonesComponent implements OnInit, OnDestroy { public seriesValue: number[] = []; public seriesRow: Array> = []; public seriesColor: { - backgroundColor: string[], - borderColor: string[] + backgroundColor: string[]; + borderColor: string[]; } = { backgroundColor: this._utilitiesService.getSeriesColors(0.8, 'all'), - borderColor: this._utilitiesService.getSeriesColors(1, 'all') + borderColor: this._utilitiesService.getSeriesColors(1, 'all'), }; public seriesColorClass: string[] = this._utilitiesService.getChartColors(); //public chartBarConfig: Configuration = this._utilitiesService.getBarConfig(); - public center: google.maps.LatLngLiteral = {lat: 44.596408, lng: -1.115958}; + public center: google.maps.LatLngLiteral = { lat: 44.596408, lng: -1.115958 }; public zoom = 16; public kmlUrl = 'https://rampeur.com/assets/kmls/dropzones.kml?v=6'; //public mapTypeId: google.maps.MapTypeId = google.maps.MapTypeId.SATELLITE; @@ -82,7 +84,7 @@ export class DropzonesComponent implements OnInit, OnDestroy { mapTypeId: 'satellite', disableDoubleClickZoom: true, maxZoom: 20, - minZoom: 3 + minZoom: 3, }; // Arcachon : 44.596408,-1.115958 // La Réole : 44.566309,-0.054606 @@ -98,16 +100,20 @@ export class DropzonesComponent implements OnInit, OnDestroy { constructor( private route: ActivatedRoute, private _utilitiesService: UtilitiesService, - public menuItems: MenuItems - ) { } + public menuItems: MenuItems, + ) {} ngOnInit() { - const data$: Observable<{ dropZonesPageData: DropZonesPageData }> = this.route.data as Observable<{ dropZonesPageData: DropZonesPageData }>; - this._data = data$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((data: { dropZonesPageData: DropZonesPageData }) => { - const pageData: DropZonesPageData = data.dropZonesPageData; - this.lastJump = pageData.lastjump; - this._loadDropZoneByOaci(pageData); - }); + const data$: Observable<{ dropZonesPageData: DropZonesPageData }> = this.route.data as Observable<{ + dropZonesPageData: DropZonesPageData; + }>; + this._data = data$ + .pipe(takeUntilDestroyed(this.destroyRef)) + .subscribe((data: { dropZonesPageData: DropZonesPageData }) => { + const pageData: DropZonesPageData = data.dropZonesPageData; + this.lastJump = pageData.lastjump; + this._loadDropZoneByOaci(pageData); + }); } ngOnDestroy() { diff --git a/src/app/components/herowars-guildraid/herowars-guildraid.component.ts b/src/app/components/herowars-guildraid/herowars-guildraid.component.ts index 7727dfc..d5aac20 100644 --- a/src/app/components/herowars-guildraid/herowars-guildraid.component.ts +++ b/src/app/components/herowars-guildraid/herowars-guildraid.component.ts @@ -23,7 +23,6 @@ export class GuildRaidStepperIntl extends MatStepperIntl { } @Component({ selector: 'app-herowars-guildraid', - standalone: true, providers: [ { provide: STEPPER_GLOBAL_OPTIONS, diff --git a/src/app/components/herowars-guildwar/herowars-guildwar.component.ts b/src/app/components/herowars-guildwar/herowars-guildwar.component.ts index 313be5b..c13014b 100644 --- a/src/app/components/herowars-guildwar/herowars-guildwar.component.ts +++ b/src/app/components/herowars-guildwar/herowars-guildwar.component.ts @@ -11,7 +11,12 @@ import { MatIconModule } from '@angular/material/icon'; import { MatInputModule } from '@angular/material/input'; import { MatTabsModule } from '@angular/material/tabs'; -import { CardContainerComponent, ListErrorsComponent, GuildwarAttackComponent, GuildwarDefenceComponent } from '@components/shared'; +import { + CardContainerComponent, + ListErrorsComponent, + GuildwarAttackComponent, + GuildwarDefenceComponent, +} from '@components/shared'; import { CardColors, Errors, HWActivityStat, HWGuildClan, HWMember } from '@models'; import { ClanViewModel, MembersViewModel } from '@viewmodels/herowars'; import { HWClanService, HWMemberService, UtilitiesService } from '@services'; @@ -22,28 +27,31 @@ import guildStatistics from '@data/hw-guild-statistics.json'; // page Overview - @Component({ selector: 'app-herowars-guildwar', - standalone: true, imports: [ - DatePipe, DecimalPipe, FormsModule, CardContainerComponent, ListErrorsComponent, - MatButtonModule, MatCardModule, MatDividerModule, MatFormFieldModule, - MatIconModule, MatInputModule, MatTabsModule, - GuildwarAttackComponent, GuildwarDefenceComponent + DatePipe, + DecimalPipe, + FormsModule, + CardContainerComponent, + ListErrorsComponent, + MatButtonModule, + MatCardModule, + MatDividerModule, + MatFormFieldModule, + MatIconModule, + MatInputModule, + MatTabsModule, + GuildwarAttackComponent, + GuildwarDefenceComponent, ], templateUrl: './herowars-guildwar.component.html', styleUrl: './herowars-guildwar.component.scss', animations: [ trigger('flyInOut', [ state('in', style({ transform: 'translateY(0)' })), - transition('void => *', [ - style({ transform: 'translateY(-100%)' }), - animate(200) - ]), - transition('* => void', [ - style({ transform: 'translateY(100%)' }), - animate(200) - ]) - ]) - ] + transition('void => *', [style({ transform: 'translateY(-100%)' }), animate(200)]), + transition('* => void', [style({ transform: 'translateY(100%)' }), animate(200)]), + ]), + ], }) export class HerowarsGuildwarComponent implements OnInit { public destroyRef = inject(DestroyRef); @@ -67,8 +75,8 @@ export class HerowarsGuildwarComponent implements OnInit { private _titleService: Title, private _utilitiesService: UtilitiesService, private _clanService: HWClanService, - private _memberService: HWMemberService - ) { } + private _memberService: HWMemberService, + ) {} ngOnInit() { this._titleService.setTitle(this.title); @@ -103,7 +111,7 @@ export class HerowarsGuildwarComponent implements OnInit { this._guildClan = this._clanService.loadClan(); this._guildMembers = this._memberService.loadMembers(this._guildClan); this._guildClan = this._clanService.loadClanStats(this._guildClan, this._guildMembers); - this.daysToWarn = (parseInt(this._guildClan.daysToKick) / 2); + this.daysToWarn = parseInt(this._guildClan.daysToKick) / 2; this.clanViewModel = new ClanViewModel(this._guildClan); this.clanLoaded = true; this.membersViewModel = new MembersViewModel(this._guildMembers); @@ -132,5 +140,4 @@ export class HerowarsGuildwarComponent implements OnInit { console.log(this._guildMembers); console.log(guildStatistics); } - } diff --git a/src/app/components/herowars/herowars.component.ts b/src/app/components/herowars/herowars.component.ts index 193d159..000b356 100644 --- a/src/app/components/herowars/herowars.component.ts +++ b/src/app/components/herowars/herowars.component.ts @@ -10,8 +10,13 @@ import { MatTabsModule } from '@angular/material/tabs'; import { ListErrorsComponent, - GuildCardComponent, GuildraidsLogComponent, GuildwarChampionsComponent, - GuildwarAttackComponent, GuildwarDefenceComponent, GuildwarTeamsComponent, MembersStatisticsComponent + GuildCardComponent, + GuildraidsLogComponent, + GuildwarChampionsComponent, + GuildwarAttackComponent, + GuildwarDefenceComponent, + GuildwarTeamsComponent, + MembersStatisticsComponent, } from '@components/shared'; import { Errors, HWMember } from '@models'; import guildData from 'src/files-data/hw-guild-data.json'; // page Membres @@ -21,29 +26,30 @@ import guildData from 'src/files-data/hw-guild-data.json'; // page Membres @Component({ selector: 'app-herowars', - standalone: true, imports: [ DatePipe, - MatCardModule, MatDividerModule, MatIconModule, MatTabsModule, + MatCardModule, + MatDividerModule, + MatIconModule, + MatTabsModule, ListErrorsComponent, - GuildCardComponent, GuildraidsLogComponent, GuildwarChampionsComponent, - GuildwarAttackComponent, GuildwarDefenceComponent, GuildwarTeamsComponent, MembersStatisticsComponent + GuildCardComponent, + GuildraidsLogComponent, + GuildwarChampionsComponent, + GuildwarAttackComponent, + GuildwarDefenceComponent, + GuildwarTeamsComponent, + MembersStatisticsComponent, ], templateUrl: './herowars.component.html', styleUrl: './herowars.component.scss', animations: [ trigger('flyInOut', [ state('in', style({ transform: 'translateY(0)' })), - transition('void => *', [ - style({ transform: 'translateY(-100%)' }), - animate(200) - ]), - transition('* => void', [ - style({ transform: 'translateY(100%)' }), - animate(200) - ]) - ]) - ] + transition('void => *', [style({ transform: 'translateY(-100%)' }), animate(200)]), + transition('* => void', [style({ transform: 'translateY(100%)' }), animate(200)]), + ]), + ], }) export class HerowarsComponent implements OnInit { public title = 'HeroWars GM Tools'; @@ -53,9 +59,7 @@ export class HerowarsComponent implements OnInit { public now = new Date(); private _guildMembers: HWMember[] = []; - constructor( - private _titleService: Title - ) { } + constructor(private _titleService: Title) {} ngOnInit() { try { @@ -68,8 +72,8 @@ export class HerowarsComponent implements OnInit { } else { member.champion = false; } - member.heroes = { power: 0, teams: []}; - member.titans = { power: 0, teams: []}; + member.heroes = { power: 0, teams: [] }; + member.titans = { power: 0, teams: [] }; this._guildMembers.push(member); } } catch (error) { @@ -80,5 +84,4 @@ export class HerowarsComponent implements OnInit { getMembers(): HWMember[] { return this._guildMembers; } - } diff --git a/src/app/components/home/home.component.ts b/src/app/components/home/home.component.ts index 01adc29..3714c8a 100644 --- a/src/app/components/home/home.component.ts +++ b/src/app/components/home/home.component.ts @@ -12,31 +12,20 @@ import { Errors } from '@models'; //import { UserService } from '@services'; @Component({ selector: 'app-home', - standalone: true, - imports: [ - DatePipe, - MatCardModule, MatDividerModule, MatIconModule, - ListErrorsComponent - ], + imports: [DatePipe, MatCardModule, MatDividerModule, MatIconModule, ListErrorsComponent], templateUrl: './home.component.html', styleUrl: './home.component.scss', animations: [ trigger('flyInOut', [ state('in', style({ transform: 'translateY(0)' })), - transition('void => *', [ - style({ transform: 'translateY(-100%)' }), - animate(200) - ]), - transition('* => void', [ - style({ transform: 'translateY(100%)' }), - animate(200) - ]) - ]) - ] + transition('void => *', [style({ transform: 'translateY(-100%)' }), animate(200)]), + transition('* => void', [style({ transform: 'translateY(100%)' }), animate(200)]), + ]), + ], }) export class HomeComponent implements OnInit { public title = 'Shop bientôt disponible!'; - public description = 'Encore un peu de patience, notre shop sera mis en ligne d\'ici peu.'; + public description = "Encore un peu de patience, notre shop sera mis en ligne d'ici peu."; public errors: Errors = { errors: {} }; public destroyRef = inject(DestroyRef); public now = new Date(); @@ -45,10 +34,9 @@ export class HomeComponent implements OnInit { private _titleService: Title, //private _utilitiesService: UtilitiesService //private _userService: UserService - ) { } + ) {} ngOnInit() { - this._titleService.setTitle(this.title); /* type CreateArrayWithLengthX< diff --git a/src/app/components/jump/jump.component.ts b/src/app/components/jump/jump.component.ts index 7e25177..1de4fdc 100644 --- a/src/app/components/jump/jump.component.ts +++ b/src/app/components/jump/jump.component.ts @@ -1,5 +1,5 @@ import { Component, DestroyRef, inject, OnInit, OnDestroy } from '@angular/core'; -import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { DatePipe, DecimalPipe } from '@angular/common'; import { ActivatedRoute, RouterLink } from '@angular/router'; import { MatButtonModule } from '@angular/material/button'; @@ -14,15 +14,19 @@ import { Errors, Jump, JumpPageData } from '@models'; @Component({ selector: 'app-jump', - standalone: true, imports: [ - DatePipe, DecimalPipe, RouterLink, - MatButtonModule, MatCardModule, - MatDividerModule, MatIconModule, MatMenuModule, - ListErrorsComponent + DatePipe, + DecimalPipe, + RouterLink, + MatButtonModule, + MatCardModule, + MatDividerModule, + MatIconModule, + MatMenuModule, + ListErrorsComponent, ], templateUrl: './jump.component.html', - styleUrl: './jump.component.scss' + styleUrl: './jump.component.scss', }) export class JumpComponent implements OnInit, OnDestroy { private _data: Subscription = new Subscription(); @@ -35,8 +39,8 @@ export class JumpComponent implements OnInit, OnDestroy { constructor( private route: ActivatedRoute, - public menuItems: MenuItems - ) { } + public menuItems: MenuItems, + ) {} ngOnInit() { const data$: Observable<{ pageData: JumpPageData }> = this.route.data as Observable<{ pageData: JumpPageData }>; diff --git a/src/app/components/jumps/jumps.component.ts b/src/app/components/jumps/jumps.component.ts index 9259472..889e2e8 100644 --- a/src/app/components/jumps/jumps.component.ts +++ b/src/app/components/jumps/jumps.component.ts @@ -1,6 +1,6 @@ import { trigger, state, style, animate, transition } from '@angular/animations'; import { Component, DestroyRef, inject, OnInit, OnDestroy } from '@angular/core'; -import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { ActivatedRoute } from '@angular/router'; import { CommonModule } from '@angular/common'; import { MatButtonModule } from '@angular/material/button'; @@ -13,34 +13,39 @@ import { MatMenuModule } from '@angular/material/menu'; import { Observable, Subscription } from 'rxjs'; import { MenuItems } from '@components/shared'; -import { BarsChartComponent, CircleChartComponent, LineChartComponent, LineAreaChartComponent } from '@components/shared/helpers-chart'; +import { + BarsChartComponent, + CircleChartComponent, + LineChartComponent, + LineAreaChartComponent, +} from '@components/shared/helpers-chart'; import { UtilitiesService } from '@services'; import { Jump, JumpByCategorie, JumpByDate, JumpByDateByModule, JumpByModule, JumpsPageData, JumpYears } from '@models'; @Component({ selector: 'app-jumps', - standalone: true, imports: [ CommonModule, - MatButtonModule, MatCardModule, MatDividerModule, - MatExpansionModule, MatIconModule, MatMenuModule, - BarsChartComponent, CircleChartComponent, LineChartComponent, LineAreaChartComponent + MatButtonModule, + MatCardModule, + MatDividerModule, + MatExpansionModule, + MatIconModule, + MatMenuModule, + BarsChartComponent, + CircleChartComponent, + LineChartComponent, + LineAreaChartComponent, ], templateUrl: './jumps.component.html', styleUrl: './jumps.component.scss', animations: [ trigger('flyInOut', [ state('in', style({ transform: 'translateX(0)' })), - transition('void => *', [ - style({ transform: 'translateX(-100%)' }), - animate(200) - ]), - transition('* => void', [ - style({ transform: 'translateX(100%)' }), - animate(200) - ]) - ]) - ] + transition('void => *', [style({ transform: 'translateX(-100%)' }), animate(200)]), + transition('* => void', [style({ transform: 'translateX(100%)' }), animate(200)]), + ]), + ], }) export class JumpsComponent implements OnInit, OnDestroy { private _data: Subscription = new Subscription(); @@ -61,22 +66,22 @@ export class JumpsComponent implements OnInit, OnDestroy { public seriesName: string[] = []; public seriesRow: Array> = []; public seriesColor: { - backgroundColor: string[], - borderColor: string[] + backgroundColor: string[]; + borderColor: string[]; } = { backgroundColor: this._utilitiesService.getSeriesColors(0.8, 'all'), - borderColor: this._utilitiesService.getSeriesColors(1, 'all') + borderColor: this._utilitiesService.getSeriesColors(1, 'all'), }; public seriesTypesHeader: string[] = []; public seriesTypesName: string[] = []; public seriesTypesRow: Array> = []; public seriesTypesRowCumulated: Array> = []; public seriesTypesColor: { - backgroundColor: string[], - borderColor: string[] + backgroundColor: string[]; + borderColor: string[]; } = { backgroundColor: this._utilitiesService.getSeriesColors(0.8, 'pastels'), - borderColor: this._utilitiesService.getSeriesColors(1, 'pastels') + borderColor: this._utilitiesService.getSeriesColors(1, 'pastels'), }; public seriesColorClass: string[] = this._utilitiesService.getChartColors(); public seriesRowTotal: number[] = []; @@ -89,11 +94,13 @@ export class JumpsComponent implements OnInit, OnDestroy { constructor( private route: ActivatedRoute, private _utilitiesService: UtilitiesService, - public menuItems: MenuItems - ) { } + public menuItems: MenuItems, + ) {} ngOnInit() { - const data$: Observable<{ pageData: JumpsPageData }> = this.route.data as Observable<{ pageData: JumpsPageData }>; + const data$: Observable<{ pageData: JumpsPageData }> = this.route.data as Observable<{ + pageData: JumpsPageData; + }>; this._data = data$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((data: { pageData: JumpsPageData }) => { const pageData: JumpsPageData = data.pageData; this.lastJump = pageData.lastjump; @@ -104,7 +111,7 @@ export class JumpsComponent implements OnInit, OnDestroy { const modules: Array = [...verticals, ...others]; const minoration = 2; // -2 pour ne pas compter la première année this.min = pageData.jumpsByYears[0].year; - this.max = pageData.jumpsByYears[(pageData.jumpsByYears.length-1)].year; + this.max = pageData.jumpsByYears[pageData.jumpsByYears.length - 1].year; this.seriesHeader = this._utilitiesService.getMonthsList(); const values: Array = this.seriesHeader.map(() => 0); @@ -117,13 +124,13 @@ export class JumpsComponent implements OnInit, OnDestroy { }); this._jumpsByDate = pageData.jumpsByDate.map((row: JumpByDate) => { - this.seriesRow[(row.year-this.min)][(row.month-1)] = row.count; - this.seriesColTotal[(row.month-1)] += row.count; + this.seriesRow[row.year - this.min][row.month - 1] = row.count; + this.seriesColTotal[row.month - 1] += row.count; if (row.year < currentYear) { - this.seriesColTotalClosed[(row.month-1)] += row.count; + this.seriesColTotalClosed[row.month - 1] += row.count; } - if (row.year >= (currentYear-3) && row.year < currentYear) { - this.seriesColTotalLastYears[(row.month-1)] += row.count; + if (row.year >= currentYear - 3 && row.year < currentYear) { + this.seriesColTotalLastYears[row.month - 1] += row.count; } return row; }); @@ -132,17 +139,20 @@ export class JumpsComponent implements OnInit, OnDestroy { this.seriesRowTotal.push(total); }); this.seriesColTotalClosed.forEach((row: number) => { - const value: number = (row/(this.seriesName.length-minoration)); + const value: number = row / (this.seriesName.length - minoration); this.seriesRowAvg.push(parseInt(value.toFixed(0))); }); this.seriesColTotalLastYears.forEach((row: number) => { - const value: number = (row/3); // Les 3 dernières années + const value: number = row / 3; // Les 3 dernières années this.seriesRowAvgLastYears.push(parseInt(value.toFixed(0))); }); this.grandAvg = this.seriesRowAvg.reduce((partialSum, accumulated) => partialSum + accumulated, 0); - this.grandAvgLastYears = this.seriesRowAvgLastYears.reduce((partialSum, accumulated) => partialSum + accumulated, 0); + this.grandAvgLastYears = this.seriesRowAvgLastYears.reduce( + (partialSum, accumulated) => partialSum + accumulated, + 0, + ); this.grandTotal = this.seriesColTotal.reduce((partialSum, accumulated) => partialSum + accumulated, 0); - + pageData.jumpsByCategory.forEach((row: JumpByCategorie) => { if (types.indexOf(row.categorie) !== -1) { this._jumpsByCategorie.push(row); @@ -150,8 +160,8 @@ export class JumpsComponent implements OnInit, OnDestroy { }); //const focus: Array = ['FF', 'Solo']; // ['FF'] - let verticalCount:number = 0; - let otherCount:number = 0; + let verticalCount: number = 0; + let otherCount: number = 0; pageData.jumpsByModule.forEach((row: JumpByModule) => { //if (focus.indexOf(row.categorie) !== -1 && modules.indexOf(row.module) !== -1) { if (modules.indexOf(row.module) !== -1) { @@ -163,25 +173,25 @@ export class JumpsComponent implements OnInit, OnDestroy { } }); if (verticalCount > 0) { - const row:JumpByModule = { + const row: JumpByModule = { categorie: 'FF', module: 'Vertical', - count: verticalCount - } + count: verticalCount, + }; this._jumpsByModule.push(row); } if (otherCount > 0) { - const row:JumpByModule = { + const row: JumpByModule = { categorie: 'FF', module: 'Track/Trace', - count: otherCount - } + count: otherCount, + }; this._jumpsByModule.push(row); } for (let year = 0; year < pageData.jumpsByYears.length; year++) { for (let index = 0; index < 12; index++) { - const month: string = ((index+1) < 10) ? `0${(index+1)}` : `${(index+1)}`; + const month: string = index + 1 < 10 ? `0${index + 1}` : `${index + 1}`; this.seriesTypesHeader.push(`${month}-${pageData.jumpsByYears[year].year}`); } } @@ -193,7 +203,7 @@ export class JumpsComponent implements OnInit, OnDestroy { pageData.jumpsByDateByModule.forEach((row: JumpByDateByModule) => { const indexOf: number = this.seriesTypesName.indexOf(row.categorie); if (indexOf !== -1) { - this.seriesTypesRow[indexOf][(((row.year-this.min)*12)+row.month-1)] += row.count; + this.seriesTypesRow[indexOf][(row.year - this.min) * 12 + row.month - 1] += row.count; } }); this.seriesTypesRowCumulated = this.seriesTypesRow.map((row: Array) => { @@ -203,12 +213,21 @@ export class JumpsComponent implements OnInit, OnDestroy { return accumulated; }); }); - this.seriesTypesHeader = this.seriesTypesHeader.slice((pageData.jumpsByDateByModule[0].month+1), -(pageData.jumpsByDateByModule[(pageData.jumpsByDateByModule.length-1)].month)); + this.seriesTypesHeader = this.seriesTypesHeader.slice( + pageData.jumpsByDateByModule[0].month + 1, + -pageData.jumpsByDateByModule[pageData.jumpsByDateByModule.length - 1].month, + ); this.seriesTypesRow = this.seriesTypesRow.map((row: Array) => { - return row.slice((pageData.jumpsByDateByModule[0].month+1), -(pageData.jumpsByDateByModule[(pageData.jumpsByDateByModule.length-1)].month)); + return row.slice( + pageData.jumpsByDateByModule[0].month + 1, + -pageData.jumpsByDateByModule[pageData.jumpsByDateByModule.length - 1].month, + ); }); this.seriesTypesRowCumulated = this.seriesTypesRowCumulated.map((row: Array) => { - return row.slice((pageData.jumpsByDateByModule[0].month+1), -(pageData.jumpsByDateByModule[(pageData.jumpsByDateByModule.length-1)].month)); + return row.slice( + pageData.jumpsByDateByModule[0].month + 1, + -pageData.jumpsByDateByModule[pageData.jumpsByDateByModule.length - 1].month, + ); }); /* console.log('this.min', this.min); @@ -244,6 +263,6 @@ export class JumpsComponent implements OnInit, OnDestroy { } public getModuleColor(index: number): number { - return (this._jumpsByCategorie.length + index); + return this._jumpsByCategorie.length + index; } } diff --git a/src/app/components/logbook/dialogs/jump-add.dialog.ts b/src/app/components/logbook/dialogs/jump-add.dialog.ts index 62c5afe..378ccf8 100644 --- a/src/app/components/logbook/dialogs/jump-add.dialog.ts +++ b/src/app/components/logbook/dialogs/jump-add.dialog.ts @@ -14,29 +14,38 @@ import { MatSelectModule } from '@angular/material/select'; import { Observable, Subscription } from 'rxjs'; import { map, startWith, take } from 'rxjs/operators'; -import { AeronefByImat, CanopyModelBySize, DropZoneByOaci, Errors, Jump, JumpAddParams, JumpByModule, JumpFile, JumpFileType } from '@models'; +import { + AeronefByImat, + CanopyModelBySize, + DropZoneByOaci, + Errors, + Jump, + JumpAddParams, + JumpByModule, + JumpFile, + JumpFileType, +} from '@models'; import { AeronefsService, CanopiesService, DropZonesService, JumpsService } from '@services'; @Component({ selector: 'app-jump-add-dialog', templateUrl: 'jump-add.dialog.html', - standalone: true, imports: [ - AsyncPipe, - DatePipe, - FormsModule, - ReactiveFormsModule, - MatAutocompleteModule, - MatButtonModule, - MatCheckboxModule, - MatDatepickerModule, - MatDialogModule, - MatFormFieldModule, - MatIconModule, - MatInputModule, - MatSelectModule, - MatOptionModule -] + AsyncPipe, + DatePipe, + FormsModule, + ReactiveFormsModule, + MatAutocompleteModule, + MatButtonModule, + MatCheckboxModule, + MatDatepickerModule, + MatDialogModule, + MatFormFieldModule, + MatIconModule, + MatInputModule, + MatSelectModule, + MatOptionModule, + ], }) export class JumpAddDialogComponent implements OnDestroy { private _formChanges: Array = []; @@ -46,7 +55,7 @@ export class JumpAddDialogComponent implements OnDestroy { private _dropZoneByOaci: Subscription = new Subscription(); private _jumpByModule: Subscription = new Subscription(); public errors!: Errors; - public tagField = new FormControl('', { nonNullable: true}); + public tagField = new FormControl('', { nonNullable: true }); public jumpForm: FormGroup; public jump: Jump; public lastJump: Jump; @@ -73,7 +82,7 @@ export class JumpAddDialogComponent implements OnDestroy { dropzone: false, groupe: false, programme: false, - voile: false + voile: false, }; public inputOptions: { aeronefs: Array; @@ -99,17 +108,17 @@ export class JumpAddDialogComponent implements OnDestroy { private _canopiesService: CanopiesService, private _dropZonesService: DropZonesService, private _jumpsService: JumpsService, - @Inject(MAT_DIALOG_DATA) public data: {jump: Jump, lastJump: Jump} + @Inject(MAT_DIALOG_DATA) public data: { jump: Jump; lastJump: Jump }, ) { this.inputOptions = { aeronefs: [], canopies: [], dropzones: [], categories: [] }; //this.filteredOptions.aeronefs = this._aeronefsService.getAllByImat(); this.jump = data.jump; this.lastJump = data.lastJump; - this.nextJump = (this.lastJump.numero + 1); + this.nextJump = this.lastJump.numero + 1; this.params = { numeros: this.nextJump.toString(), date: '', - video: true + video: true, }; this.jump.numero = this.nextJump; const controlsConfig = { @@ -131,7 +140,7 @@ export class JumpAddDialogComponent implements OnDestroy { accessoires: '', zone: '', dossier: '', - video: '' + video: '', }; this.jumpForm = this.fb.group(controlsConfig); this.filename = this._computeFilename(); @@ -142,7 +151,7 @@ export class JumpAddDialogComponent implements OnDestroy { }), this.jumpForm.controls['numero'].valueChanges.subscribe(() => { this.filename = this._computeFilename(); - }) + }), ); /* this.filteredAeronefOptions = this.jumpForm.controls['aeronef'].valueChanges.pipe( @@ -164,60 +173,60 @@ export class JumpAddDialogComponent implements OnDestroy { this.filteredOptions = { aeronefs: this.jumpForm.controls['aeronef'].valueChanges.pipe( startWith(''), - map(value => { + map((value) => { const aeronef = typeof value === 'string' ? value : value?.aeronef; return aeronef ? this._filterImat(aeronef as string) : this.inputOptions.aeronefs.slice(); }), ), imats: this.jumpForm.controls['imat'].valueChanges.pipe( startWith(''), - map(value => { + map((value) => { const imat = typeof value === 'string' ? value : value?.imat; return imat ? this._filterImat(imat as string) : this.inputOptions.aeronefs.slice(); }), ), canopies: this.jumpForm.controls['voile'].valueChanges.pipe( startWith(''), - map(value => { + map((value) => { const voile = typeof value === 'string' ? value : value?.voile; return voile ? this._filterTaille(voile as string) : this.inputOptions.canopies.slice(); }), ), tailles: this.jumpForm.controls['taille'].valueChanges.pipe( startWith(''), - map(value => { + map((value) => { const taille = typeof value === 'string' ? value : value?.taille.toString(); return taille ? this._filterTaille(taille as string) : this.inputOptions.canopies.slice(); }), ), dropzones: this.jumpForm.controls['lieu'].valueChanges.pipe( startWith(''), - map(value => { + map((value) => { const lieu = typeof value === 'string' ? value : value?.lieu; return lieu ? this._filterOaci(lieu as string) : this.inputOptions.dropzones.slice(); }), ), oaci: this.jumpForm.controls['oaci'].valueChanges.pipe( startWith(''), - map(value => { + map((value) => { const oaci = typeof value === 'string' ? value : value?.oaci; return oaci ? this._filterOaci(oaci as string) : this.inputOptions.dropzones.slice(); }), ), categories: this.jumpForm.controls['categorie'].valueChanges.pipe( startWith(''), - map(value => { + map((value) => { const category = typeof value === 'string' ? value : value?.categorie; return category ? this._filterModule(category as string) : this.inputOptions.categories.slice(); }), ), modules: this.jumpForm.controls['module'].valueChanges.pipe( startWith(''), - map(value => { + map((value) => { const module = typeof value === 'string' ? value : value?.module; return module ? this._filterModule(module as string) : this.inputOptions.categories.slice(); }), - ) + ), }; this._loadAeronefByImat(); this._loadCanopyModelBySize(); @@ -244,7 +253,7 @@ export class JumpAddDialogComponent implements OnDestroy { const timestamp: number = Date.parse(this.jumpForm.controls['date'].value); if (isNaN(timestamp) == false) { const date: Date = new Date(timestamp); - file += `${(date.getFullYear() + '').padStart(2, '0')}-${((date.getMonth() + 1) + '').padStart(2, '0')}-${(date.getDate() + '').padStart(2, '0')}_`; + file += `${(date.getFullYear() + '').padStart(2, '0')}-${(date.getMonth() + 1 + '').padStart(2, '0')}-${(date.getDate() + '').padStart(2, '0')}_`; } if (numero !== undefined) { numero = (numero + '').padStart(5, '0'); @@ -261,7 +270,10 @@ export class JumpAddDialogComponent implements OnDestroy { let path: string = '/Volumes/Storage/Skydive/Videos/'; if (this.jumpForm.controls['module'].value != '') { //path += `${this.jumpForm.controls['module'].value}/`; - path += typeof this.jumpForm.controls['module'].value === 'string' ? `${this.jumpForm.controls['module'].value}/` : `${this.jumpForm.controls['module'].value?.module}/`; + path += + typeof this.jumpForm.controls['module'].value === 'string' + ? `${this.jumpForm.controls['module'].value}/` + : `${this.jumpForm.controls['module'].value?.module}/`; } this.jumpForm.controls['dossier'].setValue(path); @@ -270,35 +282,48 @@ export class JumpAddDialogComponent implements OnDestroy { private _isLastForAllSections() { return ( - this.useLast.aeronef - && this.useLast.altitude - && this.useLast.discipline - && this.useLast.divers - && this.useLast.dropzone - && this.useLast.groupe - && this.useLast.programme - && this.useLast.voile + this.useLast.aeronef && + this.useLast.altitude && + this.useLast.discipline && + this.useLast.divers && + this.useLast.dropzone && + this.useLast.groupe && + this.useLast.programme && + this.useLast.voile ); } private _filterImat(imat: string): Array { const filterValue = imat.toLowerCase(); - return this.inputOptions.aeronefs.filter(option => (option.aeronef.toLowerCase().includes(filterValue) || option.imat.toLowerCase().includes(filterValue))); + return this.inputOptions.aeronefs.filter( + (option) => + option.aeronef.toLowerCase().includes(filterValue) || option.imat.toLowerCase().includes(filterValue), + ); } private _filterModule(module: string): Array { const filterValue = module.toLowerCase(); - return this.inputOptions.categories.filter(option => (option.categorie.toLowerCase().includes(filterValue) || option.module.toLowerCase().includes(filterValue))); + return this.inputOptions.categories.filter( + (option) => + option.categorie.toLowerCase().includes(filterValue) || + option.module.toLowerCase().includes(filterValue), + ); } private _filterOaci(oaci: string): Array { const filterValue = oaci.toLowerCase(); - return this.inputOptions.dropzones.filter(option => (option.lieu.toLowerCase().includes(filterValue) || option.oaci.toLowerCase().includes(filterValue))); + return this.inputOptions.dropzones.filter( + (option) => + option.lieu.toLowerCase().includes(filterValue) || option.oaci.toLowerCase().includes(filterValue), + ); } private _filterTaille(taille: string): Array { const filterValue = taille.toLowerCase(); - return this.inputOptions.canopies.filter(option => (option.voile.toLowerCase().includes(filterValue) || option.taille.toString().includes(filterValue))); + return this.inputOptions.canopies.filter( + (option) => + option.voile.toLowerCase().includes(filterValue) || option.taille.toString().includes(filterValue), + ); } private _loadAeronefByImat(): void { @@ -376,7 +401,7 @@ export class JumpAddDialogComponent implements OnDestroy { if (tag != null && tag.trim() !== '') { if (tag.includes(',') === true) { const tags = tag.split(','); - tags.forEach(sautant => { + tags.forEach((sautant) => { if (this.jump.sautants.indexOf(sautant.trim()) < 0) { this.jump.sautants.push(sautant.trim()); } @@ -386,7 +411,7 @@ export class JumpAddDialogComponent implements OnDestroy { } } this.tagField.reset(''); - const participants = (this.jump.sautants.length + 1); + const participants = this.jump.sautants.length + 1; this.jumpForm.controls['participants'].setValue(participants); } @@ -562,7 +587,7 @@ export class JumpAddDialogComponent implements OnDestroy { this.useLast.groupe = false; this.useLast.all = this._isLastForAllSections(); this.jump.sautants = this.jump.sautants.filter((sautant) => sautant !== index); - const participants = (this.jump.sautants.length + 1); + const participants = this.jump.sautants.length + 1; this.jumpForm.controls['participants'].setValue(participants); } @@ -737,7 +762,7 @@ export class JumpAddDialogComponent implements OnDestroy { } submitForm(): void { - /* + /* * Création d'un tableau de saut contenant de 1 à n saut en fonction * de la valeur du champ numero du formulaire jumpForm */ @@ -766,17 +791,17 @@ export class JumpAddDialogComponent implements OnDestroy { const elements: string[] = this.jumpForm.controls['numero'].value.split(';'); elements.forEach((element: string) => { if (element == '') { - jumpNum ++; + jumpNum++; element = jumpNum.toString(); } const values: string[] = element.split('-'); if (values.length == 2) { const start: number = parseInt(values[0]); const stop: number = parseInt(values[1]); - const diff: number = (stop - start); + const diff: number = stop - start; /* Ajout de saut par plage */ for (let index = 0; index <= diff; index++) { - jumpNum = (start + index); + jumpNum = start + index; numeros.push(jumpNum); } } else { @@ -785,7 +810,7 @@ export class JumpAddDialogComponent implements OnDestroy { /* Ajout de sauts par quantité */ //const start: number = jumpNum; for (let index = 1; index <= parseInt(quantity[1]); index++) { - jumpNum ++; + jumpNum++; numeros.push(jumpNum); } } else { @@ -802,14 +827,38 @@ export class JumpAddDialogComponent implements OnDestroy { /* Valeurs communes aux 1 à n saut(s) à ajouter */ jump.date = date.toISOString(); - jump.lieu = typeof this.jumpForm.controls['lieu'].value === 'string' ? this.jumpForm.controls['lieu'].value : this.jumpForm.controls['lieu'].value.lieu; - jump.oaci = typeof this.jumpForm.controls['oaci'].value === 'string' ? this.jumpForm.controls['oaci'].value : this.jumpForm.controls['oaci'].value.oaci; - jump.aeronef = typeof this.jumpForm.controls['aeronef'].value === 'string' ? this.jumpForm.controls['aeronef'].value : this.jumpForm.controls['aeronef'].value.aeronef; - jump.imat = typeof this.jumpForm.controls['imat'].value === 'string' ? this.jumpForm.controls['imat'].value : this.jumpForm.controls['imat'].value.imat; - jump.voile = typeof this.jumpForm.controls['voile'].value === 'string' ? this.jumpForm.controls['voile'].value : this.jumpForm.controls['voile'].value.voile; - jump.taille = typeof this.jumpForm.controls['taille'].value === 'string' ? this.jumpForm.controls['taille'].value : this.jumpForm.controls['taille'].value.taille; - jump.categorie = typeof this.jumpForm.controls['categorie'].value === 'string' ? this.jumpForm.controls['categorie'].value : this.jumpForm.controls['categorie'].value.categorie; - jump.module = typeof this.jumpForm.controls['module'].value === 'string' ? this.jumpForm.controls['module'].value : this.jumpForm.controls['module'].value.module; + jump.lieu = + typeof this.jumpForm.controls['lieu'].value === 'string' + ? this.jumpForm.controls['lieu'].value + : this.jumpForm.controls['lieu'].value.lieu; + jump.oaci = + typeof this.jumpForm.controls['oaci'].value === 'string' + ? this.jumpForm.controls['oaci'].value + : this.jumpForm.controls['oaci'].value.oaci; + jump.aeronef = + typeof this.jumpForm.controls['aeronef'].value === 'string' + ? this.jumpForm.controls['aeronef'].value + : this.jumpForm.controls['aeronef'].value.aeronef; + jump.imat = + typeof this.jumpForm.controls['imat'].value === 'string' + ? this.jumpForm.controls['imat'].value + : this.jumpForm.controls['imat'].value.imat; + jump.voile = + typeof this.jumpForm.controls['voile'].value === 'string' + ? this.jumpForm.controls['voile'].value + : this.jumpForm.controls['voile'].value.voile; + jump.taille = + typeof this.jumpForm.controls['taille'].value === 'string' + ? this.jumpForm.controls['taille'].value + : this.jumpForm.controls['taille'].value.taille; + jump.categorie = + typeof this.jumpForm.controls['categorie'].value === 'string' + ? this.jumpForm.controls['categorie'].value + : this.jumpForm.controls['categorie'].value.categorie; + jump.module = + typeof this.jumpForm.controls['module'].value === 'string' + ? this.jumpForm.controls['module'].value + : this.jumpForm.controls['module'].value.module; jump.hauteur = this.jumpForm.controls['hauteur'].value; jump.deploiement = this.jumpForm.controls['deploiement'].value; jump.participants = this.jumpForm.controls['participants'].value; @@ -832,20 +881,21 @@ export class JumpAddDialogComponent implements OnDestroy { const file: JumpFile = { name: item.video, path: item.dossier, - type: JumpFileType.VIDEO + type: JumpFileType.VIDEO, } as JumpFile; this._subscriptions.push( - this._jumpsService.saveFile(item.slug, file) - .pipe(take(1)) - .subscribe({ - next: (file) => { - item.files.push(file); - console.log(`Le fichier ${file.name} a été ajouté au saut n°${item.numero} !`, 'OK'); - }, - error: (err) => { - this.errors = err; - } - }) + this._jumpsService + .saveFile(item.slug, file) + .pipe(take(1)) + .subscribe({ + next: (file) => { + item.files.push(file); + console.log(`Le fichier ${file.name} a été ajouté au saut n°${item.numero} !`, 'OK'); + }, + error: (err) => { + this.errors = err; + }, + }), ); } jumps.push(item); diff --git a/src/app/components/logbook/dialogs/jump-delete.dialog.ts b/src/app/components/logbook/dialogs/jump-delete.dialog.ts index fcc0b30..c88495c 100644 --- a/src/app/components/logbook/dialogs/jump-delete.dialog.ts +++ b/src/app/components/logbook/dialogs/jump-delete.dialog.ts @@ -9,17 +9,13 @@ import { Jump } from '@models'; @Component({ selector: 'app-jump-delete-dialog', templateUrl: 'jump-delete.dialog.html', - standalone: true, - imports: [ - DatePipe, - MatDialogModule, MatButtonModule, MatIconModule - ] + imports: [DatePipe, MatDialogModule, MatButtonModule, MatIconModule], }) export class JumpDeleteDialogComponent { constructor( public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public jump: Jump - ) { } + @Inject(MAT_DIALOG_DATA) public jump: Jump, + ) {} closeDialog(): void { this.dialogRef.close(); diff --git a/src/app/components/logbook/dialogs/jump-edit.dialog.ts b/src/app/components/logbook/dialogs/jump-edit.dialog.ts index fefb7ea..38c0064 100644 --- a/src/app/components/logbook/dialogs/jump-edit.dialog.ts +++ b/src/app/components/logbook/dialogs/jump-edit.dialog.ts @@ -20,30 +20,29 @@ import { AeronefsService, CanopiesService, DropZonesService, JumpsService } from @Component({ selector: 'app-jump-edit-dialog', templateUrl: 'jump-edit.dialog.html', - standalone: true, imports: [ - AsyncPipe, - DatePipe, - FormsModule, - ReactiveFormsModule, - MatAutocompleteModule, - MatButtonModule, - MatCheckboxModule, - MatDatepickerModule, - MatDialogModule, - MatFormFieldModule, - MatIconModule, - MatInputModule, - MatSelectModule, - MatOptionModule -] + AsyncPipe, + DatePipe, + FormsModule, + ReactiveFormsModule, + MatAutocompleteModule, + MatButtonModule, + MatCheckboxModule, + MatDatepickerModule, + MatDialogModule, + MatFormFieldModule, + MatIconModule, + MatInputModule, + MatSelectModule, + MatOptionModule, + ], }) export class JumpEditDialogComponent implements OnDestroy { private _aeronefByImat: Subscription = new Subscription(); private _canopyModelBySize: Subscription = new Subscription(); private _dropZoneByOaci: Subscription = new Subscription(); private _jumpByModule: Subscription = new Subscription(); - public tagField = new FormControl('', { nonNullable: true}); + public tagField = new FormControl('', { nonNullable: true }); public jumpForm: FormGroup; public inputOptions: { aeronefs: Array; @@ -69,7 +68,7 @@ export class JumpEditDialogComponent implements OnDestroy { private _canopiesService: CanopiesService, private _dropZonesService: DropZonesService, private _jumpsService: JumpsService, - @Inject(MAT_DIALOG_DATA) public jump: Jump + @Inject(MAT_DIALOG_DATA) public jump: Jump, ) { this.inputOptions = { aeronefs: [], canopies: [], dropzones: [], categories: [] }; const controlsConfig = { @@ -91,67 +90,67 @@ export class JumpEditDialogComponent implements OnDestroy { accessoires: this.jump.accessoires, zone: this.jump.zone, dossier: this.jump.dossier, - video: this.jump.video + video: this.jump.video, }; this.jumpForm = this.fb.group(controlsConfig); this.filteredOptions = { aeronefs: this.jumpForm.controls['aeronef'].valueChanges.pipe( startWith(''), - map(value => { + map((value) => { const aeronef = typeof value === 'string' ? value : value?.aeronef; return aeronef ? this._filterImat(aeronef as string) : this.inputOptions.aeronefs.slice(); }), ), imats: this.jumpForm.controls['imat'].valueChanges.pipe( startWith(''), - map(value => { + map((value) => { const imat = typeof value === 'string' ? value : value?.imat; return imat ? this._filterImat(imat as string) : this.inputOptions.aeronefs.slice(); }), ), canopies: this.jumpForm.controls['voile'].valueChanges.pipe( startWith(''), - map(value => { + map((value) => { const voile = typeof value === 'string' ? value : value?.voile; return voile ? this._filterTaille(voile as string) : this.inputOptions.canopies.slice(); }), ), tailles: this.jumpForm.controls['taille'].valueChanges.pipe( startWith(''), - map(value => { + map((value) => { const taille = typeof value === 'string' ? value : value?.taille.toString(); return taille ? this._filterTaille(taille as string) : this.inputOptions.canopies.slice(); }), ), dropzones: this.jumpForm.controls['lieu'].valueChanges.pipe( startWith(''), - map(value => { + map((value) => { const lieu = typeof value === 'string' ? value : value?.lieu; return lieu ? this._filterOaci(lieu as string) : this.inputOptions.dropzones.slice(); }), ), oaci: this.jumpForm.controls['oaci'].valueChanges.pipe( startWith(''), - map(value => { + map((value) => { const oaci = typeof value === 'string' ? value : value?.oaci; return oaci ? this._filterOaci(oaci as string) : this.inputOptions.dropzones.slice(); }), ), categories: this.jumpForm.controls['categorie'].valueChanges.pipe( startWith(''), - map(value => { + map((value) => { const category = typeof value === 'string' ? value : value?.categorie; return category ? this._filterModule(category as string) : this.inputOptions.categories.slice(); }), ), modules: this.jumpForm.controls['module'].valueChanges.pipe( startWith(''), - map(value => { + map((value) => { const module = typeof value === 'string' ? value : value?.module; return module ? this._filterModule(module as string) : this.inputOptions.categories.slice(); }), - ) + ), }; this._loadAeronefByImat(); this._loadCanopyModelBySize(); @@ -168,22 +167,35 @@ export class JumpEditDialogComponent implements OnDestroy { private _filterImat(imat: string): Array { const filterValue = imat.toLowerCase(); - return this.inputOptions.aeronefs.filter(option => (option.aeronef.toLowerCase().includes(filterValue) || option.imat.toLowerCase().includes(filterValue))); + return this.inputOptions.aeronefs.filter( + (option) => + option.aeronef.toLowerCase().includes(filterValue) || option.imat.toLowerCase().includes(filterValue), + ); } private _filterModule(module: string): Array { const filterValue = module.toLowerCase(); - return this.inputOptions.categories.filter(option => (option.categorie.toLowerCase().includes(filterValue) || option.module.toLowerCase().includes(filterValue))); + return this.inputOptions.categories.filter( + (option) => + option.categorie.toLowerCase().includes(filterValue) || + option.module.toLowerCase().includes(filterValue), + ); } private _filterOaci(oaci: string): Array { const filterValue = oaci.toLowerCase(); - return this.inputOptions.dropzones.filter(option => (option.lieu.toLowerCase().includes(filterValue) || option.oaci.toLowerCase().includes(filterValue))); + return this.inputOptions.dropzones.filter( + (option) => + option.lieu.toLowerCase().includes(filterValue) || option.oaci.toLowerCase().includes(filterValue), + ); } private _filterTaille(taille: string): Array { const filterValue = taille.toLowerCase(); - return this.inputOptions.canopies.filter(option => (option.voile.toLowerCase().includes(filterValue) || option.taille.toString().includes(filterValue))); + return this.inputOptions.canopies.filter( + (option) => + option.voile.toLowerCase().includes(filterValue) || option.taille.toString().includes(filterValue), + ); } private _loadAeronefByImat(): void { @@ -219,7 +231,7 @@ export class JumpEditDialogComponent implements OnDestroy { if (tag != null && tag.trim() !== '' && this.jump.sautants.indexOf(tag) < 0) { this.jump.sautants.push(tag); } - const participants = (this.jump.sautants.length + 1); + const participants = this.jump.sautants.length + 1; this.jumpForm.controls['participants'].setValue(participants); this.tagField.reset(''); } @@ -382,21 +394,45 @@ export class JumpEditDialogComponent implements OnDestroy { removeSautant(index: string): void { this.jump.sautants = this.jump.sautants.filter((sautant) => sautant !== index); - const participants = (this.jump.sautants.length + 1); + const participants = this.jump.sautants.length + 1; this.jumpForm.controls['participants'].setValue(participants); } submitForm(): void { // update the model this.updateJump(this.jumpForm.value); - this.jump.lieu = typeof this.jumpForm.controls['lieu'].value === 'string' ? this.jumpForm.controls['lieu'].value : this.jumpForm.controls['lieu'].value.lieu; - this.jump.oaci = typeof this.jumpForm.controls['oaci'].value === 'string' ? this.jumpForm.controls['oaci'].value : this.jumpForm.controls['oaci'].value.oaci; - this.jump.aeronef = typeof this.jumpForm.controls['aeronef'].value === 'string' ? this.jumpForm.controls['aeronef'].value : this.jumpForm.controls['aeronef'].value.aeronef; - this.jump.imat = typeof this.jumpForm.controls['imat'].value === 'string' ? this.jumpForm.controls['imat'].value : this.jumpForm.controls['imat'].value.imat; - this.jump.voile = typeof this.jumpForm.controls['voile'].value === 'string' ? this.jumpForm.controls['voile'].value : this.jumpForm.controls['voile'].value.voile; - this.jump.taille = typeof this.jumpForm.controls['taille'].value === 'string' ? this.jumpForm.controls['taille'].value : this.jumpForm.controls['taille'].value.taille; - this.jump.categorie = typeof this.jumpForm.controls['categorie'].value === 'string' ? this.jumpForm.controls['categorie'].value : this.jumpForm.controls['categorie'].value.categorie; - this.jump.module = typeof this.jumpForm.controls['module'].value === 'string' ? this.jumpForm.controls['module'].value : this.jumpForm.controls['module'].value.module; + this.jump.lieu = + typeof this.jumpForm.controls['lieu'].value === 'string' + ? this.jumpForm.controls['lieu'].value + : this.jumpForm.controls['lieu'].value.lieu; + this.jump.oaci = + typeof this.jumpForm.controls['oaci'].value === 'string' + ? this.jumpForm.controls['oaci'].value + : this.jumpForm.controls['oaci'].value.oaci; + this.jump.aeronef = + typeof this.jumpForm.controls['aeronef'].value === 'string' + ? this.jumpForm.controls['aeronef'].value + : this.jumpForm.controls['aeronef'].value.aeronef; + this.jump.imat = + typeof this.jumpForm.controls['imat'].value === 'string' + ? this.jumpForm.controls['imat'].value + : this.jumpForm.controls['imat'].value.imat; + this.jump.voile = + typeof this.jumpForm.controls['voile'].value === 'string' + ? this.jumpForm.controls['voile'].value + : this.jumpForm.controls['voile'].value.voile; + this.jump.taille = + typeof this.jumpForm.controls['taille'].value === 'string' + ? this.jumpForm.controls['taille'].value + : this.jumpForm.controls['taille'].value.taille; + this.jump.categorie = + typeof this.jumpForm.controls['categorie'].value === 'string' + ? this.jumpForm.controls['categorie'].value + : this.jumpForm.controls['categorie'].value.categorie; + this.jump.module = + typeof this.jumpForm.controls['module'].value === 'string' + ? this.jumpForm.controls['module'].value + : this.jumpForm.controls['module'].value.module; // close the dialog with result this.dialogRef.close(this.jump); } diff --git a/src/app/components/logbook/dialogs/jump-view.dialog.ts b/src/app/components/logbook/dialogs/jump-view.dialog.ts index 8d9d1f6..236d440 100644 --- a/src/app/components/logbook/dialogs/jump-view.dialog.ts +++ b/src/app/components/logbook/dialogs/jump-view.dialog.ts @@ -10,19 +10,13 @@ import { Jump } from '@models'; @Component({ selector: 'app-jump-view-dialog', templateUrl: 'jump-view.dialog.html', - standalone: true, - imports: [ - DatePipe, DecimalPipe, - MatButtonModule, MatDialogModule, - MatDividerModule, MatIconModule -] + imports: [DatePipe, DecimalPipe, MatButtonModule, MatDialogModule, MatDividerModule, MatIconModule], }) export class JumpViewDialogComponent { - constructor( public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public jump: Jump - ) { } + @Inject(MAT_DIALOG_DATA) public jump: Jump, + ) {} closeDialog(): void { // close the dialog without result diff --git a/src/app/components/logbook/logbook.component.ts b/src/app/components/logbook/logbook.component.ts index a989bc0..381efb1 100644 --- a/src/app/components/logbook/logbook.component.ts +++ b/src/app/components/logbook/logbook.component.ts @@ -12,7 +12,13 @@ import { MatIconModule } from '@angular/material/icon'; import { MatInputModule } from '@angular/material/input'; import { MatMenuModule } from '@angular/material/menu'; import { MatSliderModule } from '@angular/material/slider'; -import { MatSnackBar, MatSnackBarConfig, MatSnackBarHorizontalPosition, MatSnackBarModule, MatSnackBarVerticalPosition } from '@angular/material/snack-bar'; +import { + MatSnackBar, + MatSnackBarConfig, + MatSnackBarHorizontalPosition, + MatSnackBarModule, + MatSnackBarVerticalPosition, +} from '@angular/material/snack-bar'; import { Observable, Subscription } from 'rxjs'; import { take } from 'rxjs/operators'; @@ -24,13 +30,21 @@ import data from 'src/jumps.json'; //import data from 'src/jumps_02.json'; @Component({ - standalone: true, imports: [ - CommonModule, RouterModule, FormsModule, - MatButtonModule, MatCardModule, MatDividerModule, MatExpansionModule, - MatIconModule, MatInputModule, MatMenuModule, MatDialogModule, - MatSliderModule, MatSnackBarModule, - JumpTableComponent + CommonModule, + RouterModule, + FormsModule, + MatButtonModule, + MatCardModule, + MatDividerModule, + MatExpansionModule, + MatIconModule, + MatInputModule, + MatMenuModule, + MatDialogModule, + MatSliderModule, + MatSnackBarModule, + JumpTableComponent, ], selector: 'app-logbook', templateUrl: './logbook.component.html', @@ -38,16 +52,10 @@ import data from 'src/jumps.json'; animations: [ trigger('flyInOut', [ state('in', style({ transform: 'translateY(0)' })), - transition('void => *', [ - style({ transform: 'translateY(-100%)' }), - animate(200) - ]), - transition('* => void', [ - style({ transform: 'translateY(100%)' }), - animate(200) - ]) - ]) - ] + transition('void => *', [style({ transform: 'translateY(-100%)' }), animate(200)]), + transition('* => void', [style({ transform: 'translateY(100%)' }), animate(200)]), + ]), + ], }) export class LogbookComponent implements OnInit, OnDestroy, AfterContentChecked { private _currentUser: Subscription = new Subscription(); @@ -77,11 +85,11 @@ export class LogbookComponent implements OnInit, OnDestroy, AfterContentChecked hauteur: Range; year: Range; } = { - numero: {start: 1, end: 100000}, - taille: {start: 1, end: 400}, - participants: {start: 1, end: 200}, - hauteur: {start: 0, end: 10000}, - year: {start: 1970, end: 2020} + numero: { start: 1, end: 100000 }, + taille: { start: 1, end: 400 }, + participants: { start: 1, end: 200 }, + hauteur: { start: 0, end: 10000 }, + year: { start: 1970, end: 2020 }, }; constructor( @@ -92,13 +100,16 @@ export class LogbookComponent implements OnInit, OnDestroy, AfterContentChecked private _jumpsService: JumpsService, private _jumpTableService: JumpTableService, private _userService: UserService, - public menuItems: MenuItems - ) { } + public menuItems: MenuItems, + ) {} ngOnInit() { //this.importJumps(); - const data$: Observable<{isAuthenticated: boolean, lastjump: Jump}> = this.route.data as Observable<{isAuthenticated: boolean, lastjump: Jump}>; - this._data = data$.subscribe((data: {isAuthenticated: boolean, lastjump: Jump}) => { + const data$: Observable<{ isAuthenticated: boolean; lastjump: Jump }> = this.route.data as Observable<{ + isAuthenticated: boolean; + lastjump: Jump; + }>; + this._data = data$.subscribe((data: { isAuthenticated: boolean; lastjump: Jump }) => { this.isAuthenticated = data.isAuthenticated; if (!this.isAuthenticated) { this.router.navigateByUrl('/login'); @@ -114,24 +125,24 @@ export class LogbookComponent implements OnInit, OnDestroy, AfterContentChecked const currentYear: number = new Date().getFullYear(); this.lastJump = data['lastjump']; this.rangesMinMax = { - numero: {start: 1, end: data.lastjump.numero}, - taille: {start: data.lastjump.taille!, end: 230}, - participants: {start: 1, end: 20}, - hauteur: {start: 1000, end: 8000}, - year: {start: 2018, end: currentYear} - } + numero: { start: 1, end: data.lastjump.numero }, + taille: { start: data.lastjump.taille!, end: 230 }, + participants: { start: 1, end: 20 }, + hauteur: { start: 1000, end: 8000 }, + year: { start: 2018, end: currentYear }, + }; this.listConfig.filters.numeroRangeStart = this.rangesMinMax.numero.start; this.listConfig.filters.numeroRangeEnd = this.rangesMinMax.numero.end; this.listConfig.filters.tailleRangeStart = this.rangesMinMax.taille.start; this.listConfig.filters.tailleRangeEnd = this.rangesMinMax.taille.end; this.listConfig.filters.participantsRangeStart = this.rangesMinMax.participants.start; - this.listConfig.filters.participantsRangeEnd = (this.rangesMinMax.participants.end / 2); + this.listConfig.filters.participantsRangeEnd = this.rangesMinMax.participants.end / 2; this.listConfig.filters.hauteurRangeStart = this.rangesMinMax.hauteur.start; this.listConfig.filters.hauteurRangeEnd = this.rangesMinMax.hauteur.end; this.listConfig.filters.yearRangeStart = this.rangesMinMax.year.start; this.listConfig.filters.yearRangeEnd = this.rangesMinMax.year.end; - this.jumpsSinceHundred = computed(() => (this.lastJump.numero % 100)); - this.jumpsToHundred = computed(() => (100 - this.jumpsSinceHundred())); + this.jumpsSinceHundred = computed(() => this.lastJump.numero % 100); + this.jumpsToHundred = computed(() => 100 - this.jumpsSinceHundred()); /* this._lastjump$ = this._jumpsService.getLastJump(); this._lastjump = this._lastjump$.subscribe((jump) => { @@ -165,7 +176,7 @@ export class LogbookComponent implements OnInit, OnDestroy, AfterContentChecked this._data.unsubscribe(); this._currentUser.unsubscribe(); this._lastjump.unsubscribe(); - this._subscriptions.forEach(subscription => { + this._subscriptions.forEach((subscription) => { subscription.unsubscribe(); }); } @@ -185,17 +196,18 @@ export class LogbookComponent implements OnInit, OnDestroy, AfterContentChecked try { data.forEach((entry) => { Object.assign(this.jump, entry); - this._jumpsService.save(this.jump) - .pipe(take(1)) - .subscribe({ - next: (jump) => { - console.log(`Le saut n°${jump.numero} a été ajouté !`, 'OK'); - }, - error: (err) => { - console.log(`Le saut n'a pas été ajouté !`, 'Error', err); - this.errors = err; - } - }); + this._jumpsService + .save(this.jump) + .pipe(take(1)) + .subscribe({ + next: (jump) => { + console.log(`Le saut n°${jump.numero} a été ajouté !`, 'OK'); + }, + error: (err) => { + console.log(`Le saut n'a pas été ajouté !`, 'Error', err); + this.errors = err; + }, + }); }); } catch (error) { console.error(error); @@ -204,19 +216,21 @@ export class LogbookComponent implements OnInit, OnDestroy, AfterContentChecked openAddDialog(): void { this.jump = {}; - this.jump.numero = (this.lastJump.numero + 1); + this.jump.numero = this.lastJump.numero + 1; this.jump.sautants = []; this.jump.participants = 1; const dialogRef = this.dialog.open(JumpAddDialogComponent, { width: '70vw', - data: {jump: this.jump, lastJump: this.lastJump} - }); - dialogRef.afterClosed().pipe(take(1)) - .subscribe(result => { - if (result != undefined) { - this._onEntry(result); - } + data: { jump: this.jump, lastJump: this.lastJump }, }); + dialogRef + .afterClosed() + .pipe(take(1)) + .subscribe((result) => { + if (result != undefined) { + this._onEntry(result); + } + }); } setTotalResults(value: number): void { @@ -229,112 +243,128 @@ export class LogbookComponent implements OnInit, OnDestroy, AfterContentChecked config.filters.offset = 0; config.filters.dateRangeStart = `${jumps[0].date!.substring(0, 10)} 00:00:00`; config.filters.dateRangeEnd = `${jumps[0].date!.substring(0, 10)} 23:59:59`; - const subscription: Subscription = this._jumpsService.getAllFromSkydiverIdApi(config) - .pipe(take(1)) - .subscribe({ - next: (data) => { - if (data.items.length) { - const diff = jumps.length - data.items.length; - if (diff < 0) { - console.error(`${diff} ${diff > 1 ? 'données' : 'donnée'} altimètre de trop le ${jumps[0].date!.substring(0, 10)}`); + const subscription: Subscription = this._jumpsService + .getAllFromSkydiverIdApi(config) + .pipe(take(1)) + .subscribe({ + next: (data) => { + if (data.items.length) { + const diff = jumps.length - data.items.length; + if (diff < 0) { + console.error( + `${diff} ${diff > 1 ? 'données' : 'donnée'} altimètre de trop le ${jumps[0].date!.substring(0, 10)}`, + ); + } + if (diff > 0) { + console.error( + `${diff}/${jumps.length} ${diff > 1 ? 'données altimètre manquantes' : 'donnée altimètre manquante'} le ${jumps[0].date!.substring(0, 10)}`, + jumps, + data.items, + ); + } + console.log( + `${jumps.length} ${jumps.length > 1 ? 'sauts' : 'saut'} le ${data.items[0].date!.substring(0, 10)}`, + jumps.sort((a, b) => b.numero! - a.numero!), + data.items, + ); + this._addX2Data(data.items, jumps); + } else { + console.info('Aucune données altimètre pour le ', jumps[0].date!.substring(0, 10)); } - if (diff > 0) { - console.error(`${diff}/${jumps.length} ${diff > 1 ? 'données altimètre manquantes' : 'donnée altimètre manquante'} le ${jumps[0].date!.substring(0, 10)}`, jumps, data.items); - } - console.log(`${jumps.length} ${jumps.length > 1 ? 'sauts' : 'saut'} le ${data.items[0].date!.substring(0, 10)}`, jumps.sort((a, b) => b.numero! - a.numero!), data.items); - this._addX2Data(data.items, jumps); - } else { - console.info('Aucune données altimètre pour le ', jumps[0].date!.substring(0, 10)); - } - }, - error: (err) => { - console.error('getAllFromSkydiverIdApi error'); - this.errors = err; - } - }); + }, + error: (err) => { + console.error('getAllFromSkydiverIdApi error'); + this.errors = err; + }, + }); this._subscriptions.push(subscription); } private _addJump(jumps: Array, index: number = 0) { - this._jumpsService.save(jumps[index]) - .pipe(take(1)) - .subscribe({ - next: (jump) => { - jumps[index] = jump; - console.log('Ajout du saut', jump.numero); - Object.assign(this.jump, jump); - this._openSnackBar(`Le saut n°${jump.numero} a été ajouté !`, 'Annuler'); - this._resetErrors(); - if (jumps.length == (index + 1)) { - this._loadSkydiverIdJumps(jumps); - } else { - this._addJump(jumps, (index + 1)); - } - }, - error: (err) => { - this.errors = err; - this.isSubmitting = false; - } - }); + this._jumpsService + .save(jumps[index]) + .pipe(take(1)) + .subscribe({ + next: (jump) => { + jumps[index] = jump; + console.log('Ajout du saut', jump.numero); + Object.assign(this.jump, jump); + this._openSnackBar(`Le saut n°${jump.numero} a été ajouté !`, 'Annuler'); + this._resetErrors(); + if (jumps.length == index + 1) { + this._loadSkydiverIdJumps(jumps); + } else { + this._addJump(jumps, index + 1); + } + }, + error: (err) => { + this.errors = err; + this.isSubmitting = false; + }, + }); } private _addX2Data(x2data: Array, jumps: Array, index: number = 0) { const file: JumpFile = { name: x2data[index].name, path: `/Volumes/Storage/Skydive/X2_Logs/${x2data[index].date!.substring(0, 4)}/`, - type: JumpFileType.CSV + type: JumpFileType.CSV, } as JumpFile; this._subscriptions.push( - this._jumpsService.saveX2Data(jumps[index].slug!, file, x2data[index]) - .pipe(take(1)) - .subscribe({ - next: (jump) => { - jumps[index] = jump; - console.log(`Le fichier ${file.name} a été ajouté au saut n°${jump.numero} !`, 'OK'); - if (jumps.length == (index + 1) || x2data.length == (index + 1)) { - this._addKmlFile(jumps); - } else { - this._addX2Data(x2data, jumps, (index + 1)); - } - - }, - error: (err) => { - this.errors = err; - } - }) + this._jumpsService + .saveX2Data(jumps[index].slug!, file, x2data[index]) + .pipe(take(1)) + .subscribe({ + next: (jump) => { + jumps[index] = jump; + console.log(`Le fichier ${file.name} a été ajouté au saut n°${jump.numero} !`, 'OK'); + if (jumps.length == index + 1 || x2data.length == index + 1) { + this._addKmlFile(jumps); + } else { + this._addX2Data(x2data, jumps, index + 1); + } + }, + error: (err) => { + this.errors = err; + }, + }), ); } - + private _addKmlFile(jumps: Array, index: number = 0) { if (jumps[index].x2data !== null) { //console.log(`Le fichier ${jump.x2data.name} existe pour le saut n°${jump.numero} !`, `https://skydiver.id/api/jump/${jump.x2data.id}/kml`); const file: JumpFile = { name: jumps[index].x2data.name.substring(0, -4) + '.kml', path: `/Volumes/Storage/Skydive/X2_Kmls/${jumps[index].date.substring(0, 4)}/`, - type: JumpFileType.KML + type: JumpFileType.KML, } as JumpFile; this._subscriptions.push( - this._jumpsService.saveKml(jumps[index].slug, file) - .pipe(take(1)) - .subscribe({ - next: (file) => { - console.log(`Le fichier ${file.path}${file.name} a été ajouté au saut n°${jumps[index].numero} !`, 'OK'); - if (jumps.length == (index + 1)) { - this._resetErrors(); - this.jumpRefresh = !this.jumpRefresh; - this._jumpTableService.updateJumpRefresh(this.jumpRefresh); - this._lastjump$ = this._jumpsService.getLastJump(); - this._lastjump = this._lastjump$.subscribe((jump) => { - this.lastJump = jump; - }); - } else { - this._addKmlFile(jumps, (index + 1)); - } - }, - error: (err) => { - this.errors = err; - } - }) + this._jumpsService + .saveKml(jumps[index].slug, file) + .pipe(take(1)) + .subscribe({ + next: (file) => { + console.log( + `Le fichier ${file.path}${file.name} a été ajouté au saut n°${jumps[index].numero} !`, + 'OK', + ); + if (jumps.length == index + 1) { + this._resetErrors(); + this.jumpRefresh = !this.jumpRefresh; + this._jumpTableService.updateJumpRefresh(this.jumpRefresh); + this._lastjump$ = this._jumpsService.getLastJump(); + this._lastjump = this._lastjump$.subscribe((jump) => { + this.lastJump = jump; + }); + } else { + this._addKmlFile(jumps, index + 1); + } + }, + error: (err) => { + this.errors = err; + }, + }), ); } } @@ -387,7 +417,7 @@ export class LogbookComponent implements OnInit, OnDestroy, AfterContentChecked const config: MatSnackBarConfig = { horizontalPosition: 'end', verticalPosition: 'bottom', - duration: 4000 + duration: 4000, }; this.snackBar.open(content, title, config); } @@ -395,5 +425,4 @@ export class LogbookComponent implements OnInit, OnDestroy, AfterContentChecked private _resetErrors(): void { this.errors = { errors: {} }; } - } diff --git a/src/app/components/page/page.component.ts b/src/app/components/page/page.component.ts index 7351729..ea9828c 100644 --- a/src/app/components/page/page.component.ts +++ b/src/app/components/page/page.component.ts @@ -1,7 +1,7 @@ import { Title } from '@angular/platform-browser'; import { trigger, state, style, animate, transition } from '@angular/animations'; import { Component, DestroyRef, inject, OnInit, OnDestroy } from '@angular/core'; -import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { DatePipe } from '@angular/common'; import { ActivatedRoute, RouterLink } from '@angular/router'; import { MatCardModule } from '@angular/material/card'; @@ -9,54 +9,47 @@ import { MatDividerModule } from '@angular/material/divider'; import { MatIconModule } from '@angular/material/icon'; import { Observable, Subscription } from 'rxjs'; -import { ListErrorsComponent, } from '@components/shared'; +import { ListErrorsComponent } from '@components/shared'; import { Errors, Article, ArticlePageData } from '@models'; @Component({ selector: 'app-page', - standalone: true, - imports: [ - DatePipe, RouterLink, - MatCardModule, MatDividerModule, MatIconModule, - ListErrorsComponent - ], + imports: [DatePipe, RouterLink, MatCardModule, MatDividerModule, MatIconModule, ListErrorsComponent], templateUrl: './page.component.html', styleUrl: './page.component.scss', animations: [ trigger('flyInOut', [ state('in', style({ transform: 'translateY(0)' })), - transition('void => *', [ - style({ transform: 'translateY(-100%)' }), - animate(200) - ]), - transition('* => void', [ - style({ transform: 'translateY(100%)' }), - animate(200) - ]) - ]) - ] + transition('void => *', [style({ transform: 'translateY(-100%)' }), animate(200)]), + transition('* => void', [style({ transform: 'translateY(100%)' }), animate(200)]), + ]), + ], }) export class PageComponent implements OnInit, OnDestroy { private _data: Subscription = new Subscription(); public title = 'Shop bientôt disponible!'; - public description = 'Encore un peu de patience, notre shop sera mis en ligne d\'ici peu.'; + public description = "Encore un peu de patience, notre shop sera mis en ligne d'ici peu."; public errors: Errors = { errors: {} }; public destroyRef = inject(DestroyRef); public article: Article = {} as Article; constructor( private route: ActivatedRoute, - private titleService: Title - ) { } + private titleService: Title, + ) {} ngOnInit() { - const data$: Observable<{ pageData: ArticlePageData }> = this.route.data as Observable<{ pageData: ArticlePageData }>; - this._data = data$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((data: { pageData: ArticlePageData }) => { - this.article = data.pageData.article; - this.title = this.article.title; - this.titleService.setTitle(this.article.title); - console.log(this.article); - }); + const data$: Observable<{ pageData: ArticlePageData }> = this.route.data as Observable<{ + pageData: ArticlePageData; + }>; + this._data = data$ + .pipe(takeUntilDestroyed(this.destroyRef)) + .subscribe((data: { pageData: ArticlePageData }) => { + this.article = data.pageData.article; + this.title = this.article.title; + this.titleService.setTitle(this.article.title); + console.log(this.article); + }); } ngOnDestroy() { diff --git a/src/app/components/pages/pages.component.ts b/src/app/components/pages/pages.component.ts index 874899b..756c0e8 100644 --- a/src/app/components/pages/pages.component.ts +++ b/src/app/components/pages/pages.component.ts @@ -1,12 +1,9 @@ import { Component } from '@angular/core'; @Component({ - selector: 'app-pages', - standalone: true, - imports: [], - templateUrl: './pages.component.html', - styleUrl: './pages.component.scss' + selector: 'app-pages', + imports: [], + templateUrl: './pages.component.html', + styleUrl: './pages.component.scss', }) -export class PagesComponent { - -} +export class PagesComponent {} diff --git a/src/app/components/product/product.component.ts b/src/app/components/product/product.component.ts index 062bf65..57abf2f 100644 --- a/src/app/components/product/product.component.ts +++ b/src/app/components/product/product.component.ts @@ -1,7 +1,7 @@ import { Title } from '@angular/platform-browser'; import { trigger, state, style, animate, transition } from '@angular/animations'; import { Component, DestroyRef, inject, OnInit, OnDestroy } from '@angular/core'; -import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { DatePipe, DecimalPipe } from '@angular/common'; import { ActivatedRoute, RouterLink } from '@angular/router'; import { MatCardModule } from '@angular/material/card'; @@ -9,55 +9,48 @@ import { MatDividerModule } from '@angular/material/divider'; import { MatIconModule } from '@angular/material/icon'; import { Observable, Subscription } from 'rxjs'; -import { ListErrorsComponent, } from '@components/shared'; +import { ListErrorsComponent } from '@components/shared'; import { Errors, Product, ProductPageData } from '@models'; @Component({ selector: 'app-product', - standalone: true, - imports: [ - DatePipe, DecimalPipe, RouterLink, - MatCardModule, MatDividerModule, MatIconModule, - ListErrorsComponent - ], + imports: [DatePipe, DecimalPipe, RouterLink, MatCardModule, MatDividerModule, MatIconModule, ListErrorsComponent], templateUrl: './product.component.html', styleUrl: './product.component.scss', animations: [ trigger('flyInOut', [ state('in', style({ transform: 'translateY(0)' })), - transition('void => *', [ - style({ transform: 'translateY(-100%)' }), - animate(200) - ]), - transition('* => void', [ - style({ transform: 'translateY(100%)' }), - animate(200) - ]) - ]) - ] + transition('void => *', [style({ transform: 'translateY(-100%)' }), animate(200)]), + transition('* => void', [style({ transform: 'translateY(100%)' }), animate(200)]), + ]), + ], }) export class ProductComponent implements OnInit, OnDestroy { private _data: Subscription = new Subscription(); public title = 'Ad Astra - Produit'; - public description = 'Encore un peu de patience, notre shop sera mis en ligne d\'ici peu.'; + public description = "Encore un peu de patience, notre shop sera mis en ligne d'ici peu."; public errors: Errors = { errors: {} }; public destroyRef = inject(DestroyRef); public product: Product = {} as Product; constructor( private route: ActivatedRoute, - private titleService: Title - ) { } + private titleService: Title, + ) {} ngOnInit() { - const data$: Observable<{ pageData: ProductPageData }> = this.route.data as Observable<{ pageData: ProductPageData }>; - this._data = data$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((data: { pageData: ProductPageData }) => { - this.product = data.pageData.product; - this.title = this.product.name; - this.description = this.product.description; - this.titleService.setTitle(this.product.name); - console.log(this.product); - }); + const data$: Observable<{ pageData: ProductPageData }> = this.route.data as Observable<{ + pageData: ProductPageData; + }>; + this._data = data$ + .pipe(takeUntilDestroyed(this.destroyRef)) + .subscribe((data: { pageData: ProductPageData }) => { + this.product = data.pageData.product; + this.title = this.product.name; + this.description = this.product.description; + this.titleService.setTitle(this.product.name); + console.log(this.product); + }); } ngOnDestroy() { diff --git a/src/app/components/products/products.component.ts b/src/app/components/products/products.component.ts index c897305..0adc799 100644 --- a/src/app/components/products/products.component.ts +++ b/src/app/components/products/products.component.ts @@ -1,7 +1,7 @@ import { Title } from '@angular/platform-browser'; import { trigger, state, style, animate, transition } from '@angular/animations'; import { Component, DestroyRef, inject, OnInit, OnDestroy } from '@angular/core'; -import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { DatePipe, DecimalPipe } from '@angular/common'; import { ActivatedRoute, RouterLink } from '@angular/router'; import { MatButtonModule } from '@angular/material/button'; @@ -10,37 +10,35 @@ import { MatDividerModule } from '@angular/material/divider'; import { MatIconModule } from '@angular/material/icon'; import { Observable, Subscription } from 'rxjs'; -import { ListErrorsComponent, } from '@components/shared'; +import { ListErrorsComponent } from '@components/shared'; import { Errors, Product, ProductsPageData } from '@models'; @Component({ selector: 'app-products', - standalone: true, imports: [ - DatePipe, DecimalPipe, RouterLink, - MatButtonModule, MatCardModule, MatDividerModule, MatIconModule, - ListErrorsComponent + DatePipe, + DecimalPipe, + RouterLink, + MatButtonModule, + MatCardModule, + MatDividerModule, + MatIconModule, + ListErrorsComponent, ], templateUrl: './products.component.html', styleUrl: './products.component.scss', animations: [ trigger('flyInOut', [ state('in', style({ transform: 'translateY(0)' })), - transition('void => *', [ - style({ transform: 'translateY(-100%)' }), - animate(200) - ]), - transition('* => void', [ - style({ transform: 'translateY(100%)' }), - animate(200) - ]) - ]) - ] + transition('void => *', [style({ transform: 'translateY(-100%)' }), animate(200)]), + transition('* => void', [style({ transform: 'translateY(100%)' }), animate(200)]), + ]), + ], }) export class ProductsComponent implements OnInit, OnDestroy { private _data: Subscription = new Subscription(); public title = 'Ad Astra - Produit'; - public description = 'Encore un peu de patience, notre shop sera mis en ligne d\'ici peu.'; + public description = "Encore un peu de patience, notre shop sera mis en ligne d'ici peu."; public errors: Errors = { errors: {} }; public destroyRef = inject(DestroyRef); public products: Array = []; @@ -48,25 +46,28 @@ export class ProductsComponent implements OnInit, OnDestroy { constructor( private route: ActivatedRoute, - private titleService: Title - ) { } + private titleService: Title, + ) {} ngOnInit() { - const data$: Observable<{ pageData: ProductsPageData }> = this.route.data as Observable<{ pageData: ProductsPageData }>; - this._data = data$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((data: { pageData: ProductsPageData }) => { - this.products = data.pageData.products; - this.productsCount = data.pageData.count; - //this.title = 'Fleurs CBD'; - this.title = data.pageData.products[0].productCategories[0]!.name; - this.description = data.pageData.products[0].productCategories[0]!.description; - this.titleService.setTitle(this.title); - console.log(data.pageData); - console.log(this.products); - }); + const data$: Observable<{ pageData: ProductsPageData }> = this.route.data as Observable<{ + pageData: ProductsPageData; + }>; + this._data = data$ + .pipe(takeUntilDestroyed(this.destroyRef)) + .subscribe((data: { pageData: ProductsPageData }) => { + this.products = data.pageData.products; + this.productsCount = data.pageData.count; + //this.title = 'Fleurs CBD'; + this.title = data.pageData.products[0].productCategories[0]!.name; + this.description = data.pageData.products[0].productCategories[0]!.description; + this.titleService.setTitle(this.title); + console.log(data.pageData); + console.log(this.products); + }); } ngOnDestroy() { this._data.unsubscribe(); } - } diff --git a/src/app/components/profile/profile.component.ts b/src/app/components/profile/profile.component.ts index 7f87ff0..512bf6b 100644 --- a/src/app/components/profile/profile.component.ts +++ b/src/app/components/profile/profile.component.ts @@ -13,15 +13,10 @@ import { UserService } from '@services'; import { ListErrorsComponent } from '@components/shared'; @Component({ - standalone: true, - imports: [ - RouterLink, - MatButtonModule, MatCardModule, MatDividerModule, MatIconModule, - ListErrorsComponent - ], + imports: [RouterLink, MatButtonModule, MatCardModule, MatDividerModule, MatIconModule, ListErrorsComponent], selector: 'app-profile', templateUrl: './profile.component.html', - styleUrl: './profile.component.scss' + styleUrl: './profile.component.scss', }) export class ProfileComponent implements OnInit, OnDestroy { private _user: Subscription = new Subscription(); @@ -33,8 +28,8 @@ export class ProfileComponent implements OnInit, OnDestroy { constructor( private titleService: Title, - private userService: UserService - ) { } + private userService: UserService, + ) {} ngOnInit() { this.titleService.setTitle(`Ad Astra - ${this.title}`); @@ -49,5 +44,4 @@ export class ProfileComponent implements OnInit, OnDestroy { ngOnDestroy() { this._user.unsubscribe(); } - } diff --git a/src/app/components/qcm/qcm.component.ts b/src/app/components/qcm/qcm.component.ts index c096253..6f1b85d 100644 --- a/src/app/components/qcm/qcm.component.ts +++ b/src/app/components/qcm/qcm.component.ts @@ -1,5 +1,5 @@ import { Component, DestroyRef, inject, OnInit, OnDestroy } from '@angular/core'; -import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { /*FormControl,*/ FormGroup, FormBuilder, FormArray, FormsModule, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute } from '@angular/router'; import { MatButtonModule } from '@angular/material/button'; @@ -22,16 +22,22 @@ import data from 'src/qcm-bpa.json'; @Component({ selector: 'app-qcm', - standalone: true, imports: [ - FormsModule, ReactiveFormsModule, - MatButtonModule, MatCardModule, MatDividerModule, MatExpansionModule, - MatIconModule, MatMenuModule, MatProgressBarModule, MatRadioModule, + FormsModule, + ReactiveFormsModule, + MatButtonModule, + MatCardModule, + MatDividerModule, + MatExpansionModule, + MatIconModule, + MatMenuModule, + MatProgressBarModule, + MatRadioModule, MatSelectModule, - ListErrorsComponent + ListErrorsComponent, ], templateUrl: './qcm.component.html', - styleUrl: './qcm.component.scss' + styleUrl: './qcm.component.scss', }) export class QcmComponent implements OnInit, OnDestroy { private _currentUser: Subscription = new Subscription(); @@ -53,17 +59,17 @@ export class QcmComponent implements OnInit, OnDestroy { public totalAnswer = 0; public timeProgress = 0; public timeProgressColor = 'primary'; - public timeMax = (60*45); + public timeMax = 60 * 45; constructor( private route: ActivatedRoute, private fb: FormBuilder, private _qcmService: QcmService, private _userService: UserService, - public menuItems: MenuItems + public menuItems: MenuItems, ) { this.qcmForm = this.fb.group({ - questions: this.fb.array([]) + questions: this.fb.array([]), }); } @@ -87,9 +93,9 @@ export class QcmComponent implements OnInit, OnDestroy { this.subtitle = `Préparation au questionnaire du brevet ${this.qcm.name.toUpperCase()}`; } //console.log(this.title, this.qcm); - this.qcm.categories.forEach(category => { + this.qcm.categories.forEach((category) => { this.questionsCount += category.questions.length; - category.questions.forEach(question => { + category.questions.forEach((question) => { this.addQuestion(question); }); }); @@ -113,11 +119,14 @@ export class QcmComponent implements OnInit, OnDestroy { .pipe(take(this.timeMax)) .subscribe(() => { this.timeProgress++; - if (this.timeProgress > (this.timeMax/100*70) && this.timeProgress <= (this.timeMax/100*90)) { + if (this.timeProgress > (this.timeMax / 100) * 70 && this.timeProgress <= (this.timeMax / 100) * 90) { this.timeProgressColor = 'warning'; - } else if (this.timeProgress > (this.timeMax/100*90) && this.timeProgress <= (this.timeMax/100*98)) { + } else if ( + this.timeProgress > (this.timeMax / 100) * 90 && + this.timeProgress <= (this.timeMax / 100) * 98 + ) { this.timeProgressColor = 'danger'; - } else if (this.timeProgress > (this.timeMax/100*98)) { + } else if (this.timeProgress > (this.timeMax / 100) * 98) { this.timeProgressColor = 'purple'; } if (this.timeProgress >= this.timeMax) { @@ -130,7 +139,7 @@ export class QcmComponent implements OnInit, OnDestroy { addQuestion(question: QcmQuestion) { const item = this.fb.group({ id: [question.num], - choice: [''] + choice: [''], }); this.answers.push(QcmQuestionState.UNANSWERED); this.questions.push(item); @@ -145,19 +154,19 @@ export class QcmComponent implements OnInit, OnDestroy { if (this.timeProgress === 0) { this._starTimer(); } - this.qcm.categories[(category.num-1)].questions[(question.num-1)].choices.forEach(choice => { + this.qcm.categories[category.num - 1].questions[question.num - 1].choices.forEach((choice) => { if (choice.index === value) { if (choice.correct) { - this.answers[(question.num-1)] = QcmQuestionState.VALID; + this.answers[question.num - 1] = QcmQuestionState.VALID; console.log(`Réponse à la question ${question.num} de la catégorie ${category.num} : correcte`); } else { - this.answers[(question.num-1)] = QcmQuestionState.ERROR; + this.answers[question.num - 1] = QcmQuestionState.ERROR; console.log(`Réponse à la question ${question.num} de la catégorie ${category.num} : incorrecte`); } } }); this.totalAnswer++; - this.questions.controls[(question.num-1)].disable(); + this.questions.controls[question.num - 1].disable(); //console.log(this.questions.controls[(question.num-1)].disabled); } @@ -168,20 +177,21 @@ export class QcmComponent implements OnInit, OnDestroy { private _importChoices() { try { data.categories.forEach((category) => { - category.questions.forEach(question => { - this._qcmService.saveChoices(question) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe({ - next: (question) => { - console.log('question : ', question); - //console.log(`Le saut n°${jump.numero} a été ajouté !`, 'OK'); - }, - error: (err) => { - console.log('err : ', err); - //console.log(`Le saut n'a pas été ajouté !`, 'Error', err); - this.errors = err; - } - }); + category.questions.forEach((question) => { + this._qcmService + .saveChoices(question) + .pipe(takeUntilDestroyed(this.destroyRef)) + .subscribe({ + next: (question) => { + console.log('question : ', question); + //console.log(`Le saut n°${jump.numero} a été ajouté !`, 'OK'); + }, + error: (err) => { + console.log('err : ', err); + //console.log(`Le saut n'a pas été ajouté !`, 'Error', err); + this.errors = err; + }, + }); }); }); } catch (error) { @@ -193,7 +203,8 @@ export class QcmComponent implements OnInit, OnDestroy { try { data.categories.forEach((category) => { //Object.assign(this.jump, category); - this._qcmService.saveQuestions(category) + this._qcmService + .saveQuestions(category) .pipe(takeUntilDestroyed(this.destroyRef)) .subscribe({ next: (category) => { @@ -204,7 +215,7 @@ export class QcmComponent implements OnInit, OnDestroy { console.log('err : ', err); //console.log(`Le saut n'a pas été ajouté !`, 'Error', err); this.errors = err; - } + }, }); }); } catch (error) { diff --git a/src/app/components/settings/credentials/credentials.component.ts b/src/app/components/settings/credentials/credentials.component.ts index a1a7dd9..f52d6cd 100644 --- a/src/app/components/settings/credentials/credentials.component.ts +++ b/src/app/components/settings/credentials/credentials.component.ts @@ -1,6 +1,15 @@ import { Component, DestroyRef, inject, OnInit, OnDestroy } from '@angular/core'; -import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; -import { AbstractControl, FormsModule, ReactiveFormsModule, UntypedFormBuilder, UntypedFormGroup, Validators, ValidatorFn, ValidationErrors } from '@angular/forms'; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; +import { + AbstractControl, + FormsModule, + ReactiveFormsModule, + UntypedFormBuilder, + UntypedFormGroup, + Validators, + ValidatorFn, + ValidationErrors, +} from '@angular/forms'; import { Router, RouterLink } from '@angular/router'; import { Title } from '@angular/platform-browser'; import { MatButtonModule } from '@angular/material/button'; @@ -17,14 +26,19 @@ import { ListErrorsComponent } from '@components/shared'; @Component({ selector: 'app-credentials', - standalone: true, imports: [ - RouterLink, FormsModule, ReactiveFormsModule, - MatButtonModule, MatIconModule, MatFormFieldModule, MatInputModule, MatDividerModule, - ListErrorsComponent + RouterLink, + FormsModule, + ReactiveFormsModule, + MatButtonModule, + MatIconModule, + MatFormFieldModule, + MatInputModule, + MatDividerModule, + ListErrorsComponent, ], templateUrl: './credentials.component.html', - styleUrl: './credentials.component.scss' + styleUrl: './credentials.component.scss', }) export class CredentialsComponent implements OnInit, OnDestroy { private _user: Subscription = new Subscription(); @@ -42,12 +56,15 @@ export class CredentialsComponent implements OnInit, OnDestroy { private router: Router, private titleService: Title, private userService: UserService, - private fb: UntypedFormBuilder + private fb: UntypedFormBuilder, ) { - this.credentialsForm = this.fb.group({ - password: ['', Validators.required], - confirmPassword: ['', Validators.required] - }, { validators: this.checkPasswords }); + this.credentialsForm = this.fb.group( + { + password: ['', Validators.required], + confirmPassword: ['', Validators.required], + }, + { validators: this.checkPasswords }, + ); } get f() { @@ -72,13 +89,15 @@ export class CredentialsComponent implements OnInit, OnDestroy { submitForm() { this.isSubmitting = true; this.updateUser(this.credentialsForm.value); - const user$: Observable<{ user: User }> = this.userService.update(this.user).pipe(takeUntilDestroyed(this.destroyRef)); + const user$: Observable<{ user: User }> = this.userService + .update(this.user) + .pipe(takeUntilDestroyed(this.destroyRef)); this._user = user$.subscribe({ next: ({ user }) => void this.router.navigateByUrl('/profile/' + user.username), error: (err) => { this.errors = err; this.isSubmitting = false; - } + }, }); } @@ -88,8 +107,7 @@ export class CredentialsComponent implements OnInit, OnDestroy { checkPasswords: ValidatorFn = (group: AbstractControl): ValidationErrors | null => { const pass = group.get('password')!.value; - const confirmPass = group.get('confirmPassword')!.value - return pass === confirmPass ? null : { notSame: true } - } - + const confirmPass = group.get('confirmPassword')!.value; + return pass === confirmPass ? null : { notSame: true }; + }; } diff --git a/src/app/components/settings/settings.component.ts b/src/app/components/settings/settings.component.ts index dd472ab..7cde6bc 100644 --- a/src/app/components/settings/settings.component.ts +++ b/src/app/components/settings/settings.component.ts @@ -1,5 +1,5 @@ import { Component, DestroyRef, inject, OnInit, OnDestroy } from '@angular/core'; -import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { FormsModule, ReactiveFormsModule, UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms'; import { Router, RouterLink } from '@angular/router'; import { Title } from '@angular/platform-browser'; @@ -18,14 +18,20 @@ import { ListErrorsComponent } from '@components/shared'; @Component({ selector: 'app-settings-page', - standalone: true, imports: [ - RouterLink, FormsModule, ReactiveFormsModule, - MatButtonModule, MatIconModule, MatDividerModule, MatFormFieldModule, MatInputModule, MatSelectModule, - ListErrorsComponent + RouterLink, + FormsModule, + ReactiveFormsModule, + MatButtonModule, + MatIconModule, + MatDividerModule, + MatFormFieldModule, + MatInputModule, + MatSelectModule, + ListErrorsComponent, ], styleUrl: './settings.component.scss', - templateUrl: './settings.component.html' + templateUrl: './settings.component.html', }) export class SettingsComponent implements OnInit, OnDestroy { private _user: Subscription = new Subscription(); @@ -42,21 +48,29 @@ export class SettingsComponent implements OnInit, OnDestroy { imgPath = '/assets/images/avatars/'; imgExt = '.jpg'; avatars = [ - `${this.imgPath}animal_001${this.imgExt}`, `${this.imgPath}animal_002${this.imgExt}`, - `${this.imgPath}animal_003${this.imgExt}`, `${this.imgPath}animal_004${this.imgExt}`, - `${this.imgPath}animal_005${this.imgExt}`, `${this.imgPath}animal_006${this.imgExt}`, - `${this.imgPath}animal_007${this.imgExt}`, `${this.imgPath}animal_008${this.imgExt}`, - `${this.imgPath}animal_009${this.imgExt}`, `${this.imgPath}animal_010${this.imgExt}`, - `${this.imgPath}animal_011${this.imgExt}`, `${this.imgPath}animal_012${this.imgExt}`, - `${this.imgPath}animal_013${this.imgExt}`, `${this.imgPath}animal_014${this.imgExt}`, - `${this.imgPath}animal_015${this.imgExt}`, `${this.imgPath}animal_016${this.imgExt}` + `${this.imgPath}animal_001${this.imgExt}`, + `${this.imgPath}animal_002${this.imgExt}`, + `${this.imgPath}animal_003${this.imgExt}`, + `${this.imgPath}animal_004${this.imgExt}`, + `${this.imgPath}animal_005${this.imgExt}`, + `${this.imgPath}animal_006${this.imgExt}`, + `${this.imgPath}animal_007${this.imgExt}`, + `${this.imgPath}animal_008${this.imgExt}`, + `${this.imgPath}animal_009${this.imgExt}`, + `${this.imgPath}animal_010${this.imgExt}`, + `${this.imgPath}animal_011${this.imgExt}`, + `${this.imgPath}animal_012${this.imgExt}`, + `${this.imgPath}animal_013${this.imgExt}`, + `${this.imgPath}animal_014${this.imgExt}`, + `${this.imgPath}animal_015${this.imgExt}`, + `${this.imgPath}animal_016${this.imgExt}`, ]; constructor( private router: Router, private titleService: Title, private userService: UserService, - private fb: UntypedFormBuilder + private fb: UntypedFormBuilder, ) { // create form group using the form builder this.settingsForm = this.fb.group({ @@ -65,7 +79,7 @@ export class SettingsComponent implements OnInit, OnDestroy { firstname: ['', Validators.required], lastname: ['', Validators.required], phone: ['', Validators.required], - image: '' + image: '', }); // Optional: subscribe to changes on the form : // this.settingsForm.valueChanges.pipe(this._scavenger.collect()).subscribe(values => this.updateUser(values)); @@ -110,18 +124,19 @@ export class SettingsComponent implements OnInit, OnDestroy { } this.updateUser(this.settingsForm.value); - const user$: Observable<{ user: User }> = this.userService.update(this.user).pipe(takeUntilDestroyed(this.destroyRef)); + const user$: Observable<{ user: User }> = this.userService + .update(this.user) + .pipe(takeUntilDestroyed(this.destroyRef)); this._user = user$.subscribe({ next: ({ user }) => void this.router.navigateByUrl('/profile/' + user.username), error: (err) => { this.errors = err; this.isSubmitting = false; - } + }, }); } updateUser(values: NonNullable) { Object.assign(this.user, values); } - } diff --git a/src/app/components/shared/card-container/card-container.component.ts b/src/app/components/shared/card-container/card-container.component.ts index 37f33d3..5d43303 100644 --- a/src/app/components/shared/card-container/card-container.component.ts +++ b/src/app/components/shared/card-container/card-container.component.ts @@ -1,5 +1,5 @@ import { Component, Input } from '@angular/core'; -import { NgForOf, NgIf } from "@angular/common"; +import { NgForOf, NgIf } from '@angular/common'; import { MatCardModule } from '@angular/material/card'; import { CardColors } from 'src/app/core'; @@ -7,12 +7,11 @@ import { CardColors } from 'src/app/core'; @Component({ selector: 'app-card-container', templateUrl: './card-container.component.html', - standalone: true, - imports: [NgIf, NgForOf, MatCardModule] + imports: [NgIf, NgForOf, MatCardModule], }) export class CardContainerComponent { errorList: string[] = []; @Input() colors: CardColors = { background: 'bg-megna', text: 'text-bg-primary' }; @Input() title: string = 'Title'; @Input() subtitle: string = 'Subtitle'; -} \ No newline at end of file +} diff --git a/src/app/components/shared/dashboard-components/aeronefs-bar/aeronefs-bar.component.ts b/src/app/components/shared/dashboard-components/aeronefs-bar/aeronefs-bar.component.ts index adc8d60..d8671d6 100755 --- a/src/app/components/shared/dashboard-components/aeronefs-bar/aeronefs-bar.component.ts +++ b/src/app/components/shared/dashboard-components/aeronefs-bar/aeronefs-bar.component.ts @@ -1,95 +1,104 @@ -import { Component, DestroyRef, inject, OnInit, OnDestroy } from '@angular/core'; -import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatDividerModule } from '@angular/material/divider'; -import { MatExpansionModule } from '@angular/material/expansion'; -import { MatIconModule } from '@angular/material/icon'; -import { MatMenuModule } from '@angular/material/menu'; -import { Observable, Subscription } from 'rxjs'; - -import { MenuItems } from '@components/shared'; -import { BarHorizontalChartComponent } from '@components/shared/helpers-chart'; -import { HistoryTableComponent } from '@components/shared/helpers-jump'; -import { UtilitiesService, AeronefsService } from '@services'; -import { AeronefByImat, AeronefByYear } from '@models'; - -@Component({ - selector: 'app-aeronefs-bar', - standalone: true, - imports: [ - MatButtonModule, MatCardModule, MatDividerModule, - MatExpansionModule, MatIconModule, MatMenuModule, - BarHorizontalChartComponent, HistoryTableComponent - ], - templateUrl: './aeronefs-bar.component.html' -}) -export class AeronefsBarComponent implements OnInit, OnDestroy { - private _aeronefByImat: Subscription = new Subscription(); - private _aeronefByYear: Subscription = new Subscription(); - private _aeronefsByImat!: Array; - private _aeronefsByYear!: Array; - public title: string = 'Aéronefs'; - public subtitle: string = 'Nombre total de sauts par aéronef'; - public seriesHeader: string[] = []; - public seriesName: string[] = []; - public seriesValue: number[] = []; - public seriesRow: Array> = []; - public seriesColor: { - backgroundColor: string[], - borderColor: string[] - } = { - backgroundColor: this._utilitiesService.getSeriesColors(0.8, 'all'), - borderColor: this._utilitiesService.getSeriesColors(1, 'all') - }; - public seriesColorClass: string[] = this._utilitiesService.getChartColors(); - public displayCharts = false; - public destroyRef = inject(DestroyRef); - - constructor( - private _aeronefsService: AeronefsService, - private _utilitiesService: UtilitiesService, - public menuItems: MenuItems - ) { } - - ngOnInit() { - this._loadAeronefByImat(); - } - - ngOnDestroy() { - this._aeronefByImat.unsubscribe(); - this._aeronefByYear.unsubscribe(); - } - - private _loadAeronefByImat(): void { - const aeronefs$: Observable> = this._aeronefsService.getAllByImat().pipe(takeUntilDestroyed(this.destroyRef)); - this._aeronefByImat = aeronefs$.subscribe((aggregate: Array) => { - this._aeronefsByImat = aggregate.map((row: AeronefByImat) => { - //this.chartConfig.barChartData.labels!.push(`${row.aeronef} ${row.imat}`); - this.seriesName.push(`${row.aeronef} ${row.imat}`); - this.seriesValue.push(row.count); - return row; - }); - this._loadAeronefByYear(); - }); - } - - private _loadAeronefByYear(): void { - this.seriesHeader = ['2018', '2019', '2020', '2021', '2022', '2023', '2024']; - const values: Array = this.seriesHeader.map(() => 0); - this.seriesName.forEach(() => { - this.seriesRow.push([...values]); - }); - const dropzones$: Observable> = this._aeronefsService.getAllByImatByYear().pipe(takeUntilDestroyed(this.destroyRef)); - this._aeronefByYear = dropzones$.subscribe((aggregate: Array) => { - this._aeronefsByYear = aggregate.map((row: AeronefByYear) => { - const aeronef: string = row.aeronef; - const imat: string = row.imat; - const year: string = row.year.toString(); - this.seriesRow[this.seriesName.indexOf(`${aeronef} ${imat}`)][this.seriesHeader.indexOf(year)] = row.count; - return row; - }); - this.displayCharts = true; - }); - } -} +import { Component, DestroyRef, inject, OnInit, OnDestroy } from '@angular/core'; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCardModule } from '@angular/material/card'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatExpansionModule } from '@angular/material/expansion'; +import { MatIconModule } from '@angular/material/icon'; +import { MatMenuModule } from '@angular/material/menu'; +import { Observable, Subscription } from 'rxjs'; + +import { MenuItems } from '@components/shared'; +import { BarHorizontalChartComponent } from '@components/shared/helpers-chart'; +import { HistoryTableComponent } from '@components/shared/helpers-jump'; +import { UtilitiesService, AeronefsService } from '@services'; +import { AeronefByImat, AeronefByYear } from '@models'; + +@Component({ + selector: 'app-aeronefs-bar', + imports: [ + MatButtonModule, + MatCardModule, + MatDividerModule, + MatExpansionModule, + MatIconModule, + MatMenuModule, + BarHorizontalChartComponent, + HistoryTableComponent, + ], + templateUrl: './aeronefs-bar.component.html', +}) +export class AeronefsBarComponent implements OnInit, OnDestroy { + private _aeronefByImat: Subscription = new Subscription(); + private _aeronefByYear: Subscription = new Subscription(); + private _aeronefsByImat!: Array; + private _aeronefsByYear!: Array; + public title: string = 'Aéronefs'; + public subtitle: string = 'Nombre total de sauts par aéronef'; + public seriesHeader: string[] = []; + public seriesName: string[] = []; + public seriesValue: number[] = []; + public seriesRow: Array> = []; + public seriesColor: { + backgroundColor: string[]; + borderColor: string[]; + } = { + backgroundColor: this._utilitiesService.getSeriesColors(0.8, 'all'), + borderColor: this._utilitiesService.getSeriesColors(1, 'all'), + }; + public seriesColorClass: string[] = this._utilitiesService.getChartColors(); + public displayCharts = false; + public destroyRef = inject(DestroyRef); + + constructor( + private _aeronefsService: AeronefsService, + private _utilitiesService: UtilitiesService, + public menuItems: MenuItems, + ) {} + + ngOnInit() { + this._loadAeronefByImat(); + } + + ngOnDestroy() { + this._aeronefByImat.unsubscribe(); + this._aeronefByYear.unsubscribe(); + } + + private _loadAeronefByImat(): void { + const aeronefs$: Observable> = this._aeronefsService + .getAllByImat() + .pipe(takeUntilDestroyed(this.destroyRef)); + this._aeronefByImat = aeronefs$.subscribe((aggregate: Array) => { + this._aeronefsByImat = aggregate.map((row: AeronefByImat) => { + //this.chartConfig.barChartData.labels!.push(`${row.aeronef} ${row.imat}`); + this.seriesName.push(`${row.aeronef} ${row.imat}`); + this.seriesValue.push(row.count); + return row; + }); + this._loadAeronefByYear(); + }); + } + + private _loadAeronefByYear(): void { + this.seriesHeader = ['2018', '2019', '2020', '2021', '2022', '2023', '2024']; + const values: Array = this.seriesHeader.map(() => 0); + this.seriesName.forEach(() => { + this.seriesRow.push([...values]); + }); + const dropzones$: Observable> = this._aeronefsService + .getAllByImatByYear() + .pipe(takeUntilDestroyed(this.destroyRef)); + this._aeronefByYear = dropzones$.subscribe((aggregate: Array) => { + this._aeronefsByYear = aggregate.map((row: AeronefByYear) => { + const aeronef: string = row.aeronef; + const imat: string = row.imat; + const year: string = row.year.toString(); + this.seriesRow[this.seriesName.indexOf(`${aeronef} ${imat}`)][this.seriesHeader.indexOf(year)] = + row.count; + return row; + }); + this.displayCharts = true; + }); + } +} diff --git a/src/app/components/shared/dashboard-components/aeronefs-pie/aeronefs-pie.component.ts b/src/app/components/shared/dashboard-components/aeronefs-pie/aeronefs-pie.component.ts index 6aae2d3..35f0bb5 100755 --- a/src/app/components/shared/dashboard-components/aeronefs-pie/aeronefs-pie.component.ts +++ b/src/app/components/shared/dashboard-components/aeronefs-pie/aeronefs-pie.component.ts @@ -1,93 +1,103 @@ -import { Component, DestroyRef, inject, OnInit, OnDestroy } from '@angular/core'; -import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; -import { MatBadgeModule } from '@angular/material/badge'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatDividerModule } from '@angular/material/divider'; -import { MatExpansionModule } from '@angular/material/expansion'; -import { MatIconModule } from '@angular/material/icon'; -import { MatMenuModule } from '@angular/material/menu'; -import { Observable, Subscription } from 'rxjs'; - -import { MenuItems } from '@components/shared'; -import { HistoryTableComponent } from '@components/shared/helpers-jump'; -import { PieChartComponent } from '@components/shared/helpers-chart'; -import { UtilitiesService, AeronefsService } from '@services'; -import { AeronefByImat, AeronefByYear } from '@models'; - -@Component({ - selector: 'app-aeronefs-pie', - standalone: true, - imports: [ - MatBadgeModule, MatButtonModule, MatCardModule, MatDividerModule, - MatExpansionModule, MatIconModule, MatMenuModule, - HistoryTableComponent, PieChartComponent - ], - templateUrl: './aeronefs-pie.component.html' -}) -export class AeronefsPieComponent implements OnInit, OnDestroy { - private _aeronefByImat: Subscription = new Subscription(); - private _aeronefByYear: Subscription = new Subscription(); - private _aeronefsByImat!: Array; - private _aeronefsByYear!: Array; - public title: string = 'Aéronefs'; - public subtitle: string = 'Nombre total de sauts par aéronef'; - public seriesHeader: string[] = []; - public seriesName: string[] = []; - public seriesValue: number[] = []; - public seriesRow: Array> = []; - public seriesColor: { - backgroundColor: string[], - borderColor: string[] - } = { - backgroundColor: this._utilitiesService.getSeriesColors(0.8, 'all'), - borderColor: this._utilitiesService.getSeriesColors(1, 'all') - }; - public seriesColorClass: string[] = this._utilitiesService.getChartColors(); - public destroyRef = inject(DestroyRef); - - constructor( - private _aeronefsService: AeronefsService, - private _utilitiesService: UtilitiesService, - public menuItems: MenuItems - ) { } - - ngOnInit() { - this._loadAeronefByImat(); - } - - ngOnDestroy() { - this._aeronefByImat.unsubscribe(); - this._aeronefByYear.unsubscribe(); - } - - private _loadAeronefByImat(): void { - const aeronefs$: Observable> = this._aeronefsService.getAllByImat().pipe(takeUntilDestroyed(this.destroyRef)); - this._aeronefByImat = aeronefs$.subscribe((aggregate: Array) => { - this._aeronefsByImat = aggregate.map((row: AeronefByImat) => { - this.seriesName.push(`${row.aeronef} ${row.imat}`); - this.seriesValue.push(row.count); - return row; - }); - this._loadAeronefByYear(); - }); - } - - private _loadAeronefByYear(): void { - this.seriesHeader = ['2018', '2019', '2020', '2021', '2022', '2023', '2024']; - const values: Array = this.seriesHeader.map(() => 0); - this.seriesName.forEach(() => { - this.seriesRow.push([...values]); - }); - const dropzones$: Observable> = this._aeronefsService.getAllByImatByYear().pipe(takeUntilDestroyed(this.destroyRef)); - this._aeronefByYear = dropzones$.subscribe((aggregate: Array) => { - this._aeronefsByYear = aggregate.map((row: AeronefByYear) => { - const aeronef: string = row.aeronef; - const imat: string = row.imat; - const year: string = row.year.toString(); - this.seriesRow[this.seriesName.indexOf(`${aeronef} ${imat}`)][this.seriesHeader.indexOf(year)] = row.count; - return row; - }); - }); - } -} +import { Component, DestroyRef, inject, OnInit, OnDestroy } from '@angular/core'; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; +import { MatBadgeModule } from '@angular/material/badge'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCardModule } from '@angular/material/card'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatExpansionModule } from '@angular/material/expansion'; +import { MatIconModule } from '@angular/material/icon'; +import { MatMenuModule } from '@angular/material/menu'; +import { Observable, Subscription } from 'rxjs'; + +import { MenuItems } from '@components/shared'; +import { HistoryTableComponent } from '@components/shared/helpers-jump'; +import { PieChartComponent } from '@components/shared/helpers-chart'; +import { UtilitiesService, AeronefsService } from '@services'; +import { AeronefByImat, AeronefByYear } from '@models'; + +@Component({ + selector: 'app-aeronefs-pie', + imports: [ + MatBadgeModule, + MatButtonModule, + MatCardModule, + MatDividerModule, + MatExpansionModule, + MatIconModule, + MatMenuModule, + HistoryTableComponent, + PieChartComponent, + ], + templateUrl: './aeronefs-pie.component.html', +}) +export class AeronefsPieComponent implements OnInit, OnDestroy { + private _aeronefByImat: Subscription = new Subscription(); + private _aeronefByYear: Subscription = new Subscription(); + private _aeronefsByImat!: Array; + private _aeronefsByYear!: Array; + public title: string = 'Aéronefs'; + public subtitle: string = 'Nombre total de sauts par aéronef'; + public seriesHeader: string[] = []; + public seriesName: string[] = []; + public seriesValue: number[] = []; + public seriesRow: Array> = []; + public seriesColor: { + backgroundColor: string[]; + borderColor: string[]; + } = { + backgroundColor: this._utilitiesService.getSeriesColors(0.8, 'all'), + borderColor: this._utilitiesService.getSeriesColors(1, 'all'), + }; + public seriesColorClass: string[] = this._utilitiesService.getChartColors(); + public destroyRef = inject(DestroyRef); + + constructor( + private _aeronefsService: AeronefsService, + private _utilitiesService: UtilitiesService, + public menuItems: MenuItems, + ) {} + + ngOnInit() { + this._loadAeronefByImat(); + } + + ngOnDestroy() { + this._aeronefByImat.unsubscribe(); + this._aeronefByYear.unsubscribe(); + } + + private _loadAeronefByImat(): void { + const aeronefs$: Observable> = this._aeronefsService + .getAllByImat() + .pipe(takeUntilDestroyed(this.destroyRef)); + this._aeronefByImat = aeronefs$.subscribe((aggregate: Array) => { + this._aeronefsByImat = aggregate.map((row: AeronefByImat) => { + this.seriesName.push(`${row.aeronef} ${row.imat}`); + this.seriesValue.push(row.count); + return row; + }); + this._loadAeronefByYear(); + }); + } + + private _loadAeronefByYear(): void { + this.seriesHeader = ['2018', '2019', '2020', '2021', '2022', '2023', '2024']; + const values: Array = this.seriesHeader.map(() => 0); + this.seriesName.forEach(() => { + this.seriesRow.push([...values]); + }); + const dropzones$: Observable> = this._aeronefsService + .getAllByImatByYear() + .pipe(takeUntilDestroyed(this.destroyRef)); + this._aeronefByYear = dropzones$.subscribe((aggregate: Array) => { + this._aeronefsByYear = aggregate.map((row: AeronefByYear) => { + const aeronef: string = row.aeronef; + const imat: string = row.imat; + const year: string = row.year.toString(); + this.seriesRow[this.seriesName.indexOf(`${aeronef} ${imat}`)][this.seriesHeader.indexOf(year)] = + row.count; + return row; + }); + }); + } +} diff --git a/src/app/components/shared/dashboard-components/canopies-models/canopies-models.component.ts b/src/app/components/shared/dashboard-components/canopies-models/canopies-models.component.ts index 0dc7da6..84b83d4 100755 --- a/src/app/components/shared/dashboard-components/canopies-models/canopies-models.component.ts +++ b/src/app/components/shared/dashboard-components/canopies-models/canopies-models.component.ts @@ -1,92 +1,101 @@ -import { Component, DestroyRef, inject, OnInit, OnDestroy} from '@angular/core'; -import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatDividerModule } from '@angular/material/divider'; -import { MatExpansionModule } from '@angular/material/expansion'; -import { MatIconModule } from '@angular/material/icon'; -import { MatMenuModule } from '@angular/material/menu'; -import { Observable, Subscription } from 'rxjs'; - -import { MenuItems } from '@components/shared'; -import { PieChartComponent } from '@components/shared/helpers-chart'; -import { HistoryTableComponent } from '@components/shared/helpers-jump'; -import { UtilitiesService, CanopiesService } from '@services'; -import { CanopyModelBySize, CanopyModelByYear } from '@models'; - -@Component({ - selector: 'app-canopies-models', - standalone: true, - imports: [ - MatButtonModule, MatCardModule, MatDividerModule, - MatExpansionModule, MatIconModule, MatMenuModule, - PieChartComponent, HistoryTableComponent - ], - templateUrl: './canopies-models.component.html' -}) -export class CanopiesModelsComponent implements OnInit, OnDestroy { - private _canopyBySize: Subscription = new Subscription(); - private _canopyByYear: Subscription = new Subscription(); - private _canopiesBySize!: Array; - private _canopiesByYear!: Array; - public title: string = 'Modèles de voile'; - public subtitle: string = 'Nombre total de sauts par modèle'; - public seriesHeader: string[] = []; - public seriesName: string[] = []; - public seriesValue: number[] = []; - public seriesRow: Array> = []; - public seriesColor: { - backgroundColor: string[], - borderColor: string[] - } = { - backgroundColor: this._utilitiesService.getSeriesColors(0.8, 'all'), - borderColor: this._utilitiesService.getSeriesColors(1, 'all') - }; - public seriesColorClass: string[] = this._utilitiesService.getChartColors(); - public destroyRef = inject(DestroyRef); - - constructor( - private _canopiesService: CanopiesService, - private _utilitiesService: UtilitiesService, - public menuItems: MenuItems - ) { } - - ngOnInit() { - this._loadCanopyModelBySize(); - } - - ngOnDestroy() { - this._canopyBySize.unsubscribe(); - this._canopyByYear.unsubscribe(); - } - - private _loadCanopyModelBySize(): void { - const canopies$: Observable> = this._canopiesService.getAllBySizeByModel().pipe(takeUntilDestroyed(this.destroyRef)); - this._canopyBySize = canopies$.subscribe((aggregate: Array) => { - this._canopiesBySize = aggregate.map((row: CanopyModelBySize) => { - this.seriesName.push(`${row.taille.toString()} - ${row.voile}`); - this.seriesValue.push(row.count); - return row; - }); - this._loadCanopyModelByYear(); - }); - } - - private _loadCanopyModelByYear(): void { - this.seriesHeader = ['2018', '2019', '2020', '2021', '2022', '2023', '2024']; - const values: Array = this.seriesHeader.map(() => 0); - this.seriesName.forEach(() => { - this.seriesRow.push([...values]); - }); - const dropzones$: Observable> = this._canopiesService.getAllBySizeByModelByYear().pipe(takeUntilDestroyed(this.destroyRef)); - this._canopyByYear = dropzones$.subscribe((aggregate: Array) => { - this._canopiesByYear = aggregate.map((row: CanopyModelByYear) => { - const voile: string = row.voile; - const taille: string = row.taille.toString(); - const year: string = row.year.toString(); - this.seriesRow[this.seriesName.indexOf(`${taille} - ${voile}`)][this.seriesHeader.indexOf(year)] = row.count; - return row; - }); - }); - } -} +import { Component, DestroyRef, inject, OnInit, OnDestroy } from '@angular/core'; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCardModule } from '@angular/material/card'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatExpansionModule } from '@angular/material/expansion'; +import { MatIconModule } from '@angular/material/icon'; +import { MatMenuModule } from '@angular/material/menu'; +import { Observable, Subscription } from 'rxjs'; + +import { MenuItems } from '@components/shared'; +import { PieChartComponent } from '@components/shared/helpers-chart'; +import { HistoryTableComponent } from '@components/shared/helpers-jump'; +import { UtilitiesService, CanopiesService } from '@services'; +import { CanopyModelBySize, CanopyModelByYear } from '@models'; + +@Component({ + selector: 'app-canopies-models', + imports: [ + MatButtonModule, + MatCardModule, + MatDividerModule, + MatExpansionModule, + MatIconModule, + MatMenuModule, + PieChartComponent, + HistoryTableComponent, + ], + templateUrl: './canopies-models.component.html', +}) +export class CanopiesModelsComponent implements OnInit, OnDestroy { + private _canopyBySize: Subscription = new Subscription(); + private _canopyByYear: Subscription = new Subscription(); + private _canopiesBySize!: Array; + private _canopiesByYear!: Array; + public title: string = 'Modèles de voile'; + public subtitle: string = 'Nombre total de sauts par modèle'; + public seriesHeader: string[] = []; + public seriesName: string[] = []; + public seriesValue: number[] = []; + public seriesRow: Array> = []; + public seriesColor: { + backgroundColor: string[]; + borderColor: string[]; + } = { + backgroundColor: this._utilitiesService.getSeriesColors(0.8, 'all'), + borderColor: this._utilitiesService.getSeriesColors(1, 'all'), + }; + public seriesColorClass: string[] = this._utilitiesService.getChartColors(); + public destroyRef = inject(DestroyRef); + + constructor( + private _canopiesService: CanopiesService, + private _utilitiesService: UtilitiesService, + public menuItems: MenuItems, + ) {} + + ngOnInit() { + this._loadCanopyModelBySize(); + } + + ngOnDestroy() { + this._canopyBySize.unsubscribe(); + this._canopyByYear.unsubscribe(); + } + + private _loadCanopyModelBySize(): void { + const canopies$: Observable> = this._canopiesService + .getAllBySizeByModel() + .pipe(takeUntilDestroyed(this.destroyRef)); + this._canopyBySize = canopies$.subscribe((aggregate: Array) => { + this._canopiesBySize = aggregate.map((row: CanopyModelBySize) => { + this.seriesName.push(`${row.taille.toString()} - ${row.voile}`); + this.seriesValue.push(row.count); + return row; + }); + this._loadCanopyModelByYear(); + }); + } + + private _loadCanopyModelByYear(): void { + this.seriesHeader = ['2018', '2019', '2020', '2021', '2022', '2023', '2024']; + const values: Array = this.seriesHeader.map(() => 0); + this.seriesName.forEach(() => { + this.seriesRow.push([...values]); + }); + const dropzones$: Observable> = this._canopiesService + .getAllBySizeByModelByYear() + .pipe(takeUntilDestroyed(this.destroyRef)); + this._canopyByYear = dropzones$.subscribe((aggregate: Array) => { + this._canopiesByYear = aggregate.map((row: CanopyModelByYear) => { + const voile: string = row.voile; + const taille: string = row.taille.toString(); + const year: string = row.year.toString(); + this.seriesRow[this.seriesName.indexOf(`${taille} - ${voile}`)][this.seriesHeader.indexOf(year)] = + row.count; + return row; + }); + }); + } +} diff --git a/src/app/components/shared/dashboard-components/canopies-sizes/canopies-sizes.component.ts b/src/app/components/shared/dashboard-components/canopies-sizes/canopies-sizes.component.ts index 7aefa95..069a8c2 100755 --- a/src/app/components/shared/dashboard-components/canopies-sizes/canopies-sizes.component.ts +++ b/src/app/components/shared/dashboard-components/canopies-sizes/canopies-sizes.component.ts @@ -1,92 +1,100 @@ -import { Component, DestroyRef, inject, OnInit, OnDestroy } from '@angular/core'; -import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatDividerModule } from '@angular/material/divider'; -import { MatExpansionModule } from '@angular/material/expansion'; -import { MatIconModule } from '@angular/material/icon'; -import { MatMenuModule } from '@angular/material/menu'; - -import { Observable, Subscription } from 'rxjs'; - -import { MenuItems } from '@components/shared'; -import { PieChartComponent } from '@components/shared/helpers-chart'; -import { HistoryTableComponent } from '@components/shared/helpers-jump'; -import { UtilitiesService, CanopiesService } from '@services'; -import { CanopyBySize, CanopyByYear } from '@models'; - -@Component({ - selector: 'app-canopies-sizes', - standalone: true, - imports: [ - MatButtonModule, MatCardModule, MatDividerModule, - MatExpansionModule, MatIconModule, MatMenuModule, - PieChartComponent, HistoryTableComponent - ], - templateUrl: './canopies-sizes.component.html' -}) -export class CanopiesSizesComponent implements OnInit, OnDestroy { - private _canopyBySize: Subscription = new Subscription(); - private _canopyByYear: Subscription = new Subscription(); - private _canopiesBySize!: Array; - private _canopiesByYear!: Array; - public title: string = 'Tailles de voile'; - public subtitle: string = 'Nombre total de sauts par taille'; - public seriesHeader: string[] = []; - public seriesName: string[] = []; - public seriesValue: number[] = []; - public seriesRow: Array> = []; - public seriesColor: { - backgroundColor: string[], - borderColor: string[] - } = { - backgroundColor: this._utilitiesService.getSeriesColors(0.8, 'all'), - borderColor: this._utilitiesService.getSeriesColors(1, 'all') - }; - public seriesColorClass: string[] = this._utilitiesService.getChartColors(); - public destroyRef = inject(DestroyRef); - - constructor( - private _canopiesService: CanopiesService, - private _utilitiesService: UtilitiesService, - public menuItems: MenuItems - ) { } - - ngOnInit() { - this._loadCanopyBySize(); - } - - ngOnDestroy() { - this._canopyBySize.unsubscribe(); - this._canopyByYear.unsubscribe(); - } - - private _loadCanopyBySize(): void { - const canopies$: Observable> = this._canopiesService.getAllBySize().pipe(takeUntilDestroyed(this.destroyRef)); - this._canopyBySize = canopies$.subscribe((aggregate: Array) => { - this._canopiesBySize = aggregate.map((row: CanopyBySize) => { - this.seriesName.push(row.taille.toString()); - this.seriesValue.push(row.count); - return row; - }); - this._loadCanopyByYear(); - }); - } - - private _loadCanopyByYear(): void { - this.seriesHeader = ['2018', '2019', '2020', '2021', '2022', '2023', '2024']; - const values: Array = this.seriesHeader.map(() => 0); - this.seriesName.forEach(() => { - this.seriesRow.push([...values]); - }); - const dropzones$: Observable> = this._canopiesService.getAllBySizeByYear().pipe(takeUntilDestroyed(this.destroyRef)); - this._canopyByYear = dropzones$.subscribe((aggregate: Array) => { - this._canopiesByYear = aggregate.map((row: CanopyByYear) => { - const taille: string = row.taille.toString(); - const year: string = row.year.toString(); - this.seriesRow[this.seriesName.indexOf(taille)][this.seriesHeader.indexOf(year)] = row.count; - return row; - }); - }); - } -} +import { Component, DestroyRef, inject, OnInit, OnDestroy } from '@angular/core'; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCardModule } from '@angular/material/card'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatExpansionModule } from '@angular/material/expansion'; +import { MatIconModule } from '@angular/material/icon'; +import { MatMenuModule } from '@angular/material/menu'; + +import { Observable, Subscription } from 'rxjs'; + +import { MenuItems } from '@components/shared'; +import { PieChartComponent } from '@components/shared/helpers-chart'; +import { HistoryTableComponent } from '@components/shared/helpers-jump'; +import { UtilitiesService, CanopiesService } from '@services'; +import { CanopyBySize, CanopyByYear } from '@models'; + +@Component({ + selector: 'app-canopies-sizes', + imports: [ + MatButtonModule, + MatCardModule, + MatDividerModule, + MatExpansionModule, + MatIconModule, + MatMenuModule, + PieChartComponent, + HistoryTableComponent, + ], + templateUrl: './canopies-sizes.component.html', +}) +export class CanopiesSizesComponent implements OnInit, OnDestroy { + private _canopyBySize: Subscription = new Subscription(); + private _canopyByYear: Subscription = new Subscription(); + private _canopiesBySize!: Array; + private _canopiesByYear!: Array; + public title: string = 'Tailles de voile'; + public subtitle: string = 'Nombre total de sauts par taille'; + public seriesHeader: string[] = []; + public seriesName: string[] = []; + public seriesValue: number[] = []; + public seriesRow: Array> = []; + public seriesColor: { + backgroundColor: string[]; + borderColor: string[]; + } = { + backgroundColor: this._utilitiesService.getSeriesColors(0.8, 'all'), + borderColor: this._utilitiesService.getSeriesColors(1, 'all'), + }; + public seriesColorClass: string[] = this._utilitiesService.getChartColors(); + public destroyRef = inject(DestroyRef); + + constructor( + private _canopiesService: CanopiesService, + private _utilitiesService: UtilitiesService, + public menuItems: MenuItems, + ) {} + + ngOnInit() { + this._loadCanopyBySize(); + } + + ngOnDestroy() { + this._canopyBySize.unsubscribe(); + this._canopyByYear.unsubscribe(); + } + + private _loadCanopyBySize(): void { + const canopies$: Observable> = this._canopiesService + .getAllBySize() + .pipe(takeUntilDestroyed(this.destroyRef)); + this._canopyBySize = canopies$.subscribe((aggregate: Array) => { + this._canopiesBySize = aggregate.map((row: CanopyBySize) => { + this.seriesName.push(row.taille.toString()); + this.seriesValue.push(row.count); + return row; + }); + this._loadCanopyByYear(); + }); + } + + private _loadCanopyByYear(): void { + this.seriesHeader = ['2018', '2019', '2020', '2021', '2022', '2023', '2024']; + const values: Array = this.seriesHeader.map(() => 0); + this.seriesName.forEach(() => { + this.seriesRow.push([...values]); + }); + const dropzones$: Observable> = this._canopiesService + .getAllBySizeByYear() + .pipe(takeUntilDestroyed(this.destroyRef)); + this._canopyByYear = dropzones$.subscribe((aggregate: Array) => { + this._canopiesByYear = aggregate.map((row: CanopyByYear) => { + const taille: string = row.taille.toString(); + const year: string = row.year.toString(); + this.seriesRow[this.seriesName.indexOf(taille)][this.seriesHeader.indexOf(year)] = row.count; + return row; + }); + }); + } +} diff --git a/src/app/components/shared/dashboard-components/dropzones-bar/dropzones-bar.component.ts b/src/app/components/shared/dashboard-components/dropzones-bar/dropzones-bar.component.ts index 09466c8..3eaac05 100755 --- a/src/app/components/shared/dashboard-components/dropzones-bar/dropzones-bar.component.ts +++ b/src/app/components/shared/dashboard-components/dropzones-bar/dropzones-bar.component.ts @@ -1,143 +1,161 @@ -import { Component, DestroyRef, inject, OnInit, OnDestroy } from '@angular/core'; -import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatDividerModule } from '@angular/material/divider'; -import { MatExpansionModule } from '@angular/material/expansion'; -import { MatIconModule } from '@angular/material/icon'; -import { MatMenuModule } from '@angular/material/menu'; -import { BaseChartDirective } from 'ng2-charts'; -import { ChartistModule, Configuration } from 'ng-chartist'; -import { AxisOptions, Label } from 'chartist'; -import { Observable, Subscription } from 'rxjs'; - -import { MenuItems } from '@components/shared'; -import { HistoryTableComponent } from '@components/shared/helpers-jump'; -import { UtilitiesService, DropZonesService } from '@services'; -import { DropZoneByOaci, DropZoneByYear } from '@models'; - -@Component({ - selector: 'app-dropzones-bar', - standalone: true, - imports: [ - MatButtonModule, MatCardModule, MatDividerModule, - MatExpansionModule, MatIconModule, MatMenuModule, - BaseChartDirective, ChartistModule, - HistoryTableComponent - ], - templateUrl: './dropzones-bar.component.html' -}) -export class DropzonesBarComponent implements OnInit, OnDestroy { - private _dropzoneByOaci: Subscription = new Subscription(); - private _dropzoneByYear: Subscription = new Subscription(); - private _dropzonesByOaci!: Array; - private _dropzonesByYear!: Array; - public title: string = 'Les dropzones'; - public subtitle: string = 'Nombre total de sauts par dropzone'; - public seriesHeader: string[] = []; - public seriesName: string[] = []; - public seriesValue: number[] = []; - public seriesRow: Array> = []; - public seriesColor: { - backgroundColor: string[], - borderColor: string[] - } = { - backgroundColor: this._utilitiesService.getSeriesColors(0.8, 'all'), - borderColor: this._utilitiesService.getSeriesColors(1, 'all') - }; - public seriesColorClass: string[] = this._utilitiesService.getChartColors(); - public displayCharts = false; - public barChartDropZones: Configuration = this._utilitiesService.getBarConfig(); - public destroyRef = inject(DestroyRef); - - constructor( - private _dropzonesService: DropZonesService, - private _utilitiesService: UtilitiesService, - public menuItems: MenuItems - ) { } - - ngOnInit() { - this._loadDropZoneByOaci(); - } - - ngOnDestroy() { - this._dropzoneByOaci.unsubscribe(); - this._dropzoneByYear.unsubscribe(); - } - - private _loadDropZoneByOaci(): void { - const dropzones$: Observable> = this._dropzonesService.getAllByOaci().pipe(takeUntilDestroyed(this.destroyRef)); - this._dropzoneByOaci = dropzones$.subscribe((aggregate: Array) => { - this._dropzonesByOaci = aggregate.map((row: DropZoneByOaci) => { - this.seriesName.push(`${row.oaci} - ${row.lieu}`); - this.seriesValue.push(row.count); - return row; - }); - this._loadDropZoneByYear(); - }); - } - - private _loadDropZoneByYear(): void { - this.seriesHeader = ['2018', '2019', '2020', '2021', '2022', '2023', '2024']; - const values: Array = this.seriesHeader.map(() => 0); - this.seriesName.forEach(() => { - this.seriesRow.push([...values]); - }); - const dropzones$: Observable> = this._dropzonesService.getAllByOaciByYear().pipe(takeUntilDestroyed(this.destroyRef)); - this._dropzoneByYear = dropzones$.subscribe((aggregate: Array) => { - this._dropzonesByYear = aggregate.map((row: DropZoneByYear) => { - const lieu: string = row.lieu; - const oaci: string = row.oaci; - const year: string = row.year.toString(); - this.seriesRow[this.seriesName.indexOf(`${oaci} - ${lieu}`)][this.seriesHeader.indexOf(year)] = row.count; - return row; - }); - const axisX: AxisOptions = { - labelInterpolationFnc: function(value: Label, index: number): string { - return index % 1 === 0 ? `${value.toString()}` : ''; - } - } - this.barChartDropZones = { - type: 'Bar', - data: { - 'labels': this.seriesHeader, - 'series': this.seriesRow - }, - options: { - seriesBarDistance: 15, - horizontalBars: false, - high: 180, - axisX: { - showGrid: false, - offset: 20 - }, - axisY: { - showGrid: true, - offset: 40 - }, - height: 300 - }, - responsiveOptions: [ - ['screen and (min-width: 1024px)', { - axisX: axisX - }], - ['screen and (min-width: 641px) and (max-width: 1024px)', { - seriesBarDistance: 7, - axisY: { - offset: 30 - }, - axisX: axisX - }], - ['screen and (max-width: 640px)', { - seriesBarDistance: 5, - axisY: { - offset: 20 - }, - axisX: axisX - }] - ] - }; - this.displayCharts = true; - }); - } -} +import { Component, DestroyRef, inject, OnInit, OnDestroy } from '@angular/core'; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCardModule } from '@angular/material/card'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatExpansionModule } from '@angular/material/expansion'; +import { MatIconModule } from '@angular/material/icon'; +import { MatMenuModule } from '@angular/material/menu'; +import { BaseChartDirective } from 'ng2-charts'; +import { ChartistModule, Configuration } from 'ng-chartist'; +import { AxisOptions, Label } from 'chartist'; +import { Observable, Subscription } from 'rxjs'; + +import { MenuItems } from '@components/shared'; +import { HistoryTableComponent } from '@components/shared/helpers-jump'; +import { UtilitiesService, DropZonesService } from '@services'; +import { DropZoneByOaci, DropZoneByYear } from '@models'; + +@Component({ + selector: 'app-dropzones-bar', + imports: [ + MatButtonModule, + MatCardModule, + MatDividerModule, + MatExpansionModule, + MatIconModule, + MatMenuModule, + BaseChartDirective, + ChartistModule, + HistoryTableComponent, + ], + templateUrl: './dropzones-bar.component.html', +}) +export class DropzonesBarComponent implements OnInit, OnDestroy { + private _dropzoneByOaci: Subscription = new Subscription(); + private _dropzoneByYear: Subscription = new Subscription(); + private _dropzonesByOaci!: Array; + private _dropzonesByYear!: Array; + public title: string = 'Les dropzones'; + public subtitle: string = 'Nombre total de sauts par dropzone'; + public seriesHeader: string[] = []; + public seriesName: string[] = []; + public seriesValue: number[] = []; + public seriesRow: Array> = []; + public seriesColor: { + backgroundColor: string[]; + borderColor: string[]; + } = { + backgroundColor: this._utilitiesService.getSeriesColors(0.8, 'all'), + borderColor: this._utilitiesService.getSeriesColors(1, 'all'), + }; + public seriesColorClass: string[] = this._utilitiesService.getChartColors(); + public displayCharts = false; + public barChartDropZones: Configuration = this._utilitiesService.getBarConfig(); + public destroyRef = inject(DestroyRef); + + constructor( + private _dropzonesService: DropZonesService, + private _utilitiesService: UtilitiesService, + public menuItems: MenuItems, + ) {} + + ngOnInit() { + this._loadDropZoneByOaci(); + } + + ngOnDestroy() { + this._dropzoneByOaci.unsubscribe(); + this._dropzoneByYear.unsubscribe(); + } + + private _loadDropZoneByOaci(): void { + const dropzones$: Observable> = this._dropzonesService + .getAllByOaci() + .pipe(takeUntilDestroyed(this.destroyRef)); + this._dropzoneByOaci = dropzones$.subscribe((aggregate: Array) => { + this._dropzonesByOaci = aggregate.map((row: DropZoneByOaci) => { + this.seriesName.push(`${row.oaci} - ${row.lieu}`); + this.seriesValue.push(row.count); + return row; + }); + this._loadDropZoneByYear(); + }); + } + + private _loadDropZoneByYear(): void { + this.seriesHeader = ['2018', '2019', '2020', '2021', '2022', '2023', '2024']; + const values: Array = this.seriesHeader.map(() => 0); + this.seriesName.forEach(() => { + this.seriesRow.push([...values]); + }); + const dropzones$: Observable> = this._dropzonesService + .getAllByOaciByYear() + .pipe(takeUntilDestroyed(this.destroyRef)); + this._dropzoneByYear = dropzones$.subscribe((aggregate: Array) => { + this._dropzonesByYear = aggregate.map((row: DropZoneByYear) => { + const lieu: string = row.lieu; + const oaci: string = row.oaci; + const year: string = row.year.toString(); + this.seriesRow[this.seriesName.indexOf(`${oaci} - ${lieu}`)][this.seriesHeader.indexOf(year)] = + row.count; + return row; + }); + const axisX: AxisOptions = { + labelInterpolationFnc: function (value: Label, index: number): string { + return index % 1 === 0 ? `${value.toString()}` : ''; + }, + }; + this.barChartDropZones = { + type: 'Bar', + data: { + labels: this.seriesHeader, + series: this.seriesRow, + }, + options: { + seriesBarDistance: 15, + horizontalBars: false, + high: 180, + axisX: { + showGrid: false, + offset: 20, + }, + axisY: { + showGrid: true, + offset: 40, + }, + height: 300, + }, + responsiveOptions: [ + [ + 'screen and (min-width: 1024px)', + { + axisX: axisX, + }, + ], + [ + 'screen and (min-width: 641px) and (max-width: 1024px)', + { + seriesBarDistance: 7, + axisY: { + offset: 30, + }, + axisX: axisX, + }, + ], + [ + 'screen and (max-width: 640px)', + { + seriesBarDistance: 5, + axisY: { + offset: 20, + }, + axisX: axisX, + }, + ], + ], + }; + this.displayCharts = true; + }); + } +} diff --git a/src/app/components/shared/dashboard-components/dropzones-pie/dropzones-pie.component.ts b/src/app/components/shared/dashboard-components/dropzones-pie/dropzones-pie.component.ts index 930d55d..6cdf310 100755 --- a/src/app/components/shared/dashboard-components/dropzones-pie/dropzones-pie.component.ts +++ b/src/app/components/shared/dashboard-components/dropzones-pie/dropzones-pie.component.ts @@ -1,93 +1,102 @@ -import { Component, DestroyRef, inject, OnInit, OnDestroy } from '@angular/core'; -import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatDividerModule } from '@angular/material/divider'; -import { MatExpansionModule } from '@angular/material/expansion'; -import { MatIconModule } from '@angular/material/icon'; -import { MatMenuModule } from '@angular/material/menu'; -//import { ChartConfiguration } from 'chart.js'; -import { Observable, Subscription } from 'rxjs'; - -import { MenuItems } from '@components/shared'; -import { PieChartComponent } from '@components/shared/helpers-chart'; -import { HistoryTableComponent } from '@components/shared/helpers-jump'; -import { UtilitiesService, DropZonesService } from '@services'; -import { DropZoneByOaci, DropZoneByYear } from '@models'; - -@Component({ - selector: 'app-dropzones-pie', - standalone: true, - imports: [ - MatButtonModule, MatCardModule, MatDividerModule, - MatExpansionModule, MatIconModule, MatMenuModule, - PieChartComponent, HistoryTableComponent - ], - templateUrl: './dropzones-pie.component.html' -}) -export class DropzonesPieComponent implements OnInit, OnDestroy { - private _dropzoneByOaci: Subscription = new Subscription(); - private _dropzoneByYear: Subscription = new Subscription(); - private _dropzonesByOaci!: Array; - private _dropzonesByYear!: Array; - public title: string = 'Les dropzones'; - public subtitle: string = 'Nombre total de sauts par dropzone'; - public seriesHeader: string[] = []; - public seriesName: string[] = []; - public seriesValue: number[] = []; - public seriesRow: Array> = []; - public seriesColor: { - backgroundColor: string[], - borderColor: string[] - } = { - backgroundColor: this._utilitiesService.getSeriesColors(0.8, 'all'), - borderColor: this._utilitiesService.getSeriesColors(1, 'all') - }; - public seriesColorClass: string[] = this._utilitiesService.getChartColors(); - public destroyRef = inject(DestroyRef); - - constructor( - private _dropzonesService: DropZonesService, - private _utilitiesService: UtilitiesService, - public menuItems: MenuItems - ) { } - - ngOnInit() { - this._loadDropZoneByOaci(); - } - - ngOnDestroy() { - this._dropzoneByOaci.unsubscribe(); - this._dropzoneByYear.unsubscribe(); - } - - private _loadDropZoneByOaci(): void { - const dropzones$: Observable> = this._dropzonesService.getAllByOaci().pipe(takeUntilDestroyed(this.destroyRef)); - this._dropzoneByOaci = dropzones$.subscribe((aggregate: Array) => { - this._dropzonesByOaci = aggregate.map((row: DropZoneByOaci) => { - this.seriesName.push(`${row.oaci} - ${row.lieu}`); - this.seriesValue.push(row.count); - return row; - }); - this._loadDropZoneByYear(); - }); - } - - private _loadDropZoneByYear(): void { - this.seriesHeader = ['2018', '2019', '2020', '2021', '2022', '2023', '2024']; - const values: Array = this.seriesHeader.map(() => 0); - this.seriesName.forEach(() => { - this.seriesRow.push([...values]); - }); - const dropzones$: Observable> = this._dropzonesService.getAllByOaciByYear().pipe(takeUntilDestroyed(this.destroyRef)); - this._dropzoneByYear = dropzones$.subscribe((aggregate: Array) => { - this._dropzonesByYear = aggregate.map((row: DropZoneByYear) => { - const lieu: string = row.lieu; - const oaci: string = row.oaci; - const year: string = row.year.toString(); - this.seriesRow[this.seriesName.indexOf(`${oaci} - ${lieu}`)][this.seriesHeader.indexOf(year)] = row.count; - return row; - }); - }); - } -} +import { Component, DestroyRef, inject, OnInit, OnDestroy } from '@angular/core'; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCardModule } from '@angular/material/card'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatExpansionModule } from '@angular/material/expansion'; +import { MatIconModule } from '@angular/material/icon'; +import { MatMenuModule } from '@angular/material/menu'; +//import { ChartConfiguration } from 'chart.js'; +import { Observable, Subscription } from 'rxjs'; + +import { MenuItems } from '@components/shared'; +import { PieChartComponent } from '@components/shared/helpers-chart'; +import { HistoryTableComponent } from '@components/shared/helpers-jump'; +import { UtilitiesService, DropZonesService } from '@services'; +import { DropZoneByOaci, DropZoneByYear } from '@models'; + +@Component({ + selector: 'app-dropzones-pie', + imports: [ + MatButtonModule, + MatCardModule, + MatDividerModule, + MatExpansionModule, + MatIconModule, + MatMenuModule, + PieChartComponent, + HistoryTableComponent, + ], + templateUrl: './dropzones-pie.component.html', +}) +export class DropzonesPieComponent implements OnInit, OnDestroy { + private _dropzoneByOaci: Subscription = new Subscription(); + private _dropzoneByYear: Subscription = new Subscription(); + private _dropzonesByOaci!: Array; + private _dropzonesByYear!: Array; + public title: string = 'Les dropzones'; + public subtitle: string = 'Nombre total de sauts par dropzone'; + public seriesHeader: string[] = []; + public seriesName: string[] = []; + public seriesValue: number[] = []; + public seriesRow: Array> = []; + public seriesColor: { + backgroundColor: string[]; + borderColor: string[]; + } = { + backgroundColor: this._utilitiesService.getSeriesColors(0.8, 'all'), + borderColor: this._utilitiesService.getSeriesColors(1, 'all'), + }; + public seriesColorClass: string[] = this._utilitiesService.getChartColors(); + public destroyRef = inject(DestroyRef); + + constructor( + private _dropzonesService: DropZonesService, + private _utilitiesService: UtilitiesService, + public menuItems: MenuItems, + ) {} + + ngOnInit() { + this._loadDropZoneByOaci(); + } + + ngOnDestroy() { + this._dropzoneByOaci.unsubscribe(); + this._dropzoneByYear.unsubscribe(); + } + + private _loadDropZoneByOaci(): void { + const dropzones$: Observable> = this._dropzonesService + .getAllByOaci() + .pipe(takeUntilDestroyed(this.destroyRef)); + this._dropzoneByOaci = dropzones$.subscribe((aggregate: Array) => { + this._dropzonesByOaci = aggregate.map((row: DropZoneByOaci) => { + this.seriesName.push(`${row.oaci} - ${row.lieu}`); + this.seriesValue.push(row.count); + return row; + }); + this._loadDropZoneByYear(); + }); + } + + private _loadDropZoneByYear(): void { + this.seriesHeader = ['2018', '2019', '2020', '2021', '2022', '2023', '2024']; + const values: Array = this.seriesHeader.map(() => 0); + this.seriesName.forEach(() => { + this.seriesRow.push([...values]); + }); + const dropzones$: Observable> = this._dropzonesService + .getAllByOaciByYear() + .pipe(takeUntilDestroyed(this.destroyRef)); + this._dropzoneByYear = dropzones$.subscribe((aggregate: Array) => { + this._dropzonesByYear = aggregate.map((row: DropZoneByYear) => { + const lieu: string = row.lieu; + const oaci: string = row.oaci; + const year: string = row.year.toString(); + this.seriesRow[this.seriesName.indexOf(`${oaci} - ${lieu}`)][this.seriesHeader.indexOf(year)] = + row.count; + return row; + }); + }); + } +} diff --git a/src/app/components/shared/dashboard-components/jumps-by-month/jumps-by-month.component.ts b/src/app/components/shared/dashboard-components/jumps-by-month/jumps-by-month.component.ts index 3152b74..ecadf28 100755 --- a/src/app/components/shared/dashboard-components/jumps-by-month/jumps-by-month.component.ts +++ b/src/app/components/shared/dashboard-components/jumps-by-month/jumps-by-month.component.ts @@ -1,172 +1,189 @@ -import { Component, DestroyRef, inject, OnInit, OnDestroy } from '@angular/core'; -import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; -import { CommonModule } from '@angular/common'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatDividerModule } from '@angular/material/divider'; -import { MatExpansionModule } from '@angular/material/expansion'; -import { MatIconModule } from '@angular/material/icon'; -import { MatMenuModule } from '@angular/material/menu'; -import { ChartistModule, Configuration } from 'ng-chartist'; -import { AxisOptions, Label } from 'chartist'; - -import { Observable, Subscription } from 'rxjs'; - -import { MenuItems } from '@components/shared'; -import { UtilitiesService, JumpsService } from '@services'; -import { JumpByDate } from '@models'; - -@Component({ - selector: 'app-jumps-by-month', - standalone: true, - imports: [ - CommonModule, - MatButtonModule, MatCardModule, MatDividerModule, - MatExpansionModule, MatIconModule, MatMenuModule, - ChartistModule - ], - templateUrl: './jumps-by-month.component.html' -}) -export class JumpsByMonthComponent implements OnInit, OnDestroy { - private _jumpByDate: Subscription = new Subscription(); - private _jumpsByDate!: Array; - private _jumpsByDateCount = 0; - public title: string = 'Volume mensuel'; - public subtitle: string = 'Nombre total de sauts par mois'; - public min = 0; - public max = 0; - public grandAvg = 0; - public grandAvgLastYears = 0; - public grandTotal = 0; - public seriesHeader: string[] = []; - public seriesName: string[] = []; - public seriesRow: Array> = []; - public seriesColor: { - backgroundColor: string[], - borderColor: string[] - } = { - backgroundColor: this._utilitiesService.getSeriesColors(0.8, 'all'), - borderColor: this._utilitiesService.getSeriesColors(1, 'all') - }; - public seriesColorClass: string[] = this._utilitiesService.getChartColors(); - public seriesRowTotal: number[] = []; - public seriesRowAvg: number[] = []; - public seriesRowAvgLastYears: number[] = []; - public seriesColTotal: number[] = []; - public seriesColTotalClosed: number[] = []; - public seriesColTotalLastYears: number[] = []; - public displayCharts = false; - public barChartJumps: Configuration = this._utilitiesService.getBarConfig(); - public destroyRef = inject(DestroyRef); - - constructor( - private _jumpsService: JumpsService, - private _utilitiesService: UtilitiesService, - public menuItems: MenuItems - ) { } - - ngOnInit() { - this._loadJumpByDate(); - } - - ngOnDestroy() { - this._jumpByDate.unsubscribe(); - } - - private _loadJumpByDate() { - const minoration = 2; // -2 pour ne pas compter la première année - this.seriesHeader = this._utilitiesService.getMonthsList(); - const values: Array = this.seriesHeader.map(() => 0); - this.seriesColTotal = [...values]; - this.seriesColTotalClosed = [...values]; - this.seriesColTotalLastYears = [...values]; - const jumps$: Observable> = this._jumpsService.getAllByDate().pipe(takeUntilDestroyed(this.destroyRef)); - this._jumpByDate = jumps$.subscribe((aggregate: Array) => { - this._jumpsByDateCount = aggregate.length; - this._jumpsByDate = aggregate.map((row: JumpByDate) => { - const currentYear: number = new Date().getFullYear(); - const year = row.year.toString(); - const month = row.month; - if (this.seriesName.indexOf(year) < 0) { - this.seriesName.push(year); - if (row.year < this.min || this.min == 0) { - this.min = row.year; - } - if (row.year > this.max) { - this.max = row.year; - } - this.seriesRow.push([...values]); - } - this.seriesRow[(this.seriesRow.length-1)][(month-1)] = row.count; - this.seriesColTotal[(month-1)] += row.count; - if (row.year < currentYear) { - this.seriesColTotalClosed[(month-1)] += row.count; - } - if (row.year >= (currentYear-3) && row.year < currentYear) { - this.seriesColTotalLastYears[(month-1)] += row.count; - } - return row; - }); - this.seriesRow.forEach((row: number[]) => { - const total = row.reduce((partialSum, a) => partialSum + a, 0); - this.seriesRowTotal.push(total); - }); - this.seriesColTotalClosed.forEach((row: number) => { - const value: number = (row/(this.seriesName.length-minoration)); - this.seriesRowAvg.push(parseInt(value.toFixed(0))); - }); - this.seriesColTotalLastYears.forEach((row: number) => { - const value: number = (row/3); // Les 3 dernières années - this.seriesRowAvgLastYears.push(parseInt(value.toFixed(0))); - }); - this.grandAvg = this.seriesRowAvg.reduce((partialSum, accumulated) => partialSum + accumulated, 0); - this.grandAvgLastYears = this.seriesRowAvgLastYears.reduce((partialSum, accumulated) => partialSum + accumulated, 0); - this.grandTotal = this.seriesColTotal.reduce((partialSum, accumulated) => partialSum + accumulated, 0); - const axisX: AxisOptions = { - labelInterpolationFnc: function(value: Label, index: number): string { - return index % 1 === 0 ? `${value.toString()}` : ''; - } - } - this.barChartJumps = { - type: 'Bar', - data: { - 'labels': this.seriesHeader, - 'series': this.seriesRow - }, - options: { - seriesBarDistance: 15, - high: 70, - axisX: { - showGrid: false, - offset: 20 - }, - axisY: { - showGrid: true, - offset: 40 - }, - height: 300 - }, - responsiveOptions: [ - ['screen and (min-width: 1024px)', { - axisX: axisX - }], - ['screen and (min-width: 641px) and (max-width: 1024px)', { - seriesBarDistance: 10, - axisY: { - offset: 30 - }, - axisX: axisX - }], - ['screen and (max-width: 640px)', { - seriesBarDistance: 5, - axisY: { - offset: 20 - }, - axisX: axisX - }] - ] - }; - this.displayCharts = true; - }); - } -} +import { Component, DestroyRef, inject, OnInit, OnDestroy } from '@angular/core'; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; +import { CommonModule } from '@angular/common'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCardModule } from '@angular/material/card'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatExpansionModule } from '@angular/material/expansion'; +import { MatIconModule } from '@angular/material/icon'; +import { MatMenuModule } from '@angular/material/menu'; +import { ChartistModule, Configuration } from 'ng-chartist'; +import { AxisOptions, Label } from 'chartist'; + +import { Observable, Subscription } from 'rxjs'; + +import { MenuItems } from '@components/shared'; +import { UtilitiesService, JumpsService } from '@services'; +import { JumpByDate } from '@models'; + +@Component({ + selector: 'app-jumps-by-month', + imports: [ + CommonModule, + MatButtonModule, + MatCardModule, + MatDividerModule, + MatExpansionModule, + MatIconModule, + MatMenuModule, + ChartistModule, + ], + templateUrl: './jumps-by-month.component.html', +}) +export class JumpsByMonthComponent implements OnInit, OnDestroy { + private _jumpByDate: Subscription = new Subscription(); + private _jumpsByDate!: Array; + private _jumpsByDateCount = 0; + public title: string = 'Volume mensuel'; + public subtitle: string = 'Nombre total de sauts par mois'; + public min = 0; + public max = 0; + public grandAvg = 0; + public grandAvgLastYears = 0; + public grandTotal = 0; + public seriesHeader: string[] = []; + public seriesName: string[] = []; + public seriesRow: Array> = []; + public seriesColor: { + backgroundColor: string[]; + borderColor: string[]; + } = { + backgroundColor: this._utilitiesService.getSeriesColors(0.8, 'all'), + borderColor: this._utilitiesService.getSeriesColors(1, 'all'), + }; + public seriesColorClass: string[] = this._utilitiesService.getChartColors(); + public seriesRowTotal: number[] = []; + public seriesRowAvg: number[] = []; + public seriesRowAvgLastYears: number[] = []; + public seriesColTotal: number[] = []; + public seriesColTotalClosed: number[] = []; + public seriesColTotalLastYears: number[] = []; + public displayCharts = false; + public barChartJumps: Configuration = this._utilitiesService.getBarConfig(); + public destroyRef = inject(DestroyRef); + + constructor( + private _jumpsService: JumpsService, + private _utilitiesService: UtilitiesService, + public menuItems: MenuItems, + ) {} + + ngOnInit() { + this._loadJumpByDate(); + } + + ngOnDestroy() { + this._jumpByDate.unsubscribe(); + } + + private _loadJumpByDate() { + const minoration = 2; // -2 pour ne pas compter la première année + this.seriesHeader = this._utilitiesService.getMonthsList(); + const values: Array = this.seriesHeader.map(() => 0); + this.seriesColTotal = [...values]; + this.seriesColTotalClosed = [...values]; + this.seriesColTotalLastYears = [...values]; + const jumps$: Observable> = this._jumpsService + .getAllByDate() + .pipe(takeUntilDestroyed(this.destroyRef)); + this._jumpByDate = jumps$.subscribe((aggregate: Array) => { + this._jumpsByDateCount = aggregate.length; + this._jumpsByDate = aggregate.map((row: JumpByDate) => { + const currentYear: number = new Date().getFullYear(); + const year = row.year.toString(); + const month = row.month; + if (this.seriesName.indexOf(year) < 0) { + this.seriesName.push(year); + if (row.year < this.min || this.min == 0) { + this.min = row.year; + } + if (row.year > this.max) { + this.max = row.year; + } + this.seriesRow.push([...values]); + } + this.seriesRow[this.seriesRow.length - 1][month - 1] = row.count; + this.seriesColTotal[month - 1] += row.count; + if (row.year < currentYear) { + this.seriesColTotalClosed[month - 1] += row.count; + } + if (row.year >= currentYear - 3 && row.year < currentYear) { + this.seriesColTotalLastYears[month - 1] += row.count; + } + return row; + }); + this.seriesRow.forEach((row: number[]) => { + const total = row.reduce((partialSum, a) => partialSum + a, 0); + this.seriesRowTotal.push(total); + }); + this.seriesColTotalClosed.forEach((row: number) => { + const value: number = row / (this.seriesName.length - minoration); + this.seriesRowAvg.push(parseInt(value.toFixed(0))); + }); + this.seriesColTotalLastYears.forEach((row: number) => { + const value: number = row / 3; // Les 3 dernières années + this.seriesRowAvgLastYears.push(parseInt(value.toFixed(0))); + }); + this.grandAvg = this.seriesRowAvg.reduce((partialSum, accumulated) => partialSum + accumulated, 0); + this.grandAvgLastYears = this.seriesRowAvgLastYears.reduce( + (partialSum, accumulated) => partialSum + accumulated, + 0, + ); + this.grandTotal = this.seriesColTotal.reduce((partialSum, accumulated) => partialSum + accumulated, 0); + const axisX: AxisOptions = { + labelInterpolationFnc: function (value: Label, index: number): string { + return index % 1 === 0 ? `${value.toString()}` : ''; + }, + }; + this.barChartJumps = { + type: 'Bar', + data: { + labels: this.seriesHeader, + series: this.seriesRow, + }, + options: { + seriesBarDistance: 15, + high: 70, + axisX: { + showGrid: false, + offset: 20, + }, + axisY: { + showGrid: true, + offset: 40, + }, + height: 300, + }, + responsiveOptions: [ + [ + 'screen and (min-width: 1024px)', + { + axisX: axisX, + }, + ], + [ + 'screen and (min-width: 641px) and (max-width: 1024px)', + { + seriesBarDistance: 10, + axisY: { + offset: 30, + }, + axisX: axisX, + }, + ], + [ + 'screen and (max-width: 640px)', + { + seriesBarDistance: 5, + axisY: { + offset: 20, + }, + axisX: axisX, + }, + ], + ], + }; + this.displayCharts = true; + }); + } +} diff --git a/src/app/components/shared/helpers-chart/bar-chart.component.ts b/src/app/components/shared/helpers-chart/bar-chart.component.ts index a8ea754..e5fb1e2 100755 --- a/src/app/components/shared/helpers-chart/bar-chart.component.ts +++ b/src/app/components/shared/helpers-chart/bar-chart.component.ts @@ -1,58 +1,53 @@ -import { Component, Input, OnChanges } from '@angular/core'; -import { ChartDataset } from 'chart.js'; -import { BaseChartDirective } from 'ng2-charts'; - -import { UtilitiesService } from '@services'; -import { BarConfig } from '@models'; - -@Component({ - selector: 'app-bar-chart', - standalone: true, - imports: [ - BaseChartDirective - ], - templateUrl: './bar-chart.component.html' -}) -export class BarChartComponent implements OnChanges { - public displayCharts = false; - public chartConfig: BarConfig = this._utilitiesService.getBarChartConfig(); - - constructor( - private _utilitiesService: UtilitiesService - ) { } - - @Input() names: string[] = []; - @Input() values: number[] = []; - @Input() headers: string[] = []; - @Input() colors: { - backgroundColor: string[], - borderColor: string[] - } = { - backgroundColor: this._utilitiesService.getSeriesColors(0.8), - borderColor: this._utilitiesService.getSeriesColors(1) - }; - @Input() label: string = 'Nombre total de sauts'; - @Input() legend: boolean = false; - - ngOnChanges() { - this._loadBarChart(); - } - - private _loadBarChart(): void { - const dataset: ChartDataset<'bar'> = { - data: [...this.values], - label: this.label, - backgroundColor: this.colors.backgroundColor, - borderColor: this.colors.borderColor, - borderWidth: 1 - }; - this.chartConfig.barChartData.labels = [...this.names]; - this.chartConfig.barChartData.datasets!.push(dataset); - /*this.chartConfig.barChartOptions!.scales = { - x: {display: false}, - y: {display: true} - };*/ - this.chartConfig.barChartLegend = this.legend; - this.displayCharts = true; - } -} +import { Component, Input, OnChanges } from '@angular/core'; +import { ChartDataset } from 'chart.js'; +import { BaseChartDirective } from 'ng2-charts'; + +import { UtilitiesService } from '@services'; +import { BarConfig } from '@models'; + +@Component({ + selector: 'app-bar-chart', + imports: [BaseChartDirective], + templateUrl: './bar-chart.component.html', +}) +export class BarChartComponent implements OnChanges { + public displayCharts = false; + public chartConfig: BarConfig = this._utilitiesService.getBarChartConfig(); + + constructor(private _utilitiesService: UtilitiesService) {} + + @Input() names: string[] = []; + @Input() values: number[] = []; + @Input() headers: string[] = []; + @Input() colors: { + backgroundColor: string[]; + borderColor: string[]; + } = { + backgroundColor: this._utilitiesService.getSeriesColors(0.8), + borderColor: this._utilitiesService.getSeriesColors(1), + }; + @Input() label: string = 'Nombre total de sauts'; + @Input() legend: boolean = false; + + ngOnChanges() { + this._loadBarChart(); + } + + private _loadBarChart(): void { + const dataset: ChartDataset<'bar'> = { + data: [...this.values], + label: this.label, + backgroundColor: this.colors.backgroundColor, + borderColor: this.colors.borderColor, + borderWidth: 1, + }; + this.chartConfig.barChartData.labels = [...this.names]; + this.chartConfig.barChartData.datasets!.push(dataset); + /*this.chartConfig.barChartOptions!.scales = { + x: {display: false}, + y: {display: true} + };*/ + this.chartConfig.barChartLegend = this.legend; + this.displayCharts = true; + } +} diff --git a/src/app/components/shared/helpers-chart/bar-horizontal-chart.component.ts b/src/app/components/shared/helpers-chart/bar-horizontal-chart.component.ts index ec70776..bb63b2e 100755 --- a/src/app/components/shared/helpers-chart/bar-horizontal-chart.component.ts +++ b/src/app/components/shared/helpers-chart/bar-horizontal-chart.component.ts @@ -1,54 +1,49 @@ -import { Component, Input, OnChanges } from '@angular/core'; -import { ChartDataset } from 'chart.js'; -import { BaseChartDirective } from 'ng2-charts'; - -import { UtilitiesService } from '@services'; -import { BarConfig } from '@models'; - -@Component({ - selector: 'app-bar-horizontal-chart', - standalone: true, - imports: [ - BaseChartDirective - ], - templateUrl: './bar-horizontal-chart.component.html' -}) -export class BarHorizontalChartComponent implements OnChanges { - public displayCharts = false; - public chartConfig: BarConfig = this._utilitiesService.getHorizontalBarChartConfig(); - - constructor( - private _utilitiesService: UtilitiesService - ) { } - - @Input() names: string[] = []; - @Input() values: number[] = []; - @Input() headers: string[] = []; - @Input() colors: { - backgroundColor: string[], - borderColor: string[] - } = { - backgroundColor: this._utilitiesService.getSeriesColors(0.8), - borderColor: this._utilitiesService.getSeriesColors(1) - }; - @Input() label: string = 'Nombre total de sauts'; - @Input() legend: boolean = false; - - ngOnChanges() { - this._loadBarChart(); - } - - private _loadBarChart(): void { - const dataset: ChartDataset<'bar'> = { - data: [...this.values], - label: this.label, - backgroundColor: this.colors.backgroundColor, - borderColor: this.colors.borderColor, - borderWidth: 1 - }; - this.chartConfig.barChartData.labels = [...this.names]; - this.chartConfig.barChartData.datasets!.push(dataset); - this.chartConfig.barChartLegend = this.legend; - this.displayCharts = true; - } -} +import { Component, Input, OnChanges } from '@angular/core'; +import { ChartDataset } from 'chart.js'; +import { BaseChartDirective } from 'ng2-charts'; + +import { UtilitiesService } from '@services'; +import { BarConfig } from '@models'; + +@Component({ + selector: 'app-bar-horizontal-chart', + imports: [BaseChartDirective], + templateUrl: './bar-horizontal-chart.component.html', +}) +export class BarHorizontalChartComponent implements OnChanges { + public displayCharts = false; + public chartConfig: BarConfig = this._utilitiesService.getHorizontalBarChartConfig(); + + constructor(private _utilitiesService: UtilitiesService) {} + + @Input() names: string[] = []; + @Input() values: number[] = []; + @Input() headers: string[] = []; + @Input() colors: { + backgroundColor: string[]; + borderColor: string[]; + } = { + backgroundColor: this._utilitiesService.getSeriesColors(0.8), + borderColor: this._utilitiesService.getSeriesColors(1), + }; + @Input() label: string = 'Nombre total de sauts'; + @Input() legend: boolean = false; + + ngOnChanges() { + this._loadBarChart(); + } + + private _loadBarChart(): void { + const dataset: ChartDataset<'bar'> = { + data: [...this.values], + label: this.label, + backgroundColor: this.colors.backgroundColor, + borderColor: this.colors.borderColor, + borderWidth: 1, + }; + this.chartConfig.barChartData.labels = [...this.names]; + this.chartConfig.barChartData.datasets!.push(dataset); + this.chartConfig.barChartLegend = this.legend; + this.displayCharts = true; + } +} diff --git a/src/app/components/shared/helpers-chart/bars-chart.component.ts b/src/app/components/shared/helpers-chart/bars-chart.component.ts index 37a22d6..ce2000a 100755 --- a/src/app/components/shared/helpers-chart/bars-chart.component.ts +++ b/src/app/components/shared/helpers-chart/bars-chart.component.ts @@ -1,79 +1,84 @@ -import { Component, Input, OnChanges, AfterContentChecked } from '@angular/core'; -import { ChartDataset } from 'chart.js'; -import { BaseChartDirective } from 'ng2-charts'; - -import { UtilitiesService } from '@services'; -import { BarConfig } from '@models'; - -@Component({ - selector: 'app-bars-chart', - standalone: true, - imports: [ - BaseChartDirective - ], - templateUrl: './bars-chart.component.html' -}) -export class BarsChartComponent implements OnChanges, AfterContentChecked { - public displayCharts = false; - public chartConfig: BarConfig = this._utilitiesService.getBarChartConfig(); - - constructor( - private _utilitiesService: UtilitiesService - ) { } - - @Input() names: string[] = []; - @Input() values: Array> = []; - @Input() headers: string[] = []; - @Input() colors: { - backgroundColor: string[], - borderColor: string[] - } = { - backgroundColor: this._utilitiesService.getSeriesColors(0.8), - borderColor: this._utilitiesService.getSeriesColors(1) - }; - @Input() legend: boolean = false; - - ngOnChanges() { - this._loadBarChart(); - } - - ngAfterContentChecked() { - this._loadBarChart(); - } - - private _loadBarChart(): void { - this.chartConfig = this._utilitiesService.getBarChartConfig(); - this.chartConfig.barChartData.labels = [...this.headers]; - this.chartConfig.barChartOptions!.maintainAspectRatio = false; - //this.chartConfig.barChartOptions!.aspectRatio = 2.4; - this.chartConfig.barChartOptions!.scales = { - x: { - display: true, - //stacked: true, - beginAtZero: true, - ticks: { color: 'rgba(255,255,255,0.3)' }, - grid: { color: 'rgba(255,255,255,0.1)', display: true, tickBorderDash: [1,2], tickBorderDashOffset: 2 } - }, - y: { - display: true, - //stacked: true, - beginAtZero: true, - ticks: { color: 'rgba(255,255,255,0.3)' }, - grid: { color: 'rgba(255,255,255,0.2)', tickBorderDash: [1,2], tickBorderDashOffset: 2, display: true } - } - }; - this.names.forEach((label: string, index: number) => { - const dataset: ChartDataset<'bar'> = { - data: [...this.values[index]], - label: label, - backgroundColor: this.colors.backgroundColor[index], - borderColor: this.colors.borderColor[index], - borderWidth: 1, - //stack: 'Stack 0' - }; - this.chartConfig.barChartData.datasets!.push(dataset); - }); - this.chartConfig.barChartLegend = this.legend; - this.displayCharts = true; - } -} +import { Component, Input, OnChanges, AfterContentChecked } from '@angular/core'; +import { ChartDataset } from 'chart.js'; +import { BaseChartDirective } from 'ng2-charts'; + +import { UtilitiesService } from '@services'; +import { BarConfig } from '@models'; + +@Component({ + selector: 'app-bars-chart', + imports: [BaseChartDirective], + templateUrl: './bars-chart.component.html', +}) +export class BarsChartComponent implements OnChanges, AfterContentChecked { + public displayCharts = false; + public chartConfig: BarConfig = this._utilitiesService.getBarChartConfig(); + + constructor(private _utilitiesService: UtilitiesService) {} + + @Input() names: string[] = []; + @Input() values: Array> = []; + @Input() headers: string[] = []; + @Input() colors: { + backgroundColor: string[]; + borderColor: string[]; + } = { + backgroundColor: this._utilitiesService.getSeriesColors(0.8), + borderColor: this._utilitiesService.getSeriesColors(1), + }; + @Input() legend: boolean = false; + + ngOnChanges() { + this._loadBarChart(); + } + + ngAfterContentChecked() { + this._loadBarChart(); + } + + private _loadBarChart(): void { + this.chartConfig = this._utilitiesService.getBarChartConfig(); + this.chartConfig.barChartData.labels = [...this.headers]; + this.chartConfig.barChartOptions!.maintainAspectRatio = false; + //this.chartConfig.barChartOptions!.aspectRatio = 2.4; + this.chartConfig.barChartOptions!.scales = { + x: { + display: true, + //stacked: true, + beginAtZero: true, + ticks: { color: 'rgba(255,255,255,0.3)' }, + grid: { + color: 'rgba(255,255,255,0.1)', + display: true, + tickBorderDash: [1, 2], + tickBorderDashOffset: 2, + }, + }, + y: { + display: true, + //stacked: true, + beginAtZero: true, + ticks: { color: 'rgba(255,255,255,0.3)' }, + grid: { + color: 'rgba(255,255,255,0.2)', + tickBorderDash: [1, 2], + tickBorderDashOffset: 2, + display: true, + }, + }, + }; + this.names.forEach((label: string, index: number) => { + const dataset: ChartDataset<'bar'> = { + data: [...this.values[index]], + label: label, + backgroundColor: this.colors.backgroundColor[index], + borderColor: this.colors.borderColor[index], + borderWidth: 1, + //stack: 'Stack 0' + }; + this.chartConfig.barChartData.datasets!.push(dataset); + }); + this.chartConfig.barChartLegend = this.legend; + this.displayCharts = true; + } +} diff --git a/src/app/components/shared/helpers-chart/circle-chart.component.ts b/src/app/components/shared/helpers-chart/circle-chart.component.ts index a14cb2a..0821380 100755 --- a/src/app/components/shared/helpers-chart/circle-chart.component.ts +++ b/src/app/components/shared/helpers-chart/circle-chart.component.ts @@ -1,64 +1,59 @@ -import { Component, Input, OnChanges } from '@angular/core'; -//import { ChartDataset } from 'chart.js'; -import { BaseChartDirective } from 'ng2-charts'; - -import { UtilitiesService } from '@services'; -import { CircleConfig } from '@models'; - -@Component({ - selector: 'app-circle-chart', - standalone: true, - imports: [ - BaseChartDirective - ], - templateUrl: './circle-chart.component.html' -}) -export class CircleChartComponent implements OnChanges { - public displayCharts = false; - public chartConfig: CircleConfig = this._utilitiesService.getCircleChartConfig(); - - constructor( - private _utilitiesService: UtilitiesService - ) { } - - @Input() names: string[] = []; - @Input() values: number[] = []; - @Input() headers: string[] = []; - @Input() color: number = 0; - @Input() label: string = 'Nombre total de sauts'; - @Input() legend: boolean = false; - - ngOnChanges() { - this._loadCircleChart(); - } - - private _loadCircleChart(): void { - this.chartConfig.circleChartLabels = [...this.names]; - this.chartConfig.circleChartDatasets[0].data = [...this.values]; - this.chartConfig.circleChartDatasets[0].label = this.label; - this.chartConfig.circleChartDatasets[0].backgroundColor = [ - this._utilitiesService.getSeriesColors(0.9, 'pastels')[this.color], - 'rgba(255, 255, 255, 0.05)' - ]; - this.chartConfig.circleChartDatasets[0].borderColor = [ - this._utilitiesService.getSeriesColors(1, 'pastels')[this.color], - 'rgba(255, 255, 255, 0.05)' - ]; - this.chartConfig.circleChartDatasets[0].borderWidth = 0; - this.chartConfig.circleChartLegend = this.legend; - this.displayCharts = true; - } - - /*private _loadCircleChart(): void { - const dataset: ChartDataset<'circle'> = { - data: [...this.values], - label: 'Nombre total de sauts', - backgroundColor: this._utilitiesService.getSeriesColors(0.8), - borderColor: this._utilitiesService.getSeriesColors(1), - borderWidth: 1 - }; - this.chartConfig.circleChartLabels = [...this.names]; - this.chartConfig.circleChartDatasets!.push(dataset); - this.displayCharts = true; - }*/ -} +import { Component, Input, OnChanges } from '@angular/core'; +//import { ChartDataset } from 'chart.js'; +import { BaseChartDirective } from 'ng2-charts'; + +import { UtilitiesService } from '@services'; +import { CircleConfig } from '@models'; + +@Component({ + selector: 'app-circle-chart', + imports: [BaseChartDirective], + templateUrl: './circle-chart.component.html', +}) +export class CircleChartComponent implements OnChanges { + public displayCharts = false; + public chartConfig: CircleConfig = this._utilitiesService.getCircleChartConfig(); + + constructor(private _utilitiesService: UtilitiesService) {} + + @Input() names: string[] = []; + @Input() values: number[] = []; + @Input() headers: string[] = []; + @Input() color: number = 0; + @Input() label: string = 'Nombre total de sauts'; + @Input() legend: boolean = false; + + ngOnChanges() { + this._loadCircleChart(); + } + + private _loadCircleChart(): void { + this.chartConfig.circleChartLabels = [...this.names]; + this.chartConfig.circleChartDatasets[0].data = [...this.values]; + this.chartConfig.circleChartDatasets[0].label = this.label; + this.chartConfig.circleChartDatasets[0].backgroundColor = [ + this._utilitiesService.getSeriesColors(0.9, 'pastels')[this.color], + 'rgba(255, 255, 255, 0.05)', + ]; + this.chartConfig.circleChartDatasets[0].borderColor = [ + this._utilitiesService.getSeriesColors(1, 'pastels')[this.color], + 'rgba(255, 255, 255, 0.05)', + ]; + this.chartConfig.circleChartDatasets[0].borderWidth = 0; + this.chartConfig.circleChartLegend = this.legend; + this.displayCharts = true; + } + + /*private _loadCircleChart(): void { + const dataset: ChartDataset<'circle'> = { + data: [...this.values], + label: 'Nombre total de sauts', + backgroundColor: this._utilitiesService.getSeriesColors(0.8), + borderColor: this._utilitiesService.getSeriesColors(1), + borderWidth: 1 + }; + this.chartConfig.circleChartLabels = [...this.names]; + this.chartConfig.circleChartDatasets!.push(dataset); + this.displayCharts = true; + }*/ +} diff --git a/src/app/components/shared/helpers-chart/line-chart.component.ts b/src/app/components/shared/helpers-chart/line-chart.component.ts index bb7a020..b7b65ba 100755 --- a/src/app/components/shared/helpers-chart/line-chart.component.ts +++ b/src/app/components/shared/helpers-chart/line-chart.component.ts @@ -1,64 +1,59 @@ -import { Component, Input, OnChanges } from '@angular/core'; -import { ChartDataset, Point } from 'chart.js'; -import { BaseChartDirective } from 'ng2-charts'; - -import { UtilitiesService } from '@services'; -import { LineConfig } from '@models'; - -@Component({ - selector: 'app-line-chart', - standalone: true, - imports: [ - BaseChartDirective - ], - templateUrl: './line-chart.component.html' -}) -export class LineChartComponent implements OnChanges { - public displayCharts = false; - public chartConfig: LineConfig = this._utilitiesService.getLineChartConfig(); - - constructor( - private _utilitiesService: UtilitiesService - ) { } - - @Input() headers: string[] = []; - @Input() names: string[] = []; - @Input() values: Array> = []; - @Input() colors: { - backgroundColor: string[], - borderColor: string[] - } = { - backgroundColor: this._utilitiesService.getSeriesColors(0.8), - borderColor: this._utilitiesService.getSeriesColors(1) - }; - @Input() legend: boolean = false; - @Input() hideZero: boolean = false; - - ngOnChanges() { - this._loadLineChart(); - } - - private _loadLineChart(): void { - this.chartConfig.lineChartData.labels = [...this.headers]; - this.names.forEach((label: string, index: number) => { - let data: Array<(number | Point | null)> = []; - if (this.hideZero) { - data = [...this.values[index].map(value => value === 0 ? null : value)]; - } else { - data = [...this.values[index]]; - } - const dataset: ChartDataset<'line'> = { - data: data, - label: label, - backgroundColor: this.colors.backgroundColor[index], - borderColor: this.colors.borderColor[index], - borderWidth: 2, - cubicInterpolationMode: 'monotone', - tension: 0 - }; - this.chartConfig.lineChartData.datasets!.push(dataset); - }); - this.chartConfig.lineChartLegend = this.legend; - this.displayCharts = true; - } -} +import { Component, Input, OnChanges } from '@angular/core'; +import { ChartDataset, Point } from 'chart.js'; +import { BaseChartDirective } from 'ng2-charts'; + +import { UtilitiesService } from '@services'; +import { LineConfig } from '@models'; + +@Component({ + selector: 'app-line-chart', + imports: [BaseChartDirective], + templateUrl: './line-chart.component.html', +}) +export class LineChartComponent implements OnChanges { + public displayCharts = false; + public chartConfig: LineConfig = this._utilitiesService.getLineChartConfig(); + + constructor(private _utilitiesService: UtilitiesService) {} + + @Input() headers: string[] = []; + @Input() names: string[] = []; + @Input() values: Array> = []; + @Input() colors: { + backgroundColor: string[]; + borderColor: string[]; + } = { + backgroundColor: this._utilitiesService.getSeriesColors(0.8), + borderColor: this._utilitiesService.getSeriesColors(1), + }; + @Input() legend: boolean = false; + @Input() hideZero: boolean = false; + + ngOnChanges() { + this._loadLineChart(); + } + + private _loadLineChart(): void { + this.chartConfig.lineChartData.labels = [...this.headers]; + this.names.forEach((label: string, index: number) => { + let data: Array = []; + if (this.hideZero) { + data = [...this.values[index].map((value) => (value === 0 ? null : value))]; + } else { + data = [...this.values[index]]; + } + const dataset: ChartDataset<'line'> = { + data: data, + label: label, + backgroundColor: this.colors.backgroundColor[index], + borderColor: this.colors.borderColor[index], + borderWidth: 2, + cubicInterpolationMode: 'monotone', + tension: 0, + }; + this.chartConfig.lineChartData.datasets!.push(dataset); + }); + this.chartConfig.lineChartLegend = this.legend; + this.displayCharts = true; + } +} diff --git a/src/app/components/shared/helpers-chart/linearea-chart.component.ts b/src/app/components/shared/helpers-chart/linearea-chart.component.ts index e2bdbd6..500b376 100755 --- a/src/app/components/shared/helpers-chart/linearea-chart.component.ts +++ b/src/app/components/shared/helpers-chart/linearea-chart.component.ts @@ -1,63 +1,58 @@ -import { Component, Input, OnChanges } from '@angular/core'; -import { ChartDataset } from 'chart.js'; -import { BaseChartDirective } from 'ng2-charts'; - -import { UtilitiesService } from '@services'; -import { LineConfig } from '@models'; - -@Component({ - selector: 'app-linearea-chart', - standalone: true, - imports: [ - BaseChartDirective - ], - templateUrl: './linearea-chart.component.html' -}) -export class LineAreaChartComponent implements OnChanges { - public displayCharts = false; - public chartConfig: LineConfig = this._utilitiesService.getStackedLineAreaChartConfig(); - - constructor( - private _utilitiesService: UtilitiesService - ) { } - - @Input() headers: string[] = []; - @Input() names: string[] = []; - @Input() values: Array> = []; - @Input() colors: { - backgroundColor: string[], - borderColor: string[] - } = { - backgroundColor: this._utilitiesService.getSeriesColors(0.8), - borderColor: this._utilitiesService.getSeriesColors(1) - }; - @Input() legend: boolean = false; - - ngOnChanges() { - this._loadLineChart(); - } - - private _loadLineChart(): void { - this.chartConfig.lineChartData.labels = [...this.headers]; - this.names.forEach((label: string, index: number) => { - let fill: string | number | boolean = '-1'; - if (index === 0) { - fill = true; - } - const dataset: ChartDataset<'line'> = { - data: [...this.values[index]], - label: label, - backgroundColor: this.colors.backgroundColor[index], - borderColor: this.colors.borderColor[index], - borderWidth: 1, - fill: fill, - //stepped: true, - cubicInterpolationMode: 'monotone', - tension: 0 - }; - this.chartConfig.lineChartData.datasets!.push(dataset); - }); - this.chartConfig.lineChartLegend = this.legend; - this.displayCharts = true; - } -} +import { Component, Input, OnChanges } from '@angular/core'; +import { ChartDataset } from 'chart.js'; +import { BaseChartDirective } from 'ng2-charts'; + +import { UtilitiesService } from '@services'; +import { LineConfig } from '@models'; + +@Component({ + selector: 'app-linearea-chart', + imports: [BaseChartDirective], + templateUrl: './linearea-chart.component.html', +}) +export class LineAreaChartComponent implements OnChanges { + public displayCharts = false; + public chartConfig: LineConfig = this._utilitiesService.getStackedLineAreaChartConfig(); + + constructor(private _utilitiesService: UtilitiesService) {} + + @Input() headers: string[] = []; + @Input() names: string[] = []; + @Input() values: Array> = []; + @Input() colors: { + backgroundColor: string[]; + borderColor: string[]; + } = { + backgroundColor: this._utilitiesService.getSeriesColors(0.8), + borderColor: this._utilitiesService.getSeriesColors(1), + }; + @Input() legend: boolean = false; + + ngOnChanges() { + this._loadLineChart(); + } + + private _loadLineChart(): void { + this.chartConfig.lineChartData.labels = [...this.headers]; + this.names.forEach((label: string, index: number) => { + let fill: string | number | boolean = '-1'; + if (index === 0) { + fill = true; + } + const dataset: ChartDataset<'line'> = { + data: [...this.values[index]], + label: label, + backgroundColor: this.colors.backgroundColor[index], + borderColor: this.colors.borderColor[index], + borderWidth: 1, + fill: fill, + //stepped: true, + cubicInterpolationMode: 'monotone', + tension: 0, + }; + this.chartConfig.lineChartData.datasets!.push(dataset); + }); + this.chartConfig.lineChartLegend = this.legend; + this.displayCharts = true; + } +} diff --git a/src/app/components/shared/helpers-chart/pie-chart.component.ts b/src/app/components/shared/helpers-chart/pie-chart.component.ts index e43d68b..f5c78a4 100755 --- a/src/app/components/shared/helpers-chart/pie-chart.component.ts +++ b/src/app/components/shared/helpers-chart/pie-chart.component.ts @@ -1,63 +1,58 @@ -import { Component, Input, OnChanges } from '@angular/core'; -//import { ChartDataset } from 'chart.js'; -import { BaseChartDirective } from 'ng2-charts'; - -import { UtilitiesService } from '@services'; -import { DoughnutConfig } from '@models'; - -@Component({ - selector: 'app-pie-chart', - standalone: true, - imports: [ - BaseChartDirective - ], - templateUrl: './pie-chart.component.html' -}) -export class PieChartComponent implements OnChanges { - public displayCharts = false; - public chartConfig: DoughnutConfig = this._utilitiesService.getDoughnutChartConfig(); - - constructor( - private _utilitiesService: UtilitiesService - ) { } - - @Input() names: string[] = []; - @Input() values: number[] = []; - @Input() headers: string[] = []; - @Input() colors: { - backgroundColor: string[], - borderColor: string[] - } = { - backgroundColor: this._utilitiesService.getSeriesColors(0.8, 'all'), - borderColor: this._utilitiesService.getSeriesColors(1, 'all') - }; - @Input() legend: boolean = false; - - ngOnChanges() { - this._loadDoughnutChart(); - } - - private _loadDoughnutChart(): void { - this.chartConfig.doughnutChartLabels = [...this.names]; - this.chartConfig.doughnutChartDatasets[0].data = [...this.values]; - this.chartConfig.doughnutChartDatasets[0].label = 'Nombre total de sauts'; - this.chartConfig.doughnutChartDatasets[0].backgroundColor = this.colors.backgroundColor; - this.chartConfig.doughnutChartDatasets[0].borderColor = this.colors.borderColor; - this.chartConfig.doughnutChartDatasets[0].borderWidth = 2; - this.chartConfig.doughnutChartLegend = this.legend; - this.displayCharts = true; - } - - /*private _loadDoughnutChart(): void { - const dataset: ChartDataset<'doughnut'> = { - data: [...this.values], - label: 'Nombre total de sauts', - backgroundColor: this._utilitiesService.getSeriesColors(0.8), - borderColor: this._utilitiesService.getSeriesColors(1), - borderWidth: 1 - }; - this.chartConfig.doughnutChartLabels = [...this.names]; - this.chartConfig.doughnutChartDatasets!.push(dataset); - this.displayCharts = true; - }*/ -} +import { Component, Input, OnChanges } from '@angular/core'; +//import { ChartDataset } from 'chart.js'; +import { BaseChartDirective } from 'ng2-charts'; + +import { UtilitiesService } from '@services'; +import { DoughnutConfig } from '@models'; + +@Component({ + selector: 'app-pie-chart', + imports: [BaseChartDirective], + templateUrl: './pie-chart.component.html', +}) +export class PieChartComponent implements OnChanges { + public displayCharts = false; + public chartConfig: DoughnutConfig = this._utilitiesService.getDoughnutChartConfig(); + + constructor(private _utilitiesService: UtilitiesService) {} + + @Input() names: string[] = []; + @Input() values: number[] = []; + @Input() headers: string[] = []; + @Input() colors: { + backgroundColor: string[]; + borderColor: string[]; + } = { + backgroundColor: this._utilitiesService.getSeriesColors(0.8, 'all'), + borderColor: this._utilitiesService.getSeriesColors(1, 'all'), + }; + @Input() legend: boolean = false; + + ngOnChanges() { + this._loadDoughnutChart(); + } + + private _loadDoughnutChart(): void { + this.chartConfig.doughnutChartLabels = [...this.names]; + this.chartConfig.doughnutChartDatasets[0].data = [...this.values]; + this.chartConfig.doughnutChartDatasets[0].label = 'Nombre total de sauts'; + this.chartConfig.doughnutChartDatasets[0].backgroundColor = this.colors.backgroundColor; + this.chartConfig.doughnutChartDatasets[0].borderColor = this.colors.borderColor; + this.chartConfig.doughnutChartDatasets[0].borderWidth = 2; + this.chartConfig.doughnutChartLegend = this.legend; + this.displayCharts = true; + } + + /*private _loadDoughnutChart(): void { + const dataset: ChartDataset<'doughnut'> = { + data: [...this.values], + label: 'Nombre total de sauts', + backgroundColor: this._utilitiesService.getSeriesColors(0.8), + borderColor: this._utilitiesService.getSeriesColors(1), + borderWidth: 1 + }; + this.chartConfig.doughnutChartLabels = [...this.names]; + this.chartConfig.doughnutChartDatasets!.push(dataset); + this.displayCharts = true; + }*/ +} diff --git a/src/app/components/shared/helpers-jump/history-table.component.ts b/src/app/components/shared/helpers-jump/history-table.component.ts index 1ccc304..f723581 100644 --- a/src/app/components/shared/helpers-jump/history-table.component.ts +++ b/src/app/components/shared/helpers-jump/history-table.component.ts @@ -2,13 +2,10 @@ import { Component, Input, AfterContentChecked } from '@angular/core'; import { NgIf, NgFor } from '@angular/common'; @Component({ - standalone: true, - imports: [ - NgIf, NgFor - ], + imports: [NgIf, NgFor], selector: 'app-history-table', templateUrl: './history-table.component.html', - styleUrls: [] + styleUrls: [], }) export class HistoryTableComponent implements AfterContentChecked { public seriesColTotal: number[] = []; @@ -38,7 +35,7 @@ export class HistoryTableComponent implements AfterContentChecked { this.seriesColTotal = [...values]; this.rows.forEach((row: number[], rowIndex: number) => { row.forEach((value: number, index: number) => { - this.seriesColTotal[index] = (this.seriesColTotal[index] + this.rows[rowIndex][index]); + this.seriesColTotal[index] = this.seriesColTotal[index] + this.rows[rowIndex][index]; }); this.grandTotal = this.seriesColTotal.reduce((partialSum, a) => partialSum + a, 0); }); diff --git a/src/app/components/shared/helpers-jump/jump-list.component.ts b/src/app/components/shared/helpers-jump/jump-list.component.ts index e9cc21c..990cd59 100644 --- a/src/app/components/shared/helpers-jump/jump-list.component.ts +++ b/src/app/components/shared/helpers-jump/jump-list.component.ts @@ -13,16 +13,15 @@ import { JumpPreviewComponent } from './jump-preview.component'; @Component({ selector: 'app-jump-list', templateUrl: './jump-list.component.html', - standalone: true, imports: [ - NgClass, - DatePipe, - MatProgressSpinnerModule, - MatButtonModule, - RouterLink, - MatIconModule, - JumpPreviewComponent -] + NgClass, + DatePipe, + MatProgressSpinnerModule, + MatButtonModule, + RouterLink, + MatIconModule, + JumpPreviewComponent, + ], }) export class JumpListComponent implements OnInit, OnDestroy { private _jumps: Subscription = new Subscription(); @@ -35,9 +34,7 @@ export class JumpListComponent implements OnInit, OnDestroy { pages: Array = [1]; lastUpdate: Date = new Date(); - constructor( - private jumpsService: JumpsService - ) { } + constructor(private jumpsService: JumpsService) {} @Input() limit = 0; @Input() refresh = 30000; @@ -70,7 +67,7 @@ export class JumpListComponent implements OnInit, OnDestroy { runQuery() { if (this.limit) { this.query.filters.limit = this.limit; - this.query.filters.offset = (this.limit * (this.currentPage - 1)); + this.query.filters.offset = this.limit * (this.currentPage - 1); } const jumps$: Observable = this.jumpsService.query(this.query); @@ -85,7 +82,7 @@ export class JumpListComponent implements OnInit, OnDestroy { }, error: (err) => { this.errors = err; - } + }, }); } diff --git a/src/app/components/shared/helpers-jump/jump-meta.component.ts b/src/app/components/shared/helpers-jump/jump-meta.component.ts index b057c2a..4c30d7c 100644 --- a/src/app/components/shared/helpers-jump/jump-meta.component.ts +++ b/src/app/components/shared/helpers-jump/jump-meta.component.ts @@ -6,10 +6,9 @@ import { Jump } from '@models'; @Component({ selector: 'app-jump-meta', - standalone: true, - imports: [ RouterLink, DatePipe ], + imports: [RouterLink, DatePipe], styleUrl: './jump-meta.component.scss', - templateUrl: './jump-meta.component.html' + templateUrl: './jump-meta.component.html', }) export class JumpMetaComponent { @Input() jump!: Jump; diff --git a/src/app/components/shared/helpers-jump/jump-preview.component.ts b/src/app/components/shared/helpers-jump/jump-preview.component.ts index cbf6433..b013e23 100644 --- a/src/app/components/shared/helpers-jump/jump-preview.component.ts +++ b/src/app/components/shared/helpers-jump/jump-preview.component.ts @@ -12,14 +12,9 @@ import { JumpsService } from '@services'; @Component({ selector: 'app-jump-preview', - standalone: true, - imports: [ - DecimalPipe, RouterLink, - MatDividerModule, MatButtonModule, MatCardModule, - JumpMetaComponent - ], + imports: [DecimalPipe, RouterLink, MatDividerModule, MatButtonModule, MatCardModule, JumpMetaComponent], styleUrl: './jump-preview.component.scss', - templateUrl: './jump-preview.component.html' + templateUrl: './jump-preview.component.html', }) export class JumpPreviewComponent implements OnDestroy { @Input() jump!: Jump; @@ -30,8 +25,8 @@ export class JumpPreviewComponent implements OnDestroy { constructor( private router: Router, - private jumpsService: JumpsService - ) { } + private jumpsService: JumpsService, + ) {} ngOnDestroy() { this._jump.unsubscribe(); @@ -43,7 +38,7 @@ export class JumpPreviewComponent implements OnDestroy { this._jump = jump$.subscribe({ next: () => { this.router.navigateByUrl('/'); - } + }, }); } } diff --git a/src/app/components/shared/helpers-jump/jump-table.component.ts b/src/app/components/shared/helpers-jump/jump-table.component.ts index 961e909..ad5a2be 100644 --- a/src/app/components/shared/helpers-jump/jump-table.component.ts +++ b/src/app/components/shared/helpers-jump/jump-table.component.ts @@ -1,4 +1,13 @@ -import { AfterContentChecked, Component, EventEmitter, Input, Output, OnChanges, OnDestroy, ViewChild } from '@angular/core'; +import { + AfterContentChecked, + Component, + EventEmitter, + Input, + Output, + OnChanges, + OnDestroy, + ViewChild, +} from '@angular/core'; import { CommonModule, DecimalPipe, DatePipe } from '@angular/common'; import { UntypedFormBuilder, UntypedFormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms'; import { Router, RouterLink } from '@angular/router'; @@ -15,29 +24,68 @@ import { MatProgressBarModule } from '@angular/material/progress-bar'; import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { MatSort, MatSortModule } from '@angular/material/sort'; import { MatTableDataSource, MatTableModule } from '@angular/material/table'; -import { MatSnackBar, MatSnackBarHorizontalPosition, MatSnackBarModule, MatSnackBarVerticalPosition } from '@angular/material/snack-bar'; +import { + MatSnackBar, + MatSnackBarHorizontalPosition, + MatSnackBarModule, + MatSnackBarVerticalPosition, +} from '@angular/material/snack-bar'; import { Observable, Subscription } from 'rxjs'; import { take } from 'rxjs/operators'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { FrenchPaginator } from '@components/shared/french-paginator.component'; -import { ColumnDefinition, Errors, Jump, JumpByDay, JumpFile, JumpFileType, JumpList, JumpListConfig, jumpColumns } from '@models'; +import { + ColumnDefinition, + Errors, + Jump, + JumpByDay, + JumpFile, + JumpFileType, + JumpList, + JumpListConfig, + jumpColumns, +} from '@models'; import { JumpsService, JumpTableService } from '@services'; -import { JumpAddDialogComponent, JumpDeleteDialogComponent, JumpEditDialogComponent, JumpViewDialogComponent } from '@components/logbook/dialogs' +import { + JumpAddDialogComponent, + JumpDeleteDialogComponent, + JumpEditDialogComponent, + JumpViewDialogComponent, +} from '@components/logbook/dialogs'; @Component({ - standalone: true, imports: [ - CommonModule, DecimalPipe, DatePipe, RouterLink, FormsModule, ReactiveFormsModule, NgxSkeletonLoaderModule, - MatButtonModule, MatCardModule, MatDialogModule, - MatFormFieldModule, MatIconModule, MatInputModule, MatNativeDateModule, MatMenuModule, - MatPaginatorModule, MatProgressBarModule, MatProgressSpinnerModule, MatSnackBarModule, MatSortModule, MatTableModule, - JumpAddDialogComponent, JumpDeleteDialogComponent, JumpEditDialogComponent, JumpViewDialogComponent + CommonModule, + DecimalPipe, + DatePipe, + RouterLink, + FormsModule, + ReactiveFormsModule, + NgxSkeletonLoaderModule, + MatButtonModule, + MatCardModule, + MatDialogModule, + MatFormFieldModule, + MatIconModule, + MatInputModule, + MatNativeDateModule, + MatMenuModule, + MatPaginatorModule, + MatProgressBarModule, + MatProgressSpinnerModule, + MatSnackBarModule, + MatSortModule, + MatTableModule, + JumpAddDialogComponent, + JumpDeleteDialogComponent, + JumpEditDialogComponent, + JumpViewDialogComponent, ], selector: 'app-jump-table', styleUrl: './jump-table.component.scss', templateUrl: './jump-table.component.html', - providers: [{provide: MatPaginatorIntl, useClass: FrenchPaginator}] + providers: [{ provide: MatPaginatorIntl, useClass: FrenchPaginator }], }) export class JumpTableComponent implements OnChanges, OnDestroy, AfterContentChecked { private _jumps: Subscription = new Subscription(); @@ -57,10 +105,18 @@ export class JumpTableComponent implements OnChanges, OnDestroy, AfterContentChe 'zone', 'files', 'actions' ];*/ public displayedColumns: string[] = [ - 'numero', 'date', 'lieu', 'aeronef', - 'hauteur', 'voile', 'categorie', - 'participants', 'zone', 'accessoires', - 'files', 'actions' + 'numero', + 'date', + 'lieu', + 'aeronef', + 'hauteur', + 'voile', + 'categorie', + 'participants', + 'zone', + 'accessoires', + 'files', + 'actions', ]; //public displayedColumns: string[] = jumpColumns.map((col) => col.key) public columnsSchema: Array = jumpColumns; @@ -81,12 +137,12 @@ export class JumpTableComponent implements OnChanges, OnDestroy, AfterContentChe private _jumpTableService: JumpTableService, private dialog: MatDialog, private fb: UntypedFormBuilder, - private snackBar: MatSnackBar + private snackBar: MatSnackBar, ) { this._resetErrors(); this.searchForm = this.fb.group({ //numero: ['', Validators.required] - numero: '' + numero: '', }); } @@ -116,7 +172,7 @@ export class JumpTableComponent implements OnChanges, OnDestroy, AfterContentChe ngOnDestroy() { this._jumps.unsubscribe(); - this._subscriptions.forEach(subscription => { + this._subscriptions.forEach((subscription) => { subscription.unsubscribe(); }); } @@ -139,7 +195,7 @@ export class JumpTableComponent implements OnChanges, OnDestroy, AfterContentChe if (this.limit) { this._query.filters.limit = this.limit; - this._query.filters.offset = (this.limit * (this._currentPage - 1)); + this._query.filters.offset = this.limit * (this._currentPage - 1); } else { this._query.filters.limit = 0; this._query.filters.offset = 0; @@ -172,7 +228,7 @@ export class JumpTableComponent implements OnChanges, OnDestroy, AfterContentChe }, error: (err) => { this.errors = err; - } + }, }); } @@ -185,97 +241,114 @@ export class JumpTableComponent implements OnChanges, OnDestroy, AfterContentChe //config.filters.dateRangeEnd = `${year}-12-31 23:59:59`; config.filters.dateRangeEnd = '2024-12-31 23:59:59'; //console.log(config.filters); - const subscription: Subscription = this._jumpsService.getAllByDay(config) - .pipe(take(1)) - .subscribe({ - next: (days) => { - this._resetErrors(); - //console.log('getAllByDay : ', days); - days.forEach(day => { - this.loadSkydiverIdJumps(day, config); - }); - }, - error: (err) => { - this.errors = err; - } - }); + const subscription: Subscription = this._jumpsService + .getAllByDay(config) + .pipe(take(1)) + .subscribe({ + next: (days) => { + this._resetErrors(); + //console.log('getAllByDay : ', days); + days.forEach((day) => { + this.loadSkydiverIdJumps(day, config); + }); + }, + error: (err) => { + this.errors = err; + }, + }); this._subscriptions.push(subscription); } loadSkydiverIdJumps(day: JumpByDay, config: JumpListConfig) { config.filters.dateRangeStart = `${day.jumps[0].date!.substring(0, 10)} 00:00:00`; config.filters.dateRangeEnd = `${day.jumps[0].date!.substring(0, 10)} 23:59:59`; - const subscription: Subscription = this._jumpsService.getAllFromSkydiverIdApi(config) - .pipe(take(1)) - .subscribe({ - next: (data) => { - if (data.items.length) { - const diff = day.count - data.items.length; - if (diff < 0) { - console.error(`${diff} ${diff > 1 ? 'données' : 'donnée'} altimètre de trop le ${day.jumps[0].date!.substring(0, 10)}`); - } else { - if (diff > 0) { - console.error(`${diff}/${day.count} ${diff > 1 ? 'données altimètre manquantes' : 'donnée altimètre manquante'} le ${day.jumps[0].date!.substring(0, 10)}`, day.jumps, data.items); - } - console.log(`${day.count} ${day.count > 1 ? 'sauts' : 'saut'} le ${data.items[0].date!.substring(0, 10)}`, day.jumps.sort((a, b) => b.numero! - a.numero!), data.items); - data.items.map((jump, index) => { - const file: JumpFile = { - name: jump.name, - path: `/Volumes/Storage/Skydive/X2_Logs/${day.jumps[index].date!.substring(0, 4)}/`, - type: JumpFileType.CSV - } as JumpFile; - this._subscriptions.push( - this._jumpsService.saveX2Data(day.jumps[index].slug!, file, jump) - .pipe(take(1)) - .subscribe({ - next: (jump) => { - this._resetErrors(); - console.log(`Le fichier ${file.name} a été ajouté au saut n°${jump.numero} !`, 'OK'); - }, - error: (err) => { - this.errors = err; - } - }) + const subscription: Subscription = this._jumpsService + .getAllFromSkydiverIdApi(config) + .pipe(take(1)) + .subscribe({ + next: (data) => { + if (data.items.length) { + const diff = day.count - data.items.length; + if (diff < 0) { + console.error( + `${diff} ${diff > 1 ? 'données' : 'donnée'} altimètre de trop le ${day.jumps[0].date!.substring(0, 10)}`, ); - return jump; - }); + } else { + if (diff > 0) { + console.error( + `${diff}/${day.count} ${diff > 1 ? 'données altimètre manquantes' : 'donnée altimètre manquante'} le ${day.jumps[0].date!.substring(0, 10)}`, + day.jumps, + data.items, + ); + } + console.log( + `${day.count} ${day.count > 1 ? 'sauts' : 'saut'} le ${data.items[0].date!.substring(0, 10)}`, + day.jumps.sort((a, b) => b.numero! - a.numero!), + data.items, + ); + data.items.map((jump, index) => { + const file: JumpFile = { + name: jump.name, + path: `/Volumes/Storage/Skydive/X2_Logs/${day.jumps[index].date!.substring(0, 4)}/`, + type: JumpFileType.CSV, + } as JumpFile; + this._subscriptions.push( + this._jumpsService + .saveX2Data(day.jumps[index].slug!, file, jump) + .pipe(take(1)) + .subscribe({ + next: (jump) => { + this._resetErrors(); + console.log( + `Le fichier ${file.name} a été ajouté au saut n°${jump.numero} !`, + 'OK', + ); + }, + error: (err) => { + this.errors = err; + }, + }), + ); + return jump; + }); + } + //console.log(`${day.count} ${day.count > 1 ? 'sauts' : 'saut'} le ${day.jumps[0].date!.substring(0, 10)}`); + //console.log(`${data.items.length} ${data.items.length > 1 ? 'sauts' : 'saut'} le ${data.items[0].date!.substring(0, 10)}`, data); + } else { + console.info('Aucune données altimètre pour le ', day.jumps[0].date!.substring(0, 10)); } - //console.log(`${day.count} ${day.count > 1 ? 'sauts' : 'saut'} le ${day.jumps[0].date!.substring(0, 10)}`); - //console.log(`${data.items.length} ${data.items.length > 1 ? 'sauts' : 'saut'} le ${data.items[0].date!.substring(0, 10)}`, data); - } else { - console.info('Aucune données altimètre pour le ', day.jumps[0].date!.substring(0, 10)); - } - }, - error: (err) => { - console.error('getAllFromSkydiverIdApi error'); - this.errors = err; - } - }); + }, + error: (err) => { + console.error('getAllFromSkydiverIdApi error'); + this.errors = err; + }, + }); this._subscriptions.push(subscription); } updateJumps(jumps: Array) { - jumps.map(jump => { + jumps.map((jump) => { jump.files = []; - if (jump.dossier !== "" && jump.video !== "") { + if (jump.dossier !== '' && jump.video !== '') { const file: JumpFile = { name: jump.video!, path: jump.dossier!, - type: JumpFileType.VIDEO + type: JumpFileType.VIDEO, } as JumpFile; this._subscriptions.push( - this._jumpsService.saveFile(jump.slug, file) - .pipe(take(1)) - .subscribe({ - next: (file) => { - this._resetErrors(); - jump.files.push(file); - //console.log(`Le fichier ${file.name} a été ajouté au saut n°${jump.numero} !`, 'OK'); - }, - error: (err) => { - this.errors = err; - } - }) + this._jumpsService + .saveFile(jump.slug, file) + .pipe(take(1)) + .subscribe({ + next: (file) => { + this._resetErrors(); + jump.files.push(file); + //console.log(`Le fichier ${file.name} a été ajouté au saut n°${jump.numero} !`, 'OK'); + }, + error: (err) => { + this.errors = err; + }, + }), ); } return jump; @@ -283,26 +356,30 @@ export class JumpTableComponent implements OnChanges, OnDestroy, AfterContentChe } getKmlJumpFiles(jumps: Array) { - jumps.map(jump => { + jumps.map((jump) => { if (jump.x2data !== null) { //console.log(`Le fichier ${jump.x2data.name} existe pour le saut n°${jump.numero} !`, `https://skydiver.id/api/jump/${jump.x2data.id}/kml`); const file: JumpFile = { name: jump.x2data.name.substring(0, -4) + '.kml', path: `/X2_Kmls/${jump.date.substring(0, 4)}/`, - type: JumpFileType.KML + type: JumpFileType.KML, } as JumpFile; this._subscriptions.push( - this._jumpsService.saveKml(jump.slug, file) - .pipe(take(1)) - .subscribe({ - next: (file) => { - this._resetErrors(); - console.log(`Le fichier ${file.path}${file.name} a été ajouté au saut n°${jump.numero} !`, 'OK'); - }, - error: (err) => { - this.errors = err; - } - }) + this._jumpsService + .saveKml(jump.slug, file) + .pipe(take(1)) + .subscribe({ + next: (file) => { + this._resetErrors(); + console.log( + `Le fichier ${file.path}${file.name} a été ajouté au saut n°${jump.numero} !`, + 'OK', + ); + }, + error: (err) => { + this.errors = err; + }, + }), ); } return jump; @@ -312,50 +389,53 @@ export class JumpTableComponent implements OnChanges, OnDestroy, AfterContentChe deleteJump(slug: string) { this.isDeleting = true; this._subscriptions.push( - this._jumpsService.destroy(slug) - .pipe(take(1)) - .subscribe(() => { - this.router.navigateByUrl('/'); - }) + this._jumpsService + .destroy(slug) + .pipe(take(1)) + .subscribe(() => { + this.router.navigateByUrl('/'); + }), ); } openDeleteDialog(jump: Jump): void { const dialogRef = this.dialog.open(JumpDeleteDialogComponent, { width: '60vw', - data: jump + data: jump, }); this._subscriptions.push( - dialogRef.afterClosed() - .pipe(take(1)) - .subscribe(result => { - if (result != undefined) { - this._onDelete(result.slug); - } - }) + dialogRef + .afterClosed() + .pipe(take(1)) + .subscribe((result) => { + if (result != undefined) { + this._onDelete(result.slug); + } + }), ); } openEditDialog(jump: Jump): void { const dialogRef = this.dialog.open(JumpEditDialogComponent, { width: '70vw', - data: jump + data: jump, }); this._subscriptions.push( - dialogRef.afterClosed() - .pipe(take(1)) - .subscribe(result => { - if (result != undefined) { - this._onEdit(result); - } - }) + dialogRef + .afterClosed() + .pipe(take(1)) + .subscribe((result) => { + if (result != undefined) { + this._onEdit(result); + } + }), ); } openViewDialog(jump: Jump): void { const dialogRef = this.dialog.open(JumpViewDialogComponent, { width: '60vw', - data: jump + data: jump, }); dialogRef.afterClosed(); } @@ -379,20 +459,21 @@ export class JumpTableComponent implements OnChanges, OnDestroy, AfterContentChe try { this.isDeleting = true; this._subscriptions.push( - this._jumpsService.destroy(slug) - .pipe(take(1)) - .subscribe({ - next: () => { - this._resetErrors(); - this._openSnackBar(`Le saut a été supprimé !`, 'OK'); - this.runQuery(); - this.tableRefresh = !this.tableRefresh; - this._jumpTableService.updateTableRefresh(this.tableRefresh); - }, - error: (err) => { - this.errors = err; - } - }) + this._jumpsService + .destroy(slug) + .pipe(take(1)) + .subscribe({ + next: () => { + this._resetErrors(); + this._openSnackBar(`Le saut a été supprimé !`, 'OK'); + this.runQuery(); + this.tableRefresh = !this.tableRefresh; + this._jumpTableService.updateTableRefresh(this.tableRefresh); + }, + error: (err) => { + this.errors = err; + }, + }), ); } catch (error) { console.error(error); @@ -403,21 +484,22 @@ export class JumpTableComponent implements OnChanges, OnDestroy, AfterContentChe try { this.isSubmitting = true; this._subscriptions.push( - this._jumpsService.update(jump) - .pipe(take(1)) - .subscribe({ - next: (jump) => { - this._resetErrors(); - this._openSnackBar(`Le saut n°${jump.numero} a été mis à jour !`, 'OK'); - this.runQuery(); - this.tableRefresh = !this.tableRefresh; - this._jumpTableService.updateTableRefresh(this.tableRefresh); - }, - error: (err) => { - this.errors = err; - this.isSubmitting = false; - } - }) + this._jumpsService + .update(jump) + .pipe(take(1)) + .subscribe({ + next: (jump) => { + this._resetErrors(); + this._openSnackBar(`Le saut n°${jump.numero} a été mis à jour !`, 'OK'); + this.runQuery(); + this.tableRefresh = !this.tableRefresh; + this._jumpTableService.updateTableRefresh(this.tableRefresh); + }, + error: (err) => { + this.errors = err; + this.isSubmitting = false; + }, + }), ); } catch (error) { console.error(error); @@ -468,5 +550,4 @@ export class JumpTableComponent implements OnChanges, OnDestroy, AfterContentChe })) } */ - } diff --git a/src/app/components/shared/herowars-components/fortification-card-content/fortification-card-content.component.ts b/src/app/components/shared/herowars-components/fortification-card-content/fortification-card-content.component.ts index 6e02849..8537167 100644 --- a/src/app/components/shared/herowars-components/fortification-card-content/fortification-card-content.component.ts +++ b/src/app/components/shared/herowars-components/fortification-card-content/fortification-card-content.component.ts @@ -12,11 +12,7 @@ import { HWGuildWarFortification, HWMember } from '@models'; selector: 'app-fortification-card-content', templateUrl: './fortification-card-content.component.html', styleUrl: './fortification-card-content.component.scss', - standalone: true, - imports: [ - DecimalPipe, - MatCardModule, MatChipsModule, MatIconModule - ] + imports: [DecimalPipe, MatCardModule, MatChipsModule, MatIconModule], }) export class FortificationCardContentComponent { public data: HWGuildWarFortification = {} as HWGuildWarFortification; @@ -80,4 +76,4 @@ export class FortificationCardContentComponent { : []; } */ -} \ No newline at end of file +} diff --git a/src/app/components/shared/herowars-components/guild-card/guild-card.component.ts b/src/app/components/shared/herowars-components/guild-card/guild-card.component.ts index 4eba034..9e85f3d 100644 --- a/src/app/components/shared/herowars-components/guild-card/guild-card.component.ts +++ b/src/app/components/shared/herowars-components/guild-card/guild-card.component.ts @@ -10,13 +10,9 @@ import guildData from 'src/files-data/hw-guild-data.json'; // page Membres @Component({ selector: 'app-guild-card', - standalone: true, - imports: [ - DatePipe, DecimalPipe, - MatCardModule, MatDividerModule, MatIconModule - ], + imports: [DatePipe, DecimalPipe, MatCardModule, MatDividerModule, MatIconModule], templateUrl: './guild-card.component.html', - styleUrl: './guild-card.component.scss' + styleUrl: './guild-card.component.scss', }) export class GuildCardComponent implements OnInit { public guildData: HWGuildData = {} as HWGuildData; diff --git a/src/app/components/shared/herowars-components/guildraids-log/guildraids-log.component.ts b/src/app/components/shared/herowars-components/guildraids-log/guildraids-log.component.ts index af4efde..d96c8f3 100644 --- a/src/app/components/shared/herowars-components/guildraids-log/guildraids-log.component.ts +++ b/src/app/components/shared/herowars-components/guildraids-log/guildraids-log.component.ts @@ -23,21 +23,29 @@ export class StepperIntl extends MatStepperIntl { } @Component({ selector: 'app-guildraids-log', - standalone: true, providers: [ { - provide: STEPPER_GLOBAL_OPTIONS, - useValue: {displayDefaultIndicatorType: false}, + provide: STEPPER_GLOBAL_OPTIONS, + useValue: { displayDefaultIndicatorType: false }, }, ], imports: [ - DatePipe, DecimalPipe, FormsModule, ReactiveFormsModule, - MatButtonModule, MatCardModule, MatDatepickerModule, MatDividerModule, - MatFormFieldModule, MatIconModule, MatInputModule, MatTooltipModule, - MatStepperModule + DatePipe, + DecimalPipe, + FormsModule, + ReactiveFormsModule, + MatButtonModule, + MatCardModule, + MatDatepickerModule, + MatDividerModule, + MatFormFieldModule, + MatIconModule, + MatInputModule, + MatTooltipModule, + MatStepperModule, ], templateUrl: './guildraids-log.component.html', - styleUrl: './guildraids-log.component.scss' + styleUrl: './guildraids-log.component.scss', }) export class GuildraidsLogComponent implements OnInit { public now: Date; @@ -49,18 +57,16 @@ export class GuildraidsLogComponent implements OnInit { private _matStepperIntl = inject(MatStepperIntl); private _guildRaids: HWGuildRaid[] = []; private _raidStages: HWGuildRaidStage[] = [ - {num: 1, name: 'Stage 1', maxPower: 350000, duration: 8, startTime: 0, endTime: 0}, - {num: 2, name: 'Stage 2', maxPower: 550000, duration: 8, startTime: 0, endTime: 0}, - {num: 3, name: 'Stage 3', maxPower: 0, duration: 0, startTime: 0, endTime: 0} + { num: 1, name: 'Stage 1', maxPower: 350000, duration: 8, startTime: 0, endTime: 0 }, + { num: 2, name: 'Stage 2', maxPower: 550000, duration: 8, startTime: 0, endTime: 0 }, + { num: 3, name: 'Stage 3', maxPower: 0, duration: 0, startTime: 0, endTime: 0 }, ]; @Input() set members(value: HWMember[]) { this.guildMembers = value; } - constructor( - private fb: FormBuilder - ) { + constructor(private fb: FormBuilder) { this.now = new Date(); const raidsDate = new Date(); const startHour = 4; @@ -71,7 +77,7 @@ export class GuildraidsLogComponent implements OnInit { maxPower: 350, duration: 8, startTime: [raidsDate.getTime(), Validators.required], - endTime: 0 + endTime: 0, }; this.raidsForm = this.fb.group(controlsConfig); } @@ -82,11 +88,11 @@ export class GuildraidsLogComponent implements OnInit { raidsDate.setHours(startHour, 0, 0, 0); this._raidStages[0].startTime = raidsDate.getTime(); - raidsDate.setHours((startHour + this._raidStages[0].duration), 0, 0, 0); + raidsDate.setHours(startHour + this._raidStages[0].duration, 0, 0, 0); this._raidStages[0].endTime = raidsDate.getTime(); this._raidStages[1].startTime = raidsDate.getTime(); - raidsDate.setHours((startHour + this._raidStages[0].duration + this._raidStages[1].duration), 0, 0, 0); + raidsDate.setHours(startHour + this._raidStages[0].duration + this._raidStages[1].duration, 0, 0, 0); this._raidStages[1].endTime = raidsDate.getTime(); this._raidStages[2].startTime = raidsDate.getTime(); @@ -101,19 +107,19 @@ export class GuildraidsLogComponent implements OnInit { data.raids = []; data.raidsInfo = { variationAvg: 0, - variationSum: 0 + variationSum: 0, }; return data; }); for (const member of Object.entries(guildRaids)) { - const index = this.guildMembers.findIndex(item => item.id === member[0]); + const index = this.guildMembers.findIndex((item) => item.id === member[0]); const memberRaids: HWGuildRaid[] = []; if (index !== -1) { for (const data of Object.entries(member[1])) { const raid: HWGuildRaid = {} as HWGuildRaid; Object.assign(raid, data[1]); - const startTime: number = (parseInt(raid.startTime) * 1000); + const startTime: number = parseInt(raid.startTime) * 1000; if (this._guildRaids.length === 0) { this._setStagesTime(startTime); } @@ -139,14 +145,14 @@ export class GuildraidsLogComponent implements OnInit { const attacker: HWGuildRaidAttacker = { id: item[1].id, power: item[1].power, - type: item[1].type + type: item[1].type, } as HWGuildRaidAttacker; raid.power += attacker.power; raid.attackers.push(attacker); } let percent = 0; if (raid.stage.maxPower > 0) { - percent = (((raid.power / raid.stage.maxPower) - 1) * 100); + percent = (raid.power / raid.stage.maxPower - 1) * 100; } let color = 'default'; let value = 0; @@ -158,12 +164,12 @@ export class GuildraidsLogComponent implements OnInit { } else if (percent > 5) { color = 'orange'; } - value = (raid.power - raid.stage.maxPower) + value = raid.power - raid.stage.maxPower; } raid.variation = { value: value, percent: percent, - color: color + color: color, }; raid.tooltip = Math.floor(raid.variation.value / 1000) + 'k'; //console.log(raid.attackers); @@ -172,17 +178,24 @@ export class GuildraidsLogComponent implements OnInit { this._guildRaids.push(raid); } this.guildMembers[index].raids = memberRaids; - const varSum = memberRaids.reduce((accumulator, currentValue) => accumulator + currentValue.variation.percent, 0); + const varSum = memberRaids.reduce( + (accumulator, currentValue) => accumulator + currentValue.variation.percent, + 0, + ); this.guildMembers[index].raidsInfo = { - variationAvg: (varSum / memberRaids.length), - variationSum: varSum + variationAvg: varSum / memberRaids.length, + variationSum: varSum, }; } } - this._guildRaids.sort((a, b) => (a.startTime < b.startTime ? -1 : 1)).map((data) => { - return data; - }); - this.guildMembers.sort((a, b) => (a.raidsInfo.variationAvg > b.raidsInfo.variationAvg ? -1 : 1));/*.map((data) => { + this._guildRaids + .sort((a, b) => (a.startTime < b.startTime ? -1 : 1)) + .map((data) => { + return data; + }); + this.guildMembers.sort((a, b) => + a.raidsInfo.variationAvg > b.raidsInfo.variationAvg ? -1 : 1, + ); /*.map((data) => { console.log(data.name, data.raidsInfo.variationAvg, data.raids.length); return data; });*/ @@ -190,11 +203,13 @@ export class GuildraidsLogComponent implements OnInit { public getMembers(): HWMember[] { //return this.guildMembers; - return this.minVarPct ? this.guildMembers.filter(member => (member.raidsInfo.variationAvg >= this.minVarPct) === true) : this.guildMembers; + return this.minVarPct + ? this.guildMembers.filter((member) => member.raidsInfo.variationAvg >= this.minVarPct === true) + : this.guildMembers; } public getRaidsLog(stageNum: number): HWGuildRaid[] { - return this._guildRaids.filter(raid => (raid.stage.num === stageNum) === true); + return this._guildRaids.filter((raid) => (raid.stage.num === stageNum) === true); } public getStagesTime(stageNum: number): HWGuildRaidStage { @@ -208,7 +223,5 @@ export class GuildraidsLogComponent implements OnInit { } } - submitForm(): void { - } - + submitForm(): void {} } diff --git a/src/app/components/shared/herowars-components/guildwar-attack/guildwar-attack.component.ts b/src/app/components/shared/herowars-components/guildwar-attack/guildwar-attack.component.ts index 832cdd8..4dd2fdf 100644 --- a/src/app/components/shared/herowars-components/guildwar-attack/guildwar-attack.component.ts +++ b/src/app/components/shared/herowars-components/guildwar-attack/guildwar-attack.component.ts @@ -6,26 +6,26 @@ import { MatIconModule } from '@angular/material/icon'; import { FortificationCardContentComponent } from '../fortification-card-content/fortification-card-content.component'; import { - HWGuildWarEnemySlot, HWGuildWarEnemyTeam, HWGuildWarFortification, - HWGuildWarHeroTeam, HWGuildWarTitanTeam, HWGuildWarSlots, HWMember + HWGuildWarEnemySlot, + HWGuildWarEnemyTeam, + HWGuildWarFortification, + HWGuildWarHeroTeam, + HWGuildWarTitanTeam, + HWGuildWarSlots, + HWMember, } from '@models'; /* JSON data */ -import guildWarData from 'src/files-data/hw-guild-war.json'; // page Overview -> Statistics | page Guild War -> Guild War -import guildWarInfo from 'src/files-data/hw-guild-war-info.json'; // page Guild War -> Guild War +import guildWarData from 'src/files-data/hw-guild-war.json'; // page Overview -> Statistics | page Guild War -> Guild War +import guildWarInfo from 'src/files-data/hw-guild-war-info.json'; // page Guild War -> Guild War //import guildWarLog from 'src/files-data/hw-guild-war-log.json'; // page Guild War -> Guild War import guildWarSlots from 'src/files-data/hw-guild-war-slots.json'; // no pages @Component({ selector: 'app-guildwar-attack', - standalone: true, - imports: [ - DatePipe, DecimalPipe, - MatCardModule, MatDividerModule, MatIconModule, - FortificationCardContentComponent - ], + imports: [DatePipe, DecimalPipe, MatCardModule, MatDividerModule, MatIconModule, FortificationCardContentComponent], templateUrl: './guildwar-attack.component.html', - styleUrl: './guildwar-attack.component.scss' + styleUrl: './guildwar-attack.component.scss', }) export class GuildwarAttackComponent implements OnInit { private _championsByPower: HWMember[] = []; @@ -35,13 +35,14 @@ export class GuildwarAttackComponent implements OnInit { public title = 'Fortifications'; public subtitle = 'Guild War Attack'; public now = new Date(); - public warInfo: { day: number, clanEnemyName: string, endTime: number, nextWarTime: number, nextLockTime: number } = { - day: 0, - clanEnemyName: '', - endTime: 0, - nextWarTime: 0, - nextLockTime: 0 - }; + public warInfo: { day: number; clanEnemyName: string; endTime: number; nextWarTime: number; nextLockTime: number } = + { + day: 0, + clanEnemyName: '', + endTime: 0, + nextWarTime: 0, + nextLockTime: 0, + }; @Input() set members(value: HWMember[]) { this.guildMembers = value; @@ -50,9 +51,9 @@ export class GuildwarAttackComponent implements OnInit { ngOnInit() { this.warInfo.day = parseInt(guildWarInfo.day); this.warInfo.clanEnemyName = guildWarInfo.enemyClan.title; - this.warInfo.endTime = (guildWarInfo.endTime * 1000); - this.warInfo.nextWarTime = (guildWarInfo.nextWarTime * 1000); - this.warInfo.nextLockTime = (guildWarInfo.nextLockTime * 1000); + this.warInfo.endTime = guildWarInfo.endTime * 1000; + this.warInfo.nextWarTime = guildWarInfo.nextWarTime * 1000; + this.warInfo.nextLockTime = guildWarInfo.nextLockTime * 1000; this._setChampionsByPower(); this._setEnemies(); } @@ -81,7 +82,7 @@ export class GuildwarAttackComponent implements OnInit { count: count, teams: teams, positions: this._enemySlots, - slots: slots[name] + slots: slots[name], }; } @@ -89,10 +90,10 @@ export class GuildwarAttackComponent implements OnInit { const teams: HWMember[] = []; const slots: HWGuildWarSlots = guildWarSlots.slots; let count = 0; - slots[name].forEach(slot => { + slots[name].forEach((slot) => { let enemies: HWMember[] = []; let team: HWMember = {} as HWMember; - enemies = this.guildEnemies.filter(enemy => parseInt(enemy.id) === this._enemySlots[slot]); + enemies = this.guildEnemies.filter((enemy) => parseInt(enemy.id) === this._enemySlots[slot]); if (enemies.length) { team = enemies[0]; teams.push(team); @@ -115,7 +116,7 @@ export class GuildwarAttackComponent implements OnInit { count: count, teams: teams, positions: this._enemySlots, - slots: slots[name] + slots: slots[name], }; } @@ -125,21 +126,21 @@ export class GuildwarAttackComponent implements OnInit { warriors.push(parseInt(data[0])); } for (const data of Object.entries(guildWarInfo.enemyClanMembers)) { - const enemy: HWMember = {} as HWMember; - Object.assign(enemy, data[1]); - if (warriors.indexOf(parseInt(enemy.id)) !== -1) { - enemy.champion = true; - } else { - enemy.champion = false; - } - enemy.heroes = { power: 0, teams: []}; - enemy.titans = { power: 0, teams: []}; + const enemy: HWMember = {} as HWMember; + Object.assign(enemy, data[1]); + if (warriors.indexOf(parseInt(enemy.id)) !== -1) { + enemy.champion = true; + } else { + enemy.champion = false; + } + enemy.heroes = { power: 0, teams: [] }; + enemy.titans = { power: 0, teams: [] }; - //console.log(guildWarInfo.enemySlots); + //console.log(guildWarInfo.enemySlots); - this.guildEnemies.push(enemy); + this.guildEnemies.push(enemy); } - + for (const data of Object.entries(guildWarInfo.enemySlots)) { const ennemySlot: HWGuildWarEnemySlot = {} as HWGuildWarEnemySlot; Object.assign(ennemySlot, data[1]); @@ -187,13 +188,15 @@ export class GuildwarAttackComponent implements OnInit { return false; }); } - this.guildEnemies.sort((a, b) => ((a.heroes.power + a.titans.power) > (b.heroes.power + b.titans.power) ? -1 : 1)); // Descending + this.guildEnemies.sort((a, b) => + a.heroes.power + a.titans.power > b.heroes.power + b.titans.power ? -1 : 1, + ); // Descending } } private _setChampionsByPower(): void { for (const [teamId, teamValues] of Object.entries(guildWarData.teams)) { - const index = this.guildMembers.findIndex(member => member.id === teamId); + const index = this.guildMembers.findIndex((member) => member.id === teamId); if (index === -1) continue; let totalHeroPower = 0; let totalTitanPower = 0; @@ -211,8 +214,8 @@ export class GuildwarAttackComponent implements OnInit { this.guildMembers[index].heroes = { power: totalHeroPower, teams: heroes }; this.guildMembers[index].titans = { power: totalTitanPower, teams: titans }; } - this.guildMembers.sort((a, b) => ((a.heroes.power + a.titans.power) > (b.heroes.power + b.titans.power) ? -1 : 1)); // Descending - this._championsByPower = this.guildMembers.filter(member => member.champion === true); + this.guildMembers.sort((a, b) => (a.heroes.power + a.titans.power > b.heroes.power + b.titans.power ? -1 : 1)); // Descending + this._championsByPower = this.guildMembers.filter((member) => member.champion === true); } getEnemies(): HWMember[] { @@ -282,5 +285,4 @@ export class GuildwarAttackComponent implements OnInit { //return this._getFortification(indexes, 'titans', 'Spring Of Elements'); return this._getDefense('titans', 'Spring Of Elements'); } - } diff --git a/src/app/components/shared/herowars-components/guildwar-champions/guildwar-champions.component.ts b/src/app/components/shared/herowars-components/guildwar-champions/guildwar-champions.component.ts index dca0da4..900d40b 100644 --- a/src/app/components/shared/herowars-components/guildwar-champions/guildwar-champions.component.ts +++ b/src/app/components/shared/herowars-components/guildwar-champions/guildwar-champions.component.ts @@ -9,13 +9,9 @@ import { HWMember } from '@models'; @Component({ selector: 'app-guildwar-champions', - standalone: true, - imports: [ - DecimalPipe, - MatCardModule, MatDividerModule, MatIconModule - ], + imports: [DecimalPipe, MatCardModule, MatDividerModule, MatIconModule], templateUrl: './guildwar-champions.component.html', - styleUrl: './guildwar-champions.component.scss' + styleUrl: './guildwar-champions.component.scss', }) export class GuildwarChampionsComponent implements OnInit { private _championsByPower: HWMember[] = []; @@ -39,13 +35,13 @@ export class GuildwarChampionsComponent implements OnInit { this.color = 'navy'; this.subtitle = 'heroes power'; this.guildMembers.sort((a, b) => (a.heroes.power > b.heroes.power ? -1 : 1)); // Descending - this._championsByPower = this.guildMembers.filter(member => member.champion === true); + this._championsByPower = this.guildMembers.filter((member) => member.champion === true); break; case 'titans': this.color = 'purple'; this.subtitle = 'titans power'; this.guildMembers.sort((a, b) => (a.titans.power > b.titans.power ? -1 : 1)); // Descending - this._championsByPower = this.guildMembers.filter(member => member.champion === true); + this._championsByPower = this.guildMembers.filter((member) => member.champion === true); break; default: break; diff --git a/src/app/components/shared/herowars-components/guildwar-defence/guildwar-defence.component.ts b/src/app/components/shared/herowars-components/guildwar-defence/guildwar-defence.component.ts index e61a375..a62a73e 100644 --- a/src/app/components/shared/herowars-components/guildwar-defence/guildwar-defence.component.ts +++ b/src/app/components/shared/herowars-components/guildwar-defence/guildwar-defence.component.ts @@ -9,18 +9,14 @@ import { FortificationCardContentComponent } from '../fortification-card-content import { HWGuildWarFortification, HWGuildWarHeroTeam, HWGuildWarSlots, HWGuildWarTitanTeam, HWMember } from '@models'; /* JSON data */ -import guildWarData from 'src/files-data/hw-guild-war.json'; // page Overview -> Statistics | page Guild War -> Guild War +import guildWarData from 'src/files-data/hw-guild-war.json'; // page Overview -> Statistics | page Guild War -> Guild War import guildWarSlots from 'src/files-data/hw-guild-war-slots.json'; // no pages @Component({ selector: 'app-guildwar-defence', - standalone: true, - imports: [ - MatCardModule, MatDividerModule, MatIconModule, - FortificationCardContentComponent - ], + imports: [MatCardModule, MatDividerModule, MatIconModule, FortificationCardContentComponent], templateUrl: './guildwar-defence.component.html', - styleUrl: './guildwar-defence.component.scss' + styleUrl: './guildwar-defence.component.scss', }) export class GuildwarDefenceComponent implements OnInit { private _championsByPower: HWMember[] = []; @@ -40,7 +36,7 @@ export class GuildwarDefenceComponent implements OnInit { ngOnInit() { for (const [teamId, teamValues] of Object.entries(guildWarData.teams)) { - const index = this.guildMembers.findIndex(member => member.id === teamId); + const index = this.guildMembers.findIndex((member) => member.id === teamId); if (index === -1) continue; let totalHeroPower = 0; let totalTitanPower = 0; @@ -75,7 +71,7 @@ export class GuildwarDefenceComponent implements OnInit { default: break; } - this._championsByPower = this.guildMembers.filter(member => member.champion === true); + this._championsByPower = this.guildMembers.filter((member) => member.champion === true); } private _getFortification(indexes: number[], type: string, name: string): HWGuildWarFortification { @@ -104,7 +100,7 @@ export class GuildwarDefenceComponent implements OnInit { count: count, teams: teams, positions: this._championSlots, - slots: slots[name] + slots: slots[name], }; } diff --git a/src/app/components/shared/herowars-components/guildwar-teams/guildwar-teams.component.ts b/src/app/components/shared/herowars-components/guildwar-teams/guildwar-teams.component.ts index 382968c..ce8fd3b 100644 --- a/src/app/components/shared/herowars-components/guildwar-teams/guildwar-teams.component.ts +++ b/src/app/components/shared/herowars-components/guildwar-teams/guildwar-teams.component.ts @@ -10,13 +10,9 @@ import guildWarData from 'src/files-data/hw-guild-war.json'; // page Overview -> @Component({ selector: 'app-guildwar-teams', - standalone: true, - imports: [ - DecimalPipe, - MatCardModule, MatDividerModule, MatIconModule - ], + imports: [DecimalPipe, MatCardModule, MatDividerModule, MatIconModule], templateUrl: './guildwar-teams.component.html', - styleUrl: './guildwar-teams.component.scss' + styleUrl: './guildwar-teams.component.scss', }) export class GuildwarTeamsComponent implements OnInit { private _championsByPower: HWMember[] = []; @@ -33,8 +29,8 @@ export class GuildwarTeamsComponent implements OnInit { } ngOnInit() { - - this.guildMembers.sort((a, b) => (((a.heroes.power + a.titans.power) / 2) > ((b.heroes.power + b.titans.power) / 2) ? -1 : 1)) + this.guildMembers + .sort((a, b) => ((a.heroes.power + a.titans.power) / 2 > (b.heroes.power + b.titans.power) / 2 ? -1 : 1)) .map((data) => { /* this.guildTotalHeroesPower += data.heroes.power; @@ -47,7 +43,7 @@ export class GuildwarTeamsComponent implements OnInit { }); for (const [teamId, teamValues] of Object.entries(guildWarData.teams)) { - const index = this._championsByPower.findIndex(member => member.id === teamId); + const index = this._championsByPower.findIndex((member) => member.id === teamId); if (index === -1) continue; let totalHeroPower = 0; let totalTitanPower = 0; @@ -66,14 +62,15 @@ export class GuildwarTeamsComponent implements OnInit { this._championsByPower[index].titans = { power: totalTitanPower, teams: titans }; this.guildTotalHeroesPower += totalHeroPower; this.guildTotalTitansPower += totalTitanPower; - this._championsByPower[index].rewards = Math.floor((this._championsByPower[index].scoreGifts + this._championsByPower[index].warGifts)); + this._championsByPower[index].rewards = Math.floor( + this._championsByPower[index].scoreGifts + this._championsByPower[index].warGifts, + ); } - this.guildAverageHeroesPower = Math.floor((this.guildTotalHeroesPower / this._championsByPower.length)); - this.guildAverageTitansPower = Math.floor((this.guildTotalTitansPower / this._championsByPower.length)); + this.guildAverageHeroesPower = Math.floor(this.guildTotalHeroesPower / this._championsByPower.length); + this.guildAverageTitansPower = Math.floor(this.guildTotalTitansPower / this._championsByPower.length); } getChampionsByPower(): HWMember[] { return this._championsByPower; } - } diff --git a/src/app/components/shared/herowars-components/members-statistics/members-statistics.component.ts b/src/app/components/shared/herowars-components/members-statistics/members-statistics.component.ts index 650f1ad..c0f1ed1 100644 --- a/src/app/components/shared/herowars-components/members-statistics/members-statistics.component.ts +++ b/src/app/components/shared/herowars-components/members-statistics/members-statistics.component.ts @@ -7,76 +7,128 @@ import { MatIconModule } from '@angular/material/icon'; import { HWActivityStat, HWGuildClan, HWGuildData, HWMember, HWMemberStat, HWWeekStat } from '@models/herowars'; import { UtilitiesService } from '@services'; -import guildData from 'src/files-data/hw-guild-data.json'; // page Membres +import guildData from 'src/files-data/hw-guild-data.json'; // page Membres import guildStatistics from 'src/files-data/hw-guild-statistics.json'; // page Overview -> Statistics @Component({ selector: 'app-members-statistics', - standalone: true, - imports: [ - DatePipe, DecimalPipe, - MatCardModule, MatDividerModule, MatIconModule - ], + imports: [DatePipe, DecimalPipe, MatCardModule, MatDividerModule, MatIconModule], templateUrl: './members-statistics.component.html', - styleUrl: './members-statistics.component.scss' + styleUrl: './members-statistics.component.scss', }) export class MembersStatisticsComponent implements OnInit { public guildMembers: HWMember[] = []; public title = 'Members'; public subtitle = 'statistics'; public daysToWarn = 1; - public guildSumAverages: HWActivityStat = { activity: 0, prestige: 0, titanite: 0, war: 0, adventure: 0, gifts: 0, score: 0, scoreGifts: 0, warGifts: 0, rewards: 0 }; - public guildTodayAverages: HWActivityStat = { activity: 0, prestige: 0, titanite: 0, war: 0, adventure: 0, gifts: 0, score: 0, scoreGifts: 0, warGifts: 0, rewards: 0 }; - public guildSumTotal: HWActivityStat = { activity: 0, prestige: 0, titanite: 0, war: 0, adventure: 0, gifts: 0, score: 0, scoreGifts: 0, warGifts: 0, rewards: 0 }; - public guildTodayTotal: HWActivityStat = { activity: 0, prestige: 0, titanite: 0, war: 0, adventure: 0, gifts: 0, score: 0, scoreGifts: 0, warGifts: 0, rewards: 0 }; + public guildSumAverages: HWActivityStat = { + activity: 0, + prestige: 0, + titanite: 0, + war: 0, + adventure: 0, + gifts: 0, + score: 0, + scoreGifts: 0, + warGifts: 0, + rewards: 0, + }; + public guildTodayAverages: HWActivityStat = { + activity: 0, + prestige: 0, + titanite: 0, + war: 0, + adventure: 0, + gifts: 0, + score: 0, + scoreGifts: 0, + warGifts: 0, + rewards: 0, + }; + public guildSumTotal: HWActivityStat = { + activity: 0, + prestige: 0, + titanite: 0, + war: 0, + adventure: 0, + gifts: 0, + score: 0, + scoreGifts: 0, + warGifts: 0, + rewards: 0, + }; + public guildTodayTotal: HWActivityStat = { + activity: 0, + prestige: 0, + titanite: 0, + war: 0, + adventure: 0, + gifts: 0, + score: 0, + scoreGifts: 0, + warGifts: 0, + rewards: 0, + }; public guildData: HWGuildData = {} as HWGuildData; private _guildClan: HWGuildClan = {} as HWGuildClan; private _membersByName: HWMember[] = []; - private _deviations: { activity: number[], prestige: number[], titanite: number[] } = { activity: [], prestige: [], titanite: [] }; + private _deviations: { activity: number[]; prestige: number[]; titanite: number[] } = { + activity: [], + prestige: [], + titanite: [], + }; @Input() set members(value: HWMember[]) { this.guildMembers = value; } - - constructor( - private _utilitiesService: UtilitiesService - ) { } + + constructor(private _utilitiesService: UtilitiesService) {} ngOnInit() { - - const oneDayInSec = (24 * 60 * 60); + const oneDayInSec = 24 * 60 * 60; const today = new Date(); const daysToKick = parseInt(guildData.clan.daysToKick); - this.daysToWarn = (parseInt(guildData.clan.daysToKick) / 2); - this.guildMembers.sort((a, b) => (a.name.toLowerCase() < b.name.toLowerCase() ? -1 : 1)).map((data) => { - const last = new Date((parseInt(data.lastLoginTime) * 1000)); - const exp = new Date(last.getTime() + ((daysToKick * oneDayInSec) * 1000)); - const diff = Math.floor(((exp.getTime() - today.getTime()) / 1000)); - const daysLeft = Math.floor((diff / oneDayInSec)); - let timeLeft = diff; - if (daysLeft >= 1) { - timeLeft = (diff - (daysLeft * oneDayInSec)); - } - data.inactivity = { - daysLeft: daysLeft, - timeLeft: timeLeft, - dropDelay: `${daysLeft}d, ${this._utilitiesService.secondsToDuration(timeLeft)}`, - dropDate: Math.floor((exp.getTime() / 1000)) - }; - this._membersByName.push(data); - return data; - }); + this.daysToWarn = parseInt(guildData.clan.daysToKick) / 2; + this.guildMembers + .sort((a, b) => (a.name.toLowerCase() < b.name.toLowerCase() ? -1 : 1)) + .map((data) => { + const last = new Date(parseInt(data.lastLoginTime) * 1000); + const exp = new Date(last.getTime() + daysToKick * oneDayInSec * 1000); + const diff = Math.floor((exp.getTime() - today.getTime()) / 1000); + const daysLeft = Math.floor(diff / oneDayInSec); + let timeLeft = diff; + if (daysLeft >= 1) { + timeLeft = diff - daysLeft * oneDayInSec; + } + data.inactivity = { + daysLeft: daysLeft, + timeLeft: timeLeft, + dropDelay: `${daysLeft}d, ${this._utilitiesService.secondsToDuration(timeLeft)}`, + dropDate: Math.floor(exp.getTime() / 1000), + }; + this._membersByName.push(data); + return data; + }); Object.assign(this._guildClan, guildData.clan); this.guildData.clan = this._guildClan; this.guildData.membersStat = guildData.membersStat; for (const item of Object.entries(guildStatistics.stat)) { - const index = this._membersByName.findIndex(member => member.id === item[1].id); + const index = this._membersByName.findIndex((member) => member.id === item[1].id); if (index !== -1) { - this._membersByName[index].adventureSum = item[1].adventureStat.reduce((accumulator, currentValue) => accumulator + currentValue, 0); - this._membersByName[index].clanGiftsSum = item[1].clanGifts.reduce((accumulator, currentValue) => accumulator + currentValue, 0); - this._membersByName[index].clanWarSum = item[1].clanWarStat.reduce((accumulator, currentValue) => accumulator + currentValue, 0); + this._membersByName[index].adventureSum = item[1].adventureStat.reduce( + (accumulator, currentValue) => accumulator + currentValue, + 0, + ); + this._membersByName[index].clanGiftsSum = item[1].clanGifts.reduce( + (accumulator, currentValue) => accumulator + currentValue, + 0, + ); + this._membersByName[index].clanWarSum = item[1].clanWarStat.reduce( + (accumulator, currentValue) => accumulator + currentValue, + 0, + ); this.guildSumTotal.adventure += this._membersByName[index].adventureSum; this.guildSumTotal.gifts += this._membersByName[index].clanGiftsSum; this.guildSumTotal.war += this._membersByName[index].clanWarSum; @@ -91,19 +143,26 @@ export class MembersStatisticsComponent implements OnInit { for (const data of Object.entries(guildData.membersStat)) { const stat: HWMemberStat = {} as HWMemberStat; Object.assign(stat, data[1]); - const index = this._membersByName.findIndex(member => member.id === data[1].userId); + const index = this._membersByName.findIndex((member) => member.id === data[1].userId); if (index !== -1) { this._membersByName[index].stat = stat; } else { continue; } - this._membersByName[index].score = (this._membersByName[index].stat.dungeonActivitySum + this._membersByName[index].stat.activitySum + this._membersByName[index].stat.prestigeSum); - this._membersByName[index].warGifts = (((guildData.clan.giftsCount / 2) * ((this._membersByName[index].clanWarSum * 10) / 100)) / 20); + this._membersByName[index].score = + this._membersByName[index].stat.dungeonActivitySum + + this._membersByName[index].stat.activitySum + + this._membersByName[index].stat.prestigeSum; + this._membersByName[index].warGifts = + ((guildData.clan.giftsCount / 2) * ((this._membersByName[index].clanWarSum * 10) / 100)) / 20; this.guildTodayTotal.activity += stat.todayActivity; this.guildTodayTotal.prestige += stat.todayPrestige; this.guildTodayTotal.titanite += stat.todayDungeonActivity; - this.guildTodayTotal.score += (this._membersByName[index].stat.todayDungeonActivity + this._membersByName[index].stat.todayActivity + this._membersByName[index].stat.todayPrestige); + this.guildTodayTotal.score += + this._membersByName[index].stat.todayDungeonActivity + + this._membersByName[index].stat.todayActivity + + this._membersByName[index].stat.todayPrestige; this.guildSumTotal.activity += stat.activitySum; this.guildSumTotal.prestige += stat.prestigeSum; this.guildSumTotal.titanite += stat.dungeonActivitySum; @@ -114,26 +173,26 @@ export class MembersStatisticsComponent implements OnInit { this._deviations.titanite.push(stat.dungeonActivitySum); //this.guildSumTotal.warGifts += ((this._membersByName[index].score / this.guildSumTotal.score) * (guildData.clan.giftsCount / 2)) } - this.guildSumTotal.scoreGifts = (guildData.clan.giftsCount - Math.floor(this.guildSumTotal.warGifts)); - this.guildTodayAverages.activity = (this.guildTodayTotal.activity / this._membersByName.length); - this.guildTodayAverages.prestige = (this.guildTodayTotal.prestige / this._membersByName.length); - this.guildTodayAverages.titanite = (this.guildTodayTotal.titanite / this._membersByName.length); - this.guildTodayAverages.score = (this.guildTodayTotal.score / this._membersByName.length); - this.guildSumAverages.activity = (this.guildSumTotal.activity / this._membersByName.length); - this.guildSumAverages.prestige = (this.guildSumTotal.prestige / this._membersByName.length); - this.guildSumAverages.titanite = (this.guildSumTotal.titanite / this._membersByName.length); - this.guildSumAverages.war = (this.guildSumTotal.war / 20); - this.guildSumAverages.adventure = (this.guildSumTotal.adventure / this._membersByName.length); - this.guildSumAverages.gifts = (this.guildSumTotal.gifts / this._membersByName.length); - this.guildSumAverages.score = (this.guildSumTotal.score / this._membersByName.length); + this.guildSumTotal.scoreGifts = guildData.clan.giftsCount - Math.floor(this.guildSumTotal.warGifts); + this.guildTodayAverages.activity = this.guildTodayTotal.activity / this._membersByName.length; + this.guildTodayAverages.prestige = this.guildTodayTotal.prestige / this._membersByName.length; + this.guildTodayAverages.titanite = this.guildTodayTotal.titanite / this._membersByName.length; + this.guildTodayAverages.score = this.guildTodayTotal.score / this._membersByName.length; + this.guildSumAverages.activity = this.guildSumTotal.activity / this._membersByName.length; + this.guildSumAverages.prestige = this.guildSumTotal.prestige / this._membersByName.length; + this.guildSumAverages.titanite = this.guildSumTotal.titanite / this._membersByName.length; + this.guildSumAverages.war = this.guildSumTotal.war / 20; + this.guildSumAverages.adventure = this.guildSumTotal.adventure / this._membersByName.length; + this.guildSumAverages.gifts = this.guildSumTotal.gifts / this._membersByName.length; + this.guildSumAverages.score = this.guildSumTotal.score / this._membersByName.length; this._membersByName.map((data) => { - data.scoreGifts = ((data.score / this.guildSumTotal.score) * this.guildSumTotal.scoreGifts); - data.rewards = Math.floor((data.scoreGifts + data.warGifts)); + data.scoreGifts = (data.score / this.guildSumTotal.score) * this.guildSumTotal.scoreGifts; + data.rewards = Math.floor(data.scoreGifts + data.warGifts); this.guildSumTotal.rewards += data.rewards; return data; }); - this.guildSumAverages.rewards = (this.guildSumTotal.rewards / this._membersByName.length); + this.guildSumAverages.rewards = this.guildSumTotal.rewards / this._membersByName.length; } getMembersByName(): HWMember[] { @@ -143,7 +202,7 @@ export class MembersStatisticsComponent implements OnInit { private _standardDeviation(array: number[]): number { const n = array.length; const mean = array.reduce((a, b) => a + b) / n; - return Math.sqrt(array.map(x => Math.pow(x - mean, 2)).reduce((a, b) => a + b) / n); + return Math.sqrt(array.map((x) => Math.pow(x - mean, 2)).reduce((a, b) => a + b) / n); } getStandardDeviationActivity(): number { @@ -157,5 +216,4 @@ export class MembersStatisticsComponent implements OnInit { getStandardDeviationTitanite(): number { return this._standardDeviation(this._deviations.titanite); } - } diff --git a/src/app/components/shared/layout/footer.component.ts b/src/app/components/shared/layout/footer.component.ts index d0f9b4e..cd959bc 100644 --- a/src/app/components/shared/layout/footer.component.ts +++ b/src/app/components/shared/layout/footer.component.ts @@ -4,8 +4,7 @@ import { DatePipe } from '@angular/common'; @Component({ selector: 'app-layout-footer', templateUrl: './footer.component.html', - standalone: true, - imports: [ DatePipe ] + imports: [DatePipe], }) export class FooterComponent { today: number = Date.now(); diff --git a/src/app/components/shared/layout/full.component.ts b/src/app/components/shared/layout/full.component.ts index 7606700..f83e44a 100755 --- a/src/app/components/shared/layout/full.component.ts +++ b/src/app/components/shared/layout/full.component.ts @@ -1,116 +1,126 @@ -import { Component, OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core'; -import { Router, RouterOutlet, RouterModule } from '@angular/router'; -import { MediaMatcher } from '@angular/cdk/layout'; -import { MatBadgeModule } from '@angular/material/badge'; -import { MatButtonModule } from '@angular/material/button'; -import { MatDividerModule } from '@angular/material/divider'; -import { MatIconModule } from '@angular/material/icon'; -import { MatListModule } from '@angular/material/list'; -import { MatSidenavModule } from '@angular/material/sidenav'; -import { MatToolbarModule } from '@angular/material/toolbar'; -import { MatMenuModule } from '@angular/material/menu'; -import { Observable, Subscription } from 'rxjs'; - -import { Menu, User } from '@models'; -import { UserService } from '@services'; -import { MenuItems, ShowAuthedDirective, AccordionAnchorDirective, AccordionLinkDirective, AccordionDirective } from '@components/shared'; -//import { SpinnerComponent } from '@components/shared'; -//import { HeaderComponent, FooterComponent } from '@components/shared/layout'; -import { FooterComponent } from '@components/shared/layout'; - - -/** @title Responsive sidenav */ -@Component({ - selector: 'app-full-layout', - standalone: true, - imports: [ - RouterModule, RouterOutlet, - MatBadgeModule, MatButtonModule, MatDividerModule, - MatIconModule, MatListModule, MatMenuModule, - MatSidenavModule, MatToolbarModule, - ShowAuthedDirective, AccordionAnchorDirective, - AccordionLinkDirective, AccordionDirective, - FooterComponent - //HeaderComponent, - //SpinnerComponent - ], - providers: [ MenuItems ], - templateUrl: 'full.component.html', - styleUrls: [] -}) -export class FullComponent implements OnInit, OnDestroy { - private _currentUser: Subscription = new Subscription(); - private _mobileQueryListener: () => void; - mobileQuery: MediaQueryList; - currentUser: User = {} as User; - today: number = Date.now(); - siteLink = 'https://www.adastra-cbd.com'; - author = 'Ad Astra'; - links: Menu[] = []; - visibleMenu: string[] = []; - //visibleMenu: string[] = ['products', 'page']; - //visibleMenu: string[] = ['products']; - - constructor( - private router: Router, - private userService: UserService, - changeDetectorRef: ChangeDetectorRef, - media: MediaMatcher, - public menuItems: MenuItems - ) { - this.mobileQuery = media.matchMedia('(min-width: 768px)'); - this._mobileQueryListener = () => changeDetectorRef.detectChanges(); - this.mobileQuery.addListener(this._mobileQueryListener); - } - - ngOnInit() { - const user$: Observable = this.userService.currentUser; - this._currentUser = user$.subscribe( - (userData) => { - this.currentUser = userData; - if (this.currentUser.role === 'Admin') { - this.links = this.menuItems.getMenuItemsAdmin(); - //this.links = this.menuItems.getMenuItems(); - } else { - this.links = this.menuItems.getMenuItems(); - } - } - ); - } - - getMenuItems(): Menu[] { - return this.links; - } - - isVisibleMenu(state: string): boolean { - const indexOf: number = this.visibleMenu.indexOf(state); - if (indexOf !== -1) { - return true; - } else { - return false; - } - } - - ngOnDestroy(): void { - this._currentUser.unsubscribe(); - this.mobileQuery.removeListener(this._mobileQueryListener); - } - - goToGitHub() { - window.open('https://github.com/rampeur', '_blank'); - } - - toggleShowMenu(state: string) { - const indexOf: number = this.visibleMenu.indexOf(state); - if (indexOf !== -1) { - this.visibleMenu.splice(indexOf, 1); - } else { - this.visibleMenu.push(state); - } - } - - logout() { - this.userService.purgeAuth(); - this.router.navigateByUrl('/login'); - } -} +import { Component, OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core'; +import { Router, RouterOutlet, RouterModule } from '@angular/router'; +import { MediaMatcher } from '@angular/cdk/layout'; +import { MatBadgeModule } from '@angular/material/badge'; +import { MatButtonModule } from '@angular/material/button'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatIconModule } from '@angular/material/icon'; +import { MatListModule } from '@angular/material/list'; +import { MatSidenavModule } from '@angular/material/sidenav'; +import { MatToolbarModule } from '@angular/material/toolbar'; +import { MatMenuModule } from '@angular/material/menu'; +import { Observable, Subscription } from 'rxjs'; + +import { Menu, User } from '@models'; +import { UserService } from '@services'; +import { + MenuItems, + ShowAuthedDirective, + AccordionAnchorDirective, + AccordionLinkDirective, + AccordionDirective, +} from '@components/shared'; +//import { SpinnerComponent } from '@components/shared'; +//import { HeaderComponent, FooterComponent } from '@components/shared/layout'; +import { FooterComponent } from '@components/shared/layout'; + +/** @title Responsive sidenav */ +@Component({ + selector: 'app-full-layout', + imports: [ + RouterModule, + RouterOutlet, + MatBadgeModule, + MatButtonModule, + MatDividerModule, + MatIconModule, + MatListModule, + MatMenuModule, + MatSidenavModule, + MatToolbarModule, + ShowAuthedDirective, + AccordionAnchorDirective, + AccordionLinkDirective, + AccordionDirective, + FooterComponent, + //HeaderComponent, + //SpinnerComponent + ], + providers: [MenuItems], + templateUrl: 'full.component.html', + styleUrls: [], +}) +export class FullComponent implements OnInit, OnDestroy { + private _currentUser: Subscription = new Subscription(); + private _mobileQueryListener: () => void; + mobileQuery: MediaQueryList; + currentUser: User = {} as User; + today: number = Date.now(); + siteLink = 'https://www.adastra-cbd.com'; + author = 'Ad Astra'; + links: Menu[] = []; + visibleMenu: string[] = []; + //visibleMenu: string[] = ['products', 'page']; + //visibleMenu: string[] = ['products']; + + constructor( + private router: Router, + private userService: UserService, + changeDetectorRef: ChangeDetectorRef, + media: MediaMatcher, + public menuItems: MenuItems, + ) { + this.mobileQuery = media.matchMedia('(min-width: 768px)'); + this._mobileQueryListener = () => changeDetectorRef.detectChanges(); + this.mobileQuery.addListener(this._mobileQueryListener); + } + + ngOnInit() { + const user$: Observable = this.userService.currentUser; + this._currentUser = user$.subscribe((userData) => { + this.currentUser = userData; + if (this.currentUser.role === 'Admin') { + this.links = this.menuItems.getMenuItemsAdmin(); + //this.links = this.menuItems.getMenuItems(); + } else { + this.links = this.menuItems.getMenuItems(); + } + }); + } + + getMenuItems(): Menu[] { + return this.links; + } + + isVisibleMenu(state: string): boolean { + const indexOf: number = this.visibleMenu.indexOf(state); + if (indexOf !== -1) { + return true; + } else { + return false; + } + } + + ngOnDestroy(): void { + this._currentUser.unsubscribe(); + this.mobileQuery.removeListener(this._mobileQueryListener); + } + + goToGitHub() { + window.open('https://github.com/rampeur', '_blank'); + } + + toggleShowMenu(state: string) { + const indexOf: number = this.visibleMenu.indexOf(state); + if (indexOf !== -1) { + this.visibleMenu.splice(indexOf, 1); + } else { + this.visibleMenu.push(state); + } + } + + logout() { + this.userService.purgeAuth(); + this.router.navigateByUrl('/login'); + } +} diff --git a/src/app/components/shared/layout/header.component.ts b/src/app/components/shared/layout/header.component.ts index b7510d8..7826bf1 100644 --- a/src/app/components/shared/layout/header.component.ts +++ b/src/app/components/shared/layout/header.component.ts @@ -6,7 +6,7 @@ import { MatDividerModule } from '@angular/material/divider'; import { MatIconModule } from '@angular/material/icon'; import { MatMenuModule } from '@angular/material/menu'; import { MatToolbarModule } from '@angular/material/toolbar'; -import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { Observable, Subscription } from 'rxjs'; import { User } from '@models'; @@ -15,15 +15,17 @@ import { UserService } from '@services'; @Component({ selector: 'app-layout-header', templateUrl: './header.component.html', - standalone: true, imports: [ - RouterLink, RouterLinkActive, - MatToolbarModule, MatButtonModule, MatDividerModule, - MatIconModule, MatMenuModule - ] + RouterLink, + RouterLinkActive, + MatToolbarModule, + MatButtonModule, + MatDividerModule, + MatIconModule, + MatMenuModule, + ], }) export class HeaderComponent implements OnInit { - private _currentUser: Subscription = new Subscription(); private _isAuthenticated: Subscription = new Subscription(); private isAuthenticated = false; @@ -32,22 +34,18 @@ export class HeaderComponent implements OnInit { constructor( private router: Router, - private userService: UserService - ) { } + private userService: UserService, + ) {} ngOnInit() { const user$: Observable = this.userService.currentUser.pipe(takeUntilDestroyed(this.destroyRef)); - this._currentUser = user$.subscribe( - (userData) => { - this.currentUser = userData; - } - ); + this._currentUser = user$.subscribe((userData) => { + this.currentUser = userData; + }); const auth$: Observable = this.userService.isAuthenticated.pipe(takeUntilDestroyed(this.destroyRef)); - this._isAuthenticated = auth$.subscribe( - (value) => { - this.isAuthenticated = value; - } - ); + this._isAuthenticated = auth$.subscribe((value) => { + this.isAuthenticated = value; + }); } goToGitHub() { diff --git a/src/app/components/shared/list-errors/list-errors.component.ts b/src/app/components/shared/list-errors/list-errors.component.ts index c88223f..8e5b5bc 100644 --- a/src/app/components/shared/list-errors/list-errors.component.ts +++ b/src/app/components/shared/list-errors/list-errors.component.ts @@ -1,5 +1,5 @@ import { Component, Input } from '@angular/core'; -import { NgForOf, NgIf } from "@angular/common"; +import { NgForOf, NgIf } from '@angular/common'; import { MatCardModule } from '@angular/material/card'; import { Errors } from 'src/app/core'; @@ -7,17 +7,14 @@ import { Errors } from 'src/app/core'; @Component({ selector: 'app-list-errors', templateUrl: './list-errors.component.html', - standalone: true, - imports: [NgIf, NgForOf, MatCardModule] + imports: [NgIf, NgForOf, MatCardModule], }) export class ListErrorsComponent { errorList: string[] = []; @Input() set errors(errorList: Errors | null) { this.errorList = errorList - ? Object.keys(errorList.errors || {}).map( - (key) => `${key} ${errorList.errors[key]}`, - ) + ? Object.keys(errorList.errors || {}).map((key) => `${key} ${errorList.errors[key]}`) : []; } -} \ No newline at end of file +} diff --git a/src/app/components/shared/spinner/spinner.component.ts b/src/app/components/shared/spinner/spinner.component.ts index 7c79351..3dc9963 100755 --- a/src/app/components/shared/spinner/spinner.component.ts +++ b/src/app/components/shared/spinner/spinner.component.ts @@ -1,44 +1,43 @@ -import { Component, Input, OnDestroy, Inject, ViewEncapsulation } from '@angular/core'; - -import { Router, NavigationStart, NavigationEnd, NavigationCancel, NavigationError } from '@angular/router'; -import { DOCUMENT } from '@angular/common'; - -@Component({ - selector: 'app-spinner', - standalone: true, - imports: [], - templateUrl: './spinner.component.html', - encapsulation: ViewEncapsulation.None -}) -export class SpinnerComponent implements OnDestroy { - public isSpinnerVisible = true; - - @Input() - public backgroundColor = 'rgba(0, 115, 170, 0.69)'; - - constructor( - private router: Router, - @Inject(DOCUMENT) private document: Document - ) { - this.router.events.subscribe( - event => { - if (event instanceof NavigationStart) { - this.isSpinnerVisible = true; - } else if ( - event instanceof NavigationEnd || - event instanceof NavigationCancel || - event instanceof NavigationError - ) { - this.isSpinnerVisible = false; - } - }, - () => { - this.isSpinnerVisible = false; - } - ); - } - - ngOnDestroy(): void { - this.isSpinnerVisible = false; - } -} +import { Component, Input, OnDestroy, Inject, ViewEncapsulation } from '@angular/core'; + +import { Router, NavigationStart, NavigationEnd, NavigationCancel, NavigationError } from '@angular/router'; +import { DOCUMENT } from '@angular/common'; + +@Component({ + selector: 'app-spinner', + imports: [], + templateUrl: './spinner.component.html', + encapsulation: ViewEncapsulation.None, +}) +export class SpinnerComponent implements OnDestroy { + public isSpinnerVisible = true; + + @Input() + public backgroundColor = 'rgba(0, 115, 170, 0.69)'; + + constructor( + private router: Router, + @Inject(DOCUMENT) private document: Document, + ) { + this.router.events.subscribe( + (event) => { + if (event instanceof NavigationStart) { + this.isSpinnerVisible = true; + } else if ( + event instanceof NavigationEnd || + event instanceof NavigationCancel || + event instanceof NavigationError + ) { + this.isSpinnerVisible = false; + } + }, + () => { + this.isSpinnerVisible = false; + }, + ); + } + + ngOnDestroy(): void { + this.isSpinnerVisible = false; + } +} diff --git a/src/styles/styles.scss b/src/styles/styles.scss index 2d16db8..41ec18f 100644 --- a/src/styles/styles.scss +++ b/src/styles/styles.scss @@ -4,18 +4,18 @@ Author: UnEspace Email: rampeur@gmail.com File: scss */ -@use 'sass:color'; -@use 'sass:map'; -@use './components'; -@use '@angular/material' as mat; +@use "sass:color"; +@use "sass:map"; +@use "./components"; +@use "@angular/material" as mat; /* Bootstrap */ // Functions first @import "bootstrap/scss/functions"; // Variable overrides second -@import 'variable'; -@import 'palettes'; +@import "variable"; +@import "palettes"; // Required Bootstrap imports @import "bootstrap/scss/variables"; @@ -42,7 +42,8 @@ File: scss // Utilities @import "bootstrap/scss/utilities/api"; -@include mat.core(); +@include mat.elevation-classes(); +@include mat.app-background(); // Define the palettes for your theme using the Material Design palettes available in palette.scss // (imported above). For each palette, you can optionally specify a default, lighter, and darker @@ -82,35 +83,37 @@ $adastra_app-grey: mat.m2-define-palette(mat.$m2-grey-palette, 400); $adastra_app-muted: mat.m2-define-palette(mat.$m2-grey-palette, 300); $custom-typography: mat.m2-define-typography-config( - $font-family: 'Barlow, sans-serif', + $font-family: "Barlow, sans-serif", $body-1: mat.m2-define-typography-level( - $font-family: 'Barlow, sans-serif', - $font-weight: 400, - $font-size: 14px, - $line-height: 1.42857143, - $letter-spacing: normal, - ), + $font-family: "Barlow, sans-serif", + $font-weight: 400, + $font-size: 14px, + $line-height: 1.42857143, + $letter-spacing: normal, + ), $body-2: mat.m2-define-typography-level( - $font-family: 'Barlow, sans-serif', - $font-weight: 500, - $font-size: 14px, - $line-height: 22px, - $letter-spacing: normal, - ) + $font-family: "Barlow, sans-serif", + $font-weight: 500, + $font-size: 14px, + $line-height: 22px, + $letter-spacing: normal, + ), ); // Create the theme object. A theme consists of configurations for individual // theming systems such as "color" or "typography". //$adastra_app-theme: mat.m2-define-dark-theme(( -$adastra_app-theme: mat.m2-define-light-theme(( - color: ( - primary: $adastra_app-primary, - accent: $adastra_app-accent, - warn: $adastra_app-warn, - ), - typography: $custom-typography, - density: 0 -)); +$adastra_app-theme: mat.m2-define-light-theme( + ( + color: ( + primary: $adastra_app-primary, + accent: $adastra_app-accent, + warn: $adastra_app-warn, + ), + typography: $custom-typography, + density: 0, + ) +); $adastra_app-variants: ( secondary: $adastra_app-secondary, @@ -135,7 +138,7 @@ $adastra_app-variants: ( magenta: $adastra_app-magenta, pink: $adastra_app-pink, grey: $adastra_app-grey, - muted: $adastra_app-muted + muted: $adastra_app-muted, ); /* $config: mat.m2-get-color-config($adastra_app-theme); @@ -176,7 +179,12 @@ $background: map.get($adastra_app-theme, background); @each $variant, $var-color in $grays { .bg-gray-#{"" + $variant} { --#{$prefix}-bg-opacity: 1; - background-color: RGBA(color.red($var-color), color.green($var-color), color.blue($var-color), var(--#{$prefix}bg-opacity, 1)) !important; + background-color: RGBA( + color.red($var-color), + color.green($var-color), + color.blue($var-color), + var(--#{$prefix}bg-opacity, 1) + ) !important; /* background-color: RGBA(color.channel($var-color, "red"), color.channel($var-color, "green"), color.channel($var-color, "blue"), var(--#{$prefix}bg-opacity, 1)) !important; */ } } @@ -187,13 +195,13 @@ $background: map.get($adastra_app-theme, background); } } -@import 'spinner'; -@import 'icomoon'; -@import 'header'; -@import 'sidebar'; -@import 'tables'; -@import 'charts'; -@import 'responsive'; -@import 'app'; +@import "spinner"; +@import "icomoon"; +@import "header"; +@import "sidebar"; +@import "tables"; +@import "charts"; +@import "responsive"; +@import "app"; //@import "../styles/icons/material-design-iconic-font/css/materialdesignicons.min.css";