diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
index 89c479f..8279c7d 100644
--- a/.devcontainer/devcontainer.json
+++ b/.devcontainer/devcontainer.json
@@ -13,15 +13,18 @@
"customizations": {
"vscode": {
"extensions": [
+ "angular.ng-template",
+ "azurite.azurite",
"ms-azuretools.vscode-azurefunctions",
- "ms-dotnettools.csharp",
- "angular.ng-template"
- ]
+ "ms-azuretools.vscode-azurestorage",
+ "ms-dotnettools.csdevkit",
+ "ms-vscode-remote.remote-containers"
+ ],
+ "settings": {
+ "terminal.integrated.shell.linux": "/usr/bin/bash"
+ }
}
},
- "settings": {
- "terminal.integrated.shell.linux": "/usr/bin/bash"
- },
"postCreateCommand": "cd client && npm install",
"remoteEnv": {
"ALPACA_KEY": "${localEnv:ALPACA_KEY}",
diff --git a/.editorconfig b/.editorconfig
index 388b5d3..501f0db 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -1,23 +1,39 @@
-# top-most EditorConfig file
+# EditorConfig: https://EditorConfig.org
root = true
-# see Client and Server folders for
-# language unique editor configurations
-
-# global baselines
+#### Core EditorConfig Options ####
[*]
-charset = utf-8
-end_of_line = lf
+charset = utf-8 # Use UTF-8 character encoding
+end_of_line = lf # Use LF line endings (Unix-style)
+insert_final_newline = true # Add empty line at end of files
+trim_trailing_whitespace = true # Remove whitespace at end of lines
+indent_style = space # Use spaces for indentation
+indent_size = 2 # Use 2 spaces per indentation level
+tab_width = 2 # Set tab width to 2 spaces
+
+# Markdown files
+[*.md]
+trim_trailing_whitespace = false # Allow trailing whitespace for line breaks
+
+# Batch and command files
+[*.{cmd,bat}]
+end_of_line = crlf # Use CRLF for Windows specific files
+
+# .NET source files
+[*.{cs,vb}]
+indent_size = 4 # Use 4 spaces for .NET files
+tab_width = 4 # Set tab width to 4 spaces
+
+dotnet_sort_system_directives_first = true # Place System.* usings before others
+dotnet_separate_import_directive_groups = false # Don't add blank lines between using directives
-indent_style = space
-indent_size = 2
-tab_width = 2
+csharp_style_var_elsewhere = false # Use explicit types when type isn't obvious
+csharp_style_var_for_built_in_types = false # Use explicit types for built-in types
+csharp_style_var_when_type_is_apparent = false # Use explicit types even when obvious
-line_length = 150
-max_line_length = 150
-trim_trailing_whitespace = true
-insert_final_newline = true
+# Expression-level preferences that differ from defaults
+csharp_style_expression_bodied_methods = true:silent # Allow expression-bodied methods
+csharp_style_expression_bodied_properties = true:silent # Allow expression-bodied properties
-[*.{xml,yml}]
-indent_style = space
-indent_size = 2
+# Diagnostic overrides
+dotnet_diagnostic.IDE0058.severity = none # Disable "use '_' discard" value warnings
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
index bb76300..d340b7d 100644
--- a/.vscode/extensions.json
+++ b/.vscode/extensions.json
@@ -1,6 +1,10 @@
{
"recommendations": [
+ "angular.ng-template",
+ "azurite.azurite",
"ms-azuretools.vscode-azurefunctions",
- "ms-dotnettools.csharp"
+ "ms-azuretools.vscode-azurestorage",
+ "ms-dotnettools.csdevkit",
+ "ms-vscode-remote.remote-containers"
]
-}
\ No newline at end of file
+}
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 940c4a5..a6c0ff1 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -1,6 +1,6 @@
{
"azureFunctions.projectSubpath": "server\\Functions",
- "azureFunctions.deploySubpath": "server\\Functions/bin/Release/net8.0/publish",
+ "azureFunctions.deploySubpath": "server\\Functions/bin/Release/net9.0/publish",
"azureFunctions.projectLanguage": "C#",
"azureFunctions.projectRuntime": "~4",
"debug.internalConsoleOptions": "neverOpen",
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
index b32202e..f58d5ee 100644
--- a/.vscode/tasks.json
+++ b/.vscode/tasks.json
@@ -71,7 +71,7 @@
"type": "func",
"dependsOn": "build (functions)",
"options": {
- "cwd": "${workspaceFolder}/server\\Functions/bin/Debug/net8.0"
+ "cwd": "${workspaceFolder}/server\\Functions/bin/Debug/net9.0"
},
"command": "host start",
"isBackground": true,
diff --git a/client/angular.json b/client/angular.json
index 1627c7b..bc88ed2 100644
--- a/client/angular.json
+++ b/client/angular.json
@@ -72,6 +72,9 @@
"serve": {
"builder": "@angular/build:dev-server",
"defaultConfiguration": "development",
+ "options": {
+ "hmr": false
+ },
"configurations": {
"development": {
"buildTarget": "app:build:development"
diff --git a/client/package-lock.json b/client/package-lock.json
index cb08067..079c7b0 100644
--- a/client/package-lock.json
+++ b/client/package-lock.json
@@ -6,19 +6,19 @@
"": {
"name": "stock.charts",
"dependencies": {
- "@angular/animations": "19.0.5",
- "@angular/cdk": "19.0.4",
- "@angular/common": "19.0.5",
- "@angular/compiler": "19.0.5",
- "@angular/core": "19.0.5",
- "@angular/forms": "19.0.5",
- "@angular/material": "19.0.4",
- "@angular/platform-browser": "19.0.5",
- "@angular/platform-browser-dynamic": "19.0.5",
- "@angular/router": "19.0.5",
- "@angular/service-worker": "19.0.5",
+ "@angular/animations": "19.1.3",
+ "@angular/cdk": "19.1.1",
+ "@angular/common": "19.1.3",
+ "@angular/compiler": "19.1.3",
+ "@angular/core": "19.1.3",
+ "@angular/forms": "19.1.3",
+ "@angular/material": "19.1.1",
+ "@angular/platform-browser": "19.1.3",
+ "@angular/platform-browser-dynamic": "19.1.3",
+ "@angular/router": "19.1.3",
+ "@angular/service-worker": "19.1.3",
"@ctrl/tinycolor": "4.1.0",
- "@ng-matero/extensions": "18.3.3",
+ "@ng-matero/extensions": "19.1.0",
"chart.js": "4.4.6",
"chartjs-adapter-date-fns": "3.0.0",
"chartjs-plugin-annotation": "3.1.0",
@@ -30,9 +30,9 @@
"zone.js": "0.15.0"
},
"devDependencies": {
- "@angular/build": "^19.0.6",
- "@angular/cli": "19.0.6",
- "@angular/compiler-cli": "19.0.5",
+ "@angular/build": "19.1.4",
+ "@angular/cli": "19.1.4",
+ "@angular/compiler-cli": "19.1.3",
"typescript": "5.5.4"
}
},
@@ -51,13 +51,13 @@
}
},
"node_modules/@angular-devkit/architect": {
- "version": "0.1900.6",
- "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1900.6.tgz",
- "integrity": "sha512-w11bAXQnNWBawTJfQPjvaTRrzrqsOUm9tK9WNvaia/xjiRFpmO0CfmKtn3axNSEJM8jb/czaNQrgTwG+TGc/8g==",
+ "version": "0.1901.4",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1901.4.tgz",
+ "integrity": "sha512-EoRTN8p7z0YnqOEIJKKu/NwSsCJxFkyGuZOobz7btnUWwlDqG8CNAhJgtlsOXPihwEkHEkzRIm1feDkWEjCYsA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@angular-devkit/core": "19.0.6",
+ "@angular-devkit/core": "19.1.4",
"rxjs": "7.8.1"
},
"engines": {
@@ -67,9 +67,9 @@
}
},
"node_modules/@angular-devkit/core": {
- "version": "19.0.6",
- "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.0.6.tgz",
- "integrity": "sha512-WUWJhzQDsovfMY6jtb9Ktz/5sJszsaErj+XV2aXab85f1OweI/Iv2urPZnJwUSilvVN5Ok/fy3IJ6SuihK4Ceg==",
+ "version": "19.1.4",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.1.4.tgz",
+ "integrity": "sha512-IDvSSiQgaixH2RtZtIpq1+XaHeuzMiTWfDyNF9DuYcU+S8CdG1SWrc8d59tmOrM/q+IRGyFgbBhTU1un52hNHw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -95,15 +95,15 @@
}
},
"node_modules/@angular-devkit/schematics": {
- "version": "19.0.6",
- "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.0.6.tgz",
- "integrity": "sha512-R9hlHfAh1HKoIWgnYJlOEKhUezhTNl0fpUmHxG2252JSY5FLRxmYArTtJYYmbNdBbsBLNg3UHyM/GBPvJSA3NQ==",
+ "version": "19.1.4",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.1.4.tgz",
+ "integrity": "sha512-EKXBkx6EDcvyO+U68w/eXicRaF92zSSzYNvR3tMZszEKYE6xBr3kZxY99PP54HXQHR4zYwLvFJVp+T6bnvte2w==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@angular-devkit/core": "19.0.6",
+ "@angular-devkit/core": "19.1.4",
"jsonc-parser": "3.3.1",
- "magic-string": "0.30.12",
+ "magic-string": "0.30.17",
"ora": "5.4.1",
"rxjs": "7.8.1"
},
@@ -114,9 +114,9 @@
}
},
"node_modules/@angular/animations": {
- "version": "19.0.5",
- "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-19.0.5.tgz",
- "integrity": "sha512-HCOF2CrhUvjoZWusd4nh32VOxpUrg6bV+3Z8Q36Ix3aZdni8v0qoP2rl5wGbotaPtYg5RtyDH60Z2AOPKqlrZg==",
+ "version": "19.1.3",
+ "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-19.1.3.tgz",
+ "integrity": "sha512-MI+Tbp9OOisrQtTQH7o+xiQCODXicCs8WHNpGzdCpnXdRkQuVSOb6xAjD9OXJqcQGotLgeyennnkIJGXdz4RTA==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -125,40 +125,40 @@
"node": "^18.19.1 || ^20.11.1 || >=22.0.0"
},
"peerDependencies": {
- "@angular/core": "19.0.5"
+ "@angular/core": "19.1.3"
}
},
"node_modules/@angular/build": {
- "version": "19.0.6",
- "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.0.6.tgz",
- "integrity": "sha512-KEVNLgTZUF2dfpOYQn+yR2HONHUTxq/2rFVhiK9qAvrm/m+uKJNEXx7hGtbRyoqenZff4ScJq+7feITUldfX8g==",
+ "version": "19.1.4",
+ "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.1.4.tgz",
+ "integrity": "sha512-yfvLeUT2a8JTuVBY259vsSv0uLyhikHHgQcWa3VSr0TvCKrwCsBIFDq7vqmhLqIVWi/Z4D7n3J5JQAbDrl38Sg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@ampproject/remapping": "2.3.0",
- "@angular-devkit/architect": "0.1900.6",
+ "@angular-devkit/architect": "0.1901.4",
"@babel/core": "7.26.0",
"@babel/helper-annotate-as-pure": "7.25.9",
"@babel/helper-split-export-declaration": "7.24.7",
"@babel/plugin-syntax-import-attributes": "7.26.0",
- "@inquirer/confirm": "5.0.2",
- "@vitejs/plugin-basic-ssl": "1.1.0",
- "beasties": "0.1.0",
+ "@inquirer/confirm": "5.1.1",
+ "@vitejs/plugin-basic-ssl": "1.2.0",
+ "beasties": "0.2.0",
"browserslist": "^4.23.0",
- "esbuild": "0.24.0",
- "fast-glob": "3.3.2",
- "https-proxy-agent": "7.0.5",
+ "esbuild": "0.24.2",
+ "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.12",
+ "magic-string": "0.30.17",
"mrmime": "2.0.0",
"parse5-html-rewriting-stream": "7.0.0",
"picomatch": "4.0.2",
- "piscina": "4.7.0",
- "rollup": "4.26.0",
- "sass": "1.80.7",
+ "piscina": "4.8.0",
+ "rollup": "4.30.1",
+ "sass": "1.83.1",
"semver": "7.6.3",
- "vite": "5.4.11",
+ "vite": "6.0.7",
"watchpack": "2.4.2"
},
"engines": {
@@ -167,7 +167,7 @@
"yarn": ">= 1.13.0"
},
"optionalDependencies": {
- "lmdb": "3.1.5"
+ "lmdb": "3.2.2"
},
"peerDependencies": {
"@angular/compiler": "^19.0.0",
@@ -175,11 +175,12 @@
"@angular/localize": "^19.0.0",
"@angular/platform-server": "^19.0.0",
"@angular/service-worker": "^19.0.0",
- "@angular/ssr": "^19.0.6",
+ "@angular/ssr": "^19.1.4",
"less": "^4.2.0",
+ "ng-packagr": "^19.0.0",
"postcss": "^8.4.0",
"tailwindcss": "^2.0.0 || ^3.0.0",
- "typescript": ">=5.5 <5.7"
+ "typescript": ">=5.5 <5.8"
},
"peerDependenciesMeta": {
"@angular/localize": {
@@ -197,6 +198,9 @@
"less": {
"optional": true
},
+ "ng-packagr": {
+ "optional": true
+ },
"postcss": {
"optional": true
},
@@ -206,9 +210,9 @@
}
},
"node_modules/@angular/cdk": {
- "version": "19.0.4",
- "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-19.0.4.tgz",
- "integrity": "sha512-P8V1n6AFFjBUJG3YRgw8DiiNDWPZVrwQ42wbwgZxd4s2TQAuNFg3YY8h/DSMVxt2sXpavrshZsoLtP9yLKZjHA==",
+ "version": "19.1.1",
+ "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-19.1.1.tgz",
+ "integrity": "sha512-MmfNB9iANuDN1TS+HL8uKqA3/7pdVeCRN+HdAcfqFrcqZmSUUSlYWy8PXqymmyeXxoSwt9p4I/6R0By03VoCMw==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -223,26 +227,26 @@
}
},
"node_modules/@angular/cli": {
- "version": "19.0.6",
- "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.0.6.tgz",
- "integrity": "sha512-ZEHhgRRVIdn10dbsAjB8TE9Co32hfuL9/im5Jcfa1yrn6KJefmigz6KN8Xu7FXMH5FkdqfQ11QpLBxJSPb9aww==",
+ "version": "19.1.4",
+ "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.1.4.tgz",
+ "integrity": "sha512-C1Z2OTLjUJIkLsay6RJ1rzY0Tdb1Mj/cBh9dZryDstuits8G0Tphe36hnLownnoHspFQfjSRtVzF4NwKiDlQRw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@angular-devkit/architect": "0.1900.6",
- "@angular-devkit/core": "19.0.6",
- "@angular-devkit/schematics": "19.0.6",
- "@inquirer/prompts": "7.1.0",
+ "@angular-devkit/architect": "0.1901.4",
+ "@angular-devkit/core": "19.1.4",
+ "@angular-devkit/schematics": "19.1.4",
+ "@inquirer/prompts": "7.2.1",
"@listr2/prompt-adapter-inquirer": "2.0.18",
- "@schematics/angular": "19.0.6",
+ "@schematics/angular": "19.1.4",
"@yarnpkg/lockfile": "1.1.0",
"ini": "5.0.0",
"jsonc-parser": "3.3.1",
"listr2": "8.2.5",
- "npm-package-arg": "12.0.0",
+ "npm-package-arg": "12.0.1",
"npm-pick-manifest": "10.0.0",
"pacote": "20.0.0",
- "resolve": "1.22.8",
+ "resolve": "1.22.10",
"semver": "7.6.3",
"symbol-observable": "4.0.0",
"yargs": "17.7.2"
@@ -257,9 +261,9 @@
}
},
"node_modules/@angular/common": {
- "version": "19.0.5",
- "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.0.5.tgz",
- "integrity": "sha512-fFK+euCj1AjBHBCpj9VnduMSeqoMRhZZHbhPYiND7tucRRJ8vwGU0sYK2KI/Ko+fsrNIXL/0O4F36jVPl09Smg==",
+ "version": "19.1.3",
+ "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.1.3.tgz",
+ "integrity": "sha512-r1P0W6FKrON83szIJboF8z6UNCVL4HIxyD+nhmHMMT/iJpu4kDHVugaN/+w2jYLb4oelAJK5xzkzA+1IaHpzLg==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -268,14 +272,14 @@
"node": "^18.19.1 || ^20.11.1 || >=22.0.0"
},
"peerDependencies": {
- "@angular/core": "19.0.5",
+ "@angular/core": "19.1.3",
"rxjs": "^6.5.3 || ^7.4.0"
}
},
"node_modules/@angular/compiler": {
- "version": "19.0.5",
- "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.0.5.tgz",
- "integrity": "sha512-S8ku5Ljp0kqX3shfmE9DVo09629jeYJSlBRGbj2Glb92dd+VQZPOz7KxqKRTwmAl7lQIV/+4Lr6G/GVTsoC4vg==",
+ "version": "19.1.3",
+ "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.1.3.tgz",
+ "integrity": "sha512-omX5Gyt3zlJVTUteO2YxsqYWtAIpkvs8kRYSUsLTi79V1gbGo+J1TawFuyBTrWxj4UtTGvwmDgZxiCIwMtP5KQ==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -284,7 +288,7 @@
"node": "^18.19.1 || ^20.11.1 || >=22.0.0"
},
"peerDependencies": {
- "@angular/core": "19.0.5"
+ "@angular/core": "19.1.3"
},
"peerDependenciesMeta": {
"@angular/core": {
@@ -293,9 +297,9 @@
}
},
"node_modules/@angular/compiler-cli": {
- "version": "19.0.5",
- "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.0.5.tgz",
- "integrity": "sha512-KSzuWCTZlvJsoAenxM9cjTOzNM8mrFxDBInj0KVPz7QU83amGS4rcv1pWO/QGYQcErfskcN84TAdMegaRWWCmA==",
+ "version": "19.1.3",
+ "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.1.3.tgz",
+ "integrity": "sha512-nDBvZenQECcr9CClmTp3iJNilRQ6oDKFgBkhlWffEFBx0Z6kBA36MXKKLuCkf31D+NGmt5VJlAkl8Ax8BJ9qJw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -317,14 +321,14 @@
"node": "^18.19.1 || ^20.11.1 || >=22.0.0"
},
"peerDependencies": {
- "@angular/compiler": "19.0.5",
- "typescript": ">=5.5 <5.7"
+ "@angular/compiler": "19.1.3",
+ "typescript": ">=5.5 <5.8"
}
},
"node_modules/@angular/core": {
- "version": "19.0.5",
- "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.0.5.tgz",
- "integrity": "sha512-Ywc6sPO6G/Y1stfk3y/MallV/h0yzQ0vdOHRWueLrk5kD1DTdbolV4X03Cs3PuVvravgcSVE3nnuuHFuH32emQ==",
+ "version": "19.1.3",
+ "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.1.3.tgz",
+ "integrity": "sha512-Hh1eHvi+y+gsTRODiEEEWnRj5zqv9WNoou1KmQ1mv1NTOf0Pv61Hg9P2rBWDr0mPIXFSzqUKjyzW30BgdQ+AEA==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -338,9 +342,9 @@
}
},
"node_modules/@angular/forms": {
- "version": "19.0.5",
- "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.0.5.tgz",
- "integrity": "sha512-OhNFkfOoguqCDq07vNBV28FFrmTM8S11Z3Cd6PQZJJF9TgAtpV5KtF7A3eXBCN92W4pmqluomPjfK7YyImzIYQ==",
+ "version": "19.1.3",
+ "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.1.3.tgz",
+ "integrity": "sha512-M6eEJBysJm9zSUhm8ggljZCsgHLccZl70P34tyddb8erh9it2uoOXW0aVaZgDt1UAiF5a1EzjdVdN4TZTT/OGA==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -349,23 +353,23 @@
"node": "^18.19.1 || ^20.11.1 || >=22.0.0"
},
"peerDependencies": {
- "@angular/common": "19.0.5",
- "@angular/core": "19.0.5",
- "@angular/platform-browser": "19.0.5",
+ "@angular/common": "19.1.3",
+ "@angular/core": "19.1.3",
+ "@angular/platform-browser": "19.1.3",
"rxjs": "^6.5.3 || ^7.4.0"
}
},
"node_modules/@angular/material": {
- "version": "19.0.4",
- "resolved": "https://registry.npmjs.org/@angular/material/-/material-19.0.4.tgz",
- "integrity": "sha512-8WRMbN1+oRXx1ZFLni+BRz60F4FWzJPFORsQ8qAvY3sHWzyjunsYZkpbze3uiZO6bu3hiyQCU6g+k/58Qc6kkw==",
+ "version": "19.1.1",
+ "resolved": "https://registry.npmjs.org/@angular/material/-/material-19.1.1.tgz",
+ "integrity": "sha512-x/EwyBx3yCIYyu/hve19eecmufJzwltRWOO/3Y74jY4jSNNFrR9046t0ptw4fyEXjN8UQZI6Fp/melcZxl3IiA==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
},
"peerDependencies": {
"@angular/animations": "^19.0.0 || ^20.0.0",
- "@angular/cdk": "19.0.4",
+ "@angular/cdk": "19.1.1",
"@angular/common": "^19.0.0 || ^20.0.0",
"@angular/core": "^19.0.0 || ^20.0.0",
"@angular/forms": "^19.0.0 || ^20.0.0",
@@ -374,9 +378,9 @@
}
},
"node_modules/@angular/platform-browser": {
- "version": "19.0.5",
- "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.0.5.tgz",
- "integrity": "sha512-41+Jo5DEil4Ifvv+UE/p1l9YJtYN+xfhx+/C9cahVgvV5D2q+givyK73d0Mnb6XOfe1q+hoV5lZ+XhQYp21//g==",
+ "version": "19.1.3",
+ "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.1.3.tgz",
+ "integrity": "sha512-bLgnM2hRyzUdoWRoUhe+IMenlr74EvrgwyG7anJ27bjg5PcvhQPXrGqU0hri5yPDb9SHVJZminr7OjNCN8QJkQ==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -385,9 +389,9 @@
"node": "^18.19.1 || ^20.11.1 || >=22.0.0"
},
"peerDependencies": {
- "@angular/animations": "19.0.5",
- "@angular/common": "19.0.5",
- "@angular/core": "19.0.5"
+ "@angular/animations": "19.1.3",
+ "@angular/common": "19.1.3",
+ "@angular/core": "19.1.3"
},
"peerDependenciesMeta": {
"@angular/animations": {
@@ -396,9 +400,9 @@
}
},
"node_modules/@angular/platform-browser-dynamic": {
- "version": "19.0.5",
- "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-19.0.5.tgz",
- "integrity": "sha512-KKFdue/uJVxkWdrntRAXkz+ycp4nD3SuGOH5pPf2svCBxieuHuFlWDi+DYVuFSEpC/ICCmlhrtzIAm44A4qzzQ==",
+ "version": "19.1.3",
+ "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-19.1.3.tgz",
+ "integrity": "sha512-rfsHu/+wB8YLPjsHKd/Go0SI8zP2gjMkebUHM9SbvVLXEAkxFubcF2htVKbKu8eTncfEJEXD6+3gRAjh5SLrKw==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -407,16 +411,16 @@
"node": "^18.19.1 || ^20.11.1 || >=22.0.0"
},
"peerDependencies": {
- "@angular/common": "19.0.5",
- "@angular/compiler": "19.0.5",
- "@angular/core": "19.0.5",
- "@angular/platform-browser": "19.0.5"
+ "@angular/common": "19.1.3",
+ "@angular/compiler": "19.1.3",
+ "@angular/core": "19.1.3",
+ "@angular/platform-browser": "19.1.3"
}
},
"node_modules/@angular/router": {
- "version": "19.0.5",
- "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.0.5.tgz",
- "integrity": "sha512-6tNubVVj/rRyTg+OXjQxACfufvCLHAwDQtv9wqt6q/3OYSnysHTik3ho3FaFPwu7fXJ+6p9Rjzkh2VY9QMk4bw==",
+ "version": "19.1.3",
+ "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.1.3.tgz",
+ "integrity": "sha512-DJ9BgvtxJV6xohaPQXPdBsFCZoQIEq2OPDyKcoW4L0ST4kIIFpHyI6wJ+AlPnLkhSwmOOoHciH0oxZ2xPVxmiQ==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -425,16 +429,16 @@
"node": "^18.19.1 || ^20.11.1 || >=22.0.0"
},
"peerDependencies": {
- "@angular/common": "19.0.5",
- "@angular/core": "19.0.5",
- "@angular/platform-browser": "19.0.5",
+ "@angular/common": "19.1.3",
+ "@angular/core": "19.1.3",
+ "@angular/platform-browser": "19.1.3",
"rxjs": "^6.5.3 || ^7.4.0"
}
},
"node_modules/@angular/service-worker": {
- "version": "19.0.5",
- "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-19.0.5.tgz",
- "integrity": "sha512-qU5lgx1WJ+feCOV/EhkN9m20xFdIslpEQcSZZC+VJnEwcG6VTbofg1dRaHWZ9HAjS1uP7bFoK0HUYu4el0bHGA==",
+ "version": "19.1.3",
+ "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-19.1.3.tgz",
+ "integrity": "sha512-87XPbzqy9sGYkN21y4vqJBT6lMuuQJrkx5ID1pXdDGxUXlfiGprshtbLPNCUcxHXOnLOdnAI2WZ5DDjl4NMNpw==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -446,8 +450,8 @@
"node": "^18.19.1 || ^20.11.1 || >=22.0.0"
},
"peerDependencies": {
- "@angular/common": "19.0.5",
- "@angular/core": "19.0.5"
+ "@angular/common": "19.1.3",
+ "@angular/core": "19.1.3"
}
},
"node_modules/@babel/code-frame": {
@@ -769,9 +773,9 @@
}
},
"node_modules/@esbuild/aix-ppc64": {
- "version": "0.24.0",
- "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz",
- "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==",
+ "version": "0.24.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz",
+ "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==",
"cpu": [
"ppc64"
],
@@ -786,9 +790,9 @@
}
},
"node_modules/@esbuild/android-arm": {
- "version": "0.24.0",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz",
- "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==",
+ "version": "0.24.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz",
+ "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==",
"cpu": [
"arm"
],
@@ -803,9 +807,9 @@
}
},
"node_modules/@esbuild/android-arm64": {
- "version": "0.24.0",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz",
- "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==",
+ "version": "0.24.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz",
+ "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==",
"cpu": [
"arm64"
],
@@ -820,9 +824,9 @@
}
},
"node_modules/@esbuild/android-x64": {
- "version": "0.24.0",
- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz",
- "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==",
+ "version": "0.24.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz",
+ "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==",
"cpu": [
"x64"
],
@@ -837,9 +841,9 @@
}
},
"node_modules/@esbuild/darwin-arm64": {
- "version": "0.24.0",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz",
- "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==",
+ "version": "0.24.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz",
+ "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==",
"cpu": [
"arm64"
],
@@ -854,9 +858,9 @@
}
},
"node_modules/@esbuild/darwin-x64": {
- "version": "0.24.0",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz",
- "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==",
+ "version": "0.24.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz",
+ "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==",
"cpu": [
"x64"
],
@@ -871,9 +875,9 @@
}
},
"node_modules/@esbuild/freebsd-arm64": {
- "version": "0.24.0",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz",
- "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==",
+ "version": "0.24.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz",
+ "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==",
"cpu": [
"arm64"
],
@@ -888,9 +892,9 @@
}
},
"node_modules/@esbuild/freebsd-x64": {
- "version": "0.24.0",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz",
- "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==",
+ "version": "0.24.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz",
+ "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==",
"cpu": [
"x64"
],
@@ -905,9 +909,9 @@
}
},
"node_modules/@esbuild/linux-arm": {
- "version": "0.24.0",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz",
- "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==",
+ "version": "0.24.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz",
+ "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==",
"cpu": [
"arm"
],
@@ -922,9 +926,9 @@
}
},
"node_modules/@esbuild/linux-arm64": {
- "version": "0.24.0",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz",
- "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==",
+ "version": "0.24.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz",
+ "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==",
"cpu": [
"arm64"
],
@@ -939,9 +943,9 @@
}
},
"node_modules/@esbuild/linux-ia32": {
- "version": "0.24.0",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz",
- "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==",
+ "version": "0.24.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz",
+ "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==",
"cpu": [
"ia32"
],
@@ -956,9 +960,9 @@
}
},
"node_modules/@esbuild/linux-loong64": {
- "version": "0.24.0",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz",
- "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==",
+ "version": "0.24.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz",
+ "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==",
"cpu": [
"loong64"
],
@@ -973,9 +977,9 @@
}
},
"node_modules/@esbuild/linux-mips64el": {
- "version": "0.24.0",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz",
- "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==",
+ "version": "0.24.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz",
+ "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==",
"cpu": [
"mips64el"
],
@@ -990,9 +994,9 @@
}
},
"node_modules/@esbuild/linux-ppc64": {
- "version": "0.24.0",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz",
- "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==",
+ "version": "0.24.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz",
+ "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==",
"cpu": [
"ppc64"
],
@@ -1007,9 +1011,9 @@
}
},
"node_modules/@esbuild/linux-riscv64": {
- "version": "0.24.0",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz",
- "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==",
+ "version": "0.24.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz",
+ "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==",
"cpu": [
"riscv64"
],
@@ -1024,9 +1028,9 @@
}
},
"node_modules/@esbuild/linux-s390x": {
- "version": "0.24.0",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz",
- "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==",
+ "version": "0.24.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz",
+ "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==",
"cpu": [
"s390x"
],
@@ -1041,9 +1045,9 @@
}
},
"node_modules/@esbuild/linux-x64": {
- "version": "0.24.0",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz",
- "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==",
+ "version": "0.24.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz",
+ "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==",
"cpu": [
"x64"
],
@@ -1057,10 +1061,27 @@
"node": ">=18"
}
},
+ "node_modules/@esbuild/netbsd-arm64": {
+ "version": "0.24.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz",
+ "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/@esbuild/netbsd-x64": {
- "version": "0.24.0",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz",
- "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==",
+ "version": "0.24.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz",
+ "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==",
"cpu": [
"x64"
],
@@ -1075,9 +1096,9 @@
}
},
"node_modules/@esbuild/openbsd-arm64": {
- "version": "0.24.0",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz",
- "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==",
+ "version": "0.24.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz",
+ "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==",
"cpu": [
"arm64"
],
@@ -1092,9 +1113,9 @@
}
},
"node_modules/@esbuild/openbsd-x64": {
- "version": "0.24.0",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz",
- "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==",
+ "version": "0.24.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz",
+ "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==",
"cpu": [
"x64"
],
@@ -1109,9 +1130,9 @@
}
},
"node_modules/@esbuild/sunos-x64": {
- "version": "0.24.0",
- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz",
- "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==",
+ "version": "0.24.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz",
+ "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==",
"cpu": [
"x64"
],
@@ -1126,9 +1147,9 @@
}
},
"node_modules/@esbuild/win32-arm64": {
- "version": "0.24.0",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz",
- "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==",
+ "version": "0.24.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz",
+ "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==",
"cpu": [
"arm64"
],
@@ -1143,9 +1164,9 @@
}
},
"node_modules/@esbuild/win32-ia32": {
- "version": "0.24.0",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz",
- "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==",
+ "version": "0.24.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz",
+ "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==",
"cpu": [
"ia32"
],
@@ -1160,9 +1181,9 @@
}
},
"node_modules/@esbuild/win32-x64": {
- "version": "0.24.0",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz",
- "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==",
+ "version": "0.24.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz",
+ "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==",
"cpu": [
"x64"
],
@@ -1197,14 +1218,14 @@
}
},
"node_modules/@inquirer/confirm": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.0.2.tgz",
- "integrity": "sha512-KJLUHOaKnNCYzwVbryj3TNBxyZIrr56fR5N45v6K9IPrbT6B7DcudBMfylkV1A8PUdJE15mybkEQyp2/ZUpxUA==",
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.1.tgz",
+ "integrity": "sha512-vVLSbGci+IKQvDOtzpPTCOiEJCNidHcAq9JYVoWTW0svb5FiwSLotkM+JXNXejfjnzVYV9n0DTBythl9+XgTxg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@inquirer/core": "^10.1.0",
- "@inquirer/type": "^3.0.1"
+ "@inquirer/core": "^10.1.2",
+ "@inquirer/type": "^3.0.2"
},
"engines": {
"node": ">=18"
@@ -1333,22 +1354,22 @@
}
},
"node_modules/@inquirer/prompts": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.1.0.tgz",
- "integrity": "sha512-5U/XiVRH2pp1X6gpNAjWOglMf38/Ys522ncEHIKT1voRUvSj/DQnR22OVxHnwu5S+rCFaUiPQ57JOtMFQayqYA==",
+ "version": "7.2.1",
+ "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.2.1.tgz",
+ "integrity": "sha512-v2JSGri6/HXSfoGIwuKEn8sNCQK6nsB2BNpy2lSX6QH9bsECrMv93QHnj5+f+1ZWpF/VNioIV2B/PDox8EvGuQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@inquirer/checkbox": "^4.0.2",
- "@inquirer/confirm": "^5.0.2",
- "@inquirer/editor": "^4.1.0",
- "@inquirer/expand": "^4.0.2",
- "@inquirer/input": "^4.0.2",
- "@inquirer/number": "^3.0.2",
- "@inquirer/password": "^4.0.2",
- "@inquirer/rawlist": "^4.0.2",
- "@inquirer/search": "^3.0.2",
- "@inquirer/select": "^4.0.2"
+ "@inquirer/checkbox": "^4.0.4",
+ "@inquirer/confirm": "^5.1.1",
+ "@inquirer/editor": "^4.2.1",
+ "@inquirer/expand": "^4.0.4",
+ "@inquirer/input": "^4.1.1",
+ "@inquirer/number": "^3.0.4",
+ "@inquirer/password": "^4.0.4",
+ "@inquirer/rawlist": "^4.0.4",
+ "@inquirer/search": "^3.0.4",
+ "@inquirer/select": "^4.0.4"
},
"engines": {
"node": ">=18"
@@ -1652,9 +1673,9 @@
}
},
"node_modules/@lmdb/lmdb-darwin-arm64": {
- "version": "3.1.5",
- "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.1.5.tgz",
- "integrity": "sha512-ue5PSOzHMCIYrfvPP/MRS6hsKKLzqqhcdAvJCO8uFlDdj598EhgnacuOTuqA6uBK5rgiZXfDWyb7DVZSiBKxBA==",
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.2.2.tgz",
+ "integrity": "sha512-WBSJT9Z7DTol5viq+DZD2TapeWOw7mlwXxiSBHgAzqVwsaVb0h/ekMD9iu/jDD8MUA20tO9N0WEdnT06fsUp+g==",
"cpu": [
"arm64"
],
@@ -1666,9 +1687,9 @@
]
},
"node_modules/@lmdb/lmdb-darwin-x64": {
- "version": "3.1.5",
- "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.1.5.tgz",
- "integrity": "sha512-CGhsb0R5vE6mMNCoSfxHFD8QTvBHM51gs4DBeigTYHWnYv2V5YpJkC4rMo5qAAFifuUcc0+a8a3SIU0c9NrfNw==",
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.2.2.tgz",
+ "integrity": "sha512-4S13kUtR7c/j/MzkTIBJCXv52hQ41LG2ukeaqw4Eng9K0pNKLFjo1sDSz96/yKhwykxrWDb13ddJ/ZqD3rAhUA==",
"cpu": [
"x64"
],
@@ -1680,9 +1701,9 @@
]
},
"node_modules/@lmdb/lmdb-linux-arm": {
- "version": "3.1.5",
- "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.1.5.tgz",
- "integrity": "sha512-3WeW328DN+xB5PZdhSWmqE+t3+44xWXEbqQ+caWJEZfOFdLp9yklBZEbVqVdqzznkoaXJYxTCp996KD6HmANeg==",
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.2.2.tgz",
+ "integrity": "sha512-uW31JmfuPAaLUYW7NsEU8gzwgDAzpGPwjvkxnKlcWd8iDutoPKDJi8Wk9lFmPEZRxVSB0j1/wDQ7N2qliR9UFA==",
"cpu": [
"arm"
],
@@ -1694,9 +1715,9 @@
]
},
"node_modules/@lmdb/lmdb-linux-arm64": {
- "version": "3.1.5",
- "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.1.5.tgz",
- "integrity": "sha512-LAjaoOcBHGj6fiYB8ureiqPoph4eygbXu4vcOF+hsxiY74n8ilA7rJMmGUT0K0JOB5lmRQHSmor3mytRjS4qeQ==",
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.2.2.tgz",
+ "integrity": "sha512-4hdgZtWI1idQlWRp+eleWXD9KLvObgboRaVoBj2POdPEYvsKANllvMW0El8tEQwtw74yB9NT6P8ENBB5UJf5+g==",
"cpu": [
"arm64"
],
@@ -1708,9 +1729,9 @@
]
},
"node_modules/@lmdb/lmdb-linux-x64": {
- "version": "3.1.5",
- "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.1.5.tgz",
- "integrity": "sha512-k/IklElP70qdCXOQixclSl2GPLFiopynGoKX1FqDd1/H0E3Fo1oPwjY2rEVu+0nS3AOw1sryStdXk8CW3cVIsw==",
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.2.2.tgz",
+ "integrity": "sha512-A0zjf4a2vM4B4GAx78ncuOTZ8Ka1DbTaG1Axf1e00Sa7f5coqlWiLg1PX7Gxvyibc2YqtqB+8tg1KKrE8guZVw==",
"cpu": [
"x64"
],
@@ -1722,9 +1743,9 @@
]
},
"node_modules/@lmdb/lmdb-win32-x64": {
- "version": "3.1.5",
- "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.1.5.tgz",
- "integrity": "sha512-KYar6W8nraZfSJspcK7Kp7hdj238X/FNauYbZyrqPBrtsXI1hvI4/KcRcRGP50aQoV7fkKDyJERlrQGMGTZUsA==",
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.2.2.tgz",
+ "integrity": "sha512-Y0qoSCAja+xZE7QQ0LCHoYAuyI1n9ZqukQJa8lv9X3yCvWahFF7OYHAgVH1ejp43XWstj3U89/PAAzcowgF/uQ==",
"cpu": [
"x64"
],
@@ -2125,70 +2146,28 @@
}
},
"node_modules/@ng-matero/extensions": {
- "version": "18.3.3",
- "resolved": "https://registry.npmjs.org/@ng-matero/extensions/-/extensions-18.3.3.tgz",
- "integrity": "sha512-EBPSqdqCOwQiwZjOuUqlcaWIlQF6oHt93dS9Qci35WjnHiHCxq8M5IMglMTTqXksDqX7UfIhx9kBvhdixVhuKQ==",
+ "version": "19.1.0",
+ "resolved": "https://registry.npmjs.org/@ng-matero/extensions/-/extensions-19.1.0.tgz",
+ "integrity": "sha512-JhaW96XxTSRSs5ROrFqXaDFnjGXopYSEaRs/wth5C5E5N+ICc23XtKWrJeEi9h5SWQIIIfyV0puGjKMETF06nA==",
"license": "MIT",
"dependencies": {
- "@ng-select/ng-select": "^13.7.0",
+ "@ng-select/ng-select": "^14.1.0",
"ngx-color": "^9.0.0",
"photoviewer": "^3.10.0",
"tslib": "^2.4.0"
},
"peerDependencies": {
- "@angular/animations": ">=18.2.0",
- "@angular/cdk": ">=18.2.0",
- "@angular/common": ">=18.2.0",
- "@angular/core": ">=18.2.0",
- "@angular/material": ">=18.2.0"
+ "@angular/animations": ">=19.0.0",
+ "@angular/cdk": ">=19.0.0",
+ "@angular/common": ">=19.0.0",
+ "@angular/core": ">=19.0.0",
+ "@angular/material": ">=19.0.0"
}
},
- "node_modules/@ng-matero/extensions/node_modules/@angular/forms": {
- "version": "18.2.13",
- "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-18.2.13.tgz",
- "integrity": "sha512-A67D867fu3DSBhdLWWZl/F5pr7v2+dRM2u3U7ZJ0ewh4a+sv+0yqWdJW+a8xIoiHxS+btGEJL2qAKJiH+MCFfg==",
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "tslib": "^2.3.0"
- },
- "engines": {
- "node": "^18.19.1 || ^20.11.1 || >=22.0.0"
- },
- "peerDependencies": {
- "@angular/common": "18.2.13",
- "@angular/core": "18.2.13",
- "@angular/platform-browser": "18.2.13",
- "rxjs": "^6.5.3 || ^7.4.0"
- }
- },
- "node_modules/@ng-matero/extensions/node_modules/@angular/platform-browser": {
- "version": "18.2.13",
- "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-18.2.13.tgz",
- "integrity": "sha512-tu7ZzY6qD3ATdWFzcTcsAKe7M6cJeWbT/4/bF9unyGO3XBPcNYDKoiz10+7ap2PUd0fmPwvuvTvSNJiFEBnB8Q==",
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "tslib": "^2.3.0"
- },
- "engines": {
- "node": "^18.19.1 || ^20.11.1 || >=22.0.0"
- },
- "peerDependencies": {
- "@angular/animations": "18.2.13",
- "@angular/common": "18.2.13",
- "@angular/core": "18.2.13"
- },
- "peerDependenciesMeta": {
- "@angular/animations": {
- "optional": true
- }
- }
- },
- "node_modules/@ng-matero/extensions/node_modules/@ng-select/ng-select": {
- "version": "13.9.1",
- "resolved": "https://registry.npmjs.org/@ng-select/ng-select/-/ng-select-13.9.1.tgz",
- "integrity": "sha512-+DzQkQp8coGWZREflJM/qx7BXipV6HEVpZCXoa6fJJRHJfmUMsxa5uV6kUVmClUE98Rkffk9CPHt6kZcj8PuqQ==",
+ "node_modules/@ng-select/ng-select": {
+ "version": "14.2.0",
+ "resolved": "https://registry.npmjs.org/@ng-select/ng-select/-/ng-select-14.2.0.tgz",
+ "integrity": "sha512-Dq3PgOb0EBL31TV1Byr6RnQW/Vd5cdaaCEFbII2tIwiIT1r15oMdeSEZqzutuslBqgyggnponYAaBEgQBVorAg==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.1"
@@ -2198,9 +2177,9 @@
"npm": ">= 8"
},
"peerDependencies": {
- "@angular/common": "^18.0.0",
- "@angular/core": "^18.0.0",
- "@angular/forms": "^18.0.0"
+ "@angular/common": "^19.0.0",
+ "@angular/core": "^19.0.0",
+ "@angular/forms": "^19.0.0"
}
},
"node_modules/@nodelib/fs.scandir": {
@@ -2394,9 +2373,9 @@
}
},
"node_modules/@parcel/watcher": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.0.tgz",
- "integrity": "sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==",
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz",
+ "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
@@ -2415,25 +2394,25 @@
"url": "https://opencollective.com/parcel"
},
"optionalDependencies": {
- "@parcel/watcher-android-arm64": "2.5.0",
- "@parcel/watcher-darwin-arm64": "2.5.0",
- "@parcel/watcher-darwin-x64": "2.5.0",
- "@parcel/watcher-freebsd-x64": "2.5.0",
- "@parcel/watcher-linux-arm-glibc": "2.5.0",
- "@parcel/watcher-linux-arm-musl": "2.5.0",
- "@parcel/watcher-linux-arm64-glibc": "2.5.0",
- "@parcel/watcher-linux-arm64-musl": "2.5.0",
- "@parcel/watcher-linux-x64-glibc": "2.5.0",
- "@parcel/watcher-linux-x64-musl": "2.5.0",
- "@parcel/watcher-win32-arm64": "2.5.0",
- "@parcel/watcher-win32-ia32": "2.5.0",
- "@parcel/watcher-win32-x64": "2.5.0"
+ "@parcel/watcher-android-arm64": "2.5.1",
+ "@parcel/watcher-darwin-arm64": "2.5.1",
+ "@parcel/watcher-darwin-x64": "2.5.1",
+ "@parcel/watcher-freebsd-x64": "2.5.1",
+ "@parcel/watcher-linux-arm-glibc": "2.5.1",
+ "@parcel/watcher-linux-arm-musl": "2.5.1",
+ "@parcel/watcher-linux-arm64-glibc": "2.5.1",
+ "@parcel/watcher-linux-arm64-musl": "2.5.1",
+ "@parcel/watcher-linux-x64-glibc": "2.5.1",
+ "@parcel/watcher-linux-x64-musl": "2.5.1",
+ "@parcel/watcher-win32-arm64": "2.5.1",
+ "@parcel/watcher-win32-ia32": "2.5.1",
+ "@parcel/watcher-win32-x64": "2.5.1"
}
},
"node_modules/@parcel/watcher-android-arm64": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz",
- "integrity": "sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==",
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz",
+ "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==",
"cpu": [
"arm64"
],
@@ -2452,9 +2431,9 @@
}
},
"node_modules/@parcel/watcher-darwin-arm64": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz",
- "integrity": "sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==",
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz",
+ "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==",
"cpu": [
"arm64"
],
@@ -2473,9 +2452,9 @@
}
},
"node_modules/@parcel/watcher-darwin-x64": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz",
- "integrity": "sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==",
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz",
+ "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==",
"cpu": [
"x64"
],
@@ -2494,9 +2473,9 @@
}
},
"node_modules/@parcel/watcher-freebsd-x64": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz",
- "integrity": "sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==",
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz",
+ "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==",
"cpu": [
"x64"
],
@@ -2515,9 +2494,9 @@
}
},
"node_modules/@parcel/watcher-linux-arm-glibc": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz",
- "integrity": "sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==",
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz",
+ "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==",
"cpu": [
"arm"
],
@@ -2536,9 +2515,9 @@
}
},
"node_modules/@parcel/watcher-linux-arm-musl": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz",
- "integrity": "sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==",
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz",
+ "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==",
"cpu": [
"arm"
],
@@ -2557,9 +2536,9 @@
}
},
"node_modules/@parcel/watcher-linux-arm64-glibc": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz",
- "integrity": "sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==",
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz",
+ "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==",
"cpu": [
"arm64"
],
@@ -2578,9 +2557,9 @@
}
},
"node_modules/@parcel/watcher-linux-arm64-musl": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz",
- "integrity": "sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==",
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz",
+ "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==",
"cpu": [
"arm64"
],
@@ -2599,9 +2578,9 @@
}
},
"node_modules/@parcel/watcher-linux-x64-glibc": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz",
- "integrity": "sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==",
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz",
+ "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==",
"cpu": [
"x64"
],
@@ -2620,9 +2599,9 @@
}
},
"node_modules/@parcel/watcher-linux-x64-musl": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz",
- "integrity": "sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==",
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz",
+ "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==",
"cpu": [
"x64"
],
@@ -2641,9 +2620,9 @@
}
},
"node_modules/@parcel/watcher-win32-arm64": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz",
- "integrity": "sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==",
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz",
+ "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==",
"cpu": [
"arm64"
],
@@ -2662,9 +2641,9 @@
}
},
"node_modules/@parcel/watcher-win32-ia32": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz",
- "integrity": "sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==",
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz",
+ "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==",
"cpu": [
"ia32"
],
@@ -2683,9 +2662,9 @@
}
},
"node_modules/@parcel/watcher-win32-x64": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz",
- "integrity": "sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==",
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz",
+ "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==",
"cpu": [
"x64"
],
@@ -2737,9 +2716,9 @@
}
},
"node_modules/@rollup/rollup-android-arm-eabi": {
- "version": "4.26.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.26.0.tgz",
- "integrity": "sha512-gJNwtPDGEaOEgejbaseY6xMFu+CPltsc8/T+diUTTbOQLqD+bnrJq9ulH6WD69TqwqWmrfRAtUv30cCFZlbGTQ==",
+ "version": "4.30.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.30.1.tgz",
+ "integrity": "sha512-pSWY+EVt3rJ9fQ3IqlrEUtXh3cGqGtPDH1FQlNZehO2yYxCHEX1SPsz1M//NXwYfbTlcKr9WObLnJX9FsS9K1Q==",
"cpu": [
"arm"
],
@@ -2751,9 +2730,9 @@
]
},
"node_modules/@rollup/rollup-android-arm64": {
- "version": "4.26.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.26.0.tgz",
- "integrity": "sha512-YJa5Gy8mEZgz5JquFruhJODMq3lTHWLm1fOy+HIANquLzfIOzE9RA5ie3JjCdVb9r46qfAQY/l947V0zfGJ0OQ==",
+ "version": "4.30.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.30.1.tgz",
+ "integrity": "sha512-/NA2qXxE3D/BRjOJM8wQblmArQq1YoBVJjrjoTSBS09jgUisq7bqxNHJ8kjCHeV21W/9WDGwJEWSN0KQ2mtD/w==",
"cpu": [
"arm64"
],
@@ -2765,9 +2744,9 @@
]
},
"node_modules/@rollup/rollup-darwin-arm64": {
- "version": "4.26.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.26.0.tgz",
- "integrity": "sha512-ErTASs8YKbqTBoPLp/kA1B1Um5YSom8QAc4rKhg7b9tyyVqDBlQxy7Bf2wW7yIlPGPg2UODDQcbkTlruPzDosw==",
+ "version": "4.30.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.30.1.tgz",
+ "integrity": "sha512-r7FQIXD7gB0WJ5mokTUgUWPl0eYIH0wnxqeSAhuIwvnnpjdVB8cRRClyKLQr7lgzjctkbp5KmswWszlwYln03Q==",
"cpu": [
"arm64"
],
@@ -2779,9 +2758,9 @@
]
},
"node_modules/@rollup/rollup-darwin-x64": {
- "version": "4.26.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.26.0.tgz",
- "integrity": "sha512-wbgkYDHcdWW+NqP2mnf2NOuEbOLzDblalrOWcPyY6+BRbVhliavon15UploG7PpBRQ2bZJnbmh8o3yLoBvDIHA==",
+ "version": "4.30.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.30.1.tgz",
+ "integrity": "sha512-x78BavIwSH6sqfP2xeI1hd1GpHL8J4W2BXcVM/5KYKoAD3nNsfitQhvWSw+TFtQTLZ9OmlF+FEInEHyubut2OA==",
"cpu": [
"x64"
],
@@ -2793,9 +2772,9 @@
]
},
"node_modules/@rollup/rollup-freebsd-arm64": {
- "version": "4.26.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.26.0.tgz",
- "integrity": "sha512-Y9vpjfp9CDkAG4q/uwuhZk96LP11fBz/bYdyg9oaHYhtGZp7NrbkQrj/66DYMMP2Yo/QPAsVHkV891KyO52fhg==",
+ "version": "4.30.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.30.1.tgz",
+ "integrity": "sha512-HYTlUAjbO1z8ywxsDFWADfTRfTIIy/oUlfIDmlHYmjUP2QRDTzBuWXc9O4CXM+bo9qfiCclmHk1x4ogBjOUpUQ==",
"cpu": [
"arm64"
],
@@ -2807,9 +2786,9 @@
]
},
"node_modules/@rollup/rollup-freebsd-x64": {
- "version": "4.26.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.26.0.tgz",
- "integrity": "sha512-A/jvfCZ55EYPsqeaAt/yDAG4q5tt1ZboWMHEvKAH9Zl92DWvMIbnZe/f/eOXze65aJaaKbL+YeM0Hz4kLQvdwg==",
+ "version": "4.30.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.30.1.tgz",
+ "integrity": "sha512-1MEdGqogQLccphhX5myCJqeGNYTNcmTyaic9S7CG3JhwuIByJ7J05vGbZxsizQthP1xpVx7kd3o31eOogfEirw==",
"cpu": [
"x64"
],
@@ -2821,9 +2800,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
- "version": "4.26.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.26.0.tgz",
- "integrity": "sha512-paHF1bMXKDuizaMODm2bBTjRiHxESWiIyIdMugKeLnjuS1TCS54MF5+Y5Dx8Ui/1RBPVRE09i5OUlaLnv8OGnA==",
+ "version": "4.30.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.30.1.tgz",
+ "integrity": "sha512-PaMRNBSqCx7K3Wc9QZkFx5+CX27WFpAMxJNiYGAXfmMIKC7jstlr32UhTgK6T07OtqR+wYlWm9IxzennjnvdJg==",
"cpu": [
"arm"
],
@@ -2835,9 +2814,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm-musleabihf": {
- "version": "4.26.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.26.0.tgz",
- "integrity": "sha512-cwxiHZU1GAs+TMxvgPfUDtVZjdBdTsQwVnNlzRXC5QzIJ6nhfB4I1ahKoe9yPmoaA/Vhf7m9dB1chGPpDRdGXg==",
+ "version": "4.30.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.30.1.tgz",
+ "integrity": "sha512-B8Rcyj9AV7ZlEFqvB5BubG5iO6ANDsRKlhIxySXcF1axXYUyqwBok+XZPgIYGBgs7LDXfWfifxhw0Ik57T0Yug==",
"cpu": [
"arm"
],
@@ -2849,9 +2828,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm64-gnu": {
- "version": "4.26.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.26.0.tgz",
- "integrity": "sha512-4daeEUQutGRCW/9zEo8JtdAgtJ1q2g5oHaoQaZbMSKaIWKDQwQ3Yx0/3jJNmpzrsScIPtx/V+1AfibLisb3AMQ==",
+ "version": "4.30.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.30.1.tgz",
+ "integrity": "sha512-hqVyueGxAj3cBKrAI4aFHLV+h0Lv5VgWZs9CUGqr1z0fZtlADVV1YPOij6AhcK5An33EXaxnDLmJdQikcn5NEw==",
"cpu": [
"arm64"
],
@@ -2863,9 +2842,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm64-musl": {
- "version": "4.26.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.26.0.tgz",
- "integrity": "sha512-eGkX7zzkNxvvS05ROzJ/cO/AKqNvR/7t1jA3VZDi2vRniLKwAWxUr85fH3NsvtxU5vnUUKFHKh8flIBdlo2b3Q==",
+ "version": "4.30.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.30.1.tgz",
+ "integrity": "sha512-i4Ab2vnvS1AE1PyOIGp2kXni69gU2DAUVt6FSXeIqUCPIR3ZlheMW3oP2JkukDfu3PsexYRbOiJrY+yVNSk9oA==",
"cpu": [
"arm64"
],
@@ -2876,10 +2855,24 @@
"linux"
]
},
+ "node_modules/@rollup/rollup-linux-loongarch64-gnu": {
+ "version": "4.30.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.30.1.tgz",
+ "integrity": "sha512-fARcF5g296snX0oLGkVxPmysetwUk2zmHcca+e9ObOovBR++9ZPOhqFUM61UUZ2EYpXVPN1redgqVoBB34nTpQ==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
"node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
- "version": "4.26.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.26.0.tgz",
- "integrity": "sha512-Odp/lgHbW/mAqw/pU21goo5ruWsytP7/HCC/liOt0zcGG0llYWKrd10k9Fj0pdj3prQ63N5yQLCLiE7HTX+MYw==",
+ "version": "4.30.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.30.1.tgz",
+ "integrity": "sha512-GLrZraoO3wVT4uFXh67ElpwQY0DIygxdv0BNW9Hkm3X34wu+BkqrDrkcsIapAY+N2ATEbvak0XQ9gxZtCIA5Rw==",
"cpu": [
"ppc64"
],
@@ -2891,9 +2884,9 @@
]
},
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
- "version": "4.26.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.26.0.tgz",
- "integrity": "sha512-MBR2ZhCTzUgVD0OJdTzNeF4+zsVogIR1U/FsyuFerwcqjZGvg2nYe24SAHp8O5sN8ZkRVbHwlYeHqcSQ8tcYew==",
+ "version": "4.30.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.30.1.tgz",
+ "integrity": "sha512-0WKLaAUUHKBtll0wvOmh6yh3S0wSU9+yas923JIChfxOaaBarmb/lBKPF0w/+jTVozFnOXJeRGZ8NvOxvk/jcw==",
"cpu": [
"riscv64"
],
@@ -2905,9 +2898,9 @@
]
},
"node_modules/@rollup/rollup-linux-s390x-gnu": {
- "version": "4.26.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.26.0.tgz",
- "integrity": "sha512-YYcg8MkbN17fMbRMZuxwmxWqsmQufh3ZJFxFGoHjrE7bv0X+T6l3glcdzd7IKLiwhT+PZOJCblpnNlz1/C3kGQ==",
+ "version": "4.30.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.30.1.tgz",
+ "integrity": "sha512-GWFs97Ruxo5Bt+cvVTQkOJ6TIx0xJDD/bMAOXWJg8TCSTEK8RnFeOeiFTxKniTc4vMIaWvCplMAFBt9miGxgkA==",
"cpu": [
"s390x"
],
@@ -2919,9 +2912,9 @@
]
},
"node_modules/@rollup/rollup-linux-x64-gnu": {
- "version": "4.26.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.26.0.tgz",
- "integrity": "sha512-ZuwpfjCwjPkAOxpjAEjabg6LRSfL7cAJb6gSQGZYjGhadlzKKywDkCUnJ+KEfrNY1jH5EEoSIKLCb572jSiglA==",
+ "version": "4.30.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.30.1.tgz",
+ "integrity": "sha512-UtgGb7QGgXDIO+tqqJ5oZRGHsDLO8SlpE4MhqpY9Llpzi5rJMvrK6ZGhsRCST2abZdBqIBeXW6WPD5fGK5SDwg==",
"cpu": [
"x64"
],
@@ -2933,9 +2926,9 @@
]
},
"node_modules/@rollup/rollup-linux-x64-musl": {
- "version": "4.26.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.26.0.tgz",
- "integrity": "sha512-+HJD2lFS86qkeF8kNu0kALtifMpPCZU80HvwztIKnYwym3KnA1os6nsX4BGSTLtS2QVAGG1P3guRgsYyMA0Yhg==",
+ "version": "4.30.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.30.1.tgz",
+ "integrity": "sha512-V9U8Ey2UqmQsBT+xTOeMzPzwDzyXmnAoO4edZhL7INkwQcaW1Ckv3WJX3qrrp/VHaDkEWIBWhRwP47r8cdrOow==",
"cpu": [
"x64"
],
@@ -2947,9 +2940,9 @@
]
},
"node_modules/@rollup/rollup-win32-arm64-msvc": {
- "version": "4.26.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.26.0.tgz",
- "integrity": "sha512-WUQzVFWPSw2uJzX4j6YEbMAiLbs0BUysgysh8s817doAYhR5ybqTI1wtKARQKo6cGop3pHnrUJPFCsXdoFaimQ==",
+ "version": "4.30.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.30.1.tgz",
+ "integrity": "sha512-WabtHWiPaFF47W3PkHnjbmWawnX/aE57K47ZDT1BXTS5GgrBUEpvOzq0FI0V/UYzQJgdb8XlhVNH8/fwV8xDjw==",
"cpu": [
"arm64"
],
@@ -2961,9 +2954,9 @@
]
},
"node_modules/@rollup/rollup-win32-ia32-msvc": {
- "version": "4.26.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.26.0.tgz",
- "integrity": "sha512-D4CxkazFKBfN1akAIY6ieyOqzoOoBV1OICxgUblWxff/pSjCA2khXlASUx7mK6W1oP4McqhgcCsu6QaLj3WMWg==",
+ "version": "4.30.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.30.1.tgz",
+ "integrity": "sha512-pxHAU+Zv39hLUTdQQHUVHf4P+0C47y/ZloorHpzs2SXMRqeAWmGghzAhfOlzFHHwjvgokdFAhC4V+6kC1lRRfw==",
"cpu": [
"ia32"
],
@@ -2975,9 +2968,9 @@
]
},
"node_modules/@rollup/rollup-win32-x64-msvc": {
- "version": "4.26.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.26.0.tgz",
- "integrity": "sha512-2x8MO1rm4PGEP0xWbubJW5RtbNLk3puzAMaLQd3B3JHVw4KcHlmXcO+Wewx9zCoo7EUFiMlu/aZbCJ7VjMzAag==",
+ "version": "4.30.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.30.1.tgz",
+ "integrity": "sha512-D6qjsXGcvhTjv0kI4fU8tUuBDF/Ueee4SVX79VfNDXZa64TfCW1Slkb6Z7O1p7vflqZjcmOVdZlqf8gvJxc6og==",
"cpu": [
"x64"
],
@@ -2989,14 +2982,14 @@
]
},
"node_modules/@schematics/angular": {
- "version": "19.0.6",
- "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.0.6.tgz",
- "integrity": "sha512-HicclmbW/+mlljU7a4PzbyIWG+7tognoL5LsgMFJQUDzJXHNjRt1riL0vk57o8Pcprnz9FheeWZXO1KRhXkQuw==",
+ "version": "19.1.4",
+ "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.1.4.tgz",
+ "integrity": "sha512-HFf83SoXbj1K4jkYSSfCg/oXkmSGBx0zG1Lh+dE5GZFdTQmykrBY519aSdrqLVyZzKYjTGfDfSewUeO4a0GE2A==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@angular-devkit/core": "19.0.6",
- "@angular-devkit/schematics": "19.0.6",
+ "@angular-devkit/core": "19.1.4",
+ "@angular-devkit/schematics": "19.1.4",
"jsonc-parser": "3.3.1"
},
"engines": {
@@ -3128,16 +3121,16 @@
}
},
"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,
"license": "MIT",
"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/@yarnpkg/lockfile": {
@@ -3273,9 +3266,9 @@
"license": "MIT"
},
"node_modules/beasties": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.1.0.tgz",
- "integrity": "sha512-+Ssscd2gVG24qRNC+E2g88D+xsQW4xwakWtKAiGEQ3Pw54/FGdyo9RrfxhGhEv6ilFVbB7r3Lgx+QnAxnSpECw==",
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.2.0.tgz",
+ "integrity": "sha512-Ljqskqx/tbZagIglYoJIMzH5zgssyp+in9+9sAyh15N22AornBeIDnb8EZ6Rk+6ShfMxd92uO3gfpT0NtZbpow==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
@@ -3283,10 +3276,13 @@
"css-what": "^6.1.0",
"dom-serializer": "^2.0.0",
"domhandler": "^5.0.3",
- "htmlparser2": "^9.0.0",
+ "htmlparser2": "^9.1.0",
"picocolors": "^1.1.1",
- "postcss": "^8.4.47",
+ "postcss": "^8.4.49",
"postcss-media-query-parser": "^0.2.3"
+ },
+ "engines": {
+ "node": ">=14.0.0"
}
},
"node_modules/bl": {
@@ -3912,9 +3908,9 @@
"license": "MIT"
},
"node_modules/domutils": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.1.tgz",
- "integrity": "sha512-xWXmuRnN9OMP6ptPd2+H0cCbcYBULa5YDTbMm/2lvkWvNA3O4wcW+GvzooqBuNM8yy6pl3VIAeJTUUWUbfI5Fw==",
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz",
+ "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
@@ -4016,9 +4012,9 @@
"license": "MIT"
},
"node_modules/esbuild": {
- "version": "0.24.0",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz",
- "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==",
+ "version": "0.24.2",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz",
+ "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
@@ -4029,30 +4025,31 @@
"node": ">=18"
},
"optionalDependencies": {
- "@esbuild/aix-ppc64": "0.24.0",
- "@esbuild/android-arm": "0.24.0",
- "@esbuild/android-arm64": "0.24.0",
- "@esbuild/android-x64": "0.24.0",
- "@esbuild/darwin-arm64": "0.24.0",
- "@esbuild/darwin-x64": "0.24.0",
- "@esbuild/freebsd-arm64": "0.24.0",
- "@esbuild/freebsd-x64": "0.24.0",
- "@esbuild/linux-arm": "0.24.0",
- "@esbuild/linux-arm64": "0.24.0",
- "@esbuild/linux-ia32": "0.24.0",
- "@esbuild/linux-loong64": "0.24.0",
- "@esbuild/linux-mips64el": "0.24.0",
- "@esbuild/linux-ppc64": "0.24.0",
- "@esbuild/linux-riscv64": "0.24.0",
- "@esbuild/linux-s390x": "0.24.0",
- "@esbuild/linux-x64": "0.24.0",
- "@esbuild/netbsd-x64": "0.24.0",
- "@esbuild/openbsd-arm64": "0.24.0",
- "@esbuild/openbsd-x64": "0.24.0",
- "@esbuild/sunos-x64": "0.24.0",
- "@esbuild/win32-arm64": "0.24.0",
- "@esbuild/win32-ia32": "0.24.0",
- "@esbuild/win32-x64": "0.24.0"
+ "@esbuild/aix-ppc64": "0.24.2",
+ "@esbuild/android-arm": "0.24.2",
+ "@esbuild/android-arm64": "0.24.2",
+ "@esbuild/android-x64": "0.24.2",
+ "@esbuild/darwin-arm64": "0.24.2",
+ "@esbuild/darwin-x64": "0.24.2",
+ "@esbuild/freebsd-arm64": "0.24.2",
+ "@esbuild/freebsd-x64": "0.24.2",
+ "@esbuild/linux-arm": "0.24.2",
+ "@esbuild/linux-arm64": "0.24.2",
+ "@esbuild/linux-ia32": "0.24.2",
+ "@esbuild/linux-loong64": "0.24.2",
+ "@esbuild/linux-mips64el": "0.24.2",
+ "@esbuild/linux-ppc64": "0.24.2",
+ "@esbuild/linux-riscv64": "0.24.2",
+ "@esbuild/linux-s390x": "0.24.2",
+ "@esbuild/linux-x64": "0.24.2",
+ "@esbuild/netbsd-arm64": "0.24.2",
+ "@esbuild/netbsd-x64": "0.24.2",
+ "@esbuild/openbsd-arm64": "0.24.2",
+ "@esbuild/openbsd-x64": "0.24.2",
+ "@esbuild/sunos-x64": "0.24.2",
+ "@esbuild/win32-arm64": "0.24.2",
+ "@esbuild/win32-ia32": "0.24.2",
+ "@esbuild/win32-x64": "0.24.2"
}
},
"node_modules/escalade": {
@@ -4102,9 +4099,9 @@
"license": "MIT"
},
"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==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -4112,16 +4109,16 @@
"@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"
}
},
"node_modules/fast-uri": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.4.tgz",
- "integrity": "sha512-G3iTQw1DizJQ5eEqj1CbFCWhq+pzum7qepkxU7rS1FGZDqjYKcrguo9XDRbV7EgPnn8CgaPigTq+NEjyioeYZQ==",
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz",
+ "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==",
"dev": true,
"funding": [
{
@@ -4136,9 +4133,9 @@
"license": "BSD-3-Clause"
},
"node_modules/fastq": {
- "version": "1.17.1",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",
- "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",
+ "version": "1.18.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz",
+ "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==",
"dev": true,
"license": "ISC",
"dependencies": {
@@ -4389,13 +4386,13 @@
}
},
"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,
"license": "MIT",
"dependencies": {
- "agent-base": "^7.0.2",
+ "agent-base": "^7.1.2",
"debug": "4"
},
"engines": {
@@ -4498,9 +4495,9 @@
}
},
"node_modules/is-core-module": {
- "version": "2.15.1",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz",
- "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==",
+ "version": "2.16.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
+ "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -4788,9 +4785,9 @@
}
},
"node_modules/lmdb": {
- "version": "3.1.5",
- "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.1.5.tgz",
- "integrity": "sha512-46Mch5Drq+A93Ss3gtbg+Xuvf5BOgIuvhKDWoGa3HcPHI6BL2NCOkRdSx1D4VfzwrxhnsjbyIVsLRlQHu6URvw==",
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.2.2.tgz",
+ "integrity": "sha512-LriG93la4PbmPMwI7Hbv8W+0ncLK7549w4sbZSi4QGDjnnxnmNMgxUkaQTEMzH8TpwsfFvgEjpLX7V8B/I9e3g==",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
@@ -4806,12 +4803,12 @@
"download-lmdb-prebuilds": "bin/download-prebuilds.js"
},
"optionalDependencies": {
- "@lmdb/lmdb-darwin-arm64": "3.1.5",
- "@lmdb/lmdb-darwin-x64": "3.1.5",
- "@lmdb/lmdb-linux-arm": "3.1.5",
- "@lmdb/lmdb-linux-arm64": "3.1.5",
- "@lmdb/lmdb-linux-x64": "3.1.5",
- "@lmdb/lmdb-win32-x64": "3.1.5"
+ "@lmdb/lmdb-darwin-arm64": "3.2.2",
+ "@lmdb/lmdb-darwin-x64": "3.2.2",
+ "@lmdb/lmdb-linux-arm": "3.2.2",
+ "@lmdb/lmdb-linux-arm64": "3.2.2",
+ "@lmdb/lmdb-linux-x64": "3.2.2",
+ "@lmdb/lmdb-win32-x64": "3.2.2"
}
},
"node_modules/log-symbols": {
@@ -4971,9 +4968,9 @@
}
},
"node_modules/magic-string": {
- "version": "0.30.12",
- "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz",
- "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==",
+ "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,
"license": "MIT",
"dependencies": {
@@ -5314,9 +5311,9 @@
}
},
"node_modules/nanoid": {
- "version": "3.3.7",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
- "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
+ "version": "3.3.8",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz",
+ "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==",
"dev": true,
"funding": [
{
@@ -5544,9 +5541,9 @@
}
},
"node_modules/npm-package-arg": {
- "version": "12.0.0",
- "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.0.tgz",
- "integrity": "sha512-ZTE0hbwSdTNL+Stx2zxSqdu2KZfNDcrtrLdIk7XGnQFYBWYDho/ORvXtn5XEePcL3tFpGjHCV3X3xrtDh7eZ+A==",
+ "version": "12.0.1",
+ "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.1.tgz",
+ "integrity": "sha512-aDxjFfPV3Liw0WOBWlyZLMBqtbgbg03rmGvHDJa2Ttv7tIz+1oB5qWec4psCDFZcZi9b5XdGkPdQiJxOPzvQRQ==",
"dev": true,
"license": "ISC",
"dependencies": {
@@ -5893,9 +5890,9 @@
}
},
"node_modules/piscina": {
- "version": "4.7.0",
- "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.7.0.tgz",
- "integrity": "sha512-b8hvkpp9zS0zsfa939b/jXbe64Z2gZv0Ha7FYPNUiDIB1y2AtxcOZdfP8xN8HFjUaqQiT9gRlfjAsoL8vdJ1Iw==",
+ "version": "4.8.0",
+ "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.8.0.tgz",
+ "integrity": "sha512-EZJb+ZxDrQf3dihsUL7p42pjNyrNIFJCrRHPMgxu/svsj+P3xS3fuEWp7k2+rfsavfl1N0G29b1HGs7J0m8rZA==",
"dev": true,
"license": "MIT",
"optionalDependencies": {
@@ -5903,9 +5900,9 @@
}
},
"node_modules/postcss": {
- "version": "8.4.49",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz",
- "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==",
+ "version": "8.5.1",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz",
+ "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==",
"dev": true,
"funding": [
{
@@ -5923,7 +5920,7 @@
],
"license": "MIT",
"dependencies": {
- "nanoid": "^3.3.7",
+ "nanoid": "^3.3.8",
"picocolors": "^1.1.1",
"source-map-js": "^1.2.1"
},
@@ -6047,19 +6044,22 @@
}
},
"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,
"license": "MIT",
"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"
}
@@ -6126,9 +6126,9 @@
}
},
"node_modules/rollup": {
- "version": "4.26.0",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.26.0.tgz",
- "integrity": "sha512-ilcl12hnWonG8f+NxU6BlgysVA0gvY2l8N0R84S1HcINbW20bvwuCngJkkInV6LXhwRpucsW5k1ovDwEdBVrNg==",
+ "version": "4.30.1",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.30.1.tgz",
+ "integrity": "sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -6142,24 +6142,25 @@
"npm": ">=8.0.0"
},
"optionalDependencies": {
- "@rollup/rollup-android-arm-eabi": "4.26.0",
- "@rollup/rollup-android-arm64": "4.26.0",
- "@rollup/rollup-darwin-arm64": "4.26.0",
- "@rollup/rollup-darwin-x64": "4.26.0",
- "@rollup/rollup-freebsd-arm64": "4.26.0",
- "@rollup/rollup-freebsd-x64": "4.26.0",
- "@rollup/rollup-linux-arm-gnueabihf": "4.26.0",
- "@rollup/rollup-linux-arm-musleabihf": "4.26.0",
- "@rollup/rollup-linux-arm64-gnu": "4.26.0",
- "@rollup/rollup-linux-arm64-musl": "4.26.0",
- "@rollup/rollup-linux-powerpc64le-gnu": "4.26.0",
- "@rollup/rollup-linux-riscv64-gnu": "4.26.0",
- "@rollup/rollup-linux-s390x-gnu": "4.26.0",
- "@rollup/rollup-linux-x64-gnu": "4.26.0",
- "@rollup/rollup-linux-x64-musl": "4.26.0",
- "@rollup/rollup-win32-arm64-msvc": "4.26.0",
- "@rollup/rollup-win32-ia32-msvc": "4.26.0",
- "@rollup/rollup-win32-x64-msvc": "4.26.0",
+ "@rollup/rollup-android-arm-eabi": "4.30.1",
+ "@rollup/rollup-android-arm64": "4.30.1",
+ "@rollup/rollup-darwin-arm64": "4.30.1",
+ "@rollup/rollup-darwin-x64": "4.30.1",
+ "@rollup/rollup-freebsd-arm64": "4.30.1",
+ "@rollup/rollup-freebsd-x64": "4.30.1",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.30.1",
+ "@rollup/rollup-linux-arm-musleabihf": "4.30.1",
+ "@rollup/rollup-linux-arm64-gnu": "4.30.1",
+ "@rollup/rollup-linux-arm64-musl": "4.30.1",
+ "@rollup/rollup-linux-loongarch64-gnu": "4.30.1",
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.30.1",
+ "@rollup/rollup-linux-riscv64-gnu": "4.30.1",
+ "@rollup/rollup-linux-s390x-gnu": "4.30.1",
+ "@rollup/rollup-linux-x64-gnu": "4.30.1",
+ "@rollup/rollup-linux-x64-musl": "4.30.1",
+ "@rollup/rollup-win32-arm64-msvc": "4.30.1",
+ "@rollup/rollup-win32-ia32-msvc": "4.30.1",
+ "@rollup/rollup-win32-x64-msvc": "4.30.1",
"fsevents": "~2.3.2"
}
},
@@ -6225,9 +6226,9 @@
"license": "MIT"
},
"node_modules/sass": {
- "version": "1.80.7",
- "resolved": "https://registry.npmjs.org/sass/-/sass-1.80.7.tgz",
- "integrity": "sha512-MVWvN0u5meytrSjsU7AWsbhoXi1sc58zADXFllfZzbsBT1GHjjar6JwBINYPRrkx/zqnQ6uqbQuHgE95O+C+eQ==",
+ "version": "1.83.1",
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.83.1.tgz",
+ "integrity": "sha512-EVJbDaEs4Rr3F0glJzFSOvtg2/oy2V/YrGFPqPY24UqcLDWcI9ZY5sN+qyO3c/QCZwzgfirvhXvINiJCE/OLcA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -6881,21 +6882,21 @@
}
},
"node_modules/vite": {
- "version": "5.4.11",
- "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz",
- "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==",
+ "version": "6.0.7",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.7.tgz",
+ "integrity": "sha512-RDt8r/7qx9940f8FcOIAH9PTViRrghKaK2K1jY3RaAURrEUbm9Du1mJ72G+jlhtG3WwodnfzY8ORQZbBavZEAQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "esbuild": "^0.21.3",
- "postcss": "^8.4.43",
- "rollup": "^4.20.0"
+ "esbuild": "^0.24.2",
+ "postcss": "^8.4.49",
+ "rollup": "^4.23.0"
},
"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"
@@ -6904,19 +6905,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
},
@@ -6937,439 +6944,15 @@
},
"terser": {
"optional": true
+ },
+ "tsx": {
+ "optional": true
+ },
+ "yaml": {
+ "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,
- "license": "MIT",
- "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,
- "license": "MIT",
- "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,
- "license": "MIT",
- "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,
- "license": "MIT",
- "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,
- "license": "MIT",
- "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,
- "license": "MIT",
- "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,
- "license": "MIT",
- "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,
- "license": "MIT",
- "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,
- "license": "MIT",
- "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,
- "license": "MIT",
- "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,
- "license": "MIT",
- "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,
- "license": "MIT",
- "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,
- "license": "MIT",
- "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,
- "license": "MIT",
- "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,
- "license": "MIT",
- "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,
- "license": "MIT",
- "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,
- "license": "MIT",
- "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,
- "license": "MIT",
- "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,
- "license": "MIT",
- "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,
- "license": "MIT",
- "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,
- "license": "MIT",
- "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,
- "license": "MIT",
- "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,
- "license": "MIT",
- "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,
- "license": "MIT",
- "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/watchpack": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz",
diff --git a/client/package.json b/client/package.json
index 0f76dce..a64f052 100644
--- a/client/package.json
+++ b/client/package.json
@@ -6,26 +6,26 @@
},
"scripts": {
"ng": "ng",
- "start": "ng serve --open --live-reload",
+ "start": "ng serve --open",
"build": "ng build --configuration=development",
"build.prod": "ng build --configuration=production",
"watch": "ng build --configuration=development --watch"
},
"private": false,
"dependencies": {
- "@angular/animations": "19.0.5",
- "@angular/cdk": "19.0.4",
- "@angular/common": "19.0.5",
- "@angular/compiler": "19.0.5",
- "@angular/core": "19.0.5",
- "@angular/forms": "19.0.5",
- "@angular/material": "19.0.4",
- "@angular/platform-browser": "19.0.5",
- "@angular/platform-browser-dynamic": "19.0.5",
- "@angular/router": "19.0.5",
- "@angular/service-worker": "19.0.5",
+ "@angular/animations": "19.1.3",
+ "@angular/cdk": "19.1.1",
+ "@angular/common": "19.1.3",
+ "@angular/compiler": "19.1.3",
+ "@angular/core": "19.1.3",
+ "@angular/forms": "19.1.3",
+ "@angular/material": "19.1.1",
+ "@angular/platform-browser": "19.1.3",
+ "@angular/platform-browser-dynamic": "19.1.3",
+ "@angular/router": "19.1.3",
+ "@angular/service-worker": "19.1.3",
"@ctrl/tinycolor": "4.1.0",
- "@ng-matero/extensions": "18.3.3",
+ "@ng-matero/extensions": "19.1.0",
"chart.js": "4.4.6",
"chartjs-adapter-date-fns": "3.0.0",
"chartjs-plugin-annotation": "3.1.0",
@@ -37,9 +37,9 @@
"zone.js": "0.15.0"
},
"devDependencies": {
- "@angular/build": "^19.0.6",
- "@angular/cli": "19.0.6",
- "@angular/compiler-cli": "19.0.5",
+ "@angular/build": "19.1.4",
+ "@angular/cli": "19.1.4",
+ "@angular/compiler-cli": "19.1.3",
"typescript": "5.5.4"
}
-}
\ No newline at end of file
+}
diff --git a/client/src/polyfills.ts b/client/src/polyfills.ts
index 813c824..d89e090 100644
--- a/client/src/polyfills.ts
+++ b/client/src/polyfills.ts
@@ -1,53 +1,6 @@
/**
- * This file includes polyfills needed by Angular and is loaded before the app.
- * You can add your own extra polyfills to this file.
- *
- * This file is divided into 2 sections:
- * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers.
- * 2. Application imports. Files imported after ZoneJS that should be loaded before your main
- * file.
- *
- * The current setup is for so-called "evergreen" browsers; the last versions of browsers that
- * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera),
- * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile.
- *
- * Learn more in https://angular.io/guide/browser-support
+ * Angular requires zone.js for its change detection.
+ * No other polyfills are needed for modern browsers.
*/
-/***************************************************************************************************
- * BROWSER POLYFILLS
- */
-
-/**
- * By default, zone.js will patch all possible macroTask and DomEvents
- * user can disable parts of macroTask/DomEvents patch by setting following flags
- * because those flags need to be set before `zone.js` being loaded, and webpack
- * will put import in the top of bundle, so user need to create a separate file
- * in this directory (for example: zone-flags.ts), and put the following flags
- * into that file, and then add the following code before importing zone.js.
- * import './zone-flags.ts';
- *
- * The flags allowed in zone-flags.ts are listed here.
- *
- * The following flags will work for all browsers.
- *
- * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame
- * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick
- * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames
- *
- * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js
- * with the following flag, it will bypass `zone.js` patch for IE/Edge
- *
- * (window as any).__Zone_enable_cross_context_check = true;
- *
- */
-
-/***************************************************************************************************
- * Zone JS is required by default for Angular itself.
- */
-import 'zone.js'; // Included with Angular CLI.
-
-
-/***************************************************************************************************
- * APPLICATION IMPORTS
- */
+import 'zone.js';
diff --git a/server/Directory.Packages.props b/server/Directory.Packages.props
index 2a276af..5095059 100644
--- a/server/Directory.Packages.props
+++ b/server/Directory.Packages.props
@@ -5,8 +5,8 @@
$(NoWarn);NU1507
-
-
+
+
diff --git a/server/Functions/Program.cs b/server/Functions/Program.cs
index a7fda5c..1bd0ff2 100644
--- a/server/Functions/Program.cs
+++ b/server/Functions/Program.cs
@@ -1,7 +1,13 @@
+using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
+using WebApi.Services;
IHost host = new HostBuilder()
.ConfigureFunctionsWorkerDefaults()
+ .ConfigureServices(services => {
+ services.AddSingleton();
+ services.AddHostedService();
+ })
.Build();
host.Run();
diff --git a/server/Functions/UpdateQuotes.cs b/server/Functions/UpdateQuotes.cs
index 11965a0..929e128 100644
--- a/server/Functions/UpdateQuotes.cs
+++ b/server/Functions/UpdateQuotes.cs
@@ -10,10 +10,28 @@
namespace Functions;
-public class Jobs(ILoggerFactory loggerFactory, IConfiguration configuration)
+public class Jobs
{
- private readonly ILogger _logger = loggerFactory.CreateLogger();
- private readonly IConfiguration _configuration = configuration;
+ private readonly ILogger _logger;
+ private readonly IConfiguration _configuration;
+ private readonly IStorage _storage;
+ private readonly string? _keyVaultUrl;
+ private readonly string? _alpacaKey;
+ private readonly string? _alpacaSecret;
+
+ public Jobs(
+ ILoggerFactory loggerFactory,
+ IConfiguration configuration,
+ IStorage storage)
+ {
+ _logger = loggerFactory.CreateLogger();
+ _configuration = configuration;
+ _storage = storage;
+
+ // Load configuration on startup
+ (_alpacaKey, _alpacaSecret) = GetAlpacaCredentials();
+ _keyVaultUrl = _configuration["KEY_VAULT_URL"];
+ }
///
/// Schedule to get and cache quotes from source feed.
@@ -25,72 +43,92 @@ public async Task Run([TimerTrigger("0 */1 08-18 * * 1-5")] TimerInfo myTimer)
{
// ~ extended market hours, every minute "0 */1 08-18 * * 1-5"
// for dev: minutely "0 */1 * * * *"
- await StoreQuoteDaily("SPY");
- await StoreQuoteDaily("QQQ");
+ List tasks = new() {
+ StoreQuoteDaily("SPY"),
+ StoreQuoteDaily("QQQ")
+ };
+ await Task.WhenAll(tasks);
_logger.LogInformation(
"Quotes updated on {date and time} for {schedule status}.",
DateTime.Now, myTimer.ScheduleStatus);
}
- ///
- /// STORE QUOTES: get and store historical quotes to blob storage provider.
- ///
- /// Security symbol
- ///
- /// When credentials are missing
- ///
- private async Task StoreQuoteDaily(string symbol)
+ private (string? key, string? secret) GetAlpacaCredentials()
{
- // get and validate keys, see README.md
- string? alpacaKey = _configuration["ALPACA_KEY"];
- string? alpacaSecret = _configuration["ALPACA_SECRET"];
+ string? key = _configuration["ALPACA_KEY"]
+ ?? _configuration["UserSecrets:ALPACA_KEY"];
+
+ string? secret = _configuration["ALPACA_SECRET"]
+ ?? _configuration["UserSecrets:ALPACA_SECRET"];
+
+ return (key, secret);
+ }
- if (string.IsNullOrEmpty(alpacaKey) || string.IsNullOrEmpty(alpacaSecret))
+ private async Task<(string key, string secret)> GetAlpacaCredentialsFromKeyVault()
+ {
+ if (string.IsNullOrEmpty(_keyVaultUrl))
{
- // Try to get from User Secrets
- alpacaKey = _configuration["UserSecrets:ALPACA_KEY"];
- alpacaSecret = _configuration["UserSecrets:ALPACA_SECRET"];
+ throw new InvalidOperationException("Key Vault URL is not configured");
}
- if (string.IsNullOrEmpty(alpacaKey) || string.IsNullOrEmpty(alpacaSecret))
+ try
{
- // Try to get from Azure Key Vault
- string? keyVaultUrl = _configuration["KEY_VAULT_URL"];
-
- if (string.IsNullOrEmpty(keyVaultUrl))
- {
- throw new ArgumentNullException(
- keyVaultUrl,
- $"Key Vault URL missing, use `setx KEY_VAULT_URL \"MY-KEY-VAULT-URL\"` to set.");
- }
-
- SecretClient secretClient = new(new Uri(keyVaultUrl), new DefaultAzureCredential());
-
- KeyVaultSecret alpacaKeySecret = await secretClient.GetSecretAsync("ALPACA_KEY");
- KeyVaultSecret alpacaSecretSecret = await secretClient.GetSecretAsync("ALPACA_SECRET");
-
- alpacaKey = alpacaKeySecret.Value;
- alpacaSecret = alpacaSecretSecret.Value;
+ SecretClient secretClient = new(
+ new Uri(_keyVaultUrl),
+ new DefaultAzureCredential()
+ );
+
+ // Get both secrets in parallel
+ Azure.Response[] tasks = await Task.WhenAll(
+ secretClient.GetSecretAsync("ALPACA_KEY"),
+ secretClient.GetSecretAsync("ALPACA_SECRET")
+ );
+
+ return (tasks[0].Value.Value, tasks[1].Value.Value);
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, "Failed to retrieve credentials from Key Vault");
+ throw new InvalidOperationException("Failed to retrieve credentials from Key Vault", ex);
}
+ }
- if (string.IsNullOrEmpty(alpacaKey))
+ private async Task<(string key, string secret)> GetValidAlpacaCredentials()
+ {
+ // Try environment/configuration first
+ if (!string.IsNullOrEmpty(_alpacaKey) && !string.IsNullOrEmpty(_alpacaSecret))
{
- throw new ArgumentNullException(
- alpacaKey,
- $"API KEY missing, use `setx ALPACA_KEY \"MY-ALPACA-KEY\"` to set.");
+ return (_alpacaKey, _alpacaSecret);
}
- if (string.IsNullOrEmpty(alpacaSecret))
+ // Fall back to key vault
+ try
{
- throw new ArgumentNullException(
- alpacaSecret,
- $"API SECRET missing, use `setx ALPACA_SECRET \"MY-ALPACA-SECRET\"` to set.");
+ return await GetAlpacaCredentialsFromKeyVault();
}
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, "Failed to get valid Alpaca credentials");
+ throw new InvalidOperationException(
+ "Unable to retrieve Alpaca credentials from any source", ex);
+ }
+ }
+
+ ///
+ /// STORE QUOTES: get and store historical quotes to blob storage provider.
+ ///
+ /// Security symbol
+ ///
+ /// When credentials are missing
+ ///
+ private async Task StoreQuoteDaily(string symbol)
+ {
+ (string key, string secret) = await GetValidAlpacaCredentials();
// fetch from Alpaca paper trading API
IAlpacaDataClient alpacaDataClient = Environments.Paper
- .GetAlpacaDataClient(new SecretKey(alpacaKey, alpacaSecret));
+ .GetAlpacaDataClient(new SecretKey(key, secret));
DateTime into = DateTime.Now.Subtract(TimeSpan.FromMinutes(16));
DateTime from = into.Subtract(TimeSpan.FromDays(800));
@@ -103,22 +141,22 @@ private async Task StoreQuoteDaily(string symbol)
// compose
foreach (IBar bar in barSet.Items)
{
- Quote q = new() {
+ quotes.Add(new Quote {
Date = bar.TimeUtc,
Open = bar.Open,
High = bar.High,
Low = bar.Low,
Close = bar.Close,
Volume = bar.Volume
- };
- quotes.Add(q);
+ });
}
- string json = JsonSerializer.Serialize(quotes.OrderBy(x => x.Date));
+ string json = JsonSerializer
+ .Serialize(quotes.OrderBy(x => x.Date));
// store in Azure Blob Storage
string blobName = $"{symbol}-DAILY.json";
- await Storage.PutBlob(blobName, json);
+ await _storage.PutBlobAsync(blobName, json);
_logger.LogInformation("Updated {blobName name}.", blobName);
}
diff --git a/server/WebApi/Controllers/MainController.cs b/server/WebApi/Controllers/MainController.cs
deleted file mode 100644
index e2dba5b..0000000
--- a/server/WebApi/Controllers/MainController.cs
+++ /dev/null
@@ -1,1037 +0,0 @@
-using Microsoft.AspNetCore.Mvc;
-using WebApi.Services;
-
-namespace WebApi.Controllers;
-
-[ApiController]
-[Route("")]
-public class MainController(QuoteService quoteService) : ControllerBase
-{
- private readonly QuoteService quoteFeed = quoteService;
-
- // GLOBALS
- internal static readonly int limitLast = 120;
-
- [HttpGet]
- public string Get() => "API is functioning nominally.";
-
- [HttpGet("quotes")]
- public async Task GetQuotes()
- {
- IEnumerable quotes = await quoteFeed.Get();
- return Ok(quotes.TakeLast(limitLast));
- }
-
- [HttpGet("indicators")]
- public IActionResult GetIndicatorCatalog()
- {
- Response.Headers.CacheControl = "public, max-age=3600"; // 1 hour TTL
- Response.Headers.ETag = "YYYY.MM.DD"; // replaced in build deployment
- Response.Headers.LastModified = DateTime.UtcNow.ToString("R");
-
- return Ok(Metadata.IndicatorListing($"{Request.Scheme}://{Request.Host}"));
- }
-
-
- //////////////////////////////////////////
- // INDICATORS (sorted alphabetically)
-
- [HttpGet("ADL")]
- public async Task GetAdl(
- int smaPeriods)
- {
- try
- {
- IEnumerable quotes = await quoteFeed.Get();
-
- IEnumerable results =
- quotes.GetAdl(smaPeriods)
- .TakeLast(limitLast);
-
- return Ok(results);
- }
- catch (ArgumentOutOfRangeException rex)
- {
- return BadRequest(rex.Message);
- }
- }
-
- [HttpGet("ADX")]
- public async Task GetAdx(
- int lookbackPeriods)
- {
- try
- {
- IEnumerable quotes = await quoteFeed.Get();
-
- IEnumerable results =
- quotes.GetAdx(lookbackPeriods)
- .TakeLast(limitLast);
-
- return Ok(results);
- }
- catch (ArgumentOutOfRangeException rex)
- {
- return BadRequest(rex.Message);
- }
- }
-
- [HttpGet("ALMA")]
- public async Task GetAlma(
- int lookbackPeriods,
- double offset,
- double sigma)
- {
- try
- {
- IEnumerable quotes = await quoteFeed.Get();
-
- IEnumerable results =
- quotes.GetAlma(lookbackPeriods, offset, sigma)
- .TakeLast(limitLast);
-
- return Ok(results);
- }
- catch (ArgumentOutOfRangeException rex)
- {
- return BadRequest(rex.Message);
- }
- }
-
- [HttpGet("ALLIGATOR")]
- public async Task GetAlligator(
- int jawPeriods,
- int jawOffset,
- int teethPeriods,
- int teethOffset,
- int lipsPeriods,
- int lipsOffset)
- {
- try
- {
- IEnumerable quotes = await quoteFeed.Get();
-
- IEnumerable results =
- quotes.GetAlligator(jawPeriods, jawOffset, teethPeriods, teethOffset, lipsPeriods, lipsOffset)
- .TakeLast(limitLast);
-
- return Ok(results);
- }
- catch (ArgumentOutOfRangeException rex)
- {
- return BadRequest(rex.Message);
- }
- }
-
- [HttpGet("AROON")]
- public async Task GetAroon(
- int lookbackPeriods)
- {
- try
- {
- IEnumerable quotes = await quoteFeed.Get();
-
- IEnumerable results =
- quotes.GetAroon(lookbackPeriods)
- .TakeLast(limitLast);
-
- return Ok(results);
- }
- catch (ArgumentOutOfRangeException rex)
- {
- return BadRequest(rex.Message);
- }
- }
-
- [HttpGet("ATR")]
- public async Task GetAtr(
- int lookbackPeriods)
- {
- try
- {
- IEnumerable quotes = await quoteFeed.Get();
-
- IEnumerable results =
- quotes.GetAtr(lookbackPeriods)
- .TakeLast(limitLast);
-
- return Ok(results);
- }
- catch (ArgumentOutOfRangeException rex)
- {
- return BadRequest(rex.Message);
- }
- }
-
- [HttpGet("ATR-STOP-CLOSE")]
- public async Task GetAtrStopClose(
- int lookbackPeriods,
- double multiplier)
- {
- try
- {
- IEnumerable quotes = await quoteFeed.Get();
-
- IEnumerable results =
- quotes.GetAtrStop(lookbackPeriods, multiplier, EndType.Close)
- .TakeLast(limitLast);
-
- return Ok(results);
- }
- catch (ArgumentOutOfRangeException rex)
- {
- return BadRequest(rex.Message);
- }
- }
-
- [HttpGet("ATR-STOP-HL")]
- public async Task GetAtrStopHL(
- int lookbackPeriods,
- double multiplier)
- {
- try
- {
- IEnumerable quotes = await quoteFeed.Get();
-
- IEnumerable results =
- quotes.GetAtrStop(lookbackPeriods, multiplier, EndType.HighLow)
- .TakeLast(limitLast);
-
- return Ok(results);
- }
- catch (ArgumentOutOfRangeException rex)
- {
- return BadRequest(rex.Message);
- }
- }
-
- [HttpGet("BB")]
- public async Task GetBollingerBands(
- int lookbackPeriods,
- double standardDeviations)
- {
- try
- {
- IEnumerable quotes = await quoteFeed.Get();
-
- IEnumerable results =
- quotes.GetBollingerBands(lookbackPeriods, standardDeviations)
- .TakeLast(limitLast);
-
- return Ok(results);
- }
- catch (ArgumentOutOfRangeException rex)
- {
- return BadRequest(rex.Message);
- }
- }
-
- [HttpGet("BETA")]
- public async Task GetBeta(
- int lookbackPeriods,
- BetaType type)
- {
- try
- {
- IEnumerable quotes = await quoteFeed.Get();
- IEnumerable market = await quoteFeed.Get("SPY");
-
- IEnumerable results =
- quotes.GetBeta(market, lookbackPeriods, type)
- .TakeLast(limitLast);
-
- return Ok(results);
- }
- catch (ArgumentOutOfRangeException rex)
- {
- return BadRequest(rex.Message);
- }
- }
-
- [HttpGet("CHEXIT-LONG")]
- public async Task GetChandelierLong(
- int lookbackPeriods,
- double multiplier)
- {
- try
- {
- IEnumerable quotes = await quoteFeed.Get();
-
- IEnumerable results =
- quotes.GetChandelier(lookbackPeriods, multiplier, ChandelierType.Long)
- .TakeLast(limitLast);
-
- return Ok(results);
- }
- catch (ArgumentOutOfRangeException rex)
- {
- return BadRequest(rex.Message);
- }
- }
-
- [HttpGet("CHEXIT-SHORT")]
- public async Task GetChandelierShort(
- int lookbackPeriods,
- double multiplier)
- {
- try
- {
- IEnumerable quotes = await quoteFeed.Get();
-
- IEnumerable results =
- quotes.GetChandelier(lookbackPeriods, multiplier, ChandelierType.Short)
- .TakeLast(limitLast);
-
- return Ok(results);
- }
- catch (ArgumentOutOfRangeException rex)
- {
- return BadRequest(rex.Message);
- }
- }
-
- [HttpGet("CHOP")]
- public async Task GetChop(
- int lookbackPeriods)
- {
- try
- {
- IEnumerable quotes = await quoteFeed.Get();
-
- IEnumerable results =
- quotes.GetChop(lookbackPeriods)
- .TakeLast(limitLast);
-
- return Ok(results);
- }
- catch (ArgumentOutOfRangeException rex)
- {
- return BadRequest(rex.Message);
- }
- }
-
- [HttpGet("CMF")]
- public async Task GetCmf(
- int lookbackPeriods)
- {
- try
- {
- IEnumerable quotes = await quoteFeed.Get();
-
- IEnumerable results =
- quotes.GetCmf(lookbackPeriods)
- .TakeLast(limitLast);
-
- return Ok(results);
- }
- catch (ArgumentOutOfRangeException rex)
- {
- return BadRequest(rex.Message);
- }
- }
-
- [HttpGet("CMO")]
- public async Task GetCmo(
- int lookbackPeriods)
- {
- try
- {
- IEnumerable quotes = await quoteFeed.Get();
-
- IEnumerable results =
- quotes.GetCmo(lookbackPeriods)
- .TakeLast(limitLast);
-
- return Ok(results);
- }
- catch (ArgumentOutOfRangeException rex)
- {
- return BadRequest(rex.Message);
- }
- }
-
- [HttpGet("CRSI")]
- public async Task GetConnorsRsi(
- int rsiPeriods,
- int streakPeriods,
- int rankPeriods)
- {
- try
- {
- IEnumerable quotes = await quoteFeed.Get();
-
- IEnumerable results =
- quotes.GetConnorsRsi(rsiPeriods, streakPeriods, rankPeriods)
- .TakeLast(limitLast);
-
- return Ok(results);
- }
- catch (ArgumentOutOfRangeException rex)
- {
- return BadRequest(rex.Message);
- }
- }
-
- [HttpGet("DOJI")]
- public async Task GetDoji(
- double maxPriceChangePercent)
- {
- try
- {
- IEnumerable quotes = await quoteFeed.Get();
-
- IEnumerable results =
- quotes.GetDoji(maxPriceChangePercent)
- .TakeLast(limitLast);
-
- return Ok(results);
- }
- catch (ArgumentOutOfRangeException rex)
- {
- return BadRequest(rex.Message);
- }
- }
-
- [HttpGet("DONCHIAN")]
- public async Task GetDonchian(
- int lookbackPeriods)
- {
- try
- {
- IEnumerable quotes = await quoteFeed.Get();
-
- IEnumerable results =
- quotes.GetDonchian(lookbackPeriods)
- .TakeLast(limitLast);
-
- return Ok(results);
- }
- catch (ArgumentOutOfRangeException rex)
- {
- return BadRequest(rex.Message);
- }
- }
-
- [HttpGet("DYN")]
- public async Task GetDynamic(
- int lookbackPeriods)
- {
- try
- {
- IEnumerable quotes = await quoteFeed.Get();
-
- IEnumerable results =
- quotes.GetDynamic(lookbackPeriods)
- .TakeLast(limitLast);
-
- return Ok(results);
- }
- catch (ArgumentOutOfRangeException rex)
- {
- return BadRequest(rex.Message);
- }
- }
-
- [HttpGet("ELDER-RAY")]
- public async Task GetElderRay(
- int lookbackPeriods)
- {
- try
- {
- IEnumerable quotes = await quoteFeed.Get();
-
- IEnumerable results =
- quotes.GetElderRay(lookbackPeriods)
- .TakeLast(limitLast);
-
- return Ok(results);
- }
- catch (ArgumentOutOfRangeException rex)
- {
- return BadRequest(rex.Message);
- }
- }
-
- [HttpGet("EPMA")]
- public async Task GetEpma(
- int lookbackPeriods)
- {
- try
- {
- IEnumerable quotes = await quoteFeed.Get();
-
- IEnumerable results =
- quotes.GetEpma(lookbackPeriods)
- .TakeLast(limitLast);
-
- return Ok(results);
- }
- catch (ArgumentOutOfRangeException rex)
- {
- return BadRequest(rex.Message);
- }
- }
-
- [HttpGet("EMA")]
- public async Task GetEma(
- int lookbackPeriods)
- {
- try
- {
- IEnumerable quotes = await quoteFeed.Get();
-
- IEnumerable results =
- quotes.GetEma(lookbackPeriods)
- .TakeLast(limitLast);
-
- return Ok(results);
- }
- catch (ArgumentOutOfRangeException rex)
- {
- return BadRequest(rex.Message);
- }
- }
-
- [HttpGet("FCB")]
- public async Task GetFcb(
- int windowSpan)
- {
- try
- {
- IEnumerable quotes = await quoteFeed.Get();
-
- IEnumerable results =
- quotes.GetFcb(windowSpan)
- .TakeLast(limitLast);
-
- return Ok(results);
- }
- catch (ArgumentOutOfRangeException rex)
- {
- return BadRequest(rex.Message);
- }
- }
-
- [HttpGet("FISHER")]
- public async Task GetFisher(
- int lookbackPeriods)
- {
- try
- {
- IEnumerable quotes = await quoteFeed.Get();
-
- IEnumerable results =
- quotes.GetFisherTransform(lookbackPeriods)
- .TakeLast(limitLast);
-
- return Ok(results);
- }
- catch (ArgumentOutOfRangeException rex)
- {
- return BadRequest(rex.Message);
- }
- }
-
- [HttpGet("FRACTAL")]
- public async Task GetFractal(
- int windowSpan)
- {
- try
- {
- IEnumerable quotes = await quoteFeed.Get();
-
- IEnumerable results =
- quotes.GetFractal(windowSpan)
- .TakeLast(limitLast);
-
- return Ok(results);
- }
- catch (ArgumentOutOfRangeException rex)
- {
- return BadRequest(rex.Message);
- }
- }
-
- [HttpGet("GATOR")]
- public async Task GetGator()
- {
- try
- {
- IEnumerable quotes = await quoteFeed.Get();
-
- IEnumerable results =
- quotes.GetGator()
- .TakeLast(limitLast);
-
- return Ok(results);
- }
- catch (ArgumentOutOfRangeException rex)
- {
- return BadRequest(rex.Message);
- }
- }
-
- [HttpGet("HTL")]
- public async Task GetHTL()
- {
- try
- {
- IEnumerable quotes = await quoteFeed.Get();
-
- IEnumerable results =
- quotes.GetHtTrendline()
- .TakeLast(limitLast);
-
- return Ok(results);
- }
- catch (ArgumentOutOfRangeException rex)
- {
- return BadRequest(rex.Message);
- }
- }
-
- [HttpGet("ICHIMOKU")]
- public async Task GetIchimoku(
- int tenkanPeriods,
- int kijunPeriods,
- int senkouBPeriods)
- {
- try
- {
- IEnumerable quotes = await quoteFeed.Get();
-
- IEnumerable results =
- quotes.GetIchimoku(tenkanPeriods, kijunPeriods, senkouBPeriods)
- .TakeLast(limitLast);
-
- return Ok(results);
- }
- catch (ArgumentOutOfRangeException rex)
- {
- return BadRequest(rex.Message);
- }
- }
-
- [HttpGet("KELTNER")]
- public async Task GetKeltner(
- int emaPeriods,
- double multiplier,
- int atrPeriods)
- {
- try
- {
- IEnumerable quotes = await quoteFeed.Get();
-
- IEnumerable results =
- quotes.GetKeltner(emaPeriods, multiplier, atrPeriods)
- .TakeLast(limitLast);
-
- return Ok(results);
- }
- catch (ArgumentOutOfRangeException rex)
- {
- return BadRequest(rex.Message);
- }
- }
-
- [HttpGet("MACD")]
- public async Task GetMacd(
- int fastPeriods,
- int slowPeriods,
- int signalPeriods)
- {
- try
- {
- IEnumerable quotes = await quoteFeed.Get();
-
- IEnumerable results =
- quotes.GetMacd(fastPeriods, slowPeriods, signalPeriods)
- .TakeLast(limitLast);
-
- return Ok(results);
- }
- catch (ArgumentOutOfRangeException rex)
- {
- return BadRequest(rex.Message);
- }
- }
-
- [HttpGet("MARUBOZU")]
- public async Task GetMarubozu(
- double minBodyPercent)
- {
- try
- {
- IEnumerable quotes = await quoteFeed.Get();
-
- IEnumerable results =
- quotes.GetMarubozu(minBodyPercent)
- .TakeLast(limitLast);
-
- return Ok(results);
- }
- catch (ArgumentOutOfRangeException rex)
- {
- return BadRequest(rex.Message);
- }
- }
-
- [HttpGet("MFI")]
- public async Task GetMfi(
- int lookbackPeriods)
- {
- try
- {
- IEnumerable quotes = await quoteFeed.Get();
-
- IEnumerable results =
- quotes.GetMfi(lookbackPeriods)
- .TakeLast(limitLast);
-
- return Ok(results);
- }
- catch (ArgumentOutOfRangeException rex)
- {
- return BadRequest(rex.Message);
- }
- }
-
- [HttpGet("PSAR")]
- public async Task GetParabolicSar(
- double accelerationStep,
- double maxAccelerationFactor)
- {
- try
- {
- IEnumerable quotes = await quoteFeed.Get();
-
- IEnumerable results =
- quotes.GetParabolicSar(accelerationStep, maxAccelerationFactor)
- .TakeLast(limitLast);
-
- return Ok(results);
- }
- catch (ArgumentOutOfRangeException rex)
- {
- return BadRequest(rex.Message);
- }
- }
-
- [HttpGet("ROC")]
- public async Task GetRoc(
- int lookbackPeriods,
- int smaPeriods)
- {
- try
- {
- IEnumerable quotes = await quoteFeed.Get();
-
- IEnumerable results =
- quotes.GetRoc(lookbackPeriods, smaPeriods)
- .TakeLast(limitLast);
-
- return Ok(results);
- }
- catch (ArgumentOutOfRangeException rex)
- {
- return BadRequest(rex.Message);
- }
- }
-
- [HttpGet("RSI")]
- public async Task GetRsi(
- int lookbackPeriods)
- {
- try
- {
- IEnumerable quotes = await quoteFeed.Get();
-
- IEnumerable results =
- quotes.GetRsi(lookbackPeriods)
- .TakeLast(limitLast);
-
- return Ok(results);
- }
- catch (ArgumentOutOfRangeException rex)
- {
- return BadRequest(rex.Message);
- }
- }
-
- [HttpGet("SLOPE")]
- public async Task GetSlope(
- int lookbackPeriods)
- {
- try
- {
- IEnumerable quotes = await quoteFeed.Get();
-
- IEnumerable results =
- quotes.GetSlope(lookbackPeriods)
- .TakeLast(limitLast);
-
- return Ok(results);
- }
- catch (ArgumentOutOfRangeException rex)
- {
- return BadRequest(rex.Message);
- }
- }
-
- [HttpGet("SMA")]
- public async Task GetSma(
- int lookbackPeriods)
- {
- try
- {
- IEnumerable quotes = await quoteFeed.Get();
-
- IEnumerable results =
- quotes.GetSma(lookbackPeriods)
- .TakeLast(limitLast);
-
- return Ok(results);
- }
- catch (ArgumentOutOfRangeException rex)
- {
- return BadRequest(rex.Message);
- }
- }
-
- [HttpGet("SMI")]
- public async Task GetSmi(
- int lookbackPeriods,
- int firstSmoothPeriods,
- int secondSmoothPeriods,
- int signalPeriods)
- {
- try
- {
- IEnumerable quotes = await quoteFeed.Get();
-
- IEnumerable results =
- quotes.GetSmi(lookbackPeriods, firstSmoothPeriods, secondSmoothPeriods, signalPeriods)
- .TakeLast(limitLast);
-
- return Ok(results);
- }
- catch (ArgumentOutOfRangeException rex)
- {
- return BadRequest(rex.Message);
- }
- }
-
- [HttpGet("STC")]
- public async Task GetStc(
- int cyclePeriods,
- int fastPeriods,
- int slowPeriods)
- {
- try
- {
- IEnumerable quotes = await quoteFeed.Get();
-
- IEnumerable results =
- quotes.GetStc(cyclePeriods, fastPeriods, slowPeriods)
- .TakeLast(limitLast);
-
- return Ok(results);
- }
- catch (ArgumentOutOfRangeException rex)
- {
- return BadRequest(rex.Message);
- }
- }
-
- [HttpGet("STARC")]
- public async Task GetStarc(
- int smaPeriods,
- double multiplier,
- int atrPeriods)
- {
- try
- {
- IEnumerable quotes = await quoteFeed.Get();
-
- IEnumerable results =
- quotes.GetStarcBands(smaPeriods, multiplier, atrPeriods)
- .TakeLast(limitLast);
-
- return Ok(results);
- }
- catch (ArgumentOutOfRangeException rex)
- {
- return BadRequest(rex.Message);
- }
- }
-
- [HttpGet("STDEV")]
- public async Task GetStdDev(
- int lookbackPeriods,
- int smaPeriods)
- {
- try
- {
- IEnumerable quotes = await quoteFeed.Get();
-
- // we don't ask for smaPeriods with Z-Score, handle
- smaPeriods = smaPeriods == 0 ? 1 : smaPeriods;
-
- IEnumerable results =
- quotes.GetStdDev(lookbackPeriods, smaPeriods)
- .TakeLast(limitLast);
-
- return Ok(results);
- }
- catch (ArgumentOutOfRangeException rex)
- {
- return BadRequest(rex.Message);
- }
- }
-
- [HttpGet("STO")]
- public async Task GetStoch(
- int lookbackPeriods,
- int signalPeriods)
- {
- try
- {
- IEnumerable quotes = await quoteFeed.Get();
-
- IEnumerable results =
- quotes.GetStoch(lookbackPeriods, signalPeriods)
- .TakeLast(limitLast);
-
- return Ok(results);
- }
- catch (ArgumentOutOfRangeException rex)
- {
- return BadRequest(rex.Message);
- }
- }
-
- [HttpGet("STORSI")]
- public async Task GetStochRsi(
- int rsiPeriods,
- int stochPeriods,
- int signalPeriods,
- int smoothPeriods)
- {
- try
- {
- IEnumerable quotes = await quoteFeed.Get();
-
- IEnumerable results =
- quotes.GetStochRsi(rsiPeriods, stochPeriods, signalPeriods, smoothPeriods)
- .TakeLast(limitLast);
-
- return Ok(results);
- }
- catch (ArgumentOutOfRangeException rex)
- {
- return BadRequest(rex.Message);
- }
- }
-
- [HttpGet("SUPERTREND")]
- public async Task GetSuperTrend(
- int lookbackPeriods,
- double multiplier)
- {
- try
- {
- IEnumerable quotes = await quoteFeed.Get();
-
- IEnumerable results =
- quotes.GetSuperTrend(lookbackPeriods, multiplier)
- .TakeLast(limitLast);
-
- return Ok(results);
- }
- catch (ArgumentOutOfRangeException rex)
- {
- return BadRequest(rex.Message);
- }
- }
-
- [HttpGet("ULCER")]
- public async Task GetUlcer(
- int lookbackPeriods)
- {
- try
- {
- IEnumerable quotes = await quoteFeed.Get();
-
- IEnumerable results =
- quotes.GetUlcerIndex(lookbackPeriods)
- .TakeLast(limitLast);
-
- return Ok(results);
- }
- catch (ArgumentOutOfRangeException rex)
- {
- return BadRequest(rex.Message);
- }
- }
-
- [HttpGet("VORTEX")]
- public async Task GetVortex(
- int lookbackPeriods)
- {
- try
- {
- IEnumerable quotes = await quoteFeed.Get();
-
- IEnumerable results =
- quotes.GetVortex(lookbackPeriods)
- .TakeLast(limitLast);
-
- return Ok(results);
- }
- catch (ArgumentOutOfRangeException rex)
- {
- return BadRequest(rex.Message);
- }
- }
-
- [HttpGet("ZIGZAG-CLOSE")]
- public async Task GetZigZagClose(
- decimal percentChange)
- {
- try
- {
- IEnumerable quotes = await quoteFeed.Get();
-
- IEnumerable results =
- quotes.GetZigZag(EndType.Close, percentChange)
- .TakeLast(limitLast);
-
- return Ok(results);
- }
- catch (ArgumentOutOfRangeException rex)
- {
- return BadRequest(rex.Message);
- }
- }
-
- [HttpGet("ZIGZAG-HIGHLOW")]
- public async Task GetZigZagHighLow(
- decimal percentChange)
- {
- try
- {
- IEnumerable quotes = await quoteFeed.Get();
-
- IEnumerable results =
- quotes.GetZigZag(EndType.HighLow, percentChange)
- .TakeLast(limitLast);
-
- return Ok(results);
- }
- catch (ArgumentOutOfRangeException rex)
- {
- return BadRequest(rex.Message);
- }
- }
-
-}
diff --git a/server/WebApi/Endpoints.cs b/server/WebApi/Endpoints.cs
new file mode 100644
index 0000000..e9e62d0
--- /dev/null
+++ b/server/WebApi/Endpoints.cs
@@ -0,0 +1,257 @@
+using Microsoft.AspNetCore.Mvc;
+using WebApi.Models;
+using WebApi.Services;
+
+namespace WebApi.Controllers;
+
+[ApiController]
+[Route("")]
+public class Main(IQuoteService quoteService) : ControllerBase
+{
+ private readonly IQuoteService quoteFeed = quoteService;
+
+ // GLOBALS
+ private static readonly int limitLast = 120;
+
+ [HttpGet]
+ public string Get()
+ => "API is functioning nominally.";
+
+ [HttpGet("quotes")]
+ public async Task GetQuotes()
+ {
+ IEnumerable quotes = await quoteFeed.Get();
+ return Ok(quotes.TakeLast(limitLast));
+ }
+
+ [HttpGet("indicators")]
+ public IActionResult GetIndicatorCatalog()
+ {
+ Response.Headers.CacheControl = "public, max-age=3600"; // 1 hour TTL
+ Response.Headers.ETag = "YYYY.MM.DD"; // replaced in build deployment
+ Response.Headers.LastModified = DateTime.UtcNow.ToString("R");
+
+ return Ok(Metadata.IndicatorListing($"{Request.Scheme}://{Request.Host}"));
+ }
+
+ private async Task Get(Func, IEnumerable> indicatorFunc)
+ {
+ try
+ {
+ IEnumerable quotes = await quoteFeed.Get();
+ IEnumerable results = indicatorFunc(quotes).TakeLast(limitLast);
+ return Ok(results);
+ }
+ catch (ArgumentOutOfRangeException rex)
+ {
+ return BadRequest(rex.Message);
+ }
+ }
+
+ //////////////////////////////////////////
+ // INDICATORS (sorted alphabetically)
+
+ [HttpGet("ADL")]
+ public Task GetAdl(int smaPeriods)
+ => Get(quotes => quotes.GetAdl(smaPeriods));
+
+ [HttpGet("ADX")]
+ public Task GetAdx(int lookbackPeriods)
+ => Get(quotes => quotes.GetAdx(lookbackPeriods));
+
+ [HttpGet("ALMA")]
+ public Task GetAlma(int lookbackPeriods, double offset, double sigma)
+ => Get(quotes => quotes.GetAlma(lookbackPeriods, offset, sigma));
+
+ [HttpGet("ALLIGATOR")]
+ public Task GetAlligator(int jawPeriods, int jawOffset, int teethPeriods, int teethOffset, int lipsPeriods, int lipsOffset)
+ => Get(quotes => quotes.GetAlligator(jawPeriods, jawOffset, teethPeriods, teethOffset, lipsPeriods, lipsOffset));
+
+ [HttpGet("AROON")]
+ public Task GetAroon(int lookbackPeriods)
+ => Get(quotes => quotes.GetAroon(lookbackPeriods));
+
+ [HttpGet("ATR")]
+ public Task GetAtr(int lookbackPeriods)
+ => Get(quotes => quotes.GetAtr(lookbackPeriods));
+
+ [HttpGet("ATR-STOP-CLOSE")]
+ public Task GetAtrStopClose(int lookbackPeriods, double multiplier)
+ => Get(quotes => quotes.GetAtrStop(lookbackPeriods, multiplier, EndType.Close));
+
+ [HttpGet("ATR-STOP-HL")]
+ public Task GetAtrStopHL(int lookbackPeriods, double multiplier)
+ => Get(quotes => quotes.GetAtrStop(lookbackPeriods, multiplier, EndType.HighLow));
+
+ [HttpGet("BB")]
+ public Task GetBollingerBands(int lookbackPeriods, double standardDeviations)
+ => Get(quotes => quotes.GetBollingerBands(lookbackPeriods, standardDeviations));
+
+ [HttpGet("BETA")]
+ public async Task GetBeta(int lookbackPeriods, BetaType type)
+ {
+ try
+ {
+ IEnumerable quotes = await quoteFeed.Get();
+ IEnumerable market = await quoteFeed.Get("SPY");
+ IEnumerable results = quotes.GetBeta(market, lookbackPeriods, type).TakeLast(limitLast);
+ return Ok(results);
+ }
+ catch (ArgumentOutOfRangeException rex)
+ {
+ return BadRequest(rex.Message);
+ }
+ }
+
+ [HttpGet("CHEXIT-LONG")]
+ public Task GetChandelierLong(int lookbackPeriods, double multiplier)
+ => Get(quotes => quotes.GetChandelier(lookbackPeriods, multiplier, ChandelierType.Long));
+
+ [HttpGet("CHEXIT-SHORT")]
+ public Task GetChandelierShort(int lookbackPeriods, double multiplier)
+ => Get(quotes => quotes.GetChandelier(lookbackPeriods, multiplier, ChandelierType.Short));
+
+ [HttpGet("CHOP")]
+ public Task GetChop(int lookbackPeriods)
+ => Get(quotes => quotes.GetChop(lookbackPeriods));
+
+ [HttpGet("CMF")]
+ public Task GetCmf(int lookbackPeriods)
+ => Get(quotes => quotes.GetCmf(lookbackPeriods));
+
+ [HttpGet("CMO")]
+ public Task GetCmo(int lookbackPeriods)
+ => Get(quotes => quotes.GetCmo(lookbackPeriods));
+
+ [HttpGet("CRSI")]
+ public Task GetConnorsRsi(int rsiPeriods, int streakPeriods, int rankPeriods)
+ => Get(quotes => quotes.GetConnorsRsi(rsiPeriods, streakPeriods, rankPeriods));
+
+ [HttpGet("DOJI")]
+ public Task GetDoji(double maxPriceChangePercent)
+ => Get(quotes => quotes.GetDoji(maxPriceChangePercent));
+
+ [HttpGet("DONCHIAN")]
+ public Task GetDonchian(int lookbackPeriods)
+ => Get(quotes => quotes.GetDonchian(lookbackPeriods));
+
+ [HttpGet("DYN")]
+ public Task GetDynamic(int lookbackPeriods)
+ => Get(quotes => quotes.GetDynamic(lookbackPeriods));
+
+ [HttpGet("ELDER-RAY")]
+ public Task GetElderRay(int lookbackPeriods)
+ => Get(quotes => quotes.GetElderRay(lookbackPeriods));
+
+ [HttpGet("EPMA")]
+ public Task GetEpma(int lookbackPeriods)
+ => Get(quotes => quotes.GetEpma(lookbackPeriods));
+
+ [HttpGet("EMA")]
+ public Task GetEma(int lookbackPeriods)
+ => Get(quotes => quotes.GetEma(lookbackPeriods));
+
+ [HttpGet("FCB")]
+ public Task GetFcb(int windowSpan)
+ => Get(quotes => quotes.GetFcb(windowSpan));
+
+ [HttpGet("FISHER")]
+ public Task GetFisher(int lookbackPeriods)
+ => Get(quotes => quotes.GetFisherTransform(lookbackPeriods));
+
+ [HttpGet("FRACTAL")]
+ public Task GetFractal(int windowSpan)
+ => Get(quotes => quotes.GetFractal(windowSpan));
+
+ [HttpGet("GATOR")]
+ public Task GetGator()
+ => Get(quotes => quotes.GetGator());
+
+ [HttpGet("HTL")]
+ public Task GetHTL()
+ => Get(quotes => quotes.GetHtTrendline());
+
+ [HttpGet("ICHIMOKU")]
+ public Task GetIchimoku(int tenkanPeriods, int kijunPeriods, int senkouBPeriods)
+ => Get(quotes => quotes.GetIchimoku(tenkanPeriods, kijunPeriods, senkouBPeriods));
+
+ [HttpGet("KELTNER")]
+ public Task GetKeltner(int emaPeriods, double multiplier, int atrPeriods)
+ => Get(quotes => quotes.GetKeltner(emaPeriods, multiplier, atrPeriods));
+
+ [HttpGet("MACD")]
+ public Task GetMacd(int fastPeriods, int slowPeriods, int signalPeriods)
+ => Get(quotes => quotes.GetMacd(fastPeriods, slowPeriods, signalPeriods));
+
+ [HttpGet("MARUBOZU")]
+ public Task GetMarubozu(double minBodyPercent)
+ => Get(quotes => quotes.GetMarubozu(minBodyPercent));
+
+ [HttpGet("MFI")]
+ public Task GetMfi(int lookbackPeriods)
+ => Get(quotes => quotes.GetMfi(lookbackPeriods));
+
+ [HttpGet("PSAR")]
+ public Task GetParabolicSar(double accelerationStep, double maxAccelerationFactor)
+ => Get(quotes => quotes.GetParabolicSar(accelerationStep, maxAccelerationFactor));
+
+ [HttpGet("ROC")]
+ public Task GetRoc(int lookbackPeriods, int smaPeriods)
+ => Get(quotes => quotes.GetRoc(lookbackPeriods, smaPeriods));
+
+ [HttpGet("RSI")]
+ public Task GetRsi(int lookbackPeriods)
+ => Get(quotes => quotes.GetRsi(lookbackPeriods));
+
+ [HttpGet("SLOPE")]
+ public Task GetSlope(int lookbackPeriods)
+ => Get(quotes => quotes.GetSlope(lookbackPeriods));
+
+ [HttpGet("SMA")]
+ public Task GetSma(int lookbackPeriods)
+ => Get(quotes => quotes.GetSma(lookbackPeriods));
+
+ [HttpGet("SMI")]
+ public Task GetSmi(int lookbackPeriods, int firstSmoothPeriods, int secondSmoothPeriods, int signalPeriods)
+ => Get(quotes => quotes.GetSmi(lookbackPeriods, firstSmoothPeriods, secondSmoothPeriods, signalPeriods));
+
+ [HttpGet("STC")]
+ public Task GetStc(int cyclePeriods, int fastPeriods, int slowPeriods)
+ => Get(quotes => quotes.GetStc(cyclePeriods, fastPeriods, slowPeriods));
+
+ [HttpGet("STARC")]
+ public Task GetStarc(int smaPeriods, double multiplier, int atrPeriods)
+ => Get(quotes => quotes.GetStarcBands(smaPeriods, multiplier, atrPeriods));
+
+ [HttpGet("STDEV")]
+ public Task GetStdDev(int lookbackPeriods, int smaPeriods)
+ => Get(quotes => quotes.GetStdDev(lookbackPeriods, smaPeriods == 0 ? 1 : smaPeriods));
+
+ [HttpGet("STO")]
+ public Task GetStoch(int lookbackPeriods, int signalPeriods)
+ => Get(quotes => quotes.GetStoch(lookbackPeriods, signalPeriods));
+
+ [HttpGet("STORSI")]
+ public Task GetStochRsi(int rsiPeriods, int stochPeriods, int signalPeriods, int smoothPeriods)
+ => Get(quotes => quotes.GetStochRsi(rsiPeriods, stochPeriods, signalPeriods, smoothPeriods));
+
+ [HttpGet("SUPERTREND")]
+ public Task GetSuperTrend(int lookbackPeriods, double multiplier)
+ => Get(quotes => quotes.GetSuperTrend(lookbackPeriods, multiplier));
+
+ [HttpGet("ULCER")]
+ public Task GetUlcer(int lookbackPeriods)
+ => Get(quotes => quotes.GetUlcerIndex(lookbackPeriods));
+
+ [HttpGet("VORTEX")]
+ public Task GetVortex(int lookbackPeriods)
+ => Get(quotes => quotes.GetVortex(lookbackPeriods));
+
+ [HttpGet("ZIGZAG-CLOSE")]
+ public Task GetZigZagClose(decimal percentChange)
+ => Get(quotes => quotes.GetZigZag(EndType.Close, percentChange));
+
+ [HttpGet("ZIGZAG-HIGHLOW")]
+ public Task GetZigZagHighLow(decimal percentChange)
+ => Get(quotes => quotes.GetZigZag(EndType.HighLow, percentChange));
+}
diff --git a/server/WebApi/Models/ChartColors.cs b/server/WebApi/Models/ChartColors.cs
new file mode 100644
index 0000000..a0b6cc3
--- /dev/null
+++ b/server/WebApi/Models/ChartColors.cs
@@ -0,0 +1,20 @@
+namespace WebApi.Models;
+
+public static class ChartColors
+{
+ // Material Design (M2) color palettes
+ public static readonly string StandardRed = "#DD2C00"; // deep orange A700
+ public static readonly string StandardOrange = "#EF6C00"; // orange 800
+ public static readonly string StandardGreen = "#2E7D32"; // green 800
+ public static readonly string StandardBlue = "#1E88E5"; // blue 600
+ public static readonly string StandardPurple = "#8E24AA"; // purple 600
+ public static readonly string StandardGrayTransparent = "#9E9E9E50"; // gray 500
+ public static readonly string DarkGray = "#616161CC"; // gray 600
+ public static readonly string DarkGrayTransparent = "#61616110"; // gray 600
+
+ public static readonly string ThresholdRed = "#B71C1C70"; // red 900
+ public static readonly string ThresholdRedTransparent = "#B71C1C20"; // red 900
+ public static readonly string ThresholdGrayTransparent = "#42424280"; // gray 800
+ public static readonly string ThresholdGreen = "#1B5E2070"; // green 900
+ public static readonly string ThresholdGreenTransparent = "#1B5E2020"; // green 900
+}
diff --git a/server/WebApi/Models/ChartConfig.cs b/server/WebApi/Models/ChartConfig.cs
new file mode 100644
index 0000000..0c1991b
--- /dev/null
+++ b/server/WebApi/Models/ChartConfig.cs
@@ -0,0 +1,10 @@
+namespace WebApi.Models;
+
+[Serializable]
+public record ChartConfig
+{
+ public double? MinimumYAxis { get; set; }
+ public double? MaximumYAxis { get; set; }
+
+ public ICollection? Thresholds { get; set; }
+}
diff --git a/server/WebApi/Models/ChartFill.cs b/server/WebApi/Models/ChartFill.cs
new file mode 100644
index 0000000..cf7665e
--- /dev/null
+++ b/server/WebApi/Models/ChartFill.cs
@@ -0,0 +1,9 @@
+namespace WebApi.Models;
+
+[Serializable]
+public record ChartFill
+{
+ public required string Target { get; init; }
+ public required string ColorAbove { get; init; }
+ public required string ColorBelow { get; init; }
+}
diff --git a/server/WebApi/Models/ChartThreshold.cs b/server/WebApi/Models/ChartThreshold.cs
new file mode 100644
index 0000000..0623840
--- /dev/null
+++ b/server/WebApi/Models/ChartThreshold.cs
@@ -0,0 +1,10 @@
+namespace WebApi.Models;
+
+[Serializable]
+public record ChartThreshold
+{
+ public required double Value { get; init; }
+ public required string Color { get; init; }
+ public required string Style { get; init; }
+ public ChartFill? Fill { get; set; }
+}
diff --git a/server/WebApi/Models/Emum.cs b/server/WebApi/Models/Emum.cs
new file mode 100644
index 0000000..d569d20
--- /dev/null
+++ b/server/WebApi/Models/Emum.cs
@@ -0,0 +1,12 @@
+namespace WebApi.Models;
+
+[Serializable]
+public enum Order
+{
+ Front = 1,
+ Behind = 50,
+ // price is 75/76
+ BehindPrice = 80,
+ Back = 95
+ // thresholds are 99
+}
diff --git a/server/WebApi/Models/IndicatorListing.cs b/server/WebApi/Models/IndicatorListing.cs
new file mode 100644
index 0000000..9a00481
--- /dev/null
+++ b/server/WebApi/Models/IndicatorListing.cs
@@ -0,0 +1,18 @@
+namespace WebApi.Models;
+
+[Serializable]
+public record IndicatorListing
+{
+ public required string Name { get; init; }
+ public required string Uiid { get; init; }
+ public required string LegendTemplate { get; init; }
+ public required string Endpoint { get; init; }
+ public required string Category { get; init; }
+ public required string ChartType { get; init; }
+ public Order Order { get; init; } = Order.Front;
+
+ public ChartConfig? ChartConfig { get; set; }
+
+ public ICollection? Parameters { get; set; }
+ public required ICollection Results { get; init; }
+}
diff --git a/server/WebApi/Models/IndicatorParamConfig.cs b/server/WebApi/Models/IndicatorParamConfig.cs
new file mode 100644
index 0000000..f07230f
--- /dev/null
+++ b/server/WebApi/Models/IndicatorParamConfig.cs
@@ -0,0 +1,12 @@
+namespace WebApi.Models;
+
+[Serializable]
+public record IndicatorParamConfig
+{
+ public required string DisplayName { get; init; }
+ public required string ParamName { get; init; }
+ public required string DataType { get; init; }
+ public required double Minimum { get; init; } // greater than
+ public required double Maximum { get; init; } // less than
+ public double? DefaultValue { get; init; }
+}
diff --git a/server/WebApi/Models/IndicatorResultConfig.cs b/server/WebApi/Models/IndicatorResultConfig.cs
new file mode 100644
index 0000000..7a1b156
--- /dev/null
+++ b/server/WebApi/Models/IndicatorResultConfig.cs
@@ -0,0 +1,15 @@
+namespace WebApi.Models;
+
+[Serializable]
+public record IndicatorResultConfig
+{
+ public required string DisplayName { get; init; }
+ public required string TooltipTemplate { get; init; }
+ public required string DataName { get; init; }
+ public required string DataType { get; init; }
+ public required string LineType { get; init; }
+ public string? Stack { get; set; }
+ public float LineWidth { get; set; } = 2;
+ public required string DefaultColor { get; init; }
+ public ChartFill? Fill { get; set; }
+}
diff --git a/server/WebApi/Program.cs b/server/WebApi/Program.cs
index b326a73..667dbfc 100644
--- a/server/WebApi/Program.cs
+++ b/server/WebApi/Program.cs
@@ -2,12 +2,12 @@
using System.IO.Compression;
using Microsoft.AspNetCore.ResponseCompression;
+using Microsoft.Extensions.Azure;
using WebApi.Services;
WebApplicationBuilder builder = WebApplication.CreateBuilder(args);
-
-IServiceCollection services = builder.Services;
ConfigurationManager configuration = builder.Configuration;
+IServiceCollection services = builder.Services;
// Add framework services
services.AddControllers();
@@ -15,33 +15,24 @@
// Get CORS origins from appsettings
// reminder: production origins defined in cloud host settings » API » CORS
// so these are really only for localhost / development
-IConfigurationSection corsOrigins = configuration.GetSection("CorsOrigins");
-string? allowedOrigin = corsOrigins["Website"];
-
-List origins = [];
+string? allowedOrigin = configuration.GetValue("CorsOrigins:Website");
if (!string.IsNullOrEmpty(allowedOrigin))
{
- origins.Add(allowedOrigin);
-}
-
-// Setup CORS for website
-services.AddCors(options => {
- options.AddPolicy("CorsPolicy",
- cors => {
- cors.AllowAnyHeader();
- cors.AllowAnyMethod();
- cors.AllowCredentials();
- cors.WithOrigins([.. origins])
- .SetIsOriginAllowedToAllowWildcardSubdomains();
+ // Setup CORS for website
+ services.AddCors(options => {
+ options.AddPolicy("CorsPolicy",
+ cors => {
+ cors.AllowAnyHeader();
+ cors.AllowAnyMethod();
+ cors.AllowCredentials();
+ cors.WithOrigins(allowedOrigin)
+ .SetIsOriginAllowedToAllowWildcardSubdomains();
+ });
});
-});
-Console.WriteLine($"CORS Origin: {allowedOrigin}");
-
-// Register services
-services.AddHostedService();
-services.AddTransient();
+ Console.WriteLine($"CORS Origin: {allowedOrigin}");
+}
// Add response compression services
services.AddResponseCompression(options => {
@@ -59,6 +50,20 @@
options.Level = CompressionLevel.Fastest;
});
+// Add logging
+services.AddLogging();
+
+// Add Azure dependencies
+services.AddAzureClients(builder => {
+ builder.AddBlobServiceClient(configuration.GetValue("Storage:ConnectionString")
+ ?? "UseDevelopmentStorage=true");
+});
+
+// Add application services
+services.AddSingleton();
+services.AddSingleton();
+services.AddHostedService();
+
// Build application
WebApplication app = builder.Build();
diff --git a/server/WebApi/Services/Models.cs b/server/WebApi/Services/Models.cs
deleted file mode 100644
index 7909476..0000000
--- a/server/WebApi/Services/Models.cs
+++ /dev/null
@@ -1,81 +0,0 @@
-namespace WebApi.Services;
-
-[Serializable]
-public record class IndicatorListing
-{
- public required string Name { get; init; }
- public required string Uiid { get; init; }
- public required string LegendTemplate { get; init; }
- public required string Endpoint { get; init; }
- public required string Category { get; init; }
- public required string ChartType { get; init; }
- public Order Order { get; init; } = Order.Front;
-
- public ChartConfig? ChartConfig { get; set; }
-
- public ICollection? Parameters { get; set; }
- public required ICollection Results { get; init; }
-}
-
-[Serializable]
-public enum Order
-{
- // price is 75/76
- // thresholds are 99
- Front = 1,
- Behind = 50,
- BehindPrice = 80,
- Back = 95
-}
-
-[Serializable]
-public record class IndicatorParamConfig
-{
- public required string DisplayName { get; init; }
- public required string ParamName { get; init; }
- public required string DataType { get; init; }
- public required double Minimum { get; init; } // greater than
- public required double Maximum { get; init; } // less than
- public double? DefaultValue { get; init; }
-}
-
-[Serializable]
-public record class IndicatorResultConfig
-{
- public required string DisplayName { get; init; }
- public required string TooltipTemplate { get; init; }
- public required string DataName { get; init; }
- public required string DataType { get; init; }
- public required string LineType { get; init; }
- public string? Stack { get; set; }
- public float LineWidth { get; set; } = 2;
- public required string DefaultColor { get; init; }
- public ChartFill? Fill { get; set; }
-
-}
-
-[Serializable]
-public record class ChartConfig
-{
- public double? MinimumYAxis { get; set; }
- public double? MaximumYAxis { get; set; }
-
- public ICollection? Thresholds { get; set; }
-}
-
-[Serializable]
-public record class ChartThreshold
-{
- public required double Value { get; init; }
- public required string Color { get; init; }
- public required string Style { get; init; }
- public ChartFill? Fill { get; set; }
-}
-
-[Serializable]
-public record class ChartFill
-{
- public required string Target { get; init; }
- public required string ColorAbove { get; init; }
- public required string ColorBelow { get; init; }
-}
diff --git a/server/WebApi/Services/Service.Metadata.cs b/server/WebApi/Services/Service.Metadata.cs
index 616b7bd..7bae713 100644
--- a/server/WebApi/Services/Service.Metadata.cs
+++ b/server/WebApi/Services/Service.Metadata.cs
@@ -1,48 +1,91 @@
+using WebApi.Models;
+
namespace WebApi.Services;
-public static class Metadata
+public static class MetadataHelpers
{
- // colors from Material Design (M2) color palettes
- // ref: https://m2.material.io/design/color/the-color-system.html
-
- // notably other dark/light theme chart colors (Sept. 2024):
- // gridlines: #2E2E2E / #E0E0E0
- // background: #121316 / #FAF9FD
-
- // indicator colors
- // (a) more are available in UI for user selection
- // (b) these should be consistently defined in UI colors
- // TODO: make these available from API, cached in UI for selection
- const string standardRed = "#DD2C00"; // deep orange A700 (red)
- const string standardOrange = "#EF6C00"; // orange 800
- const string standardGreen = "#2E7D32"; // green 800
- const string standardBlue = "#1E88E5"; // blue 600
- const string standardPurple = "#8E24AA"; // purple 600
- const string standardGrayTransparent = "#9E9E9E50"; // gray 500
- const string darkGray = "#616161CC"; // gray 600
- const string darkGrayTransparent = "#61616110"; // gray 600
-
- // threshold colors (different from indicator colors)
- const string thresholdRed = "#B71C1C70"; // red 900
- const string thresholdRedTransparent = "#B71C1C20"; // red 900
- const string thresholdGrayTransparent = "#42424280"; // gray 800
- const string thresholdGreen = "#1B5E2070"; // green 900
- const string thresholdGreenTransparent = "#1B5E2020"; // green 900
+ public static ChartConfig GetOscillatorConfig(float min = 0, float max = 100, float upperThreshold = 80, float lowerThreshold = 20)
+ => new() {
+ MinimumYAxis = min,
+ MaximumYAxis = max,
+ Thresholds = [
+ new() {
+ Value = upperThreshold,
+ Color = ChartColors.ThresholdRed,
+ Style = "dash",
+ Fill = new() {
+ Target = "+2",
+ ColorAbove = "transparent",
+ ColorBelow = ChartColors.ThresholdGreen
+ }
+ },
+ new() {
+ Value = lowerThreshold,
+ Color = ChartColors.ThresholdGreen,
+ Style = "dash",
+ Fill = new() {
+ Target = "+1",
+ ColorAbove = ChartColors.ThresholdRed,
+ ColorBelow = "transparent"
+ }
+ }
+ ]
+ };
+
+ public static List GetPriceBandResults(string name, string? color = null)
+ {
+ color ??= ChartColors.StandardOrange;
+ return [
+ new IndicatorResultConfig {
+ DisplayName = "Upper Band",
+ TooltipTemplate = $"{name} Upper Band",
+ DataName = "upperBand",
+ DataType = "number",
+ LineType = "solid",
+ LineWidth = 1,
+ DefaultColor = color,
+ Fill = new() {
+ Target = "+2",
+ ColorAbove = ChartColors.DarkGrayTransparent,
+ ColorBelow = ChartColors.DarkGrayTransparent
+ }
+ },
+ new() {
+ DisplayName = "Centerline",
+ TooltipTemplate = $"{name} Centerline",
+ DataName = "centerline",
+ DataType = "number",
+ LineType = "dash",
+ LineWidth = 1,
+ DefaultColor = color
+ },
+ new() {
+ DisplayName = "Lower Band",
+ TooltipTemplate = $"{name} Lower Band",
+ DataName = "lowerBand",
+ DataType = "number",
+ LineType = "solid",
+ LineWidth = 1,
+ DefaultColor = color
+ }
+ ];
+ }
+}
+public static class Metadata
+{
public static IEnumerable IndicatorListing(string baseUrl)
{
- List listing =
- [
+ List listing = [
// Accumulation Distribution Line (ADL)
- new IndicatorListing {
+ new() {
Name = "Accumulation Distribution Line (ADL)",
Uiid = "ADL",
LegendTemplate = "ADL w/ SMA([P1])",
Endpoint = $"{baseUrl}/ADL/",
Category = "volume-based",
ChartType = "oscillator",
- Parameters =
- [
+ Parameters = [
new() {
DisplayName = "SMA Periods",
ParamName = "smaPeriods",
@@ -54,12 +97,12 @@ public static IEnumerable IndicatorListing(string baseUrl)
],
Results = [
new() {
- DisplayName = "Accumulation Distribution Line",
+ DisplayName = "ADL",
TooltipTemplate = "ADL",
DataName = "adl",
DataType = "number",
LineType = "solid",
- DefaultColor = standardBlue
+ DefaultColor = ChartColors.StandardBlue
},
new() {
DisplayName = "SMA of ADL",
@@ -67,7 +110,7 @@ public static IEnumerable IndicatorListing(string baseUrl)
DataName = "adlSma",
DataType = "number",
LineType = "solid",
- DefaultColor = standardRed
+ DefaultColor = ChartColors.StandardRed
}
]
},
@@ -85,12 +128,12 @@ public static IEnumerable IndicatorListing(string baseUrl)
[
new() {
Value = 40,
- Color = thresholdGrayTransparent,
+ Color = ChartColors.ThresholdGrayTransparent,
Style = "dash"
},
new() {
Value = 20,
- Color = thresholdGrayTransparent,
+ Color = ChartColors.ThresholdGrayTransparent,
Style = "dash"
}
]
@@ -113,7 +156,7 @@ public static IEnumerable IndicatorListing(string baseUrl)
DataName = "adx",
DataType = "number",
LineType = "solid",
- DefaultColor = standardBlue
+ DefaultColor = ChartColors.StandardBlue
},
new() {
DisplayName = "DI+",
@@ -121,7 +164,7 @@ public static IEnumerable IndicatorListing(string baseUrl)
DataName = "pdi",
DataType = "number",
LineType = "solid",
- DefaultColor = standardGreen
+ DefaultColor = ChartColors.StandardGreen
},
new() {
DisplayName = "DI-",
@@ -129,7 +172,7 @@ public static IEnumerable IndicatorListing(string baseUrl)
DataName = "mdi",
DataType = "number",
LineType = "solid",
- DefaultColor = standardRed
+ DefaultColor = ChartColors.StandardRed
},
new() {
DisplayName = "ADX Rating",
@@ -138,7 +181,7 @@ public static IEnumerable IndicatorListing(string baseUrl)
DataType = "number",
LineType = "solid",
LineWidth = 2,
- DefaultColor = standardGrayTransparent
+ DefaultColor = ChartColors.StandardGrayTransparent
}
]
},
@@ -185,7 +228,7 @@ public static IEnumerable IndicatorListing(string baseUrl)
DataName = "alma",
DataType = "number",
LineType = "solid",
- DefaultColor = standardBlue
+ DefaultColor = ChartColors.StandardBlue
}
]
},
@@ -206,17 +249,17 @@ public static IEnumerable IndicatorListing(string baseUrl)
[
new() {
Value = 70,
- Color = thresholdGrayTransparent,
+ Color = ChartColors.ThresholdGrayTransparent,
Style = "solid"
},
new() {
Value = 50,
- Color = thresholdGrayTransparent,
+ Color = ChartColors.ThresholdGrayTransparent,
Style = "dash"
},
new() {
Value = 30,
- Color = thresholdGrayTransparent,
+ Color = ChartColors.ThresholdGrayTransparent,
Style = "solid"
}
]
@@ -239,7 +282,7 @@ public static IEnumerable IndicatorListing(string baseUrl)
DataName = "aroonUp",
DataType = "number",
LineType = "solid",
- DefaultColor = standardGreen
+ DefaultColor = ChartColors.StandardGreen
},
new() {
DisplayName = "Aroon Down",
@@ -247,7 +290,7 @@ public static IEnumerable IndicatorListing(string baseUrl)
DataName = "aroonDown",
DataType = "number",
LineType = "solid",
- DefaultColor = standardRed
+ DefaultColor = ChartColors.StandardRed
}
]
},
@@ -268,7 +311,7 @@ public static IEnumerable IndicatorListing(string baseUrl)
[
new() {
Value = 0,
- Color = thresholdGrayTransparent,
+ Color = ChartColors.ThresholdGrayTransparent,
Style = "dash"
}
]
@@ -291,7 +334,7 @@ public static IEnumerable IndicatorListing(string baseUrl)
DataName = "oscillator",
DataType = "number",
LineType = "solid",
- DefaultColor = standardBlue
+ DefaultColor = ChartColors.StandardBlue
}
]
},
@@ -332,7 +375,7 @@ public static IEnumerable IndicatorListing(string baseUrl)
DataType = "number",
LineType = "dots",
LineWidth = 2,
- DefaultColor = standardGreen
+ DefaultColor = ChartColors.StandardGreen
},
new() {
DisplayName = "Sell Stop",
@@ -341,7 +384,7 @@ public static IEnumerable IndicatorListing(string baseUrl)
DataType = "number",
LineType = "dots",
LineWidth = 2,
- DefaultColor = standardRed
+ DefaultColor = ChartColors.StandardRed
}
]
},
@@ -382,7 +425,7 @@ public static IEnumerable IndicatorListing(string baseUrl)
DataType = "number",
LineType = "dots",
LineWidth = 2,
- DefaultColor = standardGreen
+ DefaultColor = ChartColors.StandardGreen
},
new() {
DisplayName = "Sell Stop",
@@ -391,7 +434,7 @@ public static IEnumerable IndicatorListing(string baseUrl)
DataType = "number",
LineType = "dots",
LineWidth = 2,
- DefaultColor = standardRed
+ DefaultColor = ChartColors.StandardRed
}
]
},
@@ -422,7 +465,7 @@ public static IEnumerable IndicatorListing(string baseUrl)
DataName = "atr",
DataType = "number",
LineType = "solid",
- DefaultColor = standardBlue
+ DefaultColor = ChartColors.StandardBlue
}
]
},
@@ -453,7 +496,7 @@ public static IEnumerable IndicatorListing(string baseUrl)
DataName = "atrp",
DataType = "number",
LineType = "solid",
- DefaultColor = standardBlue
+ DefaultColor = ChartColors.StandardBlue
}
]
},
@@ -471,7 +514,7 @@ public static IEnumerable IndicatorListing(string baseUrl)
[
new() {
Value = 1,
- Color = thresholdGrayTransparent,
+ Color = ChartColors.ThresholdGrayTransparent,
Style = "dash"
}
]
@@ -494,7 +537,7 @@ public static IEnumerable IndicatorListing(string baseUrl)
DataName = "beta",
DataType = "number",
LineType = "solid",
- DefaultColor = standardBlue
+ DefaultColor = ChartColors.StandardBlue
},
new() {
DisplayName = "Beta+",
@@ -502,7 +545,7 @@ public static IEnumerable IndicatorListing(string baseUrl)
DataName = "betaUp",
DataType = "number",
LineType = "dash",
- DefaultColor = standardGreen
+ DefaultColor = ChartColors.StandardGreen
},
new() {
DisplayName = "Beta-",
@@ -510,7 +553,7 @@ public static IEnumerable