diff --git a/angular.json b/angular.json index 36f83ecd..77656ca1 100644 --- a/angular.json +++ b/angular.json @@ -131,5 +131,31 @@ }, "cli": { "analytics": false + }, + "schematics": { + "@schematics/angular:component": { + "type": "component" + }, + "@schematics/angular:directive": { + "type": "directive" + }, + "@schematics/angular:service": { + "type": "service" + }, + "@schematics/angular:guard": { + "typeSeparator": "." + }, + "@schematics/angular:interceptor": { + "typeSeparator": "." + }, + "@schematics/angular:module": { + "typeSeparator": "." + }, + "@schematics/angular:pipe": { + "typeSeparator": "." + }, + "@schematics/angular:resolver": { + "typeSeparator": "." + } } } diff --git a/package-lock.json b/package-lock.json index 6901c2ec..78d12e29 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,16 +8,16 @@ "name": "refresh-web", "version": "0.0.0", "dependencies": { - "@angular/animations": "^22.2.1", - "@angular/common": "^22.2.1", - "@angular/compiler": "^22.2.1", - "@angular/core": "^22.2.1", - "@angular/forms": "^22.2.1", - "@angular/platform-browser": "^22.2.1", - "@angular/platform-browser-dynamic": "^22.2.1", - "@angular/platform-server": "^22.2.1", - "@angular/router": "^22.2.1", - "@angular/ssr": "^22.2.2", + "@angular/animations": "^22.2.3", + "@angular/common": "^22.2.3", + "@angular/compiler": "^22.2.3", + "@angular/core": "^22.2.3", + "@angular/forms": "^22.2.3", + "@angular/platform-browser": "^22.2.3", + "@angular/platform-browser-dynamic": "^22.2.3", + "@angular/platform-server": "^22.2.3", + "@angular/router": "^22.2.3", + "@angular/ssr": "^22.2.3", "@fortawesome/angular-fontawesome": "^5.1.0", "@fortawesome/fontawesome-svg-core": "^7.3.1", "@fortawesome/free-solid-svg-icons": "^7.3.1", @@ -28,14 +28,14 @@ "zone.js": "^0.16.3" }, "devDependencies": { - "@angular/build": "^22.2.2", - "@angular/cli": "^22.2.1", - "@angular/compiler-cli": "^22.2.1", + "@angular/build": "^22.2.3", + "@angular/cli": "^22.2.3", + "@angular/compiler-cli": "^22.2.3", "@types/express": "^5.0.6", "@types/node": "^26.6.4", - "postcss": "^8.5.3", + "postcss": "^8.5.29", "tailwindcss": "^4.3.3", - "typescript": "^6.0.0" + "typescript": "^6.0.3" } }, "node_modules/@alloc/quick-lru": { @@ -65,13 +65,13 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.2202.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2202.2.tgz", - "integrity": "sha512-7ScBo47haHyRGG5M5ZEpbhwHgO2LEDbCLwNCjpjwhtRFDIEmAFbULM1OQjIybN3x+wOyY1kWRK7KvihCbs371g==", + "version": "0.2202.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2202.3.tgz", + "integrity": "sha512-/605FxTg8Kt5fqNuIBVZMfuiNwIf+CTNsiYnHY85/7OTqCNkEwdkXKc3DiFM2KlR/AV2g64GkvHgHqxHzYh34g==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "22.2.2", + "@angular-devkit/core": "22.2.3", "rxjs": "7.8.2" }, "bin": { @@ -84,9 +84,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "22.2.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-22.2.2.tgz", - "integrity": "sha512-iQexb5xUON9AkTzvBiMftrHWLguIlYv6M/BOH/sj7U5L8eOPMu8N269WF74xPo4n/X5tusFLqniGI0zolT2Sjg==", + "version": "22.2.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-22.2.3.tgz", + "integrity": "sha512-bi1oBjJeg1XCgRrBYSuJikaJV4sO/mcnyFE/0a1H646yHhQpVYoU/M2Vh69Qv8h+YoMfC7RuSxT4LZHaubhhLw==", "dev": true, "license": "MIT", "dependencies": { @@ -112,13 +112,13 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "22.2.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-22.2.2.tgz", - "integrity": "sha512-uCpFZbQgFUrOjKHLeYSCaYCJdufauYom8yFGggm67yetMAGKPbmRvUEko8i8auNFoBQ+1w1CivjSTwtmXQzZkA==", + "version": "22.2.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-22.2.3.tgz", + "integrity": "sha512-+XfBViIGqiFQK8KJXA6PgANX9tLuMO/x8GFjlzEmA4LIe9ikAtpGZw+Ezo547BIJQoJBIKCJYR0knE4BmbFeSQ==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "22.2.2", + "@angular-devkit/core": "22.2.3", "jsonc-parser": "3.3.1", "magic-string": "1.4.1", "ora": "9.4.1", @@ -130,10 +130,20 @@ "yarn": ">= 1.13.0" } }, + "node_modules/@angular-devkit/schematics/node_modules/magic-string": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-1.4.1.tgz", + "integrity": "sha512-8lyCu36ErXR0J9uaGKlKQoiLZKmtI63YGLE8G2o9jyRPdr4X47LusSOwgOJOzcVtp81fTAAjxR7BwKz682Jhow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.6.0" + } + }, "node_modules/@angular/animations": { - "version": "22.2.1", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-22.2.1.tgz", - "integrity": "sha512-vTxZN6uL/m61lv7ZCvfmQ3VuFb4o/tniGLpc3SpkNHE6MLM8WN0IjfNBRLMYMovd1uUBSPwhcG4Llcmucr9dmw==", + "version": "22.2.3", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-22.2.3.tgz", + "integrity": "sha512-sslKnTrKwHwtTvT/pWj7UoYq0cfuX3PijZM7v0JtCajQkK1Nj0Ljob0mebxXBXUVBrOixfCnfBS0EG4JNEznFA==", "deprecated": "@angular/animations is deprecated. Use `animate.enter` and `animate.leave` instead. For more information see: https://v22.angular.dev/guide/animations.", "license": "MIT", "dependencies": { @@ -143,18 +153,18 @@ "node": "^22.22.3 || ^24.15.0 || >=26.0.0" }, "peerDependencies": { - "@angular/core": "22.2.1" + "@angular/core": "22.2.3" } }, "node_modules/@angular/build": { - "version": "22.2.2", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-22.2.2.tgz", - "integrity": "sha512-QHJWkZdEWTqqb3+HiSp8lnuS4iQJCa7yTK9gg5TaMIjCoZzP9mD9L417stiVDZGj2J3Y9mrml044nEVvSbW0ig==", + "version": "22.2.3", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-22.2.3.tgz", + "integrity": "sha512-EtNEuPBUCyIuzdXrQ/nINvgFzW8bUI5AkAZtJiSn7nsFOlvaygaKN0kENNTO3zRl3T9B4GDog+Ks5Nec3FBkhg==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.2202.2", + "@angular-devkit/architect": "0.2202.3", "@babel/core": "8.0.5", "@inquirer/confirm": "6.3.2", "@parcel/watcher": "2.6.0", @@ -197,7 +207,7 @@ "@angular/platform-browser": "^22.0.0", "@angular/platform-server": "^22.0.0", "@angular/service-worker": "^22.0.0", - "@angular/ssr": "^22.2.2", + "@angular/ssr": "^22.2.3", "istanbul-lib-instrument": "^6.0.0", "karma": "^6.4.0", "less": "^4.2.0", @@ -254,27 +264,37 @@ } } }, + "node_modules/@angular/build/node_modules/magic-string": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-1.4.1.tgz", + "integrity": "sha512-8lyCu36ErXR0J9uaGKlKQoiLZKmtI63YGLE8G2o9jyRPdr4X47LusSOwgOJOzcVtp81fTAAjxR7BwKz682Jhow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.6.0" + } + }, "node_modules/@angular/cli": { - "version": "22.2.2", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-22.2.2.tgz", - "integrity": "sha512-AALIN+zai0CiA7HgSCGVPHyZyiw3yFWliCfbaS4ueHDJHVZ8QhVjRUrnfGZc3EJnigcyQ0w2DKeTxjwqpDjKew==", + "version": "22.2.3", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-22.2.3.tgz", + "integrity": "sha512-ObTX0DxJ0/PMl4pkUKI+uWPr7UC7Je94KpHP8l1lr3exhundapgr7VvNsozprJb1hMlOMDab6+quTReSYvF85Q==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.2202.2", - "@angular-devkit/core": "22.2.2", - "@angular-devkit/schematics": "22.2.2", + "@angular-devkit/architect": "0.2202.3", + "@angular-devkit/core": "22.2.3", + "@angular-devkit/schematics": "22.2.3", "@inquirer/prompts": "8.7.2", "@listr2/prompt-adapter-inquirer": "4.2.7", "@modelcontextprotocol/server": "2.3.1", - "@schematics/angular": "22.2.2", + "@schematics/angular": "22.2.3", "jsonc-parser": "3.3.1", "listr2": "11.1.0", "npm-package-arg": "14.0.0", "parse5-html-rewriting-stream": "8.0.1", "semver": "7.8.5", "yargs": "18.1.0", - "zod": "4.6.5" + "zod": "4.6.6" }, "bin": { "ng": "bin/ng.js" @@ -286,9 +306,9 @@ } }, "node_modules/@angular/common": { - "version": "22.2.1", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-22.2.1.tgz", - "integrity": "sha512-OqBH3EY4i8e3PvnYDugZGipSs1HWs2ZrqoClndKtFDS9mQULSSuLoxjG9nF1J/c+yUqhuyZlHjkXWS0n32pEfw==", + "version": "22.2.3", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-22.2.3.tgz", + "integrity": "sha512-sRzcvxzurbkCDVFJMguNVgsHds3NvDj5qbZ44NHjH7J9MBk5oZYXHppdHVm8AolBhCXAWvMk0vx+NO8Bt4rS7A==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -297,14 +317,14 @@ "node": "^22.22.3 || ^24.15.0 || >=26.0.0" }, "peerDependencies": { - "@angular/core": "22.2.1", + "@angular/core": "22.2.3", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "22.2.1", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-22.2.1.tgz", - "integrity": "sha512-KRSz0c/T5eEiFa+F1l9OppAebJj9pT8kU3ArBMlxR3v/vzhpCfuQsFVQ4xEFC7dEm3zZIdv9ASKAP6ocNC4D/Q==", + "version": "22.2.3", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-22.2.3.tgz", + "integrity": "sha512-GjDkmOBqW+6RJTeW5mlLRivf6Zy7Ed0auVh+DYD67d4UF4Sk17F1vIt8puF4CQ2PIezlHh7oOnermCBNHAOGkQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -314,9 +334,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "22.2.1", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-22.2.1.tgz", - "integrity": "sha512-Nh8sCBl0JF6x+H7/1hemY76JeTRC66EfMULT4B3ryF9srRSLYc6X6RfPRtYvrIyjgr6h3jZgrNHlV76wiJaOcA==", + "version": "22.2.3", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-22.2.3.tgz", + "integrity": "sha512-em7Ht0Dv7cN7vZgvl2fl1yscAs+zUG2Vr2YKpVZ/rOWuTL2JZyT1qIfKhC4wQoo/3lN8fiUIwQMpflSGzIEPng==", "dev": true, "license": "MIT", "dependencies": { @@ -337,7 +357,7 @@ "node": "^22.22.3 || ^24.15.0 || >=26.0.0" }, "peerDependencies": { - "@angular/compiler": "22.2.1", + "@angular/compiler": "22.2.3", "typescript": ">=6.0 <6.1" }, "peerDependenciesMeta": { @@ -386,9 +406,9 @@ "license": "MIT" }, "node_modules/@angular/core": { - "version": "22.2.1", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-22.2.1.tgz", - "integrity": "sha512-a8WlYTRiaMPz1KvLE5xjeWrLyZUuQX8bh6Ak7zajUci9iWsTUQefschjSwP1WKlin3JhM3XjmsTEDyZvSLIfRg==", + "version": "22.2.3", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-22.2.3.tgz", + "integrity": "sha512-ponarFrAZsPutT+htRt3PEmkt2/IB7DyrBy2f48sxsIx3ZA6xw09i2HOEBo+VBphlN6B/ynK9q+o04HPhdJ+dQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -397,7 +417,7 @@ "node": "^22.22.3 || ^24.15.0 || >=26.0.0" }, "peerDependencies": { - "@angular/compiler": "22.2.1", + "@angular/compiler": "22.2.3", "rxjs": "^6.5.3 || ^7.4.0", "zone.js": "~0.15.0 || ~0.16.0" }, @@ -411,9 +431,9 @@ } }, "node_modules/@angular/forms": { - "version": "22.2.1", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-22.2.1.tgz", - "integrity": "sha512-xHM+PhrvYDJ+edPxh6PWhkE99tXWbsMcxdXCWF6QcyByX+bsW2rVlNZ7dumOsUle9MYa8Yj0lZFACUWbwFw+4w==", + "version": "22.2.3", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-22.2.3.tgz", + "integrity": "sha512-TKP8FpeRCY/++vKWsY8GC1J2sNtEkdNNBPdgnMAMLTwheW5JzjwVatuQlbuZEx3WaAjbll1Ux3d+eHeqAVrtQg==", "license": "MIT", "dependencies": { "@standard-schema/spec": "^1.0.0", @@ -424,16 +444,16 @@ "node": "^22.22.3 || ^24.15.0 || >=26.0.0" }, "peerDependencies": { - "@angular/common": "22.2.1", - "@angular/core": "22.2.1", - "@angular/platform-browser": "22.2.1", + "@angular/common": "22.2.3", + "@angular/core": "22.2.3", + "@angular/platform-browser": "22.2.3", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/platform-browser": { - "version": "22.2.1", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-22.2.1.tgz", - "integrity": "sha512-KQ3oguemaSqyNP00yqEvPouY7NC4Lji+6S8yfjaWaUZjSth/GckpeP/Fo9HtMqd04y6MZ6lEb2hbQtTqFcSdEQ==", + "version": "22.2.3", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-22.2.3.tgz", + "integrity": "sha512-eWZGsbG4bSrSg9UB/NE8wORGVrh1u+x6rirPGpMWqq/mTi6q+nS+pnPxAxmiEs8wmPH5nCz5b2pRKQeYUkhAGA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -442,9 +462,9 @@ "node": "^22.22.3 || ^24.15.0 || >=26.0.0" }, "peerDependencies": { - "@angular/animations": "22.2.1", - "@angular/common": "22.2.1", - "@angular/core": "22.2.1" + "@angular/animations": "22.2.3", + "@angular/common": "22.2.3", + "@angular/core": "22.2.3" }, "peerDependenciesMeta": { "@angular/animations": { @@ -453,10 +473,9 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "22.2.1", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-22.2.1.tgz", - "integrity": "sha512-Yg0JcTy3OzhvAM0LQT/XCx8eN3gFsR/BmnQ75Fg0Cvyog7NvFxVXxv/MWE2DNW96lRZNV8ECaVNdcU893ZITTw==", - "deprecated": "@angular/platform-browser-dynamic is deprecated. Use `@angular/platform-browser` instead.", + "version": "22.2.3", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-22.2.3.tgz", + "integrity": "sha512-+WBe2JjaEeK0NpMlBzV7UBkO+ltUBYTDtMfGYkew2xHdIviITnzXX7yUXijB1Y6jxALgz3jEuJa9iLid8s11rg==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -465,16 +484,16 @@ "node": "^22.22.3 || ^24.15.0 || >=26.0.0" }, "peerDependencies": { - "@angular/common": "22.2.1", - "@angular/compiler": "22.2.1", - "@angular/core": "22.2.1", - "@angular/platform-browser": "22.2.1" + "@angular/common": "22.2.3", + "@angular/compiler": "22.2.3", + "@angular/core": "22.2.3", + "@angular/platform-browser": "22.2.3" } }, "node_modules/@angular/platform-server": { - "version": "22.2.1", - "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-22.2.1.tgz", - "integrity": "sha512-nnk4wuwI0u6AmMZpmpQXvJic+aFwG7+tkoWMtAr9kY2V9yl/WZIOhk8r4QtYHOzmxT3k7YRIpQ4BOlIg+jUXNw==", + "version": "22.2.3", + "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-22.2.3.tgz", + "integrity": "sha512-ROuJklv7iQVI1zIulo4MBDnk3Z0ZzihBWuN4nxFY8MTWxVMk97p92j1Wuyt4Kmx2kb5PB+kpcR1Jl6e13idftA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0", @@ -484,17 +503,17 @@ "node": "^22.22.3 || ^24.15.0 || >=26.0.0" }, "peerDependencies": { - "@angular/common": "22.2.1", - "@angular/compiler": "22.2.1", - "@angular/core": "22.2.1", - "@angular/platform-browser": "22.2.1", + "@angular/common": "22.2.3", + "@angular/compiler": "22.2.3", + "@angular/core": "22.2.3", + "@angular/platform-browser": "22.2.3", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/router": { - "version": "22.2.1", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-22.2.1.tgz", - "integrity": "sha512-HJfJ4yA1znKd9YFtbDOJfKmD12x0PhS7LkmYdWlJRu2WkQZRBVrdGKdmbvV5UvrqCRllVWKpzw1TIZJM69rlcw==", + "version": "22.2.3", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-22.2.3.tgz", + "integrity": "sha512-h4C3iJ3OXM9HItErmTo9fFrFRDj1DSqbvweHAWl8eYJvyuhDD80gBNgdpN8/5gpt9K1HV+PXk0YbyjyQ0zMfPA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -503,16 +522,16 @@ "node": "^22.22.3 || ^24.15.0 || >=26.0.0" }, "peerDependencies": { - "@angular/common": "22.2.1", - "@angular/core": "22.2.1", - "@angular/platform-browser": "22.2.1", + "@angular/common": "22.2.3", + "@angular/core": "22.2.3", + "@angular/platform-browser": "22.2.3", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/ssr": { - "version": "22.2.2", - "resolved": "https://registry.npmjs.org/@angular/ssr/-/ssr-22.2.2.tgz", - "integrity": "sha512-iMcwT5ZynIj33R0XSq+AtC5Ra6FGKOvV3qU0sjRr+lUaGfL6MjygPovPFsKLi8HzuGOA5dYDKffJfPedsC9Rxg==", + "version": "22.2.3", + "resolved": "https://registry.npmjs.org/@angular/ssr/-/ssr-22.2.3.tgz", + "integrity": "sha512-u/jeHCvSBMf9H72/rxrzON0UQLXux73pgft2Az4lgyhEgnFq+ttTUVoDSABcUoqZJKfh4pSTiCuFZJCpYB+xJQ==", "license": "MIT", "dependencies": { "beasties": "0.5.4", @@ -594,14 +613,14 @@ "license": "MIT" }, "node_modules/@babel/generator": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-8.0.6.tgz", - "integrity": "sha512-/pcanjdRsonCexCuxgGD8fKnBLLzk2i9uM4kmcmGyyev2R5YDs+rafMYZ89RvaGY1mW8T7C5au0TyYaEeHBGng==", + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-8.0.5.tgz", + "integrity": "sha512-f/TuhuMAxJqhwxEGNsJrswuG9VHmh0oNFoQoo6TbpgtFAz9wYZXcTAcWZMHfp7ljesr0RG04bp3Aos9GI59L7w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^8.0.6", - "@babel/types": "^8.0.6", + "@babel/parser": "^8.0.5", + "@babel/types": "^8.0.5", "@jridgewell/gen-mapping": "0.4.0-beta.0", "@jridgewell/trace-mapping": "^0.3.31", "@types/jsesc": "^2.5.0", @@ -756,6 +775,35 @@ "node": "^22.18.0 || >=24.11.0" } }, + "node_modules/@babel/traverse/node_modules/@babel/generator": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-8.0.6.tgz", + "integrity": "sha512-/pcanjdRsonCexCuxgGD8fKnBLLzk2i9uM4kmcmGyyev2R5YDs+rafMYZ89RvaGY1mW8T7C5au0TyYaEeHBGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^8.0.6", + "@babel/types": "^8.0.6", + "@jridgewell/gen-mapping": "0.4.0-beta.0", + "@jridgewell/trace-mapping": "^0.3.31", + "@types/jsesc": "^2.5.0", + "jsesc": "^3.0.2" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/@babel/traverse/node_modules/@jridgewell/gen-mapping": { + "version": "0.4.0-beta.0", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.4.0-beta.0.tgz", + "integrity": "sha512-JdGNkbE4GlNPYQhM0L95fBQr7ctLZJ276QXQLTad4t1oSdnnCI3fDq9DW3BqYAWv8Wc3+HS+4Gsii1oPMCfz1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.6.0-beta.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, "node_modules/@babel/traverse/node_modules/obug": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/obug/-/obug-3.0.0.tgz", @@ -791,6 +839,37 @@ "dev": true, "license": "(Apache-2.0 AND BSD-3-Clause)" }, + "node_modules/@emnapi/core": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.3.tgz", + "integrity": "sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.3", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.3.tgz", + "integrity": "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.3.tgz", + "integrity": "sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.28.2", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz", @@ -2426,6 +2505,27 @@ "node": ">= 10" } }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.5.tgz", + "integrity": "sha512-HshSvXzmBxNzqejd3k/KemgQ3hdREUYFRRrgxOZ+gPljDIsO2SDZrVZMd4Z/HsxudQbE62OVyVFE8z9BCurfjA==", + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.3" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=23.5.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1 || ^2.0.0-alpha.4", + "@emnapi/runtime": "^1.7.1 || ^2.0.0-alpha.4" + } + }, "node_modules/@oxc-parser/binding-android-arm-eabi": { "version": "0.150.0", "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm-eabi/-/binding-android-arm-eabi-0.150.0.tgz", @@ -3369,14 +3469,14 @@ "license": "MIT" }, "node_modules/@schematics/angular": { - "version": "22.2.2", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-22.2.2.tgz", - "integrity": "sha512-JxpXKpxdmQcRsJbriWJOhB7HeVTzz9CEsPNw6fQ0LOuPFnvtyUIXLxyFbKv/LfoFUz8wFADCtNU5sjowME5Mvg==", + "version": "22.2.3", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-22.2.3.tgz", + "integrity": "sha512-DY8wv/LtNf3YD/EEoFdER4ihMyw5yywuOQEKasm4d2uBJ5peGIWV3LXJXXqD7b4WVC8xS1eUAjingyWfI9reHw==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "22.2.2", - "@angular-devkit/schematics": "22.2.2", + "@angular-devkit/core": "22.2.3", + "@angular-devkit/schematics": "22.2.3", "jsonc-parser": "3.3.1", "oxc-parser": "0.150.0", "typescript": "6.0.3" @@ -3408,15 +3508,6 @@ "tailwindcss": "4.3.3" } }, - "node_modules/@tailwindcss/node/node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, "node_modules/@tailwindcss/oxide": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.3.tgz", @@ -3670,6 +3761,16 @@ "tailwindcss": "4.3.3" } }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.4.tgz", + "integrity": "sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@types/body-parser": { "version": "1.19.6", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", @@ -3738,9 +3839,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "26.6.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-26.6.4.tgz", - "integrity": "sha512-ldVPDCzj7fsaGZrLB0NuHuTvJcsNasysBAqMolr/cgxrLd1xbqxIr3XJiPnHHJUCxj5sNF1vnRj9aWnrVh5Jcg==", + "version": "26.6.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.6.5.tgz", + "integrity": "sha512-uMzsv9stDdofIZBx4UGh4Z9ZgXnGC9seRDscilBcTHAeOFk67MZg/k9bWVfO+bk4qZmG+l52hRnLwUiH2LnJTg==", "dev": true, "license": "MIT", "dependencies": { @@ -3795,19 +3896,6 @@ "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/accepts": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", - "license": "MIT", - "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/agent-base": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-9.0.0.tgz", @@ -4160,6 +4248,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/cli-truncate/node_modules/string-width": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.3.0.tgz", + "integrity": "sha512-ZbmZM0JCihQN91dWnxoipT2KOEyHqEyfRXUyjuRhW8b/xnqPDoq4gWEVApTVa9db2wN8mmoikgFBbjh71+cGeQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/cli-width": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", @@ -4185,24 +4290,6 @@ "node": ">=20" } }, - "node_modules/cliui/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/cliui/node_modules/wrap-ansi": { "version": "9.0.2", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", @@ -4233,9 +4320,9 @@ } }, "node_modules/content-disposition": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz", - "integrity": "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-2.0.1.tgz", + "integrity": "sha512-e+H0ZXHSWYrENhQzw1LPuP4oF5MzVKmDU6d3hxlvaPEYLLg62MxtQNPRx4SYSuYJSBUgnQIG4HIN2tEtNv7Dog==", "license": "MIT", "engines": { "node": ">=18" @@ -4245,15 +4332,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", @@ -4603,15 +4681,15 @@ } }, "node_modules/express": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", - "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/express/-/express-5.3.0.tgz", + "integrity": "sha512-qCqy1xSoaugxOD4IVHb1ZWdkvCF2W3aE2okKouWj8VwJ+ztskSiXoBnCSJqfKT+cVPJhuJqe9YLbY425+Zh00g==", "license": "MIT", "dependencies": { "accepts": "^2.0.0", - "body-parser": "^2.2.1", - "content-disposition": "^1.0.0", - "content-type": "^1.0.5", + "body-parser": "^2.3.0", + "content-disposition": "^2.0.1", + "content-type": "^2.0.0", "cookie": "^0.7.1", "cookie-signature": "^1.2.1", "debug": "^4.4.0", @@ -4627,14 +4705,14 @@ "on-finished": "^2.4.1", "once": "^1.4.0", "parseurl": "^1.3.3", - "proxy-addr": "^2.0.7", - "qs": "^6.14.0", + "proxy-addr": "^2.0.8", + "qs": "^6.16.0", "range-parser": "^1.2.1", "router": "^2.2.0", "send": "^1.1.0", "serve-static": "^2.2.0", "statuses": "^2.0.1", - "type-is": "^2.0.1", + "type-is": "^2.1.0", "vary": "^1.1.2" }, "engines": { @@ -4645,6 +4723,48 @@ "url": "https://opencollective.com/express" } }, + "node_modules/express/node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/content-type": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.1.0.tgz", + "integrity": "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/negotiator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.1.0.tgz", + "integrity": "sha512-NMPBRMJgiQHjbd8phG3Vebdx4kZ1H121rbl5IkMqeOsahptB9BKo/d7oJ3zTXqTgagn2bWlNSXkh0QUGM31RYg==", + "license": "MIT", + "dependencies": { + "content-type": "^2.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -5506,6 +5626,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/log-update/node_modules/string-width": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.3.0.tgz", + "integrity": "sha512-ZbmZM0JCihQN91dWnxoipT2KOEyHqEyfRXUyjuRhW8b/xnqPDoq4gWEVApTVa9db2wN8mmoikgFBbjh71+cGeQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/lru-cache": { "version": "11.5.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.3.tgz", @@ -5517,13 +5654,12 @@ } }, "node_modules/magic-string": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-1.4.1.tgz", - "integrity": "sha512-8lyCu36ErXR0J9uaGKlKQoiLZKmtI63YGLE8G2o9jyRPdr4X47LusSOwgOJOzcVtp81fTAAjxR7BwKz682Jhow==", - "dev": true, + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.6.0" + "@jridgewell/sourcemap-codec": "^1.5.5" } }, "node_modules/math-intrinsics": { @@ -5676,35 +5812,6 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/negotiator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.1.0.tgz", - "integrity": "sha512-NMPBRMJgiQHjbd8phG3Vebdx4kZ1H121rbl5IkMqeOsahptB9BKo/d7oJ3zTXqTgagn2bWlNSXkh0QUGM31RYg==", - "license": "MIT", - "dependencies": { - "content-type": "^2.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/negotiator/node_modules/content-type": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.1.0.tgz", - "integrity": "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, "node_modules/node-addon-api": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", @@ -5856,6 +5963,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ora/node_modules/string-width": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.3.0.tgz", + "integrity": "sha512-ZbmZM0JCihQN91dWnxoipT2KOEyHqEyfRXUyjuRhW8b/xnqPDoq4gWEVApTVa9db2wN8mmoikgFBbjh71+cGeQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ordered-binary": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.6.2.tgz", @@ -5951,16 +6075,6 @@ "node": ">= 0.8" } }, - "node_modules/path-to-regexp": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz", - "integrity": "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -6099,9 +6213,9 @@ } }, "node_modules/qs": { - "version": "6.16.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.16.0.tgz", - "integrity": "sha512-h6fhOIaRrID2CbEY2fqs+7t+UXZo+MLAnU5gRIq85uFtdiUPCdsApMlHhXogKVM4HM2DVbIjGNTTYH2OcmP1vA==", + "version": "6.16.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.16.1.tgz", + "integrity": "sha512-5Px6J7rfHBAGUhNQ3es4YzcOdBBw0SDcVtThJml4RdnKw4tKs2epA0kPZ+K8X+WiHktT93RHVcQ/3ym5aTCgtg==", "license": "BSD-3-Clause", "dependencies": { "es-define-property": "^1.0.1", @@ -6250,6 +6364,16 @@ "node": ">= 18" } }, + "node_modules/router/node_modules/path-to-regexp": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz", + "integrity": "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/rxjs": { "version": "7.8.2", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", @@ -6871,17 +6995,18 @@ } }, "node_modules/string-width": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.3.0.tgz", - "integrity": "sha512-ZbmZM0JCihQN91dWnxoipT2KOEyHqEyfRXUyjuRhW8b/xnqPDoq4gWEVApTVa9db2wN8mmoikgFBbjh71+cGeQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "license": "MIT", "dependencies": { - "get-east-asian-width": "^1.5.0", - "strip-ansi": "^7.1.2" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=20" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -6920,9 +7045,9 @@ } }, "node_modules/sync-child-process": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/sync-child-process/-/sync-child-process-1.0.2.tgz", - "integrity": "sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/sync-child-process/-/sync-child-process-1.1.0.tgz", + "integrity": "sha512-1LMf/x0kU0CKFSesh5DfYktvj1KhiqYi5LAh5HU2G4SkKk1TGDhsMFBOL47g/E+mNfYpgs365pVNlIYOIHPvlQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7500,6 +7625,23 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.3.0.tgz", + "integrity": "sha512-ZbmZM0JCihQN91dWnxoipT2KOEyHqEyfRXUyjuRhW8b/xnqPDoq4gWEVApTVa9db2wN8mmoikgFBbjh71+cGeQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -7560,6 +7702,23 @@ "node": "^20.19.0 || ^22.12.0 || >=23" } }, + "node_modules/yargs/node_modules/string-width": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.3.0.tgz", + "integrity": "sha512-ZbmZM0JCihQN91dWnxoipT2KOEyHqEyfRXUyjuRhW8b/xnqPDoq4gWEVApTVa9db2wN8mmoikgFBbjh71+cGeQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/yoctocolors": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.2.0.tgz", @@ -7574,9 +7733,9 @@ } }, "node_modules/zod": { - "version": "4.6.5", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.6.5.tgz", - "integrity": "sha512-v5l/aFXZQeai4awLbOpSoHecE9UiMrnfx75tEXLjNonXVARxQ5mOeipTjROUchszUNCqnE+hqAMujRsRHsut2Q==", + "version": "4.6.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.6.6.tgz", + "integrity": "sha512-4UmzQUF5fxvfcYHlbjBmejU+w+hbDnWFx4aS8kBx7nPBHcO2SqPbpAG8snbdg+Xse4pRefR98hgjFgIMCI/UhA==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" diff --git a/package.json b/package.json index ec5a9bd6..96ecda17 100644 --- a/package.json +++ b/package.json @@ -11,16 +11,16 @@ }, "private": true, "dependencies": { - "@angular/animations": "^22.2.1", - "@angular/common": "^22.2.1", - "@angular/compiler": "^22.2.1", - "@angular/core": "^22.2.1", - "@angular/forms": "^22.2.1", - "@angular/platform-browser": "^22.2.1", - "@angular/platform-browser-dynamic": "^22.2.1", - "@angular/platform-server": "^22.2.1", - "@angular/router": "^22.2.1", - "@angular/ssr": "^22.2.2", + "@angular/animations": "^22.2.3", + "@angular/common": "^22.2.3", + "@angular/compiler": "^22.2.3", + "@angular/core": "^22.2.3", + "@angular/forms": "^22.2.3", + "@angular/platform-browser": "^22.2.3", + "@angular/platform-browser-dynamic": "^22.2.3", + "@angular/platform-server": "^22.2.3", + "@angular/router": "^22.2.3", + "@angular/ssr": "^22.2.3", "@fortawesome/angular-fontawesome": "^5.1.0", "@fortawesome/fontawesome-svg-core": "^7.3.1", "@fortawesome/free-solid-svg-icons": "^7.3.1", @@ -31,13 +31,13 @@ "zone.js": "^0.16.3" }, "devDependencies": { - "@angular/build": "^22.2.2", - "@angular/cli": "^22.2.1", - "@angular/compiler-cli": "^22.2.1", + "@angular/build": "^22.2.3", + "@angular/cli": "^22.2.3", + "@angular/compiler-cli": "^22.2.3", "@types/express": "^5.0.6", "@types/node": "^26.6.4", - "postcss": "^8.5.3", + "postcss": "^8.5.29", "tailwindcss": "^4.3.3", - "typescript": "^6.0.0" + "typescript": "^6.0.3" } } \ No newline at end of file diff --git a/src/app/app.component.ts b/src/app/app.component.ts index f789f88d..730da5a5 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -1,4 +1,4 @@ -import {Component} from '@angular/core'; +import {Component, ChangeDetectionStrategy} from '@angular/core'; import { RouterOutlet } from '@angular/router'; import {HeaderComponent} from "./components/ui/header/header.component"; import {TitleService} from "./services/title.service"; @@ -20,6 +20,7 @@ const fadeLength: string = "100ms"; selector: 'app-root', imports: [RouterOutlet, HeaderComponent, PopupBannerContainerComponent, AsyncPipe, HeaderMobileComponent, FooterComponent], templateUrl: './app.component.html', + changeDetection: ChangeDetectionStrategy.Eager, animations: [ trigger('routeAnimations', [ transition('* => *', [ diff --git a/src/app/app.config.server.ts b/src/app/app.config.server.ts index 0bad7a9c..d1534116 100644 --- a/src/app/app.config.server.ts +++ b/src/app/app.config.server.ts @@ -1,5 +1,5 @@ +import { provideServerRendering } from '@angular/ssr'; import { mergeApplicationConfig, ApplicationConfig } from '@angular/core'; -import { provideServerRendering } from '@angular/platform-server'; import { appConfig } from './app.config'; import {provideHttpClient, withFetch} from "@angular/common/http"; import {applyShims} from "./helpers/server-shims"; diff --git a/src/app/app.config.ts b/src/app/app.config.ts index 904cda37..2d7ba63f 100644 --- a/src/app/app.config.ts +++ b/src/app/app.config.ts @@ -1,9 +1,9 @@ import {ApplicationConfig, Provider, Type} from '@angular/core'; import { provideRouter } from '@angular/router'; -import {HTTP_INTERCEPTORS, provideHttpClient, withInterceptorsFromDi} from '@angular/common/http'; +import {HTTP_INTERCEPTORS, provideHttpClient, withInterceptorsFromDi, withXhr} from '@angular/common/http'; import { routes } from './app.routes'; -import { provideClientHydration } from '@angular/platform-browser'; +import { provideClientHydration, withNoIncrementalHydration } from '@angular/platform-browser'; import {ApiBaseInterceptor} from "./api/interceptors/api-base.interceptor"; import {APIv3Interceptor} from "./api/interceptors/apiv3.interceptor"; import {IMAGE_LOADER} from "@angular/common"; @@ -15,8 +15,8 @@ import {provideAnimationsAsync} from "@angular/platform-browser/animations/async export const appConfig: ApplicationConfig = { providers: [ provideRouter(routes), - provideClientHydration(), - provideHttpClient(withInterceptorsFromDi()), + provideClientHydration(withNoIncrementalHydration()), + provideHttpClient(withXhr(), withInterceptorsFromDi()), provideAnimationsAsync(), useInterceptor(ApiBaseInterceptor), useInterceptor(APIv3Interceptor), diff --git a/src/app/banners/popup-banner-container.component.ts b/src/app/banners/popup-banner-container.component.ts index 49c84a9c..e9b981f1 100644 --- a/src/app/banners/popup-banner-container.component.ts +++ b/src/app/banners/popup-banner-container.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component, ChangeDetectionStrategy } from '@angular/core'; import {BannerService} from "./banner.service"; import {PopupBannerComponent} from "./popup-banner.component"; @@ -8,6 +8,7 @@ import {PopupBannerComponent} from "./popup-banner.component"; imports: [ PopupBannerComponent ], + changeDetection: ChangeDetectionStrategy.Eager, template: ` @for (info of bannerService.banners; track info; let i = $index) { diff --git a/src/app/banners/popup-banner.component.ts b/src/app/banners/popup-banner.component.ts index 183c34e4..a28650ee 100644 --- a/src/app/banners/popup-banner.component.ts +++ b/src/app/banners/popup-banner.component.ts @@ -1,4 +1,4 @@ -import {Component, HostBinding, Input} from '@angular/core'; +import {Component, HostBinding, Input, ChangeDetectionStrategy} from '@angular/core'; import {BannerInfo} from "./banner-info.interface"; import {FaIconComponent} from "@fortawesome/angular-fontawesome"; @@ -33,6 +33,7 @@ import {animate, animateChild, query, style, transition, trigger} from "@angular ]), ]), ], + changeDetection: ChangeDetectionStrategy.Eager, template: ` @defer (on timer(50ms)) { diff --git a/src/app/components/items/announcement.component.ts b/src/app/components/items/announcement.component.ts index 689830ac..1d36d8b5 100644 --- a/src/app/components/items/announcement.component.ts +++ b/src/app/components/items/announcement.component.ts @@ -1,4 +1,4 @@ -import {Component, EventEmitter, Input, Output} from '@angular/core'; +import {Component, EventEmitter, Input, Output, ChangeDetectionStrategy} from '@angular/core'; import {Announcement} from "../../api/types/announcement"; import {FaIconComponent} from "@fortawesome/angular-fontawesome"; @@ -18,6 +18,7 @@ import { DateComponent } from "../ui/info/date.component"; ConfirmationDialogComponent, DateComponent ], + changeDetection: ChangeDetectionStrategy.Eager, template: `
diff --git a/src/app/components/items/compact-event.component.ts b/src/app/components/items/compact-event.component.ts index c378900f..18062fec 100644 --- a/src/app/components/items/compact-event.component.ts +++ b/src/app/components/items/compact-event.component.ts @@ -1,4 +1,4 @@ -import {Component, Input} from '@angular/core'; +import {Component, Input, ChangeDetectionStrategy} from '@angular/core'; import {DateComponent} from "../ui/info/date.component"; import {UserLinkComponent} from "../ui/text/links/user-link.component"; import {ActivityEvent} from "../../api/types/activity/activity-event"; @@ -22,6 +22,7 @@ import { UserLinkComponent, FaIconComponent ], + changeDetection: ChangeDetectionStrategy.Eager, template: ` diff --git a/src/app/components/items/contest-banner.component.ts b/src/app/components/items/contest-banner.component.ts index 6251d611..59c93c67 100644 --- a/src/app/components/items/contest-banner.component.ts +++ b/src/app/components/items/contest-banner.component.ts @@ -1,4 +1,4 @@ -import {Component, Input} from '@angular/core'; +import {Component, Input, ChangeDetectionStrategy} from '@angular/core'; import {Contest} from "../../api/types/contests/contest"; import {NgOptimizedImage} from "@angular/common"; @@ -7,6 +7,7 @@ import {NgOptimizedImage} from "@angular/common"; imports: [ NgOptimizedImage ], + changeDetection: ChangeDetectionStrategy.Eager, template: ` ` diff --git a/src/app/components/items/event-page.component.ts b/src/app/components/items/event-page.component.ts index d7d9611e..1f4cfbb0 100644 --- a/src/app/components/items/event-page.component.ts +++ b/src/app/components/items/event-page.component.ts @@ -1,4 +1,4 @@ -import {Component, Input} from '@angular/core'; +import {Component, Input, ChangeDetectionStrategy} from '@angular/core'; import {ActivityPage} from "../../api/types/activity/activity-page"; import {EventComponent} from "./event.component"; @@ -16,6 +16,7 @@ import {CompactEventComponent} from "./compact-event.component"; ContainerComponent, CompactEventComponent ], + changeDetection: ChangeDetectionStrategy.Eager, template: `
@for (event of page.events; track event.eventId) { diff --git a/src/app/components/items/event.component.ts b/src/app/components/items/event.component.ts index 17f4d330..db916633 100644 --- a/src/app/components/items/event.component.ts +++ b/src/app/components/items/event.component.ts @@ -1,4 +1,4 @@ -import {Component, Input, OnInit} from '@angular/core'; +import {Component, Input, OnInit, ChangeDetectionStrategy} from '@angular/core'; import {ActivityEvent} from "../../api/types/activity/activity-event"; import {User} from "../../api/types/users/user"; @@ -27,6 +27,7 @@ import {GameVersion} from "../../api/types/game-version"; PhotoComponent, UserPreviewComponent ], + changeDetection: ChangeDetectionStrategy.Eager, template: ` @switch (event.eventType) { @@ -115,7 +116,7 @@ import {GameVersion} from "../../api/types/game-version";

- {{ score?.score | number }} + {{ $safeNavigationMigration(score?.score) | number }} points

@if (score?.level?.gameVersion !== GameVersion.LBPPSP) { diff --git a/src/app/components/items/level-category.component.ts b/src/app/components/items/level-category.component.ts index 3ec8e65b..e8f0791f 100644 --- a/src/app/components/items/level-category.component.ts +++ b/src/app/components/items/level-category.component.ts @@ -1,4 +1,4 @@ -import {Component, Input} from '@angular/core'; +import {Component, Input, ChangeDetectionStrategy} from '@angular/core'; import {LevelCategory} from "../../api/types/categories/level-category"; import {ContainerComponent} from "../ui/container.component"; import {RouterLink} from "@angular/router"; @@ -19,6 +19,7 @@ import {LevelPreviewComponent} from "./level-preview.component"; DividerComponent, LevelPreviewComponent ], + changeDetection: ChangeDetectionStrategy.Eager, template: ` diff --git a/src/app/components/items/level-preview.component.ts b/src/app/components/items/level-preview.component.ts index 38d754e0..2ba3e3d9 100644 --- a/src/app/components/items/level-preview.component.ts +++ b/src/app/components/items/level-preview.component.ts @@ -1,4 +1,4 @@ -import {Component, Input} from '@angular/core'; +import {Component, Input, ChangeDetectionStrategy} from '@angular/core'; import {Level} from "../../api/types/levels/level"; import {UserLinkComponent} from "../ui/text/links/user-link.component"; import {LevelAvatarComponent} from "../ui/photos/level-avatar.component"; @@ -67,6 +67,7 @@ import { TooltipComponent } from "../ui/text/tooltip.component";
`, + changeDetection: ChangeDetectionStrategy.Eager, styles: `` }) export class LevelPreviewComponent { diff --git a/src/app/components/items/level-statistics.component.ts b/src/app/components/items/level-statistics.component.ts index ebed6dd6..8d8bd962 100644 --- a/src/app/components/items/level-statistics.component.ts +++ b/src/app/components/items/level-statistics.component.ts @@ -1,4 +1,4 @@ -import {Component, Input} from '@angular/core'; +import {Component, Input, ChangeDetectionStrategy} from '@angular/core'; import {Level} from "../../api/types/levels/level"; import {faHeart, faPlay, faStar, faThumbsDown, faThumbsUp} from "@fortawesome/free-solid-svg-icons"; import {StatisticComponent} from "../ui/info/statistic.component"; @@ -10,6 +10,7 @@ import { LevelTeamPickStatusComponent } from "./level-team-pick-status.component StatisticComponent, LevelTeamPickStatusComponent ], + changeDetection: ChangeDetectionStrategy.Eager, template: `
diff --git a/src/app/components/items/level-team-pick-status.component.ts b/src/app/components/items/level-team-pick-status.component.ts index 22c51236..848099a0 100644 --- a/src/app/components/items/level-team-pick-status.component.ts +++ b/src/app/components/items/level-team-pick-status.component.ts @@ -1,4 +1,4 @@ -import {Component, Input} from '@angular/core'; +import {Component, Input, ChangeDetectionStrategy} from '@angular/core'; import {Level} from "../../api/types/levels/level"; import {faCircleCheck} from "@fortawesome/free-solid-svg-icons"; import { FaIconComponent } from "@fortawesome/angular-fontawesome"; @@ -12,6 +12,7 @@ import { LayoutService } from '../../services/layout.service'; FaIconComponent, TooltipComponent ], + changeDetection: ChangeDetectionStrategy.Eager, template: `
diff --git a/src/app/components/items/photo.component.ts b/src/app/components/items/photo.component.ts index 3911a9cf..48c721c1 100644 --- a/src/app/components/items/photo.component.ts +++ b/src/app/components/items/photo.component.ts @@ -1,4 +1,4 @@ -import {Component, Input, isDevMode, OnInit} from '@angular/core'; +import {Component, Input, isDevMode, OnInit, ChangeDetectionStrategy} from '@angular/core'; import {Photo} from "../../api/types/photos/photo"; import { NgClass, NgOptimizedImage } from "@angular/common"; import {UserLinkComponent} from "../ui/text/links/user-link.component"; @@ -28,6 +28,7 @@ import {RouterLink} from "@angular/router"; RouterLink, NgClass ], + changeDetection: ChangeDetectionStrategy.Eager, template: ` @if(header) {
diff --git a/src/app/components/items/room.component.ts b/src/app/components/items/room.component.ts index bb19e348..8acb65d7 100644 --- a/src/app/components/items/room.component.ts +++ b/src/app/components/items/room.component.ts @@ -1,4 +1,4 @@ -import {Component, Input} from '@angular/core'; +import {Component, Input, ChangeDetectionStrategy} from '@angular/core'; import {Room} from "../../api/types/rooms/room"; @@ -15,6 +15,7 @@ import {PlatformPipe} from "../../pipes/platform.pipe"; UserLinkComponent, PlatformPipe ], + changeDetection: ChangeDetectionStrategy.Eager, template: ` {{'player' | plural: room.playerIds.length}} diff --git a/src/app/components/items/score-preview.component.ts b/src/app/components/items/score-preview.component.ts index a092a602..62e73f12 100644 --- a/src/app/components/items/score-preview.component.ts +++ b/src/app/components/items/score-preview.component.ts @@ -1,4 +1,4 @@ -import {Component, EventEmitter, Input, Output} from '@angular/core'; +import {Component, EventEmitter, Input, Output, ChangeDetectionStrategy} from '@angular/core'; import { Score } from '../../api/types/levels/score'; import {UserLinkComponent} from "../ui/text/links/user-link.component"; import {DateComponent} from "../ui/info/date.component"; @@ -35,6 +35,7 @@ import { BannerService } from '../../banners/banner.service'; GamePipe, PlatformPipe ], + changeDetection: ChangeDetectionStrategy.Eager, template: `
diff --git a/src/app/components/items/user-category.component.ts b/src/app/components/items/user-category.component.ts index 0e6f426b..b002af04 100644 --- a/src/app/components/items/user-category.component.ts +++ b/src/app/components/items/user-category.component.ts @@ -1,4 +1,4 @@ -import {Component, Input} from '@angular/core'; +import {Component, Input, ChangeDetectionStrategy} from '@angular/core'; import {UserCategory} from "../../api/types/categories/user-category"; import {ContainerComponent} from "../ui/container.component"; import {RouterLink} from "@angular/router"; @@ -19,6 +19,7 @@ import {UserPreviewComponent} from "./user-preview.component"; DividerComponent, UserPreviewComponent ], + changeDetection: ChangeDetectionStrategy.Eager, template: ` diff --git a/src/app/components/items/user-preview.component.ts b/src/app/components/items/user-preview.component.ts index f6cf513e..6d1b43ee 100644 --- a/src/app/components/items/user-preview.component.ts +++ b/src/app/components/items/user-preview.component.ts @@ -1,4 +1,4 @@ -import {Component, Input} from '@angular/core'; +import {Component, Input, ChangeDetectionStrategy} from '@angular/core'; import {User} from "../../api/types/users/user"; import {UserRouterLinkComponent} from "../ui/text/links/user-router-link.component"; @@ -17,6 +17,7 @@ import { UserRoleComponent } from "../ui/info/user-role.component"; UserStatusComponent, UserRoleComponent ], + changeDetection: ChangeDetectionStrategy.Eager, template: `
diff --git a/src/app/components/items/user-statistics.component.ts b/src/app/components/items/user-statistics.component.ts index 64e383c3..caccf8d9 100644 --- a/src/app/components/items/user-statistics.component.ts +++ b/src/app/components/items/user-statistics.component.ts @@ -1,4 +1,4 @@ -import {Component, Input} from '@angular/core'; +import {Component, Input, ChangeDetectionStrategy} from '@angular/core'; import { faCertificate, faComment, @@ -14,6 +14,7 @@ import { UserRelations } from '../../api/types/users/user-relations'; imports: [ StatisticComponent ], + changeDetection: ChangeDetectionStrategy.Eager, template: `
diff --git a/src/app/components/ui/confirmation-dialog.component.ts b/src/app/components/ui/confirmation-dialog.component.ts index 348af8d8..c60616fb 100644 --- a/src/app/components/ui/confirmation-dialog.component.ts +++ b/src/app/components/ui/confirmation-dialog.component.ts @@ -1,4 +1,4 @@ -import {Component, EventEmitter, Input, Output} from '@angular/core'; +import {Component, EventEmitter, Input, Output, ChangeDetectionStrategy} from '@angular/core'; import { DialogComponent } from "./dialog.component"; import { PageTitleComponent } from "./text/page-title.component"; @@ -8,6 +8,7 @@ import { PageTitleComponent } from "./text/page-title.component"; DialogComponent, PageTitleComponent ], + changeDetection: ChangeDetectionStrategy.Eager, template: `
diff --git a/src/app/components/ui/container-header.component.ts b/src/app/components/ui/container-header.component.ts index 58005ecf..5bb52d26 100644 --- a/src/app/components/ui/container-header.component.ts +++ b/src/app/components/ui/container-header.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component, ChangeDetectionStrategy } from '@angular/core'; @Component({ selector: 'app-container-header', @@ -8,6 +8,7 @@ import { Component } from '@angular/core';
`, + changeDetection: ChangeDetectionStrategy.Eager, styles: `` }) export class ContainerHeaderComponent { diff --git a/src/app/components/ui/container.component.ts b/src/app/components/ui/container.component.ts index b59854f0..fe933e93 100644 --- a/src/app/components/ui/container.component.ts +++ b/src/app/components/ui/container.component.ts @@ -1,4 +1,4 @@ -import {Component, Input} from '@angular/core'; +import {Component, Input, ChangeDetectionStrategy} from '@angular/core'; import { NgClass } from "@angular/common"; @Component({ @@ -6,6 +6,7 @@ import { NgClass } from "@angular/common"; imports: [ NgClass ], + changeDetection: ChangeDetectionStrategy.Eager, template: `
diff --git a/src/app/components/ui/dark-container.component.ts b/src/app/components/ui/dark-container.component.ts index 0e609e6a..009222e7 100644 --- a/src/app/components/ui/dark-container.component.ts +++ b/src/app/components/ui/dark-container.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component, ChangeDetectionStrategy } from '@angular/core'; @Component({ selector: 'app-dark-container', @@ -8,6 +8,7 @@ import { Component } from '@angular/core';
`, + changeDetection: ChangeDetectionStrategy.Eager, styles: `` }) export class DarkContainerComponent { diff --git a/src/app/components/ui/dialog.component.ts b/src/app/components/ui/dialog.component.ts index 8a894e45..67ed13fc 100644 --- a/src/app/components/ui/dialog.component.ts +++ b/src/app/components/ui/dialog.component.ts @@ -1,4 +1,4 @@ -import {Component, ElementRef, OnDestroy, OnInit, Output, ViewChild, EventEmitter} from '@angular/core'; +import {Component, ElementRef, OnDestroy, OnInit, Output, ViewChild, EventEmitter, ChangeDetectionStrategy} from '@angular/core'; @Component({ selector: 'app-dialog', @@ -8,6 +8,7 @@ import {Component, ElementRef, OnDestroy, OnInit, Output, ViewChild, EventEmitte `, + changeDetection: ChangeDetectionStrategy.Eager, styles: `` }) export class DialogComponent implements OnInit, OnDestroy { diff --git a/src/app/components/ui/divider.component.ts b/src/app/components/ui/divider.component.ts index c4650ee6..1e406547 100644 --- a/src/app/components/ui/divider.component.ts +++ b/src/app/components/ui/divider.component.ts @@ -1,8 +1,9 @@ -import { Component, Input } from '@angular/core'; +import { Component, Input, ChangeDetectionStrategy } from '@angular/core'; @Component({ selector: 'app-divider', imports: [], + changeDetection: ChangeDetectionStrategy.Eager, template: `
` diff --git a/src/app/components/ui/footer.component.ts b/src/app/components/ui/footer.component.ts index 7b3e10b6..a1aefc10 100644 --- a/src/app/components/ui/footer.component.ts +++ b/src/app/components/ui/footer.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component, ChangeDetectionStrategy } from '@angular/core'; import { NgTemplateOutlet, NgOptimizedImage } from '@angular/common'; import { ClientService } from '../../api/client.service'; import { Instance } from '../../api/types/instance'; @@ -25,6 +25,7 @@ import { RouterLink } from "@angular/router"; StatisticComponent, RouterLink ], + changeDetection: ChangeDetectionStrategy.Eager, template: `