diff --git a/angular.json b/angular.json index 4840ea2..e66e8d0 100644 --- a/angular.json +++ b/angular.json @@ -31,6 +31,7 @@ "src/assets" ], "styles": [ + "@angular/material/prebuilt-themes/azure-blue.css", "src/styles.scss" ], "scripts": [], @@ -93,6 +94,7 @@ "src/assets" ], "styles": [ + "@angular/material/prebuilt-themes/azure-blue.css", "src/styles.scss" ], "scripts": [] diff --git a/package-lock.json b/package-lock.json index 84dd6d0..88d8e76 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,14 +9,20 @@ "version": "0.0.0", "dependencies": { "@angular/animations": "^18.1.0", + "@angular/cdk": "^18.1.2", "@angular/common": "^18.1.0", "@angular/compiler": "^18.1.0", "@angular/core": "^18.1.0", "@angular/forms": "^18.1.0", + "@angular/material": "^18.1.2", "@angular/platform-browser": "^18.1.0", "@angular/platform-browser-dynamic": "^18.1.0", "@angular/router": "^18.1.0", "@ngneat/falso": "^6.2.0", + "@ngrx/effects": "^18.0.1", + "@ngrx/router-store": "^18.0.1", + "@ngrx/store": "^18.0.1", + "@ngrx/store-devtools": "^18.0.1", "rxjs": "~7.5.0", "tslib": "^2.3.0", "zone.js": "~0.14.7" @@ -25,7 +31,9 @@ "@angular-devkit/build-angular": "^18.1.0", "@angular/cli": "~18.1.0", "@angular/compiler-cli": "^18.1.0", + "@hirez_io/observer-spy": "^2.2.0", "@types/jasmine": "~4.3.0", + "jasmine-auto-spies": "^8.0.1", "jasmine-core": "~4.5.0", "karma": "~6.4.0", "karma-chrome-launcher": "~3.1.0", @@ -697,6 +705,22 @@ "fsevents": "~2.3.2" } }, + "node_modules/@angular/cdk": { + "version": "18.1.2", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-18.1.2.tgz", + "integrity": "sha512-yiAJ/9AMVF2zk7VLEuyJxNJwpV84xLlf0zCaXiYIs6Z8xU6m8N9KR2nqxC59gQc4nTjItmoO/Sgk7XH0X4yGOQ==", + "dependencies": { + "tslib": "^2.3.0" + }, + "optionalDependencies": { + "parse5": "^7.1.2" + }, + "peerDependencies": { + "@angular/common": "^18.0.0 || ^19.0.0", + "@angular/core": "^18.0.0 || ^19.0.0", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, "node_modules/@angular/cli": { "version": "18.1.0", "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-18.1.0.tgz", @@ -824,6 +848,23 @@ "rxjs": "^6.5.3 || ^7.4.0" } }, + "node_modules/@angular/material": { + "version": "18.1.2", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-18.1.2.tgz", + "integrity": "sha512-B56pofk3WMqqtNww2W33KRbAu69c+aGYFdNFW45DcdIw9OKV1x/HjhyEchSrUOPOXgJFVTYw2HRhp327ONpetw==", + "dependencies": { + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/animations": "^18.0.0 || ^19.0.0", + "@angular/cdk": "18.1.2", + "@angular/common": "^18.0.0 || ^19.0.0", + "@angular/core": "^18.0.0 || ^19.0.0", + "@angular/forms": "^18.0.0 || ^19.0.0", + "@angular/platform-browser": "^18.0.0 || ^19.0.0", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, "node_modules/@angular/platform-browser": { "version": "18.1.0", "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-18.1.0.tgz", @@ -3024,6 +3065,29 @@ "node": ">=12" } }, + "node_modules/@hirez_io/auto-spies-core": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@hirez_io/auto-spies-core/-/auto-spies-core-3.0.0.tgz", + "integrity": "sha512-au7s7/AqPU5CJhv0slVjmZqEv5Uaf2nj7pYFepp5g3B7EocEeNy7bZ74x5RJldHYtW0R8OptV2mZfwaDOfcNCA==", + "dev": true, + "dependencies": { + "javascript-stringify": "2.1.0" + }, + "peerDependencies": { + "rxjs": ">=6.0.0 < 8", + "typescript": ">=2.8.1" + } + }, + "node_modules/@hirez_io/observer-spy": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@hirez_io/observer-spy/-/observer-spy-2.2.0.tgz", + "integrity": "sha512-G9nv87vjRILgB/X1AtKBv1DZX7yXSYAOCXon/f+QULKoXVhVehYUF5Lv0SQ97ebf1sA48Z2CyQ9h2v4Pz6DgaQ==", + "dev": true, + "peerDependencies": { + "rxjs": ">=6.0.0", + "typescript": ">=2.8.1" + } + }, "node_modules/@inquirer/checkbox": { "version": "2.3.10", "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-2.3.10.tgz", @@ -4245,6 +4309,70 @@ "uuid": "8.3.2" } }, + "node_modules/@ngrx/effects": { + "version": "18.0.1", + "resolved": "https://registry.npmjs.org/@ngrx/effects/-/effects-18.0.1.tgz", + "integrity": "sha512-ESxJYx31uABixtnWcuDY+HLKyqXKABpPG3LPDMyZrj7lIdjCaTk471QMhRZOme8QQKzlJt0drGfzFo3FM+QYuA==", + "dependencies": { + "@ngrx/operators": "18.0.1", + "tslib": "^2.0.0" + }, + "peerDependencies": { + "@angular/core": "^18.0.0", + "@ngrx/store": "18.0.1", + "rxjs": "^6.5.3 || ^7.5.0" + } + }, + "node_modules/@ngrx/operators": { + "version": "18.0.1", + "resolved": "https://registry.npmjs.org/@ngrx/operators/-/operators-18.0.1.tgz", + "integrity": "sha512-M+QMrHNKgcuiLaRGZxJ4aQi5/OCRfKC4+T/63dsHyLFZ53/FFpF6a/ytSO1Q+tzOplZ5o99S+i8FVaZqNQ3LmQ==", + "dependencies": { + "tslib": "^2.3.0" + }, + "peerDependencies": { + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@ngrx/router-store": { + "version": "18.0.1", + "resolved": "https://registry.npmjs.org/@ngrx/router-store/-/router-store-18.0.1.tgz", + "integrity": "sha512-OrgM6DkYOES7S/NQilxbTk5xtfZTrD3hlM2CsB4TBbV6zvOW0F8HpazcXffFXi9T9y34W1Y4pMzpKHoMTIHF/g==", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "@angular/common": "^18.0.0", + "@angular/core": "^18.0.0", + "@angular/router": "^18.0.0", + "@ngrx/store": "18.0.1", + "rxjs": "^6.5.3 || ^7.5.0" + } + }, + "node_modules/@ngrx/store": { + "version": "18.0.1", + "resolved": "https://registry.npmjs.org/@ngrx/store/-/store-18.0.1.tgz", + "integrity": "sha512-TxZiQz06fGSxQ0clYfzkH4NCr6tfa8A7zqzkvvOOK1ZezOHHsk0vZJJtgxQcKUqAQxPpbp5+Z7YR8P/Fuid7GQ==", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "@angular/core": "^18.0.0", + "rxjs": "^6.5.3 || ^7.5.0" + } + }, + "node_modules/@ngrx/store-devtools": { + "version": "18.0.1", + "resolved": "https://registry.npmjs.org/@ngrx/store-devtools/-/store-devtools-18.0.1.tgz", + "integrity": "sha512-necHUUcLd41mpObOSuyGQSVyDq4Tb+uejG16WmA6VwXufaUqEl385aumKiS1KLtUP8TQQzogaogaMMDtqtznsQ==", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "@ngrx/store": "18.0.1", + "rxjs": "^6.5.3 || ^7.5.0" + } + }, "node_modules/@ngtools/webpack": { "version": "18.1.0", "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-18.1.0.tgz", @@ -6951,7 +7079,7 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, + "devOptional": true, "engines": { "node": ">=0.12" }, @@ -8542,12 +8670,32 @@ "@pkgjs/parseargs": "^0.11.0" } }, + "node_modules/jasmine-auto-spies": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/jasmine-auto-spies/-/jasmine-auto-spies-8.0.1.tgz", + "integrity": "sha512-4T8YVS6VJ7VoCdAOqEh3sziD6Wf/m+dfGGQ1a7GZHqjZUjaSD0Be+KqP7CmTiBc3HrX+uvOXr380QIW+TfHhqA==", + "dev": true, + "dependencies": { + "@hirez_io/auto-spies-core": "3.0.0" + }, + "peerDependencies": { + "jasmine-core": ">=2.6.0 < 6", + "rxjs": ">=6.0.0 < 8", + "typescript": ">=2.8.1" + } + }, "node_modules/jasmine-core": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.5.0.tgz", "integrity": "sha512-9PMzyvhtocxb3aXJVOPqBDswdgyAeSB81QnLop4npOpbqnheaTEwPc9ZloQeVswugPManznQBjD8kWDTjlnHuw==", "dev": true }, + "node_modules/javascript-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.1.0.tgz", + "integrity": "sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==", + "dev": true + }, "node_modules/jest-worker": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", @@ -10578,6 +10726,18 @@ "node": ">= 0.10" } }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "devOptional": true, + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, "node_modules/parse5-html-rewriting-stream": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.0.0.tgz", @@ -10592,18 +10752,6 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/parse5-html-rewriting-stream/node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "dev": true, - "dependencies": { - "entities": "^4.4.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, "node_modules/parse5-sax-parser": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz", @@ -10616,18 +10764,6 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/parse5-sax-parser/node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "dev": true, - "dependencies": { - "entities": "^4.4.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -13894,6 +14030,15 @@ } } }, + "@angular/cdk": { + "version": "18.1.2", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-18.1.2.tgz", + "integrity": "sha512-yiAJ/9AMVF2zk7VLEuyJxNJwpV84xLlf0zCaXiYIs6Z8xU6m8N9KR2nqxC59gQc4nTjItmoO/Sgk7XH0X4yGOQ==", + "requires": { + "parse5": "^7.1.2", + "tslib": "^2.3.0" + } + }, "@angular/cli": { "version": "18.1.0", "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-18.1.0.tgz", @@ -13967,6 +14112,14 @@ "tslib": "^2.3.0" } }, + "@angular/material": { + "version": "18.1.2", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-18.1.2.tgz", + "integrity": "sha512-B56pofk3WMqqtNww2W33KRbAu69c+aGYFdNFW45DcdIw9OKV1x/HjhyEchSrUOPOXgJFVTYw2HRhp327ONpetw==", + "requires": { + "tslib": "^2.3.0" + } + }, "@angular/platform-browser": { "version": "18.1.0", "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-18.1.0.tgz", @@ -15389,6 +15542,22 @@ "dev": true, "optional": true }, + "@hirez_io/auto-spies-core": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@hirez_io/auto-spies-core/-/auto-spies-core-3.0.0.tgz", + "integrity": "sha512-au7s7/AqPU5CJhv0slVjmZqEv5Uaf2nj7pYFepp5g3B7EocEeNy7bZ74x5RJldHYtW0R8OptV2mZfwaDOfcNCA==", + "dev": true, + "requires": { + "javascript-stringify": "2.1.0" + } + }, + "@hirez_io/observer-spy": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@hirez_io/observer-spy/-/observer-spy-2.2.0.tgz", + "integrity": "sha512-G9nv87vjRILgB/X1AtKBv1DZX7yXSYAOCXon/f+QULKoXVhVehYUF5Lv0SQ97ebf1sA48Z2CyQ9h2v4Pz6DgaQ==", + "dev": true, + "requires": {} + }, "@inquirer/checkbox": { "version": "2.3.10", "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-2.3.10.tgz", @@ -16276,6 +16445,47 @@ "uuid": "8.3.2" } }, + "@ngrx/effects": { + "version": "18.0.1", + "resolved": "https://registry.npmjs.org/@ngrx/effects/-/effects-18.0.1.tgz", + "integrity": "sha512-ESxJYx31uABixtnWcuDY+HLKyqXKABpPG3LPDMyZrj7lIdjCaTk471QMhRZOme8QQKzlJt0drGfzFo3FM+QYuA==", + "requires": { + "@ngrx/operators": "18.0.1", + "tslib": "^2.0.0" + } + }, + "@ngrx/operators": { + "version": "18.0.1", + "resolved": "https://registry.npmjs.org/@ngrx/operators/-/operators-18.0.1.tgz", + "integrity": "sha512-M+QMrHNKgcuiLaRGZxJ4aQi5/OCRfKC4+T/63dsHyLFZ53/FFpF6a/ytSO1Q+tzOplZ5o99S+i8FVaZqNQ3LmQ==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@ngrx/router-store": { + "version": "18.0.1", + "resolved": "https://registry.npmjs.org/@ngrx/router-store/-/router-store-18.0.1.tgz", + "integrity": "sha512-OrgM6DkYOES7S/NQilxbTk5xtfZTrD3hlM2CsB4TBbV6zvOW0F8HpazcXffFXi9T9y34W1Y4pMzpKHoMTIHF/g==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@ngrx/store": { + "version": "18.0.1", + "resolved": "https://registry.npmjs.org/@ngrx/store/-/store-18.0.1.tgz", + "integrity": "sha512-TxZiQz06fGSxQ0clYfzkH4NCr6tfa8A7zqzkvvOOK1ZezOHHsk0vZJJtgxQcKUqAQxPpbp5+Z7YR8P/Fuid7GQ==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@ngrx/store-devtools": { + "version": "18.0.1", + "resolved": "https://registry.npmjs.org/@ngrx/store-devtools/-/store-devtools-18.0.1.tgz", + "integrity": "sha512-necHUUcLd41mpObOSuyGQSVyDq4Tb+uejG16WmA6VwXufaUqEl385aumKiS1KLtUP8TQQzogaogaMMDtqtznsQ==", + "requires": { + "tslib": "^2.0.0" + } + }, "@ngtools/webpack": { "version": "18.1.0", "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-18.1.0.tgz", @@ -18310,7 +18520,7 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true + "devOptional": true }, "env-paths": { "version": "2.2.1", @@ -19481,12 +19691,27 @@ "@pkgjs/parseargs": "^0.11.0" } }, + "jasmine-auto-spies": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/jasmine-auto-spies/-/jasmine-auto-spies-8.0.1.tgz", + "integrity": "sha512-4T8YVS6VJ7VoCdAOqEh3sziD6Wf/m+dfGGQ1a7GZHqjZUjaSD0Be+KqP7CmTiBc3HrX+uvOXr380QIW+TfHhqA==", + "dev": true, + "requires": { + "@hirez_io/auto-spies-core": "3.0.0" + } + }, "jasmine-core": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.5.0.tgz", "integrity": "sha512-9PMzyvhtocxb3aXJVOPqBDswdgyAeSB81QnLop4npOpbqnheaTEwPc9ZloQeVswugPManznQBjD8kWDTjlnHuw==", "dev": true }, + "javascript-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.1.0.tgz", + "integrity": "sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==", + "dev": true + }, "jest-worker": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", @@ -20983,6 +21208,15 @@ "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", "dev": true }, + "parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "devOptional": true, + "requires": { + "entities": "^4.4.0" + } + }, "parse5-html-rewriting-stream": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.0.0.tgz", @@ -20992,17 +21226,6 @@ "entities": "^4.3.0", "parse5": "^7.0.0", "parse5-sax-parser": "^7.0.0" - }, - "dependencies": { - "parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "dev": true, - "requires": { - "entities": "^4.4.0" - } - } } }, "parse5-sax-parser": { @@ -21012,17 +21235,6 @@ "dev": true, "requires": { "parse5": "^7.0.0" - }, - "dependencies": { - "parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "dev": true, - "requires": { - "entities": "^4.4.0" - } - } } }, "parseurl": { diff --git a/package.json b/package.json index 5290450..a6b74bd 100644 --- a/package.json +++ b/package.json @@ -11,14 +11,20 @@ "private": true, "dependencies": { "@angular/animations": "^18.1.0", + "@angular/cdk": "^18.1.2", "@angular/common": "^18.1.0", "@angular/compiler": "^18.1.0", "@angular/core": "^18.1.0", "@angular/forms": "^18.1.0", + "@angular/material": "^18.1.2", "@angular/platform-browser": "^18.1.0", "@angular/platform-browser-dynamic": "^18.1.0", "@angular/router": "^18.1.0", "@ngneat/falso": "^6.2.0", + "@ngrx/effects": "^18.0.1", + "@ngrx/router-store": "^18.0.1", + "@ngrx/store": "^18.0.1", + "@ngrx/store-devtools": "^18.0.1", "rxjs": "~7.5.0", "tslib": "^2.3.0", "zone.js": "~0.14.7" @@ -27,7 +33,9 @@ "@angular-devkit/build-angular": "^18.1.0", "@angular/cli": "~18.1.0", "@angular/compiler-cli": "^18.1.0", + "@hirez_io/observer-spy": "^2.2.0", "@types/jasmine": "~4.3.0", + "jasmine-auto-spies": "^8.0.1", "jasmine-core": "~4.5.0", "karma": "~6.4.0", "karma-chrome-launcher": "~3.1.0", diff --git a/src/app/app.component.html b/src/app/app.component.html index 0c03e65..063278b 100644 --- a/src/app/app.component.html +++ b/src/app/app.component.html @@ -1,6 +1,8 @@ -
-
-
{{ product | json }}
+
+
+
+
+
+
- -
\ No newline at end of file +
diff --git a/src/app/app.component.scss b/src/app/app.component.scss index a1e7d11..6a573c2 100644 --- a/src/app/app.component.scss +++ b/src/app/app.component.scss @@ -1,29 +1,64 @@ -.stage { - width: 50%; - min-width: 360px; - max-width: 1400px; - margin: 0 auto; - padding: 4rem; - background-color: #fff; +.loader { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + width: 100%; + height: 100vh; + background-color: var(--loader-container-background-color); + display: flex; + flex-direction: column; + flex-wrap: nowrap; + align-content: space-around; + justify-content: center; + align-items: center; + z-index: 999; + + &__spinner { + width: 48px; + height: 48px; + background: var(--loader-spinner-circle-color); + border-radius: 50%; + + animation: spin 3s infinite linear; + + > div { + width: 48px; + height: 12px; + background: var(--loader-spinner-arm-color); + position: relative; + top: 18px; + left: 18px; + } + } } -pre { - overflow: auto; - background-color: #f2f4f7; - padding: 1rem; +@keyframes spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } } -.more { - font: inherit; - display: block; - margin: 4rem auto 0; - border: 1px solid #d7dbe0; - border-radius: .25rem; - padding: 1rem 2rem; - background-color: #fff; - cursor: pointer; +.main { - &:hover, &:focus { - background-color: #ebecf0; + overflow: overlay; + height: 100vh; + justify-content: flex-start; + display: flex; + position: relative; + + .main__container { + width: 50%; + min-width: 360px; + max-width: 1400px; + min-height: 100vh; + height: max-content; + margin: 0 auto; + padding: 4rem; + background-color: var(--main-background-color); } -} \ No newline at end of file +} diff --git a/src/app/app.component.spec.ts b/src/app/app.component.spec.ts index 77ac082..c2d5f83 100644 --- a/src/app/app.component.spec.ts +++ b/src/app/app.component.spec.ts @@ -1,11 +1,34 @@ -import { TestBed } from '@angular/core/testing'; +import { ComponentFixture, fakeAsync, TestBed, tick } from '@angular/core/testing'; import { AppComponent } from './app.component'; +import { RouterModule } from '@angular/router'; +import { StoreModule } from '@ngrx/store'; +import * as ProductSelectors from './store/product/product.selectors'; +import { MockStore, provideMockStore } from '@ngrx/store/testing'; +import { subscribeSpyTo } from '@hirez_io/observer-spy'; +import { ProductState } from './store/product/product.reducer'; +import { By } from '@angular/platform-browser'; describe('AppComponent', () => { + let component: AppComponent; + let fixture: ComponentFixture; + let store: MockStore; + + const initialState: ProductState = { productsPage: { content: [], more: false }, page: 0, isLoading: false, hasError: false }; + beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [AppComponent] + declarations: [AppComponent], + imports: [ + RouterModule, + StoreModule.forRoot({}) + ], + providers: [provideMockStore({ initialState })] }).compileComponents(); + + fixture = TestBed.createComponent(AppComponent); + component = fixture.componentInstance; + + store = TestBed.inject(MockStore); }); it('should create the app', () => { @@ -13,4 +36,46 @@ describe('AppComponent', () => { const app = fixture.componentInstance; expect(app).toBeTruthy(); }); + + it(`should output the correct value from isLoading$ store selector`, () => { + + store.overrideSelector(ProductSelectors.selectIsLoading, true); + + const observerSpy = subscribeSpyTo(component.isLoading$); + + const isLoading = observerSpy.getLastValue(); + expect(isLoading).toEqual(true); + + observerSpy.unsubscribe(); + }); + + it(`should show loader when store emits that it's loading`, fakeAsync(() => { + + store.overrideSelector(ProductSelectors.selectIsLoading, true); + + const observerSpy = subscribeSpyTo(component.isLoading$); + + tick(250); + fixture.detectChanges(); + + const el = fixture.debugElement.query(By.css('.loader')); + expect(el).toBeTruthy(); + + observerSpy.unsubscribe(); + })); + + it(`should not show loader when store emits that it's not loading`, fakeAsync(() => { + + store.overrideSelector(ProductSelectors.selectIsLoading, false); + + const observerSpy = subscribeSpyTo(component.isLoading$); + + tick(250); + fixture.detectChanges(); + + const el = fixture.debugElement.query(By.css('.loader')); + expect(el).toBeFalsy(); + + observerSpy.unsubscribe(); + })); }); diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 06f5ba9..43e4b3b 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -1,16 +1,17 @@ import { Component } from '@angular/core'; +import { Store } from '@ngrx/store'; import { Observable } from 'rxjs'; -import { Page } from './products/page'; -import { Product } from './products/product'; -import { ProductService } from './products/product.service'; +import * as ProductSelectors from './store/product/product.selectors'; @Component({ selector: 'app-root', templateUrl: './app.component.html', - styleUrls: ['./app.component.scss'] + styleUrls: ['./app.component.scss'], }) export class AppComponent { - constructor(private readonly productService: ProductService) {} - readonly products$: Observable> = this.productService.get(0); + readonly isLoading$: Observable = this.store + .select(ProductSelectors.selectIsLoading); + + constructor(private readonly store: Store) {} } diff --git a/src/app/app.constants.ts b/src/app/app.constants.ts new file mode 100644 index 0000000..a438439 --- /dev/null +++ b/src/app/app.constants.ts @@ -0,0 +1 @@ +export const SNACKBAR_ERROR_DURATION: number = 300000; diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 5e2c2c3..1683097 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -1,11 +1,64 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; +import { MAT_SNACK_BAR_DEFAULT_OPTIONS, MatSnackBarModule } from '@angular/material/snack-bar'; import { BrowserModule } from '@angular/platform-browser'; +import { provideAnimationsAsync } from '@angular/platform-browser/animations/async'; +import { RouterModule } from '@angular/router'; +import { EffectsModule } from '@ngrx/effects'; +import { routerReducer, StoreRouterConnectingModule } from '@ngrx/router-store'; +import { StoreModule } from '@ngrx/store'; +import { StoreDevtoolsModule } from '@ngrx/store-devtools'; import { AppComponent } from './app.component'; +import { ProductsComponent } from './components/products-list/products.component'; +import { ProductEffects } from './store/product/product.effects'; +import * as ProductStore from "./store/product/product.reducer"; +import { SNACKBAR_ERROR_DURATION } from './app.constants'; + +const material = [ + MatSnackBarModule, +]; @NgModule({ - imports: [BrowserModule, CommonModule], + imports: [ + BrowserModule, + CommonModule, + ProductsComponent, + material, + RouterModule.forRoot([ + { + path: "", + component: ProductsComponent, + }, + { + path: "**", + redirectTo: "", + pathMatch: "full", + }, + ]), + StoreModule.forRoot({ + "router": routerReducer, + }), + StoreRouterConnectingModule.forRoot(), + StoreModule.forFeature(ProductStore.FEATURE_KEY, ProductStore.productReducer), + StoreDevtoolsModule.instrument({ + maxAge: 25, // Retains last 25 states + logOnly: false + }), + EffectsModule.forRoot([ProductEffects]), + ], declarations: [AppComponent], - bootstrap: [AppComponent] + bootstrap: [AppComponent], + providers: [ + provideAnimationsAsync(), + { + provide: MAT_SNACK_BAR_DEFAULT_OPTIONS, + useValue: { + horizontalPosition: 'left', + verticalPosition: 'top', + panelClass: 'snackbar__error', + duration: SNACKBAR_ERROR_DURATION, + }, + }, + ], }) export class AppModule {} diff --git a/src/app/components/product-card/product-card.component.html b/src/app/components/product-card/product-card.component.html new file mode 100644 index 0000000..d3f4c14 --- /dev/null +++ b/src/app/components/product-card/product-card.component.html @@ -0,0 +1,17 @@ +
+ +
+ +

{{ product.title }}

+ +
+

{{ product.description }}

+
+ +
+ + {{ category }} + +
diff --git a/src/app/components/product-card/product-card.component.scss b/src/app/components/product-card/product-card.component.scss new file mode 100644 index 0000000..9fc721d --- /dev/null +++ b/src/app/components/product-card/product-card.component.scss @@ -0,0 +1,100 @@ +.card { + box-sizing: border-box; + min-width: 16rem; + border: 1px solid var(--card-border-color); + border-radius: 8px; + flex: 1 0 calc(25% - 1rem); + + transition: box-shadow 0.3s ease-in-out; + min-height: 150px; + + display: flex; + flex-direction: column; + + &__image { + flex: 1 0 37%; + + img { + width: 100%; + height: 100%; + border-top-left-radius: 8px; + border-top-right-radius: 8px; + aspect-ratio: 2 / 1; + background-repeat: no-repeat; + background-size: contain; + background-clip: content-box; + } + } + + &__title { + margin-top: 0.5rem; + padding: 0.5rem 1rem; + + font-weight: 400; + font-size: 1.3rem; + color: var(--card-text-color); + + flex: 0 1 10%; + } + + &__description { + padding: 0.5rem 1rem; + max-height: 150px; + + flex: 0 1 20%; + + > p { + display: -webkit-box; + -webkit-line-clamp: 3; + -webkit-box-orient: vertical; + overflow: hidden; + text-overflow: ellipsis; + + font-size: 0.9rem; + font-weight: 500; + color: var(--card-text-color); + } + } + + &__categories { + padding: 0.5rem 1rem; + + display: flex; + gap: 0.5rem; + flex-direction: row; + flex-wrap: wrap; + justify-content: flex-start; + align-items: flex-end; + flex: 1 1 33%; + row-gap: 0; + align-content: flex-end; + } + + &__category { + border: 1px solid var(--card-category-border-color); + border-radius: 0.25rem; + padding: 0.25rem 0.5rem; + + color: var(--card-category-color); + font-size: 0.8rem; + font-weight: 500; + + margin-top: 0.5rem; + max-height: 1.8rem; + } + + &:hover { + cursor: pointer; + box-shadow: 0 4px 8px var(--card-category-box-shadow-color); + } + + &--empty { + box-sizing: border-box; + min-width: 16rem; + flex: 1 0 calc(25% - 1rem); + display: flex; + flex-direction: column; + border: none; + min-height: auto; + } +} diff --git a/src/app/components/product-card/product-card.component.spec.ts b/src/app/components/product-card/product-card.component.spec.ts new file mode 100644 index 0000000..0499734 --- /dev/null +++ b/src/app/components/product-card/product-card.component.spec.ts @@ -0,0 +1,37 @@ +import { ComponentFixture, fakeAsync, TestBed, tick } from '@angular/core/testing'; + +import { ProductCardComponent } from './product-card.component'; +import { Product } from 'src/app/products'; +import { By } from '@angular/platform-browser'; + +describe('ProductCardComponent', () => { + let component: ProductCardComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ProductCardComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(ProductCardComponent); + component = fixture.componentInstance; + component.product = {} as Product; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + it('should set default image on error', fakeAsync(() => { + + const imgDebugElement = fixture.debugElement.query(By.css('img')); + const imgElement: HTMLImageElement = imgDebugElement.nativeElement; + + imgDebugElement.triggerEventHandler('error', null); + fixture.detectChanges(); + + expect(imgElement.src).toContain('assets/images/placeholder-2-1.png'); + })); +}); diff --git a/src/app/components/product-card/product-card.component.ts b/src/app/components/product-card/product-card.component.ts new file mode 100644 index 0000000..d9800dc --- /dev/null +++ b/src/app/components/product-card/product-card.component.ts @@ -0,0 +1,33 @@ +import { CommonModule } from '@angular/common'; +import { + Component, + HostBinding, + Input, + signal, + ViewEncapsulation, +} from '@angular/core'; +import { Product } from 'src/app/products'; + +@Component({ + selector: 'app-product-card', + standalone: true, + imports: [CommonModule], + templateUrl: './product-card.component.html', + styleUrl: './product-card.component.scss', + encapsulation: ViewEncapsulation.None, +}) +export class ProductCardComponent { + @HostBinding('class') class = 'card'; + + @Input() product!: Product; + + imageSrc = signal(''); + + ngOnInit(): void { + this.imageSrc.set(this.product.image); + } + + setDefaultPic(): void { + this.imageSrc.set('assets/images/placeholder-2-1.png'); + } +} diff --git a/src/app/components/products-list/products.component.html b/src/app/components/products-list/products.component.html new file mode 100644 index 0000000..2dbc53f --- /dev/null +++ b/src/app/components/products-list/products.component.html @@ -0,0 +1,28 @@ +
+ + + + +
+
+ +
+

+ Sorry for the inconvenience, the server is currently busy. Please try again later. +

+
+ + diff --git a/src/app/components/products-list/products.component.scss b/src/app/components/products-list/products.component.scss new file mode 100644 index 0000000..88602c4 --- /dev/null +++ b/src/app/components/products-list/products.component.scss @@ -0,0 +1,42 @@ +.products { + + * { + box-sizing: border-box; + margin: 0; + padding: 0; + } + + &__container { + display: flex; + flex-wrap: wrap; + gap: 1rem; + } + + &__error-container { + display: flex; + flex-wrap: nowrap; + flex-direction: row; + justify-content: center; + align-content: flex-end; + align-items: flex-end; + + > p { + padding: 2rem; + } + } + + &__button { + font: inherit; + display: block; + margin: 4rem auto 0; + border: 1px solid var(--products-button-border-color); + border-radius: .25rem; + padding: 1rem 2rem; + background-color: var(--products-button-background-color); + cursor: pointer; + + &:hover, &:focus { + background-color: var(--products-button-hover-and-focus-background-color); + } + } +} diff --git a/src/app/components/products-list/products.component.spec.ts b/src/app/components/products-list/products.component.spec.ts new file mode 100644 index 0000000..514c207 --- /dev/null +++ b/src/app/components/products-list/products.component.spec.ts @@ -0,0 +1,127 @@ +import { ComponentFixture, fakeAsync, TestBed, tick } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { ObserverSpy, subscribeSpyTo } from '@hirez_io/observer-spy'; +import { Store, StoreModule } from '@ngrx/store'; +import { MockStore, provideMockStore } from '@ngrx/store/testing'; +import { provideAutoSpy } from 'jasmine-auto-spies'; +import { Product } from 'src/app/products'; +import { ProductState } from 'src/app/store/product/product.reducer'; +import * as ProductActions from '../../store/product/product.actions'; +import * as ProductSelectors from '../../store/product/product.selectors'; +import { ProductsComponent } from './products.component'; + +describe('ProductsComponent', () => { + let component: ProductsComponent; + let fixture: ComponentFixture; + let dispatchSpy: jasmine.Spy; + let store: MockStore; + let observerSpy: ObserverSpy; + + const productsContent = [ + { + title: 'Product 1', + image: null, + categories: [], + description: '', + url: '', + }, + ]; + const initialState: ProductState = { productsPage: { content: [], more: false }, page: 0, isLoading: false, hasError: false }; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ProductsComponent, StoreModule.forRoot({})], + providers: [provideAutoSpy(Store), provideMockStore({ initialState })], + }).compileComponents(); + + fixture = TestBed.createComponent(ProductsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + + store = TestBed.inject(MockStore); + dispatchSpy = spyOn(store, 'dispatch').and.callThrough(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + describe('product$ observable', () => { + + it('should output the correct products from products$ observable', () => { + store.overrideSelector(ProductSelectors.selectProductsPage, { + content: productsContent, + more: true, + }); + observerSpy = subscribeSpyTo(component.products$); + + const products = observerSpy.getLastValue(); + + expect(products).toEqual([ + { + title: 'Product 1', + image: null, + categories: [], + description: '', + url: '', + }, + ]); + }); + }); + + describe('canLoadMore()', () => { + it('should be able to load more when product page can provide more products', () => { + store.overrideSelector(ProductSelectors.selectProductsPage, { + content: productsContent, + more: true, + }); + observerSpy = subscribeSpyTo(component.products$); + + observerSpy.getLastValue(); + + expect(component.canLoadMore()).toEqual(true); + }); + + it('should not be able to load more when product page cant provide any more products', () => { + store.overrideSelector(ProductSelectors.selectProductsPage, { + content: productsContent, + more: false, + }); + observerSpy = subscribeSpyTo(component.products$); + + observerSpy.getLastValue(); + + expect(component.canLoadMore()).toEqual(false); + }); + + it('should not be able to load more when product page is undefined', () => { + store.overrideSelector(ProductSelectors.selectProductsPage, undefined); + observerSpy = subscribeSpyTo(component.products$); + + observerSpy.getLastValue(); + + expect(component.canLoadMore()).toEqual(false); + }); + }); + + it('should dispatch loadMoreProducts action when loadMore button is pressed', fakeAsync(() => { + component.canLoadMore.set(true); + + tick(); + fixture.detectChanges(); + + const el = fixture.debugElement.query(By.css('.products__button')); + el.nativeElement.click(); + + expect(dispatchSpy).toHaveBeenCalledWith(ProductActions.loadMoreProducts()); + })); + + it('should calculate lastRowExtraCount corectly', () => { + + let lastRowExtraCount = (component as any).getLastRowExtraCount(5, 952, 305); + expect(lastRowExtraCount).toEqual(1); + + lastRowExtraCount = (component as any).getLastRowExtraCount(5, 1256, 302); + expect(lastRowExtraCount).toEqual(3); + }); +}); diff --git a/src/app/components/products-list/products.component.ts b/src/app/components/products-list/products.component.ts new file mode 100644 index 0000000..7e985e0 --- /dev/null +++ b/src/app/components/products-list/products.component.ts @@ -0,0 +1,86 @@ +import { CommonModule } from '@angular/common'; +import { + Component, + ElementRef, + HostBinding, + HostListener, + signal, + ViewChild, + ViewEncapsulation, +} from '@angular/core'; +import { Store } from '@ngrx/store'; +import { debounceTime, filter, map, Observable, Subject, tap } from 'rxjs'; +import { Product } from '../../products'; +import * as ProductActions from '../../store/product/product.actions'; +import * as ProductSelectors from '../../store/product/product.selectors'; +import { ProductCardComponent } from '../product-card/product-card.component'; + +@Component({ + selector: 'app-products', + standalone: true, + imports: [CommonModule, ProductCardComponent], + templateUrl: './products.component.html', + styleUrl: './products.component.scss', + encapsulation: ViewEncapsulation.None, +}) +export class ProductsComponent { + @HostBinding('class') class = 'products'; + + @ViewChild('containerRef') containerRef!: ElementRef; + + @HostListener('window:resize', ['$event']) + onResize(_: any) { + this.fixLastRow$.next(true); + } + + readonly hasError$ = this.store.select(ProductSelectors.selectHasError); + + readonly products$: Observable = this.store + .select(ProductSelectors.selectProductsPage) + .pipe( + tap((productsPage) => { + this.canLoadMore.set(!productsPage ? false: productsPage.more); + this.count = !productsPage ? 0 : productsPage.content.length; + }), + map((productsPage) => productsPage?.content), + tap(() => this.fixLastRow$.next(true)) + ); + + readonly fixLastRow$ = new Subject(); + + canLoadMore = signal(false); + lastRowExtras = signal([]); + + private count = 0; + + constructor(private readonly store: Store) { + this.fixLastRow$ + .pipe( + debounceTime(25), + filter(() => this.count > 0), + map(() => ({ + count: this.count, + containerWidth: this.containerRef.nativeElement.clientWidth, + cardWidth: this.containerRef.nativeElement.firstChild.clientWidth + })) + ).subscribe((payload) => { + const lastRowExtraCount = this.getLastRowExtraCount(payload.count, payload.containerWidth, payload.cardWidth); + this.lastRowExtras.set(lastRowExtraCount > 0 ? new Array(lastRowExtraCount) : undefined); + }); + } + + goToProduct(url: string): void { + window.open(url, '_blank'); + } + + loadMore(): void { + this.store.dispatch(ProductActions.loadMoreProducts()); + } + + private getLastRowExtraCount(count: number, containerWidth: number, cardWidth: number): number { + const cardsPerRow = Math.floor(containerWidth / cardWidth); + const lastRowCount = count % cardsPerRow; + const lastRowExtraCount = cardsPerRow - lastRowCount; + return lastRowExtraCount === cardsPerRow ? 0 : lastRowExtraCount; + } +} diff --git a/src/app/products/index.ts b/src/app/products/index.ts new file mode 100644 index 0000000..db7e84c --- /dev/null +++ b/src/app/products/index.ts @@ -0,0 +1,3 @@ +export * from "./page"; +export * from "./product.service"; +export * from "./product"; diff --git a/src/app/products/product.service.ts b/src/app/products/product.service.ts index cafcceb..9e50b55 100644 --- a/src/app/products/product.service.ts +++ b/src/app/products/product.service.ts @@ -23,10 +23,10 @@ export class ProductService { /** * Get a page of products. - * + * * *Note:* This is a fake service that returns random data. It simulates a * network request by delaying the response and randomly returning an error. - * + * * @param page The page number. * @returns An observable of the page of products. */ diff --git a/src/app/store/product/product.actions.ts b/src/app/store/product/product.actions.ts new file mode 100644 index 0000000..ab7bdb0 --- /dev/null +++ b/src/app/store/product/product.actions.ts @@ -0,0 +1,61 @@ +import { createAction, props } from '@ngrx/store'; +import { Page, Product } from 'src/app/products'; + +export enum ProductActionTypes { + LOAD_PRODUCTS = '[Product] Load Products', + LOAD_PRODUCTS_SUCCESS = '[Product] Load Products Success', + SET_IS_LOADING = '[Product] Set Is Loading', + SET_PAGE = '[Product] Set Page', + RESET_PRODUCTS_PAGE = '[Product] Reset Products Page', + LOAD_MORE_PRODUCTS = '[Product] Load More Products', + LOAD_MORE_PRODUCTS_SUCCESS = '[Product] Load More Products Success', + SET_PRODUCTS_ERROR = '[Product] Set Products Error', + SET_HAS_ERROR = '[Product] Set Has Error', +} + +export const loadProducts = createAction( + ProductActionTypes.LOAD_PRODUCTS, + props<{ page: number }>() +); + +export const loadProductsSuccess = createAction( + ProductActionTypes.LOAD_PRODUCTS_SUCCESS, + props<{ productsPage: Page }>() +); + +export const setIsLoading = createAction( + ProductActionTypes.SET_IS_LOADING, + props<{ + isLoading: boolean; + }>() +); + +export const setPage = createAction( + ProductActionTypes.SET_PAGE, + props<{ + page: number; + }>() +); + +export const resetProductsPage = createAction( + ProductActionTypes.RESET_PRODUCTS_PAGE +); + +export const loadMoreProducts = createAction( + ProductActionTypes.LOAD_MORE_PRODUCTS +); + +export const loadMoreProductsSuccess = createAction( + ProductActionTypes.LOAD_MORE_PRODUCTS_SUCCESS, + props<{ productsPage: Page }>() +); + +export const setProductsError = createAction( + ProductActionTypes.SET_PRODUCTS_ERROR, + props<{ err: string }>() +); + +export const setHasError = createAction( + ProductActionTypes.SET_HAS_ERROR, + props<{ value: boolean }>() +); diff --git a/src/app/store/product/product.effects.spec.ts b/src/app/store/product/product.effects.spec.ts new file mode 100644 index 0000000..12ce1d1 --- /dev/null +++ b/src/app/store/product/product.effects.spec.ts @@ -0,0 +1,123 @@ +import { TestBed } from '@angular/core/testing'; +import { EventType } from '@angular/router'; +import { subscribeSpyTo } from '@hirez_io/observer-spy'; +import { provideMockActions } from '@ngrx/effects/testing'; +import { routerNavigatedAction } from '@ngrx/router-store'; +import { provideMockStore } from '@ngrx/store/testing'; +import { createSpyFromClass, Spy } from 'jasmine-auto-spies'; +import { Observable, of } from 'rxjs'; +import { ProductService } from 'src/app/products'; +import * as ProductActions from '../product/product.actions'; +import * as ProductSelectors from '../product/product.selectors'; +import { ProductEffects } from './product.effects'; +import { ProductState } from './product.reducer'; + +describe('ProductEffects', () => { + let actions$: Observable; + let effects: ProductEffects; + let productServiceSpy: Spy; + + const initialState: ProductState = { productsPage: { content: [], more: false }, page: 0, isLoading: false, hasError: false }; + + beforeEach(() => { + productServiceSpy = createSpyFromClass(ProductService); + + TestBed.configureTestingModule({ + providers: [ + ProductEffects, + provideMockActions(() => actions$), + provideMockStore({ + selectors: [ + { + selector: ProductSelectors.selectPage, + value: 0, + }, + ], + }), + { provide: ProductService, useValue: productServiceSpy }, + ], + }); + + effects = TestBed.inject(ProductEffects); + }); + + it('should dispatch setIsLoading, resetProductsPage and loadProducts on router navigated to "/"', async () => { + actions$ = of(routerNavigatedAction({ + payload: { + routerState: {} as any, + event: { url: '/', id: 1, type: EventType.NavigationEnd, urlAfterRedirects: '' } + } + })); + const observerSpy = subscribeSpyTo(effects.loadInitialProducts$); + + await observerSpy.onComplete(); + + expect(observerSpy.getValues()).toEqual([ + ProductActions.setIsLoading({ isLoading: true }), + ProductActions.resetProductsPage(), + ProductActions.loadProducts({ page: 0 }), + ]); + }); + + it("should select the loading from store", () => { + const result = ProductSelectors.selectIsLoading.projector(initialState); + expect(result).toEqual(false); + }); + + it("should select the page from store", () => { + const result = ProductSelectors.selectPage.projector(initialState); + expect(result).toEqual(0); + }); + + it("should select the products page from store", () => { + const result = ProductSelectors.selectProductsPage.projector(initialState); + expect(result?.content).toEqual([]); + }); + + it('should dispatch loadProductsSuccess when loadProducts is triggered', async () => { + const mockProductsPage = { content: [], more: false }; + productServiceSpy.get.and.returnValue(of(mockProductsPage)); + actions$ = of(ProductActions.loadProducts({ page: 0 })); + const observerSpy = subscribeSpyTo(effects.loadProducts$); + + await observerSpy.onComplete(); + + expect(observerSpy.getValues()).toEqual([ + ProductActions.setIsLoading({ isLoading: false }), + ProductActions.loadProductsSuccess({ productsPage: mockProductsPage }), + ]); + }); + + it('should dispatch setPage and loadMoreProductsSuccess when loadMoreProducts is triggered', async () => { + const mockProductsPage = { content: [], more: false }; + productServiceSpy.get.and.returnValue(of(mockProductsPage)); + actions$ = of(ProductActions.loadMoreProducts()); + const observerSpy = subscribeSpyTo(effects.loadMoreProducts$); + + await observerSpy.onComplete(); + + expect(observerSpy.getValues()).toEqual([ + ProductActions.setIsLoading({ isLoading: false }), + ProductActions.setPage({ page: 1 }), + ProductActions.loadMoreProductsSuccess({ productsPage: mockProductsPage }), + ]); + }); + + it('should select the page from the store and call productService.get with incremented page', async () => { + const mockProductsPage = { content: [], more: false }; + productServiceSpy.get.and.returnValue(of(mockProductsPage)); + + actions$ = of(ProductActions.loadMoreProducts()); + + const observerSpy = subscribeSpyTo(effects.loadMoreProducts$); + + await observerSpy.onComplete(); + + expect(productServiceSpy.get).toHaveBeenCalledWith(1); + expect(observerSpy.getValues()).toEqual([ + ProductActions.setIsLoading({ isLoading: false }), + ProductActions.setPage({ page: 1 }), + ProductActions.loadMoreProductsSuccess({ productsPage: mockProductsPage }), + ]); + }); +}); diff --git a/src/app/store/product/product.effects.ts b/src/app/store/product/product.effects.ts new file mode 100644 index 0000000..14cf193 --- /dev/null +++ b/src/app/store/product/product.effects.ts @@ -0,0 +1,86 @@ +import { Injectable } from '@angular/core'; +import { MatSnackBar } from '@angular/material/snack-bar'; +import { Actions, createEffect, ofType } from '@ngrx/effects'; +import { + routerNavigatedAction +} from '@ngrx/router-store'; +import { Store } from '@ngrx/store'; +import { catchError, filter, map, mergeMap, of, switchMap, tap, withLatestFrom } from 'rxjs'; +import { ProductService } from 'src/app/products'; +import * as ProductActions from '../product/product.actions'; +import * as ProductSelectors from '../product/product.selectors'; + +@Injectable() +export class ProductEffects { + loadInitialProducts$ = createEffect(() => + this.actions$.pipe( + ofType(routerNavigatedAction), + filter((action) => action.payload.event.url === '/'), + switchMap(() => [ + ProductActions.setIsLoading({ isLoading: true }), + ProductActions.resetProductsPage(), + ProductActions.loadProducts({ page: 0 }) + ]) + ) + ); + + loadProducts$ = createEffect(() => + this.actions$.pipe( + ofType(ProductActions.loadProducts), + switchMap((payload) => + this.productService + .get(payload.page) + .pipe( + catchError(err => { + this.store.dispatch(ProductActions.setProductsError({ err })); + return of({ content: [], more: false }); + }), + mergeMap((response) => [ + ProductActions.setIsLoading({ isLoading: false }), + ProductActions.loadProductsSuccess({ productsPage: response }) + ] + ) + ) + ) + ) + ); + + loadMoreProducts$ = createEffect(() => + this.actions$.pipe( + ofType(ProductActions.loadMoreProducts), + withLatestFrom(this.store.select(ProductSelectors.selectPage)), + tap(() => this.store.dispatch(ProductActions.setIsLoading({ isLoading: true }))), + map(([_, page]) => (page + 1)), + switchMap((page) => + this.productService + .get(page) + .pipe( + catchError(err => { + this.store.dispatch(ProductActions.setProductsError({ err })); + return of({ content: [], more: false }); + }), + mergeMap((response) => [ + ProductActions.setIsLoading({ isLoading: false }), + ProductActions.setPage({ page }), + ProductActions.loadMoreProductsSuccess({ productsPage: response }) + ]) + ) + ) + ) + ); + + loadProductsError$ = createEffect(() => + this.actions$.pipe( + ofType(ProductActions.setProductsError), + tap(payload => this.snackBar.open(payload.err, 'Close')), + switchMap(() => of(ProductActions.setHasError({ value: true }))) + ) + ); + + constructor( + private store: Store, + private actions$: Actions, + private snackBar: MatSnackBar, + private productService: ProductService + ) {} +} diff --git a/src/app/store/product/product.reducer.ts b/src/app/store/product/product.reducer.ts new file mode 100644 index 0000000..e38fc5b --- /dev/null +++ b/src/app/store/product/product.reducer.ts @@ -0,0 +1,67 @@ +import { createReducer, on } from '@ngrx/store'; +import * as ProductActions from './product.actions'; +import { Page, Product } from 'src/app/products'; + +export const FEATURE_KEY = 'PRODUCT'; + +export interface ProductState { + productsPage?: Page; + page: number; + isLoading: boolean; + hasError: boolean; +} + +export const initialProductState: ProductState = { + productsPage: undefined, + page: 0, + isLoading: true, + hasError: false +}; + +export const productReducer = createReducer( + initialProductState, + on(ProductActions.setIsLoading, (state, payload) => { + return { + ...state, + isLoading: payload.isLoading, + }; + }), + on(ProductActions.setPage, (state, payload) => { + return { + ...state, + page: payload.page, + }; + }), + on(ProductActions.resetProductsPage, (state) => { + return { + ...state, + page: 0, + productsPage: undefined + }; + }), + on(ProductActions.loadProductsSuccess, (state, payload) => { + return { + ...state, + productsPage: payload.productsPage, + }; + }), + on(ProductActions.loadMoreProductsSuccess, (state, payload) => { + console.log("loadMoreProductsSuccess -> payload[" + payload.productsPage.content.length + "]: ", payload); + return { + ...state, + productsPage: { + ...payload.productsPage, + content: [ + ...state.productsPage!.content, + ...payload.productsPage?.content + ], + }, + }; + }), + on(ProductActions.setHasError, (state, payload) => { + return { + ...state, + hasError: payload.value, + }; + }), +); diff --git a/src/app/store/product/product.selectors.ts b/src/app/store/product/product.selectors.ts new file mode 100644 index 0000000..ba186d3 --- /dev/null +++ b/src/app/store/product/product.selectors.ts @@ -0,0 +1,27 @@ +import { createFeatureSelector, createSelector } from '@ngrx/store'; +import * as ProductReducer from './product.reducer'; +import { Page, Product } from 'src/app/products'; + +const selectProductState = createFeatureSelector( + ProductReducer.FEATURE_KEY +); + +export const selectProductsPage = createSelector( + selectProductState, + (state): Page | undefined => state.productsPage +); + +export const selectPage = createSelector( + selectProductState, + (state): number => state.page +); + +export const selectIsLoading = createSelector( + selectProductState, + (state): boolean => state.isLoading +); + +export const selectHasError = createSelector( + selectProductState, + (state): boolean => state.hasError +); diff --git a/src/app/store/router/router.selectors.ts b/src/app/store/router/router.selectors.ts new file mode 100644 index 0000000..063fe54 --- /dev/null +++ b/src/app/store/router/router.selectors.ts @@ -0,0 +1,11 @@ +import { getRouterSelectors } from '@ngrx/router-store'; + +// `router` is used as the default feature name. You can use the feature name +// of your choice by creating a feature selector and pass it to the `getRouterSelectors` function +// export const selectRouter = createFeatureSelector('yourFeatureName'); + +export const { + selectCurrentRoute, // select the current route + selectFragment, // select the current route fragment + selectUrl, // select the current url +} = getRouterSelectors(); diff --git a/src/assets/images/placeholder-2-1.png b/src/assets/images/placeholder-2-1.png new file mode 100644 index 0000000..666cf63 Binary files /dev/null and b/src/assets/images/placeholder-2-1.png differ diff --git a/src/index.html b/src/index.html index 15d9953..ab80be8 100644 --- a/src/index.html +++ b/src/index.html @@ -8,7 +8,7 @@ - + diff --git a/src/styles.scss b/src/styles.scss index 942051b..f45aa08 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -1,8 +1,59 @@ /* You can add global styles to this file, and also import other style files */ @import url('https://fonts.googleapis.com/css2?family=Open+Sans:wght@400;600&display=swap'); +html, body { height: 100%; } body { margin: 0; - background-color: #f2f4f7; - font-family: 'Open Sans', sans-serif; + background-color: var(--body-background-color); + font-family: Roboto, sans-serif; + overflow: hidden; + max-height: 100vh; +} + +.snackbar__error { + + .mdc-snackbar__label { + font-size: 1rem !important; + } + + .mdc-snackbar__surface { + background-color: var(--snackbar-background-color) !important; + } + + .mat-mdc-simple-snack-bar { + padding: 1rem; + } + .mdc-snackbar__actions { + padding-left: 2rem; + + .mat-mdc-button { + background-color: var(--snackbar-action-button-background-color); + color: var(--snackbar-action-button-color) !important; + } + } +} + +:root { + + --body-background-color: #f2f4f7; + + --main-background-color: #fff; + + --loader-container-background-color: #cae4f778; + --loader-spinner-circle-color: #9bb9daad; + --loader-spinner-arm-color: #4170b678; + + --products-button-border-color: #d7dbe0; + --products-button-background-color: #fff; + --products-button-hover-and-focus-background-color: #ebecf0; + + --card-border-color: lightgray; + --card-text-color: #444; + --card-category-color: gray; + --card-category-border-color: lightgray; + --card-category-box-shadow-color: rgba(0, 0, 0, 0.1); + + --snackbar-background-color: #c85454; + --snackbar-action-button-background-color: #00000063; + --snackbar-action-button-color: #fff; } diff --git a/yarn.lock b/yarn.lock index 3ccb442..9fb926e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,7 +2,7 @@ # yarn lockfile v1 -"@ampproject/remapping@2.3.0", "@ampproject/remapping@^2.2.0": +"@ampproject/remapping@^2.2.0", "@ampproject/remapping@2.3.0": version "2.3.0" resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz" integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== @@ -120,7 +120,7 @@ ora "5.4.1" rxjs "7.8.1" -"@angular/animations@^18.1.0": +"@angular/animations@^18.0.0 || ^19.0.0", "@angular/animations@^18.1.0", "@angular/animations@18.1.0": version "18.1.0" resolved "https://registry.npmjs.org/@angular/animations/-/animations-18.1.0.tgz" integrity sha512-K0BhvZ/SIVoGXZVuh1KOJDdgcGlHfFGMGrs58utndndAb+gYXReMfz4GR5cQs2OObH6TKmIOY2EH7Og1CY2tsw== @@ -160,6 +160,15 @@ vite "5.3.2" watchpack "2.4.1" +"@angular/cdk@^18.1.2", "@angular/cdk@18.1.2": + version "18.1.2" + resolved "https://registry.npmjs.org/@angular/cdk/-/cdk-18.1.2.tgz" + integrity sha512-yiAJ/9AMVF2zk7VLEuyJxNJwpV84xLlf0zCaXiYIs6Z8xU6m8N9KR2nqxC59gQc4nTjItmoO/Sgk7XH0X4yGOQ== + dependencies: + tslib "^2.3.0" + optionalDependencies: + parse5 "^7.1.2" + "@angular/cli@~18.1.0": version "18.1.0" resolved "https://registry.npmjs.org/@angular/cli/-/cli-18.1.0.tgz" @@ -183,14 +192,14 @@ symbol-observable "4.0.0" yargs "17.7.2" -"@angular/common@^18.1.0": +"@angular/common@^18.0.0", "@angular/common@^18.0.0 || ^19.0.0", "@angular/common@^18.1.0", "@angular/common@18.1.0": version "18.1.0" resolved "https://registry.npmjs.org/@angular/common/-/common-18.1.0.tgz" integrity sha512-noHDLarQSCZZh7hyNd0HR61Fut+q4QCVq9qc/jKPglfbV/6nPujQSmSpT+rNJlNuBOrCLuvH/CNBNbiqii+x3g== dependencies: tslib "^2.3.0" -"@angular/compiler-cli@^18.1.0": +"@angular/compiler-cli@^18.0.0", "@angular/compiler-cli@^18.1.0": version "18.1.0" resolved "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-18.1.0.tgz" integrity sha512-BBsogLPJwxkPh7f8RVHsxyyqNE8XpHbAanjB5fAwnU4W6Sw1kR5rFzkeZM3xaRm2MDiC8DovIl6hlf+s/mKYOw== @@ -204,27 +213,34 @@ tslib "^2.3.0" yargs "^17.2.1" -"@angular/compiler@^18.1.0": +"@angular/compiler@^18.1.0", "@angular/compiler@18.1.0": version "18.1.0" resolved "https://registry.npmjs.org/@angular/compiler/-/compiler-18.1.0.tgz" integrity sha512-JRQzVTeJGSfRLY+dx+gwu/hPQVB8K+5pW12Z42M9x/HBgGW4in0cO2zHkeQPvImqm0nak82Us1Hyf5C+qTlMMQ== dependencies: tslib "^2.3.0" -"@angular/core@^18.1.0": +"@angular/core@^18.0.0", "@angular/core@^18.0.0 || ^19.0.0", "@angular/core@^18.1.0", "@angular/core@18.1.0": version "18.1.0" resolved "https://registry.npmjs.org/@angular/core/-/core-18.1.0.tgz" integrity sha512-/57/s7CD/0CwlN+3FlhVmx7ypCWXjKi5UKtnlBAUg0D1denIf6ADxwTHFZABYZcYBqOTJgeQUtUw9u/A+0CIlg== dependencies: tslib "^2.3.0" -"@angular/forms@^18.1.0": +"@angular/forms@^18.0.0 || ^19.0.0", "@angular/forms@^18.1.0": version "18.1.0" resolved "https://registry.npmjs.org/@angular/forms/-/forms-18.1.0.tgz" integrity sha512-m+7m9wa+n5dEacd458eSZsZTz0B+HbOtr7/uqM0YTMQaPrhwl1epG5Y103mB6yr00JiJcLNlPLjP888cHFjldQ== dependencies: tslib "^2.3.0" +"@angular/material@^18.1.2": + version "18.1.2" + resolved "https://registry.npmjs.org/@angular/material/-/material-18.1.2.tgz" + integrity sha512-B56pofk3WMqqtNww2W33KRbAu69c+aGYFdNFW45DcdIw9OKV1x/HjhyEchSrUOPOXgJFVTYw2HRhp327ONpetw== + dependencies: + tslib "^2.3.0" + "@angular/platform-browser-dynamic@^18.1.0": version "18.1.0" resolved "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-18.1.0.tgz" @@ -232,14 +248,14 @@ dependencies: tslib "^2.3.0" -"@angular/platform-browser@^18.1.0": +"@angular/platform-browser@^18.0.0 || ^19.0.0", "@angular/platform-browser@^18.1.0", "@angular/platform-browser@18.1.0": version "18.1.0" resolved "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-18.1.0.tgz" integrity sha512-jCmxthiI4Zef54crckNht60xwfIsuciGeyZvb7SsXna2maLW9fA4uz1VhZqIWTiBnHwNynVlyfBX3/jBD7S9+g== dependencies: tslib "^2.3.0" -"@angular/router@^18.1.0": +"@angular/router@^18.0.0", "@angular/router@^18.1.0": version "18.1.0" resolved "https://registry.npmjs.org/@angular/router/-/router-18.1.0.tgz" integrity sha512-dl2cSxZkl4we+rWMxdm123TZzlor6yxwNFI2yT7b6DP2i+rXaaHBSSPet0ASp+UX6djz+Osr56Bifs6wi4rhiQ== @@ -259,7 +275,7 @@ resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.7.tgz" integrity sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw== -"@babel/core@7.24.7", "@babel/core@^7.12.3", "@babel/core@^7.23.9": +"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.0.0-0 || ^8.0.0-0 <8.0.0", "@babel/core@^7.12.0", "@babel/core@^7.12.3", "@babel/core@^7.13.0", "@babel/core@^7.23.9", "@babel/core@^7.4.0 || ^8.0.0-0 <8.0.0", "@babel/core@7.24.7": version "7.24.7" resolved "https://registry.npmjs.org/@babel/core/-/core-7.24.7.tgz" integrity sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g== @@ -280,7 +296,7 @@ json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@7.24.7", "@babel/generator@^7.24.7": +"@babel/generator@^7.24.7", "@babel/generator@7.24.7": version "7.24.7" resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz" integrity sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA== @@ -290,7 +306,7 @@ "@jridgewell/trace-mapping" "^0.3.25" jsesc "^2.5.1" -"@babel/helper-annotate-as-pure@7.24.7", "@babel/helper-annotate-as-pure@^7.24.7": +"@babel/helper-annotate-as-pure@^7.24.7", "@babel/helper-annotate-as-pure@7.24.7": version "7.24.7" resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz" integrity sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg== @@ -446,7 +462,7 @@ "@babel/traverse" "^7.24.7" "@babel/types" "^7.24.7" -"@babel/helper-split-export-declaration@7.24.7", "@babel/helper-split-export-declaration@^7.24.7": +"@babel/helper-split-export-declaration@^7.24.7", "@babel/helper-split-export-declaration@7.24.7": version "7.24.7" resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz" integrity sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA== @@ -580,7 +596,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-syntax-import-attributes@7.24.7", "@babel/plugin-syntax-import-attributes@^7.24.7": +"@babel/plugin-syntax-import-attributes@^7.24.7", "@babel/plugin-syntax-import-attributes@7.24.7": version "7.24.7" resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz" integrity sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A== @@ -672,7 +688,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-async-generator-functions@7.24.7", "@babel/plugin-transform-async-generator-functions@^7.24.7": +"@babel/plugin-transform-async-generator-functions@^7.24.7", "@babel/plugin-transform-async-generator-functions@7.24.7": version "7.24.7" resolved "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.7.tgz" integrity sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g== @@ -682,7 +698,7 @@ "@babel/helper-remap-async-to-generator" "^7.24.7" "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-transform-async-to-generator@7.24.7", "@babel/plugin-transform-async-to-generator@^7.24.7": +"@babel/plugin-transform-async-to-generator@^7.24.7", "@babel/plugin-transform-async-to-generator@7.24.7": version "7.24.7" resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz" integrity sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA== @@ -1165,7 +1181,7 @@ resolved "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== -"@babel/runtime@7.24.7", "@babel/runtime@^7.8.4": +"@babel/runtime@^7.8.4", "@babel/runtime@7.24.7": version "7.24.7" resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.7.tgz" integrity sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw== @@ -1216,121 +1232,23 @@ resolved "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz" integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== -"@esbuild/aix-ppc64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" - integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== - -"@esbuild/android-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" - integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== - -"@esbuild/android-arm@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" - integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== - -"@esbuild/android-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" - integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== - -"@esbuild/darwin-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz" - integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== - -"@esbuild/darwin-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" - integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== - -"@esbuild/freebsd-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" - integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== - -"@esbuild/freebsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" - integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== - -"@esbuild/linux-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" - integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== - -"@esbuild/linux-arm@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" - integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== - -"@esbuild/linux-ia32@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" - integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== - -"@esbuild/linux-loong64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" - integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== - -"@esbuild/linux-mips64el@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" - integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== - -"@esbuild/linux-ppc64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" - integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== - -"@esbuild/linux-riscv64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" - integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== - -"@esbuild/linux-s390x@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" - integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== - -"@esbuild/linux-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" - integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== - -"@esbuild/netbsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" - integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== - -"@esbuild/openbsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" - integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== - -"@esbuild/sunos-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" - integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== - -"@esbuild/win32-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" - integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== - -"@esbuild/win32-ia32@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" - integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== - "@esbuild/win32-x64@0.21.5": version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" + resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz" integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== +"@hirez_io/auto-spies-core@3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@hirez_io/auto-spies-core/-/auto-spies-core-3.0.0.tgz" + integrity sha512-au7s7/AqPU5CJhv0slVjmZqEv5Uaf2nj7pYFepp5g3B7EocEeNy7bZ74x5RJldHYtW0R8OptV2mZfwaDOfcNCA== + dependencies: + javascript-stringify "2.1.0" + +"@hirez_io/observer-spy@^2.2.0": + version "2.2.0" + resolved "https://registry.npmjs.org/@hirez_io/observer-spy/-/observer-spy-2.2.0.tgz" + integrity sha512-G9nv87vjRILgB/X1AtKBv1DZX7yXSYAOCXon/f+QULKoXVhVehYUF5Lv0SQ97ebf1sA48Z2CyQ9h2v4Pz6DgaQ== + "@inquirer/checkbox@^2.3.7": version "2.3.10" resolved "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-2.3.10.tgz" @@ -1342,7 +1260,7 @@ ansi-escapes "^4.3.2" yoctocolors-cjs "^2.1.2" -"@inquirer/confirm@3.1.11", "@inquirer/confirm@^3.1.11": +"@inquirer/confirm@^3.1.11", "@inquirer/confirm@3.1.11": version "3.1.11" resolved "https://registry.npmjs.org/@inquirer/confirm/-/confirm-3.1.11.tgz" integrity sha512-3wWw10VPxQP279FO4bzWsf8YjIAq7NdwATJ4xS2h1uwsXZu/RmtOVV95rZ7yllS1h/dzu+uLewjMAzNDEj8h2w== @@ -1428,7 +1346,7 @@ "@inquirer/type" "^1.4.0" ansi-escapes "^4.3.2" -"@inquirer/prompts@5.0.7": +"@inquirer/prompts@>= 3 < 6", "@inquirer/prompts@5.0.7": version "5.0.7" resolved "https://registry.npmjs.org/@inquirer/prompts/-/prompts-5.0.7.tgz" integrity sha512-GFcigCxJTKCH3aECzMIu4FhgLJWnFvMXzpI4CCSoELWFtkOOU2P+goYA61+OKpGrB8fPE7q6n8zAXBSlZRrHjQ== @@ -1558,64 +1476,14 @@ dependencies: "@inquirer/type" "^1.3.3" -"@lmdb/lmdb-darwin-arm64@3.0.12": - version "3.0.12" - resolved "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.0.12.tgz" - integrity sha512-vgTwzNUD3Hy4aqtGhX2+nV/usI0mwy3hDRuTjs8VcK0BLiMVEpNQXgzwlWEgPmA8AAPloUgyOs2nK5clJF5oIg== - -"@lmdb/lmdb-darwin-x64@3.0.12": - version "3.0.12" - resolved "https://registry.yarnpkg.com/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.0.12.tgz#b73d7b7cc46253320a786e959fa131de90b4a4f9" - integrity sha512-qOt0hAhj2ZLY6aEWu85rzt5zcyCAQITMhCMEPNlo1tuYekpVAdkQNiwXxEkCjBYvwTskvXuwXOOUpjuSc+aJnA== - -"@lmdb/lmdb-linux-arm64@3.0.12": - version "3.0.12" - resolved "https://registry.yarnpkg.com/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.0.12.tgz#c7a74d215728085ec4096feef303ba930e33f9c3" - integrity sha512-Qy4cFXFe9h1wAWMsojex8x1ifvw2kqiZv686YiRTdQEzAfc3vJASHFcD/QejHUCx7YHMYdnUoCS45rG2AiGDTQ== - -"@lmdb/lmdb-linux-arm@3.0.12": - version "3.0.12" - resolved "https://registry.yarnpkg.com/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.0.12.tgz#7a603d8732046b67d475030f72d2dabf68045d32" - integrity sha512-Ggd/UXpE+alMncbELCXA3OKpDj9bDBR3qVO7WRTxstloDglRAHfZmUJgTkeaNKjFO1JHqS7AKy0jba9XebZB1w== - -"@lmdb/lmdb-linux-x64@3.0.12": - version "3.0.12" - resolved "https://registry.yarnpkg.com/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.0.12.tgz#cc1fbf72a57caf7c0fbd6e7ddecae6660e7b57cd" - integrity sha512-c+noT9IofktxktFllKHFmci8ka2SYGSLN17pj/KSl1hg7mmfAiGp4xxFxEwMLTb+SX95vP1DFiR++1I3WLVxvA== - "@lmdb/lmdb-win32-x64@3.0.12": version "3.0.12" - resolved "https://registry.yarnpkg.com/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.0.12.tgz#0e06dc23dfe23c4a9d0a9cbcce1b0af74c8884a0" + resolved "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.0.12.tgz" integrity sha512-CO3MFV8gUx16NU/CyyuumAKblESwvoGVA2XhQKZ976OTOxaTbb8F8D3f0iiZ4MYqsN74jIrFuCmXpPnpjbhfOQ== -"@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3": - version "3.0.3" - resolved "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz" - integrity sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw== - -"@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz#33677a275204898ad8acbf62734fc4dc0b6a4855" - integrity sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw== - -"@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz#19edf7cdc2e7063ee328403c1d895a86dd28f4bb" - integrity sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg== - -"@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz#94fb0543ba2e28766c3fc439cabbe0440ae70159" - integrity sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw== - -"@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz#4a0609ab5fe44d07c9c60a11e4484d3c38bbd6e3" - integrity sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg== - "@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3": version "3.0.3" - resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz#0aa5502d547b57abfc4ac492de68e2006e417242" + resolved "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz" integrity sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ== "@ngneat/falso@^6.2.0": @@ -1626,6 +1494,42 @@ seedrandom "3.0.5" uuid "8.3.2" +"@ngrx/effects@^18.0.1": + version "18.0.1" + resolved "https://registry.npmjs.org/@ngrx/effects/-/effects-18.0.1.tgz" + integrity sha512-ESxJYx31uABixtnWcuDY+HLKyqXKABpPG3LPDMyZrj7lIdjCaTk471QMhRZOme8QQKzlJt0drGfzFo3FM+QYuA== + dependencies: + "@ngrx/operators" "18.0.1" + tslib "^2.0.0" + +"@ngrx/operators@18.0.1": + version "18.0.1" + resolved "https://registry.npmjs.org/@ngrx/operators/-/operators-18.0.1.tgz" + integrity sha512-M+QMrHNKgcuiLaRGZxJ4aQi5/OCRfKC4+T/63dsHyLFZ53/FFpF6a/ytSO1Q+tzOplZ5o99S+i8FVaZqNQ3LmQ== + dependencies: + tslib "^2.3.0" + +"@ngrx/router-store@^18.0.1": + version "18.0.1" + resolved "https://registry.npmjs.org/@ngrx/router-store/-/router-store-18.0.1.tgz" + integrity sha512-OrgM6DkYOES7S/NQilxbTk5xtfZTrD3hlM2CsB4TBbV6zvOW0F8HpazcXffFXi9T9y34W1Y4pMzpKHoMTIHF/g== + dependencies: + tslib "^2.0.0" + +"@ngrx/store-devtools@^18.0.1": + version "18.0.1" + resolved "https://registry.npmjs.org/@ngrx/store-devtools/-/store-devtools-18.0.1.tgz" + integrity sha512-necHUUcLd41mpObOSuyGQSVyDq4Tb+uejG16WmA6VwXufaUqEl385aumKiS1KLtUP8TQQzogaogaMMDtqtznsQ== + dependencies: + tslib "^2.0.0" + +"@ngrx/store@^18.0.1", "@ngrx/store@18.0.1": + version "18.0.1" + resolved "https://registry.npmjs.org/@ngrx/store/-/store-18.0.1.tgz" + integrity sha512-TxZiQz06fGSxQ0clYfzkH4NCr6tfa8A7zqzkvvOOK1ZezOHHsk0vZJJtgxQcKUqAQxPpbp5+Z7YR8P/Fuid7GQ== + dependencies: + tslib "^2.0.0" + "@ngtools/webpack@18.1.0": version "18.1.0" resolved "https://registry.npmjs.org/@ngtools/webpack/-/webpack-18.1.0.tgz" @@ -1639,7 +1543,7 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": version "2.0.5" resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== @@ -1740,164 +1644,14 @@ resolved "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== -"@rollup/rollup-android-arm-eabi@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz#bbd0e616b2078cd2d68afc9824d1fadb2f2ffd27" - integrity sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ== - -"@rollup/rollup-android-arm-eabi@4.18.1": - version "4.18.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.1.tgz#f0da481244b7d9ea15296b35f7fe39cd81157396" - integrity sha512-lncuC4aHicncmbORnx+dUaAgzee9cm/PbIqgWz1PpXuwc+sa1Ct83tnqUDy/GFKleLiN7ZIeytM6KJ4cAn1SxA== - -"@rollup/rollup-android-arm64@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz#97255ef6384c5f73f4800c0de91f5f6518e21203" - integrity sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA== - -"@rollup/rollup-android-arm64@4.18.1": - version "4.18.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.1.tgz#82ab3c575f4235fb647abea5e08eec6cf325964e" - integrity sha512-F/tkdw0WSs4ojqz5Ovrw5r9odqzFjb5LIgHdHZG65dFI1lWTWRVy32KDJLKRISHgJvqUeUhdIvy43fX41znyDg== - -"@rollup/rollup-darwin-arm64@4.18.0": - version "4.18.0" - resolved "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz" - integrity sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w== - -"@rollup/rollup-darwin-arm64@4.18.1": - version "4.18.1" - resolved "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.1.tgz" - integrity sha512-vk+ma8iC1ebje/ahpxpnrfVQJibTMyHdWpOGZ3JpQ7Mgn/3QNHmPq7YwjZbIE7km73dH5M1e6MRRsnEBW7v5CQ== - -"@rollup/rollup-darwin-x64@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz#e07d76de1cec987673e7f3d48ccb8e106d42c05c" - integrity sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA== - -"@rollup/rollup-darwin-x64@4.18.1": - version "4.18.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.1.tgz#47727479f5ca292cf434d7e75af2725b724ecbc7" - integrity sha512-IgpzXKauRe1Tafcej9STjSSuG0Ghu/xGYH+qG6JwsAUxXrnkvNHcq/NL6nz1+jzvWAnQkuAJ4uIwGB48K9OCGA== - -"@rollup/rollup-linux-arm-gnueabihf@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz#9f1a6d218b560c9d75185af4b8bb42f9f24736b8" - integrity sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA== - -"@rollup/rollup-linux-arm-gnueabihf@4.18.1": - version "4.18.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.1.tgz#46193c498aa7902a8db89ac00128060320e84fef" - integrity sha512-P9bSiAUnSSM7EmyRK+e5wgpqai86QOSv8BwvkGjLwYuOpaeomiZWifEos517CwbG+aZl1T4clSE1YqqH2JRs+g== - -"@rollup/rollup-linux-arm-musleabihf@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz#53618b92e6ffb642c7b620e6e528446511330549" - integrity sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A== - -"@rollup/rollup-linux-arm-musleabihf@4.18.1": - version "4.18.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.1.tgz#22d831fe239643c1d05c98906420325cee439d85" - integrity sha512-5RnjpACoxtS+aWOI1dURKno11d7krfpGDEn19jI8BuWmSBbUC4ytIADfROM1FZrFhQPSoP+KEa3NlEScznBTyQ== - -"@rollup/rollup-linux-arm64-gnu@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz#99a7ba5e719d4f053761a698f7b52291cefba577" - integrity sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw== - -"@rollup/rollup-linux-arm64-gnu@4.18.1": - version "4.18.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.1.tgz#19abd33695ec9d588b4a858d122631433084e4a3" - integrity sha512-8mwmGD668m8WaGbthrEYZ9CBmPug2QPGWxhJxh/vCgBjro5o96gL04WLlg5BA233OCWLqERy4YUzX3bJGXaJgQ== - -"@rollup/rollup-linux-arm64-musl@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz#f53db99a45d9bc00ce94db8a35efa7c3c144a58c" - integrity sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ== - -"@rollup/rollup-linux-arm64-musl@4.18.1": - version "4.18.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.1.tgz#d60af8c0b9be424424ff96a0ba19fce65d26f6ab" - integrity sha512-dJX9u4r4bqInMGOAQoGYdwDP8lQiisWb9et+T84l2WXk41yEej8v2iGKodmdKimT8cTAYt0jFb+UEBxnPkbXEQ== - -"@rollup/rollup-linux-powerpc64le-gnu@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz#cbb0837408fe081ce3435cf3730e090febafc9bf" - integrity sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA== - -"@rollup/rollup-linux-powerpc64le-gnu@4.18.1": - version "4.18.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.1.tgz#b1194e5ed6d138fdde0842d126fccde74a90f457" - integrity sha512-V72cXdTl4EI0x6FNmho4D502sy7ed+LuVW6Ym8aI6DRQ9hQZdp5sj0a2usYOlqvFBNKQnLQGwmYnujo2HvjCxQ== - -"@rollup/rollup-linux-riscv64-gnu@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz#8ed09c1d1262ada4c38d791a28ae0fea28b80cc9" - integrity sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg== - -"@rollup/rollup-linux-riscv64-gnu@4.18.1": - version "4.18.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.1.tgz#f5a635c017b9bff8b856b0221fbd5c0e3373b7ec" - integrity sha512-f+pJih7sxoKmbjghrM2RkWo2WHUW8UbfxIQiWo5yeCaCM0TveMEuAzKJte4QskBp1TIinpnRcxkquY+4WuY/tg== - -"@rollup/rollup-linux-s390x-gnu@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz#938138d3c8e0c96f022252a28441dcfb17afd7ec" - integrity sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg== - -"@rollup/rollup-linux-s390x-gnu@4.18.1": - version "4.18.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.1.tgz#f1043d9f4026bf6995863cb3f8dd4732606e4baa" - integrity sha512-qb1hMMT3Fr/Qz1OKovCuUM11MUNLUuHeBC2DPPAWUYYUAOFWaxInaTwTQmc7Fl5La7DShTEpmYwgdt2hG+4TEg== - -"@rollup/rollup-linux-x64-gnu@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz#1a7481137a54740bee1ded4ae5752450f155d942" - integrity sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w== - -"@rollup/rollup-linux-x64-gnu@4.18.1": - version "4.18.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.1.tgz#1e781730be445119f06c9df5f185e193bc82c610" - integrity sha512-7O5u/p6oKUFYjRbZkL2FLbwsyoJAjyeXHCU3O4ndvzg2OFO2GinFPSJFGbiwFDaCFc+k7gs9CF243PwdPQFh5g== - -"@rollup/rollup-linux-x64-musl@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz#f1186afc601ac4f4fc25fac4ca15ecbee3a1874d" - integrity sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg== - -"@rollup/rollup-linux-x64-musl@4.18.1": - version "4.18.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.1.tgz#08f12e1965d6f27d6898ff932592121cca6abc4b" - integrity sha512-pDLkYITdYrH/9Cv/Vlj8HppDuLMDUBmgsM0+N+xLtFd18aXgM9Nyqupb/Uw+HeidhfYg2lD6CXvz6CjoVOaKjQ== - -"@rollup/rollup-win32-arm64-msvc@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz#ed6603e93636a96203c6915be4117245c1bd2daf" - integrity sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA== - -"@rollup/rollup-win32-arm64-msvc@4.18.1": - version "4.18.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.1.tgz#4a5dcbbe7af7d41cac92b09798e7c1831da1f599" - integrity sha512-W2ZNI323O/8pJdBGil1oCauuCzmVd9lDmWBBqxYZcOqWD6aWqJtVBQ1dFrF4dYpZPks6F+xCZHfzG5hYlSHZ6g== - -"@rollup/rollup-win32-ia32-msvc@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz#14e0b404b1c25ebe6157a15edb9c46959ba74c54" - integrity sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg== - -"@rollup/rollup-win32-ia32-msvc@4.18.1": - version "4.18.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.1.tgz#075b0713de627843a73b4cf0e087c56b53e9d780" - integrity sha512-ELfEX1/+eGZYMaCIbK4jqLxO1gyTSOIlZr6pbC4SRYFaSIDVKOnZNMdoZ+ON0mrFDp4+H5MhwNC1H/AhE3zQLg== - "@rollup/rollup-win32-x64-msvc@4.18.0": version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz#5d694d345ce36b6ecf657349e03eb87297e68da4" + resolved "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz" integrity sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g== "@rollup/rollup-win32-x64-msvc@4.18.1": version "4.18.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.1.tgz#0cb240c147c0dfd0e3eaff4cc060a772d39e155c" + resolved "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.1.tgz" integrity sha512-yjk2MAkQmoaPYCSu35RLJ62+dz358nE83VfTePJRp8CG7aMg25mEJYpXFiD+NcevhX8LxD5OP5tktPXnXN7GDw== "@schematics/angular@18.1.0": @@ -2034,7 +1788,7 @@ "@types/estree" "*" "@types/json-schema" "*" -"@types/estree@*", "@types/estree@1.0.5", "@types/estree@^1.0.5": +"@types/estree@*", "@types/estree@^1.0.5", "@types/estree@1.0.5": version "1.0.5" resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz" integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== @@ -2049,7 +1803,7 @@ "@types/range-parser" "*" "@types/send" "*" -"@types/express@*", "@types/express@^4.17.21": +"@types/express@*", "@types/express@^4.17.13", "@types/express@^4.17.21": version "4.17.21" resolved "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz" integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ== @@ -2100,7 +1854,7 @@ dependencies: "@types/node" "*" -"@types/node@*", "@types/node@>=10.0.0", "@types/node@^20.14.9": +"@types/node@*", "@types/node@^18.0.0 || >=20.0.0", "@types/node@^20.14.9", "@types/node@>=10.0.0": version "20.14.10" resolved "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz" integrity sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ== @@ -2170,7 +1924,7 @@ resolved "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.1.0.tgz" integrity sha512-wO4Dk/rm8u7RNhOf95ZzcEmC9rYOncYgvq4z3duaJrCgjN8BxAnDVyndanfcJZ0O6XZzHz6Q0hTimxTg8Y9g/A== -"@webassemblyjs/ast@1.12.1", "@webassemblyjs/ast@^1.12.1": +"@webassemblyjs/ast@^1.12.1", "@webassemblyjs/ast@1.12.1": version "1.12.1" resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz" integrity sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg== @@ -2271,7 +2025,7 @@ "@webassemblyjs/wasm-gen" "1.12.1" "@webassemblyjs/wasm-parser" "1.12.1" -"@webassemblyjs/wasm-parser@1.12.1", "@webassemblyjs/wasm-parser@^1.12.1": +"@webassemblyjs/wasm-parser@^1.12.1", "@webassemblyjs/wasm-parser@1.12.1": version "1.12.1" resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz" integrity sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ== @@ -2324,7 +2078,7 @@ acorn-import-attributes@^1.9.5: resolved "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz" integrity sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ== -acorn@^8.7.1, acorn@^8.8.2: +acorn@^8, acorn@^8.7.1, acorn@^8.8.2: version "8.12.1" resolved "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz" integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== @@ -2352,13 +2106,6 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" -ajv-formats@3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz" - integrity sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ== - dependencies: - ajv "^8.0.0" - ajv-formats@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz" @@ -2366,6 +2113,13 @@ ajv-formats@^2.1.1: dependencies: ajv "^8.0.0" +ajv-formats@3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz" + integrity sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ== + dependencies: + ajv "^8.0.0" + ajv-keywords@^3.5.2: version "3.5.2" resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz" @@ -2378,17 +2132,7 @@ ajv-keywords@^5.1.0: dependencies: fast-deep-equal "^3.1.3" -ajv@8.16.0, ajv@^8.0.0, ajv@^8.9.0: - version "8.16.0" - resolved "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz" - integrity sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw== - dependencies: - fast-deep-equal "^3.1.3" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.4.1" - -ajv@^6.12.5: +ajv@^6.12.5, ajv@^6.9.1: version "6.12.6" resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -2398,6 +2142,16 @@ ajv@^6.12.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@^8.0.0, ajv@^8.8.2, ajv@^8.9.0, ajv@8.16.0: + version "8.16.0" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz" + integrity sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw== + dependencies: + fast-deep-equal "^3.1.3" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.4.1" + ansi-colors@4.1.3: version "4.1.3" resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz" @@ -2437,14 +2191,31 @@ ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" -ansi-styles@^4.0.0, ansi-styles@^4.1.0: +ansi-styles@^4.0.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" -ansi-styles@^6.0.0, ansi-styles@^6.1.0, ansi-styles@^6.2.1: +ansi-styles@^6.0.0: + version "6.2.1" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + +ansi-styles@^6.2.1: version "6.2.1" resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== @@ -2521,7 +2292,7 @@ base64-js@^1.3.1: resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== -base64id@2.0.0, base64id@~2.0.0: +base64id@~2.0.0, base64id@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz" integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== @@ -2550,7 +2321,7 @@ bl@^4.1.0: inherits "^2.0.4" readable-stream "^3.4.0" -body-parser@1.20.2, body-parser@^1.19.0: +body-parser@^1.19.0, body-parser@1.20.2: version "1.20.2" resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz" integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== @@ -2603,7 +2374,7 @@ braces@^3.0.2, braces@^3.0.3, braces@~3.0.2: dependencies: fill-range "^7.1.1" -browserslist@^4.21.10, browserslist@^4.21.5, browserslist@^4.22.2, browserslist@^4.23.0: +browserslist@^4.21.10, browserslist@^4.21.5, browserslist@^4.22.2, browserslist@^4.23.0, "browserslist@>= 4.21.0": version "4.23.2" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.23.2.tgz" integrity sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA== @@ -2704,7 +2475,7 @@ chardet@^0.7.0: resolved "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -"chokidar@>=3.0.0 <4.0.0", chokidar@^3.0.0, chokidar@^3.5.1, chokidar@^3.6.0: +chokidar@^3.0.0, chokidar@^3.5.1, chokidar@^3.5.2, chokidar@^3.6.0, "chokidar@>=3.0.0 <4.0.0": version "3.6.0" resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz" integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== @@ -2812,16 +2583,16 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - color-name@~1.1.4: version "1.1.4" resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + colorette@^2.0.10, colorette@^2.0.20: version "2.0.20" resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz" @@ -2904,16 +2675,16 @@ cookie-signature@1.0.6: resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== -cookie@0.6.0: - version "0.6.0" - resolved "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz" - integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== - cookie@~0.4.1: version "0.4.2" resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz" integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== +cookie@0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz" + integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== + copy-anything@^2.0.1: version "2.0.6" resolved "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz" @@ -3030,26 +2801,26 @@ date-format@^4.0.14: resolved "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz" integrity sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg== -debug@2.6.9: - version "2.6.9" - resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== +debug@^3.2.6: + version "3.2.7" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: - ms "2.0.0" + ms "^2.1.1" -debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2: +debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2, debug@4: version "4.3.4" resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" -debug@^3.2.6: - version "3.2.7" - resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== +debug@2.6.9: + version "2.6.9" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: - ms "^2.1.1" + ms "2.0.0" default-browser-id@^5.0.0: version "5.0.0" @@ -3092,16 +2863,16 @@ define-lazy-prop@^3.0.0: resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz" integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== -depd@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - depd@~1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== +depd@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + destroy@1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" @@ -3301,7 +3072,7 @@ esbuild-wasm@0.21.5: resolved "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.21.5.tgz" integrity sha512-L/FlOPMMFtw+6qPAbuPvJXdrOYOp9yx/PEwSrIZW0qghY4vgV003evdYDwqQ/9ENMQI0B6RMod9xT4FHtto6OQ== -esbuild@0.21.5, esbuild@^0.21.3: +esbuild@^0.21.3, esbuild@0.21.5: version "0.21.5" resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz" integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== @@ -3471,7 +3242,7 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-glob@3.3.2, fast-glob@^3.3.2: +fast-glob@^3.3.2, fast-glob@3.3.2: version "3.3.2" resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz" integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== @@ -3616,11 +3387,6 @@ fs.realpath@^1.0.0: resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@~2.3.2, fsevents@~2.3.3: - version "2.3.3" - resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - function-bind@^1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" @@ -3688,7 +3454,7 @@ glob@^10.2.2, glob@^10.3.10, glob@^10.3.7: package-json-from-dist "^1.0.0" path-scurry "^1.11.1" -glob@^7.1.3, glob@^7.1.7: +glob@^7.1.3: version "7.2.3" resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -3700,14 +3466,26 @@ glob@^7.1.3, glob@^7.1.7: once "^1.3.0" path-is-absolute "^1.0.0" -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globby@^14.0.0: - version "14.0.2" - resolved "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz" +glob@^7.1.7: + version "7.2.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globby@^14.0.0: + version "14.0.2" + resolved "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz" integrity sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw== dependencies: "@sindresorhus/merge-streams" "^2.1.0" @@ -3815,6 +3593,16 @@ http-deceiver@^1.2.7: resolved "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz" integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" + integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + http-errors@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" @@ -3826,16 +3614,6 @@ http-errors@2.0.0: statuses "2.0.1" toidentifier "1.0.1" -http-errors@~1.6.2: - version "1.6.3" - resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" - integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.0" - statuses ">= 1.4.0 < 2" - http-parser-js@>=0.5.1: version "0.5.8" resolved "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz" @@ -3849,6 +3627,17 @@ http-proxy-agent@^7.0.0: agent-base "^7.1.0" debug "^4.3.4" +http-proxy-middleware@^2.0.3: + version "2.0.6" + resolved "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz" + integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== + dependencies: + "@types/http-proxy" "^1.17.8" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" + http-proxy-middleware@3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-3.0.0.tgz" @@ -3861,17 +3650,6 @@ http-proxy-middleware@3.0.0: is-plain-obj "^3.0.0" micromatch "^4.0.5" -http-proxy-middleware@^2.0.3: - version "2.0.6" - resolved "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz" - integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== - dependencies: - "@types/http-proxy" "^1.17.8" - http-proxy "^1.18.1" - is-glob "^4.0.1" - is-plain-obj "^3.0.0" - micromatch "^4.0.2" - http-proxy@^1.18.1: version "1.18.1" resolved "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz" @@ -3881,7 +3659,7 @@ http-proxy@^1.18.1: follow-redirects "^1.0.0" requires-port "^1.0.0" -https-proxy-agent@7.0.5, https-proxy-agent@^7.0.1: +https-proxy-agent@^7.0.1, https-proxy-agent@7.0.5: version "7.0.5" resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz" integrity sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw== @@ -3899,14 +3677,21 @@ hyperdyperid@^1.2.0: resolved "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz" integrity sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A== -iconv-lite@0.4.24, iconv-lite@^0.4.24: +iconv-lite@^0.4.24, iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@^0.6.2, iconv-lite@^0.6.3: +iconv-lite@^0.6.2: + version "0.6.3" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +iconv-lite@^0.6.3: version "0.6.3" resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== @@ -3971,7 +3756,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: +inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@2, inherits@2.0.4: version "2.0.4" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -3981,7 +3766,7 @@ inherits@2.0.3: resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== -ini@4.1.3, ini@^4.1.3: +ini@^4.1.3, ini@4.1.3: version "4.1.3" resolved "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz" integrity sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg== @@ -3994,16 +3779,16 @@ ip-address@^9.0.5: jsbn "1.1.0" sprintf-js "^1.1.3" -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - ipaddr.js@^2.1.0: version "2.2.0" resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz" integrity sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA== +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" @@ -4148,17 +3933,6 @@ istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz" integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== -istanbul-lib-instrument@6.0.2: - version "6.0.2" - resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz" - integrity sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw== - dependencies: - "@babel/core" "^7.23.9" - "@babel/parser" "^7.23.9" - "@istanbuljs/schema" "^0.1.3" - istanbul-lib-coverage "^3.2.0" - semver "^7.5.4" - istanbul-lib-instrument@^5.1.0: version "5.2.1" resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz" @@ -4170,6 +3944,17 @@ istanbul-lib-instrument@^5.1.0: istanbul-lib-coverage "^3.2.0" semver "^6.3.0" +istanbul-lib-instrument@6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz" + integrity sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw== + dependencies: + "@babel/core" "^7.23.9" + "@babel/parser" "^7.23.9" + "@istanbuljs/schema" "^0.1.3" + istanbul-lib-coverage "^3.2.0" + semver "^7.5.4" + istanbul-lib-report@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" @@ -4205,11 +3990,23 @@ jackspeak@^3.1.2: optionalDependencies: "@pkgjs/parseargs" "^0.11.0" -jasmine-core@^4.1.0, jasmine-core@~4.5.0: +jasmine-auto-spies@^8.0.1: + version "8.0.1" + resolved "https://registry.npmjs.org/jasmine-auto-spies/-/jasmine-auto-spies-8.0.1.tgz" + integrity sha512-4T8YVS6VJ7VoCdAOqEh3sziD6Wf/m+dfGGQ1a7GZHqjZUjaSD0Be+KqP7CmTiBc3HrX+uvOXr380QIW+TfHhqA== + dependencies: + "@hirez_io/auto-spies-core" "3.0.0" + +jasmine-core@^4.0.0, jasmine-core@^4.1.0, "jasmine-core@>=2.6.0 < 6", jasmine-core@~4.5.0: version "4.5.0" resolved "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.5.0.tgz" integrity sha512-9PMzyvhtocxb3aXJVOPqBDswdgyAeSB81QnLop4npOpbqnheaTEwPc9ZloQeVswugPManznQBjD8kWDTjlnHuw== +javascript-stringify@2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.1.0.tgz" + integrity sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg== + jest-worker@^27.4.5: version "27.5.1" resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz" @@ -4317,7 +4114,7 @@ karma-jasmine-html-reporter@~2.0.0: resolved "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-2.0.0.tgz" integrity sha512-SB8HNNiazAHXM1vGEzf8/tSyEhkfxuDdhYdPBX2Mwgzt0OuF2gicApQ+uvXLID/gXyJQgvrM9+1/2SxZFUUDIA== -karma-jasmine@~5.1.0: +karma-jasmine@^5.0.0, karma-jasmine@~5.1.0: version "5.1.0" resolved "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-5.1.0.tgz" integrity sha512-i/zQLFrfEpRyQoJF9fsCdTMOF5c2dK7C7OmsuKg2D0YSsuZSfQDiLuaiktbuio6F2wiCsZSnSnieIQ0ant/uzQ== @@ -4331,7 +4128,7 @@ karma-source-map-support@1.4.0: dependencies: source-map-support "^0.5.5" -karma@~6.4.0: +karma@^6.0.0, karma@^6.3.0, karma@~6.4.0: version "6.4.1" resolved "https://registry.npmjs.org/karma/-/karma-6.4.1.tgz" integrity sha512-Cj57NKOskK7wtFWSlMvZf459iX+kpYIPXmkNUzP2WAFcA7nhr/ALn5R7sw3w+1udFDcpMx/tuB8d5amgm3ijaA== @@ -4379,7 +4176,7 @@ less-loader@12.2.0: resolved "https://registry.npmjs.org/less-loader/-/less-loader-12.2.0.tgz" integrity sha512-MYUxjSQSBUQmowc0l5nPieOYwMzGPUaTzB6inNW/bdPEG9zOL3eAAD1Qw5ZxSPk7we5dMojHwNODYMV1hq4EVg== -less@4.2.0: +less@*, "less@^3.5.0 || ^4.0.0", less@^4.2.0, less@4.2.0: version "4.2.0" resolved "https://registry.npmjs.org/less/-/less-4.2.0.tgz" integrity sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA== @@ -4443,11 +4240,6 @@ loader-runner@^4.2.0: resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz" integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== -loader-utils@3.3.1: - version "3.3.1" - resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz" - integrity sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg== - loader-utils@^2.0.0: version "2.0.4" resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz" @@ -4457,6 +4249,11 @@ loader-utils@^2.0.0: emojis-list "^3.0.0" json5 "^2.1.2" +loader-utils@3.3.1: + version "3.3.1" + resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz" + integrity sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg== + locate-path@^7.1.0: version "7.2.0" resolved "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz" @@ -4504,7 +4301,12 @@ log4js@^6.4.1: rfdc "^1.3.0" streamroller "^3.1.3" -lru-cache@^10.0.1, lru-cache@^10.2.0: +lru-cache@^10.0.1: + version "10.4.3" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz" + integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== + +lru-cache@^10.2.0: version "10.4.3" resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz" integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== @@ -4599,7 +4401,7 @@ micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: braces "^3.0.3" picomatch "^2.3.1" -mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": +"mime-db@>= 1.43.0 < 2", mime-db@1.52.0: version "1.52.0" resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== @@ -4611,7 +4413,7 @@ mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, dependencies: mime-db "1.52.0" -mime@1.6.0, mime@^1.4.1: +mime@^1.4.1: version "1.6.0" resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== @@ -4621,6 +4423,11 @@ mime@^2.5.2: resolved "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz" integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== +mime@1.6.0: + version "1.6.0" + resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" @@ -4704,16 +4511,16 @@ minipass@^3.0.0: dependencies: yallist "^4.0.0" -minipass@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz" - integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== - "minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.2, minipass@^7.0.3, minipass@^7.1.2: version "7.1.2" resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz" integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== +minipass@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz" + integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== + minizlib@^2.1.1, minizlib@^2.1.2: version "2.1.2" resolved "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz" @@ -4739,16 +4546,16 @@ mrmime@2.0.0: resolved "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz" integrity sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw== +ms@^2.1.1, ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + ms@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== -ms@2.1.2, ms@^2.1.1: - version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - ms@2.1.3: version "2.1.3" resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" @@ -4802,7 +4609,7 @@ needle@^3.1.0: iconv-lite "^0.6.3" sax "^1.2.4" -negotiator@0.6.3, negotiator@^0.6.3: +negotiator@^0.6.3, negotiator@0.6.3: version "0.6.3" resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== @@ -4812,19 +4619,6 @@ neo-async@^2.6.2: resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== -nice-napi@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz" - integrity sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA== - dependencies: - node-addon-api "^3.0.0" - node-gyp-build "^4.2.2" - -node-addon-api@^3.0.0: - version "3.2.1" - resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz" - integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== - node-addon-api@^6.1.0: version "6.1.0" resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz" @@ -4842,11 +4636,6 @@ node-gyp-build-optional-packages@5.2.2: dependencies: detect-libc "^2.0.1" -node-gyp-build@^4.2.2: - version "4.8.1" - resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.1.tgz" - integrity sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw== - node-gyp@^10.0.0: version "10.2.0" resolved "https://registry.npmjs.org/node-gyp/-/node-gyp-10.2.0.tgz" @@ -4913,7 +4702,7 @@ npm-normalize-package-bin@^3.0.0: resolved "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz" integrity sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ== -npm-package-arg@11.0.2, npm-package-arg@^11.0.0: +npm-package-arg@^11.0.0, npm-package-arg@11.0.2: version "11.0.2" resolved "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.2.tgz" integrity sha512-IGN0IAwmhDJwy13Wc8k+4PEbTPhpJnMtfR53ZbOyjkvmEcLS4nCwp6mvMWjS5sUjeiW3mpx6cHmuhKEu9XmcQw== @@ -4930,7 +4719,7 @@ npm-packlist@^8.0.0: dependencies: ignore-walk "^6.0.4" -npm-pick-manifest@9.0.1, npm-pick-manifest@^9.0.0: +npm-pick-manifest@^9.0.0, npm-pick-manifest@9.0.1: version "9.0.1" resolved "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-9.0.1.tgz" integrity sha512-Udm1f0l2nXb3wxDpKjfohwgdFUSV50UVwzEIpDXVsbDMXVIEF81a/i0UhuQbhrPMMmdiq3+YMFLFIRVLs3hxQw== @@ -4983,7 +4772,7 @@ obuf@^1.0.0, obuf@^1.1.2: resolved "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== -on-finished@2.4.1, on-finished@^2.4.1: +on-finished@^2.4.1, on-finished@2.4.1: version "2.4.1" resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== @@ -5016,7 +4805,7 @@ onetime@^5.1.0, onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" -open@10.1.0, open@^10.0.3: +open@^10.0.3, open@10.1.0: version "10.1.0" resolved "https://registry.npmjs.org/open/-/open-10.1.0.tgz" integrity sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw== @@ -5147,7 +4936,7 @@ parse5-sax-parser@^7.0.0: dependencies: parse5 "^7.0.0" -parse5@^7.0.0: +parse5@^7.0.0, parse5@^7.1.2: version "7.1.2" resolved "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz" integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== @@ -5202,16 +4991,16 @@ picocolors@^1.0.0, picocolors@^1.0.1: resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz" integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== -picomatch@4.0.2: - version "4.0.2" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz" - integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== - picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +picomatch@4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz" + integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== + pify@^4.0.1: version "4.0.1" resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz" @@ -5286,7 +5075,7 @@ postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@8.4.38, postcss@^8.2.14, postcss@^8.4.23, postcss@^8.4.33, postcss@^8.4.38: +"postcss@^7.0.0 || ^8.0.1", postcss@^8.1.0, postcss@^8.2.14, postcss@^8.4.0, postcss@^8.4.23, postcss@^8.4.33, postcss@^8.4.38, postcss@8.4.38: version "8.4.38" resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz" integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== @@ -5488,7 +5277,7 @@ resolve-url-loader@5.0.0: postcss "^8.2.14" source-map "0.6.1" -resolve@1.22.8, resolve@^1.14.2: +resolve@^1.14.2, resolve@1.22.8: version "1.22.8" resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== @@ -5547,31 +5336,6 @@ rimraf@^5.0.5: dependencies: glob "^10.3.7" -rollup@4.18.0: - version "4.18.0" - resolved "https://registry.npmjs.org/rollup/-/rollup-4.18.0.tgz" - integrity sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg== - dependencies: - "@types/estree" "1.0.5" - optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.18.0" - "@rollup/rollup-android-arm64" "4.18.0" - "@rollup/rollup-darwin-arm64" "4.18.0" - "@rollup/rollup-darwin-x64" "4.18.0" - "@rollup/rollup-linux-arm-gnueabihf" "4.18.0" - "@rollup/rollup-linux-arm-musleabihf" "4.18.0" - "@rollup/rollup-linux-arm64-gnu" "4.18.0" - "@rollup/rollup-linux-arm64-musl" "4.18.0" - "@rollup/rollup-linux-powerpc64le-gnu" "4.18.0" - "@rollup/rollup-linux-riscv64-gnu" "4.18.0" - "@rollup/rollup-linux-s390x-gnu" "4.18.0" - "@rollup/rollup-linux-x64-gnu" "4.18.0" - "@rollup/rollup-linux-x64-musl" "4.18.0" - "@rollup/rollup-win32-arm64-msvc" "4.18.0" - "@rollup/rollup-win32-ia32-msvc" "4.18.0" - "@rollup/rollup-win32-x64-msvc" "4.18.0" - fsevents "~2.3.2" - rollup@^4.13.0: version "4.18.1" resolved "https://registry.npmjs.org/rollup/-/rollup-4.18.1.tgz" @@ -5597,6 +5361,31 @@ rollup@^4.13.0: "@rollup/rollup-win32-x64-msvc" "4.18.1" fsevents "~2.3.2" +rollup@4.18.0: + version "4.18.0" + resolved "https://registry.npmjs.org/rollup/-/rollup-4.18.0.tgz" + integrity sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg== + dependencies: + "@types/estree" "1.0.5" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.18.0" + "@rollup/rollup-android-arm64" "4.18.0" + "@rollup/rollup-darwin-arm64" "4.18.0" + "@rollup/rollup-darwin-x64" "4.18.0" + "@rollup/rollup-linux-arm-gnueabihf" "4.18.0" + "@rollup/rollup-linux-arm-musleabihf" "4.18.0" + "@rollup/rollup-linux-arm64-gnu" "4.18.0" + "@rollup/rollup-linux-arm64-musl" "4.18.0" + "@rollup/rollup-linux-powerpc64le-gnu" "4.18.0" + "@rollup/rollup-linux-riscv64-gnu" "4.18.0" + "@rollup/rollup-linux-s390x-gnu" "4.18.0" + "@rollup/rollup-linux-x64-gnu" "4.18.0" + "@rollup/rollup-linux-x64-musl" "4.18.0" + "@rollup/rollup-win32-arm64-msvc" "4.18.0" + "@rollup/rollup-win32-ia32-msvc" "4.18.0" + "@rollup/rollup-win32-x64-msvc" "4.18.0" + fsevents "~2.3.2" + run-applescript@^7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz" @@ -5609,6 +5398,13 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" +"rxjs@^6.5.3 || ^7.4.0", "rxjs@^6.5.3 || ^7.5.0", rxjs@>=6.0.0, "rxjs@>=6.0.0 < 8", rxjs@~7.5.0: + version "7.5.7" + resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz" + integrity sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA== + dependencies: + tslib "^2.1.0" + rxjs@7.8.1: version "7.8.1" resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz" @@ -5616,22 +5412,20 @@ rxjs@7.8.1: dependencies: tslib "^2.1.0" -rxjs@~7.5.0: - version "7.5.7" - resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz" - integrity sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA== - dependencies: - tslib "^2.1.0" +safe-buffer@^5.1.0, safe-buffer@>=5.1.0, safe-buffer@~5.2.0, safe-buffer@5.2.1: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-buffer@5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" @@ -5645,7 +5439,7 @@ sass-loader@14.2.1: dependencies: neo-async "^2.6.2" -sass@1.77.6: +sass@*, sass@^1.3.0, sass@1.77.6: version "1.77.6" resolved "https://registry.npmjs.org/sass/-/sass-1.77.6.tgz" integrity sha512-ByXE1oLD79GVq9Ht1PeHWCPMPB8XHpBuz1r85oByKHjZY6qV6rWnQovQzXJXuQ/XyE1Oj3iPk3lo28uzaRA2/Q== @@ -5659,7 +5453,16 @@ sax@^1.2.4: resolved "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -schema-utils@^3.1.1, schema-utils@^3.2.0: +schema-utils@^3.1.1: + version "3.3.0" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz" + integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^3.2.0: version "3.3.0" resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz" integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== @@ -5696,17 +5499,17 @@ selfsigned@^2.4.1: "@types/node-forge" "^1.3.0" node-forge "^1" -semver@7.6.2, semver@^7.0.0, semver@^7.1.1, semver@^7.3.5, semver@^7.5.3, semver@^7.5.4: - version "7.6.2" - resolved "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz" - integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== - semver@^5.6.0: version "5.7.1" resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@^6.0.0, semver@^6.3.0: +semver@^6.0.0: + version "6.3.0" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^6.3.0: version "6.3.0" resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== @@ -5716,6 +5519,11 @@ semver@^6.3.1: resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== +semver@^7.0.0, semver@^7.1.1, semver@^7.3.5, semver@^7.5.3, semver@^7.5.4, semver@7.6.2: + version "7.6.2" + resolved "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz" + integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== + send@0.18.0: version "0.18.0" resolved "https://registry.npmjs.org/send/-/send-0.18.0.tgz" @@ -5825,7 +5633,12 @@ signal-exit@^3.0.2, signal-exit@^3.0.3: resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== -signal-exit@^4.0.1, signal-exit@^4.1.0: +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + +signal-exit@^4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== @@ -5919,7 +5732,7 @@ socks@^2.8.3: ip-address "^9.0.5" smart-buffer "^4.2.0" -"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2, source-map-js@^1.2.0: +source-map-js@^1.0.2, source-map-js@^1.2.0, "source-map-js@>=0.6.2 <2.0.0": version "1.2.0" resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz" integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== @@ -5932,7 +5745,7 @@ source-map-loader@5.0.0: iconv-lite "^0.6.3" source-map-js "^1.0.2" -source-map-support@0.5.21, source-map-support@^0.5.5, source-map-support@~0.5.20: +source-map-support@^0.5.5, source-map-support@~0.5.20, source-map-support@0.5.21: version "0.5.21" resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== @@ -5940,7 +5753,22 @@ source-map-support@0.5.21, source-map-support@^0.5.5, source-map-support@~0.5.20 buffer-from "^1.0.0" source-map "^0.6.0" -source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0: +source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@~0.6.0: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@0.6.1: version "0.6.1" resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -6011,16 +5839,16 @@ ssri@^10.0.0: dependencies: minipass "^7.0.3" -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - "statuses@>= 1.4.0 < 2", statuses@~1.5.0: version "1.5.0" resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + streamroller@^3.1.3: version "3.1.3" resolved "https://registry.npmjs.org/streamroller/-/streamroller-3.1.3.tgz" @@ -6030,6 +5858,20 @@ streamroller@^3.1.3: debug "^4.3.4" fs-extra "^8.1.0" +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + "string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" @@ -6066,20 +5908,6 @@ string-width@^7.0.0: get-east-asian-width "^1.0.0" strip-ansi "^7.1.0" -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - "strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" @@ -6094,7 +5922,14 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" -strip-ansi@^7.0.1, strip-ansi@^7.1.0: +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + +strip-ansi@^7.1.0: version "7.1.0" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz" integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== @@ -6165,20 +6000,20 @@ terser-webpack-plugin@^5.3.10: serialize-javascript "^6.0.1" terser "^5.26.0" -terser@5.29.2: - version "5.29.2" - resolved "https://registry.npmjs.org/terser/-/terser-5.29.2.tgz" - integrity sha512-ZiGkhUBIM+7LwkNjXYJq8svgkd+QK3UUr0wJqY4MieaezBSAIPgbSPZyIx0idM6XWK5CMzSWa8MJIzmRcB8Caw== +terser@^5.26.0: + version "5.31.2" + resolved "https://registry.npmjs.org/terser/-/terser-5.31.2.tgz" + integrity sha512-LGyRZVFm/QElZHy/CPr/O4eNZOZIzsrQ92y4v9UJe/pFJjypje2yI3C2FmPtvUEnhadlSbmG2nXtdcjHOjCfxw== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" commander "^2.20.0" source-map-support "~0.5.20" -terser@^5.26.0: - version "5.31.2" - resolved "https://registry.npmjs.org/terser/-/terser-5.31.2.tgz" - integrity sha512-LGyRZVFm/QElZHy/CPr/O4eNZOZIzsrQ92y4v9UJe/pFJjypje2yI3C2FmPtvUEnhadlSbmG2nXtdcjHOjCfxw== +terser@^5.4.0, terser@5.29.2: + version "5.29.2" + resolved "https://registry.npmjs.org/terser/-/terser-5.29.2.tgz" + integrity sha512-ZiGkhUBIM+7LwkNjXYJq8svgkd+QK3UUr0wJqY4MieaezBSAIPgbSPZyIx0idM6XWK5CMzSWa8MJIzmRcB8Caw== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -6236,7 +6071,7 @@ tree-kill@1.2.2: resolved "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz" integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== -tslib@2.6.3, tslib@^2.0.0, tslib@^2.1.0, tslib@^2.3.0: +tslib@^2, tslib@^2.0.0, tslib@^2.1.0, tslib@^2.3.0, tslib@2, tslib@2.6.3: version "2.6.3" resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz" integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== @@ -6268,7 +6103,7 @@ typed-assert@^1.0.8: resolved "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz" integrity sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg== -typescript@~5.4.5: +typescript@>=2.8.1, typescript@>=4.9.5, "typescript@>=5.4 <5.6", typescript@~5.4.5: version "5.4.5" resolved "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz" integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== @@ -6335,7 +6170,7 @@ universalify@^0.1.0: resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== -unpipe@1.0.0, unpipe@~1.0.0: +unpipe@~1.0.0, unpipe@1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== @@ -6365,7 +6200,7 @@ utils-merge@1.0.1: resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== -uuid@8.3.2, uuid@^8.3.2: +uuid@^8.3.2, uuid@8.3.2: version "8.3.2" resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== @@ -6388,7 +6223,7 @@ vary@^1, vary@~1.1.2: resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== -vite@5.3.2: +"vite@^3.0.0 || ^4.0.0 || ^5.0.0", vite@5.3.2: version "5.3.2" resolved "https://registry.npmjs.org/vite/-/vite-5.3.2.tgz" integrity sha512-6lA7OBHBlXUxiJxbO5aAY2fsHHzDr1q7DvXYnyZycRs2Dz+dXBWuhpWHvmljTRTpQC2uvGmUFFkSHF2vGo90MA== @@ -6404,7 +6239,7 @@ void-elements@^2.0.0: resolved "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz" integrity sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung== -watchpack@2.4.1, watchpack@^2.4.1: +watchpack@^2.4.1, watchpack@2.4.1: version "2.4.1" resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz" integrity sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg== @@ -6431,7 +6266,7 @@ weak-lru-cache@^1.2.2: resolved "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz" integrity sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw== -webpack-dev-middleware@7.2.1, webpack-dev-middleware@^7.1.0: +webpack-dev-middleware@^7.1.0, webpack-dev-middleware@7.2.1: version "7.2.1" resolved "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.2.1.tgz" integrity sha512-hRLz+jPQXo999Nx9fXVdKlg/aehsw1ajA9skAneGmT03xwmyuhvF93p6HUKKbWhXdcERtGTzUCtIQr+2IQegrA== @@ -6443,7 +6278,7 @@ webpack-dev-middleware@7.2.1, webpack-dev-middleware@^7.1.0: range-parser "^1.2.1" schema-utils "^4.0.0" -webpack-dev-server@5.0.4: +webpack-dev-server@^5.0.2, webpack-dev-server@5.0.4: version "5.0.4" resolved "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.0.4.tgz" integrity sha512-dljXhUgx3HqKP2d8J/fUMvhxGhzjeNVarDLcbO/EWMSgRizDkxHQDZQaLFL5VJY9tRBj2Gz+rvCEYYvhbqPHNA== @@ -6500,7 +6335,7 @@ webpack-subresource-integrity@5.1.0: dependencies: typed-assert "^1.0.8" -webpack@5.92.1: +webpack@^5.0.0, webpack@^5.1.0, webpack@^5.12.0, webpack@^5.27.0, webpack@^5.30.0, webpack@^5.54.0, webpack@^5.72.1, webpack@>=5, webpack@5.92.1: version "5.92.1" resolved "https://registry.npmjs.org/webpack/-/webpack-5.92.1.tgz" integrity sha512-JECQ7IwJb+7fgUFBlrJzbyu3GEuNBcdqr1LD7IbSzwkSmIevTm8PF+wej3Oxuz/JFBUZ6O1o43zsPkwm1C4TmA== @@ -6530,7 +6365,7 @@ webpack@5.92.1: watchpack "^2.4.1" webpack-sources "^3.2.3" -websocket-driver@>=0.5.1, websocket-driver@^0.7.4: +websocket-driver@^0.7.4, websocket-driver@>=0.5.1: version "0.7.4" resolved "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz" integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== @@ -6655,19 +6490,6 @@ yargs-parser@^21.1.1: resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs@17.7.2, yargs@^17.2.1: - version "17.7.2" - resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" - integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - yargs@^16.1.1: version "16.2.0" resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" @@ -6681,6 +6503,19 @@ yargs@^16.1.1: y18n "^5.0.5" yargs-parser "^20.2.2" +yargs@^17.2.1, yargs@17.7.2: + version "17.7.2" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + yocto-queue@^1.0.0: version "1.1.1" resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz" @@ -6691,7 +6526,7 @@ yoctocolors-cjs@^2.1.2: resolved "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz" integrity sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA== -zone.js@~0.14.7: +zone.js@~0.14.0, zone.js@~0.14.7: version "0.14.7" resolved "https://registry.npmjs.org/zone.js/-/zone.js-0.14.7.tgz" integrity sha512-0w6DGkX2BPuiK/NLf+4A8FLE43QwBfuqz2dVgi/40Rj1WmqUskCqj329O/pwrqFJLG5X8wkeG2RhIAro441xtg==