diff --git a/src/REG.Angular/ClientApp/package-lock.json b/src/REG.Angular/ClientApp/package-lock.json index 4afe85f..7f14faa 100644 --- a/src/REG.Angular/ClientApp/package-lock.json +++ b/src/REG.Angular/ClientApp/package-lock.json @@ -1,24 +1,24 @@ { "name": "reg.angular", - "version": "0.4.12", + "version": "0.4.13", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "reg.angular", - "version": "0.4.12", + "version": "0.4.13", "dependencies": { - "@angular/animations": "21.1.4", + "@angular/animations": "21.1.5", "@angular/cdk": "21.1.5", - "@angular/common": "21.1.4", - "@angular/compiler": "21.1.4", - "@angular/core": "21.1.4", - "@angular/forms": "21.1.4", + "@angular/common": "21.1.5", + "@angular/compiler": "21.1.5", + "@angular/core": "21.1.5", + "@angular/forms": "21.1.5", "@angular/material": "21.1.5", - "@angular/platform-browser": "21.1.4", - "@angular/platform-browser-dynamic": "21.1.4", - "@angular/platform-server": "21.1.4", - "@angular/router": "21.1.4", + "@angular/platform-browser": "21.1.5", + "@angular/platform-browser-dynamic": "21.1.5", + "@angular/platform-server": "21.1.5", + "@angular/router": "21.1.5", "@fortawesome/angular-fontawesome": "4.0.0", "@fortawesome/fontawesome-svg-core": "7.2.0", "@fortawesome/free-solid-svg-icons": "7.2.0", @@ -40,15 +40,15 @@ "devDependencies": { "@angular-devkit/build-angular": "21.1.4", "@angular/cli": "21.1.4", - "@angular/compiler-cli": "21.1.4", - "@angular/language-service": "21.1.4", + "@angular/compiler-cli": "21.1.5", + "@angular/language-service": "21.1.5", "@shopify/eslint-plugin": "50.0.0", "@types/jasmine": "6.0.0", "@types/jasminewd2": "2.0.13", - "@types/node": "25.2.3", + "@types/node": "25.3.0", "@typescript-eslint/eslint-plugin": "8.56.0", "@typescript-eslint/parser": "8.56.0", - "eslint": "9.39.2", + "eslint": "9.39.3", "eslint-config-prettier": "10.1.8", "eslint-plugin-prettier": "5.5.5", "jasmine-core": "6.0.1", @@ -505,9 +505,9 @@ } }, "node_modules/@angular/animations": { - "version": "21.1.4", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-21.1.4.tgz", - "integrity": "sha512-8xQ0Ylw7qqVyw4ZJ/Tyw/z5Mtqtp8AMj+R+Z1sCWcyxBgDU4+qfxteVYdiipWC3tX77A0FTsXqwvNP9WVY2/WA==", + "version": "21.1.5", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-21.1.5.tgz", + "integrity": "sha512-gsqHX8lCYV8cgVtHs0iLwrX8SVlmcjUF44l/xCc/jBC/TeKWRl2e6Jqrn1Wcd0NDlGiNsm+mYNyqMyy5/I7kjw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -516,7 +516,7 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/core": "21.1.4" + "@angular/core": "21.1.5" } }, "node_modules/@angular/build": { @@ -672,9 +672,9 @@ } }, "node_modules/@angular/common": { - "version": "21.1.4", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-21.1.4.tgz", - "integrity": "sha512-1uOxPrHO9PFZBU/JavzYzjxAm+5x7vD2z6AeUndqdT4LjqOBIePswxFDRqM9dlfF8FIwnnfmNFipiC/yQjJSnA==", + "version": "21.1.5", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-21.1.5.tgz", + "integrity": "sha512-olO2F0b+H8YBfsuQFEwo9Hjf+B714xGcttDW37+4jnY2IRS2uYeMu2RGIpY7ps+0uZ017c4iK3CCgSPBgmbTcA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -683,14 +683,14 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/core": "21.1.4", + "@angular/core": "21.1.5", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "21.1.4", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-21.1.4.tgz", - "integrity": "sha512-H0qtASeqOTaS44ioF4DYE/yNqwzUmEJpMYrcNEUFEwA20/DkLzyoaEx4y1CjIxtXxuhtge95PNymDBOLWSjIdg==", + "version": "21.1.5", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-21.1.5.tgz", + "integrity": "sha512-yRUdWlL+AWcTL4d7zD0jkNqsjvxXpWEihvOfD2gc65DO0+E80DsWIpHq9A8yWeLukbfLcmBGI2QbfW9+SXAlvg==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -700,9 +700,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "21.1.4", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-21.1.4.tgz", - "integrity": "sha512-Uw8KmpVCo58/f5wf6pY8ZS5fodv65hn5jxms8Nv/K7/LVe3i1nNFrHyneBx5+a7qkz93nSV4rdwBVnMvjIyr+g==", + "version": "21.1.5", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-21.1.5.tgz", + "integrity": "sha512-i2r2bQuWdjjFGTd2TA7FtCWNx5yJ3BMoyTGUC9lzSfmxWAfcH/NWR+6OdaEVwv6Zap3IXYYxs8S+REkx954EwA==", "license": "MIT", "dependencies": { "@babel/core": "7.28.5", @@ -722,7 +722,7 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/compiler": "21.1.4", + "@angular/compiler": "21.1.5", "typescript": ">=5.9 <6.0" }, "peerDependenciesMeta": { @@ -732,9 +732,9 @@ } }, "node_modules/@angular/core": { - "version": "21.1.4", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-21.1.4.tgz", - "integrity": "sha512-QBDO5SaVYTVQ0fIN9Qd7US9cUCgs2vM9x6K18PTUKmygIkHVHTFdzwm4MO5gpCOFzJseGbS+dNzqn+v0PaKf9g==", + "version": "21.1.5", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-21.1.5.tgz", + "integrity": "sha512-m61YHiyE+SIvS8UXcFLjYCucv6ShJJCwz9xxEk7ysYW9wOtHdfIf9tgyOsucZDAvrvpSyQLRj5jGBCGm1VIvXA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -743,7 +743,7 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/compiler": "21.1.4", + "@angular/compiler": "21.1.5", "rxjs": "^6.5.3 || ^7.4.0", "zone.js": "~0.15.0 || ~0.16.0" }, @@ -757,9 +757,9 @@ } }, "node_modules/@angular/forms": { - "version": "21.1.4", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-21.1.4.tgz", - "integrity": "sha512-duVT/eOncmFNBYRlK/F7WDg6GD1vL1mxUrDdnp7M9J8JvNrKH0PvdfzuOAmjbB8/bsvUNTLFXCV4+43Mc2Hqsw==", + "version": "21.1.5", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-21.1.5.tgz", + "integrity": "sha512-Z8Vcgz5KYlCobRxLjyGGUBv0mA4nusuiD36GqYRn3sR780TLDcPFVwTCwVEWLdwID64oiHXG+x9jjU/Z3HzR6A==", "license": "MIT", "dependencies": { "@standard-schema/spec": "^1.0.0", @@ -769,16 +769,16 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/common": "21.1.4", - "@angular/core": "21.1.4", - "@angular/platform-browser": "21.1.4", + "@angular/common": "21.1.5", + "@angular/core": "21.1.5", + "@angular/platform-browser": "21.1.5", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/language-service": { - "version": "21.1.4", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-21.1.4.tgz", - "integrity": "sha512-E0OKcbYMJPaWlDsz4clPoFJRCgpWBSmMZtgzd4Py3C6yxTyPCZYgA43UyzUDiQI7rHHjD5V6d5EvocgSq6uBfQ==", + "version": "21.1.5", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-21.1.5.tgz", + "integrity": "sha512-/MiXx/peMBjMHEX6Gm7C6ZHOlcgEzkWeBlI7WWnIEDU9vU6F3nU4kauBYdLr/EpXhHpdpOtL4eknPhAfdvVrJA==", "dev": true, "license": "MIT", "engines": { @@ -786,9 +786,9 @@ } }, "node_modules/@angular/localize": { - "version": "21.1.4", - "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-21.1.4.tgz", - "integrity": "sha512-AzG/uf6y8AES9lerf7LqFmA0xdmd8ch8qTnaPr9w/pucIbUSsl+X43wZmWjezTlW8U6EelvYU5jJ86/ldzFI0g==", + "version": "21.1.5", + "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-21.1.5.tgz", + "integrity": "sha512-gzjeVG5mg9LwNepNG4ArmKWZPt8eNnk9IlowPR8uDwBX9RZkC2l/aDrrviwrX21N4LN7ONc/+/NzN+wcQObP8A==", "license": "MIT", "peer": true, "dependencies": { @@ -806,8 +806,8 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/compiler": "21.1.4", - "@angular/compiler-cli": "21.1.4" + "@angular/compiler": "21.1.5", + "@angular/compiler-cli": "21.1.5" } }, "node_modules/@angular/material": { @@ -828,9 +828,9 @@ } }, "node_modules/@angular/platform-browser": { - "version": "21.1.4", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-21.1.4.tgz", - "integrity": "sha512-S6Iw5CkORih5omh+MQY35w0bUBxdSFAPLDg386S6/9fEUjDClo61hvXNKxaNh9g7tnh1LD7zmTmKrqufnhnFDQ==", + "version": "21.1.5", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-21.1.5.tgz", + "integrity": "sha512-rAN0cu05Pg7HHe9JMRd3g5JyyVCeFW8QiB/jG6klUrOTF4QzyCbmwlm7MX0uTx3CWAZraWCGbdahUkLyYtuqFA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -839,9 +839,9 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/animations": "21.1.4", - "@angular/common": "21.1.4", - "@angular/core": "21.1.4" + "@angular/animations": "21.1.5", + "@angular/common": "21.1.5", + "@angular/core": "21.1.5" }, "peerDependenciesMeta": { "@angular/animations": { @@ -850,9 +850,9 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "21.1.4", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-21.1.4.tgz", - "integrity": "sha512-lThgNDFHPQyrx0liNX3x8wHcgp1sd/Dym19zm1PSQ67k6J4snwxZFhNlwFHVr1K86XvX/vilyeR2edPLe9lF3Q==", + "version": "21.1.5", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-21.1.5.tgz", + "integrity": "sha512-Pd8nPbJSIONnze1WS9wLBAtaFw4TYIH+ZGjKHS9G1E9l09tDWtHWyB7dY82Sc//Nc8iR4V7dcsbUmFjOJHThww==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -861,16 +861,16 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/common": "21.1.4", - "@angular/compiler": "21.1.4", - "@angular/core": "21.1.4", - "@angular/platform-browser": "21.1.4" + "@angular/common": "21.1.5", + "@angular/compiler": "21.1.5", + "@angular/core": "21.1.5", + "@angular/platform-browser": "21.1.5" } }, "node_modules/@angular/platform-server": { - "version": "21.1.4", - "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-21.1.4.tgz", - "integrity": "sha512-Ja/bs+ZaPsN3OQi+C4cqACS3o46z7Z206SWRmEltYjaG9f9kPbKgIPuALbsTo/7iaq6jyPUH4ERErSwoj7K1qw==", + "version": "21.1.5", + "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-21.1.5.tgz", + "integrity": "sha512-7S66We60szZ5M/LfW6OAvua+qNCS08IHFN0Re5ZwqqfyDVBGPt18JUN6NKR5FfAhW4s5B9+TtF+tdLcxYxHWaQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0", @@ -880,17 +880,17 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/common": "21.1.4", - "@angular/compiler": "21.1.4", - "@angular/core": "21.1.4", - "@angular/platform-browser": "21.1.4", + "@angular/common": "21.1.5", + "@angular/compiler": "21.1.5", + "@angular/core": "21.1.5", + "@angular/platform-browser": "21.1.5", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/router": { - "version": "21.1.4", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-21.1.4.tgz", - "integrity": "sha512-nPYuRJ8ub/X8GK55U2KqYy/ducVRn6HSoDmZz0yiXtI6haFsZlv9R1j5zi0EDIqrrN0HGARMs6jNDXZC1Ded3w==", + "version": "21.1.5", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-21.1.5.tgz", + "integrity": "sha512-OjFn6Nw51CU712CMbl2U9TxlCkzOmjMLYPAfnV4+RdG7o+/eOS2nV0oapJ88RNCw7Yl04PA1amc3ql3agDFd4A==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -899,9 +899,9 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/common": "21.1.4", - "@angular/core": "21.1.4", - "@angular/platform-browser": "21.1.4", + "@angular/common": "21.1.5", + "@angular/core": "21.1.5", + "@angular/platform-browser": "21.1.5", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -3156,9 +3156,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "dev": true, "license": "MIT", "dependencies": { @@ -3227,9 +3227,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.39.2", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", - "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", + "version": "9.39.3", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.3.tgz", + "integrity": "sha512-1B1VkCq6FuUNlQvlBYb+1jDu/gV297TIs/OeiaSR9l1H27SVW55ONE1e1Vp16NqP683+xEGzxYtv4XCiDPaQiw==", "dev": true, "license": "MIT", "engines": { @@ -5021,9 +5021,9 @@ } }, "node_modules/@npmcli/package-json": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-7.0.4.tgz", - "integrity": "sha512-0wInJG3j/K40OJt/33ax47WfWMzZTm6OQxB9cDhTt5huCP2a9g2GnlsxmfN+PulItNPIpPrZ+kfwwUil7eHcZQ==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-7.0.5.tgz", + "integrity": "sha512-iVuTlG3ORq2iaVa1IWUxAO/jIp77tUKBhoMjuzYW2kL4MLN1bi/ofqkZ7D7OOwh8coAx1/S2ge0rMdGv8sLSOQ==", "dev": true, "license": "ISC", "dependencies": { @@ -5033,7 +5033,7 @@ "json-parse-even-better-errors": "^5.0.0", "proc-log": "^6.0.0", "semver": "^7.5.3", - "validate-npm-package-license": "^3.0.4" + "spdx-expression-parse": "^4.0.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" @@ -5063,34 +5063,34 @@ } }, "node_modules/@npmcli/package-json/node_modules/glob": { - "version": "13.0.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.5.tgz", - "integrity": "sha512-BzXxZg24Ibra1pbQ/zE7Kys4Ua1ks7Bn6pKLkVPZ9FZe4JQS6/Q7ef3LG1H+k7lUf5l4T3PLSyYyYJVYUvfgTw==", + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "minimatch": "^10.2.1", - "minipass": "^7.1.2", - "path-scurry": "^2.0.0" + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@npmcli/package-json/node_modules/minimatch": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.1.tgz", - "integrity": "sha512-MClCe8IL5nRRmawL6ib/eT4oLyeKMGCghibcDWK+J0hh0Q8kqSdia6BvbRMVk6mPa6WqUa5uR2oxt6C5jd533A==", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.2.tgz", + "integrity": "sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "brace-expansion": "^5.0.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -5769,9 +5769,9 @@ "license": "MIT" }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.1.tgz", - "integrity": "sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==", + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.58.0.tgz", + "integrity": "sha512-mr0tmS/4FoVk1cnaeN244A/wjvGDNItZKR8hRhnmCzygyRXYtKF5jVDSIILR1U97CTzAYmbgIj/Dukg62ggG5w==", "cpu": [ "arm" ], @@ -5783,9 +5783,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.1.tgz", - "integrity": "sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==", + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.58.0.tgz", + "integrity": "sha512-+s++dbp+/RTte62mQD9wLSbiMTV+xr/PeRJEc/sFZFSBRlHPNPVaf5FXlzAL77Mr8FtSfQqCN+I598M8U41ccQ==", "cpu": [ "arm64" ], @@ -5797,9 +5797,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.1.tgz", - "integrity": "sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==", + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.58.0.tgz", + "integrity": "sha512-MFWBwTcYs0jZbINQBXHfSrpSQJq3IUOakcKPzfeSznONop14Pxuqa0Kg19GD0rNBMPQI2tFtu3UzapZpH0Uc1Q==", "cpu": [ "arm64" ], @@ -5811,9 +5811,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.1.tgz", - "integrity": "sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==", + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.58.0.tgz", + "integrity": "sha512-yiKJY7pj9c9JwzuKYLFaDZw5gma3fI9bkPEIyofvVfsPqjCWPglSHdpdwXpKGvDeYDms3Qal8qGMEHZ1M/4Udg==", "cpu": [ "x64" ], @@ -5825,9 +5825,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.1.tgz", - "integrity": "sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==", + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.58.0.tgz", + "integrity": "sha512-x97kCoBh5MOevpn/CNK9W1x8BEzO238541BGWBc315uOlN0AD/ifZ1msg+ZQB05Ux+VF6EcYqpiagfLJ8U3LvQ==", "cpu": [ "arm64" ], @@ -5839,9 +5839,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.1.tgz", - "integrity": "sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==", + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.58.0.tgz", + "integrity": "sha512-Aa8jPoZ6IQAG2eIrcXPpjRcMjROMFxCt1UYPZZtCxRV68WkuSigYtQ/7Zwrcr2IvtNJo7T2JfDXyMLxq5L4Jlg==", "cpu": [ "x64" ], @@ -5853,9 +5853,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.1.tgz", - "integrity": "sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==", + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.58.0.tgz", + "integrity": "sha512-Ob8YgT5kD/lSIYW2Rcngs5kNB/44Q2RzBSPz9brf2WEtcGR7/f/E9HeHn1wYaAwKBni+bdXEwgHvUd0x12lQSA==", "cpu": [ "arm" ], @@ -5867,9 +5867,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.1.tgz", - "integrity": "sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==", + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.58.0.tgz", + "integrity": "sha512-K+RI5oP1ceqoadvNt1FecL17Qtw/n9BgRSzxif3rTL2QlIu88ccvY+Y9nnHe/cmT5zbH9+bpiJuG1mGHRVwF4Q==", "cpu": [ "arm" ], @@ -5881,9 +5881,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.1.tgz", - "integrity": "sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==", + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.58.0.tgz", + "integrity": "sha512-T+17JAsCKUjmbopcKepJjHWHXSjeW7O5PL7lEFaeQmiVyw4kkc5/lyYKzrv6ElWRX/MrEWfPiJWqbTvfIvjM1Q==", "cpu": [ "arm64" ], @@ -5895,9 +5895,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.1.tgz", - "integrity": "sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==", + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.58.0.tgz", + "integrity": "sha512-cCePktb9+6R9itIJdeCFF9txPU7pQeEHB5AbHu/MKsfH/k70ZtOeq1k4YAtBv9Z7mmKI5/wOLYjQ+B9QdxR6LA==", "cpu": [ "arm64" ], @@ -5909,9 +5909,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.1.tgz", - "integrity": "sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==", + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.58.0.tgz", + "integrity": "sha512-iekUaLkfliAsDl4/xSdoCJ1gnnIXvoNz85C8U8+ZxknM5pBStfZjeXgB8lXobDQvvPRCN8FPmmuTtH+z95HTmg==", "cpu": [ "loong64" ], @@ -5923,9 +5923,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.1.tgz", - "integrity": "sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==", + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.58.0.tgz", + "integrity": "sha512-68ofRgJNl/jYJbxFjCKE7IwhbfxOl1muPN4KbIqAIe32lm22KmU7E8OPvyy68HTNkI2iV/c8y2kSPSm2mW/Q9Q==", "cpu": [ "loong64" ], @@ -5937,9 +5937,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.1.tgz", - "integrity": "sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==", + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.58.0.tgz", + "integrity": "sha512-dpz8vT0i+JqUKuSNPCP5SYyIV2Lh0sNL1+FhM7eLC457d5B9/BC3kDPp5BBftMmTNsBarcPcoz5UGSsnCiw4XQ==", "cpu": [ "ppc64" ], @@ -5951,9 +5951,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.1.tgz", - "integrity": "sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==", + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.58.0.tgz", + "integrity": "sha512-4gdkkf9UJ7tafnweBCR/mk4jf3Jfl0cKX9Np80t5i78kjIH0ZdezUv/JDI2VtruE5lunfACqftJ8dIMGN4oHew==", "cpu": [ "ppc64" ], @@ -5965,9 +5965,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.1.tgz", - "integrity": "sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==", + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.58.0.tgz", + "integrity": "sha512-YFS4vPnOkDTD/JriUeeZurFYoJhPf9GQQEF/v4lltp3mVcBmnsAdjEWhr2cjUCZzZNzxCG0HZOvJU44UGHSdzw==", "cpu": [ "riscv64" ], @@ -5979,9 +5979,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.1.tgz", - "integrity": "sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==", + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.58.0.tgz", + "integrity": "sha512-x2xgZlFne+QVNKV8b4wwaCS8pwq3y14zedZ5DqLzjdRITvreBk//4Knbcvm7+lWmms9V9qFp60MtUd0/t/PXPw==", "cpu": [ "riscv64" ], @@ -5993,9 +5993,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.1.tgz", - "integrity": "sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==", + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.58.0.tgz", + "integrity": "sha512-jIhrujyn4UnWF8S+DHSkAkDEO3hLX0cjzxJZPLF80xFyzyUIYgSMRcYQ3+uqEoyDD2beGq7Dj7edi8OnJcS/hg==", "cpu": [ "s390x" ], @@ -6007,9 +6007,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.1.tgz", - "integrity": "sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==", + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.58.0.tgz", + "integrity": "sha512-+410Srdoh78MKSJxTQ+hZ/Mx+ajd6RjjPwBPNd0R3J9FtL6ZA0GqiiyNjCO9In0IzZkCNrpGymSfn+kgyPQocg==", "cpu": [ "x64" ], @@ -6021,9 +6021,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.1.tgz", - "integrity": "sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==", + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.58.0.tgz", + "integrity": "sha512-ZjMyby5SICi227y1MTR3VYBpFTdZs823Rs/hpakufleBoufoOIB6jtm9FEoxn/cgO7l6PM2rCEl5Kre5vX0QrQ==", "cpu": [ "x64" ], @@ -6035,9 +6035,9 @@ ] }, "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.1.tgz", - "integrity": "sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==", + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.58.0.tgz", + "integrity": "sha512-ds4iwfYkSQ0k1nb8LTcyXw//ToHOnNTJtceySpL3fa7tc/AsE+UpUFphW126A6fKBGJD5dhRvg8zw1rvoGFxmw==", "cpu": [ "x64" ], @@ -6049,9 +6049,9 @@ ] }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.1.tgz", - "integrity": "sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==", + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.58.0.tgz", + "integrity": "sha512-fd/zpJniln4ICdPkjWFhZYeY/bpnaN9pGa6ko+5WD38I0tTqk9lXMgXZg09MNdhpARngmxiCg0B0XUamNw/5BQ==", "cpu": [ "arm64" ], @@ -6063,9 +6063,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.1.tgz", - "integrity": "sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==", + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.58.0.tgz", + "integrity": "sha512-YpG8dUOip7DCz3nr/JUfPbIUo+2d/dy++5bFzgi4ugOGBIox+qMbbqt/JoORwvI/C9Kn2tz6+Bieoqd5+B1CjA==", "cpu": [ "arm64" ], @@ -6077,9 +6077,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.1.tgz", - "integrity": "sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==", + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.58.0.tgz", + "integrity": "sha512-b9DI8jpFQVh4hIXFr0/+N/TzLdpBIoPzjt0Rt4xJbW3mzguV3mduR9cNgiuFcuL/TeORejJhCWiAXe3E/6PxWA==", "cpu": [ "ia32" ], @@ -6091,9 +6091,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.1.tgz", - "integrity": "sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==", + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.58.0.tgz", + "integrity": "sha512-CSrVpmoRJFN06LL9xhkitkwUcTZtIotYAF5p6XOR2zW0Zz5mzb3IPpcoPhB02frzMHFNo1reQ9xSF5fFm3hUsQ==", "cpu": [ "x64" ], @@ -6105,9 +6105,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.1.tgz", - "integrity": "sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==", + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.58.0.tgz", + "integrity": "sha512-QFsBgQNTnh5K0t/sBsjJLq24YVqEIVkGpfN2VHsnN90soZyhaiA9UUHufcctVNL4ypJY0wrwad0wslx2KJQ1/w==", "cpu": [ "x64" ], @@ -6323,16 +6323,16 @@ } }, "node_modules/@tufjs/models/node_modules/minimatch": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.1.tgz", - "integrity": "sha512-MClCe8IL5nRRmawL6ib/eT4oLyeKMGCghibcDWK+J0hh0Q8kqSdia6BvbRMVk6mPa6WqUa5uR2oxt6C5jd533A==", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.2.tgz", + "integrity": "sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "brace-expansion": "^5.0.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -6559,13 +6559,13 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "25.2.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.2.3.tgz", - "integrity": "sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ==", + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.3.0.tgz", + "integrity": "sha512-4K3bqJpXpqfg2XKGK9bpDTc6xO/xoUP/RBWS7AtRMug6zZFaRekiLzjVtAoZMquxoAbzBvy5nxQ7veS5eYzf8A==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~7.16.0" + "undici-types": "~7.18.0" } }, "node_modules/@types/node-forge": { @@ -6883,9 +6883,9 @@ } }, "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.0.tgz", - "integrity": "sha512-A0XeIi7CXU7nPlfHS9loMYEKxUaONu/hTEzHTGba9Huu94Cq1hPivf+DE5erJozZOky0LfvXAyrV/tcswpLI0Q==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -7397,9 +7397,9 @@ } }, "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "dev": true, "license": "MIT", "bin": { @@ -8005,12 +8005,15 @@ } }, "node_modules/baseline-browser-mapping": { - "version": "2.9.19", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", - "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz", + "integrity": "sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==", "license": "Apache-2.0", "bin": { - "baseline-browser-mapping": "dist/cli.js" + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" } }, "node_modules/batch": { @@ -8261,18 +8264,18 @@ } }, "node_modules/cacache/node_modules/glob": { - "version": "13.0.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.5.tgz", - "integrity": "sha512-BzXxZg24Ibra1pbQ/zE7Kys4Ua1ks7Bn6pKLkVPZ9FZe4JQS6/Q7ef3LG1H+k7lUf5l4T3PLSyYyYJVYUvfgTw==", + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "minimatch": "^10.2.1", - "minipass": "^7.1.2", - "path-scurry": "^2.0.0" + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -8289,16 +8292,16 @@ } }, "node_modules/cacache/node_modules/minimatch": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.1.tgz", - "integrity": "sha512-MClCe8IL5nRRmawL6ib/eT4oLyeKMGCghibcDWK+J0hh0Q8kqSdia6BvbRMVk6mPa6WqUa5uR2oxt6C5jd533A==", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.2.tgz", + "integrity": "sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "brace-expansion": "^5.0.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -9487,9 +9490,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.286", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz", - "integrity": "sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==", + "version": "1.5.302", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.302.tgz", + "integrity": "sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg==", "license": "ISC" }, "node_modules/emoji-regex": { @@ -9988,9 +9991,9 @@ } }, "node_modules/eslint": { - "version": "9.39.2", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", - "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", + "version": "9.39.3", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.3.tgz", + "integrity": "sha512-VmQ+sifHUbI/IcSopBCF/HO3YiHQx/AVd3UVyYL6weuwW+HvON9VYn5l6Zl1WZzPWXPNZrSQpxwkkZ/VuvJZzg==", "dev": true, "license": "MIT", "dependencies": { @@ -10000,7 +10003,7 @@ "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.39.2", + "@eslint/js": "9.39.3", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", @@ -10594,9 +10597,9 @@ } }, "node_modules/eslint/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "dev": true, "license": "MIT", "dependencies": { @@ -11564,9 +11567,9 @@ } }, "node_modules/hono": { - "version": "4.11.10", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.11.10.tgz", - "integrity": "sha512-kyWP5PAiMooEvGrA9jcD3IXF7ATu8+o7B3KCbPXid5se52NPqnOpM/r9qeW2heMnOekF4kqR1fXJqCYeCLKrZg==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.0.tgz", + "integrity": "sha512-NekXntS5M94pUfiVZ8oXXK/kkri+5WpX2/Ik+LVsl+uvw+soj4roXIsPqO+XsWrAw20mOzaXOZf3Q7PfB9A/IA==", "dev": true, "license": "MIT", "engines": { @@ -11879,16 +11882,16 @@ } }, "node_modules/ignore-walk/node_modules/minimatch": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.1.tgz", - "integrity": "sha512-MClCe8IL5nRRmawL6ib/eT4oLyeKMGCghibcDWK+J0hh0Q8kqSdia6BvbRMVk6mPa6WqUa5uR2oxt6C5jd533A==", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.2.tgz", + "integrity": "sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "brace-expansion": "^5.0.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -14201,11 +14204,11 @@ } }, "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "engines": { "node": ">=16 || 14 >=14.17" } @@ -14734,9 +14737,9 @@ } }, "node_modules/npm-packlist": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-10.0.3.tgz", - "integrity": "sha512-zPukTwJMOu5X5uvm0fztwS5Zxyvmk38H/LfidkOMt3gbZVCyro2cD/ETzwzVPcWZA3JOyPznfUN/nkyFiyUbxg==", + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-10.0.4.tgz", + "integrity": "sha512-uMW73iajD8hiH4ZBxEV3HC+eTnppIqwakjOYuvgddnalIw2lJguKviK1pcUJDlIWm1wSJkchpDZDSVVsZEYRng==", "dev": true, "license": "ISC", "dependencies": { @@ -15489,9 +15492,9 @@ "license": "MIT" }, "node_modules/path-scurry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", - "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -15499,7 +15502,7 @@ "minipass": "^7.1.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -16292,9 +16295,9 @@ } }, "node_modules/rollup": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.57.1.tgz", - "integrity": "sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==", + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.58.0.tgz", + "integrity": "sha512-wbT0mBmWbIvvq8NeEYWWvevvxnOyhKChir47S66WCxw1SXqhw7ssIYejnQEVt7XYQpsj2y8F9PM+Cr3SNEa0gw==", "dev": true, "license": "MIT", "dependencies": { @@ -16308,31 +16311,31 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.57.1", - "@rollup/rollup-android-arm64": "4.57.1", - "@rollup/rollup-darwin-arm64": "4.57.1", - "@rollup/rollup-darwin-x64": "4.57.1", - "@rollup/rollup-freebsd-arm64": "4.57.1", - "@rollup/rollup-freebsd-x64": "4.57.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.57.1", - "@rollup/rollup-linux-arm-musleabihf": "4.57.1", - "@rollup/rollup-linux-arm64-gnu": "4.57.1", - "@rollup/rollup-linux-arm64-musl": "4.57.1", - "@rollup/rollup-linux-loong64-gnu": "4.57.1", - "@rollup/rollup-linux-loong64-musl": "4.57.1", - "@rollup/rollup-linux-ppc64-gnu": "4.57.1", - "@rollup/rollup-linux-ppc64-musl": "4.57.1", - "@rollup/rollup-linux-riscv64-gnu": "4.57.1", - "@rollup/rollup-linux-riscv64-musl": "4.57.1", - "@rollup/rollup-linux-s390x-gnu": "4.57.1", - "@rollup/rollup-linux-x64-gnu": "4.57.1", - "@rollup/rollup-linux-x64-musl": "4.57.1", - "@rollup/rollup-openbsd-x64": "4.57.1", - "@rollup/rollup-openharmony-arm64": "4.57.1", - "@rollup/rollup-win32-arm64-msvc": "4.57.1", - "@rollup/rollup-win32-ia32-msvc": "4.57.1", - "@rollup/rollup-win32-x64-gnu": "4.57.1", - "@rollup/rollup-win32-x64-msvc": "4.57.1", + "@rollup/rollup-android-arm-eabi": "4.58.0", + "@rollup/rollup-android-arm64": "4.58.0", + "@rollup/rollup-darwin-arm64": "4.58.0", + "@rollup/rollup-darwin-x64": "4.58.0", + "@rollup/rollup-freebsd-arm64": "4.58.0", + "@rollup/rollup-freebsd-x64": "4.58.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.58.0", + "@rollup/rollup-linux-arm-musleabihf": "4.58.0", + "@rollup/rollup-linux-arm64-gnu": "4.58.0", + "@rollup/rollup-linux-arm64-musl": "4.58.0", + "@rollup/rollup-linux-loong64-gnu": "4.58.0", + "@rollup/rollup-linux-loong64-musl": "4.58.0", + "@rollup/rollup-linux-ppc64-gnu": "4.58.0", + "@rollup/rollup-linux-ppc64-musl": "4.58.0", + "@rollup/rollup-linux-riscv64-gnu": "4.58.0", + "@rollup/rollup-linux-riscv64-musl": "4.58.0", + "@rollup/rollup-linux-s390x-gnu": "4.58.0", + "@rollup/rollup-linux-x64-gnu": "4.58.0", + "@rollup/rollup-linux-x64-musl": "4.58.0", + "@rollup/rollup-openbsd-x64": "4.58.0", + "@rollup/rollup-openharmony-arm64": "4.58.0", + "@rollup/rollup-win32-arm64-msvc": "4.58.0", + "@rollup/rollup-win32-ia32-msvc": "4.58.0", + "@rollup/rollup-win32-x64-gnu": "4.58.0", + "@rollup/rollup-win32-x64-msvc": "4.58.0", "fsevents": "~2.3.2" } }, @@ -17306,17 +17309,6 @@ "node": ">=0.10.0" } }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, "node_modules/spdx-exceptions": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", @@ -17325,9 +17317,9 @@ "license": "CC-BY-3.0" }, "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", + "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", "dev": true, "license": "MIT", "dependencies": { @@ -18119,9 +18111,9 @@ } }, "node_modules/undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", "dev": true, "license": "MIT" }, @@ -18347,17 +18339,6 @@ "uuid": "dist/bin/uuid" } }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, "node_modules/validate-npm-package-name": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-7.0.2.tgz", diff --git a/src/REG.Angular/ClientApp/package.json b/src/REG.Angular/ClientApp/package.json index 917c346..85a18e1 100644 --- a/src/REG.Angular/ClientApp/package.json +++ b/src/REG.Angular/ClientApp/package.json @@ -1,6 +1,6 @@ { "name": "reg.angular", - "version": "0.4.12", + "version": "0.4.13", "scripts": { "ng": "ng", "lint": "eslint . --ext .ts", @@ -17,17 +17,17 @@ }, "private": true, "dependencies": { - "@angular/animations": "21.1.4", + "@angular/animations": "21.1.5", "@angular/cdk": "21.1.5", - "@angular/common": "21.1.4", - "@angular/compiler": "21.1.4", - "@angular/core": "21.1.4", - "@angular/forms": "21.1.4", + "@angular/common": "21.1.5", + "@angular/compiler": "21.1.5", + "@angular/core": "21.1.5", + "@angular/forms": "21.1.5", "@angular/material": "21.1.5", - "@angular/platform-browser": "21.1.4", - "@angular/platform-browser-dynamic": "21.1.4", - "@angular/platform-server": "21.1.4", - "@angular/router": "21.1.4", + "@angular/platform-browser": "21.1.5", + "@angular/platform-browser-dynamic": "21.1.5", + "@angular/platform-server": "21.1.5", + "@angular/router": "21.1.5", "@fortawesome/angular-fontawesome": "4.0.0", "@fortawesome/fontawesome-svg-core": "7.2.0", "@fortawesome/free-solid-svg-icons": "7.2.0", @@ -49,15 +49,15 @@ "devDependencies": { "@angular-devkit/build-angular": "21.1.4", "@angular/cli": "21.1.4", - "@angular/compiler-cli": "21.1.4", - "@angular/language-service": "21.1.4", + "@angular/compiler-cli": "21.1.5", + "@angular/language-service": "21.1.5", "@shopify/eslint-plugin": "50.0.0", "@types/jasmine": "6.0.0", "@types/jasminewd2": "2.0.13", - "@types/node": "25.2.3", + "@types/node": "25.3.0", "@typescript-eslint/eslint-plugin": "8.56.0", "@typescript-eslint/parser": "8.56.0", - "eslint": "9.39.2", + "eslint": "9.39.3", "eslint-config-prettier": "10.1.8", "eslint-plugin-prettier": "5.5.5", "jasmine-core": "6.0.1", diff --git a/src/REG.Angular/Controllers/EncounterController.cs b/src/REG.Angular/Controllers/EncounterController.cs index ae5d9c5..d9184dd 100644 --- a/src/REG.Angular/Controllers/EncounterController.cs +++ b/src/REG.Angular/Controllers/EncounterController.cs @@ -22,19 +22,19 @@ public async Task Generate([FromBody] EncounterOption option) } [HttpGet("monstertypes")] - public async Task>> GetMonsterTypes() + public async Task[]> GetMonsterTypes() { return await _encounterService.GetEnumListAsync(); } [HttpGet("difficulties")] - public async Task>> GetDifficulties() + public async Task[]> GetDifficulties() { return await _encounterService.GetEnumListAsync(); } [HttpGet("sizes")] - public async Task>> GetSizes() + public async Task[]> GetSizes() { return await _encounterService.GetEnumListAsync(); } diff --git a/src/REG.Core/Abstractions/Services/IEncounterService.cs b/src/REG.Core/Abstractions/Services/IEncounterService.cs index 933bf7e..663ee1b 100644 --- a/src/REG.Core/Abstractions/Services/IEncounterService.cs +++ b/src/REG.Core/Abstractions/Services/IEncounterService.cs @@ -5,6 +5,6 @@ namespace REG.Core.Abstractions.Services; public interface IEncounterService { Task GenerateAsync(EncounterOption option); - Task>> GetEnumListAsync() where T : struct; - ICollection DeserializeJson(string? jsonFilePath = null); + Task[]> GetEnumListAsync() where T : struct; + List DeserializeJson(string? jsonFilePath = null); } \ No newline at end of file diff --git a/src/REG.Core/Abstractions/Services/Models/EncounterDetail.cs b/src/REG.Core/Abstractions/Services/Models/EncounterDetail.cs index 6b564c4..9cb04d8 100644 --- a/src/REG.Core/Abstractions/Services/Models/EncounterDetail.cs +++ b/src/REG.Core/Abstractions/Services/Models/EncounterDetail.cs @@ -3,42 +3,41 @@ namespace REG.Core.Abstractions.Services.Models; -public class EncounterDetail -{ - public int Xp { get; set; } - public int Count { get; set; } - public required string Name { get; set; } - public required string Type { get; set; } - public required string Difficulty { get; set; } - public required string ChallengeRating { get; set; } - public required string Size { get; set; } - public required string Alignment { get; set; } - public int Hp { get; set; } - public int Ac { get; set; } - public required string HitDice { get; set; } - public required string Speed { get; set; } - public required string Senses { get; set; } - public required string Languages { get; set; } - public int Strength { get; set; } - public int Dexterity { get; set; } - public int Constitution { get; set; } - public int Intelligence { get; set; } - public int Wisdom { get; set; } - public int Charisma { get; set; } - public int StrengthSave { get; set; } - public int DexteritySave { get; set; } - public int ConstitutionSave { get; set; } - public int IntelligenceSave { get; set; } - public int WisdomSave { get; set; } - public int CharismaSave { get; set; } - public int History { get; set; } - public int Perception { get; set; } - public string? DamageVulnerabilities { get; set; } - public string? DamageResistances { get; set; } - public string? DamageImmunities { get; set; } - public string? ConditionImmunities { get; set; } - public List SpecialAbilities { get; set; } = []; - public List Actions { get; set; } = []; - public List LegendaryActions { get; set; } = []; - public List Reactions { get; set; } = []; -} \ No newline at end of file +public record EncounterDetail( + int Xp, + int Count, + string Name, + string Type, + string Difficulty, + string ChallengeRating, + string Size, + string Alignment, + int Hp, + int Ac, + string HitDice, + string Speed, + string Senses, + string Languages, + int Strength, + int Dexterity, + int Constitution, + int Intelligence, + int Wisdom, + int Charisma, + int StrengthSave, + int DexteritySave, + int ConstitutionSave, + int IntelligenceSave, + int WisdomSave, + int CharismaSave, + int History, + int Perception, + string? DamageVulnerabilities, + string? DamageResistances, + string? DamageImmunities, + string? ConditionImmunities, + SpecialAbility[] SpecialAbilities, + Action[] Actions, + LegendaryAction[] LegendaryActions, + Reaction[] Reactions +); \ No newline at end of file diff --git a/src/REG.Core/Abstractions/Services/Models/EncounterModel.cs b/src/REG.Core/Abstractions/Services/Models/EncounterModel.cs index ea9f06d..c105c57 100644 --- a/src/REG.Core/Abstractions/Services/Models/EncounterModel.cs +++ b/src/REG.Core/Abstractions/Services/Models/EncounterModel.cs @@ -1,7 +1,7 @@ namespace REG.Core.Abstractions.Services.Models; -public class EncounterModel -{ - public int SumXp { get; set; } - public List Encounters { get; set; } = []; -} \ No newline at end of file +public record EncounterModel +( + EncounterDetail[] Encounters, + int SumXp +); \ No newline at end of file diff --git a/src/REG.Core/Abstractions/Services/Models/EncounterOption.cs b/src/REG.Core/Abstractions/Services/Models/EncounterOption.cs index fa26459..301e576 100644 --- a/src/REG.Core/Abstractions/Services/Models/EncounterOption.cs +++ b/src/REG.Core/Abstractions/Services/Models/EncounterOption.cs @@ -2,12 +2,11 @@ namespace REG.Core.Abstractions.Services.Models; -public class EncounterOption -{ - public int PartyLevel { get; set; } - public int PartySize { get; set; } - public Difficulty? Difficulty { get; set; } - public IEnumerable MonsterTypes { get; set; } = []; - public IEnumerable Sizes { get; set; } = []; - public int Count { get; set; } = 10; -} \ No newline at end of file +public record EncounterOption( + int PartyLevel, + int PartySize, + Difficulty? Difficulty, + MonsterType[] MonsterTypes, + Size[] Sizes, + int Count = 10 +); \ No newline at end of file diff --git a/src/REG.Core/Abstractions/Services/Models/Json/Action.cs b/src/REG.Core/Abstractions/Services/Models/Json/Action.cs index c5bc1d7..4d88d5c 100644 --- a/src/REG.Core/Abstractions/Services/Models/Json/Action.cs +++ b/src/REG.Core/Abstractions/Services/Models/Json/Action.cs @@ -2,15 +2,13 @@ namespace REG.Core.Abstractions.Services.Models.Json; -public class Action -{ - [JsonPropertyName("name")] public required string Name { get; set; } - - [JsonPropertyName("desc")] public string? Desc { get; set; } - - [JsonPropertyName("attack_bonus")] public int? AttackBonus { get; set; } - - [JsonPropertyName("damage_dice")] public string? DamageDice { get; set; } - - [JsonPropertyName("damage_bonus")] public int? DamageBonus { get; set; } -} \ No newline at end of file +public record Action( + [property: JsonPropertyName("name")] string Name, + [property: JsonPropertyName("desc")] string? Desc, + [property: JsonPropertyName("attack_bonus")] + int? AttackBonus, + [property: JsonPropertyName("damage_dice")] + string? DamageDice, + [property: JsonPropertyName("damage_bonus")] + int? DamageBonus +); \ No newline at end of file diff --git a/src/REG.Core/Abstractions/Services/Models/Json/LegendaryAction.cs b/src/REG.Core/Abstractions/Services/Models/Json/LegendaryAction.cs index 43ac64d..60fd249 100644 --- a/src/REG.Core/Abstractions/Services/Models/Json/LegendaryAction.cs +++ b/src/REG.Core/Abstractions/Services/Models/Json/LegendaryAction.cs @@ -2,13 +2,9 @@ namespace REG.Core.Abstractions.Services.Models.Json; -public class LegendaryAction -{ - [JsonPropertyName("name")] public required string Name { get; set; } - - [JsonPropertyName("desc")] public string? Desc { get; set; } - - [JsonPropertyName("attack_bonus")] public int? AttackBonus { get; set; } - - [JsonPropertyName("damage_dice")] public string? DamageDice { get; set; } -} \ No newline at end of file +public record LegendaryAction( + [property: JsonPropertyName("name")] string Name, + [property: JsonPropertyName("desc")] string? Desc, + [property: JsonPropertyName("attack_bonus")] int? AttackBonus, + [property: JsonPropertyName("damage_dice")] string? DamageDice +); \ No newline at end of file diff --git a/src/REG.Core/Abstractions/Services/Models/Json/Monster.cs b/src/REG.Core/Abstractions/Services/Models/Json/Monster.cs index 55a323c..6b722e4 100644 --- a/src/REG.Core/Abstractions/Services/Models/Json/Monster.cs +++ b/src/REG.Core/Abstractions/Services/Models/Json/Monster.cs @@ -2,109 +2,93 @@ namespace REG.Core.Abstractions.Services.Models.Json; -public class Monster -{ - [JsonPropertyName("name")] public required string Name { get; set; } - - [JsonPropertyName("size")] public required string Size { get; set; } - - [JsonPropertyName("type")] public required string Type { get; set; } - - [JsonPropertyName("subtype")] public string? Subtype { get; set; } - - [JsonPropertyName("alignment")] public string? Alignment { get; set; } - - [JsonPropertyName("armor_class")] public int? ArmorClass { get; set; } - - [JsonPropertyName("hit_points")] public int? HitPoints { get; set; } - - [JsonPropertyName("hit_dice")] public string? HitDice { get; set; } - - [JsonPropertyName("speed")] public string? Speed { get; set; } - - [JsonPropertyName("strength")] public int? Strength { get; set; } - - [JsonPropertyName("dexterity")] public int? Dexterity { get; set; } - - [JsonPropertyName("constitution")] public int? Constitution { get; set; } - - [JsonPropertyName("intelligence")] public int? Intelligence { get; set; } - - [JsonPropertyName("wisdom")] public int? Wisdom { get; set; } - - [JsonPropertyName("charisma")] public int? Charisma { get; set; } - - [JsonPropertyName("constitution_save")] - public int? ConstitutionSave { get; set; } - - [JsonPropertyName("intelligence_save")] - public int? IntelligenceSave { get; set; } - - [JsonPropertyName("wisdom_save")] public int? WisdomSave { get; set; } - - [JsonPropertyName("history")] public int? History { get; set; } - - [JsonPropertyName("perception")] public int? Perception { get; set; } - - [JsonPropertyName("damage_vulnerabilities")] - public string? DamageVulnerabilities { get; set; } - - [JsonPropertyName("damage_resistances")] - public string? DamageResistances { get; set; } - - [JsonPropertyName("damage_immunities")] - public string? DamageImmunities { get; set; } - - [JsonPropertyName("condition_immunities")] - public string? ConditionImmunities { get; set; } - - [JsonPropertyName("senses")] public string? Senses { get; set; } - - [JsonPropertyName("languages")] public string? Languages { get; set; } - - [JsonPropertyName("challenge_rating")] public required string ChallengeRating { get; set; } - - [JsonPropertyName("special_abilities")] - public List SpecialAbilities { get; set; } = []; - - [JsonPropertyName("actions")] public List Actions { get; set; } = []; - - [JsonPropertyName("legendary_actions")] - public List LegendaryActions { get; set; } = []; - - [JsonPropertyName("medicine")] public int? Medicine { get; set; } - - [JsonPropertyName("religion")] public int? Religion { get; set; } - - [JsonPropertyName("dexterity_save")] public int? DexteritySave { get; set; } - - [JsonPropertyName("charisma_save")] public int? CharismaSave { get; set; } - - [JsonPropertyName("stealth")] public int? Stealth { get; set; } - - [JsonPropertyName("persuasion")] public int? Persuasion { get; set; } - - [JsonPropertyName("insight")] public int? Insight { get; set; } - - [JsonPropertyName("deception")] public int? Deception { get; set; } - - [JsonPropertyName("arcana")] public int? Arcana { get; set; } - - [JsonPropertyName("athletics")] public int? Athletics { get; set; } - - [JsonPropertyName("acrobatics")] public int? Acrobatics { get; set; } - - [JsonPropertyName("strength_save")] public int? StrengthSave { get; set; } - - [JsonPropertyName("reactions")] public List Reactions { get; set; } = []; - - [JsonPropertyName("survival")] public int? Survival { get; set; } - - [JsonPropertyName("investigation")] public int? Investigation { get; set; } - - [JsonPropertyName("nature")] public int? Nature { get; set; } - - [JsonPropertyName("intimidation")] public int? Intimidation { get; set; } - - [JsonPropertyName("performance")] public int? Performance { get; set; } -} \ No newline at end of file +public record Monster( + [property: JsonPropertyName("name")] string Name, + [property: JsonPropertyName("size")] string Size, + [property: JsonPropertyName("type")] string Type, + [property: JsonPropertyName("subtype")] + string? Subtype, + [property: JsonPropertyName("alignment")] + string? Alignment, + [property: JsonPropertyName("armor_class")] + int? ArmorClass, + [property: JsonPropertyName("hit_points")] + int? HitPoints, + [property: JsonPropertyName("hit_dice")] + string? HitDice, + [property: JsonPropertyName("speed")] string? Speed, + [property: JsonPropertyName("strength")] + int? Strength, + [property: JsonPropertyName("dexterity")] + int? Dexterity, + [property: JsonPropertyName("constitution")] + int? Constitution, + [property: JsonPropertyName("intelligence")] + int? Intelligence, + [property: JsonPropertyName("wisdom")] int? Wisdom, + [property: JsonPropertyName("charisma")] + int? Charisma, + [property: JsonPropertyName("constitution_save")] + int? ConstitutionSave, + [property: JsonPropertyName("intelligence_save")] + int? IntelligenceSave, + [property: JsonPropertyName("wisdom_save")] + int? WisdomSave, + [property: JsonPropertyName("history")] + int? History, + [property: JsonPropertyName("perception")] + int? Perception, + [property: JsonPropertyName("damage_vulnerabilities")] + string? DamageVulnerabilities, + [property: JsonPropertyName("damage_resistances")] + string? DamageResistances, + [property: JsonPropertyName("damage_immunities")] + string? DamageImmunities, + [property: JsonPropertyName("condition_immunities")] + string? ConditionImmunities, + [property: JsonPropertyName("senses")] string? Senses, + [property: JsonPropertyName("languages")] + string? Languages, + [property: JsonPropertyName("challenge_rating")] + string ChallengeRating, + [property: JsonPropertyName("special_abilities")] + SpecialAbility[]? SpecialAbilities, + [property: JsonPropertyName("actions")] + Action[]? Actions, + [property: JsonPropertyName("legendary_actions")] + LegendaryAction[]? LegendaryActions, + [property: JsonPropertyName("medicine")] + int? Medicine, + [property: JsonPropertyName("religion")] + int? Religion, + [property: JsonPropertyName("dexterity_save")] + int? DexteritySave, + [property: JsonPropertyName("charisma_save")] + int? CharismaSave, + [property: JsonPropertyName("stealth")] + int? Stealth, + [property: JsonPropertyName("persuasion")] + int? Persuasion, + [property: JsonPropertyName("insight")] + int? Insight, + [property: JsonPropertyName("deception")] + int? Deception, + [property: JsonPropertyName("arcana")] int? Arcana, + [property: JsonPropertyName("athletics")] + int? Athletics, + [property: JsonPropertyName("acrobatics")] + int? Acrobatics, + [property: JsonPropertyName("strength_save")] + int? StrengthSave, + [property: JsonPropertyName("reactions")] + Reaction[]? Reactions, + [property: JsonPropertyName("survival")] + int? Survival, + [property: JsonPropertyName("investigation")] + int? Investigation, + [property: JsonPropertyName("nature")] int? Nature, + [property: JsonPropertyName("intimidation")] + int? Intimidation, + [property: JsonPropertyName("performance")] + int? Performance +); \ No newline at end of file diff --git a/src/REG.Core/Abstractions/Services/Models/Json/Reaction.cs b/src/REG.Core/Abstractions/Services/Models/Json/Reaction.cs index e7f466a..213da67 100644 --- a/src/REG.Core/Abstractions/Services/Models/Json/Reaction.cs +++ b/src/REG.Core/Abstractions/Services/Models/Json/Reaction.cs @@ -2,14 +2,9 @@ namespace REG.Core.Abstractions.Services.Models.Json; -public class Reaction -{ - [JsonPropertyName("name")] - public required string Name { get; set; } - - [JsonPropertyName("desc")] - public string? Desc { get; set; } - - [JsonPropertyName("attack_bonus")] - public int? AttackBonus { get; set; } -} \ No newline at end of file +public record Reaction( + [property: JsonPropertyName("name")] string Name, + [property: JsonPropertyName("desc")] string? Desc, + [property: JsonPropertyName("attack_bonus")] + int? AttackBonus +); \ No newline at end of file diff --git a/src/REG.Core/Abstractions/Services/Models/Json/SpecialAbility.cs b/src/REG.Core/Abstractions/Services/Models/Json/SpecialAbility.cs index d4b88aa..5b8b115 100644 --- a/src/REG.Core/Abstractions/Services/Models/Json/SpecialAbility.cs +++ b/src/REG.Core/Abstractions/Services/Models/Json/SpecialAbility.cs @@ -2,17 +2,11 @@ namespace REG.Core.Abstractions.Services.Models.Json; -public class SpecialAbility -{ - [JsonPropertyName("name")] - public required string Name { get; set; } - - [JsonPropertyName("desc")] - public string? Desc { get; set; } - - [JsonPropertyName("attack_bonus")] - public int? AttackBonus { get; set; } - - [JsonPropertyName("damage_dice")] - public string? DamageDice { get; set; } -} \ No newline at end of file +public record SpecialAbility( + [property: JsonPropertyName("name")] string Name, + [property: JsonPropertyName("desc")] string? Desc, + [property: JsonPropertyName("attack_bonus")] + int? AttackBonus, + [property: JsonPropertyName("damage_dice")] + string? DamageDice +); \ No newline at end of file diff --git a/src/REG.Core/Services/EncounterService.cs b/src/REG.Core/Services/EncounterService.cs index 4ad2e58..e11f7b5 100644 --- a/src/REG.Core/Services/EncounterService.cs +++ b/src/REG.Core/Services/EncounterService.cs @@ -67,7 +67,9 @@ public class EncounterService(ILogger logger) : IEncounterServ { 15, 4 } }; - private static readonly List ChallengeRating = + private static readonly int[] MultipliersIndexes = [.. Enumerable.Range(0, Multipliers.GetLength(0))]; + + private static readonly string[] ChallengeRating = [ "0", "1/8", "1/4", "1/2", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", @@ -100,12 +102,12 @@ public class EncounterService(ILogger logger) : IEncounterServ { 2800, 5700, 8500, 12700 } }; - private ICollection _monsters = []; + private List _monsters = []; private int _partyLevel; private int _partySize; - private ICollection> _xpList = []; + private List> _xpList = []; - public async Task>> GetEnumListAsync() where T : struct + public async Task[]> GetEnumListAsync() where T : struct { if (!typeof(T).IsEnum) throw new InvalidOperationException("Type parameter must be Enum."); @@ -114,10 +116,10 @@ public async Task>> GetEnumListAsync() (from object e in Enum.GetValues(typeof(T)) select new KeyValuePair((e as Enum) .GetName(Resources.Enum.ResourceManager), (int)e)) - .ToList()); + .ToArray()); } - public ICollection DeserializeJson(string? jsonFilePath = null) + public List DeserializeJson(string? jsonFilePath = null) { var json = jsonFilePath is not null ? File.ReadAllText(jsonFilePath) @@ -143,13 +145,13 @@ public async Task GenerateAsync(EncounterOption option) var sumXp = CalcSumXp((int)Difficulty.Deadly); var monsterXps = new SortedSet(); - if (option.MonsterTypes.Any()) + if (option.MonsterTypes.Length != 0) { var selectedMonsters = option.MonsterTypes.Select(m => m.ToString().ToLower()); _monsters = [.. _monsters.Where(m => selectedMonsters.Any(m.Type.ToLower().Equals))]; } - if (option.Sizes.Any()) + if (option.Sizes.Length != 0) { var selectedSizes = option.Sizes.Select(s => s.ToString().ToLower()); _monsters = [.. _monsters.Where(m => selectedSizes.Any(m.Size.ToLower().Equals))]; @@ -165,17 +167,17 @@ public async Task GenerateAsync(EncounterOption option) CheckPossible(sumXp, monsterXps); - var result = new EncounterModel(); + var encounterDetails = new List(); var maxTryNumber = 5000; await Task.Run(() => { - while (result.Encounters.Count < option.Count && maxTryNumber > 0) + while (encounterDetails.Count < option.Count && maxTryNumber > 0) { try { var monster = GetMonster(option.Difficulty); if (monster is not null) - result.Encounters.Add(monster); + encounterDetails.Add(monster); maxTryNumber--; } catch (ServiceException) @@ -185,9 +187,7 @@ await Task.Run(() => } }); - result.SumXp = result.Encounters.Sum(ed => ed.Xp); - - return result; + return new EncounterModel([..encounterDetails], encounterDetails.Sum(ed => ed.Xp)); } catch (Exception ex) { @@ -216,7 +216,7 @@ private static void ValidateOption(EncounterOption? option) throw new ServiceAggregateException(exceptions); } - private static void CheckPossible(int sumXp, IReadOnlyCollection monsterXps) + private static void CheckPossible(int sumXp, SortedSet monsterXps) { if (monsterXps.Count != 0 && sumXp > monsterXps.First()) return; @@ -239,19 +239,18 @@ private static int GetRandomInt(int min, int max) { var monsterCount = _monsters.Count; var monster = 0; - var indexes = new List(Enumerable.Range(0, Multipliers.GetLength(0))); while (monster < monsterCount) { var currentMonster = _monsters.ElementAt(GetRandomInt(0, _monsters.Count)); _monsters.Remove(currentMonster); var monsterXp = GetMonsterXp(currentMonster); - indexes.Shuffle(); + MultipliersIndexes.Shuffle(); if (difficulty.HasValue) { var difficultyXp = _xpList.First(l => l.Key == difficulty.Value).Value; - foreach (var i in indexes) + foreach (var i in MultipliersIndexes) { var count = (int)Multipliers[i, 0]; var allXp = monsterXp * count * Multipliers[i, 1]; @@ -264,7 +263,7 @@ private static int GetRandomInt(int min, int max) } else { - foreach (var i in indexes) + foreach (var i in MultipliersIndexes) { var count = (int)Multipliers[i, 0]; var allXp = monsterXp * count * Multipliers[i, 1]; @@ -280,52 +279,59 @@ private static int GetRandomInt(int min, int max) return null; } - private static EncounterDetail GetEncounterDetail(Difficulty difficulty, Monster currentMonster, int allXp, - int count) + private static EncounterDetail GetEncounterDetail( + Difficulty difficulty, + Monster currentMonster, + int allXp, + int count + ) { - var encounterDetail = new EncounterDetail - { - Xp = allXp, - Count = count, - Difficulty = difficulty.GetName(Resources.Enum.ResourceManager), - Size = Enum.Parse(currentMonster.Size).GetName(Resources.Enum.ResourceManager), - Name = currentMonster.Name, - Type = currentMonster.Type, - ChallengeRating = currentMonster.ChallengeRating, - Alignment = currentMonster.Alignment ?? string.Empty, - HitDice = currentMonster.HitDice ?? string.Empty, - Speed = currentMonster.Speed ?? string.Empty, - Senses = currentMonster.Senses ?? string.Empty, - Languages = currentMonster.Languages ?? string.Empty, - Ac = currentMonster.ArmorClass ?? 0, - Actions = currentMonster.Actions, - Charisma = currentMonster.Charisma ?? 0, - CharismaSave = currentMonster.CharismaSave ?? 0, - ConditionImmunities = currentMonster.ConditionImmunities, - Constitution = currentMonster.Constitution ?? 0, - ConstitutionSave = currentMonster.ConstitutionSave ?? 0, - DamageImmunities = currentMonster.DamageImmunities, - DamageResistances = currentMonster.DamageResistances, - DamageVulnerabilities = currentMonster.DamageVulnerabilities, - Dexterity = currentMonster.Dexterity ?? 0, - DexteritySave = currentMonster.DexteritySave ?? 0, - History = currentMonster.History ?? 0, - Hp = currentMonster.HitPoints ?? 0, - Intelligence = currentMonster.Intelligence ?? 0, - IntelligenceSave = currentMonster.IntelligenceSave ?? 0, - LegendaryActions = currentMonster.LegendaryActions, - Perception = currentMonster.Perception ?? 0, - Reactions = currentMonster.Reactions, - SpecialAbilities = currentMonster.SpecialAbilities, - Strength = currentMonster.Strength ?? 0, - StrengthSave = currentMonster.StrengthSave ?? 0, - Wisdom = currentMonster.Wisdom ?? 0, - WisdomSave = currentMonster.WisdomSave ?? 0 - }; - - if (Enum.TryParse(encounterDetail.Type, out MonsterType type)) - encounterDetail.Type = type.GetName(Resources.Enum.ResourceManager); - - return encounterDetail; + return new EncounterDetail + ( + allXp, + count, + currentMonster.Name, + GetTranslation(currentMonster.Type), + difficulty.GetName(Resources.Enum.ResourceManager), + currentMonster.ChallengeRating, + GetTranslation(currentMonster.Size), + currentMonster.Alignment ?? string.Empty, + currentMonster.HitPoints ?? 0, + currentMonster.ArmorClass ?? 0, + currentMonster.HitDice ?? string.Empty, + currentMonster.Speed ?? string.Empty, + currentMonster.Senses ?? string.Empty, + currentMonster.Languages ?? string.Empty, + currentMonster.Strength ?? 0, + currentMonster.Dexterity ?? 0, + currentMonster.Constitution ?? 0, + currentMonster.Intelligence ?? 0, + currentMonster.Wisdom ?? 0, + currentMonster.Charisma ?? 0, + currentMonster.StrengthSave ?? 0, + currentMonster.DexteritySave ?? 0, + currentMonster.ConstitutionSave ?? 0, + currentMonster.IntelligenceSave ?? 0, + currentMonster.WisdomSave ?? 0, + currentMonster.CharismaSave ?? 0, + currentMonster.History ?? 0, + currentMonster.Perception ?? 0, + currentMonster.DamageVulnerabilities, + currentMonster.DamageResistances, + currentMonster.DamageImmunities, + currentMonster.ConditionImmunities, + currentMonster.SpecialAbilities ?? [], + currentMonster.Actions ?? [], + currentMonster.LegendaryActions ?? [], + currentMonster.Reactions ?? [] + ); + } + + private static string GetTranslation(string original) where T : struct, Enum + { + string? translation = null; + if (Enum.TryParse(original, out T type)) + translation = type.GetName(Resources.Enum.ResourceManager); + return translation ?? original; } } \ No newline at end of file diff --git a/tests/REG.Core.Tests/GeneratorServiceTests/EncounterOptionData.cs b/tests/REG.Core.Tests/GeneratorServiceTests/EncounterOptionData.cs index 9e56e92..fab256b 100644 --- a/tests/REG.Core.Tests/GeneratorServiceTests/EncounterOptionData.cs +++ b/tests/REG.Core.Tests/GeneratorServiceTests/EncounterOptionData.cs @@ -9,45 +9,48 @@ public class EncounterOptionData public static TheoryData Data => [ new EncounterOption - { - PartyLevel = 4, - MonsterTypes = [MonsterType.Aberration], - Sizes = [Size.Small, Size.Medium], - PartySize = 3 - }, + ( + 4, + 3, + null, + [MonsterType.Aberration], + [Size.Small, Size.Medium] + ), new EncounterOption - { - PartyLevel = 3, - MonsterTypes = [MonsterType.Ooze, MonsterType.Fey], - Sizes = [Size.Tiny, Size.Small, Size.Medium], - PartySize = 4 - }, + ( + 3, + 4, + null, + [MonsterType.Ooze, MonsterType.Fey], + [Size.Tiny, Size.Small, Size.Medium] + ), new EncounterOption - { - PartyLevel = 4, - MonsterTypes = - [MonsterType.Elemental, MonsterType.Giant, MonsterType.Fiend], - Sizes = [Size.Small, Size.Medium, Size.Large], - PartySize = 5 - }, + ( + 4, + 5, + null, + [MonsterType.Elemental, MonsterType.Giant, MonsterType.Fiend], + [Size.Small, Size.Medium, Size.Large] + ), new EncounterOption - { - PartyLevel = 8, - MonsterTypes = [MonsterType.Beast, MonsterType.Humanoid, MonsterType.Celestial, MonsterType.Dragon], - Sizes = [Size.Medium, Size.Large, Size.Huge], - PartySize = 4 - }, + ( + 8, + 4, + null, + [MonsterType.Beast, MonsterType.Humanoid, MonsterType.Celestial, MonsterType.Dragon], + [Size.Medium, Size.Large, Size.Huge] + ), new EncounterOption - { - PartyLevel = 12, - MonsterTypes = + ( + 12, + 3, + null, [ MonsterType.SwarmOfTinyBeasts, MonsterType.Undead, MonsterType.Construct, MonsterType.Plant, MonsterType.Monstrosity ], - Sizes = [Size.Medium, Size.Large, Size.Huge, Size.Gargantuan], - PartySize = 3 - } + [Size.Medium, Size.Large, Size.Huge, Size.Gargantuan] + ) ]; public static TheoryData FilterWithDifficultyData => diff --git a/tests/REG.Core.Tests/GeneratorServiceTests/Generate.cs b/tests/REG.Core.Tests/GeneratorServiceTests/Generate.cs index c1d727d..a328c8a 100644 --- a/tests/REG.Core.Tests/GeneratorServiceTests/Generate.cs +++ b/tests/REG.Core.Tests/GeneratorServiceTests/Generate.cs @@ -9,36 +9,37 @@ namespace REG.Core.Tests.GeneratorServiceTests; -public class Generate +public class Generate(TestFixture fixture) : IClassFixture { + private readonly IEncounterService _encounterService = fixture.EncounterService; + [Fact] public async Task CanGenerate() { - using var env = new TestEnvironment(); - var service = env.GetService(); - var option = new EncounterOption - { - PartyLevel = 1, - PartySize = 5 - }; + ( + 1, + 5, + null, + [], + [], + 15 + ); - var result = await service.GenerateAsync(option); + var result = await _encounterService.GenerateAsync(option); result.ShouldNotBeNull(); - result.Encounters.Count.ShouldBe(option.Count); + result.Encounters.Length.ShouldBe(option.Count); } [Theory] [MemberData(nameof(EncounterOptionData.Data), MemberType = typeof(EncounterOptionData))] public async Task CanFilter(EncounterOption option) { - using var env = new TestEnvironment(); - var service = env.GetService(); - var encounterModel = await service.GenerateAsync(option); + var encounterModel = await _encounterService.GenerateAsync(option); encounterModel.ShouldNotBeNull(); - encounterModel.Encounters.ShouldNotBeNull(); + encounterModel.Encounters.ShouldNotBeEmpty(); var resultMonsterTypes = encounterModel.Encounters.Select(ed => ed.Type.ToLower()).Distinct(); var resultMonsterSizes = encounterModel.Encounters.Select(ed => ed.Size.ToLower()).Distinct(); var optionMonsterTypes = option.MonsterTypes.Select(m => m.GetName(Resources.Enum.ResourceManager).ToLower()); @@ -51,48 +52,41 @@ public async Task CanFilter(EncounterOption option) [MemberData(nameof(EncounterOptionData.FilterWithDifficultyData), MemberType = typeof(EncounterOptionData))] public async Task CanFilterWithDifficulty(Difficulty difficulty, int partyLevel, int partySize) { - using var env = new TestEnvironment(); - var service = env.GetService(); - var option = new EncounterOption - { - PartyLevel = partyLevel, - MonsterTypes = [MonsterType.Beast, MonsterType.Humanoid, MonsterType.SwarmOfTinyBeasts], - PartySize = partySize, - Difficulty = difficulty - }; + ( + partyLevel, + partySize, + difficulty, + [MonsterType.Beast, MonsterType.Humanoid, MonsterType.SwarmOfTinyBeasts], + [] + ); - var encounterModel = await service.GenerateAsync(option); + var encounterModel = await _encounterService.GenerateAsync(option); encounterModel.ShouldNotBeNull(); - encounterModel.Encounters.ShouldNotBeNull(); - encounterModel.Encounters.TrueForAll(e => e.Difficulty.Equals(difficulty.ToString())).ShouldBeTrue(); + encounterModel.Encounters.ShouldNotBeEmpty(); + encounterModel.Encounters.ShouldAllBe(e => e.Difficulty.Equals(difficulty.ToString())); } [Fact] public async Task CanThrowException() { - using var env = new TestEnvironment(); - var service = env.GetService(); - var option = new EncounterOption - { - PartyLevel = 1, - PartySize = 1, - MonsterTypes = [MonsterType.Dragon], - Difficulty = Difficulty.Easy - }; - - await Should.ThrowAsync(async () => { await service.GenerateAsync(option); }); + ( + 1, + 1, + Difficulty.Easy, + [MonsterType.Dragon], + [] + ); + + await Should.ThrowAsync(async () => { await _encounterService.GenerateAsync(option); }); } [Fact] public void CanDeserializeJson() { - using var env = new TestEnvironment(); - var service = env.GetService(); - - var result = service.DeserializeJson(); + var result = _encounterService.DeserializeJson(); result.ShouldNotBeNull(); result.Count.ShouldBeGreaterThan(0); diff --git a/tests/REG.Core.Tests/TestFixture.cs b/tests/REG.Core.Tests/TestFixture.cs new file mode 100644 index 0000000..b7c8c2d --- /dev/null +++ b/tests/REG.Core.Tests/TestFixture.cs @@ -0,0 +1,38 @@ +using REG.Core.Abstractions.Services; + +namespace REG.Core.Tests; + +public class TestFixture : IDisposable +{ + private readonly TestEnvironment _env = new(); + private bool _disposedValue; + public readonly IEncounterService EncounterService; + + public TestFixture() + { + EncounterService = _env.GetService(); + } + + protected virtual void Dispose(bool disposing) + { + if (_disposedValue) + return; + if (disposing) + { + _env.Dispose(); + } + + _disposedValue = true; + } + + ~TestFixture() + { + Dispose(disposing: false); + } + + public void Dispose() + { + Dispose(disposing: true); + GC.SuppressFinalize(this); + } +} \ No newline at end of file