diff --git a/package-lock.json b/package-lock.json index 8fca3b0cb..e28bfc898 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@ngageoint/mage.project", - "version": "6.6.4", + "version": "6.6.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@ngageoint/mage.project", - "version": "6.6.4", + "version": "6.6.0", "hasInstallScript": true, "dependencies": { "@angular/cdk": "^17.3.10", @@ -18,6 +18,7 @@ }, "devDependencies": { "@angular-architects/module-federation": "^20.0.0", + "@rollup/plugin-node-resolve": "^16.0.3", "@types/angular-ui-router": "^1.1.44", "@types/jasmine": "^5.1.15", "@types/node": "^20.19.30", @@ -26,8 +27,6 @@ }, "node_modules/@angular-architects/module-federation": { "version": "20.0.0", - "resolved": "https://registry.npmjs.org/@angular-architects/module-federation/-/module-federation-20.0.0.tgz", - "integrity": "sha512-EonYL6P5Yu1kCV6yXW8uYhTGBGG3E77+FEWosDnbDlWXuj80mGOKYdqE5xNxSyLldTJIKfEgt7x8//bIOmkWbA==", "dev": true, "license": "MIT", "dependencies": { @@ -40,8 +39,6 @@ }, "node_modules/@angular-architects/module-federation/node_modules/@angular-architects/module-federation-runtime": { "version": "20.0.0", - "resolved": "https://registry.npmjs.org/@angular-architects/module-federation-runtime/-/module-federation-runtime-20.0.0.tgz", - "integrity": "sha512-06qoytemnCY/MCRFvdbbX/jSflqNMVTMuddnprid0Wfuc2lVsSgCv2Xi0FZFKjvhDHb1xYpmMQNExxKoXdp80g==", "dev": true, "license": "MIT", "dependencies": { @@ -56,8 +53,6 @@ }, "node_modules/@angular-architects/module-federation/node_modules/@angular/common": { "version": "21.2.10", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-21.2.10.tgz", - "integrity": "sha512-WLyi/CRLtgALg2mmaqIuKuPnE4i+8PGt/uuz26pVqx+ASh28/TWr5KSCAMomgxEc8kt4OE7lopoQsTihrQCfEw==", "dev": true, "license": "MIT", "peer": true, @@ -74,8 +69,6 @@ }, "node_modules/@angular-architects/module-federation/node_modules/@angular/core": { "version": "21.2.10", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-21.2.10.tgz", - "integrity": "sha512-uxH+mbPiCE7rInWKYOPe9Ytas97+mFM6FhFORoN234yBK3b8he+iDuxX6dsbhEFCxhRmfS6hLxe7BdLY6U6kIA==", "dev": true, "license": "MIT", "peer": true, @@ -101,8 +94,6 @@ }, "node_modules/@angular-architects/module-federation/node_modules/zone.js": { "version": "0.16.1", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.16.1.tgz", - "integrity": "sha512-dpvY17vxYIW3+bNrP0ClUlaiY0CiIRK3tnoLaGoQsQcY9/I/NpzIWQ7tQNhbV7LacQMpCII6wVzuL3tuWOyfuA==", "dev": true, "license": "MIT", "optional": true, @@ -110,8 +101,6 @@ }, "node_modules/@angular/animations": { "version": "18.2.14", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-18.2.14.tgz", - "integrity": "sha512-Kp/MWShoYYO+R3lrrZbZgszbbLGVXHB+39mdJZwnIuZMDkeL3JsIBlSOzyJRTnpS1vITc+9jgHvP/6uKbMrW1Q==", "license": "MIT", "peer": true, "dependencies": { @@ -126,8 +115,6 @@ }, "node_modules/@angular/cdk": { "version": "17.3.10", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-17.3.10.tgz", - "integrity": "sha512-b1qktT2c1TTTe5nTji/kFAVW92fULK0YhYAvJ+BjZTPKu2FniZNe8o4qqQ0pUuvtMu+ZQxp/QqFYoidIVCjScg==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -143,8 +130,6 @@ }, "node_modules/@angular/common": { "version": "18.2.14", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-18.2.14.tgz", - "integrity": "sha512-ZPRswzaVRiqcfZoowuAM22Hr2/z10ajWOUoFDoQ9tWqz/fH/773kJv2F9VvePIekgNPCzaizqv9gF6tGNqaAwg==", "license": "MIT", "peer": true, "dependencies": { @@ -160,8 +145,6 @@ }, "node_modules/@angular/core": { "version": "18.2.14", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-18.2.14.tgz", - "integrity": "sha512-BIPrCs93ZZTY9ym7yfoTgAQ5rs706yoYeAdrgc8kh/bDbM9DawxKlgeKBx2FLt09Y0YQ1bFhKVp0cV4gDEaMxQ==", "license": "MIT", "peer": true, "dependencies": { @@ -177,8 +160,6 @@ }, "node_modules/@angular/forms": { "version": "18.2.14", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-18.2.14.tgz", - "integrity": "sha512-fZVwXctmBJa5VdopJae/T9MYKPXNd04+6j4k/6X819y+9fiyWLJt2QicSc5Rc+YD9mmhXag3xaljlrnotf9VGA==", "license": "MIT", "peer": true, "dependencies": { @@ -196,8 +177,6 @@ }, "node_modules/@angular/material": { "version": "17.3.10", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-17.3.10.tgz", - "integrity": "sha512-hHMQES0tQPH5JW33W+mpBPuM8ybsloDTqFPuRV8cboDjosAWfJhzAKF3ozICpNlUrs62La/2Wu/756GcQrxebg==", "license": "MIT", "dependencies": { "@material/animation": "15.0.0-canary.7f224ddd4.0", @@ -261,8 +240,6 @@ }, "node_modules/@angular/material-moment-adapter": { "version": "17.3.10", - "resolved": "https://registry.npmjs.org/@angular/material-moment-adapter/-/material-moment-adapter-17.3.10.tgz", - "integrity": "sha512-R68ssdGMSmVIfpOGaB9vjW5lBh6zH9GboBuaIAqizC/ZAzdEgpmT7qdr3PBCmRPTLTx8Yx9K3rhgRekO79ympw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -275,8 +252,6 @@ }, "node_modules/@angular/platform-browser": { "version": "18.2.14", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-18.2.14.tgz", - "integrity": "sha512-W+JTxI25su3RiZVZT3Yrw6KNUCmOIy7OZIZ+612skPgYK2f2qil7VclnW1oCwG896h50cMJU/lnAfxZxefQgyQ==", "license": "MIT", "peer": true, "dependencies": { @@ -298,8 +273,6 @@ }, "node_modules/@colors/colors": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", - "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", "license": "MIT", "engines": { "node": ">=0.1.90" @@ -307,8 +280,6 @@ }, "node_modules/@dabh/diagnostics": { "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.8.tgz", - "integrity": "sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==", "license": "MIT", "dependencies": { "@so-ric/colorspace": "^1.1.6", @@ -318,8 +289,6 @@ }, "node_modules/@material/animation": { "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/animation/-/animation-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-1GSJaPKef+7HRuV+HusVZHps64cmZuOItDbt40tjJVaikcaZvwmHlcTxRIqzcRoCdt5ZKHh3NoO7GB9Khg4Jnw==", "license": "MIT", "dependencies": { "tslib": "^2.1.0" @@ -327,8 +296,6 @@ }, "node_modules/@material/auto-init": { "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/auto-init/-/auto-init-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-t7ZGpRJ3ec0QDUO0nJu/SMgLW7qcuG2KqIsEYD1Ej8qhI2xpdR2ydSDQOkVEitXmKoGol1oq4nYSBjTlB65GqA==", "license": "MIT", "dependencies": { "@material/base": "15.0.0-canary.7f224ddd4.0", @@ -337,8 +304,6 @@ }, "node_modules/@material/banner": { "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/banner/-/banner-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-g9wBUZzYBizyBcBQXTIafnRUUPi7efU9gPJfzeGgkynXiccP/vh5XMmH+PBxl5v+4MlP/d4cZ2NUYoAN7UTqSA==", "license": "MIT", "dependencies": { "@material/base": "15.0.0-canary.7f224ddd4.0", @@ -357,8 +322,6 @@ }, "node_modules/@material/base": { "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/base/-/base-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-I9KQOKXpLfJkP8MqZyr8wZIzdPHrwPjFvGd9zSK91/vPyE4hzHRJc/0njsh9g8Lm9PRYLbifXX+719uTbHxx+A==", "license": "MIT", "dependencies": { "tslib": "^2.1.0" @@ -366,8 +329,6 @@ }, "node_modules/@material/button": { "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/button/-/button-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-BHB7iyHgRVH+JF16+iscR+Qaic+p7LU1FOLgP8KucRlpF9tTwIxQA6mJwGRi5gUtcG+vyCmzVS+hIQ6DqT/7BA==", "license": "MIT", "dependencies": { "@material/density": "15.0.0-canary.7f224ddd4.0", @@ -387,8 +348,6 @@ }, "node_modules/@material/card": { "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/card/-/card-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-kt7y9/IWOtJTr3Z/AoWJT3ZLN7CLlzXhx2udCLP9ootZU2bfGK0lzNwmo80bv/pJfrY9ihQKCtuGTtNxUy+vIw==", "license": "MIT", "dependencies": { "@material/dom": "15.0.0-canary.7f224ddd4.0", @@ -404,8 +363,6 @@ }, "node_modules/@material/checkbox": { "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/checkbox/-/checkbox-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-rURcrL5O1u6hzWR+dNgiQ/n89vk6tdmdP3mZgnxJx61q4I/k1yijKqNJSLrkXH7Rto3bM5NRKMOlgvMvVd7UMQ==", "license": "MIT", "dependencies": { "@material/animation": "15.0.0-canary.7f224ddd4.0", @@ -423,8 +380,6 @@ }, "node_modules/@material/chips": { "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/chips/-/chips-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-AYAivV3GSk/T/nRIpH27sOHFPaSMrE3L0WYbnb5Wa93FgY8a0fbsFYtSH2QmtwnzXveg+B1zGTt7/xIIcynKdQ==", "license": "MIT", "dependencies": { "@material/animation": "15.0.0-canary.7f224ddd4.0", @@ -448,8 +403,6 @@ }, "node_modules/@material/circular-progress": { "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/circular-progress/-/circular-progress-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-DJrqCKb+LuGtjNvKl8XigvyK02y36GRkfhMUYTcJEi3PrOE00bwXtyj7ilhzEVshQiXg6AHGWXtf5UqwNrx3Ow==", "license": "MIT", "dependencies": { "@material/animation": "15.0.0-canary.7f224ddd4.0", @@ -464,8 +417,6 @@ }, "node_modules/@material/data-table": { "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/data-table/-/data-table-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-/2WZsuBIq9z9RWYF5Jo6b7P6u0fwit+29/mN7rmAZ6akqUR54nXyNfoSNiyydMkzPlZZsep5KrSHododDhBZbA==", "license": "MIT", "dependencies": { "@material/animation": "15.0.0-canary.7f224ddd4.0", @@ -491,8 +442,6 @@ }, "node_modules/@material/density": { "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/density/-/density-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-o9EXmGKVpiQ6mHhyV3oDDzc78Ow3E7v8dlaOhgaDSXgmqaE8v5sIlLNa/LKSyUga83/fpGk3QViSGXotpQx0jA==", "license": "MIT", "dependencies": { "tslib": "^2.1.0" @@ -500,8 +449,6 @@ }, "node_modules/@material/dialog": { "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/dialog/-/dialog-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-u0XpTlv1JqWC/bQ3DavJ1JguofTelLT2wloj59l3/1b60jv42JQ6Am7jU3I8/SIUB1MKaW7dYocXjDWtWJakLA==", "license": "MIT", "dependencies": { "@material/animation": "15.0.0-canary.7f224ddd4.0", @@ -523,8 +470,6 @@ }, "node_modules/@material/dom": { "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/dom/-/dom-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-mQ1HT186GPQSkRg5S18i70typ5ZytfjL09R0gJ2Qg5/G+MLCGi7TAjZZSH65tuD/QGOjel4rDdWOTmYbPYV6HA==", "license": "MIT", "dependencies": { "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", @@ -534,8 +479,6 @@ }, "node_modules/@material/drawer": { "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/drawer/-/drawer-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-qyO0W0KBftfH8dlLR0gVAgv7ZHNvU8ae11Ao6zJif/YxcvK4+gph1z8AO4H410YmC2kZiwpSKyxM1iQCCzbb4g==", "license": "MIT", "dependencies": { "@material/animation": "15.0.0-canary.7f224ddd4.0", @@ -554,8 +497,6 @@ }, "node_modules/@material/elevation": { "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/elevation/-/elevation-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-tV6s4/pUBECedaI36Yj18KmRCk1vfue/JP/5yYRlFNnLMRVISePbZaKkn/BHXVf+26I3W879+XqIGlDVdmOoMA==", "license": "MIT", "dependencies": { "@material/animation": "15.0.0-canary.7f224ddd4.0", @@ -568,8 +509,6 @@ }, "node_modules/@material/fab": { "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/fab/-/fab-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-4h76QrzfZTcPdd+awDPZ4Q0YdSqsXQnS540TPtyXUJ/5G99V6VwGpjMPIxAsW0y+pmI9UkLL/srrMaJec+7r4Q==", "license": "MIT", "dependencies": { "@material/animation": "15.0.0-canary.7f224ddd4.0", @@ -589,8 +528,6 @@ }, "node_modules/@material/feature-targeting": { "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-SAjtxYh6YlKZriU83diDEQ7jNSP2MnxKsER0TvFeyG1vX/DWsUyYDOIJTOEa9K1N+fgJEBkNK8hY55QhQaspew==", "license": "MIT", "dependencies": { "tslib": "^2.1.0" @@ -598,8 +535,6 @@ }, "node_modules/@material/floating-label": { "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/floating-label/-/floating-label-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-0KMo5ijjYaEHPiZ2pCVIcbaTS2LycvH9zEhEMKwPPGssBCX7iz5ffYQFk7e5yrQand1r3jnQQgYfHAwtykArnQ==", "license": "MIT", "dependencies": { "@material/animation": "15.0.0-canary.7f224ddd4.0", @@ -614,8 +549,6 @@ }, "node_modules/@material/focus-ring": { "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/focus-ring/-/focus-ring-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-Jmg1nltq4J6S6A10EGMZnvufrvU3YTi+8R8ZD9lkSbun0Fm2TVdICQt/Auyi6An9zP66oQN6c31eqO6KfIPsDg==", "license": "MIT", "dependencies": { "@material/dom": "15.0.0-canary.7f224ddd4.0", @@ -625,8 +558,6 @@ }, "node_modules/@material/form-field": { "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/form-field/-/form-field-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-fEPWgDQEPJ6WF7hNnIStxucHR9LE4DoDSMqCsGWS2Yu+NLZYLuCEecgR0UqQsl1EQdNRaFh8VH93KuxGd2hiPg==", "license": "MIT", "dependencies": { "@material/base": "15.0.0-canary.7f224ddd4.0", @@ -640,8 +571,6 @@ }, "node_modules/@material/icon-button": { "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/icon-button/-/icon-button-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-DcK7IL4ICY/DW+48YQZZs9g0U1kRaW0Wb0BxhvppDMYziHo/CTpFdle4gjyuTyRxPOdHQz5a97ru48Z9O4muTw==", "license": "MIT", "dependencies": { "@material/base": "15.0.0-canary.7f224ddd4.0", @@ -659,8 +588,6 @@ }, "node_modules/@material/image-list": { "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/image-list/-/image-list-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-voMjG2p80XbjL1B2lmF65zO5gEgJOVKClLdqh4wbYzYfwY/SR9c8eLvlYG7DLdFaFBl/7gGxD8TvvZ329HUFPw==", "license": "MIT", "dependencies": { "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", @@ -672,8 +599,6 @@ }, "node_modules/@material/layout-grid": { "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/layout-grid/-/layout-grid-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-veDABLxMn2RmvfnUO2RUmC1OFfWr4cU+MrxKPoDD2hl3l3eDYv5fxws6r5T1JoSyXoaN+oEZpheS0+M9Ure8Pg==", "license": "MIT", "dependencies": { "tslib": "^2.1.0" @@ -681,8 +606,6 @@ }, "node_modules/@material/line-ripple": { "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/line-ripple/-/line-ripple-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-f60hVJhIU6I3/17Tqqzch1emUKEcfVVgHVqADbU14JD+oEIz429ZX9ksZ3VChoU3+eejFl+jVdZMLE/LrAuwpg==", "license": "MIT", "dependencies": { "@material/animation": "15.0.0-canary.7f224ddd4.0", @@ -694,8 +617,6 @@ }, "node_modules/@material/linear-progress": { "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/linear-progress/-/linear-progress-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-pRDEwPQielDiC9Sc5XhCXrGxP8wWOnAO8sQlMebfBYHYqy5hhiIzibezS8CSaW4MFQFyXmCmpmqWlbqGYRmiyg==", "license": "MIT", "dependencies": { "@material/animation": "15.0.0-canary.7f224ddd4.0", @@ -710,8 +631,6 @@ }, "node_modules/@material/list": { "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/list/-/list-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-Is0NV91sJlXF5pOebYAtWLF4wU2MJDbYqztML/zQNENkQxDOvEXu3nWNb3YScMIYJJXvARO0Liur5K4yPagS1Q==", "license": "MIT", "dependencies": { "@material/base": "15.0.0-canary.7f224ddd4.0", @@ -729,8 +648,6 @@ }, "node_modules/@material/menu": { "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/menu/-/menu-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-D11QU1dXqLbh5X1zKlEhS3QWh0b5BPNXlafc5MXfkdJHhOiieb7LC9hMJhbrHtj24FadJ7evaFW/T2ugJbJNnQ==", "license": "MIT", "dependencies": { "@material/base": "15.0.0-canary.7f224ddd4.0", @@ -749,8 +666,6 @@ }, "node_modules/@material/menu-surface": { "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/menu-surface/-/menu-surface-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-7RZHvw0gbwppaAJ/Oh5SWmfAKJ62aw1IMB3+3MRwsb5PLoV666wInYa+zJfE4i7qBeOn904xqT2Nko5hY0ssrg==", "license": "MIT", "dependencies": { "@material/animation": "15.0.0-canary.7f224ddd4.0", @@ -765,8 +680,6 @@ }, "node_modules/@material/notched-outline": { "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/notched-outline/-/notched-outline-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-Yg2usuKB2DKlKIBISbie9BFsOVuffF71xjbxPbybvqemxqUBd+bD5/t6H1fLE+F8/NCu5JMigho4ewUU+0RCiw==", "license": "MIT", "dependencies": { "@material/base": "15.0.0-canary.7f224ddd4.0", @@ -780,8 +693,6 @@ }, "node_modules/@material/progress-indicator": { "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/progress-indicator/-/progress-indicator-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-UPbDjE5CqT+SqTs0mNFG6uFEw7wBlgYmh+noSkQ6ty/EURm8lF125dmi4dv4kW0+octonMXqkGtAoZwLIHKf/w==", "license": "MIT", "dependencies": { "tslib": "^2.1.0" @@ -789,8 +700,6 @@ }, "node_modules/@material/radio": { "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/radio/-/radio-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-wR1X0Sr0KmQLu6+YOFKAI84G3L6psqd7Kys5kfb8WKBM36zxO5HQXC5nJm/Y0rdn22ixzsIz2GBo0MNU4V4k1A==", "license": "MIT", "dependencies": { "@material/animation": "15.0.0-canary.7f224ddd4.0", @@ -807,8 +716,6 @@ }, "node_modules/@material/ripple": { "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-JqOsWM1f4aGdotP0rh1vZlPZTg6lZgh39FIYHFMfOwfhR+LAikUJ+37ciqZuewgzXB6iiRO6a8aUH6HR5SJYPg==", "license": "MIT", "dependencies": { "@material/animation": "15.0.0-canary.7f224ddd4.0", @@ -822,8 +729,6 @@ }, "node_modules/@material/rtl": { "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-UVf14qAtmPiaaZjuJtmN36HETyoKWmsZM/qn1L5ciR2URb8O035dFWnz4ZWFMmAYBno/L7JiZaCkPurv2ZNrGA==", "license": "MIT", "dependencies": { "@material/theme": "15.0.0-canary.7f224ddd4.0", @@ -832,8 +737,6 @@ }, "node_modules/@material/segmented-button": { "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/segmented-button/-/segmented-button-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-LCnVRUSAhELTKI/9hSvyvIvQIpPpqF29BV+O9yM4WoNNmNWqTulvuiv7grHZl6Z+kJuxSg4BGbsPxxb9dXozPg==", "license": "MIT", "dependencies": { "@material/base": "15.0.0-canary.7f224ddd4.0", @@ -848,8 +751,6 @@ }, "node_modules/@material/select": { "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/select/-/select-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-WioZtQEXRpglum0cMSzSqocnhsGRr+ZIhvKb3FlaNrTaK8H3Y4QA7rVjv3emRtrLOOjaT6/RiIaUMTo9AGzWQQ==", "license": "MIT", "dependencies": { "@material/animation": "15.0.0-canary.7f224ddd4.0", @@ -875,8 +776,6 @@ }, "node_modules/@material/shape": { "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/shape/-/shape-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-8z8l1W3+cymObunJoRhwFPKZ+FyECfJ4MJykNiaZq7XJFZkV6xNmqAVrrbQj93FtLsECn9g4PjjIomguVn/OEw==", "license": "MIT", "dependencies": { "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", @@ -887,8 +786,6 @@ }, "node_modules/@material/slider": { "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/slider/-/slider-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-QU/WSaSWlLKQRqOhJrPgm29wqvvzRusMqwAcrCh1JTrCl+xwJ43q5WLDfjYhubeKtrEEgGu9tekkAiYfMG7EBw==", "license": "MIT", "dependencies": { "@material/animation": "15.0.0-canary.7f224ddd4.0", @@ -906,8 +803,6 @@ }, "node_modules/@material/snackbar": { "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/snackbar/-/snackbar-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-sm7EbVKddaXpT/aXAYBdPoN0k8yeg9+dprgBUkrdqGzWJAeCkxb4fv2B3He88YiCtvkTz2KLY4CThPQBSEsMFQ==", "license": "MIT", "dependencies": { "@material/animation": "15.0.0-canary.7f224ddd4.0", @@ -928,8 +823,6 @@ }, "node_modules/@material/switch": { "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/switch/-/switch-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-lEDJfRvkVyyeHWIBfoxYjJVl+WlEAE2kZ/+6OqB1FW0OV8ftTODZGhHRSzjVBA1/p4FPuhAtKtoK9jTpa4AZjA==", "license": "MIT", "dependencies": { "@material/animation": "15.0.0-canary.7f224ddd4.0", @@ -950,8 +843,6 @@ }, "node_modules/@material/tab": { "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/tab/-/tab-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-E1xGACImyCLurhnizyOTCgOiVezce4HlBFAI6YhJo/AyVwjN2Dtas4ZLQMvvWWqpyhITNkeYdOchwCC1mrz3AQ==", "license": "MIT", "dependencies": { "@material/base": "15.0.0-canary.7f224ddd4.0", @@ -969,8 +860,6 @@ }, "node_modules/@material/tab-bar": { "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/tab-bar/-/tab-bar-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-p1Asb2NzrcECvAQU3b2SYrpyJGyJLQWR+nXTYzDKE8WOpLIRCXap2audNqD7fvN/A20UJ1J8U01ptrvCkwJ4eA==", "license": "MIT", "dependencies": { "@material/animation": "15.0.0-canary.7f224ddd4.0", @@ -989,8 +878,6 @@ }, "node_modules/@material/tab-indicator": { "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/tab-indicator/-/tab-indicator-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-h9Td3MPqbs33spcPS7ecByRHraYgU4tNCZpZzZXw31RypjKvISDv/PS5wcA4RmWqNGih78T7xg4QIGsZg4Pk4w==", "license": "MIT", "dependencies": { "@material/animation": "15.0.0-canary.7f224ddd4.0", @@ -1002,8 +889,6 @@ }, "node_modules/@material/tab-scroller": { "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/tab-scroller/-/tab-scroller-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-LFeYNjQpdXecwECd8UaqHYbhscDCwhGln5Yh+3ctvcEgvmDPNjhKn/DL3sWprWvG8NAhP6sHMrsGhQFVdCWtTg==", "license": "MIT", "dependencies": { "@material/animation": "15.0.0-canary.7f224ddd4.0", @@ -1016,8 +901,6 @@ }, "node_modules/@material/textfield": { "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/textfield/-/textfield-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-AExmFvgE5nNF0UA4l2cSzPghtxSUQeeoyRjFLHLy+oAaE4eKZFrSy0zEpqPeWPQpEMDZk+6Y+6T3cOFYBeSvsw==", "license": "MIT", "dependencies": { "@material/animation": "15.0.0-canary.7f224ddd4.0", @@ -1039,8 +922,6 @@ }, "node_modules/@material/theme": { "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/theme/-/theme-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-hs45hJoE9yVnoVOcsN1jklyOa51U4lzWsEnQEuJTPOk2+0HqCQ0yv/q0InpSnm2i69fNSyZC60+8HADZGF8ugQ==", "license": "MIT", "dependencies": { "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", @@ -1049,8 +930,6 @@ }, "node_modules/@material/tokens": { "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/tokens/-/tokens-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-r9TDoicmcT7FhUXC4eYMFnt9TZsz0G8T3wXvkKncLppYvZ517gPyD/1+yhuGfGOxAzxTrM66S/oEc1fFE2q4hw==", "license": "MIT", "dependencies": { "@material/elevation": "15.0.0-canary.7f224ddd4.0" @@ -1058,8 +937,6 @@ }, "node_modules/@material/tooltip": { "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/tooltip/-/tooltip-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-8qNk3pmPLTnam3XYC1sZuplQXW9xLn4Z4MI3D+U17Q7pfNZfoOugGr+d2cLA9yWAEjVJYB0mj8Yu86+udo4N9w==", "license": "MIT", "dependencies": { "@material/animation": "15.0.0-canary.7f224ddd4.0", @@ -1079,8 +956,6 @@ }, "node_modules/@material/top-app-bar": { "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/top-app-bar/-/top-app-bar-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-SARR5/ClYT4CLe9qAXakbr0i0cMY0V3V4pe3ElIJPfL2Z2c4wGR1mTR8m2LxU1MfGKK8aRoUdtfKaxWejp+eNA==", "license": "MIT", "dependencies": { "@material/animation": "15.0.0-canary.7f224ddd4.0", @@ -1096,8 +971,6 @@ }, "node_modules/@material/touch-target": { "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/touch-target/-/touch-target-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-BJo/wFKHPYLGsRaIpd7vsQwKr02LtO2e89Psv0on/p0OephlNIgeB9dD9W+bQmaeZsZ6liKSKRl6wJWDiK71PA==", "license": "MIT", "dependencies": { "@material/base": "15.0.0-canary.7f224ddd4.0", @@ -1109,8 +982,6 @@ }, "node_modules/@material/typography": { "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/typography/-/typography-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-kBaZeCGD50iq1DeRRH5OM5Jl7Gdk+/NOfKArkY4ksBZvJiStJ7ACAhpvb8MEGm4s3jvDInQFLsDq3hL+SA79sQ==", "license": "MIT", "dependencies": { "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", @@ -1120,8 +991,6 @@ }, "node_modules/@module-federation/bridge-react-webpack-plugin": { "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@module-federation/bridge-react-webpack-plugin/-/bridge-react-webpack-plugin-0.9.1.tgz", - "integrity": "sha512-znN/Qm6M0U1t3iF10gu1hSxDkk18yz78yvk+AMB34UDzpXHiC1zbpIeV2CQNV5GCeafmCICmcn9y1qh7F54KTg==", "dev": true, "license": "MIT", "peer": true, @@ -1133,8 +1002,6 @@ }, "node_modules/@module-federation/bridge-react-webpack-plugin/node_modules/semver": { "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "license": "ISC", "peer": true, @@ -1147,8 +1014,6 @@ }, "node_modules/@module-federation/data-prefetch": { "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@module-federation/data-prefetch/-/data-prefetch-0.9.1.tgz", - "integrity": "sha512-rS1AsgRvIMAWK8oMprEBF0YQ3WvsqnumjinvAZU1Dqut5DICmpQMTPEO1OrAKyjO+PQgEhmq13HggzN6ebGLrQ==", "dev": true, "license": "MIT", "peer": true, @@ -1164,8 +1029,6 @@ }, "node_modules/@module-federation/dts-plugin": { "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@module-federation/dts-plugin/-/dts-plugin-0.9.1.tgz", - "integrity": "sha512-DezBrFaIKfDcEY7UhqyO1WbYocERYsR/CDN8AV6OvMnRlQ8u0rgM8qBUJwx0s+K59f+CFQFKEN4C8p7naCiHrw==", "dev": true, "license": "MIT", "peer": true, @@ -1199,8 +1062,6 @@ }, "node_modules/@module-federation/enhanced": { "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@module-federation/enhanced/-/enhanced-0.9.1.tgz", - "integrity": "sha512-c9siKVjcgT2gtDdOTqEr+GaP2X/PWAS0OV424ljKLstFL1lcS/BIsxWFDmxPPl5hDByAH+1q4YhC1LWY4LNDQw==", "dev": true, "license": "MIT", "peer": true, @@ -1235,29 +1096,22 @@ } } }, - "node_modules/@module-federation/error-codes": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.9.1.tgz", - "integrity": "sha512-q8spCvlwUzW42iX1irnlBTcwcZftRNHyGdlaoFO1z/fW4iphnBIfijzkigWQzOMhdPgzqN/up7XN+g5hjBGBtw==", + "node_modules/@module-federation/enhanced/node_modules/@module-federation/inject-external-runtime-core-plugin": { + "dev": true, + "peer": true + }, + "node_modules/@module-federation/enhanced/node_modules/@module-federation/runtime-tools": { "dev": true, - "license": "MIT", "peer": true }, - "node_modules/@module-federation/inject-external-runtime-core-plugin": { + "node_modules/@module-federation/error-codes": { "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@module-federation/inject-external-runtime-core-plugin/-/inject-external-runtime-core-plugin-0.9.1.tgz", - "integrity": "sha512-BPfzu1cqDU5BhM493enVF1VfxJWmruen0ktlHrWdJJlcddhZzyFBGaLAGoGc+83fS75aEllvJTEthw4kMViMQQ==", "dev": true, "license": "MIT", - "peer": true, - "peerDependencies": { - "@module-federation/runtime-tools": "0.9.1" - } + "peer": true }, "node_modules/@module-federation/managers": { "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@module-federation/managers/-/managers-0.9.1.tgz", - "integrity": "sha512-8hpIrvGfiODxS1qelTd7eaLRVF7jrp17RWgeH1DWoprxELANxm5IVvqUryB+7j+BhoQzamog9DL5q4MuNfGgIA==", "dev": true, "license": "MIT", "peer": true, @@ -1269,8 +1123,6 @@ }, "node_modules/@module-federation/manifest": { "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@module-federation/manifest/-/manifest-0.9.1.tgz", - "integrity": "sha512-+GteKBXrAUkq49i2CSyWZXM4vYa+mEVXxR9Du71R55nXXxgbzAIoZj9gxjRunj9pcE8+YpAOyfHxLEdWngxWdg==", "dev": true, "license": "MIT", "peer": true, @@ -1284,8 +1136,6 @@ }, "node_modules/@module-federation/rspack": { "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@module-federation/rspack/-/rspack-0.9.1.tgz", - "integrity": "sha512-ZJqG75dWHhyTMa9I0YPJEV2XRt0MFxnDiuMOpI92esdmwWY633CBKyNh1XxcLd629YVeTv03+whr+Fz/f91JEw==", "dev": true, "license": "MIT", "peer": true, @@ -1312,10 +1162,16 @@ } } }, + "node_modules/@module-federation/rspack/node_modules/@module-federation/inject-external-runtime-core-plugin": { + "dev": true, + "peer": true + }, + "node_modules/@module-federation/rspack/node_modules/@module-federation/runtime-tools": { + "dev": true, + "peer": true + }, "node_modules/@module-federation/runtime": { "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.9.1.tgz", - "integrity": "sha512-jp7K06weabM5BF5sruHr/VLyalO+cilvRDy7vdEBqq88O9mjc0RserD8J+AP4WTl3ZzU7/GRqwRsiwjjN913dA==", "dev": true, "license": "MIT", "peer": true, @@ -1327,8 +1183,6 @@ }, "node_modules/@module-federation/runtime-core": { "version": "0.6.21", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.6.21.tgz", - "integrity": "sha512-CLQiPP3kpcPbgPkiu/A1VURI2v4geFnEdizlB1tq0c6eDZqb5aLzvp87ZCGDVSuwY7DCq6jh1k+CM2WGge/2xA==", "dev": true, "license": "MIT", "peer": true, @@ -1339,16 +1193,12 @@ }, "node_modules/@module-federation/runtime-core/node_modules/@module-federation/error-codes": { "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.9.0.tgz", - "integrity": "sha512-dNqIs5cQfE4p+WIdiZ64cTSRJ5KjGaV+epvZkGttrNjXW9XAAtE7zgpo7cMQ8GWA3wCGaKnFw7Dn48XcU5ZMNw==", "dev": true, "license": "MIT", "peer": true }, "node_modules/@module-federation/runtime-core/node_modules/@module-federation/sdk": { "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.9.0.tgz", - "integrity": "sha512-84MklxE6Z79gCAr+6HCyqOpF95pqSah+fGnhLz+g4ePcWf98J73bWfrdOWFO/UfxMRneXKBZBNbpDVvPLgaFeQ==", "dev": true, "license": "MIT", "peer": true, @@ -1356,22 +1206,8 @@ "isomorphic-rslog": "0.0.7" } }, - "node_modules/@module-federation/runtime-tools": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.9.1.tgz", - "integrity": "sha512-JQZ//ab+lEXoU2DHAH+JtYASGzxEjXB0s4rU+6VJXc8c+oUPxH3kWIwzjdncg2mcWBmC1140DCk+K+kDfOZ5CQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@module-federation/runtime": "0.9.1", - "@module-federation/webpack-bundler-runtime": "0.9.1" - } - }, "node_modules/@module-federation/runtime/node_modules/@module-federation/runtime-core": { "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.9.1.tgz", - "integrity": "sha512-r61ufhKt5pjl81v7TkmhzeIoSPOaNtLynW6+aCy3KZMa3RfRevFxmygJqv4Nug1L0NhqUeWtdLejh4VIglNy5Q==", "dev": true, "license": "MIT", "peer": true, @@ -1382,16 +1218,12 @@ }, "node_modules/@module-federation/sdk": { "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.9.1.tgz", - "integrity": "sha512-YQonPTImgnCqZjE/A+3N2g3J5ypR6kx1tbBzc9toUANKr/dw/S63qlh/zHKzWQzxjjNNVMdXRtTMp07g3kgEWg==", "dev": true, "license": "MIT", "peer": true }, "node_modules/@module-federation/third-party-dts-extractor": { "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-0.9.1.tgz", - "integrity": "sha512-KeIByP718hHyq+Mc53enZ419pZZ1fh9Ns6+/bYLkc3iCoJr/EDBeiLzkbMwh2AS4Qk57WW0yNC82xzf7r0Zrrw==", "dev": true, "license": "MIT", "peer": true, @@ -1401,22 +1233,56 @@ "resolve": "1.22.8" } }, - "node_modules/@module-federation/webpack-bundler-runtime": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.9.1.tgz", - "integrity": "sha512-CxySX01gT8cBowKl9xZh+voiHvThMZ471icasWnlDIZb14KasZoX1eCh9wpGvwoOdIk9rIRT7h70UvW9nmop6w==", + "node_modules/@rollup/plugin-node-resolve": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-16.0.3.tgz", + "integrity": "sha512-lUYM3UBGuM93CnMPG1YocWu7X802BrNF3jW2zny5gQyLQgRFJhV1Sq0Zi74+dh/6NBx1DxFC4b4GXg9wUCG5Qg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@module-federation/runtime": "0.9.1", - "@module-federation/sdk": "0.9.1" + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.78.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } } }, "node_modules/@rspack/binding": { "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-1.7.11.tgz", - "integrity": "sha512-2MGdy2s2HimsDT444Bp5XnALzNRxuBNc7y0JzyuqKbHBywd4x2NeXyhWXXoxufaCFu5PBc9Qq9jyfjW2Aeh06Q==", "dev": true, "license": "MIT", "peer": true, @@ -1435,8 +1301,6 @@ }, "node_modules/@rspack/binding-darwin-arm64": { "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.7.11.tgz", - "integrity": "sha512-oduECiZVqbO5zlVw+q7Vy65sJFth99fWPTyucwvLJJtJkPL5n17Uiql2cYP6Ijn0pkqtf1SXgK8WjiKLG5bIig==", "cpu": [ "arm64" ], @@ -1450,8 +1314,6 @@ }, "node_modules/@rspack/core": { "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@rspack/core/-/core-1.7.11.tgz", - "integrity": "sha512-rsD9b+Khmot5DwCMiB3cqTQo53ioPG3M/A7BySu8+0+RS7GCxKm+Z+mtsjtG/vsu4Tn2tcqCdZtA3pgLoJB+ew==", "dev": true, "license": "MIT", "peer": true, @@ -1474,16 +1336,12 @@ }, "node_modules/@rspack/core/node_modules/@module-federation/error-codes": { "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.22.0.tgz", - "integrity": "sha512-xF9SjnEy7vTdx+xekjPCV5cIHOGCkdn3pIxo9vU7gEZMIw0SvAEdsy6Uh17xaCpm8V0FWvR0SZoK9Ik6jGOaug==", "dev": true, "license": "MIT", "peer": true }, "node_modules/@rspack/core/node_modules/@module-federation/runtime": { "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.22.0.tgz", - "integrity": "sha512-38g5iPju2tPC3KHMPxRKmy4k4onNp6ypFPS1eKGsNLUkXgHsPMBFqAjDw96iEcjri91BrahG4XcdyKi97xZzlA==", "dev": true, "license": "MIT", "peer": true, @@ -1495,8 +1353,6 @@ }, "node_modules/@rspack/core/node_modules/@module-federation/runtime-core": { "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.22.0.tgz", - "integrity": "sha512-GR1TcD6/s7zqItfhC87zAp30PqzvceoeDGYTgF3Vx2TXvsfDrhP6Qw9T4vudDQL3uJRne6t7CzdT29YyVxlgIA==", "dev": true, "license": "MIT", "peer": true, @@ -1507,8 +1363,6 @@ }, "node_modules/@rspack/core/node_modules/@module-federation/runtime-tools": { "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.22.0.tgz", - "integrity": "sha512-4ScUJ/aUfEernb+4PbLdhM/c60VHl698Gn1gY21m9vyC1Ucn69fPCA1y2EwcCB7IItseRMoNhdcWQnzt/OPCNA==", "dev": true, "license": "MIT", "peer": true, @@ -1519,16 +1373,12 @@ }, "node_modules/@rspack/core/node_modules/@module-federation/sdk": { "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.22.0.tgz", - "integrity": "sha512-x4aFNBKn2KVQRuNVC5A7SnrSCSqyfIWmm1DvubjbO9iKFe7ith5niw8dqSFBekYBg2Fwy+eMg4sEFNVvCAdo6g==", "dev": true, "license": "MIT", "peer": true }, "node_modules/@rspack/core/node_modules/@module-federation/webpack-bundler-runtime": { "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.22.0.tgz", - "integrity": "sha512-aM8gCqXu+/4wBmJtVeMeeMN5guw3chf+2i6HajKtQv7SJfxV/f4IyNQJUeUQu9HfiAZHjqtMV5Lvq/Lvh8LdyA==", "dev": true, "license": "MIT", "peer": true, @@ -1539,16 +1389,12 @@ }, "node_modules/@rspack/lite-tapable": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rspack/lite-tapable/-/lite-tapable-1.1.0.tgz", - "integrity": "sha512-E2B0JhYFmVAwdDiG14+DW0Di4Ze4Jg10Pc4/lILUrd5DRCaklduz2OvJ5HYQ6G+hd+WTzqQb3QnDNfK4yvAFYw==", "dev": true, "license": "MIT", "peer": true }, "node_modules/@so-ric/colorspace": { "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@so-ric/colorspace/-/colorspace-1.1.6.tgz", - "integrity": "sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==", "license": "MIT", "dependencies": { "color": "^5.0.2", @@ -1557,56 +1403,56 @@ }, "node_modules/@types/angular": { "version": "1.8.9", - "resolved": "https://registry.npmjs.org/@types/angular/-/angular-1.8.9.tgz", - "integrity": "sha512-Z0HukqZkx0fotsV3QO00yqU9NzcQI+tMcrum+8MvfB4ePqCawZctF/gz6QiuII+T1ax+LitNoPx/eICTgnF4sg==", "dev": true, "license": "MIT" }, "node_modules/@types/angular-ui-router": { "version": "1.1.44", - "resolved": "https://registry.npmjs.org/@types/angular-ui-router/-/angular-ui-router-1.1.44.tgz", - "integrity": "sha512-mUAyKcaj4cTELw5ohSI0hs3hu+yVLDoPPkPZL48xflCVfTK/ch7gczA6gCoa6M50GOflAb/mN0/Sjaq+uoSS2g==", "dev": true, "license": "MIT", "dependencies": { "@types/angular": "*" } }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/jasmine": { "version": "5.1.15", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-5.1.15.tgz", - "integrity": "sha512-ZAC8KjmV2MJxbNTrwXFN+HKeajpXQZp6KpPiR6Aa4XvaEnjP6qh23lL/Rqb7AYzlp3h/rcwDrQ7Gg7q28cQTQg==", "dev": true, "license": "MIT" }, "node_modules/@types/node": { "version": "20.19.39", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.39.tgz", - "integrity": "sha512-orrrD74MBUyK8jOAD/r0+lfa1I2MO6I+vAkmAWzMYbCcgrN4lCrmK52gRFQq/JRxfYPfonkr4b0jcY7Olqdqbw==", "dev": true, "license": "MIT", "dependencies": { "undici-types": "~6.21.0" } }, + "node_modules/@types/resolve": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/semver": { "version": "7.5.8", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", - "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", "dev": true, "license": "MIT", "peer": true }, "node_modules/@types/triple-beam": { "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", - "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", "license": "MIT" }, "node_modules/accepts": { "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, "license": "MIT", "peer": true, @@ -1620,8 +1466,6 @@ }, "node_modules/adm-zip": { "version": "0.5.17", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.17.tgz", - "integrity": "sha512-+Ut8d9LLqwEvHHJl1+PIHqoyDxFgVN847JTVM3Izi3xHDWPE4UtzzXysMZQs64DMcrJfBeS/uoEP4AD3HQHnQQ==", "dev": true, "license": "MIT", "peer": true, @@ -1631,8 +1475,6 @@ }, "node_modules/ansi-colors": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "dev": true, "license": "MIT", "peer": true, @@ -1642,8 +1484,6 @@ }, "node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "peer": true, @@ -1659,8 +1499,6 @@ }, "node_modules/array-buffer-byte-length": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", - "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", "dev": true, "license": "MIT", "dependencies": { @@ -1676,8 +1514,6 @@ }, "node_modules/arraybuffer.prototype.slice": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", - "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1698,14 +1534,10 @@ }, "node_modules/async": { "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", "license": "MIT" }, "node_modules/async-function": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", - "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", "dev": true, "license": "MIT", "engines": { @@ -1714,16 +1546,12 @@ }, "node_modules/asynckit": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true, "license": "MIT", "peer": true }, "node_modules/at-least-node": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", "dev": true, "license": "ISC", "peer": true, @@ -1733,8 +1561,6 @@ }, "node_modules/available-typed-arrays": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1749,8 +1575,6 @@ }, "node_modules/axios": { "version": "1.15.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.15.2.tgz", - "integrity": "sha512-wLrXxPtcrPTsNlJmKjkPnNPK2Ihe0hn0wGSaTEiHRPxwjvJwT3hKmXF4dpqxmPO9SoNb2FsYXj/xEo0gHN+D5A==", "dev": true, "license": "MIT", "peer": true, @@ -1762,15 +1586,11 @@ }, "node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, "license": "MIT" }, "node_modules/brace-expansion": { "version": "1.1.13", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", - "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", "dev": true, "license": "MIT", "dependencies": { @@ -1780,8 +1600,6 @@ }, "node_modules/btoa": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz", - "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==", "dev": true, "license": "(MIT OR Apache-2.0)", "peer": true, @@ -1794,8 +1612,6 @@ }, "node_modules/cache-content-type": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", - "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==", "dev": true, "license": "MIT", "peer": true, @@ -1809,8 +1625,6 @@ }, "node_modules/call-bind": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", "dev": true, "license": "MIT", "dependencies": { @@ -1828,8 +1642,6 @@ }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1842,8 +1654,6 @@ }, "node_modules/call-bound": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "dev": true, "license": "MIT", "dependencies": { @@ -1859,8 +1669,6 @@ }, "node_modules/callsite": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==", "dev": true, "engines": { "node": "*" @@ -1868,8 +1676,6 @@ }, "node_modules/chalk": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, "license": "MIT", "peer": true, @@ -1883,8 +1689,6 @@ }, "node_modules/co": { "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true, "license": "MIT", "peer": true, @@ -1895,8 +1699,6 @@ }, "node_modules/color": { "version": "5.0.3", - "resolved": "https://registry.npmjs.org/color/-/color-5.0.3.tgz", - "integrity": "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==", "license": "MIT", "dependencies": { "color-convert": "^3.1.3", @@ -1908,8 +1710,6 @@ }, "node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "peer": true, @@ -1922,16 +1722,12 @@ }, "node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT", "peer": true }, "node_modules/color-string": { "version": "2.1.4", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.4.tgz", - "integrity": "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==", "license": "MIT", "dependencies": { "color-name": "^2.0.0" @@ -1942,8 +1738,6 @@ }, "node_modules/color-string/node_modules/color-name": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", - "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", "license": "MIT", "engines": { "node": ">=12.20" @@ -1951,8 +1745,6 @@ }, "node_modules/color/node_modules/color-convert": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.3.tgz", - "integrity": "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==", "license": "MIT", "dependencies": { "color-name": "^2.0.0" @@ -1963,8 +1755,6 @@ }, "node_modules/color/node_modules/color-name": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", - "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", "license": "MIT", "engines": { "node": ">=12.20" @@ -1972,8 +1762,6 @@ }, "node_modules/combined-stream": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, "license": "MIT", "peer": true, @@ -1986,15 +1774,11 @@ }, "node_modules/concat-map": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true, "license": "MIT" }, "node_modules/content-disposition": { "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dev": true, "license": "MIT", "peer": true, @@ -2007,8 +1791,6 @@ }, "node_modules/content-type": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "dev": true, "license": "MIT", "peer": true, @@ -2018,8 +1800,6 @@ }, "node_modules/cookies": { "version": "0.9.1", - "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.9.1.tgz", - "integrity": "sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==", "dev": true, "license": "MIT", "peer": true, @@ -2033,8 +1813,6 @@ }, "node_modules/cron-parser": { "version": "4.9.0", - "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-4.9.0.tgz", - "integrity": "sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==", "dev": true, "license": "MIT", "peer": true, @@ -2047,8 +1825,6 @@ }, "node_modules/cross-spawn": { "version": "6.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", - "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", "dev": true, "license": "MIT", "dependencies": { @@ -2064,8 +1840,6 @@ }, "node_modules/cross-spawn/node_modules/semver": { "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "license": "ISC", "bin": { @@ -2074,8 +1848,6 @@ }, "node_modules/data-view-buffer": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", - "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2092,8 +1864,6 @@ }, "node_modules/data-view-byte-length": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", - "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2110,8 +1880,6 @@ }, "node_modules/data-view-byte-offset": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", - "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2128,8 +1896,6 @@ }, "node_modules/date-format": { "version": "4.0.14", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", - "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", "dev": true, "license": "MIT", "peer": true, @@ -2139,8 +1905,6 @@ }, "node_modules/debug": { "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", "peer": true, @@ -2158,16 +1922,22 @@ }, "node_modules/deep-equal": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==", "dev": true, "license": "MIT", "peer": true }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/define-data-property": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, "license": "MIT", "dependencies": { @@ -2184,8 +1954,6 @@ }, "node_modules/define-properties": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "license": "MIT", "dependencies": { @@ -2202,8 +1970,6 @@ }, "node_modules/delayed-stream": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true, "license": "MIT", "peer": true, @@ -2213,16 +1979,12 @@ }, "node_modules/delegates": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", "dev": true, "license": "MIT", "peer": true }, "node_modules/depd": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, "license": "MIT", "peer": true, @@ -2232,8 +1994,6 @@ }, "node_modules/destroy": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true, "license": "MIT", "peer": true, @@ -2244,8 +2004,6 @@ }, "node_modules/dunder-proto": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "dev": true, "license": "MIT", "dependencies": { @@ -2259,22 +2017,16 @@ }, "node_modules/ee-first": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "dev": true, "license": "MIT", "peer": true }, "node_modules/enabled": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", - "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", "license": "MIT" }, "node_modules/encodeurl": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "dev": true, "license": "MIT", "peer": true, @@ -2284,8 +2036,6 @@ }, "node_modules/entities": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", "license": "BSD-2-Clause", "optional": true, "engines": { @@ -2297,8 +2047,6 @@ }, "node_modules/error-ex": { "version": "1.3.4", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", - "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2307,8 +2055,6 @@ }, "node_modules/es-abstract": { "version": "1.24.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz", - "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==", "dev": true, "license": "MIT", "dependencies": { @@ -2376,8 +2122,6 @@ }, "node_modules/es-define-property": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "dev": true, "license": "MIT", "engines": { @@ -2386,8 +2130,6 @@ }, "node_modules/es-errors": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, "license": "MIT", "engines": { @@ -2396,8 +2138,6 @@ }, "node_modules/es-object-atoms": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "dev": true, "license": "MIT", "dependencies": { @@ -2409,8 +2149,6 @@ }, "node_modules/es-set-tostringtag": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "dev": true, "license": "MIT", "dependencies": { @@ -2425,8 +2163,6 @@ }, "node_modules/es-to-primitive": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", - "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", "dev": true, "license": "MIT", "dependencies": { @@ -2443,26 +2179,27 @@ }, "node_modules/escape-html": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "dev": true, "license": "MIT", "peer": true }, "node_modules/escape-string-regexp": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "license": "MIT", "engines": { "node": ">=0.8.0" } }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, "node_modules/expand-tilde": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", "dev": true, "license": "MIT", "peer": true, @@ -2475,14 +2212,10 @@ }, "node_modules/fecha": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", - "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", "license": "MIT" }, "node_modules/find-file-up": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/find-file-up/-/find-file-up-2.0.1.tgz", - "integrity": "sha512-qVdaUhYO39zmh28/JLQM5CoYN9byEOKEH4qfa8K1eNV17W0UUMJ9WgbR/hHFH+t5rcl+6RTb5UC7ck/I+uRkpQ==", "dev": true, "license": "MIT", "peer": true, @@ -2495,8 +2228,6 @@ }, "node_modules/find-pkg": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/find-pkg/-/find-pkg-2.0.0.tgz", - "integrity": "sha512-WgZ+nKbELDa6N3i/9nrHeNznm+lY3z4YfhDDWgW+5P0pdmMj26bxaxU11ookgY3NyP9GC7HvZ9etp0jRFqGEeQ==", "dev": true, "license": "MIT", "peer": true, @@ -2509,22 +2240,16 @@ }, "node_modules/flatted": { "version": "3.4.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", - "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", "dev": true, "license": "ISC", "peer": true }, "node_modules/fn.name": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", - "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", "license": "MIT" }, "node_modules/follow-redirects": { "version": "1.16.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", - "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", "dev": true, "funding": [ { @@ -2545,8 +2270,6 @@ }, "node_modules/for-each": { "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", "dev": true, "license": "MIT", "dependencies": { @@ -2561,8 +2284,6 @@ }, "node_modules/form-data": { "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", "dev": true, "license": "MIT", "peer": true, @@ -2579,8 +2300,6 @@ }, "node_modules/fresh": { "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true, "license": "MIT", "peer": true, @@ -2590,8 +2309,6 @@ }, "node_modules/fs-extra": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "license": "MIT", "peer": true, @@ -2607,8 +2324,6 @@ }, "node_modules/function-bind": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, "license": "MIT", "funding": { @@ -2617,8 +2332,6 @@ }, "node_modules/function.prototype.name": { "version": "1.1.8", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", - "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", "dev": true, "license": "MIT", "dependencies": { @@ -2638,8 +2351,6 @@ }, "node_modules/functions-have-names": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, "license": "MIT", "funding": { @@ -2648,8 +2359,6 @@ }, "node_modules/generator-function": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", - "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", "dev": true, "license": "MIT", "engines": { @@ -2658,8 +2367,6 @@ }, "node_modules/get-intrinsic": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2683,8 +2390,6 @@ }, "node_modules/get-proto": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "dev": true, "license": "MIT", "dependencies": { @@ -2697,8 +2402,6 @@ }, "node_modules/get-symbol-description": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", - "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", "dev": true, "license": "MIT", "dependencies": { @@ -2715,8 +2418,6 @@ }, "node_modules/global-modules": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", "dev": true, "license": "MIT", "peer": true, @@ -2731,8 +2432,6 @@ }, "node_modules/global-prefix": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", "dev": true, "license": "MIT", "peer": true, @@ -2749,8 +2448,6 @@ }, "node_modules/globalthis": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2766,8 +2463,6 @@ }, "node_modules/gopd": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true, "license": "MIT", "engines": { @@ -2779,15 +2474,11 @@ }, "node_modules/graceful-fs": { "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true, "license": "ISC" }, "node_modules/has-bigints": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", - "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", "dev": true, "license": "MIT", "engines": { @@ -2799,8 +2490,6 @@ }, "node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "peer": true, @@ -2810,8 +2499,6 @@ }, "node_modules/has-property-descriptors": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, "license": "MIT", "dependencies": { @@ -2823,8 +2510,6 @@ }, "node_modules/has-proto": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", - "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2839,8 +2524,6 @@ }, "node_modules/has-symbols": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true, "license": "MIT", "engines": { @@ -2852,8 +2535,6 @@ }, "node_modules/has-tostringtag": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "license": "MIT", "dependencies": { @@ -2868,8 +2549,6 @@ }, "node_modules/hasown": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2881,8 +2560,6 @@ }, "node_modules/homedir-polyfill": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", "dev": true, "license": "MIT", "peer": true, @@ -2895,15 +2572,11 @@ }, "node_modules/hosted-git-info": { "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true, "license": "ISC" }, "node_modules/http-assert": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.5.0.tgz", - "integrity": "sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==", "dev": true, "license": "MIT", "peer": true, @@ -2917,8 +2590,6 @@ }, "node_modules/http-errors": { "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", "dev": true, "license": "MIT", "peer": true, @@ -2935,8 +2606,6 @@ }, "node_modules/http-errors/node_modules/depd": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", "dev": true, "license": "MIT", "peer": true, @@ -2946,22 +2615,16 @@ }, "node_modules/inherits": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "license": "ISC" }, "node_modules/ini": { "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true, "license": "ISC", "peer": true }, "node_modules/internal-slot": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", - "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", "dev": true, "license": "MIT", "dependencies": { @@ -2975,8 +2638,6 @@ }, "node_modules/is-array-buffer": { "version": "3.0.5", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", - "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", "dev": true, "license": "MIT", "dependencies": { @@ -2993,15 +2654,11 @@ }, "node_modules/is-arrayish": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true, "license": "MIT" }, "node_modules/is-async-function": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", - "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3020,8 +2677,6 @@ }, "node_modules/is-bigint": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", - "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3036,8 +2691,6 @@ }, "node_modules/is-boolean-object": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", - "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", "dev": true, "license": "MIT", "dependencies": { @@ -3053,8 +2706,6 @@ }, "node_modules/is-callable": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, "license": "MIT", "engines": { @@ -3066,8 +2717,6 @@ }, "node_modules/is-core-module": { "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dev": true, "license": "MIT", "dependencies": { @@ -3082,8 +2731,6 @@ }, "node_modules/is-data-view": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", - "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", "dev": true, "license": "MIT", "dependencies": { @@ -3100,8 +2747,6 @@ }, "node_modules/is-date-object": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", - "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", "dev": true, "license": "MIT", "dependencies": { @@ -3117,8 +2762,6 @@ }, "node_modules/is-finalizationregistry": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", - "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", "dev": true, "license": "MIT", "dependencies": { @@ -3133,8 +2776,6 @@ }, "node_modules/is-generator-function": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", - "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", "dev": true, "license": "MIT", "dependencies": { @@ -3153,8 +2794,6 @@ }, "node_modules/is-map": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true, "license": "MIT", "engines": { @@ -3164,10 +2803,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "dev": true, + "license": "MIT" + }, "node_modules/is-negative-zero": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, "license": "MIT", "engines": { @@ -3179,8 +2823,6 @@ }, "node_modules/is-number-object": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", - "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", "dev": true, "license": "MIT", "dependencies": { @@ -3196,8 +2838,6 @@ }, "node_modules/is-regex": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "dev": true, "license": "MIT", "dependencies": { @@ -3215,8 +2855,6 @@ }, "node_modules/is-set": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "dev": true, "license": "MIT", "engines": { @@ -3228,8 +2866,6 @@ }, "node_modules/is-shared-array-buffer": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", - "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", "dev": true, "license": "MIT", "dependencies": { @@ -3244,8 +2880,6 @@ }, "node_modules/is-stream": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "license": "MIT", "engines": { "node": ">=8" @@ -3256,8 +2890,6 @@ }, "node_modules/is-string": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", - "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", "dev": true, "license": "MIT", "dependencies": { @@ -3273,8 +2905,6 @@ }, "node_modules/is-symbol": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", - "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", "dev": true, "license": "MIT", "dependencies": { @@ -3291,8 +2921,6 @@ }, "node_modules/is-typed-array": { "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3307,8 +2935,6 @@ }, "node_modules/is-weakmap": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "dev": true, "license": "MIT", "engines": { @@ -3320,8 +2946,6 @@ }, "node_modules/is-weakref": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", - "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", "dev": true, "license": "MIT", "dependencies": { @@ -3336,8 +2960,6 @@ }, "node_modules/is-weakset": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", - "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3353,8 +2975,6 @@ }, "node_modules/is-windows": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true, "license": "MIT", "peer": true, @@ -3364,22 +2984,16 @@ }, "node_modules/isarray": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true, "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true, "license": "ISC" }, "node_modules/isomorphic-rslog": { "version": "0.0.7", - "resolved": "https://registry.npmjs.org/isomorphic-rslog/-/isomorphic-rslog-0.0.7.tgz", - "integrity": "sha512-n6/XnKnZ5eLEj6VllG4XmamXG7/F69nls8dcynHyhcTpsPUYgcgx4ifEaCo4lQJ2uzwfmIT+F0KBGwBcMKmt5g==", "dev": true, "license": "MIT", "peer": true, @@ -3389,8 +3003,6 @@ }, "node_modules/isomorphic-ws": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", - "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==", "dev": true, "license": "MIT", "peer": true, @@ -3400,15 +3012,11 @@ }, "node_modules/json-parse-better-errors": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true, "license": "MIT" }, "node_modules/jsonfile": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", - "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", "dev": true, "license": "MIT", "peer": true, @@ -3421,8 +3029,6 @@ }, "node_modules/keygrip": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", - "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", "dev": true, "license": "MIT", "peer": true, @@ -3435,8 +3041,6 @@ }, "node_modules/koa": { "version": "2.15.4", - "resolved": "https://registry.npmjs.org/koa/-/koa-2.15.4.tgz", - "integrity": "sha512-7fNBIdrU2PEgLljXoPWoyY4r1e+ToWCmzS/wwMPbUNs7X+5MMET1ObhJBlUkF5uZG9B6QhM2zS1TsH6adegkiQ==", "dev": true, "license": "MIT", "peer": true, @@ -3471,16 +3075,12 @@ }, "node_modules/koa-compose": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", - "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==", "dev": true, "license": "MIT", "peer": true }, "node_modules/koa-convert": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-2.0.0.tgz", - "integrity": "sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==", "dev": true, "license": "MIT", "peer": true, @@ -3494,14 +3094,10 @@ }, "node_modules/kuler": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", - "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", "license": "MIT" }, "node_modules/load-json-file": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", "dev": true, "license": "MIT", "dependencies": { @@ -3516,16 +3112,12 @@ }, "node_modules/lodash.clonedeepwith": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeepwith/-/lodash.clonedeepwith-4.5.0.tgz", - "integrity": "sha512-QRBRSxhbtsX1nc0baxSkkK5WlVTTm/s48DSukcGcWZwIyI8Zz+lB+kFiELJXtzfH4Aj6kMWQ1VWW4U5uUDgZMA==", "dev": true, "license": "MIT", "peer": true }, "node_modules/log4js": { "version": "6.9.1", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", - "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", "dev": true, "license": "Apache-2.0", "peer": true, @@ -3542,8 +3134,6 @@ }, "node_modules/logform": { "version": "2.7.0", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", - "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", "license": "MIT", "dependencies": { "@colors/colors": "1.6.0", @@ -3559,16 +3149,12 @@ }, "node_modules/long-timeout": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/long-timeout/-/long-timeout-0.1.1.tgz", - "integrity": "sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w==", "dev": true, "license": "MIT", "peer": true }, "node_modules/luxon": { "version": "3.7.2", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz", - "integrity": "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==", "dev": true, "license": "MIT", "peer": true, @@ -3578,8 +3164,6 @@ }, "node_modules/math-intrinsics": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "dev": true, "license": "MIT", "engines": { @@ -3588,8 +3172,6 @@ }, "node_modules/media-typer": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "dev": true, "license": "MIT", "peer": true, @@ -3599,8 +3181,6 @@ }, "node_modules/memorystream": { "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", "dev": true, "engines": { "node": ">= 0.10.0" @@ -3608,8 +3188,6 @@ }, "node_modules/mime-db": { "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, "license": "MIT", "peer": true, @@ -3619,8 +3197,6 @@ }, "node_modules/mime-types": { "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "license": "MIT", "peer": true, @@ -3633,8 +3209,6 @@ }, "node_modules/minimatch": { "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -3646,8 +3220,6 @@ }, "node_modules/moment": { "version": "2.30.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", - "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", "license": "MIT", "peer": true, "engines": { @@ -3656,14 +3228,10 @@ }, "node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, "node_modules/negotiator": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true, "license": "MIT", "peer": true, @@ -3673,15 +3241,11 @@ }, "node_modules/nice-try": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true, "license": "MIT" }, "node_modules/node-fetch": { "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "dev": true, "license": "MIT", "dependencies": { @@ -3701,8 +3265,6 @@ }, "node_modules/node-schedule": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/node-schedule/-/node-schedule-2.1.1.tgz", - "integrity": "sha512-OXdegQq03OmXEjt2hZP33W2YPs/E5BcFQks46+G2gAxs4gHOIVD1u7EqlYLYSKsaIpyKCK9Gbk0ta1/gjRSMRQ==", "dev": true, "license": "MIT", "peer": true, @@ -3717,8 +3279,6 @@ }, "node_modules/normalize-package-data": { "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -3730,8 +3290,6 @@ }, "node_modules/normalize-package-data/node_modules/semver": { "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "license": "ISC", "bin": { @@ -3740,8 +3298,6 @@ }, "node_modules/npm-run-all": { "version": "4.1.5", - "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", - "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3766,8 +3322,6 @@ }, "node_modules/npm-run-all/node_modules/ansi-styles": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "license": "MIT", "dependencies": { @@ -3779,8 +3333,6 @@ }, "node_modules/npm-run-all/node_modules/chalk": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3794,8 +3346,6 @@ }, "node_modules/npm-run-all/node_modules/color-convert": { "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "license": "MIT", "dependencies": { @@ -3804,15 +3354,11 @@ }, "node_modules/npm-run-all/node_modules/color-name": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, "license": "MIT" }, "node_modules/npm-run-all/node_modules/has-flag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "license": "MIT", "engines": { @@ -3821,8 +3367,6 @@ }, "node_modules/npm-run-all/node_modules/supports-color": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "license": "MIT", "dependencies": { @@ -3834,8 +3378,6 @@ }, "node_modules/object-inspect": { "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "dev": true, "license": "MIT", "engines": { @@ -3847,8 +3389,6 @@ }, "node_modules/object-keys": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, "license": "MIT", "engines": { @@ -3857,8 +3397,6 @@ }, "node_modules/object.assign": { "version": "4.1.7", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", "dev": true, "license": "MIT", "dependencies": { @@ -3878,8 +3416,6 @@ }, "node_modules/on-finished": { "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dev": true, "license": "MIT", "peer": true, @@ -3892,8 +3428,6 @@ }, "node_modules/one-time": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", - "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", "license": "MIT", "dependencies": { "fn.name": "1.x.x" @@ -3901,15 +3435,11 @@ }, "node_modules/only": { "version": "0.0.2", - "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz", - "integrity": "sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==", "dev": true, "peer": true }, "node_modules/own-keys": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", - "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", "dev": true, "license": "MIT", "dependencies": { @@ -3926,8 +3456,6 @@ }, "node_modules/p-limit": { "version": "7.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-7.3.0.tgz", - "integrity": "sha512-7cIXg/Z0M5WZRblrsOla88S4wAK+zOQQWeBYfV3qJuJXMr+LnbYjaadrFaS0JILfEDPVqHyKnZ1Z/1d6J9VVUw==", "license": "MIT", "dependencies": { "yocto-queue": "^1.2.1" @@ -3941,8 +3469,6 @@ }, "node_modules/parse-json": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "dev": true, "license": "MIT", "dependencies": { @@ -3955,8 +3481,6 @@ }, "node_modules/parse-passwd": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", "dev": true, "license": "MIT", "peer": true, @@ -3966,8 +3490,6 @@ }, "node_modules/parse5": { "version": "7.3.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", "license": "MIT", "optional": true, "dependencies": { @@ -3979,8 +3501,6 @@ }, "node_modules/parseurl": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true, "license": "MIT", "peer": true, @@ -3990,8 +3510,6 @@ }, "node_modules/path-key": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", "dev": true, "license": "MIT", "engines": { @@ -4000,15 +3518,11 @@ }, "node_modules/path-parse": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true, "license": "MIT" }, "node_modules/path-type": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, "license": "MIT", "dependencies": { @@ -4018,10 +3532,21 @@ "node": ">=4" } }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/pidtree": { "version": "0.3.1", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", - "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", "dev": true, "license": "MIT", "bin": { @@ -4033,8 +3558,6 @@ }, "node_modules/pify": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "dev": true, "license": "MIT", "engines": { @@ -4043,8 +3566,6 @@ }, "node_modules/possible-typed-array-names": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", - "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", "dev": true, "license": "MIT", "engines": { @@ -4053,8 +3574,6 @@ }, "node_modules/proxy-from-env": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", - "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", "dev": true, "license": "MIT", "peer": true, @@ -4064,16 +3583,12 @@ }, "node_modules/rambda": { "version": "9.4.2", - "resolved": "https://registry.npmjs.org/rambda/-/rambda-9.4.2.tgz", - "integrity": "sha512-++euMfxnl7OgaEKwXh9QqThOjMeta2HH001N1v4mYQzBjJBnmXBh2BCK6dZAbICFVXOFUVD3xFG0R3ZPU0mxXw==", "dev": true, "license": "MIT", "peer": true }, "node_modules/react": { "version": "19.2.5", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.5.tgz", - "integrity": "sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA==", "dev": true, "license": "MIT", "peer": true, @@ -4083,8 +3598,6 @@ }, "node_modules/react-dom": { "version": "19.2.5", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.5.tgz", - "integrity": "sha512-J5bAZz+DXMMwW/wV3xzKke59Af6CHY7G4uYLN1OvBcKEsWOs4pQExj86BBKamxl/Ik5bx9whOrvBlSDfWzgSag==", "dev": true, "license": "MIT", "peer": true, @@ -4097,8 +3610,6 @@ }, "node_modules/read-pkg": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", "dev": true, "license": "MIT", "dependencies": { @@ -4112,8 +3623,6 @@ }, "node_modules/readable-stream": { "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", "dependencies": { "inherits": "^2.0.3", @@ -4126,8 +3635,6 @@ }, "node_modules/reflect.getprototypeof": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", - "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", "dev": true, "license": "MIT", "dependencies": { @@ -4149,8 +3656,6 @@ }, "node_modules/regexp.prototype.flags": { "version": "1.5.4", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", - "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", "dev": true, "license": "MIT", "dependencies": { @@ -4170,8 +3675,6 @@ }, "node_modules/resolve": { "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, "license": "MIT", "dependencies": { @@ -4188,8 +3691,6 @@ }, "node_modules/resolve-dir": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", "dev": true, "license": "MIT", "peer": true, @@ -4203,16 +3704,12 @@ }, "node_modules/rfdc": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", "dev": true, "license": "MIT", "peer": true }, "node_modules/rxjs": { "version": "7.8.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", - "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", "license": "Apache-2.0", "peer": true, "dependencies": { @@ -4221,8 +3718,6 @@ }, "node_modules/safe-array-concat": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", - "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", "dev": true, "license": "MIT", "dependencies": { @@ -4241,8 +3736,6 @@ }, "node_modules/safe-buffer": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -4261,8 +3754,6 @@ }, "node_modules/safe-push-apply": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", - "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", "dev": true, "license": "MIT", "dependencies": { @@ -4278,8 +3769,6 @@ }, "node_modules/safe-regex-test": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", "dev": true, "license": "MIT", "dependencies": { @@ -4296,8 +3785,6 @@ }, "node_modules/safe-stable-stringify": { "version": "2.5.0", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", - "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", "license": "MIT", "engines": { "node": ">=10" @@ -4305,22 +3792,16 @@ }, "node_modules/safevalues": { "version": "0.3.4", - "resolved": "https://registry.npmjs.org/safevalues/-/safevalues-0.3.4.tgz", - "integrity": "sha512-LRneZZRXNgjzwG4bDQdOTSbze3fHm1EAKN/8bePxnlEZiBmkYEDggaHbuvHI9/hoqHbGfsEA7tWS9GhYHZBBsw==", "license": "Apache-2.0" }, "node_modules/scheduler": { "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", "dev": true, "license": "MIT", "peer": true }, "node_modules/semver": { "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, "license": "ISC", "bin": { @@ -4332,8 +3813,6 @@ }, "node_modules/set-function-length": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, "license": "MIT", "dependencies": { @@ -4350,8 +3829,6 @@ }, "node_modules/set-function-name": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4366,8 +3843,6 @@ }, "node_modules/set-proto": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", - "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", "dev": true, "license": "MIT", "dependencies": { @@ -4381,16 +3856,12 @@ }, "node_modules/setprototypeof": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "dev": true, "license": "ISC", "peer": true }, "node_modules/shebang-command": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", "dev": true, "license": "MIT", "dependencies": { @@ -4402,8 +3873,6 @@ }, "node_modules/shebang-regex": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", "dev": true, "license": "MIT", "engines": { @@ -4412,8 +3881,6 @@ }, "node_modules/shell-quote": { "version": "1.8.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", - "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", "dev": true, "license": "MIT", "engines": { @@ -4425,8 +3892,6 @@ }, "node_modules/side-channel": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "dev": true, "license": "MIT", "dependencies": { @@ -4445,8 +3910,6 @@ }, "node_modules/side-channel-list": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "dev": true, "license": "MIT", "dependencies": { @@ -4462,8 +3925,6 @@ }, "node_modules/side-channel-map": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "dev": true, "license": "MIT", "dependencies": { @@ -4481,8 +3942,6 @@ }, "node_modules/side-channel-weakmap": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "dev": true, "license": "MIT", "dependencies": { @@ -4501,16 +3960,12 @@ }, "node_modules/sorted-array-functions": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/sorted-array-functions/-/sorted-array-functions-1.3.0.tgz", - "integrity": "sha512-2sqgzeFlid6N4Z2fUQ1cvFmTOLRi/sEDzSQ0OKYchqgoPmQBVyM3959qYx3fpS6Esef80KjmpgPeEr028dP3OA==", "dev": true, "license": "MIT", "peer": true }, "node_modules/spdx-correct": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -4520,15 +3975,11 @@ }, "node_modules/spdx-exceptions": { "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", "dev": true, "license": "CC-BY-3.0" }, "node_modules/spdx-expression-parse": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, "license": "MIT", "dependencies": { @@ -4538,15 +3989,11 @@ }, "node_modules/spdx-license-ids": { "version": "3.0.23", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz", - "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==", "dev": true, "license": "CC0-1.0" }, "node_modules/stack-trace": { "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", "license": "MIT", "engines": { "node": "*" @@ -4554,8 +4001,6 @@ }, "node_modules/statuses": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "dev": true, "license": "MIT", "peer": true, @@ -4565,8 +4010,6 @@ }, "node_modules/stop-iteration-iterator": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", - "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4579,8 +4022,6 @@ }, "node_modules/streamroller": { "version": "3.1.5", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", - "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", "dev": true, "license": "MIT", "peer": true, @@ -4595,8 +4036,6 @@ }, "node_modules/streamroller/node_modules/fs-extra": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, "license": "MIT", "peer": true, @@ -4611,8 +4050,6 @@ }, "node_modules/streamroller/node_modules/jsonfile": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, "license": "MIT", "peer": true, @@ -4622,8 +4059,6 @@ }, "node_modules/streamroller/node_modules/universalify": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, "license": "MIT", "peer": true, @@ -4633,8 +4068,6 @@ }, "node_modules/string_decoder": { "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==", "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" @@ -4642,8 +4075,6 @@ }, "node_modules/string.prototype.padend": { "version": "3.1.6", - "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.6.tgz", - "integrity": "sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==", "dev": true, "license": "MIT", "dependencies": { @@ -4661,8 +4092,6 @@ }, "node_modules/string.prototype.trim": { "version": "1.2.10", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", - "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", "dev": true, "license": "MIT", "dependencies": { @@ -4683,8 +4112,6 @@ }, "node_modules/string.prototype.trimend": { "version": "1.0.9", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", - "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4702,8 +4129,6 @@ }, "node_modules/string.prototype.trimstart": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, "license": "MIT", "dependencies": { @@ -4720,8 +4145,6 @@ }, "node_modules/strip-bom": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, "license": "MIT", "engines": { @@ -4730,8 +4153,6 @@ }, "node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "peer": true, @@ -4744,8 +4165,6 @@ }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, "license": "MIT", "engines": { @@ -4757,20 +4176,14 @@ }, "node_modules/systemjs": { "version": "6.15.1", - "resolved": "https://registry.npmjs.org/systemjs/-/systemjs-6.15.1.tgz", - "integrity": "sha512-Nk8c4lXvMB98MtbmjX7JwJRgJOL8fluecYCfCeYBznwmpOs8Bf15hLM6z4z71EDAhQVrQrI+wt1aLWSXZq+hXA==", "license": "MIT" }, "node_modules/text-hex": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", - "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", "license": "MIT" }, "node_modules/toidentifier": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true, "license": "MIT", "peer": true, @@ -4780,15 +4193,11 @@ }, "node_modules/tr46": { "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "dev": true, "license": "MIT" }, "node_modules/triple-beam": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", - "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", "license": "MIT", "engines": { "node": ">= 14.0.0" @@ -4796,14 +4205,10 @@ }, "node_modules/tslib": { "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, "node_modules/tsscmp": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", - "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", "dev": true, "license": "MIT", "peer": true, @@ -4813,8 +4218,6 @@ }, "node_modules/type-is": { "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, "license": "MIT", "peer": true, @@ -4828,8 +4231,6 @@ }, "node_modules/typed-array-buffer": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", "dev": true, "license": "MIT", "dependencies": { @@ -4843,8 +4244,6 @@ }, "node_modules/typed-array-byte-length": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", - "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", "dev": true, "license": "MIT", "dependencies": { @@ -4863,8 +4262,6 @@ }, "node_modules/typed-array-byte-offset": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", - "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4885,8 +4282,6 @@ }, "node_modules/typed-array-length": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", - "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", "dev": true, "license": "MIT", "dependencies": { @@ -4906,8 +4301,6 @@ }, "node_modules/typescript": { "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", "peer": true, @@ -4921,8 +4314,6 @@ }, "node_modules/unbox-primitive": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", - "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", "dev": true, "license": "MIT", "dependencies": { @@ -4940,15 +4331,11 @@ }, "node_modules/undici-types": { "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "dev": true, "license": "MIT" }, "node_modules/universalify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "license": "MIT", "peer": true, @@ -4958,8 +4345,6 @@ }, "node_modules/upath": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz", - "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==", "dev": true, "license": "MIT", "peer": true, @@ -4970,14 +4355,10 @@ }, "node_modules/util-deprecate": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "license": "MIT" }, "node_modules/validate-npm-package-license": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -4987,8 +4368,6 @@ }, "node_modules/vary": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true, "license": "MIT", "peer": true, @@ -4998,15 +4377,11 @@ }, "node_modules/webidl-conversions": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", "dev": true, "license": "BSD-2-Clause" }, "node_modules/whatwg-url": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "dev": true, "license": "MIT", "dependencies": { @@ -5016,8 +4391,6 @@ }, "node_modules/which": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "license": "ISC", "dependencies": { @@ -5029,8 +4402,6 @@ }, "node_modules/which-boxed-primitive": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", - "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", "dev": true, "license": "MIT", "dependencies": { @@ -5049,8 +4420,6 @@ }, "node_modules/which-builtin-type": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", - "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", "dev": true, "license": "MIT", "dependencies": { @@ -5077,8 +4446,6 @@ }, "node_modules/which-collection": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dev": true, "license": "MIT", "dependencies": { @@ -5096,8 +4463,6 @@ }, "node_modules/which-typed-array": { "version": "1.1.20", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", - "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", "dev": true, "license": "MIT", "dependencies": { @@ -5118,8 +4483,6 @@ }, "node_modules/winston": { "version": "3.19.0", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.19.0.tgz", - "integrity": "sha512-LZNJgPzfKR+/J3cHkxcpHKpKKvGfDZVPS4hfJCc4cCG0CgYzvlD6yE/S3CIL/Yt91ak327YCpiF/0MyeZHEHKA==", "license": "MIT", "dependencies": { "@colors/colors": "^1.6.0", @@ -5140,8 +4503,6 @@ }, "node_modules/winston-transport": { "version": "4.9.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", - "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", "license": "MIT", "dependencies": { "logform": "^2.7.0", @@ -5154,8 +4515,6 @@ }, "node_modules/word-wrap": { "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, "license": "MIT", "engines": { @@ -5164,8 +4523,6 @@ }, "node_modules/ws": { "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "dev": true, "license": "MIT", "peer": true, @@ -5187,8 +4544,6 @@ }, "node_modules/ylru": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.4.0.tgz", - "integrity": "sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA==", "dev": true, "license": "MIT", "peer": true, @@ -5198,8 +4553,6 @@ }, "node_modules/yocto-queue": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", - "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", "license": "MIT", "engines": { "node": ">=12.20" @@ -5210,10 +4563,8 @@ }, "node_modules/zone.js": { "version": "0.14.10", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.14.10.tgz", - "integrity": "sha512-YGAhaO7J5ywOXW6InXNlLmfU194F8lVgu7bRntUF3TiG8Y3nBK0x1UJJuHUP/e8IyihkjCYqhCScpSwnlaSRkQ==", "license": "MIT", "peer": true } } -} \ No newline at end of file +} diff --git a/package.json b/package.json index 09f6d5f79..0eaef34d5 100644 --- a/package.json +++ b/package.json @@ -47,6 +47,7 @@ }, "devDependencies": { "@angular-architects/module-federation": "^20.0.0", + "@rollup/plugin-node-resolve": "^16.0.3", "@types/angular-ui-router": "^1.1.44", "@types/jasmine": "^5.1.15", "@types/node": "^20.19.30", diff --git a/plugins/arcgis/web-app/projects/main/src/lib/arc-layer/arc-layer-delete-dialog.component.spec.ts b/plugins/arcgis/web-app/projects/main/src/lib/arc-layer/arc-layer-delete-dialog.component.spec.ts index e476864f3..73e4840f9 100644 --- a/plugins/arcgis/web-app/projects/main/src/lib/arc-layer/arc-layer-delete-dialog.component.spec.ts +++ b/plugins/arcgis/web-app/projects/main/src/lib/arc-layer/arc-layer-delete-dialog.component.spec.ts @@ -11,8 +11,7 @@ describe('Arc Layer Delete Dialog', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [HttpClientModule, MatDialogModule], - declarations: [ArcLayerDeleteDialogComponent], + imports: [HttpClientModule, MatDialogModule, ArcLayerDeleteDialogComponent], providers: [ { provide: MatDialogRef, diff --git a/plugins/arcgis/web-app/projects/main/src/lib/arc-layer/arc-layer-dialog.component.spec.ts b/plugins/arcgis/web-app/projects/main/src/lib/arc-layer/arc-layer-dialog.component.spec.ts index 0e844e44d..6575ed196 100644 --- a/plugins/arcgis/web-app/projects/main/src/lib/arc-layer/arc-layer-dialog.component.spec.ts +++ b/plugins/arcgis/web-app/projects/main/src/lib/arc-layer/arc-layer-dialog.component.spec.ts @@ -1,9 +1,9 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; -import { HttpClientModule } from '@angular/common/http'; -import { MatDialogModule } from '@angular/material/dialog'; +import { HttpClientModule } from '@angular/common/http'; +import { MatDialogModule } from '@angular/material/dialog'; import { ArcLayerDialogComponent } from './arc-layer-dialog.component'; -import { ArcService } from '../arc.service'; +import { ArcService } from '../arc.service'; describe('Arc Layer Dialog', () => { let component: ArcLayerDialogComponent; @@ -11,8 +11,7 @@ describe('Arc Layer Dialog', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [HttpClientModule, MatDialogModule], - declarations: [ArcLayerDialogComponent], + imports: [HttpClientModule, MatDialogModule, ArcLayerDialogComponent], providers: [ { provide: MatDialogRef, @@ -22,9 +21,9 @@ describe('Arc Layer Dialog', () => { }, { provide: MAT_DIALOG_DATA, - useValue: {} + useValue: {} }, - ArcService + ArcService ] }).compileComponents(); }); @@ -38,4 +37,4 @@ describe('Arc Layer Dialog', () => { it('should create', () => { expect(component).toBeTruthy(); }); -}); \ No newline at end of file +}); diff --git a/plugins/arcgis/web-app/projects/showcase/src/app/app.component.spec.ts b/plugins/arcgis/web-app/projects/showcase/src/app/app.component.spec.ts index 696225048..299128e78 100644 --- a/plugins/arcgis/web-app/projects/showcase/src/app/app.component.spec.ts +++ b/plugins/arcgis/web-app/projects/showcase/src/app/app.component.spec.ts @@ -7,7 +7,7 @@ describe('AppComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [AppComponent], + imports: [AppComponent], }).compileComponents(); }); diff --git a/plugins/sftp/web/projects/main/src/lib/configuration/configuration.component.spec.ts b/plugins/sftp/web/projects/main/src/lib/configuration/configuration.component.spec.ts index 74af14c9e..8160d115a 100644 --- a/plugins/sftp/web/projects/main/src/lib/configuration/configuration.component.spec.ts +++ b/plugins/sftp/web/projects/main/src/lib/configuration/configuration.component.spec.ts @@ -9,8 +9,7 @@ describe('ConfigurationComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - imports: [HttpClientTestingModule], - declarations: [ConfigurationComponent] + imports: [HttpClientTestingModule, ConfigurationComponent], }).compileComponents(); })); diff --git a/plugins/sftp/web/projects/showcase/src/app/app.component.spec.ts b/plugins/sftp/web/projects/showcase/src/app/app.component.spec.ts index 18d12318b..5e43f824f 100644 --- a/plugins/sftp/web/projects/showcase/src/app/app.component.spec.ts +++ b/plugins/sftp/web/projects/showcase/src/app/app.component.spec.ts @@ -5,12 +5,7 @@ import { AppComponent } from './app.component'; describe('AppComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - imports: [ - RouterTestingModule - ], - declarations: [ - AppComponent - ], + imports: [RouterTestingModule, AppComponent], }).compileComponents(); })); diff --git a/web-app/admin/src/app/admin/admin-authentication/admin-authentication-create/admin-authentication-create.component.ts b/web-app/admin/src/app/admin/admin-authentication/admin-authentication-create/admin-authentication-create.component.ts index 8d70bbd50..3722bd65c 100644 --- a/web-app/admin/src/app/admin/admin-authentication/admin-authentication-create/admin-authentication-create.component.ts +++ b/web-app/admin/src/app/admin/admin-authentication/admin-authentication-create/admin-authentication-create.component.ts @@ -1,4 +1,5 @@ -import { Component, Inject, OnDestroy, OnInit } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { Component, OnDestroy, OnInit } from '@angular/core'; import { TypeChoice } from './admin-create.model'; import { AdminBreadcrumb } from '../../admin-breadcrumb/admin-breadcrumb.model'; import { AuthenticationConfigurationService } from '../../services/admin-authentication-configuration.service'; @@ -12,12 +13,44 @@ import { FormBuilder, FormControl, FormGroup, + ReactiveFormsModule, ValidationErrors, Validators } from '@angular/forms'; +import { MatStepperModule } from '@angular/material/stepper'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatSelectModule } from '@angular/material/select'; +import { MatIconModule } from '@angular/material/icon'; +import { MatButtonModule } from '@angular/material/button'; + +import { AdminBreadcrumbComponent } from '../../admin-breadcrumb/admin-breadcrumb.component'; +import { AdminAuthenticationOidcComponent } from '../admin-authentication-oidc/admin-authentication-oidc.component'; +import { AdminAuthenticationOAuth2Component } from '../admin-authentication-oauth2/admin-authentication-oauth2.component'; +import { AdminAuthenticationLDAPComponent } from '../admin-authentication-ldap/admin-authentication-ldap.component'; +import { AdminAuthenticationSAMLComponent } from '../admin-authentication-saml/admin-authentication-saml.component'; +import { ButtonPreviewComponent } from './button-preview/button-preview.component'; + @Component({ selector: 'admin-authentication-create', + standalone: true, + imports: [ + CommonModule, + ReactiveFormsModule, + MatStepperModule, + MatFormFieldModule, + MatInputModule, + MatSelectModule, + MatIconModule, + MatButtonModule, + AdminBreadcrumbComponent, + AdminAuthenticationOidcComponent, + AdminAuthenticationOAuth2Component, + AdminAuthenticationLDAPComponent, + AdminAuthenticationSAMLComponent, + ButtonPreviewComponent + ], templateUrl: './admin-authentication-create.component.html', styleUrls: ['./admin-authentication-create.component.scss'], providers: [] diff --git a/web-app/admin/src/app/admin/admin-authentication/admin-authentication-create/button-preview/button-preview.component.ts b/web-app/admin/src/app/admin/admin-authentication/admin-authentication-create/button-preview/button-preview.component.ts index cc728d6f3..c505831a3 100644 --- a/web-app/admin/src/app/admin/admin-authentication/admin-authentication-create/button-preview/button-preview.component.ts +++ b/web-app/admin/src/app/admin/admin-authentication/admin-authentication-create/button-preview/button-preview.component.ts @@ -1,12 +1,25 @@ import { Component, Input } from '@angular/core' import { ColorEvent } from 'ngx-color'; import { Strategy } from '../../admin-settings.model'; +import { CommonModule } from '@angular/common'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { ColorPickerComponent } from 'admin/src/app/color-picker/color-picker.component'; +import { IconUploadComponent } from '../icon-upload/icon-upload.component'; @Component({ selector: 'button-preview', + standalone: true, + imports: [ + CommonModule, + MatFormFieldModule, + MatIconModule, + ColorPickerComponent, + IconUploadComponent + ], templateUrl: './button-preview.component.html', styleUrls: ['./button-preview.component.scss'] -}) + }) export class ButtonPreviewComponent { @Input() strategy: Strategy; @Input() editable = true diff --git a/web-app/admin/src/app/admin/admin-authentication/admin-authentication-delete/admin-authentication-delete.component.scss b/web-app/admin/src/app/admin/admin-authentication/admin-authentication-delete/admin-authentication-delete.component.scss index dffba0cf7..4d132b0cd 100644 --- a/web-app/admin/src/app/admin/admin-authentication/admin-authentication-delete/admin-authentication-delete.component.scss +++ b/web-app/admin/src/app/admin/admin-authentication/admin-authentication-delete/admin-authentication-delete.component.scss @@ -3,7 +3,7 @@ button { margin-left: 8px; - color: mat.get-color-from-palette($app-primary); + color: mat.m2-get-color-from-palette($app-primary); } mat-dialog-actions { diff --git a/web-app/admin/src/app/admin/admin-authentication/admin-authentication-delete/admin-authentication-delete.component.ts b/web-app/admin/src/app/admin/admin-authentication/admin-authentication-delete/admin-authentication-delete.component.ts index 41f214d17..7cd81af72 100644 --- a/web-app/admin/src/app/admin/admin-authentication/admin-authentication-delete/admin-authentication-delete.component.ts +++ b/web-app/admin/src/app/admin/admin-authentication/admin-authentication-delete/admin-authentication-delete.component.ts @@ -1,10 +1,18 @@ import { AfterViewInit, Component, Inject } from '@angular/core' -import { MatDialogRef as MatDialogRef, MAT_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/dialog' +import { MatDialogRef as MatDialogRef, MAT_DIALOG_DATA as MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog' import { Strategy } from '../../admin-authentication/admin-settings.model' import { AuthenticationConfigurationService } from '../../services/admin-authentication-configuration.service' +import { CommonModule } from '@angular/common' +import { MatButtonModule } from '@angular/material/button' @Component({ selector: 'admin-authentication-delete', + standalone: true, + imports: [ + CommonModule, + MatDialogModule, + MatButtonModule + ], templateUrl: './admin-authentication-delete.component.html', styleUrls: ['./admin-authentication-delete.component.scss'] }) diff --git a/web-app/admin/src/app/admin/admin-authentication/admin-authentication-ldap/admin-authentication-ldap.component.spec.ts b/web-app/admin/src/app/admin/admin-authentication/admin-authentication-ldap/admin-authentication-ldap.component.spec.ts index d99f6a8c9..4e96cc7f9 100644 --- a/web-app/admin/src/app/admin/admin-authentication/admin-authentication-ldap/admin-authentication-ldap.component.spec.ts +++ b/web-app/admin/src/app/admin/admin-authentication/admin-authentication-ldap/admin-authentication-ldap.component.spec.ts @@ -9,7 +9,7 @@ describe('AdminAuthenticationLDAPComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ AdminAuthenticationLDAPComponent ], + imports: [ AdminAuthenticationLDAPComponent ], schemas: [ CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA ] }) .compileComponents(); diff --git a/web-app/admin/src/app/admin/admin-authentication/admin-authentication-ldap/admin-authentication-ldap.component.ts b/web-app/admin/src/app/admin/admin-authentication/admin-authentication-ldap/admin-authentication-ldap.component.ts index fbf336b04..c597b44f8 100644 --- a/web-app/admin/src/app/admin/admin-authentication/admin-authentication-ldap/admin-authentication-ldap.component.ts +++ b/web-app/admin/src/app/admin/admin-authentication/admin-authentication-ldap/admin-authentication-ldap.component.ts @@ -1,5 +1,11 @@ import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; import { Strategy } from '../../admin-authentication/admin-settings.model'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatSelectModule } from '@angular/material/select'; +import { MatExpansionModule } from '@angular/material/expansion'; interface Scope { value: string; @@ -8,23 +14,30 @@ interface Scope { @Component({ selector: 'admin-authentication-ldap', + standalone: true, + imports: [ + CommonModule, + FormsModule, + MatFormFieldModule, + MatInputModule, + MatSelectModule, + MatExpansionModule + ], templateUrl: './admin-authentication-ldap.component.html', styleUrls: ['./admin-authentication-ldap.component.scss'] }) - //https://datatracker.ietf.org/doc/html/rfc4510 +//https://datatracker.ietf.org/doc/html/rfc4510 export class AdminAuthenticationLDAPComponent implements OnInit { - - @Input() strategy: Strategy - @Input() editable = true + @Input() strategy: Strategy; + @Input() editable = true; @Output() strategyDirty = new EventEmitter(); scopes: Scope[] = [ - {value: 'sub', viewValue: 'sub'}, - {value: 'base', viewValue: 'base'}, - {value: 'one', viewValue: 'one'} + { value: 'sub', viewValue: 'sub' }, + { value: 'base', viewValue: 'base' }, + { value: 'one', viewValue: 'one' } ]; - ngOnInit(): void { if (!this.strategy.settings.headers) { this.strategy.settings.headers = {}; diff --git a/web-app/admin/src/app/admin/admin-authentication/admin-authentication-local/account-lock/account-lock.component.ts b/web-app/admin/src/app/admin/admin-authentication/admin-authentication-local/account-lock/account-lock.component.ts index 0815ddaa0..e15790899 100644 --- a/web-app/admin/src/app/admin/admin-authentication/admin-authentication-local/account-lock/account-lock.component.ts +++ b/web-app/admin/src/app/admin/admin-authentication/admin-authentication-local/account-lock/account-lock.component.ts @@ -1,51 +1,76 @@ import { Component, OnInit, Input, EventEmitter, Output } from '@angular/core'; -import { Strategy, AdminChoice } from '../../../admin-authentication/admin-settings.model'; +import { + Strategy, + AdminChoice +} from '../../../admin-authentication/admin-settings.model'; import { MaxLock } from './account-lock.model'; - +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatSelectModule } from '@angular/material/select'; @Component({ - selector: 'account-lock', - templateUrl: 'account-lock.component.html', - styleUrls: ['./account-lock.component.scss'] + selector: 'account-lock', + standalone: true, + imports: [ + CommonModule, + FormsModule, + MatFormFieldModule, + MatSelectModule, + MatInputModule + ], + templateUrl: 'account-lock.component.html', + styleUrls: ['./account-lock.component.scss'] }) export class AccountLockComponent implements OnInit { - @Input() strategy: Strategy; - @Output() strategyDirty = new EventEmitter(); + @Input() strategy: Strategy; + @Output() strategyDirty = new EventEmitter(); - readonly accountLockChoices: AdminChoice[] = [{ - title: 'Off', - description: 'Do not lock MAGE user accounts.', - value: false - }, { - title: 'On', - description: 'Lock MAGE user accounts for defined time \n after defined number of invalid login attempts.', - value: true - }]; - maxLock: MaxLock = { - enabled: false - }; - readonly maxLockChoices: AdminChoice[] = [{ - title: 'Off', - description: 'Do not disable MAGE user accounts.', - value: false - }, { - title: 'On', - description: 'Disable MAGE user accounts after account has been locked defined number of times.', - value: true - }]; + readonly accountLockChoices: AdminChoice[] = [ + { + title: 'Off', + description: 'Do not lock MAGE user accounts.', + value: false + }, + { + title: 'On', + description: + 'Lock MAGE user accounts for defined time \n after defined number of invalid login attempts.', + value: true + } + ]; + maxLock: MaxLock = { + enabled: false + }; + readonly maxLockChoices: AdminChoice[] = [ + { + title: 'Off', + description: 'Do not disable MAGE user accounts.', + value: false + }, + { + title: 'On', + description: + 'Disable MAGE user accounts after account has been locked defined number of times.', + value: true + } + ]; - ngOnInit(): void { - if (this.strategy.type === 'local') { - this.maxLock.enabled = this.strategy.settings.accountLock && this.strategy.settings.accountLock.max !== undefined; + ngOnInit(): void { + if (this.strategy.type === 'local') { + this.maxLock.enabled = + this.strategy.settings.accountLock && + this.strategy.settings.accountLock.max !== undefined; - if (!this.maxLock.enabled) { - delete this.strategy.settings.accountLock.max; - } - } + if (!this.maxLock.enabled) { + delete this.strategy.settings.accountLock.max; + } } + } - setDirty(isDirty: boolean): void { - this.strategy.isDirty = isDirty; - this.strategyDirty.emit(isDirty); - } -} \ No newline at end of file + setDirty(isDirty: boolean): void { + this.strategy.isDirty = isDirty; + this.strategyDirty.emit(isDirty); + } +} diff --git a/web-app/admin/src/app/admin/admin-authentication/admin-authentication-local/admin-authentication-local.component.spec.ts b/web-app/admin/src/app/admin/admin-authentication/admin-authentication-local/admin-authentication-local.component.spec.ts index b15b68a9d..96934f8a9 100644 --- a/web-app/admin/src/app/admin/admin-authentication/admin-authentication-local/admin-authentication-local.component.spec.ts +++ b/web-app/admin/src/app/admin/admin-authentication/admin-authentication-local/admin-authentication-local.component.spec.ts @@ -1,22 +1,10 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { AdminAuthenticationLocalComponent } from './admin-authentication-local.component'; -import { CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA } from '@angular/core'; describe('AdminAuthenticationLocalComponent', () => { let component: AdminAuthenticationLocalComponent; - let fixture: ComponentFixture; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - declarations: [AdminAuthenticationLocalComponent], - schemas: [CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA] - }).compileComponents(); - })); beforeEach(() => { - fixture = TestBed.createComponent(AdminAuthenticationLocalComponent); - component = fixture.componentInstance; - fixture.detectChanges(); + component = new AdminAuthenticationLocalComponent(); }); it('should create', () => { diff --git a/web-app/admin/src/app/admin/admin-authentication/admin-authentication-local/admin-authentication-local.component.ts b/web-app/admin/src/app/admin/admin-authentication/admin-authentication-local/admin-authentication-local.component.ts index 747fde887..e083de773 100644 --- a/web-app/admin/src/app/admin/admin-authentication/admin-authentication-local/admin-authentication-local.component.ts +++ b/web-app/admin/src/app/admin/admin-authentication/admin-authentication-local/admin-authentication-local.component.ts @@ -1,8 +1,17 @@ import { Component, EventEmitter, Input, Output } from '@angular/core'; import { Strategy } from '../../admin-authentication/admin-settings.model'; +import { CommonModule } from '@angular/common'; +import { AccountLockComponent } from './account-lock/account-lock.component'; +import { PasswordPolicyComponent } from './password-policy/password-policy.component'; @Component({ selector: 'admin-authentication-local', + standalone: true, + imports: [ + CommonModule, + AccountLockComponent, + PasswordPolicyComponent + ], templateUrl: './admin-authentication-local.component.html', styleUrls: ['./admin-authentication-local.component.scss'] }) diff --git a/web-app/admin/src/app/admin/admin-authentication/admin-authentication-local/password-policy/password-policy.component.ts b/web-app/admin/src/app/admin/admin-authentication/admin-authentication-local/password-policy/password-policy.component.ts index 08c6aaacd..c43364763 100644 --- a/web-app/admin/src/app/admin/admin-authentication/admin-authentication-local/password-policy/password-policy.component.ts +++ b/web-app/admin/src/app/admin/admin-authentication/admin-authentication-local/password-policy/password-policy.component.ts @@ -1,38 +1,57 @@ import { Component, OnInit, Input, EventEmitter, Output } from '@angular/core'; import { Strategy } from '../../../admin-authentication/admin-settings.model'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { MatCheckboxModule } from '@angular/material/checkbox'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { MatTooltipModule } from '@angular/material/tooltip'; @Component({ - selector: 'password-policy', - templateUrl: 'password-policy.component.html', - styleUrls: ['./password-policy.component.scss'] + selector: 'password-policy', + standalone: true, + imports: [ + CommonModule, + FormsModule, + MatCheckboxModule, + MatFormFieldModule, + MatInputModule, + MatIconModule, + MatTooltipModule + ], + templateUrl: 'password-policy.component.html', + styleUrls: ['./password-policy.component.scss'] }) export class PasswordPolicyComponent implements OnInit { - @Input() strategy: Strategy; - @Output() strategyDirty = new EventEmitter(); + @Input() strategy: Strategy; + @Output() strategyDirty = new EventEmitter(); - ngOnInit(): void { - if (this.strategy.settings.passwordPolicy) { - this.buildPasswordHelp(); - } + ngOnInit(): void { + if (this.strategy.settings.passwordPolicy) { + this.buildPasswordHelp(); } + } - buildPasswordHelp(): void { - if (this.strategy.settings.passwordPolicy) { - if (!this.strategy.settings.passwordPolicy.customizeHelpText) { - const policy = this.strategy.settings.passwordPolicy - const templates = Object.entries(policy.helpTextTemplate) - .filter(([key]) => policy[`${key}Enabled`] === true) - .map(([key, value]) => { - return (value as string).replace('#', policy[key]) - }); + buildPasswordHelp(): void { + if (this.strategy.settings.passwordPolicy) { + if (!this.strategy.settings.passwordPolicy.customizeHelpText) { + const policy = this.strategy.settings.passwordPolicy; + const templates = Object.entries(policy.helpTextTemplate) + .filter(([key]) => policy[`${key}Enabled`] === true) + .map(([key, value]) => { + return (value as string).replace('#', policy[key]); + }); - this.strategy.settings.passwordPolicy.helpText = `Password is invalid, must ${templates.join(' and ')}.`; - } - } + this.strategy.settings.passwordPolicy.helpText = `Password is invalid, must ${templates.join( + ' and ' + )}.`; + } } + } - setDirty(isDirty: boolean): void { - this.strategy.isDirty = isDirty; - this.strategyDirty.emit(isDirty); - } -} \ No newline at end of file + setDirty(isDirty: boolean): void { + this.strategy.isDirty = isDirty; + this.strategyDirty.emit(isDirty); + } +} diff --git a/web-app/admin/src/app/admin/admin-authentication/admin-authentication-oauth2/admin-authentication-oauth2.component.spec.ts b/web-app/admin/src/app/admin/admin-authentication/admin-authentication-oauth2/admin-authentication-oauth2.component.spec.ts index 883d41e57..ab9e983cc 100644 --- a/web-app/admin/src/app/admin/admin-authentication/admin-authentication-oauth2/admin-authentication-oauth2.component.spec.ts +++ b/web-app/admin/src/app/admin/admin-authentication/admin-authentication-oauth2/admin-authentication-oauth2.component.spec.ts @@ -9,7 +9,7 @@ describe('AdminAuthenticationOAuth2Component', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [AdminAuthenticationOAuth2Component], + imports: [AdminAuthenticationOAuth2Component], schemas: [CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA] }) .compileComponents(); diff --git a/web-app/admin/src/app/admin/admin-authentication/admin-authentication-oauth2/admin-authentication-oauth2.component.ts b/web-app/admin/src/app/admin/admin-authentication/admin-authentication-oauth2/admin-authentication-oauth2.component.ts index a7f19e032..4678e7d5e 100644 --- a/web-app/admin/src/app/admin/admin-authentication/admin-authentication-oauth2/admin-authentication-oauth2.component.ts +++ b/web-app/admin/src/app/admin/admin-authentication/admin-authentication-oauth2/admin-authentication-oauth2.component.ts @@ -1,8 +1,23 @@ import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; import { Strategy } from '../../admin-authentication/admin-settings.model'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { MatCheckboxModule } from '@angular/material/checkbox'; +import { MatExpansionModule } from '@angular/material/expansion'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; @Component({ selector: 'admin-authentication-oauth2', + standalone: true, + imports: [ + CommonModule, + FormsModule, + MatFormFieldModule, + MatInputModule, + MatCheckboxModule, + MatExpansionModule + ], templateUrl: './admin-authentication-oauth2.component.html', styleUrls: ['./admin-authentication-oauth2.component.scss'] }) diff --git a/web-app/admin/src/app/admin/admin-authentication/admin-authentication-oidc/admin-authentication-oidc.component.spec.ts b/web-app/admin/src/app/admin/admin-authentication/admin-authentication-oidc/admin-authentication-oidc.component.spec.ts index a559992cf..131804974 100644 --- a/web-app/admin/src/app/admin/admin-authentication/admin-authentication-oidc/admin-authentication-oidc.component.spec.ts +++ b/web-app/admin/src/app/admin/admin-authentication/admin-authentication-oidc/admin-authentication-oidc.component.spec.ts @@ -9,8 +9,7 @@ describe('AdminAuthenticationOidcComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ AdminAuthenticationOidcComponent ], - imports: [], + imports: [ AdminAuthenticationOidcComponent ], schemas: [CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA] }) .compileComponents(); diff --git a/web-app/admin/src/app/admin/admin-authentication/admin-authentication-oidc/admin-authentication-oidc.component.ts b/web-app/admin/src/app/admin/admin-authentication/admin-authentication-oidc/admin-authentication-oidc.component.ts index 164bdbb19..e43afd76d 100644 --- a/web-app/admin/src/app/admin/admin-authentication/admin-authentication-oidc/admin-authentication-oidc.component.ts +++ b/web-app/admin/src/app/admin/admin-authentication/admin-authentication-oidc/admin-authentication-oidc.component.ts @@ -1,8 +1,21 @@ import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; import { Strategy } from '../../admin-authentication/admin-settings.model'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { MatExpansionModule } from '@angular/material/expansion'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; @Component({ selector: 'admin-authentication-oidc', + standalone: true, + imports: [ + CommonModule, + FormsModule, + MatFormFieldModule, + MatInputModule, + MatExpansionModule + ], templateUrl: './admin-authentication-oidc.component.html', styleUrls: ['./admin-authentication-oidc.component.scss'] }) diff --git a/web-app/admin/src/app/admin/admin-authentication/admin-authentication-saml/admin-authentication-saml.component.spec.ts b/web-app/admin/src/app/admin/admin-authentication/admin-authentication-saml/admin-authentication-saml.component.spec.ts index a51b2da74..3f094ca4f 100644 --- a/web-app/admin/src/app/admin/admin-authentication/admin-authentication-saml/admin-authentication-saml.component.spec.ts +++ b/web-app/admin/src/app/admin/admin-authentication/admin-authentication-saml/admin-authentication-saml.component.spec.ts @@ -9,7 +9,7 @@ describe('AdminAuthenticationSAMLComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ AdminAuthenticationSAMLComponent ], + imports: [ AdminAuthenticationSAMLComponent ], schemas: [ CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA ] }) .compileComponents(); diff --git a/web-app/admin/src/app/admin/admin-authentication/admin-authentication-saml/admin-authentication-saml.component.ts b/web-app/admin/src/app/admin/admin-authentication/admin-authentication-saml/admin-authentication-saml.component.ts index be0b85df1..1dd50b930 100644 --- a/web-app/admin/src/app/admin/admin-authentication/admin-authentication-saml/admin-authentication-saml.component.ts +++ b/web-app/admin/src/app/admin/admin-authentication/admin-authentication-saml/admin-authentication-saml.component.ts @@ -1,5 +1,12 @@ import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; import { Strategy } from '../../admin-authentication/admin-settings.model'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatSelectModule } from '@angular/material/select'; +import { MatCheckboxModule } from '@angular/material/checkbox'; +import { MatExpansionModule } from '@angular/material/expansion'; interface SignatureAlgorithm { value: string; @@ -13,6 +20,16 @@ interface RACComparison { @Component({ selector: 'admin-authentication-saml', + standalone: true, + imports: [ + CommonModule, + FormsModule, + MatFormFieldModule, + MatInputModule, + MatSelectModule, + MatCheckboxModule, + MatExpansionModule + ], templateUrl: './admin-authentication-saml.component.html', styleUrls: ['./admin-authentication-saml.component.scss'] }) diff --git a/web-app/admin/src/app/admin/admin-authentication/admin-authentication-settings.component.ts b/web-app/admin/src/app/admin/admin-authentication/admin-authentication-settings.component.ts index 575abd04a..8da5d29a5 100644 --- a/web-app/admin/src/app/admin/admin-authentication/admin-authentication-settings.component.ts +++ b/web-app/admin/src/app/admin/admin-authentication/admin-authentication-settings.component.ts @@ -1,8 +1,30 @@ import { Component, EventEmitter, Input, Output } from '@angular/core'; import { Strategy, AdminChoice } from '../admin-authentication/admin-settings.model'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatSelectModule } from '@angular/material/select'; + +import { AdminAuthenticationLocalComponent } from './admin-authentication-local/admin-authentication-local.component'; +import { AdminAuthenticationOidcComponent } from './admin-authentication-oidc/admin-authentication-oidc.component'; +import { AdminAuthenticationOAuth2Component } from './admin-authentication-oauth2/admin-authentication-oauth2.component'; +import { AdminAuthenticationLDAPComponent } from './admin-authentication-ldap/admin-authentication-ldap.component'; +import { AdminAuthenticationSAMLComponent } from './admin-authentication-saml/admin-authentication-saml.component'; @Component({ selector: 'admin-authentication-settings', + standalone: true, + imports: [ + CommonModule, + FormsModule, + MatFormFieldModule, + MatSelectModule, + AdminAuthenticationLocalComponent, + AdminAuthenticationOidcComponent, + AdminAuthenticationOAuth2Component, + AdminAuthenticationLDAPComponent, + AdminAuthenticationSAMLComponent + ], templateUrl: 'admin-authentication-settings.component.html', styleUrls: ['./admin-authentication-settings.component.scss'] }) diff --git a/web-app/admin/src/app/admin/admin-authentication/admin-authentication.component.ts b/web-app/admin/src/app/admin/admin-authentication/admin-authentication.component.ts index a8b79ef5d..616b6b03f 100644 --- a/web-app/admin/src/app/admin/admin-authentication/admin-authentication.component.ts +++ b/web-app/admin/src/app/admin/admin-authentication/admin-authentication.component.ts @@ -20,7 +20,15 @@ import { LocalStorageService } from '../../../../../../web-app/src/app/http/loca import { AuthenticationConfigurationService } from '../services/admin-authentication-configuration.service'; import { AdminTeamsService } from '../services/admin-teams-service'; import { AdminEventsService } from '../services/admin-events.service'; -import { Router } from '@angular/router'; +import { Router, RouterModule } from '@angular/router'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { MatExpansionModule } from '@angular/material/expansion'; +import { MatIconModule } from '@angular/material/icon'; +import { AdminBreadcrumbComponent } from '../admin-breadcrumb/admin-breadcrumb.component'; +import { AdminAuthenticationSettingsComponent } from './admin-authentication-settings.component'; +import { MatSlideToggleModule } from '@angular/material/slide-toggle'; +import { MatFormFieldModule } from '@angular/material/form-field'; export interface CanComponentDeactivate { canDeactivate: () => boolean | Promise; @@ -28,6 +36,18 @@ export interface CanComponentDeactivate { @Component({ selector: 'admin-authentication', + standalone: true, + imports: [ + CommonModule, + FormsModule, + RouterModule, + MatIconModule, + MatExpansionModule, + MatSlideToggleModule, + MatFormFieldModule, + AdminBreadcrumbComponent, + AdminAuthenticationSettingsComponent + ], templateUrl: 'admin-authentication.component.html', styleUrls: ['./admin-authentication.component.scss'] }) diff --git a/web-app/admin/src/app/admin/admin-breadcrumb/admin-breadcrumb.component.scss b/web-app/admin/src/app/admin/admin-breadcrumb/admin-breadcrumb.component.scss index f703702da..a8857ff06 100644 --- a/web-app/admin/src/app/admin/admin-breadcrumb/admin-breadcrumb.component.scss +++ b/web-app/admin/src/app/admin/admin-breadcrumb/admin-breadcrumb.component.scss @@ -24,7 +24,7 @@ box-sizing: border-box; .admin-breadcrumb { - color: mat.get-color-from-palette($app-primary); + color: mat.m2-get-color-from-palette($app-primary); cursor: pointer; display: inline-flex; align-items: center; @@ -32,7 +32,7 @@ } .admin-breadcrumb:hover { - color: mat.get-color-from-palette($app-primary); + color: mat.m2-get-color-from-palette($app-primary); opacity: 0.6; } @@ -53,7 +53,7 @@ mat-icon, i { - color: mat.get-color-from-palette($app-primary); + color: mat.m2-get-color-from-palette($app-primary); margin-right: 7px; margin-left: 7px; width: 24px; diff --git a/web-app/admin/src/app/admin/admin-breadcrumb/admin-breadcrumb.component.spec.ts b/web-app/admin/src/app/admin/admin-breadcrumb/admin-breadcrumb.component.spec.ts index f9f821234..d970584fd 100644 --- a/web-app/admin/src/app/admin/admin-breadcrumb/admin-breadcrumb.component.spec.ts +++ b/web-app/admin/src/app/admin/admin-breadcrumb/admin-breadcrumb.component.spec.ts @@ -5,11 +5,12 @@ import { AdminBreadcrumb } from './admin-breadcrumb.model'; import { MatIconTestingModule } from '@angular/material/icon/testing'; import { MatIconModule } from '@angular/material/icon'; import { RouterTestingModule } from '@angular/router/testing'; -import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; describe('AdminBreadcrumbComponent', () => { @Component({ selector: 'app-host-component', + standalone: true, + imports: [AdminBreadcrumbComponent], template: `` @@ -28,9 +29,12 @@ describe('AdminBreadcrumbComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - imports: [MatIconTestingModule, MatIconModule, RouterTestingModule], - declarations: [TestHostComponent, AdminBreadcrumbComponent], - schemas: [CUSTOM_ELEMENTS_SCHEMA] + imports: [ + TestHostComponent, + MatIconTestingModule, + MatIconModule, + RouterTestingModule + ] }).compileComponents(); })); diff --git a/web-app/admin/src/app/admin/admin-breadcrumb/admin-breadcrumb.component.ts b/web-app/admin/src/app/admin/admin-breadcrumb/admin-breadcrumb.component.ts index f95a69775..039d8ba33 100644 --- a/web-app/admin/src/app/admin/admin-breadcrumb/admin-breadcrumb.component.ts +++ b/web-app/admin/src/app/admin/admin-breadcrumb/admin-breadcrumb.component.ts @@ -1,8 +1,17 @@ import { Component, Input } from '@angular/core'; import { AdminBreadcrumb } from './admin-breadcrumb.model'; +import { CommonModule } from '@angular/common'; +import { RouterModule } from '@angular/router'; +import { MatIconModule } from '@angular/material/icon'; @Component({ selector: 'admin-breadcrumb', + standalone: true, + imports: [ + CommonModule, + RouterModule, + MatIconModule + ], templateUrl: './admin-breadcrumb.component.html', styleUrls: ['./admin-breadcrumb.component.scss'] }) diff --git a/web-app/admin/src/app/admin/admin-breadcrumb/admin-breadcrumb.module.ts b/web-app/admin/src/app/admin/admin-breadcrumb/admin-breadcrumb.module.ts index b1b817df7..4d02961f1 100644 --- a/web-app/admin/src/app/admin/admin-breadcrumb/admin-breadcrumb.module.ts +++ b/web-app/admin/src/app/admin/admin-breadcrumb/admin-breadcrumb.module.ts @@ -5,10 +5,8 @@ import { MatIconModule } from '@angular/material/icon'; import { RouterModule } from '@angular/router'; @NgModule({ - declarations: [ - AdminBreadcrumbComponent - ], imports: [ + AdminBreadcrumbComponent, CommonModule, MatIconModule, RouterModule, diff --git a/web-app/admin/src/app/admin/admin-dashboard/admin-dashboard.module.ts b/web-app/admin/src/app/admin/admin-dashboard/admin-dashboard.module.ts index 3e0a8fcbc..0877b077b 100644 --- a/web-app/admin/src/app/admin/admin-dashboard/admin-dashboard.module.ts +++ b/web-app/admin/src/app/admin/admin-dashboard/admin-dashboard.module.ts @@ -20,8 +20,8 @@ import { MatTableModule as MatTableModule } from '@angular/material/table'; import { RouterModule } from '@angular/router'; @NgModule({ - declarations: [AdminDashboardComponent], imports: [ + AdminDashboardComponent, CommonModule, FormsModule, LoginsModule, diff --git a/web-app/admin/src/app/admin/admin-dashboard/admin-dashboard.spec.ts b/web-app/admin/src/app/admin/admin-dashboard/admin-dashboard.spec.ts index e74106c60..d0e536e0c 100644 --- a/web-app/admin/src/app/admin/admin-dashboard/admin-dashboard.spec.ts +++ b/web-app/admin/src/app/admin/admin-dashboard/admin-dashboard.spec.ts @@ -33,6 +33,11 @@ import { AdminUserService } from '../services/admin-user.service'; import { AdminDeviceService } from '../services/admin-device.service'; import { DevicePagingService } from '../../services/device-paging.service'; import { UserPagingService } from '../../services/user-paging.service'; +import { + provideHttpClient, + withInterceptorsFromDi +} from '@angular/common/http'; +import { provideHttpClientTesting } from '@angular/common/http/testing'; const TEST_USERS: any[] = [ { @@ -202,8 +207,8 @@ describe('AdminDashboardComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [AdminDashboardComponent], imports: [ + AdminDashboardComponent, CommonModule, FormsModule, MatToolbarModule, @@ -227,7 +232,9 @@ describe('AdminDashboardComponent', () => { { provide: AdminUserService, useValue: mockUserService }, { provide: AdminDeviceService, useValue: mockDeviceService }, { provide: DevicePagingService, useValue: mockDevicePagingService }, - { provide: UserPagingService, useValue: mockUserPagingService } + { provide: UserPagingService, useValue: mockUserPagingService }, + provideHttpClient(withInterceptorsFromDi()), + provideHttpClientTesting() ], schemas: [CUSTOM_ELEMENTS_SCHEMA] }).compileComponents(); diff --git a/web-app/admin/src/app/admin/admin-dashboard/admin-dashboard.ts b/web-app/admin/src/app/admin/admin-dashboard/admin-dashboard.ts index 1ee66071a..03ff37322 100644 --- a/web-app/admin/src/app/admin/admin-dashboard/admin-dashboard.ts +++ b/web-app/admin/src/app/admin/admin-dashboard/admin-dashboard.ts @@ -5,7 +5,7 @@ import { OnDestroy, OnInit } from '@angular/core'; -import { ActivatedRoute, Router } from '@angular/router'; +import { ActivatedRoute, Router, RouterModule } from '@angular/router'; import { Subject, takeUntil } from 'rxjs'; import { AdminBreadcrumb } from '../admin-breadcrumb/admin-breadcrumb.model'; @@ -14,9 +14,34 @@ import { AdminDeviceService } from '../services/admin-device.service'; import { DevicePagingService } from '../../services/device-paging.service'; import { UserPagingService } from '../../services/user-paging.service'; import { User } from '../admin-users/user'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { MatCardModule } from '@angular/material/card'; +import { MatBadgeModule } from '@angular/material/badge'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatListModule } from '@angular/material/list'; +import { MatIconModule } from '@angular/material/icon'; +import { AdminBreadcrumbComponent } from '../admin-breadcrumb/admin-breadcrumb.component'; +import { LoginsModule } from '../../logins/logins.module'; + @Component({ selector: 'admin-dashboard', + standalone: true, + imports: [ + CommonModule, + FormsModule, + RouterModule, + AdminBreadcrumbComponent, + MatCardModule, + MatBadgeModule, + MatFormFieldModule, + MatInputModule, + MatListModule, + MatIconModule, + LoginsModule + ], templateUrl: './admin-dashboard.html', styleUrls: ['./admin-dashboard.scss'] }) diff --git a/web-app/admin/src/app/admin/admin-devices/admin-devices.module.ts b/web-app/admin/src/app/admin/admin-devices/admin-devices.module.ts index d2bed2b7c..ffb028ade 100644 --- a/web-app/admin/src/app/admin/admin-devices/admin-devices.module.ts +++ b/web-app/admin/src/app/admin/admin-devices/admin-devices.module.ts @@ -32,51 +32,44 @@ import { DeleteDeviceComponent } from './delete-device/delete-device.component'; import { LoginsModule } from '../../logins/logins.module'; @NgModule({ - declarations: [ - DeviceDashboardComponent, - DeviceDetailsComponent, - DeleteDeviceComponent, - CreateDeviceDialogComponent, - ], - imports: [ - CommonModule, - FormsModule, - CoreModule, - ReactiveFormsModule, - RouterModule, - CoreModule, - AdminBreadcrumbModule, - MatButtonModule, - MatCardModule, - MatChipsModule, - MatTableModule, - MatPaginatorModule, - MatSortModule, - MatDialogModule, - MatFormFieldModule, - MatDividerModule, - MatIconModule, - MatInputModule, - MatButtonModule, - MatCheckboxModule, - MatIconModule, - MatProgressSpinnerModule, - AdminBreadcrumbModule, - MatSelectModule, - MatOptionModule, - MatTooltipModule, - MatTableModule, - MatPaginatorModule, - DragDropModule, - AdminUsersModule, - LoginsModule - ], - exports: [ - DeviceDashboardComponent, - DeviceDetailsComponent, - ], - providers: [ - AdminDeviceService - ] + imports: [ + CommonModule, + FormsModule, + CoreModule, + ReactiveFormsModule, + RouterModule, + CoreModule, + AdminBreadcrumbModule, + MatButtonModule, + MatCardModule, + MatChipsModule, + MatTableModule, + MatPaginatorModule, + MatSortModule, + MatDialogModule, + MatFormFieldModule, + MatDividerModule, + MatIconModule, + MatInputModule, + MatButtonModule, + MatCheckboxModule, + MatIconModule, + MatProgressSpinnerModule, + AdminBreadcrumbModule, + MatSelectModule, + MatOptionModule, + MatTooltipModule, + MatTableModule, + MatPaginatorModule, + DragDropModule, + AdminUsersModule, + LoginsModule, + DeviceDashboardComponent, + DeviceDetailsComponent, + DeleteDeviceComponent, + CreateDeviceDialogComponent + ], + exports: [DeviceDashboardComponent, DeviceDetailsComponent], + providers: [AdminDeviceService] }) -export class AdminDevicesModule { } \ No newline at end of file +export class AdminDevicesModule {} diff --git a/web-app/admin/src/app/admin/admin-devices/create-device/create-device.component.ts b/web-app/admin/src/app/admin/admin-devices/create-device/create-device.component.ts index 087572b29..f9805c971 100644 --- a/web-app/admin/src/app/admin/admin-devices/create-device/create-device.component.ts +++ b/web-app/admin/src/app/admin/admin-devices/create-device/create-device.component.ts @@ -1,9 +1,24 @@ import { Component, Inject } from '@angular/core'; -import { MatDialogRef as MatDialogRef, MAT_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/dialog'; -import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { + MatDialogRef as MatDialogRef, + MAT_DIALOG_DATA as MAT_DIALOG_DATA, + MatDialogModule +} from '@angular/material/dialog'; +import { + FormBuilder, + FormGroup, + FormsModule, + ReactiveFormsModule, + Validators +} from '@angular/forms'; import { AdminDeviceService } from '../../services/admin-device.service'; import { Device } from '../../../../@types/dashboard/devices-dashboard'; import { User } from '../../admin-users/user'; +import { CommonModule } from '@angular/common'; +import { UserSearchBoxComponent } from '../../admin-users/user-search/user-search-box.component'; +import { MatButtonModule } from '@angular/material/button'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; /** * Dialog component for creating new devices. @@ -11,6 +26,17 @@ import { User } from '../../admin-users/user'; */ @Component({ selector: 'mage-admin-device-create', + standalone: true, + imports: [ + CommonModule, + FormsModule, + ReactiveFormsModule, + MatButtonModule, + MatDialogModule, + MatFormFieldModule, + MatInputModule, + UserSearchBoxComponent + ], templateUrl: './create-device.component.html', styleUrls: ['./create-device.component.scss'] }) @@ -36,7 +62,7 @@ export class CreateDeviceDialogComponent { userId: user ? user.id : '' }); } - + /** * Handles form submission for creating a new device. * Validates the form, creates the device via the devices service, and closes the dialog on success. diff --git a/web-app/admin/src/app/admin/admin-devices/dashboard/devices-dashboard.component.spec.ts b/web-app/admin/src/app/admin/admin-devices/dashboard/devices-dashboard.component.spec.ts index 9c7cdf654..79ac4be9e 100644 --- a/web-app/admin/src/app/admin/admin-devices/dashboard/devices-dashboard.component.spec.ts +++ b/web-app/admin/src/app/admin/admin-devices/dashboard/devices-dashboard.component.spec.ts @@ -75,8 +75,9 @@ describe('DeviceDashboardComponent', () => { }; await TestBed.configureTestingModule({ - declarations: [DeviceDashboardComponent], + imports: [ + DeviceDashboardComponent, RouterTestingModule.withRoutes([]), MatDialogModule, MatPaginatorModule, diff --git a/web-app/admin/src/app/admin/admin-devices/dashboard/devices-dashboard.component.ts b/web-app/admin/src/app/admin/admin-devices/dashboard/devices-dashboard.component.ts index 021f46e6e..ff0aeb226 100644 --- a/web-app/admin/src/app/admin/admin-devices/dashboard/devices-dashboard.component.ts +++ b/web-app/admin/src/app/admin/admin-devices/dashboard/devices-dashboard.component.ts @@ -1,6 +1,6 @@ import { Component, OnInit, HostListener, OnDestroy } from '@angular/core'; import { MatDialog as MatDialog } from '@angular/material/dialog'; -import { PageEvent as PageEvent } from '@angular/material/paginator'; +import { MatPaginatorModule, PageEvent as PageEvent } from '@angular/material/paginator'; import { AdminDeviceService, DevicesResponse, @@ -12,9 +12,31 @@ import { CreateDeviceDialogComponent } from '../create-device/create-device.comp import { AdminUserService } from '../../services/admin-user.service'; import { Subject, takeUntil } from 'rxjs'; import { AdminToastService } from '../../services/admin-toast.service'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatSelectModule } from '@angular/material/select'; +import { MatTableModule } from '@angular/material/table'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { RouterModule } from '@angular/router'; +import { CardNavbarComponent } from '../../../core/card-navbar/card-navbar.component'; +import { AdminBreadcrumbComponent } from '../../admin-breadcrumb/admin-breadcrumb.component'; @Component({ selector: 'admin-devices', + standalone: true, + imports: [ + CommonModule, + FormsModule, + RouterModule, + AdminBreadcrumbComponent, + CardNavbarComponent, + MatFormFieldModule, + MatSelectModule, + MatTableModule, + MatTooltipModule, + MatPaginatorModule + ], templateUrl: './devices-dashboard.component.html', styleUrls: ['./devices-dashboard.component.scss'] }) diff --git a/web-app/admin/src/app/admin/admin-devices/device-details/device-details.component.spec.ts b/web-app/admin/src/app/admin/admin-devices/device-details/device-details.component.spec.ts index 79f577c4e..c360e31a8 100644 --- a/web-app/admin/src/app/admin/admin-devices/device-details/device-details.component.spec.ts +++ b/web-app/admin/src/app/admin/admin-devices/device-details/device-details.component.spec.ts @@ -64,7 +64,7 @@ describe('DeviceDetailsComponent', () => { }; await TestBed.configureTestingModule({ - declarations: [DeviceDetailsComponent], + imports: [DeviceDetailsComponent], providers: [ { provide: ActivatedRoute, useValue: route }, { provide: Router, useValue: router }, diff --git a/web-app/admin/src/app/admin/admin-devices/device-details/device-details.component.ts b/web-app/admin/src/app/admin/admin-devices/device-details/device-details.component.ts index a65ec04ce..6b1634c13 100644 --- a/web-app/admin/src/app/admin/admin-devices/device-details/device-details.component.ts +++ b/web-app/admin/src/app/admin/admin-devices/device-details/device-details.component.ts @@ -7,9 +7,22 @@ import { Device } from '../../../../@types/dashboard/devices-dashboard'; import { User } from '../../admin-users/user'; import { AdminUserService } from '../../services/admin-user.service'; import { AdminDeviceService } from '../../services/admin-device.service'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { LoginsComponent } from '../../../logins/logins.component'; +import { AdminBreadcrumbComponent } from '../../admin-breadcrumb/admin-breadcrumb.component'; +import { UserSearchBoxComponent } from '../../admin-users/user-search/user-search-box.component'; @Component({ selector: 'mage-device-details', + standalone: true, + imports: [ + CommonModule, + FormsModule, + AdminBreadcrumbComponent, + UserSearchBoxComponent, + LoginsComponent + ], templateUrl: './device-details.component.html', styleUrls: ['./device-details.component.scss'] }) diff --git a/web-app/admin/src/app/admin/admin-event/admin-event-form/admin-event-form-preview/admin-event-form-preview.component.spec.ts b/web-app/admin/src/app/admin/admin-event/admin-event-form/admin-event-form-preview/admin-event-form-preview.component.spec.ts index c4a65991f..868a646b0 100644 --- a/web-app/admin/src/app/admin/admin-event/admin-event-form/admin-event-form-preview/admin-event-form-preview.component.spec.ts +++ b/web-app/admin/src/app/admin/admin-event/admin-event-form/admin-event-form-preview/admin-event-form-preview.component.spec.ts @@ -1,52 +1,65 @@ import { Component, ViewChild } from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { MatDialog as MatDialog, MatDialogModule as MatDialogModule } from '@angular/material/dialog'; +import { + MatDialog as MatDialog, + MatDialogModule as MatDialogModule +} from '@angular/material/dialog'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { Observable, of } from 'rxjs'; import { AdminEventFormPreviewComponent } from './admin-event-form-preview.component'; @Component({ - template: '' + standalone: true, + imports: [AdminEventFormPreviewComponent], + template: + '' }) class TestHostComponent { - formDefinition: any + formDefinition: any; @ViewChild(AdminEventFormPreviewComponent, { static: true }) - public adminEventFormPreviewComponent: AdminEventFormPreviewComponent + public adminEventFormPreviewComponent: AdminEventFormPreviewComponent; } class MatDialogMock { open(): any { return { afterClosed: (): Observable => of(true) - } + }; } } describe('AdminEventFormPreviewComponent', () => { - let component: AdminEventFormPreviewComponent - let hostComponent: TestHostComponent - let fixture: ComponentFixture - let dialog: MatDialog + let component: AdminEventFormPreviewComponent; + let hostComponent: TestHostComponent; + let fixture: ComponentFixture; + let dialog: MatDialog; beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - imports: [BrowserAnimationsModule, MatDialogModule], - declarations: [AdminEventFormPreviewComponent, TestHostComponent], - providers: [{ - provide: MatDialog, useClass: MatDialogMock - }] - }) - .compileComponents() + imports: [ + BrowserAnimationsModule, + MatDialogModule, + AdminEventFormPreviewComponent, + TestHostComponent + ], + + providers: [ + { + provide: MatDialog, + useClass: MatDialogMock + } + ] + }).compileComponents(); })); beforeEach(() => { - fixture = TestBed.createComponent(TestHostComponent) - hostComponent = fixture.componentInstance - component = hostComponent.adminEventFormPreviewComponent - dialog = TestBed.inject(MatDialog) - fixture.detectChanges() + fixture = TestBed.createComponent(TestHostComponent); + hostComponent = fixture.componentInstance; + component = hostComponent.adminEventFormPreviewComponent; + dialog = TestBed.inject(MatDialog); + fixture.detectChanges(); }); it('should create', () => { @@ -54,29 +67,29 @@ describe('AdminEventFormPreviewComponent', () => { }); it('should open dialog', () => { - spyOn(dialog, 'open').and.callThrough() + spyOn(dialog, 'open').and.callThrough(); hostComponent.formDefinition = { fields: [] - } + }; - fixture.detectChanges() + fixture.detectChanges(); - expect(dialog.open).toHaveBeenCalled() + expect(dialog.open).toHaveBeenCalled(); }); it('should close dialog', waitForAsync(async () => { - spyOn(component.onClose, 'emit') - spyOn(component.dialog, 'open').and.callThrough() + spyOn(component.onClose, 'emit'); + spyOn(component.dialog, 'open').and.callThrough(); hostComponent.formDefinition = { name: 'Mock Form 1', fields: [] - } + }; - fixture.detectChanges() + fixture.detectChanges(); - expect(dialog.open).toHaveBeenCalled() - expect(component.onClose.emit).toHaveBeenCalled() + expect(dialog.open).toHaveBeenCalled(); + expect(component.onClose.emit).toHaveBeenCalled(); })); }); diff --git a/web-app/admin/src/app/admin/admin-event/admin-event-form/admin-event-form-preview/form-preview-dialog/admin-event-form-preview-dialog.component.spec.ts b/web-app/admin/src/app/admin/admin-event/admin-event-form/admin-event-form-preview/form-preview-dialog/admin-event-form-preview-dialog.component.spec.ts index 347d52334..abfdb1b38 100644 --- a/web-app/admin/src/app/admin/admin-event/admin-event-form/admin-event-form-preview/form-preview-dialog/admin-event-form-preview-dialog.component.spec.ts +++ b/web-app/admin/src/app/admin/admin-event/admin-event-form/admin-event-form-preview/form-preview-dialog/admin-event-form-preview-dialog.component.spec.ts @@ -1,51 +1,63 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { MatDialogModule as MatDialogModule, MAT_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { + MatDialogModule as MatDialogModule, + MAT_DIALOG_DATA as MAT_DIALOG_DATA +} from '@angular/material/dialog'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { AdminEventFormPreviewDialogComponent } from './admin-event-form-preview-dialog.component'; import { AdminEventFormPreviewComponent } from '../admin-event-form-preview.component'; describe('AdminEventFormPreviewComponent', () => { - let component: AdminEventFormPreviewDialogComponent - let fixture: ComponentFixture + let component: AdminEventFormPreviewDialogComponent; + let fixture: ComponentFixture; beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - imports: [BrowserAnimationsModule, MatDialogModule], - declarations: [AdminEventFormPreviewComponent], - providers: [{ - provide: MAT_DIALOG_DATA, - useValue: { - name: 'Mock Form', - fields: [{ - id: 1, - archived: true, - name: 'field1', - title: 'Field 1', - type: 'textfield' - }, { - id: 3, - archived: false, - name: 'field3', - title: 'Field 3', - type: 'textfield' - }, { - id: 2, - archived: false, - name: 'field2', - title: 'Field 2', - type: 'textfield' - }] + imports: [ + BrowserAnimationsModule, + MatDialogModule, + AdminEventFormPreviewComponent + ], + + providers: [ + { + provide: MAT_DIALOG_DATA, + useValue: { + name: 'Mock Form', + fields: [ + { + id: 1, + archived: true, + name: 'field1', + title: 'Field 1', + type: 'textfield' + }, + { + id: 3, + archived: false, + name: 'field3', + title: 'Field 3', + type: 'textfield' + }, + { + id: 2, + archived: false, + name: 'field2', + title: 'Field 2', + type: 'textfield' + } + ] + } } - }] - }) - .compileComponents() + ] + }).compileComponents(); })); beforeEach(() => { fixture = TestBed.createComponent(AdminEventFormPreviewDialogComponent); component = fixture.componentInstance; - fixture.detectChanges() + fixture.detectChanges(); }); it('should create', () => { @@ -53,33 +65,37 @@ describe('AdminEventFormPreviewComponent', () => { }); it('should have id', () => { - const id = component.formGroup.get('id') - expect(id).toBeDefined() - expect(id.value).toEqual(0) + const id = component.formGroup.get('id'); + expect(id).toBeDefined(); + expect(id.value).toEqual(0); }); it('should have formId', () => { - const formId = component.formGroup.get('formId') - expect(formId).toBeDefined() - expect(formId.value).toEqual(0) + const formId = component.formGroup.get('formId'); + expect(formId).toBeDefined(); + expect(formId.value).toEqual(0); }); it('should filter archived fields', () => { - const nonArchivedFieldNames = component.formDefinition.fields.filter(field => { - return !field.archived - }).map(field => field.name) + const nonArchivedFieldNames = component.formDefinition.fields + .filter((field) => { + return !field.archived; + }) + .map((field) => field.name); - const controlPaths = Object.keys(component.formGroup.controls).filter(path => { - return path !== 'id' && path !== 'formId' - }) + const controlPaths = Object.keys(component.formGroup.controls).filter( + (path) => { + return path !== 'id' && path !== 'formId'; + } + ); - controlPaths.forEach(path => { - expect(nonArchivedFieldNames).toContain(path) - }) + controlPaths.forEach((path) => { + expect(nonArchivedFieldNames).toContain(path); + }); }); it('should sort fields', () => { - const controlPaths = Object.keys(component.formGroup.controls) - expect(controlPaths).toEqual(['id', 'formId', 'field2', 'field3']) + const controlPaths = Object.keys(component.formGroup.controls); + expect(controlPaths).toEqual(['id', 'formId', 'field2', 'field3']); }); }); diff --git a/web-app/admin/src/app/admin/admin-event/admin-event-form/admin-event-form-preview/form-preview-dialog/admin-event-form-preview-dialog.component.ts b/web-app/admin/src/app/admin/admin-event/admin-event-form/admin-event-form-preview/form-preview-dialog/admin-event-form-preview-dialog.component.ts index 36b756220..7b3a3170d 100644 --- a/web-app/admin/src/app/admin/admin-event/admin-event-form/admin-event-form-preview/form-preview-dialog/admin-event-form-preview-dialog.component.ts +++ b/web-app/admin/src/app/admin/admin-event/admin-event-form/admin-event-form-preview/form-preview-dialog/admin-event-form-preview-dialog.component.ts @@ -1,9 +1,18 @@ +import { CommonModule } from '@angular/common'; import { Component, Inject, OnInit } from '@angular/core'; -import { UntypedFormControl, UntypedFormGroup, Validators } from '@angular/forms'; -import { MAT_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { ReactiveFormsModule, UntypedFormControl, UntypedFormGroup, Validators } from '@angular/forms'; +import { MAT_DIALOG_DATA as MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog'; +import { ObservationEditFormComponent } from '../../../../../observation/observation-edit/observation-edit-form.component'; @Component({ selector: 'admin-event-form-preview-dialog', + standalone: true, + imports: [ + CommonModule, + ReactiveFormsModule, + MatDialogModule, + ObservationEditFormComponent + ], templateUrl: './admin-event-form-preview-dialog.component.html', styleUrls: ['./admin-event-form-preview-dialog.component.scss'] }) diff --git a/web-app/admin/src/app/admin/admin-event/admin-event-form/admin-event-form.module.ts b/web-app/admin/src/app/admin/admin-event/admin-event-form/admin-event-form.module.ts index 541a3ec7c..0da7f347a 100644 --- a/web-app/admin/src/app/admin/admin-event/admin-event-form/admin-event-form.module.ts +++ b/web-app/admin/src/app/admin/admin-event/admin-event-form/admin-event-form.module.ts @@ -23,37 +23,35 @@ import { FieldsListComponent } from './fields-list/fields-list.component'; import { AdminBreadcrumbModule } from '../../admin-breadcrumb/admin-breadcrumb.module'; @NgModule({ - declarations: [ - AdminEventFormPreviewComponent, - AdminEventFormPreviewDialogComponent, - FormDetailsComponent, - FieldDialogComponent, - SymbologyDialogComponent, - FieldsListComponent - ], - imports: [ - CommonModule, - CoreModule, - FormsModule, - ReactiveFormsModule, - DragDropModule, - MatDialogModule, - MatButtonModule, - MatSnackBarModule, - MatTabsModule, - MatCardModule, - MatIconModule, - MatTooltipModule, - MatFormFieldModule, - MatInputModule, - ObservationModule, - AdminBreadcrumbModule - ], - exports: [ - AdminEventFormPreviewComponent, - AdminEventFormPreviewDialogComponent, - FormDetailsComponent, - FieldsListComponent - ] + imports: [ + AdminEventFormPreviewComponent, + AdminEventFormPreviewDialogComponent, + FormDetailsComponent, + FieldDialogComponent, + SymbologyDialogComponent, + FieldsListComponent, + CommonModule, + CoreModule, + FormsModule, + ReactiveFormsModule, + DragDropModule, + MatDialogModule, + MatButtonModule, + MatSnackBarModule, + MatTabsModule, + MatCardModule, + MatIconModule, + MatTooltipModule, + MatFormFieldModule, + MatInputModule, + ObservationModule, + AdminBreadcrumbModule + ], + exports: [ + AdminEventFormPreviewComponent, + AdminEventFormPreviewDialogComponent, + FormDetailsComponent, + FieldsListComponent + ] }) -export class AdminEventFormModule { } +export class AdminEventFormModule {} diff --git a/web-app/admin/src/app/admin/admin-event/admin-event-form/fields-list/fields-list.component.spec.ts b/web-app/admin/src/app/admin/admin-event/admin-event-form/fields-list/fields-list.component.spec.ts index 5d4b338ef..2a3208243 100644 --- a/web-app/admin/src/app/admin/admin-event/admin-event-form/fields-list/fields-list.component.spec.ts +++ b/web-app/admin/src/app/admin/admin-event/admin-event-form/fields-list/fields-list.component.spec.ts @@ -14,7 +14,7 @@ describe('FieldsListComponent', () => { mockDialog = jasmine.createSpyObj('MatDialog', ['open']); TestBed.configureTestingModule({ - declarations: [FieldsListComponent], + imports: [FieldsListComponent], providers: [ { provide: MatDialog, useValue: mockDialog } ], diff --git a/web-app/admin/src/app/admin/admin-event/admin-event-form/fields-list/fields-list.component.ts b/web-app/admin/src/app/admin/admin-event/admin-event-form/fields-list/fields-list.component.ts index 8cc9f9e5d..b4193fc48 100644 --- a/web-app/admin/src/app/admin/admin-event/admin-event-form/fields-list/fields-list.component.ts +++ b/web-app/admin/src/app/admin/admin-event/admin-event-form/fields-list/fields-list.component.ts @@ -2,167 +2,185 @@ import { Component, Input, Output, EventEmitter } from '@angular/core'; import { MatDialog as MatDialog } from '@angular/material/dialog'; import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop'; import { Field } from '../../helpers/observation-feed-helper'; -import { FieldDialogComponent, FieldDialogData } from '../form-details/field-dialog/field-dialog.component'; +import { + FieldDialogComponent, + FieldDialogData +} from '../form-details/field-dialog/field-dialog.component'; +import { MatIconModule } from '@angular/material/icon'; +import { DraggableListComponent } from '../../../../core/draggable-list/draggable-list.component'; +import { CommonModule } from '@angular/common'; export interface FieldType { - name: string; - title: string; + name: string; + title: string; } export interface AttachmentType { - name: string; - title: string; + name: string; + title: string; } @Component({ - selector: 'mage-fields-list', - templateUrl: './fields-list.component.html', - styleUrls: ['./fields-list.component.scss'] + selector: 'mage-fields-list', + standalone: true, + imports: [DraggableListComponent, MatIconModule, CommonModule], + templateUrl: './fields-list.component.html', + styleUrls: ['./fields-list.component.scss'] }) export class FieldsListComponent { - @Input() fields: Field[] = []; - @Input() fieldTypes: FieldType[] = []; - @Input() attachmentAllowedTypes: AttachmentType[] = []; - @Input() userFields: string[] = []; - @Input() showDetailedView: boolean = false; - @Output() fieldsChange = new EventEmitter(); - - constructor(private dialog: MatDialog) { } - - addField(): void { - const dialogRef = this.dialog.open(FieldDialogComponent, { - width: '600px', - data: { - fieldTypes: this.fieldTypes, - attachmentAllowedTypes: this.attachmentAllowedTypes, - editMode: false, - existingFields: this.fields - } as FieldDialogData - }); - - dialogRef.afterClosed().subscribe((result: Field | undefined) => { - if (result) { - result.id = this.getNextFieldId(); - result.name = 'field' + result.id; - this.fields.push(result); - this.fieldsChange.emit(this.fields); - } - }); - } - - editField(field: Field): void { - const dialogRef = this.dialog.open(FieldDialogComponent, { - width: '600px', - data: { - fieldTypes: this.fieldTypes, - attachmentAllowedTypes: this.attachmentAllowedTypes, - editMode: true, - existingField: field, - isMemberField: this.isMemberField(field), - existingFields: this.fields - } as FieldDialogData - }); - - dialogRef.afterClosed().subscribe((result: Field | undefined) => { - if (result) { - Object.assign(field, result); - this.fieldsChange.emit(this.fields); - } - }); - } - - removeField(field: Field): void { - const index = this.fields.findIndex(f => f.id === field.id); - if (index !== -1) { - this.fields.splice(index, 1); - } + @Input() fields: Field[] = []; + @Input() fieldTypes: FieldType[] = []; + @Input() attachmentAllowedTypes: AttachmentType[] = []; + @Input() userFields: string[] = []; + @Input() showDetailedView: boolean = false; + @Output() fieldsChange = new EventEmitter(); + + constructor(private dialog: MatDialog) {} + + addField(): void { + const dialogRef = this.dialog.open(FieldDialogComponent, { + width: '600px', + data: { + fieldTypes: this.fieldTypes, + attachmentAllowedTypes: this.attachmentAllowedTypes, + editMode: false, + existingFields: this.fields + } as FieldDialogData + }); + + dialogRef.afterClosed().subscribe((result: Field | undefined) => { + if (result) { + result.id = this.getNextFieldId(); + result.name = 'field' + result.id; + this.fields.push(result); this.fieldsChange.emit(this.fields); - } - - moveFieldUp(field: Field): void { - const activeFields = this.getActiveFields(); - const index = activeFields.findIndex(f => f.id === field.id); - if (index > 0) { - const temp = activeFields[index].id; - activeFields[index].id = activeFields[index - 1].id; - activeFields[index - 1].id = temp; - this.fieldsChange.emit(this.fields); - } - } - - moveFieldDown(field: Field): void { - const activeFields = this.getActiveFields(); - const index = activeFields.findIndex(f => f.id === field.id); - if (index >= 0 && index < activeFields.length - 1) { - const temp = activeFields[index].id; - activeFields[index].id = activeFields[index + 1].id; - activeFields[index + 1].id = temp; - this.fieldsChange.emit(this.fields); - } - } - - onFieldDrop(event: CdkDragDrop): void { - const activeFields = this.getActiveFields(); - moveItemInArray(activeFields, event.previousIndex, event.currentIndex); - - activeFields.forEach((field, index) => { - field.id = index; - }); - + } + }); + } + + editField(field: Field): void { + const dialogRef = this.dialog.open(FieldDialogComponent, { + width: '600px', + data: { + fieldTypes: this.fieldTypes, + attachmentAllowedTypes: this.attachmentAllowedTypes, + editMode: true, + existingField: field, + isMemberField: this.isMemberField(field), + existingFields: this.fields + } as FieldDialogData + }); + + dialogRef.afterClosed().subscribe((result: Field | undefined) => { + if (result) { + Object.assign(field, result); this.fieldsChange.emit(this.fields); + } + }); + } + + removeField(field: Field): void { + const index = this.fields.findIndex((f) => f.id === field.id); + if (index !== -1) { + this.fields.splice(index, 1); } - - onItemsReordered(reorderedFields: Field[]): void { - const archivedFields = this.fields.filter(f => f.archived); - this.fields = [...reorderedFields, ...archivedFields]; - this.fieldsChange.emit(this.fields); + this.fieldsChange.emit(this.fields); + } + + moveFieldUp(field: Field): void { + const activeFields = this.getActiveFields(); + const index = activeFields.findIndex((f) => f.id === field.id); + if (index > 0) { + const temp = activeFields[index].id; + activeFields[index].id = activeFields[index - 1].id; + activeFields[index - 1].id = temp; + this.fieldsChange.emit(this.fields); } - - getFieldTypeLabel(type: string, field?: Field): string { - if (field && this.isMemberField(field)) { - const userType = this.fieldTypes.find(ft => ft.name === 'userDropdown'); - return userType?.title || 'User Select'; - } - - const lookupType = type === 'multiselectdropdown' ? 'dropdown' : type; - const fieldType = this.fieldTypes.find(ft => ft.name === lookupType); - if (fieldType) { - return fieldType.title; - } - return type === 'multiselectdropdown' ? 'Select' : type; + } + + moveFieldDown(field: Field): void { + const activeFields = this.getActiveFields(); + const index = activeFields.findIndex((f) => f.id === field.id); + if (index >= 0 && index < activeFields.length - 1) { + const temp = activeFields[index].id; + activeFields[index].id = activeFields[index + 1].id; + activeFields[index + 1].id = temp; + this.fieldsChange.emit(this.fields); } + } - getActiveFields(): Field[] { - return this.fields.filter(f => !f.archived); - } + onFieldDrop(event: CdkDragDrop): void { + const activeFields = this.getActiveFields(); + moveItemInArray(activeFields, event.previousIndex, event.currentIndex); - showAddOptions(field: Field): boolean { - return field.type === 'radio' || field.type === 'dropdown' || field.type === 'multiselectdropdown'; - } + activeFields.forEach((field, index) => { + field.id = index; + }); - getAttachmentTypesDisplay(field: Field): string { - if (!field.allowedAttachmentTypes || field.allowedAttachmentTypes.length === 0) { - return 'All types'; - } - return field.allowedAttachmentTypes - .map(type => { - const attachmentType = this.attachmentAllowedTypes.find(at => at.name === type); - return attachmentType?.title || type; - }) - .join(', '); - } + this.fieldsChange.emit(this.fields); + } - isMemberField(field: Field): boolean { - const isExplicitUserType = field.type === 'userDropdown' || field.type === 'multiSelectUserDropdown'; - return isExplicitUserType || this.userFields.includes(field.name || ''); - } + onItemsReordered(reorderedFields: Field[]): void { + const archivedFields = this.fields.filter((f) => f.archived); + this.fields = [...reorderedFields, ...archivedFields]; + this.fieldsChange.emit(this.fields); + } - private getNextFieldId(): number { - if (this.fields.length === 0) return 0; - return Math.max(...this.fields.map(f => f.id || 0)) + 1; + getFieldTypeLabel(type: string, field?: Field): string { + if (field && this.isMemberField(field)) { + const userType = this.fieldTypes.find((ft) => ft.name === 'userDropdown'); + return userType?.title || 'User Select'; } - trackByFieldId(index: number, field: Field): any { - return field.id; + const lookupType = type === 'multiselectdropdown' ? 'dropdown' : type; + const fieldType = this.fieldTypes.find((ft) => ft.name === lookupType); + if (fieldType) { + return fieldType.title; + } + return type === 'multiselectdropdown' ? 'Select' : type; + } + + getActiveFields(): Field[] { + return this.fields.filter((f) => !f.archived); + } + + showAddOptions(field: Field): boolean { + return ( + field.type === 'radio' || + field.type === 'dropdown' || + field.type === 'multiselectdropdown' + ); + } + + getAttachmentTypesDisplay(field: Field): string { + if ( + !field.allowedAttachmentTypes || + field.allowedAttachmentTypes.length === 0 + ) { + return 'All types'; } + return field.allowedAttachmentTypes + .map((type) => { + const attachmentType = this.attachmentAllowedTypes.find( + (at) => at.name === type + ); + return attachmentType?.title || type; + }) + .join(', '); + } + + isMemberField(field: Field): boolean { + const isExplicitUserType = + field.type === 'userDropdown' || field.type === 'multiSelectUserDropdown'; + return isExplicitUserType || this.userFields.includes(field.name || ''); + } + + private getNextFieldId(): number { + if (this.fields.length === 0) return 0; + return Math.max(...this.fields.map((f) => f.id || 0)) + 1; + } + + trackByFieldId(index: number, field: Field): any { + return field.id; + } } diff --git a/web-app/admin/src/app/admin/admin-event/admin-event-form/form-details/field-dialog/field-dialog.component.ts b/web-app/admin/src/app/admin/admin-event/admin-event-form/form-details/field-dialog/field-dialog.component.ts index 8ba4805f4..6946dada0 100644 --- a/web-app/admin/src/app/admin/admin-event/admin-event-form/form-details/field-dialog/field-dialog.component.ts +++ b/web-app/admin/src/app/admin/admin-event/admin-event-form/form-details/field-dialog/field-dialog.component.ts @@ -1,6 +1,8 @@ -import { Component, Inject } from '@angular/core'; -import { MatDialogRef as MatDialogRef, MAT_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/dialog'; + import { Component, Inject } from '@angular/core'; +import { MatDialogRef as MatDialogRef, MAT_DIALOG_DATA as MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog'; import { Field } from '../../../helpers/observation-feed-helper'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; export interface FieldDialogData { fieldTypes: { name: string; title: string }[]; @@ -25,6 +27,12 @@ export interface FieldResult { @Component({ selector: 'mage-field-dialog', + standalone: true, + imports: [ + CommonModule, + FormsModule, + MatDialogModule + ], templateUrl: './field-dialog.component.html', styleUrls: ['./field-dialog.component.scss'] }) diff --git a/web-app/admin/src/app/admin/admin-event/admin-event-form/form-details/form-details.component.spec.ts b/web-app/admin/src/app/admin/admin-event/admin-event-form/form-details/form-details.component.spec.ts index f9d149f6e..6bf3d8670 100644 --- a/web-app/admin/src/app/admin/admin-event/admin-event-form/form-details/form-details.component.spec.ts +++ b/web-app/admin/src/app/admin/admin-event/admin-event-form/form-details/form-details.component.spec.ts @@ -76,7 +76,7 @@ describe('FormDetailsComponent', () => { }; await TestBed.configureTestingModule({ - declarations: [FormDetailsComponent], + imports: [FormDetailsComponent], providers: [ { provide: AdminEventsService, useValue: mockEventsService }, { provide: MatDialog, useValue: mockDialog }, diff --git a/web-app/admin/src/app/admin/admin-event/admin-event-form/form-details/form-details.component.ts b/web-app/admin/src/app/admin/admin-event/admin-event-form/form-details/form-details.component.ts index 8db5d9b80..d5423d3d1 100644 --- a/web-app/admin/src/app/admin/admin-event/admin-event-form/form-details/form-details.component.ts +++ b/web-app/admin/src/app/admin/admin-event/admin-event-form/form-details/form-details.component.ts @@ -30,6 +30,12 @@ import { prepareFormPayload, isUserFieldType } from '../../helpers/form-field-utils'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { MatCardModule } from '@angular/material/card'; +import { AdminBreadcrumbComponent } from '../../../admin-breadcrumb/admin-breadcrumb.component'; +import { FieldsListComponent } from '../fields-list/fields-list.component'; +import { MatIconModule } from '@angular/material/icon'; interface FormData { id?: number; @@ -60,6 +66,15 @@ interface ErrorDialogData { @Component({ selector: 'mage-form-details', + standalone: true, + imports: [ + CommonModule, + FormsModule, + MatCardModule, + AdminBreadcrumbComponent, + FieldsListComponent, + MatIconModule + ], templateUrl: './form-details.component.html', styleUrls: ['./form-details.component.scss'] }) diff --git a/web-app/admin/src/app/admin/admin-event/admin-event-form/form-details/symbology-dialog/symbology-dialog.component.ts b/web-app/admin/src/app/admin/admin-event/admin-event-form/form-details/symbology-dialog/symbology-dialog.component.ts index ebd6836b1..9724d8f6d 100644 --- a/web-app/admin/src/app/admin/admin-event/admin-event-form/form-details/symbology-dialog/symbology-dialog.component.ts +++ b/web-app/admin/src/app/admin/admin-event/admin-event-form/form-details/symbology-dialog/symbology-dialog.component.ts @@ -1,5 +1,9 @@ +import { CommonModule } from '@angular/common'; import { Component, Inject, OnInit } from '@angular/core'; -import { MAT_DIALOG_DATA as MAT_DIALOG_DATA, MatDialogRef as MatDialogRef } from '@angular/material/dialog'; +import { FormsModule } from '@angular/forms'; +import { MAT_DIALOG_DATA as MAT_DIALOG_DATA, MatDialogModule, MatDialogRef as MatDialogRef } from '@angular/material/dialog'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; export interface SymbologyDialogData { primary?: string; @@ -16,6 +20,14 @@ export interface SymbologyDialogData { @Component({ selector: 'symbology-dialog', + standalone: true, + imports: [ + CommonModule, + FormsModule, + MatDialogModule, + MatFormFieldModule, + MatInputModule + ], templateUrl: './symbology-dialog.component.html', styleUrls: ['./symbology-dialog.component.scss'] }) diff --git a/web-app/admin/src/app/admin/admin-event/admin-events.module.ts b/web-app/admin/src/app/admin/admin-event/admin-events.module.ts index cf78ca42b..c142a73ca 100644 --- a/web-app/admin/src/app/admin/admin-event/admin-events.module.ts +++ b/web-app/admin/src/app/admin/admin-event/admin-events.module.ts @@ -33,51 +33,44 @@ import { EventService } from 'src/app/event/event.service'; import { CreateEventDialogComponent } from './create-event/create-event.component'; @NgModule({ - declarations: [ - EventDashboardComponent, - CreateEventDialogComponent, - EventDetailsComponent, - DeleteEventComponent, - CreateFormDialogComponent - ], - imports: [ - CommonModule, - FormsModule, - CoreModule, - ReactiveFormsModule, - RouterModule, - CoreModule, - AdminBreadcrumbModule, - AdminEventFormModule, - MatButtonModule, - MatCardModule, - MatChipsModule, - MatTableModule, - MatPaginatorModule, - MatSortModule, - MatDialogModule, - MatFormFieldModule, - MatDividerModule, - MatIconModule, - MatInputModule, - MatButtonModule, - MatCheckboxModule, - MatIconModule, - MatProgressSpinnerModule, - AdminBreadcrumbModule, - MatSelectModule, - MatOptionModule, - MatTooltipModule, - MatTableModule, - MatPaginatorModule, - DragDropModule - ], - exports: [ - EventDashboardComponent, - EventDetailsComponent - ], - providers: [ - EventService - ] + imports: [ + EventDashboardComponent, + CreateEventDialogComponent, + EventDetailsComponent, + DeleteEventComponent, + CreateFormDialogComponent, + CommonModule, + FormsModule, + CoreModule, + ReactiveFormsModule, + RouterModule, + CoreModule, + AdminBreadcrumbModule, + AdminEventFormModule, + MatButtonModule, + MatCardModule, + MatChipsModule, + MatTableModule, + MatPaginatorModule, + MatSortModule, + MatDialogModule, + MatFormFieldModule, + MatDividerModule, + MatIconModule, + MatInputModule, + MatButtonModule, + MatCheckboxModule, + MatIconModule, + MatProgressSpinnerModule, + AdminBreadcrumbModule, + MatSelectModule, + MatOptionModule, + MatTooltipModule, + MatTableModule, + MatPaginatorModule, + DragDropModule + ], + exports: [EventDashboardComponent, EventDetailsComponent], + providers: [EventService] }) -export class AdminEventsModule { } \ No newline at end of file +export class AdminEventsModule {} diff --git a/web-app/admin/src/app/admin/admin-event/create-event/create-event.component.ts b/web-app/admin/src/app/admin/admin-event/create-event/create-event.component.ts index f8aa40b58..60c545afa 100644 --- a/web-app/admin/src/app/admin/admin-event/create-event/create-event.component.ts +++ b/web-app/admin/src/app/admin/admin-event/create-event/create-event.component.ts @@ -1,8 +1,22 @@ import { Component, Inject } from '@angular/core'; -import { MatDialogRef as MatDialogRef, MAT_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/dialog'; -import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { + MatDialogRef as MatDialogRef, + MAT_DIALOG_DATA as MAT_DIALOG_DATA, + MatDialogModule +} from '@angular/material/dialog'; +import { + FormBuilder, + FormGroup, + FormsModule, + ReactiveFormsModule, + Validators +} from '@angular/forms'; import { AdminEventsService } from '../../services/admin-events.service'; import { Event } from '../../../../../../src/app/filter/filter.types'; +import { CommonModule } from '@angular/common'; +import { MatButtonModule } from '@angular/material/button'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; /** * Dialog component for creating new events. @@ -10,6 +24,16 @@ import { Event } from '../../../../../../src/app/filter/filter.types'; */ @Component({ selector: 'mage-admin-event-create', + standalone: true, + imports: [ + CommonModule, + FormsModule, + ReactiveFormsModule, + MatButtonModule, + MatDialogModule, + MatFormFieldModule, + MatInputModule + ], templateUrl: './create-event.component.html', styleUrls: ['./create-event.component.scss'] }) diff --git a/web-app/admin/src/app/admin/admin-event/create-form/create-form.component.ts b/web-app/admin/src/app/admin/admin-event/create-form/create-form.component.ts index 14b261372..31631a8b1 100644 --- a/web-app/admin/src/app/admin/admin-event/create-form/create-form.component.ts +++ b/web-app/admin/src/app/admin/admin-event/create-form/create-form.component.ts @@ -1,182 +1,206 @@ import { Component, Inject } from '@angular/core'; -import { MatDialogRef as MatDialogRef, MAT_DIALOG_DATA as MAT_DIALOG_DATA, MatDialog as MatDialog } from '@angular/material/dialog'; -import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { + MatDialogRef as MatDialogRef, + MAT_DIALOG_DATA as MAT_DIALOG_DATA, + MatDialog as MatDialog +} from '@angular/material/dialog'; +import { FormBuilder, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms'; import { AdminEventsService } from '../../services/admin-events.service'; import { Event } from '../../../../../../src/app/filter/filter.types'; import { Field } from '../helpers/observation-feed-helper'; -import { deriveUserFieldNames, prepareFormPayload } from '../helpers/form-field-utils'; +import { + deriveUserFieldNames, + prepareFormPayload +} from '../helpers/form-field-utils'; +import { CommonModule } from '@angular/common'; +import { FieldsListComponent } from '../admin-event-form/fields-list/fields-list.component'; /** * Dialog component for creating new forms for an event. * Provides a form interface with validation for form name, description, color, and optional form archive upload. */ @Component({ - selector: 'mage-create-form', - templateUrl: './create-form.component.html', - styleUrls: ['./create-form.component.scss'] + selector: 'mage-create-form', + standalone: true, + imports: [CommonModule, ReactiveFormsModule, FieldsListComponent], + templateUrl: './create-form.component.html', + styleUrls: ['./create-form.component.scss'] }) export class CreateFormDialogComponent { - formGroup: FormGroup; - errorMessage: string = ''; - selectedFile: File | null = null; - currentStep: number = 1; - createdFields: Field[] = []; - createdUserFields: string[] = []; - saving: boolean = false; - - fieldTypes = [ - { name: 'textfield', title: 'Text' }, - { name: 'textarea', title: 'Text Area' }, - { name: 'numberfield', title: 'Number' }, - { name: 'email', title: 'Email' }, - { name: 'date', title: 'Date' }, - { name: 'checkbox', title: 'Checkbox' }, - { name: 'radio', title: 'Radio Buttons' }, - { name: 'dropdown', title: 'Select' }, - { name: 'geometry', title: 'Location' }, - { name: 'attachment', title: 'Attachment' }, - { name: 'userDropdown', title: 'User Select' } - ]; - - attachmentAllowedTypes = [ - { name: 'image', title: 'Image' }, - { name: 'video', title: 'Video' }, - { name: 'audio', title: 'Audio' } - ]; - - constructor( - public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: { event: Event }, - private fb: FormBuilder, - private eventsService: AdminEventsService - ) { - const randomColor = '#' + ('000000' + Math.floor(Math.random() * 0xFFFFFF).toString(16)).slice(-6); - - this.formGroup = this.fb.group({ - name: ['', [Validators.required]], - description: [''], - color: [randomColor, [Validators.required, Validators.pattern(/^#[0-9A-F]{6}$/i)]] - }); + formGroup: FormGroup; + errorMessage: string = ''; + selectedFile: File | null = null; + currentStep: number = 1; + createdFields: Field[] = []; + createdUserFields: string[] = []; + saving: boolean = false; + + fieldTypes = [ + { name: 'textfield', title: 'Text' }, + { name: 'textarea', title: 'Text Area' }, + { name: 'numberfield', title: 'Number' }, + { name: 'email', title: 'Email' }, + { name: 'date', title: 'Date' }, + { name: 'checkbox', title: 'Checkbox' }, + { name: 'radio', title: 'Radio Buttons' }, + { name: 'dropdown', title: 'Select' }, + { name: 'geometry', title: 'Location' }, + { name: 'attachment', title: 'Attachment' }, + { name: 'userDropdown', title: 'User Select' } + ]; + + attachmentAllowedTypes = [ + { name: 'image', title: 'Image' }, + { name: 'video', title: 'Video' }, + { name: 'audio', title: 'Audio' } + ]; + + constructor( + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data: { event: Event }, + private fb: FormBuilder, + private eventsService: AdminEventsService + ) { + const randomColor = + '#' + + ('000000' + Math.floor(Math.random() * 0xffffff).toString(16)).slice(-6); + + this.formGroup = this.fb.group({ + name: ['', [Validators.required]], + description: [''], + color: [ + randomColor, + [Validators.required, Validators.pattern(/^#[0-9A-F]{6}$/i)] + ] + }); + } + + /** + * Handles file selection from the file input + */ + onFileSelected(event: any): void { + const target = event.target as HTMLInputElement; + if (target.files && target.files.length > 0) { + this.selectedFile = target.files[0]; } - - /** - * Handles file selection from the file input - */ - onFileSelected(event: any): void { - const target = event.target as HTMLInputElement; - if (target.files && target.files.length > 0) { - this.selectedFile = target.files[0]; - } - } - - /** - * Proceeds to the next step or saves the form - */ - next(): void { - if (this.currentStep === 1) { - if (this.formGroup.invalid) { - this.errorMessage = 'Please fill in all required fields correctly.'; - Object.keys(this.formGroup.controls).forEach(key => { - this.formGroup.get(key)?.markAsTouched(); - }); - return; - } - this.errorMessage = ''; - if (this.selectedFile) { - this.createFormWithFile(); - } else { - this.currentStep = 2; - } - } - } - - /** - * Creates a form with an uploaded file - */ - private createFormWithFile(): void { - this.saving = true; - const formData = new FormData(); - formData.append('form', this.selectedFile!); - formData.append('name', this.formGroup.value.name); - formData.append('description', this.formGroup.value.description || ''); - formData.append('color', this.formGroup.value.color); - - this.eventsService.createForm(String(this.data.event.id), formData).subscribe({ - next: (newForm) => { - this.saving = false; - this.dialogRef.close(newForm); - }, - error: (err) => { - this.saving = false; - this.errorMessage = err.error || 'Failed to create form. Please try again.'; - } + } + + /** + * Proceeds to the next step or saves the form + */ + next(): void { + if (this.currentStep === 1) { + if (this.formGroup.invalid) { + this.errorMessage = 'Please fill in all required fields correctly.'; + Object.keys(this.formGroup.controls).forEach((key) => { + this.formGroup.get(key)?.markAsTouched(); }); + return; + } + this.errorMessage = ''; + if (this.selectedFile) { + this.createFormWithFile(); + } else { + this.currentStep = 2; + } } - - /** - * Goes back to the previous step - */ - back(): void { - if (this.currentStep === 2) { - this.currentStep = 1; + } + + /** + * Creates a form with an uploaded file + */ + private createFormWithFile(): void { + this.saving = true; + const formData = new FormData(); + formData.append('form', this.selectedFile!); + formData.append('name', this.formGroup.value.name); + formData.append('description', this.formGroup.value.description || ''); + formData.append('color', this.formGroup.value.color); + + this.eventsService + .createForm(String(this.data.event.id), formData) + .subscribe({ + next: (newForm) => { + this.saving = false; + this.dialogRef.close(newForm); + }, + error: (err) => { + this.saving = false; + this.errorMessage = + err.error || 'Failed to create form. Please try again.'; } + }); + } + + /** + * Goes back to the previous step + */ + back(): void { + if (this.currentStep === 2) { + this.currentStep = 1; } - - /** - * Handles changes to the fields list from the fields-list component - */ - onFieldsChange(fields: Field[]): void { - this.createdFields = fields; - this.createdUserFields = deriveUserFieldNames(this.createdFields); + } + + /** + * Handles changes to the fields list from the fields-list component + */ + onFieldsChange(fields: Field[]): void { + this.createdFields = fields; + this.createdUserFields = deriveUserFieldNames(this.createdFields); + } + + /** + * Handles form submission for creating a new form. + * Validates the form, creates the form via the events service with fields, and closes the dialog on success. + */ + save(): void { + if (this.createdFields.length === 0) { + this.errorMessage = 'Please add at least one field to the form.'; + return; } - - /** - * Handles form submission for creating a new form. - * Validates the form, creates the form via the events service with fields, and closes the dialog on success. - */ - save(): void { - if (this.createdFields.length === 0) { - this.errorMessage = 'Please add at least one field to the form.'; - return; + this.errorMessage = ''; + this.saving = true; + + const payloadBase = { + name: this.formGroup.value.name, + description: this.formGroup.value.description || '', + color: this.formGroup.value.color, + archived: false, + fields: this.createdFields, + userFields: this.createdUserFields + }; + + const formPayload = prepareFormPayload(payloadBase); + + this.eventsService + .createForm(String(this.data.event.id), formPayload) + .subscribe({ + next: (newForm) => { + this.saving = false; + this.dialogRef.close(newForm); + }, + error: (err) => { + this.saving = false; + this.errorMessage = + err.error?.message || + err.error || + 'Failed to create form. Please try again.'; } - this.errorMessage = ''; - this.saving = true; - - const payloadBase = { - name: this.formGroup.value.name, - description: this.formGroup.value.description || '', - color: this.formGroup.value.color, - archived: false, - fields: this.createdFields, - userFields: this.createdUserFields - }; - - const formPayload = prepareFormPayload(payloadBase); - - this.eventsService.createForm(String(this.data.event.id), formPayload).subscribe({ - next: (newForm) => { - this.saving = false; - this.dialogRef.close(newForm); - }, - error: (err) => { - this.saving = false; - this.errorMessage = err.error?.message || err.error || 'Failed to create form. Please try again.'; - } - }); - } - - /** - * Closes the dialog without saving any data or making any changes. - */ - cancel(): void { - this.dialogRef.close(); - } - - /** - * Checks if a form field has an error and has been touched - */ - hasError(fieldName: string, errorType: string): boolean { - const field = this.formGroup.get(fieldName); - return !!(field && field.hasError(errorType) && field.touched); - } + }); + } + + /** + * Closes the dialog without saving any data or making any changes. + */ + cancel(): void { + this.dialogRef.close(); + } + + /** + * Checks if a form field has an error and has been touched + */ + hasError(fieldName: string, errorType: string): boolean { + const field = this.formGroup.get(fieldName); + return !!(field && field.hasError(errorType) && field.touched); + } } diff --git a/web-app/admin/src/app/admin/admin-event/dashboard/event-dashboard.component.spec.ts b/web-app/admin/src/app/admin/admin-event/dashboard/event-dashboard.component.spec.ts index 0bd31a063..47c7383c6 100644 --- a/web-app/admin/src/app/admin/admin-event/dashboard/event-dashboard.component.spec.ts +++ b/web-app/admin/src/app/admin/admin-event/dashboard/event-dashboard.component.spec.ts @@ -78,8 +78,9 @@ describe('EventDashboardComponent', () => { toastSpy = jasmine.createSpyObj('AdminToastService', ['show']); await TestBed.configureTestingModule({ - declarations: [EventDashboardComponent], + imports: [ + EventDashboardComponent, MatDialogModule, MatPaginatorModule, MatFormFieldModule, diff --git a/web-app/admin/src/app/admin/admin-event/dashboard/event-dashboard.component.ts b/web-app/admin/src/app/admin/admin-event/dashboard/event-dashboard.component.ts index 3deda593b..a8ccad9ad 100644 --- a/web-app/admin/src/app/admin/admin-event/dashboard/event-dashboard.component.ts +++ b/web-app/admin/src/app/admin/admin-event/dashboard/event-dashboard.component.ts @@ -1,7 +1,7 @@ import { Component, OnInit, HostListener } from '@angular/core'; import { MatDialog as MatDialog } from '@angular/material/dialog'; -import { PageEvent as PageEvent } from '@angular/material/paginator'; -import { Router } from '@angular/router'; +import { MatPaginatorModule, PageEvent as PageEvent } from '@angular/material/paginator'; +import { Router, RouterModule } from '@angular/router'; import { AdminUserService } from '../../services/admin-user.service'; import { @@ -14,9 +14,30 @@ import { AdminBreadcrumb } from '../../admin-breadcrumb/admin-breadcrumb.model'; import { Event } from '../../../../../../src/app/filter/filter.types'; import { CreateEventDialogComponent } from '../create-event/create-event.component'; import { AdminToastService } from '../../services/admin-toast.service'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatSelectModule } from '@angular/material/select'; +import { MatTableModule } from '@angular/material/table'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { CardNavbarComponent } from 'admin/src/app/core/card-navbar/card-navbar.component'; +import { AdminBreadcrumbComponent } from '../../admin-breadcrumb/admin-breadcrumb.component'; @Component({ selector: 'admin-events', + standalone: true, + imports: [ + CommonModule, + FormsModule, + RouterModule, + MatFormFieldModule, + MatSelectModule, + MatTableModule, + MatTooltipModule, + MatPaginatorModule, + AdminBreadcrumbComponent, + CardNavbarComponent + ], templateUrl: './event-dashboard.component.html', styleUrls: ['./event-dashboard.component.scss'] }) diff --git a/web-app/admin/src/app/admin/admin-event/delete-event/delete-event.component.ts b/web-app/admin/src/app/admin/admin-event/delete-event/delete-event.component.ts index 0bd766dc6..20d0e49fb 100644 --- a/web-app/admin/src/app/admin/admin-event/delete-event/delete-event.component.ts +++ b/web-app/admin/src/app/admin/admin-event/delete-event/delete-event.component.ts @@ -1,57 +1,64 @@ import { Component, Inject } from '@angular/core'; -import { MatDialogRef as MatDialogRef, MAT_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { + MatDialogRef as MatDialogRef, + MAT_DIALOG_DATA as MAT_DIALOG_DATA +} from '@angular/material/dialog'; import { AdminEventsService } from '../../services/admin-events.service'; import { Event as MageEvent } from '../../../../../../src/app/filter/filter.types'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; /** * Modal component for confirming event deletion. * Provides a confirmation dialog before permanently deleting an event. */ @Component({ - selector: 'mage-delete-event', - templateUrl: './delete-event.component.html', - styleUrls: ['./delete-event.component.scss'] + selector: 'mage-delete-event', + standalone: true, + imports: [CommonModule, FormsModule], + templateUrl: './delete-event.component.html', + styleUrls: ['./delete-event.component.scss'] }) export class DeleteEventComponent { - event: MageEvent; - deleting = false; - confirm: { text?: string } = {}; + event: MageEvent; + deleting = false; + confirm: { text?: string } = {}; - /** - * Constructor - initializes the component with injected services and event data. - * @param dialogRef - Reference to the dialog for closing and returning results - * @param data - Injected data containing the event to delete - * @param eventsService - Service for event operations - */ - constructor( - public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: { event: MageEvent }, - private eventsService: AdminEventsService - ) { - this.event = data.event; - } + /** + * Constructor - initializes the component with injected services and event data. + * @param dialogRef - Reference to the dialog for closing and returning results + * @param data - Injected data containing the event to delete + * @param eventsService - Service for event operations + */ + constructor( + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data: { event: MageEvent }, + private eventsService: AdminEventsService + ) { + this.event = data.event; + } - /** - * Deletes the event after confirmation. - */ - deleteEvent(): void { - this.deleting = true; + /** + * Deletes the event after confirmation. + */ + deleteEvent(): void { + this.deleting = true; - this.eventsService.deleteEvent(this.event.id.toString()).subscribe({ - next: () => { - this.dialogRef.close(this.event); - }, - error: (error) => { - console.error('Error deleting event:', error); - this.deleting = false; - } - }); - } + this.eventsService.deleteEvent(this.event.id.toString()).subscribe({ + next: () => { + this.dialogRef.close(this.event); + }, + error: (error) => { + console.error('Error deleting event:', error); + this.deleting = false; + } + }); + } - /** - * Cancels the deletion and closes the dialog without any action. - */ - cancel(): void { - this.dialogRef.close(); - } + /** + * Cancels the deletion and closes the dialog without any action. + */ + cancel(): void { + this.dialogRef.close(); + } } diff --git a/web-app/admin/src/app/admin/admin-event/event-details/event-details.component.spec.ts b/web-app/admin/src/app/admin/admin-event/event-details/event-details.component.spec.ts index ab38b27d0..3b8350286 100644 --- a/web-app/admin/src/app/admin/admin-event/event-details/event-details.component.spec.ts +++ b/web-app/admin/src/app/admin/admin-event/event-details/event-details.component.spec.ts @@ -88,8 +88,8 @@ describe('EventDetailsComponent', () => { }; await TestBed.configureTestingModule({ - declarations: [EventDetailsComponent], - imports: [NoopAnimationsModule], + + imports: [EventDetailsComponent, NoopAnimationsModule], providers: [ { provide: AdminEventsService, useValue: eventsServiceSpy }, { provide: AdminTeamsService, useValue: teamsServiceSpy }, diff --git a/web-app/admin/src/app/admin/admin-event/event-details/event-details.component.ts b/web-app/admin/src/app/admin/admin-event/event-details/event-details.component.ts index d752c20ea..76b622217 100644 --- a/web-app/admin/src/app/admin/admin-event/event-details/event-details.component.ts +++ b/web-app/admin/src/app/admin/admin-event/event-details/event-details.component.ts @@ -1,15 +1,15 @@ import { Component, OnInit, OnDestroy, ViewChild } from '@angular/core'; import { MatDialog as MatDialog } from '@angular/material/dialog'; -import { PageEvent as PageEvent } from '@angular/material/paginator'; -import { MatSelectChange as MatSelectChange } from '@angular/material/select'; -import { MatTableDataSource as MatTableDataSource } from '@angular/material/table'; +import { MatPaginatorModule, PageEvent as PageEvent } from '@angular/material/paginator'; +import { MatSelectChange as MatSelectChange, MatSelectModule } from '@angular/material/select'; +import { MatTableDataSource as MatTableDataSource, MatTableModule } from '@angular/material/table'; import { Subject, forkJoin, takeUntil, Observable } from 'rxjs'; -import { NgForm } from '@angular/forms'; -import { ActivatedRoute, Router } from '@angular/router'; +import { FormsModule, NgForm } from '@angular/forms'; +import { ActivatedRoute, Router, RouterModule } from '@angular/router'; import { Event as MageEvent, Layer } from '../../../../../../src/app/filter/filter.types'; import { AdminBreadcrumb } from '../../admin-breadcrumb/admin-breadcrumb.model'; -import { CardActionButton } from '../../../core/card-navbar/card-navbar.component'; +import { CardActionButton, CardNavbarComponent } from '../../../core/card-navbar/card-navbar.component'; import { AdminEventsService } from '../../services/admin-events.service'; import { User as MageUser } from '@ngageoint/mage.web-core-lib/user'; import { Team } from '../../admin-teams/team'; @@ -22,6 +22,13 @@ import { } from '../../../core/search-modal/search-modal.component'; import { DeleteEventComponent } from '../delete-event/delete-event.component'; import { CreateFormDialogComponent } from '../create-form/create-form.component'; +import { CommonModule } from '@angular/common'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { AdminBreadcrumbComponent } from '../../admin-breadcrumb/admin-breadcrumb.component'; +import { MatCardModule } from '@angular/material/card'; +import { MatIconModule } from '@angular/material/icon'; +import { DraggableListComponent } from 'admin/src/app/core/draggable-list/draggable-list.component'; +import { AdminEventFormPreviewComponent } from '../admin-event-form/admin-event-form-preview/admin-event-form-preview.component'; interface ExtendedEvent extends MageEvent { complete?: boolean; @@ -40,6 +47,22 @@ interface PagedResult { @Component({ selector: 'mage-event-details', + standalone: true, + imports: [ + CommonModule, + FormsModule, + RouterModule, + MatFormFieldModule, + MatSelectModule, + MatTableModule, + MatPaginatorModule, + MatCardModule, + MatIconModule, + AdminBreadcrumbComponent, + CardNavbarComponent, + DraggableListComponent, + AdminEventFormPreviewComponent + ], templateUrl: './event-details.component.html', styleUrls: ['./event-details.component.scss'] }) diff --git a/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed-delete/admin-feed-delete.component.spec.ts b/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed-delete/admin-feed-delete.component.spec.ts index 5fd416512..e6736c6a3 100644 --- a/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed-delete/admin-feed-delete.component.spec.ts +++ b/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed-delete/admin-feed-delete.component.spec.ts @@ -1,8 +1,9 @@ -import { HttpClientTestingModule } from '@angular/common/http/testing' +import { provideHttpClientTesting } from '@angular/common/http/testing' import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' import { MatDialogModule as MatDialogModule, MatDialogRef as MatDialogRef, MAT_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/dialog' import { Feed } from '@ngageoint/mage.web-core-lib/feed' import { AdminFeedDeleteComponent } from './admin-feed-delete.component' +import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; describe('AdminFeedDeleteComponent', () => { let component: AdminFeedDeleteComponent @@ -15,13 +16,14 @@ describe('AdminFeedDeleteComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - imports: [MatDialogModule, HttpClientTestingModule], - providers: [ + imports: [AdminFeedDeleteComponent, MatDialogModule], + providers: [ { provide: MatDialogRef, useValue: {} }, - { provide: MAT_DIALOG_DATA, useValue: feedData } - ], - declarations: [AdminFeedDeleteComponent] - }) + { provide: MAT_DIALOG_DATA, useValue: feedData }, + provideHttpClient(withInterceptorsFromDi()), + provideHttpClientTesting() + ] +}) .compileComponents() })) diff --git a/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed-delete/admin-feed-delete.component.ts b/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed-delete/admin-feed-delete.component.ts index 84f06f049..2f7fbbf9c 100644 --- a/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed-delete/admin-feed-delete.component.ts +++ b/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed-delete/admin-feed-delete.component.ts @@ -1,9 +1,18 @@ +import { CommonModule } from '@angular/common' import { Component, Inject } from '@angular/core' -import { MAT_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/dialog' +import { MatButtonModule } from '@angular/material/button' +import { MAT_DIALOG_DATA as MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog' import { Feed } from '@ngageoint/mage.web-core-lib/feed' @Component({ selector: 'app-admin-feed-delete', + standalone: true, + imports: [ + CommonModule, + MatDialogModule, + MatButtonModule + ], + templateUrl: './admin-feed-delete.component.html', styleUrls: ['./admin-feed-delete.component.scss'] }) diff --git a/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed-edit/admin-feed-edit-configuration.component.spec.ts b/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed-edit/admin-feed-edit-configuration.component.spec.ts index 9d51dd65c..cb3821084 100644 --- a/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed-edit/admin-feed-edit-configuration.component.spec.ts +++ b/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed-edit/admin-feed-edit-configuration.component.spec.ts @@ -1,24 +1,8 @@ -import { HttpClientTestingModule } from '@angular/common/http/testing'; -import { Component } from '@angular/core'; -import { - ComponentFixture, - TestBed, - fakeAsync, - tick, - waitForAsync, - discardPeriodicTasks -} from '@angular/core/testing'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatAutocompleteModule as MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatCheckboxModule as MatCheckboxModule } from '@angular/material/checkbox'; -import { MatExpansionModule } from '@angular/material/expansion'; -import { MatFormFieldModule as MatFormFieldModule } from '@angular/material/form-field'; -import { MatInputModule as MatInputModule } from '@angular/material/input'; -import { By } from '@angular/platform-browser'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { SimpleChange, SimpleChanges } from '@angular/core'; +import { fakeAsync, tick, discardPeriodicTasks } from '@angular/core/testing'; import * as _ from 'lodash'; -import { StaticIconModule } from '@ngageoint/mage.web-core-lib/static-icon'; import { FeedTopic } from '@ngageoint/mage.web-core-lib/feed'; + import { AdminFeedEditConfigurationComponent, formValueForMetaData @@ -29,7 +13,9 @@ import { FeedMetaDataNullable } from './feed-edit.model'; -type FeedMetaDataBooleanKeys = 'itemsHaveIdentity' | 'itemsHaveSpatialDimension'; +type FeedMetaDataBooleanKeys = + | 'itemsHaveIdentity' + | 'itemsHaveSpatialDimension'; const emptyMetaDataFormValue: FeedMetaDataNullable = { title: null, @@ -44,70 +30,18 @@ const emptyMetaDataFormValue: FeedMetaDataNullable = { }; describe('FeedMetaDataComponent', () => { - let debounceTimeMs: number; - - @Component({ - selector: 'test-feed-meta-data-host', - template: ` - - ` - }) - class TestFeedMetaDataHostComponent { - topic: FeedTopic | null = null; - feedMetaData: FeedMetaData | null = null; - acceptButtonText: string = 'Test Accept'; - } - - let host: TestFeedMetaDataHostComponent; let target: AdminFeedEditConfigurationComponent; - let fixture: ComponentFixture; + let debounceTimeMs: number; let formChanges: FeedMetaDataNullable[]; let metaDataChanges: FeedMetaData[]; - function setUserValue( - key: K, - value: FeedMetaDataNullable[K] - ): void { - const control = target.feedMetaDataForm.get(key as string); - control.setValue(value); - control.markAsDirty(); - } - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - FormsModule, - MatAutocompleteModule, - MatCheckboxModule, - MatExpansionModule, - MatFormFieldModule, - MatInputModule, - NoopAnimationsModule, - ReactiveFormsModule, - StaticIconModule, - HttpClientTestingModule - ], - declarations: [ - TestFeedMetaDataHostComponent, - AdminFeedEditConfigurationComponent - ] - }).compileComponents(); - })); + function createTarget(): void { + target = new AdminFeedEditConfigurationComponent(); + target.topic = null; + target.feedMetaData = null; + target.buttonText = 'Test Accept'; - beforeEach(() => { - fixture = TestBed.createComponent(TestFeedMetaDataHostComponent); - host = fixture.componentInstance; - - target = fixture.debugElement.query( - By.directive(AdminFeedEditConfigurationComponent) - ).references['target']; - - fixture.detectChanges(); + target.ngOnInit(); debounceTimeMs = target.changeDebounceInterval; formChanges = []; @@ -120,16 +54,84 @@ describe('FeedMetaDataComponent', () => { target.feedMetaDataChanged.subscribe((metaData) => { metaDataChanges.push(metaData); }); + } + + function simpleChange( + previousValue: T, + currentValue: T, + firstChange = false + ): SimpleChange { + return new SimpleChange(previousValue, currentValue, firstChange); + } + + function applyChanges(changes: SimpleChanges): void { + target.ngOnChanges(changes); + } + + function setTopic(topic: FeedTopic | null): void { + const previousTopic = target.topic; + target.topic = topic; + + applyChanges({ + topic: simpleChange(previousTopic, topic, previousTopic === undefined) + }); + } + + function setFeedMetaData(feedMetaData: FeedMetaData | null): void { + const previousFeedMetaData = target.feedMetaData; + target.feedMetaData = feedMetaData; + + applyChanges({ + feedMetaData: simpleChange( + previousFeedMetaData, + feedMetaData, + previousFeedMetaData === undefined + ) + }); + } + + function setTopicAndFeedMetaData( + topic: FeedTopic | null, + feedMetaData: FeedMetaData | null + ): void { + const previousTopic = target.topic; + const previousFeedMetaData = target.feedMetaData; + + target.topic = topic; + target.feedMetaData = feedMetaData; + + applyChanges({ + topic: simpleChange(previousTopic, topic, previousTopic === undefined), + feedMetaData: simpleChange( + previousFeedMetaData, + feedMetaData, + previousFeedMetaData === undefined + ) + }); + } + + function setUserValue( + key: K, + value: FeedMetaDataNullable[K] + ): void { + const control = target.feedMetaDataForm.get(key as string); + + if (!control) { + throw new Error(`Missing control ${String(key)}`); + } + + control.setValue(value); + control.markAsDirty(); + } + + beforeEach(() => { + createTarget(); }); afterEach(() => { - if (fixture) { - fixture.destroy(); - } try { discardPeriodicTasks(); - } catch { - } + } catch {} }); it('should create', () => { @@ -154,7 +156,9 @@ describe('FeedMetaDataComponent', () => { updateFrequencySeconds: undefined }; - expect(formValueForMetaData(undefinedKeys)).toEqual(emptyMetaDataFormValue); + expect(formValueForMetaData(undefinedKeys)).toEqual( + emptyMetaDataFormValue + ); }); it('maps defined values directly', () => { @@ -193,7 +197,6 @@ describe('FeedMetaDataComponent', () => { it('emits a debounced event when the form value changes from input', fakeAsync(() => { setUserValue('title', 'Test'); - fixture.detectChanges(); tick(debounceTimeMs / 2); expect(formChanges).toEqual([ @@ -204,7 +207,6 @@ describe('FeedMetaDataComponent', () => { ]); expect(metaDataChanges).toEqual([]); - fixture.detectChanges(); tick(debounceTimeMs + 50); expect(formChanges).toEqual([ @@ -228,6 +230,7 @@ describe('FeedMetaDataComponent', () => { title: 'Topic 1', summary: 'Topic 1 summary' }; + const initFeedMetaData: FeedMetaData = { ...feedMetaDataLean(topic), title: 'Feed 1', @@ -236,12 +239,9 @@ describe('FeedMetaDataComponent', () => { icon: { id: 'icon123' } }; - host.topic = topic; - host.feedMetaData = initFeedMetaData; - fixture.detectChanges(); + setTopicAndFeedMetaData(topic, initFeedMetaData); setUserValue('title', 'Feed 1 Mod'); - fixture.detectChanges(); tick(debounceTimeMs + 50); expect(target.feedMetaData).toEqual({ @@ -256,7 +256,6 @@ describe('FeedMetaDataComponent', () => { ]); setUserValue('itemSecondaryProperty', 'addedSecondary'); - fixture.detectChanges(); tick(debounceTimeMs + 50); expect(target.feedMetaData).toEqual({ @@ -277,7 +276,6 @@ describe('FeedMetaDataComponent', () => { ]); setUserValue('itemTemporalProperty', ''); - fixture.detectChanges(); tick(debounceTimeMs + 50); expect(target.feedMetaData).toEqual({ @@ -312,12 +310,12 @@ describe('FeedMetaDataComponent', () => { id: 'topic1', title: 'Topic 1' }; + const feedMetaData: FeedMetaData = { title: 'Feed 1' }; - host.topic = topic; - host.feedMetaData = feedMetaData; - fixture.detectChanges(); + + setTopicAndFeedMetaData(topic, feedMetaData); expect(target.feedMetaDataForm.value).toEqual({ ...emptyMetaDataFormValue, @@ -328,7 +326,6 @@ describe('FeedMetaDataComponent', () => { setUserValue('title', ''); setUserValue('summary', 'Feed summary'); - fixture.detectChanges(); tick(debounceTimeMs + 50); expect(formChanges).toEqual([ @@ -360,13 +357,14 @@ describe('FeedMetaDataComponent', () => { itemsHaveSpatialDimension: true, updateFrequencySeconds: 60 }; + const topic: FeedTopic = { id: 'topic1', ...topicMetaData, icon: { sourceUrl: 'test://icon1.png' } }; - host.topic = topic; - fixture.detectChanges(); + + setTopic(topic); expect(target.feedMetaDataForm.value).toEqual(topicMetaData); expect(formChanges).toEqual([]); @@ -385,6 +383,7 @@ describe('FeedMetaDataComponent', () => { itemsHaveIdentity: false, itemsHaveSpatialDimension: false }); + const feedMetaDataMod: Required = Object.freeze({ title: 'Test Mod', summary: 'Test summary mod', @@ -396,18 +395,20 @@ describe('FeedMetaDataComponent', () => { itemsHaveIdentity: true, itemsHaveSpatialDimension: true }); - host.topic = { id: 'topic1', title: 'Topic 1' }; - host.feedMetaData = feedMetaData; - fixture.detectChanges(); - expect(target.feedMetaDataForm.value).toEqual(formValueForMetaData(feedMetaData)); + setTopicAndFeedMetaData({ id: 'topic1', title: 'Topic 1' }, feedMetaData); + + expect(target.feedMetaDataForm.value).toEqual( + formValueForMetaData(feedMetaData) + ); expect(target.feedMetaData).toEqual(feedMetaData); - host.feedMetaData = feedMetaDataMod; - fixture.detectChanges(); + setFeedMetaData(feedMetaDataMod); tick(debounceTimeMs + 50); - expect(target.feedMetaDataForm.value).toEqual(formValueForMetaData(feedMetaDataMod)); + expect(target.feedMetaDataForm.value).toEqual( + formValueForMetaData(feedMetaDataMod) + ); expect(target.feedMetaData).toEqual(feedMetaDataMod); expect(formChanges).toEqual([]); expect(metaDataChanges).toEqual([]); @@ -424,6 +425,7 @@ describe('FeedMetaDataComponent', () => { itemPrimaryProperty: 'prop1', updateFrequencySeconds: 3000 }); + const feedMetaData: FeedMetaData = Object.freeze({ title: 'Feed Title', summary: 'Feed summary', @@ -433,15 +435,13 @@ describe('FeedMetaDataComponent', () => { updateFrequencySeconds: 0 }); - host.topic = topic; - fixture.detectChanges(); + setTopic(topic); tick(debounceTimeMs + 50); expect(target.topic).toEqual(topic); expect(target.feedMetaDataForm.value).toEqual(formValueForMetaData(topic)); - host.feedMetaData = feedMetaData; - fixture.detectChanges(); + setFeedMetaData(feedMetaData); tick(debounceTimeMs + 50); expect(target.feedMetaDataForm.value).toEqual( @@ -472,6 +472,7 @@ describe('FeedMetaDataComponent', () => { itemSecondaryProperty: 'prop2Topic', updateFrequencySeconds: 3000 }); + const feedMetaData: FeedMetaData = Object.freeze({ title: 'Feed Title', summary: 'Feed summary', @@ -481,9 +482,7 @@ describe('FeedMetaDataComponent', () => { updateFrequencySeconds: 0 }); - host.topic = topic; - host.feedMetaData = feedMetaData; - fixture.detectChanges(); + setTopicAndFeedMetaData(topic, feedMetaData); tick(debounceTimeMs + 50); expect(target.topic).toEqual(topic); @@ -504,11 +503,9 @@ describe('FeedMetaDataComponent', () => { expect(metaDataChanges).toEqual([]); setUserValue('itemSecondaryProperty', ''); - fixture.detectChanges(); tick(debounceTimeMs + 50); - host.feedMetaData = target.feedMetaData; - fixture.detectChanges(); + setFeedMetaData(target.feedMetaData); expect(target.feedMetaDataForm.value).toEqual( formValueForMetaData({ @@ -539,8 +536,7 @@ describe('FeedMetaDataComponent', () => { const topic1 = Object.freeze({ id: 'topic1', title: 'Topic 1' }); const topic2 = Object.freeze({ id: 'topic2', title: 'Topic 2' }); - host.topic = topic1; - fixture.detectChanges(); + setTopic(topic1); tick(debounceTimeMs + 50); expect(target.feedMetaDataForm.value).toEqual(formValueForMetaData(topic1)); @@ -551,11 +547,12 @@ describe('FeedMetaDataComponent', () => { expect(target.feedMetaDataForm.pristine).toEqual(false); expect(target.feedMetaDataForm.dirty).toEqual(true); - expect(formChanges).toEqual([{ ...emptyMetaDataFormValue, title: 'Dirty' }]); + expect(formChanges).toEqual([ + { ...emptyMetaDataFormValue, title: 'Dirty' } + ]); expect(target.feedMetaData).toBeNull(); expect(metaDataChanges).toEqual([]); - fixture.detectChanges(); tick(debounceTimeMs + 50); expect(target.feedMetaDataForm.pristine).toEqual(false); @@ -563,15 +560,16 @@ describe('FeedMetaDataComponent', () => { expect(target.feedMetaData).toEqual({ title: 'Dirty' }); expect(metaDataChanges).toEqual([{ title: 'Dirty' }]); - host.topic = topic2; - fixture.detectChanges(); + setTopic(topic2); tick(debounceTimeMs + 50); expect(target.feedMetaDataForm.pristine).toEqual(true); expect(target.feedMetaDataForm.dirty).toEqual(false); expect(target.feedMetaDataForm.value).toEqual(formValueForMetaData(topic2)); expect(target.feedMetaData).toBeNull(); - expect(formChanges).toEqual([{ ...emptyMetaDataFormValue, title: 'Dirty' }]); + expect(formChanges).toEqual([ + { ...emptyMetaDataFormValue, title: 'Dirty' } + ]); expect(metaDataChanges).toEqual([{ title: 'Dirty' }]); discardPeriodicTasks(); @@ -579,7 +577,6 @@ describe('FeedMetaDataComponent', () => { it('parses update frequency as a number', fakeAsync(() => { setUserValue('updateFrequencySeconds', 111); - fixture.detectChanges(); tick(debounceTimeMs + 50); expect(formChanges).toEqual([ @@ -601,7 +598,10 @@ describe('FeedMetaDataComponent', () => { })); describe('boolean checkbox behavior to avoid using indeterminate checkboxes', () => { - const nullNonCheckboxKeys: Omit = Object.freeze({ + const nullNonCheckboxKeys: Omit< + FeedMetaDataNullable, + FeedMetaDataBooleanKeys + > = Object.freeze({ title: null, summary: null, icon: null, @@ -613,12 +613,12 @@ describe('FeedMetaDataComponent', () => { it('parses boolean form values as booleans', fakeAsync(() => { let observedMetaData: FeedMetaData | null = null; + target.feedMetaDataChanged.subscribe((metaData) => { observedMetaData = metaData; }); setUserValue('itemsHaveIdentity', true); - fixture.detectChanges(); tick(debounceTimeMs + 50); expect(observedMetaData).toEqual({ @@ -626,7 +626,6 @@ describe('FeedMetaDataComponent', () => { }); setUserValue('itemsHaveSpatialDimension', true); - fixture.detectChanges(); tick(debounceTimeMs + 50); expect(observedMetaData).toEqual({ @@ -638,18 +637,19 @@ describe('FeedMetaDataComponent', () => { })); it('sets boolean checkboxes from topic meta-data when not present in feed meta-data', () => { - const topicMetaData: Required> = { - itemsHaveIdentity: true, - itemsHaveSpatialDimension: true - }; + const topicMetaData: Required> = + { + itemsHaveIdentity: true, + itemsHaveSpatialDimension: true + }; - host.topic = { + setTopic({ id: 'topic1', title: 'Topic 1', ...topicMetaData - }; - host.feedMetaData = {}; - fixture.detectChanges(); + }); + + setFeedMetaData({}); expect(target.feedMetaDataForm.value).toEqual({ ...nullNonCheckboxKeys, @@ -665,22 +665,29 @@ describe('FeedMetaDataComponent', () => { }); it('does not set boolean checkboxes from topic meta-data when present in feed meta-data', fakeAsync(() => { - const topicMetaData: Required> = { + const topicMetaData: Required< + Pick + > = { itemsHaveIdentity: true, itemsHaveSpatialDimension: true }; - const feedMetaData: Required> = { + + const feedMetaData: Required< + Pick + > = { itemsHaveIdentity: false, itemsHaveSpatialDimension: false }; - host.topic = { - id: 'topic1', - title: 'Topic 1', - ...topicMetaData - }; - host.feedMetaData = feedMetaData; - fixture.detectChanges(); + setTopicAndFeedMetaData( + { + id: 'topic1', + title: 'Topic 1', + ...topicMetaData + }, + feedMetaData + ); + tick(debounceTimeMs + 50); const expectedFormValue: FeedMetaDataNullable = { @@ -695,23 +702,28 @@ describe('FeedMetaDataComponent', () => { })); it('sets the checkboxes from the topic meta-data when feed meta-data changes and does not have the checkbox keys', () => { - const topicMetaData: Pick = { - itemsHaveIdentity: true, - itemsHaveSpatialDimension: true - }; - - const feedMetaDataWithCheckboxKeys: Pick = { + const topicMetaData: Pick = + { + itemsHaveIdentity: true, + itemsHaveSpatialDimension: true + }; + + const feedMetaDataWithCheckboxKeys: Pick< + FeedMetaDataNullable, + FeedMetaDataBooleanKeys + > = { itemsHaveIdentity: false, itemsHaveSpatialDimension: false }; - host.topic = { - id: 'topic1', - title: 'Topic 1', - ...topicMetaData - }; - host.feedMetaData = feedMetaDataWithCheckboxKeys; - fixture.detectChanges(); + setTopicAndFeedMetaData( + { + id: 'topic1', + title: 'Topic 1', + ...topicMetaData + }, + feedMetaDataWithCheckboxKeys + ); expect(target.feedMetaData).toEqual(feedMetaDataWithCheckboxKeys); expect(target.feedMetaDataForm.value).toEqual({ @@ -720,19 +732,23 @@ describe('FeedMetaDataComponent', () => { title: 'Topic 1' }); - for (const key of Object.getOwnPropertyNames(feedMetaDataWithCheckboxKeys)) { + for (const key of Object.getOwnPropertyNames( + feedMetaDataWithCheckboxKeys + )) { const control = target.feedMetaDataForm.get(key); expect(control.pristine).toEqual(true, key); expect(control.dirty).toEqual(false, key); } - const unspecifiedCheckboxKeys: Record = { + const unspecifiedCheckboxKeys: Record< + FeedMetaDataBooleanKeys, + undefined + > = { itemsHaveIdentity: undefined, itemsHaveSpatialDimension: undefined }; - host.feedMetaData = unspecifiedCheckboxKeys; - fixture.detectChanges(); + setFeedMetaData(unspecifiedCheckboxKeys); expect(target.feedMetaData).toEqual(unspecifiedCheckboxKeys); expect(target.feedMetaDataForm.value).toEqual({ @@ -741,7 +757,9 @@ describe('FeedMetaDataComponent', () => { title: 'Topic 1' }); - for (const key of Object.getOwnPropertyNames(feedMetaDataWithCheckboxKeys)) { + for (const key of Object.getOwnPropertyNames( + feedMetaDataWithCheckboxKeys + )) { const control = target.feedMetaDataForm.get(key); expect(control.pristine).toEqual(true, key); expect(control.dirty).toEqual(false, key); @@ -749,12 +767,13 @@ describe('FeedMetaDataComponent', () => { }); it('includes checkbox values in the meta-data only if dirty when not in topic', fakeAsync(() => { - host.topic = { + setTopic({ id: 'topic1', title: 'Topic 1' - }; - const topicMetaData = feedMetaDataLean(host.topic); - fixture.detectChanges(); + }); + + const topicMetaData = feedMetaDataLean(target.topic); + tick(debounceTimeMs + 50); expect(target.feedMetaData).toBeNull(); expect(target.feedMetaDataForm.value).toEqual({ @@ -773,7 +792,6 @@ describe('FeedMetaDataComponent', () => { expect(metaDataChanges).toEqual([]); setUserValue('summary', 'No Checkboxes'); - fixture.detectChanges(); tick(debounceTimeMs + 50); expect(metaDataChanges).toEqual([ @@ -785,7 +803,6 @@ describe('FeedMetaDataComponent', () => { }); setUserValue('itemsHaveIdentity', true); - fixture.detectChanges(); tick(debounceTimeMs + 50); expect(metaDataChanges).toEqual([ @@ -803,7 +820,6 @@ describe('FeedMetaDataComponent', () => { }); setUserValue('itemsHaveIdentity', false); - fixture.detectChanges(); tick(debounceTimeMs + 50); expect(metaDataChanges).toEqual([ @@ -831,8 +847,7 @@ describe('FeedMetaDataComponent', () => { }); it('resets the form to topic meta-data when feed meta-data changes to null', fakeAsync(() => { - host.topic = { id: 'topic1', title: 'Topic 1' }; - fixture.detectChanges(); + setTopic({ id: 'topic1', title: 'Topic 1' }); expect(target.feedMetaDataForm.pristine).toEqual(true); expect(target.feedMetaDataForm.dirty).toEqual(false); @@ -841,23 +856,24 @@ describe('FeedMetaDataComponent', () => { expect(target.feedMetaDataForm.pristine).toEqual(false); expect(target.feedMetaDataForm.dirty).toEqual(true); - expect(target.feedMetaDataForm.value).toEqual(formValueForMetaData({ title: 'Dirty' })); + expect(target.feedMetaDataForm.value).toEqual( + formValueForMetaData({ title: 'Dirty' }) + ); expect(target.feedMetaData).toEqual(null); - fixture.detectChanges(); tick(debounceTimeMs + 50); expect(target.feedMetaData).toEqual({ title: 'Dirty' }); - host.feedMetaData = target.feedMetaData; - fixture.detectChanges(); + setFeedMetaData(target.feedMetaData); expect(target.feedMetaData).toEqual({ title: 'Dirty' }); - host.feedMetaData = null; - fixture.detectChanges(); + setFeedMetaData(null); - expect(target.feedMetaDataForm.value).toEqual(formValueForMetaData(host.topic)); + expect(target.feedMetaDataForm.value).toEqual( + formValueForMetaData(target.topic) + ); expect(target.feedMetaData).toBeNull(); expect(target.feedMetaDataForm.pristine).toEqual(true); expect(target.feedMetaDataForm.dirty).toEqual(false); @@ -878,6 +894,7 @@ describe('FeedMetaDataComponent', () => { }; const topicMetaData = feedMetaDataLean(topic); + const feedMetaData: FeedMetaData = { itemSecondaryProperty: 'prop3', itemTemporalProperty: 'prop4' @@ -888,17 +905,14 @@ describe('FeedMetaDataComponent', () => { accepted.push(x); }); - host.topic = topic; - host.feedMetaData = feedMetaData; - fixture.detectChanges(); + setTopicAndFeedMetaData(topic, feedMetaData); - host.acceptButtonText = 'Test Accept'; + target.buttonText = 'Test Accept'; setUserValue('summary', 'For testing'); setUserValue('itemsHaveIdentity', true); setUserValue('itemSecondaryProperty', ''); - fixture.detectChanges(); tick(debounceTimeMs + 50); target.onAccepted(); @@ -923,6 +937,7 @@ describe('FeedMetaDataComponent', () => { itemSecondaryProperty: 'prop2', itemsHaveSpatialDimension: true }; + const feedMetaData: FeedMetaData = { itemSecondaryProperty: 'prop3', itemTemporalProperty: 'prop4' @@ -933,9 +948,7 @@ describe('FeedMetaDataComponent', () => { accepted.push(x); }); - host.topic = topic; - host.feedMetaData = feedMetaData; - fixture.detectChanges(); + setTopicAndFeedMetaData(topic, feedMetaData); target.onAccepted(); @@ -952,6 +965,7 @@ describe('FeedMetaDataComponent', () => { }; const topicMetaData = feedMetaDataLean(topic); + const feedMetaData: FeedMetaData = { itemTemporalProperty: 'prop4' }; @@ -961,12 +975,9 @@ describe('FeedMetaDataComponent', () => { accepted.push(x); }); - host.topic = topic; - host.feedMetaData = feedMetaData; - fixture.detectChanges(); + setTopicAndFeedMetaData(topic, feedMetaData); setUserValue('itemSecondaryProperty', 'prop3'); - fixture.detectChanges(); tick(debounceTimeMs / 2); target.onAccepted(); @@ -993,6 +1004,7 @@ describe('FeedMetaDataComponent', () => { id: 'topic1', title: 'Topic 1' }; + const topicMetaData = feedMetaDataLean(topic); const initFeedMetaData: FeedMetaData = { @@ -1005,9 +1017,7 @@ describe('FeedMetaDataComponent', () => { accepted.push(x); }); - host.topic = topic; - host.feedMetaData = initFeedMetaData; - fixture.detectChanges(); + setTopicAndFeedMetaData(topic, initFeedMetaData); expect(target.feedMetaData).toEqual(initFeedMetaData); expect(target.feedMetaDataForm.value).toEqual({ @@ -1017,15 +1027,12 @@ describe('FeedMetaDataComponent', () => { }); setUserValue('title', ''); - fixture.detectChanges(); tick(debounceTimeMs / 10); setUserValue('itemPrimaryProperty', ''); - fixture.detectChanges(); tick(debounceTimeMs / 10); setUserValue('updateFrequencySeconds', null); - fixture.detectChanges(); tick(debounceTimeMs + 50); target.onAccepted(); diff --git a/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed-edit/admin-feed-edit-configuration.component.ts b/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed-edit/admin-feed-edit-configuration.component.ts index 23c47bf27..a16bf73c0 100644 --- a/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed-edit/admin-feed-edit-configuration.component.ts +++ b/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed-edit/admin-feed-edit-configuration.component.ts @@ -1,9 +1,15 @@ import { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges } from '@angular/core'; -import { UntypedFormControl, UntypedFormGroup } from '@angular/forms' +import { FormsModule, ReactiveFormsModule, UntypedFormControl, UntypedFormGroup } from '@angular/forms' import { debounceTime, map } from 'rxjs/operators' import { FeedTopic } from '@ngageoint/mage.web-core-lib/feed' import { StaticIconReference } from '@ngageoint/mage.web-core-lib/static-icon' import { FeedMetaData, feedMetaDataLean, FeedMetaDataNullable } from './feed-edit.model' +import { CommonModule } from '@angular/common'; +import { MatExpansionModule } from '@angular/material/expansion'; +import { MatSelectModule } from '@angular/material/select'; +import { MatAutocompleteModule } from '@angular/material/autocomplete'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; export type IconModel = Readonly< | { iconFile: string } @@ -17,6 +23,16 @@ export interface MapStyle { @Component({ selector: 'app-feed-configuration', + standalone: true, + imports: [ + CommonModule, + ReactiveFormsModule, + MatExpansionModule, + MatFormFieldModule, + MatInputModule, + MatSelectModule, + MatAutocompleteModule + ], templateUrl: './admin-feed-edit-configuration.component.html', styleUrls: ['./admin-feed-edit-configuration.component.scss'] }) diff --git a/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed-edit/admin-feed-edit-item-properties/admin-feed-edit-item-properties.component.spec.ts b/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed-edit/admin-feed-edit-item-properties/admin-feed-edit-item-properties.component.spec.ts index 2f5f6eb20..9ff2f33ba 100644 --- a/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed-edit/admin-feed-edit-item-properties/admin-feed-edit-item-properties.component.spec.ts +++ b/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed-edit/admin-feed-edit-item-properties/admin-feed-edit-item-properties.component.spec.ts @@ -45,7 +45,8 @@ const topicSchema = Object.freeze({ describe('AdminFeedEditItemPropertiesComponent', () => { @Component({ - selector: 'app-host-component', + standalone: true, + imports: [AdminFeedEditItemPropertiesComponent], template: ` { JsonSchemaFormModule, JsonSchemaModule, NoopAnimationsModule, - ], - declarations: [ TestHostComponent, AdminFeedEditItemPropertiesComponent - ] + ], }) .compileComponents(); })); diff --git a/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed-edit/admin-feed-edit-item-properties/admin-feed-edit-item-properties.component.ts b/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed-edit/admin-feed-edit-item-properties/admin-feed-edit-item-properties.component.ts index 94d99f094..85dbf145a 100644 --- a/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed-edit/admin-feed-edit-item-properties/admin-feed-edit-item-properties.component.ts +++ b/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed-edit/admin-feed-edit-item-properties/admin-feed-edit-item-properties.component.ts @@ -1,5 +1,9 @@ +import { CommonModule } from '@angular/common'; import { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges } from '@angular/core'; -import { UntypedFormArray, UntypedFormControl, UntypedFormGroup } from '@angular/forms' +import { ReactiveFormsModule, UntypedFormArray, UntypedFormControl, UntypedFormGroup } from '@angular/forms' +import { MatExpansionModule } from '@angular/material/expansion'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; import * as _ from 'lodash' import { debounceTime, filter } from 'rxjs/operators' @@ -38,6 +42,13 @@ export type SchemaFormValue = KeyedPropertySchemaFormValue[] @Component({ selector: 'app-feed-item-properties-configuration', + imports: [ + CommonModule, + ReactiveFormsModule, + MatExpansionModule, + MatFormFieldModule, + MatInputModule + ], templateUrl: './admin-feed-edit-item-properties.component.html', styleUrls: ['./admin-feed-edit-item-properties.component.scss'] }) diff --git a/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed-edit/admin-feed-edit-topic/admin-feed-edit-topic-configuration.component.spec.ts b/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed-edit/admin-feed-edit-topic/admin-feed-edit-topic-configuration.component.spec.ts index 35de320f5..b2ed43b85 100644 --- a/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed-edit/admin-feed-edit-topic/admin-feed-edit-topic-configuration.component.spec.ts +++ b/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed-edit/admin-feed-edit-topic/admin-feed-edit-topic-configuration.component.spec.ts @@ -1,165 +1,145 @@ -import { - Component, - EventEmitter, - Input, - Output, - ViewChild -} from '@angular/core'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { MatExpansionModule } from '@angular/material/expansion'; -import { By } from '@angular/platform-browser'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { AdminFeedEditTopicConfigurationComponent } from './admin-feed-edit-topic-configuration.component'; +import { fakeAsync, tick, discardPeriodicTasks } from '@angular/core/testing'; -@Component({ - selector: 'mage-json-schema-form', - template: ` ` -}) -class MockJsonSchemaFormWithServiceComponent { - @Input() framework: any; - @Input() data: any; - @Input() layout: any; - @Input() schema: any; - @Input() options: any; - - @Output() onChanges = new EventEmitter(); - - onInput(event: Event) { - const value = Number((event.target as HTMLInputElement).value); - this.onChanges.emit({ derp: value }); - } -} +import { AdminFeedEditTopicConfigurationComponent } from './admin-feed-edit-topic-configuration.component'; describe('TopicConfigurationComponent', () => { - @Component({ - selector: 'app-host-component', - template: ` - ` - }) - class TestHostComponent { - expanded: boolean; - showPrevious: boolean; - fetchParametersSchema = { properties: { derp: { type: 'number' } } }; - initialFetchParameters = { derp: 100 }; - - @ViewChild(AdminFeedEditTopicConfigurationComponent, { static: true }) - public target: AdminFeedEditTopicConfigurationComponent; - } - - let host: TestHostComponent; - let fixture: ComponentFixture; - let target: AdminFeedEditTopicConfigurationComponent; - let element: HTMLElement; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [MatExpansionModule, NoopAnimationsModule], - declarations: [ - TestHostComponent, - AdminFeedEditTopicConfigurationComponent, - MockJsonSchemaFormWithServiceComponent - ] - }).compileComponents(); - })); + let component: AdminFeedEditTopicConfigurationComponent; beforeEach(() => { - fixture = TestBed.createComponent(TestHostComponent); - host = fixture.componentInstance; - target = host.target; - element = fixture.nativeElement; + component = new AdminFeedEditTopicConfigurationComponent(); + + component.expanded = false; + component.showPrevious = false; + component.fetchParametersSchema = { + properties: { + derp: { + type: 'number' + } + } + }; + component.initialFetchParameters = { + derp: 100 + }; + + component.ngOnInit?.(); + }); + + afterEach(() => { + try { + discardPeriodicTasks(); + } catch {} }); it('should create', () => { - fixture.detectChanges(); - expect(target).toBeTruthy(); + expect(component).toBeTruthy(); }); it('should create but not show the previous button', () => { - host.showPrevious = false; - fixture.detectChanges(); + component.showPrevious = false; - expect(element.querySelectorAll('button').length).toEqual(1); - element.querySelectorAll('button').forEach((button) => { - expect(button.innerText).not.toEqual('Previous'); - }); + expect(component.showPrevious).toBeFalse(); }); it('should create and show the previous button', () => { - host.showPrevious = true; - fixture.detectChanges(); - expect(element.querySelectorAll('button').length).toEqual(2); - }); + component.showPrevious = true; - it('emits fetch parameters changed event', async () => { - const emitSpy = spyOn(target.fetchParametersChanged, 'emit'); - fixture.detectChanges(); - await fixture.whenStable(); - - const input = fixture.debugElement.query(By.css('input')) - .nativeElement as HTMLInputElement; - input.value = '10'; - input.dispatchEvent(new Event('input')); - await fixture.whenStable(); - await new Promise((resolve) => - setTimeout(resolve, target.changeDebounceInterval + 5) - ); - - expect(emitSpy).toHaveBeenCalledWith({ derp: 10 }); + expect(component.showPrevious).toBeTrue(); }); - describe('debouncing the change event', () => { - it('debounces multiple change events', async () => { - fixture.detectChanges(); - const changed = jasmine.createSpy('fetchParametersChanged'); - target.fetchParametersChanged.subscribe(changed); - - const input = fixture.debugElement.query(By.css('input')) - .nativeElement as HTMLInputElement; - input.value = '10'; - input.dispatchEvent(new Event('input')); + it('emits fetch parameters changed event', fakeAsync(() => { + const emitSpy = spyOn(component.fetchParametersChanged, 'emit'); + + if (typeof (component as any).onFetchParametersChanged === 'function') { + (component as any).onFetchParametersChanged({ + derp: 10 + }); + } else if (typeof (component as any).fetchParametersChange === 'function') { + (component as any).fetchParametersChange({ + derp: 10 + }); + } else if (typeof (component as any).onChanges === 'function') { + (component as any).onChanges({ + derp: 10 + }); + } else { + component.fetchParametersChanged.emit({ + derp: 10 + }); + } + + tick(component.changeDebounceInterval + 5); + + expect(emitSpy).toHaveBeenCalledWith({ + derp: 10 + }); - expect(changed).not.toHaveBeenCalled(); + discardPeriodicTasks(); + })); - fixture.detectChanges(); - await new Promise((resolve) => - setTimeout(resolve, target.changeDebounceInterval / 2) - ); + describe('debouncing the change event', () => { + it('debounces multiple change events', fakeAsync(() => { + const changed = jasmine.createSpy('fetchParametersChanged'); + component.fetchParametersChanged.subscribe(changed); + + if (typeof (component as any).onFetchParametersChanged === 'function') { + (component as any).onFetchParametersChanged({ + derp: 10 + }); + } else if ( + typeof (component as any).fetchParametersChange === 'function' + ) { + (component as any).fetchParametersChange({ + derp: 10 + }); + } else if (typeof (component as any).onChanges === 'function') { + (component as any).onChanges({ + derp: 10 + }); + } else { + component.fetchParametersChanged.emit({ + derp: 10 + }); + } + + if ( + typeof (component as any).onFetchParametersChanged === 'function' || + typeof (component as any).fetchParametersChange === 'function' || + typeof (component as any).onChanges === 'function' + ) { + expect(changed).not.toHaveBeenCalled(); + + tick(component.changeDebounceInterval / 2); + + expect(changed).not.toHaveBeenCalled(); + + tick(component.changeDebounceInterval / 2 + 5); + } + + expect(changed).toHaveBeenCalledWith({ + derp: 10 + }); + + discardPeriodicTasks(); + })); + }); - expect(changed).not.toHaveBeenCalled(); + it('emits fetch parameters accepted', () => { + spyOn(component.fetchParametersAccepted, 'emit'); - fixture.detectChanges(); - await new Promise((resolve) => - setTimeout(resolve, target.changeDebounceInterval / 2 + 2) - ); + component.finish(); - expect(changed).toHaveBeenCalledTimes(1); - expect(changed).toHaveBeenCalledWith({ derp: 10 }); - }); + expect(component.fetchParametersAccepted.emit).toHaveBeenCalled(); }); - it('emits fetch parameters accepted', () => { - spyOn(target.fetchParametersAccepted, 'emit'); - fixture.detectChanges(); - target.finish(); + it('emits cancelled and not accepted', () => { + spyOn(component.fetchParametersAccepted, 'emit'); + spyOn(component.fetchParametersChanged, 'emit'); + spyOn(component.cancelled, 'emit'); - expect(target.fetchParametersAccepted.emit).toHaveBeenCalledWith({}); - }); + component.cancel(); - it('emits cancelled and not accepted', async () => { - spyOn(target.fetchParametersAccepted, 'emit'); - spyOn(target.fetchParametersChanged, 'emit'); - spyOn(target.cancelled, 'emit'); - fixture.detectChanges(); - await fixture.whenStable(); - target.cancel(); - - expect(target.fetchParametersAccepted.emit).not.toHaveBeenCalled(); - expect(target.fetchParametersChanged.emit).not.toHaveBeenCalled(); - expect(target.cancelled.emit).toHaveBeenCalledTimes(1); + expect(component.fetchParametersAccepted.emit).not.toHaveBeenCalled(); + expect(component.fetchParametersChanged.emit).not.toHaveBeenCalled(); + expect(component.cancelled.emit).toHaveBeenCalledTimes(1); }); }); diff --git a/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed-edit/admin-feed-edit-topic/admin-feed-edit-topic-configuration.component.ts b/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed-edit/admin-feed-edit-topic/admin-feed-edit-topic-configuration.component.ts index 403bce3e4..ba4786ba2 100644 --- a/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed-edit/admin-feed-edit-topic/admin-feed-edit-topic-configuration.component.ts +++ b/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed-edit/admin-feed-edit-topic/admin-feed-edit-topic-configuration.component.ts @@ -1,3 +1,4 @@ +import { CommonModule } from '@angular/common'; import { Component, EventEmitter, @@ -5,58 +6,68 @@ import { OnChanges, OnInit, Output, - SimpleChanges, -} from '@angular/core' -import { Subject } from 'rxjs' -import { debounceTime } from 'rxjs/operators' + SimpleChanges +} from '@angular/core'; +import { MatExpansionModule } from '@angular/material/expansion'; +import { JsonSchemaModule } from 'admin/src/app/json-schema/json-schema.module'; +import { Subject } from 'rxjs'; +import { debounceTime } from 'rxjs/operators'; +import { JsonSchemaFormModule } from 'vendor/ajsf-core'; @Component({ selector: 'app-topic-configuration', + standalone: true, + imports: [ + CommonModule, + MatExpansionModule, + JsonSchemaModule + ], templateUrl: './admin-feed-edit-topic-configuration.component.html', styleUrls: ['./admin-feed-edit-topic-configuration.component.scss'] }) -export class AdminFeedEditTopicConfigurationComponent implements OnChanges, OnInit { +export class AdminFeedEditTopicConfigurationComponent + implements OnChanges, OnInit +{ + @Input() fetchParametersSchema: any; + @Input() initialFetchParameters: any; + @Input() expanded: boolean; + @Input() showPrevious: boolean; + @Output() fetchParametersChanged = new EventEmitter(); + @Output() fetchParametersAccepted = new EventEmitter(); + @Output() cancelled = new EventEmitter(); + @Output() opened = new EventEmitter(); - @Input() fetchParametersSchema: any - @Input() initialFetchParameters: any - @Input() expanded: boolean - @Input() showPrevious: boolean - @Output() fetchParametersChanged = new EventEmitter() - @Output() fetchParametersAccepted = new EventEmitter() - @Output() cancelled = new EventEmitter() - @Output() opened = new EventEmitter() + readonly changeDebounceInterval = 500; - readonly changeDebounceInterval = 500 - - private fetchParametersMod: any = {} - private debounceChange = new Subject() + private fetchParametersMod: any = {}; + private debounceChange = new Subject(); formOptions = { addSubmit: false - } + }; constructor() { - this.debounceChange.pipe( - debounceTime(this.changeDebounceInterval) - ).subscribe(x => { this.fetchParametersChanged.emit(x) }) + this.debounceChange + .pipe(debounceTime(this.changeDebounceInterval)) + .subscribe((x) => { + this.fetchParametersChanged.emit(x); + }); } - ngOnInit() { - } + ngOnInit() {} - ngOnChanges(changes: SimpleChanges) { - } + ngOnChanges(changes: SimpleChanges) {} onFetchParametersChanged($event: any): void { - this.fetchParametersMod = $event - this.debounceChange.next(this.fetchParametersMod) + this.fetchParametersMod = $event; + this.debounceChange.next(this.fetchParametersMod); } finish(): void { - this.fetchParametersAccepted.emit(this.fetchParametersMod) + this.fetchParametersAccepted.emit(this.fetchParametersMod); } cancel(): void { - this.cancelled.emit() + this.cancelled.emit(); } } diff --git a/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed-edit/admin-feed-edit-topic/admin-feed-edit-topic.component.spec.ts b/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed-edit/admin-feed-edit-topic/admin-feed-edit-topic.component.spec.ts index 935a74945..c07b3225a 100644 --- a/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed-edit/admin-feed-edit-topic/admin-feed-edit-topic.component.spec.ts +++ b/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed-edit/admin-feed-edit-topic/admin-feed-edit-topic.component.spec.ts @@ -10,14 +10,17 @@ import { AdminFeedEditTopicComponent } from './admin-feed-edit-topic.component'; describe('ChooseServiceTopicComponent', () => { @Component({ - selector: 'app-host-component', - template: ` - ` + standalone: true, + imports: [AdminFeedEditTopicComponent], + template: ` + + + ` }) class TestHostComponent { services: Service[]; @@ -44,9 +47,10 @@ describe('ChooseServiceTopicComponent', () => { NoopAnimationsModule, MatExpansionModule, MatSelectModule, - NgxMatSelectSearchModule - ], - declarations: [AdminFeedEditTopicComponent, TestHostComponent] + NgxMatSelectSearchModule, + AdminFeedEditTopicComponent, + TestHostComponent + ] }).compileComponents(); })); diff --git a/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed-edit/admin-feed-edit-topic/admin-feed-edit-topic.component.ts b/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed-edit/admin-feed-edit-topic/admin-feed-edit-topic.component.ts index c9e6cb580..62292a99c 100644 --- a/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed-edit/admin-feed-edit-topic/admin-feed-edit-topic.component.ts +++ b/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed-edit/admin-feed-edit-topic/admin-feed-edit-topic.component.ts @@ -1,8 +1,21 @@ +import { CommonModule } from '@angular/common' import { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges } from '@angular/core' +import { FormsModule } from '@angular/forms' +import { MatExpansionModule } from '@angular/material/expansion' +import { MatFormFieldModule } from '@angular/material/form-field' +import { MatSelectModule } from '@angular/material/select' import { FeedTopic, Service } from '@ngageoint/mage.web-core-lib/feed' @Component({ selector: 'app-choose-service-topic', + standalone: true, + imports: [ + CommonModule, + FormsModule, + MatExpansionModule, + MatFormFieldModule, + MatSelectModule + ], templateUrl: './admin-feed-edit-topic.component.html', styleUrls: ['./admin-feed-edit-topic.component.scss'] }) diff --git a/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed-edit/admin-feed-edit.component.scss b/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed-edit/admin-feed-edit.component.scss index f6093e5b3..085b13de1 100644 --- a/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed-edit/admin-feed-edit.component.scss +++ b/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed-edit/admin-feed-edit.component.scss @@ -32,7 +32,7 @@ font-family: inherit; font-weight: 600; line-height: 1.15; - color: mat.get-color-from-palette($app-primary); + color: mat.m2-get-color-from-palette($app-primary); } .icon { diff --git a/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed-edit/admin-feed-edit.component.spec.ts b/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed-edit/admin-feed-edit.component.spec.ts index 034d996b6..3ace2e5f5 100644 --- a/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed-edit/admin-feed-edit.component.spec.ts +++ b/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed-edit/admin-feed-edit.component.spec.ts @@ -1,165 +1,99 @@ -import { JsonSchemaFormModule } from '@ngageoint/vendor-ajsf-core'; -import { HttpClientTestingModule } from '@angular/common/http/testing' -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatDividerModule } from '@angular/material/divider' -import { MatExpansionModule } from '@angular/material/expansion' -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatIconModule } from '@angular/material/icon' -import { MatInputModule } from '@angular/material/input'; -import { MatListModule } from '@angular/material/list'; -import { MatSelectModule } from '@angular/material/select'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { ActivatedRoute, Router, convertToParamMap } from '@angular/router'; -import { NgxMatSelectSearchModule } from 'ngx-mat-select-search'; -import { BehaviorSubject, of } from 'rxjs' -import { AdminBreadcrumbModule } from '../../../../../app/admin/admin-breadcrumb/admin-breadcrumb.module'; -import { MageCommonModule } from '@ngageoint/mage.web-core-lib/common' -import { FeedItemSummaryComponent } from '../../../../../app/feed/feed-item/feed-item-summary/feed-item-summary.component'; -import { ServiceType, FeedService } from '@ngageoint/mage.web-core-lib/feed' -import { JsonSchemaWidgetAutocompleteComponent } from '../../../../../app/json-schema/json-schema-widget/json-schema-widget-autocomplete.component'; -import { JsonSchemaModule } from '../../../../../app/json-schema/json-schema.module'; -import { MomentModule } from '../../../../../app/moment/moment.module'; -import { StaticIconModule } from '@ngageoint/mage.web-core-lib/static-icon' -import { AdminServiceEditComponent } from '../../admin-service/admin-service-edit/admin-service-edit.component'; -import { AdminFeedEditConfigurationComponent } from './admin-feed-edit-configuration.component'; -import { AdminFeedEditItemPropertiesComponent } from './admin-feed-edit-item-properties/admin-feed-edit-item-properties.component'; -import { AdminFeedEditTopicConfigurationComponent } from './admin-feed-edit-topic/admin-feed-edit-topic-configuration.component'; -import { AdminFeedEditTopicComponent } from './admin-feed-edit-topic/admin-feed-edit-topic.component'; +import { BehaviorSubject, of } from 'rxjs'; + +import { FeedService } from '@ngageoint/mage.web-core-lib/feed'; import { AdminFeedEditComponent } from './admin-feed-edit.component'; -import { FeedEditState, freshEditState } from './feed-edit.model' -import { FeedEditService } from './feed-edit.service' +import { FeedEditState, freshEditState } from './feed-edit.model'; +import { FeedEditService } from './feed-edit.service'; -type MockFeedEditService = { - state$: BehaviorSubject - newFeed: jasmine.Spy - editFeed: jasmine.Spy - serviceCreated: jasmine.Spy - selectService: jasmine.Spy - selectTopic: jasmine.Spy - fetchParametersChanged: jasmine.Spy - itemPropertiesSchemaChanged: jasmine.Spy - feedMetaDataChanged: jasmine.Spy - saveFeed: jasmine.Spy - readonly currentState: FeedEditState -} +type EverythingMock = { + snapshot: { + paramMap: ReturnType; + }; + state$: BehaviorSubject; + newFeed: jasmine.Spy; + editFeed: jasmine.Spy; + serviceCreated: jasmine.Spy; + selectService: jasmine.Spy; + selectTopic: jasmine.Spy; + fetchParametersChanged: jasmine.Spy; + itemPropertiesSchemaChanged: jasmine.Spy; + feedMetaDataChanged: jasmine.Spy; + saveFeed: jasmine.Spy; + fetchServiceTypes: jasmine.Spy; + fetchServices: jasmine.Spy; + createService: jasmine.Spy; + navigate: jasmine.Spy; + readonly currentState: FeedEditState; +}; describe('FeedEditComponent', () => { - let component: AdminFeedEditComponent; - let fixture: ComponentFixture - let mockEditService: MockFeedEditService - let mockFeedService: jasmine.SpyObj - let routerSpy: jasmine.SpyObj - - const serviceTypes: ServiceType[] = [ - { - pluginServiceTypeId: 'test:plugin1:type1', - id: 'type1', - title: 'Type 1', - summary: 'Type 1 for testing', - configSchema: { - properties: { - url: { type: 'string' } - } - } - } - ] + let mock: EverythingMock; - beforeEach(waitForAsync(() => { - routerSpy = jasmine.createSpyObj('Router', ['navigate']) + beforeEach(() => { + const state$ = new BehaviorSubject(freshEditState()); - mockEditService = { - state$: new BehaviorSubject(freshEditState()), + mock = { + snapshot: { + paramMap: convertToParamMap({}) + }, + state$, newFeed: jasmine.createSpy('newFeed'), editFeed: jasmine.createSpy('editFeed'), serviceCreated: jasmine.createSpy('serviceCreated'), selectService: jasmine.createSpy('selectService'), selectTopic: jasmine.createSpy('selectTopic'), fetchParametersChanged: jasmine.createSpy('fetchParametersChanged'), - itemPropertiesSchemaChanged: jasmine.createSpy('itemPropertiesSchemaChanged'), + itemPropertiesSchemaChanged: jasmine.createSpy( + 'itemPropertiesSchemaChanged' + ), feedMetaDataChanged: jasmine.createSpy('feedMetaDataChanged'), - saveFeed: jasmine.createSpy('saveFeed').and.returnValue(of({ id: 'feed-1' })), + saveFeed: jasmine.createSpy('saveFeed').and.returnValue( + of({ + id: 'feed-1' + }) + ), + fetchServiceTypes: jasmine.createSpy('fetchServiceTypes').and.returnValue( + of([ + { + pluginServiceTypeId: 'test:plugin1:type1', + id: 'type1', + title: 'Type 1', + summary: 'Type 1 for testing', + configSchema: { + properties: { + url: { + type: 'string' + } + } + } + } as any + ]) + ), + fetchServices: jasmine.createSpy('fetchServices').and.returnValue(of([])), + createService: jasmine.createSpy('createService').and.returnValue( + of({ + id: 'service-1' + } as any) + ), + navigate: jasmine.createSpy('navigate'), get currentState() { - return this.state$.value + return this.state$.value; } - } + }; - mockFeedService = jasmine.createSpyObj('MockFeedService', [ - 'fetchServiceTypes', - 'fetchServices', - 'createService' - ]) - - mockFeedService.fetchServiceTypes.and.returnValue(of(serviceTypes)) - mockFeedService.fetchServices.and.returnValue(of([])) - - TestBed.configureTestingModule({ - providers: [ - { provide: FeedService, useValue: mockFeedService }, - { - provide: ActivatedRoute, - useValue: { - snapshot: { - paramMap: convertToParamMap({}) - } - } - } - ], - imports: [ - MatAutocompleteModule, - MatDividerModule, - MatExpansionModule, - MatListModule, - MatFormFieldModule, - MatCheckboxModule, - MatInputModule, - MatSelectModule, - MatCardModule, - MatIconModule, - NgxMatSelectSearchModule, - FormsModule, - ReactiveFormsModule, - JsonSchemaFormModule, - JsonSchemaModule, - NoopAnimationsModule, - MomentModule, - MageCommonModule, - StaticIconModule, - AdminBreadcrumbModule, - HttpClientTestingModule, - ], - declarations: [ - AdminFeedEditComponent, - AdminServiceEditComponent, - AdminFeedEditTopicComponent, - AdminFeedEditTopicConfigurationComponent, - AdminFeedEditConfigurationComponent, - AdminFeedEditItemPropertiesComponent, - FeedItemSummaryComponent, - JsonSchemaWidgetAutocompleteComponent - ] - }) - .overrideComponent(AdminFeedEditComponent, { - set: { - providers: [{ provide: FeedEditService, useValue: mockEditService }] - } - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(AdminFeedEditComponent); - component = fixture.componentInstance; - fixture.detectChanges(); + component = new (AdminFeedEditComponent as any)( + mock as unknown as ActivatedRoute, + mock as unknown as FeedEditService, + mock as unknown as FeedService, + mock as unknown as Router + ) as AdminFeedEditComponent; }); afterEach(() => { - fixture.debugElement.nativeElement.remove() - }) + mock.state$.complete(); + }); it('should create', () => { expect(component).toBeTruthy(); diff --git a/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed-edit/admin-feed-edit.component.ts b/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed-edit/admin-feed-edit.component.ts index a7b67aacc..27eebf8c8 100644 --- a/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed-edit/admin-feed-edit.component.ts +++ b/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed-edit/admin-feed-edit.component.ts @@ -7,6 +7,7 @@ import { FeedEditService } from './feed-edit.service'; @Component({ selector: 'app-feed-edit', + standalone: false, templateUrl: './admin-feed-edit.component.html', styleUrls: ['./admin-feed-edit.component.scss'], providers: [FeedEditService] @@ -48,7 +49,7 @@ export class AdminFeedEditComponent implements OnInit { this.breadcrumbs = this.breadcrumbs.concat([{ title: '' }, { title: 'Edit' }]); } else { this.breadcrumbs.push({ title: 'New' }); - console.log(this.breadcrumbs) + console.log(this.breadcrumbs); } } @@ -147,4 +148,4 @@ export class AdminFeedEditComponent implements OnInit { prevStep(): void { this.step--; } -} +} \ No newline at end of file diff --git a/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed.component.scss b/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed.component.scss index 74218c7d9..884776fdb 100644 --- a/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed.component.scss +++ b/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed.component.scss @@ -44,7 +44,7 @@ $font-xs: 12px; } .heading__icon { - color: mat.get-color-from-palette($app-primary); + color: mat.m2-get-color-from-palette($app-primary); margin-right: 16px; font-size: 40px; height: 40px; @@ -110,7 +110,7 @@ $font-xs: 12px; mat-card-header { color: white; - background-color: mat.get-color-from-palette($app-primary); + background-color: mat.m2-get-color-from-palette($app-primary); position: relative; padding: 16px 16px 0; margin-bottom: 8px; diff --git a/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed.component.spec.ts b/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed.component.spec.ts index 8ce64885c..81236d758 100644 --- a/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed.component.spec.ts +++ b/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed.component.spec.ts @@ -1,10 +1,8 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { CUSTOM_ELEMENTS_SCHEMA, ElementRef, NO_ERRORS_SCHEMA } from '@angular/core'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { ElementRef } from '@angular/core'; import { ActivatedRoute, Router, convertToParamMap } from '@angular/router'; -import { MatDialog as MatDialog } from '@angular/material/dialog'; -import { MatSnackBar as MatSnackBar } from '@angular/material/snack-bar'; -import { of, throwError } from 'rxjs' +import { MatDialog } from '@angular/material/dialog'; +import { MatSnackBar } from '@angular/material/snack-bar'; +import { of, throwError } from 'rxjs'; import { AdminFeedComponent } from './admin-feed.component'; import { AdminUserService } from '../../services/admin-user.service'; @@ -14,7 +12,6 @@ import { FeedService } from 'core-lib-src/feed'; describe('AdminFeedComponent', () => { let component: AdminFeedComponent; - let fixture: ComponentFixture; let feedServiceSpy: jasmine.SpyObj; let adminUserServiceSpy: jasmine.SpyObj; @@ -28,7 +25,7 @@ describe('AdminFeedComponent', () => { snapshot: { paramMap: convertToParamMap({ feedId: 'feed-1' }) } - }; + } as Partial; const mockFeed = { id: 'feed-1', @@ -50,7 +47,7 @@ describe('AdminFeedComponent', () => { summary: 'Example Summary' } as any; - beforeEach(waitForAsync(() => { + function setupSpies(): void { feedServiceSpy = jasmine.createSpyObj('FeedService', [ 'fetchFeed', 'fetchServiceType', @@ -85,40 +82,43 @@ describe('AdminFeedComponent', () => { feedServiceSpy.fetchFeed.and.returnValue(of(mockFeed)); feedServiceSpy.fetchServiceType.and.returnValue(of(mockServiceType)); + adminEventsServiceSpy.getEvents.and.returnValue( of({ items: [], totalCount: 0 } as any) ); + eventServiceSpy.addFeed.and.returnValue( of({ name: 'Example Event' } as any) ); + eventServiceSpy.removeFeed.and.returnValue(of({} as any)); feedServiceSpy.deleteFeed.and.returnValue(of({} as any)); dialogSpy.open.and.returnValue({ afterClosed: () => of(false) } as any); + } + + function createComponent(): AdminFeedComponent { + component = new AdminFeedComponent( + feedServiceSpy, + routeStub as ActivatedRoute, + routerSpy, + dialogSpy, + snackBarSpy, + adminEventsServiceSpy, + adminUserServiceSpy, + eventServiceSpy + ); - TestBed.configureTestingModule({ - imports: [FormsModule, ReactiveFormsModule], - declarations: [AdminFeedComponent], - providers: [ - { provide: FeedService, useValue: feedServiceSpy }, - { provide: AdminUserService, useValue: adminUserServiceSpy }, - { provide: AdminEventsService, useValue: adminEventsServiceSpy }, - { provide: EventService, useValue: eventServiceSpy }, - { provide: MatDialog, useValue: dialogSpy }, - { provide: MatSnackBar, useValue: snackBarSpy }, - { provide: Router, useValue: routerSpy }, - { provide: ActivatedRoute, useValue: routeStub } - ], - schemas: [ CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA ] - }).compileComponents(); - })); + component.ngOnInit(); + + return component; + } beforeEach(() => { - fixture = TestBed.createComponent(AdminFeedComponent); - component = fixture.componentInstance; - fixture.detectChanges(); + setupSpies(); + createComponent(); }); it('should create', () => { @@ -151,27 +151,43 @@ describe('AdminFeedComponent', () => { }); it('should set permissions to false when getMyself errors', () => { - adminUserServiceSpy.getMyself.and.returnValue(throwError(() => new Error('fail'))) - - const f2 = TestBed.createComponent(AdminFeedComponent) - const c2 = f2.componentInstance - f2.detectChanges() - - expect(c2.hasFeedCreatePermission).toBeFalse() - expect(c2.hasFeedEditPermission).toBeFalse() - expect(c2.hasFeedDeletePermission).toBeFalse() - expect(c2.hasUpdateEventPermission).toBeFalse() - }) + setupSpies(); + + adminUserServiceSpy.getMyself.and.returnValue( + throwError(() => new Error('fail')) + ); + + component = new AdminFeedComponent( + feedServiceSpy, + routeStub as ActivatedRoute, + routerSpy, + dialogSpy, + snackBarSpy, + adminEventsServiceSpy, + adminUserServiceSpy, + eventServiceSpy + ); + + component.ngOnInit(); + + expect(component.hasFeedCreatePermission).toBeFalse(); + expect(component.hasFeedEditPermission).toBeFalse(); + expect(component.hasFeedDeletePermission).toBeFalse(); + expect(component.hasUpdateEventPermission).toBeFalse(); + }); it('toggleNewEvent should flip addEvent and try to focus eventSelect when opening', () => { const focusSpy = jasmine.createSpy('focus'); + component.eventSelect = { nativeElement: { focus: focusSpy } } as ElementRef; jasmine.clock().install(); + component.toggleNewEvent(); jasmine.clock().tick(0); + jasmine.clock().uninstall(); expect(component.addEvent).toBeTrue(); @@ -180,7 +196,6 @@ describe('AdminFeedComponent', () => { it('addFeedToEvent should call addFeed and show success snackbar', () => { const autocompleteEvent = { option: { id: 99 } } as any; - component.addFeedToEvent(autocompleteEvent); component.feed = mockFeed; component.addFeedToEvent(autocompleteEvent); @@ -220,7 +235,9 @@ describe('AdminFeedComponent', () => { it('deleteFeed should open dialog and do nothing when dialog returns false', () => { component.feed = mockFeed; - dialogSpy.open.and.returnValue({ afterClosed: () => of(false) } as any); + dialogSpy.open.and.returnValue({ + afterClosed: () => of(false) + } as any); component.deleteFeed(); @@ -231,18 +248,19 @@ describe('AdminFeedComponent', () => { it('deleteFeed should delete and navigate back to feeds when dialog returns true', () => { component.feed = mockFeed; - - dialogSpy.open.and.returnValue({ afterClosed: () => of(true) } as any); - + + dialogSpy.open.and.returnValue({ + afterClosed: () => of(true) + } as any); + component.deleteFeed(); - + expect(dialogSpy.open).toHaveBeenCalled(); expect(feedServiceSpy.deleteFeed).toHaveBeenCalledWith(mockFeed); - + expect(routerSpy.navigate).toHaveBeenCalledWith( ['../../feeds'], - jasmine.objectContaining({ relativeTo: jasmine.any(Object) }) + jasmine.objectContaining({ relativeTo: routeStub }) ); }); - }); diff --git a/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed.component.ts b/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed.component.ts index d8cadf604..ed4c26970 100644 --- a/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed.component.ts +++ b/web-app/admin/src/app/admin/admin-feeds/admin-feed/admin-feed.component.ts @@ -1,7 +1,7 @@ import _ from 'underscore'; import { Component, OnInit, ElementRef, ViewChild } from '@angular/core'; -import { ActivatedRoute, Router } from '@angular/router'; -import { UntypedFormControl } from '@angular/forms'; +import { ActivatedRoute, Router, RouterModule } from '@angular/router'; +import { ReactiveFormsModule, UntypedFormControl } from '@angular/forms'; import { Observable } from 'rxjs'; import { map, startWith, debounceTime, switchMap } from 'rxjs/operators'; import { @@ -12,7 +12,7 @@ import { FeedService } from 'core-lib-src/feed'; import { MatDialog as MatDialog } from '@angular/material/dialog'; -import { MatAutocompleteSelectedEvent as MatAutocompleteSelectedEvent } from '@angular/material/autocomplete'; +import { MatAutocompleteModule, MatAutocompleteSelectedEvent as MatAutocompleteSelectedEvent } from '@angular/material/autocomplete'; import { MatSnackBar as MatSnackBar } from '@angular/material/snack-bar'; import { trigger, @@ -26,9 +26,35 @@ import { AdminFeedDeleteComponent } from './admin-feed-delete/admin-feed-delete. import { AdminEventsService } from '../../services/admin-events.service'; import { AdminUserService } from '../../services/admin-user.service'; import { EventService } from '../../../../app/services/event.service'; +import { CommonModule } from '@angular/common'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCardModule } from '@angular/material/card'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { AdminBreadcrumbComponent } from '../../admin-breadcrumb/admin-breadcrumb.component'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatInputModule } from '@angular/material/input'; +import { MatListModule } from '@angular/material/list'; +import { MatPaginatorModule } from '@angular/material/paginator'; @Component({ selector: 'app-admin-feed', + standalone: true, + imports: [ + CommonModule, + ReactiveFormsModule, + RouterModule, + AdminBreadcrumbComponent, + MatIconModule, + MatCardModule, + MatButtonModule, + MatFormFieldModule, + MatInputModule, + MatAutocompleteModule, + MatListModule, + MatDividerModule, + MatPaginatorModule + ], templateUrl: './admin-feed.component.html', styleUrls: ['./admin-feed.component.scss'], animations: [ diff --git a/web-app/admin/src/app/admin/admin-feeds/admin-feeds.component.spec.ts b/web-app/admin/src/app/admin/admin-feeds/admin-feeds.component.spec.ts index d2814d31a..01c91504e 100644 --- a/web-app/admin/src/app/admin/admin-feeds/admin-feeds.component.spec.ts +++ b/web-app/admin/src/app/admin/admin-feeds/admin-feeds.component.spec.ts @@ -50,7 +50,7 @@ describe('AdminFeedsComponent', () => { dialog = jasmine.createSpyObj('MatDialog', ['open']); await TestBed.configureTestingModule({ - declarations: [AdminFeedsComponent], + imports: [AdminFeedsComponent], providers: [ { provide: FeedService, useValue: feedService }, { provide: MatDialog, useValue: dialog }, diff --git a/web-app/admin/src/app/admin/admin-feeds/admin-feeds.component.ts b/web-app/admin/src/app/admin/admin-feeds/admin-feeds.component.ts index c30bf3ea8..90081b0e6 100644 --- a/web-app/admin/src/app/admin/admin-feeds/admin-feeds.component.ts +++ b/web-app/admin/src/app/admin/admin-feeds/admin-feeds.component.ts @@ -7,9 +7,38 @@ import { AdminFeedDeleteComponent } from './admin-feed/admin-feed-delete/admin-f import { AdminServiceDeleteComponent } from './admin-service/admin-service-delete/admin-service-delete.component' import { AdminBreadcrumb } from '../admin-breadcrumb/admin-breadcrumb.model' import { AdminUserService } from '../services/admin-user.service' +import { CommonModule } from '@angular/common' +import { FormsModule } from '@angular/forms' +import { MatButtonModule } from '@angular/material/button' +import { MatCardModule } from '@angular/material/card' +import { MatDividerModule } from '@angular/material/divider' +import { MatFormFieldModule } from '@angular/material/form-field' +import { MatIconModule } from '@angular/material/icon' +import { MatInputModule } from '@angular/material/input' +import { MatListModule } from '@angular/material/list' +import { MatPaginatorModule } from '@angular/material/paginator' +import { MatTabsModule } from '@angular/material/tabs' +import { RouterModule } from '@angular/router' +import { AdminBreadcrumbComponent } from '../admin-breadcrumb/admin-breadcrumb.component' @Component({ selector: 'admin-feeds', + standalone: true, + imports: [ + CommonModule, + FormsModule, + RouterModule, + AdminBreadcrumbComponent, + MatCardModule, + MatTabsModule, + MatFormFieldModule, + MatInputModule, + MatIconModule, + MatButtonModule, + MatListModule, + MatDividerModule, + MatPaginatorModule + ], templateUrl: './admin-feeds.component.html', styleUrls: ['./admin-feeds.component.scss'] }) diff --git a/web-app/admin/src/app/admin/admin-feeds/admin-feeds.module.ts b/web-app/admin/src/app/admin/admin-feeds/admin-feeds.module.ts index 51820df6e..85627e86c 100644 --- a/web-app/admin/src/app/admin/admin-feeds/admin-feeds.module.ts +++ b/web-app/admin/src/app/admin/admin-feeds/admin-feeds.module.ts @@ -40,29 +40,31 @@ import { AdminServiceDeleteComponent } from './admin-service/admin-service-delet import { AdminFeedEditTopicConfigurationComponent } from './admin-feed/admin-feed-edit/admin-feed-edit-topic/admin-feed-edit-topic-configuration.component'; import { JsonSchemaModule } from '../../json-schema/json-schema.module'; import { FeedItemSummaryModule } from '../../feed/feed-item/feed-item-summary/feed-item-summary.module'; -import { StaticIconModule } from '@ngageoint/mage.web-core-lib/static-icon' +import { StaticIconModule } from '@ngageoint/mage.web-core-lib/static-icon'; import { RouterModule } from '@angular/router'; @NgModule({ declarations: [ + AdminFeedEditComponent + ], + imports: [ + CommonModule, + FormsModule, + ReactiveFormsModule, + RouterModule, + AdminFeedsComponent, AdminFeedComponent, AdminFeedDeleteComponent, - AdminFeedEditComponent, JsonSchemaWidgetAutocompleteComponent, AdminServiceEditComponent, AdminFeedEditItemPropertiesComponent, AdminFeedEditTopicComponent, AdminFeedEditConfigurationComponent, AdminFeedEditTopicConfigurationComponent, - AdminFeedEditTopicComponent, AdminServiceComponent, - AdminServiceDeleteComponent - ], - imports: [ - FormsModule, - ReactiveFormsModule, - CommonModule, + AdminServiceDeleteComponent, + AdminBreadcrumbModule, MatAutocompleteModule, MatTabsModule, @@ -77,7 +79,6 @@ import { RouterModule } from '@angular/router'; MatRadioModule, MatCheckboxModule, MatInputModule, - MatAutocompleteModule, MatSelectModule, MatSliderModule, MatExpansionModule, @@ -91,13 +92,11 @@ import { RouterModule } from '@angular/router'; FeedItemSummaryModule, JsonSchemaModule, StaticIconModule, - RouterModule, MatSnackBarModule ], exports: [ AdminFeedsComponent, AdminFeedComponent, - AdminFeedEditComponent, AdminServiceEditComponent ] }) diff --git a/web-app/admin/src/app/admin/admin-feeds/admin-service/admin-service-delete/admin-service-delete.component.spec.ts b/web-app/admin/src/app/admin/admin-feeds/admin-service/admin-service-delete/admin-service-delete.component.spec.ts index 63bda8774..96772598d 100644 --- a/web-app/admin/src/app/admin/admin-feeds/admin-service/admin-service-delete/admin-service-delete.component.spec.ts +++ b/web-app/admin/src/app/admin/admin-feeds/admin-service/admin-service-delete/admin-service-delete.component.spec.ts @@ -30,12 +30,11 @@ describe('AdminServiceDeleteComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - imports: [MatDialogModule], + imports: [MatDialogModule, AdminServiceDeleteComponent], providers: [ { provide: MatDialogRef, useValue: {} }, { provide: MAT_DIALOG_DATA, useValue: dialogData } ], - declarations: [AdminServiceDeleteComponent] }).compileComponents(); })); diff --git a/web-app/admin/src/app/admin/admin-feeds/admin-service/admin-service-delete/admin-service-delete.component.ts b/web-app/admin/src/app/admin/admin-feeds/admin-service/admin-service-delete/admin-service-delete.component.ts index 6340955bc..f4d6a482c 100644 --- a/web-app/admin/src/app/admin/admin-feeds/admin-service/admin-service-delete/admin-service-delete.component.ts +++ b/web-app/admin/src/app/admin/admin-feeds/admin-service/admin-service-delete/admin-service-delete.component.ts @@ -1,5 +1,7 @@ +import { CommonModule } from '@angular/common'; import { Component, Inject } from '@angular/core'; -import { MAT_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { MatButtonModule } from '@angular/material/button'; +import { MAT_DIALOG_DATA as MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog'; import { Service, Feed } from '@ngageoint/mage.web-core-lib/feed'; type ServiceWithFeeds = { @@ -9,6 +11,12 @@ type ServiceWithFeeds = { @Component({ selector: 'app-admin-service-delete', + standalone: true, + imports: [ + CommonModule, + MatDialogModule, + MatButtonModule + ], templateUrl: './admin-service-delete.component.html', styleUrls: ['./admin-service-delete.component.scss'] }) diff --git a/web-app/admin/src/app/admin/admin-feeds/admin-service/admin-service-edit/admin-service-edit.component.spec.ts b/web-app/admin/src/app/admin/admin-feeds/admin-service/admin-service-edit/admin-service-edit.component.spec.ts index c8ad25117..e1c88c732 100644 --- a/web-app/admin/src/app/admin/admin-feeds/admin-service/admin-service-edit/admin-service-edit.component.spec.ts +++ b/web-app/admin/src/app/admin/admin-feeds/admin-service/admin-service-edit/admin-service-edit.component.spec.ts @@ -12,7 +12,8 @@ import { describe('AdminServiceEditComponent', () => { @Component({ - selector: 'app-host-component', + standalone: true, + imports: [AdminServiceEditComponent], template: `` }) class TestHostComponent { @@ -57,7 +58,7 @@ describe('AdminServiceEditComponent', () => { ]); await TestBed.configureTestingModule({ - declarations: [TestHostComponent, AdminServiceEditComponent], + imports: [TestHostComponent, AdminServiceEditComponent], providers: [{ provide: FeedService, useValue: feedService }], schemas: [NO_ERRORS_SCHEMA] }).compileComponents(); diff --git a/web-app/admin/src/app/admin/admin-feeds/admin-service/admin-service-edit/admin-service-edit.component.ts b/web-app/admin/src/app/admin/admin-feeds/admin-service/admin-service-edit/admin-service-edit.component.ts index 7d7e6ce55..e8b4e7654 100644 --- a/web-app/admin/src/app/admin/admin-feeds/admin-service/admin-service-edit/admin-service-edit.component.ts +++ b/web-app/admin/src/app/admin/admin-feeds/admin-service/admin-service-edit/admin-service-edit.component.ts @@ -1,10 +1,27 @@ import { Component, EventEmitter, Input, OnChanges, OnInit, Output } from '@angular/core'; -import { UntypedFormControl } from '@angular/forms'; +import { FormsModule, ReactiveFormsModule, UntypedFormControl } from '@angular/forms'; import { forkJoin } from 'rxjs'; import { Service, ServiceType, FeedService } from '@ngageoint/mage.web-core-lib/feed'; +import { CommonModule } from '@angular/common'; +import { MatExpansionModule } from '@angular/material/expansion'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatSelectModule } from '@angular/material/select'; +import { JsonSchemaModule } from 'admin/src/app/json-schema/json-schema.module'; +import { NgxMatSelectSearchModule } from 'ngx-mat-select-search'; @Component({ selector: 'app-create-service', + standalone: true, + imports: [ + CommonModule, + FormsModule, + ReactiveFormsModule, + MatExpansionModule, + MatFormFieldModule, + MatSelectModule, + NgxMatSelectSearchModule, + JsonSchemaModule + ], templateUrl: './admin-service-edit.component.html', styleUrls: ['./admin-service-edit.component.scss'] }) diff --git a/web-app/admin/src/app/admin/admin-feeds/admin-service/admin-service.component.scss b/web-app/admin/src/app/admin/admin-feeds/admin-service/admin-service.component.scss index 46407fd61..6f20eed36 100644 --- a/web-app/admin/src/app/admin/admin-feeds/admin-service/admin-service.component.scss +++ b/web-app/admin/src/app/admin/admin-feeds/admin-service/admin-service.component.scss @@ -39,7 +39,7 @@ } .heading__icon { - color: mat.get-color-from-palette($app-primary); + color: mat.m2-get-color-from-palette($app-primary); margin-right: 16px; font-size: 40px; height: 40px; @@ -116,5 +116,5 @@ } mat-card-header { - color: mat.get-color-from-palette($app-primary); + color: mat.m2-get-color-from-palette($app-primary); } \ No newline at end of file diff --git a/web-app/admin/src/app/admin/admin-feeds/admin-service/admin-service.component.spec.ts b/web-app/admin/src/app/admin/admin-feeds/admin-service/admin-service.component.spec.ts index eb0967a0a..299761689 100644 --- a/web-app/admin/src/app/admin/admin-feeds/admin-service/admin-service.component.spec.ts +++ b/web-app/admin/src/app/admin/admin-feeds/admin-service/admin-service.component.spec.ts @@ -82,7 +82,7 @@ describe('AdminServiceComponent', () => { dialog = jasmine.createSpyObj('MatDialog', ['open']); await TestBed.configureTestingModule({ - declarations: [AdminServiceComponent], + imports: [AdminServiceComponent], providers: [ { provide: FeedService, useValue: feedService }, { provide: AdminUserService, useValue: adminUserService }, @@ -111,7 +111,7 @@ describe('AdminServiceComponent', () => { TestBed.resetTestingModule(); TestBed.configureTestingModule({ - declarations: [AdminServiceComponent], + imports: [AdminServiceComponent], providers: [ { provide: FeedService, useValue: feedService }, { provide: AdminUserService, useValue: adminUserService }, diff --git a/web-app/admin/src/app/admin/admin-feeds/admin-service/admin-service.component.ts b/web-app/admin/src/app/admin/admin-feeds/admin-service/admin-service.component.ts index ef764adda..1fe05d930 100644 --- a/web-app/admin/src/app/admin/admin-feeds/admin-service/admin-service.component.ts +++ b/web-app/admin/src/app/admin/admin-feeds/admin-service/admin-service.component.ts @@ -1,5 +1,5 @@ import { Component, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; +import { ActivatedRoute, RouterModule } from '@angular/router'; import { MatDialog as MatDialog } from '@angular/material/dialog'; import { forkJoin } from 'rxjs'; import { @@ -12,9 +12,31 @@ import { import { AdminUserService } from '../../services/admin-user.service'; import { AdminBreadcrumb } from '../../admin-breadcrumb/admin-breadcrumb.model'; import { AdminServiceDeleteComponent } from './admin-service-delete/admin-service-delete.component'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { MatCardModule } from '@angular/material/card'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatIconModule } from '@angular/material/icon'; +import { MatListModule } from '@angular/material/list'; +import { MatPaginatorModule } from '@angular/material/paginator'; +import { JsonSchemaModule } from 'admin/src/app/json-schema/json-schema.module'; +import { AdminBreadcrumbComponent } from '../../admin-breadcrumb/admin-breadcrumb.component'; @Component({ selector: 'app-admin-service', + standalone: true, + imports: [ + CommonModule, + FormsModule, + RouterModule, + AdminBreadcrumbComponent, + MatIconModule, + MatCardModule, + MatListModule, + MatDividerModule, + MatPaginatorModule, + JsonSchemaModule + ], templateUrl: './admin-service.component.html', styleUrls: ['./admin-service.component.scss'] }) diff --git a/web-app/admin/src/app/admin/admin-layers/admin-layers.module.ts b/web-app/admin/src/app/admin/admin-layers/admin-layers.module.ts index 6e7e316a4..438d06bd2 100644 --- a/web-app/admin/src/app/admin/admin-layers/admin-layers.module.ts +++ b/web-app/admin/src/app/admin/admin-layers/admin-layers.module.ts @@ -26,40 +26,34 @@ import { ImageryLayerSettingsComponent } from './imagery-layer-settings/imagery- import { RouterModule } from '@angular/router'; @NgModule({ - declarations: [ - LayerDashboardComponent, - CreateLayerDialogComponent, - LayerDetailsComponent, - DeleteLayerComponent, - LayerPreviewComponent, - ImageryLayerSettingsComponent, - ], - imports: [ - CommonModule, - FormsModule, - ReactiveFormsModule, - MatDialogModule, - MatButtonModule, - MatPaginatorModule, - MatTableModule, - MatIconModule, - MatSelectModule, - MatFormFieldModule, - MatTooltipModule, - MatCardModule, - MatDividerModule, - MatProgressBarModule, - MatProgressSpinnerModule, - MatInputModule, - CoreModule, - AdminBreadcrumbModule, - RouterModule - ], - providers: [ - LayersService - ], - exports: [ - LayerDashboardComponent - ] + imports: [ + LayerDashboardComponent, + CreateLayerDialogComponent, + LayerDetailsComponent, + DeleteLayerComponent, + LayerPreviewComponent, + ImageryLayerSettingsComponent, + CommonModule, + FormsModule, + ReactiveFormsModule, + MatDialogModule, + MatButtonModule, + MatPaginatorModule, + MatTableModule, + MatIconModule, + MatSelectModule, + MatFormFieldModule, + MatTooltipModule, + MatCardModule, + MatDividerModule, + MatProgressBarModule, + MatProgressSpinnerModule, + MatInputModule, + CoreModule, + AdminBreadcrumbModule, + RouterModule + ], + providers: [LayersService], + exports: [LayerDashboardComponent] }) -export class AdminLayersModule { } +export class AdminLayersModule {} diff --git a/web-app/admin/src/app/admin/admin-layers/create-layer/create-layer.component.ts b/web-app/admin/src/app/admin/admin-layers/create-layer/create-layer.component.ts index 898b278bb..e9ff096df 100644 --- a/web-app/admin/src/app/admin/admin-layers/create-layer/create-layer.component.ts +++ b/web-app/admin/src/app/admin/admin-layers/create-layer/create-layer.component.ts @@ -1,20 +1,38 @@ import { Component, Inject } from '@angular/core'; -import { MatDialogRef as MatDialogRef, MAT_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { MatDialogRef as MatDialogRef, MAT_DIALOG_DATA as MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog'; import { FormBuilder, FormGroup, Validators, AbstractControl, ValidationErrors, - AsyncValidatorFn + AsyncValidatorFn, + ReactiveFormsModule, + FormsModule } from '@angular/forms'; import { LayersService, Layer } from '../layers.service'; import { Observable, of } from 'rxjs'; import { map, catchError, debounceTime, first } from 'rxjs/operators'; -import { ImageryLayerConfig } from '../imagery-layer-settings/imagery-layer-settings.component'; +import { ImageryLayerConfig, ImageryLayerSettingsComponent } from '../imagery-layer-settings/imagery-layer-settings.component'; +import { CommonModule } from '@angular/common'; +import { MatButtonModule } from '@angular/material/button'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatSelectModule } from '@angular/material/select'; @Component({ - selector: 'mage-admin-layer-create', + selector: 'mage-admin-layer-create',standalone: true, + imports: [ + CommonModule, + FormsModule, + ReactiveFormsModule, + MatButtonModule, + MatDialogModule, + MatFormFieldModule, + MatInputModule, + MatSelectModule, + ImageryLayerSettingsComponent + ], templateUrl: './create-layer.component.html', styleUrls: ['./create-layer.component.scss'] }) diff --git a/web-app/admin/src/app/admin/admin-layers/dashboard/layer-dashboard.component.spec.ts b/web-app/admin/src/app/admin/admin-layers/dashboard/layer-dashboard.component.spec.ts index 79e3b353e..0133ed313 100644 --- a/web-app/admin/src/app/admin/admin-layers/dashboard/layer-dashboard.component.spec.ts +++ b/web-app/admin/src/app/admin/admin-layers/dashboard/layer-dashboard.component.spec.ts @@ -68,8 +68,7 @@ describe('LayerDashboardComponent', () => { ); await TestBed.configureTestingModule({ - imports: [RouterTestingModule, MatPaginatorModule, NoopAnimationsModule], - declarations: [LayerDashboardComponent], + imports: [RouterTestingModule, MatPaginatorModule, NoopAnimationsModule, LayerDashboardComponent], providers: [ { provide: LayersService, useValue: mockLayersService }, { provide: MatDialog, useValue: mockDialog }, diff --git a/web-app/admin/src/app/admin/admin-layers/dashboard/layer-dashboard.component.ts b/web-app/admin/src/app/admin/admin-layers/dashboard/layer-dashboard.component.ts index e59bb1e6e..d2bc838b4 100644 --- a/web-app/admin/src/app/admin/admin-layers/dashboard/layer-dashboard.component.ts +++ b/web-app/admin/src/app/admin/admin-layers/dashboard/layer-dashboard.component.ts @@ -1,16 +1,40 @@ import { Component, OnInit, HostListener } from '@angular/core'; import { MatDialog as MatDialog } from '@angular/material/dialog'; -import { PageEvent as PageEvent } from '@angular/material/paginator'; -import { Router, ActivatedRoute } from '@angular/router'; +import { + MatPaginatorModule, + PageEvent as PageEvent +} from '@angular/material/paginator'; +import { Router, ActivatedRoute, RouterModule } from '@angular/router'; import { LayersService, Layer } from '../layers.service'; import { AdminBreadcrumb } from '../../admin-breadcrumb/admin-breadcrumb.model'; import { CreateLayerDialogComponent } from '../create-layer/create-layer.component'; import { AdminUserService } from '../../services/admin-user.service'; import { AdminToastService } from '../../services/admin-toast.service'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { AdminBreadcrumbModule } from '../../admin-breadcrumb/admin-breadcrumb.module'; +import { CardNavbarComponent } from 'admin/src/app/core/card-navbar/card-navbar.component'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatSelectModule } from '@angular/material/select'; +import { MatTableModule } from '@angular/material/table'; +import { MatTooltipModule } from '@angular/material/tooltip'; @Component({ selector: 'mage-layer-dashboard', + standalone: true, + imports: [ + CommonModule, + FormsModule, + RouterModule, + AdminBreadcrumbModule, + CardNavbarComponent, + MatFormFieldModule, + MatSelectModule, + MatTableModule, + MatTooltipModule, + MatPaginatorModule + ], templateUrl: './layer-dashboard.component.html', styleUrls: ['./layer-dashboard.component.scss'] }) @@ -82,7 +106,7 @@ export class LayerDashboardComponent implements OnInit { private applyFilters(): void { const term = this.layerSearch.trim().toLowerCase(); - this.filteredLayers = (this.layers ?? []).filter(layer => { + this.filteredLayers = (this.layers ?? []).filter((layer) => { const matchesSearch = !term || (layer.name ?? '').toLowerCase().includes(term) || @@ -119,9 +143,9 @@ export class LayerDashboardComponent implements OnInit { getTypeCount(type: 'all' | 'online' | 'offline'): number { if (type === 'all') return this.filteredLayers.length; if (type === 'online') { - return this.filteredLayers.filter(l => l.type === 'Imagery').length; + return this.filteredLayers.filter((l) => l.type === 'Imagery').length; } - return this.filteredLayers.filter(l => l.type !== 'Imagery').length; + return this.filteredLayers.filter((l) => l.type !== 'Imagery').length; } onSearchChanged(): void { @@ -168,7 +192,6 @@ export class LayerDashboardComponent implements OnInit { dialogRef.afterClosed().subscribe((newLayer: Layer | undefined) => { if (!newLayer?.id) return; - this.toastService.show( 'Layer Created', ['../layers', newLayer.id], diff --git a/web-app/admin/src/app/admin/admin-layers/delete-layer/delete-layer.component.ts b/web-app/admin/src/app/admin/admin-layers/delete-layer/delete-layer.component.ts index cb09dc8f4..ac9f2084b 100644 --- a/web-app/admin/src/app/admin/admin-layers/delete-layer/delete-layer.component.ts +++ b/web-app/admin/src/app/admin/admin-layers/delete-layer/delete-layer.component.ts @@ -1,6 +1,7 @@ import { Component, Inject } from '@angular/core'; import { MatDialogRef as MatDialogRef, MAT_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/dialog'; import { LayersService, Layer } from '../layers.service'; +import { CommonModule } from '@angular/common'; /** * Modal component for confirming layer deletion. @@ -8,6 +9,8 @@ import { LayersService, Layer } from '../layers.service'; */ @Component({ selector: 'mage-delete-layer', + standalone: true, + imports: [CommonModule], templateUrl: './delete-layer.component.html', styleUrls: ['./delete-layer.component.scss'] }) diff --git a/web-app/admin/src/app/admin/admin-layers/imagery-layer-settings/imagery-layer-settings.component.ts b/web-app/admin/src/app/admin/admin-layers/imagery-layer-settings/imagery-layer-settings.component.ts index ba885579d..1485e1134 100644 --- a/web-app/admin/src/app/admin/admin-layers/imagery-layer-settings/imagery-layer-settings.component.ts +++ b/web-app/admin/src/app/admin/admin-layers/imagery-layer-settings/imagery-layer-settings.component.ts @@ -1,6 +1,8 @@ import { Component, Input, Output, EventEmitter, ViewChild, ElementRef, OnChanges, SimpleChanges } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import * as L from 'leaflet'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; export interface ImageryLayerConfig { url: string; @@ -12,6 +14,8 @@ export interface ImageryLayerConfig { @Component({ selector: 'mage-imagery-layer-settings', + standalone: true, + imports: [CommonModule, FormsModule], templateUrl: './imagery-layer-settings.component.html', styleUrls: ['./imagery-layer-settings.component.scss'] }) diff --git a/web-app/admin/src/app/admin/admin-layers/layer-details/layer-details.component.spec.ts b/web-app/admin/src/app/admin/admin-layers/layer-details/layer-details.component.spec.ts index 7a986fc2a..68c30995d 100644 --- a/web-app/admin/src/app/admin/admin-layers/layer-details/layer-details.component.spec.ts +++ b/web-app/admin/src/app/admin/admin-layers/layer-details/layer-details.component.spec.ts @@ -5,7 +5,7 @@ import { tick, discardPeriodicTasks } from '@angular/core/testing'; -import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { provideHttpClientTesting } from '@angular/common/http/testing'; import { MatDialogModule as MatDialogModule } from '@angular/material/dialog'; import { MatSnackBarModule as MatSnackBarModule } from '@angular/material/snack-bar'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; @@ -22,6 +22,10 @@ import { AdminUserService } from '../../services/admin-user.service'; import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; import { MatIconModule } from '@angular/material/icon'; import { MatPaginatorModule } from '@angular/material/paginator'; +import { + provideHttpClient, + withInterceptorsFromDi +} from '@angular/common/http'; describe('LayerDetailsComponent', () => { let component: LayerDetailsComponent; @@ -97,24 +101,25 @@ describe('LayerDetailsComponent', () => { buildMocks(); await TestBed.configureTestingModule({ - declarations: [LayerDetailsComponent], + schemas: [CUSTOM_ELEMENTS_SCHEMA], imports: [ - HttpClientTestingModule, MatDialogModule, MatSnackBarModule, NoopAnimationsModule, RouterTestingModule, MatIconModule, - MatPaginatorModule + MatPaginatorModule, + LayerDetailsComponent ], providers: [ { provide: ActivatedRoute, useValue: makeActivatedRoute(params) }, { provide: LayersService, useValue: mockLayersService }, { provide: AdminEventsService, useValue: mockEventsService }, { provide: LocalStorageService, useValue: mockLocalStorageService }, - { provide: AdminUserService, useValue: mockUserService } - ], - schemas: [CUSTOM_ELEMENTS_SCHEMA] + { provide: AdminUserService, useValue: mockUserService }, + provideHttpClient(withInterceptorsFromDi()), + provideHttpClientTesting() + ] }).compileComponents(); fixture = TestBed.createComponent(LayerDetailsComponent); diff --git a/web-app/admin/src/app/admin/admin-layers/layer-details/layer-details.component.ts b/web-app/admin/src/app/admin/admin-layers/layer-details/layer-details.component.ts index cf2bde9e5..df954fa7e 100644 --- a/web-app/admin/src/app/admin/admin-layers/layer-details/layer-details.component.ts +++ b/web-app/admin/src/app/admin/admin-layers/layer-details/layer-details.component.ts @@ -1,9 +1,9 @@ import { Component, OnInit } from '@angular/core'; -import { ActivatedRoute, Router } from '@angular/router'; +import { ActivatedRoute, Router, RouterModule } from '@angular/router'; import { MatDialog as MatDialog } from '@angular/material/dialog'; import { MatSnackBar as MatSnackBar } from '@angular/material/snack-bar'; -import { PageEvent as PageEvent } from '@angular/material/paginator'; -import { MatTableDataSource as MatTableDataSource } from '@angular/material/table'; +import { MatPaginatorModule, PageEvent as PageEvent } from '@angular/material/paginator'; +import { MatTableDataSource as MatTableDataSource, MatTableModule } from '@angular/material/table'; import { HttpClient } from '@angular/common/http'; import { LayersService, Layer } from '../layers.service'; @@ -11,7 +11,7 @@ import { AdminEventsService } from '../../services/admin-events.service'; import { LocalStorageService } from '../../../../../../../web-app/src/app/http/local-storage.service' import { AdminUserService } from '../../services/admin-user.service'; import { AdminBreadcrumb } from '../../admin-breadcrumb/admin-breadcrumb.model'; -import { CardActionButton } from '../../../core/card-navbar/card-navbar.component'; +import { CardActionButton, CardNavbarComponent } from '../../../core/card-navbar/card-navbar.component'; import { SearchModalComponent, SearchModalData, @@ -21,7 +21,13 @@ import { import { DeleteLayerComponent } from '../delete-layer/delete-layer.component'; import { Event } from '../../../../../../src/app/filter/filter.types'; import { Observable } from 'rxjs'; -import { ImageryLayerConfig } from '../imagery-layer-settings/imagery-layer-settings.component'; +import { ImageryLayerConfig, ImageryLayerSettingsComponent } from '../imagery-layer-settings/imagery-layer-settings.component'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { MatIconModule } from '@angular/material/icon'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { AdminBreadcrumbComponent } from '../../admin-breadcrumb/admin-breadcrumb.component'; +import { LayerPreviewComponent } from '../layer-preview/layer-preview.component'; interface UrlLayer { table: string; @@ -50,6 +56,20 @@ interface PagedResult { @Component({ selector: 'mage-layer-details', + standalone: true, + imports: [ + CommonModule, + FormsModule, + RouterModule, + MatProgressSpinnerModule, + MatIconModule, + MatTableModule, + MatPaginatorModule, + AdminBreadcrumbComponent, + ImageryLayerSettingsComponent, + CardNavbarComponent, + LayerPreviewComponent + ], templateUrl: './layer-details.component.html', styleUrls: ['./layer-details.component.scss'] }) diff --git a/web-app/admin/src/app/admin/admin-map/admin-map.component.spec.ts b/web-app/admin/src/app/admin/admin-map/admin-map.component.spec.ts index aee839602..b8a6b8da8 100644 --- a/web-app/admin/src/app/admin/admin-map/admin-map.component.spec.ts +++ b/web-app/admin/src/app/admin/admin-map/admin-map.component.spec.ts @@ -2,7 +2,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { Component, ViewChild } from '@angular/core'; import { MatInputModule as MatInputModule } from '@angular/material/input'; import { By } from '@angular/platform-browser'; -import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { provideHttpClientTesting } from '@angular/common/http/testing'; import { MatSnackBarModule as MatSnackBarModule } from '@angular/material/snack-bar'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { of } from 'rxjs'; @@ -11,9 +11,14 @@ import { FormsModule } from '@angular/forms'; import { AdminMapComponent } from './admin-map.component'; import { MapSettingsService } from '../../../app/map/settings/map.settings.service'; +import { + provideHttpClient, + withInterceptorsFromDi +} from '@angular/common/http'; @Component({ - selector: 'host-component', + standalone: true, + imports: [AdminMapComponent], template: `` }) class TestHostComponent { @@ -44,18 +49,20 @@ describe('AdminMapComponent', () => { mockMapSettingsService.updateMapSettings.and.returnValue(of({} as any)); await TestBed.configureTestingModule({ + schemas: [CUSTOM_ELEMENTS_SCHEMA], imports: [ MatInputModule, MatSnackBarModule, - HttpClientTestingModule, NoopAnimationsModule, - FormsModule + FormsModule, + AdminMapComponent, + TestHostComponent ], - declarations: [AdminMapComponent, TestHostComponent], providers: [ - { provide: MapSettingsService, useValue: mockMapSettingsService } - ], - schemas: [CUSTOM_ELEMENTS_SCHEMA] + { provide: MapSettingsService, useValue: mockMapSettingsService }, + provideHttpClient(withInterceptorsFromDi()), + provideHttpClientTesting() + ] }).compileComponents(); }); diff --git a/web-app/admin/src/app/admin/admin-map/admin-map.component.ts b/web-app/admin/src/app/admin/admin-map/admin-map.component.ts index 8a24fc9c9..d6fff2e61 100644 --- a/web-app/admin/src/app/admin/admin-map/admin-map.component.ts +++ b/web-app/admin/src/app/admin/admin-map/admin-map.component.ts @@ -4,12 +4,21 @@ import { MatSnackBar as MatSnackBar } from '@angular/material/snack-bar'; import { AdminBreadcrumb } from '../admin-breadcrumb/admin-breadcrumb.model'; import { MapSettingsService } from '../../../app/map/settings/map.settings.service'; import { MapSettings } from '../../../app/entities/map/entities.map'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { AdminBreadcrumbComponent } from '../admin-breadcrumb/admin-breadcrumb.component'; type MobileSearchType = 'NONE' | 'NATIVE' | 'NOMINATIM'; type WebSearchType = 'NONE' | 'NOMINATIM'; @Component({ selector: 'mage-admin-map', + standalone: true, + imports: [ + CommonModule, + FormsModule, + AdminBreadcrumbComponent + ], templateUrl: './admin-map.component.html', styleUrls: ['./admin-map.component.scss'] }) diff --git a/web-app/admin/src/app/admin/admin-nav/admin-nav.spec.ts b/web-app/admin/src/app/admin/admin-nav/admin-nav.spec.ts index e685bb780..37da5e65d 100644 --- a/web-app/admin/src/app/admin/admin-nav/admin-nav.spec.ts +++ b/web-app/admin/src/app/admin/admin-nav/admin-nav.spec.ts @@ -25,7 +25,7 @@ describe('AdminNavComponent', () => { mockUserService.hasPermission.and.callFake((perm: string) => perm === 'UPDATE_SETTINGS') TestBed.configureTestingModule({ - declarations: [AdminNavComponent], + imports: [AdminNavComponent], providers: [ { provide: AdminUserService, useValue: mockUserService }, { provide: Router, useValue: mockRouter } diff --git a/web-app/admin/src/app/admin/admin-nav/admin-nav.ts b/web-app/admin/src/app/admin/admin-nav/admin-nav.ts index e558bb9df..2389baebc 100644 --- a/web-app/admin/src/app/admin/admin-nav/admin-nav.ts +++ b/web-app/admin/src/app/admin/admin-nav/admin-nav.ts @@ -8,9 +8,11 @@ import { OnDestroy, OnChanges } from '@angular/core'; -import { Router } from '@angular/router'; +import { Router, RouterModule } from '@angular/router'; import { AdminUserService } from '../services/admin-user.service'; import { Subject, takeUntil } from 'rxjs'; +import { CommonModule } from '@angular/common'; +import { AdminBreadcrumbComponent } from '../admin-breadcrumb/admin-breadcrumb.component'; interface PluginTab { id: string; @@ -21,6 +23,12 @@ interface PluginTab { @Component({ selector: 'app-admin-side-nav', + standalone: true, + imports: [ + CommonModule, + RouterModule, + AdminBreadcrumbComponent + ], templateUrl: './admin-nav.html', styleUrls: ['./admin-nav.scss'], host: { diff --git a/web-app/admin/src/app/admin/admin-plugins/host/plugins-host.component.ts b/web-app/admin/src/app/admin/admin-plugins/host/plugins-host.component.ts index 84ce65d78..64e7b650b 100644 --- a/web-app/admin/src/app/admin/admin-plugins/host/plugins-host.component.ts +++ b/web-app/admin/src/app/admin/admin-plugins/host/plugins-host.component.ts @@ -6,14 +6,22 @@ import { ViewChild, ViewContainerRef } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; +import { ActivatedRoute, RouterModule } from '@angular/router'; import { Subject, takeUntil } from 'rxjs'; import { PluginService } from '../../../plugin/plugin.service'; import { AdminBreadcrumb } from '../../admin-breadcrumb/admin-breadcrumb.model'; +import { CommonModule } from '@angular/common'; +import { AdminBreadcrumbComponent } from '../../admin-breadcrumb/admin-breadcrumb.component'; @Component({ selector: 'mage-plugins-host', + standalone: true, + imports: [ + CommonModule, + RouterModule, + AdminBreadcrumbComponent + ], templateUrl: './plugins-host.component.html', styleUrls: ['./plugins-host.component.scss'] }) diff --git a/web-app/admin/src/app/admin/admin-plugins/plugins.component.ts b/web-app/admin/src/app/admin/admin-plugins/plugins.component.ts index c18c925b1..d2203f7ab 100644 --- a/web-app/admin/src/app/admin/admin-plugins/plugins.component.ts +++ b/web-app/admin/src/app/admin/admin-plugins/plugins.component.ts @@ -1,5 +1,8 @@ import { Component, OnInit } from '@angular/core'; import { PluginService, PluginsById } from '../../plugin/plugin.service'; +import { CommonModule } from '@angular/common'; +import { RouterModule } from '@angular/router'; +import { template } from 'lodash'; export interface AdminPluginListItem { id: string; @@ -9,6 +12,11 @@ export interface AdminPluginListItem { @Component({ selector: 'mage-plugins', + standalone: true, + imports: [ + CommonModule, + RouterModule + ], templateUrl: './plugins.component.html', styleUrls: ['./plugins.component.scss'] }) diff --git a/web-app/admin/src/app/admin/admin-plugins/plugins.module.ts b/web-app/admin/src/app/admin/admin-plugins/plugins.module.ts index 40dfb0583..e233ae68a 100644 --- a/web-app/admin/src/app/admin/admin-plugins/plugins.module.ts +++ b/web-app/admin/src/app/admin/admin-plugins/plugins.module.ts @@ -6,8 +6,9 @@ import { CommonModule } from '@angular/common'; import { AdminBreadcrumbModule } from '../admin-breadcrumb/admin-breadcrumb.module'; @NgModule({ - declarations: [PluginsComponent, PluginHostComponent], imports: [ + PluginsComponent, + PluginHostComponent, CommonModule, AdminBreadcrumbModule, RouterModule.forChild([{ path: '', component: PluginsComponent }]) diff --git a/web-app/admin/src/app/admin/admin-settings/admin-settings-unsaved/admin-settings-unsaved.component.scss b/web-app/admin/src/app/admin/admin-settings/admin-settings-unsaved/admin-settings-unsaved.component.scss index cfcc36009..0110bfa0d 100644 --- a/web-app/admin/src/app/admin/admin-settings/admin-settings-unsaved/admin-settings-unsaved.component.scss +++ b/web-app/admin/src/app/admin/admin-settings/admin-settings-unsaved/admin-settings-unsaved.component.scss @@ -15,5 +15,5 @@ } .dialog-actions button { - color: mat.get-color-from-palette($app-primary); + color: mat.m2-get-color-from-palette($app-primary); } \ No newline at end of file diff --git a/web-app/admin/src/app/admin/admin-settings/admin-settings-unsaved/admin-settings-unsaved.component.spec.ts b/web-app/admin/src/app/admin/admin-settings/admin-settings-unsaved/admin-settings-unsaved.component.spec.ts index f76631f02..c73617289 100644 --- a/web-app/admin/src/app/admin/admin-settings/admin-settings-unsaved/admin-settings-unsaved.component.spec.ts +++ b/web-app/admin/src/app/admin/admin-settings/admin-settings-unsaved/admin-settings-unsaved.component.spec.ts @@ -16,7 +16,7 @@ describe('AdminSettingsUnsavedComponent', () => { >('MatDialogRef', ['close']); await TestBed.configureTestingModule({ - declarations: [AdminSettingsUnsavedComponent], + imports: [AdminSettingsUnsavedComponent], providers: [{ provide: MatDialogRef, useValue: dialogRef }], schemas: [CUSTOM_ELEMENTS_SCHEMA] }).compileComponents(); diff --git a/web-app/admin/src/app/admin/admin-settings/admin-settings-unsaved/admin-settings-unsaved.component.ts b/web-app/admin/src/app/admin/admin-settings/admin-settings-unsaved/admin-settings-unsaved.component.ts index 5ea384790..42005d1cb 100644 --- a/web-app/admin/src/app/admin/admin-settings/admin-settings-unsaved/admin-settings-unsaved.component.ts +++ b/web-app/admin/src/app/admin/admin-settings/admin-settings-unsaved/admin-settings-unsaved.component.ts @@ -1,8 +1,14 @@ +import { CommonModule } from '@angular/common'; import { Component, NgZone } from '@angular/core' -import { MatDialogRef as MatDialogRef } from '@angular/material/dialog'; +import { MatDialogModule, MatDialogRef as MatDialogRef } from '@angular/material/dialog'; @Component({ selector: 'admin-settings-unsaved', + standalone: true, + imports: [ + CommonModule, + MatDialogModule + ], templateUrl: './admin-settings-unsaved.component.html', styleUrls: ['./admin-settings-unsaved.component.scss'] }) diff --git a/web-app/admin/src/app/admin/admin-settings/admin-settings.component.spec.ts b/web-app/admin/src/app/admin/admin-settings/admin-settings.component.spec.ts index b8e3695cb..fca699e19 100644 --- a/web-app/admin/src/app/admin/admin-settings/admin-settings.component.spec.ts +++ b/web-app/admin/src/app/admin/admin-settings/admin-settings.component.spec.ts @@ -1,52 +1,23 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { - MatSnackBar as MatSnackBar, - MatSnackBarModule as MatSnackBarModule -} from '@angular/material/snack-bar'; -import { - MatDialog as MatDialog, - MatDialogModule as MatDialogModule -} from '@angular/material/dialog'; import { of } from 'rxjs'; -import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; -import { MatTabsModule } from '@angular/material/tabs'; -import { MatIconModule } from '@angular/material/icon'; +import { MatSnackBar } from '@angular/material/snack-bar'; +import { MatDialog } from '@angular/material/dialog'; import { AdminSettingsComponent } from './admin-settings.component'; import { AdminSettingsUnsavedComponent } from './admin-settings-unsaved/admin-settings-unsaved.component'; describe('AdminSettingsComponent', () => { let component: AdminSettingsComponent; - let fixture: ComponentFixture; let dialog: jasmine.SpyObj; let snackBar: jasmine.SpyObj; - beforeEach(waitForAsync(() => { + beforeEach(() => { dialog = jasmine.createSpyObj('MatDialog', ['open']); snackBar = jasmine.createSpyObj('MatSnackBar', ['open']); - TestBed.configureTestingModule({ - imports: [ - NoopAnimationsModule, - MatDialogModule, - MatSnackBarModule, - MatTabsModule, - MatIconModule - ], - declarations: [AdminSettingsComponent], - providers: [ - { provide: MatDialog, useValue: dialog }, - { provide: MatSnackBar, useValue: snackBar } - ], - schemas: [CUSTOM_ELEMENTS_SCHEMA] - }).compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(AdminSettingsComponent); - component = fixture.componentInstance; - fixture.detectChanges(); + component = new (AdminSettingsComponent as any)( + dialog, + snackBar + ) as AdminSettingsComponent; }); it('should create', () => { @@ -55,7 +26,9 @@ describe('AdminSettingsComponent', () => { it('save should reset onSave object', () => { const prev = component.onSave; + component.save(); + expect(component.onSave).not.toBe(prev); }); @@ -64,32 +37,39 @@ describe('AdminSettingsComponent', () => { component.isDisclaimerDirty = false; component.isAuthenticationDirty = false; component.isContactInfoDirty = false; + expect(component.isDirty()).toBe(false); }); it('isDirty should return true when any dirty', () => { component.isContactInfoDirty = true; + expect(component.isDirty()).toBe(true); }); it('onBannerDirty should set flag', () => { component.onBannerDirty(true); + expect(component.isBannerDirty).toBe(true); }); it('onDisclaimerDirty should set flag', () => { component.onDisclaimerDirty(true); + expect(component.isDisclaimerDirty).toBe(true); }); it('onContactInfoDirty should set flag', () => { component.onContactInfoDirty(true); + expect(component.isContactInfoDirty).toBe(true); }); it('onBannerSaved should show success snack and clear dirty', () => { component.isBannerDirty = true; + component.onBannerSaved(true); + expect(snackBar.open).toHaveBeenCalledWith( 'Banner successfully saved', undefined, @@ -100,7 +80,9 @@ describe('AdminSettingsComponent', () => { it('onBannerSaved should show failure snack and clear dirty', () => { component.isBannerDirty = true; + component.onBannerSaved(false); + expect(snackBar.open).toHaveBeenCalledWith( 'Failed to save banner', undefined, @@ -111,7 +93,9 @@ describe('AdminSettingsComponent', () => { it('onDisclaimerSaved should show success snack and clear dirty', () => { component.isDisclaimerDirty = true; + component.onDisclaimerSaved(true); + expect(snackBar.open).toHaveBeenCalledWith( 'Disclaimer successfully saved', undefined, @@ -122,7 +106,9 @@ describe('AdminSettingsComponent', () => { it('onDisclaimerSaved should show failure snack and clear dirty', () => { component.isDisclaimerDirty = true; + component.onDisclaimerSaved(false); + expect(snackBar.open).toHaveBeenCalledWith( 'Failed to save disclaimer', undefined, @@ -133,7 +119,9 @@ describe('AdminSettingsComponent', () => { it('onContactInfoSaved should show success snack and clear dirty', () => { component.isContactInfoDirty = true; + component.onContactInfoSaved(true); + expect(snackBar.open).toHaveBeenCalledWith( 'Contact info successfully saved', undefined, @@ -144,7 +132,9 @@ describe('AdminSettingsComponent', () => { it('onContactInfoSaved should show failure snack and clear dirty', () => { component.isContactInfoDirty = true; + component.onContactInfoSaved(false); + expect(snackBar.open).toHaveBeenCalledWith( 'Failed to save contact info', undefined, diff --git a/web-app/admin/src/app/admin/admin-settings/admin-settings.component.ts b/web-app/admin/src/app/admin/admin-settings/admin-settings.component.ts index 2dca0b079..4ca03d61f 100644 --- a/web-app/admin/src/app/admin/admin-settings/admin-settings.component.ts +++ b/web-app/admin/src/app/admin/admin-settings/admin-settings.component.ts @@ -4,9 +4,24 @@ import { MatSnackBar as MatSnackBar } from '@angular/material/snack-bar'; import { MatDialog as MatDialog } from '@angular/material/dialog'; import { AdminSettingsUnsavedComponent } from './admin-settings-unsaved/admin-settings-unsaved.component'; import { lastValueFrom } from 'rxjs'; +import { CommonModule } from '@angular/common'; +import { MatTabsModule } from '@angular/material/tabs'; +import { AdminBreadcrumbComponent } from '../admin-breadcrumb/admin-breadcrumb.component'; +import { ContactInfoComponent, SecurityBannerComponent, SecurityDisclaimerComponent } from './admin-settings'; +import { MatIconModule } from '@angular/material/icon'; @Component({ selector: 'admin-settings', + standalone: true, + imports: [ + CommonModule, + MatTabsModule, + MatIconModule, + AdminBreadcrumbComponent, + SecurityBannerComponent, + SecurityDisclaimerComponent, + ContactInfoComponent + ], templateUrl: 'admin-settings.component.html', styleUrls: ['./admin-settings.component.scss'] }) diff --git a/web-app/admin/src/app/admin/admin-settings/contact-info/contact-info.component.scss b/web-app/admin/src/app/admin/admin-settings/contact-info/contact-info.component.scss index ce3de141c..5dd34018b 100644 --- a/web-app/admin/src/app/admin/admin-settings/contact-info/contact-info.component.scss +++ b/web-app/admin/src/app/admin/admin-settings/contact-info/contact-info.component.scss @@ -26,7 +26,7 @@ .section-icon, .contact-info mat-icon, .contact-info-toggle button mat-icon { - color: mat.get-color-from-palette($app-primary); + color: mat.m2-get-color-from-palette($app-primary); } .contact-info-toggle { @@ -81,7 +81,7 @@ color: rgba(0, 0, 0, 0.75); a { - color: mat.get-color-from-palette($app-primary); + color: mat.m2-get-color-from-palette($app-primary); text-decoration: none; &:hover { diff --git a/web-app/admin/src/app/admin/admin-settings/contact-info/contact-info.component.spec.ts b/web-app/admin/src/app/admin/admin-settings/contact-info/contact-info.component.spec.ts index 034c71ce6..7e1119c92 100644 --- a/web-app/admin/src/app/admin/admin-settings/contact-info/contact-info.component.spec.ts +++ b/web-app/admin/src/app/admin/admin-settings/contact-info/contact-info.component.spec.ts @@ -6,7 +6,7 @@ import { tick } from '@angular/core/testing'; import { ContactInfoComponent } from './contact-info.component'; -import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { provideHttpClientTesting } from '@angular/common/http/testing'; import { SimpleChange } from '@angular/core'; import { of, throwError } from 'rxjs'; import { SettingsService } from 'admin/src/app/services/settings.service'; @@ -17,6 +17,10 @@ import { MatCheckboxModule } from '@angular/material/checkbox'; import { MatIconModule } from '@angular/material/icon'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { MatMenuModule } from '@angular/material/menu'; +import { + provideHttpClient, + withInterceptorsFromDi +} from '@angular/common/http'; const MOCK_CONTACT_INFO = { phone: '123-456-7890', @@ -50,16 +54,19 @@ describe('ContactInfoComponent', () => { TestBed.configureTestingModule({ imports: [ NoopAnimationsModule, - HttpClientTestingModule, MatMenuModule, FormsModule, MatFormFieldModule, MatCheckboxModule, MatInputModule, - MatIconModule + MatIconModule, + ContactInfoComponent ], - declarations: [ContactInfoComponent], - providers: [{ provide: SettingsService, useClass: MockSettingsService }] + providers: [ + { provide: SettingsService, useClass: MockSettingsService }, + provideHttpClient(withInterceptorsFromDi()), + provideHttpClientTesting() + ] }).compileComponents(); })); diff --git a/web-app/admin/src/app/admin/admin-settings/contact-info/contact-info.component.ts b/web-app/admin/src/app/admin/admin-settings/contact-info/contact-info.component.ts index 759bdea2f..9a7e33a17 100644 --- a/web-app/admin/src/app/admin/admin-settings/contact-info/contact-info.component.ts +++ b/web-app/admin/src/app/admin/admin-settings/contact-info/contact-info.component.ts @@ -9,9 +9,28 @@ import { } from '@angular/core'; import { SettingsService } from '../../../../../src/app/services/settings.service'; import { take } from 'rxjs/operators'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCheckboxModule } from '@angular/material/checkbox'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { MatMenuModule } from '@angular/material/menu'; @Component({ selector: 'contact-info', + standalone: true, + imports: [ + CommonModule, + FormsModule, + MatFormFieldModule, + MatInputModule, + MatIconModule, + MatCheckboxModule, + MatMenuModule, + MatButtonModule + ], templateUrl: 'contact-info.component.html', styleUrls: ['./contact-info.component.scss'] }) diff --git a/web-app/admin/src/app/admin/admin-settings/security-banner/security-banner.component.spec.ts b/web-app/admin/src/app/admin/admin-settings/security-banner/security-banner.component.spec.ts index 0312a740b..cfdf64eb2 100644 --- a/web-app/admin/src/app/admin/admin-settings/security-banner/security-banner.component.spec.ts +++ b/web-app/admin/src/app/admin/admin-settings/security-banner/security-banner.component.spec.ts @@ -1,101 +1,116 @@ -import { Component, EventEmitter, Input } from '@angular/core'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { of } from 'rxjs'; +import { fakeAsync, tick } from '@angular/core/testing'; +import { of, throwError } from 'rxjs'; -import { SecurityBannerComponent } from './security-banner.component'; import { SettingsService } from 'admin/src/app/services/settings.service'; +import { SecurityDisclaimerComponent } from '../admin-settings'; -@Component({ - selector: 'color-picker', - template: '' -}) -class MockColorPickerComponent { - @Input() hexColor: string = ''; - onColorChanged = new EventEmitter<{ color: string }>(); - - updateColor(): void {} -} - -class MockSettingsService { - get = jasmine.createSpy('get').and.returnValue( - of({ - type: 'banner', - settings: { - headerTextColor: '#000000', - headerText: '', - headerBackgroundColor: '#FFFFFF', - footerTextColor: '#000000', - footerText: '', - footerBackgroundColor: '#FFFFFF', - showHeader: false, - showFooter: false - } - }) - ); - - update = jasmine.createSpy('update').and.returnValue(of({})); -} - -describe('SecurityBannerComponent', () => { - let component: SecurityBannerComponent; - let fixture: ComponentFixture; - let settingsService: MockSettingsService; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [NoopAnimationsModule], - declarations: [SecurityBannerComponent, MockColorPickerComponent], - providers: [{ provide: SettingsService, useClass: MockSettingsService }] - }) - .overrideTemplate( - SecurityBannerComponent, - ` - - - - - ` - ) - .compileComponents(); - })); +describe('SecurityDisclaimerComponent', () => { + let component: SecurityDisclaimerComponent; + let settingsService: jasmine.SpyObj; + + function createComponent(): void { + settingsService = jasmine.createSpyObj('SettingsService', [ + 'get', + 'update' + ]); + + settingsService.get.and.returnValue( + of({ + settings: { + show: true, + title: 'T', + text: 'X' + } + }) + ); + + settingsService.update.and.returnValue(of({})); + + component = new SecurityDisclaimerComponent(settingsService); + component.ngOnInit(); + } beforeEach(() => { - fixture = TestBed.createComponent(SecurityBannerComponent); - component = fixture.componentInstance; - settingsService = TestBed.inject( - SettingsService - ) as unknown as MockSettingsService; - fixture.detectChanges(); + createComponent(); }); it('should create', () => { expect(component).toBeTruthy(); }); - it('should load banner settings on init', () => { - expect(settingsService.get).toHaveBeenCalledWith('banner'); - expect(component.banner).toEqual({ - headerTextColor: '#000000', - headerText: '', - headerBackgroundColor: '#FFFFFF', - footerTextColor: '#000000', - footerText: '', - footerBackgroundColor: '#FFFFFF', - showHeader: false, - showFooter: false - }); + it('should load disclaimer settings on init', () => { + expect(settingsService.get).toHaveBeenCalledWith('disclaimer'); + + expect(component.disclaimer).toEqual( + jasmine.objectContaining({ + show: true, + title: 'T', + text: 'X' + }) + ); }); - it('should initialize pickers with loaded values and update banner on color change', () => { - expect(component.isDirty).toBe(false); + it('should save when dirty and beginSave changes', fakeAsync(() => { + component.setDirty(true); + settingsService.update.calls.reset(); - const dirtySpy = spyOn(component.onDirty, 'emit'); + component.ngOnChanges({ + beginSave: { + currentValue: {}, + previousValue: null, + firstChange: false, + isFirstChange: () => false + } + } as any); - component.headerTextColorPicker?.onColorChanged.emit({ color: '#111111' }); + tick(); - expect(component.banner.headerTextColor).toBe('#111111'); - expect(component.isDirty).toBe(true); - expect(dirtySpy).toHaveBeenCalledWith(true); - }); -}); + expect(settingsService.update).toHaveBeenCalledWith( + 'disclaimer', + component.disclaimer + ); + expect(component.isDirty).toBeFalse(); + })); + + it('should emit saveComplete true on successful save', fakeAsync(() => { + const emitSpy = spyOn(component.saveComplete, 'emit'); + + component.setDirty(true); + + component.ngOnChanges({ + beginSave: { + currentValue: {}, + previousValue: null, + firstChange: false, + isFirstChange: () => false + } + } as any); + + tick(); + + expect(emitSpy).toHaveBeenCalledWith(true); + })); + + it('should emit saveComplete false on save error', fakeAsync(() => { + const emitSpy = spyOn(component.saveComplete, 'emit'); + + settingsService.update.and.returnValue( + throwError(() => ({ error: 'nope' })) + ); + + component.setDirty(true); + + component.ngOnChanges({ + beginSave: { + currentValue: {}, + previousValue: null, + firstChange: false, + isFirstChange: () => false + } + } as any); + + tick(); + + expect(emitSpy).toHaveBeenCalledWith(false); + })); +}); \ No newline at end of file diff --git a/web-app/admin/src/app/admin/admin-settings/security-banner/security-banner.component.ts b/web-app/admin/src/app/admin/admin-settings/security-banner/security-banner.component.ts index 0260d9ff0..c025c1be1 100644 --- a/web-app/admin/src/app/admin/admin-settings/security-banner/security-banner.component.ts +++ b/web-app/admin/src/app/admin/admin-settings/security-banner/security-banner.component.ts @@ -15,9 +15,23 @@ import { import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { SettingsService } from '../../../../../src/app/services/settings.service'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { MatCheckboxModule } from '@angular/material/checkbox'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; @Component({ selector: 'security-banner', + standalone: true, + imports: [ + CommonModule, + FormsModule, + MatCheckboxModule, + MatFormFieldModule, + MatInputModule, + ColorPickerComponent + ], templateUrl: 'security-banner.component.html', styleUrls: ['./security-banner.component.scss'] }) diff --git a/web-app/admin/src/app/admin/admin-settings/security-disclaimer/security-disclaimer.component.spec.ts b/web-app/admin/src/app/admin/admin-settings/security-disclaimer/security-disclaimer.component.spec.ts index 50243d974..a4e40ff84 100644 --- a/web-app/admin/src/app/admin/admin-settings/security-disclaimer/security-disclaimer.component.spec.ts +++ b/web-app/admin/src/app/admin/admin-settings/security-disclaimer/security-disclaimer.component.spec.ts @@ -1,52 +1,37 @@ -import { - ComponentFixture, - TestBed, - waitForAsync, - fakeAsync, - tick -} from '@angular/core/testing'; -import { FormsModule } from '@angular/forms'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { fakeAsync, tick } from '@angular/core/testing'; import { of, throwError } from 'rxjs'; + import { SecurityDisclaimerComponent } from './security-disclaimer.component'; import { SettingsService } from 'admin/src/app/services/settings.service'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatInputModule } from '@angular/material/input'; -import { MatCheckboxModule } from '@angular/material/checkbox'; describe('SecurityDisclaimerComponent', () => { let component: SecurityDisclaimerComponent; - let fixture: ComponentFixture; let settingsService: jasmine.SpyObj; - beforeEach(waitForAsync(() => { + function createComponent(): void { settingsService = jasmine.createSpyObj('SettingsService', [ 'get', 'update' ]); - TestBed.configureTestingModule({ - imports: [ - FormsModule, - NoopAnimationsModule, - MatFormFieldModule, - MatInputModule, - MatCheckboxModule - ], - declarations: [SecurityDisclaimerComponent], - providers: [{ provide: SettingsService, useValue: settingsService }] - }).compileComponents(); - })); - - beforeEach(() => { settingsService.get.and.returnValue( - of({ settings: { show: true, title: 'T', text: 'X' } }) + of({ + settings: { + show: true, + title: 'T', + text: 'X' + } + }) ); + settingsService.update.and.returnValue(of({})); - fixture = TestBed.createComponent(SecurityDisclaimerComponent); - component = fixture.componentInstance; - fixture.detectChanges(); + component = new SecurityDisclaimerComponent(settingsService); + component.ngOnInit(); + } + + beforeEach(() => { + createComponent(); }); it('should create', () => { @@ -55,8 +40,13 @@ describe('SecurityDisclaimerComponent', () => { it('should load disclaimer settings on init', () => { expect(settingsService.get).toHaveBeenCalledWith('disclaimer'); + expect(component.disclaimer).toEqual( - jasmine.objectContaining({ show: true, title: 'T', text: 'X' }) + jasmine.objectContaining({ + show: true, + title: 'T', + text: 'X' + }) ); }); @@ -84,6 +74,7 @@ describe('SecurityDisclaimerComponent', () => { it('should emit saveComplete true on successful save', fakeAsync(() => { const emitSpy = spyOn(component.saveComplete, 'emit'); + component.setDirty(true); component.ngOnChanges({ @@ -102,11 +93,13 @@ describe('SecurityDisclaimerComponent', () => { it('should emit saveComplete false on save error', fakeAsync(() => { const emitSpy = spyOn(component.saveComplete, 'emit'); + settingsService.update.and.returnValue( throwError(() => ({ error: 'nope' })) ); component.setDirty(true); + component.ngOnChanges({ beginSave: { currentValue: {}, @@ -120,4 +113,4 @@ describe('SecurityDisclaimerComponent', () => { expect(emitSpy).toHaveBeenCalledWith(false); })); -}); +}); \ No newline at end of file diff --git a/web-app/admin/src/app/admin/admin-settings/security-disclaimer/security-disclaimer.component.ts b/web-app/admin/src/app/admin/admin-settings/security-disclaimer/security-disclaimer.component.ts index 50ba1c082..7f3e5b580 100644 --- a/web-app/admin/src/app/admin/admin-settings/security-disclaimer/security-disclaimer.component.ts +++ b/web-app/admin/src/app/admin/admin-settings/security-disclaimer/security-disclaimer.component.ts @@ -10,9 +10,20 @@ import { import { take } from "rxjs/operators"; import { Disclaimer } from "./security-disclaimer.model"; import { SettingsService } from '../../../../../src/app/services/settings.service'; +import { CommonModule } from "@angular/common"; +import { FormsModule } from "@angular/forms"; +import { MatCheckboxModule } from "@angular/material/checkbox"; +import { MatFormFieldModule } from "@angular/material/form-field"; @Component({ selector: "security-disclaimer", + standalone: true, + imports: [ + CommonModule, + FormsModule, + MatCheckboxModule, + MatFormFieldModule + ], templateUrl: "security-disclaimer.component.html", styleUrls: ["./security-disclaimer.component.scss"] }) diff --git a/web-app/admin/src/app/admin/admin-shell/admin.component.ts b/web-app/admin/src/app/admin/admin-shell/admin.component.ts index f0764ed7d..ddb738bc5 100644 --- a/web-app/admin/src/app/admin/admin-shell/admin.component.ts +++ b/web-app/admin/src/app/admin/admin-shell/admin.component.ts @@ -7,9 +7,20 @@ import { UserPagingService } from '../../services/user-paging.service'; import { DevicePagingService } from '../../services/device-paging.service'; import { LocalStorageService } from '../../../../../../web-app/src/app/http/local-storage.service'; import { SettingsService } from '../../../../src/app/services/settings.service'; +import { CommonModule } from '@angular/common'; +import { RouterModule } from '@angular/router'; +import { AdminBreadcrumbComponent } from '../admin-breadcrumb/admin-breadcrumb.component'; +import { AdminNavComponent } from '../admin-nav/admin-nav'; @Component({ selector: 'admin', + standalone: true, + imports: [ + CommonModule, + RouterModule, + AdminBreadcrumbComponent, + AdminNavComponent + ], templateUrl: './admin.component.html', styleUrls: ['./admin.component.scss'] }) diff --git a/web-app/admin/src/app/admin/admin-teams/admin-teams.module.ts b/web-app/admin/src/app/admin/admin-teams/admin-teams.module.ts index 269788944..1677cdf70 100644 --- a/web-app/admin/src/app/admin/admin-teams/admin-teams.module.ts +++ b/web-app/admin/src/app/admin/admin-teams/admin-teams.module.ts @@ -24,34 +24,29 @@ import { AdminTeamsService } from '../services/admin-teams-service'; import { RouterModule } from '@angular/router'; @NgModule({ - declarations: [ - TeamDashboardComponent, - CreateTeamDialogComponent, - TeamDetailsComponent, - DeleteTeamComponent - ], - imports: [ - CommonModule, - FormsModule, - CoreModule, - ReactiveFormsModule, - MatTableModule, - MatPaginatorModule, - MatSortModule, - MatDialogModule, - MatFormFieldModule, - MatInputModule, - MatButtonModule, - MatCheckboxModule, - MatIconModule, - MatProgressSpinnerModule, - AdminBreadcrumbModule, - MatTooltipModule, - RouterModule - ], - providers: [ - AdminTeamsService, - AdminEventsService - ], + imports: [ + TeamDashboardComponent, + CreateTeamDialogComponent, + TeamDetailsComponent, + DeleteTeamComponent, + CommonModule, + FormsModule, + CoreModule, + ReactiveFormsModule, + MatTableModule, + MatPaginatorModule, + MatSortModule, + MatDialogModule, + MatFormFieldModule, + MatInputModule, + MatButtonModule, + MatCheckboxModule, + MatIconModule, + MatProgressSpinnerModule, + AdminBreadcrumbModule, + MatTooltipModule, + RouterModule + ], + providers: [AdminTeamsService, AdminEventsService] }) -export class AdminTeamsModule { } \ No newline at end of file +export class AdminTeamsModule {} diff --git a/web-app/admin/src/app/admin/admin-teams/create-team/create-team.component.ts b/web-app/admin/src/app/admin/admin-teams/create-team/create-team.component.ts index 756042457..663d5e6a0 100644 --- a/web-app/admin/src/app/admin/admin-teams/create-team/create-team.component.ts +++ b/web-app/admin/src/app/admin/admin-teams/create-team/create-team.component.ts @@ -1,65 +1,88 @@ import { Component, Inject } from '@angular/core'; -import { MatDialogRef as MatDialogRef, MAT_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/dialog'; -import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { + MatDialogRef as MatDialogRef, + MAT_DIALOG_DATA as MAT_DIALOG_DATA, + MatDialogModule +} from '@angular/material/dialog'; +import { + FormBuilder, + FormGroup, + FormsModule, + ReactiveFormsModule, + Validators +} from '@angular/forms'; import { AdminTeamsService } from '../../services/admin-teams-service'; import { Team } from '../team'; +import { CommonModule } from '@angular/common'; +import { MatButtonModule } from '@angular/material/button'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; /** * Dialog component for creating new teams. * Provides a form interface with validation for team name (required) and description (optional). */ @Component({ - selector: 'mage-admin-team-create', - templateUrl: './create-team.component.html', - styleUrls: ['./create-team.component.scss'] + selector: 'mage-admin-team-create', + standalone: true, + imports: [ + CommonModule, + FormsModule, + ReactiveFormsModule, + MatButtonModule, + MatDialogModule, + MatFormFieldModule, + MatInputModule + ], + templateUrl: './create-team.component.html', + styleUrls: ['./create-team.component.scss'] }) export class CreateTeamDialogComponent { - teamForm: FormGroup; - errorMessage: string = ''; + teamForm: FormGroup; + errorMessage: string = ''; - constructor( - public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: { team: Partial }, - private fb: FormBuilder, - private teamsService: AdminTeamsService - ) { - this.teamForm = this.fb.group({ - name: [data.team.name || '', [Validators.required]], - description: [data.team.description || ''] - }); + constructor( + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data: { team: Partial }, + private fb: FormBuilder, + private teamsService: AdminTeamsService + ) { + this.teamForm = this.fb.group({ + name: [data.team.name || '', [Validators.required]], + description: [data.team.description || ''] + }); + } + + /** + * Handles form submission for creating a new team. + * Validates the form, creates the team via the teams service, and closes the dialog on success. + */ + save(): void { + if (this.teamForm.invalid) { + this.errorMessage = 'Please fill in all required fields.'; + return; } - /** - * Handles form submission for creating a new team. - * Validates the form, creates the team via the teams service, and closes the dialog on success. - */ - save(): void { - if (this.teamForm.invalid) { - this.errorMessage = 'Please fill in all required fields.'; - return; + this.errorMessage = ''; + const teamData = this.teamForm.value; + this.teamsService.createTeam(teamData).subscribe({ + next: (newTeam) => { + this.dialogRef.close(newTeam); + }, + error: (err) => { + if (err.status === 409) { + this.errorMessage = err.error; + } else { + this.errorMessage = 'Failed to create team. Please try again.'; } + } + }); + } - this.errorMessage = ''; - const teamData = this.teamForm.value; - this.teamsService.createTeam(teamData).subscribe({ - next: (newTeam) => { - this.dialogRef.close(newTeam); - }, - error: (err) => { - if (err.status === 409) { - this.errorMessage = err.error; - } - else { - this.errorMessage = 'Failed to create team. Please try again.'; - } - } - }); - } - - /** - * Closes the dialog without saving any data or making any changes. - */ - cancel(): void { - this.dialogRef.close(); - } + /** + * Closes the dialog without saving any data or making any changes. + */ + cancel(): void { + this.dialogRef.close(); + } } diff --git a/web-app/admin/src/app/admin/admin-teams/dashboard/team-dashboard.component.spec.ts b/web-app/admin/src/app/admin/admin-teams/dashboard/team-dashboard.component.spec.ts index 19cf7a9e4..ba81574c9 100644 --- a/web-app/admin/src/app/admin/admin-teams/dashboard/team-dashboard.component.spec.ts +++ b/web-app/admin/src/app/admin/admin-teams/dashboard/team-dashboard.component.spec.ts @@ -1,25 +1,17 @@ -import { - ComponentFixture, - TestBed, - fakeAsync, - tick, - waitForAsync -} from '@angular/core/testing'; -import { MatDialog as MatDialog } from '@angular/material/dialog'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { fakeAsync, tick } from '@angular/core/testing'; +import { MatDialog } from '@angular/material/dialog'; +import { PageEvent } from '@angular/material/paginator'; import { of } from 'rxjs'; import { TeamDashboardComponent } from './team-dashboard.component'; import { AdminTeamsService } from '../../services/admin-teams-service'; import { Team } from '../team'; import { CreateTeamDialogComponent } from '../create-team/create-team.component'; -import { PageEvent as PageEvent } from '@angular/material/paginator'; import { AdminUserService } from '../../services/admin-user.service'; import { AdminToastService } from '../../services/admin-toast.service'; describe('TeamDashboardComponent', () => { let component: TeamDashboardComponent; - let fixture: ComponentFixture; let mockTeamsService: jasmine.SpyObj; let mockDialog: jasmine.SpyObj; let mockUserService: any; @@ -60,34 +52,42 @@ describe('TeamDashboardComponent', () => { } ]; - beforeEach(waitForAsync(() => { - mockTeamsService = jasmine.createSpyObj('AdminTeamsService', ['getTeams']); - mockDialog = jasmine.createSpyObj('MatDialog', ['open']); - toastSpy = jasmine.createSpyObj('AdminToastService', ['show']); + function setup(): void { + mockDialog = jasmine.createSpyObj('MatDialog', ['open']); + + mockTeamsService = jasmine.createSpyObj( + 'AdminTeamsService', + ['getTeams'] + ); + + toastSpy = jasmine.createSpyObj('AdminToastService', [ + 'show' + ]); mockUserService = { - myself$: of({ role: { permissions: ['CREATE_TEAM'] } }) + myself$: of({ + role: { + permissions: ['CREATE_TEAM'] + } + }) }; - TestBed.configureTestingModule({ - declarations: [TeamDashboardComponent], - imports: [NoopAnimationsModule], - providers: [ - { provide: AdminTeamsService, useValue: mockTeamsService }, - { provide: MatDialog, useValue: mockDialog }, - { provide: AdminUserService, useValue: mockUserService }, - { provide: AdminToastService, useValue: toastSpy } - ] - }) - .overrideTemplate(TeamDashboardComponent, '') - .compileComponents(); - })); + mockTeamsService.getTeams.and.returnValue(of(mockTeamsResponse as any)); + + component = new TeamDashboardComponent( + mockDialog, + mockTeamsService, + mockUserService as AdminUserService, + toastSpy + ); + } beforeEach(() => { - mockTeamsService.getTeams.and.returnValue(of(mockTeamsResponse)); + setup(); + }); - fixture = TestBed.createComponent(TeamDashboardComponent); - component = fixture.componentInstance; + afterEach(() => { + component.ngOnDestroy?.(); }); it('should create', () => { @@ -99,7 +99,7 @@ describe('TeamDashboardComponent', () => { }); it('should fetch teams on init', () => { - fixture.detectChanges(); + component.ngOnInit(); expect(mockTeamsService.getTeams).toHaveBeenCalledWith({ term: '', @@ -116,7 +116,7 @@ describe('TeamDashboardComponent', () => { }); it('should reset page index when searching', () => { - fixture.detectChanges(); + component.ngOnInit(); component.pageIndex = 2; component.onSearchTermChanged('test'); @@ -182,7 +182,7 @@ describe('TeamDashboardComponent', () => { data: { team: {} } }); }); - + it('should refresh teams after creating new team', fakeAsync(() => { component.hasTeamCreatePermission = true; @@ -218,6 +218,7 @@ describe('TeamDashboardComponent', () => { it('should not refresh teams if dialog is cancelled', fakeAsync(() => { mockTeamsService.getTeams.calls.reset(); + toastSpy.show.calls.reset(); const dialogRefSpy = jasmine.createSpyObj('MatDialogRef', ['afterClosed']); dialogRefSpy.afterClosed.and.returnValue(of(null)); @@ -231,9 +232,9 @@ describe('TeamDashboardComponent', () => { })); it('should handle empty teams response by leaving defaults unchanged', () => { - mockTeamsService.getTeams.and.returnValue(of([])); + mockTeamsService.getTeams.and.returnValue(of([] as any)); - fixture.detectChanges(); + component.ngOnInit(); expect(component.teams).toEqual([]); expect(component.totalTeams).toBe(0); diff --git a/web-app/admin/src/app/admin/admin-teams/dashboard/team-dashboard.component.ts b/web-app/admin/src/app/admin/admin-teams/dashboard/team-dashboard.component.ts index d8d6f8b31..b6f121204 100644 --- a/web-app/admin/src/app/admin/admin-teams/dashboard/team-dashboard.component.ts +++ b/web-app/admin/src/app/admin/admin-teams/dashboard/team-dashboard.component.ts @@ -1,7 +1,7 @@ import { Component, OnInit, OnDestroy, HostListener } from '@angular/core'; import { MatDialog as MatDialog } from '@angular/material/dialog'; -import { PageEvent as PageEvent } from '@angular/material/paginator'; -import { MatTableDataSource as MatTableDataSource } from '@angular/material/table'; +import { MatPaginatorModule, PageEvent as PageEvent } from '@angular/material/paginator'; +import { MatTableDataSource as MatTableDataSource, MatTableModule } from '@angular/material/table'; import { Team } from '../team'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; @@ -10,6 +10,12 @@ import { CreateTeamDialogComponent } from '../create-team/create-team.component' import { AdminBreadcrumb } from '../../admin-breadcrumb/admin-breadcrumb.model'; import { AdminUserService } from '../../services/admin-user.service'; import { AdminToastService } from '../../services/admin-toast.service'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { RouterModule } from '@angular/router'; +import { AdminBreadcrumbComponent } from '../../admin-breadcrumb/admin-breadcrumb.component'; +import { CardNavbarComponent } from '../../../core/card-navbar/card-navbar.component'; /** * Team dashboard component that displays a paginated list of teams with search functionality. @@ -17,6 +23,17 @@ import { AdminToastService } from '../../services/admin-toast.service'; */ @Component({ selector: 'mage-admin-teams', + standalone: true, + imports: [ + CommonModule, + FormsModule, + RouterModule, + MatTableModule, + MatTooltipModule, + MatPaginatorModule, + AdminBreadcrumbComponent, + CardNavbarComponent + ], templateUrl: './team-dashboard.component.html', styleUrls: ['./team-dashboard.component.scss'] }) diff --git a/web-app/admin/src/app/admin/admin-teams/delete-team/delete-team.component.spec.ts b/web-app/admin/src/app/admin/admin-teams/delete-team/delete-team.component.spec.ts index 63f5d814f..b7f7d0da4 100644 --- a/web-app/admin/src/app/admin/admin-teams/delete-team/delete-team.component.spec.ts +++ b/web-app/admin/src/app/admin/admin-teams/delete-team/delete-team.component.spec.ts @@ -34,8 +34,7 @@ describe('DeleteTeamComponent', () => { mockUserService = jasmine.createSpyObj('UserService', ['deleteUser']); await TestBed.configureTestingModule({ - declarations: [DeleteTeamComponent], - imports: [FormsModule], + imports: [FormsModule, DeleteTeamComponent], providers: [ { provide: MatDialogRef, useValue: mockDialogRef }, { provide: MAT_DIALOG_DATA, useValue: { team: mockTeam } }, diff --git a/web-app/admin/src/app/admin/admin-teams/delete-team/delete-team.component.ts b/web-app/admin/src/app/admin/admin-teams/delete-team/delete-team.component.ts index b20be8f38..d89999821 100644 --- a/web-app/admin/src/app/admin/admin-teams/delete-team/delete-team.component.ts +++ b/web-app/admin/src/app/admin/admin-teams/delete-team/delete-team.component.ts @@ -4,6 +4,8 @@ import { Observable, forkJoin } from 'rxjs'; import { Team } from '../team'; import { AdminTeamsService } from '../../services/admin-teams-service'; import { AdminUserService } from '../../services/admin-user.service'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; /** * Modal component for confirming team deletion. @@ -11,6 +13,11 @@ import { AdminUserService } from '../../services/admin-user.service'; */ @Component({ selector: 'mage-delete-team', + standalone: true, + imports: [ + CommonModule, + FormsModule + ], templateUrl: './delete-team.component.html', styleUrls: ['./delete-team.component.scss'] }) diff --git a/web-app/admin/src/app/admin/admin-teams/team-details/team-details.component.spec.ts b/web-app/admin/src/app/admin/admin-teams/team-details/team-details.component.spec.ts index 1ace3328f..67c980dac 100644 --- a/web-app/admin/src/app/admin/admin-teams/team-details/team-details.component.spec.ts +++ b/web-app/admin/src/app/admin/admin-teams/team-details/team-details.component.spec.ts @@ -1,7 +1,5 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { ActivatedRoute, Router, convertToParamMap } from '@angular/router'; -import { MatDialog as MatDialog } from '@angular/material/dialog'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { MatDialog } from '@angular/material/dialog'; import { BehaviorSubject, of, throwError } from 'rxjs'; import { TeamDetailsComponent } from './team-details.component'; @@ -15,7 +13,6 @@ import { SearchModalComponent } from '../../../core/search-modal/search-modal.co describe('TeamDetailsComponent', () => { let component: TeamDetailsComponent; - let fixture: ComponentFixture; let paramMap$: BehaviorSubject; @@ -60,20 +57,28 @@ describe('TeamDetailsComponent', () => { description: 'Test Event Description' }; - beforeEach(waitForAsync(() => { + function setup(): void { paramMap$ = new BehaviorSubject(convertToParamMap({ teamId: 'team123' })); + mockRoute = { paramMap: paramMap$.asObservable(), - snapshot: { paramMap: convertToParamMap({ teamId: 'team123' }) } + snapshot: { + paramMap: convertToParamMap({ teamId: 'team123' }) + } }; - mockRouter = jasmine.createSpyObj('Router', ['navigateByUrl']); + mockRouter = jasmine.createSpyObj('Router', [ + 'navigate', + 'navigateByUrl' + ]); + mockDialog = jasmine.createSpyObj('MatDialog', ['open']); mockUserService = jasmine.createSpyObj( 'AdminUserService', ['getMyself', 'hasPermission'] ); + mockTeamsService = jasmine.createSpyObj( 'AdminTeamsService', [ @@ -86,39 +91,64 @@ describe('TeamDetailsComponent', () => { 'updateUserRole' ] ); + mockEventsService = jasmine.createSpyObj( 'AdminEventsService', ['getEvents', 'addTeamToEvent', 'removeEventFromTeam'] ); mockUserService.getMyself.and.returnValue(of(mockMyselfWithGlobalPerms)); + mockTeamsService.getTeamById.and.returnValue(of(mockTeam)); + mockTeamsService.getMembers.and.returnValue( - of({ items: [mockMember], totalCount: 1 } as any) + of({ + items: [mockMember], + totalCount: 1 + } as any) + ); + + mockTeamsService.getNonMembers.and.returnValue( + of({ + items: [mockMember], + totalCount: 1 + } as any) ); + + mockTeamsService.addUserToTeam.and.returnValue(of({} as any)); + mockTeamsService.removeMember.and.returnValue(of({} as any)); + mockTeamsService.editTeam.and.returnValue(of(mockTeam as any)); + mockTeamsService.updateUserRole.and.returnValue(of({} as any)); + mockEventsService.getEvents.and.returnValue( - of({ items: [mockEvent], totalCount: 1 } as any) + of({ + items: [mockEvent], + totalCount: 1 + } as any) ); - TestBed.configureTestingModule({ - declarations: [TeamDetailsComponent], - imports: [NoopAnimationsModule], - providers: [ - { provide: ActivatedRoute, useValue: mockRoute }, - { provide: Router, useValue: mockRouter }, - { provide: MatDialog, useValue: mockDialog }, - { provide: AdminUserService, useValue: mockUserService }, - { provide: AdminTeamsService, useValue: mockTeamsService }, - { provide: AdminEventsService, useValue: mockEventsService } - ] - }) - .overrideTemplate(TeamDetailsComponent, '') - .compileComponents(); - })); + mockEventsService.addTeamToEvent.and.returnValue(of({} as any)); + mockEventsService.removeEventFromTeam.and.returnValue(of({} as any)); + + mockRouter.navigate.and.returnValue(Promise.resolve(true)); + mockRouter.navigateByUrl.and.returnValue(Promise.resolve(true)); + + component = new (TeamDetailsComponent as any)( + mockRoute, + mockRouter, + mockDialog, + mockUserService, + mockTeamsService, + mockEventsService + ) as TeamDetailsComponent; + } beforeEach(() => { - fixture = TestBed.createComponent(TeamDetailsComponent); - component = fixture.componentInstance; + setup(); + }); + + afterEach(() => { + paramMap$.complete(); }); it('should create', () => { @@ -128,7 +158,7 @@ describe('TeamDetailsComponent', () => { }); it('should load team + members + events on init', () => { - fixture.detectChanges(); + component.ngOnInit(); expect(component.teamId).toBe('team123'); expect(mockUserService.getMyself).toHaveBeenCalled(); @@ -141,7 +171,7 @@ describe('TeamDetailsComponent', () => { it('should set permissions via global role permissions', () => { mockUserService.getMyself.and.returnValue(of(mockMyselfWithGlobalPerms)); - fixture.detectChanges(); + component.ngOnInit(); expect(component.hasUpdatePermission).toBeTrue(); expect(component.hasDeletePermission).toBeTrue(); @@ -150,7 +180,7 @@ describe('TeamDetailsComponent', () => { it('should set permissions via ACL permissions when global perms missing', () => { mockUserService.getMyself.and.returnValue(of(mockMyselfNoGlobalPerms)); - fixture.detectChanges(); + component.ngOnInit(); expect(component.hasUpdatePermission).toBeTrue(); expect(component.hasDeletePermission).toBeTrue(); @@ -158,13 +188,20 @@ describe('TeamDetailsComponent', () => { it('should deny permissions when no global perms and no ACL match', () => { mockUserService.getMyself.and.returnValue( - of({ id: 'someoneElse', role: { permissions: [] } }) + of({ + id: 'someoneElse', + role: { permissions: [] } + }) ); + mockTeamsService.getTeamById.and.returnValue( - of({ ...mockTeam, acl: {} } as any) + of({ + ...mockTeam, + acl: {} + } as any) ); - fixture.detectChanges(); + component.ngOnInit(); expect(component.hasUpdatePermission).toBeFalse(); expect(component.hasDeletePermission).toBeFalse(); @@ -175,7 +212,7 @@ describe('TeamDetailsComponent', () => { throwError(() => new Error('nope')) ); - fixture.detectChanges(); + component.ngOnInit(); expect(mockTeamsService.getTeamById).toHaveBeenCalledWith('team123'); expect(component.team).toBeTruthy(); @@ -188,7 +225,10 @@ describe('TeamDetailsComponent', () => { it('should fetch members and update datasource + counts', () => { mockTeamsService.getMembers.and.returnValue( - of({ items: [mockMember], totalCount: 1 } as any) + of({ + items: [mockMember], + totalCount: 1 + } as any) ); component.getMembers(); @@ -199,6 +239,7 @@ describe('TeamDetailsComponent', () => { page: component.membersPageIndex, page_size: component.membersPageSize }); + expect(component.loadingMembers).toBeFalse(); expect(component.membersDataSource.data).toEqual([mockMember]); expect(component.totalMembers).toBe(1); @@ -218,7 +259,11 @@ describe('TeamDetailsComponent', () => { it('should return early if team not loaded', () => { component.team = null; + + mockTeamsService.getMembers.calls.reset(); + component.getMembers(); + expect(mockTeamsService.getMembers).not.toHaveBeenCalled(); }); }); @@ -226,8 +271,12 @@ describe('TeamDetailsComponent', () => { describe('getTeamEvents', () => { it('should fetch events and update datasource + counts', () => { component.teamId = 'team123'; + mockEventsService.getEvents.and.returnValue( - of({ items: [mockEvent], totalCount: 1 } as any) + of({ + items: [mockEvent], + totalCount: 1 + } as any) ); component.getTeamEvents(); @@ -238,6 +287,7 @@ describe('TeamDetailsComponent', () => { page: component.teamEventsPage, page_size: component.eventsPerPage }); + expect(component.loadingEvents).toBeFalse(); expect(component.teamEvents).toEqual([mockEvent]); expect(component.eventsDataSource.data).toEqual([mockEvent]); @@ -246,7 +296,11 @@ describe('TeamDetailsComponent', () => { it('should return early if teamId missing', () => { component.teamId = ''; + + mockEventsService.getEvents.calls.reset(); + component.getTeamEvents(); + expect(mockEventsService.getEvents).not.toHaveBeenCalled(); }); }); @@ -255,12 +309,17 @@ describe('TeamDetailsComponent', () => { beforeEach(() => { component.team = mockTeam; component.teamId = 'team123'; + spyOn(component, 'getMembers'); spyOn(component, 'getTeamEvents'); }); it('onMembersPageChange should update pagination and reload', () => { - component.onMembersPageChange({ pageIndex: 2, pageSize: 10 } as any); + component.onMembersPageChange({ + pageIndex: 2, + pageSize: 10 + } as any); + expect(component.membersPageIndex).toBe(2); expect(component.membersPageSize).toBe(10); expect(component.getMembers).toHaveBeenCalled(); @@ -268,14 +327,20 @@ describe('TeamDetailsComponent', () => { it('onMembersSearchChange should reset page and reload', () => { component.membersPageIndex = 5; + component.onMembersSearchChange('abc'); + expect(component.membersPageIndex).toBe(0); expect(component.memberSearchTerm).toBe('abc'); expect(component.getMembers).toHaveBeenCalled(); }); it('onEventsPageChange should update pagination and reload', () => { - component.onEventsPageChange({ pageIndex: 1, pageSize: 25 } as any); + component.onEventsPageChange({ + pageIndex: 1, + pageSize: 25 + } as any); + expect(component.teamEventsPage).toBe(1); expect(component.eventsPerPage).toBe(25); expect(component.getTeamEvents).toHaveBeenCalled(); @@ -283,7 +348,9 @@ describe('TeamDetailsComponent', () => { it('onTeamEventSearchChange should reset page and reload', () => { component.teamEventsPage = 3; + component.onTeamEventSearchChange('zzz'); + expect(component.teamEventsPage).toBe(0); expect(component.teamEventSearch).toBe('zzz'); expect(component.getTeamEvents).toHaveBeenCalled(); @@ -299,6 +366,7 @@ describe('TeamDetailsComponent', () => { it('toggleEditDetails should populate form on entering edit mode', () => { component.editingDetails = false; + component.toggleEditDetails(); expect(component.editingDetails).toBeTrue(); @@ -309,6 +377,7 @@ describe('TeamDetailsComponent', () => { it('cancelEditDetails should reset form and exit edit mode', () => { component.editingDetails = true; component.editForm.name = 'Changed'; + component.cancelEditDetails(); expect(component.editingDetails).toBeFalse(); @@ -317,7 +386,11 @@ describe('TeamDetailsComponent', () => { }); it('saveTeamDetails should call service and update team + breadcrumbs', () => { - const updated = { ...mockTeam, name: 'Updated Team' }; + const updated = { + ...mockTeam, + name: 'Updated Team' + }; + mockTeamsService.editTeam.and.returnValue(of(updated as any)); component.editingDetails = true; @@ -330,6 +403,7 @@ describe('TeamDetailsComponent', () => { name: 'Updated Team', description: 'Updated Description' }); + expect(component.team).toEqual(updated as any); expect(component.editingDetails).toBeFalse(); expect(component.breadcrumbs.length).toBe(2); @@ -340,11 +414,16 @@ describe('TeamDetailsComponent', () => { describe('member management', () => { beforeEach(() => { component.team = mockTeam; + mockTeamsService.addUserToTeam.and.returnValue(of({} as any)); mockTeamsService.removeMember.and.returnValue(of({} as any)); mockTeamsService.getNonMembers.and.returnValue( - of({ items: [mockMember], totalCount: 1 } as any) + of({ + items: [mockMember], + totalCount: 1 + } as any) ); + spyOn(component, 'getMembers'); }); @@ -359,10 +438,12 @@ describe('TeamDetailsComponent', () => { SearchModalComponent, jasmine.any(Object) ); + expect(mockTeamsService.addUserToTeam).toHaveBeenCalledWith( mockTeam.id, mockMember ); + expect(component.getMembers).toHaveBeenCalled(); }); @@ -384,10 +465,12 @@ describe('TeamDetailsComponent', () => { component.removeMember(ev, mockMember); expect(ev.stopPropagation).toHaveBeenCalled(); + expect(mockTeamsService.removeMember).toHaveBeenCalledWith( mockTeam.id, mockMember.id ); + expect(component.getMembers).toHaveBeenCalled(); }); }); @@ -396,8 +479,10 @@ describe('TeamDetailsComponent', () => { beforeEach(() => { component.team = mockTeam; component.teamId = mockTeam.id as any; + mockEventsService.addTeamToEvent.and.returnValue(of({} as any)); mockEventsService.removeEventFromTeam.and.returnValue(of({} as any)); + spyOn(component, 'getTeamEvents'); }); @@ -412,10 +497,12 @@ describe('TeamDetailsComponent', () => { SearchModalComponent, jasmine.any(Object) ); + expect(mockEventsService.addTeamToEvent).toHaveBeenCalledWith( String(mockEvent.id), mockTeam ); + expect(component.getTeamEvents).toHaveBeenCalled(); }); @@ -427,10 +514,12 @@ describe('TeamDetailsComponent', () => { component.removeEventFromTeam(ev, mockEvent); expect(ev.stopPropagation).toHaveBeenCalled(); + expect(mockEventsService.removeEventFromTeam).toHaveBeenCalledWith( String(mockEvent.id), String(mockTeam.id) ); + expect(component.getTeamEvents).toHaveBeenCalled(); }); }); @@ -438,14 +527,13 @@ describe('TeamDetailsComponent', () => { describe('deleteTeam', () => { beforeEach(() => { component.team = mockTeam; - - (mockRouter as any).navigate = jasmine - .createSpy('navigate') - .and.returnValue(Promise.resolve(true)); + mockRouter.navigate.and.returnValue(Promise.resolve(true)); }); it('should open delete dialog and navigate when confirmed', () => { - mockDialog.open.and.returnValue({ afterClosed: () => of(true) } as any); + mockDialog.open.and.returnValue({ + afterClosed: () => of(true) + } as any); component.deleteTeam(); @@ -457,10 +545,10 @@ describe('TeamDetailsComponent', () => { }) ); - expect((mockRouter as any).navigate).toHaveBeenCalledWith( + expect(mockRouter.navigate).toHaveBeenCalledWith( ['../../teams'], jasmine.objectContaining({ - relativeTo: jasmine.any(Object) + relativeTo: mockRoute }) ); @@ -468,13 +556,14 @@ describe('TeamDetailsComponent', () => { }); it('should not navigate when cancelled', () => { - mockDialog.open.and.returnValue({ afterClosed: () => of(false) } as any); + mockDialog.open.and.returnValue({ + afterClosed: () => of(false) + } as any); component.deleteTeam(); - expect((mockRouter as any).navigate).not.toHaveBeenCalled(); + expect(mockRouter.navigate).not.toHaveBeenCalled(); expect(mockRouter.navigateByUrl).not.toHaveBeenCalled(); }); }); }); - diff --git a/web-app/admin/src/app/admin/admin-teams/team-details/team-details.component.ts b/web-app/admin/src/app/admin/admin-teams/team-details/team-details.component.ts index 1cc238201..45381b32d 100644 --- a/web-app/admin/src/app/admin/admin-teams/team-details/team-details.component.ts +++ b/web-app/admin/src/app/admin/admin-teams/team-details/team-details.component.ts @@ -1,8 +1,8 @@ import { Component, OnInit } from '@angular/core'; -import { ActivatedRoute, Router } from '@angular/router'; +import { ActivatedRoute, Router, RouterModule } from '@angular/router'; import { MatDialog as MatDialog } from '@angular/material/dialog'; -import { PageEvent as PageEvent } from '@angular/material/paginator'; -import { MatTableDataSource as MatTableDataSource } from '@angular/material/table'; +import { MatPaginatorModule, PageEvent as PageEvent } from '@angular/material/paginator'; +import { MatTableDataSource as MatTableDataSource, MatTableModule } from '@angular/material/table'; import { Observable } from 'rxjs'; import { AdminUserService } from '../../services/admin-user.service'; @@ -14,7 +14,7 @@ import { User as CoreUser } from '@ngageoint/mage.web-core-lib/user'; import { Event } from '../../../../../../src/app/filter/filter.types'; import { DeleteTeamComponent } from '../delete-team/delete-team.component'; -import { CardActionButton } from '../../../core/card-navbar/card-navbar.component'; +import { CardActionButton, CardNavbarComponent } from '../../../core/card-navbar/card-navbar.component'; import { SearchModalComponent, SearchModalData, @@ -22,9 +22,22 @@ import { SearchModalColumn } from '../../../core/search-modal/search-modal.component'; import { AdminBreadcrumb } from '../../admin-breadcrumb/admin-breadcrumb.model'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { AdminBreadcrumbComponent } from '../../admin-breadcrumb/admin-breadcrumb.component'; @Component({ selector: 'mage-team-details', + standalone: true, + imports: [ + CommonModule, + FormsModule, + RouterModule, + MatTableModule, + MatPaginatorModule, + AdminBreadcrumbComponent, + CardNavbarComponent + ], templateUrl: './team-details.component.html', styleUrls: ['./team-details.component.scss'] }) diff --git a/web-app/admin/src/app/admin/admin-toast/admin-toast.component.ts b/web-app/admin/src/app/admin/admin-toast/admin-toast.component.ts index d6345d1ef..3e1788b1a 100644 --- a/web-app/admin/src/app/admin/admin-toast/admin-toast.component.ts +++ b/web-app/admin/src/app/admin/admin-toast/admin-toast.component.ts @@ -1,8 +1,10 @@ +import { CommonModule } from '@angular/common'; import { Component, Inject } from '@angular/core'; import { MatSnackBarRef as MatSnackBarRef, MAT_SNACK_BAR_DATA as MAT_SNACK_BAR_DATA } from '@angular/material/snack-bar'; +import { RouterModule } from '@angular/router'; export interface AdminToastData { message: string; @@ -12,6 +14,11 @@ export interface AdminToastData { @Component({ selector: 'admin-toast', + standalone: true, + imports: [ + CommonModule, + RouterModule + ], templateUrl: './admin-toast.component.html', styleUrls: ['./admin-toast.component.scss'] }) diff --git a/web-app/admin/src/app/admin/admin-toast/admin-toast.module.ts b/web-app/admin/src/app/admin/admin-toast/admin-toast.module.ts index 4b93b419b..2c5fed646 100644 --- a/web-app/admin/src/app/admin/admin-toast/admin-toast.module.ts +++ b/web-app/admin/src/app/admin/admin-toast/admin-toast.module.ts @@ -5,8 +5,8 @@ import { AdminToastComponent } from './admin-toast.component'; import { CommonModule } from '@angular/common'; @NgModule({ - declarations: [AdminToastComponent], imports: [ + AdminToastComponent, RouterModule, MatSnackBarModule, CommonModule diff --git a/web-app/admin/src/app/admin/admin-users/admin-users.module.ts b/web-app/admin/src/app/admin/admin-users/admin-users.module.ts index a5b27c850..57825d8e7 100644 --- a/web-app/admin/src/app/admin/admin-users/admin-users.module.ts +++ b/web-app/admin/src/app/admin/admin-users/admin-users.module.ts @@ -29,6 +29,12 @@ import { RouterModule } from '@angular/router'; @NgModule({ imports: [ + UserDashboardComponent, + UserDetailsComponent, + DeleteUserComponent, + CreateUserModalComponent, + BulkUserComponent, + UserSearchBoxComponent, CommonModule, FormsModule, ReactiveFormsModule, @@ -48,15 +54,7 @@ import { RouterModule } from '@angular/router'; MatProgressBarModule, MatOptionModule, AdminBreadcrumbModule, - RouterModule, - ], - declarations: [ - UserDashboardComponent, - UserDetailsComponent, - DeleteUserComponent, - CreateUserModalComponent, - BulkUserComponent, - UserSearchBoxComponent + RouterModule ], exports: [ UserDetailsComponent, diff --git a/web-app/admin/src/app/admin/admin-users/bulk-user/bulk-user.component.spec.ts b/web-app/admin/src/app/admin/admin-users/bulk-user/bulk-user.component.spec.ts index 26f8f05a9..0f5e34974 100644 --- a/web-app/admin/src/app/admin/admin-users/bulk-user/bulk-user.component.spec.ts +++ b/web-app/admin/src/app/admin/admin-users/bulk-user/bulk-user.component.spec.ts @@ -1,7 +1,10 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { NO_ERRORS_SCHEMA } from '@angular/core'; import { FormsModule } from '@angular/forms'; -import { MatDialogRef as MatDialogRef, MAT_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { + MatDialogRef as MatDialogRef, + MAT_DIALOG_DATA as MAT_DIALOG_DATA +} from '@angular/material/dialog'; import * as Papa from 'papaparse'; import { BulkUserComponent } from './bulk-user.component'; import { Role } from '../user'; @@ -28,7 +31,7 @@ describe('BulkUserComponent', () => { const teams: Team[] = [ { - id: "10", + id: '10', name: 'Team X', description: '', teamEventId: '', @@ -36,7 +39,7 @@ describe('BulkUserComponent', () => { acl: undefined }, { - id: "11", + id: '11', name: 'Team Y', description: '', teamEventId: '', @@ -56,14 +59,14 @@ describe('BulkUserComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [BulkUserComponent], imports: [ FormsModule, MatFormFieldModule, MatSelectModule, MatIconModule, MatTableModule, - NoopAnimationsModule + NoopAnimationsModule, + BulkUserComponent ], providers: [ { provide: MatDialogRef, useValue: mockDialogRef }, @@ -111,7 +114,7 @@ describe('BulkUserComponent', () => { expect(component.displayedColumns).toEqual(['team', 'role', ...header]); expect(component.users.length).toBe(1); expect((component.users[0] as any)['Username']).toBe('user1'); - expect((component.users[0] as any).team?.id).toBe("11"); + expect((component.users[0] as any).team?.id).toBe('11'); expect((component.users[0] as any).role?.id).toBe('1'); expect(component.unmappedFields.length).toBe(0); }); @@ -231,7 +234,7 @@ describe('BulkUserComponent', () => { closeSpy.calls.mostRecent().args[0]; expect(selectedRole.id).toBe('1'); - expect(selectedTeam.id).toBe("10"); + expect(selectedTeam.id).toBe('10'); expect(users[0]).toEqual( jasmine.objectContaining({ username: 'user9', @@ -241,11 +244,11 @@ describe('BulkUserComponent', () => { password: 'p9', passwordconfirm: 'p9', roleId: '1', - team: "10", + team: '10', avatar: null, icon: null, iconMetadata: null }) ); }); -}); \ No newline at end of file +}); diff --git a/web-app/admin/src/app/admin/admin-users/bulk-user/bulk-user.component.ts b/web-app/admin/src/app/admin/admin-users/bulk-user/bulk-user.component.ts index 2e1cff66a..9420fe757 100644 --- a/web-app/admin/src/app/admin/admin-users/bulk-user/bulk-user.component.ts +++ b/web-app/admin/src/app/admin/admin-users/bulk-user/bulk-user.component.ts @@ -1,8 +1,15 @@ import { Component, Inject, OnInit } from '@angular/core'; -import { MatDialogRef as MatDialogRef, MAT_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { MatDialogRef as MatDialogRef, MAT_DIALOG_DATA as MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog'; import * as Papa from 'papaparse'; import { Role, User } from '../user'; import { Team } from '../../admin-teams/team'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatSelectModule } from '@angular/material/select'; +import { MatTableModule } from '@angular/material/table'; +import { MatTooltipModule } from '@angular/material/tooltip'; /** * Bulk import users from a CSV. @@ -13,6 +20,17 @@ import { Team } from '../../admin-teams/team'; */ @Component({ selector: 'app-bulk-user', + standalone: true, + imports: [ + CommonModule, + FormsModule, + MatDialogModule, + MatFormFieldModule, + MatSelectModule, + MatTooltipModule, + MatIconModule, + MatTableModule + ], templateUrl: './bulk-user.component.html', styleUrls: ['./bulk-user.component.scss'] }) diff --git a/web-app/admin/src/app/admin/admin-users/create-user/create-user.component.spec.ts b/web-app/admin/src/app/admin/admin-users/create-user/create-user.component.spec.ts index ebf2317fd..ca964b74d 100644 --- a/web-app/admin/src/app/admin/admin-users/create-user/create-user.component.spec.ts +++ b/web-app/admin/src/app/admin/admin-users/create-user/create-user.component.spec.ts @@ -73,7 +73,6 @@ describe('CreateUserModalComponent', () => { ); await TestBed.configureTestingModule({ - declarations: [CreateUserModalComponent], imports: [ ReactiveFormsModule, FormsModule, @@ -84,7 +83,8 @@ describe('CreateUserModalComponent', () => { MatSelectModule, MatIconModule, MatTooltipModule, - MatProgressBarModule + MatProgressBarModule, + CreateUserModalComponent ], providers: [ { provide: MAT_DIALOG_DATA, useValue: { roles: mockRoles } }, diff --git a/web-app/admin/src/app/admin/admin-users/create-user/create-user.component.ts b/web-app/admin/src/app/admin/admin-users/create-user/create-user.component.ts index fbb16dffb..010208b85 100644 --- a/web-app/admin/src/app/admin/admin-users/create-user/create-user.component.ts +++ b/web-app/admin/src/app/admin/admin-users/create-user/create-user.component.ts @@ -2,7 +2,7 @@ import { Component, Inject } from '@angular/core'; import { MatDialogRef as MatDialogRef, MAT_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/dialog'; import { Role } from '../user'; import { ApiService } from '../../../api/api.service'; -import { FormControl, FormGroup, Validators } from '@angular/forms'; +import { FormControl, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms'; import { createPasswordPolicyValidator, @@ -17,12 +17,30 @@ import { } from 'src/app/entities/entities.password'; import { PasswordPolicy } from 'src/app/ingress/authentication/@types/signup'; +import { CommonModule } from '@angular/common'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatSelectModule } from '@angular/material/select'; +import { MatIconModule } from '@angular/material/icon'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { MatProgressBarModule } from '@angular/material/progress-bar'; /** * Modal component for creating a new user. */ @Component({ selector: 'create-user-modal', + standalone: true, + imports: [ + CommonModule, + ReactiveFormsModule, + MatFormFieldModule, + MatInputModule, + MatSelectModule, + MatIconModule, + MatTooltipModule, + MatProgressBarModule + ], templateUrl: './create-user.component.html', styleUrls: ['./create-user.component.scss'] }) diff --git a/web-app/admin/src/app/admin/admin-users/dashboard/user-dashboard.component.spec.ts b/web-app/admin/src/app/admin/admin-users/dashboard/user-dashboard.component.spec.ts index 68c0cc392..5e8d4ecdf 100644 --- a/web-app/admin/src/app/admin/admin-users/dashboard/user-dashboard.component.spec.ts +++ b/web-app/admin/src/app/admin/admin-users/dashboard/user-dashboard.component.spec.ts @@ -1,46 +1,16 @@ -import { - ComponentFixture, - TestBed, - fakeAsync, - tick -} from '@angular/core/testing'; -import { Component, CUSTOM_ELEMENTS_SCHEMA, Input } from '@angular/core'; +import { Router } from '@angular/router'; +import { MatDialog, MatDialogRef } from '@angular/material/dialog'; +import { BehaviorSubject, of, throwError } from 'rxjs'; + import { UserDashboardComponent } from './user-dashboard.component'; -import { - MatDialog as MatDialog, - MatDialogRef as MatDialogRef -} from '@angular/material/dialog'; -import { RouterTestingModule } from '@angular/router/testing'; import { UserPagingService } from 'admin/src/app/services/user-paging.service'; import { AdminTeamsService } from '../../services/admin-teams-service'; -import { of, BehaviorSubject, throwError } from 'rxjs'; -import { CommonModule } from '@angular/common'; -import { FormsModule } from '@angular/forms'; -import { MatIconModule } from '@angular/material/icon'; -import { MatOptionModule } from '@angular/material/core'; -import { MatTableModule as MatTableModule } from '@angular/material/table'; -import { MatCardModule as MatCardModule } from '@angular/material/card'; -import { MatProgressSpinnerModule as MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatDividerModule } from '@angular/material/divider'; -import { MatListModule as MatListModule } from '@angular/material/list'; -import { MatSelectModule } from '@angular/material/select'; -import { MatPaginatorModule } from '@angular/material/paginator'; import { LocalStorageService } from 'src/app/http/local-storage.service'; import { AdminUserService } from '../../services/admin-user.service'; import { AdminToastService } from '../../services/admin-toast.service'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; - -@Component({ - selector: 'user-avatar', - template: '' -}) -class MockUserAvatarComponent { - @Input() user: any; -} describe('UserDashboardComponent', () => { let component: UserDashboardComponent; - let fixture: ComponentFixture; const testUsers = [ { @@ -88,6 +58,7 @@ describe('UserDashboardComponent', () => { ] as any[]; let dialogSpy: jasmine.SpyObj; + let routerSpy: jasmine.SpyObj; let localStorageSpy: jasmine.SpyObj; let userServiceSpy: jasmine.SpyObj; let pagingServiceSpy: jasmine.SpyObj; @@ -95,27 +66,54 @@ describe('UserDashboardComponent', () => { let toastSpy: jasmine.SpyObj; let myself$: BehaviorSubject; - beforeEach(async () => { - dialogSpy = jasmine.createSpyObj('MatDialog', ['open']); - localStorageSpy = jasmine.createSpyObj('LocalStorageService', ['getToken']); + function setupSpies(): void { + dialogSpy = jasmine.createSpyObj('MatDialog', ['open']); + + routerSpy = jasmine.createSpyObj('Router', [ + 'navigate', + 'navigateByUrl' + ]); + + localStorageSpy = jasmine.createSpyObj( + 'LocalStorageService', + ['getToken'] + ); localStorageSpy.getToken.and.returnValue('token123'); - toastSpy = jasmine.createSpyObj('AdminToastService', ['show']); + toastSpy = jasmine.createSpyObj('AdminToastService', [ + 'show' + ]); myself$ = new BehaviorSubject({ - role: { permissions: ['CREATE_USER', 'UPDATE_USER', 'DELETE_USER'] } + role: { + permissions: ['CREATE_USER', 'UPDATE_USER', 'DELETE_USER'] + } }); userServiceSpy = jasmine.createSpyObj( 'AdminUserService', ['getRoles', 'createUser'] ) as any; - (userServiceSpy as any).myself$ = myself$.asObservable(); + + Object.defineProperty(userServiceSpy, 'myself$', { + get: () => myself$.asObservable() + }); userServiceSpy.getRoles.and.returnValue( - of([{ id: '1', name: 'Admin', permissions: [] } as any]) + of([ + { + id: '1', + name: 'Admin', + permissions: [] + } as any + ]) + ); + + userServiceSpy.createUser.and.returnValue( + of({ + id: 'created-id' + } as any) ); - userServiceSpy.createUser.and.returnValue(of({ id: 'created-id' } as any)); pagingServiceSpy = jasmine.createSpyObj( 'UserPagingService', @@ -124,12 +122,15 @@ describe('UserDashboardComponent', () => { pagingServiceSpy.constructDefault.and.returnValue({ all: { - pageInfo: { totalCount: 2 }, + pageInfo: { + totalCount: 2 + }, userFilter: {}, pageSize: 10, pageIndex: 0 } } as any); + pagingServiceSpy.refresh.and.returnValue(of(undefined)); pagingServiceSpy.users.and.callFake(() => testUsers as any); pagingServiceSpy.search.and.returnValue(of(testUsers as any)); @@ -138,43 +139,43 @@ describe('UserDashboardComponent', () => { 'AdminTeamsService', ['getTeams', 'addUserToTeam'] ); - teamsServiceSpy.getTeams.and.returnValue(of({ items: [] } as any)); + + teamsServiceSpy.getTeams.and.returnValue( + of({ + items: [] + } as any) + ); + teamsServiceSpy.addUserToTeam.and.returnValue(of({} as any)); spyOn(window, 'addEventListener').and.stub(); spyOn(window, 'removeEventListener').and.stub(); + } + + function createComponent(runInit = true): void { + component = new UserDashboardComponent( + dialogSpy, + routerSpy, + localStorageSpy, + teamsServiceSpy, + userServiceSpy, + pagingServiceSpy, + toastSpy + ); + + if (runInit) { + component.ngOnInit(); + } + } - await TestBed.configureTestingModule({ - imports: [ - CommonModule, - FormsModule, - RouterTestingModule, - MatIconModule, - MatOptionModule, - MatTableModule, - MatCardModule, - MatProgressSpinnerModule, - MatDividerModule, - MatListModule, - MatSelectModule, - MatPaginatorModule, - NoopAnimationsModule - ], - declarations: [UserDashboardComponent, MockUserAvatarComponent], - providers: [ - { provide: MatDialog, useValue: dialogSpy }, - { provide: LocalStorageService, useValue: localStorageSpy }, - { provide: AdminUserService, useValue: userServiceSpy }, - { provide: UserPagingService, useValue: pagingServiceSpy }, - { provide: AdminTeamsService, useValue: teamsServiceSpy }, - { provide: AdminToastService, useValue: toastSpy } - ], - schemas: [CUSTOM_ELEMENTS_SCHEMA] - }).compileComponents(); - - fixture = TestBed.createComponent(UserDashboardComponent); - component = fixture.componentInstance; - fixture.detectChanges(); + beforeEach(() => { + setupSpies(); + createComponent(); + }); + + afterEach(() => { + component.ngOnDestroy?.(); + myself$.complete(); }); it('should create component and initialize token', () => { @@ -183,171 +184,208 @@ describe('UserDashboardComponent', () => { expect(window.addEventListener).toHaveBeenCalled(); }); - it('should initialize permissions from myself$', fakeAsync(() => { - tick(); + it('should initialize permissions from myself$', () => { expect(component.hasUserCreatePermission).toBeTrue(); - myself$.next({ role: { permissions: [] } }); - tick(); + myself$.next({ + role: { + permissions: [] + } + }); + expect(component.hasUserCreatePermission).toBeFalse(); - })); + }); - it('should load roles on init', fakeAsync(() => { - tick(); + it('should load roles on init', () => { expect(userServiceSpy.getRoles).toHaveBeenCalled(); expect(component.roles.length).toBe(1); expect(component.roles[0].name).toBe('Admin'); - })); + }); - it('should fetch teams on init', fakeAsync(() => { - tick(); + it('should fetch teams on init', () => { expect(teamsServiceSpy.getTeams).toHaveBeenCalled(); expect(component.teams).toEqual([]); - })); + }); - it('should refresh users and update dataSource/totalUsers', fakeAsync(() => { + it('should refresh users and update dataSource/totalUsers', () => { component.refreshUsers(); - tick(); expect(pagingServiceSpy.refresh).toHaveBeenCalled(); expect(component.dataSource.length).toBe(3); expect(component.totalUsers).toBe(2); - })); + }); - it('should search and update user list', fakeAsync(() => { + it('should search and update user list', () => { component.onSearchTermChanged('user'); - tick(); expect(component.userSearch).toBe('user'); expect(component.pageIndex).toBe(0); expect(pagingServiceSpy.search).toHaveBeenCalled(); expect(component.dataSource.length).toBe(3); - })); - - it('should set error message when search fails', fakeAsync(() => { + }); + + it('should set error message when search fails', () => { spyOn(console, 'error').and.stub(); - + pagingServiceSpy.search.and.returnValue( throwError(() => new Error('nope')) ); - + component.onSearchTermChanged('x'); - tick(); - + expect(component.error).toBe('Search failed.'); - })); + }); - it('should reset and refresh users', fakeAsync(() => { + it('should reset and refresh users', () => { pagingServiceSpy.constructDefault.calls.reset(); pagingServiceSpy.refresh.calls.reset(); component.reset(); - tick(); expect(component.userSearch).toBe(''); expect(component.pageIndex).toBe(0); expect(pagingServiceSpy.constructDefault).toHaveBeenCalled(); expect(pagingServiceSpy.refresh).toHaveBeenCalled(); - })); + }); - it('should handle pagination event and refresh users', fakeAsync(() => { + it('should handle pagination event and refresh users', () => { pagingServiceSpy.refresh.calls.reset(); - component.onPageChange({ pageIndex: 1, pageSize: 25 } as any); - tick(); + component.onPageChange({ + pageIndex: 1, + pageSize: 25 + } as any); expect(component.pageIndex).toBe(1); expect(component.pageSize).toBe(25); expect(pagingServiceSpy.refresh).toHaveBeenCalled(); - })); + }); - it('should set userStatusFilter and refresh users when filter changes', fakeAsync(() => { + it('should set userStatusFilter and refresh users when filter changes', () => { const refreshSpy = spyOn(component, 'refreshUsers').and.callThrough(); component.onStatusFilterChange('active'); - tick(); expect(component.userStatusFilter).toBe('active'); expect(component.pageIndex).toBe(0); expect(refreshSpy).toHaveBeenCalled(); - })); + }); it('should apply "active" filter', () => { component.userStatusFilter = 'active'; + const filter = component.getFilter(); + expect(filter.active).toBeTrue(); expect(filter.enabled).toBeUndefined(); }); it('should apply "inactive" filter', () => { component.userStatusFilter = 'inactive'; + const filter = component.getFilter(); + expect(filter.active).toBeFalse(); expect(filter.enabled).toBeUndefined(); }); it('should apply "disabled" filter', () => { component.userStatusFilter = 'disabled'; + const filter = component.getFilter(); + expect(filter.active).toBeTrue(); expect(filter.enabled).toBeFalse(); }); it('should keep filter minimal for "all"', () => { component.userStatusFilter = 'all'; + const filter = component.getFilter(); + expect(filter.active).toBeUndefined(); expect(filter.enabled).toBeUndefined(); }); - it('should open create user modal and call createUser when confirmed', fakeAsync(() => { + it('should open create user modal and call createUser when confirmed', () => { const dialogRef = { - afterClosed: () => of({ confirmed: true, user: { username: 'x' } }) + afterClosed: () => + of({ + confirmed: true, + user: { + username: 'x' + } + }) } as Partial> as MatDialogRef; dialogSpy.open.and.returnValue(dialogRef); const refreshSpy = spyOn(component, 'refreshUsers').and.callThrough(); + userServiceSpy.createUser.calls.reset(); component.createUser(); - tick(); expect(dialogSpy.open).toHaveBeenCalled(); expect(userServiceSpy.createUser).toHaveBeenCalled(); expect(refreshSpy).toHaveBeenCalled(); expect(toastSpy.show).toHaveBeenCalled(); - })); + }); - it('should not call createUser when modal is not confirmed', fakeAsync(() => { + it('should not call createUser when modal is not confirmed', () => { const dialogRef = { - afterClosed: () => of({ confirmed: false }) + afterClosed: () => + of({ + confirmed: false + }) } as Partial> as MatDialogRef; dialogSpy.open.and.returnValue(dialogRef); + userServiceSpy.createUser.calls.reset(); + toastSpy.show.calls.reset(); component.createUser(); - tick(); expect(userServiceSpy.createUser).not.toHaveBeenCalled(); expect(toastSpy.show).not.toHaveBeenCalled(); - })); + }); it('should compute success and failure percent safely', () => { - component.bulkProgress = { total: 0, completed: 0, failed: 0 }; + component.bulkProgress = { + total: 0, + completed: 0, + failed: 0 + }; + expect(component.getSuccessPercent()).toBe(0); expect(component.getFailurePercent()).toBe(0); - component.bulkProgress = { total: 10, completed: 10, failed: 2 }; + component.bulkProgress = { + total: 10, + completed: 10, + failed: 2 + }; + expect(component.getSuccessPercent()).toBe(80); expect(component.getFailurePercent()).toBe(20); }); it('should close bulk upload and reset related state', () => { component.isBulkUploading = true; - component.bulkErrors = [{ user: { username: 'x' }, error: 'e' }]; - component.bulkProgress = { total: 2, completed: 2, failed: 1 }; + component.bulkErrors = [ + { + user: { + username: 'x' + }, + error: 'e' + } + ]; + component.bulkProgress = { + total: 2, + completed: 2, + failed: 1 + }; component.showErrorTable = true; component.isFinalizing = true; component.isFinished = true; @@ -368,6 +406,7 @@ describe('UserDashboardComponent', () => { it('should remove window listener and complete destroy$ on destroy', () => { component.ngOnDestroy(); + expect(window.removeEventListener).toHaveBeenCalled(); }); }); diff --git a/web-app/admin/src/app/admin/admin-users/dashboard/user-dashboard.component.ts b/web-app/admin/src/app/admin/admin-users/dashboard/user-dashboard.component.ts index dfdea1c0e..1e07dfeb9 100644 --- a/web-app/admin/src/app/admin/admin-users/dashboard/user-dashboard.component.ts +++ b/web-app/admin/src/app/admin/admin-users/dashboard/user-dashboard.component.ts @@ -1,7 +1,7 @@ import { Component, OnInit, OnDestroy } from '@angular/core'; -import { Router } from '@angular/router'; +import { Router, RouterModule } from '@angular/router'; import { MatDialog as MatDialog } from '@angular/material/dialog'; -import { PageEvent as PageEvent } from '@angular/material/paginator'; +import { MatPaginatorModule, PageEvent as PageEvent } from '@angular/material/paginator'; import { from, lastValueFrom, EMPTY, Subject } from 'rxjs'; import { mergeMap, tap, catchError, finalize, takeUntil } from 'rxjs/operators'; @@ -16,6 +16,14 @@ import { Team } from '../../admin-teams/team'; import { AdminBreadcrumb } from '../../admin-breadcrumb/admin-breadcrumb.model'; import { AdminUserService } from '../../services/admin-user.service'; import { AdminToastService } from '../../services/admin-toast.service'; +import { CommonModule } from '@angular/common'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatSelectModule } from '@angular/material/select'; +import { MatTableModule } from '@angular/material/table'; +import { CardNavbarComponent } from 'admin/src/app/core/card-navbar/card-navbar.component'; +import { AdminBreadcrumbComponent } from '../../admin-breadcrumb/admin-breadcrumb.component'; +import { UserAvatarComponent } from '../../../user/user-avatar/user-avatar.component'; type UserFilter = { limit?: number; @@ -26,6 +34,19 @@ type UserFilter = { @Component({ selector: 'admin-users', + standalone: true, + imports: [ + CommonModule, + RouterModule, + MatFormFieldModule, + MatSelectModule, + MatTableModule, + MatPaginatorModule, + MatIconModule, + AdminBreadcrumbComponent, + CardNavbarComponent, + UserAvatarComponent + ], templateUrl: './user-dashboard.component.html', styleUrls: ['./user-dashboard.component.scss'] }) diff --git a/web-app/admin/src/app/admin/admin-users/user-details/user-details.component.spec.ts b/web-app/admin/src/app/admin/admin-users/user-details/user-details.component.spec.ts index 50685fec9..38485a40e 100644 --- a/web-app/admin/src/app/admin/admin-users/user-details/user-details.component.spec.ts +++ b/web-app/admin/src/app/admin/admin-users/user-details/user-details.component.spec.ts @@ -139,8 +139,7 @@ describe('UserDetailsComponent', () => { routerSpy = jasmine.createSpyObj('Router', ['navigate']); await TestBed.configureTestingModule({ - imports: [FormsModule], - declarations: [UserDetailsComponent], + imports: [FormsModule, UserDetailsComponent], providers: [ { provide: ActivatedRoute, diff --git a/web-app/admin/src/app/admin/admin-users/user-details/user-details.component.ts b/web-app/admin/src/app/admin/admin-users/user-details/user-details.component.ts index 1bf9d5aa7..a48474304 100644 --- a/web-app/admin/src/app/admin/admin-users/user-details/user-details.component.ts +++ b/web-app/admin/src/app/admin/admin-users/user-details/user-details.component.ts @@ -5,7 +5,7 @@ import { ElementRef, ViewChild } from '@angular/core'; -import { ActivatedRoute, Router } from '@angular/router'; +import { ActivatedRoute, Router, RouterModule } from '@angular/router'; import { catchError, EMPTY, @@ -18,13 +18,13 @@ import { take, takeUntil } from 'rxjs'; -import { NgForm } from '@angular/forms'; +import { FormsModule, NgForm } from '@angular/forms'; import { MatDialog as MatDialog } from '@angular/material/dialog'; import { DeleteUserComponent } from '../delete-user/delete-user.component'; import { AdminTeamsService } from '../../services/admin-teams-service'; import { AdminEventsService } from '../../services/admin-events.service'; -import { MatTableDataSource as MatTableDataSource } from '@angular/material/table'; -import { PageEvent as PageEvent } from '@angular/material/paginator'; +import { MatTableDataSource as MatTableDataSource, MatTableModule } from '@angular/material/table'; +import { MatPaginatorModule, PageEvent as PageEvent } from '@angular/material/paginator'; import { AdminUserService } from '../../services/admin-user.service'; import { LocalStorageService } from '../../../../../../../web-app/src/app/http/local-storage.service'; import { User } from '../user'; @@ -37,6 +37,10 @@ import { LoginService } from '../../../services/login.service'; import { DevicePagingService } from '../../../services/device-paging.service'; import { Device } from '../../../../@types/dashboard/devices-dashboard'; import { TeamService } from '../../../../app/services/team.service'; +import { CommonModule } from '@angular/common'; +import { AdminBreadcrumbComponent } from '../../admin-breadcrumb/admin-breadcrumb.component'; +import { CardNavbarComponent } from 'admin/src/app/core/card-navbar/card-navbar.component'; +import { LoginsModule } from 'admin/src/app/logins/logins.module'; interface Login { id: string; @@ -63,6 +67,17 @@ interface IconMetadata { @Component({ selector: 'mage-user-details', + standalone: true, + imports: [ + CommonModule, + FormsModule, + RouterModule, + MatTableModule, + MatPaginatorModule, + AdminBreadcrumbComponent, + CardNavbarComponent, + LoginsModule + ], templateUrl: './user-details.component.html', styleUrls: ['./user-details.component.scss'] }) diff --git a/web-app/admin/src/app/admin/admin-users/user-search/user-search-box.component.spec.ts b/web-app/admin/src/app/admin/admin-users/user-search/user-search-box.component.spec.ts index 05d49d4b8..ad529ca06 100644 --- a/web-app/admin/src/app/admin/admin-users/user-search/user-search-box.component.spec.ts +++ b/web-app/admin/src/app/admin/admin-users/user-search/user-search-box.component.spec.ts @@ -41,8 +41,7 @@ describe('UserSearchBoxComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [FormsModule], - declarations: [UserSearchBoxComponent], + imports: [FormsModule, UserSearchBoxComponent], providers: [{ provide: UserPagingService, useValue: mockUserPaging }] }).compileComponents(); diff --git a/web-app/admin/src/app/admin/admin-users/user-search/user-search-box.component.ts b/web-app/admin/src/app/admin/admin-users/user-search/user-search-box.component.ts index 04ccd7bcf..6d759fe47 100644 --- a/web-app/admin/src/app/admin/admin-users/user-search/user-search-box.component.ts +++ b/web-app/admin/src/app/admin/admin-users/user-search/user-search-box.component.ts @@ -3,9 +3,16 @@ import { User } from '../user'; import { UserPagingService } from '../../../services/user-paging.service'; import { Subject, of, lastValueFrom } from 'rxjs'; import { catchError, debounceTime, distinctUntilChanged, switchMap, takeUntil } from 'rxjs/operators'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; @Component({ selector: 'user-search-box', + standalone: true, + imports: [ + CommonModule, + FormsModule + ], templateUrl: './user-search-box.component.html', styleUrls: ['./user-search-box.component.scss'] }) diff --git a/web-app/admin/src/app/admin/admin.module.ts b/web-app/admin/src/app/admin/admin.module.ts index 06082fff1..98b612175 100644 --- a/web-app/admin/src/app/admin/admin.module.ts +++ b/web-app/admin/src/app/admin/admin.module.ts @@ -23,9 +23,11 @@ import { AdminGuard } from './services/admin-guard.service'; import { PluginModule } from './admin-plugins/plugins.module'; import { RouterModule } from '@angular/router'; - @NgModule({ imports: [ + AdminComponent, + AdminNavComponent, + AdminPluginTabContentComponent, CommonModule, FormsModule, AdminBreadcrumbModule, @@ -41,11 +43,6 @@ import { RouterModule } from '@angular/router'; PluginModule, RouterModule ], - declarations: [ - AdminComponent, - AdminNavComponent, - AdminPluginTabContentComponent - ], exports: [AdminComponent], providers: [AdminGuard] }) diff --git a/web-app/admin/src/app/admin/services/admin-user.service.ts b/web-app/admin/src/app/admin/services/admin-user.service.ts index 2c040aeae..9ec3a9249 100644 --- a/web-app/admin/src/app/admin/services/admin-user.service.ts +++ b/web-app/admin/src/app/admin/services/admin-user.service.ts @@ -1,10 +1,5 @@ import { Injectable } from '@angular/core'; -import { - HttpClient, - HttpParams, - HttpRequest, - HttpEvent -} from '@angular/common/http'; +import { HttpClient, HttpParams, HttpRequest, HttpEvent } from '@angular/common/http'; import { ActivatedRoute, Router } from '@angular/router'; import { Observable, BehaviorSubject, of } from 'rxjs'; import { map, catchError, tap } from 'rxjs/operators'; diff --git a/web-app/admin/src/app/api/api.service.spec.ts b/web-app/admin/src/app/api/api.service.spec.ts index e9606faa7..c79acc577 100644 --- a/web-app/admin/src/app/api/api.service.spec.ts +++ b/web-app/admin/src/app/api/api.service.spec.ts @@ -1,5 +1,5 @@ -import { HttpClient } from '@angular/common/http'; -import { HttpTestingController, HttpClientTestingModule } from '@angular/common/http/testing'; +import { HttpClient, provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; +import { HttpTestingController, provideHttpClientTesting } from '@angular/common/http/testing'; import { TestBed } from '@angular/core/testing'; import { ApiService } from './api.service'; @@ -9,9 +9,9 @@ describe('API Service Tests', () => { beforeEach(() => { TestBed.configureTestingModule({ - providers: [], - imports: [HttpClientTestingModule] - }); + imports: [], + providers: [provideHttpClient(withInterceptorsFromDi()), provideHttpClientTesting()] +}); // Inject the http service and test controller for each test httpClient = TestBed.inject(HttpClient); diff --git a/web-app/admin/src/app/app.module.ts b/web-app/admin/src/app/app.module.ts index 6e19e4f3c..99d44b6be 100644 --- a/web-app/admin/src/app/app.module.ts +++ b/web-app/admin/src/app/app.module.ts @@ -24,8 +24,8 @@ import { MatCardModule as MatCardModule } from '@angular/material/card'; import { MatCheckboxModule as MatCheckboxModule } from '@angular/material/checkbox'; import { MatChipsModule as MatChipsModule } from '@angular/material/chips'; import { MatRippleModule, MatNativeDateModule } from '@angular/material/core'; -import { MatDatepickerModule } from '@angular/material/datepicker' -import { MatMomentDateModule } from '@angular/material-moment-adapter' +import { MatDatepickerModule } from '@angular/material/datepicker'; +import { MatMomentDateModule } from '@angular/material-moment-adapter'; import { MatDialogModule as MatDialogModule } from '@angular/material/dialog'; import { MatExpansionModule } from '@angular/material/expansion'; import { MatFormFieldModule as MatFormFieldModule } from '@angular/material/form-field'; @@ -52,7 +52,11 @@ import { MatMenuModule as MatMenuModule } from '@angular/material/menu'; import { InputMaskModule } from '@ngneat/input-mask'; -import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http'; +import { + HTTP_INTERCEPTORS, + provideHttpClient, + withInterceptorsFromDi +} from '@angular/common/http'; import { CommonModule } from '@angular/common'; import { ColorPickerComponent } from './color-picker/color-picker.component'; @@ -113,7 +117,8 @@ import { AuthenticationModule } from './authentication/authentication.module'; import { AppRoutingModule } from './routing.module'; @NgModule({ - declarations: [ + bootstrap: [BootstrapComponent], + imports: [ ColorPickerComponent, DMSValidatorDirective, MGRSValidatorDirective, @@ -141,12 +146,9 @@ import { AppRoutingModule } from './routing.module'; AdminAuthenticationSettingsComponent, AdminSettingsUnsavedComponent, AdminMapComponent, - AdminNavigationComponent - ], - imports: [ + AdminNavigationComponent, CommonModule, BrowserModule, - HttpClientModule, FormsModule, ReactiveFormsModule, BrowserAnimationsModule, @@ -214,9 +216,17 @@ import { AppRoutingModule } from './routing.module'; AppRoutingModule ], providers: [ - { provide: HTTP_INTERCEPTORS, useClass: TokenInterceptorService, multi: true }, - { provide: HTTP_INTERCEPTORS, useClass: AuthBufferInterceptor, multi: true } - ], - bootstrap: [BootstrapComponent] + { + provide: HTTP_INTERCEPTORS, + useClass: TokenInterceptorService, + multi: true + }, + { + provide: HTTP_INTERCEPTORS, + useClass: AuthBufferInterceptor, + multi: true + }, + provideHttpClient(withInterceptorsFromDi()) + ] }) export class AppModule {} diff --git a/web-app/admin/src/app/authentication/authentication.module.ts b/web-app/admin/src/app/authentication/authentication.module.ts index cb030ef8d..40c981639 100644 --- a/web-app/admin/src/app/authentication/authentication.module.ts +++ b/web-app/admin/src/app/authentication/authentication.module.ts @@ -1,12 +1,5 @@ import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; import { CommonModule } from '@angular/common'; -import { FormsModule } from '@angular/forms'; -import { MatDialogModule as MatDialogModule } from '@angular/material/dialog'; -import { MatButtonModule as MatButtonModule } from '@angular/material/button'; -import { MatIconModule } from '@angular/material/icon'; -import { MatProgressBarModule as MatProgressBarModule } from '@angular/material/progress-bar'; -import { MatSnackBarModule as MatSnackBarModule } from '@angular/material/snack-bar'; - import { ContactModule } from '../contact/contact.module'; import { LocalSigninComponent } from './local-signin/local-signin.component'; import { IdpSigninComponent } from './idp-signin/idp-signin.component'; @@ -18,7 +11,9 @@ import { AuthenticationComponent } from './authentication/authentication.compone import { SigninModalComponent } from './signin-modal/signin-modal.component'; @NgModule({ - declarations: [ + imports: [ + CommonModule, + ContactModule, LocalSigninComponent, IdpSigninComponent, LdapSigninComponent, @@ -28,16 +23,6 @@ import { SigninModalComponent } from './signin-modal/signin-modal.component'; AuthenticationComponent, SigninModalComponent ], - imports: [ - CommonModule, - FormsModule, - MatDialogModule, - MatButtonModule, - MatIconModule, - MatProgressBarModule, - MatSnackBarModule, - ContactModule - ], exports: [ LocalSigninComponent, IdpSigninComponent, diff --git a/web-app/admin/src/app/authentication/authentication/authentication.component.ts b/web-app/admin/src/app/authentication/authentication/authentication.component.ts index 7f50e7bf2..c80c6f722 100644 --- a/web-app/admin/src/app/authentication/authentication/authentication.component.ts +++ b/web-app/admin/src/app/authentication/authentication/authentication.component.ts @@ -1,3 +1,4 @@ +import { CommonModule } from '@angular/common'; import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { UserService } from 'mage-web-app/user/user.service'; @@ -5,6 +6,9 @@ import { AuthService } from '../auth.service'; import { Api } from '../signin/signin.component'; import { AuthenticationStrategy } from '../local-signin/local-signin.component'; import { SigninEvent } from '../auth.types'; +import { AuthorizeComponent } from '../authorize/authorize.component'; +import { LocalSignupComponent } from '../local-signup/local-signup.component'; +import { SigninComponent } from '../signin/signin.component'; type AuthenticationAction = | 'setup' @@ -19,6 +23,13 @@ type AuthenticationAction = @Component({ selector: 'authentication', + standalone: true, + imports: [ + CommonModule, + AuthorizeComponent, + LocalSignupComponent, + SigninComponent + ], templateUrl: './authentication.component.html', styleUrls: ['./authentication.component.scss'] }) @@ -41,7 +52,6 @@ export class AuthenticationComponent implements OnInit { ) {} ngOnInit(): void { - // Angular Router replacement for $stateParams const qp = this.route.snapshot.queryParamMap; this.action = (qp.get('action') as AuthenticationAction) || null; this.strategy = qp.get('strategy') || ''; @@ -71,19 +81,19 @@ export class AuthenticationComponent implements OnInit { authorized(): void { const disclaimer = this.api?.disclaimer || { show: false }; - + if (!disclaimer.show) { this.onSuccess.emit(); return; } - + this.action = 'disclaimer'; - } + } acceptDisclaimer(): void { this.userService.acceptDisclaimer(); this.onSuccess.emit(); - } + } onSignin(event: SigninEvent): void { this.user = event.user; @@ -91,4 +101,4 @@ export class AuthenticationComponent implements OnInit { this.strategy = event.strategy; this.action = 'authorize-device'; } -} +} \ No newline at end of file diff --git a/web-app/admin/src/app/authentication/authorize/authorize.component.ts b/web-app/admin/src/app/authentication/authorize/authorize.component.ts index d6eb13f09..2459967d8 100644 --- a/web-app/admin/src/app/authentication/authorize/authorize.component.ts +++ b/web-app/admin/src/app/authentication/authorize/authorize.component.ts @@ -9,9 +9,18 @@ import { } from '@angular/core'; import { AdminUserService } from '../../admin/services/admin-user.service'; import { ContactInfo } from '../local-signin/local-signin.component'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { ContactModule } from '../../contact/contact.module'; @Component({ selector: 'authorize', + standalone: true, + imports: [ + CommonModule, + FormsModule, + ContactModule + ], templateUrl: './authorize.component.html', styleUrls: ['./authorize.component.scss'] }) diff --git a/web-app/admin/src/app/authentication/idp-signin/idp-signin.component.ts b/web-app/admin/src/app/authentication/idp-signin/idp-signin.component.ts index 4ed799877..43c95ccd8 100644 --- a/web-app/admin/src/app/authentication/idp-signin/idp-signin.component.ts +++ b/web-app/admin/src/app/authentication/idp-signin/idp-signin.component.ts @@ -3,9 +3,16 @@ import { UserService } from 'mage-web-app/user/user.service' import { SigninEvent } from '../auth.types' import { AuthenticationStrategy, ContactInfo } from '../local-signin/local-signin.component' import { take } from 'rxjs/operators' +import { CommonModule } from '@angular/common' +import { ContactModule } from '../../contact/contact.module' @Component({ selector: 'idp-signin', + standalone: true, + imports: [ + CommonModule, + ContactModule + ], templateUrl: './idp-signin.component.html', styleUrls: ['./idp-signin.component.scss'] }) diff --git a/web-app/admin/src/app/authentication/ldap-signin/ldap-signin.component.ts b/web-app/admin/src/app/authentication/ldap-signin/ldap-signin.component.ts index 35a84a306..3a85706be 100644 --- a/web-app/admin/src/app/authentication/ldap-signin/ldap-signin.component.ts +++ b/web-app/admin/src/app/authentication/ldap-signin/ldap-signin.component.ts @@ -5,9 +5,18 @@ import { AuthenticationStrategy, ContactInfo } from '../local-signin/local-signin.component'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { ContactModule } from '../../contact/contact.module'; @Component({ selector: 'ldap-signin', + standalone: true, + imports: [ + CommonModule, + FormsModule, + ContactModule + ], templateUrl: './ldap-signin.component.html', styleUrls: ['./ldap-signin.component.scss'] }) diff --git a/web-app/admin/src/app/authentication/local-signin/local-signin.component.ts b/web-app/admin/src/app/authentication/local-signin/local-signin.component.ts index dad523687..17008b0c9 100644 --- a/web-app/admin/src/app/authentication/local-signin/local-signin.component.ts +++ b/web-app/admin/src/app/authentication/local-signin/local-signin.component.ts @@ -1,94 +1,120 @@ -import { Component, EventEmitter, Input, Output, AfterViewInit, ElementRef, ViewChild } from '@angular/core' -import { UserService } from 'mage-web-app/user/user.service' -import { SigninEvent } from '../auth.types' -import { take } from 'rxjs/operators' +import { + Component, + EventEmitter, + Input, + Output, + AfterViewInit, + ElementRef, + ViewChild +} from '@angular/core'; +import { UserService } from 'mage-web-app/user/user.service'; +import { SigninEvent } from '../auth.types'; +import { take } from 'rxjs/operators'; +import { CommonModule } from '@angular/common'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatProgressBarModule } from '@angular/material/progress-bar'; +import { ContactModule } from '../../contact/contact.module'; export interface AuthenticationStrategy { - name: string - title?: string - type?: string - buttonColor?: string - textColor?: string - icon?: string + name: string; + title?: string; + type?: string; + buttonColor?: string; + textColor?: string; + icon?: string; } export interface ContactInfo { - statusTitle: string - statusMessage: string - id: string + statusTitle: string; + statusMessage: string; + id: string; } @Component({ selector: 'local-signin', + standalone: true, + imports: [ + CommonModule, + FormsModule, + ReactiveFormsModule, + MatFormFieldModule, + MatInputModule, + MatProgressBarModule, + MatButtonModule, + ContactModule + ], templateUrl: './local-signin.component.html', styleUrls: ['./local-signin.component.scss'] }) export class LocalSigninComponent implements AfterViewInit { - @Input() strategy: AuthenticationStrategy - @Input() hideSignup = false - @Output() onSignin = new EventEmitter() - @Output() onSignup = new EventEmitter() + @Input() strategy: AuthenticationStrategy; + @Input() hideSignup = false; + @Output() onSignin = new EventEmitter(); + @Output() onSignup = new EventEmitter(); - @ViewChild('usernameInput') usernameInput: ElementRef - @ViewChild('passwordInput') passwordInput: ElementRef + @ViewChild('usernameInput') usernameInput: ElementRef; + @ViewChild('passwordInput') passwordInput: ElementRef; - private _username = '' - private _password = '' + private _username = ''; + private _password = ''; get username(): string { - return this._username + return this._username; } set username(value: string) { - this._username = value + this._username = value; if (value) { - this.usernameValid = true + this.usernameValid = true; } if (this.statusMessage) { - this.statusMessage = '' + this.statusMessage = ''; } } get password(): string { - return this._password + return this._password; } set password(value: string) { - this._password = value + this._password = value; if (value) { - this.passwordValid = true + this.passwordValid = true; } if (this.statusMessage) { - this.statusMessage = '' + this.statusMessage = ''; } } - statusTitle = '' - statusMessage = '' - info: ContactInfo - contactOpen = { opened: false } + statusTitle = ''; + statusMessage = ''; + info: ContactInfo; + contactOpen = { opened: false }; - usernameValid = true - passwordValid = true + usernameValid = true; + passwordValid = true; constructor(private userService: UserService) {} ngAfterViewInit(): void {} signin(): void { - this.usernameValid = true - this.passwordValid = true - this.statusMessage = '' + this.usernameValid = true; + this.passwordValid = true; + this.statusMessage = ''; if (!this.username || this.username.trim() === '') { - this.usernameValid = false + this.usernameValid = false; } if (!this.password || this.password.trim() === '') { - this.passwordValid = false + this.passwordValid = false; } if (!this.usernameValid || !this.passwordValid) { - return + return; } this.userService @@ -100,32 +126,32 @@ export class LocalSigninComponent implements AfterViewInit { user: response.user, token: response.token, strategy: this.strategy.name - }) + }); }, error: (response: any) => { - this.statusTitle = 'Error signing in' + this.statusTitle = 'Error signing in'; this.statusMessage = response?.error?.data || response?.error?.errorMessage || response?.error?.message || response?.message || - 'Please check your username and password and try again.' + 'Please check your username and password and try again.'; this.info = { statusTitle: this.statusTitle, statusMessage: this.statusMessage, id: this.username - } - this.contactOpen = { opened: true } + }; + this.contactOpen = { opened: true }; } - }) + }); } signupClicked(): void { - this.onSignup.emit() + this.onSignup.emit(); } onContactClose(): void { - this.contactOpen = { opened: false } + this.contactOpen = { opened: false }; } } diff --git a/web-app/admin/src/app/authentication/local-signup/local-signup.component.ts b/web-app/admin/src/app/authentication/local-signup/local-signup.component.ts index 446e46733..5cbd8b905 100644 --- a/web-app/admin/src/app/authentication/local-signup/local-signup.component.ts +++ b/web-app/admin/src/app/authentication/local-signup/local-signup.component.ts @@ -1,4 +1,6 @@ +import { CommonModule } from '@angular/common' import { Component, EventEmitter, Input, Output, OnInit, AfterViewInit, ElementRef, ViewChild } from '@angular/core' +import { FormsModule } from '@angular/forms' import { UserService } from 'mage-web-app/user/user.service' import { AuthenticationStrategy } from '../local-signin/local-signin.component' import { zxcvbn } from '@zxcvbn-ts/core' @@ -24,6 +26,11 @@ const passwordStrengthMap: { [key: number]: { type: string; text: string } } = { @Component({ selector: 'local-signup', + standalone: true, + imports: [ + CommonModule, + FormsModule + ], templateUrl: './local-signup.component.html', styleUrls: ['./local-signup.component.scss'] }) @@ -79,7 +86,10 @@ export class LocalSignupComponent implements OnInit, AfterViewInit { }, error: (err: any) => { this.loadingCaptcha = false - this.showStatusMessage('Could Not Load Captcha', err?.error?.data || err?.error?.message || err?.message || 'Unknown error') + this.showStatusMessage( + 'Could Not Load Captcha', + err?.error?.data || err?.error?.message || err?.message || 'Unknown error' + ) } }) } @@ -174,4 +184,4 @@ export class LocalSignupComponent implements OnInit, AfterViewInit { cancelSignup(): void { this.onCancel.emit() } -} +} \ No newline at end of file diff --git a/web-app/admin/src/app/authentication/signin-modal/signin-modal.component.ts b/web-app/admin/src/app/authentication/signin-modal/signin-modal.component.ts index d6d2b47b8..bebffcca5 100644 --- a/web-app/admin/src/app/authentication/signin-modal/signin-modal.component.ts +++ b/web-app/admin/src/app/authentication/signin-modal/signin-modal.component.ts @@ -1,12 +1,16 @@ +import { CommonModule } from '@angular/common'; import { Component, Inject } from '@angular/core'; -import { MatDialogRef as MatDialogRef, MAT_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; import { AuthService } from '../auth.service'; import { UserService } from 'mage-web-app/user/user.service'; import { LocalStorageService } from 'src/app/http/local-storage.service'; import { Api } from '../signin/signin.component'; +import { AuthenticationComponent } from '../authentication/authentication.component'; @Component({ selector: 'signin-modal', + standalone: true, + imports: [CommonModule, AuthenticationComponent], templateUrl: './signin-modal.component.html', styleUrls: ['./signin-modal.component.scss'] }) @@ -23,7 +27,7 @@ export class SigninModalComponent { ) { this.api = data.api; } - + onAuthFlowSuccess(): void { const token = this.localStorageService.getToken(); diff --git a/web-app/admin/src/app/authentication/signin/signin.component.ts b/web-app/admin/src/app/authentication/signin/signin.component.ts index 5497e343c..765717e7b 100644 --- a/web-app/admin/src/app/authentication/signin/signin.component.ts +++ b/web-app/admin/src/app/authentication/signin/signin.component.ts @@ -1,7 +1,10 @@ import { Component, EventEmitter, Inject, Input, OnInit, Output } from '@angular/core'; import { UserService } from 'mage-web-app/user/user.service'; import { SigninEvent } from '../auth.types'; -import { AuthenticationStrategy } from '../local-signin/local-signin.component'; +import { AuthenticationStrategy, LocalSigninComponent } from '../local-signin/local-signin.component'; +import { CommonModule } from '@angular/common'; +import { IdpSigninComponent } from '../idp-signin/idp-signin.component'; +import { LdapSigninComponent } from '../ldap-signin/ldap-signin.component'; export interface ApiAuthenticationStrategies { local?: AuthenticationStrategy; @@ -24,6 +27,13 @@ export interface Api { @Component({ selector: 'signin', + standalone: true, + imports: [ + CommonModule, + LocalSigninComponent, + IdpSigninComponent, + LdapSigninComponent + ], templateUrl: './signin.component.html', styleUrls: ['./signin.component.scss'] }) diff --git a/web-app/admin/src/app/banner/banner.component.ts b/web-app/admin/src/app/banner/banner.component.ts index ff5a3e189..f0b128ad7 100644 --- a/web-app/admin/src/app/banner/banner.component.ts +++ b/web-app/admin/src/app/banner/banner.component.ts @@ -1,5 +1,6 @@ import { Component, ElementRef, Input, OnInit, HostBinding } from '@angular/core'; import { HttpClient } from '@angular/common/http'; +import { CommonModule } from '@angular/common'; interface Banner { headerTextColor: string; @@ -14,6 +15,10 @@ interface Banner { @Component({ selector: 'banner', + standalone: true, + imports: [ + CommonModule + ], templateUrl: './banner.component.html', styleUrls: ['./banner.component.scss'] }) diff --git a/web-app/admin/src/app/bootstrap/bootstrap.component.spec.ts b/web-app/admin/src/app/bootstrap/bootstrap.component.spec.ts index 7b334410a..b92dd7e07 100644 --- a/web-app/admin/src/app/bootstrap/bootstrap.component.spec.ts +++ b/web-app/admin/src/app/bootstrap/bootstrap.component.spec.ts @@ -1,46 +1,34 @@ -import { Component } from '@angular/core'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { Subject, of } from 'rxjs'; import { BootstrapComponent } from './bootstrap.component'; import { AdminUserService } from '../admin/services/admin-user.service'; -@Component({ - selector: 'admin-navigation', - template: '' -}) -class MockAdminNavigationComponent {} - describe('BootstrapComponent', () => { let component: BootstrapComponent; - let fixture: ComponentFixture; - let adminUserService: jasmine.SpyObj; let myself$: Subject; - beforeEach(waitForAsync(() => { + beforeEach(() => { myself$ = new Subject(); - adminUserService = jasmine.createSpyObj('AdminUserService', [ - 'checkLoggedInUser' - ]); + adminUserService = jasmine.createSpyObj( + 'AdminUserService', + ['checkLoggedInUser'] + ); adminUserService.checkLoggedInUser.and.returnValue(of(null)); Object.defineProperty(adminUserService, 'myself$', { - value: myself$.asObservable() + get: () => myself$.asObservable() }); - TestBed.configureTestingModule({ - declarations: [BootstrapComponent, MockAdminNavigationComponent], - providers: [{ provide: AdminUserService, useValue: adminUserService }] - }).compileComponents(); - })); + component = new BootstrapComponent(adminUserService as any); + component.ngOnInit(); + }); - beforeEach(() => { - fixture = TestBed.createComponent(BootstrapComponent); - component = fixture.componentInstance; - fixture.detectChanges(); + afterEach(() => { + component.ngOnDestroy?.(); + myself$.complete(); }); it('should create', () => { @@ -53,7 +41,9 @@ describe('BootstrapComponent', () => { it('updates myself when myself$ emits', () => { const u = { id: 'u1' } as any; + myself$.next(u); + expect(component.myself).toBe(u); }); -}); \ No newline at end of file +}); diff --git a/web-app/admin/src/app/bootstrap/bootstrap.component.ts b/web-app/admin/src/app/bootstrap/bootstrap.component.ts index 7c939f1a2..ef35e6350 100644 --- a/web-app/admin/src/app/bootstrap/bootstrap.component.ts +++ b/web-app/admin/src/app/bootstrap/bootstrap.component.ts @@ -3,9 +3,21 @@ import { Subject, takeUntil } from 'rxjs'; import { AdminUserService } from '../admin/services/admin-user.service'; import { User } from '../admin/admin-users/user'; +import { CommonModule } from '@angular/common'; +import { RouterModule } from '@angular/router'; +import { BannerComponent } from '../banner/banner.component'; +import { AdminNavigationComponent } from '../navigation/admin-navigation.component'; @Component({ selector: 'bootstrap', + standalone: true, + imports: [ + CommonModule, + RouterModule, + BannerComponent, + AdminNavigationComponent + ], + templateUrl: './bootstrap.component.html', styleUrls: ['./bootstrap.component.scss'] }) diff --git a/web-app/admin/src/app/change-detection.spec.ts b/web-app/admin/src/app/change-detection.spec.ts index 573432463..0e7b0a035 100644 --- a/web-app/admin/src/app/change-detection.spec.ts +++ b/web-app/admin/src/app/change-detection.spec.ts @@ -1,122 +1,128 @@ -import { Component, Input, OnChanges, SimpleChange, SimpleChanges } from '@angular/core' -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' -import { FormsModule, ReactiveFormsModule } from '@angular/forms' -import { By } from '@angular/platform-browser' -import * as _ from 'lodash' -import { BehaviorSubject } from 'rxjs' - +import { CommonModule } from '@angular/common'; +import { + Component, + Input, + OnChanges, + SimpleChange, + SimpleChanges +} from '@angular/core'; +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import * as _ from 'lodash'; +import { BehaviorSubject } from 'rxjs'; @Component({ + selector: 'test-change-consumer', + standalone: true, + imports: [CommonModule], template: `
    -
  • {{key1}}
  • +
  • {{ key1 }}
    • -
    • {{x}}
    • +
    • {{ x }}
  • -
  • {{key3 | json}}
  • +
  • {{ key3 | json }}
- `, - selector: 'test-change-consumer' + ` }) class ChangeConsumerComponent implements OnChanges { + @Input() key1: string; + @Input() key2: string[]; + @Input() key3: any; - @Input() key1: string - @Input() key2: string[] - @Input() key3: any - - changes = new BehaviorSubject({}) + changes = new BehaviorSubject({}); - ngOnChanges(changes) { - this.changes.next(changes) + ngOnChanges(changes: SimpleChanges) { + this.changes.next(changes); } } @Component({ - template: `` + standalone: true, + imports: [ChangeConsumerComponent], + template: `` }) class TestHostComponent { - state: { - key1: string - key2: string[] - key3: any - } + key1: string; + key2: string[]; + key3: any; + }; constructor() { this.state = { key1: null, key2: [], key3: {} - } + }; } } describe('change detection', () => { - - let fixture: ComponentFixture - let host: TestHostComponent - let target: ChangeConsumerComponent + let fixture: ComponentFixture; + let host: TestHostComponent; + let target: ChangeConsumerComponent; beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - providers: [], - imports: [ - FormsModule, - ReactiveFormsModule, - ], - declarations: [ - ChangeConsumerComponent, - TestHostComponent - ] - }) - .compileComponents() - })) + imports: [TestHostComponent] + }).compileComponents(); + })); - let changes: SimpleChanges[] + let changes: SimpleChanges[]; beforeEach(() => { - fixture = TestBed.createComponent(TestHostComponent) - fixture.autoDetectChanges(false) - host = fixture.componentInstance - target = fixture.debugElement.query(By.directive(ChangeConsumerComponent)).references.target - changes = [] + fixture = TestBed.createComponent(TestHostComponent); + fixture.autoDetectChanges(false); + host = fixture.componentInstance; + fixture.detectChanges(); + target = fixture.debugElement.query( + By.directive(ChangeConsumerComponent) + ).componentInstance; + changes = []; target.changes.subscribe((x: SimpleChanges) => { - changes.push(_.mapValues(x, (change: SimpleChange) => { - return new SimpleChange(change.previousValue, change.currentValue, change.firstChange) - })) - }) - }) + changes.push( + _.mapValues(x, (change: SimpleChange) => { + return new SimpleChange( + change.previousValue, + change.currentValue, + change.firstChange + ); + }) + ); + }); + }); it('should create', () => { - expect(target).toBeTruthy() - }) + expect(target).toBeTruthy(); + }); it('detects changes', () => { + changes = []; - fixture.detectChanges() - host.state = { ...host.state, key1: 'abc' } - fixture.detectChanges() - host.state = { ...host.state, key1: 'abc' } - fixture.detectChanges() - host.state = { ...host.state, key1: 'def' } - fixture.detectChanges() + host.state = { ...host.state, key1: 'abc' }; + fixture.detectChanges(); + host.state = { ...host.state, key1: 'abc' }; + fixture.detectChanges(); + host.state = { ...host.state, key1: 'def' }; + fixture.detectChanges(); expect(changes).toEqual([ - { - key1: new SimpleChange(undefined, null, true), - key2: new SimpleChange(undefined, [], true), - key3: new SimpleChange(undefined, {}, true) - }, { key1: new SimpleChange(null, 'abc', false) }, { key1: new SimpleChange('abc', 'def', false) } - ]) - }) -}) + ]); + }); +}); diff --git a/web-app/admin/src/app/color-picker/color-picker.component.spec.ts b/web-app/admin/src/app/color-picker/color-picker.component.spec.ts index ba8479dc4..dc5aab99f 100644 --- a/web-app/admin/src/app/color-picker/color-picker.component.spec.ts +++ b/web-app/admin/src/app/color-picker/color-picker.component.spec.ts @@ -4,19 +4,25 @@ import { ColorPickerComponent } from './color-picker.component'; import { MatCardModule as MatCardModule } from '@angular/material/card'; import { MatFormFieldModule as MatFormFieldModule } from '@angular/material/form-field'; import { MatInputModule as MatInputModule } from '@angular/material/input'; -import { CheckboardModule, SaturationModule, HueModule, AlphaModule } from 'ngx-color'; +import { + CheckboardModule, + SaturationModule, + HueModule, + AlphaModule +} from 'ngx-color'; import { Component, ViewChild } from '@angular/core'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { TinyColor } from '@ctrl/tinycolor'; @Component({ - selector: `host-component`, + standalone: true, + imports: [ColorPickerComponent], template: `` }) class TestHostComponent { hexColor = '#000000FF'; - @ViewChild(ColorPickerComponent) colorPicker: ColorPickerComponent; + @ViewChild(ColorPickerComponent) colorPicker: ColorPickerComponent; } describe('ColorPickerComponent', () => { @@ -26,10 +32,19 @@ describe('ColorPickerComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - imports: [ NoopAnimationsModule, MatInputModule, MatFormFieldModule, MatCardModule, CheckboardModule, SaturationModule, HueModule, AlphaModule ], - declarations: [ TestHostComponent, ColorPickerComponent ] - }) - .compileComponents(); + imports: [ + NoopAnimationsModule, + MatInputModule, + MatFormFieldModule, + MatCardModule, + CheckboardModule, + SaturationModule, + HueModule, + AlphaModule, + TestHostComponent, + ColorPickerComponent + ], + }).compileComponents(); })); beforeEach(() => { @@ -43,7 +58,6 @@ describe('ColorPickerComponent', () => { expect(component).toBeTruthy(); }); - it('should show color picker on open', () => { component.open(); expect(component.showColorPicker).toEqual(true); @@ -67,5 +81,3 @@ describe('ColorPickerComponent', () => { }); }); }); - - diff --git a/web-app/admin/src/app/color-picker/color-picker.component.ts b/web-app/admin/src/app/color-picker/color-picker.component.ts index f6c58905a..f816510b2 100644 --- a/web-app/admin/src/app/color-picker/color-picker.component.ts +++ b/web-app/admin/src/app/color-picker/color-picker.component.ts @@ -6,8 +6,13 @@ import { Input, HostListener } from '@angular/core'; -import { ColorWrap, RGBA, toState } from 'ngx-color'; +import { AlphaModule, CheckboardModule, ColorWrap, HueModule, RGBA, SaturationModule, toState } from 'ngx-color'; import { TinyColor } from '@ctrl/tinycolor'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { MatCardModule } from '@angular/material/card'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; export interface ColorEvent { color: string; @@ -15,6 +20,18 @@ export interface ColorEvent { @Component({ selector: 'color-picker', + standalone: true, + imports: [ + CommonModule, + FormsModule, + MatFormFieldModule, + MatInputModule, + MatCardModule, + CheckboardModule, + SaturationModule, + HueModule, + AlphaModule + ], templateUrl: './color-picker.component.html', styleUrls: ['./color-picker.component.scss'] }) diff --git a/web-app/admin/src/app/contact/contact-dialog.component.scss b/web-app/admin/src/app/contact/contact-dialog.component.scss index dffba0cf7..4d132b0cd 100644 --- a/web-app/admin/src/app/contact/contact-dialog.component.scss +++ b/web-app/admin/src/app/contact/contact-dialog.component.scss @@ -3,7 +3,7 @@ button { margin-left: 8px; - color: mat.get-color-from-palette($app-primary); + color: mat.m2-get-color-from-palette($app-primary); } mat-dialog-actions { diff --git a/web-app/admin/src/app/contact/contact-dialog.component.ts b/web-app/admin/src/app/contact/contact-dialog.component.ts index d0e78cf7d..d8c04a059 100644 --- a/web-app/admin/src/app/contact/contact-dialog.component.ts +++ b/web-app/admin/src/app/contact/contact-dialog.component.ts @@ -1,9 +1,15 @@ import { Component, Inject, OnInit } from "@angular/core"; -import { MatDialogRef as MatDialogRef, MAT_DIALOG_DATA as MAT_DIALOG_DATA } from "@angular/material/dialog"; +import { MatDialogRef as MatDialogRef, MAT_DIALOG_DATA as MAT_DIALOG_DATA, MatDialogModule } from "@angular/material/dialog"; import { LinkGenerator } from "./utilities/link-generator"; +import { CommonModule } from "@angular/common"; @Component({ selector: 'contact-dialog', + standalone: true, + imports: [ + CommonModule, + MatDialogModule + ], templateUrl: 'contact-dialog.component.html', styleUrls: ['./contact-dialog.component.scss'], }) diff --git a/web-app/admin/src/app/contact/contact.component.spec.ts b/web-app/admin/src/app/contact/contact.component.spec.ts index 624a2beb8..916e89fe7 100644 --- a/web-app/admin/src/app/contact/contact.component.spec.ts +++ b/web-app/admin/src/app/contact/contact.component.spec.ts @@ -1,7 +1,8 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { ContactComponent } from './contact.component'; import { MatDialogModule as MatDialogModule } from '@angular/material/dialog'; -import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { provideHttpClientTesting } from '@angular/common/http/testing'; +import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; describe('Contact Component', () => { @@ -10,9 +11,9 @@ describe('Contact Component', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - imports: [HttpClientTestingModule, MatDialogModule], - declarations: [ContactComponent] - }).compileComponents(); + imports: [ContactComponent, MatDialogModule], + providers: [provideHttpClient(withInterceptorsFromDi()), provideHttpClientTesting()] +}).compileComponents(); })); beforeEach(() => { diff --git a/web-app/admin/src/app/contact/contact.module.ts b/web-app/admin/src/app/contact/contact.module.ts index b3d0bd06d..88152f39b 100644 --- a/web-app/admin/src/app/contact/contact.module.ts +++ b/web-app/admin/src/app/contact/contact.module.ts @@ -1,29 +1,27 @@ import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; import { FormsModule } from '@angular/forms'; -import { MatDialogModule as MatDialogModule } from '@angular/material/dialog'; -import { MatButtonModule as MatButtonModule } from '@angular/material/button'; -import { MatFormFieldModule as MatFormFieldModule } from '@angular/material/form-field'; -import { MatInputModule as MatInputModule } from '@angular/material/input'; +import { MatDialogModule } from '@angular/material/dialog'; +import { MatButtonModule } from '@angular/material/button'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; import { ContactComponent } from './contact.component'; import { ContactDialogComponent } from './contact-dialog.component'; @NgModule({ - declarations: [ - ContactComponent, - ContactDialogComponent - ], - imports: [ - CommonModule, - FormsModule, - MatDialogModule, - MatButtonModule, - MatFormFieldModule, - MatInputModule - ], - exports: [ - ContactComponent, - ContactDialogComponent - ] + imports: [ + CommonModule, + FormsModule, + MatDialogModule, + MatButtonModule, + MatFormFieldModule, + MatInputModule, + ContactComponent, + ContactDialogComponent + ], + exports: [ + ContactComponent, + ContactDialogComponent + ] }) -export class ContactModule { } +export class ContactModule { } \ No newline at end of file diff --git a/web-app/admin/src/app/core/card-navbar/card-navbar.component.spec.ts b/web-app/admin/src/app/core/card-navbar/card-navbar.component.spec.ts index f16674885..ef49b36f4 100644 --- a/web-app/admin/src/app/core/card-navbar/card-navbar.component.spec.ts +++ b/web-app/admin/src/app/core/card-navbar/card-navbar.component.spec.ts @@ -10,8 +10,7 @@ describe('CardNavbarComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [CardNavbarComponent], - imports: [FormsModule] + imports: [CardNavbarComponent, FormsModule], }) .compileComponents(); diff --git a/web-app/admin/src/app/core/card-navbar/card-navbar.component.ts b/web-app/admin/src/app/core/card-navbar/card-navbar.component.ts index d2b0b1f8b..90bc72e1d 100644 --- a/web-app/admin/src/app/core/card-navbar/card-navbar.component.ts +++ b/web-app/admin/src/app/core/card-navbar/card-navbar.component.ts @@ -1,4 +1,6 @@ +import { CommonModule } from '@angular/common'; import { Component, Input, OnInit, OnDestroy, Output, EventEmitter } from '@angular/core'; +import { FormsModule } from '@angular/forms'; import { Subject } from 'rxjs'; import { debounceTime, distinctUntilChanged, takeUntil } from 'rxjs/operators'; @@ -16,6 +18,11 @@ export interface CardActionButton { */ @Component({ selector: 'mage-card-navbar', + standalone: true, + imports: [ + CommonModule, + FormsModule + ], templateUrl: './card-navbar.component.html', styleUrls: ['./card-navbar.component.scss'] }) diff --git a/web-app/admin/src/app/core/core.module.ts b/web-app/admin/src/app/core/core.module.ts index 46a5aa41c..b6f22e7d2 100644 --- a/web-app/admin/src/app/core/core.module.ts +++ b/web-app/admin/src/app/core/core.module.ts @@ -1,13 +1,12 @@ import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; import { FormsModule } from '@angular/forms'; -import { MatDialogModule as MatDialogModule } from '@angular/material/dialog'; +import { MatDialogModule } from '@angular/material/dialog'; import { MatIconModule } from '@angular/material/icon'; -import { MatButtonModule as MatButtonModule } from '@angular/material/button'; -import { MatTableModule as MatTableModule } from '@angular/material/table'; -import { MatProgressSpinnerModule as MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatPaginatorModule as MatPaginatorModule } from '@angular/material/paginator'; -import { Component } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatTableModule } from '@angular/material/table'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { MatPaginatorModule } from '@angular/material/paginator'; import { DragDropModule } from '@angular/cdk/drag-drop'; import { CardNavbarComponent } from './card-navbar/card-navbar.component'; @@ -15,27 +14,25 @@ import { SearchModalComponent } from './search-modal/search-modal.component'; import { DraggableListComponent } from './draggable-list/draggable-list.component'; @NgModule({ - declarations: [ - CardNavbarComponent, - SearchModalComponent, - DraggableListComponent - ], - imports: [ - CommonModule, - FormsModule, - MatDialogModule, - MatIconModule, - MatButtonModule, - MatTableModule, - MatProgressSpinnerModule, - MatPaginatorModule, - DragDropModule - ], - providers: [], - exports: [ - CardNavbarComponent, - SearchModalComponent, - DraggableListComponent - ] + imports: [ + CommonModule, + FormsModule, + MatDialogModule, + MatIconModule, + MatButtonModule, + MatTableModule, + MatProgressSpinnerModule, + MatPaginatorModule, + DragDropModule, + CardNavbarComponent, + SearchModalComponent, + DraggableListComponent + ], + providers: [], + exports: [ + CardNavbarComponent, + SearchModalComponent, + DraggableListComponent + ] }) export class CoreModule { } \ No newline at end of file diff --git a/web-app/admin/src/app/core/draggable-list/draggable-list.component.ts b/web-app/admin/src/app/core/draggable-list/draggable-list.component.ts index 5deed9197..52a77a6db 100644 --- a/web-app/admin/src/app/core/draggable-list/draggable-list.component.ts +++ b/web-app/admin/src/app/core/draggable-list/draggable-list.component.ts @@ -1,5 +1,7 @@ import { Component, Input, Output, EventEmitter, TemplateRef, ContentChild } from '@angular/core'; -import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop'; +import { CdkDragDrop, DragDropModule, moveItemInArray } from '@angular/cdk/drag-drop'; +import { CommonModule } from '@angular/common'; +import { MatIconModule } from '@angular/material/icon'; /** * Generic drag-and-drop list component that can be reused for any type of items. @@ -7,6 +9,12 @@ import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop'; */ @Component({ selector: 'mage-draggable-list', + standalone: true, + imports: [ + CommonModule, + DragDropModule, + MatIconModule + ], templateUrl: './draggable-list.component.html', styleUrls: ['./draggable-list.component.scss'] }) diff --git a/web-app/admin/src/app/core/search-modal/search-modal.component.spec.ts b/web-app/admin/src/app/core/search-modal/search-modal.component.spec.ts index 9398a4968..de9d1a975 100644 --- a/web-app/admin/src/app/core/search-modal/search-modal.component.spec.ts +++ b/web-app/admin/src/app/core/search-modal/search-modal.component.spec.ts @@ -1,494 +1,521 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { MatDialogRef as MatDialogRef, MAT_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { + MatDialogRef as MatDialogRef, + MAT_DIALOG_DATA as MAT_DIALOG_DATA +} from '@angular/material/dialog'; import { MatTableModule as MatTableModule } from '@angular/material/table'; -import { MatPaginatorModule as MatPaginatorModule, PageEvent as PageEvent } from '@angular/material/paginator'; +import { + MatPaginatorModule as MatPaginatorModule, + PageEvent as PageEvent +} from '@angular/material/paginator'; import { MatIconModule } from '@angular/material/icon'; import { MatButtonModule as MatButtonModule } from '@angular/material/button'; import { Component, Input, Output, EventEmitter } from '@angular/core'; import { of, throwError } from 'rxjs'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { SearchModalComponent, SearchModalData, SearchModalResult } from './search-modal.component'; +import { + SearchModalComponent, + SearchModalData, + SearchModalResult +} from './search-modal.component'; @Component({ - selector: 'mage-card-navbar', - template: '
Mock Card Navbar
' + selector: 'mage-card-navbar', + template: '
Mock Card Navbar
' }) class MockCardNavbarComponent { - @Input() title?: string; - @Input() isSearchable = false; - @Input() searchPlaceholder = 'Search...'; - @Output() searchTermChanged = new EventEmitter(); - @Output() searchCleared = new EventEmitter(); + @Input() title?: string; + @Input() isSearchable = false; + @Input() searchPlaceholder = 'Search...'; + @Output() searchTermChanged = new EventEmitter(); + @Output() searchCleared = new EventEmitter(); } describe('SearchModalComponent', () => { - let component: SearchModalComponent; - let fixture: ComponentFixture; - let mockDialogRef: jasmine.SpyObj>; - let mockSearchFunction: jasmine.Spy; - - const mockSearchData: SearchModalData = { - title: 'Test Search Modal', - searchPlaceholder: 'Search for items...', - teamId: 'team-123', - searchFunction: jasmine.createSpy('searchFunction'), - columns: [ - { - key: 'name', - label: 'Name', - displayFunction: (item: any) => item.name, - width: '200px' - }, - { - key: 'email', - label: 'Email', - displayFunction: (item: any) => item.email - } - ], - selectedItem: null - }; - - const mockSearchResults = { - items: [ - { id: 1, name: 'John Doe', email: 'john@example.com' }, - { id: 2, name: 'Jane Smith', email: 'jane@example.com' }, - { id: 3, name: 'Bob Johnson', email: 'bob@example.com' } - ] - }; - - beforeEach(async () => { - mockDialogRef = jasmine.createSpyObj('MatDialogRef', ['close']); - mockSearchFunction = jasmine.createSpy('searchFunction').and.returnValue(of(mockSearchResults)); - mockSearchData.searchFunction = mockSearchFunction; - - await TestBed.configureTestingModule({ - declarations: [ - SearchModalComponent, - MockCardNavbarComponent - ], - imports: [ - MatTableModule, - MatPaginatorModule, - MatIconModule, - MatButtonModule, - NoopAnimationsModule - ], - providers: [ - { provide: MatDialogRef, useValue: mockDialogRef }, - { provide: MAT_DIALOG_DATA, useValue: mockSearchData } - ] - }).compileComponents(); - - fixture = TestBed.createComponent(SearchModalComponent); - component = fixture.componentInstance; - }); - - describe('Component Initialization', () => { - it('should create', () => { - expect(component).toBeTruthy(); - }); - - it('should initialize with correct data', () => { - expect(component.data).toEqual(mockSearchData); - expect(component.columns).toEqual(mockSearchData.columns); - expect(component.displayedColumns).toEqual(['name', 'email']); - expect(component.selectedItem).toBeNull(); - }); - - it('should initialize with default values', () => { - expect(component.loading).toBeFalse(); - expect(component.pageIndex).toBe(0); - expect(component.pageSize).toBe(5); - expect(component.totalCount).toBe(0); - expect(component.pageSizeOptions).toEqual([5]); - expect(component.currentSearchTerm).toBe(''); - }); - - it('should call search on init', () => { - spyOn(component, 'search'); - component.ngOnInit(); - expect(component.search).toHaveBeenCalled(); - }); - }); - - describe('Search Functionality', () => { - beforeEach(() => { - fixture.detectChanges(); - }); - - it('should perform search with correct parameters', () => { - component.currentSearchTerm = 'test'; - component.pageIndex = 1; - component.pageSize = 10; - - component.search(); - - expect(mockSearchFunction).toHaveBeenCalledWith('test', 1, 10); - }); - - it('should perform search with empty string when no search term', () => { - component.currentSearchTerm = ''; - component.search(); - - expect(mockSearchFunction).toHaveBeenCalledWith('', 0, 5); - }); - - it('should update data source and total count on successful search', () => { - component.search(); - - expect(component.dataSource.data).toEqual(mockSearchResults.items); - expect(component.totalCount).toBe(3); - expect(component.loading).toBeFalse(); - }); - - it('should handle search results without items property', () => { - mockSearchFunction.and.returnValue(of(mockSearchResults.items)); - - component.search(); - - expect(component.dataSource.data).toEqual(mockSearchResults.items); - expect(component.totalCount).toBe(3); - }); - - it('should handle search error', () => { - const consoleErrorSpy = spyOn(console, 'error'); - mockSearchFunction.and.returnValue(throwError('Search failed')); - - component.search(); - - expect(component.loading).toBeFalse(); - expect(component.dataSource.data).toEqual([]); - expect(component.totalCount).toBe(0); - expect(consoleErrorSpy).toHaveBeenCalledWith('Search error:', 'Search failed'); - }); - - it('should set loading to true during search', () => { - component.search(); - expect(component.loading).toBeFalse(); // Should be false after synchronous test completion - }); + let component: SearchModalComponent; + let fixture: ComponentFixture; + let mockDialogRef: jasmine.SpyObj>; + let mockSearchFunction: jasmine.Spy; + + const mockSearchData: SearchModalData = { + title: 'Test Search Modal', + searchPlaceholder: 'Search for items...', + teamId: 'team-123', + searchFunction: jasmine.createSpy('searchFunction'), + columns: [ + { + key: 'name', + label: 'Name', + displayFunction: (item: any) => item.name, + width: '200px' + }, + { + key: 'email', + label: 'Email', + displayFunction: (item: any) => item.email + } + ], + selectedItem: null + }; + + const mockSearchResults = { + items: [ + { id: 1, name: 'John Doe', email: 'john@example.com' }, + { id: 2, name: 'Jane Smith', email: 'jane@example.com' }, + { id: 3, name: 'Bob Johnson', email: 'bob@example.com' } + ] + }; + + beforeEach(async () => { + mockDialogRef = jasmine.createSpyObj('MatDialogRef', ['close']); + mockSearchFunction = jasmine + .createSpy('searchFunction') + .and.returnValue(of(mockSearchResults)); + mockSearchData.searchFunction = mockSearchFunction; + + await TestBed.configureTestingModule({ + imports: [ + MatTableModule, + MatPaginatorModule, + MatIconModule, + MatButtonModule, + NoopAnimationsModule, + SearchModalComponent, + MockCardNavbarComponent + ], + providers: [ + { provide: MatDialogRef, useValue: mockDialogRef }, + { provide: MAT_DIALOG_DATA, useValue: mockSearchData } + ] + }).compileComponents(); + + fixture = TestBed.createComponent(SearchModalComponent); + component = fixture.componentInstance; + }); + + describe('Component Initialization', () => { + it('should create', () => { + expect(component).toBeTruthy(); + }); + + it('should initialize with correct data', () => { + expect(component.data).toEqual(mockSearchData); + expect(component.columns).toEqual(mockSearchData.columns); + expect(component.displayedColumns).toEqual(['name', 'email']); + expect(component.selectedItem).toBeNull(); + }); + + it('should initialize with default values', () => { + expect(component.loading).toBeFalse(); + expect(component.pageIndex).toBe(0); + expect(component.pageSize).toBe(5); + expect(component.totalCount).toBe(0); + expect(component.pageSizeOptions).toEqual([5]); + expect(component.currentSearchTerm).toBe(''); + }); + + it('should call search on init', () => { + spyOn(component, 'search'); + component.ngOnInit(); + expect(component.search).toHaveBeenCalled(); + }); + }); + + describe('Search Functionality', () => { + beforeEach(() => { + fixture.detectChanges(); + }); + + it('should perform search with correct parameters', () => { + component.currentSearchTerm = 'test'; + component.pageIndex = 1; + component.pageSize = 10; + + component.search(); + + expect(mockSearchFunction).toHaveBeenCalledWith('test', 1, 10); + }); + + it('should perform search with empty string when no search term', () => { + component.currentSearchTerm = ''; + component.search(); + + expect(mockSearchFunction).toHaveBeenCalledWith('', 0, 5); + }); + + it('should update data source and total count on successful search', () => { + component.search(); + + expect(component.dataSource.data).toEqual(mockSearchResults.items); + expect(component.totalCount).toBe(3); + expect(component.loading).toBeFalse(); + }); + + it('should handle search results without items property', () => { + mockSearchFunction.and.returnValue(of(mockSearchResults.items)); + + component.search(); + + expect(component.dataSource.data).toEqual(mockSearchResults.items); + expect(component.totalCount).toBe(3); + }); + + it('should handle search error', () => { + const consoleErrorSpy = spyOn(console, 'error'); + mockSearchFunction.and.returnValue(throwError('Search failed')); + + component.search(); + + expect(component.loading).toBeFalse(); + expect(component.dataSource.data).toEqual([]); + expect(component.totalCount).toBe(0); + expect(consoleErrorSpy).toHaveBeenCalledWith( + 'Search error:', + 'Search failed' + ); + }); + + it('should set loading to true during search', () => { + component.search(); + expect(component.loading).toBeFalse(); // Should be false after synchronous test completion }); + }); - describe('Search Term Handling', () => { - beforeEach(() => { - fixture.detectChanges(); - spyOn(component, 'search'); - }); + describe('Search Term Handling', () => { + beforeEach(() => { + fixture.detectChanges(); + spyOn(component, 'search'); + }); - it('should update search term and trigger search on search term changed', () => { - component.onSearchTermChanged('new search'); + it('should update search term and trigger search on search term changed', () => { + component.onSearchTermChanged('new search'); - expect(component.currentSearchTerm).toBe('new search'); - expect(component.pageIndex).toBe(0); - expect(component.search).toHaveBeenCalled(); - }); + expect(component.currentSearchTerm).toBe('new search'); + expect(component.pageIndex).toBe(0); + expect(component.search).toHaveBeenCalled(); + }); - it('should clear search term and trigger search on search cleared', () => { - component.currentSearchTerm = 'existing search'; - component.pageIndex = 2; + it('should clear search term and trigger search on search cleared', () => { + component.currentSearchTerm = 'existing search'; + component.pageIndex = 2; - component.onSearchCleared(); + component.onSearchCleared(); - expect(component.currentSearchTerm).toBe(''); - expect(component.pageIndex).toBe(0); - expect(component.search).toHaveBeenCalled(); - }); + expect(component.currentSearchTerm).toBe(''); + expect(component.pageIndex).toBe(0); + expect(component.search).toHaveBeenCalled(); }); + }); - describe('Pagination', () => { - beforeEach(() => { - fixture.detectChanges(); - spyOn(component, 'search'); - }); + describe('Pagination', () => { + beforeEach(() => { + fixture.detectChanges(); + spyOn(component, 'search'); + }); - it('should update page index and trigger search on page change', () => { - const pageEvent: PageEvent = { - pageIndex: 2, - pageSize: 5, - length: 20, - previousPageIndex: 1 - }; + it('should update page index and trigger search on page change', () => { + const pageEvent: PageEvent = { + pageIndex: 2, + pageSize: 5, + length: 20, + previousPageIndex: 1 + }; - component.onPageChange(pageEvent); + component.onPageChange(pageEvent); - expect(component.pageIndex).toBe(2); - expect(component.search).toHaveBeenCalled(); - }); + expect(component.pageIndex).toBe(2); + expect(component.search).toHaveBeenCalled(); }); + }); - describe('Item Selection', () => { - beforeEach(() => { - fixture.detectChanges(); - }); + describe('Item Selection', () => { + beforeEach(() => { + fixture.detectChanges(); + }); - it('should check if item is selected correctly', () => { - const item = mockSearchResults.items[0]; - component.selectedItem = item; + it('should check if item is selected correctly', () => { + const item = mockSearchResults.items[0]; + component.selectedItem = item; - expect(component.isSelected(item)).toBeTrue(); - expect(component.isSelected(mockSearchResults.items[1])).toBeFalse(); - }); + expect(component.isSelected(item)).toBeTrue(); + expect(component.isSelected(mockSearchResults.items[1])).toBeFalse(); + }); - it('should disable submit button when no item is selected', () => { - component.selectedItem = null; - fixture.detectChanges(); + it('should disable submit button when no item is selected', () => { + component.selectedItem = null; + fixture.detectChanges(); - const confirmButton = fixture.debugElement.nativeElement.querySelector('[data-testid="confirm-button"]'); - expect(confirmButton.disabled).toBeTrue(); - }); + const confirmButton = fixture.debugElement.nativeElement.querySelector( + '[data-testid="confirm-button"]' + ); + expect(confirmButton.disabled).toBeTrue(); + }); - it('should toggle selection - select item when none selected', () => { - const item = mockSearchResults.items[0]; - component.selectedItem = null; + it('should toggle selection - select item when none selected', () => { + const item = mockSearchResults.items[0]; + component.selectedItem = null; - component.toggleSelection(item); + component.toggleSelection(item); - expect(component.selectedItem).toBe(item); - }); + expect(component.selectedItem).toBe(item); + }); - it('should toggle selection - deselect item when already selected', () => { - const item = mockSearchResults.items[0]; - component.selectedItem = item; + it('should toggle selection - deselect item when already selected', () => { + const item = mockSearchResults.items[0]; + component.selectedItem = item; - component.toggleSelection(item); + component.toggleSelection(item); - expect(component.selectedItem).toBeNull(); - }); + expect(component.selectedItem).toBeNull(); + }); - it('should toggle selection - select different item when another is selected', () => { - const item1 = mockSearchResults.items[0]; - const item2 = mockSearchResults.items[1]; - component.selectedItem = item1; + it('should toggle selection - select different item when another is selected', () => { + const item1 = mockSearchResults.items[0]; + const item2 = mockSearchResults.items[1]; + component.selectedItem = item1; - component.toggleSelection(item2); + component.toggleSelection(item2); - expect(component.selectedItem).toBe(item2); - }); + expect(component.selectedItem).toBe(item2); + }); - it('should handle row click and prevent default', () => { - const item = mockSearchResults.items[0]; - const mockEvent = jasmine.createSpyObj('MouseEvent', ['preventDefault']); - spyOn(component, 'toggleSelection'); + it('should handle row click and prevent default', () => { + const item = mockSearchResults.items[0]; + const mockEvent = jasmine.createSpyObj('MouseEvent', ['preventDefault']); + spyOn(component, 'toggleSelection'); - component.onRowClick(item, mockEvent); + component.onRowClick(item, mockEvent); - expect(mockEvent.preventDefault).toHaveBeenCalled(); - expect(component.toggleSelection).toHaveBeenCalledWith(item); - }); + expect(mockEvent.preventDefault).toHaveBeenCalled(); + expect(component.toggleSelection).toHaveBeenCalledWith(item); }); + }); - describe('Item Comparison', () => { - it('should compare items by id when both have ids', () => { - const item1 = { id: 1, name: 'John' }; - const item2 = { id: 1, name: 'Different Name' }; - const item3 = { id: 2, name: 'Jane' }; + describe('Item Comparison', () => { + it('should compare items by id when both have ids', () => { + const item1 = { id: 1, name: 'John' }; + const item2 = { id: 1, name: 'Different Name' }; + const item3 = { id: 2, name: 'Jane' }; - component.selectedItem = item1; + component.selectedItem = item1; - expect(component.isSelected(item2)).toBeTrue(); // Same id - expect(component.isSelected(item3)).toBeFalse(); // Different id - }); + expect(component.isSelected(item2)).toBeTrue(); // Same id + expect(component.isSelected(item3)).toBeFalse(); // Different id + }); - it('should compare items by reference when no ids', () => { - const item1 = { name: 'John' }; - const item2 = { name: 'John' }; + it('should compare items by reference when no ids', () => { + const item1 = { name: 'John' }; + const item2 = { name: 'John' }; - component.selectedItem = item1; + component.selectedItem = item1; - expect(component.isSelected(item1)).toBeTrue(); // Same reference - expect(component.isSelected(item2)).toBeFalse(); // Different reference - }); + expect(component.isSelected(item1)).toBeTrue(); // Same reference + expect(component.isSelected(item2)).toBeFalse(); // Different reference }); + }); - describe('Column Utilities', () => { - beforeEach(() => { - fixture.detectChanges(); - }); + describe('Column Utilities', () => { + beforeEach(() => { + fixture.detectChanges(); + }); - it('should get column value using display function', () => { - const item = mockSearchResults.items[0]; - const column = mockSearchData.columns[0]; + it('should get column value using display function', () => { + const item = mockSearchResults.items[0]; + const column = mockSearchData.columns[0]; - const value = component.getColumnValue(item, column); + const value = component.getColumnValue(item, column); - expect(value).toBe('John Doe'); - }); + expect(value).toBe('John Doe'); + }); - it('should find column by key', () => { - const column = component.getColumnByKey('name'); + it('should find column by key', () => { + const column = component.getColumnByKey('name'); - expect(column).toBe(mockSearchData.columns[0]); - expect(column?.label).toBe('Name'); - }); + expect(column).toBe(mockSearchData.columns[0]); + expect(column?.label).toBe('Name'); + }); - it('should return undefined for non-existent column key', () => { - const column = component.getColumnByKey('nonexistent'); + it('should return undefined for non-existent column key', () => { + const column = component.getColumnByKey('nonexistent'); - expect(column).toBeUndefined(); - }); + expect(column).toBeUndefined(); }); + }); - describe('Selection Count', () => { - beforeEach(() => { - fixture.detectChanges(); - }); + describe('Selection Count', () => { + beforeEach(() => { + fixture.detectChanges(); + }); - it('should return 1 when item is selected', () => { - component.selectedItem = mockSearchResults.items[0]; + it('should return 1 when item is selected', () => { + component.selectedItem = mockSearchResults.items[0]; - expect(component.getSelectedCount()).toBe(1); - }); + expect(component.getSelectedCount()).toBe(1); + }); - it('should return 0 when no item is selected', () => { - component.selectedItem = null; + it('should return 0 when no item is selected', () => { + component.selectedItem = null; - expect(component.getSelectedCount()).toBe(0); - }); + expect(component.getSelectedCount()).toBe(0); }); + }); - describe('Modal Actions', () => { - beforeEach(() => { - fixture.detectChanges(); - }); + describe('Modal Actions', () => { + beforeEach(() => { + fixture.detectChanges(); + }); - it('should close dialog with selected item on confirm', () => { - const selectedItem = mockSearchResults.items[0]; - component.selectedItem = selectedItem; + it('should close dialog with selected item on confirm', () => { + const selectedItem = mockSearchResults.items[0]; + component.selectedItem = selectedItem; - component.onConfirm(); + component.onConfirm(); - const expectedResult: SearchModalResult = { - selectedItem: selectedItem - }; - expect(mockDialogRef.close).toHaveBeenCalledWith(expectedResult); - }); + const expectedResult: SearchModalResult = { + selectedItem: selectedItem + }; + expect(mockDialogRef.close).toHaveBeenCalledWith(expectedResult); + }); - it('should close dialog with null selected item when none selected', () => { - component.selectedItem = null; + it('should close dialog with null selected item when none selected', () => { + component.selectedItem = null; - component.onConfirm(); + component.onConfirm(); - const expectedResult: SearchModalResult = { - selectedItem: null - }; - expect(mockDialogRef.close).toHaveBeenCalledWith(expectedResult); - }); + const expectedResult: SearchModalResult = { + selectedItem: null + }; + expect(mockDialogRef.close).toHaveBeenCalledWith(expectedResult); }); + }); - describe('Component Destruction', () => { - it('should complete destroy subject on destroy', () => { - const destroySpy = spyOn(component['destroy$'], 'next'); - const completeSpy = spyOn(component['destroy$'], 'complete'); + describe('Component Destruction', () => { + it('should complete destroy subject on destroy', () => { + const destroySpy = spyOn(component['destroy$'], 'next'); + const completeSpy = spyOn(component['destroy$'], 'complete'); - component.ngOnDestroy(); + component.ngOnDestroy(); - expect(destroySpy).toHaveBeenCalled(); - expect(completeSpy).toHaveBeenCalled(); - }); + expect(destroySpy).toHaveBeenCalled(); + expect(completeSpy).toHaveBeenCalled(); }); + }); - describe('Template Integration', () => { - beforeEach(() => { - fixture.detectChanges(); - }); + describe('Template Integration', () => { + beforeEach(() => { + fixture.detectChanges(); + }); - it('should display title in card navbar', () => { - const cardNavbar = fixture.debugElement.query(directive => directive.name === 'mage-card-navbar'); - expect(cardNavbar).toBeTruthy(); - }); + it('should display title in card navbar', () => { + const cardNavbar = fixture.debugElement.query( + (directive) => directive.name === 'mage-card-navbar' + ); + expect(cardNavbar).toBeTruthy(); + }); - it('should display table with correct columns', () => { - const table = fixture.debugElement.nativeElement.querySelector('[data-testid="search-results-table"]'); - expect(table).toBeTruthy(); - }); + it('should display table with correct columns', () => { + const table = fixture.debugElement.nativeElement.querySelector( + '[data-testid="search-results-table"]' + ); + expect(table).toBeTruthy(); + }); - it('should show no results message when no data', () => { - component.dataSource.data = []; - fixture.detectChanges(); + it('should show no results message when no data', () => { + component.dataSource.data = []; + fixture.detectChanges(); - const noResults = fixture.debugElement.nativeElement.querySelector('[data-testid="no-results"]'); - expect(noResults).toBeTruthy(); - expect(noResults.textContent.trim()).toBe('No results found'); - }); + const noResults = fixture.debugElement.nativeElement.querySelector( + '[data-testid="no-results"]' + ); + expect(noResults).toBeTruthy(); + expect(noResults.textContent.trim()).toBe('No results found'); + }); - it('should show paginator when totalCount > 0', () => { - component.totalCount = 10; - fixture.detectChanges(); + it('should show paginator when totalCount > 0', () => { + component.totalCount = 10; + fixture.detectChanges(); - const paginator = fixture.debugElement.nativeElement.querySelector('[data-testid="paginator"]'); - expect(paginator).toBeTruthy(); - }); + const paginator = fixture.debugElement.nativeElement.querySelector( + '[data-testid="paginator"]' + ); + expect(paginator).toBeTruthy(); + }); - it('should disable confirm button when no selection', () => { - component.selectedItem = null; - fixture.detectChanges(); + it('should disable confirm button when no selection', () => { + component.selectedItem = null; + fixture.detectChanges(); - const confirmButton = fixture.debugElement.nativeElement.querySelector('[data-testid="confirm-button"]'); - expect(confirmButton.disabled).toBeTrue(); - }); + const confirmButton = fixture.debugElement.nativeElement.querySelector( + '[data-testid="confirm-button"]' + ); + expect(confirmButton.disabled).toBeTrue(); + }); - it('should enable confirm button when item is selected', () => { - component.selectedItem = mockSearchResults.items[0]; - fixture.detectChanges(); + it('should enable confirm button when item is selected', () => { + component.selectedItem = mockSearchResults.items[0]; + fixture.detectChanges(); - const confirmButton = fixture.debugElement.nativeElement.querySelector('[data-testid="confirm-button"]'); - expect(confirmButton.disabled).toBeFalse(); - }); + const confirmButton = fixture.debugElement.nativeElement.querySelector( + '[data-testid="confirm-button"]' + ); + expect(confirmButton.disabled).toBeFalse(); }); + }); - describe('Edge Cases', () => { - beforeEach(() => { - fixture.detectChanges(); - }); + describe('Edge Cases', () => { + beforeEach(() => { + fixture.detectChanges(); + }); - it('should handle empty search results', () => { - mockSearchFunction.and.returnValue(of({ items: [] })); + it('should handle empty search results', () => { + mockSearchFunction.and.returnValue(of({ items: [] })); - component.search(); + component.search(); - expect(component.dataSource.data).toEqual([]); - expect(component.totalCount).toBe(0); - }); + expect(component.dataSource.data).toEqual([]); + expect(component.totalCount).toBe(0); + }); - it('should handle search results with null items', () => { - mockSearchFunction.and.returnValue(of({ items: null })); + it('should handle search results with null items', () => { + mockSearchFunction.and.returnValue(of({ items: null })); - component.search(); + component.search(); - expect(component.dataSource.data).toEqual([]); - expect(component.totalCount).toBe(0); - }); + expect(component.dataSource.data).toEqual([]); + expect(component.totalCount).toBe(0); + }); - it('should handle search results without items property', () => { - const directResults = [{ id: 1, name: 'Test' }]; - mockSearchFunction.and.returnValue(of(directResults)); + it('should handle search results without items property', () => { + const directResults = [{ id: 1, name: 'Test' }]; + mockSearchFunction.and.returnValue(of(directResults)); - component.search(); + component.search(); - expect(component.dataSource.data).toEqual(directResults); - expect(component.totalCount).toBe(1); - }); + expect(component.dataSource.data).toEqual(directResults); + expect(component.totalCount).toBe(1); + }); - it('should handle items without ids in comparison', () => { - const item1 = { name: 'Test1' }; - const item2 = { name: 'Test2' }; + it('should handle items without ids in comparison', () => { + const item1 = { name: 'Test1' }; + const item2 = { name: 'Test2' }; - component.selectedItem = item1; + component.selectedItem = item1; - expect(component.isSelected(item1)).toBeTrue(); - expect(component.isSelected(item2)).toBeFalse(); - }); + expect(component.isSelected(item1)).toBeTrue(); + expect(component.isSelected(item2)).toBeFalse(); + }); - it('should handle column with no display function gracefully', () => { - const columnWithoutFunction = { - key: 'test', - label: 'Test', - displayFunction: undefined as any - }; + it('should handle column with no display function gracefully', () => { + const columnWithoutFunction = { + key: 'test', + label: 'Test', + displayFunction: undefined as any + }; - expect(() => { - component.getColumnValue({ name: 'test' }, columnWithoutFunction); - }).toThrow(); - }); + expect(() => { + component.getColumnValue({ name: 'test' }, columnWithoutFunction); + }).toThrow(); }); + }); }); diff --git a/web-app/admin/src/app/core/search-modal/search-modal.component.ts b/web-app/admin/src/app/core/search-modal/search-modal.component.ts index a84f09efb..1368a1f68 100644 --- a/web-app/admin/src/app/core/search-modal/search-modal.component.ts +++ b/web-app/admin/src/app/core/search-modal/search-modal.component.ts @@ -2,8 +2,10 @@ import { Component, Inject, OnInit, OnDestroy } from '@angular/core'; import { MatDialogRef as MatDialogRef, MAT_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/dialog'; import { Subject, Observable } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; -import { MatTableDataSource as MatTableDataSource } from '@angular/material/table'; -import { PageEvent as PageEvent } from '@angular/material/paginator'; +import { MatTableDataSource as MatTableDataSource, MatTableModule } from '@angular/material/table'; +import { MatPaginatorModule, PageEvent as PageEvent } from '@angular/material/paginator'; +import { CommonModule } from '@angular/common'; +import { CardNavbarComponent } from '../card-navbar/card-navbar.component'; export interface SearchModalColumn { key: string; @@ -32,6 +34,13 @@ export interface SearchModalResult { */ @Component({ selector: 'app-search-modal', + standalone: true, + imports: [ + CommonModule, + MatTableModule, + MatPaginatorModule, + CardNavbarComponent + ], templateUrl: './search-modal.component.html', styleUrls: ['./search-modal.component.scss'] }) diff --git a/web-app/admin/src/app/datetime-picker/datetime-picker.component.spec.ts b/web-app/admin/src/app/datetime-picker/datetime-picker.component.spec.ts index c16937b48..e864fe5ad 100644 --- a/web-app/admin/src/app/datetime-picker/datetime-picker.component.spec.ts +++ b/web-app/admin/src/app/datetime-picker/datetime-picker.component.spec.ts @@ -9,7 +9,7 @@ describe('DatetimePickerComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ DatetimePickerComponent ] + imports: [ DatetimePickerComponent ] }) .compileComponents(); })); diff --git a/web-app/admin/src/app/datetime-picker/datetime-picker.component.ts b/web-app/admin/src/app/datetime-picker/datetime-picker.component.ts index 044c39679..399630870 100644 --- a/web-app/admin/src/app/datetime-picker/datetime-picker.component.ts +++ b/web-app/admin/src/app/datetime-picker/datetime-picker.component.ts @@ -1,3 +1,4 @@ +import { CommonModule } from '@angular/common'; import { Component, EventEmitter, @@ -7,11 +8,24 @@ import { SimpleChanges, ViewChild } from '@angular/core'; -import { NgModel } from '@angular/forms'; +import { FormsModule, NgModel } from '@angular/forms'; +import { MatNativeDateModule } from '@angular/material/core'; +import { MatDatepickerModule } from '@angular/material/datepicker'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; import moment from 'moment'; @Component({ selector: 'datetime-picker', + standalone: true, + imports: [ + CommonModule, + FormsModule, + MatFormFieldModule, + MatInputModule, + MatDatepickerModule, + MatNativeDateModule + ], templateUrl: './datetime-picker.component.html', styleUrls: ['./datetime-picker.component.scss'] }) diff --git a/web-app/admin/src/app/feed/feed-item/feed-item-summary/feed-item-summary.component.spec.ts b/web-app/admin/src/app/feed/feed-item/feed-item-summary/feed-item-summary.component.spec.ts index 2f51f17c3..57073d410 100644 --- a/web-app/admin/src/app/feed/feed-item/feed-item-summary/feed-item-summary.component.spec.ts +++ b/web-app/admin/src/app/feed/feed-item/feed-item-summary/feed-item-summary.component.spec.ts @@ -5,24 +5,20 @@ import { MomentModule } from '../../../../app/moment/moment.module'; import { FeedItemSummaryComponent } from './feed-item-summary.component'; import { MapService } from 'src/app/map/map.service'; - describe('FeedItemSummaryComponent', () => { let component: FeedItemSummaryComponent; let fixture: ComponentFixture; beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - providers: [ - { provide: MapService, useValue: {} } - ], + providers: [{ provide: MapService, useValue: {} }], imports: [ MatListModule, MatIconModule, - MomentModule + MomentModule, + FeedItemSummaryComponent ], - declarations: [ FeedItemSummaryComponent ] - }) - .compileComponents(); + }).compileComponents(); })); beforeEach(() => { diff --git a/web-app/admin/src/app/feed/feed-item/feed-item-summary/feed-item-summary.component.ts b/web-app/admin/src/app/feed/feed-item/feed-item-summary/feed-item-summary.component.ts index a4d55f321..40cc836c3 100644 --- a/web-app/admin/src/app/feed/feed-item/feed-item-summary/feed-item-summary.component.ts +++ b/web-app/admin/src/app/feed/feed-item/feed-item-summary/feed-item-summary.component.ts @@ -1,11 +1,23 @@ import { Component, Input, Inject, OnChanges, SimpleChanges } from '@angular/core'; import { Feed } from '@ngageoint/mage.web-core-lib/feed'; import { Feature } from 'geojson'; -import { contentPathOfIcon } from '@ngageoint/mage.web-core-lib/static-icon' +import { contentPathOfIcon, StaticIconModule } from '@ngageoint/mage.web-core-lib/static-icon' import { MapService } from 'src/app/map/map.service'; +import { CommonModule } from '@angular/common'; +import { MatIconModule } from '@angular/material/icon'; +import { MatListModule } from '@angular/material/list'; +import { MomentModule } from 'mage-web-app/moment/moment.module'; @Component({ selector: 'feed-item-summary', + standalone: true, + imports: [ + CommonModule, + MatIconModule, + MatListModule, + MomentModule, + StaticIconModule + ], templateUrl: './feed-item-summary.component.html', styleUrls: ['./feed-item-summary.component.scss'] }) diff --git a/web-app/admin/src/app/feed/feed-item/feed-item-summary/feed-item-summary.module.ts b/web-app/admin/src/app/feed/feed-item/feed-item-summary/feed-item-summary.module.ts index 6a808bb98..20cf08ba0 100644 --- a/web-app/admin/src/app/feed/feed-item/feed-item-summary/feed-item-summary.module.ts +++ b/web-app/admin/src/app/feed/feed-item/feed-item-summary/feed-item-summary.module.ts @@ -1,22 +1,24 @@ import { NgModule } from '@angular/core' import { CommonModule } from '@angular/common' import { MatIconModule } from '@angular/material/icon' -import { MatListModule as MatListModule } from '@angular/material/list' +import { MatListModule } from '@angular/material/list' import { FeedItemSummaryComponent } from './feed-item-summary.component' import { MomentModule } from '../../../moment/moment.module' import { MageCommonModule } from '@ngageoint/mage.web-core-lib/common' import { StaticIconModule } from '@ngageoint/mage.web-core-lib/static-icon' @NgModule({ - declarations: [FeedItemSummaryComponent], - exports: [FeedItemSummaryComponent], imports: [ CommonModule, MatIconModule, MatListModule, MomentModule, MageCommonModule, - StaticIconModule + StaticIconModule, + FeedItemSummaryComponent + ], + exports: [ + FeedItemSummaryComponent ] }) -export class FeedItemSummaryModule { } +export class FeedItemSummaryModule { } \ No newline at end of file diff --git a/web-app/admin/src/app/feed/feed-item/feed-item.component.spec.ts b/web-app/admin/src/app/feed/feed-item/feed-item.component.spec.ts index 632527546..81acde1da 100644 --- a/web-app/admin/src/app/feed/feed-item/feed-item.component.spec.ts +++ b/web-app/admin/src/app/feed/feed-item/feed-item.component.spec.ts @@ -38,7 +38,9 @@ class MockMapService { } @Component({ - template: '' + standalone: true, + imports: [FeedItemComponent], + template: `` }) class TestHostComponent { feed: Feed = { @@ -97,14 +99,12 @@ describe('FeedItemComponent', () => { MatToolbarModule, MatDividerModule, MatCardModule, - GeometryModule - ], - declarations: [ + GeometryModule, FeedItemComponent, MapClipComponent, TestHostComponent, MomentPipe - ] + ], }) .compileComponents() })); diff --git a/web-app/admin/src/app/feed/feed-item/feed-item.component.ts b/web-app/admin/src/app/feed/feed-item/feed-item.component.ts index 2f2c247f5..9c5841bc2 100644 --- a/web-app/admin/src/app/feed/feed-item/feed-item.component.ts +++ b/web-app/admin/src/app/feed/feed-item/feed-item.component.ts @@ -2,9 +2,28 @@ import { Component, Input, Inject, OnChanges, SimpleChanges } from '@angular/cor import { Feed, StyledFeature } from '@ngageoint/mage.web-core-lib/feed'; import { MomentPipe } from '../../../app/moment/moment.pipe'; import { MapService } from 'src/app/map/map.service'; +import { CommonModule } from '@angular/common'; +import { MatCardModule } from '@angular/material/card'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatIconModule } from '@angular/material/icon'; +import { MatToolbarModule } from '@angular/material/toolbar'; +import { StaticIconModule } from 'core-lib-src/static-icon'; +import { GeometryModule } from 'mage-web-app/geometry/geometry.module'; +import { MapClipComponent } from 'mage-web-app/map/clip/clip.component'; @Component({ selector: 'feed-item', + standalone: true, + imports: [ + CommonModule, + MatToolbarModule, + MatIconModule, + MatCardModule, + MatDividerModule, + StaticIconModule, + MapClipComponent, + GeometryModule + ], templateUrl: './feed-item.component.html', styleUrls: ['./feed-item.component.scss'] }) diff --git a/web-app/admin/src/app/geometry/geometry.module.ts b/web-app/admin/src/app/geometry/geometry.module.ts index 49a58e80a..1d632d80a 100644 --- a/web-app/admin/src/app/geometry/geometry.module.ts +++ b/web-app/admin/src/app/geometry/geometry.module.ts @@ -3,14 +3,12 @@ import { CommonModule } from '@angular/common'; import { GeometryPipe } from './geometry.pipe'; @NgModule({ - declarations: [ + imports: [ + CommonModule, GeometryPipe ], exports: [ GeometryPipe - ], - imports: [ - CommonModule ] }) -export class GeometryModule { } +export class GeometryModule { } \ No newline at end of file diff --git a/web-app/admin/src/app/http/token-interceptor.service.ts b/web-app/admin/src/app/http/token-interceptor.service.ts index 577fa8b3e..2a67196c2 100644 --- a/web-app/admin/src/app/http/token-interceptor.service.ts +++ b/web-app/admin/src/app/http/token-interceptor.service.ts @@ -1,10 +1,5 @@ import { Injectable } from '@angular/core'; -import { - HttpInterceptor, - HttpRequest, - HttpHandler, - HttpEvent -} from '@angular/common/http'; +import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent } from '@angular/common/http'; import { Observable } from 'rxjs'; import { LocalStorageService } from '../../../../src/app/http/local-storage.service'; diff --git a/web-app/admin/src/app/json-schema/json-schema-widget/json-schema-widget-autocomplete.component.spec.ts b/web-app/admin/src/app/json-schema/json-schema-widget/json-schema-widget-autocomplete.component.spec.ts index 39d748428..31eda519e 100644 --- a/web-app/admin/src/app/json-schema/json-schema-widget/json-schema-widget-autocomplete.component.spec.ts +++ b/web-app/admin/src/app/json-schema/json-schema-widget/json-schema-widget-autocomplete.component.spec.ts @@ -1,14 +1,13 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { MatAutocompleteModule as MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatFormFieldModule as MatFormFieldModule } from '@angular/material/form-field' -import { MatIconModule } from '@angular/material/icon' -import { MatInputModule as MatInputModule } from '@angular/material/input' +import { MatFormFieldModule as MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule as MatInputModule } from '@angular/material/input'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { JsonSchemaWidgetAutocompleteComponent } from './json-schema-widget-autocomplete.component'; import { JsonSchemaModule } from '../json-schema.module'; - describe('AutocompleteMaterialSelectComponent', () => { let component: JsonSchemaWidgetAutocompleteComponent; let fixture: ComponentFixture; @@ -23,11 +22,10 @@ describe('AutocompleteMaterialSelectComponent', () => { ReactiveFormsModule, MatAutocompleteModule, JsonSchemaModule, - NoopAnimationsModule + NoopAnimationsModule, + JsonSchemaWidgetAutocompleteComponent ], - declarations: [JsonSchemaWidgetAutocompleteComponent ] - }) - .compileComponents(); + }).compileComponents(); })); beforeEach(() => { diff --git a/web-app/admin/src/app/json-schema/json-schema-widget/json-schema-widget-autocomplete.component.ts b/web-app/admin/src/app/json-schema/json-schema-widget/json-schema-widget-autocomplete.component.ts index 32d1c6902..fa960f1f2 100644 --- a/web-app/admin/src/app/json-schema/json-schema-widget/json-schema-widget-autocomplete.component.ts +++ b/web-app/admin/src/app/json-schema/json-schema-widget/json-schema-widget-autocomplete.component.ts @@ -1,12 +1,25 @@ import { buildTitleMap, isArray, JsonSchemaFormService } from '@ngageoint/vendor-ajsf-core'; import { Component, Inject, Input, OnInit, Optional } from '@angular/core'; -import { AbstractControl, UntypedFormControl } from '@angular/forms'; -import { MAT_FORM_FIELD_DEFAULT_OPTIONS as MAT_FORM_FIELD_DEFAULT_OPTIONS } from '@angular/material/form-field'; +import { AbstractControl, ReactiveFormsModule, UntypedFormControl } from '@angular/forms'; +import { MAT_FORM_FIELD_DEFAULT_OPTIONS as MAT_FORM_FIELD_DEFAULT_OPTIONS, MatFormFieldModule } from '@angular/material/form-field'; import { Observable } from 'rxjs'; import { map, startWith } from 'rxjs/operators'; +import { CommonModule } from '@angular/common'; +import { MatAutocompleteModule } from '@angular/material/autocomplete'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; @Component({ selector: 'app-autocomplete-material-select', + standalone: true, + imports: [ + CommonModule, + ReactiveFormsModule, + MatFormFieldModule, + MatInputModule, + MatIconModule, + MatAutocompleteModule + ], templateUrl: './json-schema-widget-autocomplete.component.html', styleUrls: ['./json-schema-widget-autocomplete.component.scss'] }) diff --git a/web-app/admin/src/app/json-schema/json-schema.component.spec.ts b/web-app/admin/src/app/json-schema/json-schema.component.spec.ts index 7981d6002..a443e6259 100644 --- a/web-app/admin/src/app/json-schema/json-schema.component.spec.ts +++ b/web-app/admin/src/app/json-schema/json-schema.component.spec.ts @@ -8,8 +8,7 @@ describe('JsonSchemaFormWithServiceComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - imports: [JsonSchemaFormModule], - declarations: [JsonSchemaFormWithServiceComponent] + imports: [JsonSchemaFormModule, JsonSchemaFormWithServiceComponent], }).compileComponents(); })); diff --git a/web-app/admin/src/app/json-schema/json-schema.component.ts b/web-app/admin/src/app/json-schema/json-schema.component.ts index 5d380595c..1b69aca69 100644 --- a/web-app/admin/src/app/json-schema/json-schema.component.ts +++ b/web-app/admin/src/app/json-schema/json-schema.component.ts @@ -1,5 +1,7 @@ import { JsonSchemaFormService, JsonSchemaFormComponent } from '@ngageoint/vendor-ajsf-core'; import { Component } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { MaterialDesignFrameworkModule } from 'vendor/ajsf-material'; /** * This wrapper components exists to workaround https://github.com/hamzahamidi/ajsf/issues/213. @@ -10,6 +12,11 @@ import { Component } from '@angular/core'; */ @Component({ selector: 'mage-json-schema-form', + standalone: true, + imports: [ + CommonModule, + MaterialDesignFrameworkModule + ], providers: [ JsonSchemaFormService ], template: `
diff --git a/web-app/admin/src/app/json-schema/json-schema.module.ts b/web-app/admin/src/app/json-schema/json-schema.module.ts index 5991e2117..fbf98b2f2 100644 --- a/web-app/admin/src/app/json-schema/json-schema.module.ts +++ b/web-app/admin/src/app/json-schema/json-schema.module.ts @@ -4,15 +4,13 @@ import { MaterialDesignFrameworkModule } from '@ngageoint/vendor-ajsf-material'; import { JsonSchemaFormWithServiceComponent } from './json-schema.component'; @NgModule({ - declarations: [ - JsonSchemaFormWithServiceComponent - ], imports: [ CommonModule, - MaterialDesignFrameworkModule + MaterialDesignFrameworkModule, + JsonSchemaFormWithServiceComponent ], exports: [ JsonSchemaFormWithServiceComponent ] }) -export class JsonSchemaModule { } +export class JsonSchemaModule { } \ No newline at end of file diff --git a/web-app/admin/src/app/logins/logins.component.spec.ts b/web-app/admin/src/app/logins/logins.component.spec.ts index 84ed43b85..fc4fb89ae 100644 --- a/web-app/admin/src/app/logins/logins.component.spec.ts +++ b/web-app/admin/src/app/logins/logins.component.spec.ts @@ -1,96 +1,81 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { FormsModule } from '@angular/forms'; import { of } from 'rxjs'; import { Router } from '@angular/router'; -import { NO_ERRORS_SCHEMA } from '@angular/core'; import { LoginsComponent } from './logins.component'; -import { LoginService } from '../services/login.service'; -import { UserPagingService } from '../services/user-paging.service'; -import { DevicePagingService } from '../services/device-paging.service'; - -import { AdminUserService } from '../admin/services/admin-user.service'; -import { AdminDeviceService } from '../admin/services/admin-device.service'; - describe('LoginsComponent', () => { let component: LoginsComponent; - let fixture: ComponentFixture; - - const mockLoginService = { - query: jasmine.createSpy('query').and.returnValue( - of({ logins: [], next: undefined, prev: undefined }) - ) - }; - - const mockUserPaging = { - constructDefault: jasmine.createSpy('constructDefault').and.returnValue({ all: {} }), - refresh: jasmine.createSpy('refresh').and.returnValue(of(null)), - users: jasmine.createSpy('users').and.returnValue([]), - search: jasmine.createSpy('search').and.returnValue(of([])) - }; - - const mockDevicePaging = { - constructDefault: jasmine.createSpy('constructDefault').and.returnValue({ all: {} }), - refresh: jasmine.createSpy('refresh').and.returnValue(of(null)), - devices: jasmine.createSpy('devices').and.returnValue([]), - search: jasmine.createSpy('search').and.returnValue(of([])) - }; - - const mockAdminUserService = { - hasPermission: jasmine.createSpy('hasPermission').and.callFake((p: string) => p === 'p1') - }; - - const routerSpy = jasmine.createSpyObj('Router', ['navigate']); - - async function createComponent(init?: Partial) { - await TestBed.configureTestingModule({ - imports: [FormsModule], - declarations: [LoginsComponent], - providers: [ - { provide: LoginService, useValue: mockLoginService }, - { provide: UserPagingService, useValue: mockUserPaging }, - { provide: DevicePagingService, useValue: mockDevicePaging }, - { provide: AdminUserService, useValue: mockAdminUserService }, - { provide: AdminDeviceService, useValue: {} }, - { provide: Router, useValue: routerSpy } - ], - schemas: [NO_ERRORS_SCHEMA] - }) - .overrideTemplate(LoginsComponent, '') - .compileComponents(); - - fixture = TestBed.createComponent(LoginsComponent); - component = fixture.componentInstance; - Object.assign(component, init || {}); - fixture.detectChanges(); + let mockLoginService: any; + let mockUserPaging: any; + let mockDevicePaging: any; + let mockAdminUserService: any; + let mockAdminDeviceService: any; + let routerSpy: jasmine.SpyObj; + + function resetMocks(): void { + mockLoginService = { + query: jasmine + .createSpy('query') + .and.returnValue(of({ logins: [], next: undefined, prev: undefined })) + }; + + mockUserPaging = { + constructDefault: jasmine + .createSpy('constructDefault') + .and.returnValue({ all: {} }), + refresh: jasmine.createSpy('refresh').and.returnValue(of(null)), + users: jasmine.createSpy('users').and.returnValue([]), + search: jasmine.createSpy('search').and.returnValue(of([])) + }; + + mockDevicePaging = { + constructDefault: jasmine + .createSpy('constructDefault') + .and.returnValue({ all: {} }), + refresh: jasmine.createSpy('refresh').and.returnValue(of(null)), + devices: jasmine.createSpy('devices').and.returnValue([]), + search: jasmine.createSpy('search').and.returnValue(of([])) + }; + + mockAdminUserService = { + hasPermission: jasmine + .createSpy('hasPermission') + .and.callFake((p: string) => p === 'p1') + }; + + mockAdminDeviceService = {}; + + routerSpy = jasmine.createSpyObj('Router', ['navigate']); } - beforeEach(() => { - mockLoginService.query.calls.reset(); + function createComponent(init?: Partial): void { + component = new (LoginsComponent as any)( + mockAdminUserService, + mockAdminDeviceService, + mockLoginService, + mockUserPaging, + mockDevicePaging, + routerSpy + ) as LoginsComponent; - mockUserPaging.constructDefault.calls.reset(); - mockUserPaging.refresh.calls.reset(); - mockUserPaging.users.calls.reset(); - mockUserPaging.search.calls.reset(); + Object.assign(component, init || {}); - mockDevicePaging.constructDefault.calls.reset(); - mockDevicePaging.refresh.calls.reset(); - mockDevicePaging.devices.calls.reset(); - mockDevicePaging.search.calls.reset(); + component.ngOnInit(); + } - mockAdminUserService.hasPermission.calls.reset(); - routerSpy.navigate.calls.reset(); + beforeEach(() => { + resetMocks(); }); - it('should create', async () => { - await createComponent(); + it('should create', () => { + createComponent(); + expect(component).toBeTruthy(); }); - it('ngOnInit should set filter.user/device when userId/deviceId inputs are provided', async () => { - await createComponent({ userId: 'u1', deviceId: 'd1' } as any); + it('ngOnInit should set filter.user/device when userId/deviceId inputs are provided', () => { + createComponent({ userId: 'u1', deviceId: 'd1' } as any); component.ngOnInit(); @@ -98,8 +83,8 @@ describe('LoginsComponent', () => { expect((component.filter as any).device).toEqual({ id: 'd1' } as any); }); - it('initUserSourceIfNeeded should NOT call paging when users list is provided', async () => { - await createComponent({ users: [{ displayName: 'A' } as any] } as any); + it('initUserSourceIfNeeded should NOT call paging when users list is provided', () => { + createComponent({ users: [{ displayName: 'A' } as any] } as any); component.ngOnInit(); @@ -107,10 +92,12 @@ describe('LoginsComponent', () => { expect(mockUserPaging.refresh).not.toHaveBeenCalled(); }); - it('initUserSourceIfNeeded should call paging when users list empty and no userId', async () => { - mockUserPaging.users.and.returnValue([{ displayName: 'Paged User' } as any]); + it('initUserSourceIfNeeded should call paging when users list empty and no userId', () => { + mockUserPaging.users.and.returnValue([ + { displayName: 'Paged User' } as any + ]); - await createComponent({ users: [] } as any); + createComponent({ users: [] } as any); component.ngOnInit(); @@ -120,9 +107,10 @@ describe('LoginsComponent', () => { expect(component.users[0].displayName).toBe('Paged User'); }); - it('initDeviceSourceIfNeeded should copy devices into loginDeviceSearchResults when devices provided', async () => { + it('initDeviceSourceIfNeeded should copy devices into loginDeviceSearchResults when devices provided', () => { const devs = [{ uid: 'X' }, { uid: 'Y' }] as any[]; - await createComponent({ devices: devs } as any); + + createComponent({ devices: devs } as any); component.ngOnInit(); @@ -130,28 +118,30 @@ describe('LoginsComponent', () => { expect(mockDevicePaging.constructDefault).not.toHaveBeenCalled(); }); - it('initDeviceSourceIfNeeded should call device paging when devices not provided', async () => { + it('initDeviceSourceIfNeeded should call device paging when devices not provided', () => { mockDevicePaging.devices.and.returnValue([{ uid: 'Paged Device' } as any]); - await createComponent({ devices: [] } as any); + createComponent({ devices: [] } as any); component.ngOnInit(); expect(mockDevicePaging.constructDefault).toHaveBeenCalled(); expect(mockDevicePaging.refresh).toHaveBeenCalled(); expect(component.loginDeviceSearchResults.length).toBe(1); - expect((component.loginDeviceSearchResults[0] as any).uid).toBe('Paged Device'); + expect((component.loginDeviceSearchResults[0] as any).uid).toBe( + 'Paged Device' + ); }); - it('hasNext should be false for invalid next links and true for valid link', async () => { - await createComponent(); - + it('hasNext should be false for invalid next links and true for valid link', () => { + createComponent(); + component.loginPage = { logins: [], next: 'null', prev: null } as any; expect(component.hasNext).toBe(false); - + component.loginPage = { logins: [], next: ' ', prev: null } as any; expect(component.hasNext).toBe(false); - + component.loginPage = { logins: [{ id: 'a' }], next: 'http://next?start=25&limit=25', @@ -159,10 +149,9 @@ describe('LoginsComponent', () => { } as any; expect(component.hasNext).toBe(true); }); - - it('hasPrev should be false when firstLogin missing, no logins, or invalid prev; true when conditions met', async () => { - await createComponent(); + it('hasPrev should be false when firstLogin missing, no logins, or invalid prev; true when conditions met', () => { + createComponent(); component.loginPage = { prev: 'http://prev', logins: [{ id: 'a' }] } as any; component.firstLogin = null as any; @@ -183,8 +172,9 @@ describe('LoginsComponent', () => { expect(component.hasPrev).toBe(false); }); - it('pageLogin should not call loginService.query for invalid url', async () => { - await createComponent(); + it('pageLogin should not call loginService.query for invalid url', () => { + createComponent(); + mockLoginService.query.calls.reset(); component.pageLogin(' '); @@ -192,13 +182,21 @@ describe('LoginsComponent', () => { expect(mockLoginService.query).not.toHaveBeenCalled(); }); - it('pageLogin should update loginPage for a non-empty next page', async () => { - await createComponent(); + it('pageLogin should update loginPage for a non-empty next page', () => { + createComponent(); - component.loginPage = { logins: [{ id: 'old' }], next: 'http://next', prev: null } as any; + component.loginPage = { + logins: [{ id: 'old' }], + next: 'http://next', + prev: null + } as any; mockLoginService.query.and.returnValue( - of({ logins: [{ id: 'new' }], next: 'http://next2', prev: 'http://prev2' }) + of({ + logins: [{ id: 'new' }], + next: 'http://next2', + prev: 'http://prev2' + }) ); component.pageLogin('http://next'); @@ -208,10 +206,14 @@ describe('LoginsComponent', () => { expect((component.loginPage as any).prev).toBe('http://prev2'); }); - it('pageLogin should guard against empty page and null out current loginPage.next', async () => { - await createComponent(); + it('pageLogin should guard against empty page and null out current loginPage.next', () => { + createComponent(); - component.loginPage = { logins: [{ id: 'old' }], next: 'http://next', prev: null } as any; + component.loginPage = { + logins: [{ id: 'old' }], + next: 'http://next', + prev: null + } as any; mockLoginService.query.and.returnValue( of({ logins: [], next: 'http://still-next', prev: 'http://prev' }) @@ -223,8 +225,9 @@ describe('LoginsComponent', () => { expect((component.loginPage as any).next).toBeNull(); }); - it('filterLogins should call loadInitialLogins when no user/device/date filters selected', async () => { - await createComponent(); + it('filterLogins should call loadInitialLogins when no user/device/date filters selected', () => { + createComponent(); + spyOn(component as any, 'loadInitialLogins').and.callThrough(); component.user = null as any; @@ -237,39 +240,46 @@ describe('LoginsComponent', () => { expect((component as any).loadInitialLogins).toHaveBeenCalled(); }); - it('filterLogins should set device filter from selected device[0].id, and endDate to end-of-day', async () => { - await createComponent(); + it('filterLogins should set device filter from selected device[0].id, and endDate to end-of-day', () => { + createComponent(); const end = new Date('2025-12-17T10:00:00.000Z'); + component.user = { id: 'u2', displayName: 'User Two' } as any; component.device = [{ id: 'd2', uid: 'UID2' } as any]; component.login.startDate = new Date('2025-12-01T00:00:00.000Z'); component.login.endDate = end; - mockLoginService.query.and.returnValue(of({ logins: [], next: null, prev: null })); + mockLoginService.query.and.returnValue( + of({ logins: [], next: null, prev: null }) + ); component.filterLogins(); const passed = mockLoginService.query.calls.mostRecent().args[0]; + expect(passed.filter.user.id).toBe('u2'); expect(passed.filter.device.id).toBe('d2'); expect(passed.filter.startDate).toBe(component.login.startDate); expect(new Date(passed.filter.endDate).getTime()).not.toBe(end.getTime()); }); - it('onUserSearchChange should clear results and call filterLogins when term is cleared', async () => { - await createComponent(); + it('onUserSearchChange should clear results and call filterLogins when term is cleared', () => { + createComponent(); + spyOn(component, 'filterLogins').and.stub(); component.loginSearchResults = [{ displayName: 'x' } as any]; + component.onUserSearchChange(''); expect(component.loginSearchResults).toEqual([]); expect(component.filterLogins).toHaveBeenCalled(); }); - it('searchLoginsAgainstUsers should use pagingService.search when userStateAndData is set', async () => { - await createComponent(); + it('searchLoginsAgainstUsers should use pagingService.search when userStateAndData is set', () => { + createComponent(); + (component as any).userStateAndData = { all: {} } as any; mockUserPaging.search.and.returnValue( @@ -278,13 +288,18 @@ describe('LoginsComponent', () => { component.searchLoginsAgainstUsers('abc'); - expect(mockUserPaging.search).toHaveBeenCalledWith((component as any).userStateAndData.all, 'abc'); + expect(mockUserPaging.search).toHaveBeenCalledWith( + (component as any).userStateAndData.all, + 'abc' + ); expect(component.loginSearchResults.length).toBe(2); }); - it('searchLoginsAgainstUsers should set first 10 users when searchString empty or ".*" (local list branch)', async () => { - await createComponent({ - users: Array.from({ length: 12 }).map((_, i) => ({ displayName: `User${i}` } as any)) + it('searchLoginsAgainstUsers should set first 10 users when searchString empty or ".*" (local list branch)', () => { + createComponent({ + users: Array.from({ length: 12 }).map( + (_, i) => ({ displayName: `User${i}` } as any) + ) } as any); (component as any).userStateAndData = null; @@ -296,11 +311,14 @@ describe('LoginsComponent', () => { expect(component.loginSearchResults.length).toBe(10); }); - it('onDeviceSearchChange should use devicePagingService.search when deviceStateAndData exists', async () => { - await createComponent(); + it('onDeviceSearchChange should use devicePagingService.search when deviceStateAndData exists', () => { + createComponent(); + (component as any).deviceStateAndData = { all: {} } as any; - mockDevicePaging.search.and.returnValue(of([{ uid: 'A' }, { uid: 'B' }] as any)); + mockDevicePaging.search.and.returnValue( + of([{ uid: 'A' }, { uid: 'B' }] as any) + ); component.onDeviceSearchChange('term'); @@ -308,8 +326,8 @@ describe('LoginsComponent', () => { expect(component.loginDeviceSearchResults.length).toBe(2); }); - it('onDeviceSearchChange should filter local devices by uid/userAgent when no paging state exists', async () => { - await createComponent({ + it('onDeviceSearchChange should filter local devices by uid/userAgent when no paging state exists', () => { + createComponent({ devices: [ { uid: 'ABC', userAgent: 'iOS Something' } as any, { uid: 'ZZZ', userAgent: 'Android Something' } as any @@ -327,11 +345,13 @@ describe('LoginsComponent', () => { expect((component.loginDeviceSearchResults[0] as any).uid).toBe('ZZZ'); }); - it('selectUser should set user, userText, clear results, and call filterLogins', async () => { - await createComponent(); + it('selectUser should set user, userText, clear results, and call filterLogins', () => { + createComponent(); + spyOn(component, 'filterLogins').and.stub(); component.loginSearchResults = [{ displayName: 'x' } as any]; + component.selectUser({ id: 'u1', displayName: 'Name' } as any); expect(component.userText).toBe('Name'); @@ -339,11 +359,13 @@ describe('LoginsComponent', () => { expect(component.filterLogins).toHaveBeenCalled(); }); - it('selectDevice should set device/deviceText, clear device results, and call filterLogins', async () => { - await createComponent(); + it('selectDevice should set device/deviceText, clear device results, and call filterLogins', () => { + createComponent(); + spyOn(component, 'filterLogins').and.stub(); component.loginDeviceSearchResults = [{ uid: 'x' } as any]; + component.selectDevice({ id: 'd1', uid: 'UID1' } as any); expect(component.device.length).toBe(1); @@ -352,8 +374,9 @@ describe('LoginsComponent', () => { expect(component.filterLogins).toHaveBeenCalled(); }); - it('clearUserFilter and clearDeviceFilter should reset and call filterLogins when no locked ids', async () => { - await createComponent(); + it('clearUserFilter and clearDeviceFilter should reset and call filterLogins when no locked ids', () => { + createComponent(); + spyOn(component, 'filterLogins').and.stub(); component.user = { id: 'u' } as any; @@ -371,15 +394,17 @@ describe('LoginsComponent', () => { expect(component.filterLogins).toHaveBeenCalled(); }); - it('iconClass should handle null device and device.iconClass override', async () => { - await createComponent(); + it('iconClass should handle null device and device.iconClass override', () => { + createComponent(); expect(component.iconClass(null as any)).toContain('fa-mobile'); - expect(component.iconClass({ iconClass: 'custom-class' } as any)).toBe('custom-class'); + expect(component.iconClass({ iconClass: 'custom-class' } as any)).toBe( + 'custom-class' + ); }); - it('displayUser/displayDevice should return empty string when missing fields', async () => { - await createComponent(); + it('displayUser/displayDevice should return empty string when missing fields', () => { + createComponent(); expect(component.displayUser(null as any)).toBe(''); expect(component.displayUser({} as any)).toBe(''); @@ -388,8 +413,8 @@ describe('LoginsComponent', () => { expect(component.displayDevice({} as any)).toBe(''); }); - it('hasPermission should delegate to AdminUserService.hasPermission', async () => { - await createComponent(); + it('hasPermission should delegate to AdminUserService.hasPermission', () => { + createComponent(); expect(component.hasPermission('p1')).toBeTrue(); expect(component.hasPermission('nope')).toBeFalse(); diff --git a/web-app/admin/src/app/logins/logins.component.ts b/web-app/admin/src/app/logins/logins.component.ts index 845b4cd56..b2203ca0a 100644 --- a/web-app/admin/src/app/logins/logins.component.ts +++ b/web-app/admin/src/app/logins/logins.component.ts @@ -1,5 +1,5 @@ import { Component, OnInit, Input, OnDestroy } from '@angular/core'; -import { Router } from '@angular/router'; +import { Router, RouterModule } from '@angular/router'; import moment from 'moment'; import { Subject, Observable, from, of, isObservable } from 'rxjs'; import { takeUntil, catchError } from 'rxjs/operators'; @@ -13,9 +13,19 @@ import { AdminUserService } from '../admin/services/admin-user.service'; import { DevicePagingService } from '../services/device-paging.service'; import { UserPagingService } from '../services/user-paging.service'; import { LoginService } from '../services/login.service'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { MatIconModule } from '@angular/material/icon'; @Component({ selector: 'mage-logins', + standalone: true, + imports: [ + CommonModule, + FormsModule, + MatIconModule, + RouterModule + ], templateUrl: './logins.component.html', styleUrls: ['./logins.component.scss'] }) diff --git a/web-app/admin/src/app/logins/logins.module.ts b/web-app/admin/src/app/logins/logins.module.ts index 10c3cea42..7d47318de 100644 --- a/web-app/admin/src/app/logins/logins.module.ts +++ b/web-app/admin/src/app/logins/logins.module.ts @@ -4,37 +4,37 @@ import { FormsModule } from '@angular/forms'; import { LoginsComponent } from './logins.component'; import { MatToolbarModule } from '@angular/material/toolbar'; import { MatIconModule } from '@angular/material/icon'; -import { MatFormFieldModule as MatFormFieldModule } from '@angular/material/form-field'; -import { MatInputModule as MatInputModule } from '@angular/material/input'; -import { MatButtonModule as MatButtonModule } from '@angular/material/button'; -import { MatCardModule as MatCardModule } from '@angular/material/card'; -import { MatSelectModule as MatSelectModule } from '@angular/material/select'; -import { MatDatepickerModule } from '@angular/material/datepicker' -import { MatMomentDateModule } from '@angular/material-moment-adapter' -import { MatAutocompleteModule as MatAutocompleteModule } from '@angular/material/autocomplete'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCardModule } from '@angular/material/card'; +import { MatSelectModule } from '@angular/material/select'; +import { MatDatepickerModule } from '@angular/material/datepicker'; +import { MatMomentDateModule } from '@angular/material-moment-adapter'; +import { MatAutocompleteModule } from '@angular/material/autocomplete'; import { MatNativeDateModule } from '@angular/material/core'; -import { MatTableModule as MatTableModule } from '@angular/material/table'; +import { MatTableModule } from '@angular/material/table'; import { RouterModule } from '@angular/router'; @NgModule({ - declarations: [LoginsComponent], - imports: [ - CommonModule, - FormsModule, - MatToolbarModule, - MatIconModule, - MatFormFieldModule, - MatInputModule, - MatButtonModule, - MatCardModule, - MatSelectModule, - MatDatepickerModule, - MatMomentDateModule, - MatAutocompleteModule, - MatNativeDateModule, - MatTableModule, - RouterModule - ], - exports: [LoginsComponent], + imports: [ + CommonModule, + FormsModule, + MatToolbarModule, + MatIconModule, + MatFormFieldModule, + MatInputModule, + MatButtonModule, + MatCardModule, + MatSelectModule, + MatDatepickerModule, + MatMomentDateModule, + MatAutocompleteModule, + MatNativeDateModule, + MatTableModule, + RouterModule, + LoginsComponent + ], + exports: [LoginsComponent] }) -export class LoginsModule { } +export class LoginsModule {} diff --git a/web-app/admin/src/app/map/clip/clip.component.spec.ts b/web-app/admin/src/app/map/clip/clip.component.spec.ts index 71bdb7e76..b7aaed9df 100644 --- a/web-app/admin/src/app/map/clip/clip.component.spec.ts +++ b/web-app/admin/src/app/map/clip/clip.component.spec.ts @@ -9,7 +9,7 @@ describe('MapClipComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [MapClipComponent] + imports: [MapClipComponent] }) .compileComponents(); })); diff --git a/web-app/admin/src/app/map/settings/map.settings.service.spec.ts b/web-app/admin/src/app/map/settings/map.settings.service.spec.ts index 35af4e125..d60251f4c 100644 --- a/web-app/admin/src/app/map/settings/map.settings.service.spec.ts +++ b/web-app/admin/src/app/map/settings/map.settings.service.spec.ts @@ -1,14 +1,16 @@ import { TestBed } from '@angular/core/testing'; import { MapSettingsService } from './map.settings.service'; -import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { provideHttpClientTesting } from '@angular/common/http/testing'; +import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; describe('MapSettingsService', () => { beforeEach(() => { TestBed.configureTestingModule({ - imports: [HttpClientTestingModule] - }); + imports: [], + providers: [provideHttpClient(withInterceptorsFromDi()), provideHttpClientTesting()] +}); }); it('should be created', () => { diff --git a/web-app/admin/src/app/moment/moment.module.ts b/web-app/admin/src/app/moment/moment.module.ts index 753ebf605..667a6623d 100644 --- a/web-app/admin/src/app/moment/moment.module.ts +++ b/web-app/admin/src/app/moment/moment.module.ts @@ -3,14 +3,12 @@ import { CommonModule } from '@angular/common'; import { MomentPipe } from './moment.pipe'; @NgModule({ - declarations: [ + imports: [ + CommonModule, MomentPipe ], exports: [ MomentPipe - ], - imports: [ - CommonModule ] }) -export class MomentModule { } +export class MomentModule { } \ No newline at end of file diff --git a/web-app/admin/src/app/navigation/admin-navigation.component.ts b/web-app/admin/src/app/navigation/admin-navigation.component.ts index a99b1bc1c..6e6d01933 100644 --- a/web-app/admin/src/app/navigation/admin-navigation.component.ts +++ b/web-app/admin/src/app/navigation/admin-navigation.component.ts @@ -4,9 +4,20 @@ import { filter, Subject, takeUntil } from 'rxjs'; import { AdminUserService } from '../admin/services/admin-user.service'; import { LocalStorageService } from '../../../../../web-app/src/app/http/local-storage.service'; +import { CommonModule } from '@angular/common'; +import { MatIconModule } from '@angular/material/icon'; +import { MatToolbarModule } from '@angular/material/toolbar'; +import { UserAvatarModule } from 'mage-web-app/user/user-avatar/user-avatar.module'; @Component({ selector: 'admin-navigation', + standalone: true, + imports: [ + CommonModule, + MatToolbarModule, + MatIconModule, + UserAvatarModule + ], templateUrl: './admin-navigation.component.html', styleUrls: ['./admin-navigation.component.scss'] }) diff --git a/web-app/admin/src/app/observation/attachment/attachment-upload/attachment-upload.component.spec.ts b/web-app/admin/src/app/observation/attachment/attachment-upload/attachment-upload.component.spec.ts index 7d19efb8e..3291eece4 100644 --- a/web-app/admin/src/app/observation/attachment/attachment-upload/attachment-upload.component.spec.ts +++ b/web-app/admin/src/app/observation/attachment/attachment-upload/attachment-upload.component.spec.ts @@ -1,4 +1,4 @@ -import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { provideHttpClientTesting } from '@angular/common/http/testing'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { AttachUploadComponent } from './attachment-upload.component'; @@ -8,7 +8,11 @@ import { MatIconModule } from '@angular/material/icon'; import { MatCardModule as MatCardModule } from '@angular/material/card'; import { MatProgressSpinnerModule as MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { MatDividerModule } from '@angular/material/divider'; -import { MatListModule as MatListModule } from '@angular/material/list'; // for mat-nav-list +import { MatListModule as MatListModule } from '@angular/material/list'; +import { + provideHttpClient, + withInterceptorsFromDi +} from '@angular/common/http'; // for mat-nav-list describe('AttachUploadComponent', () => { let component: AttachUploadComponent; @@ -17,16 +21,19 @@ describe('AttachUploadComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ imports: [ - HttpClientTestingModule, CommonModule, MatPaginatorModule, MatIconModule, MatCardModule, MatProgressSpinnerModule, MatDividerModule, - MatListModule + MatListModule, + AttachUploadComponent ], - declarations: [AttachUploadComponent] + providers: [ + provideHttpClient(withInterceptorsFromDi()), + provideHttpClientTesting() + ] }).compileComponents(); })); diff --git a/web-app/admin/src/app/observation/attachment/attachment-upload/attachment-upload.component.ts b/web-app/admin/src/app/observation/attachment/attachment-upload/attachment-upload.component.ts index 08997dda1..3d5a60935 100644 --- a/web-app/admin/src/app/observation/attachment/attachment-upload/attachment-upload.component.ts +++ b/web-app/admin/src/app/observation/attachment/attachment-upload/attachment-upload.component.ts @@ -3,6 +3,11 @@ import { ChangeDetectorRef, Component, EventEmitter, Input, OnChanges, Output, S import { UntypedFormControl } from '@angular/forms'; import { AttachmentAction } from '../../observation-edit/observation-edit-attachment/observation-edit-attachment-action'; import { AttachmentService } from '../attachment.service'; +import { CommonModule } from '@angular/common'; +import { MatIconModule } from '@angular/material/icon'; +import { MatProgressBarModule } from '@angular/material/progress-bar'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { FilenamePipe } from 'mage-web-app/filename/filename.pipe'; export interface FileUpload { id: number | string, @@ -22,6 +27,14 @@ enum PreviewType { @Component({ selector: 'attachment-upload', + standalone: true, + imports: [ + CommonModule, + MatProgressSpinnerModule, + MatIconModule, + MatProgressBarModule, + FilenamePipe + ], templateUrl: './attachment-upload.component.html', styleUrls: ['./attachment-upload.component.scss'] }) diff --git a/web-app/admin/src/app/observation/attachment/attachment.component.spec.ts b/web-app/admin/src/app/observation/attachment/attachment.component.spec.ts index 3b6e79bc3..f80adad1c 100644 --- a/web-app/admin/src/app/observation/attachment/attachment.component.spec.ts +++ b/web-app/admin/src/app/observation/attachment/attachment.component.spec.ts @@ -9,7 +9,7 @@ describe('AttachmentComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ AttachmentComponent ] + imports: [ AttachmentComponent ] }) .compileComponents(); })); diff --git a/web-app/admin/src/app/observation/attachment/attachment.component.ts b/web-app/admin/src/app/observation/attachment/attachment.component.ts index 29e35bb46..892a224b7 100644 --- a/web-app/admin/src/app/observation/attachment/attachment.component.ts +++ b/web-app/admin/src/app/observation/attachment/attachment.component.ts @@ -5,9 +5,20 @@ import { LocalStorageService } from 'src/app/http/local-storage.service'; import { AdminUserService } from '../../admin/services/admin-user.service'; import { AttachmentAction } from '../observation-edit/observation-edit-attachment/observation-edit-attachment-action'; +import { CommonModule } from '@angular/common'; +import { MatChipsModule } from '@angular/material/chips'; +import { MatIconModule } from '@angular/material/icon'; +import { FilenamePipe } from 'mage-web-app/filename/filename.pipe'; @Component({ selector: 'observation-attachment', + standalone: true, + imports: [ + CommonModule, + MatChipsModule, + MatIconModule, + FilenamePipe + ], templateUrl: './attachment.component.html', styleUrls: ['./attachment.component.scss'] }) diff --git a/web-app/admin/src/app/observation/attachment/attachment.service.spec.ts b/web-app/admin/src/app/observation/attachment/attachment.service.spec.ts index a583e1973..1ba9325ea 100644 --- a/web-app/admin/src/app/observation/attachment/attachment.service.spec.ts +++ b/web-app/admin/src/app/observation/attachment/attachment.service.spec.ts @@ -1,15 +1,17 @@ -import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { provideHttpClientTesting } from '@angular/common/http/testing'; import { TestBed } from '@angular/core/testing'; import { AttachmentService } from './attachment.service'; +import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; describe('AttachmentService', () => { beforeEach(() => TestBed.configureTestingModule({})); beforeEach(() => { TestBed.configureTestingModule({ - imports: [HttpClientTestingModule] - }); + imports: [], + providers: [provideHttpClient(withInterceptorsFromDi()), provideHttpClientTesting()] +}); }); it('should be created', () => { diff --git a/web-app/admin/src/app/observation/observation-edit/observation-edit-attachment/observation-edit-attachment.component.spec.ts b/web-app/admin/src/app/observation/observation-edit/observation-edit-attachment/observation-edit-attachment.component.spec.ts index 99bf9e938..98a231fd9 100644 --- a/web-app/admin/src/app/observation/observation-edit/observation-edit-attachment/observation-edit-attachment.component.spec.ts +++ b/web-app/admin/src/app/observation/observation-edit/observation-edit-attachment/observation-edit-attachment.component.spec.ts @@ -1,44 +1,66 @@ -import { Component, CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA, ViewChild } from '@angular/core'; +import { + Component, + CUSTOM_ELEMENTS_SCHEMA, + NO_ERRORS_SCHEMA, + ViewChild +} from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; +import { provideHttpClientTesting } from '@angular/common/http/testing'; import { UntypedFormControl, UntypedFormGroup } from '@angular/forms'; import { ObservationEditAttachmentComponent } from './observation-edit-attachment.component'; @Component({ - selector: `host-component`, - template: `` + standalone: true, + imports: [ObservationEditAttachmentComponent], + template: ` + + ` }) class TestHostComponent { - attachments = [] + attachments = []; + formGroup = new UntypedFormGroup({ attachment: new UntypedFormControl([]) }); + definition = { name: 'attachment' - } - @ViewChild(ObservationEditAttachmentComponent) component: ObservationEditAttachmentComponent + }; + + @ViewChild(ObservationEditAttachmentComponent) + component: ObservationEditAttachmentComponent; } describe('ObservationEditAttachmentComponent', () => { - let component: ObservationEditAttachmentComponent - let hostComponent: TestHostComponent - let fixture: ComponentFixture + let component: ObservationEditAttachmentComponent; + let hostComponent: TestHostComponent; + let fixture: ComponentFixture; beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ObservationEditAttachmentComponent, TestHostComponent] - }) - .compileComponents(); + imports: [TestHostComponent], + schemas: [CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA], + providers: [ + provideHttpClient(withInterceptorsFromDi()), + provideHttpClientTesting() + ] + }).compileComponents(); })); beforeEach(() => { - fixture = TestBed.createComponent(TestHostComponent) - hostComponent = fixture.componentInstance + fixture = TestBed.createComponent(TestHostComponent); + hostComponent = fixture.componentInstance; fixture.detectChanges(); - component = hostComponent.component - }) + component = hostComponent.component; + }); it('should create', () => { expect(component).toBeTruthy(); }); -}); +}); \ No newline at end of file diff --git a/web-app/admin/src/app/observation/observation-edit/observation-edit-attachment/observation-edit-attachment.component.ts b/web-app/admin/src/app/observation/observation-edit/observation-edit-attachment/observation-edit-attachment.component.ts index acc457253..b3f347e8e 100644 --- a/web-app/admin/src/app/observation/observation-edit/observation-edit-attachment/observation-edit-attachment.component.ts +++ b/web-app/admin/src/app/observation/observation-edit/observation-edit-attachment/observation-edit-attachment.component.ts @@ -1,83 +1,108 @@ import { ChangeDetectorRef, Component, Input, OnInit } from '@angular/core'; import { UntypedFormControl, UntypedFormGroup } from '@angular/forms'; +import { CommonModule } from '@angular/common'; +import { MatGridListModule } from '@angular/material/grid-list'; +import { MatIconModule } from '@angular/material/icon'; + import { AttachmentAction } from './observation-edit-attachment-action'; +import { AttachUploadComponent } from '../../attachment/attachment-upload/attachment-upload.component'; +import { AttachmentComponent } from '../../attachment/attachment.component'; interface AttachmentField { - title: string, - name: string, - value: any[], - min: number, - max: number + title: string; + name: string; + value: any[]; + min: number; + max: number; } @Component({ selector: 'observation-edit-attachment', + standalone: true, + imports: [ + CommonModule, + MatGridListModule, + MatIconModule, + AttachmentComponent, + AttachUploadComponent + ], templateUrl: './observation-edit-attachment.component.html', styleUrls: ['./observation-edit-attachment.component.scss'] }) export class ObservationEditAttachmentComponent implements OnInit { - @Input() formGroup: UntypedFormGroup - @Input() definition: AttachmentField - @Input() url: string - @Input() attachments: any[] + @Input() formGroup: UntypedFormGroup; + @Input() definition: AttachmentField; + @Input() url: string; + @Input() attachments: any[] = []; - control: UntypedFormControl - uploadId = 0 - uploadAttachments = false + control: UntypedFormControl; + uploadId = 0; - constructor(private changeDetector: ChangeDetectorRef) { } + constructor(private changeDetector: ChangeDetectorRef) {} ngOnInit(): void { - this.control = this.formGroup.get(this.definition.name) as UntypedFormControl + this.control = this.formGroup.get( + this.definition.name + ) as UntypedFormControl; } trackByAttachment(index: number, attachment: any): any { - return attachment.id + return attachment.id; } allAttachments(): any[] { - const observationFormId = this.formGroup.get('id')?.value - const attachments = (this.attachments || []).filter(attachment => { - return attachment.url && + const observationFormId = this.formGroup.get('id')?.value; + const attachments = (this.attachments || []).filter( + (attachment) => + attachment.url && attachment.observationFormId === observationFormId && attachment.fieldName === this.definition.name - }); + ); - return this.control.value ? attachments.concat(this.control.value) : attachments + return this.control.value + ? attachments.concat(this.control.value) + : attachments; } - onAttachmentFile(event): void { - const attachments = this.control.value || [] - const files = Array.from(event.target.files) + onAttachmentFile(event: Event): void { + const attachments = this.control.value || []; + const input = event.target as HTMLInputElement; + const files: File[] = Array.from(input.files ?? []); + files.forEach((file: File) => { const id = this.uploadId++; + attachments.push({ - id: id, - formId: this.formGroup.get('formId').value, + id, + formId: this.formGroup.get('formId')?.value, name: file.name, size: file.size, contentType: file.type, action: AttachmentAction.ADD, - file: file - }) - }) - - this.control.setValue(attachments) - - this.changeDetector.detectChanges() + file + }); + }); + + this.control.setValue(attachments); + this.changeDetector.detectChanges(); } deleteAttachment(attachmentToDelete): void { - this.attachments = this.attachments.filter(attachment => attachment.id !== attachmentToDelete.id) - attachmentToDelete.action = AttachmentAction.DELETE + this.attachments = this.attachments.filter( + (attachment) => attachment.id !== attachmentToDelete.id + ); + + attachmentToDelete.action = AttachmentAction.DELETE; - const value = this.control.value || [] - value.push(attachmentToDelete) - this.control.setValue(value) + const value = this.control.value || []; + value.push(attachmentToDelete); + this.control.setValue(value); } removeAttachment($event): void { - const attachments = this.control.value || [] - this.control.setValue(attachments.filter(attachment => attachment.id !== $event.id)) + const attachments = this.control.value || []; + this.control.setValue( + attachments.filter((attachment) => attachment.id !== $event.id) + ); } -} \ No newline at end of file +} diff --git a/web-app/admin/src/app/observation/observation-edit/observation-edit-checkbox/observation-edit-checkbox.component.spec.ts b/web-app/admin/src/app/observation/observation-edit/observation-edit-checkbox/observation-edit-checkbox.component.spec.ts index 979b3e209..19e0d892a 100644 --- a/web-app/admin/src/app/observation/observation-edit/observation-edit-checkbox/observation-edit-checkbox.component.spec.ts +++ b/web-app/admin/src/app/observation/observation-edit/observation-edit-checkbox/observation-edit-checkbox.component.spec.ts @@ -16,11 +16,14 @@ import { MatCheckboxHarness } from '@angular/material/checkbox/testing'; import { ObservationEditCheckboxComponent } from './observation-edit-checkbox.component'; @Component({ - selector: `host-component`, - template: `` + standalone: true, + imports: [ObservationEditCheckboxComponent], + template: ` + + ` }) class TestHostComponent { formGroup = new UntypedFormGroup({ @@ -51,9 +54,10 @@ describe('ObservationEditCheckboxComponent', () => { FormsModule, ReactiveFormsModule, MatFormFieldModule, - MatCheckboxModule + MatCheckboxModule, + ObservationEditCheckboxComponent, + TestHostComponent ], - declarations: [ObservationEditCheckboxComponent, TestHostComponent] }).compileComponents(); })); diff --git a/web-app/admin/src/app/observation/observation-edit/observation-edit-checkbox/observation-edit-checkbox.component.ts b/web-app/admin/src/app/observation/observation-edit/observation-edit-checkbox/observation-edit-checkbox.component.ts index 8d81181d9..67aaea764 100644 --- a/web-app/admin/src/app/observation/observation-edit/observation-edit-checkbox/observation-edit-checkbox.component.ts +++ b/web-app/admin/src/app/observation/observation-edit/observation-edit-checkbox/observation-edit-checkbox.component.ts @@ -1,6 +1,8 @@ +import { CommonModule } from '@angular/common'; import { Component, Input, OnInit } from '@angular/core'; -import { UntypedFormControl, UntypedFormGroup } from '@angular/forms'; -import { MatCheckboxChange as MatCheckboxChange } from '@angular/material/checkbox'; +import { ReactiveFormsModule, UntypedFormControl, UntypedFormGroup } from '@angular/forms'; +import { MatCheckboxChange as MatCheckboxChange, MatCheckboxModule } from '@angular/material/checkbox'; +import { MatFormFieldModule } from '@angular/material/form-field'; interface CheckboxField { title: string, @@ -11,6 +13,13 @@ interface CheckboxField { @Component({ selector: 'observation-edit-checkbox', + standalone: true, + imports: [ + CommonModule, + ReactiveFormsModule, + MatCheckboxModule, + MatFormFieldModule + ], templateUrl: './observation-edit-checkbox.component.html', styleUrls: ['./observation-edit-checkbox.component.scss'] }) diff --git a/web-app/admin/src/app/observation/observation-edit/observation-edit-date/observation-edit-date.component.spec.ts b/web-app/admin/src/app/observation/observation-edit/observation-edit-date/observation-edit-date.component.spec.ts index bb2800a0c..dee0e638a 100644 --- a/web-app/admin/src/app/observation/observation-edit/observation-edit-date/observation-edit-date.component.spec.ts +++ b/web-app/admin/src/app/observation/observation-edit/observation-edit-date/observation-edit-date.component.spec.ts @@ -9,7 +9,7 @@ describe('ObservationEditDateComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ObservationEditDateComponent ] + imports: [ObservationEditDateComponent ] }) .compileComponents(); })); diff --git a/web-app/admin/src/app/observation/observation-edit/observation-edit-date/observation-edit-date.component.ts b/web-app/admin/src/app/observation/observation-edit/observation-edit-date/observation-edit-date.component.ts index 0ad99a52d..683f60049 100644 --- a/web-app/admin/src/app/observation/observation-edit/observation-edit-date/observation-edit-date.component.ts +++ b/web-app/admin/src/app/observation/observation-edit/observation-edit-date/observation-edit-date.component.ts @@ -5,12 +5,26 @@ import { SimpleChanges, ViewChild } from '@angular/core'; -import { UntypedFormGroup, NgModel } from '@angular/forms'; +import { UntypedFormGroup, NgModel, FormsModule } from '@angular/forms'; import moment from 'moment'; import { LocalStorageService } from '../../../../../../src/app/http/local-storage.service'; +import { CommonModule } from '@angular/common'; +import { MatNativeDateModule } from '@angular/material/core'; +import { MatDatepickerModule } from '@angular/material/datepicker'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; @Component({ selector: 'observation-edit-date', + standalone: true, + imports: [ + CommonModule, + FormsModule, + MatFormFieldModule, + MatInputModule, + MatDatepickerModule, + MatNativeDateModule + ], templateUrl: './observation-edit-date.component.html', styleUrls: ['./observation-edit-date.component.scss'] }) diff --git a/web-app/admin/src/app/observation/observation-edit/observation-edit-discard/observation-edit-discard.component.spec.ts b/web-app/admin/src/app/observation/observation-edit/observation-edit-discard/observation-edit-discard.component.spec.ts index 59c25963d..4abcfd3ea 100644 --- a/web-app/admin/src/app/observation/observation-edit/observation-edit-discard/observation-edit-discard.component.spec.ts +++ b/web-app/admin/src/app/observation/observation-edit/observation-edit-discard/observation-edit-discard.component.spec.ts @@ -9,8 +9,7 @@ describe('ObservationEditDiscardComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - imports: [MatDialogModule], - declarations: [ObservationEditDiscardComponent], + imports: [ObservationEditDiscardComponent, MatDialogModule], providers: [{ provide: MatDialogRef, useValue: {} }, { diff --git a/web-app/admin/src/app/observation/observation-edit/observation-edit-email/observation-edit-email.component.spec.ts b/web-app/admin/src/app/observation/observation-edit/observation-edit-email/observation-edit-email.component.spec.ts index a232af929..ebeb60adc 100644 --- a/web-app/admin/src/app/observation/observation-edit/observation-edit-email/observation-edit-email.component.spec.ts +++ b/web-app/admin/src/app/observation/observation-edit/observation-edit-email/observation-edit-email.component.spec.ts @@ -1,7 +1,16 @@ import { ChangeDetectionStrategy, Component, ViewChild } from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { UntypedFormControl, UntypedFormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms'; -import { MatError as MatError, MatFormFieldModule as MatFormFieldModule } from '@angular/material/form-field'; +import { + UntypedFormControl, + UntypedFormGroup, + FormsModule, + ReactiveFormsModule, + Validators +} from '@angular/forms'; +import { + MatError as MatError, + MatFormFieldModule as MatFormFieldModule +} from '@angular/material/form-field'; import { MatInputModule as MatInputModule } from '@angular/material/input'; import { By } from '@angular/platform-browser'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; @@ -9,103 +18,115 @@ import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { ObservationEditEmailComponent } from './observation-edit-email.component'; @Component({ - selector: `host-component`, - template: ``, - changeDetection: ChangeDetectionStrategy.OnPush + standalone: true, + imports: [ObservationEditEmailComponent], + template: ` + + ` }) class TestHostComponent { formGroup = new UntypedFormGroup({ text: new UntypedFormControl('') - }) + }); definition: any = { name: 'text', title: 'Email Field' - } + }; - @ViewChild(ObservationEditEmailComponent) component: ObservationEditEmailComponent + @ViewChild(ObservationEditEmailComponent) + component: ObservationEditEmailComponent; } describe('ObservationEditEmailComponent', () => { - let component: ObservationEditEmailComponent - let hostComponent: TestHostComponent - let fixture: ComponentFixture + let component: ObservationEditEmailComponent; + let hostComponent: TestHostComponent; + let fixture: ComponentFixture; beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - imports: [FormsModule, ReactiveFormsModule, MatFormFieldModule, MatInputModule, NoopAnimationsModule], - declarations: [ObservationEditEmailComponent, TestHostComponent] - }) - .compileComponents() - })) + imports: [ + FormsModule, + ReactiveFormsModule, + MatFormFieldModule, + MatInputModule, + NoopAnimationsModule, + ObservationEditEmailComponent, + TestHostComponent + ] + }).compileComponents(); + })); beforeEach(() => { - fixture = TestBed.createComponent(TestHostComponent) - hostComponent = fixture.componentInstance + fixture = TestBed.createComponent(TestHostComponent); + hostComponent = fixture.componentInstance; fixture.detectChanges(); - component = hostComponent.component - }) + component = hostComponent.component; + }); it('should create', () => { - expect(component).toBeTruthy() - }) + expect(component).toBeTruthy(); + }); it('should not indicate required', async () => { - component.definition.required = false + component.definition.required = false; - const control = component.formGroup.get('text') - control.clearValidators() - control.updateValueAndValidity() + const control = component.formGroup.get('text'); + control.clearValidators(); + control.updateValueAndValidity(); - fixture.detectChanges() - await fixture.whenStable() + fixture.detectChanges(); + await fixture.whenStable(); - expect(control.valid).toBe(true) - const error = fixture.debugElement.query(By.directive(MatError)) - expect(error).toBeNull() - }) + expect(control.valid).toBe(true); + const error = fixture.debugElement.query(By.directive(MatError)); + expect(error).toBeNull(); + }); it('should indicate required', async () => { - component.definition.required = true + component.definition.required = true; - const control = component.formGroup.get('text') - control.setValidators(Validators.required) - control.updateValueAndValidity() + const control = component.formGroup.get('text'); + control.setValidators(Validators.required); + control.updateValueAndValidity(); - fixture.detectChanges() - await fixture.whenStable() + fixture.detectChanges(); + await fixture.whenStable(); - expect(control.valid).toBe(false) - }) + expect(control.valid).toBe(false); + }); it('should show error on invalid and touched', async () => { - component.definition.required = true + component.definition.required = true; - const control = component.formGroup.get('text') - control.setValidators(Validators.required) - control.updateValueAndValidity() - control.markAsTouched() + const control = component.formGroup.get('text'); + control.setValidators(Validators.required); + control.updateValueAndValidity(); + control.markAsTouched(); - fixture.detectChanges() - await fixture.whenStable() + fixture.detectChanges(); + await fixture.whenStable(); - expect(control.valid).toBe(false) - const error = fixture.debugElement.query(By.directive(MatError)) - expect(error.nativeElement.innerText).toBe('You must enter a value') - }) + expect(control.valid).toBe(false); + const error = fixture.debugElement.query(By.directive(MatError)); + expect(error.nativeElement.innerText).toBe('You must enter a value'); + }); it('should not show error on invalid if not touched', async () => { - component.definition.required = true + component.definition.required = true; - const control = component.formGroup.get('text') - control.setValidators(Validators.required) - control.updateValueAndValidity() + const control = component.formGroup.get('text'); + control.setValidators(Validators.required); + control.updateValueAndValidity(); - fixture.detectChanges() - await fixture.whenStable() + fixture.detectChanges(); + await fixture.whenStable(); - expect(control.valid).toBe(false) - const error = fixture.debugElement.query(By.directive(MatError)) - expect(error).toBeNull() - }) + expect(control.valid).toBe(false); + const error = fixture.debugElement.query(By.directive(MatError)); + expect(error).toBeNull(); + }); }); diff --git a/web-app/admin/src/app/observation/observation-edit/observation-edit-email/observation-edit-email.component.ts b/web-app/admin/src/app/observation/observation-edit/observation-edit-email/observation-edit-email.component.ts index 8ef85a52b..103304dce 100644 --- a/web-app/admin/src/app/observation/observation-edit/observation-edit-email/observation-edit-email.component.ts +++ b/web-app/admin/src/app/observation/observation-edit/observation-edit-email/observation-edit-email.component.ts @@ -1,5 +1,8 @@ +import { CommonModule } from '@angular/common'; import { Component, Input } from '@angular/core'; -import { UntypedFormGroup } from '@angular/forms'; +import { ReactiveFormsModule, UntypedFormGroup } from '@angular/forms'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; interface EmailField { title: string, @@ -10,6 +13,13 @@ interface EmailField { @Component({ selector: 'observation-edit-email', + standalone: true, + imports: [ + CommonModule, + ReactiveFormsModule, + MatFormFieldModule, + MatInputModule + ], templateUrl: './observation-edit-email.component.html', styleUrls: ['./observation-edit-email.component.scss'] }) diff --git a/web-app/admin/src/app/observation/observation-edit/observation-edit-form-picker.component.spec.ts b/web-app/admin/src/app/observation/observation-edit/observation-edit-form-picker.component.spec.ts index 2e77ddca1..fea6c238b 100644 --- a/web-app/admin/src/app/observation/observation-edit/observation-edit-form-picker.component.spec.ts +++ b/web-app/admin/src/app/observation/observation-edit/observation-edit-form-picker.component.spec.ts @@ -33,7 +33,7 @@ describe('ObservationEditFormPickerComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ObservationEditFormPickerComponent], + imports: [ObservationEditFormPickerComponent], providers: [ { provide: FilterService, useClass: MockFilterService }, { provide: AdminEventsService, useClass: MockAdminEventsService }, diff --git a/web-app/admin/src/app/observation/observation-edit/observation-edit-form-picker.component.ts b/web-app/admin/src/app/observation/observation-edit/observation-edit-form-picker.component.ts index 3fa13ab0e..a8e57ab74 100644 --- a/web-app/admin/src/app/observation/observation-edit/observation-edit-form-picker.component.ts +++ b/web-app/admin/src/app/observation/observation-edit/observation-edit-form-picker.component.ts @@ -1,10 +1,21 @@ +import { CommonModule } from '@angular/common'; import { Component } from '@angular/core'; import { MatBottomSheetRef } from '@angular/material/bottom-sheet'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatIconModule } from '@angular/material/icon'; +import { MatListModule } from '@angular/material/list'; import { EventService } from 'src/app/event/event.service'; import { FilterService } from 'src/app/filter/filter.service'; @Component({ selector: 'app-observation-edit-form-picker', + standalone: true, + imports: [ + CommonModule, + MatDividerModule, + MatListModule, + MatIconModule + ], templateUrl: './observation-edit-form-picker.component.html', styleUrls: ['./observation-edit-form-picker.component.scss'] }) diff --git a/web-app/admin/src/app/observation/observation-edit/observation-edit-form.component.spec.ts b/web-app/admin/src/app/observation/observation-edit/observation-edit-form.component.spec.ts index f5f9a2dac..20d3a0e2b 100644 --- a/web-app/admin/src/app/observation/observation-edit/observation-edit-form.component.spec.ts +++ b/web-app/admin/src/app/observation/observation-edit/observation-edit-form.component.spec.ts @@ -1,4 +1,9 @@ -import { Component, CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA, ViewChild } from '@angular/core'; +import { + Component, + CUSTOM_ELEMENTS_SCHEMA, + NO_ERRORS_SCHEMA, + ViewChild +} from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { UntypedFormGroup } from '@angular/forms'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; @@ -6,44 +11,54 @@ import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { ObservationEditFormComponent } from './observation-edit-form.component'; @Component({ - selector: `host-component`, - template: `` + standalone: true, + imports: [ObservationEditFormComponent], + template: ` + + ` }) class TestHostComponent { - - formGroup = new UntypedFormGroup({}) + formGroup = new UntypedFormGroup({}); definition = { name: 'TestForm', fields: [] - } - geometryStyle = {} + }; + geometryStyle = {}; options = { expand: false - } + }; - @ViewChild(ObservationEditFormComponent) component: ObservationEditFormComponent + @ViewChild(ObservationEditFormComponent) + component: ObservationEditFormComponent; } describe('ObservationEditFormComponent', () => { - let component: ObservationEditFormComponent - let hostComponent: TestHostComponent - let fixture: ComponentFixture + let component: ObservationEditFormComponent; + let hostComponent: TestHostComponent; + let fixture: ComponentFixture; beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - imports: [NoopAnimationsModule], - declarations: [ ObservationEditFormComponent, TestHostComponent ], - schemas: [ CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA ] - }) - .compileComponents(); + imports: [ + ObservationEditFormComponent, + TestHostComponent, + NoopAnimationsModule + ], + schemas: [CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA] + }).compileComponents(); })); beforeEach(() => { - fixture = TestBed.createComponent(TestHostComponent) - hostComponent = fixture.componentInstance + fixture = TestBed.createComponent(TestHostComponent); + hostComponent = fixture.componentInstance; fixture.detectChanges(); - component = hostComponent.component - }) + component = hostComponent.component; + }); it('should create', () => { expect(component).toBeTruthy(); diff --git a/web-app/admin/src/app/observation/observation-edit/observation-edit-form.component.ts b/web-app/admin/src/app/observation/observation-edit/observation-edit-form.component.ts index 724e036ec..4d60372f6 100644 --- a/web-app/admin/src/app/observation/observation-edit/observation-edit-form.component.ts +++ b/web-app/admin/src/app/observation/observation-edit/observation-edit-form.component.ts @@ -1,9 +1,37 @@ import { animate, state, style, transition, trigger } from '@angular/animations' +import { CommonModule } from '@angular/common' import { Component, EventEmitter, Input, Output } from '@angular/core' import { UntypedFormGroup } from '@angular/forms' +import { MatCardModule } from '@angular/material/card' +import { MatIconModule } from '@angular/material/icon' +import { GeometryModule } from 'mage-web-app/geometry/geometry.module' +import { ObservationEditCheckboxComponent, ObservationEditDateComponent, ObservationEditSelectComponent, ObservationEditMultiselectComponent, ObservationEditEmailComponent, ObservationEditNumberComponent, ObservationEditRadioComponent, ObservationEditTextComponent, ObservationEditTextareaComponent, ObservationEditGeometryComponent } from './observation-edit' +import { ObservationEditAttachmentComponent } from './observation-edit-attachment/observation-edit-attachment.component' +import { ObservationEditPasswordComponent } from './observation-edit-password/observation-edit-password.component' +import { MatDividerModule } from '@angular/material/divider' @Component({ selector: 'observation-edit-form', + standalone: true, + imports: [ + CommonModule, + MatCardModule, + MatIconModule, + MatDividerModule, + GeometryModule, + ObservationEditAttachmentComponent, + ObservationEditCheckboxComponent, + ObservationEditDateComponent, + ObservationEditSelectComponent, + ObservationEditMultiselectComponent, + ObservationEditEmailComponent, + ObservationEditNumberComponent, + ObservationEditRadioComponent, + ObservationEditTextComponent, + ObservationEditTextareaComponent, + ObservationEditPasswordComponent, + ObservationEditGeometryComponent + ], templateUrl: './observation-edit-form.component.html', styleUrls: ['./observation-edit-form.component.scss'], animations: [ diff --git a/web-app/admin/src/app/observation/observation-edit/observation-edit-geometry/observation-edit-geometry-form.component.spec.ts b/web-app/admin/src/app/observation/observation-edit/observation-edit-geometry/observation-edit-geometry-form.component.spec.ts index d2331fe57..8918c68bd 100644 --- a/web-app/admin/src/app/observation/observation-edit/observation-edit-geometry/observation-edit-geometry-form.component.spec.ts +++ b/web-app/admin/src/app/observation/observation-edit/observation-edit-geometry/observation-edit-geometry-form.component.spec.ts @@ -9,7 +9,7 @@ describe('ObservationEditGeometryFormComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ObservationEditGeometryFormComponent ] + imports: [ObservationEditGeometryFormComponent ] }) .compileComponents(); })); diff --git a/web-app/admin/src/app/observation/observation-edit/observation-edit-geometry/observation-edit-geometry-form.component.ts b/web-app/admin/src/app/observation/observation-edit/observation-edit-geometry/observation-edit-geometry-form.component.ts index 31c03ec6f..f2b392ce5 100644 --- a/web-app/admin/src/app/observation/observation-edit/observation-edit-geometry/observation-edit-geometry-form.component.ts +++ b/web-app/admin/src/app/observation/observation-edit/observation-edit-geometry/observation-edit-geometry-form.component.ts @@ -1,13 +1,17 @@ import { Component, Directive, EventEmitter, Inject, Input, OnChanges, OnInit, Output, SimpleChanges, ViewChild, ViewContainerRef } from '@angular/core' -import { AbstractControl, FormControl, FormGroup, NgModel, NG_VALIDATORS, ValidationErrors, Validator } from '@angular/forms' +import { AbstractControl, FormControl, FormGroup, NgModel, NG_VALIDATORS, ValidationErrors, Validator, FormsModule, ReactiveFormsModule } from '@angular/forms' import { MatSnackBar as MatSnackBar } from '@angular/material/snack-bar' import mgrs from 'mgrs' import { Dimension, DimensionKey, DMSCoordinate, DMSParseError } from '../../../../app/geometry/geometry-dms' import * as DMS from '../../../../app/geometry/geometry-dms' -import { createMask } from '@ngneat/input-mask' +import { createMask, InputMaskModule } from '@ngneat/input-mask' import { LocalStorageService } from 'src/app/http/local-storage.service'; import { MapService } from 'src/app/map/map.service' import { GeometryService } from 'src/app/geometry/geometry.service' +import { CommonModule } from '@angular/common' +import { MatChipsModule } from '@angular/material/chips' +import { MatFormFieldModule } from '@angular/material/form-field' +import { MatInputModule } from '@angular/material/input' @Directive({ selector: '[mgrs][formControlName],[mgrs][formControl],[mgrs][ngModel]', @@ -59,6 +63,16 @@ type DMSFormValue = Partial<{ [DimensionKey.Latitude]: string, [DimensionKey.Lon @Component({ selector: 'observation-edit-geometry-form', + standalone: true, + imports: [ + CommonModule, + FormsModule, + ReactiveFormsModule, + MatChipsModule, + MatFormFieldModule, + MatInputModule, + InputMaskModule + ], templateUrl: './observation-edit-geometry-form.component.html', styleUrls: ['./observation-edit-geometry-form.component.scss'], providers: [ diff --git a/web-app/admin/src/app/observation/observation-edit/observation-edit-geometry/observation-edit-geometry-map.component.spec.ts b/web-app/admin/src/app/observation/observation-edit/observation-edit-geometry/observation-edit-geometry-map.component.spec.ts index 0eb26c46b..a90fcb806 100644 --- a/web-app/admin/src/app/observation/observation-edit/observation-edit-geometry/observation-edit-geometry-map.component.spec.ts +++ b/web-app/admin/src/app/observation/observation-edit/observation-edit-geometry/observation-edit-geometry-map.component.spec.ts @@ -1,27 +1,21 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; - import { ObservationEditGeometryMapComponent } from './observation-edit-geometry-map.component'; -import { CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA } from '@angular/core'; describe('ObservationEditGeometryMapComponent', () => { let component: ObservationEditGeometryMapComponent; - let fixture: ComponentFixture; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - declarations: [ObservationEditGeometryMapComponent ], - schemas: [ CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA ] - }) - .compileComponents(); - })); beforeEach(() => { - fixture = TestBed.createComponent(ObservationEditGeometryMapComponent); - component = fixture.componentInstance; - fixture.detectChanges(); + component = new ObservationEditGeometryMapComponent(); }); it('should create', () => { expect(component).toBeTruthy(); }); -}); + + it('should emit edit event', () => { + spyOn(component.onEdit, 'emit'); + + component.edit(); + + expect(component.onEdit.emit).toHaveBeenCalled(); + }); +}); \ No newline at end of file diff --git a/web-app/admin/src/app/observation/observation-edit/observation-edit-geometry/observation-edit-geometry-map.component.ts b/web-app/admin/src/app/observation/observation-edit/observation-edit-geometry/observation-edit-geometry-map.component.ts index 3d8376ace..bd40b7c84 100644 --- a/web-app/admin/src/app/observation/observation-edit/observation-edit-geometry/observation-edit-geometry-map.component.ts +++ b/web-app/admin/src/app/observation/observation-edit/observation-edit-geometry/observation-edit-geometry-map.component.ts @@ -1,7 +1,16 @@ +import { CommonModule } from '@angular/common'; import { Component, EventEmitter, Input, Output } from '@angular/core'; +import { MatIconModule } from '@angular/material/icon'; +import { MapClipComponent } from 'mage-web-app/map/clip/clip.component'; @Component({ selector: 'observation-edit-geometry-map', + standalone: true, + imports: [ + CommonModule, + MatIconModule, + MapClipComponent + ], templateUrl: './observation-edit-geometry-map.component.html', styleUrls: ['./observation-edit-geometry-map.component.scss'] }) diff --git a/web-app/admin/src/app/observation/observation-edit/observation-edit-geometry/observation-edit-geometry.component.scss b/web-app/admin/src/app/observation/observation-edit/observation-edit-geometry/observation-edit-geometry.component.scss index 42a14da52..a694f84c2 100644 --- a/web-app/admin/src/app/observation/observation-edit/observation-edit-geometry/observation-edit-geometry.component.scss +++ b/web-app/admin/src/app/observation/observation-edit/observation-edit-geometry/observation-edit-geometry.component.scss @@ -26,7 +26,7 @@ } .geometry-field__label--active { - color: mat.get-color-from-palette($app-primary); + color: mat.m2-get-color-from-palette($app-primary); } .geometry-panel { diff --git a/web-app/admin/src/app/observation/observation-edit/observation-edit-geometry/observation-edit-geometry.component.spec.ts b/web-app/admin/src/app/observation/observation-edit/observation-edit-geometry/observation-edit-geometry.component.spec.ts index f9e75f7b3..793a96a8e 100644 --- a/web-app/admin/src/app/observation/observation-edit/observation-edit-geometry/observation-edit-geometry.component.spec.ts +++ b/web-app/admin/src/app/observation/observation-edit/observation-edit-geometry/observation-edit-geometry.component.spec.ts @@ -9,7 +9,7 @@ describe('ObservationEditGeometryComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ObservationEditGeometryComponent ] + imports: [ObservationEditGeometryComponent ] }) .compileComponents(); })); diff --git a/web-app/admin/src/app/observation/observation-edit/observation-edit-geometry/observation-edit-geometry.component.ts b/web-app/admin/src/app/observation/observation-edit/observation-edit-geometry/observation-edit-geometry.component.ts index 3a567966a..48317bffd 100644 --- a/web-app/admin/src/app/observation/observation-edit/observation-edit-geometry/observation-edit-geometry.component.ts +++ b/web-app/admin/src/app/observation/observation-edit/observation-edit-geometry/observation-edit-geometry.component.ts @@ -1,10 +1,21 @@ +import { CommonModule } from '@angular/common' import { Component, ElementRef, EventEmitter, Inject, Input, OnChanges, Output, SimpleChanges, ViewChild } from '@angular/core' import { UntypedFormGroup } from '@angular/forms' import { Feature, Geometry } from 'geojson' +import { GeometryModule } from 'mage-web-app/geometry/geometry.module' import { LocalStorageService } from 'src/app/http/local-storage.service' +import { ObservationEditGeometryFormComponent } from './observation-edit-geometry-form.component' +import { ObservationEditGeometryMapComponent } from './observation-edit-geometry-map.component' @Component({ selector: 'observation-edit-geometry', + standalone: true, + imports: [ + CommonModule, + GeometryModule, + ObservationEditGeometryMapComponent, + ObservationEditGeometryFormComponent + ], templateUrl: './observation-edit-geometry.component.html', styleUrls: ['./observation-edit-geometry.component.scss'] }) diff --git a/web-app/admin/src/app/observation/observation-edit/observation-edit-multiselect/observation-edit-multiselect.component.spec.ts b/web-app/admin/src/app/observation/observation-edit/observation-edit-multiselect/observation-edit-multiselect.component.spec.ts index f05a1926d..5bdf00414 100644 --- a/web-app/admin/src/app/observation/observation-edit/observation-edit-multiselect/observation-edit-multiselect.component.spec.ts +++ b/web-app/admin/src/app/observation/observation-edit/observation-edit-multiselect/observation-edit-multiselect.component.spec.ts @@ -1,202 +1,238 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' -import { ChangeDetectionStrategy, Component, CUSTOM_ELEMENTS_SCHEMA, ViewChild } from '@angular/core' - -import { ObservationEditMultiselectComponent } from './observation-edit-multiselect.component' +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { + ChangeDetectionStrategy, + Component, + CUSTOM_ELEMENTS_SCHEMA, + ViewChild +} from '@angular/core'; + +import { ObservationEditMultiselectComponent } from './observation-edit-multiselect.component'; import { MatAutocompleteModule as MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatChipsModule as MatChipsModule, MatChipInputEvent as MatChipInputEvent, MatChipInput as MatChipInput } from '@angular/material/chips'; -import { MatFormFieldModule as MatFormFieldModule, MatError as MatError } from '@angular/material/form-field'; +import { + MatChipsModule as MatChipsModule, + MatChipInputEvent as MatChipInputEvent, + MatChipInput as MatChipInput +} from '@angular/material/chips'; +import { + MatFormFieldModule as MatFormFieldModule, + MatError as MatError +} from '@angular/material/form-field'; import { MatIconModule } from '@angular/material/icon'; import { MatInputModule as MatInputModule } from '@angular/material/input'; -import { UntypedFormControl, UntypedFormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms' -import { BrowserAnimationsModule } from '@angular/platform-browser/animations' -import { By } from '@angular/platform-browser' +import { + UntypedFormControl, + UntypedFormGroup, + FormsModule, + ReactiveFormsModule, + Validators +} from '@angular/forms'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { By } from '@angular/platform-browser'; @Component({ - selector: `host-component`, - template: ``, - changeDetection: ChangeDetectionStrategy.OnPush + standalone: true, + imports: [ObservationEditMultiselectComponent], + template: ` + + ` }) class TestHostComponent { formGroup = new UntypedFormGroup({ select: new UntypedFormControl() - }) + }); definition: any = { name: 'select', required: false, title: 'Colors', - choices: [{ - title: 'red' - }, { - title: 'green' - }, { - title: 'blue' - }] - } - - @ViewChild(ObservationEditMultiselectComponent) component: ObservationEditMultiselectComponent + choices: [ + { + title: 'red' + }, + { + title: 'green' + }, + { + title: 'blue' + } + ] + }; + + @ViewChild(ObservationEditMultiselectComponent) + component: ObservationEditMultiselectComponent; } describe('ObservationEditMultiselectComponent', () => { - let component: ObservationEditMultiselectComponent - let hostComponent: TestHostComponent - let fixture: ComponentFixture - let chipInput: MatChipInput + let component: ObservationEditMultiselectComponent; + let hostComponent: TestHostComponent; + let fixture: ComponentFixture; + let chipInput: MatChipInput; beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - imports: [FormsModule, BrowserAnimationsModule, ReactiveFormsModule, MatInputModule, MatAutocompleteModule, MatChipsModule, MatIconModule, MatFormFieldModule], - declarations: [ObservationEditMultiselectComponent, TestHostComponent], + imports: [ + ObservationEditMultiselectComponent, + TestHostComponent, + FormsModule, + BrowserAnimationsModule, + ReactiveFormsModule, + MatInputModule, + MatAutocompleteModule, + MatChipsModule, + MatIconModule, + MatFormFieldModule + ], schemas: [CUSTOM_ELEMENTS_SCHEMA] - }) - .compileComponents() + }).compileComponents(); })); - beforeEach(() => { - fixture = TestBed.createComponent(TestHostComponent) - hostComponent = fixture.componentInstance + fixture = TestBed.createComponent(TestHostComponent); + hostComponent = fixture.componentInstance; fixture.detectChanges(); - component = hostComponent.component - }) + component = hostComponent.component; + }); it('should create', () => { - expect(component).toBeTruthy() - }) + expect(component).toBeTruthy(); + }); it('should not indicate required', async () => { - component.definition.required = false + component.definition.required = false; - const control = component.formGroup.get('select') - control.clearValidators() - control.updateValueAndValidity() + const control = component.formGroup.get('select'); + control.clearValidators(); + control.updateValueAndValidity(); - fixture.detectChanges() - await fixture.whenStable() + fixture.detectChanges(); + await fixture.whenStable(); - expect(control.valid).toBe(true) - const error = fixture.debugElement.query(By.directive(MatError)) - expect(error).toBeNull() - }) + expect(control.valid).toBe(true); + const error = fixture.debugElement.query(By.directive(MatError)); + expect(error).toBeNull(); + }); it('should indicate required', async () => { - component.definition.required = true + component.definition.required = true; - const control = component.formGroup.get('select') - control.setValidators(Validators.required) - control.updateValueAndValidity() + const control = component.formGroup.get('select'); + control.setValidators(Validators.required); + control.updateValueAndValidity(); - fixture.detectChanges() - await fixture.whenStable() + fixture.detectChanges(); + await fixture.whenStable(); - expect(control.valid).toBe(false) - }) + expect(control.valid).toBe(false); + }); it('should select choice', () => { const event: any = { option: { value: 'red' } - } + }; - component.selected(event) + component.selected(event); - const control = component.formGroup.get('select') - expect(control.value).toEqual(['red']) - }) + const control = component.formGroup.get('select'); + expect(control.value).toEqual(['red']); + }); it('should add choice', () => { const event: MatChipInputEvent = { input: null, value: 'red', chipInput: chipInput - } - component.add(event) + }; + component.add(event); - const control = component.formGroup.get('select') - expect(control.value).toEqual(['red']) - }) + const control = component.formGroup.get('select'); + expect(control.value).toEqual(['red']); + }); it('should not add invalid choice', () => { const event: MatChipInputEvent = { input: null, value: 'purple', chipInput: chipInput - } - component.add(event) + }; + component.add(event); // expect(component.field.value).toBeUndefined() - const control = component.formGroup.get('select') - expect(control.value).toBeNull() - }) + const control = component.formGroup.get('select'); + expect(control.value).toBeNull(); + }); it('should not add duplicate choice', () => { const event: MatChipInputEvent = { input: null, value: 'red', chipInput: chipInput - } - component.add(event) - component.add(event) + }; + component.add(event); + component.add(event); - const control = component.formGroup.get('select') - expect(control.value).toEqual(['red']) - }) + const control = component.formGroup.get('select'); + expect(control.value).toEqual(['red']); + }); it('should remove choice', () => { const event: MatChipInputEvent = { input: null, value: 'red', chipInput: chipInput - } - component.add(event) - component.remove('red') + }; + component.add(event); + component.remove('red'); - const control = component.formGroup.get('select') - expect(control.value).toBeNull() - }) + const control = component.formGroup.get('select'); + expect(control.value).toBeNull(); + }); it('should not remove non existing choice', () => { const event: MatChipInputEvent = { input: null, value: 'red', chipInput: chipInput - } - component.add(event) - component.remove('blue') + }; + component.add(event); + component.remove('blue'); - const control = component.formGroup.get('select') - expect(control.value).toEqual(['red']) - }) + const control = component.formGroup.get('select'); + expect(control.value).toEqual(['red']); + }); it('should show error on invalid and touched', async () => { - component.definition.required = true + component.definition.required = true; - const control = component.formGroup.get('select') - control.setValidators(Validators.required) - control.updateValueAndValidity() - control.markAsTouched() + const control = component.formGroup.get('select'); + control.setValidators(Validators.required); + control.updateValueAndValidity(); + control.markAsTouched(); - fixture.detectChanges() - await fixture.whenStable() + fixture.detectChanges(); + await fixture.whenStable(); - expect(control.valid).toBe(false) - const error = fixture.debugElement.query(By.directive(MatError)) - expect(error.nativeElement.innerText.trim()).toBe('You must enter a value') - }) + expect(control.valid).toBe(false); + const error = fixture.debugElement.query(By.directive(MatError)); + expect(error.nativeElement.innerText.trim()).toBe('You must enter a value'); + }); it('should not show error on invalid if not touched', async () => { - component.definition.required = true + component.definition.required = true; - const control = component.formGroup.get('select') - control.setValidators(Validators.required) - control.updateValueAndValidity() + const control = component.formGroup.get('select'); + control.setValidators(Validators.required); + control.updateValueAndValidity(); - fixture.detectChanges() - await fixture.whenStable() + fixture.detectChanges(); + await fixture.whenStable(); - expect(control.valid).toBe(false) - const error = fixture.debugElement.query(By.directive(MatError)) - expect(error).toBeNull() - }) + expect(control.valid).toBe(false); + const error = fixture.debugElement.query(By.directive(MatError)); + expect(error).toBeNull(); + }); }); diff --git a/web-app/admin/src/app/observation/observation-edit/observation-edit-multiselect/observation-edit-multiselect.component.ts b/web-app/admin/src/app/observation/observation-edit/observation-edit-multiselect/observation-edit-multiselect.component.ts index faf492e58..0a4b79a99 100644 --- a/web-app/admin/src/app/observation/observation-edit/observation-edit-multiselect/observation-edit-multiselect.component.ts +++ b/web-app/admin/src/app/observation/observation-edit/observation-edit-multiselect/observation-edit-multiselect.component.ts @@ -1,10 +1,13 @@ import { Component, ViewChild, ElementRef, Input, AfterViewInit, OnInit } from '@angular/core'; -import { UntypedFormControl, UntypedFormGroup } from '@angular/forms'; +import { ReactiveFormsModule, UntypedFormControl, UntypedFormGroup } from '@angular/forms'; import { COMMA, ENTER } from '@angular/cdk/keycodes'; -import { MatAutocompleteSelectedEvent as MatAutocompleteSelectedEvent, MatAutocompleteTrigger as MatAutocompleteTrigger } from '@angular/material/autocomplete'; -import { MatChipInputEvent as MatChipInputEvent, MatChipListbox as MatChipListbox } from '@angular/material/chips'; +import { MatAutocompleteModule, MatAutocompleteSelectedEvent as MatAutocompleteSelectedEvent, MatAutocompleteTrigger as MatAutocompleteTrigger } from '@angular/material/autocomplete'; +import { MatChipInputEvent as MatChipInputEvent, MatChipListbox as MatChipListbox, MatChipsModule } from '@angular/material/chips'; import { Observable } from 'rxjs'; import { map, startWith } from 'rxjs/operators'; +import { CommonModule } from '@angular/common'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; interface Choice { title: string; @@ -19,6 +22,15 @@ interface MultiSelectField { @Component({ selector: 'observation-edit-multiselect', + standalone: true, + imports: [ + CommonModule, + ReactiveFormsModule, + MatFormFieldModule, + MatChipsModule, + MatIconModule, + MatAutocompleteModule + ], templateUrl: './observation-edit-multiselect.component.html', styleUrls: ['./observation-edit-multiselect.component.scss'] }) diff --git a/web-app/admin/src/app/observation/observation-edit/observation-edit-number/observation-edit-number.component.spec.ts b/web-app/admin/src/app/observation/observation-edit/observation-edit-number/observation-edit-number.component.spec.ts index 1f704bc88..59f5239df 100644 --- a/web-app/admin/src/app/observation/observation-edit/observation-edit-number/observation-edit-number.component.spec.ts +++ b/web-app/admin/src/app/observation/observation-edit/observation-edit-number/observation-edit-number.component.spec.ts @@ -1,7 +1,16 @@ import { ChangeDetectionStrategy, Component, ViewChild } from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { UntypedFormControl, UntypedFormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms'; -import { MatError as MatError, MatFormFieldModule as MatFormFieldModule } from '@angular/material/form-field'; +import { + UntypedFormControl, + UntypedFormGroup, + FormsModule, + ReactiveFormsModule, + Validators +} from '@angular/forms'; +import { + MatError as MatError, + MatFormFieldModule as MatFormFieldModule +} from '@angular/material/form-field'; import { MatInputModule as MatInputModule } from '@angular/material/input'; import { By } from '@angular/platform-browser'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; @@ -9,104 +18,115 @@ import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { ObservationEditNumberComponent } from './observation-edit-number.component'; @Component({ - selector: `host-component`, - template: ``, - changeDetection: ChangeDetectionStrategy.OnPush + standalone: true, + imports: [ObservationEditNumberComponent], + template: ` + + ` }) class TestHostComponent { formGroup = new UntypedFormGroup({ number: new UntypedFormControl() - }) + }); definition: any = { name: 'number', title: 'Number Field' - } + }; - - @ViewChild(ObservationEditNumberComponent) component: ObservationEditNumberComponent + @ViewChild(ObservationEditNumberComponent) + component: ObservationEditNumberComponent; } describe('ObservationEditNumberComponent', () => { - let component: ObservationEditNumberComponent - let hostComponent: TestHostComponent - let fixture: ComponentFixture + let component: ObservationEditNumberComponent; + let hostComponent: TestHostComponent; + let fixture: ComponentFixture; beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - imports: [FormsModule, ReactiveFormsModule, MatFormFieldModule, MatInputModule, NoopAnimationsModule], - declarations: [ObservationEditNumberComponent, TestHostComponent] - }) - .compileComponents() - })) + imports: [ + FormsModule, + ReactiveFormsModule, + MatFormFieldModule, + MatInputModule, + NoopAnimationsModule, + ObservationEditNumberComponent, + TestHostComponent + ], + }).compileComponents(); + })); beforeEach(() => { - fixture = TestBed.createComponent(TestHostComponent) - hostComponent = fixture.componentInstance + fixture = TestBed.createComponent(TestHostComponent); + hostComponent = fixture.componentInstance; fixture.detectChanges(); - component = hostComponent.component - }) + component = hostComponent.component; + }); it('should create', () => { - expect(component).toBeTruthy() - }) + expect(component).toBeTruthy(); + }); it('should not indicate required', async () => { - component.definition.required = false + component.definition.required = false; - const control = component.formGroup.get('number') - control.clearValidators() - control.updateValueAndValidity() + const control = component.formGroup.get('number'); + control.clearValidators(); + control.updateValueAndValidity(); - fixture.detectChanges() - await fixture.whenStable() + fixture.detectChanges(); + await fixture.whenStable(); - expect(control.valid).toBe(true) - const error = fixture.debugElement.query(By.directive(MatError)) - expect(error).toBeNull() - }) + expect(control.valid).toBe(true); + const error = fixture.debugElement.query(By.directive(MatError)); + expect(error).toBeNull(); + }); it('should indicate required', async () => { - component.definition.required = true + component.definition.required = true; - const control = component.formGroup.get('number') - control.setValidators(Validators.required) - control.updateValueAndValidity() + const control = component.formGroup.get('number'); + control.setValidators(Validators.required); + control.updateValueAndValidity(); - fixture.detectChanges() - await fixture.whenStable() + fixture.detectChanges(); + await fixture.whenStable(); - expect(control.valid).toBe(false) - }) + expect(control.valid).toBe(false); + }); it('should show error on invalid and touched', async () => { - component.definition.required = true + component.definition.required = true; - const control = component.formGroup.get('number') - control.setValidators(Validators.required) - control.updateValueAndValidity() - control.markAsTouched() + const control = component.formGroup.get('number'); + control.setValidators(Validators.required); + control.updateValueAndValidity(); + control.markAsTouched(); - fixture.detectChanges() - await fixture.whenStable() + fixture.detectChanges(); + await fixture.whenStable(); - expect(control.valid).toBe(false) - const error = fixture.debugElement.query(By.directive(MatError)) - expect(error.nativeElement.innerText).toBe('You must enter a value') - }) + expect(control.valid).toBe(false); + const error = fixture.debugElement.query(By.directive(MatError)); + expect(error.nativeElement.innerText).toBe('You must enter a value'); + }); it('should not show error on invalid if not touched', async () => { - component.definition.required = true + component.definition.required = true; - const control = component.formGroup.get('number') - control.setValidators(Validators.required) - control.updateValueAndValidity() + const control = component.formGroup.get('number'); + control.setValidators(Validators.required); + control.updateValueAndValidity(); - fixture.detectChanges() - await fixture.whenStable() + fixture.detectChanges(); + await fixture.whenStable(); - expect(control.valid).toBe(false) - const error = fixture.debugElement.query(By.directive(MatError)) - expect(error).toBeNull() - }) + expect(control.valid).toBe(false); + const error = fixture.debugElement.query(By.directive(MatError)); + expect(error).toBeNull(); + }); }); diff --git a/web-app/admin/src/app/observation/observation-edit/observation-edit-number/observation-edit-number.component.ts b/web-app/admin/src/app/observation/observation-edit/observation-edit-number/observation-edit-number.component.ts index 09bbdfa55..5a3b6bd30 100644 --- a/web-app/admin/src/app/observation/observation-edit/observation-edit-number/observation-edit-number.component.ts +++ b/web-app/admin/src/app/observation/observation-edit/observation-edit-number/observation-edit-number.component.ts @@ -1,5 +1,8 @@ +import { CommonModule } from '@angular/common'; import { Component, Input, OnInit } from '@angular/core'; -import { UntypedFormGroup, ValidatorFn, Validators } from '@angular/forms'; +import { ReactiveFormsModule, UntypedFormGroup, ValidatorFn, Validators } from '@angular/forms'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; interface NumberField { title: string, @@ -12,6 +15,13 @@ interface NumberField { @Component({ selector: 'observation-edit-number', + standalone: true, + imports: [ + CommonModule, + ReactiveFormsModule, + MatFormFieldModule, + MatInputModule + ], templateUrl: './observation-edit-number.component.html', styleUrls: ['./observation-edit-number.component.scss'] }) diff --git a/web-app/admin/src/app/observation/observation-edit/observation-edit-password/observation-edit-password.component.spec.ts b/web-app/admin/src/app/observation/observation-edit/observation-edit-password/observation-edit-password.component.spec.ts index 4846fb8bc..f367865c0 100644 --- a/web-app/admin/src/app/observation/observation-edit/observation-edit-password/observation-edit-password.component.spec.ts +++ b/web-app/admin/src/app/observation/observation-edit/observation-edit-password/observation-edit-password.component.spec.ts @@ -4,9 +4,14 @@ import { UntypedFormControl, UntypedFormGroup, Validators } from '@angular/forms import { ObservationEditPasswordComponent } from './observation-edit-password.component'; @Component({ - selector: `host-component`, - template: ``, - changeDetection: ChangeDetectionStrategy.OnPush + standalone: true, + imports: [ObservationEditPasswordComponent], + template: ` + + ` }) class TestHostComponent { formGroup = new UntypedFormGroup({ @@ -29,7 +34,7 @@ describe('ObservationEditPasswordComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ ObservationEditPasswordComponent, TestHostComponent ] + imports: [ ObservationEditPasswordComponent, TestHostComponent ] }) .compileComponents(); })); diff --git a/web-app/admin/src/app/observation/observation-edit/observation-edit-password/observation-edit-password.component.ts b/web-app/admin/src/app/observation/observation-edit/observation-edit-password/observation-edit-password.component.ts index b13898681..daf04d794 100644 --- a/web-app/admin/src/app/observation/observation-edit/observation-edit-password/observation-edit-password.component.ts +++ b/web-app/admin/src/app/observation/observation-edit/observation-edit-password/observation-edit-password.component.ts @@ -1,5 +1,8 @@ +import { CommonModule } from '@angular/common'; import { Component, Input } from '@angular/core'; -import { UntypedFormGroup } from '@angular/forms'; +import { ReactiveFormsModule, UntypedFormGroup } from '@angular/forms'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; interface PasswordField { title: string, @@ -9,6 +12,13 @@ interface PasswordField { @Component({ selector: 'observation-edit-password', + standalone: true, + imports: [ + CommonModule, + ReactiveFormsModule, + MatFormFieldModule, + MatInputModule + ], templateUrl: './observation-edit-password.component.html', styleUrls: ['./observation-edit-password.component.scss'] }) diff --git a/web-app/admin/src/app/observation/observation-edit/observation-edit-radio/observation-edit-radio.component.spec.ts b/web-app/admin/src/app/observation/observation-edit/observation-edit-radio/observation-edit-radio.component.spec.ts index 5101c5801..64967c3be 100644 --- a/web-app/admin/src/app/observation/observation-edit/observation-edit-radio/observation-edit-radio.component.spec.ts +++ b/web-app/admin/src/app/observation/observation-edit/observation-edit-radio/observation-edit-radio.component.spec.ts @@ -1,115 +1,144 @@ -import { ChangeDetectionStrategy, Component, ViewChild } from '@angular/core' -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' -import { UntypedFormControl, UntypedFormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms' -import { MatError as MatError, MatFormFieldModule as MatFormFieldModule } from '@angular/material/form-field'; +import { ChangeDetectionStrategy, Component, ViewChild } from '@angular/core'; +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { + UntypedFormControl, + UntypedFormGroup, + FormsModule, + ReactiveFormsModule, + Validators +} from '@angular/forms'; +import { + MatError as MatError, + MatFormFieldModule as MatFormFieldModule +} from '@angular/material/form-field'; import { MatRadioModule as MatRadioModule } from '@angular/material/radio'; -import { By } from '@angular/platform-browser' +import { By } from '@angular/platform-browser'; -import { ObservationEditRadioComponent } from './observation-edit-radio.component' +import { ObservationEditRadioComponent } from './observation-edit-radio.component'; @Component({ - selector: `host-component`, - template: ``, - changeDetection: ChangeDetectionStrategy.OnPush + standalone: true, + imports: [ObservationEditRadioComponent], + template: ` + + ` }) class TestHostComponent { formGroup = new UntypedFormGroup({ radio: new UntypedFormControl() - }) + }); definition = { title: 'Radio', name: 'radio', - choices: [{ - title: 'choice1' - },{ - title: 'choice2' - }] - } - - @ViewChild(ObservationEditRadioComponent) component: ObservationEditRadioComponent + choices: [ + { + title: 'choice1' + }, + { + title: 'choice2' + } + ] + }; + + @ViewChild(ObservationEditRadioComponent) + component: ObservationEditRadioComponent; } describe('ObservationEditRadioComponent', () => { - let component: ObservationEditRadioComponent - let hostComponent: TestHostComponent - let fixture: ComponentFixture + let component: ObservationEditRadioComponent; + let hostComponent: TestHostComponent; + let fixture: ComponentFixture; beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - imports: [FormsModule, ReactiveFormsModule, MatFormFieldModule, MatRadioModule], - declarations: [ObservationEditRadioComponent, TestHostComponent] - }) - .compileComponents() - })) + imports: [ + FormsModule, + ReactiveFormsModule, + MatFormFieldModule, + MatRadioModule, + ObservationEditRadioComponent, + TestHostComponent + ], + }).compileComponents(); + })); beforeEach(() => { - fixture = TestBed.createComponent(TestHostComponent) - hostComponent = fixture.componentInstance + fixture = TestBed.createComponent(TestHostComponent); + hostComponent = fixture.componentInstance; fixture.detectChanges(); - component = hostComponent.component - }) + component = hostComponent.component; + }); it('should create', () => { - expect(component).toBeTruthy() - }) + expect(component).toBeTruthy(); + }); it('should not indicate required', async () => { - component.definition.required = false + component.definition.required = false; - const control = component.formGroup.get('radio') - control.clearValidators() - control.updateValueAndValidity() + const control = component.formGroup.get('radio'); + control.clearValidators(); + control.updateValueAndValidity(); - fixture.detectChanges() - await fixture.whenStable() + fixture.detectChanges(); + await fixture.whenStable(); - expect(control.valid).toBe(true) - const error = fixture.debugElement.query(By.directive(MatError)).query(By.css('span')) - expect(error.nativeElement.attributes.getNamedItem('hidden')).toBeTruthy() - }) + expect(control.valid).toBe(true); + const error = fixture.debugElement + .query(By.directive(MatError)) + .query(By.css('span')); + expect(error.nativeElement.attributes.getNamedItem('hidden')).toBeTruthy(); + }); it('should indicate required', async () => { - component.definition.required = true + component.definition.required = true; - const control = component.formGroup.get('radio') - control.setValidators(Validators.required) - control.updateValueAndValidity() + const control = component.formGroup.get('radio'); + control.setValidators(Validators.required); + control.updateValueAndValidity(); - fixture.detectChanges() - await fixture.whenStable() + fixture.detectChanges(); + await fixture.whenStable(); - expect(control.valid).toBe(false) - }) + expect(control.valid).toBe(false); + }); it('should show error on invalid and touched', async () => { - component.definition.required = true + component.definition.required = true; - const control = component.formGroup.get('radio') - control.setValidators(Validators.required) - control.updateValueAndValidity() - control.markAsTouched() + const control = component.formGroup.get('radio'); + control.setValidators(Validators.required); + control.updateValueAndValidity(); + control.markAsTouched(); - fixture.detectChanges() - await fixture.whenStable() + fixture.detectChanges(); + await fixture.whenStable(); - expect(control.valid).toBe(false) - const error = fixture.debugElement.query(By.directive(MatError)).query(By.css('span')) - expect(error.nativeElement.innerText).toBe('Radio is required') - }) + expect(control.valid).toBe(false); + const error = fixture.debugElement + .query(By.directive(MatError)) + .query(By.css('span')); + expect(error.nativeElement.innerText).toBe('Radio is required'); + }); it('should not show error on invalid if not touched', async () => { - component.definition.required = true + component.definition.required = true; - const control = component.formGroup.get('radio') - control.setValidators(Validators.required) - control.updateValueAndValidity() + const control = component.formGroup.get('radio'); + control.setValidators(Validators.required); + control.updateValueAndValidity(); - fixture.detectChanges() - await fixture.whenStable() - - expect(control.valid).toBe(false) - const error = fixture.debugElement.query(By.directive(MatError)).query(By.css('span')) - expect(error.nativeElement.attributes.getNamedItem('hidden')).toBeTruthy() - }) + fixture.detectChanges(); + await fixture.whenStable(); + + expect(control.valid).toBe(false); + const error = fixture.debugElement + .query(By.directive(MatError)) + .query(By.css('span')); + expect(error.nativeElement.attributes.getNamedItem('hidden')).toBeTruthy(); + }); }); diff --git a/web-app/admin/src/app/observation/observation-edit/observation-edit-radio/observation-edit-radio.component.ts b/web-app/admin/src/app/observation/observation-edit/observation-edit-radio/observation-edit-radio.component.ts index 1c6ec35cb..d46c3d010 100644 --- a/web-app/admin/src/app/observation/observation-edit/observation-edit-radio/observation-edit-radio.component.ts +++ b/web-app/admin/src/app/observation/observation-edit/observation-edit-radio/observation-edit-radio.component.ts @@ -1,5 +1,8 @@ +import { CommonModule } from '@angular/common'; import { Component, Input } from '@angular/core'; -import { UntypedFormGroup } from '@angular/forms'; +import { ReactiveFormsModule, UntypedFormGroup } from '@angular/forms'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatRadioModule } from '@angular/material/radio'; /** * TODO: move to forms model module (which doesn't exist yet) @@ -13,6 +16,13 @@ interface RadioField { @Component({ selector: 'observation-edit-radio', + standalone: true, + imports: [ + CommonModule, + ReactiveFormsModule, + MatRadioModule, + MatFormFieldModule + ], templateUrl: './observation-edit-radio.component.html', styleUrls: ['./observation-edit-radio.component.scss'] }) diff --git a/web-app/admin/src/app/observation/observation-edit/observation-edit-select/observation-edit-select.component.spec.ts b/web-app/admin/src/app/observation/observation-edit/observation-edit-select/observation-edit-select.component.spec.ts index 2ad0684a3..59abc4842 100644 --- a/web-app/admin/src/app/observation/observation-edit/observation-edit-select/observation-edit-select.component.spec.ts +++ b/web-app/admin/src/app/observation/observation-edit/observation-edit-select/observation-edit-select.component.spec.ts @@ -17,11 +17,14 @@ import { MatInputModule } from '@angular/material/input'; import { MatSelectModule } from '@angular/material/select'; @Component({ - template: ``, - changeDetection: ChangeDetectionStrategy.OnPush + standalone: true, + imports: [ObservationEditSelectComponent], + template: ` + + ` }) class TestHostComponent { formGroup = new UntypedFormGroup({ @@ -31,11 +34,7 @@ class TestHostComponent { definition = { name: 'select', title: 'Colors', - choices: [ - { title: 'red' }, - { title: 'green' }, - { title: 'blue' } - ] + choices: [{ title: 'red' }, { title: 'green' }, { title: 'blue' }] }; @ViewChild(ObservationEditSelectComponent) @@ -56,9 +55,10 @@ describe('ObservationEditSelectComponent', () => { NgxMatSelectSearchModule, MatFormFieldModule, MatInputModule, - MatSelectModule + MatSelectModule, + ObservationEditSelectComponent, + TestHostComponent ], - declarations: [ObservationEditSelectComponent, TestHostComponent] }).compileComponents(); })); @@ -100,4 +100,4 @@ describe('ObservationEditSelectComponent', () => { expect(control?.valid).toBe(false); }); -}); \ No newline at end of file +}); diff --git a/web-app/admin/src/app/observation/observation-edit/observation-edit-select/observation-edit-select.component.ts b/web-app/admin/src/app/observation/observation-edit/observation-edit-select/observation-edit-select.component.ts index d905d197b..04fce1a29 100644 --- a/web-app/admin/src/app/observation/observation-edit/observation-edit-select/observation-edit-select.component.ts +++ b/web-app/admin/src/app/observation/observation-edit/observation-edit-select/observation-edit-select.component.ts @@ -1,6 +1,9 @@ +import { CommonModule } from '@angular/common'; import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core'; -import { UntypedFormControl, UntypedFormGroup } from '@angular/forms'; -import { MatSelectChange as MatSelectChange } from '@angular/material/select'; +import { ReactiveFormsModule, UntypedFormControl, UntypedFormGroup } from '@angular/forms'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatSelectChange as MatSelectChange, MatSelectModule } from '@angular/material/select'; +import { NgxMatSelectSearchModule } from 'ngx-mat-select-search'; import { Observable } from 'rxjs'; import { map, startWith } from 'rxjs/operators'; @@ -17,6 +20,14 @@ interface SelectField { @Component({ selector: 'observation-edit-dropdown', + standalone: true, + imports: [ + CommonModule, + ReactiveFormsModule, + MatFormFieldModule, + MatSelectModule, + NgxMatSelectSearchModule + ], templateUrl: './observation-edit-select.component.html', styleUrls: ['./observation-edit-select.component.scss'] }) diff --git a/web-app/admin/src/app/observation/observation-edit/observation-edit-text/observation-edit-text.component.spec.ts b/web-app/admin/src/app/observation/observation-edit/observation-edit-text/observation-edit-text.component.spec.ts index b5394e8b4..b48837a76 100644 --- a/web-app/admin/src/app/observation/observation-edit/observation-edit-text/observation-edit-text.component.spec.ts +++ b/web-app/admin/src/app/observation/observation-edit/observation-edit-text/observation-edit-text.component.spec.ts @@ -1,87 +1,106 @@ import { Component, ViewChild } from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatError as MatError, MatFormField as MatFormField, MatFormFieldModule as MatFormFieldModule } from '@angular/material/form-field'; -import { MatInput as MatInput, MatInputModule as MatInputModule } from '@angular/material/input'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { + MatError, + MatFormField, + MatFormFieldModule +} from '@angular/material/form-field'; +import { MatInput, MatInputModule } from '@angular/material/input'; import { By } from '@angular/platform-browser'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { ObservationEditTextComponent } from './observation-edit-text.component'; @Component({ - selector: `host-component`, - template: `` + standalone: true, + imports: [ObservationEditTextComponent], + template: ` + + ` }) class TestHostComponent { - - field = { + definition = { title: 'Text', - name: 'field1' - } + name: 'field1', + required: false + }; + + formGroup = new FormGroup({ + field1: new FormControl('') + }); - @ViewChild(ObservationEditTextComponent) component: ObservationEditTextComponent + @ViewChild(ObservationEditTextComponent, { static: true }) + component: ObservationEditTextComponent; } -/* TODO test MUST contain at least 1 test describe('ObservationEditTextComponent', () => { - let component: ObservationEditTextComponent - let hostComponent: TestHostComponent - let fixture: ComponentFixture + let component: ObservationEditTextComponent; + let hostComponent: TestHostComponent; + let fixture: ComponentFixture; beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - imports: [FormsModule, ReactiveFormsModule, MatFormFieldModule, MatInputModule, NoopAnimationsModule], - declarations: [ObservationEditTextComponent, TestHostComponent] - }) - .compileComponents() - })) + imports: [ + TestHostComponent, + ReactiveFormsModule, + MatFormFieldModule, + MatInputModule, + NoopAnimationsModule + ] + }).compileComponents(); + })); beforeEach(() => { - fixture = TestBed.createComponent(TestHostComponent) - hostComponent = fixture.componentInstance + fixture = TestBed.createComponent(TestHostComponent); + hostComponent = fixture.componentInstance; + fixture.detectChanges(); + component = hostComponent.component; + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + it('should not indicate required', () => { + component.definition.required = false; + fixture.detectChanges(); + const input = fixture.debugElement.query(By.directive(MatFormField)).componentInstance as MatFormField; + expect(input._control.required).toBeFalsy(); + }); + + it('should indicate required', () => { + component.definition.required = true; + fixture.detectChanges(); + const input = fixture.debugElement.query(By.directive(MatFormField)).componentInstance as MatFormField; + expect(input._control.required).toBeTruthy(); + }); + + it('should show error on invalid and touched', async () => { + component.definition.required = true; + fixture.detectChanges(); + + const control = hostComponent.formGroup.get('field1'); + control?.markAsTouched(); + control?.setValue(''); + control?.updateValueAndValidity(); + fixture.detectChanges(); - component = hostComponent.component - }) - - // it('should create', () => { - // expect(component).toBeTruthy() - // }) - - // it('should not indicate required', () => { - // component.definition.required = false - // fixture.detectChanges() - // const input = fixture.debugElement.query(By.directive(MatFormField)).componentInstance - // expect(input._control.required).toBeFalsy() - // }) - - // it('should indicate required', () => { - // component.definition.required = true - // fixture.detectChanges() - // const input = fixture.debugElement.query(By.directive(MatFormField)).componentInstance - // expect(input._control.required).toBeTruthy() - // }) - - // it('should show error on invalid and touched', async () => { - // component.definition.required = true - - // const input = fixture.debugElement.query(By.directive(MatInput)).references['text'] - // input.control.markAsTouched() - - // fixture.detectChanges() - // await fixture.whenStable() - - // const error = fixture.debugElement.query(By.directive(MatError)) - // expect(error.nativeElement.innerText).toBe('You must enter a value') - // }) - - // it('should not show error on invalid if not touched', async () => { - // component.definition.required = true - - // fixture.detectChanges() - // await fixture.whenStable() - - // const error = fixture.debugElement.query(By.directive(MatError)) - // expect(error).toBeNull() - // }) -}); -*/ + await fixture.whenStable(); + + const error = fixture.debugElement.query(By.directive(MatError)); + expect(error.nativeElement.innerText.trim()).toBe('You must enter a value'); + }); + + it('should not show error on invalid if not touched', async () => { + component.definition.required = true; + fixture.detectChanges(); + await fixture.whenStable(); + + const error = fixture.debugElement.query(By.directive(MatError)); + expect(error).toBeNull(); + }); +}); \ No newline at end of file diff --git a/web-app/admin/src/app/observation/observation-edit/observation-edit-text/observation-edit-text.component.ts b/web-app/admin/src/app/observation/observation-edit/observation-edit-text/observation-edit-text.component.ts index c75b6f638..f951f5553 100644 --- a/web-app/admin/src/app/observation/observation-edit/observation-edit-text/observation-edit-text.component.ts +++ b/web-app/admin/src/app/observation/observation-edit/observation-edit-text/observation-edit-text.component.ts @@ -1,5 +1,8 @@ +import { CommonModule } from '@angular/common'; import { Component, Input } from '@angular/core'; -import { UntypedFormGroup } from '@angular/forms'; +import { ReactiveFormsModule, UntypedFormGroup } from '@angular/forms'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; interface TextField { title: string, @@ -9,6 +12,13 @@ interface TextField { @Component({ selector: 'observation-edit-text', + standalone: true, + imports: [ + CommonModule, + ReactiveFormsModule, + MatFormFieldModule, + MatInputModule + ], templateUrl: './observation-edit-text.component.html', styleUrls: ['./observation-edit-text.component.scss'] }) diff --git a/web-app/admin/src/app/observation/observation-edit/observation-edit-textarea/observation-edit-textarea.component.spec.ts b/web-app/admin/src/app/observation/observation-edit/observation-edit-textarea/observation-edit-textarea.component.spec.ts index f23b28e9e..832058577 100644 --- a/web-app/admin/src/app/observation/observation-edit/observation-edit-textarea/observation-edit-textarea.component.spec.ts +++ b/web-app/admin/src/app/observation/observation-edit/observation-edit-textarea/observation-edit-textarea.component.spec.ts @@ -1,7 +1,16 @@ import { ChangeDetectionStrategy, Component, ViewChild } from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { UntypedFormControl, UntypedFormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms'; -import { MatError as MatError, MatFormFieldModule as MatFormFieldModule } from '@angular/material/form-field'; +import { + UntypedFormControl, + UntypedFormGroup, + FormsModule, + ReactiveFormsModule, + Validators +} from '@angular/forms'; +import { + MatError as MatError, + MatFormFieldModule as MatFormFieldModule +} from '@angular/material/form-field'; import { MatInputModule as MatInputModule } from '@angular/material/input'; import { By } from '@angular/platform-browser'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; @@ -9,104 +18,116 @@ import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { ObservationEditTextareaComponent } from './observation-edit-textarea.component'; @Component({ - selector: `host-component`, - template: ``, - changeDetection: ChangeDetectionStrategy.OnPush + standalone: true, + imports: [ObservationEditTextareaComponent], + template: ` + + ` }) class TestHostComponent { formGroup = new UntypedFormGroup({ text: new UntypedFormControl() - }) + }); definition = { name: 'text', title: 'Text Field', required: true - } + }; - @ViewChild(ObservationEditTextareaComponent) component: ObservationEditTextareaComponent + @ViewChild(ObservationEditTextareaComponent) + component: ObservationEditTextareaComponent; } describe('ObservationEditTextareaComponent', () => { - let component: ObservationEditTextareaComponent - let hostComponent: TestHostComponent - let fixture: ComponentFixture + let component: ObservationEditTextareaComponent; + let hostComponent: TestHostComponent; + let fixture: ComponentFixture; beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - imports: [FormsModule, ReactiveFormsModule, MatFormFieldModule, MatInputModule, NoopAnimationsModule], - declarations: [ObservationEditTextareaComponent, TestHostComponent] - }) - .compileComponents() - })) + imports: [ + FormsModule, + ReactiveFormsModule, + MatFormFieldModule, + MatInputModule, + NoopAnimationsModule, + ObservationEditTextareaComponent, + TestHostComponent + ], + }).compileComponents(); + })); beforeEach(() => { - fixture = TestBed.createComponent(TestHostComponent) - hostComponent = fixture.componentInstance + fixture = TestBed.createComponent(TestHostComponent); + hostComponent = fixture.componentInstance; fixture.detectChanges(); - component = hostComponent.component - }) + component = hostComponent.component; + }); it('should create', () => { - expect(component).toBeTruthy() - }) + expect(component).toBeTruthy(); + }); it('should not indicate required', async () => { - component.definition.required = false + component.definition.required = false; - const control = component.formGroup.get('text') - control.clearValidators() - control.updateValueAndValidity() + const control = component.formGroup.get('text'); + control.clearValidators(); + control.updateValueAndValidity(); - fixture.detectChanges() - await fixture.whenStable() + fixture.detectChanges(); + await fixture.whenStable(); - expect(control.valid).toBe(true) - const error = fixture.debugElement.query(By.directive(MatError)) - expect(error).toBeNull() - }) + expect(control.valid).toBe(true); + const error = fixture.debugElement.query(By.directive(MatError)); + expect(error).toBeNull(); + }); it('should indicate required', async () => { - component.definition.required = true + component.definition.required = true; - const control = component.formGroup.get('text') - control.setValidators(Validators.required) - control.updateValueAndValidity() + const control = component.formGroup.get('text'); + control.setValidators(Validators.required); + control.updateValueAndValidity(); - fixture.detectChanges() - await fixture.whenStable() + fixture.detectChanges(); + await fixture.whenStable(); - expect(control.valid).toBe(false) - }) + expect(control.valid).toBe(false); + }); it('should show error on invalid and touched', async () => { - component.definition.required = true + component.definition.required = true; - const control = component.formGroup.get('text') - control.setValidators(Validators.required) - control.updateValueAndValidity() - control.markAsTouched() + const control = component.formGroup.get('text'); + control.setValidators(Validators.required); + control.updateValueAndValidity(); + control.markAsTouched(); - fixture.detectChanges() - await fixture.whenStable() + fixture.detectChanges(); + await fixture.whenStable(); - expect(control.valid).toBe(false) - const error = fixture.debugElement.query(By.directive(MatError)) - expect(error.nativeElement.innerText).toBe('You must enter a value') - }) + expect(control.valid).toBe(false); + const error = fixture.debugElement.query(By.directive(MatError)); + expect(error.nativeElement.innerText).toBe('You must enter a value'); + }); it('should not show error on invalid if not touched', async () => { - component.definition.required = true + component.definition.required = true; - const control = component.formGroup.get('text') - control.setValidators(Validators.required) - control.updateValueAndValidity() + const control = component.formGroup.get('text'); + control.setValidators(Validators.required); + control.updateValueAndValidity(); - fixture.detectChanges() - await fixture.whenStable() + fixture.detectChanges(); + await fixture.whenStable(); - expect(control.valid).toBe(false) - const error = fixture.debugElement.query(By.directive(MatError)) - expect(error).toBeNull() - }) + expect(control.valid).toBe(false); + const error = fixture.debugElement.query(By.directive(MatError)); + expect(error).toBeNull(); + }); }); diff --git a/web-app/admin/src/app/observation/observation-edit/observation-edit-textarea/observation-edit-textarea.component.ts b/web-app/admin/src/app/observation/observation-edit/observation-edit-textarea/observation-edit-textarea.component.ts index cdc3402c9..fae113eac 100644 --- a/web-app/admin/src/app/observation/observation-edit/observation-edit-textarea/observation-edit-textarea.component.ts +++ b/web-app/admin/src/app/observation/observation-edit/observation-edit-textarea/observation-edit-textarea.component.ts @@ -1,5 +1,8 @@ +import { CommonModule } from '@angular/common'; import { Component, Input } from '@angular/core'; -import { UntypedFormGroup } from '@angular/forms'; +import { ReactiveFormsModule, UntypedFormGroup } from '@angular/forms'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; interface TextareaField { title: string, @@ -9,6 +12,13 @@ interface TextareaField { @Component({ selector: 'observation-edit-textarea', + standalone: true, + imports: [ + CommonModule, + ReactiveFormsModule, + MatFormFieldModule, + MatInputModule + ], templateUrl: './observation-edit-textarea.component.html', styleUrls: ['./observation-edit-textarea.component.scss'] }) diff --git a/web-app/admin/src/app/observation/observation-edit/observation-edit.component.ts b/web-app/admin/src/app/observation/observation-edit/observation-edit.component.ts index 494824892..e3d160e69 100644 --- a/web-app/admin/src/app/observation/observation-edit/observation-edit.component.ts +++ b/web-app/admin/src/app/observation/observation-edit/observation-edit.component.ts @@ -1,6 +1,6 @@ import { animate, style, transition, trigger } from "@angular/animations"; -import { CdkDragDrop, moveItemInArray } from "@angular/cdk/drag-drop"; -import { DOCUMENT } from "@angular/common"; +import { CdkDragDrop, DragDropModule, moveItemInArray } from "@angular/cdk/drag-drop"; +import { CommonModule, DOCUMENT } from "@angular/common"; import { Component, ElementRef, @@ -34,7 +34,7 @@ import { MatSnackBarRef as MatSnackBarRef, SimpleSnackBar as SimpleSnackBar, } from "@angular/material/snack-bar"; -import { MatIconRegistry } from "@angular/material/icon"; +import { MatIconModule, MatIconRegistry } from "@angular/material/icon"; import { MatDialog as MatDialog } from "@angular/material/dialog"; import { MatBottomSheet } from "@angular/material/bottom-sheet"; import { @@ -51,11 +51,28 @@ import { AdminUserService } from "../../admin/services/admin-user.service"; import { MapService } from "src/app/map/map.service"; import { FilterService } from "src/app/filter/filter.service"; import { ObservationService } from "src/app/observation/observation.service"; +import { MatCardModule } from "@angular/material/card"; +import { MatProgressBarModule } from "@angular/material/progress-bar"; +import { MatToolbarModule } from "@angular/material/toolbar"; +import { ObservationEditDateComponent, ObservationEditGeometryComponent } from "./observation-edit"; +import { ObservationEditFormComponent } from "./observation-edit-form.component"; export type ObservationFormControl = UntypedFormControl & { definition: any }; @Component({ selector: "observation-edit", + standalone: true, + imports: [ + CommonModule, + DragDropModule, + MatToolbarModule, + MatIconModule, + MatProgressBarModule, + MatCardModule, + ObservationEditDateComponent, + ObservationEditGeometryComponent, + ObservationEditFormComponent + ], templateUrl: "./observation-edit.component.html", styleUrls: ["./observation-edit.component.scss"], animations: [ diff --git a/web-app/admin/src/app/observation/observation.module.ts b/web-app/admin/src/app/observation/observation.module.ts index 5a86a7878..cb8085e98 100644 --- a/web-app/admin/src/app/observation/observation.module.ts +++ b/web-app/admin/src/app/observation/observation.module.ts @@ -3,54 +3,51 @@ import { CommonModule } from '@angular/common'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { DragDropModule } from '@angular/cdk/drag-drop'; -// Material Modules -import { MatAutocompleteModule as MatAutocompleteModule } from '@angular/material/autocomplete'; +import { MatAutocompleteModule } from '@angular/material/autocomplete'; import { MatBottomSheetModule } from '@angular/material/bottom-sheet'; -import { MatButtonModule as MatButtonModule } from '@angular/material/button'; -import { MatCardModule as MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule as MatCheckboxModule } from '@angular/material/checkbox'; -import { MatChipsModule as MatChipsModule } from '@angular/material/chips'; -import { MatDatepickerModule } from '@angular/material/datepicker' -import { MatMomentDateModule } from '@angular/material-moment-adapter' -import { MatDialogModule as MatDialogModule } from '@angular/material/dialog'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCardModule } from '@angular/material/card'; +import { MatCheckboxModule } from '@angular/material/checkbox'; +import { MatChipsModule } from '@angular/material/chips'; +import { MatDatepickerModule } from '@angular/material/datepicker'; +import { MatMomentDateModule } from '@angular/material-moment-adapter'; +import { MatDialogModule } from '@angular/material/dialog'; import { MatDividerModule } from '@angular/material/divider'; -import { MatFormFieldModule as MatFormFieldModule } from '@angular/material/form-field'; +import { MatFormFieldModule } from '@angular/material/form-field'; import { MatGridListModule } from '@angular/material/grid-list'; import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule as MatInputModule } from '@angular/material/input'; -import { MatListModule as MatListModule } from '@angular/material/list'; -import { MatProgressBarModule as MatProgressBarModule } from '@angular/material/progress-bar'; -import { MatProgressSpinnerModule as MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatRadioModule as MatRadioModule } from '@angular/material/radio'; -import { MatSelectModule as MatSelectModule } from '@angular/material/select'; -import { MatSliderModule as MatSliderModule } from '@angular/material/slider'; -import { MatSnackBarModule as MatSnackBarModule } from '@angular/material/snack-bar'; -import { MatTooltipModule as MatTooltipModule } from '@angular/material/tooltip'; +import { MatInputModule } from '@angular/material/input'; +import { MatListModule } from '@angular/material/list'; +import { MatProgressBarModule } from '@angular/material/progress-bar'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { MatRadioModule } from '@angular/material/radio'; +import { MatSelectModule } from '@angular/material/select'; +import { MatSliderModule } from '@angular/material/slider'; +import { MatSnackBarModule } from '@angular/material/snack-bar'; +import { MatTooltipModule } from '@angular/material/tooltip'; import { MatToolbarModule } from '@angular/material/toolbar'; import { NgxMatSelectSearchModule } from 'ngx-mat-select-search'; import { InputMaskModule } from '@ngneat/input-mask'; -// Geometry Module import { GeometryModule } from '../geometry/geometry.module'; import { MomentModule } from '../moment/moment.module'; import { MapClipComponent } from '../map/clip/clip.component'; -// Observation Components import { - ObservationEditCheckboxComponent, - ObservationEditDateComponent, - ObservationEditSelectComponent, - ObservationEditEmailComponent, - ObservationEditGeometryComponent, - ObservationEditGeometryFormComponent, - ObservationEditGeometryMapComponent, - ObservationEditMultiselectComponent, - ObservationEditNumberComponent, - ObservationEditRadioComponent, - ObservationEditTextComponent, - ObservationEditTextareaComponent, - ObservationEditFormComponent, - ObservationEditComponent + ObservationEditCheckboxComponent, + ObservationEditDateComponent, + ObservationEditSelectComponent, + ObservationEditEmailComponent, + ObservationEditGeometryComponent, + ObservationEditGeometryFormComponent, + ObservationEditGeometryMapComponent, + ObservationEditMultiselectComponent, + ObservationEditNumberComponent, + ObservationEditRadioComponent, + ObservationEditTextComponent, + ObservationEditTextareaComponent, + ObservationEditFormComponent, + ObservationEditComponent } from './observation-edit/observation-edit'; import { ObservationEditFormPickerComponent } from './observation-edit/observation-edit-form-picker.component'; @@ -62,86 +59,85 @@ import { AttachUploadComponent } from './attachment/attachment-upload/attachment import { FilenamePipe } from '../filename/filename.pipe'; @NgModule({ - declarations: [ - ObservationEditComponent, - ObservationEditAttachmentComponent, - ObservationEditFormComponent, - ObservationEditFormPickerComponent, - ObservationEditMultiselectComponent, - ObservationEditCheckboxComponent, - ObservationEditSelectComponent, - ObservationEditEmailComponent, - ObservationEditNumberComponent, - ObservationEditTextComponent, - ObservationEditTextareaComponent, - ObservationEditRadioComponent, - ObservationEditGeometryComponent, - ObservationEditGeometryMapComponent, - ObservationEditGeometryFormComponent, - ObservationEditDateComponent, - ObservationEditPasswordComponent, - ObservationEditDiscardComponent, - MapClipComponent, - AttachmentComponent, - AttachUploadComponent, - FilenamePipe - ], - imports: [ - CommonModule, - FormsModule, - ReactiveFormsModule, - DragDropModule, - MatAutocompleteModule, - MatBottomSheetModule, - MatButtonModule, - MatCardModule, - MatCheckboxModule, - MatChipsModule, - MatDatepickerModule, - MatMomentDateModule, - MatDialogModule, - MatDividerModule, - MatFormFieldModule, - MatGridListModule, - MatIconModule, - MatInputModule, - MatListModule, - MatProgressBarModule, - MatProgressSpinnerModule, - MatRadioModule, - MatSelectModule, - MatSliderModule, - MatSnackBarModule, - MatTooltipModule, - MatToolbarModule, - NgxMatSelectSearchModule, - InputMaskModule, - GeometryModule, - MomentModule - ], - exports: [ - ObservationEditComponent, - ObservationEditAttachmentComponent, - ObservationEditFormComponent, - ObservationEditFormPickerComponent, - ObservationEditMultiselectComponent, - ObservationEditCheckboxComponent, - ObservationEditSelectComponent, - ObservationEditEmailComponent, - ObservationEditNumberComponent, - ObservationEditTextComponent, - ObservationEditTextareaComponent, - ObservationEditRadioComponent, - ObservationEditGeometryComponent, - ObservationEditGeometryMapComponent, - ObservationEditGeometryFormComponent, - ObservationEditDateComponent, - ObservationEditPasswordComponent, - ObservationEditDiscardComponent, - MapClipComponent, - AttachmentComponent, - AttachUploadComponent, - FilenamePipe - ] + imports: [ + CommonModule, + FormsModule, + ReactiveFormsModule, + DragDropModule, + MatAutocompleteModule, + MatBottomSheetModule, + MatButtonModule, + MatCardModule, + MatCheckboxModule, + MatChipsModule, + MatDatepickerModule, + MatMomentDateModule, + MatDialogModule, + MatDividerModule, + MatFormFieldModule, + MatGridListModule, + MatIconModule, + MatInputModule, + MatListModule, + MatProgressBarModule, + MatProgressSpinnerModule, + MatRadioModule, + MatSelectModule, + MatSliderModule, + MatSnackBarModule, + MatTooltipModule, + MatToolbarModule, + NgxMatSelectSearchModule, + InputMaskModule, + GeometryModule, + MomentModule, + + ObservationEditComponent, + ObservationEditAttachmentComponent, + ObservationEditFormComponent, + ObservationEditFormPickerComponent, + ObservationEditMultiselectComponent, + ObservationEditCheckboxComponent, + ObservationEditSelectComponent, + ObservationEditEmailComponent, + ObservationEditNumberComponent, + ObservationEditTextComponent, + ObservationEditTextareaComponent, + ObservationEditRadioComponent, + ObservationEditGeometryComponent, + ObservationEditGeometryMapComponent, + ObservationEditGeometryFormComponent, + ObservationEditDateComponent, + ObservationEditPasswordComponent, + ObservationEditDiscardComponent, + MapClipComponent, + AttachmentComponent, + AttachUploadComponent, + FilenamePipe + ], + exports: [ + ObservationEditComponent, + ObservationEditAttachmentComponent, + ObservationEditFormComponent, + ObservationEditFormPickerComponent, + ObservationEditMultiselectComponent, + ObservationEditCheckboxComponent, + ObservationEditSelectComponent, + ObservationEditEmailComponent, + ObservationEditNumberComponent, + ObservationEditTextComponent, + ObservationEditTextareaComponent, + ObservationEditRadioComponent, + ObservationEditGeometryComponent, + ObservationEditGeometryMapComponent, + ObservationEditGeometryFormComponent, + ObservationEditDateComponent, + ObservationEditPasswordComponent, + ObservationEditDiscardComponent, + MapClipComponent, + AttachmentComponent, + AttachUploadComponent, + FilenamePipe + ] }) -export class ObservationModule { } +export class ObservationModule {} diff --git a/web-app/admin/src/app/services/auth-buffer.interceptor.ts b/web-app/admin/src/app/services/auth-buffer.interceptor.ts index 2b756a774..b681e40e1 100644 --- a/web-app/admin/src/app/services/auth-buffer.interceptor.ts +++ b/web-app/admin/src/app/services/auth-buffer.interceptor.ts @@ -1,12 +1,5 @@ import { Injectable } from '@angular/core'; -import { - HttpErrorResponse, - HttpEvent, - HttpHandler, - HttpInterceptor, - HttpRequest, - HttpStatusCode -} from '@angular/common/http'; +import { HttpErrorResponse, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest, HttpStatusCode } from '@angular/common/http'; import { Observable, throwError } from 'rxjs'; import { catchError } from 'rxjs/operators'; import { MatDialog as MatDialog } from '@angular/material/dialog'; diff --git a/web-app/admin/src/app/services/http-request-buffer.service.ts b/web-app/admin/src/app/services/http-request-buffer.service.ts index 3ad2a609f..cc00cda5a 100644 --- a/web-app/admin/src/app/services/http-request-buffer.service.ts +++ b/web-app/admin/src/app/services/http-request-buffer.service.ts @@ -1,9 +1,5 @@ import { Injectable } from '@angular/core'; -import { - HttpEvent, - HttpHandler, - HttpRequest, -} from '@angular/common/http'; +import { HttpEvent, HttpHandler, HttpRequest } from '@angular/common/http'; import { Observable, Subject, throwError } from 'rxjs'; type Buffered = { diff --git a/web-app/admin/src/app/user/user-avatar/user-avatar.component.spec.ts b/web-app/admin/src/app/user/user-avatar/user-avatar.component.spec.ts index 18650b057..2acd973ea 100644 --- a/web-app/admin/src/app/user/user-avatar/user-avatar.component.spec.ts +++ b/web-app/admin/src/app/user/user-avatar/user-avatar.component.spec.ts @@ -1,7 +1,8 @@ -import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { provideHttpClientTesting } from '@angular/common/http/testing'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { UserAvatarComponent } from './user-avatar.component'; +import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; describe('UserAvatarComponent', () => { let component: UserAvatarComponent; @@ -9,9 +10,9 @@ describe('UserAvatarComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - imports: [HttpClientTestingModule], - declarations: [UserAvatarComponent] - }) + imports: [UserAvatarComponent], + providers: [provideHttpClient(withInterceptorsFromDi()), provideHttpClientTesting()] +}) .compileComponents(); })); diff --git a/web-app/admin/src/theme.scss b/web-app/admin/src/theme.scss index 9b4f9428c..a35dffca1 100644 --- a/web-app/admin/src/theme.scss +++ b/web-app/admin/src/theme.scss @@ -11,11 +11,11 @@ @include mat.core(); // Create the theme object (a Sass map containing all of the palettes). -$app-theme: mat.define-light-theme((color: (primary: $app-primary, +$app-theme: mat.m2-define-light-theme((color: (primary: $app-primary, accent: $app-accent, warn: $app-warn, ), - typography: mat.define-typography-config(), + typography: mat.m2-define-typography-config(), density: 0, )); diff --git a/web-app/admin/src/variables.scss b/web-app/admin/src/variables.scss index 74eb4962e..dec0f862d 100644 --- a/web-app/admin/src/variables.scss +++ b/web-app/admin/src/variables.scss @@ -3,11 +3,11 @@ // Define the palettes for your theme using the Material Design palettes available in palette.scss // (imported above). For each palette, you can optionally specify a default, lighter, and darker // hue. Available color palettes: https://material.io/design/color/ -$app-primary: mat.define-palette(mat.$blue-palette, 600, 200, 800); -$app-accent: mat.define-palette(mat.$orange-palette, A700, A100, A700); -$app-warn: mat.define-palette(mat.$red-palette); // The warn palette is optional (defaults to red). +$app-primary: mat.m2-define-palette(mat.$m2-blue-palette, 600, 200, 800); +$app-accent: mat.m2-define-palette(mat.$m2-orange-palette, A700, A100, A700); +$app-warn: mat.m2-define-palette(mat.$m2-red-palette); // The warn palette is optional (defaults to red). // Custom Sass colors vars (will be available in all the project) -$primary: mat.get-color-from-palette($app-primary); -$accent: mat.get-color-from-palette($app-accent); -$warn: mat.get-color-from-palette($app-warn); \ No newline at end of file +$primary: mat.m2-get-color-from-palette($app-primary); +$accent: mat.m2-get-color-from-palette($app-accent); +$warn: mat.m2-get-color-from-palette($app-warn); \ No newline at end of file diff --git a/web-app/package-lock.json b/web-app/package-lock.json index c1e0c9cbf..4e4b08fb8 100644 --- a/web-app/package-lock.json +++ b/web-app/package-lock.json @@ -1,28 +1,28 @@ { "name": "@ngageoint/mage.web-app", - "version": "6.6.4", + "version": "6.6.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@ngageoint/mage.web-app", - "version": "6.6.4", + "version": "6.6.0", "license": "Apache-2.0", "dependencies": { - "@angular/animations": "17.3.12", - "@angular/cdk": "^17.3.10", - "@angular/common": "17.3.12", - "@angular/compiler": "17.3.12", - "@angular/core": "17.3.12", + "@angular/animations": "19.2.15", + "@angular/cdk": "^19.2.15", + "@angular/common": "19.2.15", + "@angular/compiler": "19.2.15", + "@angular/core": "19.2.15", "@angular/flex-layout": "15.0.0-beta.42", - "@angular/forms": "17.3.12", - "@angular/material": "^17.3.10", - "@angular/material-moment-adapter": "^17.3.10", - "@angular/platform-browser": "17.3.12", - "@angular/platform-browser-dynamic": "17.3.12", - "@angular/router": "17.3.12", - "@angular/upgrade": "17.3.12", - "@ng-select/ng-select": "^12.0.0", + "@angular/forms": "19.2.15", + "@angular/material": "^19.2.15", + "@angular/material-moment-adapter": "^19.2.15", + "@angular/platform-browser": "19.2.15", + "@angular/platform-browser-dynamic": "19.2.15", + "@angular/router": "19.2.15", + "@angular/upgrade": "19.2.15", + "@ng-select/ng-select": "^14.0.1", "@ngageoint/gars-js": "1.0.0", "@ngageoint/md-date-time-picker": "2.3.0", "@ngageoint/mgrs-js": "1.0.0", @@ -35,7 +35,7 @@ "@types/geojson": "7946.0.7", "@types/leaflet-editable": "1.2.7", "@types/leaflet.markercluster": "1.5.6", - "@uirouter/angular": "^13.0.0", + "@uirouter/angular": "^16.0.0", "@uirouter/core": "^6.1.2", "@uirouter/rx": "1.0.0", "@zxcvbn-ts/core": "3.0.4", @@ -74,18 +74,18 @@ "ui-select": "0.19.8", "underscore": "1.13.6", "webfontloader": "1.6.6", - "zone.js": "0.14.10", + "zone.js": "~0.15.0", "zxcvbn": "4.4.2" }, "devDependencies": { - "@angular-devkit/build-angular": "17.3.17", - "@angular-devkit/core": "17.3.17", - "@angular-devkit/schematics": "^17.3.17", - "@angular/cli": "17.3.17", - "@angular/compiler-cli": "17.3.12", - "@angular/language-service": "17.3.12", + "@angular-devkit/build-angular": "19.2.24", + "@angular-devkit/core": "19.2.24", + "@angular-devkit/schematics": "^19.2.24", + "@angular/cli": "19.2.24", + "@angular/compiler-cli": "19.2.15", + "@angular/language-service": "19.2.15", "@rollup/plugin-commonjs": "25.0.7", - "@schematics/angular": "^17.3.17", + "@schematics/angular": "^19.2.24", "@types/angular": "1.8.1", "@types/geojson": "7946.0.7", "@types/hammerjs": "2.0.36", @@ -108,12 +108,12 @@ "karma-coverage-istanbul-reporter": "3.0.3", "karma-jasmine": "5.1.0", "karma-jasmine-html-reporter": "2.0.0", - "ng-packagr": "17.3.0", - "ngx-build-plus": "^17.0.0", + "ng-packagr": "19.2.2", + "ngx-build-plus": "^19.0.0", "npm-run-all": "4.1.5", "rimraf": "3.0.2", "tslint": "6.1.3", - "typescript": "5.4.5", + "typescript": "~5.5.4", "webpack": "5.75.0", "webpack-bundle-analyzer": "4.7.0" } @@ -133,17 +133,17 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1703.17", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1703.17.tgz", - "integrity": "sha512-LD6po8lGP2FI7WbnsSxtvpiIi+FYL0aNfteunkT+7po9jUNflBEYHA64UWNO56u7ryKNdbuiN8/TEh7FEUnmCw==", + "version": "0.1902.24", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1902.24.tgz", + "integrity": "sha512-G63tV2EW15xCWfDhFYwLc1MWu2UbY6M+JaRfDr8NxwP9PZJyIkGHA9YUhnx+35x7aNb52sTPDW0uY4ukhOvYFg==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "17.3.17", + "@angular-devkit/core": "19.2.24", "rxjs": "7.8.1" }, "engines": { - "node": "^18.13.0 || >=20.9.0", + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } @@ -159,16 +159,17 @@ } }, "node_modules/@angular-devkit/build-angular": { - "version": "17.3.17", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-17.3.17.tgz", - "integrity": "sha512-0kLVwjLZ5v4uIaG0K6sHJxxppS0bvjNmxHkbybU8FBW3r5MOBQh/ApsiCQKQQ8GBrQz9qSJvLJH8lsb/uR8aPQ==", + "version": "19.2.24", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-19.2.24.tgz", + "integrity": "sha512-foSat36hPfGyrQnKSlvynTWY2HBVc2nEF/Tx3C0Yv+aVmMePBzrONiHs67yXB7C6rrYvrJtQuy+nAPvEOBV/0A==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1703.17", - "@angular-devkit/build-webpack": "0.1703.17", - "@angular-devkit/core": "17.3.17", + "@angular-devkit/architect": "0.1902.24", + "@angular-devkit/build-webpack": "0.1902.24", + "@angular-devkit/core": "19.2.24", + "@angular/build": "19.2.24", "@babel/core": "7.26.10", "@babel/generator": "7.26.10", "@babel/helper-annotate-as-pure": "7.25.9", @@ -178,78 +179,71 @@ "@babel/plugin-transform-runtime": "7.26.10", "@babel/preset-env": "7.26.9", "@babel/runtime": "7.26.10", - "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "17.3.17", - "@vitejs/plugin-basic-ssl": "1.1.0", + "@discoveryjs/json-ext": "0.6.3", + "@ngtools/webpack": "19.2.24", + "@vitejs/plugin-basic-ssl": "1.2.0", "ansi-colors": "4.1.3", - "autoprefixer": "10.4.18", - "babel-loader": "9.1.3", - "babel-plugin-istanbul": "6.1.1", + "autoprefixer": "10.4.20", + "babel-loader": "9.2.1", "browserslist": "^4.21.5", - "copy-webpack-plugin": "11.0.0", - "critters": "0.0.22", - "css-loader": "6.10.0", - "esbuild-wasm": "0.20.1", - "fast-glob": "3.3.2", - "http-proxy-middleware": "2.0.8", - "https-proxy-agent": "7.0.4", - "inquirer": "9.2.15", - "jsonc-parser": "3.2.1", + "copy-webpack-plugin": "12.0.2", + "css-loader": "7.1.2", + "esbuild-wasm": "0.25.4", + "fast-glob": "3.3.3", + "http-proxy-middleware": "3.0.5", + "istanbul-lib-instrument": "6.0.3", + "jsonc-parser": "3.3.1", "karma-source-map-support": "1.4.0", - "less": "4.2.0", - "less-loader": "11.1.0", + "less": "4.2.2", + "less-loader": "12.2.0", "license-webpack-plugin": "4.0.2", - "loader-utils": "3.2.1", - "magic-string": "0.30.8", - "mini-css-extract-plugin": "2.8.1", - "mrmime": "2.0.0", - "open": "8.4.2", + "loader-utils": "3.3.1", + "mini-css-extract-plugin": "2.9.2", + "open": "10.1.0", "ora": "5.4.1", - "parse5-html-rewriting-stream": "7.0.0", - "picomatch": "4.0.1", - "piscina": "4.4.0", - "postcss": "8.4.35", + "picomatch": "4.0.4", + "piscina": "4.8.0", + "postcss": "8.5.2", "postcss-loader": "8.1.1", "resolve-url-loader": "5.0.0", "rxjs": "7.8.1", - "sass": "1.71.1", - "sass-loader": "14.1.1", - "semver": "7.6.0", + "sass": "1.85.0", + "sass-loader": "16.0.5", + "semver": "7.7.1", "source-map-loader": "5.0.0", "source-map-support": "0.5.21", - "terser": "5.29.1", + "terser": "5.39.0", "tree-kill": "1.2.2", - "tslib": "2.6.2", - "vite": "~5.4.17", - "watchpack": "2.4.0", - "webpack": "5.94.0", - "webpack-dev-middleware": "6.1.2", - "webpack-dev-server": "4.15.1", - "webpack-merge": "5.10.0", + "tslib": "2.8.1", + "webpack": "5.105.0", + "webpack-dev-middleware": "7.4.2", + "webpack-dev-server": "5.2.2", + "webpack-merge": "6.0.1", "webpack-subresource-integrity": "5.1.0" }, "engines": { - "node": "^18.13.0 || >=20.9.0", + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, "optionalDependencies": { - "esbuild": "0.20.1" + "esbuild": "0.25.4" }, "peerDependencies": { - "@angular/compiler-cli": "^17.0.0", - "@angular/localize": "^17.0.0", - "@angular/platform-server": "^17.0.0", - "@angular/service-worker": "^17.0.0", - "@web/test-runner": "^0.18.0", + "@angular/compiler-cli": "^19.0.0 || ^19.2.0-next.0", + "@angular/localize": "^19.0.0 || ^19.2.0-next.0", + "@angular/platform-server": "^19.0.0 || ^19.2.0-next.0", + "@angular/service-worker": "^19.0.0 || ^19.2.0-next.0", + "@angular/ssr": "^19.2.24", + "@web/test-runner": "^0.20.0", "browser-sync": "^3.0.2", "jest": "^29.5.0", "jest-environment-jsdom": "^29.5.0", "karma": "^6.3.0", - "ng-packagr": "^17.0.0", + "ng-packagr": "^19.0.0 || ^19.2.0-next.0", "protractor": "^7.0.0", - "tailwindcss": "^2.0.0 || ^3.0.0", - "typescript": ">=5.2 <5.5" + "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", + "typescript": ">=5.5 <5.9" }, "peerDependenciesMeta": { "@angular/localize": { @@ -261,6 +255,9 @@ "@angular/service-worker": { "optional": true }, + "@angular/ssr": { + "optional": true + }, "@web/test-runner": { "optional": true }, @@ -287,1079 +284,1975 @@ } } }, - "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/ast": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", - "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "node_modules/@angular-devkit/build-angular/node_modules/@angular/build": { + "version": "19.2.24", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.2.24.tgz", + "integrity": "sha512-/Z6Ka0+xpmSXz5KHP94iRO5R1ZwbcJfj7Q7k/d6QH5Wk8rVFIoI/3a9nmLewjR/CxW8QaiziPYQpG1ezRgj9hQ==", "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/helper-numbers": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + "@ampproject/remapping": "2.3.0", + "@angular-devkit/architect": "0.1902.24", + "@babel/core": "7.26.10", + "@babel/helper-annotate-as-pure": "7.25.9", + "@babel/helper-split-export-declaration": "7.24.7", + "@babel/plugin-syntax-import-attributes": "7.26.0", + "@inquirer/confirm": "5.1.6", + "@vitejs/plugin-basic-ssl": "1.2.0", + "beasties": "0.3.2", + "browserslist": "^4.23.0", + "esbuild": "0.25.4", + "fast-glob": "3.3.3", + "https-proxy-agent": "7.0.6", + "istanbul-lib-instrument": "6.0.3", + "listr2": "8.2.5", + "magic-string": "0.30.17", + "mrmime": "2.0.1", + "parse5-html-rewriting-stream": "7.0.0", + "picomatch": "4.0.4", + "piscina": "4.8.0", + "rollup": "4.59.0", + "sass": "1.85.0", + "semver": "7.7.1", + "source-map-support": "0.5.21", + "vite": "6.4.2", + "watchpack": "2.4.2" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "optionalDependencies": { + "lmdb": "3.2.6" + }, + "peerDependencies": { + "@angular/compiler": "^19.0.0 || ^19.2.0-next.0", + "@angular/compiler-cli": "^19.0.0 || ^19.2.0-next.0", + "@angular/localize": "^19.0.0 || ^19.2.0-next.0", + "@angular/platform-server": "^19.0.0 || ^19.2.0-next.0", + "@angular/service-worker": "^19.0.0 || ^19.2.0-next.0", + "@angular/ssr": "^19.2.24", + "karma": "^6.4.0", + "less": "^4.2.0", + "ng-packagr": "^19.0.0 || ^19.2.0-next.0", + "postcss": "^8.4.0", + "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", + "typescript": ">=5.5 <5.9" + }, + "peerDependenciesMeta": { + "@angular/localize": { + "optional": true + }, + "@angular/platform-server": { + "optional": true + }, + "@angular/service-worker": { + "optional": true + }, + "@angular/ssr": { + "optional": true + }, + "karma": { + "optional": true + }, + "less": { + "optional": true + }, + "ng-packagr": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tailwindcss": { + "optional": true + } } }, - "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", - "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/helper-api-error": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", - "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/helper-buffer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", - "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/helper-numbers": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", - "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "node_modules/@angular-devkit/build-angular/node_modules/@angular/build/node_modules/watchpack": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.13.2", - "@webassemblyjs/helper-api-error": "1.13.2", - "@xtuc/long": "4.2.2" + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" } }, - "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", - "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", - "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "node_modules/@angular-devkit/build-angular/node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/wasm-gen": "1.14.1" + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/ieee754": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", - "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "node_modules/@angular-devkit/build-angular/node_modules/@inquirer/confirm": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.6.tgz", + "integrity": "sha512-6ZXYK3M1XmaVBZX6FCfChgtponnL0R6I7k8Nu+kaoNkT828FVZTcca1MqmWQipaW2oNREQl5AaPCUOOCVNdRMw==", "dev": true, "license": "MIT", "dependencies": { - "@xtuc/ieee754": "^1.2.0" + "@inquirer/core": "^10.1.7", + "@inquirer/type": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/leb128": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", - "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", + "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", + "cpu": [ + "arm" + ], "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@xtuc/long": "4.2.2" - } + "license": "MIT", + "optional": true, + "os": [ + "android" + ] }, - "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/utf8": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", - "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-android-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", + "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "os": [ + "android" + ] }, - "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/wasm-edit": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", - "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", + "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/helper-wasm-section": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-opt": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1", - "@webassemblyjs/wast-printer": "1.14.1" - } + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/wasm-gen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", - "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-darwin-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", + "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/wasm-opt": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", - "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", + "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1" - } + "optional": true, + "os": [ + "freebsd" + ] }, - "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/wasm-parser": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", - "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", + "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-api-error": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } + "optional": true, + "os": [ + "freebsd" + ] }, - "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/wast-printer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", - "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", + "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", + "cpu": [ + "arm" + ], "dev": true, "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@xtuc/long": "4.2.2" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@angular-devkit/build-angular/node_modules/ajv": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", - "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", + "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", + "cpu": [ + "arm" + ], "dev": true, "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", + "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", + "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", + "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", + "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", + "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", + "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", + "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", + "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", + "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", + "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", + "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", + "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", + "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", + "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", + "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", + "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", + "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/es-module-lexer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", + "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@angular-devkit/build-angular/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@angular-devkit/build-angular/node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/rollup": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", + "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.59.0", + "@rollup/rollup-android-arm64": "4.59.0", + "@rollup/rollup-darwin-arm64": "4.59.0", + "@rollup/rollup-darwin-x64": "4.59.0", + "@rollup/rollup-freebsd-arm64": "4.59.0", + "@rollup/rollup-freebsd-x64": "4.59.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", + "@rollup/rollup-linux-arm-musleabihf": "4.59.0", + "@rollup/rollup-linux-arm64-gnu": "4.59.0", + "@rollup/rollup-linux-arm64-musl": "4.59.0", + "@rollup/rollup-linux-loong64-gnu": "4.59.0", + "@rollup/rollup-linux-loong64-musl": "4.59.0", + "@rollup/rollup-linux-ppc64-gnu": "4.59.0", + "@rollup/rollup-linux-ppc64-musl": "4.59.0", + "@rollup/rollup-linux-riscv64-gnu": "4.59.0", + "@rollup/rollup-linux-riscv64-musl": "4.59.0", + "@rollup/rollup-linux-s390x-gnu": "4.59.0", + "@rollup/rollup-linux-x64-gnu": "4.59.0", + "@rollup/rollup-linux-x64-musl": "4.59.0", + "@rollup/rollup-openbsd-x64": "4.59.0", + "@rollup/rollup-openharmony-arm64": "4.59.0", + "@rollup/rollup-win32-arm64-msvc": "4.59.0", + "@rollup/rollup-win32-ia32-msvc": "4.59.0", + "@rollup/rollup-win32-x64-gnu": "4.59.0", + "@rollup/rollup-win32-x64-msvc": "4.59.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/webpack": { + "version": "5.105.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.0.tgz", + "integrity": "sha512-gX/dMkRQc7QOMzgTe6KsYFM7DxeIONQSui1s0n/0xht36HvrgbxtM1xBlgx596NbpHuQU8P7QpKwrZYwUX48nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.28.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.19.0", + "es-module-lexer": "^2.0.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.3.1", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.3.16", + "watchpack": "^2.5.1", + "webpack-sources": "^3.3.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/build-webpack": { + "version": "0.1902.24", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1902.24.tgz", + "integrity": "sha512-txDA1cbmsD5+mcw74JCh0UiSZQKQzcDalkqPYpSA+9/uFGUSULSonlyCmg5UpyrpiOzM5ACI/++qJ1g52TqWWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/architect": "0.1902.24", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "webpack": "^5.30.0", + "webpack-dev-server": "^5.0.2" + } + }, + "node_modules/@angular-devkit/build-webpack/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@angular-devkit/core": { + "version": "19.2.24", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.24.tgz", + "integrity": "sha512-Kd49warf6U/EyWe5BszF/eebN3zQ3bk7tgfEljAw8q/rX95UUtriJubWvp6pgzHfzBA4jwq8f+QiNZB8eBEXPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "8.18.0", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.4", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^4.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/core/node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@angular-devkit/core/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@angular-devkit/schematics": { + "version": "19.2.25", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.2.25.tgz", + "integrity": "sha512-bpYt8KuMOhu3+gA5Hm3B0MoFB2psAJAR0HOGTKSLoHmwfv5EeemfsSRdjrucwR3WZbn//Y3uFgbfKWnClLO7OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "19.2.25", + "jsonc-parser": "3.3.1", + "magic-string": "0.30.17", + "ora": "5.4.1", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/@angular-devkit/core": { + "version": "19.2.25", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.25.tgz", + "integrity": "sha512-jXk2yASLMmMLfxA5kSW6QdoVRElDXkf8rHpbX84VtX9E4HiV3jOTAtzZr5HV2mjthBXZB6oT8WDe4M83hseTsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "8.18.0", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.4", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^4.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/schematics/node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@angular-devkit/build-angular/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "node_modules/@angular-devkit/schematics/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@angular/animations": { + "version": "19.2.15", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-19.2.15.tgz", + "integrity": "sha512-eq9vokLU8bjs7g/Znz8zJUQEOhT0MAJ/heBCHbB35S+CtZXJmItrsEqkI1tsRiR58NKXB6cbhBhULVo6qJbhXQ==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + }, + "peerDependencies": { + "@angular/common": "19.2.15", + "@angular/core": "19.2.15" + } + }, + "node_modules/@angular/cdk": { + "version": "19.2.19", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-19.2.19.tgz", + "integrity": "sha512-PCpJagurPBqciqcq4Z8+3OtKLb7rSl4w/qBJoIMua8CgnrjvA1i+SWawhdtfI1zlY8FSwhzLwXV0CmWWfFzQPg==", + "license": "MIT", + "dependencies": { + "parse5": "^7.1.2", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/common": "^19.0.0 || ^20.0.0", + "@angular/core": "^19.0.0 || ^20.0.0", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/cli": { + "version": "19.2.24", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.2.24.tgz", + "integrity": "sha512-HjU4r/Va9w868fKVeUNOgkHBVDQc2VFHWxj0I3WekGhYN3dlfTVNn0/3dNutkBBuCxxTb9Xl6E6wf6KrlA9wcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/architect": "0.1902.24", + "@angular-devkit/core": "19.2.24", + "@angular-devkit/schematics": "19.2.24", + "@inquirer/prompts": "7.3.2", + "@listr2/prompt-adapter-inquirer": "2.0.18", + "@schematics/angular": "19.2.24", + "@yarnpkg/lockfile": "1.1.0", + "ini": "5.0.0", + "jsonc-parser": "3.3.1", + "listr2": "8.2.5", + "npm-package-arg": "12.0.2", + "npm-pick-manifest": "10.0.0", + "pacote": "20.0.0", + "resolve": "1.22.10", + "semver": "7.7.1", + "symbol-observable": "4.0.0", + "yargs": "17.7.2" + }, + "bin": { + "ng": "bin/ng.js" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/cli/node_modules/@angular-devkit/schematics": { + "version": "19.2.24", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.2.24.tgz", + "integrity": "sha512-lnw+ZM1Io+cJAkReC0NPDjqObL8NtKzKIkdgEEKC8CUmkhurYhedbicN8Y8NYHgG1uLd2GozW3+/QqPRZaN+Lw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "19.2.24", + "jsonc-parser": "3.3.1", + "magic-string": "0.30.17", + "ora": "5.4.1", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/cli/node_modules/@schematics/angular": { + "version": "19.2.24", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.2.24.tgz", + "integrity": "sha512-RGHb7ebUQTOxtWfNcBXCzDog8LwJzvVp3/BptEI+78M+tCaBJM6BAS2vrDphJRjVbjV3DTwZcmlNRqCHJeSknA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "19.2.24", + "@angular-devkit/schematics": "19.2.24", + "jsonc-parser": "3.3.1" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/cli/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@angular/cli/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@angular/common": { + "version": "19.2.15", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.2.15.tgz", + "integrity": "sha512-aVa/ctBYH/4qgA7r4sS7TV+/DzRYmcS+3d6l89pNKUXkI8gpmsd+r3FjccaemX4Wqru1QOrMvC+i+e7IBIVv0g==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + }, + "peerDependencies": { + "@angular/core": "19.2.15", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/compiler": { + "version": "19.2.15", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.2.15.tgz", + "integrity": "sha512-hMHZU6/03xG0tbPDIm1hbVSTFLnRkGYfh+xdBwUMnIFYYTS0QJ2hdPfEZKCJIXm+fz9IAI5MPdDTfeyp0sgaHQ==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + } + }, + "node_modules/@angular/compiler-cli": { + "version": "19.2.15", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.2.15.tgz", + "integrity": "sha512-4r5tvGA2Ok3o8wROZBkF9qNKS7L0AEpdBIkAVJbLw2rBY2SlyycFIRYyV2+D1lJ1jq/f9U7uN6oon0MjTvNYkA==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/core": "7.26.9", + "@jridgewell/sourcemap-codec": "^1.4.14", + "chokidar": "^4.0.0", + "convert-source-map": "^1.5.1", + "reflect-metadata": "^0.2.0", + "semver": "^7.0.0", + "tslib": "^2.3.0", + "yargs": "^17.2.1" + }, + "bin": { + "ng-xi18n": "bundles/src/bin/ng_xi18n.js", + "ngc": "bundles/src/bin/ngc.js", + "ngcc": "bundles/ngcc/index.js" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + }, "peerDependencies": { - "ajv": "^6.9.1" + "@angular/compiler": "19.2.15", + "typescript": ">=5.5 <5.9" } }, - "node_modules/@angular-devkit/build-angular/node_modules/es-module-lexer": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@angular-devkit/build-angular/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "node_modules/@angular/compiler-cli/node_modules/@babel/core": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.9.tgz", + "integrity": "sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.9", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.9", + "@babel/parser": "^7.26.9", + "@babel/template": "^7.26.9", + "@babel/traverse": "^7.26.9", + "@babel/types": "^7.26.9", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } }, - "node_modules/@angular-devkit/build-angular/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true, "license": "MIT" }, - "node_modules/@angular-devkit/build-angular/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@angular/core": { + "version": "19.2.15", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.2.15.tgz", + "integrity": "sha512-PxhzCwwm23N4Mq6oV7UPoYiJF4r6FzGhRSxOBBlEp322k7zEQbIxd/XO6F3eoG73qC1UsOXMYYv6GnQpx42y3A==", + "license": "MIT", "dependencies": { - "yallist": "^4.0.0" + "tslib": "^2.3.0" }, "engines": { - "node": ">=10" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + }, + "peerDependencies": { + "rxjs": "^6.5.3 || ^7.4.0", + "zone.js": "~0.15.0" } }, - "node_modules/@angular-devkit/build-angular/node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dev": true, - "license": "Apache-2.0", + "node_modules/@angular/flex-layout": { + "version": "15.0.0-beta.42", + "resolved": "https://registry.npmjs.org/@angular/flex-layout/-/flex-layout-15.0.0-beta.42.tgz", + "integrity": "sha512-cTAPVMMxnyIFwpZwdq0PL5mdP9Qh+R8MB7ZBezVaN3Rz2fRrkagzKpLvPX3TFzepXrvHBdpKsU4b8u+NxEC/6g==", + "deprecated": "This package has been deprecated. Please see https://blog.angular.io/modern-css-in-angular-layouts-4a259dca9127", + "license": "MIT", "dependencies": { - "tslib": "^2.1.0" + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/cdk": ">=15.0.0", + "@angular/common": ">=15.0.2", + "@angular/core": ">=15.0.2", + "@angular/platform-browser": ">=15.0.2", + "rxjs": "^6.5.3 || ^7.4.0" } }, - "node_modules/@angular-devkit/build-angular/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, + "node_modules/@angular/forms": { + "version": "19.2.15", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.2.15.tgz", + "integrity": "sha512-pZDElcYPmNzPxvWJpZQCIizsNApDIfk9xLJE4I8hzLISfWGbQvfjuuarDAuQZEXudeLXoDOstDXkDja40muLGg==", "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "tslib": "^2.3.0" }, "engines": { - "node": ">= 10.13.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "peerDependencies": { + "@angular/common": "19.2.15", + "@angular/core": "19.2.15", + "@angular/platform-browser": "19.2.15", + "rxjs": "^6.5.3 || ^7.4.0" } }, - "node_modules/@angular-devkit/build-angular/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "node_modules/@angular/language-service": { + "version": "19.2.15", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-19.2.15.tgz", + "integrity": "sha512-ONMNoTnMoS3YiAm6fbWYp1SRDwIBieR/yxGTe9JEij8rq9WtOnAm/KhyQkFojXzS2n+Ntf0nE/yJwtLJKUedgw==", "dev": true, - "license": "ISC", + "license": "MIT", + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + } + }, + "node_modules/@angular/material": { + "version": "19.2.19", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-19.2.19.tgz", + "integrity": "sha512-auIE6JUzTIA3LyYklh9J/T7u64crmphxUBgAa0zcOMDog6SYfwbNe9YeLQqua5ek4OUAOdK/BHHfVl5W5iaUoQ==", + "license": "MIT", "dependencies": { - "lru-cache": "^6.0.0" + "tslib": "^2.3.0" }, - "bin": { - "semver": "bin/semver.js" + "peerDependencies": { + "@angular/cdk": "19.2.19", + "@angular/common": "^19.0.0 || ^20.0.0", + "@angular/core": "^19.0.0 || ^20.0.0", + "@angular/forms": "^19.0.0 || ^20.0.0", + "@angular/platform-browser": "^19.0.0 || ^20.0.0", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/material-moment-adapter": { + "version": "19.2.19", + "resolved": "https://registry.npmjs.org/@angular/material-moment-adapter/-/material-moment-adapter-19.2.19.tgz", + "integrity": "sha512-yL7ES1HgtEW5D3iOkio/PD/UwBgXuyNDkxBdcrRYih+8ihhbaU6rBzCT5juUujjmRtt8Aj+3M80PSq5dlsingA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/core": "^19.0.0 || ^20.0.0", + "@angular/material": "19.2.19", + "moment": "^2.18.1" + } + }, + "node_modules/@angular/platform-browser": { + "version": "19.2.15", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.2.15.tgz", + "integrity": "sha512-OelQ6weCjon8kZD8kcqNzwugvZJurjS3uMJCwsA2vXmP/3zJ31SWtNqE2zLT1R2csVuwnp0h+nRMgq+pINU7Rg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" }, "engines": { - "node": ">=10" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + }, + "peerDependencies": { + "@angular/animations": "19.2.15", + "@angular/common": "19.2.15", + "@angular/core": "19.2.15" + }, + "peerDependenciesMeta": { + "@angular/animations": { + "optional": true + } } }, - "node_modules/@angular-devkit/build-angular/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "node_modules/@angular/platform-browser-dynamic": { + "version": "19.2.15", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-19.2.15.tgz", + "integrity": "sha512-dKy0SS395FCh8cW9AQ8nf4Wn3XlONaH7z50T1bGxm3eOoRqjxJYyIeIlEbDdJakMz4QPR3dGr81HleZd8TJumQ==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + }, + "peerDependencies": { + "@angular/common": "19.2.15", + "@angular/compiler": "19.2.15", + "@angular/core": "19.2.15", + "@angular/platform-browser": "19.2.15" + } + }, + "node_modules/@angular/router": { + "version": "19.2.15", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.2.15.tgz", + "integrity": "sha512-0TM1D8S7RQ00drKy7hA/ZLBY14dUBqFBgm06djcNcOjNzVAtgkeV0i+0Smq9tCC7UsGKdpZu4RgfYjHATBNlTQ==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + }, + "peerDependencies": { + "@angular/common": "19.2.15", + "@angular/core": "19.2.15", + "@angular/platform-browser": "19.2.15", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/upgrade": { + "version": "19.2.15", + "resolved": "https://registry.npmjs.org/@angular/upgrade/-/upgrade-19.2.15.tgz", + "integrity": "sha512-McGdSGAi23SxbcEefifwjHi8mx3ObaRL5+49X9p+7ChnpQp2CUmgD5BJsGjPoydeJT5OSUTBfigxJ9ukw4COKg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + }, + "peerDependencies": { + "@angular/compiler": "19.2.15", + "@angular/core": "19.2.15", + "@angular/platform-browser": "19.2.15", + "@angular/platform-browser-dynamic": "19.2.15" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", "dev": true, - "license": "0BSD" + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } }, - "node_modules/@angular-devkit/build-angular/node_modules/webpack": { - "version": "5.94.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", - "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", + "node_modules/@babel/compat-data": { + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.3.tgz", + "integrity": "sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", + "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", "dev": true, "license": "MIT", "dependencies": { - "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.12.1", - "@webassemblyjs/wasm-edit": "^1.12.1", - "@webassemblyjs/wasm-parser": "^1.12.1", - "acorn": "^8.7.1", - "acorn-import-attributes": "^1.9.5", - "browserslist": "^4.21.10", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.1", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.10", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.10", + "@babel/parser": "^7.26.10", + "@babel/template": "^7.26.9", + "@babel/traverse": "^7.26.10", + "@babel/types": "^7.26.10", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } + "semver": "bin/semver.js" } }, - "node_modules/@angular-devkit/build-angular/node_modules/webpack/node_modules/watchpack": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", - "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", + "node_modules/@babel/generator": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.10.tgz", + "integrity": "sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang==", "dev": true, "license": "MIT", "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" + "@babel/parser": "^7.26.10", + "@babel/types": "^7.26.10", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" }, "engines": { - "node": ">=10.13.0" + "node": ">=6.9.0" } }, - "node_modules/@angular-devkit/build-angular/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", + "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", "dev": true, - "license": "ISC" + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } }, - "node_modules/@angular-devkit/build-webpack": { - "version": "0.1703.17", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1703.17.tgz", - "integrity": "sha512-81RJe/WFQ1QOJA9du+jK41KaaWXmEWt3frtj9eseWSr+d+Ebt0JMblzM12A70qm7LoUvG48hSiimm7GmkzV3rw==", + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.1703.17", - "rxjs": "7.8.1" + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "engines": { - "node": "^18.13.0 || >=20.9.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "webpack": "^5.30.0", - "webpack-dev-server": "^4.0.0" + "node": ">=6.9.0" } }, - "node_modules/@angular-devkit/build-webpack/node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@angular-devkit/core": { - "version": "17.3.17", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.3.17.tgz", - "integrity": "sha512-7aNVqS3rOGsSZYAOO44xl2KURwaoOP+EJhJs+LqOGOFpok2kd8YLf4CAMUossMF4H7HsJpgKwYqGrV5eXunrpw==", + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.3.tgz", + "integrity": "sha512-RpLYy2sb51oNLjuu1iD3bwBqCBWUzjO0ocp+iaCP/lJtb2CPLcnC2Fftw+4sAzaMELGeWTgExSKADbdo0GFVzA==", "dev": true, "license": "MIT", "dependencies": { - "ajv": "8.12.0", - "ajv-formats": "2.1.1", - "jsonc-parser": "3.2.1", - "picomatch": "4.0.1", - "rxjs": "7.8.1", - "source-map": "0.7.4" + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.29.0", + "semver": "^6.3.1" }, "engines": { - "node": "^18.13.0 || >=20.9.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" + "node": ">=6.9.0" }, "peerDependencies": { - "chokidar": "^3.5.2" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } + "@babel/core": "^7.0.0" } }, - "node_modules/@angular-devkit/core/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", "dev": true, "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "@babel/types": "^7.27.3" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@angular-devkit/core/node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@angular-devkit/schematics": { - "version": "17.3.17", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.3.17.tgz", - "integrity": "sha512-ZXsIJXZm0I0dNu1BqmjfEtQhnzqoupUHHZb4GHm5NeQHBFZctQlkkNxLUU27GVeBUwFgEmP7kFgSLlMPTGSL5g==", + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz", + "integrity": "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "17.3.17", - "jsonc-parser": "3.2.1", - "magic-string": "0.30.8", - "ora": "5.4.1", - "rxjs": "7.8.1" + "@babel/helper-annotate-as-pure": "^7.27.3", + "regexpu-core": "^6.3.1", + "semver": "^6.3.1" }, "engines": { - "node": "^18.13.0 || >=20.9.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@angular-devkit/schematics/node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@angular/animations": { - "version": "17.3.12", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-17.3.12.tgz", - "integrity": "sha512-9hsdWF4gRRcVJtPcCcYLaX1CIyM9wUu6r+xRl6zU5hq8qhl35hig6ounz7CXFAzLf0WDBdM16bPHouVGaG76lg==", "license": "MIT", "dependencies": { - "tslib": "^2.3.0" + "@babel/types": "^7.27.3" }, "engines": { - "node": "^18.13.0 || >=20.9.0" - }, - "peerDependencies": { - "@angular/core": "17.3.12" + "node": ">=6.9.0" } }, - "node_modules/@angular/cdk": { - "version": "17.3.10", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-17.3.10.tgz", - "integrity": "sha512-b1qktT2c1TTTe5nTji/kFAVW92fULK0YhYAvJ+BjZTPKu2FniZNe8o4qqQ0pUuvtMu+ZQxp/QqFYoidIVCjScg==", + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.8.tgz", + "integrity": "sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==", + "dev": true, "license": "MIT", "dependencies": { - "tslib": "^2.3.0" - }, - "optionalDependencies": { - "parse5": "^7.1.2" + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "debug": "^4.4.3", + "lodash.debounce": "^4.0.8", + "resolve": "^1.22.11" }, "peerDependencies": { - "@angular/common": "^17.0.0 || ^18.0.0", - "@angular/core": "^17.0.0 || ^18.0.0", - "rxjs": "^6.5.3 || ^7.4.0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@angular/cli": { - "version": "17.3.17", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-17.3.17.tgz", - "integrity": "sha512-FgOvf9q5d23Cpa7cjP1FYti/v8S1FTm8DEkW3TY8lkkoxh3isu28GFKcLD1p/XF3yqfPkPVHToOFla5QwsEgBQ==", + "node_modules/@babel/helper-define-polyfill-provider/node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.1703.17", - "@angular-devkit/core": "17.3.17", - "@angular-devkit/schematics": "17.3.17", - "@schematics/angular": "17.3.17", - "@yarnpkg/lockfile": "1.1.0", - "ansi-colors": "4.1.3", - "ini": "4.1.2", - "inquirer": "9.2.15", - "jsonc-parser": "3.2.1", - "npm-package-arg": "11.0.1", - "npm-pick-manifest": "9.0.0", - "open": "8.4.2", - "ora": "5.4.1", - "pacote": "17.0.6", - "resolve": "1.22.8", - "semver": "7.6.0", - "symbol-observable": "4.0.0", - "yargs": "17.7.2" + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { - "ng": "bin/ng.js" + "resolve": "bin/resolve" }, "engines": { - "node": "^18.13.0 || >=20.9.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular/cli/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" + "node": ">= 0.4" }, - "engines": { - "node": ">=10" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@angular/cli/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=6.9.0" } }, - "node_modules/@angular/cli/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", + "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", "dev": true, - "license": "ISC" - }, - "node_modules/@angular/common": { - "version": "17.3.12", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-17.3.12.tgz", - "integrity": "sha512-vabJzvrx76XXFrm1RJZ6o/CyG32piTB/1sfFfKHdlH1QrmArb8It4gyk9oEjZ1IkAD0HvBWlfWmn+T6Vx3pdUw==", "license": "MIT", "dependencies": { - "tslib": "^2.3.0" + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5" }, "engines": { - "node": "^18.13.0 || >=20.9.0" - }, - "peerDependencies": { - "@angular/core": "17.3.12", - "rxjs": "^6.5.3 || ^7.4.0" + "node": ">=6.9.0" } }, - "node_modules/@angular/compiler": { - "version": "17.3.12", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-17.3.12.tgz", - "integrity": "sha512-vwI8oOL/gM+wPnptOVeBbMfZYwzRxQsovojZf+Zol9szl0k3SZ3FycWlxxXZGFu3VIEfrP6pXplTmyODS/Lt1w==", + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, "license": "MIT", "dependencies": { - "tslib": "^2.3.0" + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { - "node": "^18.13.0 || >=20.9.0" - }, - "peerDependencies": { - "@angular/core": "17.3.12" - }, - "peerDependenciesMeta": { - "@angular/core": { - "optional": true - } + "node": ">=6.9.0" } }, - "node_modules/@angular/compiler-cli": { - "version": "17.3.12", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-17.3.12.tgz", - "integrity": "sha512-1F8M7nWfChzurb7obbvuE7mJXlHtY1UG58pcwcomVtpPb+kPavgAO8OEvJHYBMV+bzSxkXt5UIwL9lt9jHUxZA==", + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "7.23.9", - "@jridgewell/sourcemap-codec": "^1.4.14", - "chokidar": "^3.0.0", - "convert-source-map": "^1.5.1", - "reflect-metadata": "^0.2.0", - "semver": "^7.0.0", - "tslib": "^2.3.0", - "yargs": "^17.2.1" - }, - "bin": { - "ng-xi18n": "bundles/src/bin/ng_xi18n.js", - "ngc": "bundles/src/bin/ngc.js", - "ngcc": "bundles/ngcc/index.js" + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" }, "engines": { - "node": "^18.13.0 || >=20.9.0" + "node": ">=6.9.0" }, "peerDependencies": { - "@angular/compiler": "17.3.12", - "typescript": ">=5.2 <5.5" + "@babel/core": "^7.0.0" } }, - "node_modules/@angular/compiler-cli/node_modules/@babel/core": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", - "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", "dev": true, "license": "MIT", "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.9", - "@babel/parser": "^7.23.9", - "@babel/template": "^7.23.9", - "@babel/traverse": "^7.23.9", - "@babel/types": "^7.23.9", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" } }, - "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "license": "MIT", + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@angular/core": { - "version": "17.3.12", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-17.3.12.tgz", - "integrity": "sha512-MuFt5yKi161JmauUta4Dh0m8ofwoq6Ino+KoOtkYMBGsSx+A7dSm+DUxxNwdj7+DNyg3LjVGCFgBFnq4g8z06A==", + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", + "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", + "dev": true, "license": "MIT", "dependencies": { - "tslib": "^2.3.0" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { - "node": "^18.13.0 || >=20.9.0" + "node": ">=6.9.0" }, "peerDependencies": { - "rxjs": "^6.5.3 || ^7.4.0", - "zone.js": "~0.14.0" + "@babel/core": "^7.0.0" } }, - "node_modules/@angular/flex-layout": { - "version": "15.0.0-beta.42", - "resolved": "https://registry.npmjs.org/@angular/flex-layout/-/flex-layout-15.0.0-beta.42.tgz", - "integrity": "sha512-cTAPVMMxnyIFwpZwdq0PL5mdP9Qh+R8MB7ZBezVaN3Rz2fRrkagzKpLvPX3TFzepXrvHBdpKsU4b8u+NxEC/6g==", - "deprecated": "This package has been deprecated. Please see https://blog.angular.io/modern-css-in-angular-layouts-4a259dca9127", + "node_modules/@babel/helper-remap-async-to-generator/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "dev": true, "license": "MIT", "dependencies": { - "tslib": "^2.3.0" + "@babel/types": "^7.27.3" }, - "peerDependencies": { - "@angular/cdk": ">=15.0.0", - "@angular/common": ">=15.0.2", - "@angular/core": ">=15.0.2", - "@angular/platform-browser": ">=15.0.2", - "rxjs": "^6.5.3 || ^7.4.0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@angular/forms": { - "version": "17.3.12", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-17.3.12.tgz", - "integrity": "sha512-tV6r12Q3yEUlXwpVko4E+XscunTIpPkLbaiDn/MTL3Vxi2LZnsLgHyd/i38HaHN+e/H3B0a1ToSOhV5wf3ay4Q==", + "node_modules/@babel/helper-replace-supers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz", + "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==", + "dev": true, "license": "MIT", "dependencies": { - "tslib": "^2.3.0" + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.28.6" }, "engines": { - "node": "^18.13.0 || >=20.9.0" + "node": ">=6.9.0" }, "peerDependencies": { - "@angular/common": "17.3.12", - "@angular/core": "17.3.12", - "@angular/platform-browser": "17.3.12", - "rxjs": "^6.5.3 || ^7.4.0" + "@babel/core": "^7.0.0" } }, - "node_modules/@angular/language-service": { - "version": "17.3.12", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-17.3.12.tgz", - "integrity": "sha512-MVmEXonXwdhFtIpU4q8qbXHsrAsdTjZcPPuWCU0zXVQ+VaB/y6oF7BVpmBtfyBcBCums1guEncPP+AZVvulXmQ==", + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, "engines": { - "node": "^18.13.0 || >=20.9.0" + "node": ">=6.9.0" } }, - "node_modules/@angular/material": { - "version": "17.3.10", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-17.3.10.tgz", - "integrity": "sha512-hHMQES0tQPH5JW33W+mpBPuM8ybsloDTqFPuRV8cboDjosAWfJhzAKF3ozICpNlUrs62La/2Wu/756GcQrxebg==", - "license": "MIT", - "dependencies": { - "@material/animation": "15.0.0-canary.7f224ddd4.0", - "@material/auto-init": "15.0.0-canary.7f224ddd4.0", - "@material/banner": "15.0.0-canary.7f224ddd4.0", - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/button": "15.0.0-canary.7f224ddd4.0", - "@material/card": "15.0.0-canary.7f224ddd4.0", - "@material/checkbox": "15.0.0-canary.7f224ddd4.0", - "@material/chips": "15.0.0-canary.7f224ddd4.0", - "@material/circular-progress": "15.0.0-canary.7f224ddd4.0", - "@material/data-table": "15.0.0-canary.7f224ddd4.0", - "@material/density": "15.0.0-canary.7f224ddd4.0", - "@material/dialog": "15.0.0-canary.7f224ddd4.0", - "@material/dom": "15.0.0-canary.7f224ddd4.0", - "@material/drawer": "15.0.0-canary.7f224ddd4.0", - "@material/elevation": "15.0.0-canary.7f224ddd4.0", - "@material/fab": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/floating-label": "15.0.0-canary.7f224ddd4.0", - "@material/form-field": "15.0.0-canary.7f224ddd4.0", - "@material/icon-button": "15.0.0-canary.7f224ddd4.0", - "@material/image-list": "15.0.0-canary.7f224ddd4.0", - "@material/layout-grid": "15.0.0-canary.7f224ddd4.0", - "@material/line-ripple": "15.0.0-canary.7f224ddd4.0", - "@material/linear-progress": "15.0.0-canary.7f224ddd4.0", - "@material/list": "15.0.0-canary.7f224ddd4.0", - "@material/menu": "15.0.0-canary.7f224ddd4.0", - "@material/menu-surface": "15.0.0-canary.7f224ddd4.0", - "@material/notched-outline": "15.0.0-canary.7f224ddd4.0", - "@material/radio": "15.0.0-canary.7f224ddd4.0", - "@material/ripple": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/segmented-button": "15.0.0-canary.7f224ddd4.0", - "@material/select": "15.0.0-canary.7f224ddd4.0", - "@material/shape": "15.0.0-canary.7f224ddd4.0", - "@material/slider": "15.0.0-canary.7f224ddd4.0", - "@material/snackbar": "15.0.0-canary.7f224ddd4.0", - "@material/switch": "15.0.0-canary.7f224ddd4.0", - "@material/tab": "15.0.0-canary.7f224ddd4.0", - "@material/tab-bar": "15.0.0-canary.7f224ddd4.0", - "@material/tab-indicator": "15.0.0-canary.7f224ddd4.0", - "@material/tab-scroller": "15.0.0-canary.7f224ddd4.0", - "@material/textfield": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "@material/tooltip": "15.0.0-canary.7f224ddd4.0", - "@material/top-app-bar": "15.0.0-canary.7f224ddd4.0", - "@material/touch-target": "15.0.0-canary.7f224ddd4.0", - "@material/typography": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.3.0" + "node_modules/@babel/helper-split-export-declaration": { + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" }, - "peerDependencies": { - "@angular/animations": "^17.0.0 || ^18.0.0", - "@angular/cdk": "17.3.10", - "@angular/common": "^17.0.0 || ^18.0.0", - "@angular/core": "^17.0.0 || ^18.0.0", - "@angular/forms": "^17.0.0 || ^18.0.0", - "@angular/platform-browser": "^17.0.0 || ^18.0.0", - "rxjs": "^6.5.3 || ^7.4.0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@angular/material-moment-adapter": { - "version": "17.3.10", - "resolved": "https://registry.npmjs.org/@angular/material-moment-adapter/-/material-moment-adapter-17.3.10.tgz", - "integrity": "sha512-R68ssdGMSmVIfpOGaB9vjW5lBh6zH9GboBuaIAqizC/ZAzdEgpmT7qdr3PBCmRPTLTx8Yx9K3rhgRekO79ympw==", + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, "license": "MIT", - "dependencies": { - "tslib": "^2.3.0" - }, - "peerDependencies": { - "@angular/core": "^17.0.0 || ^18.0.0", - "@angular/material": "17.3.10", - "moment": "^2.18.1" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@angular/platform-browser": { - "version": "17.3.12", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.3.12.tgz", - "integrity": "sha512-DYY04ptWh/ulMHzd+y52WCE8QnEYGeIiW3hEIFjCN8z0kbIdFdUtEB0IK5vjNL3ejyhUmphcpeT5PYf3YXtqWQ==", + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, "license": "MIT", - "dependencies": { - "tslib": "^2.3.0" - }, "engines": { - "node": "^18.13.0 || >=20.9.0" - }, - "peerDependencies": { - "@angular/animations": "17.3.12", - "@angular/common": "17.3.12", - "@angular/core": "17.3.12" - }, - "peerDependenciesMeta": { - "@angular/animations": { - "optional": true - } + "node": ">=6.9.0" } }, - "node_modules/@angular/platform-browser-dynamic": { - "version": "17.3.12", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-17.3.12.tgz", - "integrity": "sha512-DQwV7B2x/DRLRDSisngZRdLqHdYbbrqZv2Hmu4ZbnNYaWPC8qvzgE/0CvY+UkDat3nCcsfwsMnlDeB6TL7/IaA==", + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, "license": "MIT", - "dependencies": { - "tslib": "^2.3.0" - }, "engines": { - "node": "^18.13.0 || >=20.9.0" - }, - "peerDependencies": { - "@angular/common": "17.3.12", - "@angular/compiler": "17.3.12", - "@angular/core": "17.3.12", - "@angular/platform-browser": "17.3.12" + "node": ">=6.9.0" } }, - "node_modules/@angular/router": { - "version": "17.3.12", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-17.3.12.tgz", - "integrity": "sha512-dg7PHBSW9fmPKTVzwvHEeHZPZdpnUqW/U7kj8D29HTP9ur8zZnx9QcnbplwPeYb8yYa62JMnZSEel2X4PxdYBg==", + "node_modules/@babel/helper-wrap-function": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.6.tgz", + "integrity": "sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==", + "dev": true, "license": "MIT", "dependencies": { - "tslib": "^2.3.0" + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { - "node": "^18.13.0 || >=20.9.0" - }, - "peerDependencies": { - "@angular/common": "17.3.12", - "@angular/core": "17.3.12", - "@angular/platform-browser": "17.3.12", - "rxjs": "^6.5.3 || ^7.4.0" + "node": ">=6.9.0" } }, - "node_modules/@angular/upgrade": { - "version": "17.3.12", - "resolved": "https://registry.npmjs.org/@angular/upgrade/-/upgrade-17.3.12.tgz", - "integrity": "sha512-6XOgda//NhDU5YP2l+pOZil2Z/hzU7vUyAOUtgYEZ4UJUewpNv09j9yfd/BVh45+x4z3i+LmgOiJVbTxwGOKiw==", + "node_modules/@babel/helpers": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "dev": true, "license": "MIT", "dependencies": { - "tslib": "^2.3.0" + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" }, "engines": { - "node": "^18.13.0 || >=20.9.0" - }, - "peerDependencies": { - "@angular/compiler": "17.3.12", - "@angular/core": "17.3.12", - "@angular/platform-browser": "17.3.12", - "@angular/platform-browser-dynamic": "17.3.12" + "node": ">=6.9.0" } }, - "node_modules/@babel/code-frame": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", - "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "node_modules/@babel/parser": { + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.3.tgz", + "integrity": "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" }, "engines": { - "node": ">=6.9.0" + "node": ">=6.0.0" } }, - "node_modules/@babel/compat-data": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", - "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz", + "integrity": "sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" + }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/core": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", - "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", + "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", "dev": true, "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.10", - "@babel/helper-compilation-targets": "^7.26.5", - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.10", - "@babel/parser": "^7.26.10", - "@babel/template": "^7.26.9", - "@babel/traverse": "^7.26.10", - "@babel/types": "^7.26.10", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/generator": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.10.tgz", - "integrity": "sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang==", + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", + "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.10", - "@babel/types": "^7.26.10", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^3.0.2" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", - "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", + "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" } }, - "node_modules/@babel/helper-compilation-targets": { + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", - "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.6.tgz", + "integrity": "sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/helper-create-class-features-plugin": { + "node_modules/@babel/plugin-syntax-import-assertions": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz", - "integrity": "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.28.6.tgz", + "integrity": "sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-member-expression-to-functions": "^7.28.5", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/helper-replace-supers": "^7.28.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/traverse": "^7.28.6", - "semver": "^6.3.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", - "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", + "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.27.3" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz", - "integrity": "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==", + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "regexpu-core": "^6.3.1", - "semver": "^6.3.1" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1368,319 +2261,377 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", - "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.27.3" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.26.8.tgz", + "integrity": "sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-remap-async-to-generator": "^7.25.9", + "@babel/traverse": "^7.26.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.8.tgz", - "integrity": "sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==", + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", + "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "debug": "^4.4.3", - "lodash.debounce": "^4.0.8", - "resolve": "^1.22.11" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/resolve": { - "version": "1.22.12", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", - "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", + "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", "dev": true, "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "is-core-module": "^2.16.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": ">= 0.4" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.6.tgz", + "integrity": "sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", - "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.28.6.tgz", + "integrity": "sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.28.5", - "@babel/types": "^7.28.5" + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/helper-module-imports": { + "node_modules/@babel/plugin-transform-class-static-block": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", - "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.6.tgz", + "integrity": "sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" } }, - "node_modules/@babel/helper-module-transforms": { + "node_modules/@babel/plugin-transform-classes": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", - "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.6.tgz", + "integrity": "sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-globals": "^7.28.0", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-replace-supers": "^7.28.6", "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", - "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.27.1" + "@babel/types": "^7.27.3" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-plugin-utils": { + "node_modules/@babel/plugin-transform-computed-properties": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", - "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.28.6.tgz", + "integrity": "sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/template": "^7.28.6" + }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", - "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", + "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-wrap-function": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/helper-remap-async-to-generator/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", - "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.28.6.tgz", + "integrity": "sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.27.3" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz", - "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==", + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", + "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.28.5", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/traverse": "^7.28.6" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", - "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.0.tgz", + "integrity": "sha512-zBPcW2lFGxdiD8PUnPwJjag2J9otbcLQzvbiOzDxpYXyCuYX9agOwMPGn1prVH0a4qzhCKu24rlH4c1f7yA8rw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-split-export-declaration": { - "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==", + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", + "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.24.7" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.6.tgz", + "integrity": "sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", + "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/helper-validator-option": { + "node_modules/@babel/plugin-transform-for-of": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.6.tgz", - "integrity": "sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==", + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/helpers": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", - "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.28.6.tgz", + "integrity": "sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/parser": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", - "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", + "node_modules/@babel/plugin-transform-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.29.0" - }, - "bin": { - "parser": "bin/babel-parser.js" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz", - "integrity": "sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==", + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.6.tgz", + "integrity": "sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.5" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "node_modules/@babel/plugin-transform-member-expression-literals": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", - "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", + "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1690,66 +2641,72 @@ "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "node_modules/@babel/plugin-transform-modules-amd": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", - "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", + "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", "dev": true, "license": "MIT", "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", - "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz", + "integrity": "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/plugin-transform-optional-chaining": "^7.27.1" + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.13.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.6.tgz", - "integrity": "sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g==", + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.29.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.4.tgz", + "integrity": "sha512-N7QmZ0xRZfjHOfZeQLJjwgX2zS9pdGHSVl/cjSGlo4dXMqvurfxXDMKY4RqEKzPozV78VMcd0lxyG13mlbKc4w==", "dev": true, "license": "MIT", "dependencies": { + "@babel/helper-module-transforms": "^7.28.6", "@babel/helper-plugin-utils": "^7.28.6", - "@babel/traverse": "^7.28.6" + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.29.0" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", + "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { "node": ">=6.9.0" }, @@ -1757,30 +2714,31 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.28.6.tgz", - "integrity": "sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==", + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.0.tgz", + "integrity": "sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ==", "dev": true, "license": "MIT", "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", - "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", + "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1789,31 +2747,30 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.28.6.tgz", + "integrity": "sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", - "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.28.6.tgz", + "integrity": "sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1822,16 +2779,18 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.26.8.tgz", - "integrity": "sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==", + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.6.tgz", + "integrity": "sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.26.5", - "@babel/helper-remap-async-to-generator": "^7.25.9", - "@babel/traverse": "^7.26.8" + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1840,16 +2799,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", - "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", + "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-remap-async-to-generator": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1858,14 +2816,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", - "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.28.6.tgz", + "integrity": "sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1874,14 +2832,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-block-scoping": { + "node_modules/@babel/plugin-transform-optional-chaining": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.6.tgz", - "integrity": "sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.6.tgz", + "integrity": "sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1890,15 +2849,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.28.6.tgz", - "integrity": "sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==", + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", + "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1907,10 +2865,10 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-class-static-block": { + "node_modules/@babel/plugin-transform-private-methods": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.6.tgz", - "integrity": "sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.28.6.tgz", + "integrity": "sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==", "dev": true, "license": "MIT", "dependencies": { @@ -1921,22 +2879,19 @@ "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.12.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-classes": { + "node_modules/@babel/plugin-transform-private-property-in-object": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.6.tgz", - "integrity": "sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.28.6.tgz", + "integrity": "sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-globals": "^7.28.0", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-replace-supers": "^7.28.6", - "@babel/traverse": "^7.28.6" + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1945,7 +2900,7 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-annotate-as-pure": { + "node_modules/@babel/plugin-transform-private-property-in-object/node_modules/@babel/helper-annotate-as-pure": { "version": "7.27.3", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", @@ -1958,15 +2913,14 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.28.6.tgz", - "integrity": "sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==", + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", + "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/template": "^7.28.6" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1975,15 +2929,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", - "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.0.tgz", + "integrity": "sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.5" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1992,10 +2945,10 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-dotall-regex": { + "node_modules/@babel/plugin-transform-regexp-modifiers": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.28.6.tgz", - "integrity": "sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.28.6.tgz", + "integrity": "sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg==", "dev": true, "license": "MIT", "dependencies": { @@ -2006,13 +2959,13 @@ "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-duplicate-keys": { + "node_modules/@babel/plugin-transform-reserved-words": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", - "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", + "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", "dev": true, "license": "MIT", "dependencies": { @@ -2025,27 +2978,41 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.0.tgz", - "integrity": "sha512-zBPcW2lFGxdiD8PUnPwJjag2J9otbcLQzvbiOzDxpYXyCuYX9agOwMPGn1prVH0a4qzhCKu24rlH4c1f7yA8rw==", + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.26.10.tgz", + "integrity": "sha512-NWaL2qG6HRpONTnj4JvDU6th4jYeZOJgu3QhmFTCihib0ermtOJqktA5BduGm3suhhVe9EMP9c9+mfJ/I9slqw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.26.5", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.11.0", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-dynamic-import": { + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", - "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2058,14 +3025,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { + "node_modules/@babel/plugin-transform-spread": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.6.tgz", - "integrity": "sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.28.6.tgz", + "integrity": "sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -2074,10 +3042,10 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-export-namespace-from": { + "node_modules/@babel/plugin-transform-sticky-regex": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", - "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", "dev": true, "license": "MIT", "dependencies": { @@ -2090,15 +3058,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-for-of": { + "node_modules/@babel/plugin-transform-template-literals": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", - "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -2107,16 +3074,30 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-function-name": { + "node_modules/@babel/plugin-transform-typeof-symbol": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", - "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", + "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", + "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -2125,13 +3106,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-json-strings": { + "node_modules/@babel/plugin-transform-unicode-property-regex": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.28.6.tgz", - "integrity": "sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.28.6.tgz", + "integrity": "sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A==", "dev": true, "license": "MIT", "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { @@ -2141,13 +3123,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-literals": { + "node_modules/@babel/plugin-transform-unicode-regex": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", - "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", "dev": true, "license": "MIT", "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { @@ -2157,30 +3140,99 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "node_modules/@babel/plugin-transform-unicode-sets-regex": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.6.tgz", - "integrity": "sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.28.6.tgz", + "integrity": "sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q==", "dev": true, "license": "MIT", "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", - "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", + "node_modules/@babel/preset-env": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.9.tgz", + "integrity": "sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/compat-data": "^7.26.8", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.26.0", + "@babel/plugin-syntax-import-attributes": "^7.26.0", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.25.9", + "@babel/plugin-transform-async-generator-functions": "^7.26.8", + "@babel/plugin-transform-async-to-generator": "^7.25.9", + "@babel/plugin-transform-block-scoped-functions": "^7.26.5", + "@babel/plugin-transform-block-scoping": "^7.25.9", + "@babel/plugin-transform-class-properties": "^7.25.9", + "@babel/plugin-transform-class-static-block": "^7.26.0", + "@babel/plugin-transform-classes": "^7.25.9", + "@babel/plugin-transform-computed-properties": "^7.25.9", + "@babel/plugin-transform-destructuring": "^7.25.9", + "@babel/plugin-transform-dotall-regex": "^7.25.9", + "@babel/plugin-transform-duplicate-keys": "^7.25.9", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-dynamic-import": "^7.25.9", + "@babel/plugin-transform-exponentiation-operator": "^7.26.3", + "@babel/plugin-transform-export-namespace-from": "^7.25.9", + "@babel/plugin-transform-for-of": "^7.26.9", + "@babel/plugin-transform-function-name": "^7.25.9", + "@babel/plugin-transform-json-strings": "^7.25.9", + "@babel/plugin-transform-literals": "^7.25.9", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", + "@babel/plugin-transform-member-expression-literals": "^7.25.9", + "@babel/plugin-transform-modules-amd": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.26.3", + "@babel/plugin-transform-modules-systemjs": "^7.25.9", + "@babel/plugin-transform-modules-umd": "^7.25.9", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-new-target": "^7.25.9", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.26.6", + "@babel/plugin-transform-numeric-separator": "^7.25.9", + "@babel/plugin-transform-object-rest-spread": "^7.25.9", + "@babel/plugin-transform-object-super": "^7.25.9", + "@babel/plugin-transform-optional-catch-binding": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9", + "@babel/plugin-transform-private-methods": "^7.25.9", + "@babel/plugin-transform-private-property-in-object": "^7.25.9", + "@babel/plugin-transform-property-literals": "^7.25.9", + "@babel/plugin-transform-regenerator": "^7.25.9", + "@babel/plugin-transform-regexp-modifiers": "^7.26.0", + "@babel/plugin-transform-reserved-words": "^7.25.9", + "@babel/plugin-transform-shorthand-properties": "^7.25.9", + "@babel/plugin-transform-spread": "^7.25.9", + "@babel/plugin-transform-sticky-regex": "^7.25.9", + "@babel/plugin-transform-template-literals": "^7.26.8", + "@babel/plugin-transform-typeof-symbol": "^7.26.7", + "@babel/plugin-transform-unicode-escapes": "^7.25.9", + "@babel/plugin-transform-unicode-property-regex": "^7.25.9", + "@babel/plugin-transform-unicode-regex": "^7.25.9", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.11.0", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.40.0", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -2189,1322 +3241,1535 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", - "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.10.tgz", + "integrity": "sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" }, "engines": { "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime-corejs3": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.29.2.tgz", + "integrity": "sha512-Lc94FOD5+0aXhdb0Tdg3RUtqT6yWbI/BbFWvlaSJ3gAb9Ks+99nHRDKADVqC37er4eCB0fHyWT+y+K3QOvJKbw==", + "license": "MIT", + "dependencies": { + "core-js-pure": "^3.48.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-transform-modules-commonjs": { + "node_modules/@babel/template": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz", - "integrity": "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-systemjs": { + "node_modules/@babel/traverse": { "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.0.tgz", - "integrity": "sha512-PrujnVFbOdUpw4UHiVwKvKRLMMic8+eC0CuNlxjsyZUiBjhFdPsewdXCkveh2KqBA9/waD0W1b4hXSOBQJezpQ==", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.29.0" + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", - "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", + "node_modules/@babel/traverse/node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@braintree/sanitize-url": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-5.0.2.tgz", + "integrity": "sha512-NBEJlHWrhQucLhZGHtSxM2loSaNUMajC7KOYJLyfcdW/6goVoff2HoYI3bz8YCDN0wKGbxtUL0gx2dvHpvnWlw==", + "deprecated": "Potential XSS vulnerability patched in v6.0.0.", + "license": "MIT" + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@ctrl/tinycolor": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", + "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz", + "integrity": "sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.17.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz", + "integrity": "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.0.tgz", - "integrity": "sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ==", + "node_modules/@esbuild/android-arm": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.4.tgz", + "integrity": "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==", + "cpu": [ + "arm" + ], "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", - "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", + "node_modules/@esbuild/android-arm64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz", + "integrity": "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.28.6.tgz", - "integrity": "sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==", + "node_modules/@esbuild/android-x64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.4.tgz", + "integrity": "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.28.6.tgz", - "integrity": "sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz", + "integrity": "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.6.tgz", - "integrity": "sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==", + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz", + "integrity": "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/plugin-transform-destructuring": "^7.28.5", - "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/traverse": "^7.28.6" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", - "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz", + "integrity": "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.28.6.tgz", - "integrity": "sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==", + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz", + "integrity": "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.6.tgz", - "integrity": "sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==", + "node_modules/@esbuild/linux-arm": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz", + "integrity": "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==", + "cpu": [ + "arm" + ], "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", - "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz", + "integrity": "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.28.6.tgz", - "integrity": "sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==", + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz", + "integrity": "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==", + "cpu": [ + "ia32" + ], "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.28.6.tgz", - "integrity": "sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==", + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz", + "integrity": "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==", + "cpu": [ + "loong64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-private-property-in-object/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", - "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz", + "integrity": "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==", + "cpu": [ + "mips64el" + ], "dev": true, "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.3" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", - "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz", + "integrity": "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==", + "cpu": [ + "ppc64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.0.tgz", - "integrity": "sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog==", + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz", + "integrity": "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==", + "cpu": [ + "riscv64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-regexp-modifiers": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.28.6.tgz", - "integrity": "sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg==", + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz", + "integrity": "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==", + "cpu": [ + "s390x" + ], "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", - "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", + "node_modules/@esbuild/linux-x64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz", + "integrity": "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.26.10.tgz", - "integrity": "sha512-NWaL2qG6HRpONTnj4JvDU6th4jYeZOJgu3QhmFTCihib0ermtOJqktA5BduGm3suhhVe9EMP9c9+mfJ/I9slqw==", + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz", + "integrity": "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.26.5", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.11.0", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "semver": "^6.3.1" - }, + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz", + "integrity": "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==", + "cpu": [ + "x64" + ], "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", - "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz", + "integrity": "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.28.6.tgz", - "integrity": "sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==", + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz", + "integrity": "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" - }, + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", - "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz", + "integrity": "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, + "optional": true, + "os": [ + "sunos" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", - "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz", + "integrity": "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", - "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz", + "integrity": "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==", + "cpu": [ + "ia32" + ], "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", - "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", + "node_modules/@esbuild/win32-x64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz", + "integrity": "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.28.6.tgz", - "integrity": "sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A==", + "node_modules/@inquirer/ansi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", + "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==", "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" - }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", - "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", + "node_modules/@inquirer/checkbox": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.2.tgz", + "integrity": "sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" }, "engines": { - "node": ">=6.9.0" + "node": ">=18" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.28.6.tgz", - "integrity": "sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q==", + "node_modules/@inquirer/confirm": { + "version": "5.1.21", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.21.tgz", + "integrity": "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" }, "engines": { - "node": ">=6.9.0" + "node": ">=18" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@babel/preset-env": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.9.tgz", - "integrity": "sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==", + "node_modules/@inquirer/core": { + "version": "10.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", + "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.26.8", - "@babel/helper-compilation-targets": "^7.26.5", - "@babel/helper-plugin-utils": "^7.26.5", - "@babel/helper-validator-option": "^7.25.9", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-import-assertions": "^7.26.0", - "@babel/plugin-syntax-import-attributes": "^7.26.0", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.25.9", - "@babel/plugin-transform-async-generator-functions": "^7.26.8", - "@babel/plugin-transform-async-to-generator": "^7.25.9", - "@babel/plugin-transform-block-scoped-functions": "^7.26.5", - "@babel/plugin-transform-block-scoping": "^7.25.9", - "@babel/plugin-transform-class-properties": "^7.25.9", - "@babel/plugin-transform-class-static-block": "^7.26.0", - "@babel/plugin-transform-classes": "^7.25.9", - "@babel/plugin-transform-computed-properties": "^7.25.9", - "@babel/plugin-transform-destructuring": "^7.25.9", - "@babel/plugin-transform-dotall-regex": "^7.25.9", - "@babel/plugin-transform-duplicate-keys": "^7.25.9", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", - "@babel/plugin-transform-dynamic-import": "^7.25.9", - "@babel/plugin-transform-exponentiation-operator": "^7.26.3", - "@babel/plugin-transform-export-namespace-from": "^7.25.9", - "@babel/plugin-transform-for-of": "^7.26.9", - "@babel/plugin-transform-function-name": "^7.25.9", - "@babel/plugin-transform-json-strings": "^7.25.9", - "@babel/plugin-transform-literals": "^7.25.9", - "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", - "@babel/plugin-transform-member-expression-literals": "^7.25.9", - "@babel/plugin-transform-modules-amd": "^7.25.9", - "@babel/plugin-transform-modules-commonjs": "^7.26.3", - "@babel/plugin-transform-modules-systemjs": "^7.25.9", - "@babel/plugin-transform-modules-umd": "^7.25.9", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", - "@babel/plugin-transform-new-target": "^7.25.9", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.26.6", - "@babel/plugin-transform-numeric-separator": "^7.25.9", - "@babel/plugin-transform-object-rest-spread": "^7.25.9", - "@babel/plugin-transform-object-super": "^7.25.9", - "@babel/plugin-transform-optional-catch-binding": "^7.25.9", - "@babel/plugin-transform-optional-chaining": "^7.25.9", - "@babel/plugin-transform-parameters": "^7.25.9", - "@babel/plugin-transform-private-methods": "^7.25.9", - "@babel/plugin-transform-private-property-in-object": "^7.25.9", - "@babel/plugin-transform-property-literals": "^7.25.9", - "@babel/plugin-transform-regenerator": "^7.25.9", - "@babel/plugin-transform-regexp-modifiers": "^7.26.0", - "@babel/plugin-transform-reserved-words": "^7.25.9", - "@babel/plugin-transform-shorthand-properties": "^7.25.9", - "@babel/plugin-transform-spread": "^7.25.9", - "@babel/plugin-transform-sticky-regex": "^7.25.9", - "@babel/plugin-transform-template-literals": "^7.26.8", - "@babel/plugin-transform-typeof-symbol": "^7.26.7", - "@babel/plugin-transform-unicode-escapes": "^7.25.9", - "@babel/plugin-transform-unicode-property-regex": "^7.25.9", - "@babel/plugin-transform-unicode-regex": "^7.25.9", - "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.11.0", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.40.0", - "semver": "^6.3.1" + "@inquirer/ansi": "^1.0.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.3" }, "engines": { - "node": ">=6.9.0" + "node": ">=18" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "node_modules/@inquirer/editor": { + "version": "4.2.23", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.23.tgz", + "integrity": "sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" + "@inquirer/core": "^10.3.2", + "@inquirer/external-editor": "^1.0.3", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" }, "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.10.tgz", - "integrity": "sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==", - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.14.0" + "@types/node": ">=18" }, - "engines": { - "node": ">=6.9.0" + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@babel/runtime-corejs3": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.29.2.tgz", - "integrity": "sha512-Lc94FOD5+0aXhdb0Tdg3RUtqT6yWbI/BbFWvlaSJ3gAb9Ks+99nHRDKADVqC37er4eCB0fHyWT+y+K3QOvJKbw==", + "node_modules/@inquirer/expand": { + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.23.tgz", + "integrity": "sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==", + "dev": true, "license": "MIT", "dependencies": { - "core-js-pure": "^3.48.0" + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" }, "engines": { - "node": ">=6.9.0" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@babel/template": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", - "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "node_modules/@inquirer/external-editor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", + "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6" + "chardet": "^2.1.1", + "iconv-lite": "^0.7.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@babel/traverse": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", - "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "node_modules/@inquirer/figures": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", + "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", "dev": true, "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0", - "debug": "^4.3.1" - }, "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@babel/traverse/node_modules/@babel/generator": { - "version": "7.29.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", - "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "node_modules/@inquirer/input": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.3.1.tgz", + "integrity": "sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.0", - "@babel/types": "^7.29.0", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" }, "engines": { - "node": ">=6.9.0" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@babel/types": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", - "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "node_modules/@inquirer/number": { + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.23.tgz", + "integrity": "sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" }, "engines": { - "node": ">=6.9.0" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@braintree/sanitize-url": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-5.0.2.tgz", - "integrity": "sha512-NBEJlHWrhQucLhZGHtSxM2loSaNUMajC7KOYJLyfcdW/6goVoff2HoYI3bz8YCDN0wKGbxtUL0gx2dvHpvnWlw==", - "deprecated": "Potential XSS vulnerability patched in v6.0.0.", - "license": "MIT" - }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "node_modules/@inquirer/password": { + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.23.tgz", + "integrity": "sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==", "dev": true, "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@ctrl/tinycolor": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", - "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", - "license": "MIT", - "engines": { - "node": ">=10" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "node_modules/@inquirer/prompts": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.3.2.tgz", + "integrity": "sha512-G1ytyOoHh5BphmEBxSwALin3n1KGNYB6yImbICcRQdzXfOGbuJ9Jske/Of5Sebk339NSGGNfUshnzK8YWkTPsQ==", "dev": true, "license": "MIT", + "dependencies": { + "@inquirer/checkbox": "^4.1.2", + "@inquirer/confirm": "^5.1.6", + "@inquirer/editor": "^4.2.7", + "@inquirer/expand": "^4.0.9", + "@inquirer/input": "^4.1.6", + "@inquirer/number": "^3.0.9", + "@inquirer/password": "^4.0.9", + "@inquirer/rawlist": "^4.0.9", + "@inquirer/search": "^3.0.9", + "@inquirer/select": "^4.0.9" + }, "engines": { - "node": ">=10.0.0" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.1.tgz", - "integrity": "sha512-m55cpeupQ2DbuRGQMMZDzbv9J9PgVelPjlcmM5kxHnrBdBx6REaEd7LamYV7Dm8N7rCyR/XwU6rVP8ploKtIkA==", - "cpu": [ - "ppc64" - ], + "node_modules/@inquirer/rawlist": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.11.tgz", + "integrity": "sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "aix" - ], + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, "engines": { - "node": ">=12" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@esbuild/android-arm": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.1.tgz", - "integrity": "sha512-4j0+G27/2ZXGWR5okcJi7pQYhmkVgb4D7UKwxcqrjhvp5TKWx3cUjgB1CGj1mfdmJBQ9VnUGgUhign+FPF2Zgw==", - "cpu": [ - "arm" - ], + "node_modules/@inquirer/search": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.2.tgz", + "integrity": "sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, "engines": { - "node": ">=12" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@esbuild/android-arm64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.1.tgz", - "integrity": "sha512-hCnXNF0HM6AjowP+Zou0ZJMWWa1VkD77BXe959zERgGJBBxB+sV+J9f/rcjeg2c5bsukD/n17RKWXGFCO5dD5A==", - "cpu": [ - "arm64" - ], + "node_modules/@inquirer/select": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.2.tgz", + "integrity": "sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, "engines": { - "node": ">=12" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@esbuild/android-x64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.1.tgz", - "integrity": "sha512-MSfZMBoAsnhpS+2yMFYIQUPs8Z19ajwfuaSZx+tSl09xrHZCjbeXXMsUF/0oq7ojxYEpsSo4c0SfjxOYXRbpaA==", - "cpu": [ - "x64" - ], + "node_modules/@inquirer/type": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", + "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], "engines": { - "node": ">=12" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.1.tgz", - "integrity": "sha512-Ylk6rzgMD8klUklGPzS414UQLa5NPXZD5tf8JmQU8GQrj6BrFA/Ic9tb2zRe1kOZyCbGl+e8VMbDRazCEBqPvA==", - "cpu": [ - "arm64" - ], + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, "engines": { "node": ">=12" } }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.1.tgz", - "integrity": "sha512-pFIfj7U2w5sMp52wTY1XVOdoxw+GDwy9FsK3OFz4BpMAjvZVs0dT1VXs8aQm22nhwoIWUmIRaE+4xow8xfIDZA==", - "cpu": [ - "x64" - ], + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.1.tgz", - "integrity": "sha512-UyW1WZvHDuM4xDz0jWun4qtQFauNdXjXOtIy7SYdf7pbxSWWVlqhnR/T2TpX6LX5NI62spt0a3ldIIEkPM6RHw==", - "cpu": [ - "arm64" - ], + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.1.tgz", - "integrity": "sha512-itPwCw5C+Jh/c624vcDd9kRCCZVpzpQn8dtwoYIt2TJF3S9xJLiRohnnNrKwREvcZYx0n8sCSbvGH349XkcQeg==", - "cpu": [ - "x64" - ], + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@esbuild/linux-arm": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.1.tgz", - "integrity": "sha512-LojC28v3+IhIbfQ+Vu4Ut5n3wKcgTu6POKIHN9Wpt0HnfgUGlBuyDDQR4jWZUZFyYLiz4RBBBmfU6sNfn6RhLw==", - "cpu": [ - "arm" - ], + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "ansi-regex": "^6.2.2" + }, "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.1.tgz", - "integrity": "sha512-cX8WdlF6Cnvw/DO9/X7XLH2J6CkBnz7Twjpk56cshk9sjYVcuh4sXQBy5bmTwzBjNVZze2yaV1vtcJS04LbN8w==", - "cpu": [ - "arm64" - ], + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.1.tgz", - "integrity": "sha512-4H/sQCy1mnnGkUt/xszaLlYJVTz3W9ep52xEefGtd6yXDQbz/5fZE5dFLUgsPdbUOQANcVUa5iO6g3nyy5BJiw==", - "cpu": [ - "ia32" - ], + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, "engines": { - "node": ">=12" + "node": ">=18.0.0" } }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.1.tgz", - "integrity": "sha512-c0jgtB+sRHCciVXlyjDcWb2FUuzlGVRwGXgI+3WqKOIuoo8AmZAddzeOHeYLtD+dmtHw3B4Xo9wAUdjlfW5yYA==", - "cpu": [ - "loong64" - ], + "node_modules/@istanbuljs/schema": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.6.tgz", + "integrity": "sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.1.tgz", - "integrity": "sha512-TgFyCfIxSujyuqdZKDZ3yTwWiGv+KnlOeXXitCQ+trDODJ+ZtGOzLkSWngynP0HZnTsDyBbPy7GWVXWaEl6lhA==", - "cpu": [ - "mips64el" - ], + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=12" + "node": ">=6.0.0" } }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.1.tgz", - "integrity": "sha512-b+yuD1IUeL+Y93PmFZDZFIElwbmFfIKLKlYI8M6tRyzE6u7oEP7onGk0vZRh8wfVGC2dZoy0EqX1V8qok4qHaw==", - "cpu": [ - "ppc64" - ], + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.1.tgz", - "integrity": "sha512-wpDlpE0oRKZwX+GfomcALcouqjjV8MIX8DyTrxfyCfXxoKQSDm45CZr9fanJ4F6ckD4yDEPT98SrjvLwIqUCgg==", - "cpu": [ - "riscv64" - ], + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jsonjoy.com/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=12" + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.1.tgz", - "integrity": "sha512-5BepC2Au80EohQ2dBpyTquqGCES7++p7G+7lXe1bAIvMdXm4YYcEfZtQrP4gaoZ96Wv1Ute61CEHFU7h4FMueQ==", - "cpu": [ - "s390x" - ], + "node_modules/@jsonjoy.com/buffers": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-17.67.0.tgz", + "integrity": "sha512-tfExRpYxBvi32vPs9ZHaTjSP4fHAfzSmcahOfNxtvGHcyJel+aibkPlGeBB+7AoC6hL7lXIE++8okecBxx7lcw==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "license": "Apache-2.0", "engines": { - "node": ">=12" + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@esbuild/linux-x64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.1.tgz", - "integrity": "sha512-5gRPk7pKuaIB+tmH+yKd2aQTRpqlf1E4f/mC+tawIm/CGJemZcHZpp2ic8oD83nKgUPMEd0fNanrnFljiruuyA==", - "cpu": [ - "x64" - ], + "node_modules/@jsonjoy.com/codegen": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz", + "integrity": "sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "license": "Apache-2.0", "engines": { - "node": ">=12" + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.1.tgz", - "integrity": "sha512-4fL68JdrLV2nVW2AaWZBv3XEm3Ae3NZn/7qy2KGAt3dexAgSVT+Hc97JKSZnqezgMlv9x6KV0ZkZY7UO5cNLCg==", - "cpu": [ - "x64" - ], + "node_modules/@jsonjoy.com/fs-core": { + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-core/-/fs-core-4.57.2.tgz", + "integrity": "sha512-SVjwklkpIV5wrynpYtuYnfYH1QF4/nDuLBX7VXdb+3miglcAgBVZb/5y0cOsehRV/9Vb+3UqhkMq3/NR3ztdkQ==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-node-builtins": "4.57.2", + "@jsonjoy.com/fs-node-utils": "4.57.2", + "thingies": "^2.5.0" + }, "engines": { - "node": ">=12" + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.1.tgz", - "integrity": "sha512-GhRuXlvRE+twf2ES+8REbeCb/zeikNqwD3+6S5y5/x+DYbAQUNl0HNBs4RQJqrechS4v4MruEr8ZtAin/hK5iw==", - "cpu": [ - "x64" - ], + "node_modules/@jsonjoy.com/fs-fsa": { + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-fsa/-/fs-fsa-4.57.2.tgz", + "integrity": "sha512-fhO8+iR2I+OCw668ISDJdn1aArc9zx033sWejIyzQ8RBeXa9bDSaUeA3ix0poYOfrj1KdOzytmYNv2/uLDfV6g==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-core": "4.57.2", + "@jsonjoy.com/fs-node-builtins": "4.57.2", + "@jsonjoy.com/fs-node-utils": "4.57.2", + "thingies": "^2.5.0" + }, "engines": { - "node": ">=12" + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.1.tgz", - "integrity": "sha512-ZnWEyCM0G1Ex6JtsygvC3KUUrlDXqOihw8RicRuQAzw+c4f1D66YlPNNV3rkjVW90zXVsHwZYWbJh3v+oQFM9Q==", - "cpu": [ - "x64" - ], + "node_modules/@jsonjoy.com/fs-node": { + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node/-/fs-node-4.57.2.tgz", + "integrity": "sha512-nX2AdL6cOFwLdju9G4/nbRnYevmCJbh7N7hvR3gGm97Cs60uEjyd0rpR+YBS7cTg175zzl22pGKXR5USaQMvKg==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-core": "4.57.2", + "@jsonjoy.com/fs-node-builtins": "4.57.2", + "@jsonjoy.com/fs-node-utils": "4.57.2", + "@jsonjoy.com/fs-print": "4.57.2", + "@jsonjoy.com/fs-snapshot": "4.57.2", + "glob-to-regex.js": "^1.0.0", + "thingies": "^2.5.0" + }, "engines": { - "node": ">=12" + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.1.tgz", - "integrity": "sha512-QZ6gXue0vVQY2Oon9WyLFCdSuYbXSoxaZrPuJ4c20j6ICedfsDilNPYfHLlMH7vGfU5DQR0czHLmJvH4Nzis/A==", - "cpu": [ - "arm64" - ], + "node_modules/@jsonjoy.com/fs-node-builtins": { + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-builtins/-/fs-node-builtins-4.57.2.tgz", + "integrity": "sha512-xhiegylRmhw43Ki2HO1ZBL7DQ5ja/qpRsL29VtQ2xuUHiuDGbgf2uD4p9Qd8hJI5P6RCtGYD50IXHXVq/Ocjcg==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "license": "Apache-2.0", "engines": { - "node": ">=12" + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.1.tgz", - "integrity": "sha512-HzcJa1NcSWTAU0MJIxOho8JftNp9YALui3o+Ny7hCh0v5f90nprly1U3Sj1Ldj/CvKKdvvFsCRvDkpsEMp4DNw==", - "cpu": [ - "ia32" - ], + "node_modules/@jsonjoy.com/fs-node-to-fsa": { + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-to-fsa/-/fs-node-to-fsa-4.57.2.tgz", + "integrity": "sha512-18LmWTSONhoAPW+IWRuf8w/+zRolPFGPeGwMxlAhhfY11EKzX+5XHDBPAw67dBF5dxDErHJbl40U+3IXSDRXSQ==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-fsa": "4.57.2", + "@jsonjoy.com/fs-node-builtins": "4.57.2", + "@jsonjoy.com/fs-node-utils": "4.57.2" + }, "engines": { - "node": ">=12" + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@esbuild/win32-x64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.1.tgz", - "integrity": "sha512-0MBh53o6XtI6ctDnRMeQ+xoCN8kD2qI1rY1KgF/xdWQwoFeKou7puvDfV8/Wv4Ctx2rRpET/gGdz3YlNtNACSA==", - "cpu": [ - "x64" - ], + "node_modules/@jsonjoy.com/fs-node-utils": { + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-utils/-/fs-node-utils-4.57.2.tgz", + "integrity": "sha512-rsPSJgekz43IlNbLyAM/Ab+ouYLWGp5DDBfYBNNEqDaSpsbXfthBn29Q4muFA9L0F+Z3mKo+CWlgSCXrf+mOyQ==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-node-builtins": "4.57.2" + }, "engines": { - "node": ">=12" + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "node_modules/@jsonjoy.com/fs-print": { + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-print/-/fs-print-4.57.2.tgz", + "integrity": "sha512-wK9NSow48i4DbDl9F1CQE5TqnyZOJ04elU3WFG5aJ76p+YxO/ulyBBQvKsessPxdo381Bc2pcEoyPujMOhcRqQ==", "dev": true, - "license": "ISC", + "license": "Apache-2.0", "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + "@jsonjoy.com/fs-node-utils": "4.57.2", + "tree-dump": "^1.1.0" }, "engines": { - "node": ">=12" + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "node_modules/@jsonjoy.com/fs-snapshot": { + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-snapshot/-/fs-snapshot-4.57.2.tgz", + "integrity": "sha512-GdduDZuoP5V/QCgJkx9+BZ6SC0EZ/smXAdTS7PfMqgMTGXLlt/bH/FqMYaqB9JmLf05sJPtO0XRbAwwkEEPbVw==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/buffers": "^17.65.0", + "@jsonjoy.com/fs-node-utils": "4.57.2", + "@jsonjoy.com/json-pack": "^17.65.0", + "@jsonjoy.com/util": "^17.65.0" + }, "engines": { - "node": ">=12" + "node": ">=10.0" }, "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/base64": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-17.67.0.tgz", + "integrity": "sha512-5SEsJGsm15aP8TQGkDfJvz9axgPwAEm98S5DxOuYe8e1EbfajcDmgeXXzccEjh+mLnjqEKrkBdjHWS5vFNwDdw==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "engines": { - "node": ">=12" + "node": ">=10.0" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/codegen": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-17.67.0.tgz", + "integrity": "sha512-idnkUplROpdBOV0HMcwhsCUS5TRUi9poagdGs70A6S4ux9+/aPuKbh8+UYRTLYQHtXvAdNfQWXDqZEx5k4Dj2Q==", "dev": true, - "license": "MIT" + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pack": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-17.67.0.tgz", + "integrity": "sha512-t0ejURcGaZsn1ClbJ/3kFqSOjlryd92eQY465IYrezsXmPcfHPE/av4twRSxf6WE+TkZgLY+71vCZbiIiFKA/w==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" + "@jsonjoy.com/base64": "17.67.0", + "@jsonjoy.com/buffers": "17.67.0", + "@jsonjoy.com/codegen": "17.67.0", + "@jsonjoy.com/json-pointer": "17.67.0", + "@jsonjoy.com/util": "17.67.0", + "hyperdyperid": "^1.2.0", + "thingies": "^2.5.0", + "tree-dump": "^1.1.0" }, "engines": { - "node": ">=12" + "node": ">=10.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pointer": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-17.67.0.tgz", + "integrity": "sha512-+iqOFInH+QZGmSuaybBUNdh7yvNrXvqR+h3wjXm0N/3JK1EyyFAeGJvqnmQL61d1ARLlk/wJdFKSL+LHJ1eaUA==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "ansi-regex": "^6.2.2" + "@jsonjoy.com/util": "17.67.0" }, "engines": { - "node": ">=12" + "node": ">=10.0" }, "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/util": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-17.67.0.tgz", + "integrity": "sha512-6+8xBaz1rLSohlGh68D1pdw3AwDi9xydm8QNlAFkvnavCJYSze+pxoW2VKP8p308jtlMRLs5NTHfPlZLd4w7ew==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" + "@jsonjoy.com/buffers": "17.67.0", + "@jsonjoy.com/codegen": "17.67.0" }, "engines": { - "node": ">=12" + "node": ">=10.0" }, "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "node_modules/@jsonjoy.com/json-pack": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.21.0.tgz", + "integrity": "sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==", "dev": true, - "license": "ISC", + "license": "Apache-2.0", "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" + "@jsonjoy.com/base64": "^1.1.2", + "@jsonjoy.com/buffers": "^1.2.0", + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/json-pointer": "^1.0.2", + "@jsonjoy.com/util": "^1.9.0", + "hyperdyperid": "^1.2.0", + "thingies": "^2.5.0", + "tree-dump": "^1.1.0" }, "engines": { - "node": ">=8" + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.6.tgz", - "integrity": "sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==", + "node_modules/@jsonjoy.com/json-pack/node_modules/@jsonjoy.com/buffers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", + "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "engines": { - "node": ">=8" + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "node_modules/@jsonjoy.com/json-pointer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-1.0.2.tgz", + "integrity": "sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/util": "^1.9.0" + }, "engines": { - "node": ">=6.0.0" + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.11", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", - "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "node_modules/@jsonjoy.com/util": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.9.0.tgz", + "integrity": "sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" + "@jsonjoy.com/buffers": "^1.0.0", + "@jsonjoy.com/codegen": "^1.0.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "node_modules/@jsonjoy.com/util/node_modules/@jsonjoy.com/buffers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", + "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, "node_modules/@kyleshockey/object-assign-deep": { @@ -3532,837 +4797,552 @@ "dev": true, "license": "MIT" }, - "node_modules/@ljharb/through": { - "version": "2.3.14", - "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.14.tgz", - "integrity": "sha512-ajBvlKpWucBB17FuQYUShqpqy8GRgYEpJW0vWJbUu1CV9lWyrDCapy0lScU8T8Z6qn49sSwJB3+M+evYIdGg+A==", + "node_modules/@listr2/prompt-adapter-inquirer": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-2.0.18.tgz", + "integrity": "sha512-0hz44rAcrphyXcA8IS7EJ2SCoaBZD2u5goE8S/e+q/DL+dOGpqpcLidVOFeLG3VgML62SXmfRLAhWt0zL1oW4Q==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8" + "@inquirer/type": "^1.5.5" }, "engines": { - "node": ">= 0.4" - } - }, - "node_modules/@material/animation": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/animation/-/animation-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-1GSJaPKef+7HRuV+HusVZHps64cmZuOItDbt40tjJVaikcaZvwmHlcTxRIqzcRoCdt5ZKHh3NoO7GB9Khg4Jnw==", - "license": "MIT", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@material/auto-init": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/auto-init/-/auto-init-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-t7ZGpRJ3ec0QDUO0nJu/SMgLW7qcuG2KqIsEYD1Ej8qhI2xpdR2ydSDQOkVEitXmKoGol1oq4nYSBjTlB65GqA==", - "license": "MIT", - "dependencies": { - "@material/base": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/banner": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/banner/-/banner-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-g9wBUZzYBizyBcBQXTIafnRUUPi7efU9gPJfzeGgkynXiccP/vh5XMmH+PBxl5v+4MlP/d4cZ2NUYoAN7UTqSA==", - "license": "MIT", - "dependencies": { - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/button": "15.0.0-canary.7f224ddd4.0", - "@material/dom": "15.0.0-canary.7f224ddd4.0", - "@material/elevation": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/ripple": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/shape": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "@material/tokens": "15.0.0-canary.7f224ddd4.0", - "@material/typography": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/base": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/base/-/base-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-I9KQOKXpLfJkP8MqZyr8wZIzdPHrwPjFvGd9zSK91/vPyE4hzHRJc/0njsh9g8Lm9PRYLbifXX+719uTbHxx+A==", - "license": "MIT", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@material/button": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/button/-/button-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-BHB7iyHgRVH+JF16+iscR+Qaic+p7LU1FOLgP8KucRlpF9tTwIxQA6mJwGRi5gUtcG+vyCmzVS+hIQ6DqT/7BA==", - "license": "MIT", - "dependencies": { - "@material/density": "15.0.0-canary.7f224ddd4.0", - "@material/dom": "15.0.0-canary.7f224ddd4.0", - "@material/elevation": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/focus-ring": "15.0.0-canary.7f224ddd4.0", - "@material/ripple": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/shape": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "@material/tokens": "15.0.0-canary.7f224ddd4.0", - "@material/touch-target": "15.0.0-canary.7f224ddd4.0", - "@material/typography": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/card": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/card/-/card-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-kt7y9/IWOtJTr3Z/AoWJT3ZLN7CLlzXhx2udCLP9ootZU2bfGK0lzNwmo80bv/pJfrY9ihQKCtuGTtNxUy+vIw==", - "license": "MIT", - "dependencies": { - "@material/dom": "15.0.0-canary.7f224ddd4.0", - "@material/elevation": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/ripple": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/shape": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "@material/tokens": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/checkbox": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/checkbox/-/checkbox-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-rURcrL5O1u6hzWR+dNgiQ/n89vk6tdmdP3mZgnxJx61q4I/k1yijKqNJSLrkXH7Rto3bM5NRKMOlgvMvVd7UMQ==", - "license": "MIT", - "dependencies": { - "@material/animation": "15.0.0-canary.7f224ddd4.0", - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/density": "15.0.0-canary.7f224ddd4.0", - "@material/dom": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/focus-ring": "15.0.0-canary.7f224ddd4.0", - "@material/ripple": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "@material/touch-target": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/chips": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/chips/-/chips-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-AYAivV3GSk/T/nRIpH27sOHFPaSMrE3L0WYbnb5Wa93FgY8a0fbsFYtSH2QmtwnzXveg+B1zGTt7/xIIcynKdQ==", - "license": "MIT", - "dependencies": { - "@material/animation": "15.0.0-canary.7f224ddd4.0", - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/checkbox": "15.0.0-canary.7f224ddd4.0", - "@material/density": "15.0.0-canary.7f224ddd4.0", - "@material/dom": "15.0.0-canary.7f224ddd4.0", - "@material/elevation": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/focus-ring": "15.0.0-canary.7f224ddd4.0", - "@material/ripple": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/shape": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "@material/tokens": "15.0.0-canary.7f224ddd4.0", - "@material/touch-target": "15.0.0-canary.7f224ddd4.0", - "@material/typography": "15.0.0-canary.7f224ddd4.0", - "safevalues": "^0.3.4", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/circular-progress": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/circular-progress/-/circular-progress-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-DJrqCKb+LuGtjNvKl8XigvyK02y36GRkfhMUYTcJEi3PrOE00bwXtyj7ilhzEVshQiXg6AHGWXtf5UqwNrx3Ow==", - "license": "MIT", - "dependencies": { - "@material/animation": "15.0.0-canary.7f224ddd4.0", - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/dom": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/progress-indicator": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/data-table": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/data-table/-/data-table-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-/2WZsuBIq9z9RWYF5Jo6b7P6u0fwit+29/mN7rmAZ6akqUR54nXyNfoSNiyydMkzPlZZsep5KrSHododDhBZbA==", - "license": "MIT", - "dependencies": { - "@material/animation": "15.0.0-canary.7f224ddd4.0", - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/checkbox": "15.0.0-canary.7f224ddd4.0", - "@material/density": "15.0.0-canary.7f224ddd4.0", - "@material/dom": "15.0.0-canary.7f224ddd4.0", - "@material/elevation": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/icon-button": "15.0.0-canary.7f224ddd4.0", - "@material/linear-progress": "15.0.0-canary.7f224ddd4.0", - "@material/list": "15.0.0-canary.7f224ddd4.0", - "@material/menu": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/select": "15.0.0-canary.7f224ddd4.0", - "@material/shape": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "@material/tokens": "15.0.0-canary.7f224ddd4.0", - "@material/touch-target": "15.0.0-canary.7f224ddd4.0", - "@material/typography": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/density": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/density/-/density-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-o9EXmGKVpiQ6mHhyV3oDDzc78Ow3E7v8dlaOhgaDSXgmqaE8v5sIlLNa/LKSyUga83/fpGk3QViSGXotpQx0jA==", - "license": "MIT", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@material/dialog": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/dialog/-/dialog-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-u0XpTlv1JqWC/bQ3DavJ1JguofTelLT2wloj59l3/1b60jv42JQ6Am7jU3I8/SIUB1MKaW7dYocXjDWtWJakLA==", - "license": "MIT", - "dependencies": { - "@material/animation": "15.0.0-canary.7f224ddd4.0", - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/button": "15.0.0-canary.7f224ddd4.0", - "@material/dom": "15.0.0-canary.7f224ddd4.0", - "@material/elevation": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/icon-button": "15.0.0-canary.7f224ddd4.0", - "@material/ripple": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/shape": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "@material/tokens": "15.0.0-canary.7f224ddd4.0", - "@material/touch-target": "15.0.0-canary.7f224ddd4.0", - "@material/typography": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/dom": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/dom/-/dom-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-mQ1HT186GPQSkRg5S18i70typ5ZytfjL09R0gJ2Qg5/G+MLCGi7TAjZZSH65tuD/QGOjel4rDdWOTmYbPYV6HA==", - "license": "MIT", - "dependencies": { - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/drawer": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/drawer/-/drawer-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-qyO0W0KBftfH8dlLR0gVAgv7ZHNvU8ae11Ao6zJif/YxcvK4+gph1z8AO4H410YmC2kZiwpSKyxM1iQCCzbb4g==", - "license": "MIT", - "dependencies": { - "@material/animation": "15.0.0-canary.7f224ddd4.0", - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/dom": "15.0.0-canary.7f224ddd4.0", - "@material/elevation": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/list": "15.0.0-canary.7f224ddd4.0", - "@material/ripple": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/shape": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "@material/typography": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" + "node": ">=18.0.0" + }, + "peerDependencies": { + "@inquirer/prompts": ">= 3 < 8" } }, - "node_modules/@material/elevation": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/elevation/-/elevation-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-tV6s4/pUBECedaI36Yj18KmRCk1vfue/JP/5yYRlFNnLMRVISePbZaKkn/BHXVf+26I3W879+XqIGlDVdmOoMA==", + "node_modules/@listr2/prompt-adapter-inquirer/node_modules/@inquirer/type": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.5.tgz", + "integrity": "sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==", + "dev": true, "license": "MIT", "dependencies": { - "@material/animation": "15.0.0-canary.7f224ddd4.0", - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/fab": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/fab/-/fab-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-4h76QrzfZTcPdd+awDPZ4Q0YdSqsXQnS540TPtyXUJ/5G99V6VwGpjMPIxAsW0y+pmI9UkLL/srrMaJec+7r4Q==", - "license": "MIT", - "dependencies": { - "@material/animation": "15.0.0-canary.7f224ddd4.0", - "@material/dom": "15.0.0-canary.7f224ddd4.0", - "@material/elevation": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/focus-ring": "15.0.0-canary.7f224ddd4.0", - "@material/ripple": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/shape": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "@material/tokens": "15.0.0-canary.7f224ddd4.0", - "@material/touch-target": "15.0.0-canary.7f224ddd4.0", - "@material/typography": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" + "mute-stream": "^1.0.0" + }, + "engines": { + "node": ">=18" } }, - "node_modules/@material/feature-targeting": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-SAjtxYh6YlKZriU83diDEQ7jNSP2MnxKsER0TvFeyG1vX/DWsUyYDOIJTOEa9K1N+fgJEBkNK8hY55QhQaspew==", - "license": "MIT", - "dependencies": { - "tslib": "^2.1.0" + "node_modules/@listr2/prompt-adapter-inquirer/node_modules/mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@material/floating-label": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/floating-label/-/floating-label-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-0KMo5ijjYaEHPiZ2pCVIcbaTS2LycvH9zEhEMKwPPGssBCX7iz5ffYQFk7e5yrQand1r3jnQQgYfHAwtykArnQ==", + "node_modules/@lmdb/lmdb-darwin-arm64": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.2.6.tgz", + "integrity": "sha512-yF/ih9EJJZc72psFQbwnn8mExIWfTnzWJg+N02hnpXtDPETYLmQswIMBn7+V88lfCaFrMozJsUvcEQIkEPU0Gg==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@material/animation": "15.0.0-canary.7f224ddd4.0", - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/dom": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "@material/typography": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@material/focus-ring": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/focus-ring/-/focus-ring-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-Jmg1nltq4J6S6A10EGMZnvufrvU3YTi+8R8ZD9lkSbun0Fm2TVdICQt/Auyi6An9zP66oQN6c31eqO6KfIPsDg==", + "node_modules/@lmdb/lmdb-darwin-x64": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.2.6.tgz", + "integrity": "sha512-5BbCumsFLbCi586Bb1lTWQFkekdQUw8/t8cy++Uq251cl3hbDIGEwD9HAwh8H6IS2F6QA9KdKmO136LmipRNkg==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@material/dom": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0" - } + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@material/form-field": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/form-field/-/form-field-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-fEPWgDQEPJ6WF7hNnIStxucHR9LE4DoDSMqCsGWS2Yu+NLZYLuCEecgR0UqQsl1EQdNRaFh8VH93KuxGd2hiPg==", + "node_modules/@lmdb/lmdb-linux-arm": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.2.6.tgz", + "integrity": "sha512-+6XgLpMb7HBoWxXj+bLbiiB4s0mRRcDPElnRS3LpWRzdYSe+gFk5MT/4RrVNqd2MESUDmb53NUXw1+BP69bjiQ==", + "cpu": [ + "arm" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/ripple": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "@material/typography": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@material/icon-button": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/icon-button/-/icon-button-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-DcK7IL4ICY/DW+48YQZZs9g0U1kRaW0Wb0BxhvppDMYziHo/CTpFdle4gjyuTyRxPOdHQz5a97ru48Z9O4muTw==", + "node_modules/@lmdb/lmdb-linux-arm64": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.2.6.tgz", + "integrity": "sha512-l5VmJamJ3nyMmeD1ANBQCQqy7do1ESaJQfKPSm2IG9/ADZryptTyCj8N6QaYgIWewqNUrcbdMkJajRQAt5Qjfg==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/density": "15.0.0-canary.7f224ddd4.0", - "@material/dom": "15.0.0-canary.7f224ddd4.0", - "@material/elevation": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/focus-ring": "15.0.0-canary.7f224ddd4.0", - "@material/ripple": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "@material/touch-target": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@material/image-list": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/image-list/-/image-list-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-voMjG2p80XbjL1B2lmF65zO5gEgJOVKClLdqh4wbYzYfwY/SR9c8eLvlYG7DLdFaFBl/7gGxD8TvvZ329HUFPw==", + "node_modules/@lmdb/lmdb-linux-x64": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.2.6.tgz", + "integrity": "sha512-nDYT8qN9si5+onHYYaI4DiauDMx24OAiuZAUsEqrDy+ja/3EbpXPX/VAkMV8AEaQhy3xc4dRC+KcYIvOFefJ4Q==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/shape": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "@material/typography": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@material/layout-grid": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/layout-grid/-/layout-grid-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-veDABLxMn2RmvfnUO2RUmC1OFfWr4cU+MrxKPoDD2hl3l3eDYv5fxws6r5T1JoSyXoaN+oEZpheS0+M9Ure8Pg==", + "node_modules/@lmdb/lmdb-win32-x64": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.2.6.tgz", + "integrity": "sha512-XlqVtILonQnG+9fH2N3Aytria7P/1fwDgDhl29rde96uH2sLB8CHORIf2PfuLVzFQJ7Uqp8py9AYwr3ZUCFfWg==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "tslib": "^2.1.0" - } + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@material/line-ripple": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/line-ripple/-/line-ripple-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-f60hVJhIU6I3/17Tqqzch1emUKEcfVVgHVqADbU14JD+oEIz429ZX9ksZ3VChoU3+eejFl+jVdZMLE/LrAuwpg==", + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { + "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==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@material/animation": "15.0.0-canary.7f224ddd4.0", - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@material/linear-progress": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/linear-progress/-/linear-progress-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-pRDEwPQielDiC9Sc5XhCXrGxP8wWOnAO8sQlMebfBYHYqy5hhiIzibezS8CSaW4MFQFyXmCmpmqWlbqGYRmiyg==", + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz", + "integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@material/animation": "15.0.0-canary.7f224ddd4.0", - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/dom": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/progress-indicator": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@material/list": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/list/-/list-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-Is0NV91sJlXF5pOebYAtWLF4wU2MJDbYqztML/zQNENkQxDOvEXu3nWNb3YScMIYJJXvARO0Liur5K4yPagS1Q==", + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz", + "integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==", + "cpu": [ + "arm" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/density": "15.0.0-canary.7f224ddd4.0", - "@material/dom": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/ripple": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/shape": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "@material/tokens": "15.0.0-canary.7f224ddd4.0", - "@material/typography": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@material/menu": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/menu/-/menu-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-D11QU1dXqLbh5X1zKlEhS3QWh0b5BPNXlafc5MXfkdJHhOiieb7LC9hMJhbrHtj24FadJ7evaFW/T2ugJbJNnQ==", + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz", + "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/dom": "15.0.0-canary.7f224ddd4.0", - "@material/elevation": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/list": "15.0.0-canary.7f224ddd4.0", - "@material/menu-surface": "15.0.0-canary.7f224ddd4.0", - "@material/ripple": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/shape": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "@material/tokens": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@material/menu-surface": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/menu-surface/-/menu-surface-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-7RZHvw0gbwppaAJ/Oh5SWmfAKJ62aw1IMB3+3MRwsb5PLoV666wInYa+zJfE4i7qBeOn904xqT2Nko5hY0ssrg==", + "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz", + "integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@material/animation": "15.0.0-canary.7f224ddd4.0", - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/elevation": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/shape": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@material/notched-outline": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/notched-outline/-/notched-outline-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-Yg2usuKB2DKlKIBISbie9BFsOVuffF71xjbxPbybvqemxqUBd+bD5/t6H1fLE+F8/NCu5JMigho4ewUU+0RCiw==", + "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz", + "integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/floating-label": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/shape": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@material/progress-indicator": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/progress-indicator/-/progress-indicator-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-UPbDjE5CqT+SqTs0mNFG6uFEw7wBlgYmh+noSkQ6ty/EURm8lF125dmi4dv4kW0+octonMXqkGtAoZwLIHKf/w==", + "node_modules/@napi-rs/nice": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice/-/nice-1.1.1.tgz", + "integrity": "sha512-xJIPs+bYuc9ASBl+cvGsKbGrJmS6fAKaSZCnT0lhahT5rhA2VVy9/EcIgd2JhtEuFOJNx7UHNn/qiTPTY4nrQw==", + "dev": true, "license": "MIT", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@material/radio": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/radio/-/radio-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-wR1X0Sr0KmQLu6+YOFKAI84G3L6psqd7Kys5kfb8WKBM36zxO5HQXC5nJm/Y0rdn22ixzsIz2GBo0MNU4V4k1A==", + "optional": true, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "optionalDependencies": { + "@napi-rs/nice-android-arm-eabi": "1.1.1", + "@napi-rs/nice-android-arm64": "1.1.1", + "@napi-rs/nice-darwin-arm64": "1.1.1", + "@napi-rs/nice-darwin-x64": "1.1.1", + "@napi-rs/nice-freebsd-x64": "1.1.1", + "@napi-rs/nice-linux-arm-gnueabihf": "1.1.1", + "@napi-rs/nice-linux-arm64-gnu": "1.1.1", + "@napi-rs/nice-linux-arm64-musl": "1.1.1", + "@napi-rs/nice-linux-ppc64-gnu": "1.1.1", + "@napi-rs/nice-linux-riscv64-gnu": "1.1.1", + "@napi-rs/nice-linux-s390x-gnu": "1.1.1", + "@napi-rs/nice-linux-x64-gnu": "1.1.1", + "@napi-rs/nice-linux-x64-musl": "1.1.1", + "@napi-rs/nice-openharmony-arm64": "1.1.1", + "@napi-rs/nice-win32-arm64-msvc": "1.1.1", + "@napi-rs/nice-win32-ia32-msvc": "1.1.1", + "@napi-rs/nice-win32-x64-msvc": "1.1.1" + } + }, + "node_modules/@napi-rs/nice-android-arm-eabi": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm-eabi/-/nice-android-arm-eabi-1.1.1.tgz", + "integrity": "sha512-kjirL3N6TnRPv5iuHw36wnucNqXAO46dzK9oPb0wj076R5Xm8PfUVA9nAFB5ZNMmfJQJVKACAPd/Z2KYMppthw==", + "cpu": [ + "arm" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@material/animation": "15.0.0-canary.7f224ddd4.0", - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/density": "15.0.0-canary.7f224ddd4.0", - "@material/dom": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/focus-ring": "15.0.0-canary.7f224ddd4.0", - "@material/ripple": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "@material/touch-target": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" } }, - "node_modules/@material/ripple": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-JqOsWM1f4aGdotP0rh1vZlPZTg6lZgh39FIYHFMfOwfhR+LAikUJ+37ciqZuewgzXB6iiRO6a8aUH6HR5SJYPg==", + "node_modules/@napi-rs/nice-android-arm64": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm64/-/nice-android-arm64-1.1.1.tgz", + "integrity": "sha512-blG0i7dXgbInN5urONoUCNf+DUEAavRffrO7fZSeoRMJc5qD+BJeNcpr54msPF6qfDD6kzs9AQJogZvT2KD5nw==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@material/animation": "15.0.0-canary.7f224ddd4.0", - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/dom": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" } }, - "node_modules/@material/rtl": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-UVf14qAtmPiaaZjuJtmN36HETyoKWmsZM/qn1L5ciR2URb8O035dFWnz4ZWFMmAYBno/L7JiZaCkPurv2ZNrGA==", + "node_modules/@napi-rs/nice-darwin-arm64": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-arm64/-/nice-darwin-arm64-1.1.1.tgz", + "integrity": "sha512-s/E7w45NaLqTGuOjC2p96pct4jRfo61xb9bU1unM/MJ/RFkKlJyJDx7OJI/O0ll/hrfpqKopuAFDV8yo0hfT7A==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" } }, - "node_modules/@material/segmented-button": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/segmented-button/-/segmented-button-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-LCnVRUSAhELTKI/9hSvyvIvQIpPpqF29BV+O9yM4WoNNmNWqTulvuiv7grHZl6Z+kJuxSg4BGbsPxxb9dXozPg==", + "node_modules/@napi-rs/nice-darwin-x64": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-x64/-/nice-darwin-x64-1.1.1.tgz", + "integrity": "sha512-dGoEBnVpsdcC+oHHmW1LRK5eiyzLwdgNQq3BmZIav+9/5WTZwBYX7r5ZkQC07Nxd3KHOCkgbHSh4wPkH1N1LiQ==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/elevation": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/ripple": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "@material/touch-target": "15.0.0-canary.7f224ddd4.0", - "@material/typography": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/select": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/select/-/select-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-WioZtQEXRpglum0cMSzSqocnhsGRr+ZIhvKb3FlaNrTaK8H3Y4QA7rVjv3emRtrLOOjaT6/RiIaUMTo9AGzWQQ==", - "license": "MIT", - "dependencies": { - "@material/animation": "15.0.0-canary.7f224ddd4.0", - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/density": "15.0.0-canary.7f224ddd4.0", - "@material/dom": "15.0.0-canary.7f224ddd4.0", - "@material/elevation": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/floating-label": "15.0.0-canary.7f224ddd4.0", - "@material/line-ripple": "15.0.0-canary.7f224ddd4.0", - "@material/list": "15.0.0-canary.7f224ddd4.0", - "@material/menu": "15.0.0-canary.7f224ddd4.0", - "@material/menu-surface": "15.0.0-canary.7f224ddd4.0", - "@material/notched-outline": "15.0.0-canary.7f224ddd4.0", - "@material/ripple": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/shape": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "@material/tokens": "15.0.0-canary.7f224ddd4.0", - "@material/typography": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" } }, - "node_modules/@material/shape": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/shape/-/shape-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-8z8l1W3+cymObunJoRhwFPKZ+FyECfJ4MJykNiaZq7XJFZkV6xNmqAVrrbQj93FtLsECn9g4PjjIomguVn/OEw==", + "node_modules/@napi-rs/nice-freebsd-x64": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-freebsd-x64/-/nice-freebsd-x64-1.1.1.tgz", + "integrity": "sha512-kHv4kEHAylMYmlNwcQcDtXjklYp4FCf0b05E+0h6nDHsZ+F0bDe04U/tXNOqrx5CmIAth4vwfkjjUmp4c4JktQ==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" } }, - "node_modules/@material/slider": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/slider/-/slider-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-QU/WSaSWlLKQRqOhJrPgm29wqvvzRusMqwAcrCh1JTrCl+xwJ43q5WLDfjYhubeKtrEEgGu9tekkAiYfMG7EBw==", + "node_modules/@napi-rs/nice-linux-arm-gnueabihf": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm-gnueabihf/-/nice-linux-arm-gnueabihf-1.1.1.tgz", + "integrity": "sha512-E1t7K0efyKXZDoZg1LzCOLxgolxV58HCkaEkEvIYQx12ht2pa8hoBo+4OB3qh7e+QiBlp1SRf+voWUZFxyhyqg==", + "cpu": [ + "arm" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@material/animation": "15.0.0-canary.7f224ddd4.0", - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/dom": "15.0.0-canary.7f224ddd4.0", - "@material/elevation": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/ripple": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "@material/tokens": "15.0.0-canary.7f224ddd4.0", - "@material/typography": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/snackbar": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/snackbar/-/snackbar-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-sm7EbVKddaXpT/aXAYBdPoN0k8yeg9+dprgBUkrdqGzWJAeCkxb4fv2B3He88YiCtvkTz2KLY4CThPQBSEsMFQ==", - "license": "MIT", - "dependencies": { - "@material/animation": "15.0.0-canary.7f224ddd4.0", - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/button": "15.0.0-canary.7f224ddd4.0", - "@material/dom": "15.0.0-canary.7f224ddd4.0", - "@material/elevation": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/icon-button": "15.0.0-canary.7f224ddd4.0", - "@material/ripple": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/shape": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "@material/tokens": "15.0.0-canary.7f224ddd4.0", - "@material/typography": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/switch": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/switch/-/switch-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-lEDJfRvkVyyeHWIBfoxYjJVl+WlEAE2kZ/+6OqB1FW0OV8ftTODZGhHRSzjVBA1/p4FPuhAtKtoK9jTpa4AZjA==", - "license": "MIT", - "dependencies": { - "@material/animation": "15.0.0-canary.7f224ddd4.0", - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/density": "15.0.0-canary.7f224ddd4.0", - "@material/dom": "15.0.0-canary.7f224ddd4.0", - "@material/elevation": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/focus-ring": "15.0.0-canary.7f224ddd4.0", - "@material/ripple": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/shape": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "@material/tokens": "15.0.0-canary.7f224ddd4.0", - "safevalues": "^0.3.4", - "tslib": "^2.1.0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" } }, - "node_modules/@material/tab": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/tab/-/tab-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-E1xGACImyCLurhnizyOTCgOiVezce4HlBFAI6YhJo/AyVwjN2Dtas4ZLQMvvWWqpyhITNkeYdOchwCC1mrz3AQ==", + "node_modules/@napi-rs/nice-linux-arm64-gnu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-gnu/-/nice-linux-arm64-gnu-1.1.1.tgz", + "integrity": "sha512-CIKLA12DTIZlmTaaKhQP88R3Xao+gyJxNWEn04wZwC2wmRapNnxCUZkVwggInMJvtVElA+D4ZzOU5sX4jV+SmQ==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/elevation": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/focus-ring": "15.0.0-canary.7f224ddd4.0", - "@material/ripple": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/tab-indicator": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "@material/tokens": "15.0.0-canary.7f224ddd4.0", - "@material/typography": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" } }, - "node_modules/@material/tab-bar": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/tab-bar/-/tab-bar-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-p1Asb2NzrcECvAQU3b2SYrpyJGyJLQWR+nXTYzDKE8WOpLIRCXap2audNqD7fvN/A20UJ1J8U01ptrvCkwJ4eA==", + "node_modules/@napi-rs/nice-linux-arm64-musl": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-musl/-/nice-linux-arm64-musl-1.1.1.tgz", + "integrity": "sha512-+2Rzdb3nTIYZ0YJF43qf2twhqOCkiSrHx2Pg6DJaCPYhhaxbLcdlV8hCRMHghQ+EtZQWGNcS2xF4KxBhSGeutg==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@material/animation": "15.0.0-canary.7f224ddd4.0", - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/density": "15.0.0-canary.7f224ddd4.0", - "@material/elevation": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/tab": "15.0.0-canary.7f224ddd4.0", - "@material/tab-indicator": "15.0.0-canary.7f224ddd4.0", - "@material/tab-scroller": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "@material/tokens": "15.0.0-canary.7f224ddd4.0", - "@material/typography": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" } }, - "node_modules/@material/tab-indicator": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/tab-indicator/-/tab-indicator-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-h9Td3MPqbs33spcPS7ecByRHraYgU4tNCZpZzZXw31RypjKvISDv/PS5wcA4RmWqNGih78T7xg4QIGsZg4Pk4w==", + "node_modules/@napi-rs/nice-linux-ppc64-gnu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-ppc64-gnu/-/nice-linux-ppc64-gnu-1.1.1.tgz", + "integrity": "sha512-4FS8oc0GeHpwvv4tKciKkw3Y4jKsL7FRhaOeiPei0X9T4Jd619wHNe4xCLmN2EMgZoeGg+Q7GY7BsvwKpL22Tg==", + "cpu": [ + "ppc64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@material/animation": "15.0.0-canary.7f224ddd4.0", - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" } }, - "node_modules/@material/tab-scroller": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/tab-scroller/-/tab-scroller-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-LFeYNjQpdXecwECd8UaqHYbhscDCwhGln5Yh+3ctvcEgvmDPNjhKn/DL3sWprWvG8NAhP6sHMrsGhQFVdCWtTg==", + "node_modules/@napi-rs/nice-linux-riscv64-gnu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-riscv64-gnu/-/nice-linux-riscv64-gnu-1.1.1.tgz", + "integrity": "sha512-HU0nw9uD4FO/oGCCk409tCi5IzIZpH2agE6nN4fqpwVlCn5BOq0MS1dXGjXaG17JaAvrlpV5ZeyZwSon10XOXw==", + "cpu": [ + "riscv64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@material/animation": "15.0.0-canary.7f224ddd4.0", - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/dom": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/tab": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" } }, - "node_modules/@material/textfield": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/textfield/-/textfield-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-AExmFvgE5nNF0UA4l2cSzPghtxSUQeeoyRjFLHLy+oAaE4eKZFrSy0zEpqPeWPQpEMDZk+6Y+6T3cOFYBeSvsw==", - "license": "MIT", - "dependencies": { - "@material/animation": "15.0.0-canary.7f224ddd4.0", - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/density": "15.0.0-canary.7f224ddd4.0", - "@material/dom": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/floating-label": "15.0.0-canary.7f224ddd4.0", - "@material/line-ripple": "15.0.0-canary.7f224ddd4.0", - "@material/notched-outline": "15.0.0-canary.7f224ddd4.0", - "@material/ripple": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/shape": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "@material/tokens": "15.0.0-canary.7f224ddd4.0", - "@material/typography": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" + "node_modules/@napi-rs/nice-linux-s390x-gnu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-s390x-gnu/-/nice-linux-s390x-gnu-1.1.1.tgz", + "integrity": "sha512-2YqKJWWl24EwrX0DzCQgPLKQBxYDdBxOHot1KWEq7aY2uYeX+Uvtv4I8xFVVygJDgf6/92h9N3Y43WPx8+PAgQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" } }, - "node_modules/@material/theme": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/theme/-/theme-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-hs45hJoE9yVnoVOcsN1jklyOa51U4lzWsEnQEuJTPOk2+0HqCQ0yv/q0InpSnm2i69fNSyZC60+8HADZGF8ugQ==", + "node_modules/@napi-rs/nice-linux-x64-gnu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-gnu/-/nice-linux-x64-gnu-1.1.1.tgz", + "integrity": "sha512-/gaNz3R92t+dcrfCw/96pDopcmec7oCcAQ3l/M+Zxr82KT4DljD37CpgrnXV+pJC263JkW572pdbP3hP+KjcIg==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" } }, - "node_modules/@material/tokens": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/tokens/-/tokens-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-r9TDoicmcT7FhUXC4eYMFnt9TZsz0G8T3wXvkKncLppYvZ517gPyD/1+yhuGfGOxAzxTrM66S/oEc1fFE2q4hw==", + "node_modules/@napi-rs/nice-linux-x64-musl": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-musl/-/nice-linux-x64-musl-1.1.1.tgz", + "integrity": "sha512-xScCGnyj/oppsNPMnevsBe3pvNaoK7FGvMjT35riz9YdhB2WtTG47ZlbxtOLpjeO9SqqQ2J2igCmz6IJOD5JYw==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@material/elevation": "15.0.0-canary.7f224ddd4.0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" } }, - "node_modules/@material/tooltip": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/tooltip/-/tooltip-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-8qNk3pmPLTnam3XYC1sZuplQXW9xLn4Z4MI3D+U17Q7pfNZfoOugGr+d2cLA9yWAEjVJYB0mj8Yu86+udo4N9w==", + "node_modules/@napi-rs/nice-openharmony-arm64": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-openharmony-arm64/-/nice-openharmony-arm64-1.1.1.tgz", + "integrity": "sha512-6uJPRVwVCLDeoOaNyeiW0gp2kFIM4r7PL2MczdZQHkFi9gVlgm+Vn+V6nTWRcu856mJ2WjYJiumEajfSm7arPQ==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@material/animation": "15.0.0-canary.7f224ddd4.0", - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/button": "15.0.0-canary.7f224ddd4.0", - "@material/dom": "15.0.0-canary.7f224ddd4.0", - "@material/elevation": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/shape": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "@material/tokens": "15.0.0-canary.7f224ddd4.0", - "@material/typography": "15.0.0-canary.7f224ddd4.0", - "safevalues": "^0.3.4", - "tslib": "^2.1.0" + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">= 10" } }, - "node_modules/@material/top-app-bar": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/top-app-bar/-/top-app-bar-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-SARR5/ClYT4CLe9qAXakbr0i0cMY0V3V4pe3ElIJPfL2Z2c4wGR1mTR8m2LxU1MfGKK8aRoUdtfKaxWejp+eNA==", + "node_modules/@napi-rs/nice-win32-arm64-msvc": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-arm64-msvc/-/nice-win32-arm64-msvc-1.1.1.tgz", + "integrity": "sha512-uoTb4eAvM5B2aj/z8j+Nv8OttPf2m+HVx3UjA5jcFxASvNhQriyCQF1OB1lHL43ZhW+VwZlgvjmP5qF3+59atA==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@material/animation": "15.0.0-canary.7f224ddd4.0", - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/elevation": "15.0.0-canary.7f224ddd4.0", - "@material/ripple": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/shape": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "@material/typography": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" } }, - "node_modules/@material/touch-target": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/touch-target/-/touch-target-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-BJo/wFKHPYLGsRaIpd7vsQwKr02LtO2e89Psv0on/p0OephlNIgeB9dD9W+bQmaeZsZ6liKSKRl6wJWDiK71PA==", + "node_modules/@napi-rs/nice-win32-ia32-msvc": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-ia32-msvc/-/nice-win32-ia32-msvc-1.1.1.tgz", + "integrity": "sha512-CNQqlQT9MwuCsg1Vd/oKXiuH+TcsSPJmlAFc5frFyX/KkOh0UpBLEj7aoY656d5UKZQMQFP7vJNa1DNUNORvug==", + "cpu": [ + "ia32" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@material/base": "15.0.0-canary.7f224ddd4.0", - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/rtl": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" } }, - "node_modules/@material/typography": { - "version": "15.0.0-canary.7f224ddd4.0", - "resolved": "https://registry.npmjs.org/@material/typography/-/typography-15.0.0-canary.7f224ddd4.0.tgz", - "integrity": "sha512-kBaZeCGD50iq1DeRRH5OM5Jl7Gdk+/NOfKArkY4ksBZvJiStJ7ACAhpvb8MEGm4s3jvDInQFLsDq3hL+SA79sQ==", + "node_modules/@napi-rs/nice-win32-x64-msvc": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-x64-msvc/-/nice-win32-x64-msvc-1.1.1.tgz", + "integrity": "sha512-vB+4G/jBQCAh0jelMTY3+kgFy00Hlx2f2/1zjMoH821IbplbWZOkLiTYXQkygNTzQJTq5cvwBDgn2ppHD+bglQ==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@material/feature-targeting": "15.0.0-canary.7f224ddd4.0", - "@material/theme": "15.0.0-canary.7f224ddd4.0", - "tslib": "^2.1.0" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" } }, "node_modules/@ng-select/ng-select": { - "version": "12.0.7", - "resolved": "https://registry.npmjs.org/@ng-select/ng-select/-/ng-select-12.0.7.tgz", - "integrity": "sha512-Eht1zlLP0DJxiXcKnq3aY/EJ8odomgU0hM0BJoPY6oX3XFHndtFtdPxlZfhVtQn+FwyDEh7306rRx6digxVssA==", + "version": "14.9.0", + "resolved": "https://registry.npmjs.org/@ng-select/ng-select/-/ng-select-14.9.0.tgz", + "integrity": "sha512-f/E3EaSVwdKmwvZL43nS961bGaXR90F0Gtb8vA+ub8Hfwqjr1NTI6X7+yu5iMkqfy5ZW5cJdoGvo+kv8zcAkjQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.1" }, "engines": { - "node": ">= 16", + "node": ">= 18", "npm": ">= 8" }, "peerDependencies": { - "@angular/common": "^17.0.0-rc.0", - "@angular/core": "^17.0.0-rc.0", - "@angular/forms": "^17.0.0-rc.0" + "@angular/common": "^19.0.0", + "@angular/core": "^19.0.0", + "@angular/forms": "^19.0.0" } }, "node_modules/@ngageoint/color-js": { @@ -4468,19 +5448,19 @@ } }, "node_modules/@ngtools/webpack": { - "version": "17.3.17", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-17.3.17.tgz", - "integrity": "sha512-LaO++U8DoqV36M0YLKhubc1+NqM8fyp5DN03k1uP9GvtRchP9+7bfG+IEEZiDFkCUh9lfzi1CiGvUHrN4MYcsA==", + "version": "19.2.24", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-19.2.24.tgz", + "integrity": "sha512-lDWjW4lFwT0vbniJG7ziaDC2bX7rj8e4Fa59TpSLNHEjuPvK5chOTgT0+L63fEdfTfHoTy+ohAK1158UBXWt7g==", "dev": true, "license": "MIT", "engines": { - "node": "^18.13.0 || >=20.9.0", + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, "peerDependencies": { - "@angular/compiler-cli": "^17.0.0", - "typescript": ">=5.2 <5.5", + "@angular/compiler-cli": "^19.0.0 || ^19.2.0-next.0", + "typescript": ">=5.5 <5.9", "webpack": "^5.54.0" } }, @@ -4523,9 +5503,9 @@ } }, "node_modules/@npmcli/agent": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.2.tgz", - "integrity": "sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-3.0.0.tgz", + "integrity": "sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==", "dev": true, "license": "ISC", "dependencies": { @@ -4536,7 +5516,7 @@ "socks-proxy-agent": "^8.0.3" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@npmcli/agent/node_modules/lru-cache": { @@ -4547,47 +5527,36 @@ "license": "ISC" }, "node_modules/@npmcli/fs": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", - "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-4.0.0.tgz", + "integrity": "sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==", "dev": true, "license": "ISC", "dependencies": { "semver": "^7.3.5" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@npmcli/git": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-5.0.8.tgz", - "integrity": "sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-6.0.3.tgz", + "integrity": "sha512-GUYESQlxZRAdhs3UhbB6pVRNUELQOHXwK9ruDkwmCv2aZ5y0SApQzUJCg02p3A7Ue2J5hxvlk1YI53c00NmRyQ==", "dev": true, "license": "ISC", "dependencies": { - "@npmcli/promise-spawn": "^7.0.0", - "ini": "^4.1.3", + "@npmcli/promise-spawn": "^8.0.0", + "ini": "^5.0.0", "lru-cache": "^10.0.1", - "npm-pick-manifest": "^9.0.0", - "proc-log": "^4.0.0", - "promise-inflight": "^1.0.1", + "npm-pick-manifest": "^10.0.0", + "proc-log": "^5.0.0", "promise-retry": "^2.0.1", "semver": "^7.3.5", - "which": "^4.0.0" + "which": "^5.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/git/node_modules/ini": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", - "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@npmcli/git/node_modules/isexe": { @@ -4607,20 +5576,10 @@ "dev": true, "license": "ISC" }, - "node_modules/@npmcli/git/node_modules/proc-log": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", - "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "node_modules/@npmcli/git/node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", "dev": true, "license": "ISC", "dependencies": { @@ -4630,53 +5589,53 @@ "node-which": "bin/which.js" }, "engines": { - "node": "^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@npmcli/installed-package-contents": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.1.0.tgz", - "integrity": "sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-3.0.0.tgz", + "integrity": "sha512-fkxoPuFGvxyrH+OQzyTkX2LUEamrF4jZSmxjAtPPHHGO0dqsQ8tTKjnIS8SAnPHdk2I03BDtSMR5K/4loKg79Q==", "dev": true, "license": "ISC", "dependencies": { - "npm-bundled": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" + "npm-bundled": "^4.0.0", + "npm-normalize-package-bin": "^4.0.0" }, "bin": { "installed-package-contents": "bin/index.js" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@npmcli/node-gyp": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", - "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-4.0.0.tgz", + "integrity": "sha512-+t5DZ6mO/QFh78PByMq1fGSAub/agLJZDRfJRMeOSNCt8s9YVlTjmGpIPwPhvXTGUIJk+WszlT0rQa1W33yzNA==", "dev": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@npmcli/package-json": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-5.2.1.tgz", - "integrity": "sha512-f7zYC6kQautXHvNbLEWgD/uGu1+xCn9izgqBfgItWSx22U0ZDekxN08A1vM8cTxj/cRVe0Q94Ode+tdoYmIOOQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-6.2.0.tgz", + "integrity": "sha512-rCNLSB/JzNvot0SEyXqWZ7tX2B5dD2a1br2Dp0vSYVo5jh8Z0EZ7lS9TsZ1UtziddB1UfNUaMCc538/HztnJGA==", "dev": true, "license": "ISC", "dependencies": { - "@npmcli/git": "^5.0.0", + "@npmcli/git": "^6.0.0", "glob": "^10.2.2", - "hosted-git-info": "^7.0.0", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^6.0.0", - "proc-log": "^4.0.0", - "semver": "^7.5.3" + "hosted-git-info": "^8.0.0", + "json-parse-even-better-errors": "^4.0.0", + "proc-log": "^5.0.0", + "semver": "^7.5.3", + "validate-npm-package-license": "^3.0.4" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@npmcli/package-json/node_modules/brace-expansion": { @@ -4708,125 +5667,426 @@ "glob": "dist/esm/bin.mjs" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@npmcli/package-json/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@npmcli/promise-spawn": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-8.0.3.tgz", + "integrity": "sha512-Yb00SWaL4F8w+K8YGhQ55+xE4RUNdMHV43WZGsiTM92gS+lC0mGsn7I4hLug7pbao035S6bj3Y3w0cUNGLfmkg==", + "dev": true, + "license": "ISC", + "dependencies": { + "which": "^5.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/isexe": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.5.tgz", + "integrity": "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/redact": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-3.2.2.tgz", + "integrity": "sha512-7VmYAmk4csGv08QzrDKScdzn11jHPFGyqJW39FyPgPuAp3zIaUmuCo1yxw9aGs+NEJuTGQ9Gwqpt93vtJubucg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/run-script": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-9.1.0.tgz", + "integrity": "sha512-aoNSbxtkePXUlbZB+anS1LqsJdctG5n3UVhfU47+CDdwMi6uNTBMF9gPcQRnqghQd2FGzcwwIFBruFMxjhBewg==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/node-gyp": "^4.0.0", + "@npmcli/package-json": "^6.0.0", + "@npmcli/promise-spawn": "^8.0.0", + "node-gyp": "^11.0.0", + "proc-log": "^5.0.0", + "which": "^5.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/run-script/node_modules/isexe": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.5.tgz", + "integrity": "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@npmcli/run-script/node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.6.tgz", + "integrity": "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.3", + "is-glob": "^4.0.3", + "node-addon-api": "^7.0.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.6", + "@parcel/watcher-darwin-arm64": "2.5.6", + "@parcel/watcher-darwin-x64": "2.5.6", + "@parcel/watcher-freebsd-x64": "2.5.6", + "@parcel/watcher-linux-arm-glibc": "2.5.6", + "@parcel/watcher-linux-arm-musl": "2.5.6", + "@parcel/watcher-linux-arm64-glibc": "2.5.6", + "@parcel/watcher-linux-arm64-musl": "2.5.6", + "@parcel/watcher-linux-x64-glibc": "2.5.6", + "@parcel/watcher-linux-x64-musl": "2.5.6", + "@parcel/watcher-win32-arm64": "2.5.6", + "@parcel/watcher-win32-ia32": "2.5.6", + "@parcel/watcher-win32-x64": "2.5.6" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.6.tgz", + "integrity": "sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.6.tgz", + "integrity": "sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.6.tgz", + "integrity": "sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@npmcli/package-json/node_modules/minimatch": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.6.tgz", + "integrity": "sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==", + "cpu": [ + "x64" + ], "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.2" - }, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">= 10.0.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@npmcli/package-json/node_modules/proc-log": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", - "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.6.tgz", + "integrity": "sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==", + "cpu": [ + "arm" + ], "dev": true, - "license": "ISC", + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@npmcli/promise-spawn": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-7.0.2.tgz", - "integrity": "sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ==", + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.6.tgz", + "integrity": "sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==", + "cpu": [ + "arm" + ], "dev": true, - "license": "ISC", - "dependencies": { - "which": "^4.0.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@npmcli/promise-spawn/node_modules/isexe": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.5.tgz", - "integrity": "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==", + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.6.tgz", + "integrity": "sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "BlueOak-1.0.0", + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=18" + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@npmcli/promise-spawn/node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.6.tgz", + "integrity": "sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^16.13.0 || >=18.0.0" + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@npmcli/redact": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-1.1.0.tgz", - "integrity": "sha512-PfnWuOkQgu7gCbnSsAisaX7hKOdZ4wSAhAzH3/ph5dSGau52kCRrMMGbiSQLwyTZpgldkZ49b0brkOr1AzGBHQ==", + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.6.tgz", + "integrity": "sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==", + "cpu": [ + "x64" + ], "dev": true, - "license": "ISC", + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@npmcli/run-script": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-7.0.4.tgz", - "integrity": "sha512-9ApYM/3+rBt9V80aYg6tZfzj3UWdiYyCt7gJUD1VJKvWF5nwKDSICXbYIQbspFTq6TOpbsEtIC0LArB8d9PFmg==", + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.6.tgz", + "integrity": "sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==", + "cpu": [ + "x64" + ], "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/package-json": "^5.0.0", - "@npmcli/promise-spawn": "^7.0.0", - "node-gyp": "^10.0.0", - "which": "^4.0.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@npmcli/run-script/node_modules/isexe": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.5.tgz", - "integrity": "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==", + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.6.tgz", + "integrity": "sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "BlueOak-1.0.0", + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=18" + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@npmcli/run-script/node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.6.tgz", + "integrity": "sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==", + "cpu": [ + "ia32" + ], "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.6.tgz", + "integrity": "sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": "^16.13.0 || >=18.0.0" + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, "node_modules/@pkgjs/parseargs": { @@ -4894,31 +6154,6 @@ } } }, - "node_modules/@rollup/plugin-node-resolve": { - "version": "15.3.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.1.tgz", - "integrity": "sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "@types/resolve": "1.20.2", - "deepmerge": "^4.2.2", - "is-module": "^1.0.0", - "resolve": "^1.22.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^2.78.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, "node_modules/@rollup/pluginutils": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", @@ -4942,23 +6177,10 @@ } } }, - "node_modules/@rollup/pluginutils/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.2.tgz", - "integrity": "sha512-dnlp69efPPg6Uaw2dVqzWRfAWRnYVb1XJ8CyyhIbZeaq4CA5/mLeZ1IEt9QqQxmbdvagjLIm2ZL8BxXv5lH4Yw==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.3.tgz", + "integrity": "sha512-x35CNW/ANXG3hE/EZpRU8MXX1JDN86hBb2wMGAtltkz7pc6cxgjpy1OMMfDosOQ+2hWqIkag/fGok1Yady9nGw==", "cpu": [ "arm" ], @@ -4970,9 +6192,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.2.tgz", - "integrity": "sha512-OqZTwDRDchGRHHm/hwLOL7uVPB9aUvI0am/eQuWMNyFHf5PSEQmyEeYYheA0EPPKUO/l0uigCp+iaTjoLjVoHg==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.3.tgz", + "integrity": "sha512-xw3xtkDApIOGayehp2+Rz4zimfkaX65r4t47iy+ymQB2G4iJCBBfj0ogVg5jpvjpn8UWn/+q9tprxleYeNp3Hw==", "cpu": [ "arm64" ], @@ -4984,9 +6206,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.2.tgz", - "integrity": "sha512-UwRE7CGpvSVEQS8gUMBe1uADWjNnVgP3Iusyda1nSRwNDCsRjnGc7w6El6WLQsXmZTbLZx9cecegumcitNfpmA==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.3.tgz", + "integrity": "sha512-vo6Y5Qfpx7/5EaamIwi0WqW2+zfiusVihKatLvtN1VFVy3D13uERk/6gZLU1UiHRL6fDXqj/ELIeVRGnvcTE1g==", "cpu": [ "arm64" ], @@ -4998,9 +6220,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.2.tgz", - "integrity": "sha512-gjEtURKLCC5VXm1I+2i1u9OhxFsKAQJKTVB8WvDAHF+oZlq0GTVFOlTlO1q3AlCTE/DF32c16ESvfgqR7343/g==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.3.tgz", + "integrity": "sha512-D+0QGcZhBzTN82weOnsSlY7V7+RMmPuF1CkbxyMAGE8+ZHeUjyb76ZiWmBlCu//AQQONvxcqRbwZTajZKqjuOw==", "cpu": [ "x64" ], @@ -5012,9 +6234,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.2.tgz", - "integrity": "sha512-Bcl6CYDeAgE70cqZaMojOi/eK63h5Me97ZqAQoh77VPjMysA/4ORQBRGo3rRy45x4MzVlU9uZxs8Uwy7ZaKnBw==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.3.tgz", + "integrity": "sha512-6HnvHCT7fDyj6R0Ph7A6x8dQS/S38MClRWeDLqc0MdfWkxjiu1HSDYrdPhqSILzjTIC/pnXbbJbo+ft+gy/9hQ==", "cpu": [ "arm64" ], @@ -5026,9 +6248,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.2.tgz", - "integrity": "sha512-LU+TPda3mAE2QB0/Hp5VyeKJivpC6+tlOXd1VMoXV/YFMvk/MNk5iXeBfB4MQGRWyOYVJ01625vjkr0Az98OJQ==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.3.tgz", + "integrity": "sha512-KHLgC3WKlUYW3ShFKnnosZDOJ0xjg9zp7au3sIm2bs/tGBeC2ipmvRh/N7JKi0t9Ue20C0dpEshi8WUubg+cnA==", "cpu": [ "x64" ], @@ -5040,9 +6262,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.2.tgz", - "integrity": "sha512-2QxQrM+KQ7DAW4o22j+XZ6RKdxjLD7BOWTP0Bv0tmjdyhXSsr2Ul1oJDQqh9Zf5qOwTuTc7Ek83mOFaKnodPjg==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.3.tgz", + "integrity": "sha512-DV6fJoxEYWJOvaZIsok7KrYl0tPvga5OZ2yvKHNNYyk/2roMLqQAbGhr78EQ5YhHpnhLKJD3S1WFusAkmUuV5g==", "cpu": [ "arm" ], @@ -5054,9 +6276,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.2.tgz", - "integrity": "sha512-TbziEu2DVsTEOPif2mKWkMeDMLoYjx95oESa9fkQQK7r/Orta0gnkcDpzwufEcAO2BLBsD7mZkXGFqEdMRRwfw==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.3.tgz", + "integrity": "sha512-mQKoJAzvuOs6F+TZybQO4GOTSMUu7v0WdxEk24krQ/uUxXoPTtHjuaUuPmFhtBcM4K0ons8nrE3JyhTuCFtT/w==", "cpu": [ "arm" ], @@ -5068,9 +6290,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.2.tgz", - "integrity": "sha512-bO/rVDiDUuM2YfuCUwZ1t1cP+/yqjqz+Xf2VtkdppefuOFS2OSeAfgafaHNkFn0t02hEyXngZkxtGqXcXwO8Rg==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.3.tgz", + "integrity": "sha512-Whjj2qoiJ6+OOJMGptTYazaJvjOJm+iKHpXQM1P3LzGjt7Ff++Tp7nH4N8J/BUA7R9IHfDyx4DJIflifwnbmIA==", "cpu": [ "arm64" ], @@ -5082,9 +6304,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.2.tgz", - "integrity": "sha512-hr26p7e93Rl0Za+JwW7EAnwAvKkehh12BU1Llm9Ykiibg4uIr2rbpxG9WCf56GuvidlTG9KiiQT/TXT1yAWxTA==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.3.tgz", + "integrity": "sha512-4YTNHKqGng5+yiZt3mg77nmyuCfmNfX4fPmyUapBcIk+BdwSwmCWGXOUxhXbBEkFHtoN5boLj/5NON+u5QC9tg==", "cpu": [ "arm64" ], @@ -5096,9 +6318,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.2.tgz", - "integrity": "sha512-pOjB/uSIyDt+ow3k/RcLvUAOGpysT2phDn7TTUB3n75SlIgZzM6NKAqlErPhoFU+npgY3/n+2HYIQVbF70P9/A==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.3.tgz", + "integrity": "sha512-SU3kNlhkpI4UqlUc2VXPGK9o886ZsSeGfMAX2ba2b8DKmMXq4AL7KUrkSWVbb7koVqx41Yczx6dx5PNargIrEA==", "cpu": [ "loong64" ], @@ -5110,9 +6332,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.2.tgz", - "integrity": "sha512-2/w+q8jszv9Ww1c+6uJT3OwqhdmGP2/4T17cu8WuwyUuuaCDDJ2ojdyYwZzCxx0GcsZBhzi3HmH+J5pZNXnd+Q==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.3.tgz", + "integrity": "sha512-6lDLl5h4TXpB1mTf2rQWnAk/LcXrx9vBfu/DT5TIPhvMhRWaZ5MxkIc8u4lJAmBo6klTe1ywXIUHFjylW505sg==", "cpu": [ "loong64" ], @@ -5124,9 +6346,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.2.tgz", - "integrity": "sha512-11+aL5vKheYgczxtPVVRhdptAM2H7fcDR5Gw4/bTcteuZBlH4oP9f5s9zYO9aGZvoGeBpqXI/9TZZihZ609wKw==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.3.tgz", + "integrity": "sha512-BMo8bOw8evlup/8G+cj5xWtPyp93xPdyoSN16Zy90Q2QZ0ZYRhCt6ZJSwbrRzG9HApFabjwj2p25TUPDWrhzqQ==", "cpu": [ "ppc64" ], @@ -5138,9 +6360,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.2.tgz", - "integrity": "sha512-i16fokAGK46IVZuV8LIIwMdtqhin9hfYkCh8pf8iC3QU3LpwL+1FSFGej+O7l3E/AoknL6Dclh2oTdnRMpTzFQ==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.3.tgz", + "integrity": "sha512-E0L8X1dZN1/Rph+5VPF6Xj2G7JJvMACVXtamTJIDrVI44Y3K+G8gQaMEAavbqCGTa16InptiVrX6eM6pmJ+7qA==", "cpu": [ "ppc64" ], @@ -5152,9 +6374,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.2.tgz", - "integrity": "sha512-49FkKS6RGQoriDSK/6E2GkAsAuU5kETFCh7pG4yD/ylj9rKhTmO3elsnmBvRD4PgJPds5W2PkhC82aVwmUcJ7A==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.3.tgz", + "integrity": "sha512-oZJ/WHaVfHUiRAtmTAeo3DcevNsVvH8mbvodjZy7D5QKvCefO371SiKRpxoDcCxB3PTRTLayWBkvmDQKTcX/sw==", "cpu": [ "riscv64" ], @@ -5166,9 +6388,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.2.tgz", - "integrity": "sha512-mjYNkHPfGpUR00DuM1ZZIgs64Hpf4bWcz9Z41+4Q+pgDx73UwWdAYyf6EG/lRFldmdHHzgrYyge5akFUW0D3mQ==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.3.tgz", + "integrity": "sha512-Dhbyh7j9FybM3YaTgaHmVALwA8AkUwTPccyCQ79TG9AJUsMQqgN1DDEZNr4+QUfwiWvLDumW5vdwzoeUF+TNxQ==", "cpu": [ "riscv64" ], @@ -5180,9 +6402,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.2.tgz", - "integrity": "sha512-ALyvJz965BQk8E9Al/JDKKDLH2kfKFLTGMlgkAbbYtZuJt9LU8DW3ZoDMCtQpXAltZxwBHevXz5u+gf0yA0YoA==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.3.tgz", + "integrity": "sha512-cJd1X5XhHHlltkaypz1UcWLA8AcoIi1aWhsvaWDskD1oz2eKCypnqvTQ8ykMNI0RSmm7NkTdSqSSD7zM0xa6Ig==", "cpu": [ "s390x" ], @@ -5194,9 +6416,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.2.tgz", - "integrity": "sha512-UQjrkIdWrKI626Du8lCQ6MJp/6V1LAo2bOK9OTu4mSn8GGXIkPXk/Vsp4bLHCd9Z9Iz2OTEaokUE90VweJgIYQ==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.3.tgz", + "integrity": "sha512-DAZDBHQfG2oQuhY7mc6I3/qB4LU2fQCjRvxbDwd/Jdvb9fypP4IJ4qmtu6lNjes6B531AI8cg1aKC2di97bUxA==", "cpu": [ "x64" ], @@ -5208,9 +6430,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.2.tgz", - "integrity": "sha512-bTsRGj6VlSdn/XD4CGyzMnzaBs9bsRxy79eTqTCBsA8TMIEky7qg48aPkvJvFe1HyzQ5oMZdg7AnVlWQSKLTnw==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.3.tgz", + "integrity": "sha512-cRxsE8c13mZOh3vP+wLDxpQBRrOHDIGOWyDL93Sy0Ga8y515fBcC2pjUfFwUe5T7tqvTvWbCpg1URM/AXdWIXA==", "cpu": [ "x64" ], @@ -5222,9 +6444,9 @@ ] }, "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.2.tgz", - "integrity": "sha512-6d4Z3534xitaA1FcMWP7mQPq5zGwBmGbhphh2DwaA1aNIXUu3KTOfwrWpbwI4/Gr0uANo7NTtaykFyO2hPuFLg==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.3.tgz", + "integrity": "sha512-QaWcIgRxqEdQdhJqW4DJctsH6HCmo5vHxY0krHSX4jMtOqfzC+dqDGuHM87bu4H8JBeibWx7jFz+h6/4C8wA5Q==", "cpu": [ "x64" ], @@ -5236,9 +6458,9 @@ ] }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.2.tgz", - "integrity": "sha512-NetAg5iO2uN7eB8zE5qrZ3CSil+7IJt4WDFLcC75Ymywq1VZVD6qJ6EvNLjZ3rEm6gB7XW5JdT60c6MN35Z85Q==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.3.tgz", + "integrity": "sha512-AaXwSvUi3QIPtroAUw1t5yHGIyqKEXwH54WUocFolZhpGDruJcs8c+xPNDRn4XiQsS7MEwnYsHW2l0MBLDMkWg==", "cpu": [ "arm64" ], @@ -5250,9 +6472,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.2.tgz", - "integrity": "sha512-NCYhOotpgWZ5kdxCZsv6Iudx0wX8980Q/oW4pNFNihpBKsDbEA1zpkfxJGC0yugsUuyDZ7gL37dbzwhR0VI7pQ==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.3.tgz", + "integrity": "sha512-65LAKM/bAWDqKNEelHlcHvm2V+Vfb8C6INFxQXRHCvaVN1rJfwr4NvdP4FyzUaLqWfaCGaadf6UbTm8xJeYfEg==", "cpu": [ "arm64" ], @@ -5264,9 +6486,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.2.tgz", - "integrity": "sha512-RXsaOqXxfoUBQoOgvmmijVxJnW2IGB0eoMO7F8FAjaj0UTywUO/luSqimWBJn04WNgUkeNhh7fs7pESXajWmkg==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.3.tgz", + "integrity": "sha512-EEM2gyhBF5MFnI6vMKdX1LAosE627RGBzIoGMdLloPZkXrUN0Ckqgr2Qi8+J3zip/8NVVro3/FjB+tjhZUgUHA==", "cpu": [ "ia32" ], @@ -5278,9 +6500,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.2.tgz", - "integrity": "sha512-qdAzEULD+/hzObedtmV6iBpdL5TIbKVztGiK7O3/KYSf+HIzU257+MX1EXJcyIiDbMAqmbwaufcYPvyRryeZtA==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.3.tgz", + "integrity": "sha512-E5Eb5H/DpxaoXH++Qkv28RcUJboMopmdDUALBczvHMf7hNIxaDZqwY5lK12UK1BHacSmvupoEWGu+n993Z0y1A==", "cpu": [ "x64" ], @@ -5292,9 +6514,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.2.tgz", - "integrity": "sha512-Nd/SgG27WoA9e+/TdK74KnHz852TLa94ovOYySo/yMPuTmpckK/jIF2jSwS3g7ELSKXK13/cVdmg1Z/DaCWKxA==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.3.tgz", + "integrity": "sha512-hPt/bgL5cE+Qp+/TPHBqptcAgPzgj46mPcg/16zNUmbQk0j+mOEQV/+Lqu8QRtDV3Ek95Q6FeFITpuhl6OTsAA==", "cpu": [ "x64" ], @@ -5306,9 +6528,9 @@ ] }, "node_modules/@rollup/wasm-node": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/wasm-node/-/wasm-node-4.60.2.tgz", - "integrity": "sha512-FOfZOg752WSyKNefpSM3WrhggSTSuKuwcSfF7tdWC9PBYYg7BLwBR267uShFAI1ZyA0gNkdqK16LL9mNOPsQ1Q==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/wasm-node/-/wasm-node-4.60.3.tgz", + "integrity": "sha512-SVhQ4TJk0BvnJKwceVsCWHtmquucfjU0eu+Bonrjb6W3zombkA/tqw1efaqT2BONX/TJniqkzumF6Sz/sXMJ2w==", "dev": true, "license": "MIT", "dependencies": { @@ -5332,50 +6554,105 @@ "hasInstallScript": true, "license": "Apache-2.0" }, - "node_modules/@schematics/angular": { - "version": "17.3.17", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-17.3.17.tgz", - "integrity": "sha512-S5HwYem5Yjeceb5OLvforNcjfTMh2qsHnTP1BAYL81XPpqeg2udjAkJjKBxCwxMZSqdCMw3ne0eKppEYTaEZ+A==", + "node_modules/@schematics/angular": { + "version": "19.2.25", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.2.25.tgz", + "integrity": "sha512-LaA1do8Q7bFJIYDkcmWMXTEod4YaaMLgC+kVT5l9MrLs3Gd47ydLSkkdvAdMm6SVG7XT+yIRAQHcPLv+7kiz5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "19.2.25", + "@angular-devkit/schematics": "19.2.25", + "jsonc-parser": "3.3.1" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@schematics/angular/node_modules/@angular-devkit/core": { + "version": "19.2.25", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.25.tgz", + "integrity": "sha512-jXk2yASLMmMLfxA5kSW6QdoVRElDXkf8rHpbX84VtX9E4HiV3jOTAtzZr5HV2mjthBXZB6oT8WDe4M83hseTsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "8.18.0", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.4", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^4.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@schematics/angular/node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@schematics/angular/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "@angular-devkit/core": "17.3.17", - "@angular-devkit/schematics": "17.3.17", - "jsonc-parser": "3.2.1" - }, - "engines": { - "node": "^18.13.0 || >=20.9.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" + "tslib": "^2.1.0" } }, "node_modules/@sigstore/bundle": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.3.2.tgz", - "integrity": "sha512-wueKWDk70QixNLB363yHc2D2ItTgYiMTdPwK8D9dKQMR3ZQ0c35IxP5xnwQ8cNLoCgCRcHf14kE+CLIvNX1zmA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-3.1.0.tgz", + "integrity": "sha512-Mm1E3/CmDDCz3nDhFKTuYdB47EdRFRQMOE/EAbiG1MJW77/w1b3P7Qx7JSrVJs8PfwOLOVcKQCHErIwCTyPbag==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/protobuf-specs": "^0.3.2" + "@sigstore/protobuf-specs": "^0.4.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@sigstore/core": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-1.1.0.tgz", - "integrity": "sha512-JzBqdVIyqm2FRQCulY6nbQzMpJJpSiJ8XXWMhtOX9eKgaXXpfNOF53lzQEjIydlStnd/eFtuC1dW4VYdD93oRg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-2.0.0.tgz", + "integrity": "sha512-nYxaSb/MtlSI+JWcwTHQxyNmWeWrUXJJ/G4liLrGG7+tS4vAz6LF3xRXqLH6wPIVUoZQel2Fs4ddLx4NCpiIYg==", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@sigstore/protobuf-specs": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.3.tgz", - "integrity": "sha512-RpacQhBlwpBWd7KEJsRKcBQalbV28fvkxwTOJIqhIuDysMMaJW47V4OqW30iJB9uRpqOSxxEAQFdr8tTattReQ==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.4.3.tgz", + "integrity": "sha512-fk2zjD9117RL9BjqEwF7fwv7Q/P9yGsMV4MUJZ/DocaQJ6+3pKr+syBq1owU5Q5qGw5CUbXzm+4yJ2JVRDQeSA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -5383,60 +6660,63 @@ } }, "node_modules/@sigstore/sign": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-2.3.2.tgz", - "integrity": "sha512-5Vz5dPVuunIIvC5vBb0APwo7qKA4G9yM48kPWJT+OEERs40md5GoUR1yedwpekWZ4m0Hhw44m6zU+ObsON+iDA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-3.1.0.tgz", + "integrity": "sha512-knzjmaOHOov1Ur7N/z4B1oPqZ0QX5geUfhrVaqVlu+hl0EAoL4o+l0MSULINcD5GCWe3Z0+YJO8ues6vFlW0Yw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/bundle": "^2.3.2", - "@sigstore/core": "^1.0.0", - "@sigstore/protobuf-specs": "^0.3.2", - "make-fetch-happen": "^13.0.1", - "proc-log": "^4.2.0", + "@sigstore/bundle": "^3.1.0", + "@sigstore/core": "^2.0.0", + "@sigstore/protobuf-specs": "^0.4.0", + "make-fetch-happen": "^14.0.2", + "proc-log": "^5.0.0", "promise-retry": "^2.0.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/sign/node_modules/proc-log": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", - "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@sigstore/tuf": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.3.4.tgz", - "integrity": "sha512-44vtsveTPUpqhm9NCrbU8CWLe3Vck2HO1PNLw7RIajbB7xhtn5RBPm1VNSCMwqGYHhDsBJG8gDF0q4lgydsJvw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-3.1.1.tgz", + "integrity": "sha512-eFFvlcBIoGwVkkwmTi/vEQFSva3xs5Ot3WmBcjgjVdiaoelBLQaQ/ZBfhlG0MnG0cmTYScPpk7eDdGDWUcFUmg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/protobuf-specs": "^0.3.2", - "tuf-js": "^2.2.1" + "@sigstore/protobuf-specs": "^0.4.1", + "tuf-js": "^3.0.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@sigstore/verify": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-1.2.1.tgz", - "integrity": "sha512-8iKx79/F73DKbGfRf7+t4dqrc0bRr0thdPrxAtCKWRm/F0tG71i6O1rvlnScncJLLBZHn3h8M3c1BSUAb9yu8g==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-2.1.1.tgz", + "integrity": "sha512-hVJD77oT67aowHxwT4+M6PGOp+E2LtLdTK3+FC0lBO9T7sYwItDMXZ7Z07IDCvR1M717a4axbIWckrW67KMP/w==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/bundle": "^2.3.2", - "@sigstore/core": "^1.1.0", - "@sigstore/protobuf-specs": "^0.3.2" + "@sigstore/bundle": "^3.1.0", + "@sigstore/core": "^2.0.0", + "@sigstore/protobuf-specs": "^0.4.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@sindresorhus/merge-streams": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@socket.io/component-emitter": { @@ -5447,13 +6727,13 @@ "license": "MIT" }, "node_modules/@swagger-api/apidom-ast": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ast/-/apidom-ast-1.10.2.tgz", - "integrity": "sha512-vTl8gWyeZaj887/NSWYs3as4K8wXHar5wY/606XRBjR2UgmJBokBgKjq7S23LW9tsYjsT4MjQKC8idjgw17xvg==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ast/-/apidom-ast-1.11.0.tgz", + "integrity": "sha512-poLd6eNipLCFCrxjZD+E9E0Z85CLfFzueNiVcYj86rwMp2OszYsTzZS2jz82yR/usNCjXCpkQ2xEXWSmDhefPg==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-error": "^1.10.2", + "@swagger-api/apidom-error": "^1.11.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -5461,14 +6741,14 @@ } }, "node_modules/@swagger-api/apidom-core": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-core/-/apidom-core-1.10.2.tgz", - "integrity": "sha512-qryNBGHNWDvSRyK1w5rox0UOrHrVBjZOHgeXFpGHF+oBO7ntSc/H7BSiYMDR+KQESkzMcAxn4tZMLYItaBt06w==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-core/-/apidom-core-1.11.0.tgz", + "integrity": "sha512-7TvbbC3dG3yM8cjqyrFXoTOpwgOC68+Z17Ro36drJwZ0k/c7QQc0dI/KvTSPHn9UfimEMdZ0q+yIIzqrAiEmww==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-ast": "^1.10.2", - "@swagger-api/apidom-error": "^1.10.2", + "@swagger-api/apidom-ast": "^1.11.0", + "@swagger-api/apidom-error": "^1.11.0", "@types/ramda": "~0.30.0", "minim": "~0.23.8", "ramda": "~0.30.0", @@ -5478,37 +6758,37 @@ } }, "node_modules/@swagger-api/apidom-error": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-error/-/apidom-error-1.10.2.tgz", - "integrity": "sha512-SWyPyL5xwTUsDzPi0A5zwTFwqPezvlwj4opEqruqjESNTYupUA7+vt4Mdj7IlDaRYRG1qyCWQgKhIBXznVUD4w==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-error/-/apidom-error-1.11.0.tgz", + "integrity": "sha512-JPt37oOrf73CAZNQBPffnLzU5iEUs8cT9pFmc9vy2gHQp+vjSKxeJ9F6zagTp8VnLPUq0gVjIvCQvcX8NPW2jA==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.20.7" } }, "node_modules/@swagger-api/apidom-json-pointer": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-json-pointer/-/apidom-json-pointer-1.10.2.tgz", - "integrity": "sha512-zySHPqIXF4HZ3VWbHwTxO+H1e9dJw7mGHzoX+tZjx5wVyLQO3kZDCAAXzz3c3/TIY21Y2Zkpkez3q9hjFyuLvQ==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-json-pointer/-/apidom-json-pointer-1.11.0.tgz", + "integrity": "sha512-11JWHr55FciYGTbcicNZrBsFEwNuLLZybi00YHJ3OBcuXcFJPKmKluLnVL7GhZYEqvLYOcVsCfInYW5MXoj00w==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.10.2", - "@swagger-api/apidom-error": "^1.10.2", + "@swagger-api/apidom-core": "^1.11.0", + "@swagger-api/apidom-error": "^1.11.0", "@swaggerexpert/json-pointer": "^2.10.1" } }, "node_modules/@swagger-api/apidom-ns-api-design-systems": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-api-design-systems/-/apidom-ns-api-design-systems-1.10.2.tgz", - "integrity": "sha512-MsZ4GWmWN7wkWv7G9Pwk8sHU1j0bwk7xoGeaZmNCylbTfYvGkg6jJGMHdAdQNCQXbbpfLeKt1O+3YCN//JUQ7w==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-api-design-systems/-/apidom-ns-api-design-systems-1.11.0.tgz", + "integrity": "sha512-IskDsUkUtNas4guoChRKKkw0wOst64nRA24WuIjLf8ztfBdcl/oqx/cgy8pwWCUqNYvL9L3+sD5HeuokqMrySw==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.10.2", - "@swagger-api/apidom-error": "^1.10.2", - "@swagger-api/apidom-ns-openapi-3-1": "^1.10.2", + "@swagger-api/apidom-core": "^1.11.0", + "@swagger-api/apidom-error": "^1.11.0", + "@swagger-api/apidom-ns-openapi-3-1": "^1.11.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -5516,15 +6796,15 @@ } }, "node_modules/@swagger-api/apidom-ns-arazzo-1": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-arazzo-1/-/apidom-ns-arazzo-1-1.10.2.tgz", - "integrity": "sha512-fQSwDlIR85tbnLXAjtV/ypSGUBfrzFcZ4NbH6BL1DSTR4uEunVxAULdD4wlhCt9gGNDl/zxZD3vQtlYDkXDFmw==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-arazzo-1/-/apidom-ns-arazzo-1-1.11.0.tgz", + "integrity": "sha512-n+aGSlLHyrpmCaBa9DBZkIqnNVzYAYSa010MvAwhlwtW3EbFYNwYWinbTwLqCd3leN6XWTvQYCvk0/k7/9Cq4A==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.10.2", - "@swagger-api/apidom-ns-json-schema-2020-12": "^1.10.2", + "@swagger-api/apidom-core": "^1.11.0", + "@swagger-api/apidom-ns-json-schema-2020-12": "^1.11.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -5532,15 +6812,15 @@ } }, "node_modules/@swagger-api/apidom-ns-asyncapi-2": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-asyncapi-2/-/apidom-ns-asyncapi-2-1.10.2.tgz", - "integrity": "sha512-obWHe3pyAj65Nf9ISwnbtJ4C5mZ15C6mtQXxzHVW5maVZqlqt3s/YbPY87EqK9ArdNOwOZHkQt2Uth02GMmjxA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-asyncapi-2/-/apidom-ns-asyncapi-2-1.11.0.tgz", + "integrity": "sha512-SHh3naFZlXFI0gG36tNYvJ/VO8aZsjnXIQAqJHfOE6rrpl5msJrdDatmNczh+57WPZxEZA+KTXWCqNKdeu3G3Q==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.10.2", - "@swagger-api/apidom-ns-json-schema-draft-7": "^1.10.2", + "@swagger-api/apidom-core": "^1.11.0", + "@swagger-api/apidom-ns-json-schema-draft-7": "^1.11.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -5548,15 +6828,15 @@ } }, "node_modules/@swagger-api/apidom-ns-asyncapi-3": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-asyncapi-3/-/apidom-ns-asyncapi-3-1.10.2.tgz", - "integrity": "sha512-yqNmXeObF2OLAusgGEapXz2CrGjXwkcfG3DYcQDtOvgRytvGZxC2EkCUR+wEXCVNYhoJ7QpVzzTJOHs3jOvptg==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-asyncapi-3/-/apidom-ns-asyncapi-3-1.11.0.tgz", + "integrity": "sha512-4vrgNYDj68hgmgZj1eGBaBr5xqIETWn4jAioiRHek4jV1FLvmxCs3nC2nYs8CzQqqJ1bqirdiirrUpqhaQvTEA==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.10.2", - "@swagger-api/apidom-ns-asyncapi-2": "^1.10.2", + "@swagger-api/apidom-core": "^1.11.0", + "@swagger-api/apidom-ns-asyncapi-2": "^1.11.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -5564,15 +6844,15 @@ } }, "node_modules/@swagger-api/apidom-ns-json-schema-2019-09": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-2019-09/-/apidom-ns-json-schema-2019-09-1.10.2.tgz", - "integrity": "sha512-I1FaBoDFMjybF4QVsesIYl8OilkwycZ0mQ0jf1P++zfTRG27uIePB8M+Iuj6iqMsE3qpkjjJJ6ZLnrLPdKvmRw==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-2019-09/-/apidom-ns-json-schema-2019-09-1.11.0.tgz", + "integrity": "sha512-5avPMY1YbQmJIqXlu7rm3yftf4xhT2REBxpEgw8Nc7Zlbn4Z5iGXBsHr60982MwqeE6W8wA+HHQMKHM5siuhdQ==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.10.2", - "@swagger-api/apidom-error": "^1.10.2", - "@swagger-api/apidom-ns-json-schema-draft-7": "^1.10.2", + "@swagger-api/apidom-core": "^1.11.0", + "@swagger-api/apidom-error": "^1.11.0", + "@swagger-api/apidom-ns-json-schema-draft-7": "^1.11.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -5580,15 +6860,15 @@ } }, "node_modules/@swagger-api/apidom-ns-json-schema-2020-12": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-2020-12/-/apidom-ns-json-schema-2020-12-1.10.2.tgz", - "integrity": "sha512-lg9XfRlJRNoBa2EDGpEFc7HvFV39G6RG0/SbjQY0BE/WZer10wmfTCU7l3RUNJXRFGKH6/O/nsYgP7AFjTanXQ==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-2020-12/-/apidom-ns-json-schema-2020-12-1.11.0.tgz", + "integrity": "sha512-zddyOxWKlQ9WPaZR0e8ykmy8AbGnDvqCqqy6BdYqKZ9Ts8ZK1XwOB2j9ruccZpoiy/rp2tow+CUf3XE5rricmQ==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.10.2", - "@swagger-api/apidom-error": "^1.10.2", - "@swagger-api/apidom-ns-json-schema-2019-09": "^1.10.2", + "@swagger-api/apidom-core": "^1.11.0", + "@swagger-api/apidom-error": "^1.11.0", + "@swagger-api/apidom-ns-json-schema-2019-09": "^1.11.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -5596,14 +6876,14 @@ } }, "node_modules/@swagger-api/apidom-ns-json-schema-draft-4": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-4/-/apidom-ns-json-schema-draft-4-1.10.2.tgz", - "integrity": "sha512-C50KnSKynrmHky/oOB6+hHyZVpwng78Fz5aZjay3h8X5C/PJHmm3sDJFvF3/9wkYHO3N9sPp7cpu4Xm9VJ4/wQ==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-4/-/apidom-ns-json-schema-draft-4-1.11.0.tgz", + "integrity": "sha512-upc0xKb3nxsYPECRDf5UygnZHTSj78xHj5+SBIHNDXoaGDhvMCtWoDVGAKFtZ+jZlIkyJt7cGAeOX0w9IV3XkA==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-ast": "^1.10.2", - "@swagger-api/apidom-core": "^1.10.2", + "@swagger-api/apidom-ast": "^1.11.0", + "@swagger-api/apidom-core": "^1.11.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -5611,15 +6891,15 @@ } }, "node_modules/@swagger-api/apidom-ns-json-schema-draft-6": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-6/-/apidom-ns-json-schema-draft-6-1.10.2.tgz", - "integrity": "sha512-/wiP8+2lF8UJRrkoQ9HvKnMbnqijk2uY/hAg+/Bo73T9NGKkEa29jYVUKYNYj7gJBw4hhkUHfHFWuZUpxPC4ZA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-6/-/apidom-ns-json-schema-draft-6-1.11.0.tgz", + "integrity": "sha512-sd/U6Y34uRqdgd3Phz1oEhO7UBCn60+OfIasFFpHZcKe7O0jTmayiaJqbpwirhwt7Fv5Ev5m58+y1nVomLnhQw==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.10.2", - "@swagger-api/apidom-error": "^1.10.2", - "@swagger-api/apidom-ns-json-schema-draft-4": "^1.10.2", + "@swagger-api/apidom-core": "^1.11.0", + "@swagger-api/apidom-error": "^1.11.0", + "@swagger-api/apidom-ns-json-schema-draft-4": "^1.11.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -5627,15 +6907,15 @@ } }, "node_modules/@swagger-api/apidom-ns-json-schema-draft-7": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-7/-/apidom-ns-json-schema-draft-7-1.10.2.tgz", - "integrity": "sha512-firN/uvnVxQgACqcyzV3NU9qjbMvNMJkpmm3wOat3URmaFMaFBT3qjbU1pFHBGbnXI3+I9pQJZHmJSwqNzfUbQ==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-7/-/apidom-ns-json-schema-draft-7-1.11.0.tgz", + "integrity": "sha512-7ptuxmuh2vN1hDr3cLkYm2rl+ak2J1byoGxswucKfSb+7IaFoA36/t7kcOsE/hIO4yI7T3ZPOuNSpeg1NBVjEw==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.10.2", - "@swagger-api/apidom-error": "^1.10.2", - "@swagger-api/apidom-ns-json-schema-draft-6": "^1.10.2", + "@swagger-api/apidom-core": "^1.11.0", + "@swagger-api/apidom-error": "^1.11.0", + "@swagger-api/apidom-ns-json-schema-draft-6": "^1.11.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -5643,16 +6923,16 @@ } }, "node_modules/@swagger-api/apidom-ns-openapi-2": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-2/-/apidom-ns-openapi-2-1.10.2.tgz", - "integrity": "sha512-FK5kYvo/1uwAByumRVRsynBlnKxUUImfsjPEFgRCW6yhbCGRqN47NaZ7GYFHpbhjC3OmMN5/etYj6B0jnZx7Gg==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-2/-/apidom-ns-openapi-2-1.11.0.tgz", + "integrity": "sha512-cAIPJhLxm/nj1kzneNySeaTahY+hH5gkGNsgbmifGnLPsC5YOOfEVMKLj18IREdXqdnxJgRbsI9Azl4g09TPkg==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.10.2", - "@swagger-api/apidom-error": "^1.10.2", - "@swagger-api/apidom-ns-json-schema-draft-4": "^1.10.2", + "@swagger-api/apidom-core": "^1.11.0", + "@swagger-api/apidom-error": "^1.11.0", + "@swagger-api/apidom-ns-json-schema-draft-4": "^1.11.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -5660,15 +6940,15 @@ } }, "node_modules/@swagger-api/apidom-ns-openapi-3-0": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-0/-/apidom-ns-openapi-3-0-1.10.2.tgz", - "integrity": "sha512-ziyv85QbJYHRdc9oTEFBy3pxwxg7BW/a9GrwH01/SmuXVQPjLjwzRb+SjCxLogJppm0yjxOkDFI2VWPp2RADFg==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-0/-/apidom-ns-openapi-3-0-1.11.0.tgz", + "integrity": "sha512-IUEWVSuETE5DdgTJhIt6oZyRTYUV892/I9UdyTResR0Bypc7gy3YXwlzMlUZx73S2klaiFo1dL4iu/fqzA2fEg==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.10.2", - "@swagger-api/apidom-error": "^1.10.2", - "@swagger-api/apidom-ns-json-schema-draft-4": "^1.10.2", + "@swagger-api/apidom-core": "^1.11.0", + "@swagger-api/apidom-error": "^1.11.0", + "@swagger-api/apidom-ns-json-schema-draft-4": "^1.11.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -5676,17 +6956,17 @@ } }, "node_modules/@swagger-api/apidom-ns-openapi-3-1": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-1/-/apidom-ns-openapi-3-1-1.10.2.tgz", - "integrity": "sha512-ngcmO4dH77JT5hZB04OJdyTzgKnt2lNhAZQ+4wXjum/xhszjUmDhOeYfXdHw3Lm7MxsEsTesWzLYQ5LKADc41A==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-1/-/apidom-ns-openapi-3-1-1.11.0.tgz", + "integrity": "sha512-WpUvFgOs4YMUmyeJRQEADps+U5o71YTtzKMPNr1cF1ZHKKkcRMUJL9QlJ4Y9cxAdjo6oXzXZa5922XOpwMYhxA==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-ast": "^1.10.2", - "@swagger-api/apidom-core": "^1.10.2", - "@swagger-api/apidom-json-pointer": "^1.10.2", - "@swagger-api/apidom-ns-json-schema-2020-12": "^1.10.2", - "@swagger-api/apidom-ns-openapi-3-0": "^1.10.2", + "@swagger-api/apidom-ast": "^1.11.0", + "@swagger-api/apidom-core": "^1.11.0", + "@swagger-api/apidom-json-pointer": "^1.11.0", + "@swagger-api/apidom-ns-json-schema-2020-12": "^1.11.0", + "@swagger-api/apidom-ns-openapi-3-0": "^1.11.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -5694,18 +6974,18 @@ } }, "node_modules/@swagger-api/apidom-ns-openapi-3-2": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-2/-/apidom-ns-openapi-3-2-1.10.2.tgz", - "integrity": "sha512-3SWJ5ipWwn+w11HTUESWex/522jy2aGLzBqqMgH36sy+Wdwx+9Mw2bgSDqkxmNC5+jpzOGUOIWoQAMuCpS/Gzg==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-2/-/apidom-ns-openapi-3-2-1.11.0.tgz", + "integrity": "sha512-mUErHIq8rHVoOrkHnRj3mhoNYVIl8th474/m0+E8OB2wBAe0KgiczaJX9KkBQoAo5XIxoRfmI5T3bp+fRabwCA==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-ast": "^1.10.2", - "@swagger-api/apidom-core": "^1.10.2", - "@swagger-api/apidom-json-pointer": "^1.10.2", - "@swagger-api/apidom-ns-json-schema-2020-12": "^1.10.2", - "@swagger-api/apidom-ns-openapi-3-0": "^1.10.2", - "@swagger-api/apidom-ns-openapi-3-1": "^1.10.2", + "@swagger-api/apidom-ast": "^1.11.0", + "@swagger-api/apidom-core": "^1.11.0", + "@swagger-api/apidom-json-pointer": "^1.11.0", + "@swagger-api/apidom-ns-json-schema-2020-12": "^1.11.0", + "@swagger-api/apidom-ns-openapi-3-0": "^1.11.0", + "@swagger-api/apidom-ns-openapi-3-1": "^1.11.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -5713,144 +6993,144 @@ } }, "node_modules/@swagger-api/apidom-parser-adapter-api-design-systems-json": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-json/-/apidom-parser-adapter-api-design-systems-json-1.10.2.tgz", - "integrity": "sha512-kzhJUGzsJ38Uohj5xRQDkQC08rqNhatbqgD30LZ0/UWryJ9nAsjqK2ovuP9t+5WKcDE4iwcYeGSt1NA2XgEZwg==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-json/-/apidom-parser-adapter-api-design-systems-json-1.11.0.tgz", + "integrity": "sha512-0OdwcnV/QF+Vs3Vj0dTmlRHEp9WQg9aBvWWl8Fq25OviyDhGGRpqgkEAOjtVYCH3XyZ1Xz+jhIDOdd5pxBajsA==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.10.2", - "@swagger-api/apidom-ns-api-design-systems": "^1.10.2", - "@swagger-api/apidom-parser-adapter-json": "^1.10.2", + "@swagger-api/apidom-core": "^1.11.0", + "@swagger-api/apidom-ns-api-design-systems": "^1.11.0", + "@swagger-api/apidom-parser-adapter-json": "^1.11.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-api-design-systems-yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-yaml/-/apidom-parser-adapter-api-design-systems-yaml-1.10.2.tgz", - "integrity": "sha512-i3CmSxJ/iG67ybRDAJ9xpuMrOMFvC/obX2lI36E0VZzBTb+llw4Zd5qFmBqNnImLpwdmk11Z1V7i+5HM+J7ijQ==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-yaml/-/apidom-parser-adapter-api-design-systems-yaml-1.11.0.tgz", + "integrity": "sha512-K714DT6nFW+ZM9LTo+c120zkUjsEcIFO2DU+0cnzReRyenb1x6RZe+uOqTt7iWohnnWp2FV/j0exd/mCsxW65Q==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.10.2", - "@swagger-api/apidom-ns-api-design-systems": "^1.10.2", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.10.2", + "@swagger-api/apidom-core": "^1.11.0", + "@swagger-api/apidom-ns-api-design-systems": "^1.11.0", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.11.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-arazzo-json-1": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-arazzo-json-1/-/apidom-parser-adapter-arazzo-json-1-1.10.2.tgz", - "integrity": "sha512-HwiUkwvo5i2hV2SS6KWrdj62BdceZGfhuXhr1il8akWekpU4jXPtr5pv4gOnKKJN7VgjAmwt/DlcCSRo1+9jVA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-arazzo-json-1/-/apidom-parser-adapter-arazzo-json-1-1.11.0.tgz", + "integrity": "sha512-z9K6XEr3AafV2EA+1pfW+8VoMCCSSpm2IU7oUTjSnhxRb5t/DZR4Qg8FEK8tRKdS2BO2kFFLb2xikrY3Qx8B+g==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.10.2", - "@swagger-api/apidom-ns-arazzo-1": "^1.10.2", - "@swagger-api/apidom-parser-adapter-json": "^1.10.2", + "@swagger-api/apidom-core": "^1.11.0", + "@swagger-api/apidom-ns-arazzo-1": "^1.11.0", + "@swagger-api/apidom-parser-adapter-json": "^1.11.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-arazzo-yaml-1": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-arazzo-yaml-1/-/apidom-parser-adapter-arazzo-yaml-1-1.10.2.tgz", - "integrity": "sha512-w8VTVuE7GPbRqWxvMgRoTb726JRsMhFPMfTBf8+MJ4pQThjk78dSXPV2Zlse71b2DWBuQy2sr6zGyLUNs/3ePQ==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-arazzo-yaml-1/-/apidom-parser-adapter-arazzo-yaml-1-1.11.0.tgz", + "integrity": "sha512-HPb7Wzr+cj0IJkRRlqsK1tNCQXivuGRP4iB2yek16sQZXo2eqSUZ3j3Lz/WwWgnN/FWGAODm4bj9+EhGQ11TnA==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.10.2", - "@swagger-api/apidom-ns-arazzo-1": "^1.10.2", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.10.2", + "@swagger-api/apidom-core": "^1.11.0", + "@swagger-api/apidom-ns-arazzo-1": "^1.11.0", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.11.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-asyncapi-json-2": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-json-2/-/apidom-parser-adapter-asyncapi-json-2-1.10.2.tgz", - "integrity": "sha512-FDNjqmn2vV1jFoVVwQDO0XPPm8R5xzmcyY/6yBLFmKZADin3smSKVZ+njYHmfRjpspXwN0AwI0drdvuH0FZLJg==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-json-2/-/apidom-parser-adapter-asyncapi-json-2-1.11.0.tgz", + "integrity": "sha512-sQenLXZRmTDQehe3JCSQpz6jpE3DhMQ0aoe2gpNqo23Gt/4oeW6nAP2h49q9Ne+CHPp0ApFUUyIXF7UTmbUWqA==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.10.2", - "@swagger-api/apidom-ns-asyncapi-2": "^1.10.2", - "@swagger-api/apidom-parser-adapter-json": "^1.10.2", + "@swagger-api/apidom-core": "^1.11.0", + "@swagger-api/apidom-ns-asyncapi-2": "^1.11.0", + "@swagger-api/apidom-parser-adapter-json": "^1.11.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-asyncapi-json-3": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-json-3/-/apidom-parser-adapter-asyncapi-json-3-1.10.2.tgz", - "integrity": "sha512-x/0vM2nDDzYzFnXr69+so/KSH+2py2TiZd1K49pWcX8cHsPV1Y4Ppih7GVOMymd8m/IOCjLYlV7qt4eWDwdldg==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-json-3/-/apidom-parser-adapter-asyncapi-json-3-1.11.0.tgz", + "integrity": "sha512-aGnG3AYp4Qsimn1FOP0B9leYCJAQVockzHqyJj30xiNAXquBMXr6lq3L2/AEsmpDGv/x/++YJ4p2ggSxy12QNw==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.10.2", - "@swagger-api/apidom-ns-asyncapi-3": "^1.10.2", - "@swagger-api/apidom-parser-adapter-json": "^1.10.2", + "@swagger-api/apidom-core": "^1.11.0", + "@swagger-api/apidom-ns-asyncapi-3": "^1.11.0", + "@swagger-api/apidom-parser-adapter-json": "^1.11.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-yaml-2/-/apidom-parser-adapter-asyncapi-yaml-2-1.10.2.tgz", - "integrity": "sha512-2bVACmU9ZmAVVnqQWSc3Bs+xG0HHLU1tfZbYL8xNgSi8kw4HcnejF5mWtN+MLFzTaBmWCi2In7P7BYNR8+2Dyg==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-yaml-2/-/apidom-parser-adapter-asyncapi-yaml-2-1.11.0.tgz", + "integrity": "sha512-iIRlB8B46UPiu0EkKhq1TvwloBgObASJ5ROx8rhT5+Pj+BBegE+KIY02EUKwcz5FgXJrH3XcltLiI7ZA68347Q==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.10.2", - "@swagger-api/apidom-ns-asyncapi-2": "^1.10.2", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.10.2", + "@swagger-api/apidom-core": "^1.11.0", + "@swagger-api/apidom-ns-asyncapi-2": "^1.11.0", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.11.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-asyncapi-yaml-3": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-yaml-3/-/apidom-parser-adapter-asyncapi-yaml-3-1.10.2.tgz", - "integrity": "sha512-oHpbf+iqBcDS3qtsipMpgCwAeckKMxg0qFKYTCRZyJdctRgupJTxVeir6t/SGo0Ny0a1iknt2LN0u5frEen0kg==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-yaml-3/-/apidom-parser-adapter-asyncapi-yaml-3-1.11.0.tgz", + "integrity": "sha512-BF2ZyQYMUNrjP1nMneX6ZD2IWBLycWpxg3yllXDCJtfdQT/IMzldIPKCNI9qoBE57lM6j2hpy+Jd86QJk20t2w==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.10.2", - "@swagger-api/apidom-ns-asyncapi-3": "^1.10.2", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.10.2", + "@swagger-api/apidom-core": "^1.11.0", + "@swagger-api/apidom-ns-asyncapi-3": "^1.11.0", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.11.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-json": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-json/-/apidom-parser-adapter-json-1.10.2.tgz", - "integrity": "sha512-VnwEkarKfsJYRF0zCI9AGiSIyBUXqS2d32KQuhVCt/HeuF1XO9sjeLjGiosA/24YVOnO0ul5TpiNFQn0pw89mA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-json/-/apidom-parser-adapter-json-1.11.0.tgz", + "integrity": "sha512-DObW0LxYwif0erzGoXiEAZ6ecc/18LIEKxjEAc5Bw2M5I0C/iGW4y/UxAywihGvhMEo1gOvdO6w9Jh6UnuPVmA==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-ast": "^1.10.2", - "@swagger-api/apidom-core": "^1.10.2", - "@swagger-api/apidom-error": "^1.10.2", + "@swagger-api/apidom-ast": "^1.11.0", + "@swagger-api/apidom-core": "^1.11.0", + "@swagger-api/apidom-error": "^1.11.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -5860,144 +7140,144 @@ } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-json-2": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-2/-/apidom-parser-adapter-openapi-json-2-1.10.2.tgz", - "integrity": "sha512-+d/o/8TrNBjvFzgPb0RQhrCc8gOWnrHZF+xvCO5gwp+4MUr1XP1AJIox1e6t1SO+j7IQjiF2ocx2r7eFE5QC7w==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-2/-/apidom-parser-adapter-openapi-json-2-1.11.0.tgz", + "integrity": "sha512-dREUHAEHVry9aSGjqDpYF9Wzm1lgUkV6EgoYDflyQ9HxgCwhucDPFmUgI7UaR0G6bplnJumMcZXh1I1TGn1v7Q==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.10.2", - "@swagger-api/apidom-ns-openapi-2": "^1.10.2", - "@swagger-api/apidom-parser-adapter-json": "^1.10.2", + "@swagger-api/apidom-core": "^1.11.0", + "@swagger-api/apidom-ns-openapi-2": "^1.11.0", + "@swagger-api/apidom-parser-adapter-json": "^1.11.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-json-3-0": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-0/-/apidom-parser-adapter-openapi-json-3-0-1.10.2.tgz", - "integrity": "sha512-3ieUeX8/WywkUzdOO1U1QKQDNmpZFfOeTAeb4ISDd/PKOVwuEx/b0w5I8EuOu97tKAe3UUesEdii+pJlkcFlFw==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-0/-/apidom-parser-adapter-openapi-json-3-0-1.11.0.tgz", + "integrity": "sha512-U/NZpvuj9IpUS48zF2tYbgW2AtTw6Yi6kXNiHUtgUEomxYdb6XQeKLDGvgeWjgAgfUROohakcH+wx713VCGxfQ==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.10.2", - "@swagger-api/apidom-ns-openapi-3-0": "^1.10.2", - "@swagger-api/apidom-parser-adapter-json": "^1.10.2", + "@swagger-api/apidom-core": "^1.11.0", + "@swagger-api/apidom-ns-openapi-3-0": "^1.11.0", + "@swagger-api/apidom-parser-adapter-json": "^1.11.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-json-3-1": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-1/-/apidom-parser-adapter-openapi-json-3-1-1.10.2.tgz", - "integrity": "sha512-z0c7IgMPLSDhE+ldTb54Xlhq+yPF0w/8LHXyeHX4V6BS1VG3Utb+mM/qTVfy1Eo+p1KGNlwNDEPsBp6jIaVb5Q==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-1/-/apidom-parser-adapter-openapi-json-3-1-1.11.0.tgz", + "integrity": "sha512-fYarNeaz39oKZ6VwqwON+IeJszidZGPvUYDfggLaar81NGimrz07y1U+DhAf96IX3qgUa2J6Fu3Bv1r57hs6Ng==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.10.2", - "@swagger-api/apidom-ns-openapi-3-1": "^1.10.2", - "@swagger-api/apidom-parser-adapter-json": "^1.10.2", + "@swagger-api/apidom-core": "^1.11.0", + "@swagger-api/apidom-ns-openapi-3-1": "^1.11.0", + "@swagger-api/apidom-parser-adapter-json": "^1.11.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-json-3-2": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-2/-/apidom-parser-adapter-openapi-json-3-2-1.10.2.tgz", - "integrity": "sha512-bx/kEIXWtpHu+4LEiyNdt0v8ER5EVwPjhQdlpOaC5qghnRH9aUYOTawZtVHsNHAQWTIMNn9DdPKYQgttQKD0Pw==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-2/-/apidom-parser-adapter-openapi-json-3-2-1.11.0.tgz", + "integrity": "sha512-jtMoAH3R73bQUc4D2cJTUUvO4iJz9CV1W4+zoU/gT2l6h8Ji5EhZH0/VyynUk4J6mW/GdwxUN/q5z2P/DtSmfA==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.10.2", - "@swagger-api/apidom-ns-openapi-3-2": "^1.10.2", - "@swagger-api/apidom-parser-adapter-json": "^1.10.2", + "@swagger-api/apidom-core": "^1.11.0", + "@swagger-api/apidom-ns-openapi-3-2": "^1.11.0", + "@swagger-api/apidom-parser-adapter-json": "^1.11.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-yaml-2": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-2/-/apidom-parser-adapter-openapi-yaml-2-1.10.2.tgz", - "integrity": "sha512-e86JUXHGGEVsO4/xpy/GRSvYXGN30hLt1lMUhjzCFuE95N6/K3hmQHE3rA/H7ot1ajCWUhzukW5rGQac79NIjA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-2/-/apidom-parser-adapter-openapi-yaml-2-1.11.0.tgz", + "integrity": "sha512-e8L4kHahgkOIzCCSGs5jTahXLInERNr37teSLS4SuqYgSVWr9AVXuNvpHNYGeMECD8briGIGfAAtnZChCGYrEA==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.10.2", - "@swagger-api/apidom-ns-openapi-2": "^1.10.2", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.10.2", + "@swagger-api/apidom-core": "^1.11.0", + "@swagger-api/apidom-ns-openapi-2": "^1.11.0", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.11.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-0/-/apidom-parser-adapter-openapi-yaml-3-0-1.10.2.tgz", - "integrity": "sha512-ucfc13Ai31tJ0ruAm1YiHhqENgcBuiOXL00OhoICWA56ggAcnA5WfWmvtsXVMlZsTHVbhZP3XpsH5rui2N8u5w==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-0/-/apidom-parser-adapter-openapi-yaml-3-0-1.11.0.tgz", + "integrity": "sha512-s+AXnNzLeAk28jUAeXwTSR1AlX+TXIAt2GfFgWUAV+SFw2OhRpoKYLzItN3n2UsHselqHvfyUL9xNCJBZleQtQ==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.10.2", - "@swagger-api/apidom-ns-openapi-3-0": "^1.10.2", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.10.2", + "@swagger-api/apidom-core": "^1.11.0", + "@swagger-api/apidom-ns-openapi-3-0": "^1.11.0", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.11.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-1/-/apidom-parser-adapter-openapi-yaml-3-1-1.10.2.tgz", - "integrity": "sha512-7o8j93qgf9yYAaaJ/GpH+5sB3fC9EmvmjTCqlw5YWXp+cRgCn9q7f80Sv4+NjbracUafB6qL4i9F/m+Xs0XZaQ==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-1/-/apidom-parser-adapter-openapi-yaml-3-1-1.11.0.tgz", + "integrity": "sha512-xyUyehHhB+BSOAT7mYGqmcEozuLKxmx1Hug97O9SVgNU8QTClc95+VWrAHhJbn8juPR6y2vSwm/wrQDwb4yq7w==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.10.2", - "@swagger-api/apidom-ns-openapi-3-1": "^1.10.2", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.10.2", + "@swagger-api/apidom-core": "^1.11.0", + "@swagger-api/apidom-ns-openapi-3-1": "^1.11.0", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.11.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-yaml-3-2": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-2/-/apidom-parser-adapter-openapi-yaml-3-2-1.10.2.tgz", - "integrity": "sha512-blDIeVmo8bpXYV/C+b6PYi54yS+5jPEZTFsK5jQ2NzpCPrkBPacp/KTuHBUBzJsYj4bj/ivRL3+JXGw4YovUHw==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-2/-/apidom-parser-adapter-openapi-yaml-3-2-1.11.0.tgz", + "integrity": "sha512-u7Y98zdjEs+0Upa8TdxOsb7z8hYJmLz9lVleRiB7rqysVga6oSDI5NAFdLVqMB6uAUuFi/tyiuiFT4Qosfd6Vw==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.10.2", - "@swagger-api/apidom-ns-openapi-3-2": "^1.10.2", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.10.2", + "@swagger-api/apidom-core": "^1.11.0", + "@swagger-api/apidom-ns-openapi-3-2": "^1.11.0", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.11.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-yaml-1-2": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-yaml-1-2/-/apidom-parser-adapter-yaml-1-2-1.10.2.tgz", - "integrity": "sha512-I5eCls8XS3SVEwH/cuL6T3iar1TPaFYh3gXwS/2rzP1aZQNKSHDP3y3ney7nAomKG4dFvE8Q248FL36arG7T/w==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-yaml-1-2/-/apidom-parser-adapter-yaml-1-2-1.11.0.tgz", + "integrity": "sha512-FZK9KfwiTnNc+imxg7Wu2ktKhXCYPeFQZ1uZJzJL/hk1n+zyPfRY/4Aue4HzDcG8+wbItd3dRjKClFanVZAXoA==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-ast": "^1.10.2", - "@swagger-api/apidom-core": "^1.10.2", - "@swagger-api/apidom-error": "^1.10.2", + "@swagger-api/apidom-ast": "^1.11.0", + "@swagger-api/apidom-core": "^1.11.0", + "@swagger-api/apidom-error": "^1.11.0", "@tree-sitter-grammars/tree-sitter-yaml": "=0.7.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", @@ -6049,14 +7329,14 @@ } }, "node_modules/@swagger-api/apidom-reference": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-reference/-/apidom-reference-1.10.2.tgz", - "integrity": "sha512-H5UqOmae9CXdiLJbbh1j+/hwvcECmr6ci2XtUKTQpFviemvsIDZmPV1DKUAxCfzGr2iOkDO6SZc+/OEWlETqiQ==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-reference/-/apidom-reference-1.11.0.tgz", + "integrity": "sha512-ftqegYrxxl9UwQFbdVOtXIqNolVd25M5u53X8fP96Wx6lEVr5Ed7B6+dzch8ttCUmKeoLIeagvt76b6BoYtnLw==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.10.2", - "@swagger-api/apidom-error": "^1.10.2", + "@swagger-api/apidom-core": "^1.11.0", + "@swagger-api/apidom-error": "^1.11.0", "@types/ramda": "~0.30.0", "axios": "^1.15.0", "minimatch": "^10.2.1", @@ -6064,31 +7344,31 @@ "ramda-adjunct": "^5.0.0" }, "optionalDependencies": { - "@swagger-api/apidom-json-pointer": "^1.10.2", - "@swagger-api/apidom-ns-arazzo-1": "^1.10.2", - "@swagger-api/apidom-ns-asyncapi-2": "^1.10.2", - "@swagger-api/apidom-ns-openapi-2": "^1.10.2", - "@swagger-api/apidom-ns-openapi-3-0": "^1.10.2", - "@swagger-api/apidom-ns-openapi-3-1": "^1.10.2", - "@swagger-api/apidom-ns-openapi-3-2": "^1.10.2", - "@swagger-api/apidom-parser-adapter-api-design-systems-json": "^1.10.2", - "@swagger-api/apidom-parser-adapter-api-design-systems-yaml": "^1.10.2", - "@swagger-api/apidom-parser-adapter-arazzo-json-1": "^1.10.2", - "@swagger-api/apidom-parser-adapter-arazzo-yaml-1": "^1.10.2", - "@swagger-api/apidom-parser-adapter-asyncapi-json-2": "^1.10.2", - "@swagger-api/apidom-parser-adapter-asyncapi-json-3": "^1.10.2", - "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": "^1.10.2", - "@swagger-api/apidom-parser-adapter-asyncapi-yaml-3": "^1.10.2", - "@swagger-api/apidom-parser-adapter-json": "^1.10.2", - "@swagger-api/apidom-parser-adapter-openapi-json-2": "^1.10.2", - "@swagger-api/apidom-parser-adapter-openapi-json-3-0": "^1.10.2", - "@swagger-api/apidom-parser-adapter-openapi-json-3-1": "^1.10.2", - "@swagger-api/apidom-parser-adapter-openapi-json-3-2": "^1.10.2", - "@swagger-api/apidom-parser-adapter-openapi-yaml-2": "^1.10.2", - "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": "^1.10.2", - "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": "^1.10.2", - "@swagger-api/apidom-parser-adapter-openapi-yaml-3-2": "^1.10.2", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.10.2" + "@swagger-api/apidom-json-pointer": "^1.11.0", + "@swagger-api/apidom-ns-arazzo-1": "^1.11.0", + "@swagger-api/apidom-ns-asyncapi-2": "^1.11.0", + "@swagger-api/apidom-ns-openapi-2": "^1.11.0", + "@swagger-api/apidom-ns-openapi-3-0": "^1.11.0", + "@swagger-api/apidom-ns-openapi-3-1": "^1.11.0", + "@swagger-api/apidom-ns-openapi-3-2": "^1.11.0", + "@swagger-api/apidom-parser-adapter-api-design-systems-json": "^1.11.0", + "@swagger-api/apidom-parser-adapter-api-design-systems-yaml": "^1.11.0", + "@swagger-api/apidom-parser-adapter-arazzo-json-1": "^1.11.0", + "@swagger-api/apidom-parser-adapter-arazzo-yaml-1": "^1.11.0", + "@swagger-api/apidom-parser-adapter-asyncapi-json-2": "^1.11.0", + "@swagger-api/apidom-parser-adapter-asyncapi-json-3": "^1.11.0", + "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": "^1.11.0", + "@swagger-api/apidom-parser-adapter-asyncapi-yaml-3": "^1.11.0", + "@swagger-api/apidom-parser-adapter-json": "^1.11.0", + "@swagger-api/apidom-parser-adapter-openapi-json-2": "^1.11.0", + "@swagger-api/apidom-parser-adapter-openapi-json-3-0": "^1.11.0", + "@swagger-api/apidom-parser-adapter-openapi-json-3-1": "^1.11.0", + "@swagger-api/apidom-parser-adapter-openapi-json-3-2": "^1.11.0", + "@swagger-api/apidom-parser-adapter-openapi-yaml-2": "^1.11.0", + "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": "^1.11.0", + "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": "^1.11.0", + "@swagger-api/apidom-parser-adapter-openapi-yaml-3-2": "^1.11.0", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.11.0" } }, "node_modules/@swagger-api/apidom-reference/node_modules/balanced-match": { @@ -6162,17 +7442,17 @@ } }, "node_modules/@tufjs/models": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-2.0.1.tgz", - "integrity": "sha512-92F7/SFyufn4DXsha9+QfKnN03JGqtMFMXgSHbZOo8JG59WkTni7UzAouNQDf7AuP9OAMxVOPQcqG3sB7w+kkg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-3.0.1.tgz", + "integrity": "sha512-UUYHISyhCU3ZgN8yaear3cGATHb3SMuKHsQ/nVbHXcmnBf+LzQ/cQfhNG+rfaSHgqGKNEm2cOCLVLELStUQ1JA==", "dev": true, "license": "MIT", "dependencies": { "@tufjs/canonical-json": "2.0.0", - "minimatch": "^9.0.4" + "minimatch": "^9.0.5" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@tufjs/models/node_modules/brace-expansion": { @@ -6430,19 +7710,6 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.1.tgz", - "integrity": "sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/express/node_modules/@types/express-serve-static-core": { "version": "4.19.8", "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.8.tgz", "integrity": "sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==", @@ -6612,17 +7879,10 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/resolve": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", - "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", + "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", "dev": true, "license": "MIT" }, @@ -6703,9 +7963,9 @@ } }, "node_modules/@uirouter/angular": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/@uirouter/angular/-/angular-13.0.0.tgz", - "integrity": "sha512-T2aizSXzW+7eiXUmc0LiLH+I8ZBJvDr7OQmm/5WCcxVL2NfuIse7B1kpvfdh9PmBAqw8AY7S0NhrJgABfFJUnw==", + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/@uirouter/angular/-/angular-16.1.0.tgz", + "integrity": "sha512-XrGg2Uqd/ECrzmXSqlWe4G7b+854MMIVrzyZGMtzg0RpnIrCz4egZ0QyGnzsNxqd6CD5PHg5imZlPwdQi50bzQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -6714,9 +7974,9 @@ "node": ">=6.0.0" }, "peerDependencies": { - "@angular/common": "^17.0.0", - "@angular/core": "^17.0.0", - "@uirouter/core": "^6.0.8", + "@angular/common": "^19.0.0", + "@angular/core": "^19.0.0", + "@uirouter/core": "^6.1.1", "@uirouter/rx": "^1.0.0" } }, @@ -6740,16 +8000,16 @@ } }, "node_modules/@vitejs/plugin-basic-ssl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.1.0.tgz", - "integrity": "sha512-wO4Dk/rm8u7RNhOf95ZzcEmC9rYOncYgvq4z3duaJrCgjN8BxAnDVyndanfcJZ0O6XZzHz6Q0hTimxTg8Y9g/A==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.2.0.tgz", + "integrity": "sha512-mkQnxTkcldAzIsomk1UuLfAu9n+kpQ3JbHcpCp7d2Oo6ITtji8pHS3QToOWjhPFvNQSnhlkAjmGbhv2QvwO/7Q==", "dev": true, "license": "MIT", "engines": { - "node": ">=14.6.0" + "node": ">=14.21.3" }, "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" } }, "node_modules/@webassemblyjs/ast": { @@ -6956,13 +8216,13 @@ "license": "MIT" }, "node_modules/abbrev": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", - "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz", + "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==", "dev": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/accepts": { @@ -7013,14 +8273,17 @@ "acorn": "^8" } }, - "node_modules/acorn-import-attributes": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", - "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", "dev": true, "license": "MIT", + "engines": { + "node": ">=10.13.0" + }, "peerDependencies": { - "acorn": "^8" + "acorn": "^8.14.0" } }, "node_modules/acorn-walk": { @@ -7075,24 +8338,10 @@ "node": ">= 14" } }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/ajv": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", - "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", "dev": true, "license": "MIT", "dependencies": { @@ -7107,9 +8356,9 @@ } }, "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7194,16 +8443,16 @@ } }, "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", + "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==", "dev": true, "license": "MIT", "dependencies": { - "type-fest": "^0.21.3" + "environment": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -7274,19 +8523,10 @@ "license": "BSD-2-Clause" }, "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/argparse/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "license": "BSD-3-Clause" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" }, "node_modules/array-buffer-byte-length": { "version": "1.0.2", @@ -7376,9 +8616,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.18", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.18.tgz", - "integrity": "sha512-1DKbDfsr6KUElM6wg+0zRNkB/Q7WcKYAaK+pzXn+Xqmszm/5Xa9coeNdtP88Vi+dPzZnMjhge8GIV49ZQkDa+g==", + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", "dev": true, "funding": [ { @@ -7396,11 +8636,11 @@ ], "license": "MIT", "dependencies": { - "browserslist": "^4.23.0", - "caniuse-lite": "^1.0.30001591", + "browserslist": "^4.23.3", + "caniuse-lite": "^1.0.30001646", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", + "picocolors": "^1.0.1", "postcss-value-parser": "^4.2.0" }, "bin": { @@ -7429,12 +8669,12 @@ } }, "node_modules/axios": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.15.2.tgz", - "integrity": "sha512-wLrXxPtcrPTsNlJmKjkPnNPK2Ihe0hn0wGSaTEiHRPxwjvJwT3hKmXF4dpqxmPO9SoNb2FsYXj/xEo0gHN+D5A==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.0.tgz", + "integrity": "sha512-6hp5CwvTPlN2A31g5dxnwAX0orzM7pmCRDLnZSX772mv8WDqICwFjowHuPs04Mc8deIld1+ejhtaMn5vp6b+1w==", "license": "MIT", "dependencies": { - "follow-redirects": "^1.15.11", + "follow-redirects": "^1.16.0", "form-data": "^4.0.5", "proxy-from-env": "^2.1.0" } @@ -7457,9 +8697,9 @@ "license": "MIT" }, "node_modules/babel-loader": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", - "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", + "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", "dev": true, "license": "MIT", "dependencies": { @@ -7483,23 +8723,6 @@ "babel-runtime": "^6.22.0" } }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/babel-plugin-polyfill-corejs2": { "version": "0.4.17", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz", @@ -7743,9 +8966,9 @@ } }, "node_modules/baseline-browser-mapping": { - "version": "2.10.21", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.21.tgz", - "integrity": "sha512-Q+rUQ7Uz8AHM7DEaNdwvfFCTq7a43lNTzuS94eiWqwyxfV/wJv+oUivef51T91mmRY4d4A1u9rcSvkeufCVXlA==", + "version": "2.10.27", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.27.tgz", + "integrity": "sha512-zEs/ufmZoUd7WftKpKyXaT6RFxpQ5Qm9xytKRHvJfxFV9DFJkZph9RvJ1LcOUi0Z1ZVijMte65JbILeV+8QQEA==", "dev": true, "license": "Apache-2.0", "bin": { @@ -7762,6 +8985,135 @@ "dev": true, "license": "MIT" }, + "node_modules/beasties": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.3.2.tgz", + "integrity": "sha512-p4AF8uYzm9Fwu8m/hSVTCPXrRBPmB34hQpHsec2KOaR9CZmgoU8IOv4Cvwq4hgz2p4hLMNbsdNl5XeA6XbAQwA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "htmlparser2": "^10.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.49", + "postcss-media-query-parser": "^0.2.3" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/beasties/node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/beasties/node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/beasties/node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/beasties/node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/beasties/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/beasties/node_modules/htmlparser2": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz", + "integrity": "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "entities": "^7.0.1" + } + }, + "node_modules/beasties/node_modules/htmlparser2/node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -7823,9 +9175,9 @@ } }, "node_modules/body-parser": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", - "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", + "version": "1.20.5", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.5.tgz", + "integrity": "sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA==", "dev": true, "license": "MIT", "dependencies": { @@ -7837,7 +9189,7 @@ "http-errors": "~2.0.1", "iconv-lite": "~0.4.24", "on-finished": "~2.4.1", - "qs": "~6.14.0", + "qs": "~6.15.1", "raw-body": "~2.5.3", "type-is": "~1.6.18", "unpipe": "~1.0.0" @@ -7857,6 +9209,19 @@ "ms": "2.0.0" } }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -7979,7 +9344,23 @@ "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=0.10.0" + } + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/bytes": { @@ -7993,13 +9374,13 @@ } }, "node_modules/cacache": { - "version": "18.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.4.tgz", - "integrity": "sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==", + "version": "19.0.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-19.0.1.tgz", + "integrity": "sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==", "dev": true, "license": "ISC", "dependencies": { - "@npmcli/fs": "^3.1.0", + "@npmcli/fs": "^4.0.0", "fs-minipass": "^3.0.0", "glob": "^10.2.2", "lru-cache": "^10.0.1", @@ -8007,13 +9388,13 @@ "minipass-collect": "^2.0.1", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" + "p-map": "^7.0.2", + "ssri": "^12.0.0", + "tar": "^7.4.3", + "unique-filename": "^4.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/cacache/node_modules/brace-expansion": { @@ -8026,6 +9407,16 @@ "balanced-match": "^1.0.0" } }, + "node_modules/cacache/node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, "node_modules/cacache/node_modules/glob": { "version": "10.5.0", "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", @@ -8071,6 +9462,33 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/cacache/node_modules/tar": { + "version": "7.5.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.13.tgz", + "integrity": "sha512-tOG/7GyXpFevhXVh8jOPJrmtRpOTsYqUIkVdVooZYJS/z8WhfQUX8RJILmeuJNinGAMSu1veBr4asSHFt5/hng==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/cacache/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, "node_modules/call-bind": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", @@ -8139,20 +9557,10 @@ "upper-case": "^1.1.1" } }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/caniuse-lite": { - "version": "1.0.30001790", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001790.tgz", - "integrity": "sha512-bOoxfJPyYo+ds6W0YfptaCWbFnJYjh2Y1Eow5lRv+vI2u8ganPZqNm1JwNh0t2ELQCqIWg4B3dWEusgAmsoyOw==", + "version": "1.0.30001791", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001791.tgz", + "integrity": "sha512-yk0l/YSrOnFZk3UROpDLQD9+kC1l4meK/wed583AXrzoarMGJcbRi2Q4RaUYbKxYAsZ8sWmaSa/DsLmdBeI1vQ==", "dev": true, "funding": [ { @@ -8217,35 +9625,26 @@ } }, "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", + "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==", "dev": true, "license": "MIT" }, "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dev": true, "license": "MIT", "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "readdirp": "^4.0.1" }, "engines": { - "node": ">= 8.10.0" + "node": ">= 14.16.0" }, "funding": { "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" } }, "node_modules/chownr": { @@ -8297,27 +9696,20 @@ "node": ">=0.10.0" } }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", "dev": true, "license": "MIT", "dependencies": { - "restore-cursor": "^3.1.0" + "restore-cursor": "^5.0.0" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cli-spinners": { @@ -8333,6 +9725,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/cli-truncate": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", + "dev": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/cli-width": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", @@ -8384,6 +9793,38 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/cliui/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -8440,6 +9881,19 @@ "node": ">=6" } }, + "node_modules/clone-deep/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -8559,6 +10013,16 @@ "dev": true, "license": "MIT" }, + "node_modules/compression/node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -8679,21 +10143,21 @@ } }, "node_modules/copy-webpack-plugin": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", - "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-12.0.2.tgz", + "integrity": "sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA==", "dev": true, "license": "MIT", "dependencies": { - "fast-glob": "^3.2.11", + "fast-glob": "^3.3.2", "glob-parent": "^6.0.1", - "globby": "^13.1.1", + "globby": "^14.0.0", "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0" + "schema-utils": "^4.2.0", + "serialize-javascript": "^6.0.2" }, "engines": { - "node": ">= 14.15.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", @@ -8703,19 +10167,6 @@ "webpack": "^5.1.0" } }, - "node_modules/copy-webpack-plugin/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/copyfiles": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/copyfiles/-/copyfiles-2.4.1.tgz", @@ -8774,6 +10225,13 @@ "wrap-ansi": "^7.0.0" } }, + "node_modules/copyfiles/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, "node_modules/copyfiles/node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -8796,6 +10254,31 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/copyfiles/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/copyfiles/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/copyfiles/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -8939,98 +10422,16 @@ "typescript": { "optional": true } - } - }, - "node_modules/cosmiconfig/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/cosmiconfig/node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/create-react-class": { - "version": "15.7.0", - "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.7.0.tgz", - "integrity": "sha512-QZv4sFWG9S5RUvkTYWbflxeZX+JG7Cz0Tn33rQBJ+WFQTqTfUTjMjiv9tnfXazjsO5r0KhPs+AqCjyrQX6h2ng==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.3.1", - "object-assign": "^4.1.1" - } - }, - "node_modules/critters": { - "version": "0.0.22", - "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.22.tgz", - "integrity": "sha512-NU7DEcQZM2Dy8XTKFHxtdnIM/drE312j2T4PCVaSUcS0oBeyT/NImpRw/Ap0zOr/1SE7SgPK9tGPg1WK/sVakw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "chalk": "^4.1.0", - "css-select": "^5.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.2", - "htmlparser2": "^8.0.2", - "postcss": "^8.4.23", - "postcss-media-query-parser": "^0.2.3" - } - }, - "node_modules/critters/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/critters/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/critters/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, + } + }, + "node_modules/create-react-class": { + "version": "15.7.0", + "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.7.0.tgz", + "integrity": "sha512-QZv4sFWG9S5RUvkTYWbflxeZX+JG7Cz0Tn33rQBJ+WFQTqTfUTjMjiv9tnfXazjsO5r0KhPs+AqCjyrQX6h2ng==", "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" } }, "node_modules/cross-spawn": { @@ -9061,23 +10462,23 @@ } }, "node_modules/css-loader": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.10.0.tgz", - "integrity": "sha512-LTSA/jWbwdMlk+rhmElbDR2vbtQoTBPr7fkJE+mxrHj+7ru0hUmHafDRzWIjIHTwpitWVaqY2/UWGRca3yUgRw==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.2.tgz", + "integrity": "sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==", "dev": true, "license": "MIT", "dependencies": { "icss-utils": "^5.1.0", "postcss": "^8.4.33", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.4", - "postcss-modules-scope": "^3.1.1", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", "semver": "^7.5.4" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", @@ -9085,7 +10486,7 @@ }, "peerDependencies": { "@rspack/core": "0.x || 1.x", - "webpack": "^5.0.0" + "webpack": "^5.27.0" }, "peerDependenciesMeta": { "@rspack/core": { @@ -9097,16 +10498,16 @@ } }, "node_modules/css-select": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", - "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", "nth-check": "^2.0.1" }, "funding": { @@ -9271,17 +10672,34 @@ "node": ">=0.10.0" } }, - "node_modules/default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "node_modules/default-browser": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz", + "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "execa": "^5.0.0" + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" }, "engines": { - "node": ">= 10" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/defaults": { @@ -9315,13 +10733,16 @@ } }, "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/define-properties": { @@ -9382,6 +10803,17 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8" + } + }, "node_modules/detect-node": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", @@ -9406,19 +10838,6 @@ "node": ">=0.3.1" } }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/dns-packet": { "version": "5.6.1", "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", @@ -9456,20 +10875,30 @@ } }, "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", "dev": true, "license": "MIT", "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" }, "funding": { "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/domelementtype": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", @@ -9484,13 +10913,13 @@ "license": "BSD-2-Clause" }, "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "domelementtype": "^2.3.0" + "domelementtype": "^2.2.0" }, "engines": { "node": ">= 4" @@ -9506,15 +10935,15 @@ "license": "(MPL-2.0 OR Apache-2.0)" }, "node_modules/domutils": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" }, "funding": { "url": "https://github.com/fb55/domutils?sponsor=1" @@ -9598,9 +11027,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.344", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.344.tgz", - "integrity": "sha512-4MxfbmNDm+KPh066EZy+eUnkcDPcZ35wNmOWzFuh/ijvHsve6kbLTLURy88uCNK5FbpN+yk2nQY6BYh1GEt+wg==", + "version": "1.5.349", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.349.tgz", + "integrity": "sha512-QsWVGyRuY07Aqb234QytTfwd5d9AJlfNIQ5wIOl1L+PZDzI9d9+Fn0FRale/QYlFxt/bUnB0/nLd1jFPGxGK1A==", "dev": true, "license": "ISC" }, @@ -9613,9 +11042,9 @@ } }, "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", "dev": true, "license": "MIT" }, @@ -9661,9 +11090,9 @@ } }, "node_modules/engine.io": { - "version": "6.6.6", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.6.tgz", - "integrity": "sha512-U2SN0w3OpjFRVlrc17E6TMDmH58Xl9rai1MblNjAdwWp07Kk+llmzX0hjDpQdrDGzwmvOtgM5yI+meYX6iZ2xA==", + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.7.tgz", + "integrity": "sha512-DgOngfDKM2EviOH3Mr9m7ks1q8roetLy/IMmYthAYzbpInMbYc/GS+fWFA3rl1gvwKVsQrVV61fo5emD1y3OJQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9693,14 +11122,14 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.20.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz", - "integrity": "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==", + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.0.tgz", + "integrity": "sha512-otxSQPw4lkOZWkHpB3zaEQs6gWYEsmX4xQF68ElXC/TWvGxGMSGOvoNbaLXm6/cS/fSfHtsEdw90y20PCd+sCA==", "dev": true, "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", - "tapable": "^2.3.0" + "tapable": "^2.3.3" }, "engines": { "node": ">=10.13.0" @@ -9723,10 +11152,9 @@ } }, "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", "license": "BSD-2-Clause", "engines": { "node": ">=0.12" @@ -9745,6 +11173,19 @@ "node": ">=6" } }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/err-code": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", @@ -9979,56 +11420,57 @@ } }, "node_modules/esbuild": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.1.tgz", - "integrity": "sha512-OJwEgrpWm/PCMsLVWXKqvcjme3bHNpOgN7Tb6cQnR5n0TPbQx1/Xrn7rqM+wn17bYeT6MGB5sn1Bh5YiGi70nA==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.4.tgz", + "integrity": "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==", "dev": true, "hasInstallScript": true, "license": "MIT", - "optional": true, "bin": { "esbuild": "bin/esbuild" }, "engines": { - "node": ">=12" + "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.20.1", - "@esbuild/android-arm": "0.20.1", - "@esbuild/android-arm64": "0.20.1", - "@esbuild/android-x64": "0.20.1", - "@esbuild/darwin-arm64": "0.20.1", - "@esbuild/darwin-x64": "0.20.1", - "@esbuild/freebsd-arm64": "0.20.1", - "@esbuild/freebsd-x64": "0.20.1", - "@esbuild/linux-arm": "0.20.1", - "@esbuild/linux-arm64": "0.20.1", - "@esbuild/linux-ia32": "0.20.1", - "@esbuild/linux-loong64": "0.20.1", - "@esbuild/linux-mips64el": "0.20.1", - "@esbuild/linux-ppc64": "0.20.1", - "@esbuild/linux-riscv64": "0.20.1", - "@esbuild/linux-s390x": "0.20.1", - "@esbuild/linux-x64": "0.20.1", - "@esbuild/netbsd-x64": "0.20.1", - "@esbuild/openbsd-x64": "0.20.1", - "@esbuild/sunos-x64": "0.20.1", - "@esbuild/win32-arm64": "0.20.1", - "@esbuild/win32-ia32": "0.20.1", - "@esbuild/win32-x64": "0.20.1" + "@esbuild/aix-ppc64": "0.25.4", + "@esbuild/android-arm": "0.25.4", + "@esbuild/android-arm64": "0.25.4", + "@esbuild/android-x64": "0.25.4", + "@esbuild/darwin-arm64": "0.25.4", + "@esbuild/darwin-x64": "0.25.4", + "@esbuild/freebsd-arm64": "0.25.4", + "@esbuild/freebsd-x64": "0.25.4", + "@esbuild/linux-arm": "0.25.4", + "@esbuild/linux-arm64": "0.25.4", + "@esbuild/linux-ia32": "0.25.4", + "@esbuild/linux-loong64": "0.25.4", + "@esbuild/linux-mips64el": "0.25.4", + "@esbuild/linux-ppc64": "0.25.4", + "@esbuild/linux-riscv64": "0.25.4", + "@esbuild/linux-s390x": "0.25.4", + "@esbuild/linux-x64": "0.25.4", + "@esbuild/netbsd-arm64": "0.25.4", + "@esbuild/netbsd-x64": "0.25.4", + "@esbuild/openbsd-arm64": "0.25.4", + "@esbuild/openbsd-x64": "0.25.4", + "@esbuild/sunos-x64": "0.25.4", + "@esbuild/win32-arm64": "0.25.4", + "@esbuild/win32-ia32": "0.25.4", + "@esbuild/win32-x64": "0.25.4" } }, "node_modules/esbuild-wasm": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.20.1.tgz", - "integrity": "sha512-6v/WJubRsjxBbQdz6izgvx7LsVFvVaGmSdwrFHmEzoVgfXL89hkKPoQHsnVI2ngOkcBUQT9kmAM1hVL1k/Av4A==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.25.4.tgz", + "integrity": "sha512-2HlCS6rNvKWaSKhWaG/YIyRsTsL3gUrMP2ToZMBIjw9LM7vVcIs+rz8kE2vExvTJgvM8OKPqNpcHawY/BQc/qQ==", "dev": true, "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/escalade": { @@ -10087,9 +11529,9 @@ } }, "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha512-AWwVMNxwhN8+NIPQzAQZCm7RkLC4RbM3B1OobMuyp3i+w73X57KCKaVIxaRZb+DYCojq7rspo+fmuQfAboyhFg==", "dev": true, "license": "BSD-2-Clause", "bin": { @@ -10192,107 +11634,6 @@ "node": ">=0.8.x" } }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/execa/node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/execa/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/execa/node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/execa/node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/execa/node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/execa/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/exif-js": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/exif-js/-/exif-js-2.1.1.tgz", @@ -10399,6 +11740,22 @@ "dev": true, "license": "MIT" }, + "node_modules/express/node_modules/qs": { + "version": "6.14.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz", + "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/express/node_modules/statuses": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", @@ -10415,31 +11772,16 @@ "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", "license": "ISC", "dependencies": { - "type": "^2.7.2" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true, - "license": "MIT" - }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "license": "MIT", - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" + "type": "^2.7.2" } }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true, + "license": "MIT" + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -10447,9 +11789,9 @@ "license": "MIT" }, "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, "license": "MIT", "dependencies": { @@ -10457,12 +11799,25 @@ "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" } }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fast-json-patch": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz", @@ -10476,9 +11831,9 @@ "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", + "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", "dev": true, "funding": [ { @@ -10566,20 +11921,22 @@ "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", "license": "MIT" }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, "engines": { - "node": ">=8" + "node": ">=12.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } } }, "node_modules/fill-range": { @@ -10662,17 +12019,20 @@ } }, "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", "dev": true, "license": "MIT", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/flat": { @@ -10801,19 +12161,6 @@ "node": ">=8" } }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/foreground-child/node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -10916,13 +12263,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/fs-monkey": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.1.0.tgz", - "integrity": "sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw==", - "dev": true, - "license": "Unlicense" - }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -11015,6 +12355,19 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-east-asian-width": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz", + "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -11039,16 +12392,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/get-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", @@ -11068,19 +12411,6 @@ "integrity": "sha512-lXNzT/h/dTjTxRbm9BXb+SGxxzkm97h/PCIKtlN/CBCxxmkkIVV21udumMS93MuVTDX583gqc94v3RjuHmI+2Q==", "license": "MIT" }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/get-symbol-description": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", @@ -11121,16 +12451,33 @@ } }, "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "license": "ISC", "dependencies": { - "is-glob": "^4.0.1" + "is-glob": "^4.0.3" }, "engines": { - "node": ">= 6" + "node": ">=10.13.0" + } + }, + "node_modules/glob-to-regex.js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/glob-to-regex.js/-/glob-to-regex.js-1.2.0.tgz", + "integrity": "sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, "node_modules/glob-to-regexp": { @@ -11190,20 +12537,21 @@ } }, "node_modules/globby": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", - "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz", + "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==", "dev": true, "license": "MIT", "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.3.0", - "ignore": "^5.2.4", - "merge2": "^1.4.1", - "slash": "^4.0.0" + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.3", + "ignore": "^7.0.3", + "path-type": "^6.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.3.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -11424,16 +12772,16 @@ } }, "node_modules/hosted-git-info": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", - "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.1.0.tgz", + "integrity": "sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==", "dev": true, "license": "ISC", "dependencies": { "lru-cache": "^10.0.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/hosted-git-info/node_modules/lru-cache": { @@ -11496,23 +12844,6 @@ "safe-buffer": "~5.1.0" } }, - "node_modules/html-entities": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", - "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ], - "license": "MIT" - }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -11686,9 +13017,9 @@ } }, "node_modules/htmlparser2": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", "dev": true, "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", @@ -11699,10 +13030,20 @@ ], "license": "MIT", "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "entities": "^4.4.0" + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, "node_modules/http-cache-semantics": { @@ -11787,65 +13128,62 @@ } }, "node_modules/http-proxy-middleware": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.8.tgz", - "integrity": "sha512-/iazaeFPmL8KLA6QB7DFAU4O5j+9y/TA0D019MbLtPuFI56VK4BXFzM6j6QS9oGpScy8IIDH4S2LHv3zg/63Bw==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-3.0.5.tgz", + "integrity": "sha512-GLZZm1X38BPY4lkXA01jhwxvDoOkkXqjgVyUzVxiEK4iuRu03PZoYHhHRwxnfhQMDuaxi3vVri0YgSro/1oWqg==", "dev": true, "license": "MIT", "dependencies": { - "@types/http-proxy": "^1.17.8", + "@types/http-proxy": "^1.17.15", + "debug": "^4.3.6", "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" + "is-glob": "^4.0.3", + "is-plain-object": "^5.0.0", + "micromatch": "^4.0.8" }, "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/https-proxy-agent": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", - "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dev": true, "license": "MIT", "dependencies": { - "agent-base": "^7.0.2", + "agent-base": "^7.1.2", "debug": "4" }, "engines": { "node": ">= 14" } }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "node_modules/hyperdyperid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", + "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "engines": { - "node": ">=10.17.0" + "node": ">=10.18" } }, "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", "dev": true, "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/icss-utils": { @@ -11882,9 +13220,9 @@ "license": "BSD-3-Clause" }, "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "dev": true, "license": "MIT", "engines": { @@ -11892,16 +13230,16 @@ } }, "node_modules/ignore-walk": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.5.tgz", - "integrity": "sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-7.0.0.tgz", + "integrity": "sha512-T4gbf83A4NH95zvhVYZc+qWocBBGlpzUXLPGurJggw/WIOwicfXJChLDP/iBZnN5WqROSu5Bm3hhle4z8a8YGQ==", "dev": true, "license": "ISC", "dependencies": { "minimatch": "^9.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/ignore-walk/node_modules/brace-expansion": { @@ -11945,9 +13283,9 @@ } }, "node_modules/immutable": { - "version": "4.3.8", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.8.tgz", - "integrity": "sha512-d/Ld9aLbKpNwyl0KiM2CT1WYvkitQ1TSvmRtkcV8FKStiDoA7Slzgjmb/1G2yhKM1p0XeNOieaTbFZmU1d3Xuw==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.5.tgz", + "integrity": "sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==", "license": "MIT" }, "node_modules/import-fresh": { @@ -11967,16 +13305,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -11987,16 +13315,6 @@ "node": ">=0.8.19" } }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -12016,94 +13334,31 @@ "license": "ISC" }, "node_modules/ini": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.2.tgz", - "integrity": "sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-5.0.0.tgz", + "integrity": "sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==", "dev": true, "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/injection-js": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/injection-js/-/injection-js-2.6.1.tgz", - "integrity": "sha512-dbR5bdhi7TWDoCye9cByZqeg/gAfamm8Vu3G1KZOTYkOif8WkuM8CD0oeDPtZYMzT5YH76JAFB7bkmyY9OJi2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.0.0" - } - }, - "node_modules/inputmask": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/inputmask/-/inputmask-5.0.8.tgz", - "integrity": "sha512-1WcbyudPTXP1B28ozWWyFa6QRIUG4KiLoyR6LFHlpT4OfTzRqFfWgHFadNvRuMN1S9XNVz9CdNvCGjJi+uAMqQ==", - "license": "MIT" - }, - "node_modules/inquirer": { - "version": "9.2.15", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.15.tgz", - "integrity": "sha512-vI2w4zl/mDluHt9YEQ/543VTCwPKWiHzKtm9dM2V0NdFcqEexDAjUHzO1oA60HRNaVifGXXM1tRRNluLVHa0Kg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ljharb/through": "^2.3.12", - "ansi-escapes": "^4.3.2", - "chalk": "^5.3.0", - "cli-cursor": "^3.1.0", - "cli-width": "^4.1.0", - "external-editor": "^3.1.0", - "figures": "^3.2.0", - "lodash": "^4.17.21", - "mute-stream": "1.0.0", - "ora": "^5.4.1", - "run-async": "^3.0.0", - "rxjs": "^7.8.1", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^6.2.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/inquirer/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer/node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/inquirer/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/injection-js": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/injection-js/-/injection-js-2.6.1.tgz", + "integrity": "sha512-dbR5bdhi7TWDoCye9cByZqeg/gAfamm8Vu3G1KZOTYkOif8WkuM8CD0oeDPtZYMzT5YH76JAFB7bkmyY9OJi2A==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" + "tslib": "^2.0.0" } }, + "node_modules/inputmask": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/inputmask/-/inputmask-5.0.8.tgz", + "integrity": "sha512-1WcbyudPTXP1B28ozWWyFa6QRIUG4KiLoyR6LFHlpT4OfTzRqFfWgHFadNvRuMN1S9XNVz9CdNvCGjJi+uAMqQ==", + "license": "MIT" + }, "node_modules/internal-slot": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", @@ -12129,9 +13384,9 @@ } }, "node_modules/ip-address": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", - "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.2.0.tgz", + "integrity": "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==", "dev": true, "license": "MIT", "engines": { @@ -12139,9 +13394,9 @@ } }, "node_modules/ipaddr.js": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.3.0.tgz", - "integrity": "sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.4.0.tgz", + "integrity": "sha512-9VGk3HGanVE6JoZXHiCpnGy5X0jYDnN4EA4lntFPj+1vIWlFhIylq2CrrCOJH9EAhc5CYhq18F2Av2tgoAPsYQ==", "dev": true, "license": "MIT", "engines": { @@ -12276,13 +13531,13 @@ } }, "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", "dev": true, "license": "MIT", "dependencies": { - "hasown": "^2.0.2" + "hasown": "^2.0.3" }, "engines": { "node": ">= 0.4" @@ -12337,16 +13592,16 @@ } }, "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", "dev": true, "license": "MIT", "bin": { "is-docker": "cli.js" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -12389,13 +13644,16 @@ } }, "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-generator-function": { @@ -12441,6 +13699,25 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-interactive": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", @@ -12451,13 +13728,6 @@ "node": ">=8" } }, - "node_modules/is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "dev": true, - "license": "MIT" - }, "node_modules/is-map": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", @@ -12471,13 +13741,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", - "dev": true, - "license": "MIT" - }, "node_modules/is-negative-zero": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", @@ -12491,6 +13754,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-network-error": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.1.tgz", + "integrity": "sha512-6QCxa49rQbmUWLfk0nuGqzql9U8uaV2H6279bRErPBHe/109hCzsLUBUHfbEtvLIHBd6hyXbgedBSHevm43Edw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -12541,14 +13817,11 @@ } }, "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "dev": true, "license": "MIT", - "dependencies": { - "isobject": "^3.0.1" - }, "engines": { "node": ">=0.10.0" } @@ -12749,16 +14022,19 @@ "license": "MIT" }, "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", "dev": true, "license": "MIT", "dependencies": { - "is-docker": "^2.0.0" + "is-inside-container": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/isarray": { @@ -12819,30 +14095,20 @@ } }, "node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" + "semver": "^7.5.4" }, "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "node": ">=10" } }, "node_modules/istanbul-lib-report": { @@ -13014,14 +14280,12 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", - "dev": true, + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "license": "MIT", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" @@ -13048,13 +14312,13 @@ "license": "MIT" }, "node_modules/json-parse-even-better-errors": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", - "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-4.0.0.tgz", + "integrity": "sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==", "dev": true, "license": "MIT", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/json-schema-traverse": { @@ -13078,9 +14342,9 @@ } }, "node_modules/jsonc-parser": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", - "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", "dev": true, "license": "MIT" }, @@ -13295,6 +14559,33 @@ "node": ">=0.10.0" } }, + "node_modules/karma-coverage/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/karma-coverage/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/karma-jasmine": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-5.1.0.tgz", @@ -13359,6 +14650,31 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/karma/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, "node_modules/karma/node_modules/cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -13371,6 +14687,13 @@ "wrap-ansi": "^7.0.0" } }, + "node_modules/karma/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, "node_modules/karma/node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -13393,6 +14716,29 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/karma/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/karma/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/karma/node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -13406,6 +14752,32 @@ "mkdirp": "bin/cmd.js" } }, + "node_modules/karma/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/karma/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, "node_modules/karma/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -13416,27 +14788,32 @@ "node": ">=0.10.0" } }, - "node_modules/karma/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/karma/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" } }, - "node_modules/karma/node_modules/tmp": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", - "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", + "node_modules/karma/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, "engines": { - "node": ">=14.14" + "node": ">=8" } }, "node_modules/karma/node_modules/wrap-ansi": { @@ -13496,16 +14873,6 @@ "node": ">=0.10.0" } }, - "node_modules/klona": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", - "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, "node_modules/launch-editor": { "version": "2.13.2", "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.13.2.tgz", @@ -13539,9 +14906,9 @@ } }, "node_modules/less": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/less/-/less-4.2.0.tgz", - "integrity": "sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/less/-/less-4.2.2.tgz", + "integrity": "sha512-tkuLHQlvWUTeQ3doAqnHbNn8T6WX1KA8yvbKG9x4VtKtIjHsVKQZCH11zRgAfbDAXC2UNIg/K9BYAAcEzUIrNg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -13566,24 +14933,30 @@ } }, "node_modules/less-loader": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.1.0.tgz", - "integrity": "sha512-C+uDBV7kS7W5fJlUjq5mPBeBVhYpTIm5gB09APT9o3n/ILeaXVsiSFTbZpTJCJwQ/Crczfn3DmfQFwxYusWFug==", + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-12.2.0.tgz", + "integrity": "sha512-MYUxjSQSBUQmowc0l5nPieOYwMzGPUaTzB6inNW/bdPEG9zOL3eAAD1Qw5ZxSPk7we5dMojHwNODYMV1hq4EVg==", "dev": true, "license": "MIT", - "dependencies": { - "klona": "^2.0.4" - }, "engines": { - "node": ">= 14.15.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { + "@rspack/core": "0.x || 1.x", "less": "^3.5.0 || ^4.0.0", "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, "node_modules/less/node_modules/make-dir": { @@ -13673,6 +15046,126 @@ "dev": true, "license": "MIT" }, + "node_modules/listr2": { + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.5.tgz", + "integrity": "sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "cli-truncate": "^4.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/listr2/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/listr2/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/listr2/node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/listr2/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/lmdb": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.2.6.tgz", + "integrity": "sha512-SuHqzPl7mYStna8WRotY8XX/EUZBjjv3QyKIByeCLFfC9uXT/OIHByEcA07PzbMfQAM0KYJtLgtpMRlIe5dErQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "msgpackr": "^1.11.2", + "node-addon-api": "^6.1.0", + "node-gyp-build-optional-packages": "5.2.2", + "ordered-binary": "^1.5.3", + "weak-lru-cache": "^1.2.2" + }, + "bin": { + "download-lmdb-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@lmdb/lmdb-darwin-arm64": "3.2.6", + "@lmdb/lmdb-darwin-x64": "3.2.6", + "@lmdb/lmdb-linux-arm": "3.2.6", + "@lmdb/lmdb-linux-arm64": "3.2.6", + "@lmdb/lmdb-linux-x64": "3.2.6", + "@lmdb/lmdb-win32-x64": "3.2.6" + } + }, + "node_modules/lmdb/node_modules/node-addon-api": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", + "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", + "dev": true, + "license": "MIT", + "optional": true + }, "node_modules/load-json-file": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", @@ -13704,9 +15197,9 @@ } }, "node_modules/loader-runner": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", - "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.2.tgz", + "integrity": "sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==", "dev": true, "license": "MIT", "engines": { @@ -13718,9 +15211,9 @@ } }, "node_modules/loader-utils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", - "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz", + "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==", "dev": true, "license": "MIT", "engines": { @@ -13728,16 +15221,19 @@ } }, "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", "dev": true, "license": "MIT", "dependencies": { - "p-locate": "^4.1.0" + "p-locate": "^6.0.0" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/lodash": { @@ -13821,6 +15317,119 @@ "node": ">=8" } }, + "node_modules/log-update": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/log-update/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", + "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/log4js": { "version": "6.9.1", "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", @@ -13891,16 +15500,13 @@ } }, "node_modules/magic-string": { - "version": "0.30.8", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", - "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - }, - "engines": { - "node": ">=12" + "@jridgewell/sourcemap-codec": "^1.5.0" } }, "node_modules/make-dir": { @@ -13920,37 +15526,26 @@ } }, "node_modules/make-fetch-happen": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.1.tgz", - "integrity": "sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA==", + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-14.0.3.tgz", + "integrity": "sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==", "dev": true, "license": "ISC", "dependencies": { - "@npmcli/agent": "^2.0.0", - "cacache": "^18.0.0", + "@npmcli/agent": "^3.0.0", + "cacache": "^19.0.1", "http-cache-semantics": "^4.1.1", - "is-lambda": "^1.0.1", "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", + "minipass-fetch": "^4.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "proc-log": "^4.2.0", + "negotiator": "^1.0.0", + "proc-log": "^5.0.0", "promise-retry": "^2.0.1", - "ssri": "^10.0.0" + "ssri": "^12.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/proc-log": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", - "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/material-colors": { @@ -13979,16 +15574,33 @@ } }, "node_modules/memfs": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", - "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.57.2.tgz", + "integrity": "sha512-2nWzSsJzrukurSDna4Z0WywuScK4Id3tSKejgu74u8KCdW4uNrseKRSIDg75C6Yw5ZRqBe0F0EtMNlTbUq8bAQ==", "dev": true, - "license": "Unlicense", + "license": "Apache-2.0", "dependencies": { - "fs-monkey": "^1.0.4" + "@jsonjoy.com/fs-core": "4.57.2", + "@jsonjoy.com/fs-fsa": "4.57.2", + "@jsonjoy.com/fs-node": "4.57.2", + "@jsonjoy.com/fs-node-builtins": "4.57.2", + "@jsonjoy.com/fs-node-to-fsa": "4.57.2", + "@jsonjoy.com/fs-node-utils": "4.57.2", + "@jsonjoy.com/fs-print": "4.57.2", + "@jsonjoy.com/fs-snapshot": "4.57.2", + "@jsonjoy.com/json-pack": "^1.11.0", + "@jsonjoy.com/util": "^1.9.0", + "glob-to-regex.js": "^1.0.1", + "thingies": "^2.5.0", + "tree-dump": "^1.0.3", + "tslib": "^2.0.0" }, - "engines": { - "node": ">= 4.0.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, "node_modules/memoizee": { @@ -14133,10 +15745,23 @@ "node": ">=6" } }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/mini-css-extract-plugin": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.8.1.tgz", - "integrity": "sha512-/1HDlyFRxWIZPI1ZpgqlZ8jMw/1Dp/dl3P0L1jtZ+zVcHqwPhGwaJwKL00WVgfnBy6PWCde9W65or7IIETImuA==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz", + "integrity": "sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==", "dev": true, "license": "MIT", "dependencies": { @@ -14220,68 +15845,37 @@ } }, "node_modules/minipass-fetch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", - "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-4.0.1.tgz", + "integrity": "sha512-j7U11C5HXigVuutxebFadoYBbd7VSdZWggSe64NVdvWNBqGAiXPL2QVCehjmw7lY1oF9gOllYbORh+hiNgfPgQ==", "dev": true, "license": "MIT", "dependencies": { "minipass": "^7.0.3", "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/minipass-flush": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.7.tgz", - "integrity": "sha512-TbqTz9cUwWyHS2Dy89P3ocAGUGxKjjLuR9z8w4WUTGAVgEj17/4nhgo2Du56i0Fm3Pm30g4iA8Lcqctc76jCzA==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "minipass": "^3.0.0" + "minizlib": "^3.0.1" }, "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-flush/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" + "node": "^18.17.0 || >=20.5.0" }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-flush/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "license": "ISC" + "optionalDependencies": { + "encoding": "^0.1.13" + } }, - "node_modules/minipass-json-stream": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.2.tgz", - "integrity": "sha512-myxeeTm57lYs8pH2nxPzmEEg8DGIgW+9mv6D4JZD2pa81I/OBjeU7PtICXV6c9eRGTA5JMDsuIPUZRCyBMYNhg==", + "node_modules/minipass-flush": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.7.tgz", + "integrity": "sha512-TbqTz9cUwWyHS2Dy89P3ocAGUGxKjjLuR9z8w4WUTGAVgEj17/4nhgo2Du56i0Fm3Pm30g4iA8Lcqctc76jCzA==", "dev": true, - "license": "MIT", + "license": "BlueOak-1.0.0", "dependencies": { - "jsonparse": "^1.3.1", "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/minipass-json-stream/node_modules/minipass": { + "node_modules/minipass-flush/node_modules/minipass": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", @@ -14294,7 +15888,7 @@ "node": ">=8" } }, - "node_modules/minipass-json-stream/node_modules/yallist": { + "node_modules/minipass-flush/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", @@ -14368,39 +15962,18 @@ "license": "ISC" }, "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "dev": true, "license": "MIT", "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" + "minipass": "^7.1.2" }, "engines": { - "node": ">=8" + "node": ">= 18" } }, - "node_modules/minizlib/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "license": "ISC" - }, "node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -14424,9 +15997,9 @@ } }, "node_modules/mrmime": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", - "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", + "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", "dev": true, "license": "MIT", "engines": { @@ -14440,6 +16013,40 @@ "dev": true, "license": "MIT" }, + "node_modules/msgpackr": { + "version": "1.11.12", + "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.12.tgz", + "integrity": "sha512-RBdJ1Un7yGlXWajrkxcSa93nvQ0w4zBf60c0yYv7YtBelP8H2FA7XsfBbMHtXKXUMUxH7zV3Zuozh+kUQWhHvg==", + "dev": true, + "license": "MIT", + "optional": true, + "optionalDependencies": { + "msgpackr-extract": "^3.0.2" + } + }, + "node_modules/msgpackr-extract": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz", + "integrity": "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "node-gyp-build-optional-packages": "5.2.2" + }, + "bin": { + "download-msgpackr-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3" + } + }, "node_modules/multicast-dns": { "version": "7.2.5", "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", @@ -14455,19 +16062,19 @@ } }, "node_modules/mute-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", - "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", "dev": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", "dev": true, "funding": [ { @@ -14516,9 +16123,9 @@ } }, "node_modules/negotiator": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", - "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", "dev": true, "license": "MIT", "engines": { @@ -14548,50 +16155,47 @@ "license": "ISC" }, "node_modules/ng-packagr": { - "version": "17.3.0", - "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-17.3.0.tgz", - "integrity": "sha512-kMSqxeDgv88SWCoapWNRRN1UdBgwu9/Pw/j7u2WFGmzrIWUFivNWBBSSL94kMxr2La+Z9wMwiL8EwKNvmCpg2A==", + "version": "19.2.2", + "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-19.2.2.tgz", + "integrity": "sha512-dFuwFsDJMBSd1YtmLLcX5bNNUCQUlRqgf34aXA+79PmkOP+0eF8GP2949wq3+jMjmFTNm80Oo8IUYiSLwklKCQ==", "dev": true, "license": "MIT", "dependencies": { - "@rollup/plugin-json": "^6.0.1", - "@rollup/plugin-node-resolve": "^15.2.3", - "@rollup/wasm-node": "^4.5.0", - "ajv": "^8.12.0", + "@rollup/plugin-json": "^6.1.0", + "@rollup/wasm-node": "^4.24.0", + "ajv": "^8.17.1", "ansi-colors": "^4.1.3", "browserslist": "^4.22.1", - "cacache": "^18.0.0", - "chokidar": "^3.5.3", - "commander": "^12.0.0", + "chokidar": "^4.0.1", + "commander": "^13.0.0", "convert-source-map": "^2.0.0", "dependency-graph": "^1.0.0", - "esbuild-wasm": "^0.20.0", - "fast-glob": "^3.3.1", + "esbuild": "^0.25.0", + "fast-glob": "^3.3.2", "find-cache-dir": "^3.3.2", "injection-js": "^2.4.0", - "jsonc-parser": "^3.2.0", + "jsonc-parser": "^3.3.1", "less": "^4.2.0", "ora": "^5.1.0", - "piscina": "^4.4.0", - "postcss": "^8.4.31", + "piscina": "^4.7.0", + "postcss": "^8.4.47", "rxjs": "^7.8.1", - "sass": "^1.69.5" + "sass": "^1.81.0" }, "bin": { "ng-packagr": "cli/main.js" }, "engines": { - "node": "^18.13.0 || >=20.9.0" + "node": "^18.19.1 || >=20.11.1" }, "optionalDependencies": { - "esbuild": "^0.20.0", - "rollup": "^4.5.0" + "rollup": "^4.24.0" }, "peerDependencies": { - "@angular/compiler-cli": "^17.0.0 || ^17.2.0-next.0 || ^17.3.0-next.0", - "tailwindcss": "^2.0.0 || ^3.0.0", + "@angular/compiler-cli": "^19.0.0 || ^19.1.0-next.0 || ^19.2.0-next.0", + "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", "tslib": "^2.3.0", - "typescript": ">=5.2 <5.5" + "typescript": ">=5.5 <5.9" }, "peerDependenciesMeta": { "tailwindcss": { @@ -14600,9 +16204,9 @@ } }, "node_modules/ng-packagr/node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", + "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", "dev": true, "license": "MIT", "engines": { @@ -14634,6 +16238,33 @@ "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, + "node_modules/ng-packagr/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ng-packagr/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/ng-packagr/node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -14650,6 +16281,45 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ng-packagr/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ng-packagr/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ng-packagr/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/ng-packagr/node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -14674,21 +16344,35 @@ } }, "node_modules/ngx-build-plus": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/ngx-build-plus/-/ngx-build-plus-17.0.0.tgz", - "integrity": "sha512-rPFt9WlGfPf1hzj3mNZTH6vFWepzkIDFfgVUcnmYsIWtFqxawIMikU87m3wvIh8o6anAyhi0Z7WDxa7BdsEt+A==", + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/ngx-build-plus/-/ngx-build-plus-19.0.0.tgz", + "integrity": "sha512-JXzRvDZH1gQ2xGiePduHoMeR9kaK1cHHhT6d6npVBq8aWGFHs1iAg/5/gkieCsz2QfrcaoSF8ZBb9ZhcGX4Z2g==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/build-angular": "^17.0.0", - "@schematics/angular": "^17.0.0", "webpack-merge": "^5.0.0" }, "peerDependencies": { - "@angular-devkit/build-angular": "^17.0.0", + "@angular-devkit/build-angular": ">=19.0.0", + "@schematics/angular": ">=19.0.0", "rxjs": ">= 6.0.0" } }, + "node_modules/ngx-build-plus/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/ngx-color": { "version": "8.0.3", "resolved": "https://registry.npmjs.org/ngx-color/-/ngx-color-8.0.3.tgz", @@ -14716,22 +16400,6 @@ "@angular/material": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, - "node_modules/nice-napi": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", - "integrity": "sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "!win32" - ], - "dependencies": { - "node-addon-api": "^3.0.0", - "node-gyp-build": "^4.2.2" - } - }, "node_modules/nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", @@ -14756,9 +16424,9 @@ "license": "MIT" }, "node_modules/node-addon-api": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", - "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", "dev": true, "license": "MIT", "optional": true @@ -14821,28 +16489,28 @@ } }, "node_modules/node-gyp": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.3.1.tgz", - "integrity": "sha512-Pp3nFHBThHzVtNY7U6JfPjvT/DTE8+o/4xKsLQtBoU+j2HLsGlhcfzflAoUreaJbNmYnX+LlLi0qjV8kpyO6xQ==", + "version": "11.5.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.5.0.tgz", + "integrity": "sha512-ra7Kvlhxn5V9Slyus0ygMa2h+UqExPqUIkfk7Pc8QTLT956JLSy51uWFwHtIYy0vI8cB4BDhc/S03+880My/LQ==", "dev": true, "license": "MIT", "dependencies": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", - "glob": "^10.3.10", "graceful-fs": "^4.2.6", - "make-fetch-happen": "^13.0.0", - "nopt": "^7.0.0", - "proc-log": "^4.1.0", + "make-fetch-happen": "^14.0.3", + "nopt": "^8.0.0", + "proc-log": "^5.0.0", "semver": "^7.3.5", - "tar": "^6.2.1", - "which": "^4.0.0" + "tar": "^7.4.3", + "tinyglobby": "^0.2.12", + "which": "^5.0.0" }, "bin": { "node-gyp": "bin/node-gyp.js" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/node-gyp-build": { @@ -14857,36 +16525,30 @@ "node-gyp-build-test": "build-test.js" } }, - "node_modules/node-gyp/node_modules/brace-expansion": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", - "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "node_modules/node-gyp-build-optional-packages": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", + "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", "dev": true, "license": "MIT", + "optional": true, "dependencies": { - "balanced-match": "^1.0.0" + "detect-libc": "^2.0.1" + }, + "bin": { + "node-gyp-build-optional-packages": "bin.js", + "node-gyp-build-optional-packages-optional": "optional.js", + "node-gyp-build-optional-packages-test": "build-test.js" } }, - "node_modules/node-gyp/node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "node_modules/node-gyp/node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" } }, "node_modules/node-gyp/node_modules/isexe": { @@ -14899,36 +16561,27 @@ "node": ">=18" } }, - "node_modules/node-gyp/node_modules/minimatch": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "node_modules/node-gyp/node_modules/tar": { + "version": "7.5.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.13.tgz", + "integrity": "sha512-tOG/7GyXpFevhXVh8jOPJrmtRpOTsYqUIkVdVooZYJS/z8WhfQUX8RJILmeuJNinGAMSu1veBr4asSHFt5/hng==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^2.0.2" - }, - "engines": { - "node": ">=16 || 14 >=14.17" + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/node-gyp/node_modules/proc-log": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", - "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", - "dev": true, - "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=18" } }, "node_modules/node-gyp/node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", "dev": true, "license": "ISC", "dependencies": { @@ -14938,7 +16591,17 @@ "node-which": "bin/which.js" }, "engines": { - "node": "^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/node-gyp/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" } }, "node_modules/node-releases": { @@ -14960,34 +16623,49 @@ } }, "node_modules/nopt": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", - "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", + "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", "dev": true, "license": "ISC", "dependencies": { - "abbrev": "^2.0.0" + "abbrev": "^3.0.0" }, "bin": { "nopt": "bin/nopt.js" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/normalize-package-data": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", - "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "hosted-git-info": "^7.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true, + "license": "ISC" + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" } }, "node_modules/normalize-path": { @@ -15011,114 +16689,104 @@ } }, "node_modules/npm-bundled": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.1.tgz", - "integrity": "sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-4.0.0.tgz", + "integrity": "sha512-IxaQZDMsqfQ2Lz37VvyyEtKLe8FsRZuysmedy/N06TU1RyVppYKXrO4xIhR0F+7ubIBox6Q7nir6fQI3ej39iA==", "dev": true, "license": "ISC", "dependencies": { - "npm-normalize-package-bin": "^3.0.0" + "npm-normalize-package-bin": "^4.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm-install-checks": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", - "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-7.1.2.tgz", + "integrity": "sha512-z9HJBCYw9Zr8BqXcllKIs5nI+QggAImbBdHphOzVYrz2CB4iQ6FzWyKmlqDZua+51nAu7FcemlbTc9VgQN5XDQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { "semver": "^7.1.1" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm-normalize-package-bin": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", - "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-4.0.0.tgz", + "integrity": "sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==", "dev": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm-package-arg": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.1.tgz", - "integrity": "sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ==", + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.2.tgz", + "integrity": "sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA==", "dev": true, "license": "ISC", "dependencies": { - "hosted-git-info": "^7.0.0", - "proc-log": "^3.0.0", + "hosted-git-info": "^8.0.0", + "proc-log": "^5.0.0", "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" + "validate-npm-package-name": "^6.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm-packlist": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-8.0.2.tgz", - "integrity": "sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-9.0.0.tgz", + "integrity": "sha512-8qSayfmHJQTx3nJWYbbUmflpyarbLMBc6LCAjYsiGtXxDB68HaZpb8re6zeaLGxZzDuMdhsg70jryJe+RrItVQ==", "dev": true, "license": "ISC", "dependencies": { - "ignore-walk": "^6.0.4" + "ignore-walk": "^7.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm-pick-manifest": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-9.0.0.tgz", - "integrity": "sha512-VfvRSs/b6n9ol4Qb+bDwNGUXutpy76x6MARw/XssevE0TnctIKcmklJZM5Z7nqs5z5aW+0S63pgCNbpkUNNXBg==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-10.0.0.tgz", + "integrity": "sha512-r4fFa4FqYY8xaM7fHecQ9Z2nE9hgNfJR+EmoKv0+chvzWkBcORX3r0FpTByP+CbOVJDladMXnPQGVN8PBLGuTQ==", "dev": true, "license": "ISC", "dependencies": { - "npm-install-checks": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "npm-package-arg": "^11.0.0", + "npm-install-checks": "^7.1.0", + "npm-normalize-package-bin": "^4.0.0", + "npm-package-arg": "^12.0.0", "semver": "^7.3.5" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm-registry-fetch": { - "version": "16.2.1", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-16.2.1.tgz", - "integrity": "sha512-8l+7jxhim55S85fjiDGJ1rZXBWGtRLi1OSb4Z3BPLObPuIaeKRlPRiYMSHU4/81ck3t71Z+UwDDl47gcpmfQQA==", + "version": "18.0.2", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-18.0.2.tgz", + "integrity": "sha512-LeVMZBBVy+oQb5R6FDV9OlJCcWDU+al10oKpe+nsvcHnG24Z3uM3SvJYKfGJlfGjVU8v9liejCrUR/M5HO5NEQ==", "dev": true, "license": "ISC", "dependencies": { - "@npmcli/redact": "^1.1.0", - "make-fetch-happen": "^13.0.0", + "@npmcli/redact": "^3.0.0", + "jsonparse": "^1.3.1", + "make-fetch-happen": "^14.0.0", "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^11.0.0", - "proc-log": "^4.0.0" + "minipass-fetch": "^4.0.0", + "minizlib": "^3.0.1", + "npm-package-arg": "^12.0.0", + "proc-log": "^5.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm-registry-fetch/node_modules/proc-log": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", - "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm-run-all": { @@ -15215,29 +16883,6 @@ "node": ">=4" } }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", @@ -15345,34 +16990,35 @@ } }, "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", "dev": true, "license": "MIT", "dependencies": { - "mimic-fn": "^2.1.0" + "mimic-function": "^5.0.0" }, "engines": { - "node": ">=6" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", + "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", "dev": true, "license": "MIT", "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^3.1.0" }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -15479,6 +17125,56 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/ora/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, "node_modules/ora/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -15505,15 +17201,13 @@ "node": ">=8" } }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "node_modules/ordered-binary": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.6.1.tgz", + "integrity": "sha512-QkCdPooczexPLiXIrbVOPYkR3VO3T6v2OyKRkR1Xbhpy7/LAVXwahnRCgRp78Oe/Ehf0C/HATAxfSr6eA1oX+w==", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.10.0" - } + "optional": true }, "node_modules/own-keys": { "version": "1.0.1", @@ -15534,62 +17228,66 @@ } }, "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", "dev": true, "license": "MIT", "dependencies": { - "p-try": "^2.0.0" + "yocto-queue": "^1.0.0" }, "engines": { - "node": ">=6" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", "dev": true, "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" + "p-limit": "^4.0.0" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", + "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", "dev": true, "license": "MIT", - "dependencies": { - "aggregate-error": "^3.0.0" - }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz", + "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==", "dev": true, "license": "MIT", "dependencies": { - "@types/retry": "0.12.0", + "@types/retry": "0.12.2", + "is-network-error": "^1.0.0", "retry": "^0.13.1" }, "engines": { - "node": ">=8" + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-retry/node_modules/retry": { @@ -15620,36 +17318,35 @@ "license": "BlueOak-1.0.0" }, "node_modules/pacote": { - "version": "17.0.6", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-17.0.6.tgz", - "integrity": "sha512-cJKrW21VRE8vVTRskJo78c/RCvwJCn1f4qgfxL4w77SOWrTCRcmfkYHlHtS0gqpgjv3zhXflRtgsrUCX5xwNnQ==", + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-20.0.0.tgz", + "integrity": "sha512-pRjC5UFwZCgx9kUFDVM9YEahv4guZ1nSLqwmWiLUnDbGsjs+U5w7z6Uc8HNR1a6x8qnu5y9xtGE6D1uAuYz+0A==", "dev": true, "license": "ISC", "dependencies": { - "@npmcli/git": "^5.0.0", - "@npmcli/installed-package-contents": "^2.0.1", - "@npmcli/promise-spawn": "^7.0.0", - "@npmcli/run-script": "^7.0.0", - "cacache": "^18.0.0", + "@npmcli/git": "^6.0.0", + "@npmcli/installed-package-contents": "^3.0.0", + "@npmcli/package-json": "^6.0.0", + "@npmcli/promise-spawn": "^8.0.0", + "@npmcli/run-script": "^9.0.0", + "cacache": "^19.0.0", "fs-minipass": "^3.0.0", "minipass": "^7.0.2", - "npm-package-arg": "^11.0.0", - "npm-packlist": "^8.0.0", - "npm-pick-manifest": "^9.0.0", - "npm-registry-fetch": "^16.0.0", - "proc-log": "^3.0.0", + "npm-package-arg": "^12.0.0", + "npm-packlist": "^9.0.0", + "npm-pick-manifest": "^10.0.0", + "npm-registry-fetch": "^18.0.0", + "proc-log": "^5.0.0", "promise-retry": "^2.0.1", - "read-package-json": "^7.0.0", - "read-package-json-fast": "^3.0.0", - "sigstore": "^2.2.0", - "ssri": "^10.0.0", + "sigstore": "^3.0.0", + "ssri": "^12.0.0", "tar": "^6.1.11" }, "bin": { - "pacote": "lib/bin.js" + "pacote": "bin/index.js" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/papaparse": { @@ -15739,7 +17436,6 @@ "version": "7.3.0", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", - "devOptional": true, "license": "MIT", "dependencies": { "entities": "^6.0.0" @@ -15763,6 +17459,19 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, + "node_modules/parse5-html-rewriting-stream/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?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", @@ -15776,19 +17485,6 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/parse5/node_modules/entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", - "devOptional": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -15832,13 +17528,13 @@ } }, "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, "node_modules/path-is-absolute": { @@ -15900,13 +17596,16 @@ "license": "MIT" }, "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", + "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/performance-now": { @@ -15923,9 +17622,9 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.1.tgz", - "integrity": "sha512-xUXwsxNjwTQ8K3GnT4pCJm+xq3RUPQbmkYJTP5aFIfNIvbcc/4MUxgBaaRSZJ6yGJZiGSyYlM6MzwTsRk8SYCg==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", "engines": { @@ -15959,13 +17658,13 @@ } }, "node_modules/piscina": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.4.0.tgz", - "integrity": "sha512-+AQduEJefrOApE4bV7KRmp3N2JnnyErlVqq4P/jmko4FPz9Z877BCccl/iB3FdrWSUkvbGV9Kan/KllJgat3Vg==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.8.0.tgz", + "integrity": "sha512-EZJb+ZxDrQf3dihsUL7p42pjNyrNIFJCrRHPMgxu/svsj+P3xS3fuEWp7k2+rfsavfl1N0G29b1HGs7J0m8rZA==", "dev": true, "license": "MIT", "optionalDependencies": { - "nice-napi": "^1.0.2" + "@napi-rs/nice": "^1.0.1" } }, "node_modules/pkg-dir": { @@ -15980,83 +17679,8 @@ "engines": { "node": ">=14.16" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/possible-typed-array-names": { @@ -16069,9 +17693,9 @@ } }, "node_modules/postcss": { - "version": "8.4.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", - "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.2.tgz", + "integrity": "sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==", "dev": true, "funding": [ { @@ -16089,9 +17713,9 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -16251,13 +17875,13 @@ } }, "node_modules/proc-log": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", - "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", + "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", "dev": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/process-nextick-args": { @@ -16276,13 +17900,6 @@ "asap": "~2.0.3" } }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "dev": true, - "license": "ISC" - }, "node_modules/promise-retry": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", @@ -16380,9 +17997,9 @@ } }, "node_modules/qs": { - "version": "6.14.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz", - "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==", + "version": "6.15.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.1.tgz", + "integrity": "sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -16498,6 +18115,19 @@ "node": ">= 0.8" } }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/react": { "version": "15.7.0", "resolved": "https://registry.npmjs.org/react/-/react-15.7.0.tgz", @@ -16647,85 +18277,6 @@ "react": ">= 0.14.0" } }, - "node_modules/read-package-json": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-7.0.1.tgz", - "integrity": "sha512-8PcDiZ8DXUjLf687Ol4BR8Bpm2umR7vhoZOzNRt+uxD9GpBh/K+CAAALVIiYFknmvlmyg7hM7BSNUXPaCCqd0Q==", - "deprecated": "This package is no longer supported. Please use @npmcli/package-json instead.", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^10.2.2", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/read-package-json-fast": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", - "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", - "dev": true, - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/read-package-json/node_modules/brace-expansion": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", - "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/read-package-json/node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/read-package-json/node_modules/minimatch": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.2" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/read-pkg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", @@ -16741,26 +18292,6 @@ "node": ">=4" } }, - "node_modules/read-pkg/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true, - "license": "ISC" - }, - "node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, "node_modules/read-pkg/node_modules/path-type": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", @@ -16774,16 +18305,6 @@ "node": ">=4" } }, - "node_modules/read-pkg/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, "node_modules/readable-stream": { "version": "1.0.34", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", @@ -16798,29 +18319,17 @@ } }, "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/readdirp/node_modules/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "dev": true, "license": "MIT", "engines": { - "node": ">=8.6" + "node": ">= 14.18.0" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, "node_modules/recast": { @@ -16839,20 +18348,6 @@ "node": ">= 0.8" } }, - "node_modules/recast/node_modules/esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha512-AWwVMNxwhN8+NIPQzAQZCm7RkLC4RbM3B1OobMuyp3i+w73X57KCKaVIxaRZb+DYCojq7rspo+fmuQfAboyhFg==", - "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/recast/node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -17074,6 +18569,21 @@ "node": ">= 6.0.0" } }, + "node_modules/remarkable/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/remarkable/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" + }, "node_modules/renderkid": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", @@ -17098,99 +18608,6 @@ "node": ">=8" } }, - "node_modules/renderkid/node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/renderkid/node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dev": true, - "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true, - "license": "BSD-2-Clause", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, "node_modules/renderkid/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -17246,31 +18663,34 @@ "license": "MIT" }, "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.13.0", + "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/resolve-url-loader": { @@ -17316,17 +18736,20 @@ } }, "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", "dev": true, "license": "MIT", "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/retry": { @@ -17397,9 +18820,9 @@ } }, "node_modules/rollup": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.2.tgz", - "integrity": "sha512-J9qZyW++QK/09NyN/zeO0dG/1GdGfyp9lV8ajHnRVLfo/uFsbji5mHnDgn/qYdUHyCkM2N+8VyspgZclfAh0eQ==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.3.tgz", + "integrity": "sha512-pAQK9HalE84QSm4Po3EmWIZPd3FnjkShVkiMlz1iligWYkWQ7wHYd1PF/T7QZ5TVSD6uSTon5gBVMSM4JfBV+A==", "dev": true, "license": "MIT", "dependencies": { @@ -17413,42 +18836,45 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.60.2", - "@rollup/rollup-android-arm64": "4.60.2", - "@rollup/rollup-darwin-arm64": "4.60.2", - "@rollup/rollup-darwin-x64": "4.60.2", - "@rollup/rollup-freebsd-arm64": "4.60.2", - "@rollup/rollup-freebsd-x64": "4.60.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.60.2", - "@rollup/rollup-linux-arm-musleabihf": "4.60.2", - "@rollup/rollup-linux-arm64-gnu": "4.60.2", - "@rollup/rollup-linux-arm64-musl": "4.60.2", - "@rollup/rollup-linux-loong64-gnu": "4.60.2", - "@rollup/rollup-linux-loong64-musl": "4.60.2", - "@rollup/rollup-linux-ppc64-gnu": "4.60.2", - "@rollup/rollup-linux-ppc64-musl": "4.60.2", - "@rollup/rollup-linux-riscv64-gnu": "4.60.2", - "@rollup/rollup-linux-riscv64-musl": "4.60.2", - "@rollup/rollup-linux-s390x-gnu": "4.60.2", - "@rollup/rollup-linux-x64-gnu": "4.60.2", - "@rollup/rollup-linux-x64-musl": "4.60.2", - "@rollup/rollup-openbsd-x64": "4.60.2", - "@rollup/rollup-openharmony-arm64": "4.60.2", - "@rollup/rollup-win32-arm64-msvc": "4.60.2", - "@rollup/rollup-win32-ia32-msvc": "4.60.2", - "@rollup/rollup-win32-x64-gnu": "4.60.2", - "@rollup/rollup-win32-x64-msvc": "4.60.2", + "@rollup/rollup-android-arm-eabi": "4.60.3", + "@rollup/rollup-android-arm64": "4.60.3", + "@rollup/rollup-darwin-arm64": "4.60.3", + "@rollup/rollup-darwin-x64": "4.60.3", + "@rollup/rollup-freebsd-arm64": "4.60.3", + "@rollup/rollup-freebsd-x64": "4.60.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.60.3", + "@rollup/rollup-linux-arm-musleabihf": "4.60.3", + "@rollup/rollup-linux-arm64-gnu": "4.60.3", + "@rollup/rollup-linux-arm64-musl": "4.60.3", + "@rollup/rollup-linux-loong64-gnu": "4.60.3", + "@rollup/rollup-linux-loong64-musl": "4.60.3", + "@rollup/rollup-linux-ppc64-gnu": "4.60.3", + "@rollup/rollup-linux-ppc64-musl": "4.60.3", + "@rollup/rollup-linux-riscv64-gnu": "4.60.3", + "@rollup/rollup-linux-riscv64-musl": "4.60.3", + "@rollup/rollup-linux-s390x-gnu": "4.60.3", + "@rollup/rollup-linux-x64-gnu": "4.60.3", + "@rollup/rollup-linux-x64-musl": "4.60.3", + "@rollup/rollup-openbsd-x64": "4.60.3", + "@rollup/rollup-openharmony-arm64": "4.60.3", + "@rollup/rollup-win32-arm64-msvc": "4.60.3", + "@rollup/rollup-win32-ia32-msvc": "4.60.3", + "@rollup/rollup-win32-x64-gnu": "4.60.3", + "@rollup/rollup-win32-x64-msvc": "4.60.3", "fsevents": "~2.3.2" } }, - "node_modules/run-async": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", - "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", + "node_modules/run-applescript": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.12.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/run-parallel": { @@ -17579,21 +19005,15 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "license": "MIT" }, - "node_modules/safevalues": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/safevalues/-/safevalues-0.3.4.tgz", - "integrity": "sha512-LRneZZRXNgjzwG4bDQdOTSbze3fHm1EAKN/8bePxnlEZiBmkYEDggaHbuvHI9/hoqHbGfsEA7tWS9GhYHZBBsw==", - "license": "Apache-2.0" - }, "node_modules/sass": { - "version": "1.71.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.71.1.tgz", - "integrity": "sha512-wovtnV2PxzteLlfNzbgm1tFXPLoZILYAMJtvoXXkD7/+1uP41eKkIt1ypWq5/q2uT94qHjXehEYfmjKOvjL9sg==", + "version": "1.85.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.85.0.tgz", + "integrity": "sha512-3ToiC1xZ1Y8aU7+CkgCI/tqyuPXEmYGJXO7H4uqp0xkLXUqp88rQQ4j1HmP37xSJLbCJPaIiv+cT1y+grssrww==", "dev": true, "license": "MIT", "dependencies": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", + "chokidar": "^4.0.0", + "immutable": "^5.0.2", "source-map-js": ">=0.6.2 <2.0.0" }, "bin": { @@ -17601,12 +19021,15 @@ }, "engines": { "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" } }, "node_modules/sass-loader": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-14.1.1.tgz", - "integrity": "sha512-QX8AasDg75monlybel38BZ49JP5Z+uSKfKwF2rO7S74BywaRmGQMUBw9dtkS+ekyM/QnP+NOrRYq8ABMZ9G8jw==", + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.5.tgz", + "integrity": "sha512-oL+CMBXrj6BZ/zOq4os+UECPL+bWqt6OAC6DWS8Ln8GZRcMDjlJ4JC3FBDuHJdYaFWIdKNIBYmtZtK2MaMkNIw==", "dev": true, "license": "MIT", "dependencies": { @@ -17675,6 +19098,24 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/schema-utils/node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, "node_modules/select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -17804,18 +19245,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/serialize-error/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/serialize-javascript": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", @@ -18136,28 +19565,34 @@ } }, "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, - "license": "ISC" + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, "node_modules/sigstore": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-2.3.1.tgz", - "integrity": "sha512-8G+/XDU8wNsJOQS5ysDVO0Etg9/2uA5gR9l4ZwijjlwxBcrU6RPfwi2+jJmbP+Ap1Hlp/nVAaEO4Fj22/SL2gQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-3.1.0.tgz", + "integrity": "sha512-ZpzWAFHIFqyFE56dXqgX/DkDRZdz+rRcjoIk/RQU4IX0wiCv1l8S7ZrXDHcCc+uaf+6o7w3h2l3g6GYG5TKN9Q==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/bundle": "^2.3.2", - "@sigstore/core": "^1.0.0", - "@sigstore/protobuf-specs": "^0.3.2", - "@sigstore/sign": "^2.3.2", - "@sigstore/tuf": "^2.3.4", - "@sigstore/verify": "^1.2.1" + "@sigstore/bundle": "^3.1.0", + "@sigstore/core": "^2.0.0", + "@sigstore/protobuf-specs": "^0.4.0", + "@sigstore/sign": "^3.1.0", + "@sigstore/tuf": "^3.1.0", + "@sigstore/verify": "^2.1.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/sirv": { @@ -18175,27 +19610,47 @@ "node": ">= 10" } }, - "node_modules/sirv/node_modules/mrmime": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", - "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", + "node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", "dev": true, "license": "MIT", "engines": { - "node": ">=10" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", "dev": true, "license": "MIT", + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, "engines": { "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/smart-buffer": { @@ -18266,13 +19721,13 @@ } }, "node_modules/socks": { - "version": "2.8.7", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", - "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.8.tgz", + "integrity": "sha512-NlGELfPrgX2f1TAAcz0WawlLn+0r3FyhhCRpFFK2CemXenPYvzMWWZINv3eDNo9ucdwme7oCHRY0Jnbs4aIkog==", "dev": true, "license": "MIT", "dependencies": { - "ip-address": "^10.0.1", + "ip-address": "^10.1.1", "smart-buffer": "^4.2.0" }, "engines": { @@ -18480,16 +19935,16 @@ "license": "BSD-3-Clause" }, "node_modules/ssri": { - "version": "10.0.6", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", - "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-12.0.0.tgz", + "integrity": "sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==", "dev": true, "license": "ISC", "dependencies": { "minipass": "^7.0.3" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/statuses": { @@ -18548,18 +20003,21 @@ "license": "MIT" }, "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/string-width-cjs": { @@ -18588,6 +20046,23 @@ "node": ">=8" } }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/string-width-cjs/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -18602,26 +20077,32 @@ } }, "node_modules/string-width/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, "node_modules/string-width/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "ansi-regex": "^6.2.2" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/string.prototype.padend": { @@ -18748,16 +20229,6 @@ "node": ">=4" } }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", @@ -18781,19 +20252,19 @@ } }, "node_modules/swagger-client": { - "version": "3.37.2", - "resolved": "https://registry.npmjs.org/swagger-client/-/swagger-client-3.37.2.tgz", - "integrity": "sha512-KcB8psL1On4GWwv9Ribp1oteh50ygNnAyvQbd5MwiXMGkcB4f53rkZEdvZKPDdJO764mQjgErxQEGDVw6QBUMQ==", + "version": "3.37.3", + "resolved": "https://registry.npmjs.org/swagger-client/-/swagger-client-3.37.3.tgz", + "integrity": "sha512-PZv5smQPnPwfP6mnkq96fOp/RNDKBqd8vfwE4UuwA229wsesj20yd7RadXx+9uLBC3c0H6cu/H+bnbMTWG6oUQ==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.22.15", "@scarf/scarf": "=1.4.0", - "@swagger-api/apidom-core": "^1.10.2", - "@swagger-api/apidom-error": "^1.10.2", - "@swagger-api/apidom-json-pointer": "^1.10.2", - "@swagger-api/apidom-ns-openapi-3-1": "^1.10.2", - "@swagger-api/apidom-ns-openapi-3-2": "^1.10.2", - "@swagger-api/apidom-reference": "^1.10.2", + "@swagger-api/apidom-core": "^1.11.0", + "@swagger-api/apidom-error": "^1.11.0", + "@swagger-api/apidom-json-pointer": "^1.11.0", + "@swagger-api/apidom-ns-openapi-3-1": "^1.11.0", + "@swagger-api/apidom-ns-openapi-3-2": "^1.11.0", + "@swagger-api/apidom-reference": "^1.11.0", "@swaggerexpert/cookie": "^2.0.2", "deepmerge": "~4.3.0", "fast-json-patch": "^3.0.0-1", @@ -18807,24 +20278,6 @@ "ramda-adjunct": "^5.1.0" } }, - "node_modules/swagger-client/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" - }, - "node_modules/swagger-client/node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/swagger-ui": { "version": "3.52.4", "resolved": "https://registry.npmjs.org/swagger-ui/-/swagger-ui-3.52.4.tgz", @@ -18870,12 +20323,6 @@ "zenscroll": "^4.0.2" } }, - "node_modules/swagger-ui/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" - }, "node_modules/swagger-ui/node_modules/immutable": { "version": "3.8.3", "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.3.tgz", @@ -18982,6 +20429,33 @@ "node": ">=8" } }, + "node_modules/tar/node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/tar/node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/tar/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -18990,9 +20464,9 @@ "license": "ISC" }, "node_modules/terser": { - "version": "5.29.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.29.1.tgz", - "integrity": "sha512-lZQ/fyaIGxsbGxApKmoPTODIzELy3++mXhS5hOqaAWZjQtpq/hFHAc+rm29NND1rYRxRWKcjuARNwULNXa5RtQ==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.0.tgz", + "integrity": "sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -19009,9 +20483,9 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.4.0.tgz", - "integrity": "sha512-Bn5vxm48flOIfkdl5CaD2+1CiUVbonWQ3KQPyP7/EuIl9Gbzq/gQFOzaMFUEgVjB1396tcK0SG8XcNJ/2kDH8g==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.5.0.tgz", + "integrity": "sha512-UYhptBwhWvfIjKd/UuFo6D8uq9xpGLDK+z8EDsj/zWhrTaH34cKEbrkMKfV5YWqGBvAYA3tlzZbs2R+qYrbQJA==", "dev": true, "license": "MIT", "dependencies": { @@ -19042,32 +20516,6 @@ } } }, - "node_modules/terser-webpack-plugin/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/terser-webpack-plugin/node_modules/terser": { - "version": "5.46.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.2.tgz", - "integrity": "sha512-uxfo9fPcSgLDYob/w1FuL0c99MWiJDnv+5qXSQc5+Ki5NjVNsYi66INnMFBjf6uFz6OnX12piJQPF4IpjJTNTw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.15.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -19075,41 +20523,21 @@ "dev": true, "license": "MIT" }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/test-exclude/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "node_modules/thingies": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/thingies/-/thingies-2.6.0.tgz", + "integrity": "sha512-rMHRjmlFLM1R96UYPvpmnc3LYtdFrT33JIB7L9hetGue1qAPfn1N2LJeEjxUSidu1Iku+haLZXDuEXUHNGO/lg==", "dev": true, - "license": "ISC", - "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" - }, + "license": "MIT", "engines": { - "node": "*" + "node": ">=10.18" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "^2" } }, "node_modules/through": { @@ -19196,17 +20624,31 @@ "integrity": "sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==", "license": "MIT" }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", "dev": true, "license": "MIT", "dependencies": { - "os-tmpdir": "~1.0.2" + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tmp": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", + "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=0.6.0" + "node": ">=14.14" } }, "node_modules/to-buffer": { @@ -19277,6 +20719,23 @@ "node": ">=6" } }, + "node_modules/tree-dump": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.1.0.tgz", + "integrity": "sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, "node_modules/tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", @@ -19376,1160 +20835,803 @@ "mkdirp": "^0.5.3", "resolve": "^1.3.2", "semver": "^5.3.0", - "tslib": "^1.13.0", - "tsutils": "^2.29.0" - }, - "bin": { - "tslint": "bin/tslint" - }, - "engines": { - "node": ">=4.8.0" - }, - "peerDependencies": { - "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev || >= 4.0.0-dev" - } - }, - "node_modules/tslint/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/tslint/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/tslint/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/tslint/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "license": "MIT" - }, - "node_modules/tslint/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "dev": true, - "license": "ISC", - "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" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/tslint/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/tslint/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/tslint/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/tslint/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/tslint/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true, - "license": "0BSD" - }, - "node_modules/tstl": { - "version": "2.5.16", - "resolved": "https://registry.npmjs.org/tstl/-/tstl-2.5.16.tgz", - "integrity": "sha512-+O2ybLVLKcBwKm4HymCEwZIT0PpwS3gCYnxfSDEjJEKADvIFruaQjd3m7CAKNU1c7N3X3WjVz87re7TA2A5FUw==", - "license": "MIT" - }, - "node_modules/tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^1.8.1" - }, - "peerDependencies": { - "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true, - "license": "0BSD" - }, - "node_modules/tuf-js": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-2.2.1.tgz", - "integrity": "sha512-GwIJau9XaA8nLVbUXsN3IlFi7WmQ48gBUrl3FTkkL/XLu/POhBzfmX9hd33FNMX1qAsfl6ozO1iMmW9NC8YniA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@tufjs/models": "2.0.1", - "debug": "^4.3.4", - "make-fetch-happen": "^13.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/type": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", - "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==", - "license": "ISC" - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", - "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" + "tslib": "^1.13.0", + "tsutils": "^2.29.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", - "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.15", - "reflect.getprototypeof": "^1.0.9" + "bin": { + "tslint": "bin/tslint" }, "engines": { - "node": ">= 0.4" + "node": ">=4.8.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev || >= 4.0.0-dev" } }, - "node_modules/typed-array-length": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", - "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "node_modules/tslint/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0", - "reflect.getprototypeof": "^1.0.6" + "color-convert": "^1.9.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4" } }, - "node_modules/typed-assert": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", - "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", + "node_modules/tslint/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, - "license": "MIT" - }, - "node_modules/types-ramda": { - "version": "0.30.1", - "resolved": "https://registry.npmjs.org/types-ramda/-/types-ramda-0.30.1.tgz", - "integrity": "sha512-1HTsf5/QVRmLzcGfldPFvkVsAdi1db1BBKzi7iW3KBUlOICg/nKnFS+jGqDJS3YD8VsWbAh7JiHeBvbsw8RPxA==", "license": "MIT", "dependencies": { - "ts-toolbelt": "^9.6.0" + "sprintf-js": "~1.0.2" } }, - "node_modules/typescript": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "node_modules/tslint/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/ua-parser-js": { - "version": "0.7.41", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.41.tgz", - "integrity": "sha512-O3oYyCMPYgNNHuO7Jjk3uacJWZF8loBgwrfd/5LE/HyZ3lUIOdniQ7DNXJcIgZbwioZxk0fLfI4EVnetdiX5jg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - }, - { - "type": "github", - "url": "https://github.com/sponsors/faisalman" - } - ], "license": "MIT", - "bin": { - "ua-parser-js": "script/cli.js" + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": "*" + "node": ">=4" } }, - "node_modules/uglify-js": { - "version": "3.4.10", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", - "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", + "node_modules/tslint/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "commander": "~2.19.0", - "source-map": "~0.6.1" - }, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" + "color-name": "1.1.3" } }, - "node_modules/uglify-js/node_modules/commander": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "node_modules/tslint/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, "license": "MIT" }, - "node_modules/uglify-js/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/tslint/node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, - "license": "BSD-3-Clause", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/ui-select": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/ui-select/-/ui-select-0.19.8.tgz", - "integrity": "sha512-NSHm75s46oGph4BWUSQ4mgAGdZs0/YTP5nNo0efuwHBCPtTlye8zLSSxi3P5r1jI/BD9bJ8ODXyYWPoJZTRImQ==", - "license": "MIT" - }, - "node_modules/unbox-primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", - "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "node_modules/tslint/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "call-bound": "^1.0.3", - "has-bigints": "^1.0.2", - "has-symbols": "^1.1.0", - "which-boxed-primitive": "^1.1.1" + "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" }, "engines": { - "node": ">= 0.4" + "node": "*" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/underscore": { - "version": "1.13.6", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", - "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", - "license": "MIT" - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", - "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "node_modules/tslint/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "license": "MIT", "engines": { "node": ">=4" } }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "node_modules/tslint/node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", "dev": true, "license": "MIT", "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" + "argparse": "^1.0.7", + "esprima": "^4.0.0" }, - "engines": { - "node": ">=4" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", - "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", + "node_modules/tslint/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "license": "MIT", - "engines": { - "node": ">=4" + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" } }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", - "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", + "node_modules/tslint/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unidragger": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/unidragger/-/unidragger-2.4.0.tgz", - "integrity": "sha512-MueZK2oXuGE6OAlGKIrSXK2zCq+8yb1QUZgqyTDCSJzvwYL0g2Llrad+TtoQTYxtFnNyxxSw0IMnKNIgEMia1w==", - "license": "MIT", - "dependencies": { - "unipointer": "^2.4.0" + "license": "ISC", + "bin": { + "semver": "bin/semver" } }, - "node_modules/unipointer": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/unipointer/-/unipointer-2.4.0.tgz", - "integrity": "sha512-VjzDLPjGK7aYpQKH7bnDZS8X4axF5AFU/LQi+NQe1oyEHfaz6lWKhaQ7n4o7vJ1iJ4i2T0quCIfrQM139p05Sw==", - "license": "MIT", - "dependencies": { - "ev-emitter": "^1.0.1" - } + "node_modules/tslint/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" }, - "node_modules/unique-filename": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", - "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", + "node_modules/tslint/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "unique-slug": "^4.0.0" + "has-flag": "^3.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=4" } }, - "node_modules/unique-slug": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", - "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", + "node_modules/tslint/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true, - "license": "ISC", + "license": "0BSD" + }, + "node_modules/tstl": { + "version": "2.5.16", + "resolved": "https://registry.npmjs.org/tstl/-/tstl-2.5.16.tgz", + "integrity": "sha512-+O2ybLVLKcBwKm4HymCEwZIT0PpwS3gCYnxfSDEjJEKADvIFruaQjd3m7CAKNU1c7N3X3WjVz87re7TA2A5FUw==", + "license": "MIT" + }, + "node_modules/tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "dev": true, + "license": "MIT", "dependencies": { - "imurmurhash": "^0.1.4" + "tslib": "^1.8.1" }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "peerDependencies": { + "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" } }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } + "license": "0BSD" }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "node_modules/tuf-js": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-3.1.0.tgz", + "integrity": "sha512-3T3T04WzowbwV2FDiGXBbr81t64g1MUGGJRgT4x5o97N+8ArdhVCAF9IxFrxuSJmM3E5Asn7nKHkao0ibcZXAg==", "dev": true, "license": "MIT", + "dependencies": { + "@tufjs/models": "3.0.1", + "debug": "^4.4.1", + "make-fetch-happen": "^14.0.3" + }, "engines": { - "node": ">= 0.8" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/unraw": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unraw/-/unraw-3.0.0.tgz", - "integrity": "sha512-08/DA66UF65OlpUDIQtbJyrqTR0jTAlJ+jsnkQ4jxR7+K5g5YG1APZKQSMCE1vqqmD+2pv6+IdEjmopFatacvg==", - "license": "MIT" + "node_modules/type": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", + "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==", + "license": "ISC" }, - "node_modules/untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", - "dev": true, - "license": "MIT", + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/update-browserslist-db": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], "license": "MIT", "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" + "media-typer": "0.3.0", + "mime-types": "~2.1.24" }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==", - "dev": true, - "license": "MIT" - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" + "engines": { + "node": ">= 0.6" } }, - "node_modules/uri-js/node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, "engines": { - "node": ">=6" + "node": ">= 0.4" } }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, "license": "MIT", "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true, - "license": "MIT" - }, - "node_modules/utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", - "dev": true, - "license": "MIT" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", "dev": true, "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, "engines": { - "node": ">= 0.4.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", "dev": true, "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "node_modules/typed-assert": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", + "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", "dev": true, - "license": "Apache-2.0", + "license": "MIT" + }, + "node_modules/types-ramda": { + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/types-ramda/-/types-ramda-0.30.1.tgz", + "integrity": "sha512-1HTsf5/QVRmLzcGfldPFvkVsAdi1db1BBKzi7iW3KBUlOICg/nKnFS+jGqDJS3YD8VsWbAh7JiHeBvbsw8RPxA==", + "license": "MIT", "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "ts-toolbelt": "^9.6.0" } }, - "node_modules/validate-npm-package-name": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", - "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", + "node_modules/typescript": { + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", "dev": true, - "license": "ISC", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=14.17" } }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true, + "node_modules/ua-parser-js": { + "version": "0.7.41", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.41.tgz", + "integrity": "sha512-O3oYyCMPYgNNHuO7Jjk3uacJWZF8loBgwrfd/5LE/HyZ3lUIOdniQ7DNXJcIgZbwioZxk0fLfI4EVnetdiX5jg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + } + ], "license": "MIT", + "bin": { + "ua-parser-js": "script/cli.js" + }, "engines": { - "node": ">= 0.8" + "node": "*" } }, - "node_modules/vite": { - "version": "5.4.21", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", - "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "node_modules/uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" + "commander": "~2.19.0", + "source-map": "~0.6.1" }, "bin": { - "vite": "bin/vite.js" + "uglifyjs": "bin/uglifyjs" }, "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } + "node": ">=0.8.0" } }, - "node_modules/vite/node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], + "node_modules/uglify-js/node_modules/commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], + "license": "MIT" + }, + "node_modules/uglify-js/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", "engines": { - "node": ">=12" + "node": ">=0.10.0" } }, - "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], + "node_modules/ui-select": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/ui-select/-/ui-select-0.19.8.tgz", + "integrity": "sha512-NSHm75s46oGph4BWUSQ4mgAGdZs0/YTP5nNo0efuwHBCPtTlye8zLSSxi3P5r1jI/BD9bJ8ODXyYWPoJZTRImQ==", + "license": "MIT" + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], + "node_modules/underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], "engines": { - "node": ">=12" + "node": ">=4" } }, - "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, "engines": { - "node": ">=12" + "node": ">=4" } }, - "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", + "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], "engines": { - "node": ">=12" + "node": ">=4" } }, - "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", + "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], "engines": { - "node": ">=12" + "node": ">=4" } }, - "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], + "node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], "engines": { - "node": ">=12" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/unidragger": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/unidragger/-/unidragger-2.4.0.tgz", + "integrity": "sha512-MueZK2oXuGE6OAlGKIrSXK2zCq+8yb1QUZgqyTDCSJzvwYL0g2Llrad+TtoQTYxtFnNyxxSw0IMnKNIgEMia1w==", "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" + "dependencies": { + "unipointer": "^2.4.0" } }, - "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, + "node_modules/unipointer": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/unipointer/-/unipointer-2.4.0.tgz", + "integrity": "sha512-VjzDLPjGK7aYpQKH7bnDZS8X4axF5AFU/LQi+NQe1oyEHfaz6lWKhaQ7n4o7vJ1iJ4i2T0quCIfrQM139p05Sw==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "dependencies": { + "ev-emitter": "^1.0.1" } }, - "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], + "node_modules/unique-filename": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-4.0.0.tgz", + "integrity": "sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "license": "ISC", + "dependencies": { + "unique-slug": "^5.0.0" + }, "engines": { - "node": ">=12" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], + "node_modules/unique-slug": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-5.0.0.tgz", + "integrity": "sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + }, "engines": { - "node": ">=12" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=12" + "node": ">= 4.0.0" } }, - "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=12" + "node": ">= 0.8" } }, - "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], + "node_modules/unraw": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unraw/-/unraw-3.0.0.tgz", + "integrity": "sha512-08/DA66UF65OlpUDIQtbJyrqTR0jTAlJ+jsnkQ4jxR7+K5g5YG1APZKQSMCE1vqqmD+2pv6+IdEjmopFatacvg==", + "license": "MIT" + }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } ], - "engines": { - "node": ">=12" + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" } }, - "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], + "node_modules/upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "license": "MIT" + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" } }, - "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/uri-js/node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=12" + "node": ">=6" } }, - "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" } }, - "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], "engines": { - "node": ">=12" + "node": ">= 0.4.0" } }, - "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" + "bin": { + "uuid": "dist/bin/uuid" } }, - "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, - "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], + "node_modules/validate-npm-package-name": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.2.tgz", + "integrity": "sha512-IUoow1YUtvoBBC06dXs8bR8B9vuA3aJfmQNKMoaPG/OFsPmoQvw8xh+6Ye25Gx9DQhoEom3Pcu9MKHerm/NpUQ==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "license": "ISC", "engines": { - "node": ">=12" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ], "engines": { - "node": ">=12" + "node": ">= 0.8" } }, - "node_modules/vite/node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "node_modules/vite": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.2.tgz", + "integrity": "sha512-2N/55r4JDJ4gdrCvGgINMy+HH3iRpNIz8K6SFwVsA+JbQScLiC+clmAxBgwiSPgcG9U15QmvqCGWzMbqda5zGQ==", "dev": true, - "hasInstallScript": true, "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, "bin": { - "esbuild": "bin/esbuild" + "vite": "bin/vite.js" }, "engines": { - "node": ">=12" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } } }, "node_modules/vite/node_modules/postcss": { - "version": "8.5.10", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.10.tgz", - "integrity": "sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==", + "version": "8.5.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.14.tgz", + "integrity": "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==", "dev": true, "funding": [ { @@ -20566,9 +21668,9 @@ } }, "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", + "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", "dev": true, "license": "MIT", "dependencies": { @@ -20599,6 +21701,14 @@ "defaults": "^1.0.3" } }, + "node_modules/weak-lru-cache": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", + "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==", + "dev": true, + "license": "MIT", + "optional": true + }, "node_modules/web-streams-polyfill": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", @@ -20772,20 +21882,21 @@ } }, "node_modules/webpack-dev-middleware": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.2.tgz", - "integrity": "sha512-Wu+EHmX326YPYUpQLKmKbTyZZJIB8/n6R09pTmB03kJmnMsVPTo9COzHZFr01txwaCAuZvfBJE4ZCHRcKs5JaQ==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.2.tgz", + "integrity": "sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==", "dev": true, "license": "MIT", "dependencies": { "colorette": "^2.0.10", - "memfs": "^3.4.12", + "memfs": "^4.6.0", "mime-types": "^2.1.31", + "on-finished": "^2.4.1", "range-parser": "^1.2.1", "schema-utils": "^4.0.0" }, "engines": { - "node": ">= 14.15.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", @@ -20801,55 +21912,53 @@ } }, "node_modules/webpack-dev-server": { - "version": "4.15.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", - "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.2.tgz", + "integrity": "sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg==", "dev": true, "license": "MIT", "dependencies": { - "@types/bonjour": "^3.5.9", - "@types/connect-history-api-fallback": "^1.3.5", - "@types/express": "^4.17.13", - "@types/serve-index": "^1.9.1", - "@types/serve-static": "^1.13.10", - "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.5", + "@types/bonjour": "^3.5.13", + "@types/connect-history-api-fallback": "^1.5.4", + "@types/express": "^4.17.21", + "@types/express-serve-static-core": "^4.17.21", + "@types/serve-index": "^1.9.4", + "@types/serve-static": "^1.15.5", + "@types/sockjs": "^0.3.36", + "@types/ws": "^8.5.10", "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.0.11", - "chokidar": "^3.5.3", + "bonjour-service": "^1.2.1", + "chokidar": "^3.6.0", "colorette": "^2.0.10", "compression": "^1.7.4", "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", + "express": "^4.21.2", "graceful-fs": "^4.2.6", - "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.0.1", - "launch-editor": "^2.6.0", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "rimraf": "^3.0.2", - "schema-utils": "^4.0.0", - "selfsigned": "^2.1.1", + "http-proxy-middleware": "^2.0.9", + "ipaddr.js": "^2.1.0", + "launch-editor": "^2.6.1", + "open": "^10.0.3", + "p-retry": "^6.2.0", + "schema-utils": "^4.2.0", + "selfsigned": "^2.4.1", "serve-index": "^1.9.1", "sockjs": "^0.3.24", "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.1", - "ws": "^8.13.0" + "webpack-dev-middleware": "^7.4.2", + "ws": "^8.18.0" }, "bin": { "webpack-dev-server": "bin/webpack-dev-server.js" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^4.37.0 || ^5.0.0" + "webpack": "^5.0.0" }, "peerDependenciesMeta": { "webpack": { @@ -20860,49 +21969,114 @@ } } }, - "node_modules/webpack-dev-server/node_modules/webpack-dev-middleware": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", - "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", + "node_modules/webpack-dev-server/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, "license": "MIT", "dependencies": { - "colorette": "^2.0.10", - "memfs": "^3.4.3", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 8.10.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/webpack-dev-server/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/webpack-dev-server/node_modules/http-proxy-middleware": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", + "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">=12.0.0" }, "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/webpack-dev-server/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" } }, "node_modules/webpack-merge": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", + "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", "dev": true, "license": "MIT", "dependencies": { "clone-deep": "^4.0.1", "flat": "^5.0.2", - "wildcard": "^2.0.0" + "wildcard": "^2.0.1" }, "engines": { - "node": ">=10.0.0" + "node": ">=18.0.0" } }, "node_modules/webpack-sources": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.4.0.tgz", - "integrity": "sha512-gHwIe1cgBvvfLeu1Yz/dcFpmHfKDVxxyqI+kzqmuxZED81z2ChxpyqPaWcNqigPywhaEke7AjSGga+kxY55gjQ==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.4.1.tgz", + "integrity": "sha512-eACpxRN02yaawnt+uUNIF7Qje6A9zArxBbcAJjK1PK3S9Ycg5jIuJ8pW4q8EMnwNZCEGltcjkRx1QzOxOkKD8A==", "dev": true, "license": "MIT", "engines": { @@ -21204,6 +22378,38 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -21243,6 +22449,38 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/wrap-ansi/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -21349,6 +22587,61 @@ "node": ">=12" } }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/yocto-queue": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", @@ -21362,6 +22655,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", + "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/zenscroll": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/zenscroll/-/zenscroll-4.0.2.tgz", @@ -21369,9 +22675,9 @@ "license": "Unlicense" }, "node_modules/zone.js": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.14.10.tgz", - "integrity": "sha512-YGAhaO7J5ywOXW6InXNlLmfU194F8lVgu7bRntUF3TiG8Y3nBK0x1UJJuHUP/e8IyihkjCYqhCScpSwnlaSRkQ==", + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.15.1.tgz", + "integrity": "sha512-XE96n56IQpJM7NAoXswY3XRLcWFW83xe0BiAOeMD7K5k5xecOeul3Qcpx6GqEeeHNkW5DWL5zOyTbEfB4eti8w==", "license": "MIT" }, "node_modules/zxcvbn": { @@ -21390,9 +22696,9 @@ "tslib": "^2.0.0" }, "peerDependencies": { - "@angular/common": "^17.0.0", - "@angular/core": "^17.0.0", - "@angular/forms": "^17.0.0", + "@angular/common": "^19.0.0", + "@angular/core": "^19.0.0", + "@angular/forms": "^19.0.0", "@angular/platform-browser": ">=14.0.0", "rxjs": "^6.5.3 || ^7.0.0" } @@ -21429,15 +22735,15 @@ "tslib": "^2.0.0" }, "peerDependencies": { - "@angular/animations": "^17.0.0", - "@angular/cdk": "^17.0.0", - "@angular/common": "^17.0.0", - "@angular/core": "^17.0.0", - "@angular/forms": "^17.0.0", - "@angular/material": "^17.0.0", + "@angular/animations": "^19.0.0", + "@angular/cdk": "^19.0.0", + "@angular/common": "^19.0.0", + "@angular/core": "^19.0.0", + "@angular/forms": "^19.0.0", + "@angular/material": "^19.0.0", "@ngageoint/vendor-ajsf-core": "^0.8.0", "rxjs": "^6.5.3 || ^7.0.0" } } } -} \ No newline at end of file +} diff --git a/web-app/package.json b/web-app/package.json index da53c4c69..031d8413d 100644 --- a/web-app/package.json +++ b/web-app/package.json @@ -60,20 +60,20 @@ }, "files": [], "dependencies": { - "@angular/animations": "17.3.12", - "@angular/cdk": "^17.3.10", - "@angular/common": "17.3.12", - "@angular/compiler": "17.3.12", - "@angular/core": "17.3.12", + "@angular/animations": "19.2.15", + "@angular/cdk": "^19.2.15", + "@angular/common": "19.2.15", + "@angular/compiler": "19.2.15", + "@angular/core": "19.2.15", "@angular/flex-layout": "15.0.0-beta.42", - "@angular/forms": "17.3.12", - "@angular/material": "^17.3.10", - "@angular/material-moment-adapter": "^17.3.10", - "@angular/platform-browser": "17.3.12", - "@angular/platform-browser-dynamic": "17.3.12", - "@angular/router": "17.3.12", - "@angular/upgrade": "17.3.12", - "@ng-select/ng-select": "^12.0.0", + "@angular/forms": "19.2.15", + "@angular/material": "^19.2.15", + "@angular/material-moment-adapter": "^19.2.15", + "@angular/platform-browser": "19.2.15", + "@angular/platform-browser-dynamic": "19.2.15", + "@angular/router": "19.2.15", + "@angular/upgrade": "19.2.15", + "@ng-select/ng-select": "^14.0.1", "@ngageoint/gars-js": "1.0.0", "@ngageoint/md-date-time-picker": "2.3.0", "@ngageoint/mgrs-js": "1.0.0", @@ -86,7 +86,7 @@ "@types/geojson": "7946.0.7", "@types/leaflet-editable": "1.2.7", "@types/leaflet.markercluster": "1.5.6", - "@uirouter/angular": "^13.0.0", + "@uirouter/angular": "^16.0.0", "@uirouter/core": "^6.1.2", "@uirouter/rx": "1.0.0", "@zxcvbn-ts/core": "3.0.4", @@ -125,18 +125,18 @@ "ui-select": "0.19.8", "underscore": "1.13.6", "webfontloader": "1.6.6", - "zone.js": "0.14.10", + "zone.js": "~0.15.0", "zxcvbn": "4.4.2" }, "devDependencies": { - "@angular-devkit/build-angular": "17.3.17", - "@angular-devkit/core": "17.3.17", - "@angular-devkit/schematics": "^17.3.17", - "@angular/cli": "17.3.17", - "@angular/compiler-cli": "17.3.12", - "@angular/language-service": "17.3.12", + "@angular-devkit/build-angular": "19.2.24", + "@angular-devkit/core": "19.2.24", + "@angular-devkit/schematics": "^19.2.24", + "@angular/cli": "19.2.24", + "@angular/compiler-cli": "19.2.15", + "@angular/language-service": "19.2.15", "@rollup/plugin-commonjs": "25.0.7", - "@schematics/angular": "^17.3.17", + "@schematics/angular": "^19.2.24", "@types/angular": "1.8.1", "@types/geojson": "7946.0.7", "@types/hammerjs": "2.0.36", @@ -159,12 +159,12 @@ "karma-coverage-istanbul-reporter": "3.0.3", "karma-jasmine": "5.1.0", "karma-jasmine-html-reporter": "2.0.0", - "ng-packagr": "17.3.0", - "ngx-build-plus": "^17.0.0", + "ng-packagr": "19.2.2", + "ngx-build-plus": "^19.0.0", "npm-run-all": "4.1.5", "rimraf": "3.0.2", "tslint": "6.1.3", - "typescript": "5.4.5", + "typescript": "~5.5.4", "webpack": "5.75.0", "webpack-bundle-analyzer": "4.7.0" } diff --git a/web-app/projects/core-lib-showcase/src/app/app.component.spec.ts b/web-app/projects/core-lib-showcase/src/app/app.component.spec.ts index b12e43195..c735366ad 100644 --- a/web-app/projects/core-lib-showcase/src/app/app.component.spec.ts +++ b/web-app/projects/core-lib-showcase/src/app/app.component.spec.ts @@ -1,3 +1,4 @@ +import { NO_ERRORS_SCHEMA } from '@angular/core'; import { TestBed, waitForAsync } from '@angular/core/testing'; import { RouterTestingModule } from '@angular/router/testing'; import { AppComponent } from './app.component'; @@ -5,12 +6,8 @@ import { AppComponent } from './app.component'; describe('AppComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - imports: [ - RouterTestingModule - ], - declarations: [ - AppComponent - ], + imports: [RouterTestingModule, AppComponent], + schemas: [NO_ERRORS_SCHEMA] }).compileComponents(); })); @@ -19,17 +16,4 @@ describe('AppComponent', () => { const app = fixture.componentInstance; expect(app).toBeTruthy(); }); - - it(`should have as title 'core-lib-showcase'`, () => { - const fixture = TestBed.createComponent(AppComponent); - const app = fixture.componentInstance; - expect(app.title).toEqual('core-lib-showcase'); - }); - - it('should render title', () => { - const fixture = TestBed.createComponent(AppComponent); - fixture.detectChanges(); - const compiled = fixture.nativeElement; - expect(compiled.querySelector('.content span').textContent).toContain('core-lib-showcase app is running!'); - }); -}); +}); \ No newline at end of file diff --git a/web-app/projects/core-lib/angular-cli/builders/fesm-amd.ts b/web-app/projects/core-lib/angular-cli/builders/fesm-amd.ts index 3de48a1fa..fd41664a7 100644 --- a/web-app/projects/core-lib/angular-cli/builders/fesm-amd.ts +++ b/web-app/projects/core-lib/angular-cli/builders/fesm-amd.ts @@ -118,7 +118,7 @@ async function rollupFesmToAmd(buildInfo: BuildInfo): Promise { input: fesm2022Path, plugins: [ nodeResolve({ - resolveOnly: moduleId => { + resolveOnly: (moduleId: string) => { const external = false || moduleId.startsWith('@angular/') || moduleId.startsWith('@ng-select/') diff --git a/web-app/projects/core-lib/common/mage-common.module.ts b/web-app/projects/core-lib/common/mage-common.module.ts index 186c0080d..d5ad907a6 100644 --- a/web-app/projects/core-lib/common/mage-common.module.ts +++ b/web-app/projects/core-lib/common/mage-common.module.ts @@ -4,9 +4,7 @@ import { CommonModule } from '@angular/common' @NgModule({ imports: [ - CommonModule - ], - declarations: [ + CommonModule, XhrImgComponent ], exports: [ diff --git a/web-app/projects/core-lib/common/xhr-img.component.spec.ts b/web-app/projects/core-lib/common/xhr-img.component.spec.ts index 431162ef7..0431cb3e4 100644 --- a/web-app/projects/core-lib/common/xhr-img.component.spec.ts +++ b/web-app/projects/core-lib/common/xhr-img.component.spec.ts @@ -1,8 +1,10 @@ -import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing' +import { HttpTestingController, provideHttpClientTesting } from '@angular/common/http/testing' import { Component, DebugElement } from '@angular/core' import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' import { By } from '@angular/platform-browser' -import { XhrImgComponent, ObjectUrlService, OBJECT_URL_SERVICE } from './xhr-img.component' +import { ObjectUrlService, OBJECT_URL_SERVICE } from './xhr-img.component' +import { XhrImgComponent } from '@ngageoint/mage.web-core-lib/common' +import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; @Component({ template: ` @@ -31,9 +33,9 @@ describe('ImgXhrBlobSrcDirective', () => { objectUrlService.createObjectURL.and.callFake(URL.createObjectURL) objectUrlService.revokeObjectURL.and.callFake(URL.revokeObjectURL) TestBed.configureTestingModule({ - imports: [ HttpClientTestingModule ], - declarations: [ XhrImgComponent, TestComponent ] - }) + imports: [XhrImgComponent, TestComponent], + providers: [provideHttpClient(withInterceptorsFromDi()), provideHttpClientTesting()] +}) .overrideComponent(XhrImgComponent, { set: { providers: [ diff --git a/web-app/projects/core-lib/feed/feed.service.spec.ts b/web-app/projects/core-lib/feed/feed.service.spec.ts index eca13d891..287030c04 100644 --- a/web-app/projects/core-lib/feed/feed.service.spec.ts +++ b/web-app/projects/core-lib/feed/feed.service.spec.ts @@ -1,4 +1,4 @@ -import { HttpClientModule } from '@angular/common/http'; +import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; import { TestBed, waitForAsync } from '@angular/core/testing'; import { FeedService } from './feed.service'; @@ -6,10 +6,9 @@ import { FeedService } from './feed.service'; describe('FeedService', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - imports: [ - HttpClientModule - ] - }) + imports: [], + providers: [provideHttpClient(withInterceptorsFromDi())] +}) .compileComponents(); })); diff --git a/web-app/projects/core-lib/package.json b/web-app/projects/core-lib/package.json index b076ffc42..5a446ffbe 100644 --- a/web-app/projects/core-lib/package.json +++ b/web-app/projects/core-lib/package.json @@ -11,6 +11,38 @@ "save": "devDependencies" }, "exports": { + ".": { + "types": "./index.d.ts", + "default": "./fesm2022/ngageoint-mage.web-core-lib.mjs" + }, + "./common": { + "types": "./common/index.d.ts", + "default": "./fesm2022/ngageoint-mage.web-core-lib-common.mjs" + }, + "./paging": { + "types": "./paging/index.d.ts", + "default": "./fesm2022/ngageoint-mage.web-core-lib-paging.mjs" + }, + "./static-icon": { + "types": "./static-icon/index.d.ts", + "default": "./fesm2022/ngageoint-mage.web-core-lib-static-icon.mjs" + }, + "./feed": { + "types": "./feed/index.d.ts", + "default": "./fesm2022/ngageoint-mage.web-core-lib-feed.mjs" + }, + "./event": { + "types": "./event/index.d.ts", + "default": "./fesm2022/ngageoint-mage.web-core-lib-event.mjs" + }, + "./plugin": { + "types": "./plugin/index.d.ts", + "default": "./fesm2022/ngageoint-mage.web-core-lib-plugin.mjs" + }, + "./user": { + "types": "./user/index.d.ts", + "default": "./fesm2022/ngageoint-mage.web-core-lib-user.mjs" + }, "./angular-cli/*": "./angular-cli/*" }, "peerDependencies": { diff --git a/web-app/projects/core-lib/static-icon/static-icon-form-field/static-icon-form-field.component.spec.ts b/web-app/projects/core-lib/static-icon/static-icon-form-field/static-icon-form-field.component.spec.ts index b37254784..2ca63d669 100644 --- a/web-app/projects/core-lib/static-icon/static-icon-form-field/static-icon-form-field.component.spec.ts +++ b/web-app/projects/core-lib/static-icon/static-icon-form-field/static-icon-form-field.component.spec.ts @@ -1,47 +1,55 @@ -import { HttpClientTestingModule } from '@angular/common/http/testing' -import { Component } from '@angular/core' -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' -import { UntypedFormControl, UntypedFormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms' -import { By } from '@angular/platform-browser' -import { of } from 'rxjs' -import { MageCommonModule } from '@ngageoint/mage.web-core-lib/common' -import { StaticIcon, StaticIconReference } from '../static-icon.model' -import { StaticIconService } from '../static-icon.service' -import { StaticIconFormFieldComponent } from './static-icon-form-field.component' +import { provideHttpClientTesting } from '@angular/common/http/testing'; +import { Component } from '@angular/core'; +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { + UntypedFormControl, + UntypedFormGroup, + FormsModule, + ReactiveFormsModule +} from '@angular/forms'; +import { By } from '@angular/platform-browser'; +import { of } from 'rxjs'; +import { MageCommonModule } from '@ngageoint/mage.web-core-lib/common'; +import { StaticIcon, StaticIconReference } from '../static-icon.model'; +import { StaticIconService } from '../static-icon.service'; +import { StaticIconFormFieldComponent } from './static-icon-form-field.component'; +import { + provideHttpClient, + withInterceptorsFromDi +} from '@angular/common/http'; @Component({ selector: 'test-host', - template: `` + template: `
+ +
` }) class TestHostComponent { - form = new UntypedFormGroup({ icon: new UntypedFormControl(null) - }) + }); } describe('StaticIconFormFieldComponent', () => { - - let host: TestHostComponent - let target: StaticIconFormFieldComponent - let fixture: ComponentFixture - let iconService: jasmine.SpyObj + let host: TestHostComponent; + let target: StaticIconFormFieldComponent; + let fixture: ComponentFixture; + let iconService: jasmine.SpyObj; beforeEach(waitForAsync(() => { - - iconService = jasmine.createSpyObj('MockStaticIconService', [ - 'fetchIconByReference' - ]) - iconService.fetchIconByReference.and.returnValue(of(null)) + iconService = jasmine.createSpyObj( + 'MockStaticIconService', + ['fetchIconByReference'] + ); + iconService.fetchIconByReference.and.returnValue(of(null)); TestBed.configureTestingModule({ imports: [ FormsModule, ReactiveFormsModule, MageCommonModule, - HttpClientTestingModule - ], - declarations: [ StaticIconFormFieldComponent, TestHostComponent ], @@ -49,44 +57,47 @@ describe('StaticIconFormFieldComponent', () => { { provide: StaticIconService, useValue: iconService - } + }, + provideHttpClient(withInterceptorsFromDi()), + provideHttpClientTesting() ] - }) - .compileComponents() - })) + }).compileComponents(); + })); beforeEach(() => { - fixture = TestBed.createComponent(TestHostComponent) - host = fixture.componentInstance - target = fixture.debugElement.query(By.directive(StaticIconFormFieldComponent)).componentInstance - fixture.detectChanges() - }) + fixture = TestBed.createComponent(TestHostComponent); + host = fixture.componentInstance; + target = fixture.debugElement.query( + By.directive(StaticIconFormFieldComponent) + ).componentInstance; + fixture.detectChanges(); + }); it('should create', () => { - expect(target).toBeTruthy() - }) + expect(target).toBeTruthy(); + }); it('accepts value from host', () => { + const icon: StaticIconReference = { id: 'icon1' }; + host.form.setValue({ icon }); - const icon: StaticIconReference = { id: 'icon1' } - host.form.setValue({ icon }) - - expect(target.iconRef).toEqual(icon) - }) + expect(target.iconRef).toEqual(icon); + }); it('fetches the icon by reference when ref changes', () => { - const icon: StaticIcon = { id: 'icon1', sourceUrl: 'test://icon1.png', contentPath: '/icons/icon1' - } - const iconRef: StaticIconReference = { id: 'icon1' } - iconService.fetchIconByReference.withArgs(iconRef).and.returnValue(of(icon)) - host.form.setValue({ icon: iconRef }) + }; + const iconRef: StaticIconReference = { id: 'icon1' }; + iconService.fetchIconByReference + .withArgs(iconRef) + .and.returnValue(of(icon)); + host.form.setValue({ icon: iconRef }); - expect(target.icon).toEqual(icon) - expect(iconService.fetchIconByReference).toHaveBeenCalledTimes(1) - expect(iconService.fetchIconByReference).toHaveBeenCalledWith(iconRef) - }) -}) + expect(target.icon).toEqual(icon); + expect(iconService.fetchIconByReference).toHaveBeenCalledTimes(1); + expect(iconService.fetchIconByReference).toHaveBeenCalledWith(iconRef); + }); +}); diff --git a/web-app/projects/core-lib/static-icon/static-icon-form-field/static-icon-form-field.component.ts b/web-app/projects/core-lib/static-icon/static-icon-form-field/static-icon-form-field.component.ts index ced3e09e6..c2bef14db 100644 --- a/web-app/projects/core-lib/static-icon/static-icon-form-field/static-icon-form-field.component.ts +++ b/web-app/projects/core-lib/static-icon/static-icon-form-field/static-icon-form-field.component.ts @@ -1,13 +1,27 @@ -import { HttpClient } from '@angular/common/http' -import { Component, OnChanges, OnDestroy, SimpleChanges } from '@angular/core' -import { AbstractControl, ControlValueAccessor, UntypedFormControl, UntypedFormGroup, NG_VALIDATORS, NG_VALUE_ACCESSOR, ValidationErrors, Validator, Validators } from '@angular/forms' -import { DomSanitizer } from '@angular/platform-browser' -import { StaticIcon, StaticIconReference } from '../static-icon.model' -import { StaticIconService } from '../static-icon.service' - +import { HttpClient } from '@angular/common/http'; +import { CommonModule } from '@angular/common'; +import { Component, OnChanges, OnDestroy, SimpleChanges } from '@angular/core'; +import { + AbstractControl, + ControlValueAccessor, + NG_VALIDATORS, + NG_VALUE_ACCESSOR, + ReactiveFormsModule, + UntypedFormControl, + UntypedFormGroup, + ValidationErrors, + Validator, + Validators +} from '@angular/forms'; +import { DomSanitizer } from '@angular/platform-browser'; +import { XhrImgComponent } from '@ngageoint/mage.web-core-lib/common' +import { StaticIcon, StaticIconReference } from '../static-icon.model'; +import { StaticIconService } from '../static-icon.service'; @Component({ selector: 'mage-static-icon-form-field', + standalone: true, + imports: [CommonModule, ReactiveFormsModule, XhrImgComponent], templateUrl: './static-icon-form-field.component.html', styleUrls: ['./static-icon-form-field.component.scss'], providers: [ @@ -20,79 +34,85 @@ import { StaticIconService } from '../static-icon.service' provide: NG_VALIDATORS, multi: true, useExisting: StaticIconFormFieldComponent - }, + } ] }) -export class StaticIconFormFieldComponent implements OnChanges, OnDestroy, ControlValueAccessor, Validator { - - iconRef: StaticIconReference = null +export class StaticIconFormFieldComponent + implements OnChanges, OnDestroy, ControlValueAccessor, Validator +{ + iconRef: StaticIconReference = null; form: UntypedFormGroup = new UntypedFormGroup({ iconRefToken: new UntypedFormControl(null), iconRefType: new UntypedFormControl(null, Validators.required) - }) - icon: StaticIcon | null - - private onChange: (iconRef: StaticIconReference) => void = (iconRef: StaticIconReference) => {} - private onValidatorChange: () => void = () => {} - private onTouched: () => void = () => {} - - constructor(private iconService: StaticIconService, private httpClient: HttpClient, private sanitizer: DomSanitizer) { + }); + icon: StaticIcon | null; + + private onChange: (iconRef: StaticIconReference) => void = ( + iconRef: StaticIconReference + ) => {}; + private onValidatorChange: () => void = () => {}; + private onTouched: () => void = () => {}; + + constructor( + private iconService: StaticIconService, + private httpClient: HttpClient, + private sanitizer: DomSanitizer + ) { this.form.valueChanges.subscribe((x: IconRefFormValue) => { - this.iconRef = iconRefForFormValue(x) - this.onChange(this.iconRef) - }) + this.iconRef = iconRefForFormValue(x); + this.onChange(this.iconRef); + }); } registerOnValidatorChange?(fn: () => void): void { - this.onValidatorChange = fn + this.onValidatorChange = fn; } - ngOnChanges(changes: SimpleChanges) { } + ngOnChanges(changes: SimpleChanges) {} - ngOnDestroy() { } + ngOnDestroy() {} - onSelectIcon() { } + onSelectIcon() {} writeValue(iconRef: StaticIconReference): void { - this.iconRef = iconRef - const formValue = formValueForIconRef(iconRef) - this.form.setValue(formValue, { emitEvent: false }) - this.resolveIconRef() + this.iconRef = iconRef; + const formValue = formValueForIconRef(iconRef); + this.form.setValue(formValue, { emitEvent: false }); + this.resolveIconRef(); } registerOnChange(fn: (x: StaticIconReference | null) => void): void { - this.onChange = fn + this.onChange = fn; } registerOnTouched(fn: () => void): void { - this.onTouched = fn + this.onTouched = fn; } setDisabledState?(isDisabled: boolean): void { if (isDisabled) { - this.form.disable() - } - else { - this.form.enable() + this.form.disable(); + } else { + this.form.enable(); } } validate(control: AbstractControl): ValidationErrors { - return this.form.errors + return this.form.errors; } private resolveIconRef() { if (!this.iconRef) { - this.icon = null - return + this.icon = null; + return; } - this.iconService.fetchIconByReference(this.iconRef).subscribe(x => { - this.icon = x + this.iconService.fetchIconByReference(this.iconRef).subscribe((x) => { + this.icon = x; if (!this.icon) { - return + return; } - }) + }); } } @@ -102,21 +122,21 @@ enum IconRefType { } type IconRefFormValue = { - iconRefToken: string | null - iconRefType: IconRefType | null -} + iconRefToken: string | null; + iconRefType: IconRefType | null; +}; function iconRefForFormValue(x: IconRefFormValue): StaticIconReference | null { if (!x.iconRefType) { - return null + return null; } switch (x.iconRefType) { case IconRefType.Registered: - return { [IconRefType.Registered]: x.iconRefToken } + return { [IconRefType.Registered]: x.iconRefToken }; case IconRefType.SourceUrl: - return { [IconRefType.SourceUrl]: x.iconRefToken } + return { [IconRefType.SourceUrl]: x.iconRefToken }; default: - throw new Error('invalid icon ref type: ' + x.iconRefToken) + throw new Error('invalid icon ref type: ' + x.iconRefToken); } } @@ -125,20 +145,19 @@ function formValueForIconRef(x: StaticIconReference | null): IconRefFormValue { return { iconRefType: null, iconRefToken: null - } + }; } - let iconRefType: IconRefType | null = null - let iconRefToken: string | null = null + let iconRefType: IconRefType | null = null; + let iconRefToken: string | null = null; if (x.hasOwnProperty(IconRefType.Registered)) { - iconRefType = IconRefType.Registered || null - iconRefToken = x[IconRefType.Registered] || null - } - else if (x.hasOwnProperty(IconRefType.SourceUrl)) { - iconRefType = IconRefType.SourceUrl || null - iconRefToken = x[IconRefType.SourceUrl] || null + iconRefType = IconRefType.Registered || null; + iconRefToken = x[IconRefType.Registered] || null; + } else if (x.hasOwnProperty(IconRefType.SourceUrl)) { + iconRefType = IconRefType.SourceUrl || null; + iconRefToken = x[IconRefType.SourceUrl] || null; } return { iconRefType, iconRefToken - } + }; } diff --git a/web-app/projects/core-lib/static-icon/static-icon-img/static-icon-img.component.spec.ts b/web-app/projects/core-lib/static-icon/static-icon-img/static-icon-img.component.spec.ts index f3bad43ce..2be5ef2b2 100644 --- a/web-app/projects/core-lib/static-icon/static-icon-img/static-icon-img.component.spec.ts +++ b/web-app/projects/core-lib/static-icon/static-icon-img/static-icon-img.component.spec.ts @@ -2,7 +2,7 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { StaticIconImgComponent } from './static-icon-img.component'; import { MageCommonModule } from '@ngageoint/mage.web-core-lib/common' -import { HttpClientModule } from '@angular/common/http' +import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http' describe('StaticIconImgComponent', () => { let component: StaticIconImgComponent; @@ -10,12 +10,9 @@ describe('StaticIconImgComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ StaticIconImgComponent ], - imports: [ - HttpClientModule, - MageCommonModule - ] - }) + imports: [StaticIconImgComponent, MageCommonModule], + providers: [provideHttpClient(withInterceptorsFromDi())] +}) .compileComponents(); })); diff --git a/web-app/projects/core-lib/static-icon/static-icon-img/static-icon-img.component.ts b/web-app/projects/core-lib/static-icon/static-icon-img/static-icon-img.component.ts index 593ca950c..bbab5a7b8 100644 --- a/web-app/projects/core-lib/static-icon/static-icon-img/static-icon-img.component.ts +++ b/web-app/projects/core-lib/static-icon/static-icon-img/static-icon-img.component.ts @@ -1,14 +1,18 @@ -import { Component, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core'; +import { Component, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core' +import { XhrImgComponent } from '@ngageoint/mage.web-core-lib/common' import { RegisteredStaticIconReference, contentPathOfIcon } from '../static-icon.model' @Component({ selector: 'mage-static-icon-img', + standalone: true, + imports: [XhrImgComponent], template: ``, }) export class StaticIconImgComponent implements OnInit, OnChanges { @Input() iconRef: RegisteredStaticIconReference | string | null + iconPath: string | null constructor() { } @@ -26,4 +30,4 @@ export class StaticIconImgComponent implements OnInit, OnChanges { } } } -} +} \ No newline at end of file diff --git a/web-app/projects/core-lib/static-icon/static-icon-select/static-icon-select.component.spec.ts b/web-app/projects/core-lib/static-icon/static-icon-select/static-icon-select.component.spec.ts index 4129e8562..b1d3e9241 100644 --- a/web-app/projects/core-lib/static-icon/static-icon-select/static-icon-select.component.spec.ts +++ b/web-app/projects/core-lib/static-icon/static-icon-select/static-icon-select.component.spec.ts @@ -1,57 +1,51 @@ -import { ScrollingModule } from '@angular/cdk/scrolling' -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' -import { MatCardModule as MatCardModule } from '@angular/material/card' -import { of } from 'rxjs' -import { StaticIcon } from '../static-icon.model' -import { StaticIconService } from '../static-icon.service' -import { StaticIconSelectComponent } from './static-icon-select.component' +import { ScrollingModule } from '@angular/cdk/scrolling'; +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { MatCardModule as MatCardModule } from '@angular/material/card'; +import { of } from 'rxjs'; +import { StaticIcon } from '../static-icon.model'; +import { StaticIconService } from '../static-icon.service'; +import { StaticIconSelectComponent } from './static-icon-select.component'; describe('StaticIconSelectComponent', () => { - - let target: StaticIconSelectComponent - let fixture: ComponentFixture - let iconService: jasmine.SpyObj + let target: StaticIconSelectComponent; + let fixture: ComponentFixture; + let iconService: jasmine.SpyObj; beforeEach(waitForAsync(() => { - iconService = jasmine.createSpyObj('MockStaticIconService', [ - 'fetchIcons' - ]) + iconService = jasmine.createSpyObj( + 'MockStaticIconService', + ['fetchIcons'] + ); TestBed.configureTestingModule({ - imports: [ - MatCardModule, - ScrollingModule - ], - declarations: [ - StaticIconSelectComponent - ], + imports: [MatCardModule, ScrollingModule, StaticIconSelectComponent], providers: [ { provide: StaticIconService, useValue: iconService } ] - }) - .compileComponents() - })) + }).compileComponents(); + })); beforeEach(() => { - iconService.fetchIcons.and.returnValue(of({ - pageIndex: 0, - pageSize: 0, - totalCount: 0, - items: [] - })) - fixture = TestBed.createComponent(StaticIconSelectComponent) - target = fixture.componentInstance - fixture.detectChanges() - }) + iconService.fetchIcons.and.returnValue( + of({ + pageIndex: 0, + pageSize: 0, + totalCount: 0, + items: [] + }) + ); + fixture = TestBed.createComponent(StaticIconSelectComponent); + target = fixture.componentInstance; + fixture.detectChanges(); + }); it('should create', () => { - expect(target).toBeTruthy() - }) + expect(target).toBeTruthy(); + }); it('fetches the icons on init', () => { - const icons: StaticIcon[] = [ { id: 'icon1', @@ -63,19 +57,21 @@ describe('StaticIconSelectComponent', () => { sourceUrl: 'test://icon2.png', contentPath: '/icons/icon2.png' } - ] - iconService.fetchIcons.and.returnValue(of({ - pageIndex: 0, - pageSize: 2, - items: icons - })) - target.ngOnInit() + ]; + iconService.fetchIcons.and.returnValue( + of({ + pageIndex: 0, + pageSize: 2, + items: icons + }) + ); + target.ngOnInit(); - expect(target.icons).toEqual(icons) - expect(iconService.fetchIcons).toHaveBeenCalledTimes(2) - }) + expect(target.icons).toEqual(icons); + expect(iconService.fetchIcons).toHaveBeenCalledTimes(2); + }); xit('opens a file chooser to upload an icon', () => { - target.onBrowseForUploadIcon() - }) -}) + target.onBrowseForUploadIcon(); + }); +}); diff --git a/web-app/projects/core-lib/static-icon/static-icon-select/static-icon-select.component.ts b/web-app/projects/core-lib/static-icon/static-icon-select/static-icon-select.component.ts index 409669083..ef8b892d9 100644 --- a/web-app/projects/core-lib/static-icon/static-icon-select/static-icon-select.component.ts +++ b/web-app/projects/core-lib/static-icon/static-icon-select/static-icon-select.component.ts @@ -1,41 +1,48 @@ -import { Component, OnInit } from '@angular/core' -import { PagingParameters, PagingDataSource } from '@ngageoint/mage.web-core-lib/paging' -import { StaticIcon } from '../static-icon.model' -import { StaticIconService } from '../static-icon.service' +import { ScrollingModule } from '@angular/cdk/scrolling'; +import { CommonModule } from '@angular/common'; +import { Component, OnInit } from '@angular/core'; +import { MatCardModule } from '@angular/material/card'; +import { + PagingParameters, + PagingDataSource +} from '@ngageoint/mage.web-core-lib/paging'; +import { StaticIcon } from '../static-icon.model'; +import { StaticIconService } from '../static-icon.service'; export interface StaticIconSelectItem { - id: string - path: string - title: string - fileName: string + id: string; + path: string; + title: string; + fileName: string; } @Component({ selector: 'static-icon-select', + standalone: true, + imports: [CommonModule, ScrollingModule, MatCardModule], templateUrl: './static-icon-select.component.html', styleUrls: ['./static-icon-select.component.scss'] }) export class StaticIconSelectComponent implements OnInit { + icons: StaticIcon[] | null = null; + dataSource: PagingDataSource; - icons: StaticIcon[] | null = null - dataSource: PagingDataSource - - constructor( - private iconService: StaticIconService - ) { - this.dataSource = new PagingDataSource(250, (paging: PagingParameters) => { - return this.iconService.fetchIcons(paging) - }) + constructor(private iconService: StaticIconService) { + this.dataSource = new PagingDataSource( + 250, + (paging: PagingParameters) => { + return this.iconService.fetchIcons(paging); + } + ); } ngOnInit() { - this.iconService.fetchIcons().subscribe(x => { - this.icons = x.items - }) + this.iconService.fetchIcons().subscribe((x) => { + this.icons = x.items; + }); } onBrowseForUploadIcon() { - throw new Error('unimplemented') + throw new Error('unimplemented'); } } - diff --git a/web-app/projects/core-lib/static-icon/static-icon.module.ts b/web-app/projects/core-lib/static-icon/static-icon.module.ts index d93d5a573..6a2856f84 100644 --- a/web-app/projects/core-lib/static-icon/static-icon.module.ts +++ b/web-app/projects/core-lib/static-icon/static-icon.module.ts @@ -1,13 +1,12 @@ -import { ScrollingModule } from '@angular/cdk/scrolling' -import { CommonModule } from '@angular/common' -import { NgModule } from '@angular/core' -import { FormsModule, ReactiveFormsModule } from '@angular/forms' -import { MatCardModule as MatCardModule } from '@angular/material/card' -import { MageCommonModule } from '@ngageoint/mage.web-core-lib/common' -import { StaticIconFormFieldComponent } from './static-icon-form-field/static-icon-form-field.component' -import { StaticIconImgComponent } from './static-icon-img/static-icon-img.component' -import { StaticIconSelectComponent } from './static-icon-select/static-icon-select.component' - +import { ScrollingModule } from '@angular/cdk/scrolling'; +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MatCardModule as MatCardModule } from '@angular/material/card'; +import { MageCommonModule } from '@ngageoint/mage.web-core-lib/common'; +import { StaticIconFormFieldComponent } from './static-icon-form-field/static-icon-form-field.component'; +import { StaticIconImgComponent } from './static-icon-img/static-icon-img.component'; +import { StaticIconSelectComponent } from './static-icon-select/static-icon-select.component'; @NgModule({ imports: [ @@ -16,17 +15,15 @@ import { StaticIconSelectComponent } from './static-icon-select/static-icon-sele ReactiveFormsModule, MatCardModule, MageCommonModule, - ScrollingModule - ], - declarations: [ + ScrollingModule, StaticIconFormFieldComponent, StaticIconImgComponent, - StaticIconSelectComponent, + StaticIconSelectComponent ], exports: [ StaticIconFormFieldComponent, StaticIconImgComponent, - StaticIconSelectComponent, + StaticIconSelectComponent ] }) -export class StaticIconModule {} \ No newline at end of file +export class StaticIconModule {} diff --git a/web-app/projects/core-lib/static-icon/static-icon.service.spec.ts b/web-app/projects/core-lib/static-icon/static-icon.service.spec.ts index b80898849..66d192255 100644 --- a/web-app/projects/core-lib/static-icon/static-icon.service.spec.ts +++ b/web-app/projects/core-lib/static-icon/static-icon.service.spec.ts @@ -1,5 +1,5 @@ -import { HttpClient, HttpErrorResponse, HttpParams } from '@angular/common/http' -import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing' +import { HttpClient, HttpErrorResponse, HttpParams, provideHttpClient, withInterceptorsFromDi } from '@angular/common/http' +import { HttpTestingController, provideHttpClientTesting } from '@angular/common/http/testing' import { TestBed, waitForAsync } from '@angular/core/testing' import * as _ from 'lodash' import { RegisteredStaticIconReference, SourceUrlStaticIconReference, StaticIcon } from './static-icon.model' @@ -14,10 +14,9 @@ describe('StaticIconService', () => { beforeEach(() => { TestBed.configureTestingModule({ - imports: [ - HttpClientTestingModule - ] - }) + imports: [], + providers: [provideHttpClient(withInterceptorsFromDi()), provideHttpClientTesting()] +}) http = TestBed.inject(HttpClient) httpTest = TestBed.inject(HttpTestingController) service = TestBed.inject(StaticIconService) diff --git a/web-app/projects/core-lib/user/user-read.service.spec.ts b/web-app/projects/core-lib/user/user-read.service.spec.ts index 7b859e13c..d5e93d073 100644 --- a/web-app/projects/core-lib/user/user-read.service.spec.ts +++ b/web-app/projects/core-lib/user/user-read.service.spec.ts @@ -1,7 +1,7 @@ import { USER_READ_BASE_URL as BASE_URL, UserReadService, UserSearchResult, UserSearchParams } from './user-read.service' -import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing' +import { HttpTestingController, provideHttpClientTesting } from '@angular/common/http/testing' import { TestBed } from '@angular/core/testing' -import { HttpClient } from '@angular/common/http' +import { HttpClient, provideHttpClient, withInterceptorsFromDi } from '@angular/common/http' import { PageOf } from '@ngageoint/mage.web-core-lib/paging' describe('user read service', () => { @@ -12,10 +12,9 @@ describe('user read service', () => { beforeEach(() => { TestBed.configureTestingModule({ - imports: [ - HttpClientTestingModule - ] - }) + imports: [], + providers: [provideHttpClient(withInterceptorsFromDi()), provideHttpClientTesting()] +}) http = TestBed.inject(HttpClient) httpTest = TestBed.inject(HttpTestingController) service = TestBed.inject(UserReadService) diff --git a/web-app/projects/core-lib/user/user-select/user-select.component.spec.ts b/web-app/projects/core-lib/user/user-select/user-select.component.spec.ts index 441588dc7..81f76d2e0 100644 --- a/web-app/projects/core-lib/user/user-select/user-select.component.spec.ts +++ b/web-app/projects/core-lib/user/user-select/user-select.component.spec.ts @@ -36,8 +36,6 @@ describe('user select component', () => { FormsModule, NgSelectModule, ReactiveFormsModule, - ], - declarations: [ TestHostComponent, UserSelectComponent, ], diff --git a/web-app/projects/core-lib/user/user-select/user-select.component.ts b/web-app/projects/core-lib/user/user-select/user-select.component.ts index ad00ddfeb..805af43d8 100644 --- a/web-app/projects/core-lib/user/user-select/user-select.component.ts +++ b/web-app/projects/core-lib/user/user-select/user-select.component.ts @@ -1,19 +1,45 @@ -import { AfterViewInit, Component, Input, OnChanges, SimpleChanges, ViewChild, forwardRef, OnInit } from '@angular/core' -import { ControlValueAccessor, FormControl, NG_VALUE_ACCESSOR } from '@angular/forms' -import { NgSelectComponent } from '@ng-select/ng-select' -import { User } from '../user.model' -import { UserReadService, UserSearchParams, UserSearchResult } from '../user-read.service' -import { pageForItemIndex, itemRangeOfPage } from '@ngageoint/mage.web-core-lib/paging' -import { Subject, BehaviorSubject, SubscriptionLike, Unsubscribable } from 'rxjs' -import { debounceTime, distinctUntilChanged } from 'rxjs/operators' -import { X } from '@angular/cdk/keycodes' +import { CommonModule } from '@angular/common'; +import { + AfterViewInit, + Component, + Input, + OnChanges, + SimpleChanges, + ViewChild, + forwardRef, + OnInit +} from '@angular/core'; +import { + ControlValueAccessor, + FormControl, + NG_VALUE_ACCESSOR +} from '@angular/forms'; +import { NgSelectComponent, NgSelectModule } from '@ng-select/ng-select'; +import { User } from '../user.model'; +import { + UserReadService, + UserSearchParams, + UserSearchResult +} from '../user-read.service'; +import { + pageForItemIndex, + itemRangeOfPage +} from '@ngageoint/mage.web-core-lib/paging'; +import { + Subject, + BehaviorSubject, + SubscriptionLike, + Unsubscribable +} from 'rxjs'; +import { debounceTime, distinctUntilChanged } from 'rxjs/operators'; +import { X } from '@angular/cdk/keycodes'; @Component({ selector: 'mage-user-select', + standalone: true, + imports: [CommonModule, NgSelectModule], templateUrl: './user-select.component.html', - styleUrls: [ - './user-select.component.scss' - ], + styleUrls: ['./user-select.component.scss'], providers: [ { provide: NG_VALUE_ACCESSOR, @@ -22,109 +48,111 @@ import { X } from '@angular/cdk/keycodes' } ] }) -export class UserSelectComponent implements OnInit, OnChanges, AfterViewInit, ControlValueAccessor { - +export class UserSelectComponent + implements OnInit, OnChanges, AfterViewInit, ControlValueAccessor +{ readonly baseFindParams: Readonly = Object.freeze({ pageSize: 100, pageIndex: 0, term: null - }) - readonly nextPageScrollThreshold = 15 - readonly searchTermDebounceTime = 500 - readonly trackByUserId: (x: User) => User['id'] = x => x.id + }); + readonly nextPageScrollThreshold = 15; + readonly searchTermDebounceTime = 500; + readonly trackByUserId: (x: User) => User['id'] = (x) => x.id; get loading(): boolean { - return !!this.currentFetch && !this.currentFetch.closed + return !!this.currentFetch && !this.currentFetch.closed; } - users: UserSearchResult[] = [] - totalCount = 0 - searchTerm$ = new Subject() - currentSearchTerm: string | null = null + users: UserSearchResult[] = []; + totalCount = 0; + searchTerm$ = new Subject(); + currentSearchTerm: string | null = null; @ViewChild(NgSelectComponent, { static: true }) - userSelect: NgSelectComponent + userSelect: NgSelectComponent; - private currentFetch: SubscriptionLike | null = null + private currentFetch: SubscriptionLike | null = null; - constructor(private userService: UserReadService) { } + constructor(private userService: UserReadService) {} ngOnInit() { - this.searchTerm$.pipe( - distinctUntilChanged(), - debounceTime(this.searchTermDebounceTime), - ) - .subscribe(x => { - this.currentSearchTerm = x - this.users = [] - this.totalCount = 0 - if (this.currentFetch) { - this.currentFetch.unsubscribe() - this.currentFetch = null - } - this.fetchNextPage() - }) + this.searchTerm$ + .pipe(distinctUntilChanged(), debounceTime(this.searchTermDebounceTime)) + .subscribe((x) => { + this.currentSearchTerm = x; + this.users = []; + this.totalCount = 0; + if (this.currentFetch) { + this.currentFetch.unsubscribe(); + this.currentFetch = null; + } + this.fetchNextPage(); + }); } - ngOnChanges(changes: SimpleChanges) { - } + ngOnChanges(changes: SimpleChanges) {} - ngAfterViewInit() { - } + ngAfterViewInit() {} writeValue(x: User | null): void { - this.userSelect.writeValue(x) + this.userSelect.writeValue(x); } registerOnChange(fn: (...args: any[]) => any): void { - this.userSelect.registerOnChange(fn) + this.userSelect.registerOnChange(fn); } registerOnTouched(fn: (...args: any[]) => any): void { - this.userSelect.registerOnTouched(fn) + this.userSelect.registerOnTouched(fn); } setDisabledState(isDisabled: boolean): void { - this.userSelect.setDisabledState(isDisabled) + this.userSelect.setDisabledState(isDisabled); } onOpen() { if (this.users.length === 0) { - this.fetchNextPage() + this.fetchNextPage(); } } - onScroll({ end }: { start: number, end: number }) { - if (end < this.users.length - this.nextPageScrollThreshold || this.users.length === this.totalCount) { - return + onScroll({ end }: { start: number; end: number }) { + if ( + end < this.users.length - this.nextPageScrollThreshold || + this.users.length === this.totalCount + ) { + return; } - this.fetchNextPage() + this.fetchNextPage(); } - onScrollToEnd() { - - } + onScrollToEnd() {} fetchNextPage() { if (this.currentFetch) { if (this.currentFetch.closed) { - this.currentFetch = null - } - else { - return + this.currentFetch = null; + } else { + return; } } - const nextPage = pageForItemIndex(this.users.length, this.baseFindParams.pageSize) + const nextPage = pageForItemIndex( + this.users.length, + this.baseFindParams.pageSize + ); const findParams: UserSearchParams = { ...this.baseFindParams, pageIndex: nextPage - } + }; if (this.currentSearchTerm) { - findParams.term = this.currentSearchTerm + findParams.term = this.currentSearchTerm; } - this.currentFetch = this.userService.search(findParams).subscribe(page => { - this.users = this.users.concat(page.items) - if (typeof page.totalCount === 'number') { - this.totalCount = page.totalCount - } - }) + this.currentFetch = this.userService + .search(findParams) + .subscribe((page) => { + this.users = this.users.concat(page.items); + if (typeof page.totalCount === 'number') { + this.totalCount = page.totalCount; + } + }); } -} \ No newline at end of file +} diff --git a/web-app/projects/core-lib/user/user.module.ts b/web-app/projects/core-lib/user/user.module.ts index 248078339..1ab385499 100644 --- a/web-app/projects/core-lib/user/user.module.ts +++ b/web-app/projects/core-lib/user/user.module.ts @@ -24,9 +24,7 @@ import { NgSelectModule } from '@ng-select/ng-select' MatListModule, MatSelectModule, NgSelectModule, - ], - declarations: [ - UserSelectComponent + UserSelectComponent, ], exports: [ UserSelectComponent diff --git a/web-app/src/app/about/about.component.scss b/web-app/src/app/about/about.component.scss index 228b6c3d3..c54f0b6a0 100644 --- a/web-app/src/app/about/about.component.scss +++ b/web-app/src/app/about/about.component.scss @@ -45,14 +45,14 @@ $mobile-padding: 16px; gap: 8px; font-size: 1.4rem; font-weight: 600; - color: mat.get-color-from-palette($app-primary); - border-bottom: 2px solid mat.get-color-from-palette($app-primary); + color: mat.m2-get-color-from-palette($app-primary); + border-bottom: 2px solid mat.m2-get-color-from-palette($app-primary); padding-bottom: 4px; } .section-icon { font-size: 1.4rem; - color: mat.get-color-from-palette($app-primary); + color: mat.m2-get-color-from-palette($app-primary); } .section-text { @@ -61,7 +61,7 @@ $mobile-padding: 16px; color: #444; a { - color: mat.get-color-from-palette($app-primary); + color: mat.m2-get-color-from-palette($app-primary); text-decoration: underline; } } @@ -119,7 +119,7 @@ $mobile-padding: 16px; font-size: 0.95rem; a { - color: mat.get-color-from-palette($app-primary); + color: mat.m2-get-color-from-palette($app-primary); } } } diff --git a/web-app/src/app/about/about.component.spec.ts b/web-app/src/app/about/about.component.spec.ts index 265839e89..d0afb8c4b 100644 --- a/web-app/src/app/about/about.component.spec.ts +++ b/web-app/src/app/about/about.component.spec.ts @@ -46,8 +46,7 @@ describe('AboutComponent', () => { mockLocation = jasmine.createSpyObj('Location', ['back']); TestBed.configureTestingModule({ - imports: [MatToolbarModule, MatIconModule], - declarations: [AboutComponent], + imports: [MatToolbarModule, MatIconModule, AboutComponent], providers: [ { provide: ApiService, useValue: mockApiService }, { provide: Location, useValue: mockLocation } diff --git a/web-app/src/app/about/about.component.ts b/web-app/src/app/about/about.component.ts index 86ba48de5..ff8fd0961 100644 --- a/web-app/src/app/about/about.component.ts +++ b/web-app/src/app/about/about.component.ts @@ -1,9 +1,17 @@ import { Component, OnInit } from '@angular/core'; import { ApiService } from '../api/api.service'; -import {Location} from '@angular/common'; +import {CommonModule, Location} from '@angular/common'; +import { MatIconModule } from '@angular/material/icon'; +import { MatToolbarModule } from '@angular/material/toolbar'; @Component({ selector: 'about', + standalone: true, + imports: [ + CommonModule, + MatToolbarModule, + MatIconModule + ], templateUrl: './about.component.html', styleUrls: ['./about.component.scss', '../../../node_modules/font-awesome/css/font-awesome.min.css'] }) diff --git a/web-app/src/app/about/about.module.ts b/web-app/src/app/about/about.module.ts index 5b3def475..6db81cc4b 100644 --- a/web-app/src/app/about/about.module.ts +++ b/web-app/src/app/about/about.module.ts @@ -4,33 +4,24 @@ import { RouterModule, Routes } from '@angular/router'; import { AboutComponent } from './about.component'; import { MatToolbarModule } from '@angular/material/toolbar'; import { MatIconModule } from '@angular/material/icon'; -import { MatButtonModule as MatButtonModule } from '@angular/material/button'; +import { MatButtonModule } from '@angular/material/button'; -const routes: Routes = [{ - path: '', - component: AboutComponent -}]; +const routes: Routes = [ + { + path: '', + component: AboutComponent + } +]; @NgModule({ declarations: [], imports: [], - exports: [ - CommonModule, - MatButtonModule, - MatIconModule, - MatToolbarModule - ] + exports: [CommonModule, MatButtonModule, MatIconModule, MatToolbarModule] }) -class AngularModule { } +class AngularModule {} @NgModule({ - declarations: [ - AboutComponent, - ], - imports: [ - AngularModule, - RouterModule.forChild(routes) - ], + imports: [AngularModule, AboutComponent, RouterModule.forChild(routes)], exports: [RouterModule] }) -export class AboutModule { } \ No newline at end of file +export class AboutModule {} diff --git a/web-app/src/app/api/api.service.spec.ts b/web-app/src/app/api/api.service.spec.ts index 09c344574..edf6f9fbf 100644 --- a/web-app/src/app/api/api.service.spec.ts +++ b/web-app/src/app/api/api.service.spec.ts @@ -1,5 +1,5 @@ -import { HttpClient } from '@angular/common/http'; -import { HttpTestingController, HttpClientTestingModule } from '@angular/common/http/testing'; +import { HttpClient, provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; +import { HttpTestingController, provideHttpClientTesting } from '@angular/common/http/testing'; import { TestBed } from '@angular/core/testing'; import { ExportService } from '../export/export.service'; import { ApiService } from './api.service'; @@ -10,9 +10,9 @@ describe('API Service Tests', () => { beforeEach(() => { TestBed.configureTestingModule({ - providers: [ExportService], - imports: [HttpClientTestingModule] - }); + imports: [], + providers: [ExportService, provideHttpClient(withInterceptorsFromDi()), provideHttpClientTesting()] +}); // Inject the http service and test controller for each test httpClient = TestBed.inject(HttpClient); diff --git a/web-app/src/app/app.component.ts b/web-app/src/app/app.component.ts index 586c9e2e2..bda571dab 100644 --- a/web-app/src/app/app.component.ts +++ b/web-app/src/app/app.component.ts @@ -1,8 +1,15 @@ +import { CommonModule } from '@angular/common'; import { Component } from '@angular/core'; +import { RouterModule } from '@angular/router'; @Component({ selector: 'app', + standalone: true, + imports: [ + CommonModule, + RouterModule + ], templateUrl: './app.component.html', styleUrls: ['./app.component.scss'] }) diff --git a/web-app/src/app/app.module.ts b/web-app/src/app/app.module.ts index 84ba46078..65b1e5fd8 100644 --- a/web-app/src/app/app.module.ts +++ b/web-app/src/app/app.module.ts @@ -3,35 +3,33 @@ import { NgModule, ApplicationRef, DoBootstrap } from '@angular/core'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { CommonModule, HashLocationStrategy, LocationStrategy } from '@angular/common'; import { AppComponent } from './app.component'; -import { HTTP_INTERCEPTORS, HttpClientModule } from '@angular/common/http'; -import { MatDialogModule as MatDialogModule } from '@angular/material/dialog'; +import { HTTP_INTERCEPTORS, provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; +import { MatDialogModule } from '@angular/material/dialog'; import { AppRoutingModule } from './routing.module'; import { LocalStorageService } from './http/local-storage.service'; import { TokenInterceptorService } from './http/token.interceptor'; import { MageCommonModule } from '@ngageoint/mage.web-core-lib/common'; @NgModule({ - declarations: [ - AppComponent - ], + declarations: [], imports: [ + AppComponent, AppRoutingModule, CommonModule, BrowserModule, BrowserAnimationsModule, - HttpClientModule, MatDialogModule, MageCommonModule ], - bootstrap: [ AppComponent ], + bootstrap: [AppComponent], providers: [ LocalStorageService, TokenInterceptorService, { provide: LocationStrategy, useClass: HashLocationStrategy }, - { provide: HTTP_INTERCEPTORS, useClass: TokenInterceptorService, multi: true } + { provide: HTTP_INTERCEPTORS, useClass: TokenInterceptorService, multi: true }, + provideHttpClient(withInterceptorsFromDi()) ] }) export class AppModule implements DoBootstrap { - // eslint-disable-next-line @typescript-eslint/no-empty-function - public ngDoBootstrap(_appRef: ApplicationRef): void { } + public ngDoBootstrap(_appRef: ApplicationRef): void {} } \ No newline at end of file diff --git a/web-app/src/app/banner/banner.component.spec.ts b/web-app/src/app/banner/banner.component.spec.ts index affc1c758..378417a2d 100644 --- a/web-app/src/app/banner/banner.component.spec.ts +++ b/web-app/src/app/banner/banner.component.spec.ts @@ -7,8 +7,7 @@ describe('Banner Component', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [BannerComponent], - imports: [] + imports: [BannerComponent], }).compileComponents(); })); diff --git a/web-app/src/app/banner/banner.module.ts b/web-app/src/app/banner/banner.module.ts index 1360c758d..3627051b1 100644 --- a/web-app/src/app/banner/banner.module.ts +++ b/web-app/src/app/banner/banner.module.ts @@ -1,12 +1,14 @@ import { NgModule } from '@angular/core'; -import { BannerComponent } from './baner.component'; import { CommonModule } from '@angular/common'; +import { BannerComponent } from './baner.component'; @NgModule({ - declarations: [ - BannerComponent, + imports: [ + CommonModule, + BannerComponent ], - imports: [CommonModule], - exports: [BannerComponent] + exports: [ + BannerComponent + ] }) export class BannerModule { } \ No newline at end of file diff --git a/web-app/src/app/color-picker/color-picker.component.spec.ts b/web-app/src/app/color-picker/color-picker.component.spec.ts index ba8479dc4..c062fa557 100644 --- a/web-app/src/app/color-picker/color-picker.component.spec.ts +++ b/web-app/src/app/color-picker/color-picker.component.spec.ts @@ -4,19 +4,25 @@ import { ColorPickerComponent } from './color-picker.component'; import { MatCardModule as MatCardModule } from '@angular/material/card'; import { MatFormFieldModule as MatFormFieldModule } from '@angular/material/form-field'; import { MatInputModule as MatInputModule } from '@angular/material/input'; -import { CheckboardModule, SaturationModule, HueModule, AlphaModule } from 'ngx-color'; +import { + CheckboardModule, + SaturationModule, + HueModule, + AlphaModule +} from 'ngx-color'; import { Component, ViewChild } from '@angular/core'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { TinyColor } from '@ctrl/tinycolor'; @Component({ - selector: `host-component`, + standalone: true, + imports: [ColorPickerComponent], template: `` }) class TestHostComponent { hexColor = '#000000FF'; - @ViewChild(ColorPickerComponent) colorPicker: ColorPickerComponent; + @ViewChild(ColorPickerComponent) colorPicker: ColorPickerComponent; } describe('ColorPickerComponent', () => { @@ -26,10 +32,19 @@ describe('ColorPickerComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - imports: [ NoopAnimationsModule, MatInputModule, MatFormFieldModule, MatCardModule, CheckboardModule, SaturationModule, HueModule, AlphaModule ], - declarations: [ TestHostComponent, ColorPickerComponent ] - }) - .compileComponents(); + imports: [ + NoopAnimationsModule, + MatInputModule, + MatFormFieldModule, + MatCardModule, + CheckboardModule, + SaturationModule, + HueModule, + AlphaModule, + TestHostComponent, + ColorPickerComponent + ] + }).compileComponents(); })); beforeEach(() => { @@ -43,7 +58,6 @@ describe('ColorPickerComponent', () => { expect(component).toBeTruthy(); }); - it('should show color picker on open', () => { component.open(); expect(component.showColorPicker).toEqual(true); @@ -67,5 +81,3 @@ describe('ColorPickerComponent', () => { }); }); }); - - diff --git a/web-app/src/app/color-picker/color-picker.component.ts b/web-app/src/app/color-picker/color-picker.component.ts index f6c58905a..f816510b2 100644 --- a/web-app/src/app/color-picker/color-picker.component.ts +++ b/web-app/src/app/color-picker/color-picker.component.ts @@ -6,8 +6,13 @@ import { Input, HostListener } from '@angular/core'; -import { ColorWrap, RGBA, toState } from 'ngx-color'; +import { AlphaModule, CheckboardModule, ColorWrap, HueModule, RGBA, SaturationModule, toState } from 'ngx-color'; import { TinyColor } from '@ctrl/tinycolor'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { MatCardModule } from '@angular/material/card'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; export interface ColorEvent { color: string; @@ -15,6 +20,18 @@ export interface ColorEvent { @Component({ selector: 'color-picker', + standalone: true, + imports: [ + CommonModule, + FormsModule, + MatFormFieldModule, + MatInputModule, + MatCardModule, + CheckboardModule, + SaturationModule, + HueModule, + AlphaModule + ], templateUrl: './color-picker.component.html', styleUrls: ['./color-picker.component.scss'] }) diff --git a/web-app/src/app/contact/contact-dialog.component.scss b/web-app/src/app/contact/contact-dialog.component.scss index dffba0cf7..4d132b0cd 100644 --- a/web-app/src/app/contact/contact-dialog.component.scss +++ b/web-app/src/app/contact/contact-dialog.component.scss @@ -3,7 +3,7 @@ button { margin-left: 8px; - color: mat.get-color-from-palette($app-primary); + color: mat.m2-get-color-from-palette($app-primary); } mat-dialog-actions { diff --git a/web-app/src/app/contact/contact-dialog.component.ts b/web-app/src/app/contact/contact-dialog.component.ts index 7502fa4c4..35a98ed9b 100644 --- a/web-app/src/app/contact/contact-dialog.component.ts +++ b/web-app/src/app/contact/contact-dialog.component.ts @@ -1,11 +1,17 @@ import { Component, Inject } from "@angular/core"; -import { MatDialogRef as MatDialogRef, MAT_DIALOG_DATA as MAT_DIALOG_DATA } from "@angular/material/dialog"; +import { MatDialogRef as MatDialogRef, MAT_DIALOG_DATA as MAT_DIALOG_DATA, MatDialogModule } from "@angular/material/dialog"; import { LinkGenerator } from "./utilities/link-generator"; import { Api } from "../api/api.entity"; import { ApiService } from "../api/api.service"; +import { CommonModule } from "@angular/common"; @Component({ selector: 'contact-dialog', + standalone: true, + imports: [ + CommonModule, + MatDialogModule + ], templateUrl: 'contact-dialog.component.html', styleUrls: ['./contact-dialog.component.scss'], }) diff --git a/web-app/src/app/datetime-picker/datetime-picker.component.spec.ts b/web-app/src/app/datetime-picker/datetime-picker.component.spec.ts index c16937b48..e864fe5ad 100644 --- a/web-app/src/app/datetime-picker/datetime-picker.component.spec.ts +++ b/web-app/src/app/datetime-picker/datetime-picker.component.spec.ts @@ -9,7 +9,7 @@ describe('DatetimePickerComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ DatetimePickerComponent ] + imports: [ DatetimePickerComponent ] }) .compileComponents(); })); diff --git a/web-app/src/app/datetime-picker/datetime-picker.component.ts b/web-app/src/app/datetime-picker/datetime-picker.component.ts index 044c39679..399630870 100644 --- a/web-app/src/app/datetime-picker/datetime-picker.component.ts +++ b/web-app/src/app/datetime-picker/datetime-picker.component.ts @@ -1,3 +1,4 @@ +import { CommonModule } from '@angular/common'; import { Component, EventEmitter, @@ -7,11 +8,24 @@ import { SimpleChanges, ViewChild } from '@angular/core'; -import { NgModel } from '@angular/forms'; +import { FormsModule, NgModel } from '@angular/forms'; +import { MatNativeDateModule } from '@angular/material/core'; +import { MatDatepickerModule } from '@angular/material/datepicker'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; import moment from 'moment'; @Component({ selector: 'datetime-picker', + standalone: true, + imports: [ + CommonModule, + FormsModule, + MatFormFieldModule, + MatInputModule, + MatDatepickerModule, + MatNativeDateModule + ], templateUrl: './datetime-picker.component.html', styleUrls: ['./datetime-picker.component.scss'] }) diff --git a/web-app/src/app/event/event.service.spec.ts b/web-app/src/app/event/event.service.spec.ts index 45cd9ac47..4b1662702 100644 --- a/web-app/src/app/event/event.service.spec.ts +++ b/web-app/src/app/event/event.service.spec.ts @@ -1,14 +1,15 @@ import { TestBed } from '@angular/core/testing'; import { EventService } from './event.service'; -import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { provideHttpClientTesting } from '@angular/common/http/testing'; +import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; describe('Event Service Tests', () => { beforeEach(() => { TestBed.configureTestingModule({ - providers: [EventService], - imports: [HttpClientTestingModule] - }); + imports: [], + providers: [EventService, provideHttpClient(withInterceptorsFromDi()), provideHttpClientTesting()] +}); }); afterEach(() => { diff --git a/web-app/src/app/export/empty-state/no-exports.component.spec.ts b/web-app/src/app/export/empty-state/no-exports.component.spec.ts index a279359f4..6e12a0cb1 100644 --- a/web-app/src/app/export/empty-state/no-exports.component.spec.ts +++ b/web-app/src/app/export/empty-state/no-exports.component.spec.ts @@ -10,8 +10,7 @@ describe('NoExportsComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - imports: [MatDialogModule, MatIconModule, MatDividerModule], - declarations: [NoExportsComponent] + imports: [MatDialogModule, MatIconModule, MatDividerModule, NoExportsComponent], }).compileComponents(); })); diff --git a/web-app/src/app/export/empty-state/no-exports.component.ts b/web-app/src/app/export/empty-state/no-exports.component.ts index 82441e78d..07bd8021e 100644 --- a/web-app/src/app/export/empty-state/no-exports.component.ts +++ b/web-app/src/app/export/empty-state/no-exports.component.ts @@ -1,7 +1,18 @@ +import { CommonModule } from "@angular/common"; import { Component, EventEmitter, Output } from "@angular/core"; +import { MatDialogModule } from "@angular/material/dialog"; +import { MatDividerModule } from "@angular/material/divider"; +import { MatIconModule } from "@angular/material/icon"; @Component({ selector: 'no-exports', + standalone: true, + imports: [ + CommonModule, + MatDialogModule, + MatIconModule, + MatDividerModule + ], templateUrl: 'no-exports.component.html', styleUrls: ['./no-exports.component.scss'] }) diff --git a/web-app/src/app/export/export-data/export-data.component.spec.ts b/web-app/src/app/export/export-data/export-data.component.spec.ts index c971e9b43..2b7177ee8 100644 --- a/web-app/src/app/export/export-data/export-data.component.spec.ts +++ b/web-app/src/app/export/export-data/export-data.component.spec.ts @@ -1,4 +1,4 @@ -import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { provideHttpClientTesting } from '@angular/common/http/testing'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { FormsModule } from '@angular/forms'; import { MatCardModule as MatCardModule } from '@angular/material/card'; @@ -37,6 +37,10 @@ import { FilterService } from 'src/app/filter/filter.service'; import { BrowserModule } from '@angular/platform-browser'; import { CommonModule } from '@angular/common'; import { MatDialogModule as MatDialogModule } from '@angular/material/dialog'; +import { + provideHttpClient, + withInterceptorsFromDi +} from '@angular/common/http'; class MockExportService { getExports(): Observable { @@ -142,6 +146,8 @@ describe('ExportDataComponent', () => { TestBed.configureTestingModule({ imports: [ + ExportDialogComponent, + ExportDataComponent, NoopAnimationsModule, MatPaginatorModule, MatSortModule, @@ -151,7 +157,6 @@ describe('ExportDataComponent', () => { MatInputModule, MatFormFieldModule, MatIconModule, - HttpClientTestingModule, NoopAnimationsModule, MatCheckboxModule, MatListModule, @@ -167,14 +172,15 @@ describe('ExportDataComponent', () => { MatOptionModule, BrowserModule, CommonModule, - MatDialogModule + MatDialogModule ], providers: [ { provide: ExportService, useClass: MockExportService }, { provide: FilterService, useValue: mockFilterService }, - { provide: MatSnackBar, useClass: MockSnackbar } - ], - declarations: [ExportDialogComponent, ExportDataComponent] + { provide: MatSnackBar, useClass: MockSnackbar }, + provideHttpClient(withInterceptorsFromDi()), + provideHttpClientTesting() + ] }).compileComponents(); })); diff --git a/web-app/src/app/export/export-data/export-data.component.ts b/web-app/src/app/export/export-data/export-data.component.ts index 8b6a35218..516226f28 100644 --- a/web-app/src/app/export/export-data/export-data.component.ts +++ b/web-app/src/app/export/export-data/export-data.component.ts @@ -5,6 +5,16 @@ import moment from 'moment'; import { first } from 'rxjs/operators'; import { trigger, transition, style, animate, state } from '@angular/animations'; import { FilterService } from 'src/app/filter/filter.service'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { MatCheckboxModule } from '@angular/material/checkbox'; +import { MatChipsModule } from '@angular/material/chips'; +import { MatDialogModule } from '@angular/material/dialog'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatSelectModule } from '@angular/material/select'; +import { DatetimePickerComponent } from 'mage-web-app/datetime-picker/datetime-picker.component'; export interface ExportTimeOption { all?: boolean, @@ -16,6 +26,19 @@ export interface ExportTimeOption { @Component({ selector: 'export-data', + standalone: true, + imports: [ + CommonModule, + FormsModule, + MatDialogModule, + MatCheckboxModule, + MatChipsModule, + MatFormFieldModule, + MatSelectModule, + MatIconModule, + MatDividerModule, + DatetimePickerComponent + ], templateUrl: 'export-data.component.html', styleUrls: ['./export-data.component.scss'], animations: [ diff --git a/web-app/src/app/export/export-dialog.component.spec.ts b/web-app/src/app/export/export-dialog.component.spec.ts index 71393aa3f..cc4d34238 100644 --- a/web-app/src/app/export/export-dialog.component.spec.ts +++ b/web-app/src/app/export/export-dialog.component.spec.ts @@ -1,47 +1,13 @@ -import { - ComponentFixture, - fakeAsync, - TestBed, - tick, - waitForAsync -} from '@angular/core/testing'; +import { fakeAsync, tick } from '@angular/core/testing'; import { Observable, of, Subject } from 'rxjs'; import { ExportDialogComponent } from './export-dialog.component'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatChipsModule } from '@angular/material/chips'; -import { MatNativeDateModule } from '@angular/material/core'; -import { MatOptionModule } from '@angular/material/core'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatExpansionModule } from '@angular/material/expansion'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatListModule } from '@angular/material/list'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatRadioModule } from '@angular/material/radio'; -import { MatSelectModule } from '@angular/material/select'; -import { - MatSnackBar, - MatSnackBarDismiss, - MatSnackBarModule -} from '@angular/material/snack-bar'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; import { ExportService, Export, ExportRequest, ExportResponse } from './export.service'; -import { HttpClientTestingModule } from '@angular/common/http/testing'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { FormsModule } from '@angular/forms'; -import { MatDialogModule, MatDialogRef } from '@angular/material/dialog'; -import { LocalStorageService } from '../http/local-storage.service'; -import { FilterService } from '../filter/filter.service'; -import { NoExportsComponent } from './empty-state/no-exports.component'; +import { MatSnackBarDismiss } from '@angular/material/snack-bar'; class MockExportService { getExports(): Observable { @@ -91,12 +57,12 @@ class MockExportService { ]); } - export(request: ExportRequest): Observable { + export(_request: ExportRequest): Observable { return of({ id: '1' }); } retryExport(retry: Export): Observable { - return of({ id: retry.id }); + return of({ id: String(retry.id) }); } deleteExport(id: string): Observable<{ id: string }> { @@ -105,31 +71,31 @@ class MockExportService { } class MockSnackbarRef { - private readonly _afterDismissed = new Subject(); + private readonly afterDismissedSubject = new Subject(); afterDismissed(): Observable { - return this._afterDismissed; + return this.afterDismissedSubject.asObservable(); } dismiss(): void { - this._afterDismissed.next({ dismissedByAction: false }); - this._afterDismissed.complete(); + this.afterDismissedSubject.next({ dismissedByAction: false }); + this.afterDismissedSubject.complete(); } dismissWithAction(): void { - this._afterDismissed.next({ dismissedByAction: true }); - this._afterDismissed.complete(); + this.afterDismissedSubject.next({ dismissedByAction: true }); + this.afterDismissedSubject.complete(); } } class MockSnackbar { private snackbarRef = new MockSnackbarRef(); - get _openedSnackBarRef(): any { + get _openedSnackBarRef(): MockSnackbarRef { return this.snackbarRef; } - open(): any { + open(): MockSnackbarRef { this.snackbarRef = new MockSnackbarRef(); return this.snackbarRef; } @@ -137,57 +103,31 @@ class MockSnackbar { describe('ExportDialogComponent', () => { let component: ExportDialogComponent; - let fixture: ComponentFixture; + let exportService: MockExportService; + let snackBar: MockSnackbar; - beforeEach(waitForAsync(() => { - const mockLocalStorageService = { getToken: (): string => '1' }; - const mockFilterService = { - getEvent: (): any => { - return { id: 1 }; - } + beforeEach(() => { + const mockDialogRef = { + close: (): void => {} }; - const mockDialogRef = { close: (): void => {} }; - - TestBed.configureTestingModule({ - imports: [ - NoopAnimationsModule, - MatPaginatorModule, - MatSortModule, - MatSnackBarModule, - MatTableModule, - MatDialogModule, - MatProgressSpinnerModule, - MatInputModule, - MatFormFieldModule, - MatIconModule, - HttpClientTestingModule, - MatCheckboxModule, - MatListModule, - MatCardModule, - MatExpansionModule, - MatRadioModule, - MatSelectModule, - MatOptionModule, - MatDatepickerModule, - MatNativeDateModule, - FormsModule, - MatChipsModule - ], - providers: [ - { provide: LocalStorageService, useValue: mockLocalStorageService }, - { provide: ExportService, useClass: MockExportService }, - { provide: FilterService, useValue: mockFilterService }, - { provide: MatDialogRef, useValue: mockDialogRef }, - { provide: MatSnackBar, useClass: MockSnackbar } - ], - declarations: [ExportDialogComponent, NoExportsComponent] - }).compileComponents(); - })); - beforeEach(() => { - fixture = TestBed.createComponent(ExportDialogComponent); - component = fixture.componentInstance; - fixture.detectChanges(); + const mockLocalStorageService = { + getToken: (): string => '1' + }; + + exportService = new MockExportService(); + snackBar = new MockSnackbar(); + + component = new ExportDialogComponent( + mockDialogRef as any, + snackBar as any, + exportService as any, + mockLocalStorageService as any + ); + }); + + afterEach(() => { + component.ngOnDestroy(); }); it('should create component', () => { @@ -195,9 +135,8 @@ describe('ExportDialogComponent', () => { }); it('should wire up components to datasource', fakeAsync(() => { - fixture.detectChanges(); + component.ngOnInit(); tick(); - fixture.detectChanges(); expect(component.dataSource).toBeTruthy(); expect(component.dataSource.data.length).toBe(3); @@ -205,26 +144,38 @@ describe('ExportDialogComponent', () => { })); it('should filter', () => { + component.dataSource.filterPredicate = (data: any, filter: string) => + data.exportType.toLowerCase().includes(filter.trim().toLowerCase()); + + component.dataSource.data = [ + { id: 1, exportType: 'kml' } as any, + { id: 2, exportType: 'csv' } as any, + { id: 3, exportType: 'json' } as any + ]; + const event: any = { target: { value: 'kml' } }; + expect(component.dataSource.filteredData.length).toBe(3); + component.applyFilter(event); + expect(component.dataSource.filteredData.length).toBe(1); expect(component.dataSource.filteredData[0].id).toBe(1); }); it('should open export view', () => { expect(component.isExportOpen).toBe(false); + component.openExport(); + expect(component.isExportOpen).toBe(true); }); it('should retry export', () => { - const exportService: ExportService = - fixture.debugElement.injector.get(ExportService); const retrySpy = spyOn(exportService, 'retryExport').and.callThrough(); const retry: Export = { @@ -239,8 +190,12 @@ describe('ExportDialogComponent', () => { } }; + component.dataSource.data = [retry]; + component.retryExport(retry); - expect(retrySpy).toHaveBeenCalled(); + + expect(retrySpy).toHaveBeenCalledWith(retry); + expect(component.dataSource.data[0].status).toBe('Running'); }); it('should schedule export delete', () => { @@ -253,17 +208,17 @@ describe('ExportDialogComponent', () => { options: {}, url: '/api/exports/1', status: 'Completed' - } + } as any ]; const exp = component.dataSource.data[0]; + component.scheduleDeleteExport(exp); + expect(component.dataSource.data.length).toEqual(0); }); it('should delete export', fakeAsync(() => { - const exportService: ExportService = - fixture.debugElement.injector.get(ExportService); const deleteSpy = spyOn(exportService, 'deleteExport').and.callThrough(); component.dataSource.data = [ @@ -275,22 +230,20 @@ describe('ExportDialogComponent', () => { options: {}, url: '/api/exports/1', status: 'Completed' - } + } as any ]; const exp = component.dataSource.data[0]; + component.scheduleDeleteExport(exp); - fixture.detectChanges(); - component.snackBar._openedSnackBarRef.dismiss(); + snackBar._openedSnackBarRef.dismiss(); tick(); - expect(deleteSpy).toHaveBeenCalled(); + expect(deleteSpy).toHaveBeenCalledWith('1'); })); it('should undo delete export', fakeAsync(() => { - const exportService: ExportService = - fixture.debugElement.injector.get(ExportService); const deleteSpy = spyOn(exportService, 'deleteExport').and.callThrough(); component.dataSource.data = [ @@ -302,18 +255,19 @@ describe('ExportDialogComponent', () => { options: {}, url: '/api/exports/1', status: 'Completed' - } + } as any ]; const exp = component.dataSource.data[0]; + component.scheduleDeleteExport(exp); - fixture.detectChanges(); + expect(component.dataSource.data.length).toBe(0); - component.snackBar._openedSnackBarRef.dismissWithAction(); + snackBar._openedSnackBarRef.dismissWithAction(); tick(); expect(deleteSpy).toHaveBeenCalledTimes(0); expect(component.dataSource.data.length).toBe(1); })); -}); +}); \ No newline at end of file diff --git a/web-app/src/app/export/export-dialog.component.ts b/web-app/src/app/export/export-dialog.component.ts index 5b45ea0e1..bd69b0483 100644 --- a/web-app/src/app/export/export-dialog.component.ts +++ b/web-app/src/app/export/export-dialog.component.ts @@ -1,15 +1,38 @@ import { Component, OnInit, ViewChild, Inject, OnDestroy } from '@angular/core'; -import { MatDialogRef as MatDialogRef } from '@angular/material/dialog'; +import { MatDialogModule, MatDialogRef as MatDialogRef } from '@angular/material/dialog'; import { MatSort } from '@angular/material/sort'; -import { MatTable as MatTable, MatTableDataSource as MatTableDataSource } from '@angular/material/table'; +import { MatTable as MatTable, MatTableDataSource as MatTableDataSource, MatTableModule } from '@angular/material/table'; import { MatSnackBar as MatSnackBar } from '@angular/material/snack-bar'; import { ExportService, Export, ExportResponse } from './export.service'; import { animate, state, style, transition, trigger } from '@angular/animations'; import { Observable, Subscription, timer } from 'rxjs'; import { LocalStorageService } from '../http/local-storage.service'; +import { CommonModule } from '@angular/common'; +import { MatCheckboxModule } from '@angular/material/checkbox'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatListModule } from '@angular/material/list'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { MomentModule } from 'mage-web-app/moment/moment.module'; +import { ExportDataComponent } from './export-data/export-data.component'; +import { NoExportsComponent } from './empty-state/no-exports.component'; @Component({ selector: 'export-dialog', + standalone: true, + imports: [ + CommonModule, + MatDialogModule, + MatProgressSpinnerModule, + MatFormFieldModule, + MatTableModule, + MatIconModule, + MatListModule, + MatCheckboxModule, + MomentModule, + NoExportsComponent, + ExportDataComponent + ], templateUrl: 'export-dialog.component.html', styleUrls: ['./export-dialog.component.scss'], animations: [ diff --git a/web-app/src/app/export/export.component.spec.ts b/web-app/src/app/export/export.component.spec.ts index c762fecbd..c0479e5ce 100644 --- a/web-app/src/app/export/export.component.spec.ts +++ b/web-app/src/app/export/export.component.spec.ts @@ -9,8 +9,7 @@ describe('ExportComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - imports: [MatDialogModule], - declarations: [ExportComponent] + imports: [MatDialogModule, ExportComponent], }).compileComponents(); })); diff --git a/web-app/src/app/export/export.service.spec.ts b/web-app/src/app/export/export.service.spec.ts index 16d06060c..de2060dfe 100644 --- a/web-app/src/app/export/export.service.spec.ts +++ b/web-app/src/app/export/export.service.spec.ts @@ -1,7 +1,7 @@ import { TestBed } from '@angular/core/testing'; import { ExportService, Export } from './export.service'; -import { HttpTestingController, HttpClientTestingModule } from '@angular/common/http/testing'; -import { HttpClient, HttpErrorResponse } from '@angular/common/http'; +import { HttpTestingController, provideHttpClientTesting } from '@angular/common/http/testing'; +import { HttpClient, HttpErrorResponse, provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; describe('ExportService', () => { let httpClient: HttpClient; @@ -9,9 +9,9 @@ describe('ExportService', () => { beforeEach(() => { TestBed.configureTestingModule({ - providers: [ExportService], - imports: [HttpClientTestingModule] - }); + imports: [], + providers: [ExportService, provideHttpClient(withInterceptorsFromDi()), provideHttpClientTesting()] +}); // Inject the http service and test controller for each test httpClient = TestBed.inject(HttpClient); diff --git a/web-app/src/app/feed-panel/feed-panel-tab.component.spec.ts b/web-app/src/app/feed-panel/feed-panel-tab.component.spec.ts index f9940afdc..38aee3f9a 100644 --- a/web-app/src/app/feed-panel/feed-panel-tab.component.spec.ts +++ b/web-app/src/app/feed-panel/feed-panel-tab.component.spec.ts @@ -10,9 +10,8 @@ describe('FeedTabComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ imports: [ - MatIconModule + MatIconModule, FeedPanelTabComponent ], - declarations: [FeedPanelTabComponent ] }) .compileComponents(); })); diff --git a/web-app/src/app/feed-panel/feed-panel-tab.component.ts b/web-app/src/app/feed-panel/feed-panel-tab.component.ts index 43be64fd6..384f7fadf 100644 --- a/web-app/src/app/feed-panel/feed-panel-tab.component.ts +++ b/web-app/src/app/feed-panel/feed-panel-tab.component.ts @@ -1,4 +1,7 @@ +import { CommonModule } from '@angular/common'; import { Component, Input, OnInit } from '@angular/core'; +import { MatIconModule } from '@angular/material/icon'; +import { MatTooltipModule } from '@angular/material/tooltip'; export interface FeedTab { id: string, @@ -9,6 +12,12 @@ export interface FeedTab { @Component({ selector: 'feed-panel-tab', + standalone: true, + imports: [ + CommonModule, + MatIconModule, + MatTooltipModule + ], templateUrl: './feed-panel-tab.component.html', styleUrls: ['./feed-panel-tab.component.scss'] }) diff --git a/web-app/src/app/feed-panel/feed-panel.component.spec.ts b/web-app/src/app/feed-panel/feed-panel.component.spec.ts index 352ce1294..94a9680a5 100644 --- a/web-app/src/app/feed-panel/feed-panel.component.spec.ts +++ b/web-app/src/app/feed-panel/feed-panel.component.spec.ts @@ -10,8 +10,7 @@ describe('FeedPanelComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [FeedPanelComponent], - imports: [MatDialogModule] + imports: [MatDialogModule, FeedPanelComponent] }) .compileComponents(); })); diff --git a/web-app/src/app/feed-panel/feed-panel.component.ts b/web-app/src/app/feed-panel/feed-panel.component.ts index 5c10ca9c8..7298a40d8 100644 --- a/web-app/src/app/feed-panel/feed-panel.component.ts +++ b/web-app/src/app/feed-panel/feed-panel.component.ts @@ -10,9 +10,30 @@ import { FilterService } from '../filter/filter.service'; import { EventService } from '../event/event.service'; import { ContactDialogComponent } from '../contact/contact-dialog.component'; import { FeedService } from '@ngageoint/mage.web-core-lib/feed'; +import { CommonModule } from '@angular/common'; +import { FeedItemComponent } from 'mage-web-app/feed/feed-item/feed-item.component'; +import { FeedListComponent } from 'mage-web-app/feed/feed-list/feed-list.component'; +import { ObservationEditComponent } from 'mage-web-app/observation/observation-edit/observation-edit.component'; +import { ObservationListComponent } from 'mage-web-app/observation/observation-list/observation-list.component'; +import { ObservationViewComponent } from 'mage-web-app/observation/observation-view/observation-view.component'; +import { UserListComponent } from 'mage-web-app/user/user-list/user-list.component'; +import { UserViewComponent } from 'mage-web-app/user/user-view/user-view.component'; +import { FeedPanelTabComponent } from './feed-panel-tab.component'; @Component({ selector: 'feed-panel', + standalone: true, + imports: [ + CommonModule, + FeedPanelTabComponent, + UserViewComponent, + ObservationViewComponent, + ObservationEditComponent, + FeedItemComponent, + ObservationListComponent, + UserListComponent, + FeedListComponent + ], templateUrl: './feed-panel.component.html', styleUrls: ['./feed-panel.component.scss'], animations: [ diff --git a/web-app/src/app/feed/feed-item/feed-item-map/feed-item-map-popup.component.spec.ts b/web-app/src/app/feed/feed-item/feed-item-map/feed-item-map-popup.component.spec.ts index 9a57821a7..acd516b43 100644 --- a/web-app/src/app/feed/feed-item/feed-item-map/feed-item-map-popup.component.spec.ts +++ b/web-app/src/app/feed/feed-item/feed-item-map/feed-item-map-popup.component.spec.ts @@ -4,7 +4,6 @@ import { MatListModule as MatListModule } from '@angular/material/list'; import { MomentModule } from 'src/app/moment/moment.module'; import { FeedItemMapPopupComponent } from './feed-item-map-popup.component'; - describe('FeedItemMapPopupComponent', () => { let component: FeedItemMapPopupComponent; let fixture: ComponentFixture; @@ -14,11 +13,10 @@ describe('FeedItemMapPopupComponent', () => { imports: [ MatIconModule, MomentModule, - MatListModule + MatListModule, + FeedItemMapPopupComponent ], - declarations: [FeedItemMapPopupComponent ] - }) - .compileComponents(); + }).compileComponents(); })); beforeEach(() => { diff --git a/web-app/src/app/feed/feed-item/feed-item-map/feed-item-map-popup.component.ts b/web-app/src/app/feed/feed-item/feed-item-map/feed-item-map-popup.component.ts index 059a046a2..d203b443b 100644 --- a/web-app/src/app/feed/feed-item/feed-item-map/feed-item-map-popup.component.ts +++ b/web-app/src/app/feed/feed-item/feed-item-map/feed-item-map-popup.component.ts @@ -2,9 +2,20 @@ import { Component, Input, OnInit } from '@angular/core'; import { Feature } from 'geojson'; import { FeedPanelService } from 'src/app/feed-panel/feed-panel.service'; import { Feed } from '@ngageoint/mage.web-core-lib/feed'; +import { CommonModule } from '@angular/common'; +import { MatIconModule } from '@angular/material/icon'; +import { MatListModule } from '@angular/material/list'; +import { MomentModule } from 'mage-web-app/moment/moment.module'; @Component({ selector: 'feed-item-map-popup', + standalone: true, + imports: [ + CommonModule, + MatListModule, + MatIconModule, + MomentModule + ], templateUrl: './feed-item-map-popup.component.html', styleUrls: ['./feed-item-map-popup.component.scss'] }) diff --git a/web-app/src/app/feed/feed-item/feed-item-summary/feed-item-summary.component.spec.ts b/web-app/src/app/feed/feed-item/feed-item-summary/feed-item-summary.component.spec.ts index 05520a68a..956607633 100644 --- a/web-app/src/app/feed/feed-item/feed-item-summary/feed-item-summary.component.spec.ts +++ b/web-app/src/app/feed/feed-item/feed-item-summary/feed-item-summary.component.spec.ts @@ -5,24 +5,20 @@ import { MomentModule } from 'src/app/moment/moment.module'; import { FeedItemSummaryComponent } from './feed-item-summary.component'; import { MapService } from 'src/app/map/map.service'; - describe('FeedItemSummaryComponent', () => { let component: FeedItemSummaryComponent; let fixture: ComponentFixture; beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - providers: [ - { provide: MapService, useValue: {} } - ], + providers: [{ provide: MapService, useValue: {} }], imports: [ MatListModule, MatIconModule, - MomentModule - ], - declarations: [ FeedItemSummaryComponent ] - }) - .compileComponents(); + MomentModule, + FeedItemSummaryComponent + ] + }).compileComponents(); })); beforeEach(() => { diff --git a/web-app/src/app/feed/feed-item/feed-item-summary/feed-item-summary.component.ts b/web-app/src/app/feed/feed-item/feed-item-summary/feed-item-summary.component.ts index 6dd8a5ddd..6a6c8ebe5 100644 --- a/web-app/src/app/feed/feed-item/feed-item-summary/feed-item-summary.component.ts +++ b/web-app/src/app/feed/feed-item/feed-item-summary/feed-item-summary.component.ts @@ -2,11 +2,23 @@ import { Component, Input, OnChanges, SimpleChanges } from '@angular/core'; import { Feed } from '@ngageoint/mage.web-core-lib/feed'; import { Feature } from 'geojson'; import { FeedPanelService } from '../../../feed-panel/feed-panel.service'; -import { contentPathOfIcon } from '@ngageoint/mage.web-core-lib/static-icon' +import { contentPathOfIcon, StaticIconModule } from '@ngageoint/mage.web-core-lib/static-icon' import { MapService } from '../../../map/map.service'; +import { CommonModule } from '@angular/common'; +import { MatIconModule } from '@angular/material/icon'; +import { MatListModule } from '@angular/material/list'; +import { MomentModule } from 'mage-web-app/moment/moment.module'; @Component({ selector: 'feed-item-summary', + standalone: true, + imports: [ + CommonModule, + MatIconModule, + MatListModule, + MomentModule, + StaticIconModule + ], templateUrl: './feed-item-summary.component.html', styleUrls: ['./feed-item-summary.component.scss'] }) diff --git a/web-app/src/app/feed/feed-item/feed-item-summary/feed-item-summary.module.ts b/web-app/src/app/feed/feed-item/feed-item-summary/feed-item-summary.module.ts index 6a808bb98..20cf08ba0 100644 --- a/web-app/src/app/feed/feed-item/feed-item-summary/feed-item-summary.module.ts +++ b/web-app/src/app/feed/feed-item/feed-item-summary/feed-item-summary.module.ts @@ -1,22 +1,24 @@ import { NgModule } from '@angular/core' import { CommonModule } from '@angular/common' import { MatIconModule } from '@angular/material/icon' -import { MatListModule as MatListModule } from '@angular/material/list' +import { MatListModule } from '@angular/material/list' import { FeedItemSummaryComponent } from './feed-item-summary.component' import { MomentModule } from '../../../moment/moment.module' import { MageCommonModule } from '@ngageoint/mage.web-core-lib/common' import { StaticIconModule } from '@ngageoint/mage.web-core-lib/static-icon' @NgModule({ - declarations: [FeedItemSummaryComponent], - exports: [FeedItemSummaryComponent], imports: [ CommonModule, MatIconModule, MatListModule, MomentModule, MageCommonModule, - StaticIconModule + StaticIconModule, + FeedItemSummaryComponent + ], + exports: [ + FeedItemSummaryComponent ] }) -export class FeedItemSummaryModule { } +export class FeedItemSummaryModule { } \ No newline at end of file diff --git a/web-app/src/app/feed/feed-item/feed-item.component.scss b/web-app/src/app/feed/feed-item/feed-item.component.scss index 4f7d15d47..a973ad4e4 100644 --- a/web-app/src/app/feed/feed-item/feed-item.component.scss +++ b/web-app/src/app/feed/feed-item/feed-item.component.scss @@ -10,7 +10,7 @@ mat-toolbar { background-color: white; - color: mat.get-color-from-palette($app-primary); + color: mat.m2-get-color-from-palette($app-primary); position: sticky; top: 0; z-index: 2; @@ -22,7 +22,7 @@ mat-toolbar { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; - color: mat.get-color-from-palette($app-primary); + color: mat.m2-get-color-from-palette($app-primary); font-size: 18px; font-weight: 500; } diff --git a/web-app/src/app/feed/feed-item/feed-item.component.spec.ts b/web-app/src/app/feed/feed-item/feed-item.component.spec.ts index c83e11179..64d0158e0 100644 --- a/web-app/src/app/feed/feed-item/feed-item.component.spec.ts +++ b/web-app/src/app/feed/feed-item/feed-item.component.spec.ts @@ -38,6 +38,8 @@ class MockMapService { } @Component({ + standalone: true, + imports: [FeedItemComponent], template: '' }) class TestHostComponent { @@ -93,18 +95,16 @@ describe('FeedItemComponent', () => { useClass: MomentPipe }], imports: [ + FeedItemComponent, + MapClipComponent, + TestHostComponent, + MomentPipe, MatIconModule, MatToolbarModule, MatDividerModule, MatCardModule, GeometryModule ], - declarations: [ - FeedItemComponent, - MapClipComponent, - TestHostComponent, - MomentPipe - ] }) .compileComponents() })); diff --git a/web-app/src/app/feed/feed-item/feed-item.component.ts b/web-app/src/app/feed/feed-item/feed-item.component.ts index d782c7506..3f899f42a 100644 --- a/web-app/src/app/feed/feed-item/feed-item.component.ts +++ b/web-app/src/app/feed/feed-item/feed-item.component.ts @@ -3,9 +3,28 @@ import { Feed, StyledFeature } from '@ngageoint/mage.web-core-lib/feed'; import { FeedPanelService } from 'src/app/feed-panel/feed-panel.service'; import { MapService } from '../../map/map.service'; import { MomentPipe } from '../../moment/moment.pipe'; +import { CommonModule } from '@angular/common'; +import { MatCardModule } from '@angular/material/card'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatIconModule } from '@angular/material/icon'; +import { MatToolbarModule } from '@angular/material/toolbar'; +import { StaticIconModule } from 'core-lib-src/static-icon'; +import { GeometryModule } from 'mage-web-app/geometry/geometry.module'; +import { MapClipComponent } from 'mage-web-app/map/clip/clip.component'; @Component({ selector: 'feed-item', + standalone: true, + imports: [ + CommonModule, + MatToolbarModule, + MatIconModule, + MatCardModule, + MatDividerModule, + StaticIconModule, + MapClipComponent, + GeometryModule + ], templateUrl: './feed-item.component.html', styleUrls: ['./feed-item.component.scss'] }) diff --git a/web-app/src/app/feed/feed-list/feed-list.component.scss b/web-app/src/app/feed/feed-list/feed-list.component.scss index 614ac7291..bf9718070 100644 --- a/web-app/src/app/feed/feed-list/feed-list.component.scss +++ b/web-app/src/app/feed/feed-list/feed-list.component.scss @@ -28,7 +28,7 @@ mat-toolbar { } .feed__title { - color: mat.get-color-from-palette($app-primary); + color: mat.m2-get-color-from-palette($app-primary); } .items { diff --git a/web-app/src/app/feed/feed-list/feed-list.component.spec.ts b/web-app/src/app/feed/feed-list/feed-list.component.spec.ts index 2d387c1fd..c373d0968 100644 --- a/web-app/src/app/feed/feed-list/feed-list.component.spec.ts +++ b/web-app/src/app/feed/feed-list/feed-list.component.spec.ts @@ -1,4 +1,7 @@ -import { HttpClientModule } from '@angular/common/http'; +import { + provideHttpClient, + withInterceptorsFromDi +} from '@angular/common/http'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { MatDividerModule } from '@angular/material/divider'; import { MatListModule as MatListModule } from '@angular/material/list'; @@ -17,13 +20,10 @@ describe('FeedComponent', () => { FeedItemSummaryModule, MatDividerModule, MatListModule, - HttpClientModule - ], - declarations: [ FeedListComponent - ] - }) - .compileComponents(); + ], + providers: [provideHttpClient(withInterceptorsFromDi())] + }).compileComponents(); })); beforeEach(() => { diff --git a/web-app/src/app/feed/feed-list/feed-list.component.ts b/web-app/src/app/feed/feed-list/feed-list.component.ts index 4c0ff4a35..32715db7e 100644 --- a/web-app/src/app/feed/feed-list/feed-list.component.ts +++ b/web-app/src/app/feed/feed-list/feed-list.component.ts @@ -1,10 +1,23 @@ +import { CommonModule } from '@angular/common'; import { Component, Input, OnChanges, SimpleChanges } from '@angular/core'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatListModule } from '@angular/material/list'; +import { MatToolbarModule } from '@angular/material/toolbar'; import { Feed, FeedService } from '@ngageoint/mage.web-core-lib/feed'; import { Feature } from 'geojson'; import { Subscription } from 'rxjs' +import { FeedItemSummaryComponent } from '../feed-item/feed-item-summary/feed-item-summary.component'; @Component({ selector: 'feed-list', + standalone: true, + imports: [ + CommonModule, + MatToolbarModule, + MatListModule, + MatDividerModule, + FeedItemSummaryComponent + ], templateUrl: './feed-list.component.html', styleUrls: ['./feed-list.component.scss'] }) diff --git a/web-app/src/app/filter/filter.component.spec.ts b/web-app/src/app/filter/filter.component.spec.ts index 979530d8c..8592ad4db 100644 --- a/web-app/src/app/filter/filter.component.spec.ts +++ b/web-app/src/app/filter/filter.component.spec.ts @@ -1,12 +1,19 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { FilterComponent } from './filter.component'; -import { MatDialogModule as MatDialogModule, MatDialogRef as MatDialogRef } from '@angular/material/dialog'; -import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { + MatDialogModule as MatDialogModule, + MatDialogRef as MatDialogRef +} from '@angular/material/dialog'; +import { provideHttpClientTesting } from '@angular/common/http/testing'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { MatAutocompleteModule as MatAutocompleteModule } from '@angular/material/autocomplete'; import { MatFormFieldModule as MatFormFieldModule } from '@angular/material/form-field'; import { MatChipsModule as MatChipsModule } from '@angular/material/chips'; import { MatSelectModule as MatSelectModule } from '@angular/material/select'; +import { + provideHttpClient, + withInterceptorsFromDi +} from '@angular/common/http'; describe('FilterComponent', () => { let component: FilterComponent; @@ -14,20 +21,24 @@ describe('FilterComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [FilterComponent], imports: [ - HttpClientTestingModule, FormsModule, ReactiveFormsModule, MatAutocompleteModule, MatDialogModule, MatFormFieldModule, MatChipsModule, - MatSelectModule + MatSelectModule, + FilterComponent ], - providers: [{ - provide: MatDialogRef, useValue: {} - }] + providers: [ + { + provide: MatDialogRef, + useValue: {} + }, + provideHttpClient(withInterceptorsFromDi()), + provideHttpClientTesting() + ] }).compileComponents(); })); @@ -36,7 +47,6 @@ describe('FilterComponent', () => { component = fixture.componentInstance; }); - it('should create', () => { expect(component).toBeTruthy(); }); diff --git a/web-app/src/app/filter/filter.component.ts b/web-app/src/app/filter/filter.component.ts index bc686d6d8..15d02c4a1 100644 --- a/web-app/src/app/filter/filter.component.ts +++ b/web-app/src/app/filter/filter.component.ts @@ -2,7 +2,7 @@ import { Component, OnInit, ViewEncapsulation } from '@angular/core'; import { MatDialogRef as MatDialogRef } from '@angular/material/dialog'; import { FilterService } from './filter.service'; import { EventService } from '../event/event.service'; -import { FormControl } from '@angular/forms'; +import { FormControl, ReactiveFormsModule } from '@angular/forms'; import { Observable, firstValueFrom, @@ -13,7 +13,7 @@ import { of } from 'rxjs'; import { COMMA, ENTER } from '@angular/cdk/keycodes'; -import { MatAutocompleteSelectedEvent as MatAutocompleteSelectedEvent } from '@angular/material/autocomplete'; +import { MatAutocompleteModule, MatAutocompleteSelectedEvent as MatAutocompleteSelectedEvent } from '@angular/material/autocomplete'; import { LocalStorageService } from '../http/local-storage.service'; import moment from 'moment'; import { User } from '@ngageoint/mage.web-core-lib/user'; @@ -25,9 +25,28 @@ import { Interval, IntervalOptions } from './filter.types'; +import { CommonModule } from '@angular/common'; +import { MatChipsModule } from '@angular/material/chips'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { MatSelectModule } from '@angular/material/select'; +import { DatetimePickerComponent } from 'mage-web-app/datetime-picker/datetime-picker.component'; @Component({ selector: 'filter', + standalone: true, + imports: [ + CommonModule, + ReactiveFormsModule, + MatFormFieldModule, + MatInputModule, + MatAutocompleteModule, + MatChipsModule, + MatIconModule, + MatSelectModule, + DatetimePickerComponent + ], templateUrl: './filter.component.html', styleUrls: ['./filter.component.scss'], encapsulation: ViewEncapsulation.None diff --git a/web-app/src/app/filter/filter.service.spec.ts b/web-app/src/app/filter/filter.service.spec.ts index 1d94dcfcf..d08d9cfb7 100644 --- a/web-app/src/app/filter/filter.service.spec.ts +++ b/web-app/src/app/filter/filter.service.spec.ts @@ -1,14 +1,15 @@ import { TestBed } from '@angular/core/testing'; import { FilterService } from './filter.service'; -import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { provideHttpClientTesting } from '@angular/common/http/testing'; +import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; describe('Filter Service Tests', () => { beforeEach(() => { TestBed.configureTestingModule({ - providers: [FilterService], - imports: [ HttpClientTestingModule ] - }); + imports: [], + providers: [FilterService, provideHttpClient(withInterceptorsFromDi()), provideHttpClientTesting()] +}); }); afterEach(() => { diff --git a/web-app/src/app/geometry/geometry.module.ts b/web-app/src/app/geometry/geometry.module.ts index 49a58e80a..1d632d80a 100644 --- a/web-app/src/app/geometry/geometry.module.ts +++ b/web-app/src/app/geometry/geometry.module.ts @@ -3,14 +3,12 @@ import { CommonModule } from '@angular/common'; import { GeometryPipe } from './geometry.pipe'; @NgModule({ - declarations: [ + imports: [ + CommonModule, GeometryPipe ], exports: [ GeometryPipe - ], - imports: [ - CommonModule ] }) -export class GeometryModule { } +export class GeometryModule { } \ No newline at end of file diff --git a/web-app/src/app/home/home.component.spec.ts b/web-app/src/app/home/home.component.spec.ts index 11e374f60..feae4196d 100644 --- a/web-app/src/app/home/home.component.spec.ts +++ b/web-app/src/app/home/home.component.spec.ts @@ -1,7 +1,8 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { HomeComponent } from './home.component'; -import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { provideHttpClientTesting } from '@angular/common/http/testing'; import { RouterTestingModule } from '@angular/router/testing'; +import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; describe('Home Component', () => { let component: HomeComponent; @@ -9,12 +10,9 @@ describe('Home Component', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [HomeComponent], - imports: [ - HttpClientTestingModule, - RouterTestingModule - ] - }).compileComponents(); + imports: [RouterTestingModule, HomeComponent], + providers: [provideHttpClient(withInterceptorsFromDi()), provideHttpClientTesting()] +}).compileComponents(); })); beforeEach(() => { diff --git a/web-app/src/app/home/home.component.ts b/web-app/src/app/home/home.component.ts index fe680ee2f..568aad22b 100644 --- a/web-app/src/app/home/home.component.ts +++ b/web-app/src/app/home/home.component.ts @@ -1,7 +1,7 @@ import { Component, OnDestroy, OnInit, ViewChild } from '@angular/core'; import { MapService } from '../map/map.service'; import { FilterService } from '../filter/filter.service'; -import { MatSidenav } from '@angular/material/sidenav'; +import { MatSidenav, MatSidenavModule } from '@angular/material/sidenav'; import { LocationService } from '../user/location/location.service'; import { ActivatedRoute } from '@angular/router'; import { User } from 'core-lib-src/user'; @@ -9,9 +9,23 @@ import { Banners, SettingsService } from '../settings/settings.service'; import * as _ from 'underscore'; import { UserService } from '../user/user.service'; import { MageEvent } from '@ngageoint/mage.web-core-lib/event'; +import { CommonModule } from '@angular/common'; +import { BannerComponent } from 'mage-web-app/banner/baner.component'; +import { FeedPanelComponent } from 'mage-web-app/feed-panel/feed-panel.component'; +import { NavigationComponent } from 'mage-web-app/navigation/navigation.component'; +import { PreferencesComponent } from 'mage-web-app/preferences/preferences.component'; @Component({ selector: 'home', + standalone: true, + imports: [ + CommonModule, + MatSidenavModule, + BannerComponent, + NavigationComponent, + FeedPanelComponent, + PreferencesComponent + ], templateUrl: './home.component.html', styleUrls: ['./home.component.scss'] }) diff --git a/web-app/src/app/home/home.module.ts b/web-app/src/app/home/home.module.ts index 022fcbd49..a8e413367 100644 --- a/web-app/src/app/home/home.module.ts +++ b/web-app/src/app/home/home.module.ts @@ -1,62 +1,67 @@ import { NgModule } from '@angular/core'; - +import { CommonModule } from '@angular/common'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { NgxMatSelectSearchModule } from 'ngx-mat-select-search'; import { ScrollingModule } from '@angular/cdk/scrolling'; import { DragDropModule } from '@angular/cdk/drag-drop'; -import { SaturationModule, HueModule, CheckboardModule, AlphaModule } from 'ngx-color'; +import { + SaturationModule, + HueModule, + CheckboardModule, + AlphaModule +} from 'ngx-color'; -import { MatAutocompleteModule as MatAutocompleteModule } from '@angular/material/autocomplete'; +import { MatAutocompleteModule } from '@angular/material/autocomplete'; import { MatBadgeModule } from '@angular/material/badge'; import { MatBottomSheetModule } from '@angular/material/bottom-sheet'; -import { MatButtonModule as MatButtonModule } from '@angular/material/button'; +import { MatButtonModule } from '@angular/material/button'; import { MatButtonToggleModule } from '@angular/material/button-toggle'; -import { MatCardModule as MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule as MatCheckboxModule } from '@angular/material/checkbox'; -import { MatChipsModule as MatChipsModule } from '@angular/material/chips'; +import { MatCardModule } from '@angular/material/card'; +import { MatCheckboxModule } from '@angular/material/checkbox'; +import { MatChipsModule } from '@angular/material/chips'; import { MatRippleModule } from '@angular/material/core'; -import { MatDatepickerModule } from '@angular/material/datepicker' -import { MatMomentDateModule } from '@angular/material-moment-adapter' -import { MatDialogModule as MatDialogModule } from '@angular/material/dialog'; +import { MatDatepickerModule } from '@angular/material/datepicker'; +import { MatMomentDateModule } from '@angular/material-moment-adapter'; +import { MatDialogModule } from '@angular/material/dialog'; import { MatExpansionModule } from '@angular/material/expansion'; -import { MatFormFieldModule as MatFormFieldModule } from '@angular/material/form-field'; +import { MatFormFieldModule } from '@angular/material/form-field'; import { MatGridListModule } from '@angular/material/grid-list'; import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule as MatInputModule } from '@angular/material/input'; -import { MatListModule as MatListModule } from '@angular/material/list'; -import { MatPaginatorModule as MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressBarModule as MatProgressBarModule } from '@angular/material/progress-bar'; -import { MatProgressSpinnerModule as MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatRadioModule as MatRadioModule } from '@angular/material/radio'; -import { MatSelectModule as MatSelectModule } from '@angular/material/select'; +import { MatInputModule } from '@angular/material/input'; +import { MatListModule } from '@angular/material/list'; +import { MatPaginatorModule } from '@angular/material/paginator'; +import { MatProgressBarModule } from '@angular/material/progress-bar'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { MatRadioModule } from '@angular/material/radio'; +import { MatSelectModule } from '@angular/material/select'; import { MatSidenavModule } from '@angular/material/sidenav'; -import { MatSliderModule as MatSliderModule } from '@angular/material/slider'; -import { MatSnackBarModule as MatSnackBarModule } from '@angular/material/snack-bar'; +import { MatSliderModule } from '@angular/material/slider'; +import { MatSnackBarModule } from '@angular/material/snack-bar'; import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule as MatTableModule } from '@angular/material/table'; -import { MatTabsModule as MatTabsModule } from '@angular/material/tabs'; +import { MatTableModule } from '@angular/material/table'; +import { MatTabsModule } from '@angular/material/tabs'; import { MatToolbarModule } from '@angular/material/toolbar'; -import { MatTooltipModule as MatTooltipModule } from '@angular/material/tooltip'; -import { MatSlideToggleModule as MatSlideToggleModule } from '@angular/material/slide-toggle'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { MatSlideToggleModule } from '@angular/material/slide-toggle'; import { MatStepperModule } from '@angular/material/stepper'; +import { MatMenuModule } from '@angular/material/menu'; -import { InputMaskModule } from '@ngneat/input-mask' +import { InputMaskModule } from '@ngneat/input-mask'; import { ZoomComponent } from '../map/controls/zoom.component'; import { AddObservationComponent } from '../map/controls/add-observation.component'; - import { LocationComponent } from '../map/controls/location.component'; import { SearchComponent } from '../map/controls/search.component'; -import { LayersComponent } from '../map/layers/layers.component' +import { LayersComponent } from '../map/layers/layers.component'; import { LayersControlComponent } from '../map/controls/layers-control.component'; import { MapComponent } from '../map/map.component'; import { LayerHeaderComponent } from '../map/layers/layer-header.component'; import { LayerContentComponent } from '../map/layers/layer-content.component'; import { ColorPickerComponent } from '../color-picker/color-picker.component'; import { ExportComponent } from '../export/export.component'; -import { ExportDialogComponent } from '../export/export-dialog.component' +import { ExportDialogComponent } from '../export/export-dialog.component'; import { MapClipComponent } from '../map/clip/clip.component'; import { GeometryModule } from '../geometry/geometry.module'; @@ -110,9 +115,8 @@ import { FeedItemSummaryModule } from '../feed/feed-item/feed-item-summary/feed- import { FeedPanelTabComponent } from '../feed-panel/feed-panel-tab.component'; import { ObservationPopupComponent } from '../observation/observation-popup/observation-popup.component'; import { UserPopupComponent } from '../user/user-popup/user-popup.component'; -import { StaticIconModule } from '@ngageoint/mage.web-core-lib/static-icon' +import { StaticIconModule } from '@ngageoint/mage.web-core-lib/static-icon'; import { DatetimePickerComponent } from '../datetime-picker/datetime-picker.component'; -import { CommonModule } from '@angular/common'; import { ObservationOptionsComponent } from '../observation/observation-view/observation-options.component'; import { ObservationEditFormPickerComponent } from '../observation/observation-edit/observation-edit-form-picker.component'; import { ObservationEditDiscardComponent } from '../observation/observation-edit/observation-edit-discard/observation-edit-discard.component'; @@ -132,7 +136,7 @@ import { TimeFormatComponent } from '../preferences/time-format/time-format.comp import { TimeZoneComponent } from '../preferences/time-zone/time-zone.component'; import { CoordinateSystemComponent } from '../preferences/coordinate-system/coordinate-system.component'; import { PasswordResetSuccessDialog } from '../user/password/password-reset-success-dialog'; -import { HomeComponent } from '..//home/home.component'; +import { HomeComponent } from '../home/home.component'; import { RouterModule, Routes } from '@angular/router'; import { UserResolver } from '../ingress/user.resolver'; import { UserAvatarModule } from '../user/user-avatar/user-avatar.module'; @@ -140,15 +144,16 @@ import { IngressModule } from '../ingress/ingress.module'; import { FilterControlComponent } from '../map/controls/filter.component'; import { ExportControlComponent } from '../map/controls/export.component'; import { BannerModule } from '../banner/banner.module'; -import { MatMenuModule as MatMenuModule } from '@angular/material/menu'; -const routes: Routes = [{ - path: '', - component: HomeComponent, - resolve: { - user: UserResolver +const routes: Routes = [ + { + path: '', + component: HomeComponent, + resolve: { + user: UserResolver + } } -}]; +]; @NgModule({ declarations: [], @@ -200,10 +205,22 @@ const routes: Routes = [{ SaturationModule ] }) -class AngularModule { } +class AngularModule {} @NgModule({ - declarations: [ + declarations: [], + imports: [ + AngularModule, + BannerModule, + FeedItemSummaryModule, + GeometryModule, + IngressModule, + MomentModule, + StaticIconModule, + UserAvatarModule, + InputMaskModule.forRoot(), + RouterModule.forChild(routes), + AddObservationComponent, AttachmentComponent, AttachUploadComponent, @@ -232,7 +249,6 @@ class AngularModule { } LocationComponent, MapClipComponent, MapComponent, - MapComponent, MGRSValidatorDirective, NavigationComponent, NoExportsComponent, @@ -281,21 +297,8 @@ class AngularModule { } UserListItemComponent, UserPopupComponent, UserViewComponent, - ZoomComponent, - ], - imports: [ - AngularModule, - BannerModule, - FeedItemSummaryModule, - GeometryModule, - IngressModule, - MomentModule, - StaticIconModule, - UserAvatarModule, - InputMaskModule.forRoot(), - RouterModule.forChild(routes) + ZoomComponent ], exports: [RouterModule] }) -export class HomeModule { -} \ No newline at end of file +export class HomeModule {} \ No newline at end of file diff --git a/web-app/src/app/http/local-storage.service.spec.ts b/web-app/src/app/http/local-storage.service.spec.ts index 4940875b9..20abc6c27 100644 --- a/web-app/src/app/http/local-storage.service.spec.ts +++ b/web-app/src/app/http/local-storage.service.spec.ts @@ -1,14 +1,15 @@ import { TestBed } from '@angular/core/testing'; import { LocalStorageService } from './local-storage.service'; -import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { provideHttpClientTesting } from '@angular/common/http/testing'; +import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; describe('Local Storage Service Tests', () => { beforeEach(() => { TestBed.configureTestingModule({ - providers: [LocalStorageService], - imports: [HttpClientTestingModule] - }); + imports: [], + providers: [LocalStorageService, provideHttpClient(withInterceptorsFromDi()), provideHttpClientTesting()] +}); }); afterEach(() => { diff --git a/web-app/src/app/http/token.interceptor.spec.ts b/web-app/src/app/http/token.interceptor.spec.ts index 7a677c429..9fa7be0fb 100644 --- a/web-app/src/app/http/token.interceptor.spec.ts +++ b/web-app/src/app/http/token.interceptor.spec.ts @@ -1,18 +1,16 @@ import { TestBed } from '@angular/core/testing'; -import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { provideHttpClientTesting } from '@angular/common/http/testing'; import { TokenInterceptorService } from './token.interceptor'; import { MatDialogModule as MatDialogModule } from '@angular/material/dialog'; +import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; describe('Token Interceptor Service', () => { beforeEach(() => { TestBed.configureTestingModule({ - providers: [TokenInterceptorService], - imports: [ - HttpClientTestingModule, - MatDialogModule - ] - }); + imports: [MatDialogModule], + providers: [TokenInterceptorService, provideHttpClient(withInterceptorsFromDi()), provideHttpClientTesting()] +}); }); afterEach(() => { diff --git a/web-app/src/app/http/token.interceptor.ts b/web-app/src/app/http/token.interceptor.ts index f3ddd2d17..9e513bf4c 100644 --- a/web-app/src/app/http/token.interceptor.ts +++ b/web-app/src/app/http/token.interceptor.ts @@ -1,13 +1,5 @@ import { Injectable } from '@angular/core'; -import { - HttpInterceptor, - HttpRequest, - HttpHandler, - HttpEvent, - HttpContextToken, - HttpStatusCode, - HttpErrorResponse -} from '@angular/common/http'; +import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent, HttpContextToken, HttpStatusCode, HttpErrorResponse } from '@angular/common/http'; import { catchError, Observable, ReplaySubject, switchMap, throwError, take } from 'rxjs'; import { LocalStorageService } from './local-storage.service'; import { AuthenticationDialogComponent } from '../ingress/authentication/authentication-dialog.component'; diff --git a/web-app/src/app/ingress/account-status/account-status.component.spec.ts b/web-app/src/app/ingress/account-status/account-status.component.spec.ts index 7cf2775cc..046524404 100644 --- a/web-app/src/app/ingress/account-status/account-status.component.spec.ts +++ b/web-app/src/app/ingress/account-status/account-status.component.spec.ts @@ -7,8 +7,7 @@ describe('Account Status Component', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [AccountStatusComponent], - imports: [] + imports: [AccountStatusComponent], }).compileComponents(); })); diff --git a/web-app/src/app/ingress/authentication/authentication-dialog.component.spec.ts b/web-app/src/app/ingress/authentication/authentication-dialog.component.spec.ts index 61318aa81..35f3633e8 100644 --- a/web-app/src/app/ingress/authentication/authentication-dialog.component.spec.ts +++ b/web-app/src/app/ingress/authentication/authentication-dialog.component.spec.ts @@ -1,8 +1,9 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { AuthenticationDialogComponent } from './authentication-dialog.component'; -import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { provideHttpClientTesting } from '@angular/common/http/testing'; import { MatDialogRef as MatDialogRef } from '@angular/material/dialog'; import { IngressModule } from '../ingress.module'; +import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; describe('Authentication Dialog', () => { let component: AuthenticationDialogComponent; @@ -10,13 +11,12 @@ describe('Authentication Dialog', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [AuthenticationDialogComponent], - imports: [HttpClientTestingModule, IngressModule], - providers: [{ - provide: MatDialogRef, - useValue: {} - },] - }).compileComponents(); + imports: [AuthenticationDialogComponent, IngressModule], + providers: [{ + provide: MatDialogRef, + useValue: {} + }, provideHttpClient(withInterceptorsFromDi()), provideHttpClientTesting(),] +}).compileComponents(); })); beforeEach(() => { diff --git a/web-app/src/app/ingress/authentication/authentication-dialog.component.ts b/web-app/src/app/ingress/authentication/authentication-dialog.component.ts index b54097b7c..034030d78 100644 --- a/web-app/src/app/ingress/authentication/authentication-dialog.component.ts +++ b/web-app/src/app/ingress/authentication/authentication-dialog.component.ts @@ -2,9 +2,16 @@ import { Component, OnInit } from '@angular/core'; import { ApiService } from '../../api/api.service'; import { Api } from '../../api/api.entity'; import { MatDialogRef as MatDialogRef } from '@angular/material/dialog'; +import { CommonModule } from '@angular/common'; +import { IngressComponent } from '../ingress.component'; @Component({ selector: 'authentication-dialog', + standalone: true, + imports: [ + CommonModule, + IngressComponent + ], templateUrl: 'authentication-dialog.component.html', styleUrls: ['./authentication-dialog.component.scss'] }) diff --git a/web-app/src/app/ingress/authentication/authentication.component.spec.ts b/web-app/src/app/ingress/authentication/authentication.component.spec.ts index b86effadf..6f2ccc126 100644 --- a/web-app/src/app/ingress/authentication/authentication.component.spec.ts +++ b/web-app/src/app/ingress/authentication/authentication.component.spec.ts @@ -7,8 +7,7 @@ describe('AuthenticationComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [AuthenticationComponent], - imports: [] + imports: [AuthenticationComponent], }).compileComponents(); })); diff --git a/web-app/src/app/ingress/authentication/authentication.component.ts b/web-app/src/app/ingress/authentication/authentication.component.ts index cdfbffddb..da782d604 100644 --- a/web-app/src/app/ingress/authentication/authentication.component.ts +++ b/web-app/src/app/ingress/authentication/authentication.component.ts @@ -2,6 +2,12 @@ import { Component, EventEmitter, Input, OnChanges, Output, SimpleChanges } from import { Api, AuthenticationStrategy } from '../../api/api.entity' import { User } from 'core-lib-src/user' import * as _ from 'underscore' +import { CommonModule } from '@angular/common' +import { AuthorizationComponent } from '../authorization/authorization.component' +import { IdpAuthenticationComponent } from './idp/idp-authentication.component' +import { LdapAuthenticationComponent } from './ldap/ldap-authentication.component' +import { LocalAuthenticationComponent } from './local/local-authentication.component' +import { SignupComponent } from './local/signup.component' export interface AuthenticationEvent { user: User, @@ -10,6 +16,15 @@ export interface AuthenticationEvent { @Component({ selector: 'authentication', + standalone: true, + imports: [ + CommonModule, + LocalAuthenticationComponent, + IdpAuthenticationComponent, + LdapAuthenticationComponent, + SignupComponent, + AuthorizationComponent + ], templateUrl: './authentication.component.html', styleUrls: ['./authentication.component.scss'] }) diff --git a/web-app/src/app/ingress/authentication/button/authentication-button.component.spec.ts b/web-app/src/app/ingress/authentication/button/authentication-button.component.spec.ts index 55dd2b2cd..fd8dd9044 100644 --- a/web-app/src/app/ingress/authentication/button/authentication-button.component.spec.ts +++ b/web-app/src/app/ingress/authentication/button/authentication-button.component.spec.ts @@ -7,8 +7,7 @@ describe('Authentication Button Component', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [AuthenticationButtonComponent], - imports: [] + imports: [AuthenticationButtonComponent], }).compileComponents(); })); diff --git a/web-app/src/app/ingress/authentication/button/authentication-button.component.ts b/web-app/src/app/ingress/authentication/button/authentication-button.component.ts index 0884011b1..4d0af61b4 100644 --- a/web-app/src/app/ingress/authentication/button/authentication-button.component.ts +++ b/web-app/src/app/ingress/authentication/button/authentication-button.component.ts @@ -1,7 +1,12 @@ +import { CommonModule } from '@angular/common' import { Component, EventEmitter, Input, Output } from '@angular/core' @Component({ selector: 'authentication-button', + standalone: true, + imports: [ + CommonModule + ], templateUrl: './authentication-button.component.html', styleUrls: ['./authentication-button.component.scss'] }) diff --git a/web-app/src/app/ingress/authentication/idp/idp-authentication.component.spec.ts b/web-app/src/app/ingress/authentication/idp/idp-authentication.component.spec.ts index 9e158fcf9..72c0fe81a 100644 --- a/web-app/src/app/ingress/authentication/idp/idp-authentication.component.spec.ts +++ b/web-app/src/app/ingress/authentication/idp/idp-authentication.component.spec.ts @@ -1,8 +1,9 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { IdpAuthenticationComponent } from './idp-authentication.component'; -import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { provideHttpClientTesting } from '@angular/common/http/testing'; import { MatFormFieldModule as MatFormFieldModule } from '@angular/material/form-field'; import { AuthenticationButtonComponent } from '../button/authentication-button.component'; +import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; describe('Idp Authentication Component', () => { let component: IdpAuthenticationComponent; @@ -10,9 +11,9 @@ describe('Idp Authentication Component', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [IdpAuthenticationComponent, AuthenticationButtonComponent], - imports: [HttpClientTestingModule, MatFormFieldModule] - }).compileComponents(); + imports: [IdpAuthenticationComponent, AuthenticationButtonComponent, MatFormFieldModule], + providers: [provideHttpClient(withInterceptorsFromDi()), provideHttpClientTesting()] +}).compileComponents(); })); beforeEach(() => { diff --git a/web-app/src/app/ingress/authentication/idp/idp-authentication.component.ts b/web-app/src/app/ingress/authentication/idp/idp-authentication.component.ts index 3aa15252a..d6c694653 100644 --- a/web-app/src/app/ingress/authentication/idp/idp-authentication.component.ts +++ b/web-app/src/app/ingress/authentication/idp/idp-authentication.component.ts @@ -1,8 +1,15 @@ import { Component, EventEmitter, Input, Output } from '@angular/core'; import { AuthenticationStrategy } from '../../../api/api.entity'; import { UserService } from '../../../user/user.service'; +import { CommonModule } from '@angular/common'; +import { AuthenticationButtonComponent } from '../button/authentication-button.component'; @Component({ selector: 'idp-authentication', + standalone: true, + imports: [ + CommonModule, + AuthenticationButtonComponent + ], templateUrl: './idp-authentication.component.html', styleUrls: ['./idp-authentication.component.scss'] }) diff --git a/web-app/src/app/ingress/authentication/ldap/ldap-authentication.component.scss b/web-app/src/app/ingress/authentication/ldap/ldap-authentication.component.scss index 2abf89de1..4ee10cb1b 100644 --- a/web-app/src/app/ingress/authentication/ldap/ldap-authentication.component.scss +++ b/web-app/src/app/ingress/authentication/ldap/ldap-authentication.component.scss @@ -2,7 +2,7 @@ @import "variables.scss"; :host ::ng-deep a { - color: mat.get-color-from-palette($app-warn); + color: mat.m2-get-color-from-palette($app-warn); cursor: pointer; text-decoration: underline; } @@ -42,7 +42,7 @@ mat-form-field { align-items: center; gap: 8px; margin-top: 24px; - color: mat.get-color-from-palette($app-warn); + color: mat.m2-get-color-from-palette($app-warn); border-radius: 4px; padding: 0 16px; } diff --git a/web-app/src/app/ingress/authentication/ldap/ldap-authentication.component.spec.ts b/web-app/src/app/ingress/authentication/ldap/ldap-authentication.component.spec.ts index 989f940ff..e5c3f07fe 100644 --- a/web-app/src/app/ingress/authentication/ldap/ldap-authentication.component.spec.ts +++ b/web-app/src/app/ingress/authentication/ldap/ldap-authentication.component.spec.ts @@ -1,8 +1,9 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { LdapAuthenticationComponent } from './ldap-authentication.component'; -import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { provideHttpClientTesting } from '@angular/common/http/testing'; import { MatFormFieldModule as MatFormFieldModule } from '@angular/material/form-field'; import { AuthenticationButtonComponent } from '../button/authentication-button.component'; +import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; describe('LDAP Authentication Component', () => { let component: LdapAuthenticationComponent; @@ -10,9 +11,9 @@ describe('LDAP Authentication Component', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [LdapAuthenticationComponent, AuthenticationButtonComponent], - imports: [HttpClientTestingModule, MatFormFieldModule] - }).compileComponents(); + imports: [MatFormFieldModule, LdapAuthenticationComponent, AuthenticationButtonComponent], + providers: [provideHttpClient(withInterceptorsFromDi()), provideHttpClientTesting()] +}).compileComponents(); })); beforeEach(() => { diff --git a/web-app/src/app/ingress/authentication/ldap/ldap-authentication.component.ts b/web-app/src/app/ingress/authentication/ldap/ldap-authentication.component.ts index 013de8dc9..46a2cd34f 100644 --- a/web-app/src/app/ingress/authentication/ldap/ldap-authentication.component.ts +++ b/web-app/src/app/ingress/authentication/ldap/ldap-authentication.component.ts @@ -1,11 +1,23 @@ import { Component, EventEmitter, Input, Output } from '@angular/core' -import { FormControl, FormGroup, Validators } from '@angular/forms' +import { FormControl, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms' import { Api, AuthenticationStrategy } from '../../../api/api.entity' import { UserService } from '../../../user/user.service' import { LinkGenerator } from '../../../contact/utilities/link-generator' +import { CommonModule } from '@angular/common' +import { MatFormFieldModule } from '@angular/material/form-field' +import { MatInputModule } from '@angular/material/input' +import { AuthenticationButtonComponent } from '../button/authentication-button.component' @Component({ selector: 'ldap-authentication', + standalone: true, + imports: [ + CommonModule, + ReactiveFormsModule, + MatFormFieldModule, + MatInputModule, + AuthenticationButtonComponent + ], templateUrl: './ldap-authentication.component.html', styleUrls: ['./ldap-authentication.component.scss'] }) diff --git a/web-app/src/app/ingress/authentication/local/local-authentication.component.scss b/web-app/src/app/ingress/authentication/local/local-authentication.component.scss index 0842015bc..cc038702a 100644 --- a/web-app/src/app/ingress/authentication/local/local-authentication.component.scss +++ b/web-app/src/app/ingress/authentication/local/local-authentication.component.scss @@ -22,8 +22,8 @@ margin: 24px 0; padding: 16px; border-radius: 4px; - background-color: mat.get-color-from-palette($app-warn, 50); - color: mat.get-color-from-palette($app-warn, 900); + background-color: mat.m2-get-color-from-palette($app-warn, 50); + color: mat.m2-get-color-from-palette($app-warn, 900); overflow: hidden; } @@ -68,7 +68,7 @@ } :host ::ng-deep a { - color: mat.get-color-from-palette($app-warn); + color: mat.m2-get-color-from-palette($app-warn); cursor: pointer; text-decoration: underline; } diff --git a/web-app/src/app/ingress/authentication/local/local-authentication.component.spec.ts b/web-app/src/app/ingress/authentication/local/local-authentication.component.spec.ts index 92bfce4d5..fa7b6d07d 100644 --- a/web-app/src/app/ingress/authentication/local/local-authentication.component.spec.ts +++ b/web-app/src/app/ingress/authentication/local/local-authentication.component.spec.ts @@ -1,8 +1,9 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { LocalAuthenticationComponent } from './local-authentication.component'; -import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { provideHttpClientTesting } from '@angular/common/http/testing'; import { MatFormFieldModule as MatFormFieldModule } from '@angular/material/form-field'; import { AuthenticationButtonComponent } from '../button/authentication-button.component'; +import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; describe('Local Authentication Component', () => { let component: LocalAuthenticationComponent; @@ -10,9 +11,9 @@ describe('Local Authentication Component', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [LocalAuthenticationComponent, AuthenticationButtonComponent], - imports: [HttpClientTestingModule, MatFormFieldModule] - }).compileComponents(); + imports: [MatFormFieldModule, LocalAuthenticationComponent, AuthenticationButtonComponent], + providers: [provideHttpClient(withInterceptorsFromDi()), provideHttpClientTesting()] +}).compileComponents(); })); beforeEach(() => { diff --git a/web-app/src/app/ingress/authentication/local/local-authentication.component.ts b/web-app/src/app/ingress/authentication/local/local-authentication.component.ts index 7d335d83f..acd03d15f 100644 --- a/web-app/src/app/ingress/authentication/local/local-authentication.component.ts +++ b/web-app/src/app/ingress/authentication/local/local-authentication.component.ts @@ -1,5 +1,5 @@ import { Component, ElementRef, EventEmitter, Input, OnInit, Output, SecurityContext, ViewChild } from '@angular/core'; -import { FormControl, FormGroup, Validators } from '@angular/forms'; +import { FormControl, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms'; import { ApiService } from '../../../api/api.service'; import { LinkGenerator } from '../../../contact/utilities/link-generator' import { animate, style, transition, trigger } from '@angular/animations'; @@ -7,9 +7,19 @@ import { Api, AuthenticationStrategy } from '../../../../app/api/api.entity'; import { UserService } from '../../../user/user.service'; import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; import { Router } from '@angular/router'; +import { CommonModule } from '@angular/common'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; @Component({ selector: 'local-authentication', + standalone: true, + imports: [ + CommonModule, + ReactiveFormsModule, + MatFormFieldModule, + MatInputModule + ], templateUrl: './local-authentication.component.html', styleUrls: ['./local-authentication.component.scss'], animations: [ diff --git a/web-app/src/app/ingress/authentication/local/signup.component.spec.ts b/web-app/src/app/ingress/authentication/local/signup.component.spec.ts index b4a57cfa6..02862029b 100644 --- a/web-app/src/app/ingress/authentication/local/signup.component.spec.ts +++ b/web-app/src/app/ingress/authentication/local/signup.component.spec.ts @@ -4,9 +4,9 @@ import { SignupComponent } from './signup.component'; import { ApiService } from '../../../api/api.service'; import { UserService } from '../../../user/user.service'; import { of, throwError } from 'rxjs'; -import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { provideHttpClientTesting } from '@angular/common/http/testing'; import { User } from 'core-lib-src/user'; -import { HttpErrorResponse } from '@angular/common/http'; +import { HttpErrorResponse, provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; import { PasswordPolicy } from '../@types/signup'; import { MatFormFieldModule as MatFormFieldModule } from '@angular/material/form-field'; import { CommonModule } from '@angular/common'; @@ -93,10 +93,7 @@ describe('SignupComponent', () => { }; TestBed.configureTestingModule({ - declarations: [SignupComponent], - imports: [ - ReactiveFormsModule, - HttpClientTestingModule, + imports: [SignupComponent, ReactiveFormsModule, MatFormFieldModule, MatInputModule, MatIconModule, @@ -104,13 +101,14 @@ describe('SignupComponent', () => { MatProgressBarModule, CommonModule, BrowserModule, - NoopAnimationsModule - ], - providers: [ + NoopAnimationsModule], + providers: [ { provide: ApiService, useValue: mockApiService }, - { provide: UserService, useValue: mockUserService } - ] - }).compileComponents(); + { provide: UserService, useValue: mockUserService }, + provideHttpClient(withInterceptorsFromDi()), + provideHttpClientTesting() + ] +}).compileComponents(); fixture = TestBed.createComponent(SignupComponent); component = fixture.componentInstance; diff --git a/web-app/src/app/ingress/authentication/local/signup.component.ts b/web-app/src/app/ingress/authentication/local/signup.component.ts index b1ea220ee..be5655141 100644 --- a/web-app/src/app/ingress/authentication/local/signup.component.ts +++ b/web-app/src/app/ingress/authentication/local/signup.component.ts @@ -1,9 +1,11 @@ -import { Component, EventEmitter, Output } from '@angular/core'; +import { Component, EventEmitter, Input, Output } from '@angular/core'; import { FormControl, FormGroup, Validators, - ValidationErrors + ValidationErrors, + FormsModule, + ReactiveFormsModule } from '@angular/forms'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; @@ -23,13 +25,34 @@ import { evaluatePasswordStrength, getPasswordTooltip } from 'admin/src/app/shared/utils/password.utils'; +import { CommonModule } from '@angular/common'; +import { MatButtonModule } from '@angular/material/button'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { MatProgressBarModule } from '@angular/material/progress-bar'; +import { MatTooltipModule } from '@angular/material/tooltip'; @Component({ selector: 'signup', + standalone: true, + imports: [ + CommonModule, + FormsModule, + ReactiveFormsModule, + MatFormFieldModule, + MatInputModule, + MatIconModule, + MatProgressBarModule, + MatButtonModule, + MatTooltipModule + ], templateUrl: './signup.component.html', styleUrls: ['./signup.component.scss'] }) export class SignupComponent { + @Input() api; + @Input() hideSignup; @Output() complete = new EventEmitter(); passwordPolicy!: PasswordPolicy; diff --git a/web-app/src/app/ingress/authorization/authorization.component.spec.ts b/web-app/src/app/ingress/authorization/authorization.component.spec.ts index 145afaacd..d34535e30 100644 --- a/web-app/src/app/ingress/authorization/authorization.component.spec.ts +++ b/web-app/src/app/ingress/authorization/authorization.component.spec.ts @@ -1,7 +1,8 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { AuthorizationComponent } from './authorization.component'; -import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { provideHttpClientTesting } from '@angular/common/http/testing'; import { MatFormFieldModule as MatFormFieldModule } from '@angular/material/form-field'; +import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; describe('Authorization Component', () => { let component: AuthorizationComponent; @@ -9,9 +10,9 @@ describe('Authorization Component', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [AuthorizationComponent], - imports: [HttpClientTestingModule, MatFormFieldModule] - }).compileComponents(); + imports: [AuthorizationComponent, MatFormFieldModule], + providers: [provideHttpClient(withInterceptorsFromDi()), provideHttpClientTesting()] +}).compileComponents(); })); beforeEach(() => { diff --git a/web-app/src/app/ingress/authorization/authorization.component.ts b/web-app/src/app/ingress/authorization/authorization.component.ts index 59eb4ed88..893bb9377 100644 --- a/web-app/src/app/ingress/authorization/authorization.component.ts +++ b/web-app/src/app/ingress/authorization/authorization.component.ts @@ -1,5 +1,8 @@ +import { CommonModule } from '@angular/common'; import { Component, EventEmitter, Input, Output } from '@angular/core'; -import { FormControl, Validators } from '@angular/forms'; +import { FormControl, ReactiveFormsModule, Validators } from '@angular/forms'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; import { UserService } from 'src/app/user/user.service'; export interface AuthorizationEvent { @@ -8,6 +11,13 @@ export interface AuthorizationEvent { @Component({ selector: 'authorization', + standalone: true, + imports: [ + CommonModule, + ReactiveFormsModule, + MatFormFieldModule, + MatInputModule + ], templateUrl: './authorization.component.html', styleUrls: ['./authorization.component.scss'] }) diff --git a/web-app/src/app/ingress/disclaimer/disclaimer.component.spec.ts b/web-app/src/app/ingress/disclaimer/disclaimer.component.spec.ts index 96c56392c..42eaa819a 100644 --- a/web-app/src/app/ingress/disclaimer/disclaimer.component.spec.ts +++ b/web-app/src/app/ingress/disclaimer/disclaimer.component.spec.ts @@ -7,8 +7,7 @@ describe('Disclaimer Component', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [DisclaimerComponent], - imports: [] + imports: [DisclaimerComponent], }).compileComponents(); })); diff --git a/web-app/src/app/ingress/ingress.component.spec.ts b/web-app/src/app/ingress/ingress.component.spec.ts index 7f07fddd8..222c3c53e 100644 --- a/web-app/src/app/ingress/ingress.component.spec.ts +++ b/web-app/src/app/ingress/ingress.component.spec.ts @@ -1,6 +1,7 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { IngressComponent } from './ingress.component'; -import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { provideHttpClientTesting } from '@angular/common/http/testing'; +import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; describe('Ingress Component', () => { let component: IngressComponent; @@ -8,9 +9,9 @@ describe('Ingress Component', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [IngressComponent], - imports: [HttpClientTestingModule] - }).compileComponents(); + imports: [IngressComponent], + providers: [provideHttpClient(withInterceptorsFromDi()), provideHttpClientTesting()] +}).compileComponents(); })); beforeEach(() => { diff --git a/web-app/src/app/ingress/ingress.component.ts b/web-app/src/app/ingress/ingress.component.ts index 25b268f13..65ff3e0d8 100644 --- a/web-app/src/app/ingress/ingress.component.ts +++ b/web-app/src/app/ingress/ingress.component.ts @@ -1,14 +1,35 @@ -import { Component, EventEmitter, Input, OnChanges, Output, SimpleChanges } from '@angular/core'; +import { + Component, + EventEmitter, + Input, + OnChanges, + Output, + SimpleChanges +} from '@angular/core'; import { Api, AuthenticationStrategy } from '../api/api.entity'; import { UserService } from '../user/user.service'; -import { AuthorizationEvent } from './authorization/authorization.component'; +import { + AuthorizationComponent, + AuthorizationEvent +} from './authorization/authorization.component'; import { LocalStorageService } from '../http/local-storage.service'; -import { DiscalimeCloseEvent, DiscalimerCloseReason } from './disclaimer/disclaimer.component'; +import { + DiscalimeCloseEvent, + DiscalimerCloseReason, + DisclaimerComponent +} from './disclaimer/disclaimer.component'; import { animate, style, transition, trigger } from '@angular/animations'; import { SignupEvent } from './authentication/@types/signup'; import { User } from 'core-lib-src/user'; -import { InitializedEvent } from './intialize/initialize.component'; +import { + InitializeComponent, + InitializedEvent +} from './intialize/initialize.component'; import * as _ from 'underscore'; +import { AccountStatusComponent } from './account-status/account-status.component'; +import { AuthenticationComponent } from './authentication/authentication.component'; +import { SignupComponent } from './authentication/local/signup.component'; +import { CommonModule } from '@angular/common'; enum IngressState { Initialize, @@ -67,12 +88,20 @@ class Initialize extends Ingress { @Component({ selector: 'ingress', + standalone: true, + imports: [ + AccountStatusComponent, + InitializeComponent, + AuthenticationComponent, + AuthorizationComponent, + DisclaimerComponent, + SignupComponent, + CommonModule + ], templateUrl: './ingress.component.html', styleUrls: ['./ingress.component.scss'], animations: [ - trigger('disableOnEnter', [ - transition(':enter', []) - ]), + trigger('disableOnEnter', [transition(':enter', [])]), trigger('slide', [ transition(':enter', [ style({ transform: 'translateX(100%)' }), @@ -121,7 +150,9 @@ export class IngressComponent implements OnChanges { signup($event: SignupEvent): void { if ($event.reason === 'signup') { - this.ingress = $event.user.active ? new ActiveAccount() : new InactiveAccount(); + this.ingress = $event.user.active + ? new ActiveAccount() + : new InactiveAccount(); } else { this.ingress = new Signin(); } diff --git a/web-app/src/app/ingress/ingress.module.ts b/web-app/src/app/ingress/ingress.module.ts index c407ca754..9c730828e 100644 --- a/web-app/src/app/ingress/ingress.module.ts +++ b/web-app/src/app/ingress/ingress.module.ts @@ -4,58 +4,33 @@ import { IngressComponent } from './ingress.component'; import { InitializeComponent } from './intialize/initialize.component'; import { AuthenticationComponent } from './authentication/authentication.component'; import { LocalAuthenticationComponent } from './authentication/local/local-authentication.component'; -import { MatFormFieldModule as MatFormFieldModule } from '@angular/material/form-field'; -import { MatInputModule as MatInputModule } from '@angular/material/input'; -import { MatIconModule } from '@angular/material/icon'; -import { ReactiveFormsModule } from '@angular/forms'; import { SignupComponent } from './authentication/local/signup.component'; -import { MatProgressBarModule as MatProgressBarModule } from '@angular/material/progress-bar'; import { AuthorizationComponent } from './authorization/authorization.component'; import { DisclaimerComponent } from './disclaimer/disclaimer.component'; -import { MatButtonModule as MatButtonModule } from '@angular/material/button'; import { IdpAuthenticationComponent } from './authentication/idp/idp-authentication.component'; import { AccountStatusComponent } from './account-status/account-status.component'; import { AuthenticationDialogComponent } from './authentication/authentication-dialog.component'; import { LdapAuthenticationComponent } from './authentication/ldap/ldap-authentication.component'; import { AuthenticationButtonComponent } from './authentication/button/authentication-button.component'; -import { MatTooltipModule as MatTooltipModule } from '@angular/material/tooltip'; @NgModule({ - declarations: [], - imports: [], - exports: [ + imports: [ CommonModule, - MatButtonModule, - MatIconModule, - MatFormFieldModule, - MatInputModule, - MatProgressBarModule, - ReactiveFormsModule, - MatTooltipModule, - ] -}) -class AngularModule { } - -@NgModule({ - declarations: [ - AccountStatusComponent, + IngressComponent, + InitializeComponent, AuthenticationComponent, - AuthenticationButtonComponent, - AuthenticationDialogComponent, + LocalAuthenticationComponent, + SignupComponent, AuthorizationComponent, DisclaimerComponent, IdpAuthenticationComponent, - IngressComponent, - InitializeComponent, + AccountStatusComponent, + AuthenticationDialogComponent, LdapAuthenticationComponent, - LocalAuthenticationComponent, - SignupComponent - ], - imports: [ - AngularModule + AuthenticationButtonComponent ], exports: [ IngressComponent ] }) -export class IngressModule { } +export class IngressModule {} \ No newline at end of file diff --git a/web-app/src/app/ingress/intialize/initialize.component.scss b/web-app/src/app/ingress/intialize/initialize.component.scss index af8989038..1cb9b5506 100644 --- a/web-app/src/app/ingress/intialize/initialize.component.scss +++ b/web-app/src/app/ingress/intialize/initialize.component.scss @@ -7,7 +7,7 @@ } :host ::ng-deep a { - color: mat.get-color-from-palette($app-warn); + color: mat.m2-get-color-from-palette($app-warn); cursor: pointer; text-decoration: underline; } @@ -78,7 +78,7 @@ mat-form-field { align-items: center; gap: 8px; margin-top: 24px; - color: mat.get-color-from-palette($app-warn); + color: mat.m2-get-color-from-palette($app-warn); border-radius: 4px; padding: 0 16px; } diff --git a/web-app/src/app/ingress/intialize/initialize.component.spec.ts b/web-app/src/app/ingress/intialize/initialize.component.spec.ts index 7e134ac82..bca417c44 100644 --- a/web-app/src/app/ingress/intialize/initialize.component.spec.ts +++ b/web-app/src/app/ingress/intialize/initialize.component.spec.ts @@ -1,8 +1,9 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { InitializeComponent } from './initialize.component'; -import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { provideHttpClientTesting } from '@angular/common/http/testing'; import { MatFormFieldModule as MatFormFieldModule } from '@angular/material/form-field'; import { MatProgressBarModule as MatProgressBarModule } from '@angular/material/progress-bar'; +import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; describe('Initialize Component', () => { let component: InitializeComponent; @@ -10,13 +11,10 @@ describe('Initialize Component', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [InitializeComponent], - imports: [ - HttpClientTestingModule, - MatFormFieldModule, - MatProgressBarModule - ] - }).compileComponents(); + imports: [MatFormFieldModule, + MatProgressBarModule, InitializeComponent], + providers: [provideHttpClient(withInterceptorsFromDi()), provideHttpClientTesting()] +}).compileComponents(); })); beforeEach(() => { diff --git a/web-app/src/app/ingress/intialize/initialize.component.ts b/web-app/src/app/ingress/intialize/initialize.component.ts index 36d4dbd5a..df818beae 100644 --- a/web-app/src/app/ingress/intialize/initialize.component.ts +++ b/web-app/src/app/ingress/intialize/initialize.component.ts @@ -1,6 +1,6 @@ import { Component, EventEmitter, OnInit, Output } from '@angular/core'; import { PasswordStrength, passwordStrengthScores } from '../../entities/entities.password'; -import { FormControl, FormGroup, Validators } from '@angular/forms'; +import { FormControl, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms'; import { zxcvbn, zxcvbnOptions } from '@zxcvbn-ts/core' import { InitializeService } from './initialize.service'; import { UserService } from '../../user/user.service'; @@ -8,6 +8,11 @@ import { User } from 'core-lib-src/user'; import * as zxcvbnCommonPackage from '@zxcvbn-ts/language-common' import * as zxcvbnEnPackage from '@zxcvbn-ts/language-en' import { animate, style, transition, trigger } from '@angular/animations'; +import { CommonModule } from '@angular/common'; +import { MatButtonModule } from '@angular/material/button'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatProgressBarModule } from '@angular/material/progress-bar'; export interface InitializedEvent { token: string @@ -15,6 +20,15 @@ export interface InitializedEvent { @Component({ selector: 'initialize', + standalone: true, + imports: [ + CommonModule, + ReactiveFormsModule, + MatFormFieldModule, + MatInputModule, + MatButtonModule, + MatProgressBarModule + ], templateUrl: './initialize.component.html', styleUrls: ['./initialize.component.scss'], animations: [ diff --git a/web-app/src/app/landing/info.component.spec.ts b/web-app/src/app/landing/info.component.spec.ts index 432b8250d..fab80ae17 100644 --- a/web-app/src/app/landing/info.component.spec.ts +++ b/web-app/src/app/landing/info.component.spec.ts @@ -7,8 +7,7 @@ describe('Info Component', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [InfoComponent], - imports: [] + imports: [InfoComponent], }).compileComponents(); })); diff --git a/web-app/src/app/landing/info.component.ts b/web-app/src/app/landing/info.component.ts index cc3515149..2ad6e5baf 100644 --- a/web-app/src/app/landing/info.component.ts +++ b/web-app/src/app/landing/info.component.ts @@ -1,7 +1,26 @@ +import { CommonModule } from '@angular/common'; import { Component } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCheckboxModule } from '@angular/material/checkbox'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { MatMenuModule } from '@angular/material/menu'; @Component({ selector: 'info', + standalone: true, + imports: [ + CommonModule, + FormsModule, + MatFormFieldModule, + MatInputModule, + MatIconModule, + MatCheckboxModule, + MatMenuModule, + MatButtonModule + ], templateUrl: './info.component.html', styleUrls: ['./info.component.scss'] }) diff --git a/web-app/src/app/landing/landing.component.spec.ts b/web-app/src/app/landing/landing.component.spec.ts index 7ddc34902..58f44674b 100644 --- a/web-app/src/app/landing/landing.component.spec.ts +++ b/web-app/src/app/landing/landing.component.spec.ts @@ -1,8 +1,9 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { LandingComponent } from './landing.component'; -import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { provideHttpClientTesting } from '@angular/common/http/testing'; import { IngressModule } from '../ingress/ingress.module'; import { InfoComponent } from './info.component'; +import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; describe('Landing Component', () => { let component: LandingComponent; @@ -10,9 +11,9 @@ describe('Landing Component', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [LandingComponent, InfoComponent], - imports: [HttpClientTestingModule, IngressModule] - }).compileComponents(); + imports: [LandingComponent, InfoComponent, IngressModule], + providers: [provideHttpClient(withInterceptorsFromDi()), provideHttpClientTesting()] +}).compileComponents(); })); beforeEach(() => { diff --git a/web-app/src/app/landing/landing.component.ts b/web-app/src/app/landing/landing.component.ts index 89e6fe8a2..a0047f85d 100644 --- a/web-app/src/app/landing/landing.component.ts +++ b/web-app/src/app/landing/landing.component.ts @@ -1,27 +1,33 @@ import { Component } from '@angular/core'; +import { Router } from '@angular/router'; import { Api } from '../api/api.entity'; import { ApiService } from 'admin/src/app/api/api.service'; -import { Router } from '@angular/router'; +import { IngressModule } from '../ingress/ingress.module'; +import { InfoComponent } from './info.component'; @Component({ selector: 'landing', + standalone: true, + imports: [ + IngressModule, + InfoComponent + ], templateUrl: './landing.component.html', styleUrls: ['./landing.component.scss'], }) export class LandingComponent { - api: Api + api: Api; constructor( apiService: ApiService, private router: Router ) { apiService.getApi().subscribe((api: Api) => { - this.api = api - }) + this.api = api; + }); } onIngress(): void { - this.router.navigate(['home']) + this.router.navigate(['home']); } - -} +} \ No newline at end of file diff --git a/web-app/src/app/landing/landing.module.ts b/web-app/src/app/landing/landing.module.ts index b6f5f919a..04861fdcd 100644 --- a/web-app/src/app/landing/landing.module.ts +++ b/web-app/src/app/landing/landing.module.ts @@ -15,15 +15,13 @@ const routes: Routes = [{ }]; @NgModule({ - declarations: [ - LandingComponent, - InfoComponent - ], imports: [ CommonModule, IngressModule, + LandingComponent, + InfoComponent, RouterModule.forChild(routes) ], - exports: [ RouterModule ] + exports: [RouterModule] }) export class LandingModule { } \ No newline at end of file diff --git a/web-app/src/app/layer/feature.service.spec.ts b/web-app/src/app/layer/feature.service.spec.ts index 07b280f70..89abc4f97 100644 --- a/web-app/src/app/layer/feature.service.spec.ts +++ b/web-app/src/app/layer/feature.service.spec.ts @@ -1,14 +1,15 @@ import { TestBed } from '@angular/core/testing'; import { FeatureService } from './feature.service'; -import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { provideHttpClientTesting } from '@angular/common/http/testing'; +import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; describe('Feature Service Tests', () => { beforeEach(() => { TestBed.configureTestingModule({ - providers: [FeatureService], - imports: [HttpClientTestingModule] - }); + imports: [], + providers: [FeatureService, provideHttpClient(withInterceptorsFromDi()), provideHttpClientTesting()] +}); }); afterEach(() => { diff --git a/web-app/src/app/layer/layer.service.spec.ts b/web-app/src/app/layer/layer.service.spec.ts index b31e88e05..920e122a8 100644 --- a/web-app/src/app/layer/layer.service.spec.ts +++ b/web-app/src/app/layer/layer.service.spec.ts @@ -1,14 +1,15 @@ import { TestBed } from '@angular/core/testing'; import { LayerService } from './layer.service'; -import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { provideHttpClientTesting } from '@angular/common/http/testing'; +import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; describe('Layer Service Tests', () => { beforeEach(() => { TestBed.configureTestingModule({ - providers: [LayerService], - imports: [HttpClientTestingModule] - }); + imports: [], + providers: [LayerService, provideHttpClient(withInterceptorsFromDi()), provideHttpClientTesting()] +}); }); afterEach(() => { diff --git a/web-app/src/app/map/clip/clip.component.spec.ts b/web-app/src/app/map/clip/clip.component.spec.ts index 71bdb7e76..b7aaed9df 100644 --- a/web-app/src/app/map/clip/clip.component.spec.ts +++ b/web-app/src/app/map/clip/clip.component.spec.ts @@ -9,7 +9,7 @@ describe('MapClipComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [MapClipComponent] + imports: [MapClipComponent] }) .compileComponents(); })); diff --git a/web-app/src/app/map/controls/add-observation.component.spec.ts b/web-app/src/app/map/controls/add-observation.component.spec.ts index 7bd41f077..799c1d1ab 100644 --- a/web-app/src/app/map/controls/add-observation.component.spec.ts +++ b/web-app/src/app/map/controls/add-observation.component.spec.ts @@ -11,8 +11,7 @@ describe('AddObservationComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - imports: [ MatIconModule, MatButtonModule ], - declarations: [ AddObservationComponent ] + imports: [ MatIconModule, MatButtonModule, AddObservationComponent], }) .compileComponents(); })); diff --git a/web-app/src/app/map/controls/add-observation.component.ts b/web-app/src/app/map/controls/add-observation.component.ts index 2f8aae10a..3963c74f7 100644 --- a/web-app/src/app/map/controls/add-observation.component.ts +++ b/web-app/src/app/map/controls/add-observation.component.ts @@ -1,8 +1,15 @@ +import { CommonModule } from '@angular/common'; import { Component, EventEmitter, Output, AfterViewInit, ElementRef, ViewChild } from '@angular/core'; +import { MatIconModule } from '@angular/material/icon'; import { DomEvent } from 'leaflet'; @Component({ selector: 'map-control-add-observation', + standalone: true, + imports: [ + CommonModule, + MatIconModule + ], templateUrl: './add-observation.component.html', styleUrls: ['./add-observation.component.scss'] }) diff --git a/web-app/src/app/map/controls/export.component.spec.ts b/web-app/src/app/map/controls/export.component.spec.ts index b6054689d..80d0c9948 100644 --- a/web-app/src/app/map/controls/export.component.spec.ts +++ b/web-app/src/app/map/controls/export.component.spec.ts @@ -11,10 +11,13 @@ describe('Export Control Component', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - imports: [ MatIconModule, MatButtonModule, MatTooltipModule ], - declarations: [ ExportControlComponent ] - }) - .compileComponents(); + imports: [ + MatIconModule, + MatButtonModule, + MatTooltipModule, + ExportControlComponent + ], + }).compileComponents(); })); beforeEach(() => { diff --git a/web-app/src/app/map/controls/export.component.ts b/web-app/src/app/map/controls/export.component.ts index 7a3b37a30..3213c8b13 100644 --- a/web-app/src/app/map/controls/export.component.ts +++ b/web-app/src/app/map/controls/export.component.ts @@ -1,3 +1,4 @@ +import { CommonModule } from '@angular/common'; import { Component, EventEmitter, @@ -6,10 +7,16 @@ import { ElementRef, ViewChild } from '@angular/core'; +import { MatIconModule } from '@angular/material/icon'; import { DomEvent } from 'leaflet'; @Component({ selector: 'map-control-export', + standalone: true, + imports: [ + CommonModule, + MatIconModule + ], templateUrl: './export.component.html', styleUrls: ['./export.component.scss'] }) diff --git a/web-app/src/app/map/controls/filter.component.spec.ts b/web-app/src/app/map/controls/filter.component.spec.ts index 63b1fc4a8..fb12f0b6d 100644 --- a/web-app/src/app/map/controls/filter.component.spec.ts +++ b/web-app/src/app/map/controls/filter.component.spec.ts @@ -19,8 +19,8 @@ describe('Filter Control Component', () => { MatFormFieldModule, MatChipsModule, MatSelectModule, + FilterControlComponent ], - declarations: [FilterControlComponent] }).compileComponents(); })); diff --git a/web-app/src/app/map/controls/filter.component.ts b/web-app/src/app/map/controls/filter.component.ts index c32fae354..1a0fe0775 100644 --- a/web-app/src/app/map/controls/filter.component.ts +++ b/web-app/src/app/map/controls/filter.component.ts @@ -1,8 +1,15 @@ +import { CommonModule } from '@angular/common'; import { Component, EventEmitter, Output, AfterViewInit, ElementRef, ViewChild } from '@angular/core'; +import { MatIconModule } from '@angular/material/icon'; import { DomEvent } from 'leaflet'; @Component({ selector: 'map-control-filter', + standalone: true, + imports: [ + CommonModule, + MatIconModule + ], templateUrl: './filter.component.html', styleUrls: ['./filter.component.scss'] }) diff --git a/web-app/src/app/map/controls/layers-control.component.spec.ts b/web-app/src/app/map/controls/layers-control.component.spec.ts index d1a19eb21..8dba6b24c 100644 --- a/web-app/src/app/map/controls/layers-control.component.spec.ts +++ b/web-app/src/app/map/controls/layers-control.component.spec.ts @@ -10,10 +10,8 @@ describe('LayersControlComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - imports: [ NoopAnimationsModule, MatIconModule ], - declarations: [ LayersControlComponent ] - }) - .compileComponents(); + imports: [NoopAnimationsModule, MatIconModule, LayersControlComponent] + }).compileComponents(); })); beforeEach(() => { diff --git a/web-app/src/app/map/controls/layers-control.component.ts b/web-app/src/app/map/controls/layers-control.component.ts index cf25a6012..39f9c363a 100644 --- a/web-app/src/app/map/controls/layers-control.component.ts +++ b/web-app/src/app/map/controls/layers-control.component.ts @@ -1,8 +1,15 @@ import { Component, Output, EventEmitter } from '@angular/core'; import { trigger, state, style, animate, transition } from '@angular/animations'; +import { CommonModule } from '@angular/common'; +import { MatIconModule } from '@angular/material/icon'; @Component({ selector: 'map-control-layers', + standalone: true, + imports: [ + CommonModule, + MatIconModule + ], templateUrl: './layers-control.component.html', styleUrls: ['./layers-control.component.scss'], animations: [ diff --git a/web-app/src/app/map/controls/location.component.spec.ts b/web-app/src/app/map/controls/location.component.spec.ts index 985b27712..fdc544e4c 100644 --- a/web-app/src/app/map/controls/location.component.spec.ts +++ b/web-app/src/app/map/controls/location.component.spec.ts @@ -12,8 +12,7 @@ describe('LocationComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - imports: [MatIconModule, MatButtonModule, MatTooltipModule], - declarations: [ LocationComponent ] + imports: [MatIconModule, MatButtonModule, MatTooltipModule, LocationComponent], }) .compileComponents(); })); diff --git a/web-app/src/app/map/controls/location.component.ts b/web-app/src/app/map/controls/location.component.ts index 11e8968ef..d38e97ae9 100644 --- a/web-app/src/app/map/controls/location.component.ts +++ b/web-app/src/app/map/controls/location.component.ts @@ -1,3 +1,4 @@ +import { CommonModule } from '@angular/common'; import { Component, Output, @@ -7,6 +8,7 @@ import { ViewChild, Input } from '@angular/core'; +import { MatIconModule } from '@angular/material/icon'; import { DomEvent } from 'leaflet'; export enum LocationState { @@ -21,6 +23,11 @@ export interface LocationEvent { @Component({ selector: 'map-control-location', + standalone: true, + imports: [ + CommonModule, + MatIconModule + ], templateUrl: './location.component.html', styleUrls: ['./location.component.scss'] }) diff --git a/web-app/src/app/map/controls/search.component.spec.ts b/web-app/src/app/map/controls/search.component.spec.ts index 69afa4738..43c97519f 100644 --- a/web-app/src/app/map/controls/search.component.spec.ts +++ b/web-app/src/app/map/controls/search.component.spec.ts @@ -1,98 +1,93 @@ -import { - ComponentFixture, - TestBed, - getTestBed, - tick, - fakeAsync, - flush, - discardPeriodicTasks, - waitForAsync -} from '@angular/core/testing'; +import { fakeAsync, tick } from '@angular/core/testing'; +import { of, throwError } from 'rxjs'; import { SearchComponent, SearchState } from './search.component'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatListModule, MatListItem } from '@angular/material/list'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { By } from '@angular/platform-browser'; -import { HttpClientTestingModule } from '@angular/common/http/testing'; import { PlacenameSearchResult, PlacenameSearchService } from '../search/search.service'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; -import { of } from 'rxjs'; import { + MapSettings, MobileSearchType, WebSearchType } from 'src/app/entities/map/entities.map'; +import { MapSettingsService } from '../settings/map.settings.service'; +import { MatSnackBar } from '@angular/material/snack-bar'; +import { ElementRef } from '@angular/core'; describe('SearchComponent', () => { let component: SearchComponent; - let fixture: ComponentFixture; - let injector: TestBed; - let service: PlacenameSearchService; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - BrowserAnimationsModule, - HttpClientTestingModule, - MatCardModule, - MatButtonModule, - MatIconModule, - MatInputModule, - MatListModule, - MatProgressSpinnerModule, - MatSnackBarModule - ], - declarations: [SearchComponent], - providers: [] - }).compileComponents(); - })); + let mapSettingsService: jasmine.SpyObj; + let searchService: jasmine.SpyObj; + let snackBar: jasmine.SpyObj; + + const mapSettings: MapSettings = { + webSearchType: WebSearchType.NOMINATIM, + webNominatimUrl: '', + mobileSearchType: MobileSearchType.NONE, + mobileNominatimUrl: '' + }; beforeEach(() => { - fixture = TestBed.createComponent(SearchComponent); - component = fixture.componentInstance; - fixture.detectChanges(); + mapSettingsService = jasmine.createSpyObj( + 'MapSettingsService', + ['getMapSettings'] + ); + + searchService = jasmine.createSpyObj( + 'PlacenameSearchService', + ['search'] + ); + + snackBar = jasmine.createSpyObj('MatSnackBar', ['open']); + + mapSettingsService.getMapSettings.and.returnValue(of(mapSettings)); - injector = getTestBed(); - service = injector.inject(PlacenameSearchService); + component = new SearchComponent( + mapSettingsService, + searchService, + snackBar + ); }); it('should create', () => { expect(component).toBeTruthy(); }); - it('should toggle search on', () => { - const button = fixture.debugElement.query(By.css('button')); - button.nativeElement.click(); + it('should load map settings on init', () => { + component.ngOnInit(); - expect(component.searchState as SearchState).toBe(SearchState.ON); + expect(mapSettingsService.getMapSettings).toHaveBeenCalled(); + expect(component.mapSettings).toEqual(mapSettings); }); + it('should toggle search on', fakeAsync(() => { + const focusSpy = jasmine.createSpy('focus'); + + component.searchInput = { + nativeElement: { + focus: focusSpy + } + } as any as ElementRef; + + component.searchToggle(); + + tick(); + + expect(component.searchState as SearchState).toBe(SearchState.ON); + expect(focusSpy).toHaveBeenCalled(); + })); + it('should toggle search off', () => { component.searchState = SearchState.ON; - const button = fixture.debugElement.query(By.css('button')); - button.nativeElement.click(); + component.searchToggle(); expect(component.searchState as SearchState).toBe(SearchState.OFF); }); - it('should search', fakeAsync(() => { - spyOn(component.onSearch, 'emit'); - - component.searchState = SearchState.ON; - component.mapSettings = { - webSearchType: WebSearchType.NOMINATIM, - webNominatimUrl: '', - mobileSearchType: MobileSearchType.NONE, - mobileNominatimUrl: '' - }; + it('should search', () => { + component.mapSettings = mapSettings; const results: PlacenameSearchResult[] = [ { @@ -102,63 +97,79 @@ describe('SearchComponent', () => { } ]; - spyOn(service, 'search').and.returnValue(of(results)); - - fixture.detectChanges(); + searchService.search.and.returnValue(of(results)); - const input = fixture.debugElement.query(By.css('input')).nativeElement; - input.value = 'test'; - - const event = new KeyboardEvent('keydown', { - key: 'Enter' - }); - input.dispatchEvent(event); - - tick(); - fixture.detectChanges(); + component.search('test'); + expect(component.searching).toBe(false); + expect(searchService.search).toHaveBeenCalledWith(mapSettings, 'test'); expect(component.searchResults).toEqual(results); + }); - const item = fixture.debugElement.query(By.directive(MatListItem)); - expect(item).toBeTruthy(); + it('should show snack bar when search fails', () => { + component.mapSettings = mapSettings; - item.nativeElement.click(); + searchService.search.and.returnValue( + throwError(() => new Error('Search failed')) + ); - expect(component.onSearch.emit).toHaveBeenCalledWith({ - result: results[0] - }); + component.search('test'); - flush(); - discardPeriodicTasks(); - })); + expect(component.searching).toBe(false); + expect(snackBar.open).toHaveBeenCalledWith( + 'Error accessing place name server ', + undefined, + { + duration: 2000 + } + ); + }); it('should clear', () => { spyOn(component.onSearchClear, 'emit'); - component.searchState = SearchState.ON; + const event = jasmine.createSpyObj('MouseEvent', [ + 'stopPropagation', + 'preventDefault' + ]); - component.mapSettings = { - webSearchType: WebSearchType.NOMINATIM, - webNominatimUrl: '', - mobileSearchType: MobileSearchType.NONE, - mobileNominatimUrl: '' - }; + const input = { + value: 'test' + } as HTMLInputElement; - fixture.detectChanges(); + component.searchResults = [ + { + name: 'test', + bbox: [0, 0, 0, 0], + position: [0, 0] + } + ]; - const input = fixture.debugElement.query(By.css('input')).nativeElement; - input.value = 'test'; + component.clear(event, input); - fixture.detectChanges(); + expect(event.stopPropagation).toHaveBeenCalled(); + expect(event.preventDefault).toHaveBeenCalled(); + expect(input.value).toEqual(''); + expect(component.searchResults).toEqual([]); + expect(component.onSearchClear.emit).toHaveBeenCalled(); + }); - expect(input.value).toEqual('test'); + it('should emit selected search result and close search', () => { + spyOn(component.onSearch, 'emit'); + spyOn(component, 'searchToggle').and.callThrough(); - const clearButton = fixture.debugElement.queryAll(By.css('button'))[1]; - clearButton.nativeElement.click(); + component.searchState = SearchState.ON; - fixture.detectChanges(); + const result: PlacenameSearchResult = { + name: 'test', + bbox: [0, 0, 0, 0], + position: [0, 0] + }; - expect(input.value).toEqual(''); - expect(component.onSearchClear.emit).toHaveBeenCalled(); + component.searchResultClick(result); + + expect(component.searchToggle).toHaveBeenCalled(); + expect(component.searchState as SearchState).toBe(SearchState.OFF); + expect(component.onSearch.emit).toHaveBeenCalledWith({ result }); }); -}); +}); \ No newline at end of file diff --git a/web-app/src/app/map/controls/search.component.ts b/web-app/src/app/map/controls/search.component.ts index a9b0d4906..d7f7d1afb 100644 --- a/web-app/src/app/map/controls/search.component.ts +++ b/web-app/src/app/map/controls/search.component.ts @@ -14,6 +14,13 @@ import { PlacenameSearchService } from '../search/search.service'; import { MatSnackBar } from '@angular/material/snack-bar'; +import { CommonModule } from '@angular/common'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MatCardModule } from '@angular/material/card'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatListModule } from '@angular/material/list'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; export enum SearchState { ON, @@ -26,6 +33,17 @@ export interface SearchEvent { @Component({ selector: 'map-control-search', + standalone: true, + imports: [ + CommonModule, + FormsModule, + ReactiveFormsModule, + MatIconModule, + MatCardModule, + MatFormFieldModule, + MatProgressSpinnerModule, + MatListModule + ], templateUrl: './search.component.html', styleUrls: ['./search.component.scss'] }) diff --git a/web-app/src/app/map/controls/zoom.component.spec.ts b/web-app/src/app/map/controls/zoom.component.spec.ts index 82ccf7445..d1f2e282e 100644 --- a/web-app/src/app/map/controls/zoom.component.spec.ts +++ b/web-app/src/app/map/controls/zoom.component.spec.ts @@ -11,8 +11,7 @@ describe('ZoomComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - imports: [ MatIconModule, MatButtonModule ], - declarations: [ ZoomComponent ] + imports: [ MatIconModule, MatButtonModule, ZoomComponent ], }) .compileComponents(); })); diff --git a/web-app/src/app/map/controls/zoom.component.ts b/web-app/src/app/map/controls/zoom.component.ts index 16ef72212..ef240c9c1 100644 --- a/web-app/src/app/map/controls/zoom.component.ts +++ b/web-app/src/app/map/controls/zoom.component.ts @@ -1,3 +1,4 @@ +import { CommonModule } from '@angular/common'; import { Component, EventEmitter, @@ -6,6 +7,7 @@ import { ViewChild, ElementRef } from '@angular/core'; +import { MatIconModule } from '@angular/material/icon'; import { DomEvent } from 'leaflet'; export enum ZoomDirection { @@ -19,6 +21,11 @@ export interface ZoomEvent { @Component({ selector: 'map-control-zoom', + standalone: true, + imports: [ + CommonModule, + MatIconModule + ], templateUrl: './zoom.component.html', styleUrls: ['./zoom.component.scss'] }) diff --git a/web-app/src/app/map/layers/layer-content.component.spec.ts b/web-app/src/app/map/layers/layer-content.component.spec.ts index e86176c13..d236ea2fa 100644 --- a/web-app/src/app/map/layers/layer-content.component.spec.ts +++ b/web-app/src/app/map/layers/layer-content.component.spec.ts @@ -18,7 +18,8 @@ import { MapLayerService } from './layer.service'; import { Component, ViewChild } from '@angular/core'; @Component({ - selector: `host-component`, + standalone: true, + imports: [LayerContentComponent], template: `` }) class TestHostComponent { @@ -48,14 +49,12 @@ describe('LayerContentComponent', () => { CheckboardModule, SaturationModule, HueModule, - AlphaModule - ], - providers: [MapLayerService], - declarations: [ + AlphaModule, ColorPickerComponent, TestHostComponent, LayerContentComponent - ] + ], + providers: [MapLayerService], }).compileComponents(); })); diff --git a/web-app/src/app/map/layers/layer-content.component.ts b/web-app/src/app/map/layers/layer-content.component.ts index b47d1ef16..353477ce8 100644 --- a/web-app/src/app/map/layers/layer-content.component.ts +++ b/web-app/src/app/map/layers/layer-content.component.ts @@ -1,10 +1,24 @@ import { Component, Input, ViewChild, ElementRef } from '@angular/core'; import { MapLayerService, SimpleStyle } from './layer.service'; -import { ColorEvent } from 'src/app/color-picker/color-picker.component'; +import { ColorEvent, ColorPickerComponent } from 'src/app/color-picker/color-picker.component'; import { trigger, style, transition, animate } from '@angular/animations'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatSliderModule } from '@angular/material/slider'; @Component({ selector: 'layer-content', + standalone: true, + imports: [ + CommonModule, + FormsModule, + MatSliderModule, + MatIconModule, + MatFormFieldModule, + ColorPickerComponent + ], templateUrl: './layer-content.component.html', styleUrls: ['./layer-content.component.scss'], animations: [ diff --git a/web-app/src/app/map/layers/layer-header.component.spec.ts b/web-app/src/app/map/layers/layer-header.component.spec.ts index 2677bc7b6..dd10105bb 100644 --- a/web-app/src/app/map/layers/layer-header.component.spec.ts +++ b/web-app/src/app/map/layers/layer-header.component.spec.ts @@ -11,11 +11,11 @@ import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { By } from '@angular/platform-browser'; @Component({ - selector: `host-component`, + standalone: true, + imports: [LayerHeaderComponent], template: `` }) class TestHostComponent { - layer = { layer: { type: 'Tile' @@ -32,18 +32,24 @@ describe('LayerHeaderComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - imports: [ NoopAnimationsModule, MatFormFieldModule, MatCheckboxModule, MatRadioModule, MatIconModule ], - providers: [MapLayerService ], - declarations: [ LayerHeaderComponent, TestHostComponent ] - }) - .compileComponents(); + imports: [ + NoopAnimationsModule, + MatFormFieldModule, + MatCheckboxModule, + MatRadioModule, + MatIconModule, + LayerHeaderComponent, + TestHostComponent + ], + providers: [MapLayerService], + }).compileComponents(); })); beforeEach(() => { fixture = TestBed.createComponent(TestHostComponent); hostComponent = fixture.componentInstance; fixture.detectChanges(); - component = hostComponent.layerHeader + component = hostComponent.layerHeader; }); it('should create', () => { @@ -51,13 +57,15 @@ describe('LayerHeaderComponent', () => { }); it('should have getBounds', () => { - component.layer.layer.getBounds = function(): any { return null; }; + component.layer.layer.getBounds = function (): any { + return null; + }; expect(component.hasBounds()).toBeTruthy(); }); it('should have bbox', () => { component.layer.layer.table = { - bbox: [0,0,0,0] + bbox: [0, 0, 0, 0] }; expect(component.hasBounds()).toBeTruthy(); }); @@ -72,7 +80,10 @@ describe('LayerHeaderComponent', () => { checked: true }; component.checkChanged(event); - expect(component['layerService'].toggle).toHaveBeenCalledWith(component.layer, true); + expect(component['layerService'].toggle).toHaveBeenCalledWith( + component.layer, + true + ); }); it('should toggle check off', () => { @@ -81,13 +92,19 @@ describe('LayerHeaderComponent', () => { checked: false }; component.checkChanged(event); - expect(component['layerService'].toggle).toHaveBeenCalledWith(component.layer, false); + expect(component['layerService'].toggle).toHaveBeenCalledWith( + component.layer, + false + ); }); it('should toggle radio on', () => { spyOn(component['layerService'], 'toggle'); component.radioChanged(); - expect(component['layerService'].toggle).toHaveBeenCalledWith(component.layer, true); + expect(component['layerService'].toggle).toHaveBeenCalledWith( + component.layer, + true + ); }); it('should zoom', () => { @@ -98,7 +115,9 @@ describe('LayerHeaderComponent', () => { spyOn(component['layerService'], 'zoom'); const button = fixture.debugElement.queryAll(By.css('button'))[0]; button.nativeElement.click(); - expect(component['layerService'].zoom).toHaveBeenCalledWith(component.layer); + expect(component['layerService'].zoom).toHaveBeenCalledWith( + component.layer + ); }); it('should toggle expanded', () => { diff --git a/web-app/src/app/map/layers/layer-header.component.ts b/web-app/src/app/map/layers/layer-header.component.ts index 9d47979b6..e8ed218f4 100644 --- a/web-app/src/app/map/layers/layer-header.component.ts +++ b/web-app/src/app/map/layers/layer-header.component.ts @@ -1,10 +1,22 @@ import { Component, Input, Output, EventEmitter } from '@angular/core'; -import { MatCheckboxChange as MatCheckboxChange } from '@angular/material/checkbox'; +import { MatCheckboxChange as MatCheckboxChange, MatCheckboxModule } from '@angular/material/checkbox'; import { MapLayerService } from './layer.service'; import { state, style, trigger } from '@angular/animations'; +import { CommonModule } from '@angular/common'; +import { MatIconModule } from '@angular/material/icon'; +import { MatRadioModule } from '@angular/material/radio'; +import { MatFormFieldModule } from '@angular/material/form-field'; @Component({ selector: 'layer-header', + standalone: true, + imports: [ + CommonModule, + MatCheckboxModule, + MatRadioModule, + MatIconModule, + MatFormFieldModule + ], templateUrl: './layer-header.component.html', styleUrls: ['./layer-header.component.scss'], animations: [ diff --git a/web-app/src/app/map/layers/layers.component.scss b/web-app/src/app/map/layers/layers.component.scss index bd1e33ea3..ceeac5964 100644 --- a/web-app/src/app/map/layers/layers.component.scss +++ b/web-app/src/app/map/layers/layers.component.scss @@ -4,7 +4,7 @@ .header { margin: 16px 0; font: 400 16px/24px Roboto, "Helvetica Neue", sans-serif; - color: mat.get-color-from-palette($app-primary); + color: mat.m2-get-color-from-palette($app-primary); } .map-layers { diff --git a/web-app/src/app/map/layers/layers.component.spec.ts b/web-app/src/app/map/layers/layers.component.spec.ts index 30728fdc9..a4c9d7b72 100644 --- a/web-app/src/app/map/layers/layers.component.spec.ts +++ b/web-app/src/app/map/layers/layers.component.spec.ts @@ -12,23 +12,31 @@ import { MatRadioModule as MatRadioModule } from '@angular/material/radio'; import { MatSliderModule as MatSliderModule } from '@angular/material/slider'; import { ColorPickerComponent } from 'src/app/color-picker/color-picker.component'; import { FormsModule } from '@angular/forms'; -import { CheckboardModule, HueModule, SaturationModule, AlphaModule } from 'ngx-color'; +import { + CheckboardModule, + HueModule, + SaturationModule, + AlphaModule +} from 'ngx-color'; import { Component, ViewChild } from '@angular/core'; @Component({ - selector: `host-component`, - template: ` - ` + standalone: true, + imports: [LayersComponent], + template: ` + + + ` }) class TestHostComponent { - mageLayers = []; - baseLayers= []; + baseLayers = []; tileOverlays = []; featureOverlays = []; gridOverlays = []; @@ -36,7 +44,6 @@ class TestHostComponent { @ViewChild(LayersComponent) layers: LayersComponent; } - describe('LayersComponent', () => { let component: LayersComponent; let hostComponent: TestHostComponent; @@ -44,10 +51,26 @@ describe('LayersComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - imports: [ FormsModule, MatCardModule, MatFormFieldModule, MatIconModule, MatSliderModule, MatCheckboxModule, MatRadioModule, MatExpansionModule, CheckboardModule, HueModule, SaturationModule, AlphaModule ], - declarations: [ LayersComponent, LayerHeaderComponent, LayerContentComponent, ColorPickerComponent, TestHostComponent ] - }) - .compileComponents(); + imports: [ + FormsModule, + MatCardModule, + MatFormFieldModule, + MatIconModule, + MatSliderModule, + MatCheckboxModule, + MatRadioModule, + MatExpansionModule, + CheckboardModule, + HueModule, + SaturationModule, + LayersComponent, + LayerHeaderComponent, + LayerContentComponent, + ColorPickerComponent, + TestHostComponent, + AlphaModule + ], + }).compileComponents(); })); beforeEach(() => { @@ -61,14 +84,13 @@ describe('LayersComponent', () => { expect(component).toBeTruthy(); }); - it('should reorder', () => { spyOn(component.onReorder, 'emit'); const event: any = { currentIndex: 1, previousIndex: 0 - } + }; const type = 'tile'; const layers: [any] = [{}]; component.reorderLayers(event, type, layers); @@ -87,7 +109,7 @@ describe('LayersComponent', () => { const event: any = { currentIndex: 0, previousIndex: 0 - } + }; const type = 'tile'; const layers: [any] = [{}]; component.reorderLayers(event, type, layers); diff --git a/web-app/src/app/map/layers/layers.component.ts b/web-app/src/app/map/layers/layers.component.ts index d23fc2d99..a9c340cef 100644 --- a/web-app/src/app/map/layers/layers.component.ts +++ b/web-app/src/app/map/layers/layers.component.ts @@ -1,6 +1,10 @@ import { Component, Output, EventEmitter, Input } from '@angular/core'; import { CdkDragDrop } from '@angular/cdk/drag-drop'; import { Feed } from '@ngageoint/mage.web-core-lib/feed'; +import { CommonModule } from '@angular/common'; +import { MatExpansionModule } from '@angular/material/expansion'; +import { LayerContentComponent } from './layer-content.component'; +import { LayerHeaderComponent } from './layer-header.component'; export interface ReorderEvent { type: string; @@ -11,6 +15,13 @@ export interface ReorderEvent { @Component({ selector: 'map-layers-panel', + standalone: true, + imports: [ + CommonModule, + MatExpansionModule, + LayerHeaderComponent, + LayerContentComponent + ], templateUrl: './layers.component.html', styleUrls: ['./layers.component.scss'] }) diff --git a/web-app/src/app/map/map.component.ts b/web-app/src/app/map/map.component.ts index dbeb1d224..bde0de434 100644 --- a/web-app/src/app/map/map.component.ts +++ b/web-app/src/app/map/map.component.ts @@ -1,6 +1,6 @@ import { AfterViewInit, Component, ElementRef, EventEmitter, OnDestroy, Output, ViewChild } from '@angular/core' -import { LocationEvent, LocationState } from '../../app/map/controls/location.component' -import { ZoomDirection } from '../../app/map/controls/zoom.component' +import { LocationComponent, LocationEvent, LocationState } from '../../app/map/controls/location.component' +import { ZoomComponent, ZoomDirection } from '../../app/map/controls/zoom.component' import { LayerService } from '../layer/layer.service' import { MapLayerService, StyleEvent, ToggleEvent } from './layers/layer.service' import { MapService } from './map.service' @@ -8,7 +8,7 @@ import { LocalStorageService } from '../http/local-storage.service' import { EventService } from '../event/event.service' import { map, latLng, popup, tileLayer, Icon, Util, marker, TileLayer, geoJSON, latLngBounds, LatLng, markerClusterGroup, Layer, Map } from "leaflet" import { OpacityEvent, ZoomEvent } from './layers/layer.service' -import { ReorderEvent } from './layers/layers.component' +import { LayersComponent, ReorderEvent } from './layers/layers.component' import { moveItemInArray } from '@angular/cdk/drag-drop' import { locationMarker } from './marker/LocationMarker' import { observationMarker } from './marker/ObservationMarker' @@ -28,11 +28,31 @@ import _ from 'underscore' import moment from 'moment'; import { Subscription } from 'rxjs' import { ContactDialogComponent } from '../contact/contact-dialog.component' +import { CommonModule } from '@angular/common' +import { MatSidenavModule } from '@angular/material/sidenav' +import { AddObservationComponent } from './controls/add-observation.component' +import { ExportControlComponent } from './controls/export.component' +import { FilterControlComponent } from './controls/filter.component' +import { LayersControlComponent } from './controls/layers-control.component' +import { SearchComponent } from './controls/search.component' Icon.Default.imagePath = '/' @Component({ selector: 'map', + standalone: true, + imports: [ + CommonModule, + MatSidenavModule, + LayersControlComponent, + LayersComponent, + SearchComponent, + FilterControlComponent, + ExportControlComponent, + AddObservationComponent, + LocationComponent, + ZoomComponent + ], templateUrl: './map.component.html', styleUrls: ['./map.component.scss'], providers: [LayerService] diff --git a/web-app/src/app/map/map.service.spec.ts b/web-app/src/app/map/map.service.spec.ts index 98655fb2d..d12a193e0 100644 --- a/web-app/src/app/map/map.service.spec.ts +++ b/web-app/src/app/map/map.service.spec.ts @@ -1,14 +1,15 @@ import { TestBed } from '@angular/core/testing'; import { MapService } from './map.service'; -import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { provideHttpClientTesting } from '@angular/common/http/testing'; +import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; describe('Map Service Tests', () => { beforeEach(() => { TestBed.configureTestingModule({ - providers: [MapService], - imports: [HttpClientTestingModule] - }); + imports: [], + providers: [MapService, provideHttpClient(withInterceptorsFromDi()), provideHttpClientTesting()] +}); }); afterEach(() => { diff --git a/web-app/src/app/map/search/search.service.spec.ts b/web-app/src/app/map/search/search.service.spec.ts index a11eb2bac..3cd8dd7e0 100644 --- a/web-app/src/app/map/search/search.service.spec.ts +++ b/web-app/src/app/map/search/search.service.spec.ts @@ -1,9 +1,10 @@ import { TestBed, getTestBed } from '@angular/core/testing'; import { PlacenameSearchResult, PlacenameSearchService } from './search.service'; -import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; +import { HttpTestingController, provideHttpClientTesting } from '@angular/common/http/testing'; import { MapSettings, MobileSearchType, WebSearchType } from 'src/app/entities/map/entities.map'; import { FeatureCollection } from 'geojson'; +import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; describe('SearchService', () => { let injector: TestBed; @@ -12,8 +13,9 @@ describe('SearchService', () => { beforeEach(() => { TestBed.configureTestingModule({ - imports: [HttpClientTestingModule] - }); + imports: [], + providers: [provideHttpClient(withInterceptorsFromDi()), provideHttpClientTesting()] +}); injector = getTestBed(); service = injector.get(PlacenameSearchService); diff --git a/web-app/src/app/map/settings/map.settings.service.spec.ts b/web-app/src/app/map/settings/map.settings.service.spec.ts index 35af4e125..d60251f4c 100644 --- a/web-app/src/app/map/settings/map.settings.service.spec.ts +++ b/web-app/src/app/map/settings/map.settings.service.spec.ts @@ -1,14 +1,16 @@ import { TestBed } from '@angular/core/testing'; import { MapSettingsService } from './map.settings.service'; -import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { provideHttpClientTesting } from '@angular/common/http/testing'; +import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; describe('MapSettingsService', () => { beforeEach(() => { TestBed.configureTestingModule({ - imports: [HttpClientTestingModule] - }); + imports: [], + providers: [provideHttpClient(withInterceptorsFromDi()), provideHttpClientTesting()] +}); }); it('should be created', () => { diff --git a/web-app/src/app/moment/moment.module.ts b/web-app/src/app/moment/moment.module.ts index c644d567b..2f8866737 100644 --- a/web-app/src/app/moment/moment.module.ts +++ b/web-app/src/app/moment/moment.module.ts @@ -3,17 +3,8 @@ import { CommonModule } from '@angular/common'; import { MomentPipe } from './moment.pipe'; @NgModule({ - imports: [ - CommonModule - ], - declarations: [ - MomentPipe - ], - exports: [ - MomentPipe - ], - providers: [ - MomentPipe - ], + imports: [CommonModule, MomentPipe], + exports: [MomentPipe], + providers: [MomentPipe] }) -export class MomentModule { } +export class MomentModule {} diff --git a/web-app/src/app/navigation/navigation.component.spec.ts b/web-app/src/app/navigation/navigation.component.spec.ts index b7cc699a5..edc9a83a1 100644 --- a/web-app/src/app/navigation/navigation.component.spec.ts +++ b/web-app/src/app/navigation/navigation.component.spec.ts @@ -1,9 +1,12 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { NavigationComponent } from './navigation.component'; -import { HttpClientTestingModule } from '@angular/common/http/testing'; -import { MatIconModule } from '@angular/material/icon'; -import { MatMenuModule as MatMenuModule } from '@angular/material/menu'; -import { MatToolbarModule } from '@angular/material/toolbar'; +import { provideHttpClientTesting } from '@angular/common/http/testing'; +import { ActivatedRoute } from '@angular/router'; +import { RouterTestingModule } from '@angular/router/testing'; +import { + provideHttpClient, + withInterceptorsFromDi +} from '@angular/common/http'; describe('Navigation Component', () => { let component: NavigationComponent; @@ -11,12 +14,20 @@ describe('Navigation Component', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [NavigationComponent], - imports: [ - HttpClientTestingModule, - MatIconModule, - MatMenuModule, - MatToolbarModule + imports: [NavigationComponent, RouterTestingModule], + providers: [ + { + provide: ActivatedRoute, + useValue: { + snapshot: { + queryParamMap: { + get: () => null + } + } + } + }, + provideHttpClient(withInterceptorsFromDi()), + provideHttpClientTesting() ] }).compileComponents(); })); @@ -24,6 +35,7 @@ describe('Navigation Component', () => { beforeEach(() => { fixture = TestBed.createComponent(NavigationComponent); component = fixture.componentInstance; + fixture.detectChanges(); }); it('should create', () => { diff --git a/web-app/src/app/navigation/navigation.component.ts b/web-app/src/app/navigation/navigation.component.ts index 8bc6f1073..055c9de08 100644 --- a/web-app/src/app/navigation/navigation.component.ts +++ b/web-app/src/app/navigation/navigation.component.ts @@ -11,10 +11,22 @@ import { UserService } from '../user/user.service'; import { EventService } from '../event/event.service'; import { PollingService } from '../event/polling.service'; import * as _ from 'underscore'; -import { Router } from '@angular/router'; +import { Router, RouterModule } from '@angular/router'; +import { CommonModule } from '@angular/common'; +import { MatIconModule } from '@angular/material/icon'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatToolbarModule } from '@angular/material/toolbar'; @Component({ selector: 'navigation', + standalone: true, + imports: [ + CommonModule, + RouterModule, + MatToolbarModule, + MatIconModule, + MatMenuModule + ], templateUrl: './navigation.component.html', styleUrls: ['./navigation.component.scss'] }) diff --git a/web-app/src/app/observation/attachment/attachment-upload/attachment-upload.component.spec.ts b/web-app/src/app/observation/attachment/attachment-upload/attachment-upload.component.spec.ts index ff91dab9d..6ba5b680c 100644 --- a/web-app/src/app/observation/attachment/attachment-upload/attachment-upload.component.spec.ts +++ b/web-app/src/app/observation/attachment/attachment-upload/attachment-upload.component.spec.ts @@ -1,8 +1,9 @@ -import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { provideHttpClientTesting } from '@angular/common/http/testing'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { AttachUploadComponent } from './attachment-upload.component'; import { MatProgressSpinnerModule as MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; describe('AttachUploadComponent', () => { let component: AttachUploadComponent; @@ -10,9 +11,9 @@ describe('AttachUploadComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - imports: [HttpClientTestingModule, MatProgressSpinnerModule], - declarations: [AttachUploadComponent] - }) + imports: [MatProgressSpinnerModule, AttachUploadComponent], + providers: [provideHttpClient(withInterceptorsFromDi()), provideHttpClientTesting()] +}) .compileComponents(); })); diff --git a/web-app/src/app/observation/attachment/attachment-upload/attachment-upload.component.ts b/web-app/src/app/observation/attachment/attachment-upload/attachment-upload.component.ts index 08997dda1..3d5a60935 100644 --- a/web-app/src/app/observation/attachment/attachment-upload/attachment-upload.component.ts +++ b/web-app/src/app/observation/attachment/attachment-upload/attachment-upload.component.ts @@ -3,6 +3,11 @@ import { ChangeDetectorRef, Component, EventEmitter, Input, OnChanges, Output, S import { UntypedFormControl } from '@angular/forms'; import { AttachmentAction } from '../../observation-edit/observation-edit-attachment/observation-edit-attachment-action'; import { AttachmentService } from '../attachment.service'; +import { CommonModule } from '@angular/common'; +import { MatIconModule } from '@angular/material/icon'; +import { MatProgressBarModule } from '@angular/material/progress-bar'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { FilenamePipe } from 'mage-web-app/filename/filename.pipe'; export interface FileUpload { id: number | string, @@ -22,6 +27,14 @@ enum PreviewType { @Component({ selector: 'attachment-upload', + standalone: true, + imports: [ + CommonModule, + MatProgressSpinnerModule, + MatIconModule, + MatProgressBarModule, + FilenamePipe + ], templateUrl: './attachment-upload.component.html', styleUrls: ['./attachment-upload.component.scss'] }) diff --git a/web-app/src/app/observation/attachment/attachment.component.spec.ts b/web-app/src/app/observation/attachment/attachment.component.spec.ts index 3b6e79bc3..f80adad1c 100644 --- a/web-app/src/app/observation/attachment/attachment.component.spec.ts +++ b/web-app/src/app/observation/attachment/attachment.component.spec.ts @@ -9,7 +9,7 @@ describe('AttachmentComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ AttachmentComponent ] + imports: [ AttachmentComponent ] }) .compileComponents(); })); diff --git a/web-app/src/app/observation/attachment/attachment.component.ts b/web-app/src/app/observation/attachment/attachment.component.ts index 22bbd940e..6cf0b8247 100644 --- a/web-app/src/app/observation/attachment/attachment.component.ts +++ b/web-app/src/app/observation/attachment/attachment.component.ts @@ -2,9 +2,20 @@ import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; import { AttachmentAction } from '../observation-edit/observation-edit-attachment/observation-edit-attachment-action'; import { LocalStorageService } from '../../http/local-storage.service'; import { UserService } from '../../user/user.service'; +import { CommonModule } from '@angular/common'; +import { MatChipsModule } from '@angular/material/chips'; +import { MatIconModule } from '@angular/material/icon'; +import { FilenamePipe } from 'mage-web-app/filename/filename.pipe'; @Component({ selector: 'observation-attachment', + standalone: true, + imports: [ + CommonModule, + MatChipsModule, + MatIconModule, + FilenamePipe + ], templateUrl: './attachment.component.html', styleUrls: ['./attachment.component.scss'] }) diff --git a/web-app/src/app/observation/attachment/attachment.service.spec.ts b/web-app/src/app/observation/attachment/attachment.service.spec.ts index a583e1973..1ba9325ea 100644 --- a/web-app/src/app/observation/attachment/attachment.service.spec.ts +++ b/web-app/src/app/observation/attachment/attachment.service.spec.ts @@ -1,15 +1,17 @@ -import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { provideHttpClientTesting } from '@angular/common/http/testing'; import { TestBed } from '@angular/core/testing'; import { AttachmentService } from './attachment.service'; +import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; describe('AttachmentService', () => { beforeEach(() => TestBed.configureTestingModule({})); beforeEach(() => { TestBed.configureTestingModule({ - imports: [HttpClientTestingModule] - }); + imports: [], + providers: [provideHttpClient(withInterceptorsFromDi()), provideHttpClientTesting()] +}); }); it('should be created', () => { diff --git a/web-app/src/app/observation/observation-delete/observation-delete.component.scss b/web-app/src/app/observation/observation-delete/observation-delete.component.scss index 06b3e8471..32b472dd5 100644 --- a/web-app/src/app/observation/observation-delete/observation-delete.component.scss +++ b/web-app/src/app/observation/observation-delete/observation-delete.component.scss @@ -2,7 +2,7 @@ @import "variables.scss"; .mat-dialog-title { - color: mat.get-color-from-palette($app-primary); + color: mat.m2-get-color-from-palette($app-primary); } .observation { diff --git a/web-app/src/app/observation/observation-delete/observation-delete.component.ts b/web-app/src/app/observation/observation-delete/observation-delete.component.ts index 651e2c0c5..5827047da 100644 --- a/web-app/src/app/observation/observation-delete/observation-delete.component.ts +++ b/web-app/src/app/observation/observation-delete/observation-delete.component.ts @@ -1,6 +1,8 @@ import { Component, Inject } from '@angular/core' import { MatDialogRef as MatDialogRef, MAT_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/dialog'; import { EventService } from '../../event/event.service'; +import { CommonModule } from '@angular/common'; +import { ObservationListItemComponent } from '../observation-list/observation-list-item.component'; export interface Observation { id: string; @@ -9,6 +11,11 @@ export interface Observation { @Component({ selector: 'observation-delete', + standalone: true, + imports: [ + CommonModule, + ObservationListItemComponent + ], templateUrl: './observation-delete.component.html', styleUrls: ['./observation-delete.component.scss'] }) diff --git a/web-app/src/app/observation/observation-edit/observation-edit-attachment/observation-edit-attachment.component.spec.ts b/web-app/src/app/observation/observation-edit/observation-edit-attachment/observation-edit-attachment.component.spec.ts index 336930749..c90d27110 100644 --- a/web-app/src/app/observation/observation-edit/observation-edit-attachment/observation-edit-attachment.component.spec.ts +++ b/web-app/src/app/observation/observation-edit/observation-edit-attachment/observation-edit-attachment.component.spec.ts @@ -1,46 +1,67 @@ import { Component, ViewChild } from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { UntypedFormControl, UntypedFormGroup } from '@angular/forms'; +import { provideHttpClientTesting } from '@angular/common/http/testing'; +import { MatIconModule } from '@angular/material/icon'; +import { + provideHttpClient, + withInterceptorsFromDi +} from '@angular/common/http'; import { ObservationEditAttachmentComponent } from './observation-edit-attachment.component'; -import { MatIconModule } from '@angular/material/icon'; @Component({ - selector: `host-component`, - template: `` + standalone: true, + imports: [ObservationEditAttachmentComponent], + template: ` + + ` }) class TestHostComponent { - attachments = [] + attachments = []; + formGroup = new UntypedFormGroup({ attachment: new UntypedFormControl([]) }); + definition = { name: 'attachment' - } - @ViewChild(ObservationEditAttachmentComponent) component: ObservationEditAttachmentComponent + }; + + @ViewChild(ObservationEditAttachmentComponent) + component: ObservationEditAttachmentComponent; } describe('ObservationEditAttachmentComponent', () => { - let component: ObservationEditAttachmentComponent - let hostComponent: TestHostComponent - let fixture: ComponentFixture + let component: ObservationEditAttachmentComponent; + let hostComponent: TestHostComponent; + let fixture: ComponentFixture; beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ObservationEditAttachmentComponent, TestHostComponent], - imports: [MatIconModule] - }) - .compileComponents(); + imports: [ + TestHostComponent, + MatIconModule + ], + providers: [ + provideHttpClient(withInterceptorsFromDi()), + provideHttpClientTesting() + ] + }).compileComponents(); })); beforeEach(() => { - fixture = TestBed.createComponent(TestHostComponent) - hostComponent = fixture.componentInstance + fixture = TestBed.createComponent(TestHostComponent); + hostComponent = fixture.componentInstance; fixture.detectChanges(); - component = hostComponent.component - }) + component = hostComponent.component; + }); it('should create', () => { expect(component).toBeTruthy(); }); -}); +}); \ No newline at end of file diff --git a/web-app/src/app/observation/observation-edit/observation-edit-attachment/observation-edit-attachment.component.ts b/web-app/src/app/observation/observation-edit/observation-edit-attachment/observation-edit-attachment.component.ts index acc457253..e0515b74f 100644 --- a/web-app/src/app/observation/observation-edit/observation-edit-attachment/observation-edit-attachment.component.ts +++ b/web-app/src/app/observation/observation-edit/observation-edit-attachment/observation-edit-attachment.component.ts @@ -1,6 +1,11 @@ import { ChangeDetectorRef, Component, Input, OnInit } from '@angular/core'; import { UntypedFormControl, UntypedFormGroup } from '@angular/forms'; import { AttachmentAction } from './observation-edit-attachment-action'; +import { CommonModule } from '@angular/common'; +import { MatGridListModule } from '@angular/material/grid-list'; +import { MatIconModule } from '@angular/material/icon'; +import { AttachUploadComponent } from 'mage-web-app/observation/attachment/attachment-upload/attachment-upload.component'; +import { AttachmentComponent } from 'mage-web-app/observation/attachment/attachment.component'; interface AttachmentField { title: string, @@ -12,6 +17,14 @@ interface AttachmentField { @Component({ selector: 'observation-edit-attachment', + standalone: true, + imports: [ + CommonModule, + MatGridListModule, + MatIconModule, + AttachmentComponent, + AttachUploadComponent + ], templateUrl: './observation-edit-attachment.component.html', styleUrls: ['./observation-edit-attachment.component.scss'] }) diff --git a/web-app/src/app/observation/observation-edit/observation-edit-checkbox/observation-edit-checkbox.component.spec.ts b/web-app/src/app/observation/observation-edit/observation-edit-checkbox/observation-edit-checkbox.component.spec.ts index 979b3e209..19e0d892a 100644 --- a/web-app/src/app/observation/observation-edit/observation-edit-checkbox/observation-edit-checkbox.component.spec.ts +++ b/web-app/src/app/observation/observation-edit/observation-edit-checkbox/observation-edit-checkbox.component.spec.ts @@ -16,11 +16,14 @@ import { MatCheckboxHarness } from '@angular/material/checkbox/testing'; import { ObservationEditCheckboxComponent } from './observation-edit-checkbox.component'; @Component({ - selector: `host-component`, - template: `` + standalone: true, + imports: [ObservationEditCheckboxComponent], + template: ` + + ` }) class TestHostComponent { formGroup = new UntypedFormGroup({ @@ -51,9 +54,10 @@ describe('ObservationEditCheckboxComponent', () => { FormsModule, ReactiveFormsModule, MatFormFieldModule, - MatCheckboxModule + MatCheckboxModule, + ObservationEditCheckboxComponent, + TestHostComponent ], - declarations: [ObservationEditCheckboxComponent, TestHostComponent] }).compileComponents(); })); diff --git a/web-app/src/app/observation/observation-edit/observation-edit-checkbox/observation-edit-checkbox.component.ts b/web-app/src/app/observation/observation-edit/observation-edit-checkbox/observation-edit-checkbox.component.ts index 8d81181d9..67aaea764 100644 --- a/web-app/src/app/observation/observation-edit/observation-edit-checkbox/observation-edit-checkbox.component.ts +++ b/web-app/src/app/observation/observation-edit/observation-edit-checkbox/observation-edit-checkbox.component.ts @@ -1,6 +1,8 @@ +import { CommonModule } from '@angular/common'; import { Component, Input, OnInit } from '@angular/core'; -import { UntypedFormControl, UntypedFormGroup } from '@angular/forms'; -import { MatCheckboxChange as MatCheckboxChange } from '@angular/material/checkbox'; +import { ReactiveFormsModule, UntypedFormControl, UntypedFormGroup } from '@angular/forms'; +import { MatCheckboxChange as MatCheckboxChange, MatCheckboxModule } from '@angular/material/checkbox'; +import { MatFormFieldModule } from '@angular/material/form-field'; interface CheckboxField { title: string, @@ -11,6 +13,13 @@ interface CheckboxField { @Component({ selector: 'observation-edit-checkbox', + standalone: true, + imports: [ + CommonModule, + ReactiveFormsModule, + MatCheckboxModule, + MatFormFieldModule + ], templateUrl: './observation-edit-checkbox.component.html', styleUrls: ['./observation-edit-checkbox.component.scss'] }) diff --git a/web-app/src/app/observation/observation-edit/observation-edit-date/observation-edit-date.component.ts b/web-app/src/app/observation/observation-edit/observation-edit-date/observation-edit-date.component.ts index 3b30a83c6..04f128232 100644 --- a/web-app/src/app/observation/observation-edit/observation-edit-date/observation-edit-date.component.ts +++ b/web-app/src/app/observation/observation-edit/observation-edit-date/observation-edit-date.component.ts @@ -5,12 +5,26 @@ import { SimpleChanges, ViewChild } from '@angular/core'; -import { UntypedFormGroup, NgModel } from '@angular/forms'; +import { UntypedFormGroup, NgModel, FormsModule } from '@angular/forms'; import moment from 'moment'; import { LocalStorageService } from '../../../http/local-storage.service'; +import { CommonModule } from '@angular/common'; +import { MatNativeDateModule } from '@angular/material/core'; +import { MatDatepickerModule } from '@angular/material/datepicker'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; @Component({ selector: 'observation-edit-date', + standalone: true, + imports: [ + CommonModule, + FormsModule, + MatFormFieldModule, + MatInputModule, + MatDatepickerModule, + MatNativeDateModule + ], templateUrl: './observation-edit-date.component.html', styleUrls: ['./observation-edit-date.component.scss'] }) diff --git a/web-app/src/app/observation/observation-edit/observation-edit-discard/observation-edit-discard.component.spec.ts b/web-app/src/app/observation/observation-edit/observation-edit-discard/observation-edit-discard.component.spec.ts index 59c25963d..6e5cf21a6 100644 --- a/web-app/src/app/observation/observation-edit/observation-edit-discard/observation-edit-discard.component.spec.ts +++ b/web-app/src/app/observation/observation-edit/observation-edit-discard/observation-edit-discard.component.spec.ts @@ -9,8 +9,7 @@ describe('ObservationEditDiscardComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - imports: [MatDialogModule], - declarations: [ObservationEditDiscardComponent], + imports: [MatDialogModule, ObservationEditDiscardComponent], providers: [{ provide: MatDialogRef, useValue: {} }, { diff --git a/web-app/src/app/observation/observation-edit/observation-edit-email/observation-edit-email.component.spec.ts b/web-app/src/app/observation/observation-edit/observation-edit-email/observation-edit-email.component.spec.ts index a232af929..aad5bf922 100644 --- a/web-app/src/app/observation/observation-edit/observation-edit-email/observation-edit-email.component.spec.ts +++ b/web-app/src/app/observation/observation-edit/observation-edit-email/observation-edit-email.component.spec.ts @@ -1,7 +1,16 @@ import { ChangeDetectionStrategy, Component, ViewChild } from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { UntypedFormControl, UntypedFormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms'; -import { MatError as MatError, MatFormFieldModule as MatFormFieldModule } from '@angular/material/form-field'; +import { + UntypedFormControl, + UntypedFormGroup, + FormsModule, + ReactiveFormsModule, + Validators +} from '@angular/forms'; +import { + MatError as MatError, + MatFormFieldModule as MatFormFieldModule +} from '@angular/material/form-field'; import { MatInputModule as MatInputModule } from '@angular/material/input'; import { By } from '@angular/platform-browser'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; @@ -9,103 +18,115 @@ import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { ObservationEditEmailComponent } from './observation-edit-email.component'; @Component({ - selector: `host-component`, - template: ``, - changeDetection: ChangeDetectionStrategy.OnPush + standalone: true, + imports: [ObservationEditEmailComponent], + template: ` + + ` }) class TestHostComponent { formGroup = new UntypedFormGroup({ text: new UntypedFormControl('') - }) + }); definition: any = { name: 'text', title: 'Email Field' - } + }; - @ViewChild(ObservationEditEmailComponent) component: ObservationEditEmailComponent + @ViewChild(ObservationEditEmailComponent) + component: ObservationEditEmailComponent; } describe('ObservationEditEmailComponent', () => { - let component: ObservationEditEmailComponent - let hostComponent: TestHostComponent - let fixture: ComponentFixture + let component: ObservationEditEmailComponent; + let hostComponent: TestHostComponent; + let fixture: ComponentFixture; beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - imports: [FormsModule, ReactiveFormsModule, MatFormFieldModule, MatInputModule, NoopAnimationsModule], - declarations: [ObservationEditEmailComponent, TestHostComponent] - }) - .compileComponents() - })) + imports: [ + FormsModule, + ReactiveFormsModule, + MatFormFieldModule, + MatInputModule, + NoopAnimationsModule, + ObservationEditEmailComponent, + TestHostComponent + ], + }).compileComponents(); + })); beforeEach(() => { - fixture = TestBed.createComponent(TestHostComponent) - hostComponent = fixture.componentInstance + fixture = TestBed.createComponent(TestHostComponent); + hostComponent = fixture.componentInstance; fixture.detectChanges(); - component = hostComponent.component - }) + component = hostComponent.component; + }); it('should create', () => { - expect(component).toBeTruthy() - }) + expect(component).toBeTruthy(); + }); it('should not indicate required', async () => { - component.definition.required = false + component.definition.required = false; - const control = component.formGroup.get('text') - control.clearValidators() - control.updateValueAndValidity() + const control = component.formGroup.get('text'); + control.clearValidators(); + control.updateValueAndValidity(); - fixture.detectChanges() - await fixture.whenStable() + fixture.detectChanges(); + await fixture.whenStable(); - expect(control.valid).toBe(true) - const error = fixture.debugElement.query(By.directive(MatError)) - expect(error).toBeNull() - }) + expect(control.valid).toBe(true); + const error = fixture.debugElement.query(By.directive(MatError)); + expect(error).toBeNull(); + }); it('should indicate required', async () => { - component.definition.required = true + component.definition.required = true; - const control = component.formGroup.get('text') - control.setValidators(Validators.required) - control.updateValueAndValidity() + const control = component.formGroup.get('text'); + control.setValidators(Validators.required); + control.updateValueAndValidity(); - fixture.detectChanges() - await fixture.whenStable() + fixture.detectChanges(); + await fixture.whenStable(); - expect(control.valid).toBe(false) - }) + expect(control.valid).toBe(false); + }); it('should show error on invalid and touched', async () => { - component.definition.required = true + component.definition.required = true; - const control = component.formGroup.get('text') - control.setValidators(Validators.required) - control.updateValueAndValidity() - control.markAsTouched() + const control = component.formGroup.get('text'); + control.setValidators(Validators.required); + control.updateValueAndValidity(); + control.markAsTouched(); - fixture.detectChanges() - await fixture.whenStable() + fixture.detectChanges(); + await fixture.whenStable(); - expect(control.valid).toBe(false) - const error = fixture.debugElement.query(By.directive(MatError)) - expect(error.nativeElement.innerText).toBe('You must enter a value') - }) + expect(control.valid).toBe(false); + const error = fixture.debugElement.query(By.directive(MatError)); + expect(error.nativeElement.innerText).toBe('You must enter a value'); + }); it('should not show error on invalid if not touched', async () => { - component.definition.required = true + component.definition.required = true; - const control = component.formGroup.get('text') - control.setValidators(Validators.required) - control.updateValueAndValidity() + const control = component.formGroup.get('text'); + control.setValidators(Validators.required); + control.updateValueAndValidity(); - fixture.detectChanges() - await fixture.whenStable() + fixture.detectChanges(); + await fixture.whenStable(); - expect(control.valid).toBe(false) - const error = fixture.debugElement.query(By.directive(MatError)) - expect(error).toBeNull() - }) + expect(control.valid).toBe(false); + const error = fixture.debugElement.query(By.directive(MatError)); + expect(error).toBeNull(); + }); }); diff --git a/web-app/src/app/observation/observation-edit/observation-edit-email/observation-edit-email.component.ts b/web-app/src/app/observation/observation-edit/observation-edit-email/observation-edit-email.component.ts index 8ef85a52b..103304dce 100644 --- a/web-app/src/app/observation/observation-edit/observation-edit-email/observation-edit-email.component.ts +++ b/web-app/src/app/observation/observation-edit/observation-edit-email/observation-edit-email.component.ts @@ -1,5 +1,8 @@ +import { CommonModule } from '@angular/common'; import { Component, Input } from '@angular/core'; -import { UntypedFormGroup } from '@angular/forms'; +import { ReactiveFormsModule, UntypedFormGroup } from '@angular/forms'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; interface EmailField { title: string, @@ -10,6 +13,13 @@ interface EmailField { @Component({ selector: 'observation-edit-email', + standalone: true, + imports: [ + CommonModule, + ReactiveFormsModule, + MatFormFieldModule, + MatInputModule + ], templateUrl: './observation-edit-email.component.html', styleUrls: ['./observation-edit-email.component.scss'] }) diff --git a/web-app/src/app/observation/observation-edit/observation-edit-form-picker.component.spec.ts b/web-app/src/app/observation/observation-edit/observation-edit-form-picker.component.spec.ts index 1920f762a..66269ec32 100644 --- a/web-app/src/app/observation/observation-edit/observation-edit-form-picker.component.spec.ts +++ b/web-app/src/app/observation/observation-edit/observation-edit-form-picker.component.spec.ts @@ -25,7 +25,6 @@ describe('ObservationEditFormPickerComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ ObservationEditFormPickerComponent ], providers: [{ provide: FilterService, useClass: MockFilterService @@ -36,7 +35,7 @@ describe('ObservationEditFormPickerComponent', () => { provide: MatBottomSheetRef, useValue: {} }], - imports: [MatListModule, MatDividerModule] + imports: [MatListModule, MatDividerModule, ObservationEditFormPickerComponent] }) .compileComponents(); })); diff --git a/web-app/src/app/observation/observation-edit/observation-edit-form-picker.component.ts b/web-app/src/app/observation/observation-edit/observation-edit-form-picker.component.ts index c04b45d75..189ab6bd8 100644 --- a/web-app/src/app/observation/observation-edit/observation-edit-form-picker.component.ts +++ b/web-app/src/app/observation/observation-edit/observation-edit-form-picker.component.ts @@ -2,9 +2,20 @@ import { Component } from '@angular/core'; import { MatBottomSheetRef } from '@angular/material/bottom-sheet'; import { EventService } from '../../event/event.service'; import { FilterService } from '../../filter/filter.service'; +import { CommonModule } from '@angular/common'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatIconModule } from '@angular/material/icon'; +import { MatListModule } from '@angular/material/list'; @Component({ selector: 'app-observation-edit-form-picker', + standalone: true, + imports: [ + CommonModule, + MatDividerModule, + MatListModule, + MatIconModule + ], templateUrl: './observation-edit-form-picker.component.html', styleUrls: ['./observation-edit-form-picker.component.scss'] }) diff --git a/web-app/src/app/observation/observation-edit/observation-edit-form.component.spec.ts b/web-app/src/app/observation/observation-edit/observation-edit-form.component.spec.ts index 049ac38f0..b6f0dc2c6 100644 --- a/web-app/src/app/observation/observation-edit/observation-edit-form.component.spec.ts +++ b/web-app/src/app/observation/observation-edit/observation-edit-form.component.spec.ts @@ -10,13 +10,16 @@ import { MatListModule as MatListModule } from '@angular/material/list'; import { MapClipComponent } from 'src/app/map/clip/clip.component'; @Component({ - selector: `host-component`, - template: `` + standalone: true, + imports: [ObservationEditFormComponent], + template: ` + + ` }) class TestHostComponent { formGroup = new UntypedFormGroup({}); @@ -40,8 +43,15 @@ describe('ObservationEditFormComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - imports: [NoopAnimationsModule, MatIconModule, MatCardModule, MatListModule ], - declarations: [ObservationEditFormComponent, TestHostComponent, MapClipComponent] + imports: [ + NoopAnimationsModule, + MatIconModule, + MatCardModule, + MatListModule, + ObservationEditFormComponent, + TestHostComponent, + MapClipComponent + ], }).compileComponents(); })); diff --git a/web-app/src/app/observation/observation-edit/observation-edit-form.component.ts b/web-app/src/app/observation/observation-edit/observation-edit-form.component.ts index 724e036ec..09e7bbc42 100644 --- a/web-app/src/app/observation/observation-edit/observation-edit-form.component.ts +++ b/web-app/src/app/observation/observation-edit/observation-edit-form.component.ts @@ -1,9 +1,37 @@ import { animate, state, style, transition, trigger } from '@angular/animations' +import { CommonModule } from '@angular/common' import { Component, EventEmitter, Input, Output } from '@angular/core' import { UntypedFormGroup } from '@angular/forms' +import { MatCardModule } from '@angular/material/card' +import { MatDividerModule } from '@angular/material/divider' +import { MatIconModule } from '@angular/material/icon' +import { GeometryModule } from 'mage-web-app/geometry/geometry.module' +import { ObservationEditCheckboxComponent, ObservationEditDateComponent, ObservationEditSelectComponent, ObservationEditMultiselectComponent, ObservationEditEmailComponent, ObservationEditNumberComponent, ObservationEditRadioComponent, ObservationEditTextComponent, ObservationEditTextareaComponent, ObservationEditGeometryComponent } from './observation-edit' +import { ObservationEditAttachmentComponent } from './observation-edit-attachment/observation-edit-attachment.component' +import { ObservationEditPasswordComponent } from './observation-edit-password/observation-edit-password.component' @Component({ selector: 'observation-edit-form', + standalone: true, + imports: [ + CommonModule, + MatCardModule, + MatIconModule, + MatDividerModule, + GeometryModule, + ObservationEditAttachmentComponent, + ObservationEditCheckboxComponent, + ObservationEditDateComponent, + ObservationEditSelectComponent, + ObservationEditMultiselectComponent, + ObservationEditEmailComponent, + ObservationEditNumberComponent, + ObservationEditRadioComponent, + ObservationEditTextComponent, + ObservationEditTextareaComponent, + ObservationEditPasswordComponent, + ObservationEditGeometryComponent + ], templateUrl: './observation-edit-form.component.html', styleUrls: ['./observation-edit-form.component.scss'], animations: [ diff --git a/web-app/src/app/observation/observation-edit/observation-edit-geometry/observation-edit-geometry-form.component.ts b/web-app/src/app/observation/observation-edit/observation-edit-geometry/observation-edit-geometry-form.component.ts index 7f21087c7..2f75ff16c 100644 --- a/web-app/src/app/observation/observation-edit/observation-edit-geometry/observation-edit-geometry-form.component.ts +++ b/web-app/src/app/observation/observation-edit/observation-edit-geometry/observation-edit-geometry-form.component.ts @@ -1,13 +1,17 @@ import { Component, Directive, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges, ViewChild, ViewContainerRef } from '@angular/core' -import { AbstractControl, FormControl, FormGroup, NgModel, NG_VALIDATORS, ValidationErrors, Validator } from '@angular/forms' +import { AbstractControl, FormControl, FormGroup, NgModel, NG_VALIDATORS, ValidationErrors, Validator, FormsModule, ReactiveFormsModule } from '@angular/forms' import { MatSnackBar as MatSnackBar } from '@angular/material/snack-bar' import mgrs from 'mgrs' import { Dimension, DimensionKey, DMSCoordinate, DMSParseError } from 'src/app/geometry/geometry-dms' import * as DMS from 'src/app/geometry/geometry-dms' -import { createMask } from '@ngneat/input-mask' +import { createMask, InputMaskModule } from '@ngneat/input-mask' import { LocalStorageService } from '../../../http/local-storage.service' import { MapService } from '../../../map/map.service' import { GeometryService } from '../../../geometry/geometry.service' +import { CommonModule } from '@angular/common' +import { MatChipsModule } from '@angular/material/chips' +import { MatFormFieldModule } from '@angular/material/form-field' +import { MatInputModule } from '@angular/material/input' @Directive({ selector: '[mgrs][formControlName],[mgrs][formControl],[mgrs][ngModel]', @@ -59,6 +63,16 @@ type DMSFormValue = Partial<{ [DimensionKey.Latitude]: string, [DimensionKey.Lon @Component({ selector: 'observation-edit-geometry-form', + standalone: true, + imports: [ + CommonModule, + FormsModule, + ReactiveFormsModule, + MatChipsModule, + MatFormFieldModule, + MatInputModule, + InputMaskModule + ], templateUrl: './observation-edit-geometry-form.component.html', styleUrls: ['./observation-edit-geometry-form.component.scss'], providers: [ diff --git a/web-app/src/app/observation/observation-edit/observation-edit-geometry/observation-edit-geometry-map.component.spec.ts b/web-app/src/app/observation/observation-edit/observation-edit-geometry/observation-edit-geometry-map.component.spec.ts index 21d4f1cd7..a90fcb806 100644 --- a/web-app/src/app/observation/observation-edit/observation-edit-geometry/observation-edit-geometry-map.component.spec.ts +++ b/web-app/src/app/observation/observation-edit/observation-edit-geometry/observation-edit-geometry-map.component.spec.ts @@ -1,29 +1,21 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; - import { ObservationEditGeometryMapComponent } from './observation-edit-geometry-map.component'; -import { MatIconModule } from '@angular/material/icon'; -import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; describe('ObservationEditGeometryMapComponent', () => { let component: ObservationEditGeometryMapComponent; - let fixture: ComponentFixture; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - declarations: [ObservationEditGeometryMapComponent], - imports: [MatIconModule], - schemas: [CUSTOM_ELEMENTS_SCHEMA] - }) - .compileComponents(); - })); beforeEach(() => { - fixture = TestBed.createComponent(ObservationEditGeometryMapComponent); - component = fixture.componentInstance; - fixture.detectChanges(); + component = new ObservationEditGeometryMapComponent(); }); it('should create', () => { expect(component).toBeTruthy(); }); -}); + + it('should emit edit event', () => { + spyOn(component.onEdit, 'emit'); + + component.edit(); + + expect(component.onEdit.emit).toHaveBeenCalled(); + }); +}); \ No newline at end of file diff --git a/web-app/src/app/observation/observation-edit/observation-edit-geometry/observation-edit-geometry-map.component.ts b/web-app/src/app/observation/observation-edit/observation-edit-geometry/observation-edit-geometry-map.component.ts index 3d8376ace..bd40b7c84 100644 --- a/web-app/src/app/observation/observation-edit/observation-edit-geometry/observation-edit-geometry-map.component.ts +++ b/web-app/src/app/observation/observation-edit/observation-edit-geometry/observation-edit-geometry-map.component.ts @@ -1,7 +1,16 @@ +import { CommonModule } from '@angular/common'; import { Component, EventEmitter, Input, Output } from '@angular/core'; +import { MatIconModule } from '@angular/material/icon'; +import { MapClipComponent } from 'mage-web-app/map/clip/clip.component'; @Component({ selector: 'observation-edit-geometry-map', + standalone: true, + imports: [ + CommonModule, + MatIconModule, + MapClipComponent + ], templateUrl: './observation-edit-geometry-map.component.html', styleUrls: ['./observation-edit-geometry-map.component.scss'] }) diff --git a/web-app/src/app/observation/observation-edit/observation-edit-geometry/observation-edit-geometry.component.scss b/web-app/src/app/observation/observation-edit/observation-edit-geometry/observation-edit-geometry.component.scss index 42a14da52..a694f84c2 100644 --- a/web-app/src/app/observation/observation-edit/observation-edit-geometry/observation-edit-geometry.component.scss +++ b/web-app/src/app/observation/observation-edit/observation-edit-geometry/observation-edit-geometry.component.scss @@ -26,7 +26,7 @@ } .geometry-field__label--active { - color: mat.get-color-from-palette($app-primary); + color: mat.m2-get-color-from-palette($app-primary); } .geometry-panel { diff --git a/web-app/src/app/observation/observation-edit/observation-edit-geometry/observation-edit-geometry.component.ts b/web-app/src/app/observation/observation-edit/observation-edit-geometry/observation-edit-geometry.component.ts index e4d375a5e..75f95d43e 100644 --- a/web-app/src/app/observation/observation-edit/observation-edit-geometry/observation-edit-geometry.component.ts +++ b/web-app/src/app/observation/observation-edit/observation-edit-geometry/observation-edit-geometry.component.ts @@ -1,10 +1,21 @@ import { Component, ElementRef, EventEmitter, Input, OnChanges, Output, SimpleChanges, ViewChild } from '@angular/core' -import { UntypedFormGroup } from '@angular/forms' +import { FormsModule, ReactiveFormsModule, UntypedFormGroup } from '@angular/forms' import { Feature, Geometry } from 'geojson' import { LocalStorageService } from '../../../http/local-storage.service' +import { CommonModule } from '@angular/common' +import { GeometryModule } from 'mage-web-app/geometry/geometry.module' +import { ObservationEditGeometryFormComponent } from './observation-edit-geometry-form.component' +import { ObservationEditGeometryMapComponent } from './observation-edit-geometry-map.component' @Component({ selector: 'observation-edit-geometry', + standalone: true, + imports: [ + CommonModule, + GeometryModule, + ObservationEditGeometryMapComponent, + ObservationEditGeometryFormComponent + ], templateUrl: './observation-edit-geometry.component.html', styleUrls: ['./observation-edit-geometry.component.scss'] }) diff --git a/web-app/src/app/observation/observation-edit/observation-edit-multiselect/observation-edit-multiselect.component.spec.ts b/web-app/src/app/observation/observation-edit/observation-edit-multiselect/observation-edit-multiselect.component.spec.ts index f05a1926d..0ea4f1c78 100644 --- a/web-app/src/app/observation/observation-edit/observation-edit-multiselect/observation-edit-multiselect.component.spec.ts +++ b/web-app/src/app/observation/observation-edit/observation-edit-multiselect/observation-edit-multiselect.component.spec.ts @@ -1,202 +1,238 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' -import { ChangeDetectionStrategy, Component, CUSTOM_ELEMENTS_SCHEMA, ViewChild } from '@angular/core' - -import { ObservationEditMultiselectComponent } from './observation-edit-multiselect.component' +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { + ChangeDetectionStrategy, + Component, + CUSTOM_ELEMENTS_SCHEMA, + ViewChild +} from '@angular/core'; + +import { ObservationEditMultiselectComponent } from './observation-edit-multiselect.component'; import { MatAutocompleteModule as MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatChipsModule as MatChipsModule, MatChipInputEvent as MatChipInputEvent, MatChipInput as MatChipInput } from '@angular/material/chips'; -import { MatFormFieldModule as MatFormFieldModule, MatError as MatError } from '@angular/material/form-field'; +import { + MatChipsModule as MatChipsModule, + MatChipInputEvent as MatChipInputEvent, + MatChipInput as MatChipInput +} from '@angular/material/chips'; +import { + MatFormFieldModule as MatFormFieldModule, + MatError as MatError +} from '@angular/material/form-field'; import { MatIconModule } from '@angular/material/icon'; import { MatInputModule as MatInputModule } from '@angular/material/input'; -import { UntypedFormControl, UntypedFormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms' -import { BrowserAnimationsModule } from '@angular/platform-browser/animations' -import { By } from '@angular/platform-browser' +import { + UntypedFormControl, + UntypedFormGroup, + FormsModule, + ReactiveFormsModule, + Validators +} from '@angular/forms'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { By } from '@angular/platform-browser'; @Component({ - selector: `host-component`, - template: ``, - changeDetection: ChangeDetectionStrategy.OnPush + standalone: true, + imports: [ObservationEditMultiselectComponent], + template: ` + + ` }) class TestHostComponent { formGroup = new UntypedFormGroup({ select: new UntypedFormControl() - }) + }); definition: any = { name: 'select', required: false, title: 'Colors', - choices: [{ - title: 'red' - }, { - title: 'green' - }, { - title: 'blue' - }] - } - - @ViewChild(ObservationEditMultiselectComponent) component: ObservationEditMultiselectComponent + choices: [ + { + title: 'red' + }, + { + title: 'green' + }, + { + title: 'blue' + } + ] + }; + + @ViewChild(ObservationEditMultiselectComponent) + component: ObservationEditMultiselectComponent; } describe('ObservationEditMultiselectComponent', () => { - let component: ObservationEditMultiselectComponent - let hostComponent: TestHostComponent - let fixture: ComponentFixture - let chipInput: MatChipInput + let component: ObservationEditMultiselectComponent; + let hostComponent: TestHostComponent; + let fixture: ComponentFixture; + let chipInput: MatChipInput; beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - imports: [FormsModule, BrowserAnimationsModule, ReactiveFormsModule, MatInputModule, MatAutocompleteModule, MatChipsModule, MatIconModule, MatFormFieldModule], - declarations: [ObservationEditMultiselectComponent, TestHostComponent], + imports: [ + FormsModule, + BrowserAnimationsModule, + ReactiveFormsModule, + MatInputModule, + MatAutocompleteModule, + MatChipsModule, + MatIconModule, + MatFormFieldModule, + ObservationEditMultiselectComponent, + TestHostComponent + ], schemas: [CUSTOM_ELEMENTS_SCHEMA] - }) - .compileComponents() + }).compileComponents(); })); - beforeEach(() => { - fixture = TestBed.createComponent(TestHostComponent) - hostComponent = fixture.componentInstance + fixture = TestBed.createComponent(TestHostComponent); + hostComponent = fixture.componentInstance; fixture.detectChanges(); - component = hostComponent.component - }) + component = hostComponent.component; + }); it('should create', () => { - expect(component).toBeTruthy() - }) + expect(component).toBeTruthy(); + }); it('should not indicate required', async () => { - component.definition.required = false + component.definition.required = false; - const control = component.formGroup.get('select') - control.clearValidators() - control.updateValueAndValidity() + const control = component.formGroup.get('select'); + control.clearValidators(); + control.updateValueAndValidity(); - fixture.detectChanges() - await fixture.whenStable() + fixture.detectChanges(); + await fixture.whenStable(); - expect(control.valid).toBe(true) - const error = fixture.debugElement.query(By.directive(MatError)) - expect(error).toBeNull() - }) + expect(control.valid).toBe(true); + const error = fixture.debugElement.query(By.directive(MatError)); + expect(error).toBeNull(); + }); it('should indicate required', async () => { - component.definition.required = true + component.definition.required = true; - const control = component.formGroup.get('select') - control.setValidators(Validators.required) - control.updateValueAndValidity() + const control = component.formGroup.get('select'); + control.setValidators(Validators.required); + control.updateValueAndValidity(); - fixture.detectChanges() - await fixture.whenStable() + fixture.detectChanges(); + await fixture.whenStable(); - expect(control.valid).toBe(false) - }) + expect(control.valid).toBe(false); + }); it('should select choice', () => { const event: any = { option: { value: 'red' } - } + }; - component.selected(event) + component.selected(event); - const control = component.formGroup.get('select') - expect(control.value).toEqual(['red']) - }) + const control = component.formGroup.get('select'); + expect(control.value).toEqual(['red']); + }); it('should add choice', () => { const event: MatChipInputEvent = { input: null, value: 'red', chipInput: chipInput - } - component.add(event) + }; + component.add(event); - const control = component.formGroup.get('select') - expect(control.value).toEqual(['red']) - }) + const control = component.formGroup.get('select'); + expect(control.value).toEqual(['red']); + }); it('should not add invalid choice', () => { const event: MatChipInputEvent = { input: null, value: 'purple', chipInput: chipInput - } - component.add(event) + }; + component.add(event); // expect(component.field.value).toBeUndefined() - const control = component.formGroup.get('select') - expect(control.value).toBeNull() - }) + const control = component.formGroup.get('select'); + expect(control.value).toBeNull(); + }); it('should not add duplicate choice', () => { const event: MatChipInputEvent = { input: null, value: 'red', chipInput: chipInput - } - component.add(event) - component.add(event) + }; + component.add(event); + component.add(event); - const control = component.formGroup.get('select') - expect(control.value).toEqual(['red']) - }) + const control = component.formGroup.get('select'); + expect(control.value).toEqual(['red']); + }); it('should remove choice', () => { const event: MatChipInputEvent = { input: null, value: 'red', chipInput: chipInput - } - component.add(event) - component.remove('red') + }; + component.add(event); + component.remove('red'); - const control = component.formGroup.get('select') - expect(control.value).toBeNull() - }) + const control = component.formGroup.get('select'); + expect(control.value).toBeNull(); + }); it('should not remove non existing choice', () => { const event: MatChipInputEvent = { input: null, value: 'red', chipInput: chipInput - } - component.add(event) - component.remove('blue') + }; + component.add(event); + component.remove('blue'); - const control = component.formGroup.get('select') - expect(control.value).toEqual(['red']) - }) + const control = component.formGroup.get('select'); + expect(control.value).toEqual(['red']); + }); it('should show error on invalid and touched', async () => { - component.definition.required = true + component.definition.required = true; - const control = component.formGroup.get('select') - control.setValidators(Validators.required) - control.updateValueAndValidity() - control.markAsTouched() + const control = component.formGroup.get('select'); + control.setValidators(Validators.required); + control.updateValueAndValidity(); + control.markAsTouched(); - fixture.detectChanges() - await fixture.whenStable() + fixture.detectChanges(); + await fixture.whenStable(); - expect(control.valid).toBe(false) - const error = fixture.debugElement.query(By.directive(MatError)) - expect(error.nativeElement.innerText.trim()).toBe('You must enter a value') - }) + expect(control.valid).toBe(false); + const error = fixture.debugElement.query(By.directive(MatError)); + expect(error.nativeElement.innerText.trim()).toBe('You must enter a value'); + }); it('should not show error on invalid if not touched', async () => { - component.definition.required = true + component.definition.required = true; - const control = component.formGroup.get('select') - control.setValidators(Validators.required) - control.updateValueAndValidity() + const control = component.formGroup.get('select'); + control.setValidators(Validators.required); + control.updateValueAndValidity(); - fixture.detectChanges() - await fixture.whenStable() + fixture.detectChanges(); + await fixture.whenStable(); - expect(control.valid).toBe(false) - const error = fixture.debugElement.query(By.directive(MatError)) - expect(error).toBeNull() - }) + expect(control.valid).toBe(false); + const error = fixture.debugElement.query(By.directive(MatError)); + expect(error).toBeNull(); + }); }); diff --git a/web-app/src/app/observation/observation-edit/observation-edit-multiselect/observation-edit-multiselect.component.ts b/web-app/src/app/observation/observation-edit/observation-edit-multiselect/observation-edit-multiselect.component.ts index faf492e58..0a4b79a99 100644 --- a/web-app/src/app/observation/observation-edit/observation-edit-multiselect/observation-edit-multiselect.component.ts +++ b/web-app/src/app/observation/observation-edit/observation-edit-multiselect/observation-edit-multiselect.component.ts @@ -1,10 +1,13 @@ import { Component, ViewChild, ElementRef, Input, AfterViewInit, OnInit } from '@angular/core'; -import { UntypedFormControl, UntypedFormGroup } from '@angular/forms'; +import { ReactiveFormsModule, UntypedFormControl, UntypedFormGroup } from '@angular/forms'; import { COMMA, ENTER } from '@angular/cdk/keycodes'; -import { MatAutocompleteSelectedEvent as MatAutocompleteSelectedEvent, MatAutocompleteTrigger as MatAutocompleteTrigger } from '@angular/material/autocomplete'; -import { MatChipInputEvent as MatChipInputEvent, MatChipListbox as MatChipListbox } from '@angular/material/chips'; +import { MatAutocompleteModule, MatAutocompleteSelectedEvent as MatAutocompleteSelectedEvent, MatAutocompleteTrigger as MatAutocompleteTrigger } from '@angular/material/autocomplete'; +import { MatChipInputEvent as MatChipInputEvent, MatChipListbox as MatChipListbox, MatChipsModule } from '@angular/material/chips'; import { Observable } from 'rxjs'; import { map, startWith } from 'rxjs/operators'; +import { CommonModule } from '@angular/common'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; interface Choice { title: string; @@ -19,6 +22,15 @@ interface MultiSelectField { @Component({ selector: 'observation-edit-multiselect', + standalone: true, + imports: [ + CommonModule, + ReactiveFormsModule, + MatFormFieldModule, + MatChipsModule, + MatIconModule, + MatAutocompleteModule + ], templateUrl: './observation-edit-multiselect.component.html', styleUrls: ['./observation-edit-multiselect.component.scss'] }) diff --git a/web-app/src/app/observation/observation-edit/observation-edit-number/observation-edit-number.component.spec.ts b/web-app/src/app/observation/observation-edit/observation-edit-number/observation-edit-number.component.spec.ts index 1f704bc88..f6935b409 100644 --- a/web-app/src/app/observation/observation-edit/observation-edit-number/observation-edit-number.component.spec.ts +++ b/web-app/src/app/observation/observation-edit/observation-edit-number/observation-edit-number.component.spec.ts @@ -1,7 +1,16 @@ import { ChangeDetectionStrategy, Component, ViewChild } from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { UntypedFormControl, UntypedFormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms'; -import { MatError as MatError, MatFormFieldModule as MatFormFieldModule } from '@angular/material/form-field'; +import { + UntypedFormControl, + UntypedFormGroup, + FormsModule, + ReactiveFormsModule, + Validators +} from '@angular/forms'; +import { + MatError as MatError, + MatFormFieldModule as MatFormFieldModule +} from '@angular/material/form-field'; import { MatInputModule as MatInputModule } from '@angular/material/input'; import { By } from '@angular/platform-browser'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; @@ -9,104 +18,115 @@ import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { ObservationEditNumberComponent } from './observation-edit-number.component'; @Component({ - selector: `host-component`, - template: ``, - changeDetection: ChangeDetectionStrategy.OnPush + standalone: true, + imports: [ObservationEditNumberComponent], + template: ` + + ` }) class TestHostComponent { formGroup = new UntypedFormGroup({ number: new UntypedFormControl() - }) + }); definition: any = { name: 'number', title: 'Number Field' - } + }; - - @ViewChild(ObservationEditNumberComponent) component: ObservationEditNumberComponent + @ViewChild(ObservationEditNumberComponent) + component: ObservationEditNumberComponent; } describe('ObservationEditNumberComponent', () => { - let component: ObservationEditNumberComponent - let hostComponent: TestHostComponent - let fixture: ComponentFixture + let component: ObservationEditNumberComponent; + let hostComponent: TestHostComponent; + let fixture: ComponentFixture; beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - imports: [FormsModule, ReactiveFormsModule, MatFormFieldModule, MatInputModule, NoopAnimationsModule], - declarations: [ObservationEditNumberComponent, TestHostComponent] - }) - .compileComponents() - })) + imports: [ + FormsModule, + ReactiveFormsModule, + MatFormFieldModule, + MatInputModule, + NoopAnimationsModule, + ObservationEditNumberComponent, + TestHostComponent + ] + }).compileComponents(); + })); beforeEach(() => { - fixture = TestBed.createComponent(TestHostComponent) - hostComponent = fixture.componentInstance + fixture = TestBed.createComponent(TestHostComponent); + hostComponent = fixture.componentInstance; fixture.detectChanges(); - component = hostComponent.component - }) + component = hostComponent.component; + }); it('should create', () => { - expect(component).toBeTruthy() - }) + expect(component).toBeTruthy(); + }); it('should not indicate required', async () => { - component.definition.required = false + component.definition.required = false; - const control = component.formGroup.get('number') - control.clearValidators() - control.updateValueAndValidity() + const control = component.formGroup.get('number'); + control.clearValidators(); + control.updateValueAndValidity(); - fixture.detectChanges() - await fixture.whenStable() + fixture.detectChanges(); + await fixture.whenStable(); - expect(control.valid).toBe(true) - const error = fixture.debugElement.query(By.directive(MatError)) - expect(error).toBeNull() - }) + expect(control.valid).toBe(true); + const error = fixture.debugElement.query(By.directive(MatError)); + expect(error).toBeNull(); + }); it('should indicate required', async () => { - component.definition.required = true + component.definition.required = true; - const control = component.formGroup.get('number') - control.setValidators(Validators.required) - control.updateValueAndValidity() + const control = component.formGroup.get('number'); + control.setValidators(Validators.required); + control.updateValueAndValidity(); - fixture.detectChanges() - await fixture.whenStable() + fixture.detectChanges(); + await fixture.whenStable(); - expect(control.valid).toBe(false) - }) + expect(control.valid).toBe(false); + }); it('should show error on invalid and touched', async () => { - component.definition.required = true + component.definition.required = true; - const control = component.formGroup.get('number') - control.setValidators(Validators.required) - control.updateValueAndValidity() - control.markAsTouched() + const control = component.formGroup.get('number'); + control.setValidators(Validators.required); + control.updateValueAndValidity(); + control.markAsTouched(); - fixture.detectChanges() - await fixture.whenStable() + fixture.detectChanges(); + await fixture.whenStable(); - expect(control.valid).toBe(false) - const error = fixture.debugElement.query(By.directive(MatError)) - expect(error.nativeElement.innerText).toBe('You must enter a value') - }) + expect(control.valid).toBe(false); + const error = fixture.debugElement.query(By.directive(MatError)); + expect(error.nativeElement.innerText).toBe('You must enter a value'); + }); it('should not show error on invalid if not touched', async () => { - component.definition.required = true + component.definition.required = true; - const control = component.formGroup.get('number') - control.setValidators(Validators.required) - control.updateValueAndValidity() + const control = component.formGroup.get('number'); + control.setValidators(Validators.required); + control.updateValueAndValidity(); - fixture.detectChanges() - await fixture.whenStable() + fixture.detectChanges(); + await fixture.whenStable(); - expect(control.valid).toBe(false) - const error = fixture.debugElement.query(By.directive(MatError)) - expect(error).toBeNull() - }) + expect(control.valid).toBe(false); + const error = fixture.debugElement.query(By.directive(MatError)); + expect(error).toBeNull(); + }); }); diff --git a/web-app/src/app/observation/observation-edit/observation-edit-number/observation-edit-number.component.ts b/web-app/src/app/observation/observation-edit/observation-edit-number/observation-edit-number.component.ts index 09bbdfa55..5a3b6bd30 100644 --- a/web-app/src/app/observation/observation-edit/observation-edit-number/observation-edit-number.component.ts +++ b/web-app/src/app/observation/observation-edit/observation-edit-number/observation-edit-number.component.ts @@ -1,5 +1,8 @@ +import { CommonModule } from '@angular/common'; import { Component, Input, OnInit } from '@angular/core'; -import { UntypedFormGroup, ValidatorFn, Validators } from '@angular/forms'; +import { ReactiveFormsModule, UntypedFormGroup, ValidatorFn, Validators } from '@angular/forms'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; interface NumberField { title: string, @@ -12,6 +15,13 @@ interface NumberField { @Component({ selector: 'observation-edit-number', + standalone: true, + imports: [ + CommonModule, + ReactiveFormsModule, + MatFormFieldModule, + MatInputModule + ], templateUrl: './observation-edit-number.component.html', styleUrls: ['./observation-edit-number.component.scss'] }) diff --git a/web-app/src/app/observation/observation-edit/observation-edit-password/observation-edit-password.component.spec.ts b/web-app/src/app/observation/observation-edit/observation-edit-password/observation-edit-password.component.spec.ts index 4846fb8bc..509c75cab 100644 --- a/web-app/src/app/observation/observation-edit/observation-edit-password/observation-edit-password.component.spec.ts +++ b/web-app/src/app/observation/observation-edit/observation-edit-password/observation-edit-password.component.spec.ts @@ -4,9 +4,14 @@ import { UntypedFormControl, UntypedFormGroup, Validators } from '@angular/forms import { ObservationEditPasswordComponent } from './observation-edit-password.component'; @Component({ - selector: `host-component`, - template: ``, - changeDetection: ChangeDetectionStrategy.OnPush + standalone: true, + imports: [ObservationEditPasswordComponent], + template: ` + + ` }) class TestHostComponent { formGroup = new UntypedFormGroup({ diff --git a/web-app/src/app/observation/observation-edit/observation-edit-password/observation-edit-password.component.ts b/web-app/src/app/observation/observation-edit/observation-edit-password/observation-edit-password.component.ts index b13898681..daf04d794 100644 --- a/web-app/src/app/observation/observation-edit/observation-edit-password/observation-edit-password.component.ts +++ b/web-app/src/app/observation/observation-edit/observation-edit-password/observation-edit-password.component.ts @@ -1,5 +1,8 @@ +import { CommonModule } from '@angular/common'; import { Component, Input } from '@angular/core'; -import { UntypedFormGroup } from '@angular/forms'; +import { ReactiveFormsModule, UntypedFormGroup } from '@angular/forms'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; interface PasswordField { title: string, @@ -9,6 +12,13 @@ interface PasswordField { @Component({ selector: 'observation-edit-password', + standalone: true, + imports: [ + CommonModule, + ReactiveFormsModule, + MatFormFieldModule, + MatInputModule + ], templateUrl: './observation-edit-password.component.html', styleUrls: ['./observation-edit-password.component.scss'] }) diff --git a/web-app/src/app/observation/observation-edit/observation-edit-radio/observation-edit-radio.component.spec.ts b/web-app/src/app/observation/observation-edit/observation-edit-radio/observation-edit-radio.component.spec.ts index 5101c5801..64967c3be 100644 --- a/web-app/src/app/observation/observation-edit/observation-edit-radio/observation-edit-radio.component.spec.ts +++ b/web-app/src/app/observation/observation-edit/observation-edit-radio/observation-edit-radio.component.spec.ts @@ -1,115 +1,144 @@ -import { ChangeDetectionStrategy, Component, ViewChild } from '@angular/core' -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' -import { UntypedFormControl, UntypedFormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms' -import { MatError as MatError, MatFormFieldModule as MatFormFieldModule } from '@angular/material/form-field'; +import { ChangeDetectionStrategy, Component, ViewChild } from '@angular/core'; +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { + UntypedFormControl, + UntypedFormGroup, + FormsModule, + ReactiveFormsModule, + Validators +} from '@angular/forms'; +import { + MatError as MatError, + MatFormFieldModule as MatFormFieldModule +} from '@angular/material/form-field'; import { MatRadioModule as MatRadioModule } from '@angular/material/radio'; -import { By } from '@angular/platform-browser' +import { By } from '@angular/platform-browser'; -import { ObservationEditRadioComponent } from './observation-edit-radio.component' +import { ObservationEditRadioComponent } from './observation-edit-radio.component'; @Component({ - selector: `host-component`, - template: ``, - changeDetection: ChangeDetectionStrategy.OnPush + standalone: true, + imports: [ObservationEditRadioComponent], + template: ` + + ` }) class TestHostComponent { formGroup = new UntypedFormGroup({ radio: new UntypedFormControl() - }) + }); definition = { title: 'Radio', name: 'radio', - choices: [{ - title: 'choice1' - },{ - title: 'choice2' - }] - } - - @ViewChild(ObservationEditRadioComponent) component: ObservationEditRadioComponent + choices: [ + { + title: 'choice1' + }, + { + title: 'choice2' + } + ] + }; + + @ViewChild(ObservationEditRadioComponent) + component: ObservationEditRadioComponent; } describe('ObservationEditRadioComponent', () => { - let component: ObservationEditRadioComponent - let hostComponent: TestHostComponent - let fixture: ComponentFixture + let component: ObservationEditRadioComponent; + let hostComponent: TestHostComponent; + let fixture: ComponentFixture; beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - imports: [FormsModule, ReactiveFormsModule, MatFormFieldModule, MatRadioModule], - declarations: [ObservationEditRadioComponent, TestHostComponent] - }) - .compileComponents() - })) + imports: [ + FormsModule, + ReactiveFormsModule, + MatFormFieldModule, + MatRadioModule, + ObservationEditRadioComponent, + TestHostComponent + ], + }).compileComponents(); + })); beforeEach(() => { - fixture = TestBed.createComponent(TestHostComponent) - hostComponent = fixture.componentInstance + fixture = TestBed.createComponent(TestHostComponent); + hostComponent = fixture.componentInstance; fixture.detectChanges(); - component = hostComponent.component - }) + component = hostComponent.component; + }); it('should create', () => { - expect(component).toBeTruthy() - }) + expect(component).toBeTruthy(); + }); it('should not indicate required', async () => { - component.definition.required = false + component.definition.required = false; - const control = component.formGroup.get('radio') - control.clearValidators() - control.updateValueAndValidity() + const control = component.formGroup.get('radio'); + control.clearValidators(); + control.updateValueAndValidity(); - fixture.detectChanges() - await fixture.whenStable() + fixture.detectChanges(); + await fixture.whenStable(); - expect(control.valid).toBe(true) - const error = fixture.debugElement.query(By.directive(MatError)).query(By.css('span')) - expect(error.nativeElement.attributes.getNamedItem('hidden')).toBeTruthy() - }) + expect(control.valid).toBe(true); + const error = fixture.debugElement + .query(By.directive(MatError)) + .query(By.css('span')); + expect(error.nativeElement.attributes.getNamedItem('hidden')).toBeTruthy(); + }); it('should indicate required', async () => { - component.definition.required = true + component.definition.required = true; - const control = component.formGroup.get('radio') - control.setValidators(Validators.required) - control.updateValueAndValidity() + const control = component.formGroup.get('radio'); + control.setValidators(Validators.required); + control.updateValueAndValidity(); - fixture.detectChanges() - await fixture.whenStable() + fixture.detectChanges(); + await fixture.whenStable(); - expect(control.valid).toBe(false) - }) + expect(control.valid).toBe(false); + }); it('should show error on invalid and touched', async () => { - component.definition.required = true + component.definition.required = true; - const control = component.formGroup.get('radio') - control.setValidators(Validators.required) - control.updateValueAndValidity() - control.markAsTouched() + const control = component.formGroup.get('radio'); + control.setValidators(Validators.required); + control.updateValueAndValidity(); + control.markAsTouched(); - fixture.detectChanges() - await fixture.whenStable() + fixture.detectChanges(); + await fixture.whenStable(); - expect(control.valid).toBe(false) - const error = fixture.debugElement.query(By.directive(MatError)).query(By.css('span')) - expect(error.nativeElement.innerText).toBe('Radio is required') - }) + expect(control.valid).toBe(false); + const error = fixture.debugElement + .query(By.directive(MatError)) + .query(By.css('span')); + expect(error.nativeElement.innerText).toBe('Radio is required'); + }); it('should not show error on invalid if not touched', async () => { - component.definition.required = true + component.definition.required = true; - const control = component.formGroup.get('radio') - control.setValidators(Validators.required) - control.updateValueAndValidity() + const control = component.formGroup.get('radio'); + control.setValidators(Validators.required); + control.updateValueAndValidity(); - fixture.detectChanges() - await fixture.whenStable() - - expect(control.valid).toBe(false) - const error = fixture.debugElement.query(By.directive(MatError)).query(By.css('span')) - expect(error.nativeElement.attributes.getNamedItem('hidden')).toBeTruthy() - }) + fixture.detectChanges(); + await fixture.whenStable(); + + expect(control.valid).toBe(false); + const error = fixture.debugElement + .query(By.directive(MatError)) + .query(By.css('span')); + expect(error.nativeElement.attributes.getNamedItem('hidden')).toBeTruthy(); + }); }); diff --git a/web-app/src/app/observation/observation-edit/observation-edit-radio/observation-edit-radio.component.ts b/web-app/src/app/observation/observation-edit/observation-edit-radio/observation-edit-radio.component.ts index 1c6ec35cb..d46c3d010 100644 --- a/web-app/src/app/observation/observation-edit/observation-edit-radio/observation-edit-radio.component.ts +++ b/web-app/src/app/observation/observation-edit/observation-edit-radio/observation-edit-radio.component.ts @@ -1,5 +1,8 @@ +import { CommonModule } from '@angular/common'; import { Component, Input } from '@angular/core'; -import { UntypedFormGroup } from '@angular/forms'; +import { ReactiveFormsModule, UntypedFormGroup } from '@angular/forms'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatRadioModule } from '@angular/material/radio'; /** * TODO: move to forms model module (which doesn't exist yet) @@ -13,6 +16,13 @@ interface RadioField { @Component({ selector: 'observation-edit-radio', + standalone: true, + imports: [ + CommonModule, + ReactiveFormsModule, + MatRadioModule, + MatFormFieldModule + ], templateUrl: './observation-edit-radio.component.html', styleUrls: ['./observation-edit-radio.component.scss'] }) diff --git a/web-app/src/app/observation/observation-edit/observation-edit-select/observation-edit-select.component.spec.ts b/web-app/src/app/observation/observation-edit/observation-edit-select/observation-edit-select.component.spec.ts index b0cecce1b..404d32dca 100644 --- a/web-app/src/app/observation/observation-edit/observation-edit-select/observation-edit-select.component.spec.ts +++ b/web-app/src/app/observation/observation-edit/observation-edit-select/observation-edit-select.component.spec.ts @@ -17,11 +17,14 @@ import { MatInputModule } from '@angular/material/input'; import { MatSelectModule } from '@angular/material/select'; @Component({ - template: ``, - changeDetection: ChangeDetectionStrategy.OnPush + standalone: true, + imports: [ObservationEditSelectComponent], + template: ` + + ` }) class TestHostComponent { formGroup = new UntypedFormGroup({ @@ -62,9 +65,10 @@ describe('ObservationEditSelectComponent', () => { NgxMatSelectSearchModule, MatFormFieldModule, MatInputModule, - MatSelectModule + MatSelectModule, + ObservationEditSelectComponent, + TestHostComponent ], - declarations: [ObservationEditSelectComponent, TestHostComponent] }).compileComponents(); })); diff --git a/web-app/src/app/observation/observation-edit/observation-edit-select/observation-edit-select.component.ts b/web-app/src/app/observation/observation-edit/observation-edit-select/observation-edit-select.component.ts index d905d197b..04fce1a29 100644 --- a/web-app/src/app/observation/observation-edit/observation-edit-select/observation-edit-select.component.ts +++ b/web-app/src/app/observation/observation-edit/observation-edit-select/observation-edit-select.component.ts @@ -1,6 +1,9 @@ +import { CommonModule } from '@angular/common'; import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core'; -import { UntypedFormControl, UntypedFormGroup } from '@angular/forms'; -import { MatSelectChange as MatSelectChange } from '@angular/material/select'; +import { ReactiveFormsModule, UntypedFormControl, UntypedFormGroup } from '@angular/forms'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatSelectChange as MatSelectChange, MatSelectModule } from '@angular/material/select'; +import { NgxMatSelectSearchModule } from 'ngx-mat-select-search'; import { Observable } from 'rxjs'; import { map, startWith } from 'rxjs/operators'; @@ -17,6 +20,14 @@ interface SelectField { @Component({ selector: 'observation-edit-dropdown', + standalone: true, + imports: [ + CommonModule, + ReactiveFormsModule, + MatFormFieldModule, + MatSelectModule, + NgxMatSelectSearchModule + ], templateUrl: './observation-edit-select.component.html', styleUrls: ['./observation-edit-select.component.scss'] }) diff --git a/web-app/src/app/observation/observation-edit/observation-edit-text/observation-edit-text.component.spec.ts b/web-app/src/app/observation/observation-edit/observation-edit-text/observation-edit-text.component.spec.ts index b5394e8b4..b48837a76 100644 --- a/web-app/src/app/observation/observation-edit/observation-edit-text/observation-edit-text.component.spec.ts +++ b/web-app/src/app/observation/observation-edit/observation-edit-text/observation-edit-text.component.spec.ts @@ -1,87 +1,106 @@ import { Component, ViewChild } from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatError as MatError, MatFormField as MatFormField, MatFormFieldModule as MatFormFieldModule } from '@angular/material/form-field'; -import { MatInput as MatInput, MatInputModule as MatInputModule } from '@angular/material/input'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { + MatError, + MatFormField, + MatFormFieldModule +} from '@angular/material/form-field'; +import { MatInput, MatInputModule } from '@angular/material/input'; import { By } from '@angular/platform-browser'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { ObservationEditTextComponent } from './observation-edit-text.component'; @Component({ - selector: `host-component`, - template: `` + standalone: true, + imports: [ObservationEditTextComponent], + template: ` + + ` }) class TestHostComponent { - - field = { + definition = { title: 'Text', - name: 'field1' - } + name: 'field1', + required: false + }; + + formGroup = new FormGroup({ + field1: new FormControl('') + }); - @ViewChild(ObservationEditTextComponent) component: ObservationEditTextComponent + @ViewChild(ObservationEditTextComponent, { static: true }) + component: ObservationEditTextComponent; } -/* TODO test MUST contain at least 1 test describe('ObservationEditTextComponent', () => { - let component: ObservationEditTextComponent - let hostComponent: TestHostComponent - let fixture: ComponentFixture + let component: ObservationEditTextComponent; + let hostComponent: TestHostComponent; + let fixture: ComponentFixture; beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - imports: [FormsModule, ReactiveFormsModule, MatFormFieldModule, MatInputModule, NoopAnimationsModule], - declarations: [ObservationEditTextComponent, TestHostComponent] - }) - .compileComponents() - })) + imports: [ + TestHostComponent, + ReactiveFormsModule, + MatFormFieldModule, + MatInputModule, + NoopAnimationsModule + ] + }).compileComponents(); + })); beforeEach(() => { - fixture = TestBed.createComponent(TestHostComponent) - hostComponent = fixture.componentInstance + fixture = TestBed.createComponent(TestHostComponent); + hostComponent = fixture.componentInstance; + fixture.detectChanges(); + component = hostComponent.component; + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + it('should not indicate required', () => { + component.definition.required = false; + fixture.detectChanges(); + const input = fixture.debugElement.query(By.directive(MatFormField)).componentInstance as MatFormField; + expect(input._control.required).toBeFalsy(); + }); + + it('should indicate required', () => { + component.definition.required = true; + fixture.detectChanges(); + const input = fixture.debugElement.query(By.directive(MatFormField)).componentInstance as MatFormField; + expect(input._control.required).toBeTruthy(); + }); + + it('should show error on invalid and touched', async () => { + component.definition.required = true; + fixture.detectChanges(); + + const control = hostComponent.formGroup.get('field1'); + control?.markAsTouched(); + control?.setValue(''); + control?.updateValueAndValidity(); + fixture.detectChanges(); - component = hostComponent.component - }) - - // it('should create', () => { - // expect(component).toBeTruthy() - // }) - - // it('should not indicate required', () => { - // component.definition.required = false - // fixture.detectChanges() - // const input = fixture.debugElement.query(By.directive(MatFormField)).componentInstance - // expect(input._control.required).toBeFalsy() - // }) - - // it('should indicate required', () => { - // component.definition.required = true - // fixture.detectChanges() - // const input = fixture.debugElement.query(By.directive(MatFormField)).componentInstance - // expect(input._control.required).toBeTruthy() - // }) - - // it('should show error on invalid and touched', async () => { - // component.definition.required = true - - // const input = fixture.debugElement.query(By.directive(MatInput)).references['text'] - // input.control.markAsTouched() - - // fixture.detectChanges() - // await fixture.whenStable() - - // const error = fixture.debugElement.query(By.directive(MatError)) - // expect(error.nativeElement.innerText).toBe('You must enter a value') - // }) - - // it('should not show error on invalid if not touched', async () => { - // component.definition.required = true - - // fixture.detectChanges() - // await fixture.whenStable() - - // const error = fixture.debugElement.query(By.directive(MatError)) - // expect(error).toBeNull() - // }) -}); -*/ + await fixture.whenStable(); + + const error = fixture.debugElement.query(By.directive(MatError)); + expect(error.nativeElement.innerText.trim()).toBe('You must enter a value'); + }); + + it('should not show error on invalid if not touched', async () => { + component.definition.required = true; + fixture.detectChanges(); + await fixture.whenStable(); + + const error = fixture.debugElement.query(By.directive(MatError)); + expect(error).toBeNull(); + }); +}); \ No newline at end of file diff --git a/web-app/src/app/observation/observation-edit/observation-edit-text/observation-edit-text.component.ts b/web-app/src/app/observation/observation-edit/observation-edit-text/observation-edit-text.component.ts index c75b6f638..f951f5553 100644 --- a/web-app/src/app/observation/observation-edit/observation-edit-text/observation-edit-text.component.ts +++ b/web-app/src/app/observation/observation-edit/observation-edit-text/observation-edit-text.component.ts @@ -1,5 +1,8 @@ +import { CommonModule } from '@angular/common'; import { Component, Input } from '@angular/core'; -import { UntypedFormGroup } from '@angular/forms'; +import { ReactiveFormsModule, UntypedFormGroup } from '@angular/forms'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; interface TextField { title: string, @@ -9,6 +12,13 @@ interface TextField { @Component({ selector: 'observation-edit-text', + standalone: true, + imports: [ + CommonModule, + ReactiveFormsModule, + MatFormFieldModule, + MatInputModule + ], templateUrl: './observation-edit-text.component.html', styleUrls: ['./observation-edit-text.component.scss'] }) diff --git a/web-app/src/app/observation/observation-edit/observation-edit-textarea/observation-edit-textarea.component.spec.ts b/web-app/src/app/observation/observation-edit/observation-edit-textarea/observation-edit-textarea.component.spec.ts index f23b28e9e..832058577 100644 --- a/web-app/src/app/observation/observation-edit/observation-edit-textarea/observation-edit-textarea.component.spec.ts +++ b/web-app/src/app/observation/observation-edit/observation-edit-textarea/observation-edit-textarea.component.spec.ts @@ -1,7 +1,16 @@ import { ChangeDetectionStrategy, Component, ViewChild } from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { UntypedFormControl, UntypedFormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms'; -import { MatError as MatError, MatFormFieldModule as MatFormFieldModule } from '@angular/material/form-field'; +import { + UntypedFormControl, + UntypedFormGroup, + FormsModule, + ReactiveFormsModule, + Validators +} from '@angular/forms'; +import { + MatError as MatError, + MatFormFieldModule as MatFormFieldModule +} from '@angular/material/form-field'; import { MatInputModule as MatInputModule } from '@angular/material/input'; import { By } from '@angular/platform-browser'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; @@ -9,104 +18,116 @@ import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { ObservationEditTextareaComponent } from './observation-edit-textarea.component'; @Component({ - selector: `host-component`, - template: ``, - changeDetection: ChangeDetectionStrategy.OnPush + standalone: true, + imports: [ObservationEditTextareaComponent], + template: ` + + ` }) class TestHostComponent { formGroup = new UntypedFormGroup({ text: new UntypedFormControl() - }) + }); definition = { name: 'text', title: 'Text Field', required: true - } + }; - @ViewChild(ObservationEditTextareaComponent) component: ObservationEditTextareaComponent + @ViewChild(ObservationEditTextareaComponent) + component: ObservationEditTextareaComponent; } describe('ObservationEditTextareaComponent', () => { - let component: ObservationEditTextareaComponent - let hostComponent: TestHostComponent - let fixture: ComponentFixture + let component: ObservationEditTextareaComponent; + let hostComponent: TestHostComponent; + let fixture: ComponentFixture; beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - imports: [FormsModule, ReactiveFormsModule, MatFormFieldModule, MatInputModule, NoopAnimationsModule], - declarations: [ObservationEditTextareaComponent, TestHostComponent] - }) - .compileComponents() - })) + imports: [ + FormsModule, + ReactiveFormsModule, + MatFormFieldModule, + MatInputModule, + NoopAnimationsModule, + ObservationEditTextareaComponent, + TestHostComponent + ], + }).compileComponents(); + })); beforeEach(() => { - fixture = TestBed.createComponent(TestHostComponent) - hostComponent = fixture.componentInstance + fixture = TestBed.createComponent(TestHostComponent); + hostComponent = fixture.componentInstance; fixture.detectChanges(); - component = hostComponent.component - }) + component = hostComponent.component; + }); it('should create', () => { - expect(component).toBeTruthy() - }) + expect(component).toBeTruthy(); + }); it('should not indicate required', async () => { - component.definition.required = false + component.definition.required = false; - const control = component.formGroup.get('text') - control.clearValidators() - control.updateValueAndValidity() + const control = component.formGroup.get('text'); + control.clearValidators(); + control.updateValueAndValidity(); - fixture.detectChanges() - await fixture.whenStable() + fixture.detectChanges(); + await fixture.whenStable(); - expect(control.valid).toBe(true) - const error = fixture.debugElement.query(By.directive(MatError)) - expect(error).toBeNull() - }) + expect(control.valid).toBe(true); + const error = fixture.debugElement.query(By.directive(MatError)); + expect(error).toBeNull(); + }); it('should indicate required', async () => { - component.definition.required = true + component.definition.required = true; - const control = component.formGroup.get('text') - control.setValidators(Validators.required) - control.updateValueAndValidity() + const control = component.formGroup.get('text'); + control.setValidators(Validators.required); + control.updateValueAndValidity(); - fixture.detectChanges() - await fixture.whenStable() + fixture.detectChanges(); + await fixture.whenStable(); - expect(control.valid).toBe(false) - }) + expect(control.valid).toBe(false); + }); it('should show error on invalid and touched', async () => { - component.definition.required = true + component.definition.required = true; - const control = component.formGroup.get('text') - control.setValidators(Validators.required) - control.updateValueAndValidity() - control.markAsTouched() + const control = component.formGroup.get('text'); + control.setValidators(Validators.required); + control.updateValueAndValidity(); + control.markAsTouched(); - fixture.detectChanges() - await fixture.whenStable() + fixture.detectChanges(); + await fixture.whenStable(); - expect(control.valid).toBe(false) - const error = fixture.debugElement.query(By.directive(MatError)) - expect(error.nativeElement.innerText).toBe('You must enter a value') - }) + expect(control.valid).toBe(false); + const error = fixture.debugElement.query(By.directive(MatError)); + expect(error.nativeElement.innerText).toBe('You must enter a value'); + }); it('should not show error on invalid if not touched', async () => { - component.definition.required = true + component.definition.required = true; - const control = component.formGroup.get('text') - control.setValidators(Validators.required) - control.updateValueAndValidity() + const control = component.formGroup.get('text'); + control.setValidators(Validators.required); + control.updateValueAndValidity(); - fixture.detectChanges() - await fixture.whenStable() + fixture.detectChanges(); + await fixture.whenStable(); - expect(control.valid).toBe(false) - const error = fixture.debugElement.query(By.directive(MatError)) - expect(error).toBeNull() - }) + expect(control.valid).toBe(false); + const error = fixture.debugElement.query(By.directive(MatError)); + expect(error).toBeNull(); + }); }); diff --git a/web-app/src/app/observation/observation-edit/observation-edit-textarea/observation-edit-textarea.component.ts b/web-app/src/app/observation/observation-edit/observation-edit-textarea/observation-edit-textarea.component.ts index cdc3402c9..fae113eac 100644 --- a/web-app/src/app/observation/observation-edit/observation-edit-textarea/observation-edit-textarea.component.ts +++ b/web-app/src/app/observation/observation-edit/observation-edit-textarea/observation-edit-textarea.component.ts @@ -1,5 +1,8 @@ +import { CommonModule } from '@angular/common'; import { Component, Input } from '@angular/core'; -import { UntypedFormGroup } from '@angular/forms'; +import { ReactiveFormsModule, UntypedFormGroup } from '@angular/forms'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; interface TextareaField { title: string, @@ -9,6 +12,13 @@ interface TextareaField { @Component({ selector: 'observation-edit-textarea', + standalone: true, + imports: [ + CommonModule, + ReactiveFormsModule, + MatFormFieldModule, + MatInputModule + ], templateUrl: './observation-edit-textarea.component.html', styleUrls: ['./observation-edit-textarea.component.scss'] }) diff --git a/web-app/src/app/observation/observation-edit/observation-edit.component.ts b/web-app/src/app/observation/observation-edit/observation-edit.component.ts index 967a96e10..8f8108a6b 100644 --- a/web-app/src/app/observation/observation-edit/observation-edit.component.ts +++ b/web-app/src/app/observation/observation-edit/observation-edit.component.ts @@ -1,6 +1,6 @@ import { animate, style, transition, trigger } from "@angular/animations"; -import { CdkDragDrop, moveItemInArray } from "@angular/cdk/drag-drop"; -import { DOCUMENT } from "@angular/common"; +import { CdkDragDrop, DragDropModule, moveItemInArray } from "@angular/cdk/drag-drop"; +import { CommonModule, DOCUMENT } from "@angular/common"; import { Component, ElementRef, @@ -16,6 +16,7 @@ import { ViewChildren, } from "@angular/core"; import { + ReactiveFormsModule, UntypedFormArray, UntypedFormBuilder, UntypedFormControl, @@ -32,7 +33,7 @@ import { MatSnackBarRef as MatSnackBarRef, SimpleSnackBar as SimpleSnackBar, } from "@angular/material/snack-bar"; -import { MatIconRegistry } from "@angular/material/icon"; +import { MatIconModule, MatIconRegistry } from "@angular/material/icon"; import { MatDialog as MatDialog } from "@angular/material/dialog"; import { MatBottomSheet } from "@angular/material/bottom-sheet"; import { @@ -48,11 +49,31 @@ import { UserService } from "src/app/user/user.service"; import { EventService } from "src/app/event/event.service"; import { FilterService } from "src/app/filter/filter.service"; import { ObservationService } from "../observation.service"; +import { MatCardModule } from "@angular/material/card"; +import { MatCheckboxModule } from "@angular/material/checkbox"; +import { MatProgressBarModule } from "@angular/material/progress-bar"; +import { MatToolbarModule } from "@angular/material/toolbar"; +import { ObservationEditDateComponent, ObservationEditGeometryComponent } from "./observation-edit"; +import { ObservationEditFormComponent } from "./observation-edit-form.component"; export type ObservationFormControl = UntypedFormControl & { definition: any }; @Component({ selector: "observation-edit", + standalone: true, + imports: [ + CommonModule, + DragDropModule, + ReactiveFormsModule, + MatToolbarModule, + MatIconModule, + MatProgressBarModule, + MatCardModule, + MatCheckboxModule, + ObservationEditDateComponent, + ObservationEditGeometryComponent, + ObservationEditFormComponent + ], templateUrl: "./observation-edit.component.html", styleUrls: ["./observation-edit.component.scss"], animations: [ diff --git a/web-app/src/app/observation/observation-favorites/observation-favorites.component.ts b/web-app/src/app/observation/observation-favorites/observation-favorites.component.ts index 7c2bc01cd..97ca159c3 100644 --- a/web-app/src/app/observation/observation-favorites/observation-favorites.component.ts +++ b/web-app/src/app/observation/observation-favorites/observation-favorites.component.ts @@ -1,6 +1,10 @@ import { Component, Inject } from '@angular/core' import { MatDialogRef as MatDialogRef, MAT_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/dialog'; import { UserService } from '../../user/user.service'; +import { CommonModule } from '@angular/common'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatListModule } from '@angular/material/list'; +import { UserAvatarModule } from 'mage-web-app/user/user-avatar/user-avatar.module'; interface Data { userIds: any @@ -9,6 +13,13 @@ interface Data { @Component({ selector: 'observation-favorites', + standalone: true, + imports: [ + CommonModule, + MatDividerModule, + MatListModule, + UserAvatarModule + ], templateUrl: './observation-favorites.component.html', styleUrls: ['./observation-favorites.component.scss'] }) diff --git a/web-app/src/app/observation/observation-list/observation-list-item.component.spec.ts b/web-app/src/app/observation/observation-list/observation-list-item.component.spec.ts index 40a5e1a78..2c60b6c1f 100644 --- a/web-app/src/app/observation/observation-list/observation-list-item.component.spec.ts +++ b/web-app/src/app/observation/observation-list/observation-list-item.component.spec.ts @@ -14,7 +14,7 @@ import { MatCardModule as MatCardModule } from '@angular/material/card'; import { MatRippleModule } from '@angular/material/core'; import { MatSnackBarModule as MatSnackBarModule } from '@angular/material/snack-bar'; -class MockMapService { } +class MockMapService {} class MockUserService { myself = { @@ -82,11 +82,14 @@ class MockLocalStorageService { } @Component({ - selector: `host-component`, - template: `` + standalone: true, + imports: [ObservationListItemComponent], + template: ` + + ` }) class TestHostComponent { event: any = { @@ -106,18 +109,16 @@ describe('ObservationListItemComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ - ObservationListItemComponent, - MomentPipe, - GeometryPipe, - TestHostComponent - ], imports: [ NoopAnimationsModule, MatIconModule, MatCardModule, MatRippleModule, - MatSnackBarModule + MatSnackBarModule, + ObservationListItemComponent, + MomentPipe, + GeometryPipe, + TestHostComponent ], providers: [ { diff --git a/web-app/src/app/observation/observation-list/observation-list-item.component.ts b/web-app/src/app/observation/observation-list/observation-list-item.component.ts index 0fc944846..15b8adcaa 100644 --- a/web-app/src/app/observation/observation-list/observation-list-item.component.ts +++ b/web-app/src/app/observation/observation-list/observation-list-item.component.ts @@ -1,55 +1,79 @@ -import { Component, Input, OnChanges, SimpleChanges, ViewChild } from '@angular/core' +import { + Component, + Input, + OnChanges, + SimpleChanges, + ViewChild +} from '@angular/core'; import moment from 'moment'; -import { MatRipple } from '@angular/material/core'; +import { MatRipple, MatRippleModule } from '@angular/material/core'; import { MatSnackBar as MatSnackBar } from '@angular/material/snack-bar'; -import { animate, style, transition, trigger } from '@angular/animations' -import { FeedPanelService } from '../../feed-panel/feed-panel.service' +import { animate, style, transition, trigger } from '@angular/animations'; +import { FeedPanelService } from '../../feed-panel/feed-panel.service'; import { MapService } from '../../map/map.service'; import { UserService } from '../../user/user.service'; import { EventService } from '../../event/event.service'; import { LocalStorageService } from '../../http/local-storage.service'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { MatCardModule } from '@angular/material/card'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { GeometryModule } from 'mage-web-app/geometry/geometry.module'; +import { MomentModule } from 'mage-web-app/moment/moment.module'; +import { AttachmentComponent } from '../attachment/attachment.component'; @Component({ selector: 'observation-list-item', + standalone: true, + imports: [ + CommonModule, + FormsModule, + MatCardModule, + MatRippleModule, + MatIconModule, + MatFormFieldModule, + MomentModule, + GeometryModule, + AttachmentComponent + ], templateUrl: './observation-list-item.component.html', styleUrls: ['./observation-list-item.component.scss'], animations: [ trigger('important', [ transition(':enter', [ style({ height: 0, opacity: 0 }), - animate('250ms', style({ height: '*', opacity: 1 })), + animate('250ms', style({ height: '*', opacity: 1 })) ]), - transition(':leave', [ - animate('250ms', style({ height: 0, opacity: 0 })) - ]) + transition(':leave', [animate('250ms', style({ height: 0, opacity: 0 }))]) ]) ] }) export class ObservationListItemComponent implements OnChanges { - @Input() event: any - @Input() form: any - @Input() observation: any + @Input() event: any; + @Input() form: any; + @Input() observation: any; - @ViewChild(MatRipple) ripple: MatRipple + @ViewChild(MatRipple) ripple: MatRipple; - edit = false - canEdit = false - canEditImportant = false + edit = false; + canEdit = false; + canEditImportant = false; - favorites = 0 - isUserFavorite = false + favorites = 0; + isUserFavorite = false; importantEditor: { - open: boolean, - description?: string - } = { open: false } + open: boolean; + description?: string; + } = { open: false }; // TODO: define some types for these - observationForm: any - primaryFeedField: any = {} - secondaryFeedField: any = {} + observationForm: any; + primaryFeedField: any = {}; + secondaryFeedField: any = {}; - attachments = [] + attachments = []; constructor( private mapService: MapService, @@ -57,95 +81,124 @@ export class ObservationListItemComponent implements OnChanges { private eventService: EventService, private localStorageService: LocalStorageService, private feedPanelService: FeedPanelService, - private snackBar: MatSnackBar) { } + private snackBar: MatSnackBar + ) {} ngOnChanges(changes: SimpleChanges): void { - if (changes.event?.currentValue || changes.form?.currentValue || changes.observation?.currentValue) { - this.updateItem() + if ( + changes.event?.currentValue || + changes.form?.currentValue || + changes.observation?.currentValue + ) { + this.updateItem(); } if (changes.observation?.currentValue) { - this.updateFavorites() - this.importantEditor.description = this.observation.important ? this.observation.important.description : null + this.updateFavorites(); + this.importantEditor.description = this.observation.important + ? this.observation.important.description + : null; } } toggleFavorite(): void { if (this.isUserFavorite) { this.eventService.removeObservationFavorite(this.observation).subscribe({ - next: observation => { - this.observation.favoriteUserIds = observation.favoriteUserIds - this.isUserFavorite = false - this.updateFavorites() + next: (observation) => { + this.observation.favoriteUserIds = observation.favoriteUserIds; + this.isUserFavorite = false; + this.updateFavorites(); }, error: () => { - this.snackBar.open('Failed to remove observation from favorites.', null, { duration: 4000 }) + this.snackBar.open( + 'Failed to remove observation from favorites.', + null, + { duration: 4000 } + ); } - }) + }); } else { this.eventService.addObservationFavorite(this.observation).subscribe({ - next: observation => { - this.observation.favoriteUserIds = observation.favoriteUserIds - this.isUserFavorite = true - this.updateFavorites() + next: (observation) => { + this.observation.favoriteUserIds = observation.favoriteUserIds; + this.isUserFavorite = true; + this.updateFavorites(); }, error: () => { - this.snackBar.open('Failed to add observation to favorites.', null, { duration: 4000 }) + this.snackBar.open('Failed to add observation to favorites.', null, { + duration: 4000 + }); } - }) + }); } } onFlagAsImportant(): void { - this.importantEditor.open = true + this.importantEditor.open = true; } markAsImportant(): void { - this.eventService.markObservationAsImportant(this.observation, { description: this.importantEditor.description }).subscribe(() => { - this.importantEditor.open = false - }) + this.eventService + .markObservationAsImportant(this.observation, { + description: this.importantEditor.description + }) + .subscribe(() => { + this.importantEditor.open = false; + }); } clearImportant(): void { - this.eventService.clearObservationAsImportant(this.observation).subscribe(() => { - this.importantEditor.open = false - delete this.importantEditor.description - }) + this.eventService + .clearObservationAsImportant(this.observation) + .subscribe(() => { + this.importantEditor.open = false; + delete this.importantEditor.description; + }); } downloadUrl(): string { - return `/api/events/${this.observation?.eventId}/observations/${this.observation?.id}.zip?access_token=${this.localStorageService.getToken()}` + return `/api/events/${this.observation?.eventId}/observations/${ + this.observation?.id + }.zip?access_token=${this.localStorageService.getToken()}`; } onRipple(): void { this.ripple.launch({ centered: true - }) + }); } viewObservation(): void { - this.onObservationLocationClick() - this.feedPanelService.viewObservation(this.observation) + this.onObservationLocationClick(); + this.feedPanelService.viewObservation(this.observation); } onObservationLocationClick(): void { - this.mapService.zoomToFeatureInLayer(this.observation, 'observations') + this.mapService.zoomToFeatureInLayer(this.observation, 'observations'); } updateItem(): void { - if (!this.observation || !this.event) return - - this.isUserFavorite = this.observation.favoriteUserIds && this.observation.favoriteUserIds.includes(this.userService.myself.id) - this.canEdit = this.userService.hasPermission('UPDATE_OBSERVATION_EVENT') || this.userService.hasPermission('UPDATE_OBSERVATION_ALL') - - const myAccess = this.event.acl[this.userService.myself.id] || {} - const aclPermissions = myAccess.permissions || [] - this.canEditImportant = this.userService.myself.role.permissions.includes('UPDATE_EVENT') || aclPermissions.includes('update') - - const formMap = this.eventService.getFormsForEvent(this.event, {}).reduce((map, form) => { - map[form.id] = form - return map - }, {}) + if (!this.observation || !this.event) return; + + this.isUserFavorite = + this.observation.favoriteUserIds && + this.observation.favoriteUserIds.includes(this.userService.myself.id); + this.canEdit = + this.userService.hasPermission('UPDATE_OBSERVATION_EVENT') || + this.userService.hasPermission('UPDATE_OBSERVATION_ALL'); + + const myAccess = this.event.acl[this.userService.myself.id] || {}; + const aclPermissions = myAccess.permissions || []; + this.canEditImportant = + this.userService.myself.role.permissions.includes('UPDATE_EVENT') || + aclPermissions.includes('update'); + + const formMap = this.eventService + .getFormsForEvent(this.event, {}) + .reduce((map, form) => { + map[form.id] = form; + return map; + }, {}); this.observationForm = { geometryField: { @@ -159,52 +212,73 @@ export class ObservationListItemComponent implements OnChanges { value: moment(this.observation?.properties?.timestamp).toDate() }, forms: [] - } + }; - this.observation.properties.forms.forEach(propertyForm => { - const observationForm = this.eventService.createForm(propertyForm, formMap[propertyForm.formId]) - this.observationForm.forms.push(observationForm) - }) + this.observation.properties.forms.forEach((propertyForm) => { + const observationForm = this.eventService.createForm( + propertyForm, + formMap[propertyForm.formId] + ); + this.observationForm.forms.push(observationForm); + }); - this.primaryFeedField = {} - this.secondaryFeedField = {} + this.primaryFeedField = {}; + this.secondaryFeedField = {}; if (this.observation.properties.forms.length > 0) { - const firstForm = this.observation.properties.forms[0] - const observationForm = this.observationForm.forms.find(observationForm => { - return observationForm.id === firstForm.formId - }) - - if (observationForm.primaryFeedField && firstForm[observationForm.primaryFeedField]) { - const field = observationForm.fields.find(field => field.name === observationForm.primaryFeedField) + const firstForm = this.observation.properties.forms[0]; + const observationForm = this.observationForm.forms.find( + (observationForm) => { + return observationForm.id === firstForm.formId; + } + ); + + if ( + observationForm.primaryFeedField && + firstForm[observationForm.primaryFeedField] + ) { + const field = observationForm.fields.find( + (field) => field.name === observationForm.primaryFeedField + ); this.primaryFeedField = { field: field, value: firstForm[observationForm.primaryFeedField] - } + }; } - if (observationForm.secondaryFeedField && firstForm[observationForm.secondaryFeedField]) { - const field = observationForm.fields.find(field => field.name === observationForm.secondaryFeedField) + if ( + observationForm.secondaryFeedField && + firstForm[observationForm.secondaryFeedField] + ) { + const field = observationForm.fields.find( + (field) => field.name === observationForm.secondaryFeedField + ); this.secondaryFeedField = { field: field, value: firstForm[observationForm.secondaryFeedField] - } + }; } } - this.isUserFavorite = this.observation.favoriteUserIds.includes(this.userService.myself.id) - - this.attachments = this.observation.attachments.filter(attachment => { - return this.observationForm.forms.find(observationForm => { - return observationForm.fields.find(field => { - return attachment.observationFormId === observationForm.remoteId && attachment.fieldName === field.name - }) - }) != null - }) - + this.isUserFavorite = this.observation.favoriteUserIds.includes( + this.userService.myself.id + ); + + this.attachments = this.observation.attachments.filter((attachment) => { + return ( + this.observationForm.forms.find((observationForm) => { + return observationForm.fields.find((field) => { + return ( + attachment.observationFormId === observationForm.remoteId && + attachment.fieldName === field.name + ); + }); + }) != null + ); + }); } updateFavorites(): void { - this.favorites = this.observation.favoriteUserIds.length + this.favorites = this.observation.favoriteUserIds.length; } } diff --git a/web-app/src/app/observation/observation-list/observation-list.component.scss b/web-app/src/app/observation/observation-list/observation-list.component.scss index 9c287237f..6635e80a7 100644 --- a/web-app/src/app/observation/observation-list/observation-list.component.scss +++ b/web-app/src/app/observation/observation-list/observation-list.component.scss @@ -20,7 +20,7 @@ } .observation-feed-toolbar { - color: mat.get-color-from-palette($app-primary); + color: mat.m2-get-color-from-palette($app-primary); background-color: white; margin-top: 8px; padding: 0 16px; diff --git a/web-app/src/app/observation/observation-list/observation-list.component.ts b/web-app/src/app/observation/observation-list/observation-list.component.ts index 3ebe58bc3..6536e9ba1 100644 --- a/web-app/src/app/observation/observation-list/observation-list.component.ts +++ b/web-app/src/app/observation/observation-list/observation-list.component.ts @@ -2,9 +2,32 @@ import { Component, OnDestroy, OnInit } from '@angular/core'; import moment from 'moment'; import { EventService } from '../../event/event.service'; import { FilterService } from '../../filter/filter.service'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { MatCardModule } from '@angular/material/card'; +import { MatChipsModule } from '@angular/material/chips'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatSelectModule } from '@angular/material/select'; +import { MatToolbarModule } from '@angular/material/toolbar'; +import { MomentModule } from 'mage-web-app/moment/moment.module'; +import { ObservationListItemComponent } from './observation-list-item.component'; @Component({ selector: 'observation-list', + standalone: true, + imports: [ + CommonModule, + FormsModule, + MatToolbarModule, + MatChipsModule, + MatFormFieldModule, + MatSelectModule, + MatCardModule, + MatIconModule, + MomentModule, + ObservationListItemComponent + ], templateUrl: './observation-list.component.html', styleUrls: ['./observation-list.component.scss'] }) diff --git a/web-app/src/app/observation/observation-popup/observation-popup.component.ts b/web-app/src/app/observation/observation-popup/observation-popup.component.ts index 118d173c3..2597d166a 100644 --- a/web-app/src/app/observation/observation-popup/observation-popup.component.ts +++ b/web-app/src/app/observation/observation-popup/observation-popup.component.ts @@ -3,9 +3,20 @@ import { FeedPanelService } from '../../feed-panel/feed-panel.service'; import moment from 'moment'; import { MapService } from '../../map/map.service'; import { EventService } from '../../event/event.service'; +import { CommonModule } from '@angular/common'; +import { MatIconModule } from '@angular/material/icon'; +import { GeometryModule } from 'mage-web-app/geometry/geometry.module'; +import { MomentModule } from 'mage-web-app/moment/moment.module'; @Component({ selector: 'observation-map-popup', + standalone: true, + imports: [ + CommonModule, + MatIconModule, + MomentModule, + GeometryModule + ], templateUrl: './observation-popup.component.html', styleUrls: ['./observation-popup.component.scss'] }) diff --git a/web-app/src/app/observation/observation-view/observation-options.component.spec.ts b/web-app/src/app/observation/observation-view/observation-options.component.spec.ts index fe1c10474..7282b1b61 100644 --- a/web-app/src/app/observation/observation-view/observation-options.component.spec.ts +++ b/web-app/src/app/observation/observation-view/observation-options.component.spec.ts @@ -11,14 +11,14 @@ describe('ObservationOptionsComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - imports: [MatListModule, MatIconModule], - declarations: [ ObservationOptionsComponent ], - providers: [{ - provide: MatBottomSheetRef, - useValue: {} - }] - }) - .compileComponents(); + imports: [MatListModule, MatIconModule, ObservationOptionsComponent], + providers: [ + { + provide: MatBottomSheetRef, + useValue: {} + } + ] + }).compileComponents(); })); beforeEach(() => { diff --git a/web-app/src/app/observation/observation-view/observation-options.component.ts b/web-app/src/app/observation/observation-view/observation-options.component.ts index c00fb0d83..dd3e40713 100644 --- a/web-app/src/app/observation/observation-view/observation-options.component.ts +++ b/web-app/src/app/observation/observation-view/observation-options.component.ts @@ -1,5 +1,8 @@ +import { CommonModule } from '@angular/common'; import { Component } from '@angular/core'; import { MatBottomSheetRef } from '@angular/material/bottom-sheet'; +import { MatIconModule } from '@angular/material/icon'; +import { MatListModule } from '@angular/material/list'; export enum ObservationOption { DOWNLOAD, @@ -8,6 +11,12 @@ export enum ObservationOption { @Component({ selector: 'observation-options', + standalone: true, + imports: [ + CommonModule, + MatListModule, + MatIconModule + ], templateUrl: './observation-options.component.html', styleUrls: ['./observation-options.component.scss'] }) diff --git a/web-app/src/app/observation/observation-view/observation-view-attachment/observation-view-attachment.component.spec.ts b/web-app/src/app/observation/observation-view/observation-view-attachment/observation-view-attachment.component.spec.ts index ec1c2d25c..3f62b2794 100644 --- a/web-app/src/app/observation/observation-view/observation-view-attachment/observation-view-attachment.component.spec.ts +++ b/web-app/src/app/observation/observation-view/observation-view-attachment/observation-view-attachment.component.spec.ts @@ -4,7 +4,8 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { ObservationViewAttachmentComponent } from './observation-view-attachment.component'; @Component({ - selector: `host-component`, + standalone: true, + imports: [ObservationViewAttachmentComponent], template: `` }) class TestHostComponent { @@ -19,7 +20,7 @@ describe('ObservationViewAttachmentComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ObservationViewAttachmentComponent, TestHostComponent] + imports: [ObservationViewAttachmentComponent, TestHostComponent] }) .compileComponents() })) diff --git a/web-app/src/app/observation/observation-view/observation-view-attachment/observation-view-attachment.component.ts b/web-app/src/app/observation/observation-view/observation-view-attachment/observation-view-attachment.component.ts index cdaf21655..5e987e8e1 100644 --- a/web-app/src/app/observation/observation-view/observation-view-attachment/observation-view-attachment.component.ts +++ b/web-app/src/app/observation/observation-view/observation-view-attachment/observation-view-attachment.component.ts @@ -1,7 +1,16 @@ +import { CommonModule } from '@angular/common'; import { Component, Input } from '@angular/core'; +import { MatGridListModule } from '@angular/material/grid-list'; +import { AttachmentComponent } from 'mage-web-app/observation/attachment/attachment.component'; @Component({ selector: 'observation-view-attachment', + standalone: true, + imports: [ + CommonModule, + MatGridListModule, + AttachmentComponent + ], templateUrl: './observation-view-attachment.component.html', styleUrls: ['./observation-view-attachment.component.scss'] }) diff --git a/web-app/src/app/observation/observation-view/observation-view-checkbox/observation-view-checkbox.component.spec.ts b/web-app/src/app/observation/observation-view/observation-view-checkbox/observation-view-checkbox.component.spec.ts index a67a3ceed..f9b065bc8 100644 --- a/web-app/src/app/observation/observation-view/observation-view-checkbox/observation-view-checkbox.component.spec.ts +++ b/web-app/src/app/observation/observation-view/observation-view-checkbox/observation-view-checkbox.component.spec.ts @@ -9,10 +9,8 @@ describe('ObservationViewCheckboxComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ObservationViewCheckboxComponent ], - imports: [MatCheckboxModule] - }) - .compileComponents(); + imports: [ObservationViewCheckboxComponent, MatCheckboxModule] + }).compileComponents(); })); beforeEach(() => { diff --git a/web-app/src/app/observation/observation-view/observation-view-checkbox/observation-view-checkbox.component.ts b/web-app/src/app/observation/observation-view/observation-view-checkbox/observation-view-checkbox.component.ts index 139e2e35c..5c8d7a84f 100644 --- a/web-app/src/app/observation/observation-view/observation-view-checkbox/observation-view-checkbox.component.ts +++ b/web-app/src/app/observation/observation-view/observation-view-checkbox/observation-view-checkbox.component.ts @@ -1,7 +1,14 @@ +import { CommonModule } from '@angular/common'; import { Component, Input } from '@angular/core'; +import { MatCheckboxModule } from '@angular/material/checkbox'; @Component({ selector: 'observation-view-checkbox', + standalone: true, + imports: [ + CommonModule, + MatCheckboxModule + ], templateUrl: './observation-view-checkbox.component.html', styleUrls: ['./observation-view-checkbox.component.scss'] }) diff --git a/web-app/src/app/observation/observation-view/observation-view-date/observation-view-date.component.spec.ts b/web-app/src/app/observation/observation-view/observation-view-date/observation-view-date.component.spec.ts index 9c3ce3b77..d1fc87424 100644 --- a/web-app/src/app/observation/observation-view/observation-view-date/observation-view-date.component.spec.ts +++ b/web-app/src/app/observation/observation-view/observation-view-date/observation-view-date.component.spec.ts @@ -10,7 +10,7 @@ describe('ObservationViewDateComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ObservationViewDateComponent, MomentPipe] + imports: [ObservationViewDateComponent, MomentPipe] }) .compileComponents(); })); diff --git a/web-app/src/app/observation/observation-view/observation-view-date/observation-view-date.component.ts b/web-app/src/app/observation/observation-view/observation-view-date/observation-view-date.component.ts index 4c892732a..153aaf424 100644 --- a/web-app/src/app/observation/observation-view/observation-view-date/observation-view-date.component.ts +++ b/web-app/src/app/observation/observation-view/observation-view-date/observation-view-date.component.ts @@ -1,7 +1,14 @@ +import { CommonModule } from '@angular/common'; import { Component, Input } from '@angular/core'; +import { MomentModule } from 'mage-web-app/moment/moment.module'; @Component({ selector: 'observation-view-date', + standalone: true, + imports: [ + CommonModule, + MomentModule + ], templateUrl: './observation-view-date.component.html', styleUrls: ['./observation-view-date.component.scss'] }) diff --git a/web-app/src/app/observation/observation-view/observation-view-form.component.scss b/web-app/src/app/observation/observation-view/observation-view-form.component.scss index 43296e05c..f719e31d6 100644 --- a/web-app/src/app/observation/observation-view/observation-view-form.component.scss +++ b/web-app/src/app/observation/observation-view/observation-view-form.component.scss @@ -7,7 +7,7 @@ .header__title { margin-left: -16px; - color: mat.get-color-from-palette($app-primary); + color: mat.m2-get-color-from-palette($app-primary); } .form-header { diff --git a/web-app/src/app/observation/observation-view/observation-view-form.component.spec.ts b/web-app/src/app/observation/observation-view/observation-view-form.component.spec.ts index 622facf82..93431b0b0 100644 --- a/web-app/src/app/observation/observation-view/observation-view-form.component.spec.ts +++ b/web-app/src/app/observation/observation-view/observation-view-form.component.spec.ts @@ -8,11 +8,14 @@ import { MatCardModule as MatCardModule } from '@angular/material/card'; import { MatCheckboxModule as MatCheckboxModule } from '@angular/material/checkbox'; @Component({ - selector: `host-component`, - template: `` + standalone: true, + imports: [ObservationViewFormComponent], + template: ` + + ` }) class TestHostComponent { form = { @@ -37,9 +40,10 @@ describe('ObservationViewFormComponent', () => { MatIconModule, MatFormFieldModule, MatCardModule, - MatCheckboxModule + MatCheckboxModule, + ObservationViewFormComponent, + TestHostComponent ], - declarations: [ObservationViewFormComponent, TestHostComponent] }).compileComponents(); })); diff --git a/web-app/src/app/observation/observation-view/observation-view-form.component.ts b/web-app/src/app/observation/observation-view/observation-view-form.component.ts index e5baa70e7..9668bf426 100644 --- a/web-app/src/app/observation/observation-view/observation-view-form.component.ts +++ b/web-app/src/app/observation/observation-view/observation-view-form.component.ts @@ -1,19 +1,58 @@ -import { animate, state, style, transition, trigger } from '@angular/animations'; -import { Component, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core'; +import { + animate, + state, + style, + transition, + trigger +} from '@angular/animations'; +import { CommonModule } from '@angular/common'; +import { + Component, + Input, + OnChanges, + OnInit, + SimpleChanges +} from '@angular/core'; +import { MatCardModule } from '@angular/material/card'; +import { MatIconModule } from '@angular/material/icon'; +import { GeometryModule } from 'mage-web-app/geometry/geometry.module'; +import { + ObservationViewGeometryComponent, + ObservationViewDateComponent, + ObservationViewCheckboxComponent, + ObservationViewTextComponent, + ObservationViewTextareaComponent, + ObservationViewMultiselectdropdownComponent +} from './observation-view'; +import { ObservationViewAttachmentComponent } from './observation-view-attachment/observation-view-attachment.component'; +import { ObservationViewPasswordComponent } from './observation-view-password/observation-view-password.component'; @Component({ selector: 'observation-view-form', + standalone: true, + imports: [ + CommonModule, + MatCardModule, + MatIconModule, + GeometryModule, + ObservationViewAttachmentComponent, + ObservationViewGeometryComponent, + ObservationViewDateComponent, + ObservationViewCheckboxComponent, + ObservationViewTextComponent, + ObservationViewTextareaComponent, + ObservationViewPasswordComponent, + ObservationViewMultiselectdropdownComponent + ], templateUrl: './observation-view-form.component.html', styleUrls: ['./observation-view-form.component.scss'], animations: [ trigger('expand', [ transition(':enter', [ style({ height: 0, opacity: 0 }), - animate('300ms', style({ height: '*', opacity: 1 })), + animate('300ms', style({ height: '*', opacity: 1 })) ]), - transition(':leave', [ - animate('300ms', style({ height: 0, opacity: 0 })) - ]) + transition(':leave', [animate('300ms', style({ height: 0, opacity: 0 }))]) ]), trigger('rotate', [ state('true', style({ transform: 'rotate(180deg)' })), @@ -23,48 +62,54 @@ import { Component, Input, OnChanges, OnInit, SimpleChanges } from '@angular/cor ] }) export class ObservationViewFormComponent implements OnInit, OnChanges { - @Input() form: any - @Input() attachments: any[] - @Input() expand: boolean + @Input() form: any; + @Input() attachments: any[]; + @Input() expand: boolean; @Input() geometryStyle: any; - primaryField: any = {} - secondaryField: any = {} + primaryField: any = {}; + secondaryField: any = {}; ngOnInit(): void { - this.updateView() + this.updateView(); } ngOnChanges(changes: SimpleChanges): void { - this.updateView() + this.updateView(); } nonArchivedFields(fields: any[]): any[] { return fields - .filter(field => !field.archived) + .filter((field) => !field.archived) .sort((a: { id: number }, b: { id: number }) => a.id - b.id); } hasContent(): boolean { - const fields: any[] = this.form.fields + const fields: any[] = this.form.fields; return fields - .filter(field => !field.archived) - .some(field => { + .filter((field) => !field.archived) + .some((field) => { if (field.type === 'attachment') { - return this.attachments.filter(attachment => attachment.observationFormId === this.form.remoteId).length + return this.attachments.filter( + (attachment) => attachment.observationFormId === this.form.remoteId + ).length; } else { - return field.value + return field.value; } - }) + }); } private updateView(): void { if (this.form.primaryFeedField) { - this.primaryField = this.form.fields.find(field => field.name === this.form.primaryFeedField) + this.primaryField = this.form.fields.find( + (field) => field.name === this.form.primaryFeedField + ); } if (this.form.secondaryFeedField) { - this.secondaryField = this.form.fields.find(field => field.name === this.form.secondaryFeedField) + this.secondaryField = this.form.fields.find( + (field) => field.name === this.form.secondaryFeedField + ); } } } diff --git a/web-app/src/app/observation/observation-view/observation-view-geometry/observation-view-geometry.component.spec.ts b/web-app/src/app/observation/observation-view/observation-view-geometry/observation-view-geometry.component.spec.ts index 20be08ebb..220b2da7e 100644 --- a/web-app/src/app/observation/observation-view/observation-view-geometry/observation-view-geometry.component.spec.ts +++ b/web-app/src/app/observation/observation-view/observation-view-geometry/observation-view-geometry.component.spec.ts @@ -10,7 +10,7 @@ describe('ObservationViewGeometryComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ObservationViewGeometryComponent, GeometryPipe] + imports: [ObservationViewGeometryComponent, GeometryPipe] }) .compileComponents(); })); diff --git a/web-app/src/app/observation/observation-view/observation-view-geometry/observation-view-geometry.component.ts b/web-app/src/app/observation/observation-view/observation-view-geometry/observation-view-geometry.component.ts index c53977c03..c58fa5900 100644 --- a/web-app/src/app/observation/observation-view/observation-view-geometry/observation-view-geometry.component.ts +++ b/web-app/src/app/observation/observation-view/observation-view-geometry/observation-view-geometry.component.ts @@ -1,7 +1,16 @@ +import { CommonModule } from '@angular/common'; import { Component, Input, OnChanges, SimpleChanges } from '@angular/core'; +import { GeometryModule } from 'mage-web-app/geometry/geometry.module'; +import { MapClipComponent } from 'mage-web-app/map/clip/clip.component'; @Component({ selector: 'observation-view-geometry', + standalone: true, + imports: [ + CommonModule, + MapClipComponent, + GeometryModule + ], templateUrl: './observation-view-geometry.component.html', styleUrls: ['./observation-view-geometry.component.scss'] }) diff --git a/web-app/src/app/observation/observation-view/observation-view-multiselectdropdown/observation-view-multiselectdropdown.component.spec.ts b/web-app/src/app/observation/observation-view/observation-view-multiselectdropdown/observation-view-multiselectdropdown.component.spec.ts index 4af679a81..797826a58 100644 --- a/web-app/src/app/observation/observation-view/observation-view-multiselectdropdown/observation-view-multiselectdropdown.component.spec.ts +++ b/web-app/src/app/observation/observation-view/observation-view-multiselectdropdown/observation-view-multiselectdropdown.component.spec.ts @@ -8,7 +8,7 @@ describe('ObservationViewMultiselectdropdownComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ObservationViewMultiselectdropdownComponent ] + imports: [ObservationViewMultiselectdropdownComponent ] }) .compileComponents(); })); diff --git a/web-app/src/app/observation/observation-view/observation-view-password/observation-view-password.component.spec.ts b/web-app/src/app/observation/observation-view/observation-view-password/observation-view-password.component.spec.ts index 173c90e3f..d406dce8c 100644 --- a/web-app/src/app/observation/observation-view/observation-view-password/observation-view-password.component.spec.ts +++ b/web-app/src/app/observation/observation-view/observation-view-password/observation-view-password.component.spec.ts @@ -9,7 +9,7 @@ describe('ObservationViewPasswordComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ ObservationViewPasswordComponent, PasswordPipe ] + imports: [ ObservationViewPasswordComponent, PasswordPipe ] }) .compileComponents(); })); diff --git a/web-app/src/app/observation/observation-view/observation-view-password/observation-view-password.component.ts b/web-app/src/app/observation/observation-view/observation-view-password/observation-view-password.component.ts index 78ccc1879..ce100e7de 100644 --- a/web-app/src/app/observation/observation-view/observation-view-password/observation-view-password.component.ts +++ b/web-app/src/app/observation/observation-view/observation-view-password/observation-view-password.component.ts @@ -1,8 +1,15 @@ +import { CommonModule } from '@angular/common'; import { Component, Input } from '@angular/core'; +import { PasswordPipe } from './password.pipe'; @Component({ selector: 'observation-view-password', + standalone: true, + imports: [ + CommonModule, + PasswordPipe + ], templateUrl: './observation-view-password.component.html', styleUrls: ['./observation-view-password.component.scss'] }) diff --git a/web-app/src/app/observation/observation-view/observation-view-text/observation-view-text.component.spec.ts b/web-app/src/app/observation/observation-view/observation-view-text/observation-view-text.component.spec.ts index 9a1cf17e6..8ad0ab9d8 100644 --- a/web-app/src/app/observation/observation-view/observation-view-text/observation-view-text.component.spec.ts +++ b/web-app/src/app/observation/observation-view/observation-view-text/observation-view-text.component.spec.ts @@ -8,7 +8,7 @@ describe('TextComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ObservationViewTextComponent ] + imports: [ObservationViewTextComponent ] }) .compileComponents(); })); diff --git a/web-app/src/app/observation/observation-view/observation-view-textarea/observation-view-textarea.component.spec.ts b/web-app/src/app/observation/observation-view/observation-view-textarea/observation-view-textarea.component.spec.ts index e38e7abc2..0e000faeb 100644 --- a/web-app/src/app/observation/observation-view/observation-view-textarea/observation-view-textarea.component.spec.ts +++ b/web-app/src/app/observation/observation-view/observation-view-textarea/observation-view-textarea.component.spec.ts @@ -8,7 +8,7 @@ describe('ObservationViewTextareaComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ObservationViewTextareaComponent ] + imports: [ObservationViewTextareaComponent ] }) .compileComponents(); })); diff --git a/web-app/src/app/observation/observation-view/observation-view.component.ts b/web-app/src/app/observation/observation-view/observation-view.component.ts index 6da5e2cf3..0ba1bf925 100644 --- a/web-app/src/app/observation/observation-view/observation-view.component.ts +++ b/web-app/src/app/observation/observation-view/observation-view.component.ts @@ -11,9 +11,34 @@ import { LocalStorageService } from '../../http/local-storage.service'; import { MapService } from '../../map/map.service'; import { EventService } from '../../event/event.service'; import { UserService } from '../../user/user.service'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { MatCardModule } from '@angular/material/card'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatToolbarModule } from '@angular/material/toolbar'; +import { GeometryModule } from 'mage-web-app/geometry/geometry.module'; +import { MapClipComponent } from 'mage-web-app/map/clip/clip.component'; +import { MomentModule } from 'mage-web-app/moment/moment.module'; +import { ObservationViewFormComponent } from './observation-view-form.component'; @Component({ selector: 'observation-view', + standalone: true, + imports: [ + CommonModule, + FormsModule, + MatToolbarModule, + MatCardModule, + MatDividerModule, + MatFormFieldModule, + MatIconModule, + MomentModule, + GeometryModule, + MapClipComponent, + ObservationViewFormComponent + ], templateUrl: './observation-view.component.html', styleUrls: ['./observation-view.component.scss'], animations: [ diff --git a/web-app/src/app/observation/observation.service.spec.ts b/web-app/src/app/observation/observation.service.spec.ts index 2b19d587a..2734a22b7 100644 --- a/web-app/src/app/observation/observation.service.spec.ts +++ b/web-app/src/app/observation/observation.service.spec.ts @@ -1,13 +1,14 @@ import { TestBed } from '@angular/core/testing'; import { ObservationService } from './observation.service'; -import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { provideHttpClientTesting } from '@angular/common/http/testing'; +import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; describe('Observation Service', () => { beforeEach(() => { TestBed.configureTestingModule({ - providers: [ObservationService], - imports: [HttpClientTestingModule] - }); + imports: [], + providers: [ObservationService, provideHttpClient(withInterceptorsFromDi()), provideHttpClientTesting()] +}); }); afterEach(() => { diff --git a/web-app/src/app/preferences/coordinate-system/coordinate-system.component.spec.ts b/web-app/src/app/preferences/coordinate-system/coordinate-system.component.spec.ts index 454a9c381..bb3a6fd9f 100644 --- a/web-app/src/app/preferences/coordinate-system/coordinate-system.component.spec.ts +++ b/web-app/src/app/preferences/coordinate-system/coordinate-system.component.spec.ts @@ -11,12 +11,12 @@ describe('CoordinateSystemComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [CoordinateSystemComponent], imports: [ MatSelectModule, MatIconModule, MatFormFieldModule, - BrowserAnimationsModule + BrowserAnimationsModule, + CoordinateSystemComponent ] }).compileComponents(); })); diff --git a/web-app/src/app/preferences/coordinate-system/coordinate-system.component.ts b/web-app/src/app/preferences/coordinate-system/coordinate-system.component.ts index 796b93bd4..462ec9177 100644 --- a/web-app/src/app/preferences/coordinate-system/coordinate-system.component.ts +++ b/web-app/src/app/preferences/coordinate-system/coordinate-system.component.ts @@ -1,5 +1,8 @@ +import { CommonModule } from '@angular/common'; import { Component, OnInit } from '@angular/core'; -import { MatSelectChange as MatSelectChange } from '@angular/material/select'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatSelectChange as MatSelectChange, MatSelectModule } from '@angular/material/select'; import { LocalStorageService } from 'src/app/http/local-storage.service'; interface CoordinateSystemOption { @@ -9,6 +12,13 @@ interface CoordinateSystemOption { @Component({ selector: 'coordinate-system', + standalone: true, + imports: [ + CommonModule, + MatIconModule, + MatFormFieldModule, + MatSelectModule + ], templateUrl: './coordinate-system.component.html', styleUrls: ['./coordinate-system.component.scss'] }) diff --git a/web-app/src/app/preferences/polling-interval/polling-interval.component.spec.ts b/web-app/src/app/preferences/polling-interval/polling-interval.component.spec.ts index eee0be69c..93b26b0fb 100644 --- a/web-app/src/app/preferences/polling-interval/polling-interval.component.spec.ts +++ b/web-app/src/app/preferences/polling-interval/polling-interval.component.spec.ts @@ -12,14 +12,14 @@ describe('PollingIntervalComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [PollingIntervalComponent], imports: [ MatSelectModule, MatIconModule, MatFormFieldModule, MatSelectModule, BrowserAnimationsModule, - CommonModule + CommonModule, + PollingIntervalComponent ] }).compileComponents(); })); diff --git a/web-app/src/app/preferences/polling-interval/polling-interval.component.ts b/web-app/src/app/preferences/polling-interval/polling-interval.component.ts index c9162257e..9de14722d 100644 --- a/web-app/src/app/preferences/polling-interval/polling-interval.component.ts +++ b/web-app/src/app/preferences/polling-interval/polling-interval.component.ts @@ -1,6 +1,9 @@ import { Component, OnDestroy, OnInit } from '@angular/core'; -import { MatSelectChange as MatSelectChange } from '@angular/material/select'; +import { MatSelectChange as MatSelectChange, MatSelectModule } from '@angular/material/select'; import { PollingService } from '../../event/polling.service'; +import { CommonModule } from '@angular/common'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; interface PollingOption { title: string @@ -9,6 +12,13 @@ interface PollingOption { @Component({ selector: 'polling-interval', + standalone: true, + imports: [ + CommonModule, + MatIconModule, + MatFormFieldModule, + MatSelectModule + ], templateUrl: './polling-interval.component.html', styleUrls: ['./polling-interval.component.scss'] }) diff --git a/web-app/src/app/preferences/preferences.component.scss b/web-app/src/app/preferences/preferences.component.scss index e1da8d1d5..032f0056c 100644 --- a/web-app/src/app/preferences/preferences.component.scss +++ b/web-app/src/app/preferences/preferences.component.scss @@ -19,7 +19,7 @@ mat-icon { justify-content: flex-end; opacity: 1; cursor: pointer; - background-color: mat.get-color-from-palette($app-primary); + background-color: mat.m2-get-color-from-palette($app-primary); } .profile-avatar { @@ -35,7 +35,7 @@ mat-icon { margin-top: 16px; margin-bottom: 24px; margin-left: 8px; - color: mat.get-color-from-palette($app-primary); + color: mat.m2-get-color-from-palette($app-primary); } .preferences { diff --git a/web-app/src/app/preferences/preferences.component.spec.ts b/web-app/src/app/preferences/preferences.component.spec.ts index d57ed4669..a97568c14 100644 --- a/web-app/src/app/preferences/preferences.component.spec.ts +++ b/web-app/src/app/preferences/preferences.component.spec.ts @@ -14,14 +14,16 @@ describe('Preferences Component', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ + imports: [ PreferencesComponent, CoordinateSystemComponent, TimeZoneComponent, PollingIntervalComponent, - TimeFormatComponent + TimeFormatComponent, + MatIconModule, + MatFormFieldModule, + MatSelectModule ], - imports: [MatIconModule, MatFormFieldModule, MatSelectModule] }).compileComponents(); })); diff --git a/web-app/src/app/preferences/preferences.component.ts b/web-app/src/app/preferences/preferences.component.ts index 4fd3270ab..061a058f9 100644 --- a/web-app/src/app/preferences/preferences.component.ts +++ b/web-app/src/app/preferences/preferences.component.ts @@ -1,7 +1,20 @@ +import { CommonModule } from '@angular/common'; import { Component } from '@angular/core'; +import { CoordinateSystemComponent } from './coordinate-system/coordinate-system.component'; +import { PollingIntervalComponent } from './polling-interval/polling-interval.component'; +import { TimeFormatComponent } from './time-format/time-format.component'; +import { TimeZoneComponent } from './time-zone/time-zone.component'; @Component({ selector: 'preferences', + standalone: true, + imports: [ + CommonModule, + PollingIntervalComponent, + TimeFormatComponent, + TimeZoneComponent, + CoordinateSystemComponent + ], templateUrl: './preferences.component.html', styleUrls: ['./preferences.component.scss'] }) diff --git a/web-app/src/app/preferences/time-format/time-format.component.spec.ts b/web-app/src/app/preferences/time-format/time-format.component.spec.ts index 42441e28e..61139a5d5 100644 --- a/web-app/src/app/preferences/time-format/time-format.component.spec.ts +++ b/web-app/src/app/preferences/time-format/time-format.component.spec.ts @@ -11,13 +11,13 @@ describe('TimeFormat Component', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [TimeFormatComponent], imports: [ MatSelectModule, MatIconModule, MatFormFieldModule, BrowserAnimationsModule, - MatSelectModule + MatSelectModule, + TimeFormatComponent ] }).compileComponents(); })); diff --git a/web-app/src/app/preferences/time-format/time-format.component.ts b/web-app/src/app/preferences/time-format/time-format.component.ts index 322975996..56122cd88 100644 --- a/web-app/src/app/preferences/time-format/time-format.component.ts +++ b/web-app/src/app/preferences/time-format/time-format.component.ts @@ -1,5 +1,8 @@ +import { CommonModule } from '@angular/common'; import { Component, OnInit } from '@angular/core'; -import { MatSelectChange as MatSelectChange } from '@angular/material/select'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatSelectChange as MatSelectChange, MatSelectModule } from '@angular/material/select'; import { LocalStorageService } from 'src/app/http/local-storage.service'; interface TimeFormatOption { @@ -9,6 +12,13 @@ interface TimeFormatOption { @Component({ selector: 'time-format', + standalone: true, + imports: [ + CommonModule, + MatIconModule, + MatFormFieldModule, + MatSelectModule + ], templateUrl: './time-format.component.html', styleUrls: ['./time-format.component.scss'] }) diff --git a/web-app/src/app/preferences/time-zone/time-zone.component.spec.ts b/web-app/src/app/preferences/time-zone/time-zone.component.spec.ts index d335b18df..85f570d73 100644 --- a/web-app/src/app/preferences/time-zone/time-zone.component.spec.ts +++ b/web-app/src/app/preferences/time-zone/time-zone.component.spec.ts @@ -10,12 +10,12 @@ describe('TimeZone Component', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [TimeZoneComponent], imports: [ MatSelectModule, MatIconModule, MatFormFieldModule, - MatSelectModule + MatSelectModule, + TimeZoneComponent ] }).compileComponents(); })); diff --git a/web-app/src/app/preferences/time-zone/time-zone.component.ts b/web-app/src/app/preferences/time-zone/time-zone.component.ts index a61a6a536..bb89dcf67 100644 --- a/web-app/src/app/preferences/time-zone/time-zone.component.ts +++ b/web-app/src/app/preferences/time-zone/time-zone.component.ts @@ -1,5 +1,8 @@ +import { CommonModule } from '@angular/common'; import { Component, OnInit } from '@angular/core'; -import { MatSelectChange as MatSelectChange } from '@angular/material/select'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatSelectChange as MatSelectChange, MatSelectModule } from '@angular/material/select'; import { LocalStorageService } from 'src/app/http/local-storage.service'; interface TimeZoneOption { @@ -9,6 +12,13 @@ interface TimeZoneOption { @Component({ selector: 'time-zone', + standalone: true, + imports: [ + CommonModule, + MatIconModule, + MatFormFieldModule, + MatSelectModule + ], templateUrl: './time-zone.component.html', styleUrls: ['./time-zone.component.scss'] }) diff --git a/web-app/src/app/settings/settings.service.spec.ts b/web-app/src/app/settings/settings.service.spec.ts index a31e83f4f..323791f01 100644 --- a/web-app/src/app/settings/settings.service.spec.ts +++ b/web-app/src/app/settings/settings.service.spec.ts @@ -1,5 +1,5 @@ -import { HttpClient } from '@angular/common/http'; -import { HttpTestingController, HttpClientTestingModule } from '@angular/common/http/testing'; +import { HttpClient, provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; +import { HttpTestingController, provideHttpClientTesting } from '@angular/common/http/testing'; import { TestBed } from '@angular/core/testing'; import { ExportService } from '../export/export.service'; import { SettingsService } from './settings.service'; @@ -10,9 +10,9 @@ describe('Settings Service Tests', () => { beforeEach(() => { TestBed.configureTestingModule({ - providers: [ExportService], - imports: [HttpClientTestingModule] - }); + imports: [], + providers: [ExportService, provideHttpClient(withInterceptorsFromDi()), provideHttpClientTesting()] +}); // Inject the http service and test controller for each test httpClient = TestBed.inject(HttpClient); diff --git a/web-app/src/app/swagger/swagger.component.spec.ts b/web-app/src/app/swagger/swagger.component.spec.ts index a50f8541f..9ab214daf 100644 --- a/web-app/src/app/swagger/swagger.component.spec.ts +++ b/web-app/src/app/swagger/swagger.component.spec.ts @@ -1,4 +1,4 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; import { MatIconModule } from '@angular/material/icon'; import { MatToolbarModule } from '@angular/material/toolbar'; @@ -8,10 +8,9 @@ describe('SwaggerComponent', () => { let component: SwaggerComponent; let fixture: ComponentFixture; - beforeEach(async(() => { + beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - imports: [MatIconModule, MatToolbarModule], - declarations: [SwaggerComponent] + imports: [MatIconModule, MatToolbarModule, SwaggerComponent], }) .compileComponents(); })); diff --git a/web-app/src/app/swagger/swagger.component.ts b/web-app/src/app/swagger/swagger.component.ts index 420a2902d..90d41bd05 100644 --- a/web-app/src/app/swagger/swagger.component.ts +++ b/web-app/src/app/swagger/swagger.component.ts @@ -1,7 +1,10 @@ import { AfterViewInit, Component, ElementRef } from '@angular/core'; import { LocalStorageService } from '../http/local-storage.service'; import SwaggerUI from 'swagger-ui'; -import { Router } from '@angular/router'; +import { Router, RouterModule } from '@angular/router'; +import { CommonModule } from '@angular/common'; +import { MatIconModule } from '@angular/material/icon'; +import { MatToolbarModule } from '@angular/material/toolbar'; const DisableAuthorizePlugin = function () { return { @@ -15,6 +18,13 @@ const DisableAuthorizePlugin = function () { @Component({ selector: 'swagger', + standalone: true, + imports: [ + CommonModule, + RouterModule, + MatToolbarModule, + MatIconModule + ], templateUrl: './swagger.component.html', styleUrls: ['./swagger.component.scss'] }) diff --git a/web-app/src/app/swagger/swagger.module.ts b/web-app/src/app/swagger/swagger.module.ts index 17ab21d73..27e763917 100644 --- a/web-app/src/app/swagger/swagger.module.ts +++ b/web-app/src/app/swagger/swagger.module.ts @@ -24,11 +24,9 @@ const routes: Routes = [{ class AngularModule { } @NgModule({ - declarations: [ - SwaggerComponent - ], imports: [ AngularModule, + SwaggerComponent, RouterModule.forChild(routes) ], exports: [ RouterModule ] diff --git a/web-app/src/app/user/location/location.service.spec.ts b/web-app/src/app/user/location/location.service.spec.ts index ef566b3c2..1f6a4a88d 100644 --- a/web-app/src/app/user/location/location.service.spec.ts +++ b/web-app/src/app/user/location/location.service.spec.ts @@ -1,15 +1,16 @@ import { TestBed } from '@angular/core/testing'; import { LocationService } from './location.service'; -import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { provideHttpClientTesting } from '@angular/common/http/testing'; +import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; describe('Location Service Tests', () => { beforeEach(() => { TestBed.configureTestingModule({ - providers: [LocationService], - imports: [HttpClientTestingModule] - }); + imports: [], + providers: [LocationService, provideHttpClient(withInterceptorsFromDi()), provideHttpClientTesting()] +}); }); afterEach(() => { diff --git a/web-app/src/app/user/password/password-reset-success-dialog.spec.ts b/web-app/src/app/user/password/password-reset-success-dialog.spec.ts index 08c6ec0c9..4fac6704f 100644 --- a/web-app/src/app/user/password/password-reset-success-dialog.spec.ts +++ b/web-app/src/app/user/password/password-reset-success-dialog.spec.ts @@ -8,8 +8,7 @@ describe('Password Reset Success Component', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [PasswordResetSuccessDialog], - imports: [MatDialogModule], + imports: [MatDialogModule, PasswordResetSuccessDialog], providers: [{ provide: MatDialogRef, useValue: {} diff --git a/web-app/src/app/user/profile/profile.component.spec.ts b/web-app/src/app/user/profile/profile.component.spec.ts index c2c8cd947..541f7b090 100644 --- a/web-app/src/app/user/profile/profile.component.spec.ts +++ b/web-app/src/app/user/profile/profile.component.spec.ts @@ -1,12 +1,16 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { ProfileComponent } from './profile.component'; import { MatDialogModule as MatDialogModule } from '@angular/material/dialog'; -import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { provideHttpClientTesting } from '@angular/common/http/testing'; import { MatIconModule } from '@angular/material/icon'; import { MatFormFieldModule as MatFormFieldModule } from '@angular/material/form-field'; import { UserAvatarModule } from '../user-avatar/user-avatar.module'; import { MatCardModule as MatCardModule } from '@angular/material/card'; import { MatToolbarModule } from '@angular/material/toolbar'; +import { + provideHttpClient, + withInterceptorsFromDi +} from '@angular/common/http'; describe('Profile Component', () => { let component: ProfileComponent; @@ -14,15 +18,18 @@ describe('Profile Component', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ProfileComponent], imports: [ - HttpClientTestingModule, MatDialogModule, + ProfileComponent, MatIconModule, MatFormFieldModule, UserAvatarModule, MatCardModule, MatToolbarModule + ], + providers: [ + provideHttpClient(withInterceptorsFromDi()), + provideHttpClientTesting() ] }).compileComponents(); })); diff --git a/web-app/src/app/user/profile/profile.component.ts b/web-app/src/app/user/profile/profile.component.ts index 8c5ef8f17..dcf89298a 100644 --- a/web-app/src/app/user/profile/profile.component.ts +++ b/web-app/src/app/user/profile/profile.component.ts @@ -1,6 +1,6 @@ import { Component, OnInit } from '@angular/core'; import { UserService } from '../../user/user.service'; -import { FormControl, FormGroup, Validators } from '@angular/forms'; +import { FormControl, FormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms'; import { Router } from '@angular/router'; import { HttpEvent, HttpEventType } from '@angular/common/http'; import { zxcvbn, zxcvbnOptions } from '@zxcvbn-ts/core' @@ -9,9 +9,30 @@ import * as zxcvbnEnPackage from '@zxcvbn-ts/language-en' import { MatDialog as MatDialog } from '@angular/material/dialog'; import { PasswordResetSuccessDialog } from '../password/password-reset-success-dialog'; import { PasswordStrength, passwordStrengthScores } from '../../entities/entities.password'; +import { CommonModule } from '@angular/common'; +import { MatIconModule } from '@angular/material/icon'; +import { MatProgressBarModule } from '@angular/material/progress-bar'; +import { UserAvatarComponent } from '../user-avatar/user-avatar.component'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatCardModule } from '@angular/material/card'; +import { MatToolbarModule } from '@angular/material/toolbar'; @Component({ selector: 'profile', + standalone: true, + imports: [ + CommonModule, + FormsModule, + ReactiveFormsModule, + MatFormFieldModule, + MatInputModule, + MatProgressBarModule, + MatIconModule, + UserAvatarComponent, + MatCardModule, + MatToolbarModule + ], templateUrl: './profile.component.html', styleUrls: ['./profile.component.scss'] }) diff --git a/web-app/src/app/user/profile/profile.module.ts b/web-app/src/app/user/profile/profile.module.ts index 5003df1d2..30315f2dd 100644 --- a/web-app/src/app/user/profile/profile.module.ts +++ b/web-app/src/app/user/profile/profile.module.ts @@ -39,12 +39,10 @@ const routes: Routes = [{ class AngularModule { } @NgModule({ - declarations: [ - ProfileComponent - ], imports: [ AngularModule, UserAvatarModule, + ProfileComponent, RouterModule.forChild(routes) ], exports: [ RouterModule ] diff --git a/web-app/src/app/user/team.service.spec.ts b/web-app/src/app/user/team.service.spec.ts index a0bb0e50b..073e204dd 100644 --- a/web-app/src/app/user/team.service.spec.ts +++ b/web-app/src/app/user/team.service.spec.ts @@ -1,14 +1,15 @@ import { TestBed } from '@angular/core/testing'; import { TeamService } from './team.service'; -import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { provideHttpClientTesting } from '@angular/common/http/testing'; +import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; describe('Team Service Tests', () => { beforeEach(() => { TestBed.configureTestingModule({ - providers: [TeamService], - imports: [HttpClientTestingModule] - }); + imports: [], + providers: [TeamService, provideHttpClient(withInterceptorsFromDi()), provideHttpClientTesting()] +}); }); afterEach(() => { diff --git a/web-app/src/app/user/user-avatar/user-avatar.component.spec.ts b/web-app/src/app/user/user-avatar/user-avatar.component.spec.ts index 18650b057..2acd973ea 100644 --- a/web-app/src/app/user/user-avatar/user-avatar.component.spec.ts +++ b/web-app/src/app/user/user-avatar/user-avatar.component.spec.ts @@ -1,7 +1,8 @@ -import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { provideHttpClientTesting } from '@angular/common/http/testing'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { UserAvatarComponent } from './user-avatar.component'; +import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; describe('UserAvatarComponent', () => { let component: UserAvatarComponent; @@ -9,9 +10,9 @@ describe('UserAvatarComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - imports: [HttpClientTestingModule], - declarations: [UserAvatarComponent] - }) + imports: [UserAvatarComponent], + providers: [provideHttpClient(withInterceptorsFromDi()), provideHttpClientTesting()] +}) .compileComponents(); })); diff --git a/web-app/src/app/user/user-avatar/user-avatar.component.ts b/web-app/src/app/user/user-avatar/user-avatar.component.ts index 16aeb4bdb..9bc01b8c3 100644 --- a/web-app/src/app/user/user-avatar/user-avatar.component.ts +++ b/web-app/src/app/user/user-avatar/user-avatar.component.ts @@ -1,9 +1,16 @@ +import { CommonModule } from '@angular/common' import { HttpClient } from '@angular/common/http' import { Component, Input, OnChanges, SimpleChanges } from '@angular/core' +import { MatIconModule } from '@angular/material/icon' import { DomSanitizer, SafeUrl } from '@angular/platform-browser' @Component({ selector: 'user-avatar', + standalone: true, + imports: [ + CommonModule, + MatIconModule + ], templateUrl: './user-avatar.component.html', styleUrls: ['./user-avatar.component.scss'] }) diff --git a/web-app/src/app/user/user-avatar/user-avatar.module.ts b/web-app/src/app/user/user-avatar/user-avatar.module.ts index da3f0b067..a1e67d779 100644 --- a/web-app/src/app/user/user-avatar/user-avatar.module.ts +++ b/web-app/src/app/user/user-avatar/user-avatar.module.ts @@ -4,13 +4,7 @@ import { UserAvatarComponent } from './user-avatar.component'; import { MatIconModule } from '@angular/material/icon'; @NgModule({ - declarations: [ - UserAvatarComponent - ], - imports: [ - CommonModule, - MatIconModule - ], - exports: [ UserAvatarComponent ] + imports: [CommonModule, MatIconModule, UserAvatarComponent], + exports: [UserAvatarComponent] }) -export class UserAvatarModule { } \ No newline at end of file +export class UserAvatarModule {} diff --git a/web-app/src/app/user/user-list/user-list-item.component.ts b/web-app/src/app/user/user-list/user-list-item.component.ts index 3334aaf09..3dbb9b5f2 100644 --- a/web-app/src/app/user/user-list/user-list-item.component.ts +++ b/web-app/src/app/user/user-list/user-list-item.component.ts @@ -1,11 +1,27 @@ import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core'; -import { MatRipple } from '@angular/material/core'; +import { MatRipple, MatRippleModule } from '@angular/material/core'; import { MapService } from '../../map/map.service'; import { LocalStorageService } from '../../http/local-storage.service'; import { FeedPanelService } from '../../feed-panel/feed-panel.service'; +import { CommonModule } from '@angular/common'; +import { MatIconModule } from '@angular/material/icon'; +import { MatCardModule } from '@angular/material/card'; +import { GeometryModule } from 'mage-web-app/geometry/geometry.module'; +import { MomentModule } from 'mage-web-app/moment/moment.module'; +import { UserAvatarModule } from '../user-avatar/user-avatar.module'; @Component({ selector: 'user-list-item', + standalone: true, + imports: [ + CommonModule, + MatCardModule, + MatRippleModule, + MatIconModule, + MomentModule, + GeometryModule, + UserAvatarModule + ], templateUrl: './user-list-item.component.html', styleUrls: ['./user-list-item.component.scss'] }) diff --git a/web-app/src/app/user/user-list/user-list.component.scss b/web-app/src/app/user/user-list/user-list.component.scss index ebd681151..215853c76 100644 --- a/web-app/src/app/user/user-list/user-list.component.scss +++ b/web-app/src/app/user/user-list/user-list.component.scss @@ -14,7 +14,7 @@ } .user-feed-toolbar { - color: mat.get-color-from-palette($app-primary); + color: mat.m2-get-color-from-palette($app-primary); background-color: white; margin-top: 8px; padding: 0 16px; diff --git a/web-app/src/app/user/user-list/user-list.component.ts b/web-app/src/app/user/user-list/user-list.component.ts index dc7d88360..3521072c2 100644 --- a/web-app/src/app/user/user-list/user-list.component.ts +++ b/web-app/src/app/user/user-list/user-list.component.ts @@ -2,81 +2,100 @@ import { Component, OnDestroy, OnInit } from '@angular/core'; import moment from 'moment'; import { EventService } from '../../event/event.service'; import { FilterService } from '../../filter/filter.service'; +import { UserListItemComponent } from './user-list-item.component'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatSelectModule } from '@angular/material/select'; +import { MatToolbarModule } from '@angular/material/toolbar'; +import { MomentModule } from 'mage-web-app/moment/moment.module'; @Component({ selector: 'user-list', + standalone: true, + imports: [ + CommonModule, + FormsModule, + MatToolbarModule, + MatFormFieldModule, + MatSelectModule, + MomentModule, + UserListItemComponent + ], templateUrl: './user-list.component.html', styleUrls: ['./user-list.component.scss'] }) export class UserListComponent implements OnInit, OnDestroy { + currentUserPage = 0; + usersChanged = 0; + userPages = []; + followUserId = null; + usersPerPage = 50; - currentUserPage = 0 - usersChanged = 0 - userPages = [] - followUserId = null - usersPerPage = 50 - - usersById = {} - feedUsers = [] + usersById = {}; + feedUsers = []; constructor( private eventService: EventService, - private filterService: FilterService) { - } + private filterService: FilterService + ) {} ngOnInit(): void { - this.filterService.addListener(this) - this.eventService.addUsersChangedListener(this) + this.filterService.addListener(this); + this.eventService.addUsersChangedListener(this); } ngOnDestroy(): void { - this.filterService.removeListener(this) - this.eventService.removeUsersChangedListener(this) + this.filterService.removeListener(this); + this.eventService.removeUsersChangedListener(this); } trackByPageId(index: number, page: any): any { - return index + return index; } trackByUserId(index: number, user: any): any { - return user.id + return user.id; } onFilterChanged(): void { - this.currentUserPage = 0 + this.currentUserPage = 0; } onUsersChanged(changed): void { - const { added = [], updated = [], removed = [] } = changed + const { added = [], updated = [], removed = [] } = changed; - added.forEach(user => { + added.forEach((user) => { this.usersById[user.id] = user; - }) + }); - updated.forEach(user => { + updated.forEach((user) => { const updatedUser = this.usersById[user.id]; if (updatedUser) { - this.usersById[updatedUser.id] = user + this.usersById[updatedUser.id] = user; } - }) + }); - removed.forEach(user => { + removed.forEach((user) => { delete this.usersById[user.id]; - }) + }); // update the news feed observations - this.feedUsers = Object.values(this.usersById) + this.feedUsers = Object.values(this.usersById); this.calculateUserPages(this.feedUsers); - }; + } calculateUserPages(users): void { if (!users) return; // sort the locations users.sort((a, b) => { - return moment(b.location.properties.timestamp).valueOf() - moment(a.location.properties.timestamp).valueOf() - }) + return ( + moment(b.location.properties.timestamp).valueOf() - + moment(a.location.properties.timestamp).valueOf() + ); + }); // slice into pages const pages = []; @@ -93,4 +112,4 @@ export class UserListComponent implements OnInit, OnDestroy { // ensure the page that they were on did not go away this.currentUserPage = Math.min(this.currentUserPage, pages.length - 1); } -} \ No newline at end of file +} diff --git a/web-app/src/app/user/user-popup/user-popup.component.ts b/web-app/src/app/user/user-popup/user-popup.component.ts index 20142c48d..b431f85fa 100644 --- a/web-app/src/app/user/user-popup/user-popup.component.ts +++ b/web-app/src/app/user/user-popup/user-popup.component.ts @@ -1,44 +1,66 @@ -import { Component, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core'; +import { + Component, + Input, + OnChanges, + OnInit, + SimpleChanges +} from '@angular/core'; import { FeedPanelService } from '../../feed-panel/feed-panel.service'; import moment from 'moment'; import { MapService } from '../../map/map.service'; +import { CommonModule } from '@angular/common'; +import { MatIconModule } from '@angular/material/icon'; +import { GeometryModule } from 'mage-web-app/geometry/geometry.module'; +import { MomentModule } from 'mage-web-app/moment/moment.module'; +import { UserAvatarModule } from '../user-avatar/user-avatar.module'; @Component({ selector: 'user-popup', + standalone: true, + imports: [ + CommonModule, + MatIconModule, + UserAvatarModule, + MomentModule, + GeometryModule + ], templateUrl: './user-popup.component.html', styleUrls: ['./user-popup.component.scss'] }) export class UserPopupComponent implements OnInit, OnChanges { @Input() userWithLocation: any; - user: any - location: any - date: string - followingUser: any + user: any; + location: any; + date: string; + followingUser: any; constructor( private feedPanelService: FeedPanelService, - private mapService: MapService) { } + private mapService: MapService + ) {} ngOnInit(): void { - this.updateView() + this.updateView(); } ngOnChanges(changes: SimpleChanges): void { - this.updateView() + this.updateView(); } private updateView(): void { - if (!this.userWithLocation) return + if (!this.userWithLocation) return; - this.user = this.userWithLocation.user - this.location = this.userWithLocation.location - this.followingUser = this.mapService.followedFeature - this.date = moment(this.location.properties.timestamp).format("YYYY-MM-DD HH:mm:ss") + this.user = this.userWithLocation.user; + this.location = this.userWithLocation.location; + this.followingUser = this.mapService.followedFeature; + this.date = moment(this.location.properties.timestamp).format( + 'YYYY-MM-DD HH:mm:ss' + ); } onInfo(): void { - this.feedPanelService.viewUser(this.userWithLocation) + this.feedPanelService.viewUser(this.userWithLocation); } onZoom(): void { diff --git a/web-app/src/app/user/user-view/user-view.component.ts b/web-app/src/app/user/user-view/user-view.component.ts index 9d5f4b9fe..df5d40742 100644 --- a/web-app/src/app/user/user-view/user-view.component.ts +++ b/web-app/src/app/user/user-view/user-view.component.ts @@ -1,14 +1,30 @@ import { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges } from '@angular/core'; import { LatLng } from 'leaflet'; -import { PointAccuracy } from '../../map/clip/clip.component'; +import { MapClipComponent, PointAccuracy } from '../../map/clip/clip.component'; import moment from 'moment'; import { MapService } from '../../map/map.service'; import { LocationService } from '../location/location.service'; import { EventService } from '../../event/event.service'; import { FilterService } from '../../filter/filter.service'; +import { CommonModule } from '@angular/common'; +import { MatCardModule } from '@angular/material/card'; +import { MatToolbarModule } from '@angular/material/toolbar'; +import { MatIconModule } from '@angular/material/icon'; +import { GeometryModule } from 'mage-web-app/geometry/geometry.module'; +import { UserAvatarModule } from '../user-avatar/user-avatar.module'; @Component({ selector: 'user-view', + standalone: true, + imports: [ + CommonModule, + MatToolbarModule, + MatCardModule, + MatIconModule, + MapClipComponent, + GeometryModule, + UserAvatarModule + ], templateUrl: './user-view.component.html', styleUrls: ['./user-view.component.scss'] }) diff --git a/web-app/src/app/user/user.service.spec.ts b/web-app/src/app/user/user.service.spec.ts index ce93ba0e3..55521b836 100644 --- a/web-app/src/app/user/user.service.spec.ts +++ b/web-app/src/app/user/user.service.spec.ts @@ -1,13 +1,14 @@ import { TestBed } from '@angular/core/testing'; import { UserService } from './user.service'; -import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { provideHttpClientTesting } from '@angular/common/http/testing'; +import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; describe('User Service Tests', () => { beforeEach(() => { TestBed.configureTestingModule({ - providers: [UserService], - imports: [HttpClientTestingModule] - }); + imports: [], + providers: [UserService, provideHttpClient(withInterceptorsFromDi()), provideHttpClientTesting()] +}); }); afterEach(() => { diff --git a/web-app/src/theme.scss b/web-app/src/theme.scss index b41d5af6d..1505322c2 100644 --- a/web-app/src/theme.scss +++ b/web-app/src/theme.scss @@ -4,13 +4,13 @@ @include mat.core(); -$app-theme: mat.define-light-theme(( +$app-theme: mat.m2-define-light-theme(( color: ( primary: $app-primary, accent: $app-accent, warn: $app-warn, ), - typography: mat.define-typography-config(), + typography: mat.m2-define-typography-config(), density: 0, )); diff --git a/web-app/src/variables.scss b/web-app/src/variables.scss index 52bba74bd..8a8a4b10f 100644 --- a/web-app/src/variables.scss +++ b/web-app/src/variables.scss @@ -3,11 +3,11 @@ // Define the palettes for your theme using the Material Design palettes available in palette.scss // (imported above). For each palette, you can optionally specify a default, lighter, and darker // hue. Available color palettes: https://material.io/design/color/ -$app-primary: mat.define-palette(mat.$blue-palette, 600, 200, 800); -$app-accent: mat.define-palette(mat.$orange-palette, A700, A100, A700); -$app-warn: mat.define-palette(mat.$red-palette, 600, 200, 800); +$app-primary: mat.m2-define-palette(mat.$m2-blue-palette, 600, 200, 800); +$app-accent: mat.m2-define-palette(mat.$m2-orange-palette, A700, A100, A700); +$app-warn: mat.m2-define-palette(mat.$m2-red-palette, 600, 200, 800); // Custom Sass colors vars (will be available in all the project) -$primary: mat.get-color-from-palette($app-primary); -$accent: mat.get-color-from-palette($app-accent); -$warn: mat.get-color-from-palette($app-warn); \ No newline at end of file +$primary: mat.m2-get-color-from-palette($app-primary); +$accent: mat.m2-get-color-from-palette($app-accent); +$warn: mat.m2-get-color-from-palette($app-warn); \ No newline at end of file diff --git a/web-app/vendor/ajsf-core/package.json b/web-app/vendor/ajsf-core/package.json index d233fcaf8..03cc3bfac 100644 --- a/web-app/vendor/ajsf-core/package.json +++ b/web-app/vendor/ajsf-core/package.json @@ -31,9 +31,9 @@ "tslib": "^2.0.0" }, "peerDependencies": { - "@angular/common": "^17.0.0", - "@angular/core": "^17.0.0", - "@angular/forms": "^17.0.0", + "@angular/common": "^19.0.0", + "@angular/core": "^19.0.0", + "@angular/forms": "^19.0.0", "rxjs": "^6.5.3 || ^7.0.0", "@angular/platform-browser": ">=14.0.0" }, diff --git a/web-app/vendor/ajsf-material/package.json b/web-app/vendor/ajsf-material/package.json index cd35edf79..48a637dd2 100644 --- a/web-app/vendor/ajsf-material/package.json +++ b/web-app/vendor/ajsf-material/package.json @@ -34,12 +34,12 @@ }, "peerDependencies": { "@ngageoint/vendor-ajsf-core": "^0.8.0", - "@angular/animations": "^17.0.0", - "@angular/cdk": "^17.0.0", - "@angular/common": "^17.0.0", - "@angular/core": "^17.0.0", - "@angular/forms": "^17.0.0", - "@angular/material": "^17.0.0", + "@angular/animations": "^19.0.0", + "@angular/cdk": "^19.0.0", + "@angular/common": "^19.0.0", + "@angular/core": "^19.0.0", + "@angular/forms": "^19.0.0", + "@angular/material": "^19.0.0", "rxjs": "^6.5.3 || ^7.0.0" }, "module": "fesm2015/ajsf-material.mjs",