From fbafe80b8df1ca2f714a2ea22848a6817302412a Mon Sep 17 00:00:00 2001 From: Deaponn Date: Wed, 11 Jun 2025 14:08:04 +0200 Subject: [PATCH 01/77] Configure docker compose to wait for previous stages Configure nginx proxy to communicate with Control backend which is running locally Configure Prettier (for formatting) and ESLint (for more agressive linting) --- Configuration/docker-compose.yml | 4 + .../provisioning/nginx/conf.d/default.conf | 4 + Configuration/webapp/eslint.config.js | 10 + Configuration/webapp/package-lock.json | 2075 ++++++++++++++--- Configuration/webapp/package.json | 13 +- Configuration/webapp/prettier.config.ts | 8 + 6 files changed, 1743 insertions(+), 371 deletions(-) create mode 100644 Configuration/webapp/eslint.config.js create mode 100644 Configuration/webapp/prettier.config.ts diff --git a/Configuration/docker-compose.yml b/Configuration/docker-compose.yml index 8c55204f2..19b420906 100644 --- a/Configuration/docker-compose.yml +++ b/Configuration/docker-compose.yml @@ -7,6 +7,8 @@ services: command: ["npm", "install", "--no-save", "--silent"] webapp: image: node:22-alpine + depends_on: + - install-webapp working_dir: /var/workspace volumes: - ./webapp:/var/workspace @@ -19,6 +21,8 @@ services: reverse-proxy: image: nginx:1.27 + depends_on: + - webapp volumes: - ./docker/provisioning/nginx/conf.d/:/etc/nginx/conf.d/ ports: diff --git a/Configuration/docker/provisioning/nginx/conf.d/default.conf b/Configuration/docker/provisioning/nginx/conf.d/default.conf index 62daf76bf..29d9af70d 100644 --- a/Configuration/docker/provisioning/nginx/conf.d/default.conf +++ b/Configuration/docker/provisioning/nginx/conf.d/default.conf @@ -9,6 +9,10 @@ server { client_max_body_size 32M; + location /api/ { + proxy_pass http://host.docker.internal:8081/; + } + location / { proxy_pass http://webapp:5173; diff --git a/Configuration/webapp/eslint.config.js b/Configuration/webapp/eslint.config.js new file mode 100644 index 000000000..e2d0cea96 --- /dev/null +++ b/Configuration/webapp/eslint.config.js @@ -0,0 +1,10 @@ +import eslint from '@eslint/js'; +import tseslint from 'typescript-eslint'; +import eslintConfigPrettier from "eslint-config-prettier/flat"; + +export default tseslint.config( + eslint.configs.recommended, + tseslint.configs.strict, + tseslint.configs.stylistic, + eslintConfigPrettier, +); diff --git a/Configuration/webapp/package-lock.json b/Configuration/webapp/package-lock.json index 1128840c8..49877bebc 100644 --- a/Configuration/webapp/package-lock.json +++ b/Configuration/webapp/package-lock.json @@ -7,18 +7,25 @@ "name": "@aliceo2/test-react-webapp", "dependencies": { "@aliceo2/web-ui": "^2.7.4", - "@react-router/node": "^7.5.0", + "@react-router/node": "^7.5.3", "isbot": "^5", "react": "^19.0.0", "react-dom": "^19.0.0", - "react-router": "^7.5.2" + "react-router": "^7.5.3" }, "devDependencies": { - "@react-router/dev": "^7.5.0", + "@eslint/js": "^9.28.0", + "@react-router/dev": "^7.5.3", + "@stylistic/eslint-plugin-js": "^4.4.1", "@types/node": "^20", + "@types/prettier": "^2.7.3", "@types/react": "^19.0.1", "@types/react-dom": "^19.0.1", + "eslint": "^9.28.0", + "eslint-config-prettier": "^10.1.5", + "eslint-plugin-jsdoc": "^50.7.1", "typescript": "^5.7.2", + "typescript-eslint": "^8.34.0", "vite": "^6.3.5", "vite-tsconfig-paths": "^5.1.4" } @@ -546,6 +553,23 @@ "kuler": "^2.0.0" } }, + "node_modules/@es-joy/jsdoccomment": { + "version": "0.50.2", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.50.2.tgz", + "integrity": "sha512-YAdE/IJSpwbOTiaURNCKECdAwqrJuFiZhylmesBcIRawtYKnBR2wxPhoIewMg+Yu+QuYvHfJNReWpoxGBKOChA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.6", + "@typescript-eslint/types": "^8.11.0", + "comment-parser": "1.4.1", + "esquery": "^1.6.0", + "jsdoc-type-pratt-parser": "~4.1.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.25.2", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.2.tgz", @@ -971,6 +995,274 @@ "node": ">=18" } }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", + "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz", + "integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.2.tgz", + "integrity": "sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz", + "integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "9.28.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.28.0.tgz", + "integrity": "sha512-fnqSjGWd/CoIp4EXIxWVK/sHA6DOHN4+8Ix2cX5ycOY7LG0UY8nHCU5pIp2eaE1Mc7Qd8kHspYNzYXT2ojPLzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.1.tgz", + "integrity": "sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.14.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -1048,6 +1340,44 @@ "integrity": "sha512-EMlH1e30yzmTpGLQjlFmaDAjyOeZhng1/XCd7DExR8PNAnG/G1tyruZxEoUe11ClnwGhGrtsdnyyUx1frSzjng==", "license": "MIT" }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/@npmcli/git": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.1.0.tgz", @@ -1122,9 +1452,9 @@ } }, "node_modules/@react-router/dev": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@react-router/dev/-/dev-7.5.0.tgz", - "integrity": "sha512-BSxuuMtm2YSwOzNTz9PJMFQzC33CzS6e6FXI/s/ZkcZIuYkujssQVG5q5nAuriKK17/T1xFLNeSoXVNI/+zCLA==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@react-router/dev/-/dev-7.6.2.tgz", + "integrity": "sha512-BuG83Ug2C/P+zMYErTz/KKuXoxbOefh3oR66r13XWG9txwooC9nt2QDt2u8yt7Eo/9BATnx+TmXnOHEWqMyB8w==", "dev": true, "license": "MIT", "dependencies": { @@ -1137,7 +1467,7 @@ "@babel/traverse": "^7.23.2", "@babel/types": "^7.22.5", "@npmcli/package-json": "^4.0.1", - "@react-router/node": "7.5.0", + "@react-router/node": "7.6.2", "arg": "^5.0.1", "babel-dead-code-elimination": "^1.0.6", "chokidar": "^4.0.0", @@ -1154,7 +1484,7 @@ "semver": "^7.3.7", "set-cookie-parser": "^2.6.0", "valibot": "^0.41.0", - "vite-node": "3.0.0-beta.2" + "vite-node": "^3.1.4" }, "bin": { "react-router": "bin.js" @@ -1163,8 +1493,8 @@ "node": ">=20.0.0" }, "peerDependencies": { - "@react-router/serve": "^7.5.0", - "react-router": "^7.5.0", + "@react-router/serve": "^7.6.2", + "react-router": "^7.6.2", "typescript": "^5.1.0", "vite": "^5.1.0 || ^6.0.0", "wrangler": "^3.28.2 || ^4.0.0" @@ -1181,115 +1511,11 @@ } } }, - "node_modules/@react-router/dev/node_modules/@react-router/node": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@react-router/node/-/node-7.5.0.tgz", - "integrity": "sha512-jvTledQVx8BqHt2hhkW0LxPiYsAqrNGRI1rjttr0fcynu1lQFU3HzKtZx9z9e+0fyqTKtwOOnaMIgGqdlpFPNQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@mjackson/node-fetch-server": "^0.2.0", - "source-map-support": "^0.5.21", - "stream-slice": "^0.1.2", - "undici": "^6.19.2" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "react-router": "7.5.0", - "typescript": "^5.1.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, "node_modules/@react-router/node": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/@react-router/node/-/node-7.5.3.tgz", - "integrity": "sha512-w85YL6UngvhxGmgTBL3qwlVLFiA1EzNyG5S55qGcnhDikfb9z84gqMlTU4UqlZm8PjQ021HPTTN6I3kd7QE5sg==", - "license": "MIT", - "dependencies": { - "@mjackson/node-fetch-server": "^0.2.0", - "source-map-support": "^0.5.21", - "stream-slice": "^0.1.2", - "undici": "^6.19.2" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "react-router": "7.5.3", - "typescript": "^5.1.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@react-router/serve": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@react-router/serve/-/serve-7.5.0.tgz", - "integrity": "sha512-0ifLtFCcuhW57oPNFvdL0rA+xVuICVV8T/tfXm+qjgeTl/I72y+Y5rYrIb2MqIseT8OMQADRKA3ERRwKFFrYdw==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@react-router/express": "7.5.0", - "@react-router/node": "7.5.0", - "compression": "^1.7.4", - "express": "^4.19.2", - "get-port": "5.1.1", - "morgan": "^1.10.0", - "source-map-support": "^0.5.21" - }, - "bin": { - "react-router-serve": "bin.js" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "react-router": "7.5.0" - } - }, - "node_modules/@react-router/serve/node_modules/@react-router/express": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@react-router/express/-/express-7.5.0.tgz", - "integrity": "sha512-GWlvMn6ap2Fcm4KvL73dR0ue3yUUSKYVPVhJCWClYmJYUJz1Pb67zRNdKAGgKRypSB8dZJloZkxq21q8wl1KEQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@react-router/node": "7.5.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "express": "^4.17.1 || ^5", - "react-router": "7.5.0", - "typescript": "^5.1.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@react-router/serve/node_modules/@react-router/node": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@react-router/node/-/node-7.5.0.tgz", - "integrity": "sha512-jvTledQVx8BqHt2hhkW0LxPiYsAqrNGRI1rjttr0fcynu1lQFU3HzKtZx9z9e+0fyqTKtwOOnaMIgGqdlpFPNQ==", - "dev": true, + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@react-router/node/-/node-7.6.2.tgz", + "integrity": "sha512-KrxfnfJVU1b+020VKemkxpc7ssItsAL8MOJthcoGwPyKwrgovdwc+8NKJUqw3P7yk/Si0ZmVh9QYAzi9qF96dg==", "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "@mjackson/node-fetch-server": "^0.2.0", "source-map-support": "^0.5.21", @@ -1300,7 +1526,7 @@ "node": ">=20.0.0" }, "peerDependencies": { - "react-router": "7.5.0", + "react-router": "7.6.2", "typescript": "^5.1.0" }, "peerDependenciesMeta": { @@ -1589,14 +1815,38 @@ "win32" ] }, - "node_modules/@types/estree": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", - "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "node_modules/@stylistic/eslint-plugin-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-js/-/eslint-plugin-js-4.4.1.tgz", + "integrity": "sha512-eLisyHvx7Sel8vcFZOEwDEBGmYsYM1SqDn81BWgmbqEXfXRf8oe6Rwp+ryM/8odNjlxtaaxp0Ihmt86CnLAxKg==", "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": ">=9.0.0" + } + }, + "node_modules/@types/estree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { "version": "20.17.30", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.30.tgz", "integrity": "sha512-7zf4YyHA+jvBNfVrk2Gtvs6x7E8V+YDW05bNfG2XkWDJfYRXrTiP/DsB2zSYTaHX0bGIujTBQdMVAhb+j7mwpg==", @@ -1606,6 +1856,13 @@ "undici-types": "~6.19.2" } }, + "node_modules/@types/prettier": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/react": { "version": "19.1.2", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.2.tgz", @@ -1632,6 +1889,237 @@ "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", "license": "MIT" }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.34.0.tgz", + "integrity": "sha512-QXwAlHlbcAwNlEEMKQS2RCgJsgXrTJdjXT08xEgbPFa2yYQgVjBymxP5DrfrE7X7iodSzd9qBUHUycdyVJTW1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.34.0", + "@typescript-eslint/type-utils": "8.34.0", + "@typescript-eslint/utils": "8.34.0", + "@typescript-eslint/visitor-keys": "8.34.0", + "graphemer": "^1.4.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.34.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.34.0.tgz", + "integrity": "sha512-vxXJV1hVFx3IXz/oy2sICsJukaBrtDEQSBiV48/YIV5KWjX1dO+bcIr/kCPrW6weKXvsaGKFNlwH0v2eYdRRbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.34.0", + "@typescript-eslint/types": "8.34.0", + "@typescript-eslint/typescript-estree": "8.34.0", + "@typescript-eslint/visitor-keys": "8.34.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.34.0.tgz", + "integrity": "sha512-iEgDALRf970/B2YExmtPMPF54NenZUf4xpL3wsCRx/lgjz6ul/l13R81ozP/ZNuXfnLCS+oPmG7JIxfdNYKELw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.34.0", + "@typescript-eslint/types": "^8.34.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.34.0.tgz", + "integrity": "sha512-9Ac0X8WiLykl0aj1oYQNcLZjHgBojT6cW68yAgZ19letYu+Hxd0rE0veI1XznSSst1X5lwnxhPbVdwjDRIomRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.34.0", + "@typescript-eslint/visitor-keys": "8.34.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.34.0.tgz", + "integrity": "sha512-+W9VYHKFIzA5cBeooqQxqNriAP0QeQ7xTiDuIOr71hzgffm3EL2hxwWBIIj4GuofIbKxGNarpKqIq6Q6YrShOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.34.0.tgz", + "integrity": "sha512-n7zSmOcUVhcRYC75W2pnPpbO1iwhJY3NLoHEtbJwJSNlVAZuwqu05zY3f3s2SDWWDSo9FdN5szqc73DCtDObAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "8.34.0", + "@typescript-eslint/utils": "8.34.0", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.34.0.tgz", + "integrity": "sha512-9V24k/paICYPniajHfJ4cuAWETnt7Ssy+R0Rbcqo5sSFr3QEZ/8TSoUi9XeXVBGXCaLtwTOKSLGcInCAvyZeMA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.34.0.tgz", + "integrity": "sha512-rOi4KZxI7E0+BMqG7emPSK1bB4RICCpF7QD3KCLXn9ZvWoESsOMlHyZPAHyG04ujVplPaHbmEvs34m+wjgtVtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.34.0", + "@typescript-eslint/tsconfig-utils": "8.34.0", + "@typescript-eslint/types": "8.34.0", + "@typescript-eslint/visitor-keys": "8.34.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.34.0.tgz", + "integrity": "sha512-8L4tWatGchV9A1cKbjaavS6mwYwp39jql8xUmIIKJdm+qiaeHy5KMKlBrf30akXAWBzn2SqKsNOtSENWUwg7XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.34.0", + "@typescript-eslint/types": "8.34.0", + "@typescript-eslint/typescript-estree": "8.34.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.34.0.tgz", + "integrity": "sha512-qHV7pW7E85A0x6qyrFn+O+q1k1p3tQCsqIZ1KZ5ESLXY57aTvUd3/a4rdPTeXisvhXn2VQG0VSKUqs8KHF2zcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.34.0", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -1654,6 +2142,46 @@ "node": ">= 0.6" } }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/ansi-regex": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", @@ -1680,6 +2208,16 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/are-docs-informative": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", + "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", @@ -1687,6 +2225,13 @@ "dev": true, "license": "MIT" }, + "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/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -1719,30 +2264,6 @@ "dev": true, "license": "MIT" }, - "node_modules/basic-auth": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", - "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "safe-buffer": "5.1.2" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/basic-auth/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/bignumber.js": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", @@ -1801,6 +2322,19 @@ "balanced-match": "^1.0.0" } }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/browserslist": { "version": "4.24.4", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", @@ -1894,6 +2428,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/caniuse-lite": { "version": "1.0.30001713", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001713.tgz", @@ -1915,6 +2459,39 @@ ], "license": "CC-BY-4.0" }, + "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/chalk/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/chokidar": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", @@ -1995,62 +2572,22 @@ "text-hex": "1.0.x" } }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.0.tgz", - "integrity": "sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==", + "node_modules/comment-parser": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz", + "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==", "dev": true, "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "bytes": "3.1.2", - "compressible": "~2.0.18", - "debug": "2.6.9", - "negotiator": "~0.6.4", - "on-headers": "~1.0.2", - "safe-buffer": "5.2.1", - "vary": "~1.1.2" - }, "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "ms": "2.0.0" + "node": ">= 12.0.0" } }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "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", - "optional": true, - "peer": true + "license": "MIT" }, "node_modules/content-disposition": { "version": "0.5.4", @@ -2140,9 +2677,9 @@ "license": "MIT" }, "node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2172,6 +2709,13 @@ } } }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -2282,9 +2826,9 @@ } }, "node_modules/es-module-lexer": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", - "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", + "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" }, @@ -2357,6 +2901,250 @@ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "license": "MIT" }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.28.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.28.0.tgz", + "integrity": "sha512-ocgh41VhRlf9+fVpe7QKzwLj9c92fDiqOj8Y3Sd4/ZmVA4Btx4PlUYPq4pp9JDyupkf1upbEXecxL2mwNV7jPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.20.0", + "@eslint/config-helpers": "^0.2.1", + "@eslint/core": "^0.14.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.28.0", + "@eslint/plugin-kit": "^0.3.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.3.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-config-prettier": { + "version": "10.1.5", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.5.tgz", + "integrity": "sha512-zc1UmCpNltmVY34vuLRV61r1K27sWuX39E+uyUnY8xS2Bex88VV9cugG+UZbRSRGtGyFboj+D8JODyme1plMpw==", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-jsdoc": { + "version": "50.7.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-50.7.1.tgz", + "integrity": "sha512-XBnVA5g2kUVokTNUiE1McEPse5n9/mNUmuJcx52psT6zBs2eVcXSmQBvjfa7NZdfLVSy3u1pEDDUxoxpwy89WA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@es-joy/jsdoccomment": "~0.50.2", + "are-docs-informative": "^0.0.2", + "comment-parser": "1.4.1", + "debug": "^4.4.1", + "escape-string-regexp": "^4.0.0", + "espree": "^10.3.0", + "esquery": "^1.6.0", + "parse-imports-exports": "^0.2.4", + "semver": "^7.7.2", + "spdx-expression-parse": "^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-jsdoc/node_modules/spdx-expression-parse": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", + "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", @@ -2440,6 +3228,67 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "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", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "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": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "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-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, "node_modules/fdir": { "version": "6.4.4", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", @@ -2455,12 +3304,38 @@ } } }, - "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/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/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/finalhandler": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", @@ -2494,6 +3369,44 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, "node_modules/fn.name": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", @@ -2608,21 +3521,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-port": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", - "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/get-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", @@ -2657,6 +3555,19 @@ "url": "https://github.com/sponsors/isaacs" } }, + "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/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -2693,6 +3604,23 @@ "dev": true, "license": "ISC" }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "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", + "engines": { + "node": ">=8" + } + }, "node_modules/has-symbols": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", @@ -2777,6 +3705,43 @@ "node": ">=0.10.0" } }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -2814,6 +3779,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "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", @@ -2824,6 +3799,29 @@ "node": ">=8" } }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -2902,6 +3900,29 @@ "dev": true, "license": "MIT" }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdoc-type-pratt-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.1.0.tgz", + "integrity": "sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/jsesc": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", @@ -2915,6 +3936,13 @@ "node": ">=6" } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "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", @@ -2925,6 +3953,20 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -3003,12 +4045,52 @@ "node": ">=14.0.0" } }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, "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/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -3052,6 +4134,13 @@ "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", "license": "MIT" }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, "node_modules/lodash.once": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", @@ -3112,6 +4201,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -3121,6 +4220,33 @@ "node": ">= 0.6" } }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -3133,18 +4259,6 @@ "node": ">=4" } }, - "node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", @@ -3162,99 +4276,44 @@ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/mithril": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/mithril/-/mithril-1.1.7.tgz", - "integrity": "sha512-1SAkGeVrIVvkUHlPHvR3pXdWzNfTzmS/fBAe+rC2ApEBfZFFc+idi8Qg/M5JoW/sZkIDXSfQYVgvENMIhBIVAg==", - "license": "MIT", - "bin": { - "bundle": "bundler/bin/bundle", - "ospec": "ospec/bin/ospec" - } - }, - "node_modules/morgan": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", - "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "basic-auth": "~2.0.1", - "debug": "2.6.9", - "depd": "~2.0.0", - "on-finished": "~2.3.0", - "on-headers": "~1.0.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/morgan/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/morgan/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "engines": { + "node": ">= 0.6" + } }, - "node_modules/morgan/node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, - "license": "MIT", - "optional": true, - "peer": true, + "license": "ISC", "dependencies": { - "ee-first": "1.1.1" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">= 0.8" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mithril": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/mithril/-/mithril-1.1.7.tgz", + "integrity": "sha512-1SAkGeVrIVvkUHlPHvR3pXdWzNfTzmS/fBAe+rC2ApEBfZFFc+idi8Qg/M5JoW/sZkIDXSfQYVgvENMIhBIVAg==", + "license": "MIT", + "bin": { + "bundle": "bundler/bin/bundle", + "ospec": "ospec/bin/ospec" } }, "node_modules/ms": { @@ -3303,17 +4362,12 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/negotiator": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", - "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 0.6" - } + "license": "MIT" }, "node_modules/node-releases": { "version": "2.0.19", @@ -3426,18 +4480,6 @@ "node": ">= 0.8" } }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/one-time": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", @@ -3489,6 +4531,56 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/package-json-from-dist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", @@ -3496,6 +4588,36 @@ "dev": true, "license": "BlueOak-1.0.0" }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-imports-exports": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/parse-imports-exports/-/parse-imports-exports-0.2.4.tgz", + "integrity": "sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse-statements": "1.0.11" + } + }, + "node_modules/parse-statements": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/parse-statements/-/parse-statements-1.0.11.tgz", + "integrity": "sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==", + "dev": true, + "license": "MIT" + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -3505,6 +4627,16 @@ "node": ">= 0.8" } }, + "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/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -3601,6 +4733,16 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/prettier": { "version": "2.8.8", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", @@ -3667,6 +4809,16 @@ "node": ">= 0.10" } }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/qs": { "version": "6.13.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", @@ -3682,6 +4834,27 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -3738,14 +4911,13 @@ } }, "node_modules/react-router": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.5.2.tgz", - "integrity": "sha512-9Rw8r199klMnlGZ8VAsV/I8WrIF6IyJ90JQUdboupx1cdkgYqwnrYjH+I/nY/7cA1X5zia4mDJqH36npP7sxGQ==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.6.2.tgz", + "integrity": "sha512-U7Nv3y+bMimgWjhlT5CRdzHPu2/KVmqPwKUCChW8en5P3znxUqwlYFlbmyj8Rgp1SF6zs5X4+77kBVknkg6a0w==", "license": "MIT", "dependencies": { "cookie": "^1.0.1", - "set-cookie-parser": "^2.6.0", - "turbo-stream": "2.4.0" + "set-cookie-parser": "^2.6.0" }, "engines": { "node": ">=20.0.0" @@ -3804,6 +4976,16 @@ "url": "https://paulmillr.com/funding/" } }, + "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/retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", @@ -3814,6 +4996,17 @@ "node": ">= 4" } }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, "node_modules/rollup": { "version": "4.40.0", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.0.tgz", @@ -3854,6 +5047,30 @@ "fsevents": "~2.3.2" } }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -3896,9 +5113,9 @@ "license": "MIT" }, "node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -4316,6 +5533,32 @@ "node": ">=8" } }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/text-hex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", @@ -4339,6 +5582,19 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -4357,6 +5613,19 @@ "node": ">= 14.0.0" } }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, "node_modules/tsconfck": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.5.tgz", @@ -4378,11 +5647,18 @@ } } }, - "node_modules/turbo-stream": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/turbo-stream/-/turbo-stream-2.4.0.tgz", - "integrity": "sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==", - "license": "ISC" + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } }, "node_modules/type-is": { "version": "1.6.18", @@ -4411,6 +5687,29 @@ "node": ">=14.17" } }, + "node_modules/typescript-eslint": { + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.34.0.tgz", + "integrity": "sha512-MRpfN7uYjTrTGigFCt8sRyNqJFhjN0WwZecldaqhWm+wy0gaRt8Edb/3cuUy0zdq2opJWT6iXINKAtewnDOltQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.34.0", + "@typescript-eslint/parser": "8.34.0", + "@typescript-eslint/utils": "8.34.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, "node_modules/undici": { "version": "6.21.2", "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.2.tgz", @@ -4477,6 +5776,16 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -4613,17 +5922,17 @@ } }, "node_modules/vite-node": { - "version": "3.0.0-beta.2", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.0.0-beta.2.tgz", - "integrity": "sha512-ofTf6cfRdL30Wbl9n/BX81EyIR5s4PReLmSurrxQ+koLaWUNOEo8E0lCM53OJkb8vpa2URM2nSrxZsIFyvY1rg==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.3.tgz", + "integrity": "sha512-gc8aAifGuDIpZHrPjuHyP4dpQmYXqWw7D1GmDnWeNWP654UEXzVfQ5IHPSK5HaHkwB/+p1atpYpSdw/2kOv8iQ==", "dev": true, "license": "MIT", "dependencies": { "cac": "^6.7.14", - "debug": "^4.4.0", - "es-module-lexer": "^1.5.4", - "pathe": "^1.1.2", - "vite": "^5.0.0 || ^6.0.0" + "debug": "^4.4.1", + "es-module-lexer": "^1.7.0", + "pathe": "^2.0.3", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" }, "bin": { "vite-node": "vite-node.mjs" @@ -4635,6 +5944,13 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/vite-node/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, "node_modules/vite-tsconfig-paths": { "version": "5.1.4", "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-5.1.4.tgz", @@ -4735,6 +6051,16 @@ "node": ">= 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": { + "node": ">=0.10.0" + } + }, "node_modules/wrap-ansi": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", @@ -4875,6 +6201,19 @@ "engines": { "node": ">= 14" } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } } } diff --git a/Configuration/webapp/package.json b/Configuration/webapp/package.json index f9eac2025..2c32004d2 100644 --- a/Configuration/webapp/package.json +++ b/Configuration/webapp/package.json @@ -11,18 +11,25 @@ }, "dependencies": { "@aliceo2/web-ui": "^2.7.4", - "@react-router/node": "^7.5.0", + "@react-router/node": "^7.5.3", "isbot": "^5", "react": "^19.0.0", "react-dom": "^19.0.0", - "react-router": "^7.5.2" + "react-router": "^7.5.3" }, "devDependencies": { - "@react-router/dev": "^7.5.0", + "@eslint/js": "^9.28.0", + "@react-router/dev": "^7.5.3", + "@stylistic/eslint-plugin-js": "^4.4.1", "@types/node": "^20", + "@types/prettier": "^2.7.3", "@types/react": "^19.0.1", "@types/react-dom": "^19.0.1", + "eslint": "^9.28.0", + "eslint-config-prettier": "^10.1.5", + "eslint-plugin-jsdoc": "^50.7.1", "typescript": "^5.7.2", + "typescript-eslint": "^8.34.0", "vite": "^6.3.5", "vite-tsconfig-paths": "^5.1.4" } diff --git a/Configuration/webapp/prettier.config.ts b/Configuration/webapp/prettier.config.ts new file mode 100644 index 000000000..41adac76c --- /dev/null +++ b/Configuration/webapp/prettier.config.ts @@ -0,0 +1,8 @@ +import { type Config } from "prettier"; + +const config: Config = { + printWidth: 100, + trailingComma: "es5", +}; + +export default config; From 7eb645f315b3ca36f78b25be0d540bc188e1644b Mon Sep 17 00:00:00 2001 From: Deaponn Date: Wed, 11 Jun 2025 19:01:40 +0200 Subject: [PATCH 02/77] Implement frontend service for session management using sessionStorage --- Configuration/webapp/app/root.tsx | 19 +++++--- Configuration/webapp/app/services/session.ts | 28 ++++++++++++ Configuration/webapp/app/ui/navbar.tsx | 47 +++++++++++++------- 3 files changed, 71 insertions(+), 23 deletions(-) create mode 100644 Configuration/webapp/app/services/session.ts diff --git a/Configuration/webapp/app/root.tsx b/Configuration/webapp/app/root.tsx index 460caaae3..ae4bf2dd0 100644 --- a/Configuration/webapp/app/root.tsx +++ b/Configuration/webapp/app/root.tsx @@ -4,18 +4,25 @@ import { Meta, Outlet, Scripts, - ScrollRestoration, useNavigation, + ScrollRestoration, + useNavigation, } from "react-router"; import type { Route } from "./+types/root"; import "./app.css"; -import "@aliceo2/web-ui/Frontend/css/src/bootstrap.css" -import {Navbar} from "~/ui/navbar"; -import {Spinner} from "~/ui/spinner"; +import "@aliceo2/web-ui/Frontend/css/src/bootstrap.css"; +import { Navbar } from "~/ui/navbar"; +import { Spinner } from "~/ui/spinner"; +import { useEffect } from "react"; +import { fetchSessionData } from "./services/session"; export function Layout({ children }: { children: React.ReactNode }) { const { state } = useNavigation(); + useEffect(() => { + fetchSessionData(); + }, []); + return ( @@ -26,7 +33,7 @@ export function Layout({ children }: { children: React.ReactNode }) { -
+
{state === "loading" ? : children}
@@ -41,7 +48,7 @@ export default function App() { } export function HydrateFallback() { - return + return ; } export function ErrorBoundary({ error }: Route.ErrorBoundaryProps) { diff --git a/Configuration/webapp/app/services/session.ts b/Configuration/webapp/app/services/session.ts new file mode 100644 index 000000000..e36eacfc8 --- /dev/null +++ b/Configuration/webapp/app/services/session.ts @@ -0,0 +1,28 @@ +/** Represents a user in the system */ +const sessionParams: string[] = []; + +export const fetchSessionData = async () => { + // only to get the data from server redirect + // (line 264, commit 3ba4600 of github.com/AliceO2Group/WebUi/blob/dev/Framework/Backend/http/server.js) + // this should be replaced with endpoint designed for authentication only + const response = await fetch("http://localhost:8080/api/"); + const { searchParams } = new URL(response.url); + searchParams.forEach((value, key) => { + sessionStorage.setItem(key, value); + sessionParams.push(key); + }); +}; + +export const getSessionData = (): Record => { + const output: Record = {}; + sessionParams.forEach((sessionParam) => { + const param = sessionStorage.getItem(sessionParam); + if (param) output[sessionParam] = param; + }); + return output; +}; + +export const deleteSessionData = () => { + sessionStorage.clear(); + sessionParams.length = 0; +}; diff --git a/Configuration/webapp/app/ui/navbar.tsx b/Configuration/webapp/app/ui/navbar.tsx index d29d9b6e8..ab79b8205 100644 --- a/Configuration/webapp/app/ui/navbar.tsx +++ b/Configuration/webapp/app/ui/navbar.tsx @@ -1,21 +1,34 @@ -import {NavLink} from "react-router"; -import type {NavLinkProps} from "react-router"; +import { NavLink } from "react-router"; +import type { NavLinkProps } from "react-router"; +import { getSessionData } from "~/services/session"; -const StyledNavLink = ({children, className: _, ...props}: NavLinkProps) => { - return `btn btn-tab ${isActive ? 'selected' : ''}`} - >{children} -} +const StyledNavLink = ({ children, className: _, ...props }: NavLinkProps) => { + return ( + `btn btn-tab ${isActive ? "selected" : ""}`} + > + {children} + + ); +}; export const Navbar = () => { - return
); From 6d75667ecc75c35d11608db813442915d29df93b Mon Sep 17 00:00:00 2001 From: Deaponn Date: Thu, 3 Jul 2025 11:26:56 +0200 Subject: [PATCH 05/77] revert: change package.json to not be modified in this PR --- Configuration/webapp/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Configuration/webapp/package.json b/Configuration/webapp/package.json index d254e8141..bec418473 100644 --- a/Configuration/webapp/package.json +++ b/Configuration/webapp/package.json @@ -15,11 +15,11 @@ }, "dependencies": { "@aliceo2/web-ui": "^2.7.4", - "@react-router/node": "^7.5.3", + "@react-router/node": "^7.5.0", "isbot": "^5", "react": "^19.0.0", "react-dom": "^19.0.0", - "react-router": "^7.5.3" + "react-router": "^7.5.2" }, "devDependencies": { "@eslint/js": "^9.28.0", From f79ba108d770d9822bdb23f160f5c4699de821f4 Mon Sep 17 00:00:00 2001 From: Deaponn Date: Thu, 3 Jul 2025 11:57:42 +0200 Subject: [PATCH 06/77] feature: move proxy from /api to /control --- Configuration/docker/provisioning/nginx/conf.d/default.conf | 2 +- Configuration/webapp/app/routes/runs/details.tsx | 4 ++-- Configuration/webapp/app/routes/runs/overview.tsx | 2 +- Configuration/webapp/app/services/session.ts | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Configuration/docker/provisioning/nginx/conf.d/default.conf b/Configuration/docker/provisioning/nginx/conf.d/default.conf index 29d9af70d..e085a83e6 100644 --- a/Configuration/docker/provisioning/nginx/conf.d/default.conf +++ b/Configuration/docker/provisioning/nginx/conf.d/default.conf @@ -9,7 +9,7 @@ server { client_max_body_size 32M; - location /api/ { + location /control/ { proxy_pass http://host.docker.internal:8081/; } diff --git a/Configuration/webapp/app/routes/runs/details.tsx b/Configuration/webapp/app/routes/runs/details.tsx index 473ac609c..deb1dd6a7 100644 --- a/Configuration/webapp/app/routes/runs/details.tsx +++ b/Configuration/webapp/app/routes/runs/details.tsx @@ -21,7 +21,7 @@ import { RunLogs } from '~/components/runs/run-logs'; import { Spinner } from '~/ui/spinner'; const getRun = async (runNumber: number): Promise => { - const response = await fetch(`http://localhost:8080/api/runs/${runNumber}`); + const response = await fetch(`http://localhost:8080/control/api/runs/${runNumber}`); if (!response.ok) { throw data(`Failed to fetch run with run number ${runNumber}`, { status: response.status }); } @@ -29,7 +29,7 @@ const getRun = async (runNumber: number): Promise => { }; const getLogs = async (runNumber: number): Promise => { - const response = await fetch(`http://localhost:8080/api/runs/${runNumber}/logs`); + const response = await fetch(`http://localhost:8080/control/api/runs/${runNumber}/logs`); if (!response.ok) { throw data(`Failed to fetch logs related to run with run number ${runNumber}`, { status: response.status, diff --git a/Configuration/webapp/app/routes/runs/overview.tsx b/Configuration/webapp/app/routes/runs/overview.tsx index 957c4d851..88728d5cc 100644 --- a/Configuration/webapp/app/routes/runs/overview.tsx +++ b/Configuration/webapp/app/routes/runs/overview.tsx @@ -17,7 +17,7 @@ import type { Route } from './+types/overview'; import { Link } from 'react-router'; export const clientLoader = async (): Promise => { - const response = await fetch('http://localhost:8080/api/runs'); + const response = await fetch('http://localhost:8080/control/api/runs'); if (!response.ok) { throw new Error('An error occurred!'); } diff --git a/Configuration/webapp/app/services/session.ts b/Configuration/webapp/app/services/session.ts index 381b18983..3d5a8a67e 100644 --- a/Configuration/webapp/app/services/session.ts +++ b/Configuration/webapp/app/services/session.ts @@ -18,7 +18,7 @@ export const fetchSessionData = async () => { // only to get the data from server redirect // (line 264, commit 3ba4600 of github.com/AliceO2Group/WebUi/blob/dev/Framework/Backend/http/server.js) // this should be replaced with endpoint designed for authentication only - const response = await fetch('http://localhost:8080/api/'); + const response = await fetch('http://localhost:8080/control'); const { searchParams } = new URL(response.url); searchParams.forEach((value, key) => { sessionStorage.setItem(key, value); From b70e2a296a0cb5ef3912bdc933b28bc9000ef819 Mon Sep 17 00:00:00 2001 From: Deaponn Date: Tue, 1 Jul 2025 21:00:04 +0200 Subject: [PATCH 07/77] cherry-pick: apply 9c9337c (chore: fix ESLint for test files) --- Configuration/webapp/eslint.config.js | 34 +++++++++++++++++++++++--- Configuration/webapp/package-lock.json | 28 +++++++++++++++++++++ Configuration/webapp/package.json | 1 + 3 files changed, 59 insertions(+), 4 deletions(-) diff --git a/Configuration/webapp/eslint.config.js b/Configuration/webapp/eslint.config.js index d0c57cf41..ca6739d68 100644 --- a/Configuration/webapp/eslint.config.js +++ b/Configuration/webapp/eslint.config.js @@ -19,12 +19,10 @@ import stylistic from '@stylistic/eslint-plugin'; import react from 'eslint-plugin-react'; import tseslint from 'typescript-eslint'; import customRules from './custom_eslint_rules/index.js'; +import mochaPlugin from 'eslint-plugin-mocha'; export default tseslint.config( - jsdoc.configs['flat/recommended'], pluginJs.configs.recommended, - react.configs.flat.recommended, - tseslint.configs.recommendedTypeChecked, { languageOptions: { parserOptions: { @@ -38,13 +36,19 @@ export default tseslint.config( }, { files: ["**/*.ts", "**/*.tsx", "**/*.cts", "**.*.mts"], - ignores: ['config-default.js', 'config.js', 'jsconfig.json'], plugins: { jsdoc, + react, '@stylistic': stylistic, 'custom-rules': customRules }, + extends: [ + jsdoc.configs['flat/recommended'], + react.configs.flat.recommended, + tseslint.configs.recommendedTypeChecked, + ], languageOptions: { + parser: tseslint.parser, parserOptions: { sourceType: 'module', ecmaFeatures: { @@ -279,4 +283,26 @@ export default tseslint.config( 'no-magic-numbers': 'off', // TODO: enable }, }, + { + files: ['app/test/**/*.cjs', 'app/test/**/*.js'], + extends: [ + pluginJs.configs.recommended, + mochaPlugin.configs.recommended, + ], + plugins: { + mocha: mochaPlugin, + }, + languageOptions: { + sourceType: 'script', // For .cjs and plain .js files + ecmaVersion: 'latest', + globals: { + ...globals.node, + ...globals.mocha, + window: 'readonly' + }, + }, + rules: { + 'mocha/no-setup-in-describe': 'off', + }, + }, ); diff --git a/Configuration/webapp/package-lock.json b/Configuration/webapp/package-lock.json index 7ffb34c97..29fe8bf39 100644 --- a/Configuration/webapp/package-lock.json +++ b/Configuration/webapp/package-lock.json @@ -23,6 +23,7 @@ "@types/react-dom": "^19.0.1", "eslint": "^9.28.0", "eslint-plugin-jsdoc": "^50.7.1", + "eslint-plugin-mocha": "^11.1.0", "eslint-plugin-react": "^7.37.5", "globals": "^16.2.0", "prettier": "3.5.3", @@ -3485,6 +3486,33 @@ "spdx-license-ids": "^3.0.0" } }, + "node_modules/eslint-plugin-mocha": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-11.1.0.tgz", + "integrity": "sha512-rKntVWRsQFPbf8OkSgVNRVRrcVAPaGTyEgWCEyXaPDJkTl0v5/lwu1vTk5sWiUJU8l2sxwvGUZzSNrEKdVMeQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.1", + "globals": "^15.14.0" + }, + "peerDependencies": { + "eslint": ">=9.0.0" + } + }, + "node_modules/eslint-plugin-mocha/node_modules/globals": { + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/eslint-plugin-react": { "version": "7.37.5", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", diff --git a/Configuration/webapp/package.json b/Configuration/webapp/package.json index bec418473..2e98e0576 100644 --- a/Configuration/webapp/package.json +++ b/Configuration/webapp/package.json @@ -31,6 +31,7 @@ "@types/react-dom": "^19.0.1", "eslint": "^9.28.0", "eslint-plugin-jsdoc": "^50.7.1", + "eslint-plugin-mocha": "^11.1.0", "eslint-plugin-react": "^7.37.5", "globals": "^16.2.0", "prettier": "3.5.3", From 546b1db9382451ec0047f8b508afb7c935cfbcc8 Mon Sep 17 00:00:00 2001 From: Deaponn Date: Sun, 17 Aug 2025 14:51:49 +0200 Subject: [PATCH 08/77] feat: implement testing using TypeScript --- Configuration/webapp/app/services/session.ts | 21 +- Configuration/webapp/app/test/mocha-index.ts | 72 + .../webapp/app/test/services/session.spec.ts | 51 + Configuration/webapp/app/test/test-config.ts | 20 + Configuration/webapp/eslint.config.js | 11 +- Configuration/webapp/package-lock.json | 1225 ++++++++++++++++- Configuration/webapp/package.json | 5 + Configuration/webapp/tsconfig.json | 2 +- 8 files changed, 1378 insertions(+), 29 deletions(-) create mode 100644 Configuration/webapp/app/test/mocha-index.ts create mode 100644 Configuration/webapp/app/test/services/session.spec.ts create mode 100644 Configuration/webapp/app/test/test-config.ts diff --git a/Configuration/webapp/app/services/session.ts b/Configuration/webapp/app/services/session.ts index 3d5a8a67e..6b64a2700 100644 --- a/Configuration/webapp/app/services/session.ts +++ b/Configuration/webapp/app/services/session.ts @@ -12,7 +12,7 @@ * or submit itself to any jurisdiction. */ -const sessionParams: string[] = []; +const sessionData: Record = {}; export const fetchSessionData = async () => { // only to get the data from server redirect @@ -21,23 +21,14 @@ export const fetchSessionData = async () => { const response = await fetch('http://localhost:8080/control'); const { searchParams } = new URL(response.url); searchParams.forEach((value, key) => { - sessionStorage.setItem(key, value); - sessionParams.push(key); + sessionData[key] = value; }); }; -export const getSessionData = (): Record => { - const output: Record = {}; - sessionParams.forEach((sessionParam) => { - const param = sessionStorage.getItem(sessionParam); - if (param) { - output[sessionParam] = param; - } - }); - return output; -}; +export const getSessionData = (): Record => sessionData; export const deleteSessionData = () => { - sessionStorage.clear(); - sessionParams.length = 0; + for (const key in sessionData) { + delete sessionData[key]; + } }; diff --git a/Configuration/webapp/app/test/mocha-index.ts b/Configuration/webapp/app/test/mocha-index.ts new file mode 100644 index 000000000..a7445c9c1 --- /dev/null +++ b/Configuration/webapp/app/test/mocha-index.ts @@ -0,0 +1,72 @@ +/** + * @license + * Copyright 2019-2020 CERN and copyright holders of ALICE O2. + * See http://alice-o2.web.cern.ch/copyright for details of the copyright holders. + * All rights not expressly granted are reserved. + * + * This software is distributed under the terms of the GNU General Public + * License v3 (GPL Version 3), copied verbatim in the file "COPYING". + * + * In applying this license CERN does not waive the privileges and immunities + * granted to it by virtue of its status as an Intergovernmental Organization + * or submit itself to any jurisdiction. + */ + +import puppeteer, { Browser, Page } from 'puppeteer'; +import config from './test-config'; + +let page: Page | null = null; + +type Global = { + test: { + page: Page | null; + browser: Browser | null; + helpers: Record; + }; +}; + +const global: Global = { + test: { + page: null, + browser: null, + helpers: {}, + }, +}; + +export const mochaHooks = { + async beforeAll() { + let browser: Browser | null = null; + const url = `http://${config.http.hostname}:${config.http.port}/`; + browser = await puppeteer.launch({ + args: ['--no-sandbox', '--disable-setuid-sandbox'], + headless: true, + }); + page = await browser.newPage(); + + // Listen to browser + page.on('error', (pageerror) => { + console.error(' ', pageerror); + }); + page.on('pageerror', (pageerror) => { + console.error(' ', pageerror); + }); + page.on('console', (msg) => { + console.log(msg.args()); + }); + await page.setViewport({ width: 1200, height: 770 }); + + global.test.page = page; + global.test.browser = browser; + global.test.helpers.url = url; + }, + + async afterAll() { + const { test: { browser } } = global; + if (browser === null) { + return; + } + await browser.close(); + }, +}; + +export default global; diff --git a/Configuration/webapp/app/test/services/session.spec.ts b/Configuration/webapp/app/test/services/session.spec.ts new file mode 100644 index 000000000..302baa732 --- /dev/null +++ b/Configuration/webapp/app/test/services/session.spec.ts @@ -0,0 +1,51 @@ +/** + * @license + * Copyright 2019-2020 CERN and copyright holders of ALICE O2. + * See http://alice-o2.web.cern.ch/copyright for details of the copyright holders. + * All rights not expressly granted are reserved. + * + * This software is distributed under the terms of the GNU General Public + * License v3 (GPL Version 3), copied verbatim in the file "COPYING". + * + * In applying this license CERN does not waive the privileges and immunities + * granted to it by virtue of its status as an Intergovernmental Organization + * or submit itself to any jurisdiction. + */ + +import assert from 'assert'; +import { Page } from 'puppeteer'; +import global from '../mocha-index'; +import { fetchSessionData, getSessionData } from '../../services/session'; + +describe('`pageRoot` test-suite', function () { + let url: string | null = null; + let page: Page | null = null; + + before(function () { + ({ test: { page, helpers: { url } } } = global); + }); + + it('should load root page', async function () { + if (page === null || url === null) { + assert.equal('Page is null', 'test suite failed'); + return; + } + + await page.goto(url, { waitUntil: 'networkidle0' }); + + const location = await page.evaluate(() => window.location); + assert.strictEqual(location.search, ''); + }); + + it('should load session data into memory', async function () { + if (page === null) { + assert.equal('Page is null', 'test suite failed'); + return; + } + + await fetchSessionData(); + const session = getSessionData(); + + assert.strictEqual(session.username, 'anonymous'); + }); +}); diff --git a/Configuration/webapp/app/test/test-config.ts b/Configuration/webapp/app/test/test-config.ts new file mode 100644 index 000000000..2b8cd1a4f --- /dev/null +++ b/Configuration/webapp/app/test/test-config.ts @@ -0,0 +1,20 @@ +/** + * @license + * Copyright 2019-2020 CERN and copyright holders of ALICE O2. + * See http://alice-o2.web.cern.ch/copyright for details of the copyright holders. + * All rights not expressly granted are reserved. + * + * This software is distributed under the terms of the GNU General Public + * License v3 (GPL Version 3), copied verbatim in the file "COPYING". + * + * In applying this license CERN does not waive the privileges and immunities + * granted to it by virtue of its status as an Intergovernmental Organization + * or submit itself to any jurisdiction. + */ + +export default { + http: { + port: 8080, + hostname: 'localhost', + }, +}; diff --git a/Configuration/webapp/eslint.config.js b/Configuration/webapp/eslint.config.js index ca6739d68..33d009df4 100644 --- a/Configuration/webapp/eslint.config.js +++ b/Configuration/webapp/eslint.config.js @@ -284,7 +284,7 @@ export default tseslint.config( }, }, { - files: ['app/test/**/*.cjs', 'app/test/**/*.js'], + files: ['app/test/**/*.ts', 'app/test/**/*.ts'], extends: [ pluginJs.configs.recommended, mochaPlugin.configs.recommended, @@ -293,7 +293,7 @@ export default tseslint.config( mocha: mochaPlugin, }, languageOptions: { - sourceType: 'script', // For .cjs and plain .js files + sourceType: 'module', ecmaVersion: 'latest', globals: { ...globals.node, @@ -305,4 +305,11 @@ export default tseslint.config( 'mocha/no-setup-in-describe': 'off', }, }, + { + files: ['app/test/**'], + rules: { + 'no-console': 'off', + 'prefer-arrow-callback': 'off' + } + }, ); diff --git a/Configuration/webapp/package-lock.json b/Configuration/webapp/package-lock.json index 29fe8bf39..1362771b2 100644 --- a/Configuration/webapp/package-lock.json +++ b/Configuration/webapp/package-lock.json @@ -7,16 +7,17 @@ "name": "@aliceo2/test-react-webapp", "dependencies": { "@aliceo2/web-ui": "^2.7.4", - "@react-router/node": "^7.5.3", + "@react-router/node": "^7.5.0", "isbot": "^5", "react": "^19.0.0", "react-dom": "^19.0.0", - "react-router": "^7.5.3" + "react-router": "^7.5.2" }, "devDependencies": { "@eslint/js": "^9.28.0", - "@react-router/dev": "^7.5.3", + "@react-router/dev": "^7.5.0", "@stylistic/eslint-plugin": "^4.4.1", + "@types/mocha": "^10.0.10", "@types/node": "^20", "@types/prettier": "^2.7.3", "@types/react": "^19.0.1", @@ -26,7 +27,10 @@ "eslint-plugin-mocha": "^11.1.0", "eslint-plugin-react": "^7.37.5", "globals": "^16.2.0", + "mocha": "^11.7.1", "prettier": "3.5.3", + "puppeteer": "^24.16.2", + "tsx": "^4.20.4", "typescript": "^5.7.2", "typescript-eslint": "^8.34.0", "vite": "^6.3.5", @@ -1477,6 +1481,28 @@ "node": ">=14" } }, + "node_modules/@puppeteer/browsers": { + "version": "2.10.6", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.6.tgz", + "integrity": "sha512-pHUn6ZRt39bP3698HFQlu2ZHCkS/lPcpv7fVQcGBSzNNygw171UXAKrCUhy+TEMw4lEttOKDgNpb04hwUAJeiQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.4.1", + "extract-zip": "^2.0.1", + "progress": "^2.0.3", + "proxy-agent": "^6.5.0", + "semver": "^7.7.2", + "tar-fs": "^3.1.0", + "yargs": "^17.7.2" + }, + "bin": { + "browsers": "lib/cjs/main-cli.js" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@react-router/dev": { "version": "7.6.2", "resolved": "https://registry.npmjs.org/@react-router/dev/-/dev-7.6.2.tgz", @@ -1877,6 +1903,13 @@ "eslint": ">=9.0.0" } }, + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/estree": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", @@ -1891,6 +1924,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/mocha": { + "version": "10.0.10", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.10.tgz", + "integrity": "sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/node": { "version": "20.17.30", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.30.tgz", @@ -1934,6 +1974,17 @@ "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", "license": "MIT" }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "8.34.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.34.1.tgz", @@ -2210,6 +2261,16 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -2421,6 +2482,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/async": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", @@ -2453,6 +2527,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/b4a": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", + "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/babel-dead-code-elimination": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/babel-dead-code-elimination/-/babel-dead-code-elimination-1.0.10.tgz", @@ -2473,6 +2554,93 @@ "dev": true, "license": "MIT" }, + "node_modules/bare-events": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.6.1.tgz", + "integrity": "sha512-AuTJkq9XmE6Vk0FJVNq5QxETrSA/vKHarWVBG5l/JbdCL1prJemiyJqUS0jrlXO0MftuPq4m3YVYhoNc5+aE/g==", + "dev": true, + "license": "Apache-2.0", + "optional": true + }, + "node_modules/bare-fs": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.2.0.tgz", + "integrity": "sha512-oRfrw7gwwBVAWx9S5zPMo2iiOjxyiZE12DmblmMQREgcogbNO0AFaZ+QBxxkEXiPspcpvO/Qtqn8LabUx4uYXg==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-events": "^2.5.4", + "bare-path": "^3.0.0", + "bare-stream": "^2.6.4" + }, + "engines": { + "bare": ">=1.16.0" + }, + "peerDependencies": { + "bare-buffer": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + } + } + }, + "node_modules/bare-os": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.1.tgz", + "integrity": "sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "engines": { + "bare": ">=1.14.0" + } + }, + "node_modules/bare-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", + "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-os": "^3.0.1" + } + }, + "node_modules/bare-stream": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.7.0.tgz", + "integrity": "sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "streamx": "^2.21.0" + }, + "peerDependencies": { + "bare-buffer": "*", + "bare-events": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + }, + "bare-events": { + "optional": true + } + } + }, + "node_modules/basic-ftp": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", + "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/bignumber.js": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", @@ -2544,6 +2712,13 @@ "node": ">=8" } }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true, + "license": "ISC" + }, "node_modules/browserslist": { "version": "4.24.4", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", @@ -2577,6 +2752,16 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", @@ -2666,6 +2851,19 @@ "node": ">=6" } }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/caniuse-lite": { "version": "1.0.30001713", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001713.tgz", @@ -2736,6 +2934,114 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/chromium-bidi": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-7.3.1.tgz", + "integrity": "sha512-i+BMGluhZZc4Jic9L1aHJBTfaopxmCqQxGklyMcqFx4fvF3nI4BJ3bCe1ad474nvYRIo/ZN/VrdA4eOaRZua4Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "mitt": "^3.0.1", + "zod": "^3.24.1" + }, + "peerDependencies": { + "devtools-protocol": "*" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/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/cliui/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/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/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", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/color": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", @@ -2866,6 +3172,33 @@ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "license": "MIT" }, + "node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -2904,6 +3237,16 @@ "dev": true, "license": "MIT" }, + "node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, "node_modules/data-view-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", @@ -2976,6 +3319,19 @@ } } }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/dedent": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", @@ -3034,6 +3390,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -3053,6 +3424,23 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/devtools-protocol": { + "version": "0.0.1475386", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1475386.tgz", + "integrity": "sha512-RQ809ykTfJ+dgj9bftdeL2vRVxASAuGU+I9LEx9Ij5TXU5HrgAQVmzi72VA+mkzscE12uzlRv5/tWWv9R9J1SA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/diff": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", + "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", @@ -3131,6 +3519,26 @@ "node": ">= 0.8" } }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/err-code": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", @@ -3138,6 +3546,23 @@ "dev": true, "license": "MIT" }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-ex/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/es-abstract": { "version": "1.24.0", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", @@ -3389,6 +3814,28 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, "node_modules/eslint": { "version": "9.29.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.29.0.tgz", @@ -3652,6 +4099,20 @@ "url": "https://opencollective.com/eslint" } }, + "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-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/esquery": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", @@ -3781,6 +4242,27 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -3788,6 +4270,13 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "dev": true, + "license": "MIT" + }, "node_modules/fast-glob": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", @@ -3842,6 +4331,16 @@ "reusify": "^1.0.4" } }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, "node_modules/fdir": { "version": "6.4.4", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", @@ -3939,6 +4438,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, "node_modules/flat-cache": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", @@ -4097,6 +4606,16 @@ "node": ">=6.9.0" } }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -4134,6 +4653,22 @@ "node": ">= 0.4" } }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "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", @@ -4152,6 +4687,34 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-tsconfig": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz", + "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/get-uri": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz", + "integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/glob": { "version": "10.4.5", "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", @@ -4341,6 +4904,16 @@ "node": ">= 0.4" } }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, "node_modules/helmet": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/helmet/-/helmet-8.1.0.tgz", @@ -4389,6 +4962,34 @@ "node": ">= 0.8" } }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "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.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -4459,6 +5060,16 @@ "node": ">= 0.4" } }, + "node_modules/ip-address": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz", + "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -4730,6 +5341,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/is-regex": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", @@ -4841,6 +5462,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-weakmap": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", @@ -5162,6 +5796,13 @@ "node": ">= 0.8.0" } }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -5234,6 +5875,23 @@ "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", "license": "MIT" }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/logform": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", @@ -5416,6 +6074,65 @@ "ospec": "ospec/bin/ospec" } }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "dev": true, + "license": "MIT" + }, + "node_modules/mocha": { + "version": "11.7.1", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.7.1.tgz", + "integrity": "sha512-5EK+Cty6KheMS/YLPPMJC64g5V61gIR25KsRItHw6x4hEKT6Njp1n9LOlH4gpevuwMVS66SXaBBpg+RWZkza4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "browser-stdout": "^1.3.1", + "chokidar": "^4.0.1", + "debug": "^4.3.5", + "diff": "^7.0.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^10.4.5", + "he": "^1.2.0", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^9.0.5", + "ms": "^2.1.3", + "picocolors": "^1.1.1", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^9.2.0", + "yargs": "^17.7.2", + "yargs-parser": "^21.1.1", + "yargs-unparser": "^2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -5469,6 +6186,16 @@ "dev": true, "license": "MIT" }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/node-releases": { "version": "2.0.19", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", @@ -5675,6 +6402,16 @@ "node": ">= 0.8" } }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, "node_modules/one-time": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", @@ -5785,13 +6522,47 @@ "dev": true, "license": "MIT", "dependencies": { - "p-limit": "^3.0.2" + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pac-proxy-agent": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", + "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.6", + "pac-resolver": "^7.0.1", + "socks-proxy-agent": "^8.0.5" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-resolver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "dev": true, + "license": "MIT", + "dependencies": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 14" } }, "node_modules/package-json-from-dist": { @@ -5824,6 +6595,32 @@ "parse-statements": "1.0.11" } }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-json/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/parse-statements": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/parse-statements/-/parse-statements-1.0.11.tgz", @@ -5904,6 +6701,13 @@ "dev": true, "license": "MIT" }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true, + "license": "MIT" + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -6005,6 +6809,16 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "license": "MIT" }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", @@ -6051,6 +6865,54 @@ "node": ">= 0.10" } }, + "node_modules/proxy-agent": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", + "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.6", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.1.0", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.5" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true, + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -6061,6 +6923,46 @@ "node": ">=6" } }, + "node_modules/puppeteer": { + "version": "24.16.2", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.16.2.tgz", + "integrity": "sha512-eNjKzwjITM4Lvho6iHb+VQamadUBgc8TsjAApsKi5N8DXipxAaAZWssBOFsrIOLo4eYWYj0Qk5gmr4wBSqzJWw==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@puppeteer/browsers": "2.10.6", + "chromium-bidi": "7.3.1", + "cosmiconfig": "^9.0.0", + "devtools-protocol": "0.0.1475386", + "puppeteer-core": "24.16.2", + "typed-query-selector": "^2.12.0" + }, + "bin": { + "puppeteer": "lib/cjs/puppeteer/node/cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/puppeteer-core": { + "version": "24.16.2", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.16.2.tgz", + "integrity": "sha512-areKSSQzpoHa5nCk3uD/o504yjrW5ws0N6jZfdFZ3a4H+Q7NBgvuDydjN5P87jN4Rj+eIpLcK3ELOThTtYuuxg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@puppeteer/browsers": "2.10.6", + "chromium-bidi": "7.3.1", + "debug": "^4.4.1", + "devtools-protocol": "0.0.1475386", + "typed-query-selector": "^2.12.0", + "ws": "^8.18.3" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/qs": { "version": "6.13.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", @@ -6097,6 +6999,16 @@ ], "license": "MIT" }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -6269,6 +7181,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve": { "version": "2.0.0-next.5", "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", @@ -6297,6 +7219,16 @@ "node": ">=4" } }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, "node_modules/retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", @@ -6552,6 +7484,16 @@ "node": ">= 0.8" } }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, "node_modules/serve-static": { "version": "1.16.2", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", @@ -6745,6 +7687,47 @@ "is-arrayish": "^0.3.1" } }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ip-address": "^10.0.1", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -6857,6 +7840,20 @@ "integrity": "sha512-QzQxpoacatkreL6jsxnVb7X5R/pGw9OUv2qWTYWnmLpg4NdN31snPy/f3TdQE1ZUXaThRvj1Zw4/OGg0ZkaLMA==", "license": "MIT" }, + "node_modules/streamx": { + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.1.tgz", + "integrity": "sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" + } + }, "node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -7113,6 +8110,43 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/tar-fs": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.0.tgz", + "integrity": "sha512-5Mty5y/sOF1YWj1J6GiBodjlDc05CUR8PKXrsnFAiSG0xA+GHeWLovaZPYUDXkH/1iKRf2+M5+OrRgzC7O9b7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^4.0.1", + "bare-path": "^3.0.0" + } + }, + "node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/text-decoder": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", + "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" + } + }, "node_modules/text-hex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", @@ -7201,6 +8235,33 @@ } } }, + "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==", + "dev": true, + "license": "0BSD" + }, + "node_modules/tsx": { + "version": "4.20.4", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.4.tgz", + "integrity": "sha512-yyxBKfORQ7LuRt/BQKBXrpcq59ZvSW0XxwfjAt3w2/8PmdxaFzijtMhTawprSHhpzeM5BgU2hXHG3lklIERZXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.25.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -7305,6 +8366,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/typed-query-selector": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.0.tgz", + "integrity": "sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==", + "dev": true, + "license": "MIT" + }, "node_modules/typescript": { "version": "5.8.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", @@ -7808,6 +8876,13 @@ "node": ">=0.10.0" } }, + "node_modules/workerpool": { + "version": "9.3.3", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-9.3.3.tgz", + "integrity": "sha512-slxCaKbYjEdFT/o2rH9xS1hf4uRDch1w7Uo+apxhZ+sf/1d9e0ZVkn42kPNGP2dgjIx6YFvSevj0zHvbWe2jdw==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/wrap-ansi": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", @@ -7906,10 +8981,17 @@ "node": ">=8" } }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, "node_modules/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -7927,6 +9009,16 @@ } } }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", @@ -7949,6 +9041,107 @@ "node": ">= 14" } }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "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/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/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -7961,6 +9154,16 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } } } } diff --git a/Configuration/webapp/package.json b/Configuration/webapp/package.json index 2e98e0576..4509d3fb0 100644 --- a/Configuration/webapp/package.json +++ b/Configuration/webapp/package.json @@ -8,6 +8,7 @@ "start": "react-router-serve ./build/server/index.js", "typecheck": "react-router typegen && tsc", "docker:typecheck": "docker compose exec webapp npm run typecheck", + "mocha": "tsx node_modules/.bin/mocha --require app/test/mocha-index.ts app/test/**/*.spec.ts", "eslint": "eslint app/**", "eslint-fix": "eslint --fix app/**", "prettier": "prettier --write app/**", @@ -25,6 +26,7 @@ "@eslint/js": "^9.28.0", "@react-router/dev": "^7.5.0", "@stylistic/eslint-plugin": "^4.4.1", + "@types/mocha": "^10.0.10", "@types/node": "^20", "@types/prettier": "^2.7.3", "@types/react": "^19.0.1", @@ -34,7 +36,10 @@ "eslint-plugin-mocha": "^11.1.0", "eslint-plugin-react": "^7.37.5", "globals": "^16.2.0", + "mocha": "^11.7.1", "prettier": "3.5.3", + "puppeteer": "^24.16.2", + "tsx": "^4.20.4", "typescript": "^5.7.2", "typescript-eslint": "^8.34.0", "vite": "^6.3.5", diff --git a/Configuration/webapp/tsconfig.json b/Configuration/webapp/tsconfig.json index dc391a45f..d6fab564f 100644 --- a/Configuration/webapp/tsconfig.json +++ b/Configuration/webapp/tsconfig.json @@ -7,7 +7,7 @@ ], "compilerOptions": { "lib": ["DOM", "DOM.Iterable", "ES2022"], - "types": ["node", "vite/client"], + "types": ["node", "vite/client", "mocha"], "target": "ES2022", "module": "ES2022", "moduleResolution": "bundler", From e560e868733fc672fe64d464fe0682f9757bf0a5 Mon Sep 17 00:00:00 2001 From: Deaponn Date: Mon, 18 Aug 2025 16:28:12 +0200 Subject: [PATCH 09/77] style: fix formatting --- Configuration/webapp/app/test/mocha-index.ts | 4 +++- Configuration/webapp/app/test/services/session.spec.ts | 7 ++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/Configuration/webapp/app/test/mocha-index.ts b/Configuration/webapp/app/test/mocha-index.ts index a7445c9c1..13fab30de 100644 --- a/Configuration/webapp/app/test/mocha-index.ts +++ b/Configuration/webapp/app/test/mocha-index.ts @@ -61,7 +61,9 @@ export const mochaHooks = { }, async afterAll() { - const { test: { browser } } = global; + const { + test: { browser }, + } = global; if (browser === null) { return; } diff --git a/Configuration/webapp/app/test/services/session.spec.ts b/Configuration/webapp/app/test/services/session.spec.ts index 302baa732..68232367a 100644 --- a/Configuration/webapp/app/test/services/session.spec.ts +++ b/Configuration/webapp/app/test/services/session.spec.ts @@ -22,7 +22,12 @@ describe('`pageRoot` test-suite', function () { let page: Page | null = null; before(function () { - ({ test: { page, helpers: { url } } } = global); + ({ + test: { + page, + helpers: { url }, + }, + } = global); }); it('should load root page', async function () { From 3b64325ce6fa5c1cd632beed6a8a150835e0aa62 Mon Sep 17 00:00:00 2001 From: Deaponn Date: Sat, 30 Aug 2025 12:31:12 +0200 Subject: [PATCH 10/77] build: fix package-lock.json --- Configuration/webapp/package-lock.json | 1761 +++++++++++------------- 1 file changed, 840 insertions(+), 921 deletions(-) diff --git a/Configuration/webapp/package-lock.json b/Configuration/webapp/package-lock.json index f6cbf7c56..03845f70c 100644 --- a/Configuration/webapp/package-lock.json +++ b/Configuration/webapp/package-lock.json @@ -43,24 +43,23 @@ } }, "node_modules/@aliceo2/web-ui": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/@aliceo2/web-ui/-/web-ui-2.8.5.tgz", - "integrity": "sha512-lpHYn/cnFxNJdl5du/+vt2gTbc6/xc4RyTTHadl+0UexduBIJLoQTHA7RZ5Uu4ix9oIVRkaXtGq+MeyNQnhvFA==", + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/@aliceo2/web-ui/-/web-ui-2.7.4.tgz", + "integrity": "sha512-X1/Whe/nnFsmHvS/O33FA2mmbgBYIw5Mp/UomHsS14axS9RhN3jW32JAdXgQ3doCUspKMnSTzKevljOHzrcOzw==", "license": "GPL-3.0", "dependencies": { "express": "^4.21.2", - "helmet": "^8.1.0", + "helmet": "^8.0.0", "jsonwebtoken": "^9.0.0", "kafkajs": "^2.2.0", "mithril": "1.1.7", "mysql": "^2.18.1", "openid-client": "^5.6.0", - "protobufjs": "^7.5.0", "winston": "3.17.0", "ws": "^8.18.0" }, "engines": { - "node": ">= 22.x" + "node": ">= 20.x" } }, "node_modules/@ampproject/remapping": { @@ -78,23 +77,23 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", + "@babel/helper-validator-identifier": "^7.25.9", "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz", - "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", + "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", "dev": true, "license": "MIT", "engines": { @@ -102,22 +101,22 @@ } }, "node_modules/@babel/core": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.3.tgz", - "integrity": "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==", + "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": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.28.3", - "@babel/helpers": "^7.28.3", - "@babel/parser": "^7.28.3", - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.3", - "@babel/types": "^7.28.2", + "@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", @@ -132,13 +131,6 @@ "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", @@ -150,15 +142,15 @@ } }, "node_modules/@babel/generator": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", - "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.0.tgz", + "integrity": "sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.3", - "@babel/types": "^7.28.2", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" }, "engines": { @@ -166,27 +158,27 @@ } }, "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==", + "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": "MIT", "dependencies": { - "@babel/types": "^7.27.3" + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.0.tgz", + "integrity": "sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.27.2", - "@babel/helper-validator-option": "^7.27.1", + "@babel/compat-data": "^7.26.8", + "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -206,18 +198,18 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.3.tgz", - "integrity": "sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.0.tgz", + "integrity": "sha512-vSGCvMecvFCd/BdpGlhpXYNhhC4ccxyvQWpbGL4CWbvfEoLFWUZuSuf7s9Aw70flgQF+6vptvgK2IfOnKlRmBg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-member-expression-to-functions": "^7.27.1", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/traverse": "^7.28.3", + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/helper-replace-supers": "^7.26.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/traverse": "^7.27.0", "semver": "^6.3.1" }, "engines": { @@ -237,52 +229,43 @@ "semver": "bin/semver.js" } }, - "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==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", - "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", + "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", - "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.28.3" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -292,22 +275,22 @@ } }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", + "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.27.1" + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", "dev": true, "license": "MIT", "engines": { @@ -315,15 +298,15 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", - "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz", + "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.27.1", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/traverse": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -333,41 +316,41 @@ } }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", + "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", "dev": true, "license": "MIT", "engines": { @@ -375,26 +358,26 @@ } }, "node_modules/@babel/helpers": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.3.tgz", - "integrity": "sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz", + "integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.2" + "@babel/template": "^7.27.0", + "@babel/types": "^7.27.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.3.tgz", - "integrity": "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz", + "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==", "license": "MIT", "dependencies": { - "@babel/types": "^7.28.2" + "@babel/types": "^7.27.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -404,13 +387,13 @@ } }, "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.27.1.tgz", - "integrity": "sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.25.9.tgz", + "integrity": "sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -420,13 +403,13 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", - "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", + "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -436,13 +419,13 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", - "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", + "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -452,14 +435,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", - "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz", + "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -469,17 +452,17 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.0.tgz", - "integrity": "sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.27.0.tgz", + "integrity": "sha512-fRGGjO2UEGPjvEcyAZXRXAS8AfdaQoq7HnxAbJoAoW10B9xOKesmmndJv+Sym2a+9FHWZ9KbyyLCe9s0Sn5jtg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/plugin-syntax-typescript": "^7.27.1" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.27.0", + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-syntax-typescript": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -489,17 +472,17 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.27.1.tgz", - "integrity": "sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.27.0.tgz", + "integrity": "sha512-vxaPFfJtHhgeOVXRKuHpHPAOgymmy8V8I65T1q53R7GCZlefKeCaTyDs3zOPHTTbmquvNlQYC5klEvWsBAtrBQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-syntax-jsx": "^7.27.1", - "@babel/plugin-transform-modules-commonjs": "^7.27.1", - "@babel/plugin-transform-typescript": "^7.27.1" + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-syntax-jsx": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.26.3", + "@babel/plugin-transform-typescript": "^7.27.0" }, "engines": { "node": ">=6.9.0" @@ -518,45 +501,54 @@ } }, "node_modules/@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", + "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.3.tgz", - "integrity": "sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.0.tgz", + "integrity": "sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.3", - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.2", - "debug": "^4.3.1" + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.27.0", + "@babel/parser": "^7.27.0", + "@babel/template": "^7.27.0", + "@babel/types": "^7.27.0", + "debug": "^4.3.1", + "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/types": { - "version": "7.28.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", - "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", + "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -601,6 +593,21 @@ "stylis": "4.2.0" } }, + "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "node_modules/@emotion/babel-plugin/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@emotion/cache": { "version": "11.14.0", "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz", @@ -746,9 +753,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz", - "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.2.tgz", + "integrity": "sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==", "cpu": [ "ppc64" ], @@ -763,9 +770,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz", - "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.2.tgz", + "integrity": "sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==", "cpu": [ "arm" ], @@ -780,9 +787,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz", - "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.2.tgz", + "integrity": "sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==", "cpu": [ "arm64" ], @@ -797,9 +804,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz", - "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.2.tgz", + "integrity": "sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==", "cpu": [ "x64" ], @@ -814,9 +821,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz", - "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.2.tgz", + "integrity": "sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==", "cpu": [ "arm64" ], @@ -831,9 +838,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz", - "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.2.tgz", + "integrity": "sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==", "cpu": [ "x64" ], @@ -848,9 +855,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz", - "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.2.tgz", + "integrity": "sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==", "cpu": [ "arm64" ], @@ -865,9 +872,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz", - "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.2.tgz", + "integrity": "sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==", "cpu": [ "x64" ], @@ -882,9 +889,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz", - "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.2.tgz", + "integrity": "sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==", "cpu": [ "arm" ], @@ -899,9 +906,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz", - "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.2.tgz", + "integrity": "sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==", "cpu": [ "arm64" ], @@ -916,9 +923,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz", - "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.2.tgz", + "integrity": "sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==", "cpu": [ "ia32" ], @@ -933,9 +940,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz", - "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.2.tgz", + "integrity": "sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==", "cpu": [ "loong64" ], @@ -950,9 +957,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz", - "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.2.tgz", + "integrity": "sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==", "cpu": [ "mips64el" ], @@ -967,9 +974,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz", - "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.2.tgz", + "integrity": "sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==", "cpu": [ "ppc64" ], @@ -984,9 +991,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz", - "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.2.tgz", + "integrity": "sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==", "cpu": [ "riscv64" ], @@ -1001,9 +1008,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz", - "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.2.tgz", + "integrity": "sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==", "cpu": [ "s390x" ], @@ -1018,9 +1025,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz", - "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.2.tgz", + "integrity": "sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==", "cpu": [ "x64" ], @@ -1035,9 +1042,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz", - "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.2.tgz", + "integrity": "sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==", "cpu": [ "arm64" ], @@ -1052,9 +1059,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz", - "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.2.tgz", + "integrity": "sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==", "cpu": [ "x64" ], @@ -1069,9 +1076,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz", - "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.2.tgz", + "integrity": "sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==", "cpu": [ "arm64" ], @@ -1086,9 +1093,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz", - "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.2.tgz", + "integrity": "sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==", "cpu": [ "x64" ], @@ -1102,27 +1109,10 @@ "node": ">=18" } }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz", - "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz", - "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.2.tgz", + "integrity": "sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==", "cpu": [ "x64" ], @@ -1137,9 +1127,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz", - "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.2.tgz", + "integrity": "sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==", "cpu": [ "arm64" ], @@ -1154,9 +1144,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz", - "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.2.tgz", + "integrity": "sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==", "cpu": [ "ia32" ], @@ -1171,9 +1161,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz", - "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.2.tgz", + "integrity": "sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==", "cpu": [ "x64" ], @@ -1230,9 +1220,9 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", - "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.1.tgz", + "integrity": "sha512-OL0RJzC/CBzli0DrrR31qzj6d6i6Mm3HByuhflhl4LOBiWxN+3i6/t/ZQQNii4tjksXi8r2CRW1wMpWA2ULUEw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1269,9 +1259,9 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", - "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.3.tgz", + "integrity": "sha512-u180qk2Um1le4yf0ruXH3PYFeEZeYC3p/4wCTKrr2U1CmGdzGi3KtY0nuPDH48UJxlKCC5RDzbcbh4X0XlqgHg==", "dev": true, "license": "Apache-2.0", "engines": { @@ -1279,9 +1269,9 @@ } }, "node_modules/@eslint/core": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", - "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz", + "integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1353,9 +1343,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.34.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.34.0.tgz", - "integrity": "sha512-EoyvqQnBNsV1CWaEJ559rxXL4c8V92gxirbawSmVUOWXlsRxxQXl6LmCpdUblgxgSkDIqKnhzba2SjRTI/A5Rw==", + "version": "9.29.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.29.0.tgz", + "integrity": "sha512-3PIF4cBw/y+1u2EazflInpV+lYsSG0aByVIQzAgb1m1MhHFSbqTyNqtBKHgWf/9Ykud+DhILS9EGkmekVhbKoQ==", "dev": true, "license": "MIT", "engines": { @@ -1376,19 +1366,32 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", - "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.2.tgz", + "integrity": "sha512-4SaFZCNfJqvk/kenHpI8xvN42DMaoycy4PzKc5otHxRswww1kAt82OlBuwRVLofCACCTZEcla2Ydxv8scMXaTg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.15.2", + "@eslint/core": "^0.15.0", "levn": "^0.4.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.0.tgz", + "integrity": "sha512-b7ePw78tEWWkpgZCDYkbqDOP8dmM6qe+AOC6iuJqlq1R/0ahMAeH3qynpnqKFGkMltrp44ohV4ubGyvLX28tzw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", @@ -1474,13 +1477,17 @@ } }, "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==", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { @@ -1492,16 +1499,25 @@ "node": ">=6.0.0" } }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, "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==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.30", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", - "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -1573,6 +1589,12 @@ } } }, + "node_modules/@mui/material/node_modules/react-is": { + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.1.1.tgz", + "integrity": "sha512-tr41fA15Vn8p4X9ntI+yCyeGSf1TlYaY5vlTZfQmeLBrFo3psOPX6HhTDnFNL9uj3EhP0KAQ80cugCl4b4BERA==", + "license": "MIT" + }, "node_modules/@mui/private-theming": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-7.3.1.tgz", @@ -1721,6 +1743,12 @@ } } }, + "node_modules/@mui/utils/node_modules/react-is": { + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.1.1.tgz", + "integrity": "sha512-tr41fA15Vn8p4X9ntI+yCyeGSf1TlYaY5vlTZfQmeLBrFo3psOPX6HhTDnFNL9uj3EhP0KAQ80cugCl4b4BERA==", + "license": "MIT" + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1842,74 +1870,10 @@ "url": "https://opencollective.com/popperjs" } }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", - "license": "BSD-3-Clause" - }, "node_modules/@puppeteer/browsers": { - "version": "2.10.7", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.7.tgz", - "integrity": "sha512-wHWLkQWBjHtajZeqCB74nsa/X70KheyOhySYBRmVQDJiNj0zjZR/naPCvdWjMhcG1LmjaMV/9WtTo5mpe8qWLw==", + "version": "2.10.6", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.6.tgz", + "integrity": "sha512-pHUn6ZRt39bP3698HFQlu2ZHCkS/lPcpv7fVQcGBSzNNygw171UXAKrCUhy+TEMw4lEttOKDgNpb04hwUAJeiQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1931,7 +1895,7 @@ "node_modules/@react-router/dev": { "version": "7.5.3", "resolved": "https://registry.npmjs.org/@react-router/dev/-/dev-7.5.3.tgz", - "integrity": "sha512-U+n8JYAREKg6eHIAXCjazsYlwPo/vcAbShpqePnDBUdDnePBwZ2JmoqhWV+7tIhyHvvHGQKlw6BcrSZtF549WQ==", + "integrity": "sha512-BuG83Ug2C/P+zMYErTz/KKuXoxbOefh3oR66r13XWG9txwooC9nt2QDt2u8yt7Eo/9BATnx+TmXnOHEWqMyB8w==", "dev": true, "license": "MIT", "dependencies": { @@ -1961,7 +1925,7 @@ "semver": "^7.3.7", "set-cookie-parser": "^2.6.0", "valibot": "^0.41.0", - "vite-node": "3.0.0-beta.2" + "vite-node": "^3.1.4" }, "bin": { "react-router": "bin.js" @@ -1988,19 +1952,6 @@ } } }, - "node_modules/@react-router/dev/node_modules/jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/@react-router/dev/node_modules/prettier": { "version": "2.8.8", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", @@ -2020,7 +1971,7 @@ "node_modules/@react-router/node": { "version": "7.5.3", "resolved": "https://registry.npmjs.org/@react-router/node/-/node-7.5.3.tgz", - "integrity": "sha512-w85YL6UngvhxGmgTBL3qwlVLFiA1EzNyG5S55qGcnhDikfb9z84gqMlTU4UqlZm8PjQ021HPTTN6I3kd7QE5sg==", + "integrity": "sha512-KrxfnfJVU1b+020VKemkxpc7ssItsAL8MOJthcoGwPyKwrgovdwc+8NKJUqw3P7yk/Si0ZmVh9QYAzi9qF96dg==", "license": "MIT", "dependencies": { "@mjackson/node-fetch-server": "^0.2.0", @@ -2042,9 +1993,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.48.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.48.0.tgz", - "integrity": "sha512-aVzKH922ogVAWkKiyKXorjYymz2084zrhrZRXtLrA5eEx5SO8Dj0c/4FpCHZyn7MKzhW2pW4tK28vVr+5oQ2xw==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.0.tgz", + "integrity": "sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg==", "cpu": [ "arm" ], @@ -2056,9 +2007,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.48.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.48.0.tgz", - "integrity": "sha512-diOdQuw43xTa1RddAFbhIA8toirSzFMcnIg8kvlzRbK26xqEnKJ/vqQnghTAajy2Dcy42v+GMPMo6jq67od+Dw==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.0.tgz", + "integrity": "sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w==", "cpu": [ "arm64" ], @@ -2070,9 +2021,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.48.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.48.0.tgz", - "integrity": "sha512-QhR2KA18fPlJWFefySJPDYZELaVqIUVnYgAOdtJ+B/uH96CFg2l1TQpX19XpUMWUqMyIiyY45wje8K6F4w4/CA==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.0.tgz", + "integrity": "sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ==", "cpu": [ "arm64" ], @@ -2084,9 +2035,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.48.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.48.0.tgz", - "integrity": "sha512-Q9RMXnQVJ5S1SYpNSTwXDpoQLgJ/fbInWOyjbCnnqTElEyeNvLAB3QvG5xmMQMhFN74bB5ZZJYkKaFPcOG8sGg==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.0.tgz", + "integrity": "sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA==", "cpu": [ "x64" ], @@ -2098,9 +2049,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.48.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.48.0.tgz", - "integrity": "sha512-3jzOhHWM8O8PSfyft+ghXZfBkZawQA0PUGtadKYxFqpcYlOYjTi06WsnYBsbMHLawr+4uWirLlbhcYLHDXR16w==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.0.tgz", + "integrity": "sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg==", "cpu": [ "arm64" ], @@ -2112,9 +2063,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.48.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.48.0.tgz", - "integrity": "sha512-NcD5uVUmE73C/TPJqf78hInZmiSBsDpz3iD5MF/BuB+qzm4ooF2S1HfeTChj5K4AV3y19FFPgxonsxiEpy8v/A==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.0.tgz", + "integrity": "sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw==", "cpu": [ "x64" ], @@ -2126,9 +2077,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.48.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.48.0.tgz", - "integrity": "sha512-JWnrj8qZgLWRNHr7NbpdnrQ8kcg09EBBq8jVOjmtlB3c8C6IrynAJSMhMVGME4YfTJzIkJqvSUSVJRqkDnu/aA==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.0.tgz", + "integrity": "sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA==", "cpu": [ "arm" ], @@ -2140,9 +2091,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.48.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.48.0.tgz", - "integrity": "sha512-9xu92F0TxuMH0tD6tG3+GtngwdgSf8Bnz+YcsPG91/r5Vgh5LNofO48jV55priA95p3c92FLmPM7CvsVlnSbGQ==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.0.tgz", + "integrity": "sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg==", "cpu": [ "arm" ], @@ -2154,9 +2105,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.48.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.48.0.tgz", - "integrity": "sha512-NLtvJB5YpWn7jlp1rJiY0s+G1Z1IVmkDuiywiqUhh96MIraC0n7XQc2SZ1CZz14shqkM+XN2UrfIo7JB6UufOA==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.0.tgz", + "integrity": "sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg==", "cpu": [ "arm64" ], @@ -2168,9 +2119,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.48.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.48.0.tgz", - "integrity": "sha512-QJ4hCOnz2SXgCh+HmpvZkM+0NSGcZACyYS8DGbWn2PbmA0e5xUk4bIP8eqJyNXLtyB4gZ3/XyvKtQ1IFH671vQ==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.0.tgz", + "integrity": "sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ==", "cpu": [ "arm64" ], @@ -2182,9 +2133,9 @@ ] }, "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.48.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.48.0.tgz", - "integrity": "sha512-Pk0qlGJnhILdIC5zSKQnprFjrGmjfDM7TPZ0FKJxRkoo+kgMRAg4ps1VlTZf8u2vohSicLg7NP+cA5qE96PaFg==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.0.tgz", + "integrity": "sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg==", "cpu": [ "loong64" ], @@ -2195,10 +2146,10 @@ "linux" ] }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.48.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.48.0.tgz", - "integrity": "sha512-/dNFc6rTpoOzgp5GKoYjT6uLo8okR/Chi2ECOmCZiS4oqh3mc95pThWma7Bgyk6/WTEvjDINpiBCuecPLOgBLQ==", + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.0.tgz", + "integrity": "sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw==", "cpu": [ "ppc64" ], @@ -2210,9 +2161,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.48.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.48.0.tgz", - "integrity": "sha512-YBwXsvsFI8CVA4ej+bJF2d9uAeIiSkqKSPQNn0Wyh4eMDY4wxuSp71BauPjQNCKK2tD2/ksJ7uhJ8X/PVY9bHQ==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.0.tgz", + "integrity": "sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA==", "cpu": [ "riscv64" ], @@ -2224,9 +2175,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.48.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.48.0.tgz", - "integrity": "sha512-FI3Rr2aGAtl1aHzbkBIamsQyuauYtTF9SDUJ8n2wMXuuxwchC3QkumZa1TEXYIv/1AUp1a25Kwy6ONArvnyeVQ==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.0.tgz", + "integrity": "sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ==", "cpu": [ "riscv64" ], @@ -2238,9 +2189,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.48.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.48.0.tgz", - "integrity": "sha512-Dx7qH0/rvNNFmCcIRe1pyQ9/H0XO4v/f0SDoafwRYwc2J7bJZ5N4CHL/cdjamISZ5Cgnon6iazAVRFlxSoHQnQ==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.0.tgz", + "integrity": "sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw==", "cpu": [ "s390x" ], @@ -2252,9 +2203,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.48.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.48.0.tgz", - "integrity": "sha512-GUdZKTeKBq9WmEBzvFYuC88yk26vT66lQV8D5+9TgkfbewhLaTHRNATyzpQwwbHIfJvDJ3N9WJ90wK/uR3cy3Q==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.0.tgz", + "integrity": "sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ==", "cpu": [ "x64" ], @@ -2266,9 +2217,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.48.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.48.0.tgz", - "integrity": "sha512-ao58Adz/v14MWpQgYAb4a4h3fdw73DrDGtaiF7Opds5wNyEQwtO6M9dBh89nke0yoZzzaegq6J/EXs7eBebG8A==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.0.tgz", + "integrity": "sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw==", "cpu": [ "x64" ], @@ -2280,9 +2231,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.48.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.48.0.tgz", - "integrity": "sha512-kpFno46bHtjZVdRIOxqaGeiABiToo2J+st7Yce+aiAoo1H0xPi2keyQIP04n2JjDVuxBN6bSz9R6RdTK5hIppw==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.0.tgz", + "integrity": "sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ==", "cpu": [ "arm64" ], @@ -2294,9 +2245,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.48.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.48.0.tgz", - "integrity": "sha512-rFYrk4lLk9YUTIeihnQMiwMr6gDhGGSbWThPEDfBoU/HdAtOzPXeexKi7yU8jO+LWRKnmqPN9NviHQf6GDwBcQ==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.0.tgz", + "integrity": "sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA==", "cpu": [ "ia32" ], @@ -2308,9 +2259,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.48.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.48.0.tgz", - "integrity": "sha512-sq0hHLTgdtwOPDB5SJOuaoHyiP1qSwg+71TQWk8iDS04bW1wIE0oQ6otPiRj2ZvLYNASLMaTp8QRGUVZ+5OL5A==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.0.tgz", + "integrity": "sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ==", "cpu": [ "x64" ], @@ -2349,9 +2300,9 @@ "license": "MIT" }, "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", "dev": true, "license": "MIT" }, @@ -2370,12 +2321,13 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "20.19.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.11.tgz", - "integrity": "sha512-uug3FEEGv0r+jrecvUUpbY8lLisvIjg6AAic6a2bSP5OEOLeJsDSnvhCDov7ipFFMXS3orMpzlmi0ZcuGkBbow==", + "version": "20.17.30", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.30.tgz", + "integrity": "sha512-7zf4YyHA+jvBNfVrk2Gtvs6x7E8V+YDW05bNfG2XkWDJfYRXrTiP/DsB2zSYTaHX0bGIujTBQdMVAhb+j7mwpg==", + "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~6.21.0" + "undici-types": "~6.19.2" } }, "node_modules/@types/parse-json": { @@ -2398,18 +2350,18 @@ "license": "MIT" }, "node_modules/@types/react": { - "version": "19.1.11", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.11.tgz", - "integrity": "sha512-lr3jdBw/BGj49Eps7EvqlUaoeA0xpj3pc0RoJkHpYaCHkVK7i28dKyImLQb3JVlqs3aYSXf7qYuWOW/fgZnTXQ==", + "version": "19.1.2", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.2.tgz", + "integrity": "sha512-oxLPMytKchWGbnQM9O7D67uPa9paTNxO7jVoNMXgkkErULBPhPARCfkKL9ytcIJJRGjbsVwW4ugJzyFFvm/Tiw==", "license": "MIT", "dependencies": { "csstype": "^3.0.2" } }, "node_modules/@types/react-dom": { - "version": "19.1.7", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.7.tgz", - "integrity": "sha512-i5ZzwYpqjmrKenzkoLM2Ibzt6mAsM7pxB6BCIouEVVmgiqaMj1TjaK7hnA36hbW5aZv20kx7Lw6hWzPWg0Rurw==", + "version": "19.1.2", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.2.tgz", + "integrity": "sha512-XGJkWF41Qq305SKWEILa1O8vzhb3aOo3ogBlSmiqNko/WmRb6QIaweuZCXjKygVDXpzXb5wyxKTSOsmkuqj+Qw==", "dev": true, "license": "MIT", "peerDependencies": { @@ -2443,17 +2395,17 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.40.0.tgz", - "integrity": "sha512-w/EboPlBwnmOBtRbiOvzjD+wdiZdgFeo17lkltrtn7X37vagKKWJABvyfsJXTlHe6XBzugmYgd4A4nW+k8Mixw==", + "version": "8.34.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.34.1.tgz", + "integrity": "sha512-STXcN6ebF6li4PxwNeFnqF8/2BNDvBupf2OPx2yWNzr6mKNGF7q49VM00Pz5FaomJyqvbXpY6PhO+T9w139YEQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.40.0", - "@typescript-eslint/type-utils": "8.40.0", - "@typescript-eslint/utils": "8.40.0", - "@typescript-eslint/visitor-keys": "8.40.0", + "@typescript-eslint/scope-manager": "8.34.1", + "@typescript-eslint/type-utils": "8.34.1", + "@typescript-eslint/utils": "8.34.1", + "@typescript-eslint/visitor-keys": "8.34.1", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -2467,9 +2419,9 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.40.0", + "@typescript-eslint/parser": "^8.34.1", "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { @@ -2483,16 +2435,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.40.0.tgz", - "integrity": "sha512-jCNyAuXx8dr5KJMkecGmZ8KI61KBUhkCob+SD+C+I5+Y1FWI2Y3QmY4/cxMCC5WAsZqoEtEETVhUiUMIGCf6Bw==", + "version": "8.34.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.34.1.tgz", + "integrity": "sha512-4O3idHxhyzjClSMJ0a29AcoK0+YwnEqzI6oz3vlRf3xw0zbzt15MzXwItOlnr5nIth6zlY2RENLsOPvhyrKAQA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.40.0", - "@typescript-eslint/types": "8.40.0", - "@typescript-eslint/typescript-estree": "8.40.0", - "@typescript-eslint/visitor-keys": "8.40.0", + "@typescript-eslint/scope-manager": "8.34.1", + "@typescript-eslint/types": "8.34.1", + "@typescript-eslint/typescript-estree": "8.34.1", + "@typescript-eslint/visitor-keys": "8.34.1", "debug": "^4.3.4" }, "engines": { @@ -2504,18 +2456,18 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.40.0.tgz", - "integrity": "sha512-/A89vz7Wf5DEXsGVvcGdYKbVM9F7DyFXj52lNYUDS1L9yJfqjW/fIp5PgMuEJL/KeqVTe2QSbXAGUZljDUpArw==", + "version": "8.34.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.34.1.tgz", + "integrity": "sha512-nuHlOmFZfuRwLJKDGQOVc0xnQrAmuq1Mj/ISou5044y1ajGNp2BNliIqp7F2LPQ5sForz8lempMFCovfeS1XoA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.40.0", - "@typescript-eslint/types": "^8.40.0", + "@typescript-eslint/tsconfig-utils": "^8.34.1", + "@typescript-eslint/types": "^8.34.1", "debug": "^4.3.4" }, "engines": { @@ -2526,18 +2478,18 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.40.0.tgz", - "integrity": "sha512-y9ObStCcdCiZKzwqsE8CcpyuVMwRouJbbSrNuThDpv16dFAj429IkM6LNb1dZ2m7hK5fHyzNcErZf7CEeKXR4w==", + "version": "8.34.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.34.1.tgz", + "integrity": "sha512-beu6o6QY4hJAgL1E8RaXNC071G4Kso2MGmJskCFQhRhg8VOH/FDbC8soP8NHN7e/Hdphwp8G8cE6OBzC8o41ZA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.40.0", - "@typescript-eslint/visitor-keys": "8.40.0" + "@typescript-eslint/types": "8.34.1", + "@typescript-eslint/visitor-keys": "8.34.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2548,9 +2500,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.40.0.tgz", - "integrity": "sha512-jtMytmUaG9d/9kqSl/W3E3xaWESo4hFDxAIHGVW/WKKtQhesnRIJSAJO6XckluuJ6KDB5woD1EiqknriCtAmcw==", + "version": "8.34.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.34.1.tgz", + "integrity": "sha512-K4Sjdo4/xF9NEeA2khOb7Y5nY6NSXBnod87uniVYW9kHP+hNlDV8trUSFeynA2uxWam4gIWgWoygPrv9VMWrYg==", "dev": true, "license": "MIT", "engines": { @@ -2561,19 +2513,18 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.40.0.tgz", - "integrity": "sha512-eE60cK4KzAc6ZrzlJnflXdrMqOBaugeukWICO2rB0KNvwdIMaEaYiywwHMzA1qFpTxrLhN9Lp4E/00EgWcD3Ow==", + "version": "8.34.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.34.1.tgz", + "integrity": "sha512-Tv7tCCr6e5m8hP4+xFugcrwTOucB8lshffJ6zf1mF1TbU67R+ntCc6DzLNKM+s/uzDyv8gLq7tufaAhIBYeV8g==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.40.0", - "@typescript-eslint/typescript-estree": "8.40.0", - "@typescript-eslint/utils": "8.40.0", + "@typescript-eslint/typescript-estree": "8.34.1", + "@typescript-eslint/utils": "8.34.1", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -2586,13 +2537,13 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/types": { - "version": "8.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.40.0.tgz", - "integrity": "sha512-ETdbFlgbAmXHyFPwqUIYrfc12ArvpBhEVgGAxVYSwli26dn8Ko+lIo4Su9vI9ykTZdJn+vJprs/0eZU0YMAEQg==", + "version": "8.34.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.34.1.tgz", + "integrity": "sha512-rjLVbmE7HR18kDsjNIZQHxmv9RZwlgzavryL5Lnj2ujIRTeXlKtILHgRNmQ3j4daw7zd+mQgy+uyt6Zo6I0IGA==", "dev": true, "license": "MIT", "engines": { @@ -2604,16 +2555,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.40.0.tgz", - "integrity": "sha512-k1z9+GJReVVOkc1WfVKs1vBrR5MIKKbdAjDTPvIK3L8De6KbFfPFt6BKpdkdk7rZS2GtC/m6yI5MYX+UsuvVYQ==", + "version": "8.34.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.34.1.tgz", + "integrity": "sha512-rjCNqqYPuMUF5ODD+hWBNmOitjBWghkGKJg6hiCHzUvXRy6rK22Jd3rwbP2Xi+R7oYVvIKhokHVhH41BxPV5mA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.40.0", - "@typescript-eslint/tsconfig-utils": "8.40.0", - "@typescript-eslint/types": "8.40.0", - "@typescript-eslint/visitor-keys": "8.40.0", + "@typescript-eslint/project-service": "8.34.1", + "@typescript-eslint/tsconfig-utils": "8.34.1", + "@typescript-eslint/types": "8.34.1", + "@typescript-eslint/visitor-keys": "8.34.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -2629,20 +2580,20 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/utils": { - "version": "8.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.40.0.tgz", - "integrity": "sha512-Cgzi2MXSZyAUOY+BFwGs17s7ad/7L+gKt6Y8rAVVWS+7o6wrjeFN4nVfTpbE25MNcxyJ+iYUXflbs2xR9h4UBg==", + "version": "8.34.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.34.1.tgz", + "integrity": "sha512-mqOwUdZ3KjtGk7xJJnLbHxTuWVn3GO2WZZuM+Slhkun4+qthLdXx32C8xIXbO1kfCECb3jIs3eoxK3eryk7aoQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.40.0", - "@typescript-eslint/types": "8.40.0", - "@typescript-eslint/typescript-estree": "8.40.0" + "@typescript-eslint/scope-manager": "8.34.1", + "@typescript-eslint/types": "8.34.1", + "@typescript-eslint/typescript-estree": "8.34.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2653,17 +2604,17 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.40.0.tgz", - "integrity": "sha512-8CZ47QwalyRjsypfwnbI3hKy5gJDPmrkLjkgMxhi0+DZZ2QNx2naS6/hWoVYUHU7LU2zleF68V9miaVZvhFfTA==", + "version": "8.34.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.34.1.tgz", + "integrity": "sha512-xoh5rJ+tgsRKoXnkBPFRLZ7rjKM0AfVbC68UZ/ECXoDbfggb9RbEySN359acY1vS3qZ0jVTVWzbtfapwm5ztxw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.40.0", + "@typescript-eslint/types": "8.34.1", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -2687,6 +2638,15 @@ "node": ">= 0.6" } }, + "node_modules/accepts/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==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/acorn": { "version": "8.15.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", @@ -2738,9 +2698,9 @@ } }, "node_modules/ansi-regex": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz", - "integrity": "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, "license": "MIT", "engines": { @@ -2751,16 +2711,13 @@ } }, "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==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" @@ -3014,6 +2971,51 @@ "npm": ">=6" } }, + "node_modules/babel-plugin-macros/node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/babel-plugin-macros/node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "license": "MIT", + "dependencies": { + "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/babel-plugin-macros/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -3030,9 +3032,9 @@ "optional": true }, "node_modules/bare-fs": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.2.1.tgz", - "integrity": "sha512-mELROzV0IhqilFgsl1gyp48pnZsaV9xhQapHLDsvn4d4ZTfbFhcghQezl7FTEDNBcGqLUnNI3lUlm6ecrLWdFA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.2.0.tgz", + "integrity": "sha512-oRfrw7gwwBVAWx9S5zPMo2iiOjxyiZE12DmblmMQREgcogbNO0AFaZ+QBxxkEXiPspcpvO/Qtqn8LabUx4uYXg==", "dev": true, "license": "Apache-2.0", "optional": true, @@ -3054,9 +3056,9 @@ } }, "node_modules/bare-os": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.2.tgz", - "integrity": "sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.1.tgz", + "integrity": "sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==", "dev": true, "license": "Apache-2.0", "optional": true, @@ -3157,9 +3159,9 @@ "license": "MIT" }, "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "license": "MIT", "dependencies": { @@ -3187,9 +3189,9 @@ "license": "ISC" }, "node_modules/browserslist": { - "version": "4.25.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.3.tgz", - "integrity": "sha512-cDGv1kkDI4/0e5yON9yM5G/0A5u8sf5TnmdX5C9qHzI9PPu++sQ9zjm1k9NiOrf3riY4OkK0zSGqfvJyJsgCBQ==", + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", "dev": true, "funding": [ { @@ -3207,10 +3209,10 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001735", - "electron-to-chromium": "^1.5.204", + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.3" + "update-browserslist-db": "^1.1.1" }, "bin": { "browserslist": "cli.js" @@ -3331,9 +3333,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001737", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001737.tgz", - "integrity": "sha512-BiloLiXtQNrY5UyF0+1nSJLXUENuhka2pzy2Fx5pGxqavdrxSCW4U6Pn/PoG3Efspi2frRbHpBV2XsrPE6EDlw==", + "version": "1.0.30001713", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001713.tgz", + "integrity": "sha512-wCIWIg+A4Xr7NfhTuHdX+/FKh3+Op3LBbSp2N5Pfx6T/LhdQy3GTyoTg48BReaW/MyMNZAkTadsBtai3ldWK0Q==", "dev": true, "funding": [ { @@ -3368,6 +3370,22 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/chalk/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/chokidar": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", @@ -3385,9 +3403,9 @@ } }, "node_modules/chromium-bidi": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-8.0.0.tgz", - "integrity": "sha512-d1VmE0FD7lxZQHzcDUCKZSNRtRwISXDsdg4HjdTR5+Ll5nQ/vzU12JeNmupD6VWffrPSlrnGhEWlLESKH3VO+g==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-7.3.1.tgz", + "integrity": "sha512-i+BMGluhZZc4Jic9L1aHJBTfaopxmCqQxGklyMcqFx4fvF3nI4BJ3bCe1ad474nvYRIo/ZN/VrdA4eOaRZua4Q==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3423,6 +3441,22 @@ "node": ">=8" } }, + "node_modules/cliui/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/cliui/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -3588,9 +3622,10 @@ } }, "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "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/cookie": { @@ -3615,28 +3650,30 @@ "license": "MIT" }, "node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, "license": "MIT", "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" }, "engines": { - "node": ">=10" - } - }, - "node_modules/cosmiconfig/node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "license": "ISC", - "engines": { - "node": ">= 6" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/cross-spawn": { @@ -3771,9 +3808,9 @@ } }, "node_modules/dedent": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.6.0.tgz", - "integrity": "sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", + "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -3939,9 +3976,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.208", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.208.tgz", - "integrity": "sha512-ozZyibehoe7tOhNaf16lKmljVf+3npZcJIEbJRVftVsmAg5TeA1mGS9dVCZzOwr2xT7xK15V0p7+GZqSPgkuPg==", + "version": "1.5.137", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.137.tgz", + "integrity": "sha512-/QSJaU2JyIuTbbABAo/crOs+SuAZLS+fVVS10PVrIT9hrRkmZl8Hb0xPSkKRUUWHQtYzXHpQUW3Dy5hwMzGZkA==", "dev": true, "license": "ISC" }, @@ -4003,6 +4040,12 @@ "is-arrayish": "^0.2.1" } }, + "node_modules/error-ex/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==", + "license": "MIT" + }, "node_modules/es-abstract": { "version": "1.24.0", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", @@ -4185,9 +4228,9 @@ } }, "node_modules/esbuild": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz", - "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.2.tgz", + "integrity": "sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -4198,32 +4241,31 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.9", - "@esbuild/android-arm": "0.25.9", - "@esbuild/android-arm64": "0.25.9", - "@esbuild/android-x64": "0.25.9", - "@esbuild/darwin-arm64": "0.25.9", - "@esbuild/darwin-x64": "0.25.9", - "@esbuild/freebsd-arm64": "0.25.9", - "@esbuild/freebsd-x64": "0.25.9", - "@esbuild/linux-arm": "0.25.9", - "@esbuild/linux-arm64": "0.25.9", - "@esbuild/linux-ia32": "0.25.9", - "@esbuild/linux-loong64": "0.25.9", - "@esbuild/linux-mips64el": "0.25.9", - "@esbuild/linux-ppc64": "0.25.9", - "@esbuild/linux-riscv64": "0.25.9", - "@esbuild/linux-s390x": "0.25.9", - "@esbuild/linux-x64": "0.25.9", - "@esbuild/netbsd-arm64": "0.25.9", - "@esbuild/netbsd-x64": "0.25.9", - "@esbuild/openbsd-arm64": "0.25.9", - "@esbuild/openbsd-x64": "0.25.9", - "@esbuild/openharmony-arm64": "0.25.9", - "@esbuild/sunos-x64": "0.25.9", - "@esbuild/win32-arm64": "0.25.9", - "@esbuild/win32-ia32": "0.25.9", - "@esbuild/win32-x64": "0.25.9" + "@esbuild/aix-ppc64": "0.25.2", + "@esbuild/android-arm": "0.25.2", + "@esbuild/android-arm64": "0.25.2", + "@esbuild/android-x64": "0.25.2", + "@esbuild/darwin-arm64": "0.25.2", + "@esbuild/darwin-x64": "0.25.2", + "@esbuild/freebsd-arm64": "0.25.2", + "@esbuild/freebsd-x64": "0.25.2", + "@esbuild/linux-arm": "0.25.2", + "@esbuild/linux-arm64": "0.25.2", + "@esbuild/linux-ia32": "0.25.2", + "@esbuild/linux-loong64": "0.25.2", + "@esbuild/linux-mips64el": "0.25.2", + "@esbuild/linux-ppc64": "0.25.2", + "@esbuild/linux-riscv64": "0.25.2", + "@esbuild/linux-s390x": "0.25.2", + "@esbuild/linux-x64": "0.25.2", + "@esbuild/netbsd-arm64": "0.25.2", + "@esbuild/netbsd-x64": "0.25.2", + "@esbuild/openbsd-arm64": "0.25.2", + "@esbuild/openbsd-x64": "0.25.2", + "@esbuild/sunos-x64": "0.25.2", + "@esbuild/win32-arm64": "0.25.2", + "@esbuild/win32-ia32": "0.25.2", + "@esbuild/win32-x64": "0.25.2" } }, "node_modules/escalade": { @@ -4276,32 +4318,21 @@ "source-map": "~0.6.1" } }, - "node_modules/escodegen/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", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/eslint": { - "version": "9.34.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.34.0.tgz", - "integrity": "sha512-RNCHRX5EwdrESy3Jc9o8ie8Bog+PeYvvSR8sDGoZxNFTvZ4dlxUB3WzQ3bQMztFrSRODGrLLj8g6OFuGY/aiQg==", + "version": "9.29.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.29.0.tgz", + "integrity": "sha512-GsGizj2Y1rCWDu6XoEekL3RLilp0voSePurjZIkxL3wlm5o5EC9VpgaP7lrCvjnkuLvzFBQWB3vWB3K5KQTveQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.0", - "@eslint/config-helpers": "^0.3.1", - "@eslint/core": "^0.15.2", + "@eslint/config-array": "^0.20.1", + "@eslint/config-helpers": "^0.2.1", + "@eslint/core": "^0.14.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.34.0", - "@eslint/plugin-kit": "^0.3.5", + "@eslint/js": "9.29.0", + "@eslint/plugin-kit": "^0.3.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", @@ -4373,6 +4404,17 @@ "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" } }, + "node_modules/eslint-plugin-jsdoc/node_modules/spdx-expression-parse": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", + "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, "node_modules/eslint-plugin-mocha": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-11.1.0.tgz", @@ -4457,24 +4499,6 @@ "node": "*" } }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/eslint-plugin-react/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -4800,14 +4824,11 @@ } }, "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", + "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", "dev": true, "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, "peerDependencies": { "picomatch": "^3 || ^4" }, @@ -5217,9 +5238,9 @@ } }, "node_modules/globals": { - "version": "16.3.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-16.3.0.tgz", - "integrity": "sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.2.0.tgz", + "integrity": "sha512-O+7l9tPdHCU320IigZZPj5zmRCFG9xHmx9cU8FqU2Rp+JN714seHV+2S9+JslCpY4gJwU2vOGox0wzgae/MCEg==", "dev": true, "license": "MIT", "engines": { @@ -5399,12 +5420,6 @@ "react-is": "^16.7.0" } }, - "node_modules/hoist-non-react-statics/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "license": "MIT" - }, "node_modules/hosted-git-info": { "version": "6.1.3", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.3.tgz", @@ -5579,9 +5594,9 @@ } }, "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==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", "license": "MIT" }, "node_modules/is-async-function": { @@ -6008,9 +6023,9 @@ "license": "MIT" }, "node_modules/isbot": { - "version": "5.1.30", - "resolved": "https://registry.npmjs.org/isbot/-/isbot-5.1.30.tgz", - "integrity": "sha512-3wVJEonAns1OETX83uWsk5IAne2S5zfDcntD2hbtU23LelSqNXzXs9zKjMPOLMzroCgIjCfjYAEHrd2D6FOkiA==", + "version": "5.1.26", + "resolved": "https://registry.npmjs.org/isbot/-/isbot-5.1.26.tgz", + "integrity": "sha512-3wqJEYSIm59dYQjEF7zJ7T42aqaqxbCyJQda5rKCudJykuAnISptCHR/GSGpOnw8UrvU+mGueNLRJS5HXnbsXQ==", "license": "Unlicense", "engines": { "node": ">=18" @@ -6057,6 +6072,18 @@ "@pkgjs/parseargs": "^0.11.0" } }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, "node_modules/jose": { "version": "4.15.9", "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz", @@ -6096,9 +6123,9 @@ } }, "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", "license": "MIT", "bin": { "jsesc": "bin/jsesc" @@ -6152,9 +6179,9 @@ } }, "node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6203,12 +6230,12 @@ } }, "node_modules/jwa": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz", - "integrity": "sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", "license": "MIT", "dependencies": { - "buffer-equal-constant-time": "^1.0.1", + "buffer-equal-constant-time": "1.0.1", "ecdsa-sig-formatter": "1.0.11", "safe-buffer": "^5.0.1" } @@ -6374,12 +6401,6 @@ "node": ">= 12.0.0" } }, - "node_modules/long": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", - "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", - "license": "Apache-2.0" - }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -6487,15 +6508,6 @@ "node": ">=4" } }, - "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==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", @@ -6508,6 +6520,15 @@ "node": ">= 0.6" } }, + "node_modules/mime-types/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==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", @@ -6656,15 +6677,6 @@ "dev": true, "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==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/netmask": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", @@ -6762,15 +6774,6 @@ "node": ">=0.10.0" } }, - "node_modules/object-hash": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", - "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, "node_modules/object-inspect": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", @@ -6869,9 +6872,9 @@ } }, "node_modules/oidc-token-hash": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.1.1.tgz", - "integrity": "sha512-D7EmwxJV6DsEB6vOFLrBM2OzsVgQzgPWyHlV2OOAVj772n+WTXpudC9e9u5BVKQnYwaD30Ivhi9b+4UeBcGu9g==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.1.0.tgz", + "integrity": "sha512-y0W+X7Ppo7oZX6eovsRkuzcSM40Bicg2JEJkDJ4irIt1wsYAP5MLSNv+QAogO8xivMffw/9OvV3um1pxXgt1uA==", "license": "MIT", "engines": { "node": "^10.13.0 || >=12.0.0" @@ -6935,6 +6938,15 @@ "node": ">=10" } }, + "node_modules/openid-client/node_modules/object-hash": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, "node_modules/openid-client/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -7198,9 +7210,9 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true, "license": "MIT", "engines": { @@ -7221,9 +7233,9 @@ } }, "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", "dev": true, "funding": [ { @@ -7241,7 +7253,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.11", + "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -7333,36 +7345,6 @@ "react-is": "^16.13.1" } }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "license": "MIT" - }, - "node_modules/protobufjs": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.4.tgz", - "integrity": "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==", - "hasInstallScript": true, - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -7435,18 +7417,18 @@ } }, "node_modules/puppeteer": { - "version": "24.17.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.17.0.tgz", - "integrity": "sha512-CGrmJ8WgilK3nyE73k+pbxHggETPpEvL6AQ9H5JSK1RgZRGMQVJ+iO3MocGm9yBQXQJ9U5xijyLvkYXFeb0/+g==", + "version": "24.16.2", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.16.2.tgz", + "integrity": "sha512-eNjKzwjITM4Lvho6iHb+VQamadUBgc8TsjAApsKi5N8DXipxAaAZWssBOFsrIOLo4eYWYj0Qk5gmr4wBSqzJWw==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@puppeteer/browsers": "2.10.7", - "chromium-bidi": "8.0.0", + "@puppeteer/browsers": "2.10.6", + "chromium-bidi": "7.3.1", "cosmiconfig": "^9.0.0", "devtools-protocol": "0.0.1475386", - "puppeteer-core": "24.17.0", + "puppeteer-core": "24.16.2", "typed-query-selector": "^2.12.0" }, "bin": { @@ -7457,14 +7439,14 @@ } }, "node_modules/puppeteer-core": { - "version": "24.17.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.17.0.tgz", - "integrity": "sha512-RYOBKFiF+3RdwIZTEacqNpD567gaFcBAOKTT7742FdB1icXudrPI7BlZbYTYWK2wgGQUXt9Zi1Yn+D5PmCs4CA==", + "version": "24.16.2", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.16.2.tgz", + "integrity": "sha512-areKSSQzpoHa5nCk3uD/o504yjrW5ws0N6jZfdFZ3a4H+Q7NBgvuDydjN5P87jN4Rj+eIpLcK3ELOThTtYuuxg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@puppeteer/browsers": "2.10.7", - "chromium-bidi": "8.0.0", + "@puppeteer/browsers": "2.10.6", + "chromium-bidi": "7.3.1", "debug": "^4.4.1", "devtools-protocol": "0.0.1475386", "typed-query-selector": "^2.12.0", @@ -7474,33 +7456,6 @@ "node": ">=18" } }, - "node_modules/puppeteer/node_modules/cosmiconfig": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", - "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", - "dev": true, - "license": "MIT", - "dependencies": { - "env-paths": "^2.2.1", - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, "node_modules/qs": { "version": "6.13.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", @@ -7572,30 +7527,30 @@ } }, "node_modules/react": { - "version": "19.1.1", - "resolved": "https://registry.npmjs.org/react/-/react-19.1.1.tgz", - "integrity": "sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==", + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", + "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/react-dom": { - "version": "19.1.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.1.tgz", - "integrity": "sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw==", + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", + "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", "license": "MIT", "dependencies": { "scheduler": "^0.26.0" }, "peerDependencies": { - "react": "^19.1.1" + "react": "^19.1.0" } }, "node_modules/react-is": { - "version": "19.1.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.1.1.tgz", - "integrity": "sha512-tr41fA15Vn8p4X9ntI+yCyeGSf1TlYaY5vlTZfQmeLBrFo3psOPX6HhTDnFNL9uj3EhP0KAQ80cugCl4b4BERA==", + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "license": "MIT" }, "node_modules/react-refresh": { @@ -7611,12 +7566,11 @@ "node_modules/react-router": { "version": "7.5.3", "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.5.3.tgz", - "integrity": "sha512-3iUDM4/fZCQ89SXlDa+Ph3MevBrozBAI655OAfWQlTm9nBR0IKlrmNwFow5lPHttbwvITZfkeeeZFP6zt3F7pw==", + "integrity": "sha512-U7Nv3y+bMimgWjhlT5CRdzHPu2/KVmqPwKUCChW8en5P3znxUqwlYFlbmyj8Rgp1SF6zs5X4+77kBVknkg6a0w==", "license": "MIT", "dependencies": { "cookie": "^1.0.1", - "set-cookie-parser": "^2.6.0", - "turbo-stream": "2.4.0" + "set-cookie-parser": "^2.6.0" }, "engines": { "node": ">=20.0.0" @@ -7746,21 +7700,19 @@ } }, "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.16.0", + "is-core-module": "^2.13.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" } @@ -7806,13 +7758,13 @@ } }, "node_modules/rollup": { - "version": "4.48.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.48.0.tgz", - "integrity": "sha512-BXHRqK1vyt9XVSEHZ9y7xdYtuYbwVod2mLwOMFP7t/Eqoc1pHRlG/WdV2qNeNvZHRQdLedaFycljaYYM96RqJQ==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.0.tgz", + "integrity": "sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w==", "dev": true, "license": "MIT", "dependencies": { - "@types/estree": "1.0.8" + "@types/estree": "1.0.7" }, "bin": { "rollup": "dist/bin/rollup" @@ -7822,26 +7774,26 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.48.0", - "@rollup/rollup-android-arm64": "4.48.0", - "@rollup/rollup-darwin-arm64": "4.48.0", - "@rollup/rollup-darwin-x64": "4.48.0", - "@rollup/rollup-freebsd-arm64": "4.48.0", - "@rollup/rollup-freebsd-x64": "4.48.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.48.0", - "@rollup/rollup-linux-arm-musleabihf": "4.48.0", - "@rollup/rollup-linux-arm64-gnu": "4.48.0", - "@rollup/rollup-linux-arm64-musl": "4.48.0", - "@rollup/rollup-linux-loongarch64-gnu": "4.48.0", - "@rollup/rollup-linux-ppc64-gnu": "4.48.0", - "@rollup/rollup-linux-riscv64-gnu": "4.48.0", - "@rollup/rollup-linux-riscv64-musl": "4.48.0", - "@rollup/rollup-linux-s390x-gnu": "4.48.0", - "@rollup/rollup-linux-x64-gnu": "4.48.0", - "@rollup/rollup-linux-x64-musl": "4.48.0", - "@rollup/rollup-win32-arm64-msvc": "4.48.0", - "@rollup/rollup-win32-ia32-msvc": "4.48.0", - "@rollup/rollup-win32-x64-msvc": "4.48.0", + "@rollup/rollup-android-arm-eabi": "4.40.0", + "@rollup/rollup-android-arm64": "4.40.0", + "@rollup/rollup-darwin-arm64": "4.40.0", + "@rollup/rollup-darwin-x64": "4.40.0", + "@rollup/rollup-freebsd-arm64": "4.40.0", + "@rollup/rollup-freebsd-x64": "4.40.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.40.0", + "@rollup/rollup-linux-arm-musleabihf": "4.40.0", + "@rollup/rollup-linux-arm64-gnu": "4.40.0", + "@rollup/rollup-linux-arm64-musl": "4.40.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.40.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.40.0", + "@rollup/rollup-linux-riscv64-gnu": "4.40.0", + "@rollup/rollup-linux-riscv64-musl": "4.40.0", + "@rollup/rollup-linux-s390x-gnu": "4.40.0", + "@rollup/rollup-linux-x64-gnu": "4.40.0", + "@rollup/rollup-linux-x64-musl": "4.40.0", + "@rollup/rollup-win32-arm64-msvc": "4.40.0", + "@rollup/rollup-win32-ia32-msvc": "4.40.0", + "@rollup/rollup-win32-x64-msvc": "4.40.0", "fsevents": "~2.3.2" } }, @@ -8242,12 +8194,6 @@ "is-arrayish": "^0.3.1" } }, - "node_modules/simple-swizzle/node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "license": "MIT" - }, "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -8290,9 +8236,9 @@ } }, "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -8318,15 +8264,6 @@ "source-map": "^0.6.0" } }, - "node_modules/source-map-support/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==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/spdx-correct": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", @@ -8338,17 +8275,6 @@ "spdx-license-ids": "^3.0.0" } }, - "node_modules/spdx-correct/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": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, "node_modules/spdx-exceptions": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", @@ -8357,9 +8283,9 @@ "license": "CC-BY-3.0" }, "node_modules/spdx-expression-parse": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", - "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", + "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": { @@ -8368,9 +8294,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.22", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", - "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", + "version": "3.0.21", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", + "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", "dev": true, "license": "CC0-1.0" }, @@ -8740,9 +8666,9 @@ "license": "MIT" }, "node_modules/tinyglobby": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", - "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", + "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", "dev": true, "license": "MIT", "dependencies": { @@ -8801,9 +8727,9 @@ } }, "node_modules/tsconfck": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.6.tgz", - "integrity": "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.5.tgz", + "integrity": "sha512-CLDfGgUp7XPswWnezWwsCRxNmgQjhYq3VXHM0/XIRxhVrKw0M1if9agzryh1QS3nxjCROvV+xWxoJO1YctzzWg==", "dev": true, "license": "MIT", "bin": { @@ -8829,9 +8755,9 @@ "license": "0BSD" }, "node_modules/tsx": { - "version": "4.20.5", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.5.tgz", - "integrity": "sha512-+wKjMNU9w/EaQayHXb7WA7ZaHY6hN8WgfvHNQ3t1PnU91/7O8TcTnIhCDYTZwnt8JsO9IBqZ30Ln1r7pPF52Aw==", + "version": "4.20.4", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.4.tgz", + "integrity": "sha512-yyxBKfORQ7LuRt/BQKBXrpcq59ZvSW0XxwfjAt3w2/8PmdxaFzijtMhTawprSHhpzeM5BgU2hXHG3lklIERZXg==", "dev": true, "license": "MIT", "dependencies": { @@ -8848,12 +8774,6 @@ "fsevents": "~2.3.3" } }, - "node_modules/turbo-stream": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/turbo-stream/-/turbo-stream-2.4.0.tgz", - "integrity": "sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==", - "license": "ISC" - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -8966,9 +8886,9 @@ "license": "MIT" }, "node_modules/typescript": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", - "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", "devOptional": true, "license": "Apache-2.0", "bin": { @@ -8980,16 +8900,15 @@ } }, "node_modules/typescript-eslint": { - "version": "8.40.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.40.0.tgz", - "integrity": "sha512-Xvd2l+ZmFDPEt4oj1QEXzA4A2uUK6opvKu3eGN9aGjB8au02lIVcLyi375w94hHyejTOmzIU77L8ol2sRg9n7Q==", + "version": "8.34.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.34.1.tgz", + "integrity": "sha512-XjS+b6Vg9oT1BaIUfkW3M3LvqZE++rbzAMEHuccCfO/YkP43ha6w3jTEMilQxMF92nVOYCcdjv1ZUhAa1D/0ow==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.40.0", - "@typescript-eslint/parser": "8.40.0", - "@typescript-eslint/typescript-estree": "8.40.0", - "@typescript-eslint/utils": "8.40.0" + "@typescript-eslint/eslint-plugin": "8.34.1", + "@typescript-eslint/parser": "8.34.1", + "@typescript-eslint/utils": "8.34.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -9000,7 +8919,7 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/unbox-primitive": { @@ -9023,18 +8942,19 @@ } }, "node_modules/undici": { - "version": "6.21.3", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.3.tgz", - "integrity": "sha512-gBLkYIlEnSp8pFbT64yFgGE6UIB9tAkhukC23PmMDCe5Nd+cRqKxSjw5y54MK2AZMgZfJWMaNE4nYUHgi1XEOw==", + "version": "6.21.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.2.tgz", + "integrity": "sha512-uROZWze0R0itiAKVPsYhFov9LxrPMHLMEQFszeI2gCN6bnIIZ8twzBCJcN2LJrBBLfrP0t1FW0g+JmKVl8Vk1g==", "license": "MIT", "engines": { "node": ">=18.17" } }, "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==", + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true, "license": "MIT" }, "node_modules/universalify": { @@ -9138,17 +9058,6 @@ "spdx-expression-parse": "^3.0.0" } }, - "node_modules/validate-npm-package-license/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": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.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", @@ -9244,17 +9153,17 @@ } }, "node_modules/vite-node": { - "version": "3.0.0-beta.2", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.0.0-beta.2.tgz", - "integrity": "sha512-ofTf6cfRdL30Wbl9n/BX81EyIR5s4PReLmSurrxQ+koLaWUNOEo8E0lCM53OJkb8vpa2URM2nSrxZsIFyvY1rg==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.3.tgz", + "integrity": "sha512-gc8aAifGuDIpZHrPjuHyP4dpQmYXqWw7D1GmDnWeNWP654UEXzVfQ5IHPSK5HaHkwB/+p1atpYpSdw/2kOv8iQ==", "dev": true, "license": "MIT", "dependencies": { "cac": "^6.7.14", - "debug": "^4.4.0", - "es-module-lexer": "^1.5.4", - "pathe": "^1.1.2", - "vite": "^5.0.0 || ^6.0.0" + "debug": "^4.4.1", + "es-module-lexer": "^1.7.0", + "pathe": "^2.0.3", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" }, "bin": { "vite-node": "vite-node.mjs" @@ -9266,6 +9175,13 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/vite-node/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, "node_modules/vite-tsconfig-paths": { "version": "5.1.4", "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-5.1.4.tgz", @@ -9526,6 +9442,22 @@ "node": ">=8" } }, + "node_modules/wrap-ansi-cjs/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/wrap-ansi-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -9561,19 +9493,6 @@ "node": ">=8" } }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -9620,9 +9539,9 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", - "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.1.tgz", + "integrity": "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==", "dev": true, "license": "ISC", "optional": true, @@ -9631,7 +9550,7 @@ "yaml": "bin.mjs" }, "engines": { - "node": ">= 14.6" + "node": ">= 14" } }, "node_modules/yargs": { From a782a24773a136396645c4c084935f5babd5dcdf Mon Sep 17 00:00:00 2001 From: Deaponn Date: Mon, 1 Sep 2025 14:02:05 +0200 Subject: [PATCH 11/77] build: fix package.json and package-lock.json --- Configuration/webapp/package-lock.json | 1711 ++++++++++++------------ Configuration/webapp/package.json | 6 +- 2 files changed, 892 insertions(+), 825 deletions(-) diff --git a/Configuration/webapp/package-lock.json b/Configuration/webapp/package-lock.json index 03845f70c..98cddcad9 100644 --- a/Configuration/webapp/package-lock.json +++ b/Configuration/webapp/package-lock.json @@ -12,8 +12,6 @@ "@mui/material": "^7.1.1", "@react-router/node": "7.5.3", "isbot": "^5", - "mocha": "^11.6.0", - "puppeteer": "^24.10.1", "react": "^19.0.0", "react-dom": "^19.0.0", "react-router": "7.5.3" @@ -34,7 +32,7 @@ "globals": "^16.2.0", "mocha": "^11.7.1", "prettier": "3.5.3", - "puppeteer": "^24.16.2", + "puppeteer": "^24.18.0", "tsx": "^4.20.4", "typescript": "^5.7.2", "typescript-eslint": "^8.34.0", @@ -43,23 +41,24 @@ } }, "node_modules/@aliceo2/web-ui": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/@aliceo2/web-ui/-/web-ui-2.7.4.tgz", - "integrity": "sha512-X1/Whe/nnFsmHvS/O33FA2mmbgBYIw5Mp/UomHsS14axS9RhN3jW32JAdXgQ3doCUspKMnSTzKevljOHzrcOzw==", + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/@aliceo2/web-ui/-/web-ui-2.8.4.tgz", + "integrity": "sha512-ZMZbKpFrs6jiEcQyIXpHNksYx4GMyi6U2HOjNWwm8+Ne1ltz1R18z9JvANKfpBymzxe/DQgATyblHZJhruJ4Kg==", "license": "GPL-3.0", "dependencies": { "express": "^4.21.2", - "helmet": "^8.0.0", + "helmet": "^8.1.0", "jsonwebtoken": "^9.0.0", "kafkajs": "^2.2.0", "mithril": "1.1.7", "mysql": "^2.18.1", "openid-client": "^5.6.0", + "protobufjs": "^7.5.0", "winston": "3.17.0", "ws": "^8.18.0" }, "engines": { - "node": ">= 20.x" + "node": ">= 22.x" } }, "node_modules/@ampproject/remapping": { @@ -77,23 +76,23 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", + "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", - "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.7.tgz", + "integrity": "sha512-xgu/ySj2mTiUFmdE9yCMfBxLp4DHd5DwmbbD05YAuICfodYT3VvRxbrh81LGQ/8UpSdtMdfKMn3KouYDX59DGQ==", "dev": true, "license": "MIT", "engines": { @@ -101,22 +100,22 @@ } }, "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==", + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.7.tgz", + "integrity": "sha512-BU2f9tlKQ5CAthiMIgpzAh4eDTLWo1mqi9jqE2OxMG0E/OM199VJt2q8BztTxpnSW0i1ymdwLXRJnYzvDM5r2w==", "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", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.27.3", + "@babel/helpers": "^7.27.6", + "@babel/parser": "^7.27.7", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.27.7", + "@babel/types": "^7.27.7", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -131,6 +130,13 @@ "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", @@ -142,13 +148,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.0.tgz", - "integrity": "sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz", + "integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.27.0", - "@babel/types": "^7.27.0", + "@babel/parser": "^7.27.5", + "@babel/types": "^7.27.3", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -158,27 +164,27 @@ } }, "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==", + "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.25.9" + "@babel/types": "^7.27.3" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.0.tgz", - "integrity": "sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.26.8", - "@babel/helper-validator-option": "^7.25.9", + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -198,18 +204,18 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.0.tgz", - "integrity": "sha512-vSGCvMecvFCd/BdpGlhpXYNhhC4ccxyvQWpbGL4CWbvfEoLFWUZuSuf7s9Aw70flgQF+6vptvgK2IfOnKlRmBg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz", + "integrity": "sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-member-expression-to-functions": "^7.25.9", - "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/helper-replace-supers": "^7.26.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/traverse": "^7.27.0", + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.27.1", "semver": "^6.3.1" }, "engines": { @@ -230,42 +236,42 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", - "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", + "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", - "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", - "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", + "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.3" }, "engines": { "node": ">=6.9.0" @@ -275,22 +281,22 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", - "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", + "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": { - "@babel/types": "^7.25.9" + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", - "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", "dev": true, "license": "MIT", "engines": { @@ -298,15 +304,15 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz", - "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", + "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.25.9", - "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/traverse": "^7.26.5" + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -316,41 +322,41 @@ } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", - "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", + "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.25.9", - "@babel/types": "^7.25.9" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", - "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "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", "engines": { @@ -358,26 +364,26 @@ } }, "node_modules/@babel/helpers": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz", - "integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==", + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz", + "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.27.0", - "@babel/types": "^7.27.0" + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz", - "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==", + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.7.tgz", + "integrity": "sha512-qnzXzDXdr/po3bOTbTIQZ7+TxNKxpkN5IifVLXS+r7qwynkZfPyjZfE7hCXbo7IoO9TNcSyibgONsf2HauUd3Q==", "license": "MIT", "dependencies": { - "@babel/types": "^7.27.0" + "@babel/types": "^7.27.7" }, "bin": { "parser": "bin/babel-parser.js" @@ -387,13 +393,13 @@ } }, "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.25.9.tgz", - "integrity": "sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.27.1.tgz", + "integrity": "sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -403,13 +409,13 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", - "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -419,13 +425,13 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", - "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -435,14 +441,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz", - "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", + "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -452,17 +458,17 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.27.0.tgz", - "integrity": "sha512-fRGGjO2UEGPjvEcyAZXRXAS8AfdaQoq7HnxAbJoAoW10B9xOKesmmndJv+Sym2a+9FHWZ9KbyyLCe9s0Sn5jtg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.27.1.tgz", + "integrity": "sha512-Q5sT5+O4QUebHdbwKedFBEwRLb02zJ7r4A5Gg2hUoLuU3FjdMcyqcywqUrLCaDsFCxzokf7u9kuy7qz51YUuAg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-create-class-features-plugin": "^7.27.0", - "@babel/helper-plugin-utils": "^7.26.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/plugin-syntax-typescript": "^7.25.9" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -472,17 +478,17 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.27.0.tgz", - "integrity": "sha512-vxaPFfJtHhgeOVXRKuHpHPAOgymmy8V8I65T1q53R7GCZlefKeCaTyDs3zOPHTTbmquvNlQYC5klEvWsBAtrBQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.27.1.tgz", + "integrity": "sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.26.5", - "@babel/helper-validator-option": "^7.25.9", - "@babel/plugin-syntax-jsx": "^7.25.9", - "@babel/plugin-transform-modules-commonjs": "^7.26.3", - "@babel/plugin-transform-typescript": "^7.27.0" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-typescript": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -492,39 +498,39 @@ } }, "node_modules/@babel/runtime": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.3.tgz", - "integrity": "sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==", + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz", + "integrity": "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", - "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/parser": "^7.27.0", - "@babel/types": "^7.27.0" + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.0.tgz", - "integrity": "sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==", + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.7.tgz", + "integrity": "sha512-X6ZlfR/O/s5EQ/SnUSLzr+6kGnkg8HXGMzpgsMsrJVcfDtH1vIp6ctCN4eZ1LS5c0+te5Cb6Y514fASjMRJ1nw==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.27.0", - "@babel/parser": "^7.27.0", - "@babel/template": "^7.27.0", - "@babel/types": "^7.27.0", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.5", + "@babel/parser": "^7.27.7", + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.7", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -542,13 +548,13 @@ } }, "node_modules/@babel/types": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", - "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.7.tgz", + "integrity": "sha512-8OLQgDScAOHXnAz2cV+RfzzNMipuLVBz2biuAJFMV9bfkNf393je3VM8CLkjQodW5+iWsSJdSgSWT6rsZoXHPw==", "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -593,21 +599,6 @@ "stylis": "4.2.0" } }, - "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "license": "MIT" - }, - "node_modules/@emotion/babel-plugin/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/@emotion/cache": { "version": "11.14.0", "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz", @@ -753,9 +744,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.2.tgz", - "integrity": "sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz", + "integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==", "cpu": [ "ppc64" ], @@ -770,9 +761,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.2.tgz", - "integrity": "sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz", + "integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==", "cpu": [ "arm" ], @@ -787,9 +778,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.2.tgz", - "integrity": "sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz", + "integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==", "cpu": [ "arm64" ], @@ -804,9 +795,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.2.tgz", - "integrity": "sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz", + "integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==", "cpu": [ "x64" ], @@ -821,9 +812,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.2.tgz", - "integrity": "sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz", + "integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==", "cpu": [ "arm64" ], @@ -838,9 +829,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.2.tgz", - "integrity": "sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz", + "integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==", "cpu": [ "x64" ], @@ -855,9 +846,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.2.tgz", - "integrity": "sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz", + "integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==", "cpu": [ "arm64" ], @@ -872,9 +863,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.2.tgz", - "integrity": "sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz", + "integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==", "cpu": [ "x64" ], @@ -889,9 +880,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.2.tgz", - "integrity": "sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz", + "integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==", "cpu": [ "arm" ], @@ -906,9 +897,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.2.tgz", - "integrity": "sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz", + "integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==", "cpu": [ "arm64" ], @@ -923,9 +914,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.2.tgz", - "integrity": "sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz", + "integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==", "cpu": [ "ia32" ], @@ -940,9 +931,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.2.tgz", - "integrity": "sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz", + "integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==", "cpu": [ "loong64" ], @@ -957,9 +948,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.2.tgz", - "integrity": "sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz", + "integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==", "cpu": [ "mips64el" ], @@ -974,9 +965,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.2.tgz", - "integrity": "sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz", + "integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==", "cpu": [ "ppc64" ], @@ -991,9 +982,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.2.tgz", - "integrity": "sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz", + "integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==", "cpu": [ "riscv64" ], @@ -1008,9 +999,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.2.tgz", - "integrity": "sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz", + "integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==", "cpu": [ "s390x" ], @@ -1025,9 +1016,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.2.tgz", - "integrity": "sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz", + "integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==", "cpu": [ "x64" ], @@ -1042,9 +1033,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.2.tgz", - "integrity": "sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz", + "integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==", "cpu": [ "arm64" ], @@ -1059,9 +1050,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.2.tgz", - "integrity": "sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz", + "integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==", "cpu": [ "x64" ], @@ -1076,9 +1067,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.2.tgz", - "integrity": "sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz", + "integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==", "cpu": [ "arm64" ], @@ -1093,9 +1084,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.2.tgz", - "integrity": "sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz", + "integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==", "cpu": [ "x64" ], @@ -1110,9 +1101,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.2.tgz", - "integrity": "sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz", + "integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==", "cpu": [ "x64" ], @@ -1127,9 +1118,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.2.tgz", - "integrity": "sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz", + "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==", "cpu": [ "arm64" ], @@ -1144,9 +1135,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.2.tgz", - "integrity": "sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz", + "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==", "cpu": [ "ia32" ], @@ -1161,9 +1152,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.2.tgz", - "integrity": "sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz", + "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==", "cpu": [ "x64" ], @@ -1220,9 +1211,9 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.1.tgz", - "integrity": "sha512-OL0RJzC/CBzli0DrrR31qzj6d6i6Mm3HByuhflhl4LOBiWxN+3i6/t/ZQQNii4tjksXi8r2CRW1wMpWA2ULUEw==", + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", + "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1259,9 +1250,9 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.3.tgz", - "integrity": "sha512-u180qk2Um1le4yf0ruXH3PYFeEZeYC3p/4wCTKrr2U1CmGdzGi3KtY0nuPDH48UJxlKCC5RDzbcbh4X0XlqgHg==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.0.tgz", + "integrity": "sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==", "dev": true, "license": "Apache-2.0", "engines": { @@ -1343,9 +1334,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.29.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.29.0.tgz", - "integrity": "sha512-3PIF4cBw/y+1u2EazflInpV+lYsSG0aByVIQzAgb1m1MhHFSbqTyNqtBKHgWf/9Ykud+DhILS9EGkmekVhbKoQ==", + "version": "9.30.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.30.0.tgz", + "integrity": "sha512-Wzw3wQwPvc9sHM+NjakWTcPx11mbZyiYHuwWa/QfZ7cIRX7WK54PSk7bdyXDaoaopUcMatv1zaQvOAAO8hCdww==", "dev": true, "license": "MIT", "engines": { @@ -1366,13 +1357,13 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.2.tgz", - "integrity": "sha512-4SaFZCNfJqvk/kenHpI8xvN42DMaoycy4PzKc5otHxRswww1kAt82OlBuwRVLofCACCTZEcla2Ydxv8scMXaTg==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.3.tgz", + "integrity": "sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.15.0", + "@eslint/core": "^0.15.1", "levn": "^0.4.1" }, "engines": { @@ -1380,9 +1371,9 @@ } }, "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.0.tgz", - "integrity": "sha512-b7ePw78tEWWkpgZCDYkbqDOP8dmM6qe+AOC6iuJqlq1R/0ahMAeH3qynpnqKFGkMltrp44ohV4ubGyvLX28tzw==", + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.1.tgz", + "integrity": "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1477,17 +1468,13 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.11.tgz", + "integrity": "sha512-C512c1ytBTio4MrpWKlJpyFHT6+qfFL8SZ58zBzJ1OOzUEjHeF1BtjY2fH7n4x/g2OV/KiiMLAivOp1DXmiMMw==", "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { @@ -1499,25 +1486,16 @@ "node": ">=6.0.0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.3.tgz", + "integrity": "sha512-AiR5uKpFxP3PjO4R19kQGIMwxyRyPuXmKEEy301V1C0+1rVjS94EZQXf1QKZYN8Q0YM+estSPhmx5JwNftv6nw==", "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "version": "0.3.28", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.28.tgz", + "integrity": "sha512-KNNHHwW3EIp4EDYOvYFGyIFfx36R2dNJYH4knnZlF8T5jdbD5Wx8xmSaQ2gP9URkJ04LGEtlcCtwArKcmFcwKw==", "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -1531,9 +1509,9 @@ "license": "MIT" }, "node_modules/@mui/core-downloads-tracker": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-7.3.1.tgz", - "integrity": "sha512-+mIK1Z0BhOaQ0vCgOkT1mSrIpEHLo338h4/duuL4TBLXPvUMit732mnwJY3W40Avy30HdeSfwUAAGRkKmwRaEQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-7.2.0.tgz", + "integrity": "sha512-d49s7kEgI5iX40xb2YPazANvo7Bx0BLg/MNRwv+7BVpZUzXj1DaVCKlQTDex3gy/0jsCb4w7AY2uH4t4AJvSog==", "license": "MIT", "funding": { "type": "opencollective", @@ -1541,22 +1519,22 @@ } }, "node_modules/@mui/material": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-7.3.1.tgz", - "integrity": "sha512-Xf6Shbo03YmcBedZMwSpEFOwpYDtU7tC+rhAHTrA9FHk0FpsDqiQ9jUa1j/9s3HLs7KWb5mDcGnlwdh9Q9KAag==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-7.2.0.tgz", + "integrity": "sha512-NTuyFNen5Z2QY+I242MDZzXnFIVIR6ERxo7vntFi9K1wCgSwvIl0HcAO2OOydKqqKApE6omRiYhpny1ZhGuH7Q==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.28.2", - "@mui/core-downloads-tracker": "^7.3.1", - "@mui/system": "^7.3.1", - "@mui/types": "^7.4.5", - "@mui/utils": "^7.3.1", + "@babel/runtime": "^7.27.6", + "@mui/core-downloads-tracker": "^7.2.0", + "@mui/system": "^7.2.0", + "@mui/types": "^7.4.4", + "@mui/utils": "^7.2.0", "@popperjs/core": "^2.11.8", "@types/react-transition-group": "^4.4.12", "clsx": "^2.1.1", "csstype": "^3.1.3", "prop-types": "^15.8.1", - "react-is": "^19.1.1", + "react-is": "^19.1.0", "react-transition-group": "^4.4.5" }, "engines": { @@ -1569,7 +1547,7 @@ "peerDependencies": { "@emotion/react": "^11.5.0", "@emotion/styled": "^11.3.0", - "@mui/material-pigment-css": "^7.3.1", + "@mui/material-pigment-css": "^7.2.0", "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" @@ -1589,20 +1567,14 @@ } } }, - "node_modules/@mui/material/node_modules/react-is": { - "version": "19.1.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.1.1.tgz", - "integrity": "sha512-tr41fA15Vn8p4X9ntI+yCyeGSf1TlYaY5vlTZfQmeLBrFo3psOPX6HhTDnFNL9uj3EhP0KAQ80cugCl4b4BERA==", - "license": "MIT" - }, "node_modules/@mui/private-theming": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-7.3.1.tgz", - "integrity": "sha512-WU3YLkKXii/x8ZEKnrLKsPwplCVE11yZxUvlaaZSIzCcI3x2OdFC8eMlNy74hVeUsYQvzzX1Es/k4ARPlFvpPQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-7.2.0.tgz", + "integrity": "sha512-y6N1Yt3T5RMxVFnCh6+zeSWBuQdNDm5/UlM0EAYZzZR/1u+XKJWYQmbpx4e+F+1EpkYi3Nk8KhPiQDi83M3zIw==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.28.2", - "@mui/utils": "^7.3.1", + "@babel/runtime": "^7.27.6", + "@mui/utils": "^7.2.0", "prop-types": "^15.8.1" }, "engines": { @@ -1623,12 +1595,12 @@ } }, "node_modules/@mui/styled-engine": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-7.3.1.tgz", - "integrity": "sha512-Nqo6OHjvJpXJ1+9TekTE//+8RybgPQUKwns2Lh0sq+8rJOUSUKS3KALv4InSOdHhIM9Mdi8/L7LTF1/Ky6D6TQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-7.2.0.tgz", + "integrity": "sha512-yq08xynbrNYcB1nBcW9Fn8/h/iniM3ewRguGJXPIAbHvxEF7Pz95kbEEOAAhwzxMX4okhzvHmk0DFuC5ayvgIQ==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.28.2", + "@babel/runtime": "^7.27.6", "@emotion/cache": "^11.14.0", "@emotion/serialize": "^1.3.3", "@emotion/sheet": "^1.4.0", @@ -1657,16 +1629,16 @@ } }, "node_modules/@mui/system": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-7.3.1.tgz", - "integrity": "sha512-mIidecvcNVpNJMdPDmCeoSL5zshKBbYPcphjuh6ZMjhybhqhZ4mX6k9zmIWh6XOXcqRQMg5KrcjnO0QstrNj3w==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-7.2.0.tgz", + "integrity": "sha512-PG7cm/WluU6RAs+gNND2R9vDwNh+ERWxPkqTaiXQJGIFAyJ+VxhyKfzpdZNk0z0XdmBxxi9KhFOpgxjehf/O0A==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.28.2", - "@mui/private-theming": "^7.3.1", - "@mui/styled-engine": "^7.3.1", - "@mui/types": "^7.4.5", - "@mui/utils": "^7.3.1", + "@babel/runtime": "^7.27.6", + "@mui/private-theming": "^7.2.0", + "@mui/styled-engine": "^7.2.0", + "@mui/types": "^7.4.4", + "@mui/utils": "^7.2.0", "clsx": "^2.1.1", "csstype": "^3.1.3", "prop-types": "^15.8.1" @@ -1697,12 +1669,12 @@ } }, "node_modules/@mui/types": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.4.5.tgz", - "integrity": "sha512-ZPwlAOE3e8C0piCKbaabwrqZbW4QvWz0uapVPWya7fYj6PeDkl5sSJmomT7wjOcZGPB48G/a6Ubidqreptxz4g==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.4.4.tgz", + "integrity": "sha512-p63yhbX52MO/ajXC7hDHJA5yjzJekvWD3q4YDLl1rSg+OXLczMYPvTuSuviPRCgRX8+E42RXz1D/dz9SxPSlWg==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.28.2" + "@babel/runtime": "^7.27.6" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" @@ -1714,17 +1686,17 @@ } }, "node_modules/@mui/utils": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-7.3.1.tgz", - "integrity": "sha512-/31y4wZqVWa0jzMnzo6JPjxwP6xXy4P3+iLbosFg/mJQowL1KIou0LC+lquWW60FKVbKz5ZUWBg2H3jausa0pw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-7.2.0.tgz", + "integrity": "sha512-O0i1GQL6MDzhKdy9iAu5Yr0Sz1wZjROH1o3aoztuivdCXqEeQYnEjTDiRLGuFxI9zrUbTHBwobMyQH5sNtyacw==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.28.2", - "@mui/types": "^7.4.5", + "@babel/runtime": "^7.27.6", + "@mui/types": "^7.4.4", "@types/prop-types": "^15.7.15", "clsx": "^2.1.1", "prop-types": "^15.8.1", - "react-is": "^19.1.1" + "react-is": "^19.1.0" }, "engines": { "node": ">=14.0.0" @@ -1743,12 +1715,6 @@ } } }, - "node_modules/@mui/utils/node_modules/react-is": { - "version": "19.1.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.1.1.tgz", - "integrity": "sha512-tr41fA15Vn8p4X9ntI+yCyeGSf1TlYaY5vlTZfQmeLBrFo3psOPX6HhTDnFNL9uj3EhP0KAQ80cugCl4b4BERA==", - "license": "MIT" - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1870,10 +1836,74 @@ "url": "https://opencollective.com/popperjs" } }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", + "license": "BSD-3-Clause" + }, "node_modules/@puppeteer/browsers": { - "version": "2.10.6", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.6.tgz", - "integrity": "sha512-pHUn6ZRt39bP3698HFQlu2ZHCkS/lPcpv7fVQcGBSzNNygw171UXAKrCUhy+TEMw4lEttOKDgNpb04hwUAJeiQ==", + "version": "2.10.8", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.8.tgz", + "integrity": "sha512-f02QYEnBDE0p8cteNoPYHHjbDuwyfbe4cCIVlNi8/MRicIxFW4w4CfgU0LNgWEID6s06P+hRJ1qjpBLMhPRCiQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1895,7 +1925,7 @@ "node_modules/@react-router/dev": { "version": "7.5.3", "resolved": "https://registry.npmjs.org/@react-router/dev/-/dev-7.5.3.tgz", - "integrity": "sha512-BuG83Ug2C/P+zMYErTz/KKuXoxbOefh3oR66r13XWG9txwooC9nt2QDt2u8yt7Eo/9BATnx+TmXnOHEWqMyB8w==", + "integrity": "sha512-U+n8JYAREKg6eHIAXCjazsYlwPo/vcAbShpqePnDBUdDnePBwZ2JmoqhWV+7tIhyHvvHGQKlw6BcrSZtF549WQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1925,7 +1955,7 @@ "semver": "^7.3.7", "set-cookie-parser": "^2.6.0", "valibot": "^0.41.0", - "vite-node": "^3.1.4" + "vite-node": "3.0.0-beta.2" }, "bin": { "react-router": "bin.js" @@ -1952,6 +1982,19 @@ } } }, + "node_modules/@react-router/dev/node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/@react-router/dev/node_modules/prettier": { "version": "2.8.8", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", @@ -1971,7 +2014,7 @@ "node_modules/@react-router/node": { "version": "7.5.3", "resolved": "https://registry.npmjs.org/@react-router/node/-/node-7.5.3.tgz", - "integrity": "sha512-KrxfnfJVU1b+020VKemkxpc7ssItsAL8MOJthcoGwPyKwrgovdwc+8NKJUqw3P7yk/Si0ZmVh9QYAzi9qF96dg==", + "integrity": "sha512-w85YL6UngvhxGmgTBL3qwlVLFiA1EzNyG5S55qGcnhDikfb9z84gqMlTU4UqlZm8PjQ021HPTTN6I3kd7QE5sg==", "license": "MIT", "dependencies": { "@mjackson/node-fetch-server": "^0.2.0", @@ -1993,9 +2036,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.0.tgz", - "integrity": "sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.44.1.tgz", + "integrity": "sha512-JAcBr1+fgqx20m7Fwe1DxPUl/hPkee6jA6Pl7n1v2EFiktAHenTaXl5aIFjUIEsfn9w3HE4gK1lEgNGMzBDs1w==", "cpu": [ "arm" ], @@ -2007,9 +2050,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.0.tgz", - "integrity": "sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.44.1.tgz", + "integrity": "sha512-RurZetXqTu4p+G0ChbnkwBuAtwAbIwJkycw1n6GvlGlBuS4u5qlr5opix8cBAYFJgaY05TWtM+LaoFggUmbZEQ==", "cpu": [ "arm64" ], @@ -2021,9 +2064,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.0.tgz", - "integrity": "sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.44.1.tgz", + "integrity": "sha512-fM/xPesi7g2M7chk37LOnmnSTHLG/v2ggWqKj3CCA1rMA4mm5KVBT1fNoswbo1JhPuNNZrVwpTvlCVggv8A2zg==", "cpu": [ "arm64" ], @@ -2035,9 +2078,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.0.tgz", - "integrity": "sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.44.1.tgz", + "integrity": "sha512-gDnWk57urJrkrHQ2WVx9TSVTH7lSlU7E3AFqiko+bgjlh78aJ88/3nycMax52VIVjIm3ObXnDL2H00e/xzoipw==", "cpu": [ "x64" ], @@ -2049,9 +2092,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.0.tgz", - "integrity": "sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.44.1.tgz", + "integrity": "sha512-wnFQmJ/zPThM5zEGcnDcCJeYJgtSLjh1d//WuHzhf6zT3Md1BvvhJnWoy+HECKu2bMxaIcfWiu3bJgx6z4g2XA==", "cpu": [ "arm64" ], @@ -2063,9 +2106,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.0.tgz", - "integrity": "sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.44.1.tgz", + "integrity": "sha512-uBmIxoJ4493YATvU2c0upGz87f99e3wop7TJgOA/bXMFd2SvKCI7xkxY/5k50bv7J6dw1SXT4MQBQSLn8Bb/Uw==", "cpu": [ "x64" ], @@ -2077,9 +2120,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.0.tgz", - "integrity": "sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.44.1.tgz", + "integrity": "sha512-n0edDmSHlXFhrlmTK7XBuwKlG5MbS7yleS1cQ9nn4kIeW+dJH+ExqNgQ0RrFRew8Y+0V/x6C5IjsHrJmiHtkxQ==", "cpu": [ "arm" ], @@ -2091,9 +2134,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.0.tgz", - "integrity": "sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.44.1.tgz", + "integrity": "sha512-8WVUPy3FtAsKSpyk21kV52HCxB+me6YkbkFHATzC2Yd3yuqHwy2lbFL4alJOLXKljoRw08Zk8/xEj89cLQ/4Nw==", "cpu": [ "arm" ], @@ -2105,9 +2148,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.0.tgz", - "integrity": "sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.44.1.tgz", + "integrity": "sha512-yuktAOaeOgorWDeFJggjuCkMGeITfqvPgkIXhDqsfKX8J3jGyxdDZgBV/2kj/2DyPaLiX6bPdjJDTu9RB8lUPQ==", "cpu": [ "arm64" ], @@ -2119,9 +2162,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.0.tgz", - "integrity": "sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.44.1.tgz", + "integrity": "sha512-W+GBM4ifET1Plw8pdVaecwUgxmiH23CfAUj32u8knq0JPFyK4weRy6H7ooxYFD19YxBulL0Ktsflg5XS7+7u9g==", "cpu": [ "arm64" ], @@ -2133,9 +2176,9 @@ ] }, "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.0.tgz", - "integrity": "sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.44.1.tgz", + "integrity": "sha512-1zqnUEMWp9WrGVuVak6jWTl4fEtrVKfZY7CvcBmUUpxAJ7WcSowPSAWIKa/0o5mBL/Ij50SIf9tuirGx63Ovew==", "cpu": [ "loong64" ], @@ -2147,9 +2190,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.0.tgz", - "integrity": "sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.44.1.tgz", + "integrity": "sha512-Rl3JKaRu0LHIx7ExBAAnf0JcOQetQffaw34T8vLlg9b1IhzcBgaIdnvEbbsZq9uZp3uAH+JkHd20Nwn0h9zPjA==", "cpu": [ "ppc64" ], @@ -2161,9 +2204,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.0.tgz", - "integrity": "sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.44.1.tgz", + "integrity": "sha512-j5akelU3snyL6K3N/iX7otLBIl347fGwmd95U5gS/7z6T4ftK288jKq3A5lcFKcx7wwzb5rgNvAg3ZbV4BqUSw==", "cpu": [ "riscv64" ], @@ -2175,9 +2218,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.0.tgz", - "integrity": "sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.44.1.tgz", + "integrity": "sha512-ppn5llVGgrZw7yxbIm8TTvtj1EoPgYUAbfw0uDjIOzzoqlZlZrLJ/KuiE7uf5EpTpCTrNt1EdtzF0naMm0wGYg==", "cpu": [ "riscv64" ], @@ -2189,9 +2232,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.0.tgz", - "integrity": "sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.44.1.tgz", + "integrity": "sha512-Hu6hEdix0oxtUma99jSP7xbvjkUM/ycke/AQQ4EC5g7jNRLLIwjcNwaUy95ZKBJJwg1ZowsclNnjYqzN4zwkAw==", "cpu": [ "s390x" ], @@ -2203,9 +2246,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.0.tgz", - "integrity": "sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.44.1.tgz", + "integrity": "sha512-EtnsrmZGomz9WxK1bR5079zee3+7a+AdFlghyd6VbAjgRJDbTANJ9dcPIPAi76uG05micpEL+gPGmAKYTschQw==", "cpu": [ "x64" ], @@ -2217,9 +2260,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.0.tgz", - "integrity": "sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.44.1.tgz", + "integrity": "sha512-iAS4p+J1az6Usn0f8xhgL4PaU878KEtutP4hqw52I4IO6AGoyOkHCxcc4bqufv1tQLdDWFx8lR9YlwxKuv3/3g==", "cpu": [ "x64" ], @@ -2231,9 +2274,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.0.tgz", - "integrity": "sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.44.1.tgz", + "integrity": "sha512-NtSJVKcXwcqozOl+FwI41OH3OApDyLk3kqTJgx8+gp6On9ZEt5mYhIsKNPGuaZr3p9T6NWPKGU/03Vw4CNU9qg==", "cpu": [ "arm64" ], @@ -2245,9 +2288,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.0.tgz", - "integrity": "sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.44.1.tgz", + "integrity": "sha512-JYA3qvCOLXSsnTR3oiyGws1Dm0YTuxAAeaYGVlGpUsHqloPcFjPg+X0Fj2qODGLNwQOAcCiQmHub/V007kiH5A==", "cpu": [ "ia32" ], @@ -2259,9 +2302,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.0.tgz", - "integrity": "sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.44.1.tgz", + "integrity": "sha512-J8o22LuF0kTe7m+8PvW9wk3/bRq5+mRo5Dqo6+vXb7otCm3TPhYOJqOaQtGU9YMWQSL3krMnoOxMr0+9E6F3Ug==", "cpu": [ "x64" ], @@ -2300,9 +2343,9 @@ "license": "MIT" }, "node_modules/@types/estree": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", - "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true, "license": "MIT" }, @@ -2321,13 +2364,12 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "20.17.30", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.30.tgz", - "integrity": "sha512-7zf4YyHA+jvBNfVrk2Gtvs6x7E8V+YDW05bNfG2XkWDJfYRXrTiP/DsB2zSYTaHX0bGIujTBQdMVAhb+j7mwpg==", - "dev": true, + "version": "20.19.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.2.tgz", + "integrity": "sha512-9pLGGwdzOUBDYi0GNjM97FIA+f92fqSke6joWeBjWXllfNxZBs7qeMF7tvtOIsbY45xkWkxrdwUfUf3MnQa9gA==", "license": "MIT", "dependencies": { - "undici-types": "~6.19.2" + "undici-types": "~6.21.0" } }, "node_modules/@types/parse-json": { @@ -2350,18 +2392,18 @@ "license": "MIT" }, "node_modules/@types/react": { - "version": "19.1.2", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.2.tgz", - "integrity": "sha512-oxLPMytKchWGbnQM9O7D67uPa9paTNxO7jVoNMXgkkErULBPhPARCfkKL9ytcIJJRGjbsVwW4ugJzyFFvm/Tiw==", + "version": "19.1.8", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.8.tgz", + "integrity": "sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g==", "license": "MIT", "dependencies": { "csstype": "^3.0.2" } }, "node_modules/@types/react-dom": { - "version": "19.1.2", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.2.tgz", - "integrity": "sha512-XGJkWF41Qq305SKWEILa1O8vzhb3aOo3ogBlSmiqNko/WmRb6QIaweuZCXjKygVDXpzXb5wyxKTSOsmkuqj+Qw==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.6.tgz", + "integrity": "sha512-4hOiT/dwO8Ko0gV1m/TJZYk3y0KBnY9vzDh7W+DH17b2HFSOGgdj33dhihPeuy3l0q23+4e+hoXHV6hCC4dCXw==", "dev": true, "license": "MIT", "peerDependencies": { @@ -2395,17 +2437,17 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.34.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.34.1.tgz", - "integrity": "sha512-STXcN6ebF6li4PxwNeFnqF8/2BNDvBupf2OPx2yWNzr6mKNGF7q49VM00Pz5FaomJyqvbXpY6PhO+T9w139YEQ==", + "version": "8.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.35.1.tgz", + "integrity": "sha512-9XNTlo7P7RJxbVeICaIIIEipqxLKguyh+3UbXuT2XQuFp6d8VOeDEGuz5IiX0dgZo8CiI6aOFLg4e8cF71SFVg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.34.1", - "@typescript-eslint/type-utils": "8.34.1", - "@typescript-eslint/utils": "8.34.1", - "@typescript-eslint/visitor-keys": "8.34.1", + "@typescript-eslint/scope-manager": "8.35.1", + "@typescript-eslint/type-utils": "8.35.1", + "@typescript-eslint/utils": "8.35.1", + "@typescript-eslint/visitor-keys": "8.35.1", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -2419,7 +2461,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.34.1", + "@typescript-eslint/parser": "^8.35.1", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } @@ -2435,16 +2477,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.34.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.34.1.tgz", - "integrity": "sha512-4O3idHxhyzjClSMJ0a29AcoK0+YwnEqzI6oz3vlRf3xw0zbzt15MzXwItOlnr5nIth6zlY2RENLsOPvhyrKAQA==", + "version": "8.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.35.1.tgz", + "integrity": "sha512-3MyiDfrfLeK06bi/g9DqJxP5pV74LNv4rFTyvGDmT3x2p1yp1lOd+qYZfiRPIOf/oON+WRZR5wxxuF85qOar+w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.34.1", - "@typescript-eslint/types": "8.34.1", - "@typescript-eslint/typescript-estree": "8.34.1", - "@typescript-eslint/visitor-keys": "8.34.1", + "@typescript-eslint/scope-manager": "8.35.1", + "@typescript-eslint/types": "8.35.1", + "@typescript-eslint/typescript-estree": "8.35.1", + "@typescript-eslint/visitor-keys": "8.35.1", "debug": "^4.3.4" }, "engines": { @@ -2460,14 +2502,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.34.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.34.1.tgz", - "integrity": "sha512-nuHlOmFZfuRwLJKDGQOVc0xnQrAmuq1Mj/ISou5044y1ajGNp2BNliIqp7F2LPQ5sForz8lempMFCovfeS1XoA==", + "version": "8.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.35.1.tgz", + "integrity": "sha512-VYxn/5LOpVxADAuP3NrnxxHYfzVtQzLKeldIhDhzC8UHaiQvYlXvKuVho1qLduFbJjjy5U5bkGwa3rUGUb1Q6Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.34.1", - "@typescript-eslint/types": "^8.34.1", + "@typescript-eslint/tsconfig-utils": "^8.35.1", + "@typescript-eslint/types": "^8.35.1", "debug": "^4.3.4" }, "engines": { @@ -2482,14 +2524,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.34.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.34.1.tgz", - "integrity": "sha512-beu6o6QY4hJAgL1E8RaXNC071G4Kso2MGmJskCFQhRhg8VOH/FDbC8soP8NHN7e/Hdphwp8G8cE6OBzC8o41ZA==", + "version": "8.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.35.1.tgz", + "integrity": "sha512-s/Bpd4i7ht2934nG+UoSPlYXd08KYz3bmjLEb7Ye1UVob0d1ENiT3lY8bsCmik4RqfSbPw9xJJHbugpPpP5JUg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.34.1", - "@typescript-eslint/visitor-keys": "8.34.1" + "@typescript-eslint/types": "8.35.1", + "@typescript-eslint/visitor-keys": "8.35.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2500,9 +2542,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.34.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.34.1.tgz", - "integrity": "sha512-K4Sjdo4/xF9NEeA2khOb7Y5nY6NSXBnod87uniVYW9kHP+hNlDV8trUSFeynA2uxWam4gIWgWoygPrv9VMWrYg==", + "version": "8.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.35.1.tgz", + "integrity": "sha512-K5/U9VmT9dTHoNowWZpz+/TObS3xqC5h0xAIjXPw+MNcKV9qg6eSatEnmeAwkjHijhACH0/N7bkhKvbt1+DXWQ==", "dev": true, "license": "MIT", "engines": { @@ -2517,14 +2559,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.34.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.34.1.tgz", - "integrity": "sha512-Tv7tCCr6e5m8hP4+xFugcrwTOucB8lshffJ6zf1mF1TbU67R+ntCc6DzLNKM+s/uzDyv8gLq7tufaAhIBYeV8g==", + "version": "8.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.35.1.tgz", + "integrity": "sha512-HOrUBlfVRz5W2LIKpXzZoy6VTZzMu2n8q9C2V/cFngIC5U1nStJgv0tMV4sZPzdf4wQm9/ToWUFPMN9Vq9VJQQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.34.1", - "@typescript-eslint/utils": "8.34.1", + "@typescript-eslint/typescript-estree": "8.35.1", + "@typescript-eslint/utils": "8.35.1", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -2541,9 +2583,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.34.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.34.1.tgz", - "integrity": "sha512-rjLVbmE7HR18kDsjNIZQHxmv9RZwlgzavryL5Lnj2ujIRTeXlKtILHgRNmQ3j4daw7zd+mQgy+uyt6Zo6I0IGA==", + "version": "8.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.35.1.tgz", + "integrity": "sha512-q/O04vVnKHfrrhNAscndAn1tuQhIkwqnaW+eu5waD5IPts2eX1dgJxgqcPx5BX109/qAz7IG6VrEPTOYKCNfRQ==", "dev": true, "license": "MIT", "engines": { @@ -2555,16 +2597,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.34.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.34.1.tgz", - "integrity": "sha512-rjCNqqYPuMUF5ODD+hWBNmOitjBWghkGKJg6hiCHzUvXRy6rK22Jd3rwbP2Xi+R7oYVvIKhokHVhH41BxPV5mA==", + "version": "8.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.35.1.tgz", + "integrity": "sha512-Vvpuvj4tBxIka7cPs6Y1uvM7gJgdF5Uu9F+mBJBPY4MhvjrjWGK4H0lVgLJd/8PWZ23FTqsaJaLEkBCFUk8Y9g==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.34.1", - "@typescript-eslint/tsconfig-utils": "8.34.1", - "@typescript-eslint/types": "8.34.1", - "@typescript-eslint/visitor-keys": "8.34.1", + "@typescript-eslint/project-service": "8.35.1", + "@typescript-eslint/tsconfig-utils": "8.35.1", + "@typescript-eslint/types": "8.35.1", + "@typescript-eslint/visitor-keys": "8.35.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -2584,16 +2626,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.34.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.34.1.tgz", - "integrity": "sha512-mqOwUdZ3KjtGk7xJJnLbHxTuWVn3GO2WZZuM+Slhkun4+qthLdXx32C8xIXbO1kfCECb3jIs3eoxK3eryk7aoQ==", + "version": "8.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.35.1.tgz", + "integrity": "sha512-lhnwatFmOFcazAsUm3ZnZFpXSxiwoa1Lj50HphnDe1Et01NF4+hrdXONSUHIcbVu2eFb1bAf+5yjXkGVkXBKAQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.34.1", - "@typescript-eslint/types": "8.34.1", - "@typescript-eslint/typescript-estree": "8.34.1" + "@typescript-eslint/scope-manager": "8.35.1", + "@typescript-eslint/types": "8.35.1", + "@typescript-eslint/typescript-estree": "8.35.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2608,13 +2650,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.34.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.34.1.tgz", - "integrity": "sha512-xoh5rJ+tgsRKoXnkBPFRLZ7rjKM0AfVbC68UZ/ECXoDbfggb9RbEySN359acY1vS3qZ0jVTVWzbtfapwm5ztxw==", + "version": "8.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.35.1.tgz", + "integrity": "sha512-VRwixir4zBWCSTP/ljEo091lbpypz57PoeAQ9imjG+vbeof9LplljsL1mos4ccG6H9IjfrVGM359RozUnuFhpw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.34.1", + "@typescript-eslint/types": "8.35.1", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -2638,15 +2680,6 @@ "node": ">= 0.6" } }, - "node_modules/accepts/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==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/acorn": { "version": "8.15.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", @@ -2711,13 +2744,16 @@ } }, "node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "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": ">=12" + "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" @@ -2971,51 +3007,6 @@ "npm": ">=6" } }, - "node_modules/babel-plugin-macros/node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "license": "MIT", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/babel-plugin-macros/node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "license": "MIT", - "dependencies": { - "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/babel-plugin-macros/node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "license": "ISC", - "engines": { - "node": ">= 6" - } - }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -3032,9 +3023,9 @@ "optional": true }, "node_modules/bare-fs": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.2.0.tgz", - "integrity": "sha512-oRfrw7gwwBVAWx9S5zPMo2iiOjxyiZE12DmblmMQREgcogbNO0AFaZ+QBxxkEXiPspcpvO/Qtqn8LabUx4uYXg==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.2.1.tgz", + "integrity": "sha512-mELROzV0IhqilFgsl1gyp48pnZsaV9xhQapHLDsvn4d4ZTfbFhcghQezl7FTEDNBcGqLUnNI3lUlm6ecrLWdFA==", "dev": true, "license": "Apache-2.0", "optional": true, @@ -3056,9 +3047,9 @@ } }, "node_modules/bare-os": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.1.tgz", - "integrity": "sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.2.tgz", + "integrity": "sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==", "dev": true, "license": "Apache-2.0", "optional": true, @@ -3159,9 +3150,9 @@ "license": "MIT" }, "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3189,9 +3180,9 @@ "license": "ISC" }, "node_modules/browserslist": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", - "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "version": "4.25.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz", + "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==", "dev": true, "funding": [ { @@ -3209,10 +3200,10 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001688", - "electron-to-chromium": "^1.5.73", + "caniuse-lite": "^1.0.30001726", + "electron-to-chromium": "^1.5.173", "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.1" + "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" @@ -3333,9 +3324,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001713", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001713.tgz", - "integrity": "sha512-wCIWIg+A4Xr7NfhTuHdX+/FKh3+Op3LBbSp2N5Pfx6T/LhdQy3GTyoTg48BReaW/MyMNZAkTadsBtai3ldWK0Q==", + "version": "1.0.30001726", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001726.tgz", + "integrity": "sha512-VQAUIUzBiZ/UnlM28fSp2CRF3ivUn1BWEvxMcVTNwpw91Py1pGbPIyIKtd+tzct9C3ouceCVdGAXxZOpZAsgdw==", "dev": true, "funding": [ { @@ -3370,22 +3361,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/chalk/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/chokidar": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", @@ -3403,9 +3378,9 @@ } }, "node_modules/chromium-bidi": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-7.3.1.tgz", - "integrity": "sha512-i+BMGluhZZc4Jic9L1aHJBTfaopxmCqQxGklyMcqFx4fvF3nI4BJ3bCe1ad474nvYRIo/ZN/VrdA4eOaRZua4Q==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-8.0.0.tgz", + "integrity": "sha512-d1VmE0FD7lxZQHzcDUCKZSNRtRwISXDsdg4HjdTR5+Ll5nQ/vzU12JeNmupD6VWffrPSlrnGhEWlLESKH3VO+g==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3441,22 +3416,6 @@ "node": ">=8" } }, - "node_modules/cliui/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/cliui/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -3622,10 +3581,9 @@ } }, "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, + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "license": "MIT" }, "node_modules/cookie": { @@ -3650,30 +3608,28 @@ "license": "MIT" }, "node_modules/cosmiconfig": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", - "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", - "dev": true, + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", "license": "MIT", "dependencies": { - "env-paths": "^2.2.1", - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0" + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" }, "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">=10" + } + }, + "node_modules/cosmiconfig/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "license": "ISC", + "engines": { + "node": ">= 6" } }, "node_modules/cross-spawn": { @@ -3808,9 +3764,9 @@ } }, "node_modules/dedent": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", - "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.6.0.tgz", + "integrity": "sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==", "dev": true, "license": "MIT", "peerDependencies": { @@ -3976,9 +3932,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.137", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.137.tgz", - "integrity": "sha512-/QSJaU2JyIuTbbABAo/crOs+SuAZLS+fVVS10PVrIT9hrRkmZl8Hb0xPSkKRUUWHQtYzXHpQUW3Dy5hwMzGZkA==", + "version": "1.5.178", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.178.tgz", + "integrity": "sha512-wObbz/ar3Bc6e4X5vf0iO8xTN8YAjN/tgiAOJLr7yjYFtP9wAjq8Mb5h0yn6kResir+VYx2DXBj9NNobs0ETSA==", "dev": true, "license": "ISC" }, @@ -4040,12 +3996,6 @@ "is-arrayish": "^0.2.1" } }, - "node_modules/error-ex/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==", - "license": "MIT" - }, "node_modules/es-abstract": { "version": "1.24.0", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", @@ -4228,9 +4178,9 @@ } }, "node_modules/esbuild": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.2.tgz", - "integrity": "sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz", + "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -4241,31 +4191,31 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.2", - "@esbuild/android-arm": "0.25.2", - "@esbuild/android-arm64": "0.25.2", - "@esbuild/android-x64": "0.25.2", - "@esbuild/darwin-arm64": "0.25.2", - "@esbuild/darwin-x64": "0.25.2", - "@esbuild/freebsd-arm64": "0.25.2", - "@esbuild/freebsd-x64": "0.25.2", - "@esbuild/linux-arm": "0.25.2", - "@esbuild/linux-arm64": "0.25.2", - "@esbuild/linux-ia32": "0.25.2", - "@esbuild/linux-loong64": "0.25.2", - "@esbuild/linux-mips64el": "0.25.2", - "@esbuild/linux-ppc64": "0.25.2", - "@esbuild/linux-riscv64": "0.25.2", - "@esbuild/linux-s390x": "0.25.2", - "@esbuild/linux-x64": "0.25.2", - "@esbuild/netbsd-arm64": "0.25.2", - "@esbuild/netbsd-x64": "0.25.2", - "@esbuild/openbsd-arm64": "0.25.2", - "@esbuild/openbsd-x64": "0.25.2", - "@esbuild/sunos-x64": "0.25.2", - "@esbuild/win32-arm64": "0.25.2", - "@esbuild/win32-ia32": "0.25.2", - "@esbuild/win32-x64": "0.25.2" + "@esbuild/aix-ppc64": "0.25.5", + "@esbuild/android-arm": "0.25.5", + "@esbuild/android-arm64": "0.25.5", + "@esbuild/android-x64": "0.25.5", + "@esbuild/darwin-arm64": "0.25.5", + "@esbuild/darwin-x64": "0.25.5", + "@esbuild/freebsd-arm64": "0.25.5", + "@esbuild/freebsd-x64": "0.25.5", + "@esbuild/linux-arm": "0.25.5", + "@esbuild/linux-arm64": "0.25.5", + "@esbuild/linux-ia32": "0.25.5", + "@esbuild/linux-loong64": "0.25.5", + "@esbuild/linux-mips64el": "0.25.5", + "@esbuild/linux-ppc64": "0.25.5", + "@esbuild/linux-riscv64": "0.25.5", + "@esbuild/linux-s390x": "0.25.5", + "@esbuild/linux-x64": "0.25.5", + "@esbuild/netbsd-arm64": "0.25.5", + "@esbuild/netbsd-x64": "0.25.5", + "@esbuild/openbsd-arm64": "0.25.5", + "@esbuild/openbsd-x64": "0.25.5", + "@esbuild/sunos-x64": "0.25.5", + "@esbuild/win32-arm64": "0.25.5", + "@esbuild/win32-ia32": "0.25.5", + "@esbuild/win32-x64": "0.25.5" } }, "node_modules/escalade": { @@ -4318,20 +4268,31 @@ "source-map": "~0.6.1" } }, + "node_modules/escodegen/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", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/eslint": { - "version": "9.29.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.29.0.tgz", - "integrity": "sha512-GsGizj2Y1rCWDu6XoEekL3RLilp0voSePurjZIkxL3wlm5o5EC9VpgaP7lrCvjnkuLvzFBQWB3vWB3K5KQTveQ==", + "version": "9.30.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.30.0.tgz", + "integrity": "sha512-iN/SiPxmQu6EVkf+m1qpBxzUhE12YqFLOSySuOyVLJLEF9nzTf+h/1AJYc1JWzCnktggeNrjvQGLngDzXirU6g==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.20.1", - "@eslint/config-helpers": "^0.2.1", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.3.0", "@eslint/core": "^0.14.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.29.0", + "@eslint/js": "9.30.0", "@eslint/plugin-kit": "^0.3.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", @@ -4404,17 +4365,6 @@ "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" } }, - "node_modules/eslint-plugin-jsdoc/node_modules/spdx-expression-parse": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", - "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, "node_modules/eslint-plugin-mocha": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-11.1.0.tgz", @@ -4499,6 +4449,24 @@ "node": "*" } }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/eslint-plugin-react/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -4824,9 +4792,9 @@ } }, "node_modules/fdir": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", - "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", + "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", "dev": true, "license": "MIT", "peerDependencies": { @@ -5420,6 +5388,12 @@ "react-is": "^16.7.0" } }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, "node_modules/hosted-git-info": { "version": "6.1.3", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.3.tgz", @@ -5594,9 +5568,9 @@ } }, "node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "license": "MIT" }, "node_modules/is-async-function": { @@ -6023,9 +5997,9 @@ "license": "MIT" }, "node_modules/isbot": { - "version": "5.1.26", - "resolved": "https://registry.npmjs.org/isbot/-/isbot-5.1.26.tgz", - "integrity": "sha512-3wqJEYSIm59dYQjEF7zJ7T42aqaqxbCyJQda5rKCudJykuAnISptCHR/GSGpOnw8UrvU+mGueNLRJS5HXnbsXQ==", + "version": "5.1.28", + "resolved": "https://registry.npmjs.org/isbot/-/isbot-5.1.28.tgz", + "integrity": "sha512-qrOp4g3xj8YNse4biorv6O5ZShwsJM0trsoda4y7j/Su7ZtTTfVXFzbKkpgcSoDrHS8FcTuUwcU04YimZlZOxw==", "license": "Unlicense", "engines": { "node": ">=18" @@ -6072,18 +6046,6 @@ "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/jiti": { - "version": "1.21.7", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", - "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "bin": { - "jiti": "bin/jiti.js" - } - }, "node_modules/jose": { "version": "4.15.9", "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz", @@ -6123,9 +6085,9 @@ } }, "node_modules/jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "license": "MIT", "bin": { "jsesc": "bin/jsesc" @@ -6230,12 +6192,12 @@ } }, "node_modules/jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz", + "integrity": "sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==", "license": "MIT", "dependencies": { - "buffer-equal-constant-time": "1.0.1", + "buffer-equal-constant-time": "^1.0.1", "ecdsa-sig-formatter": "1.0.11", "safe-buffer": "^5.0.1" } @@ -6401,6 +6363,12 @@ "node": ">= 12.0.0" } }, + "node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "license": "Apache-2.0" + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -6508,6 +6476,15 @@ "node": ">=4" } }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", @@ -6520,15 +6497,6 @@ "node": ">= 0.6" } }, - "node_modules/mime-types/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==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", @@ -6677,6 +6645,15 @@ "dev": true, "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==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/netmask": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", @@ -6774,6 +6751,15 @@ "node": ">=0.10.0" } }, + "node_modules/object-hash": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, "node_modules/object-inspect": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", @@ -6938,15 +6924,6 @@ "node": ">=10" } }, - "node_modules/openid-client/node_modules/object-hash": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", - "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, "node_modules/openid-client/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -7233,9 +7210,9 @@ } }, "node_modules/postcss": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", - "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "dev": true, "funding": [ { @@ -7253,7 +7230,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.8", + "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -7345,6 +7322,36 @@ "react-is": "^16.13.1" } }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/protobufjs": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.3.tgz", + "integrity": "sha512-sildjKwVqOI2kmFDiXQ6aEB0fjYTafpEvIBs8tOR8qI4spuL9OPROLVu2qZqi/xgCfsHIwVqlaF8JBjWFHnKbw==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -7417,18 +7424,18 @@ } }, "node_modules/puppeteer": { - "version": "24.16.2", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.16.2.tgz", - "integrity": "sha512-eNjKzwjITM4Lvho6iHb+VQamadUBgc8TsjAApsKi5N8DXipxAaAZWssBOFsrIOLo4eYWYj0Qk5gmr4wBSqzJWw==", + "version": "24.18.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.18.0.tgz", + "integrity": "sha512-Ke8oL/87GhzKIM2Ag6Yj49t5xbGc4rspGIuSuFLFCQBtYzWqCSanvqoCu08WkI78rbqcwnHjxiTH6oDlYFrjrw==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@puppeteer/browsers": "2.10.6", - "chromium-bidi": "7.3.1", + "@puppeteer/browsers": "2.10.8", + "chromium-bidi": "8.0.0", "cosmiconfig": "^9.0.0", "devtools-protocol": "0.0.1475386", - "puppeteer-core": "24.16.2", + "puppeteer-core": "24.18.0", "typed-query-selector": "^2.12.0" }, "bin": { @@ -7439,14 +7446,14 @@ } }, "node_modules/puppeteer-core": { - "version": "24.16.2", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.16.2.tgz", - "integrity": "sha512-areKSSQzpoHa5nCk3uD/o504yjrW5ws0N6jZfdFZ3a4H+Q7NBgvuDydjN5P87jN4Rj+eIpLcK3ELOThTtYuuxg==", + "version": "24.18.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.18.0.tgz", + "integrity": "sha512-As0BvfXxek2MbV0m7iqBmQKFnfSrzSvTM4zGipjd4cL+9f2Ccgut6RvHlc8+qBieKHqCMFy9BSI4QyveoYXTug==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@puppeteer/browsers": "2.10.6", - "chromium-bidi": "7.3.1", + "@puppeteer/browsers": "2.10.8", + "chromium-bidi": "8.0.0", "debug": "^4.4.1", "devtools-protocol": "0.0.1475386", "typed-query-selector": "^2.12.0", @@ -7456,6 +7463,33 @@ "node": ">=18" } }, + "node_modules/puppeteer/node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/qs": { "version": "6.13.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", @@ -7548,9 +7582,9 @@ } }, "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.1.0.tgz", + "integrity": "sha512-Oe56aUPnkHyyDxxkvqtd7KkdQP5uIUfHxd5XTb3wE9d/kRnZLmKbDB0GWk919tdQ+mxxPtG6EAs6RMT6i1qtHg==", "license": "MIT" }, "node_modules/react-refresh": { @@ -7566,11 +7600,12 @@ "node_modules/react-router": { "version": "7.5.3", "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.5.3.tgz", - "integrity": "sha512-U7Nv3y+bMimgWjhlT5CRdzHPu2/KVmqPwKUCChW8en5P3znxUqwlYFlbmyj8Rgp1SF6zs5X4+77kBVknkg6a0w==", + "integrity": "sha512-3iUDM4/fZCQ89SXlDa+Ph3MevBrozBAI655OAfWQlTm9nBR0IKlrmNwFow5lPHttbwvITZfkeeeZFP6zt3F7pw==", "license": "MIT", "dependencies": { "cookie": "^1.0.1", - "set-cookie-parser": "^2.6.0" + "set-cookie-parser": "^2.6.0", + "turbo-stream": "2.4.0" }, "engines": { "node": ">=20.0.0" @@ -7700,19 +7735,21 @@ } }, "node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "dev": true, + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "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" } @@ -7758,13 +7795,13 @@ } }, "node_modules/rollup": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.0.tgz", - "integrity": "sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.44.1.tgz", + "integrity": "sha512-x8H8aPvD+xbl0Do8oez5f5o8eMS3trfCghc4HhLAnCkj7Vl0d1JWGs0UF/D886zLW2rOj2QymV/JcSSsw+XDNg==", "dev": true, "license": "MIT", "dependencies": { - "@types/estree": "1.0.7" + "@types/estree": "1.0.8" }, "bin": { "rollup": "dist/bin/rollup" @@ -7774,26 +7811,26 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.40.0", - "@rollup/rollup-android-arm64": "4.40.0", - "@rollup/rollup-darwin-arm64": "4.40.0", - "@rollup/rollup-darwin-x64": "4.40.0", - "@rollup/rollup-freebsd-arm64": "4.40.0", - "@rollup/rollup-freebsd-x64": "4.40.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.40.0", - "@rollup/rollup-linux-arm-musleabihf": "4.40.0", - "@rollup/rollup-linux-arm64-gnu": "4.40.0", - "@rollup/rollup-linux-arm64-musl": "4.40.0", - "@rollup/rollup-linux-loongarch64-gnu": "4.40.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.40.0", - "@rollup/rollup-linux-riscv64-gnu": "4.40.0", - "@rollup/rollup-linux-riscv64-musl": "4.40.0", - "@rollup/rollup-linux-s390x-gnu": "4.40.0", - "@rollup/rollup-linux-x64-gnu": "4.40.0", - "@rollup/rollup-linux-x64-musl": "4.40.0", - "@rollup/rollup-win32-arm64-msvc": "4.40.0", - "@rollup/rollup-win32-ia32-msvc": "4.40.0", - "@rollup/rollup-win32-x64-msvc": "4.40.0", + "@rollup/rollup-android-arm-eabi": "4.44.1", + "@rollup/rollup-android-arm64": "4.44.1", + "@rollup/rollup-darwin-arm64": "4.44.1", + "@rollup/rollup-darwin-x64": "4.44.1", + "@rollup/rollup-freebsd-arm64": "4.44.1", + "@rollup/rollup-freebsd-x64": "4.44.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.44.1", + "@rollup/rollup-linux-arm-musleabihf": "4.44.1", + "@rollup/rollup-linux-arm64-gnu": "4.44.1", + "@rollup/rollup-linux-arm64-musl": "4.44.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.44.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.44.1", + "@rollup/rollup-linux-riscv64-gnu": "4.44.1", + "@rollup/rollup-linux-riscv64-musl": "4.44.1", + "@rollup/rollup-linux-s390x-gnu": "4.44.1", + "@rollup/rollup-linux-x64-gnu": "4.44.1", + "@rollup/rollup-linux-x64-musl": "4.44.1", + "@rollup/rollup-win32-arm64-msvc": "4.44.1", + "@rollup/rollup-win32-ia32-msvc": "4.44.1", + "@rollup/rollup-win32-x64-msvc": "4.44.1", "fsevents": "~2.3.2" } }, @@ -8194,6 +8231,12 @@ "is-arrayish": "^0.3.1" } }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "license": "MIT" + }, "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -8236,9 +8279,9 @@ } }, "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==", + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -8264,6 +8307,15 @@ "source-map": "^0.6.0" } }, + "node_modules/source-map-support/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==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/spdx-correct": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", @@ -8275,6 +8327,17 @@ "spdx-license-ids": "^3.0.0" } }, + "node_modules/spdx-correct/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": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, "node_modules/spdx-exceptions": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", @@ -8283,9 +8346,9 @@ "license": "CC-BY-3.0" }, "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", + "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8666,9 +8729,9 @@ "license": "MIT" }, "node_modules/tinyglobby": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", - "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8727,9 +8790,9 @@ } }, "node_modules/tsconfck": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.5.tgz", - "integrity": "sha512-CLDfGgUp7XPswWnezWwsCRxNmgQjhYq3VXHM0/XIRxhVrKw0M1if9agzryh1QS3nxjCROvV+xWxoJO1YctzzWg==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.6.tgz", + "integrity": "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==", "dev": true, "license": "MIT", "bin": { @@ -8755,9 +8818,9 @@ "license": "0BSD" }, "node_modules/tsx": { - "version": "4.20.4", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.4.tgz", - "integrity": "sha512-yyxBKfORQ7LuRt/BQKBXrpcq59ZvSW0XxwfjAt3w2/8PmdxaFzijtMhTawprSHhpzeM5BgU2hXHG3lklIERZXg==", + "version": "4.20.5", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.5.tgz", + "integrity": "sha512-+wKjMNU9w/EaQayHXb7WA7ZaHY6hN8WgfvHNQ3t1PnU91/7O8TcTnIhCDYTZwnt8JsO9IBqZ30Ln1r7pPF52Aw==", "dev": true, "license": "MIT", "dependencies": { @@ -8774,6 +8837,12 @@ "fsevents": "~2.3.3" } }, + "node_modules/turbo-stream": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/turbo-stream/-/turbo-stream-2.4.0.tgz", + "integrity": "sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==", + "license": "ISC" + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -8900,15 +8969,15 @@ } }, "node_modules/typescript-eslint": { - "version": "8.34.1", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.34.1.tgz", - "integrity": "sha512-XjS+b6Vg9oT1BaIUfkW3M3LvqZE++rbzAMEHuccCfO/YkP43ha6w3jTEMilQxMF92nVOYCcdjv1ZUhAa1D/0ow==", + "version": "8.35.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.35.1.tgz", + "integrity": "sha512-xslJjFzhOmHYQzSB/QTeASAHbjmxOGEP6Coh93TXmUBFQoJ1VU35UHIDmG06Jd6taf3wqqC1ntBnCMeymy5Ovw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.34.1", - "@typescript-eslint/parser": "8.34.1", - "@typescript-eslint/utils": "8.34.1" + "@typescript-eslint/eslint-plugin": "8.35.1", + "@typescript-eslint/parser": "8.35.1", + "@typescript-eslint/utils": "8.35.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -8942,19 +9011,18 @@ } }, "node_modules/undici": { - "version": "6.21.2", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.2.tgz", - "integrity": "sha512-uROZWze0R0itiAKVPsYhFov9LxrPMHLMEQFszeI2gCN6bnIIZ8twzBCJcN2LJrBBLfrP0t1FW0g+JmKVl8Vk1g==", + "version": "6.21.3", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.3.tgz", + "integrity": "sha512-gBLkYIlEnSp8pFbT64yFgGE6UIB9tAkhukC23PmMDCe5Nd+cRqKxSjw5y54MK2AZMgZfJWMaNE4nYUHgi1XEOw==", "license": "MIT", "engines": { "node": ">=18.17" } }, "node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", - "dev": true, + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "license": "MIT" }, "node_modules/universalify": { @@ -9058,6 +9126,17 @@ "spdx-expression-parse": "^3.0.0" } }, + "node_modules/validate-npm-package-license/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": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.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", @@ -9153,17 +9232,17 @@ } }, "node_modules/vite-node": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.3.tgz", - "integrity": "sha512-gc8aAifGuDIpZHrPjuHyP4dpQmYXqWw7D1GmDnWeNWP654UEXzVfQ5IHPSK5HaHkwB/+p1atpYpSdw/2kOv8iQ==", + "version": "3.0.0-beta.2", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.0.0-beta.2.tgz", + "integrity": "sha512-ofTf6cfRdL30Wbl9n/BX81EyIR5s4PReLmSurrxQ+koLaWUNOEo8E0lCM53OJkb8vpa2URM2nSrxZsIFyvY1rg==", "dev": true, "license": "MIT", "dependencies": { "cac": "^6.7.14", - "debug": "^4.4.1", - "es-module-lexer": "^1.7.0", - "pathe": "^2.0.3", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + "debug": "^4.4.0", + "es-module-lexer": "^1.5.4", + "pathe": "^1.1.2", + "vite": "^5.0.0 || ^6.0.0" }, "bin": { "vite-node": "vite-node.mjs" @@ -9175,13 +9254,6 @@ "url": "https://opencollective.com/vitest" } }, - "node_modules/vite-node/node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true, - "license": "MIT" - }, "node_modules/vite-tsconfig-paths": { "version": "5.1.4", "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-5.1.4.tgz", @@ -9442,22 +9514,6 @@ "node": ">=8" } }, - "node_modules/wrap-ansi-cjs/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/wrap-ansi-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -9493,6 +9549,19 @@ "node": ">=8" } }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -9539,9 +9608,9 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.1.tgz", - "integrity": "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz", + "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==", "dev": true, "license": "ISC", "optional": true, @@ -9550,7 +9619,7 @@ "yaml": "bin.mjs" }, "engines": { - "node": ">= 14" + "node": ">= 14.6" } }, "node_modules/yargs": { diff --git a/Configuration/webapp/package.json b/Configuration/webapp/package.json index dfdb5fc61..5499b9a25 100644 --- a/Configuration/webapp/package.json +++ b/Configuration/webapp/package.json @@ -21,15 +21,13 @@ "@mui/material": "^7.1.1", "@react-router/node": "7.5.3", "isbot": "^5", - "mocha": "^11.6.0", - "puppeteer": "^24.10.1", "react": "^19.0.0", "react-dom": "^19.0.0", "react-router": "7.5.3" }, "devDependencies": { - "@react-router/dev": "7.5.3", "@eslint/js": "^9.28.0", + "@react-router/dev": "7.5.3", "@stylistic/eslint-plugin": "^4.4.1", "@types/mocha": "^10.0.10", "@types/node": "^20", @@ -43,7 +41,7 @@ "globals": "^16.2.0", "mocha": "^11.7.1", "prettier": "3.5.3", - "puppeteer": "^24.16.2", + "puppeteer": "^24.18.0", "tsx": "^4.20.4", "typescript": "^5.7.2", "typescript-eslint": "^8.34.0", From 31c63e1cbcca09835c77ba5bce00dda4a1fe4130 Mon Sep 17 00:00:00 2001 From: Deaponn Date: Mon, 1 Sep 2025 14:45:16 +0200 Subject: [PATCH 12/77] docs: add JSDoc comments --- Configuration/webapp/app/services/session.ts | 21 ++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/Configuration/webapp/app/services/session.ts b/Configuration/webapp/app/services/session.ts index 6b64a2700..7a368a4ba 100644 --- a/Configuration/webapp/app/services/session.ts +++ b/Configuration/webapp/app/services/session.ts @@ -14,7 +14,10 @@ const sessionData: Record = {}; -export const fetchSessionData = async () => { +/** + * Function for fetching session data from the Control server + */ +export async function fetchSessionData() { // only to get the data from server redirect // (line 264, commit 3ba4600 of github.com/AliceO2Group/WebUi/blob/dev/Framework/Backend/http/server.js) // this should be replaced with endpoint designed for authentication only @@ -23,11 +26,21 @@ export const fetchSessionData = async () => { searchParams.forEach((value, key) => { sessionData[key] = value; }); -}; +} -export const getSessionData = (): Record => sessionData; +/** + * Function for reading session data fetched from the Control server + * @returns {Record} sessionData + */ +export function getSessionData(): Record { + return sessionData; +} -export const deleteSessionData = () => { +/** + * Function for deleting session data fetched from the Control server + * Intended to logout the user + */ +export function deleteSessionData() { for (const key in sessionData) { delete sessionData[key]; } From 0533da0c334d85b5d76fad925adb8c36028defd5 Mon Sep 17 00:00:00 2001 From: Deaponn Date: Mon, 1 Sep 2025 14:53:03 +0200 Subject: [PATCH 13/77] test: update tests and move them to correct directory --- Configuration/webapp/eslint.config.js | 2 +- Configuration/webapp/package.json | 2 +- Configuration/webapp/test/mocha-index.cjs | 73 ------------------- .../webapp/{app => }/test/mocha-index.ts | 0 ...root-mocha.cjs => page-root-mocha.spec.ts} | 58 +++++++++++++-- .../{app => }/test/services/session.spec.ts | 2 +- Configuration/webapp/test/test-config.cjs | 20 ----- .../webapp/{app => }/test/test-config.ts | 0 8 files changed, 55 insertions(+), 102 deletions(-) delete mode 100644 Configuration/webapp/test/mocha-index.cjs rename Configuration/webapp/{app => }/test/mocha-index.ts (100%) rename Configuration/webapp/test/public/{page-root-mocha.cjs => page-root-mocha.spec.ts} (64%) rename Configuration/webapp/{app => }/test/services/session.spec.ts (95%) delete mode 100644 Configuration/webapp/test/test-config.cjs rename Configuration/webapp/{app => }/test/test-config.ts (100%) diff --git a/Configuration/webapp/eslint.config.js b/Configuration/webapp/eslint.config.js index 1579a1d7d..0d4a230b5 100644 --- a/Configuration/webapp/eslint.config.js +++ b/Configuration/webapp/eslint.config.js @@ -284,7 +284,7 @@ export default tseslint.config( }, }, { - files: ['app/test/**'], + files: ['test/**'], extends: [ pluginJs.configs.recommended, mochaPlugin.configs.recommended, diff --git a/Configuration/webapp/package.json b/Configuration/webapp/package.json index 5499b9a25..517f7c7f5 100644 --- a/Configuration/webapp/package.json +++ b/Configuration/webapp/package.json @@ -8,7 +8,7 @@ "start": "react-router-serve ./build/server/index.js", "typecheck": "react-router typegen && tsc", "docker:typecheck": "docker compose exec webapp npm run typecheck", - "mocha": "tsx node_modules/.bin/mocha --require app/test/mocha-index.ts app/test/**/*.spec.ts", + "mocha": "tsx node_modules/.bin/mocha --require test/mocha-index.ts test/**/*.spec.ts", "eslint": "eslint app/**", "eslint-fix": "eslint --fix app/**", "prettier": "prettier --write app/**", diff --git a/Configuration/webapp/test/mocha-index.cjs b/Configuration/webapp/test/mocha-index.cjs deleted file mode 100644 index 571305061..000000000 --- a/Configuration/webapp/test/mocha-index.cjs +++ /dev/null @@ -1,73 +0,0 @@ -/** - * @license - * Copyright 2019-2020 CERN and copyright holders of ALICE O2. - * See http://alice-o2.web.cern.ch/copyright for details of the copyright holders. - * All rights not expressly granted are reserved. - * - * This software is distributed under the terms of the GNU General Public - * License v3 (GPL Version 3), copied verbatim in the file "COPYING". - * - * In applying this license CERN does not waive the privileges and immunities - * granted to it by virtue of its status as an Intergovernmental Organization - * or submit itself to any jurisdiction. - */ - -const puppeteer = require('puppeteer'); -const config = require('./test-config.cjs'); - -let page; - -global.test = { - page: null, - helpers: {}, -}; - -describe('Configuration', function () { - let browser; - this.timeout(50000); - this.slow(1000); - const url = `http://${config.http.hostname}:${config.http.port}/`; - - before(async function () { - browser = await puppeteer.launch({ - args: ['--no-sandbox', '--disable-setuid-sandbox'], - headless: true, - }); - page = await browser.newPage(); - - // Listen to browser - page.on('error', (pageerror) => { - console.error(' ', pageerror); - this.ok = false; - }); - page.on('pageerror', (pageerror) => { - console.error(' ', pageerror); - this.ok = false; - }); - page.on('console', (msg) => { - for (let i = 0; i < msg.args().length; ++i) { - console.log(` ${msg.args()[i]}`); - } - }); - await page.setViewport({ width: 1200, height: 770 }); - - global.test.page = page; - global.test.helpers.url = url; - }); - - require('./public/page-root-mocha.cjs'); - - beforeEach(function () { - return (this.ok = true); - }); - - afterEach(function () { - if (!this.ok) { - throw new Error('something went wrong'); - } - }); - - after(async function () { - await browser.close(); - }); -}); diff --git a/Configuration/webapp/app/test/mocha-index.ts b/Configuration/webapp/test/mocha-index.ts similarity index 100% rename from Configuration/webapp/app/test/mocha-index.ts rename to Configuration/webapp/test/mocha-index.ts diff --git a/Configuration/webapp/test/public/page-root-mocha.cjs b/Configuration/webapp/test/public/page-root-mocha.spec.ts similarity index 64% rename from Configuration/webapp/test/public/page-root-mocha.cjs rename to Configuration/webapp/test/public/page-root-mocha.spec.ts index b495ec1f9..0ea19ad80 100644 --- a/Configuration/webapp/test/public/page-root-mocha.cjs +++ b/Configuration/webapp/test/public/page-root-mocha.spec.ts @@ -12,18 +12,29 @@ * or submit itself to any jurisdiction. */ -const assert = require('assert'); +import assert from 'assert'; +import { Page } from 'puppeteer'; +import global from '../mocha-index'; describe('`pageRoot` test-suite', function () { - let url; - let page; + let url: string | null = null; + let page: Page | null = null; - before(async function () { - url = test.helpers.url; - page = test.page; + before(function () { + ({ + test: { + page, + helpers: { url }, + }, + } = global); }); it('should load root page', async function () { + if (page === null || url === null) { + assert.equal('Page is null', 'test suite failed'); + return; + } + await page.goto(url, { waitUntil: 'networkidle0' }); const location = await page.evaluate(() => window.location); @@ -31,36 +42,71 @@ describe('`pageRoot` test-suite', function () { }); it('should successfully display drawer', async function () { + if (page === null || url === null) { + assert.equal('Page is null', 'test suite failed'); + return; + } + const drawer = await page.$$('.left-drawer'); assert.strictEqual(drawer.length, 1); }); it('should successfully display drawer header', async function () { + if (page === null || url === null) { + assert.equal('Page is null', 'test suite failed'); + return; + } + const drawerHeader = await page.$$('.left-drawer__header'); assert.strictEqual(drawerHeader.length, 1); }); it('should successfully display drawer footer', async function () { + if (page === null || url === null) { + assert.equal('Page is null', 'test suite failed'); + return; + } + const drawerFooter = await page.$$('.left-drawer__footer'); assert.strictEqual(drawerFooter.length, 1); }); it('should successfully display content section', async function () { + if (page === null || url === null) { + assert.equal('Page is null', 'test suite failed'); + return; + } + const contentSection = await page.$$('.content-section'); assert.strictEqual(contentSection.length, 1); }); it('should successfully display content section header', async function () { + if (page === null || url === null) { + assert.equal('Page is null', 'test suite failed'); + return; + } + const contentSectionHeader = await page.$$('.content-section__header'); assert.strictEqual(contentSectionHeader.length, 1); }); it('should successfully display user section', async function () { + if (page === null || url === null) { + assert.equal('Page is null', 'test suite failed'); + return; + } + const userSection = await page.$$('.user-section'); assert.strictEqual(userSection.length, 1); }); it('should successfully display user section menu on clik', async function () { + if (page === null || url === null) { + assert.equal('Page is null', 'test suite failed'); + return; + } + await page.click('.user-section'); const userSectionMenu = await page.$$('.user-section__menu'); assert.strictEqual(userSectionMenu.length, 1); diff --git a/Configuration/webapp/app/test/services/session.spec.ts b/Configuration/webapp/test/services/session.spec.ts similarity index 95% rename from Configuration/webapp/app/test/services/session.spec.ts rename to Configuration/webapp/test/services/session.spec.ts index 68232367a..cbbc64cb0 100644 --- a/Configuration/webapp/app/test/services/session.spec.ts +++ b/Configuration/webapp/test/services/session.spec.ts @@ -15,7 +15,7 @@ import assert from 'assert'; import { Page } from 'puppeteer'; import global from '../mocha-index'; -import { fetchSessionData, getSessionData } from '../../services/session'; +import { fetchSessionData, getSessionData } from '../../app/services/session'; describe('`pageRoot` test-suite', function () { let url: string | null = null; diff --git a/Configuration/webapp/test/test-config.cjs b/Configuration/webapp/test/test-config.cjs deleted file mode 100644 index 3c4f958ca..000000000 --- a/Configuration/webapp/test/test-config.cjs +++ /dev/null @@ -1,20 +0,0 @@ -/** - * @license - * Copyright 2019-2020 CERN and copyright holders of ALICE O2. - * See http://alice-o2.web.cern.ch/copyright for details of the copyright holders. - * All rights not expressly granted are reserved. - * - * This software is distributed under the terms of the GNU General Public - * License v3 (GPL Version 3), copied verbatim in the file "COPYING". - * - * In applying this license CERN does not waive the privileges and immunities - * granted to it by virtue of its status as an Intergovernmental Organization - * or submit itself to any jurisdiction. - */ - -module.exports = { - http: { - port: 8080, - hostname: 'localhost', - }, -}; diff --git a/Configuration/webapp/app/test/test-config.ts b/Configuration/webapp/test/test-config.ts similarity index 100% rename from Configuration/webapp/app/test/test-config.ts rename to Configuration/webapp/test/test-config.ts From fcb78099f099850ae04a180061143ba1cd44af04 Mon Sep 17 00:00:00 2001 From: Deaponn Date: Mon, 1 Sep 2025 15:14:27 +0200 Subject: [PATCH 14/77] style: fix formatting --- Configuration/webapp/app/services/session.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Configuration/webapp/app/services/session.ts b/Configuration/webapp/app/services/session.ts index 7a368a4ba..c3f78d656 100644 --- a/Configuration/webapp/app/services/session.ts +++ b/Configuration/webapp/app/services/session.ts @@ -44,4 +44,4 @@ export function deleteSessionData() { for (const key in sessionData) { delete sessionData[key]; } -}; +} From 1f9310b7032a5906a93be81626b68e403515ce3c Mon Sep 17 00:00:00 2001 From: George Raduta Date: Wed, 3 Sep 2025 14:44:50 +0200 Subject: [PATCH 15/77] [release/cog/2.0.0] (#3033) --- Control/lib/common/kvStore/runtime.enum.js | 2 +- Control/lib/kafka/enums/consumerGroups.enum.js | 2 +- Control/package-lock.json | 4 ++-- Control/package.json | 2 +- Control/public/environment/Environment.js | 5 +++-- Control/test/public/page-new-environment-mocha.js | 2 +- 6 files changed, 9 insertions(+), 8 deletions(-) diff --git a/Control/lib/common/kvStore/runtime.enum.js b/Control/lib/common/kvStore/runtime.enum.js index 20bc2e909..4c966a4e9 100644 --- a/Control/lib/common/kvStore/runtime.enum.js +++ b/Control/lib/common/kvStore/runtime.enum.js @@ -21,7 +21,7 @@ const RUNTIME_COMPONENT = Object.freeze({ PDP_VERSION: 'aliecs/defaults', COG: 'COG', - COG_V1: 'COG_V1', + COG_V1: 'COG-v1', }); /** diff --git a/Control/lib/kafka/enums/consumerGroups.enum.js b/Control/lib/kafka/enums/consumerGroups.enum.js index 18ca02b30..91dbf6f2a 100644 --- a/Control/lib/kafka/enums/consumerGroups.enum.js +++ b/Control/lib/kafka/enums/consumerGroups.enum.js @@ -19,7 +19,7 @@ exports.ConsumerGroups = Object.freeze({ ENVIRONMENT: 'cog-environment', INTEGRATED_SERVICE: { DCS: 'cog-dcs-integrated-service', - ODC: 'cog-odc-integrated-service' + ODC: 'cog-odc-integrated-service', }, RUN: 'cog-run', TASK: 'cog-task', diff --git a/Control/package-lock.json b/Control/package-lock.json index 6893e9e7d..f64c3798c 100644 --- a/Control/package-lock.json +++ b/Control/package-lock.json @@ -1,12 +1,12 @@ { "name": "@aliceo2/control", - "version": "1.80.0", + "version": "2.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@aliceo2/control", - "version": "1.80.0", + "version": "2.0.0", "bundleDependencies": [ "@aliceo2/web-ui", "@grpc/grpc-js", diff --git a/Control/package.json b/Control/package.json index 92ffd90ed..51e0d2a10 100644 --- a/Control/package.json +++ b/Control/package.json @@ -1,6 +1,6 @@ { "name": "@aliceo2/control", - "version": "1.80.0", + "version": "2.0.0", "description": "ALICE O2 Control GUI", "author": "George Raduta", "contributors": [ diff --git a/Control/public/environment/Environment.js b/Control/public/environment/Environment.js index 01c5a7a87..bc04f719e 100644 --- a/Control/public/environment/Environment.js +++ b/Control/public/environment/Environment.js @@ -130,9 +130,10 @@ export default class Environment extends Observable { this.itemNew = RemoteData.failure(result.message); this.notify(); } else { - const { id } = result; this.itemNew = RemoteData.notAsked(); - this.model.router.go(`?page=environment&id=${id}`); + // Users cannot be redirected to specific environment as it does not exist in + // ECS until it becomes active, thus users would get a NotFound reply from ECS + this.model.router.go(`?page=environments`); } } diff --git a/Control/test/public/page-new-environment-mocha.js b/Control/test/public/page-new-environment-mocha.js index 6b2d2f5b2..42105d1f0 100644 --- a/Control/test/public/page-new-environment-mocha.js +++ b/Control/test/public/page-new-environment-mocha.js @@ -440,7 +440,7 @@ describe('`pageNewEnvironment` test-suite', async () => { waitUntil: 'networkidle0', }); const location = await page.evaluate(() => window.location); - assert.strictEqual(location.search, '?page=environment&id=6f6d6387-6577-11e8-993a-f07959157220&panel=general'); + assert.strictEqual(location.search, '?page=environments'); assert.ok(calls['newEnvironmentAsync']); }); From d4ede3577eaa1de9bc07767e4b758e4b1ba53f60 Mon Sep 17 00:00:00 2001 From: George Raduta Date: Wed, 3 Sep 2025 16:30:31 +0200 Subject: [PATCH 16/77] [release/cog/2.0.1] (#3035) --- Control/lib/services/Environment.service.js | 4 ---- .../lib/services/environment/EnvironmentCache.service.js | 7 +++++-- Control/package-lock.json | 4 ++-- Control/package.json | 2 +- 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/Control/lib/services/Environment.service.js b/Control/lib/services/Environment.service.js index 18e8463c6..405f08718 100644 --- a/Control/lib/services/Environment.service.js +++ b/Control/lib/services/Environment.service.js @@ -71,10 +71,6 @@ class EnvironmentService { throw grpcErrorToNativeError(error); } try { - if (!environments || environments.length === 0) { - this._broadcastService.broadcast(ENVIRONMENTS_OVERVIEW, []); - return []; - } const activeEnvironmentList = []; for (const { id } of environments) { let environment; diff --git a/Control/lib/services/environment/EnvironmentCache.service.js b/Control/lib/services/environment/EnvironmentCache.service.js index 8320f8a59..e09a7413b 100644 --- a/Control/lib/services/environment/EnvironmentCache.service.js +++ b/Control/lib/services/environment/EnvironmentCache.service.js @@ -252,14 +252,17 @@ class EnvironmentCacheService { if (!cachedEnvironment.rootRole) { cachedEnvironment.rootRole = environmentEvent.workflowTemplateInfoName; } - this._environments.set(id, cachedEnvironment); + + this.addOrUpdateEnvironment(cachedEnvironment, false); if ( transition?.name === EnvironmentTransitionType.DESTROY && state === EnvironmentState.DONE && - message === ECS_DESTROY_TRANSITION_DONE_MESSAGE + message === ECS_DESTROY_TRANSITION_DONE_MESSAGE && + !cachedEnvironment.deploymentError ) { // That is, if the environment successfully ended the DESTROY transition + // while not having a deployment error this.removeEnvironmentById(id); } diff --git a/Control/package-lock.json b/Control/package-lock.json index f64c3798c..00706ad0b 100644 --- a/Control/package-lock.json +++ b/Control/package-lock.json @@ -1,12 +1,12 @@ { "name": "@aliceo2/control", - "version": "2.0.0", + "version": "2.0.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@aliceo2/control", - "version": "2.0.0", + "version": "2.0.1", "bundleDependencies": [ "@aliceo2/web-ui", "@grpc/grpc-js", diff --git a/Control/package.json b/Control/package.json index 51e0d2a10..eecefac80 100644 --- a/Control/package.json +++ b/Control/package.json @@ -1,6 +1,6 @@ { "name": "@aliceo2/control", - "version": "2.0.0", + "version": "2.0.1", "description": "ALICE O2 Control GUI", "author": "George Raduta", "contributors": [ From e3a3a9bfc963c3dcdc21e05595cdbcfee7522ebe Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Sep 2025 09:22:55 +0200 Subject: [PATCH 17/77] Bump puppeteer in /QualityControl in the dev-dependencies group (#3032) Bumps the dev-dependencies group in /QualityControl with 1 update: [puppeteer](https://github.com/puppeteer/puppeteer). Updates `puppeteer` from 24.17.0 to 24.18.0 - [Release notes](https://github.com/puppeteer/puppeteer/releases) - [Changelog](https://github.com/puppeteer/puppeteer/blob/main/CHANGELOG.md) - [Commits](https://github.com/puppeteer/puppeteer/compare/puppeteer-v24.17.0...puppeteer-v24.18.0) --- updated-dependencies: - dependency-name: puppeteer dependency-version: 24.18.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-dependencies ... --- QualityControl/package-lock.json | 32 ++++++++++++++++---------------- QualityControl/package.json | 2 +- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/QualityControl/package-lock.json b/QualityControl/package-lock.json index c292c406a..f13bd9e3b 100644 --- a/QualityControl/package-lock.json +++ b/QualityControl/package-lock.json @@ -28,7 +28,7 @@ "eslint-plugin-jsdoc": "^54.1.0", "globals": "^16.3.0", "nock": "^14.0.4", - "puppeteer": "^24.17.0", + "puppeteer": "^24.18.0", "sequelize-cli": "^6.6.2", "sinon": "^21.0.0", "supertest": "^7.1.0" @@ -831,9 +831,9 @@ "license": "BSD-3-Clause" }, "node_modules/@puppeteer/browsers": { - "version": "2.10.7", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.7.tgz", - "integrity": "sha512-wHWLkQWBjHtajZeqCB74nsa/X70KheyOhySYBRmVQDJiNj0zjZR/naPCvdWjMhcG1LmjaMV/9WtTo5mpe8qWLw==", + "version": "2.10.8", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.8.tgz", + "integrity": "sha512-f02QYEnBDE0p8cteNoPYHHjbDuwyfbe4cCIVlNi8/MRicIxFW4w4CfgU0LNgWEID6s06P+hRJ1qjpBLMhPRCiQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1439,9 +1439,9 @@ "optional": true }, "node_modules/bare-fs": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.2.1.tgz", - "integrity": "sha512-mELROzV0IhqilFgsl1gyp48pnZsaV9xhQapHLDsvn4d4ZTfbFhcghQezl7FTEDNBcGqLUnNI3lUlm6ecrLWdFA==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.2.2.tgz", + "integrity": "sha512-5vn+bdnlCYMwETIm1FqQXDP6TYPbxr2uJd88ve40kr4oPbiTZJVrTNzqA3/4sfWZeWKuQR/RkboBt7qEEDtfMA==", "dev": true, "license": "Apache-2.0", "optional": true, @@ -5102,18 +5102,18 @@ } }, "node_modules/puppeteer": { - "version": "24.17.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.17.0.tgz", - "integrity": "sha512-CGrmJ8WgilK3nyE73k+pbxHggETPpEvL6AQ9H5JSK1RgZRGMQVJ+iO3MocGm9yBQXQJ9U5xijyLvkYXFeb0/+g==", + "version": "24.18.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.18.0.tgz", + "integrity": "sha512-Ke8oL/87GhzKIM2Ag6Yj49t5xbGc4rspGIuSuFLFCQBtYzWqCSanvqoCu08WkI78rbqcwnHjxiTH6oDlYFrjrw==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@puppeteer/browsers": "2.10.7", + "@puppeteer/browsers": "2.10.8", "chromium-bidi": "8.0.0", "cosmiconfig": "^9.0.0", "devtools-protocol": "0.0.1475386", - "puppeteer-core": "24.17.0", + "puppeteer-core": "24.18.0", "typed-query-selector": "^2.12.0" }, "bin": { @@ -5124,13 +5124,13 @@ } }, "node_modules/puppeteer-core": { - "version": "24.17.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.17.0.tgz", - "integrity": "sha512-RYOBKFiF+3RdwIZTEacqNpD567gaFcBAOKTT7742FdB1icXudrPI7BlZbYTYWK2wgGQUXt9Zi1Yn+D5PmCs4CA==", + "version": "24.18.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.18.0.tgz", + "integrity": "sha512-As0BvfXxek2MbV0m7iqBmQKFnfSrzSvTM4zGipjd4cL+9f2Ccgut6RvHlc8+qBieKHqCMFy9BSI4QyveoYXTug==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@puppeteer/browsers": "2.10.7", + "@puppeteer/browsers": "2.10.8", "chromium-bidi": "8.0.0", "debug": "^4.4.1", "devtools-protocol": "0.0.1475386", diff --git a/QualityControl/package.json b/QualityControl/package.json index 286d5017b..753416211 100644 --- a/QualityControl/package.json +++ b/QualityControl/package.json @@ -52,7 +52,7 @@ "eslint-plugin-jsdoc": "^54.1.0", "globals": "^16.3.0", "nock": "^14.0.4", - "puppeteer": "^24.17.0", + "puppeteer": "^24.18.0", "sequelize-cli": "^6.6.2", "sinon": "^21.0.0", "supertest": "^7.1.0" From 4050150d35dc9eca05e8e1f0be1cf842a2b1737c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Sep 2025 09:25:36 +0200 Subject: [PATCH 18/77] Bump puppeteer in /InfoLogger in the dev-dependencies group (#3031) Bumps the dev-dependencies group in /InfoLogger with 1 update: [puppeteer](https://github.com/puppeteer/puppeteer). Updates `puppeteer` from 24.17.0 to 24.18.0 - [Release notes](https://github.com/puppeteer/puppeteer/releases) - [Changelog](https://github.com/puppeteer/puppeteer/blob/main/CHANGELOG.md) - [Commits](https://github.com/puppeteer/puppeteer/compare/puppeteer-v24.17.0...puppeteer-v24.18.0) --- updated-dependencies: - dependency-name: puppeteer dependency-version: 24.18.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-dependencies ... --- InfoLogger/package-lock.json | 32 ++++++++++++++++---------------- InfoLogger/package.json | 2 +- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/InfoLogger/package-lock.json b/InfoLogger/package-lock.json index 94622b1e7..bf75f9885 100644 --- a/InfoLogger/package-lock.json +++ b/InfoLogger/package-lock.json @@ -23,7 +23,7 @@ "globals": "^16.3.0", "mocha": "^11.7.0", "nyc": "^17.1.0", - "puppeteer": "^24.17.0", + "puppeteer": "^24.18.0", "sinon": "^21.0.0" }, "engines": { @@ -1018,9 +1018,9 @@ "license": "BSD-3-Clause" }, "node_modules/@puppeteer/browsers": { - "version": "2.10.7", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.7.tgz", - "integrity": "sha512-wHWLkQWBjHtajZeqCB74nsa/X70KheyOhySYBRmVQDJiNj0zjZR/naPCvdWjMhcG1LmjaMV/9WtTo5mpe8qWLw==", + "version": "2.10.8", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.8.tgz", + "integrity": "sha512-f02QYEnBDE0p8cteNoPYHHjbDuwyfbe4cCIVlNi8/MRicIxFW4w4CfgU0LNgWEID6s06P+hRJ1qjpBLMhPRCiQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1503,9 +1503,9 @@ "optional": true }, "node_modules/bare-fs": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.2.1.tgz", - "integrity": "sha512-mELROzV0IhqilFgsl1gyp48pnZsaV9xhQapHLDsvn4d4ZTfbFhcghQezl7FTEDNBcGqLUnNI3lUlm6ecrLWdFA==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.2.2.tgz", + "integrity": "sha512-5vn+bdnlCYMwETIm1FqQXDP6TYPbxr2uJd88ve40kr4oPbiTZJVrTNzqA3/4sfWZeWKuQR/RkboBt7qEEDtfMA==", "dev": true, "license": "Apache-2.0", "optional": true, @@ -5014,18 +5014,18 @@ } }, "node_modules/puppeteer": { - "version": "24.17.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.17.0.tgz", - "integrity": "sha512-CGrmJ8WgilK3nyE73k+pbxHggETPpEvL6AQ9H5JSK1RgZRGMQVJ+iO3MocGm9yBQXQJ9U5xijyLvkYXFeb0/+g==", + "version": "24.18.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.18.0.tgz", + "integrity": "sha512-Ke8oL/87GhzKIM2Ag6Yj49t5xbGc4rspGIuSuFLFCQBtYzWqCSanvqoCu08WkI78rbqcwnHjxiTH6oDlYFrjrw==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@puppeteer/browsers": "2.10.7", + "@puppeteer/browsers": "2.10.8", "chromium-bidi": "8.0.0", "cosmiconfig": "^9.0.0", "devtools-protocol": "0.0.1475386", - "puppeteer-core": "24.17.0", + "puppeteer-core": "24.18.0", "typed-query-selector": "^2.12.0" }, "bin": { @@ -5036,13 +5036,13 @@ } }, "node_modules/puppeteer-core": { - "version": "24.17.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.17.0.tgz", - "integrity": "sha512-RYOBKFiF+3RdwIZTEacqNpD567gaFcBAOKTT7742FdB1icXudrPI7BlZbYTYWK2wgGQUXt9Zi1Yn+D5PmCs4CA==", + "version": "24.18.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.18.0.tgz", + "integrity": "sha512-As0BvfXxek2MbV0m7iqBmQKFnfSrzSvTM4zGipjd4cL+9f2Ccgut6RvHlc8+qBieKHqCMFy9BSI4QyveoYXTug==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@puppeteer/browsers": "2.10.7", + "@puppeteer/browsers": "2.10.8", "chromium-bidi": "8.0.0", "debug": "^4.4.1", "devtools-protocol": "0.0.1475386", diff --git a/InfoLogger/package.json b/InfoLogger/package.json index d7f5c3133..20d6b96d4 100644 --- a/InfoLogger/package.json +++ b/InfoLogger/package.json @@ -41,7 +41,7 @@ "globals": "^16.3.0", "mocha": "^11.7.0", "nyc": "^17.1.0", - "puppeteer": "^24.17.0", + "puppeteer": "^24.18.0", "sinon": "^21.0.0" }, "bundleDependencies": [ From 670acdde06d115a5940ff1f6eeff984e22ca44b2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Sep 2025 09:27:43 +0200 Subject: [PATCH 19/77] Bump @stylistic/eslint-plugin from 4.4.1 to 5.3.1 in /InfoLogger (#3030) Bumps [@stylistic/eslint-plugin](https://github.com/eslint-stylistic/eslint-stylistic/tree/HEAD/packages/eslint-plugin) from 4.4.1 to 5.3.1. - [Release notes](https://github.com/eslint-stylistic/eslint-stylistic/releases) - [Changelog](https://github.com/eslint-stylistic/eslint-stylistic/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint-stylistic/eslint-stylistic/commits/v5.3.1/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@stylistic/eslint-plugin" dependency-version: 5.3.1 dependency-type: direct:development update-type: version-update:semver-major ... --- InfoLogger/package-lock.json | 405 +---------------------------------- InfoLogger/package.json | 2 +- 2 files changed, 11 insertions(+), 396 deletions(-) diff --git a/InfoLogger/package-lock.json b/InfoLogger/package-lock.json index bf75f9885..4d2cb6cc6 100644 --- a/InfoLogger/package-lock.json +++ b/InfoLogger/package-lock.json @@ -17,7 +17,7 @@ }, "devDependencies": { "@eslint/js": "^9.34.0", - "@stylistic/eslint-plugin": "^4.4.0", + "@stylistic/eslint-plugin": "^5.3.1", "eslint": "^9.34.0", "eslint-plugin-jsdoc": "^54.1.0", "globals": "^16.3.0", @@ -895,44 +895,6 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -1079,17 +1041,18 @@ } }, "node_modules/@stylistic/eslint-plugin": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-4.4.1.tgz", - "integrity": "sha512-CEigAk7eOLyHvdgmpZsKFwtiqS2wFwI1fn4j09IU9GmD4euFM4jEBAViWeCqaNLlbX2k2+A/Fq9cje4HQBXuJQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.3.1.tgz", + "integrity": "sha512-Ykums1VYonM0TgkD0VteVq9mrlO2FhF48MDJnPyv3MktIB2ydtuhlO0AfWm7xnW1kyf5bjOqA6xc7JjviuVTxg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/utils": "^8.32.1", - "eslint-visitor-keys": "^4.2.0", - "espree": "^10.3.0", + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/types": "^8.41.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", "estraverse": "^5.3.0", - "picomatch": "^4.0.2" + "picomatch": "^4.0.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1152,63 +1115,6 @@ "@types/node": "*" } }, - "node_modules/@typescript-eslint/project-service": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.41.0.tgz", - "integrity": "sha512-b8V9SdGBQzQdjJ/IO3eDifGpDBJfvrNTp2QD9P2BeqWTGrRibgfgIlBSw6z3b6R7dPzg752tOs4u/7yCLxksSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.41.0", - "@typescript-eslint/types": "^8.41.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.41.0.tgz", - "integrity": "sha512-n6m05bXn/Cd6DZDGyrpXrELCPVaTnLdPToyhBoFkLIMznRUQUEQdSp96s/pcWSQdqOhrgR1mzJ+yItK7T+WPMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.41.0", - "@typescript-eslint/visitor-keys": "8.41.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.41.0.tgz", - "integrity": "sha512-TDhxYFPUYRFxFhuU5hTIJk+auzM/wKvWgoNYOPcOf6i4ReYlOoYN8q1dV5kOTjNQNJgzWN3TUUQMtlLOcUgdUw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, "node_modules/@typescript-eslint/types": { "version": "8.41.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.41.0.tgz", @@ -1223,103 +1129,6 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.41.0.tgz", - "integrity": "sha512-D43UwUYJmGhuwHfY7MtNKRZMmfd8+p/eNSfFe6tH5mbVDto+VQCayeAt35rOx3Cs6wxD16DQtIKw/YXxt5E0UQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/project-service": "8.41.0", - "@typescript-eslint/tsconfig-utils": "8.41.0", - "@typescript-eslint/types": "8.41.0", - "@typescript-eslint/visitor-keys": "8.41.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.41.0.tgz", - "integrity": "sha512-udbCVstxZ5jiPIXrdH+BZWnPatjlYwJuJkDA4Tbo3WyYLh8NvB+h/bKeSZHDOFKfphsZYJQqaFtLeXEqurQn1A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.41.0", - "@typescript-eslint/types": "8.41.0", - "@typescript-eslint/typescript-estree": "8.41.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.41.0.tgz", - "integrity": "sha512-+GeGMebMCy0elMNg67LRNoVnUFPIm37iu5CmHESVx56/9Jsfdpsvbv605DQ81Pi/x11IdKUsS5nzgTYbCQU9fg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.41.0", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -1642,19 +1451,6 @@ "concat-map": "0.0.1" } }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", @@ -2657,36 +2453,6 @@ "dev": true, "license": "MIT" }, - "node_modules/fast-glob": { - "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": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "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-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -2700,16 +2466,6 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, - "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, "node_modules/fd-slicer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", @@ -2739,19 +2495,6 @@ "node": ">=16.0.0" } }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/finalhandler": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", @@ -3389,16 +3132,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, "node_modules/is-plain-obj": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", @@ -3970,16 +3703,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -3990,33 +3713,6 @@ "node": ">= 0.6" } }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -5069,27 +4765,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -5196,17 +4871,6 @@ "node": ">=4" } }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -5244,30 +4908,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -5858,19 +5498,6 @@ "inBundle": true, "license": "MIT" }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -5891,19 +5518,6 @@ "node": ">= 14.0.0" } }, - "node_modules/ts-api-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", - "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.12" - }, - "peerDependencies": { - "typescript": ">=4.8.4" - } - }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -5977,6 +5591,7 @@ "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", "dev": true, "license": "Apache-2.0", + "optional": true, "peer": true, "bin": { "tsc": "bin/tsc", diff --git a/InfoLogger/package.json b/InfoLogger/package.json index 20d6b96d4..05efdb60a 100644 --- a/InfoLogger/package.json +++ b/InfoLogger/package.json @@ -35,7 +35,7 @@ }, "devDependencies": { "@eslint/js": "^9.34.0", - "@stylistic/eslint-plugin": "^4.4.0", + "@stylistic/eslint-plugin": "^5.3.1", "eslint": "^9.34.0", "eslint-plugin-jsdoc": "^54.1.0", "globals": "^16.3.0", From 6f687dab7833d120b2639efc03e87220f9024c68 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Sep 2025 09:31:00 +0200 Subject: [PATCH 20/77] Bump puppeteer in /Control in the dev-dependencies group (#3029) Bumps the dev-dependencies group in /Control with 1 update: [puppeteer](https://github.com/puppeteer/puppeteer). Updates `puppeteer` from 24.17.0 to 24.18.0 - [Release notes](https://github.com/puppeteer/puppeteer/releases) - [Changelog](https://github.com/puppeteer/puppeteer/blob/main/CHANGELOG.md) - [Commits](https://github.com/puppeteer/puppeteer/compare/puppeteer-v24.17.0...puppeteer-v24.18.0) --- updated-dependencies: - dependency-name: puppeteer dependency-version: 24.18.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-dependencies ... --- Control/package-lock.json | 32 ++++++++++++++++---------------- Control/package.json | 2 +- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/Control/package-lock.json b/Control/package-lock.json index 00706ad0b..a9b2456cc 100644 --- a/Control/package-lock.json +++ b/Control/package-lock.json @@ -27,7 +27,7 @@ "nock": "^14.0.0", "nyc": "^17.1.0", "proxyquire": "^2.1.3", - "puppeteer": "^24.17.0", + "puppeteer": "^24.18.0", "sinon": "21.0.0", "supertest": "7.1.0" }, @@ -938,9 +938,9 @@ "license": "BSD-3-Clause" }, "node_modules/@puppeteer/browsers": { - "version": "2.10.7", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.7.tgz", - "integrity": "sha512-wHWLkQWBjHtajZeqCB74nsa/X70KheyOhySYBRmVQDJiNj0zjZR/naPCvdWjMhcG1LmjaMV/9WtTo5mpe8qWLw==", + "version": "2.10.8", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.8.tgz", + "integrity": "sha512-f02QYEnBDE0p8cteNoPYHHjbDuwyfbe4cCIVlNi8/MRicIxFW4w4CfgU0LNgWEID6s06P+hRJ1qjpBLMhPRCiQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1238,9 +1238,9 @@ "optional": true }, "node_modules/bare-fs": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.2.1.tgz", - "integrity": "sha512-mELROzV0IhqilFgsl1gyp48pnZsaV9xhQapHLDsvn4d4ZTfbFhcghQezl7FTEDNBcGqLUnNI3lUlm6ecrLWdFA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.2.3.tgz", + "integrity": "sha512-1aGs5pRVLToMQ79elP+7cc0u0s/wXAzfBv/7hDloT7WFggLqECCas5qqPky7WHCFdsBH5WDq6sD4fAoz5sJbtA==", "dev": true, "license": "Apache-2.0", "optional": true, @@ -5030,18 +5030,18 @@ } }, "node_modules/puppeteer": { - "version": "24.17.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.17.0.tgz", - "integrity": "sha512-CGrmJ8WgilK3nyE73k+pbxHggETPpEvL6AQ9H5JSK1RgZRGMQVJ+iO3MocGm9yBQXQJ9U5xijyLvkYXFeb0/+g==", + "version": "24.18.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.18.0.tgz", + "integrity": "sha512-Ke8oL/87GhzKIM2Ag6Yj49t5xbGc4rspGIuSuFLFCQBtYzWqCSanvqoCu08WkI78rbqcwnHjxiTH6oDlYFrjrw==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@puppeteer/browsers": "2.10.7", + "@puppeteer/browsers": "2.10.8", "chromium-bidi": "8.0.0", "cosmiconfig": "^9.0.0", "devtools-protocol": "0.0.1475386", - "puppeteer-core": "24.17.0", + "puppeteer-core": "24.18.0", "typed-query-selector": "^2.12.0" }, "bin": { @@ -5052,13 +5052,13 @@ } }, "node_modules/puppeteer-core": { - "version": "24.17.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.17.0.tgz", - "integrity": "sha512-RYOBKFiF+3RdwIZTEacqNpD567gaFcBAOKTT7742FdB1icXudrPI7BlZbYTYWK2wgGQUXt9Zi1Yn+D5PmCs4CA==", + "version": "24.18.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.18.0.tgz", + "integrity": "sha512-As0BvfXxek2MbV0m7iqBmQKFnfSrzSvTM4zGipjd4cL+9f2Ccgut6RvHlc8+qBieKHqCMFy9BSI4QyveoYXTug==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@puppeteer/browsers": "2.10.7", + "@puppeteer/browsers": "2.10.8", "chromium-bidi": "8.0.0", "debug": "^4.4.1", "devtools-protocol": "0.0.1475386", diff --git a/Control/package.json b/Control/package.json index eecefac80..51401ab59 100644 --- a/Control/package.json +++ b/Control/package.json @@ -46,7 +46,7 @@ "nock": "^14.0.0", "nyc": "^17.1.0", "proxyquire": "^2.1.3", - "puppeteer": "^24.17.0", + "puppeteer": "^24.18.0", "sinon": "21.0.0", "supertest": "7.1.0" }, From fd699cda241aa98e1801a9f21e78417bede6cb14 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Sep 2025 09:34:44 +0200 Subject: [PATCH 21/77] Bump @stylistic/eslint-plugin from 4.4.1 to 5.3.1 in /Framework (#3028) Bumps [@stylistic/eslint-plugin](https://github.com/eslint-stylistic/eslint-stylistic/tree/HEAD/packages/eslint-plugin) from 4.4.1 to 5.3.1. - [Release notes](https://github.com/eslint-stylistic/eslint-stylistic/releases) - [Changelog](https://github.com/eslint-stylistic/eslint-stylistic/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint-stylistic/eslint-stylistic/commits/v5.3.1/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@stylistic/eslint-plugin" dependency-version: 5.3.1 dependency-type: direct:development update-type: version-update:semver-major ... --- Framework/package-lock.json | 418 +----------------------------------- Framework/package.json | 2 +- 2 files changed, 11 insertions(+), 409 deletions(-) diff --git a/Framework/package-lock.json b/Framework/package-lock.json index 17e3183d3..52bf46667 100644 --- a/Framework/package-lock.json +++ b/Framework/package-lock.json @@ -22,7 +22,7 @@ }, "devDependencies": { "@eslint/js": "^9.34.0", - "@stylistic/eslint-plugin": "^4.4.0", + "@stylistic/eslint-plugin": "^5.3.1", "eslint": "^9.34.0", "eslint-plugin-jsdoc": "^54.1.0", "globals": "^16.3.0", @@ -914,44 +914,6 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/@open-draft/deferred-promise": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", @@ -1113,17 +1075,18 @@ } }, "node_modules/@stylistic/eslint-plugin": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-4.4.1.tgz", - "integrity": "sha512-CEigAk7eOLyHvdgmpZsKFwtiqS2wFwI1fn4j09IU9GmD4euFM4jEBAViWeCqaNLlbX2k2+A/Fq9cje4HQBXuJQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.3.1.tgz", + "integrity": "sha512-Ykums1VYonM0TgkD0VteVq9mrlO2FhF48MDJnPyv3MktIB2ydtuhlO0AfWm7xnW1kyf5bjOqA6xc7JjviuVTxg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/utils": "^8.32.1", - "eslint-visitor-keys": "^4.2.0", - "espree": "^10.3.0", + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/types": "^8.41.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", "estraverse": "^5.3.0", - "picomatch": "^4.0.2" + "picomatch": "^4.0.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1191,63 +1154,6 @@ "@types/node": "*" } }, - "node_modules/@typescript-eslint/project-service": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.41.0.tgz", - "integrity": "sha512-b8V9SdGBQzQdjJ/IO3eDifGpDBJfvrNTp2QD9P2BeqWTGrRibgfgIlBSw6z3b6R7dPzg752tOs4u/7yCLxksSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.41.0", - "@typescript-eslint/types": "^8.41.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.41.0.tgz", - "integrity": "sha512-n6m05bXn/Cd6DZDGyrpXrELCPVaTnLdPToyhBoFkLIMznRUQUEQdSp96s/pcWSQdqOhrgR1mzJ+yItK7T+WPMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.41.0", - "@typescript-eslint/visitor-keys": "8.41.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.41.0.tgz", - "integrity": "sha512-TDhxYFPUYRFxFhuU5hTIJk+auzM/wKvWgoNYOPcOf6i4ReYlOoYN8q1dV5kOTjNQNJgzWN3TUUQMtlLOcUgdUw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, "node_modules/@typescript-eslint/types": { "version": "8.41.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.41.0.tgz", @@ -1262,116 +1168,6 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.41.0.tgz", - "integrity": "sha512-D43UwUYJmGhuwHfY7MtNKRZMmfd8+p/eNSfFe6tH5mbVDto+VQCayeAt35rOx3Cs6wxD16DQtIKw/YXxt5E0UQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/project-service": "8.41.0", - "@typescript-eslint/tsconfig-utils": "8.41.0", - "@typescript-eslint/types": "8.41.0", - "@typescript-eslint/visitor-keys": "8.41.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.41.0.tgz", - "integrity": "sha512-udbCVstxZ5jiPIXrdH+BZWnPatjlYwJuJkDA4Tbo3WyYLh8NvB+h/bKeSZHDOFKfphsZYJQqaFtLeXEqurQn1A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.41.0", - "@typescript-eslint/types": "8.41.0", - "@typescript-eslint/typescript-estree": "8.41.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.41.0.tgz", - "integrity": "sha512-+GeGMebMCy0elMNg67LRNoVnUFPIm37iu5CmHESVx56/9Jsfdpsvbv605DQ81Pi/x11IdKUsS5nzgTYbCQU9fg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.41.0", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -1694,19 +1490,6 @@ "concat-map": "0.0.1" } }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", @@ -2737,36 +2520,6 @@ "dev": true, "license": "MIT" }, - "node_modules/fast-glob": { - "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": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "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-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -2786,16 +2539,6 @@ "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", "dev": true }, - "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, "node_modules/fd-slicer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", @@ -2823,19 +2566,6 @@ "node": ">=16.0.0" } }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/finalhandler": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", @@ -3461,16 +3191,6 @@ "dev": true, "license": "MIT" }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, "node_modules/is-plain-obj": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", @@ -3942,16 +3662,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -3960,33 +3670,6 @@ "node": ">= 0.6" } }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -5049,27 +4732,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -5170,17 +4832,6 @@ "node": ">=4" } }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -5196,30 +4847,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -5814,19 +5441,6 @@ "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -5843,19 +5457,6 @@ "node": ">= 14.0.0" } }, - "node_modules/ts-api-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", - "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.12" - }, - "peerDependencies": { - "typescript": ">=4.8.4" - } - }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -5918,6 +5519,7 @@ "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", "dev": true, "license": "Apache-2.0", + "optional": true, "peer": true, "bin": { "tsc": "bin/tsc", diff --git a/Framework/package.json b/Framework/package.json index 44a635f56..9380c7c90 100644 --- a/Framework/package.json +++ b/Framework/package.json @@ -44,7 +44,7 @@ }, "devDependencies": { "@eslint/js": "^9.34.0", - "@stylistic/eslint-plugin": "^4.4.0", + "@stylistic/eslint-plugin": "^5.3.1", "eslint": "^9.34.0", "eslint-plugin-jsdoc": "^54.1.0", "globals": "^16.3.0", From a7027578194d0853c5e7e245cb759103b49c97eb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Sep 2025 09:45:33 +0200 Subject: [PATCH 22/77] Bump actions/checkout from 4 to 5 (#3025) Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 5. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v4...v5) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: '5' dependency-type: direct:production update-type: version-update:semver-major ... --- .github/workflows/codeql.yml | 2 +- .github/workflows/configuration.yml | 4 ++-- .github/workflows/control.yml | 4 ++-- .github/workflows/framework.yml | 12 ++++++------ .github/workflows/infologger.yml | 4 ++-- .github/workflows/proto-sync.yml | 2 +- .github/workflows/qc.yml | 6 +++--- .github/workflows/release.yml | 4 ++-- 8 files changed, 19 insertions(+), 19 deletions(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 4eaf461c3..ce66b7314 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -24,7 +24,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Initialize CodeQL uses: github/codeql-action/init@v3 diff --git a/.github/workflows/configuration.yml b/.github/workflows/configuration.yml index 499f2d838..3495d4884 100644 --- a/.github/workflows/configuration.yml +++ b/.github/workflows/configuration.yml @@ -15,7 +15,7 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 6 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Setup node uses: actions/setup-node@v4 with: @@ -27,7 +27,7 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 6 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Setup node uses: actions/setup-node@v4 with: diff --git a/.github/workflows/control.yml b/.github/workflows/control.yml index 3a0f00b49..d5f1ffafb 100644 --- a/.github/workflows/control.yml +++ b/.github/workflows/control.yml @@ -15,7 +15,7 @@ jobs: runs-on: macOS-latest timeout-minutes: 6 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Setup node uses: actions/setup-node@v4 with: @@ -27,7 +27,7 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 6 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Setup node uses: actions/setup-node@v4 with: diff --git a/.github/workflows/framework.yml b/.github/workflows/framework.yml index d3bee88d9..66d178972 100644 --- a/.github/workflows/framework.yml +++ b/.github/workflows/framework.yml @@ -15,7 +15,7 @@ jobs: runs-on: macOS-latest timeout-minutes: 6 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Setup node uses: actions/setup-node@v4 with: @@ -28,7 +28,7 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 6 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - uses: actions/setup-node@v4 with: node-version: '22.x' @@ -46,7 +46,7 @@ jobs: runs-on: windows-latest timeout-minutes: 10 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - uses: actions/setup-node@v4 with: node-version: '22.x' @@ -62,7 +62,7 @@ jobs: steps: - name: Run Control tests by using `@aliceo2/web-ui` from local `../Framework` run : (echo "Run Control tests by using @aliceo2/web-ui from local ../Framework";) - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Setup node uses: actions/setup-node@v4 with: @@ -84,7 +84,7 @@ jobs: # steps: # - name: Run QualityControl tests by using `@aliceo2/web-ui` from local `../Framework` # run : (echo "Run QualityControl tests by using @aliceo2/web-ui from local ../Framework";) - # - uses: actions/checkout@v4 + # - uses: actions/checkout@v5 # - name: Setup node # uses: actions/setup-node@v4 # with: @@ -105,7 +105,7 @@ jobs: steps: - name: Run InfoLogger tests by using `@aliceo2/web-ui` from local `../Framework` run : (echo "Run InfoLogger tests by using @aliceo2/web-ui from local ../Framework";) - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Setup node uses: actions/setup-node@v4 with: diff --git a/.github/workflows/infologger.yml b/.github/workflows/infologger.yml index cdeea6697..624469141 100644 --- a/.github/workflows/infologger.yml +++ b/.github/workflows/infologger.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 6 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Setup node uses: actions/setup-node@v4 with: @@ -26,7 +26,7 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 6 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - uses: actions/setup-node@v4 with: node-version: '22.x' diff --git a/.github/workflows/proto-sync.yml b/.github/workflows/proto-sync.yml index a4fa60ac1..b1f71b5df 100644 --- a/.github/workflows/proto-sync.yml +++ b/.github/workflows/proto-sync.yml @@ -12,7 +12,7 @@ jobs: env: GH_TOKEN: ${{ github.token }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: token: ${{ secrets.GITHUB_TOKEN }} - name: Copy new proto file(s) diff --git a/.github/workflows/qc.yml b/.github/workflows/qc.yml index 376e5d5f6..680986e0e 100644 --- a/.github/workflows/qc.yml +++ b/.github/workflows/qc.yml @@ -15,7 +15,7 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 6 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Setup node uses: actions/setup-node@v4 with: @@ -28,7 +28,7 @@ jobs: timeout-minutes: 6 needs: lint-check steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Setup node uses: actions/setup-node@v4 with: @@ -40,7 +40,7 @@ jobs: timeout-minutes: 6 needs: lint-check steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Setup node uses: actions/setup-node@v4 with: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d5b0ddb3e..51f7dba79 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -11,7 +11,7 @@ jobs: VERSION: ${{ steps.set-project.outputs.version }} TAG: ${{ steps.set-project.outputs.tag }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - uses: actions/setup-node@v4 with: node-version: '22.x' @@ -51,7 +51,7 @@ jobs: outputs: ASSET_URL: ${{ steps.upload.outputs.asset_url }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - uses: actions/setup-node@v4 with: node-version: '22.x' From af8b434fc1b9693c482d743646270de25767405f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Sep 2025 09:50:21 +0200 Subject: [PATCH 23/77] Bump google-protobuf from 3.21.0 to 4.0.0 in /Control (#3006) Bumps [google-protobuf](https://github.com/protocolbuffers/protobuf-javascript) from 3.21.0 to 4.0.0. - [Release notes](https://github.com/protocolbuffers/protobuf-javascript/releases) - [Changelog](https://github.com/protocolbuffers/protobuf-javascript/blob/main/protobuf_javascript_release.bzl) - [Commits](https://github.com/protocolbuffers/protobuf-javascript/compare/v3.21.0...v4.0.0) --- updated-dependencies: - dependency-name: google-protobuf dependency-version: 4.0.0 dependency-type: direct:production update-type: version-update:semver-major ... --- Control/package-lock.json | 10 +++++----- Control/package.json | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Control/package-lock.json b/Control/package-lock.json index a9b2456cc..7a0b2c9ce 100644 --- a/Control/package-lock.json +++ b/Control/package-lock.json @@ -17,7 +17,7 @@ "@aliceo2/web-ui": "2.8.4", "@grpc/grpc-js": "1.13.0", "@grpc/proto-loader": "0.8.0", - "google-protobuf": "3.21.0", + "google-protobuf": "4.0.0", "kafkajs": "2.2.4" }, "devDependencies": { @@ -2979,10 +2979,10 @@ } }, "node_modules/google-protobuf": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.0.tgz", - "integrity": "sha512-byR7MBTK4tZ5PZEb+u5ZTzpt4SfrTxv5682MjPlHN16XeqgZE2/8HOIWeiXe8JKnT9OVbtBGhbq8mtvkK8cd5g==", - "license": "BSD-3-Clause" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-4.0.0.tgz", + "integrity": "sha512-b8wmenhUMf2WNL+xIJ/slvD/hEE6V3nRnG86O2bzkBrMweM9gnqZE1dfXlDjibY3aXJXDNbAHepevYyQ7qWKsQ==", + "license": "(BSD-3-Clause AND Apache-2.0)" }, "node_modules/gopd": { "version": "1.2.0", diff --git a/Control/package.json b/Control/package.json index 51401ab59..49d987a6b 100644 --- a/Control/package.json +++ b/Control/package.json @@ -36,7 +36,7 @@ "@aliceo2/web-ui": "2.8.4", "@grpc/grpc-js": "1.13.0", "@grpc/proto-loader": "0.8.0", - "google-protobuf": "3.21.0", + "google-protobuf": "4.0.0", "kafkajs": "2.2.4" }, "devDependencies": { From 6d3d6f2c5fb8133b8387ad9dbe6897db5a6331c5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Sep 2025 18:19:33 +0200 Subject: [PATCH 24/77] Bump the dev-dependencies group across 1 directory with 2 updates (#3037) Bumps the dev-dependencies group with 2 updates in the /Framework directory: [eslint-plugin-jsdoc](https://github.com/gajus/eslint-plugin-jsdoc) and [puppeteer](https://github.com/puppeteer/puppeteer). Updates `eslint-plugin-jsdoc` from 54.1.0 to 54.3.1 - [Release notes](https://github.com/gajus/eslint-plugin-jsdoc/releases) - [Changelog](https://github.com/gajus/eslint-plugin-jsdoc/blob/main/.releaserc) - [Commits](https://github.com/gajus/eslint-plugin-jsdoc/compare/v54.1.0...v54.3.1) Updates `puppeteer` from 24.17.0 to 24.18.0 - [Release notes](https://github.com/puppeteer/puppeteer/releases) - [Changelog](https://github.com/puppeteer/puppeteer/blob/main/CHANGELOG.md) - [Commits](https://github.com/puppeteer/puppeteer/compare/puppeteer-v24.17.0...puppeteer-v24.18.0) --- updated-dependencies: - dependency-name: eslint-plugin-jsdoc dependency-version: 54.3.1 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-dependencies - dependency-name: puppeteer dependency-version: 24.18.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-dependencies ... --- Framework/package-lock.json | 40 ++++++++++++++++++------------------- Framework/package.json | 4 ++-- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/Framework/package-lock.json b/Framework/package-lock.json index 52bf46667..86106bd2e 100644 --- a/Framework/package-lock.json +++ b/Framework/package-lock.json @@ -24,13 +24,13 @@ "@eslint/js": "^9.34.0", "@stylistic/eslint-plugin": "^5.3.1", "eslint": "^9.34.0", - "eslint-plugin-jsdoc": "^54.1.0", + "eslint-plugin-jsdoc": "^54.3.1", "globals": "^16.3.0", "long": "^5.3.1", "mocha": "^11.7.0", "nock": "14.0.0", "nyc": "^17.1.0", - "puppeteer": "^24.17.0", + "puppeteer": "^24.18.0", "sinon": "21.0.0", "supertest": "^7.1.0" }, @@ -1014,9 +1014,9 @@ "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" }, "node_modules/@puppeteer/browsers": { - "version": "2.10.7", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.7.tgz", - "integrity": "sha512-wHWLkQWBjHtajZeqCB74nsa/X70KheyOhySYBRmVQDJiNj0zjZR/naPCvdWjMhcG1LmjaMV/9WtTo5mpe8qWLw==", + "version": "2.10.8", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.8.tgz", + "integrity": "sha512-f02QYEnBDE0p8cteNoPYHHjbDuwyfbe4cCIVlNi8/MRicIxFW4w4CfgU0LNgWEID6s06P+hRJ1qjpBLMhPRCiQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1357,9 +1357,9 @@ "optional": true }, "node_modules/bare-fs": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.2.1.tgz", - "integrity": "sha512-mELROzV0IhqilFgsl1gyp48pnZsaV9xhQapHLDsvn4d4ZTfbFhcghQezl7FTEDNBcGqLUnNI3lUlm6ecrLWdFA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.2.3.tgz", + "integrity": "sha512-1aGs5pRVLToMQ79elP+7cc0u0s/wXAzfBv/7hDloT7WFggLqECCas5qqPky7WHCFdsBH5WDq6sD4fAoz5sJbtA==", "dev": true, "license": "Apache-2.0", "optional": true, @@ -2266,9 +2266,9 @@ } }, "node_modules/eslint-plugin-jsdoc": { - "version": "54.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-54.1.0.tgz", - "integrity": "sha512-tZJuW6s3gtveVsg08IbJgmfgAA1SpSkEz7KjxPEVmyAO4fPlz7zsMHdxjyn+Zku1l+wejr2JUdTFTNirRgHOrQ==", + "version": "54.3.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-54.3.1.tgz", + "integrity": "sha512-6KlEwRCaQfSi1Wsis4cxsqDfOuQDPG56ozSPCkG+N9aISTQpahbo2n0YZs6c7CIVXQzVdYSxuvQ6w31rfeiMhw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -4679,18 +4679,18 @@ } }, "node_modules/puppeteer": { - "version": "24.17.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.17.0.tgz", - "integrity": "sha512-CGrmJ8WgilK3nyE73k+pbxHggETPpEvL6AQ9H5JSK1RgZRGMQVJ+iO3MocGm9yBQXQJ9U5xijyLvkYXFeb0/+g==", + "version": "24.18.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.18.0.tgz", + "integrity": "sha512-Ke8oL/87GhzKIM2Ag6Yj49t5xbGc4rspGIuSuFLFCQBtYzWqCSanvqoCu08WkI78rbqcwnHjxiTH6oDlYFrjrw==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@puppeteer/browsers": "2.10.7", + "@puppeteer/browsers": "2.10.8", "chromium-bidi": "8.0.0", "cosmiconfig": "^9.0.0", "devtools-protocol": "0.0.1475386", - "puppeteer-core": "24.17.0", + "puppeteer-core": "24.18.0", "typed-query-selector": "^2.12.0" }, "bin": { @@ -4701,13 +4701,13 @@ } }, "node_modules/puppeteer-core": { - "version": "24.17.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.17.0.tgz", - "integrity": "sha512-RYOBKFiF+3RdwIZTEacqNpD567gaFcBAOKTT7742FdB1icXudrPI7BlZbYTYWK2wgGQUXt9Zi1Yn+D5PmCs4CA==", + "version": "24.18.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.18.0.tgz", + "integrity": "sha512-As0BvfXxek2MbV0m7iqBmQKFnfSrzSvTM4zGipjd4cL+9f2Ccgut6RvHlc8+qBieKHqCMFy9BSI4QyveoYXTug==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@puppeteer/browsers": "2.10.7", + "@puppeteer/browsers": "2.10.8", "chromium-bidi": "8.0.0", "debug": "^4.4.1", "devtools-protocol": "0.0.1475386", diff --git a/Framework/package.json b/Framework/package.json index 9380c7c90..6f1d5d33d 100644 --- a/Framework/package.json +++ b/Framework/package.json @@ -46,12 +46,12 @@ "@eslint/js": "^9.34.0", "@stylistic/eslint-plugin": "^5.3.1", "eslint": "^9.34.0", - "eslint-plugin-jsdoc": "^54.1.0", + "eslint-plugin-jsdoc": "^54.3.1", "globals": "^16.3.0", "mocha": "^11.7.0", "nock": "14.0.0", "nyc": "^17.1.0", - "puppeteer": "^24.17.0", + "puppeteer": "^24.18.0", "sinon": "21.0.0", "supertest": "^7.1.0", "long": "^5.3.1" From c53039e1a543ecf34a648fa67a3fe5cc90a4a060 Mon Sep 17 00:00:00 2001 From: Alejandro Mariscal Romero <87366244+mariscalromeroalejandro@users.noreply.github.com> Date: Fri, 5 Sep 2025 09:16:15 +0200 Subject: [PATCH 25/77] [OGUI-1722] Runs mode backend: adapt for frontend support (#3022) This PR updates the backend to support the frontend in utilizing the `Runs Mode` functionality. Changes include: - Added a new endpoint to fetch the status of runs by providing the run number. - Implemented middlewares for validation in controllers when a run number is provided. - Updated tests to cover the new endpoint and validation logic. --- .../common/library/runStatus.enum.js | 1 + QualityControl/lib/api.js | 14 +- .../lib/controllers/FilterController.js | 24 +++ .../lib/controllers/ObjectController.js | 19 +-- .../lib/dtos/filters/RunNumberDto.js | 28 +++ .../middleware/filters/runMode.middleware.js | 43 +++++ .../filters/runStatusFilter.middleware.js | 39 +++++ QualityControl/lib/services/FilterService.js | 29 +++- QualityControl/lib/services/RunModeService.js | 3 +- .../api/filters/api-get-run-status.test.js | 72 ++++++++ .../lib/controllers/FiltersController.test.js | 78 +++++++++ .../lib/controllers/ObjectController.test.js | 29 +--- .../filters/runMode.middleware.test.js | 144 ++++++++++++++++ .../runStatusFilter.middleware.test.js | 160 ++++++++++++++++++ .../test/lib/services/FilterService.test.js | 68 ++++++++ .../test/lib/services/RunModeService.test.js | 3 - QualityControl/test/test-index.js | 6 + 17 files changed, 709 insertions(+), 51 deletions(-) create mode 100644 QualityControl/lib/dtos/filters/RunNumberDto.js create mode 100644 QualityControl/lib/middleware/filters/runMode.middleware.js create mode 100644 QualityControl/lib/middleware/filters/runStatusFilter.middleware.js create mode 100644 QualityControl/test/api/filters/api-get-run-status.test.js create mode 100644 QualityControl/test/lib/middlewares/filters/runMode.middleware.test.js create mode 100644 QualityControl/test/lib/middlewares/filters/runStatusFilter.middleware.test.js diff --git a/QualityControl/common/library/runStatus.enum.js b/QualityControl/common/library/runStatus.enum.js index 5048acc1e..4ed34f412 100644 --- a/QualityControl/common/library/runStatus.enum.js +++ b/QualityControl/common/library/runStatus.enum.js @@ -16,4 +16,5 @@ export const RunStatus = Object.freeze({ ENDED: 'ENDED', ONGOING: 'ONGOING', NOT_FOUND: 'NOT_FOUND', + UNKNOWN: 'UNKNOWN', }); diff --git a/QualityControl/lib/api.js b/QualityControl/lib/api.js index 3ad304198..541b3137d 100644 --- a/QualityControl/lib/api.js +++ b/QualityControl/lib/api.js @@ -19,6 +19,8 @@ import { layoutOwnerMiddleware } from './middleware/layouts/layoutOwner.middlewa import { layoutIdMiddleware } from './middleware/layouts/layoutId.middleware.js'; import { layoutServiceMiddleware } from './middleware/layouts/layoutService.middleware.js'; import { statusComponentMiddleware } from './middleware/status/statusComponent.middleware.js'; +import { runStatusFilterMiddleware } from './middleware/filters/runStatusFilter.middleware.js'; +import { runModeMiddleware } from './middleware/filters/runMode.middleware.js'; /** * Adds paths and binds websocket to instance of HttpServer passed @@ -55,7 +57,12 @@ export const setup = (http, ws) => { http.get('/object/:id', objectGetByIdValidation, objectController.getObjectById.bind(objectController)); http.get('/object', objectGetContentsValidation, objectController.getObjectContent.bind(objectController)); - http.get('/objects', objectsGetValidation, objectController.getObjects.bind(objectController), { public: true }); + http.get( + '/objects', + objectsGetValidation, + runModeMiddleware, + objectController.getObjects.bind(objectController), + ); http.get('/layouts', layoutController.getLayoutsHandler.bind(layoutController)); http.get('/layout/:id', layoutController.getLayoutHandler.bind(layoutController)); @@ -94,4 +101,9 @@ export const setup = (http, ws) => { http.get('/checkUser', userController.addUserHandler.bind(userController)); http.get('/filter/configuration', filterController.getFilterConfigurationHandler.bind(filterController)); + http.get( + '/filter/run-status/:runNumber', + runStatusFilterMiddleware, + filterController.getRunStatusHandler.bind(filterController), + ); }; diff --git a/QualityControl/lib/controllers/FilterController.js b/QualityControl/lib/controllers/FilterController.js index 48ffd8e6c..f4178c3b9 100644 --- a/QualityControl/lib/controllers/FilterController.js +++ b/QualityControl/lib/controllers/FilterController.js @@ -12,6 +12,12 @@ * or submit itself to any jurisdiction. */ +import { + LogManager, + updateAndSendExpressResponseFromNativeError, +} + from '@aliceo2/web-ui'; + /** * Gateaway class to be used to retrieve data with regard to filters */ @@ -25,6 +31,24 @@ export class FilterController { * @type {FilterService} */ this._filterService = filterService; + this._logger = LogManager.getLogger(`${process.env.npm_config_log_label ?? 'qcg'}/filter-ctrl`); + } + + /** + * HTTP GET endpoint for retrieving the status of a run from Bookkeeping + * @param {Request} req - HTTP request + * @param {Response} res - HTTP response to provide run status information + */ + async getRunStatusHandler(req, res) { + try { + const runStatus = await this._filterService.getRunStatus(req.params.runNumber); + res.status(200).json({ + runStatus: runStatus, + }); + } catch (error) { + this._logger.errorMessage('Error getting run status:', error); + updateAndSendExpressResponseFromNativeError(res, error); + } } /** diff --git a/QualityControl/lib/controllers/ObjectController.js b/QualityControl/lib/controllers/ObjectController.js index d64327e75..022c334e2 100644 --- a/QualityControl/lib/controllers/ObjectController.js +++ b/QualityControl/lib/controllers/ObjectController.js @@ -12,7 +12,7 @@ * or submit itself to any jurisdiction. */ 'use strict'; -import { InvalidInputError, LogManager, updateAndSendExpressResponseFromNativeError } from '@aliceo2/web-ui'; +import { LogManager, updateAndSendExpressResponseFromNativeError } from '@aliceo2/web-ui'; /** * Gateway for all QC Objects requests @@ -48,19 +48,10 @@ export class ObjectController { try { const { prefix, fields, filters = {}, inRunMode = false } = req.query; - const { RunNumber: runNumber } = filters; - const parsedRunNumber = parseInt(runNumber, 10); - - if (inRunMode && (!runNumber || isNaN(parsedRunNumber))) { - return updateAndSendExpressResponseFromNativeError( - res, - new InvalidInputError(!runNumber - ? 'RunNumber is required when in run mode' - : 'RunNumber must be a number'), - ); - } else if (inRunMode && runNumber && !isNaN(parsedRunNumber)) { - const { paths, runStatus } = await this._runModeService.retrievePathsAndSetRunStatus(parsedRunNumber, prefix); - return res.status(200).json({ paths, runStatus }); + if (inRunMode) { + const runNumber = filters?.RunNumber; + const { paths } = await this._runModeService.retrievePathsAndSetRunStatus(runNumber); + return res.status(200).json({ paths }); } const objectsData = await this._objService.retrieveLatestVersionOfObjects({ diff --git a/QualityControl/lib/dtos/filters/RunNumberDto.js b/QualityControl/lib/dtos/filters/RunNumberDto.js new file mode 100644 index 000000000..02f3d8923 --- /dev/null +++ b/QualityControl/lib/dtos/filters/RunNumberDto.js @@ -0,0 +1,28 @@ +/** + * @license + * Copyright 2019-2020 CERN and copyright holders of ALICE O2. + * See http://alice-o2.web.cern.ch/copyright for details of the copyright holders. + * All rights not expressly granted are reserved. + * + * This software is distributed under the terms of the GNU General Public + * License v3 (GPL Version 3), copied verbatim in the file "COPYING". + * + * In applying this license CERN does not waive the privileges and immunities + * granted to it by virtue of its status as an Intergovernmental Organization + * or submit itself to any jurisdiction. + */ + +import Joi from 'joi'; + +export const RunNumberDto = Joi.number() + .required() + .integer() + .min(0) + .max(999999) + .messages({ + 'any.required': 'Run number is required', + 'number.base': 'Run number must be a number', + 'number.integer': 'Run number must be an integer', + 'number.min': 'Run number must be positive', + 'number.max': 'Run number must not exceed 999999', + }); diff --git a/QualityControl/lib/middleware/filters/runMode.middleware.js b/QualityControl/lib/middleware/filters/runMode.middleware.js new file mode 100644 index 000000000..f012a3c6e --- /dev/null +++ b/QualityControl/lib/middleware/filters/runMode.middleware.js @@ -0,0 +1,43 @@ +/** + * @license + * Copyright 2019-2020 CERN and copyright holders of ALICE O2. + * See http://alice-o2.web.cern.ch/copyright for details of the copyright holders. + * All rights not expressly granted are reserved. + * + * This software is distributed under the terms of the GNU General Public + * License v3 (GPL Version 3), copied verbatim in the file "COPYING". + * + * In applying this license CERN does not waive the privileges and immunities + * granted to it by virtue of its status as an Intergovernmental Organization + * or submit itself to any jurisdiction. + */ + +import { InvalidInputError, updateAndSendExpressResponseFromNativeError } from '@aliceo2/web-ui'; +import { RunNumberDto } from '../../dtos/filters/RunNumberDto.js'; + +/** + * Middleware function to validate the run number if in run mode. + * @param {object} req - The request object. + * @param {object} res - The response object. + * @param {Function} next - The next middleware function in the stack. + * @returns {Promise} + */ +export const runModeMiddleware = async (req, res, next) => { + const { inRunMode = false, filters = {} } = req.query; + if (!inRunMode) { + next(); + return; + } + try { + const validatedRunNumber = await RunNumberDto.validateAsync(filters?.RunNumber); + req.query.filters = { ...filters, RunNumber: validatedRunNumber }; + next(); + } catch (error) { + updateAndSendExpressResponseFromNativeError( + res, + error.isJoi + ? new InvalidInputError(error.details[0].message) + : error, + ); + } +}; diff --git a/QualityControl/lib/middleware/filters/runStatusFilter.middleware.js b/QualityControl/lib/middleware/filters/runStatusFilter.middleware.js new file mode 100644 index 000000000..9b18170f2 --- /dev/null +++ b/QualityControl/lib/middleware/filters/runStatusFilter.middleware.js @@ -0,0 +1,39 @@ +/** + * @license + * Copyright 2019-2020 CERN and copyright holders of ALICE O2. + * See http://alice-o2.web.cern.ch/copyright for details of the copyright holders. + * All rights not expressly granted are reserved. + * + * This software is distributed under the terms of the GNU General Public + * License v3 (GPL Version 3), copied verbatim in the file "COPYING". + * + * In applying this license CERN does not waive the privileges and immunities + * granted to it by virtue of its status as an Intergovernmental Organization + * or submit itself to any jurisdiction. + */ + +import { InvalidInputError, updateAndSendExpressResponseFromNativeError } from '@aliceo2/web-ui'; +import { RunNumberDto } from '../../dtos/filters/RunNumberDto.js'; + +/** + * Middleware function to validate the run number and attach it to the request object. +f + * @param {object} req - The request object. + * @param {object} res - The response object. + * @param {Function} next - The next middleware function in the stack. + * @returns {Promise} + */ +export const runStatusFilterMiddleware = async (req, res, next) => { + try { + const validatedRunNumber = await RunNumberDto.validateAsync(req.params.runNumber); + req.params.runNumber = validatedRunNumber; + next(); + } catch (error) { + updateAndSendExpressResponseFromNativeError( + res, + error.isJoi + ? new InvalidInputError(error.details[0].message) + : error, + ); + } +}; diff --git a/QualityControl/lib/services/FilterService.js b/QualityControl/lib/services/FilterService.js index 36a0042b7..c5778f148 100644 --- a/QualityControl/lib/services/FilterService.js +++ b/QualityControl/lib/services/FilterService.js @@ -13,7 +13,8 @@ */ import { LogManager } from '@aliceo2/web-ui'; -const logger = LogManager.getLogger('filter/service'); +import { RunStatus } from '../../common/library/runStatus.enum.js'; +const LOG_FACILITY = `${process.env.npm_config_log_label ?? 'qcg'}/filter-svc`; /** * High level service that composes, processes and maps data from the bookkeeping service @@ -25,6 +26,7 @@ export class FilterService { * @param {object} config - Config object file that defines the refresh intervals for checking run status and runtypes */ constructor(bookkeepingService, config) { + this._logger = LogManager.getLogger(LOG_FACILITY); this._bookkeepingService = bookkeepingService; this._runTypes = []; @@ -32,7 +34,7 @@ export class FilterService { (config?.bookkeeping ? 24 * 60 * 60 * 1000 : -1); this.initFilters().catch((error) => { - logger.errorMessage(`FilterService initialization failed: ${error.message || error}`); + this._logger.errorMessage(`FilterService initialization failed: ${error.message || error}`); }); } @@ -61,7 +63,7 @@ export class FilterService { } this._runTypes.sort(); } catch (error) { - logger.errorMessage(`Error while retrieving run types: ${error.message || error}`); + this._logger.errorMessage(`Error while retrieving run types: ${error.message || error}`); this._runTypes = []; } } @@ -81,4 +83,25 @@ export class FilterService { get runTypes() { return [...this._runTypes]; } + + /** + * This method is used to retrieve the run status from the bookkeeping service + * @param {number} runNumber - run number to retrieve the status for + * @returns {Promise} - resolves with the run status + */ + async getRunStatus(runNumber) { + try { + const runStatus = await this._bookkeepingService.retrieveRunStatus(runNumber); + + if (!runStatus || !Object.values(RunStatus).includes(runStatus)) { + this._logger.warnMessage(`Invalid run status received for run ${runNumber}: ${runStatus}`); + return RunStatus.UNKNOWN; + } + return runStatus; + } catch (error) { + const message = `Error while retrieving run status for run ${runNumber}: ${error.message || error}`; + this._logger.errorMessage(message); + return RunStatus.UNKNOWN; + } + } } diff --git a/QualityControl/lib/services/RunModeService.js b/QualityControl/lib/services/RunModeService.js index f1ed6f7c5..354dc91d0 100644 --- a/QualityControl/lib/services/RunModeService.js +++ b/QualityControl/lib/services/RunModeService.js @@ -54,7 +54,7 @@ export class RunModeService { async retrievePathsAndSetRunStatus(runNumber) { if (this._ongoingRuns.has(runNumber)) { const cachedPaths = parseObjects(this._ongoingRuns.get(runNumber), QCObjectDto); - return { paths: cachedPaths, runStatus: RunStatus.ONGOING }; + return { paths: cachedPaths }; } const runStatus = await this._bookkeepingService.retrieveRunStatus(runNumber); @@ -70,7 +70,6 @@ export class RunModeService { return { paths: parsedPaths, - runStatus, }; } diff --git a/QualityControl/test/api/filters/api-get-run-status.test.js b/QualityControl/test/api/filters/api-get-run-status.test.js new file mode 100644 index 000000000..c5fc67343 --- /dev/null +++ b/QualityControl/test/api/filters/api-get-run-status.test.js @@ -0,0 +1,72 @@ +/** + * @license + * Copyright 2019-2020 CERN and copyright holders of ALICE O2. + * See http://alice-o2.web.cern.ch/copyright for details of the copyright holders. + * All rights not expressly granted are reserved. + * + * This software is distributed under the terms of the GNU General Public + * License v3 (GPL Version 3), copied verbatim in the file "COPYING". + * + * In applying this license CERN does not waive the privileges and immunities + * granted to it by virtue of its status as an Intergovernmental Organization + * or submit itself to any jurisdiction. + */ + +import { suite, test } from 'node:test'; +import { URL_ADDRESS, OWNER_TEST_TOKEN } from '../config.js'; +import request from 'supertest'; + +export const apiGetRunStatusTests = () => { + suite('GET /filter/run-status/:runNumber', () => { + test('should return a 403 error if no authentication token is provided', async () => { + await request(`${URL_ADDRESS}/api/filter/run-status/123456`) + .get('') + .expect(403); + }); + + test('should return a 404 error if run number is not provided', async () => { + await request(`${URL_ADDRESS}/api/filter/run-status/`) + .get(`?token=${OWNER_TEST_TOKEN}`) + .expect(404, { + error: '404 - Page not found', + message: 'The requested URL was not found on this server.', + }); + }); + + test('should return a 400 error for invalid run number (negative)', async () => { + await request(`${URL_ADDRESS}/api/filter/run-status/-1`) + .get(`?token=${OWNER_TEST_TOKEN}`) + .expect(400, { + message: 'Run number must be positive', + status: 400, + title: 'Invalid Input', + }); + }); + + test('should return a 400 error for invalid run number (too large)', async () => { + await request(`${URL_ADDRESS}/api/filter/run-status/1000000`) + .get(`?token=${OWNER_TEST_TOKEN}`) + .expect(400, { + message: 'Run number must not exceed 999999', + status: 400, + title: 'Invalid Input', + }); + }); + + test('should return a 400 error for invalid run number (not a number)', async () => { + await request(`${URL_ADDRESS}/api/filter/run-status/invalid`) + .get(`?token=${OWNER_TEST_TOKEN}`) + .expect(400, { + message: 'Run number must be a number', + status: 400, + title: 'Invalid Input', + }); + }); + + test('should successfully get run status for valid run number', async () => { + await request(`${URL_ADDRESS}/api/filter/run-status/123456`) + .get(`?token=${OWNER_TEST_TOKEN}`) + .expect(200); + }); + }); +}; diff --git a/QualityControl/test/lib/controllers/FiltersController.test.js b/QualityControl/test/lib/controllers/FiltersController.test.js index 030e5648e..004a9e0b6 100644 --- a/QualityControl/test/lib/controllers/FiltersController.test.js +++ b/QualityControl/test/lib/controllers/FiltersController.test.js @@ -17,6 +17,7 @@ import { suite, test } from 'node:test'; import { FilterController } from '../../../lib/controllers/FilterController.js'; import sinon from 'sinon'; import { FilterService } from '../../../lib/services/FilterService.js'; +import { RunStatus } from '../../../common/library/runStatus.enum.js'; const VALID_CONFIG = { bookkeeping: { url: 'http://localhost:4000', @@ -68,4 +69,81 @@ export const filtersControllerTestSuite = async () => { ); }); }); + + suite('getRunStatusHandler', async () => { + test('should successfully retrieve run status from FilterService', async () => { + const filterService = sinon.createStubInstance(FilterService); + filterService.getRunStatus.resolves(RunStatus.ONGOING); + + const req = { + params: { + runNumber: 123456, + }, + }; + const res = { + status: sinon.stub().returnsThis(), + json: sinon.stub(), + }; + + const filterController = new FilterController(filterService); + await filterController.getRunStatusHandler(req, res); + + ok(filterService.getRunStatus.calledWith(123456), 'FilterService.getRunStatus should be called with run number'); + ok(res.status.calledWith(200), 'Response status should be 200'); + ok(res.json.calledWith({ + runStatus: RunStatus.ONGOING, + }), 'Response should contain the run status'); + }); + + test('should handle errors from FilterService and send error response', async () => { + const filterService = sinon.createStubInstance(FilterService); + const testError = new Error('Bookkeeping service unavailable'); + filterService.getRunStatus.rejects(testError); + + const req = { + params: { + runNumber: 123456, + }, + }; + const res = { + status: sinon.stub().returnsThis(), + json: sinon.stub(), + }; + + const filterController = new FilterController(filterService); + await filterController.getRunStatusHandler(req, res); + + ok(filterService.getRunStatus.calledWith(123456), 'FilterService.getRunStatus should be called with run number'); + ok(res.status.calledWith(500), 'Response status should be 500 for service errors'); + ok(res.json.calledWithMatch({ + message: 'Bookkeeping service unavailable', + status: 500, + title: 'Unknown Error', + }), 'Response should contain error details'); + }); + + test('should return UNKNOWN status when FilterService returns invalid status', async () => { + const filterService = sinon.createStubInstance(FilterService); + filterService.getRunStatus.resolves('UNKNOWN'); + + const req = { + params: { + runNumber: 999999, + }, + }; + const res = { + status: sinon.stub().returnsThis(), + json: sinon.stub(), + }; + + const filterController = new FilterController(filterService); + await filterController.getRunStatusHandler(req, res); + + ok(filterService.getRunStatus.calledWith(999999), 'FilterService.getRunStatus should be called with run number'); + ok(res.status.calledWith(200), 'Response status should be 200'); + ok(res.json.calledWith({ + runStatus: RunStatus.UNKNOWN, + }), 'Response should contain UNKNOWN status'); + }); + }); }; diff --git a/QualityControl/test/lib/controllers/ObjectController.test.js b/QualityControl/test/lib/controllers/ObjectController.test.js index 02fd4cf7a..d3bbdb04f 100644 --- a/QualityControl/test/lib/controllers/ObjectController.test.js +++ b/QualityControl/test/lib/controllers/ObjectController.test.js @@ -56,46 +56,19 @@ export const objectControllerTestSuite = async () => { { objectName: 'object2', path: 'qc/path/object2' }, ]; - test('should return an invalid input error if no run number is provided in run mode', async () => { - reqMock.query.inRunMode = true; - reqMock.query.filters = {}; - await objectController.getObjects(reqMock, resMock); - ok(resMock.status.calledWith(400)); - ok(resMock.json.calledWithMatch({ - message: 'RunNumber is required when in run mode', - status: 400, - title: 'Invalid Input', - })); - }); - - test('should return an invalid input error if run number is not a number in run mode', async () => { - reqMock.query.inRunMode = true; - reqMock.query.filters = { RunNumber: 'abc' }; - await objectController.getObjects(reqMock, resMock); - ok(resMock.status.calledWith(400)); - ok(resMock.json.calledWithMatch({ - message: 'RunNumber must be a number', - status: 400, - title: 'Invalid Input', - })); - }); - - test('should retrieve paths and set run status in run mode with run number', async () => { reqMock.query.inRunMode = true; reqMock.query.filters = { RunNumber: 123 }; RunMonitoringServiceMock.retrievePathsAndSetRunStatus.resolves({ paths: mockObjectsList, - runStatus: 'ONGOING', }); await objectController.getObjects(reqMock, resMock); - ok(RunMonitoringServiceMock.retrievePathsAndSetRunStatus.calledWith(123, undefined)); + ok(RunMonitoringServiceMock.retrievePathsAndSetRunStatus.calledWith(123)); ok(resMock.status.calledWith(200)); ok(resMock.json.calledWith({ paths: mockObjectsList, - runStatus: 'ONGOING', })); }); diff --git a/QualityControl/test/lib/middlewares/filters/runMode.middleware.test.js b/QualityControl/test/lib/middlewares/filters/runMode.middleware.test.js new file mode 100644 index 000000000..dfc6d6ac2 --- /dev/null +++ b/QualityControl/test/lib/middlewares/filters/runMode.middleware.test.js @@ -0,0 +1,144 @@ +/** + * @license + * Copyright 2019-2020 CERN and copyright holders of ALICE O2. + * See http://alice-o2.web.cern.ch/copyright for details of the copyright holders. + * All rights not expressly granted are reserved. + * + * This software is distributed under the terms of the GNU General Public + * License v3 (GPL Version 3), copied verbatim in the file "COPYING". + * + * In applying this license CERN does not waive the privileges and immunities + * granted to it by virtue of its status as an Intergovernmental Organization + * or submit itself to any jurisdiction. + */ + +import { suite, test } from 'node:test'; +import { ok } from 'node:assert'; +import sinon from 'sinon'; +import { runModeMiddleware } from '../../../../lib/middleware/filters/runMode.middleware.js'; + +/** + * Test suite for the run mode middleware that validates run numbers when in run mode + */ +export const runModeMiddlewareTest = () => { + suite('Run mode middleware', () => { + test('should call next() immediately if not in run mode', async () => { + const req = { + query: { + inRunMode: false, + }, + }; + const res = {}; + const next = sinon.stub(); + + await runModeMiddleware(req, res, next); + + ok(next.calledOnce, 'next() should be called once'); + }); + + test('should call next() immediately if inRunMode is not provided', async () => { + const req = { + query: {}, + }; + const res = {}; + const next = sinon.stub(); + + await runModeMiddleware(req, res, next); + + ok(next.calledOnce, 'next() should be called once'); + }); + + test('should return 400 error if in run mode but RunNumber filter is invalid', async () => { + const req = { + query: { + inRunMode: true, + filters: { + RunNumber: 'invalid', + }, + }, + }; + const res = { + status: sinon.stub().returnsThis(), + json: sinon.stub(), + }; + const next = sinon.stub(); + + await runModeMiddleware(req, res, next); + + ok(res.status.calledWith(400), 'Status should be 400'); + ok(res.json.calledWith({ + message: 'Run number must be a number', + status: 400, + title: 'Invalid Input', + }), 'Should return validation error message'); + ok(!next.called, 'next() should not be called'); + }); + + test('should return 400 error if in run mode but RunNumber is negative', async () => { + const req = { + query: { + inRunMode: true, + filters: { + RunNumber: -1, + }, + }, + }; + const res = { + status: sinon.stub().returnsThis(), + json: sinon.stub(), + }; + const next = sinon.stub(); + + await runModeMiddleware(req, res, next); + + ok(res.status.calledWith(400), 'Status should be 400'); + ok(res.json.calledWith({ + message: 'Run number must be positive', + status: 400, + title: 'Invalid Input', + }), 'Should return validation error message'); + ok(!next.called, 'next() should not be called'); + }); + + test('should successfully validate and parse RunNumber when in run mode', async () => { + const req = { + query: { + inRunMode: true, + filters: { + RunNumber: '123456', + }, + }, + }; + const res = {}; + const next = sinon.stub(); + + await runModeMiddleware(req, res, next); + + ok(req.query.filters.RunNumber === 123456, 'RunNumber should be parsed to integer'); + ok(next.calledOnce, 'next() should be called once'); + }); + + test('should handle missing filters object when in run mode', async () => { + const req = { + query: { + inRunMode: true, + }, + }; + const res = { + status: sinon.stub().returnsThis(), + json: sinon.stub(), + }; + const next = sinon.stub(); + + await runModeMiddleware(req, res, next); + + ok(res.status.calledWith(400), 'Status should be 400'); + ok(res.json.calledWith({ + message: 'Run number is required', + status: 400, + title: 'Invalid Input', + }), 'Should return validation error message'); + ok(!next.called, 'next() should not be called'); + }); + }); +}; diff --git a/QualityControl/test/lib/middlewares/filters/runStatusFilter.middleware.test.js b/QualityControl/test/lib/middlewares/filters/runStatusFilter.middleware.test.js new file mode 100644 index 000000000..7cd72cf14 --- /dev/null +++ b/QualityControl/test/lib/middlewares/filters/runStatusFilter.middleware.test.js @@ -0,0 +1,160 @@ +/** + * @license + * Copyright 2019-2020 CERN and copyright holders of ALICE O2. + * See http://alice-o2.web.cern.ch/copyright for details of the copyright holders. + * All rights not expressly granted are reserved. + * + * This software is distributed under the terms of the GNU General Public + * License v3 (GPL Version 3), copied verbatim in the file "COPYING". + * + * In applying this license CERN does not waive the privileges and immunities + * granted to it by virtue of its status as an Intergovernmental Organization + * or submit itself to any jurisdiction. + */ + +import { suite, test } from 'node:test'; +import { ok } from 'node:assert'; +import sinon from 'sinon'; +import { runStatusFilterMiddleware } from '../../../../lib/middleware/filters/runStatusFilter.middleware.js'; + +/** + * Test suite for the run status middleware that validates run numbers from URL parameters + */ +export const runStatusFilterMiddlewareTest = () => { + suite('Run status middleware', () => { + test('should return 400 error if run number parameter is missing', async () => { + const req = { + params: {}, + }; + const res = { + status: sinon.stub().returnsThis(), + json: sinon.stub(), + }; + const next = sinon.stub(); + + await runStatusFilterMiddleware(req, res, next); + + ok(res.status.calledWith(400), 'Status should be 400'); + ok(res.json.calledWith({ + message: 'Run number is required', + status: 400, + title: 'Invalid Input', + }), 'Should return validation error message'); + ok(!next.called, 'next() should not be called'); + }); + + test('should return 400 error if run number is not a valid number', async () => { + const req = { + params: { + runNumber: 'invalid', + }, + }; + const res = { + status: sinon.stub().returnsThis(), + json: sinon.stub(), + }; + const next = sinon.stub(); + + await runStatusFilterMiddleware(req, res, next); + + ok(res.status.calledWith(400), 'Status should be 400'); + ok(res.json.calledWith({ + message: 'Run number must be a number', + status: 400, + title: 'Invalid Input', + }), 'Should return validation error message'); + ok(!next.called, 'next() should not be called'); + }); + + test('should return 400 error if run number is negative', async () => { + const req = { + params: { + runNumber: '-1', + }, + }; + const res = { + status: sinon.stub().returnsThis(), + json: sinon.stub(), + }; + const next = sinon.stub(); + + await runStatusFilterMiddleware(req, res, next); + + ok(res.status.calledWith(400), 'Status should be 400'); + ok(res.json.calledWith({ + message: 'Run number must be positive', + status: 400, + title: 'Invalid Input', + }), 'Should return validation error message'); + ok(!next.called, 'next() should not be called'); + }); + + test('should return 400 error if run number exceeds maximum value', async () => { + const req = { + params: { + runNumber: '1000000', + }, + }; + const res = { + status: sinon.stub().returnsThis(), + json: sinon.stub(), + }; + const next = sinon.stub(); + + await runStatusFilterMiddleware(req, res, next); + + ok(res.status.calledWith(400), 'Status should be 400'); + ok(res.json.calledWith({ + message: 'Run number must not exceed 999999', + status: 400, + title: 'Invalid Input', + }), 'Should return validation error message'); + ok(!next.called, 'next() should not be called'); + }); + + test('should successfully validate and attach run number to request', async () => { + const req = { + params: { + runNumber: '123456', + }, + }; + const res = {}; + const next = sinon.stub(); + + await runStatusFilterMiddleware(req, res, next); + + ok(req.params.runNumber === 123456, 'Run number should be parsed and attached to request'); + ok(next.calledOnce, 'next() should be called once'); + }); + + test('should handle numeric run number parameter', async () => { + const req = { + params: { + runNumber: 654321, + }, + }; + const res = {}; + const next = sinon.stub(); + + await runStatusFilterMiddleware(req, res, next); + + ok(req.params.runNumber === 654321, 'Numeric run number should be validated and attached'); + ok(next.calledOnce, 'next() should be called once'); + }); + + test('should validate run number at boundary values', async () => { + const req = { + params: { + runNumber: '999999', + }, + }; + const res = {}; + const next = sinon.stub(); + + await runStatusFilterMiddleware(req, res, next); + + ok(req.params.runNumber === 999999, 'Maximum valid run number should be accepted'); + ok(next.calledOnce, 'next() should be called once'); + }); + }); +}; diff --git a/QualityControl/test/lib/services/FilterService.test.js b/QualityControl/test/lib/services/FilterService.test.js index 940de044f..0df1af87a 100644 --- a/QualityControl/test/lib/services/FilterService.test.js +++ b/QualityControl/test/lib/services/FilterService.test.js @@ -15,6 +15,7 @@ import { deepStrictEqual } from 'node:assert'; import { suite, test, beforeEach, afterEach } from 'node:test'; import { FilterService } from '../../../lib/services/FilterService.js'; +import { RunStatus } from '../../../common/library/runStatus.enum.js'; import { stub, restore } from 'sinon'; export const filterServiceTestSuite = async () => { @@ -30,6 +31,7 @@ export const filterServiceTestSuite = async () => { bookkeepingServiceMock = { connect: stub(), retrieveRunTypes: stub(), + retrieveRunStatus: stub(), active: true, // assume the bookkeeping service is active by default }; filterService = new FilterService(bookkeepingServiceMock, configMock); @@ -114,4 +116,70 @@ export const filterServiceTestSuite = async () => { deepStrictEqual(filterService.runTypes, []); }); }); + + suite('getRunStatus', async () => { + test('should return run status from bookkeeping service when valid', async () => { + bookkeepingServiceMock.retrieveRunStatus.resolves(RunStatus.ONGOING); + + const result = await filterService.getRunStatus(123456); + + deepStrictEqual(bookkeepingServiceMock.retrieveRunStatus.calledWith(123456), true); + deepStrictEqual(result, RunStatus.ONGOING); + }); + + test('should return ENDED status from bookkeeping service', async () => { + bookkeepingServiceMock.retrieveRunStatus.resolves(RunStatus.ENDED); + + const result = await filterService.getRunStatus(789012); + + deepStrictEqual(bookkeepingServiceMock.retrieveRunStatus.calledWith(789012), true); + deepStrictEqual(result, RunStatus.ENDED); + }); + + test('should return NOT_FOUND status from bookkeeping service', async () => { + bookkeepingServiceMock.retrieveRunStatus.resolves(RunStatus.NOT_FOUND); + + const result = await filterService.getRunStatus(345678); + + deepStrictEqual(bookkeepingServiceMock.retrieveRunStatus.calledWith(345678), true); + deepStrictEqual(result, RunStatus.NOT_FOUND); + }); + + test('should return UNKNOWN when bookkeeping service returns null', async () => { + bookkeepingServiceMock.retrieveRunStatus.resolves(null); + + const result = await filterService.getRunStatus(123456); + + deepStrictEqual(bookkeepingServiceMock.retrieveRunStatus.calledWith(123456), true); + deepStrictEqual(result, RunStatus.UNKNOWN); + }); + + test('should return UNKNOWN when bookkeeping service returns undefined', async () => { + bookkeepingServiceMock.retrieveRunStatus.resolves(undefined); + + const result = await filterService.getRunStatus(123456); + + deepStrictEqual(bookkeepingServiceMock.retrieveRunStatus.calledWith(123456), true); + deepStrictEqual(result, RunStatus.UNKNOWN); + }); + + test('should return UNKNOWN when bookkeeping service returns invalid status', async () => { + bookkeepingServiceMock.retrieveRunStatus.resolves('INVALID_STATUS'); + + const result = await filterService.getRunStatus(123456); + + deepStrictEqual(bookkeepingServiceMock.retrieveRunStatus.calledWith(123456), true); + deepStrictEqual(result, RunStatus.UNKNOWN); + }); + + test('should return UNKNOWN when bookkeeping service throws error', async () => { + const testError = new Error('Bookkeeping service unavailable'); + bookkeepingServiceMock.retrieveRunStatus.rejects(testError); + + const result = await filterService.getRunStatus(123456); + + deepStrictEqual(bookkeepingServiceMock.retrieveRunStatus.calledWith(123456), true); + deepStrictEqual(result, RunStatus.UNKNOWN); + }); + }); }; diff --git a/QualityControl/test/lib/services/RunModeService.test.js b/QualityControl/test/lib/services/RunModeService.test.js index feee6cf07..940378365 100644 --- a/QualityControl/test/lib/services/RunModeService.test.js +++ b/QualityControl/test/lib/services/RunModeService.test.js @@ -48,7 +48,6 @@ export const runModeServiceTestSuite = async () => { deepStrictEqual(result, { paths: [{ name: '/run/path1' }], - runStatus: RunStatus.ONGOING, }); strictEqual(runModeService._ongoingRuns.has(runNumber), true); @@ -66,7 +65,6 @@ export const runModeServiceTestSuite = async () => { deepStrictEqual(result, { paths: [{ name: '/ended/path' }], - runStatus: RunStatus.ENDED, }); strictEqual(runModeService._ongoingRuns.has(runNumber), false); }); @@ -80,7 +78,6 @@ export const runModeServiceTestSuite = async () => { deepStrictEqual(result, { paths: [{ name: '/cached/path' }], - runStatus: 'ONGOING', }); sinon.assert.notCalled(bookkeepingService.retrieveRunStatus); diff --git a/QualityControl/test/test-index.js b/QualityControl/test/test-index.js index 4a941c3b5..abb9b81d1 100644 --- a/QualityControl/test/test-index.js +++ b/QualityControl/test/test-index.js @@ -64,6 +64,8 @@ import { layoutIdMiddlewareTest } from './lib/middlewares/layouts/layoutId.middl import { layoutOwnerMiddlewareTest } from './lib/middlewares/layouts/layoutOwner.middleware.test.js'; import { layoutServiceMiddlewareTest } from './lib/middlewares/layouts/layoutService.middleware.test.js'; import { statusComponentMiddlewareTest } from './lib/middlewares/status/statusComponent.middleware.test.js'; +import { runModeMiddlewareTest } from './lib/middlewares/filters/runMode.middleware.test.js'; +import { runStatusFilterMiddlewareTest } from './lib/middlewares/filters/runStatusFilter.middleware.test.js'; import { apiPutLayoutTests } from './api/layouts/api-put-layout.test.js'; import { apiPatchLayoutTests } from './api/layouts/api-patch-layout.test.js'; import { layoutRepositoryTest } from './lib/repositories/LayoutRepository.test.js'; @@ -82,6 +84,7 @@ import { objectGetByIdValidationMiddlewareTest } import { filterTests } from './public/features/filterTest.test.js'; import { qcObjectServiceTestSuite } from './lib/services/QcObjectService.test.js'; import { runModeServiceTestSuite } from './lib/services/RunModeService.test.js'; +import { apiGetRunStatusTests } from './api/filters/api-get-run-status.test.js'; const FRONT_END_PER_TEST_TIMEOUT = 5000; // each front-end test is allowed this timeout // remaining tests are based on the number of individual tests in each suite @@ -186,6 +189,7 @@ suite('All Tests - QCG', { timeout: FRONT_END_TIMEOUT + BACK_END_TIMEOUT }, asyn suite('Layout PUT request test suite', async () => apiPutLayoutTests()); suite('Layout PATCH request test suite', async () => apiPatchLayoutTests()); suite('Object GET request test suite', async () => apiGetObjectsTests()); + suite('Filters GET run status test suite', async () => await apiGetRunStatusTests()); }); suite('Back-end test suite', { timeout: BACK_END_TIMEOUT }, async () => { @@ -219,6 +223,8 @@ suite('All Tests - QCG', { timeout: FRONT_END_TIMEOUT + BACK_END_TIMEOUT }, asyn suite('LayoutIdMiddleware test suite', async () => layoutIdMiddlewareTest()); suite('LayoutOwnerMiddleware test suite', async () => layoutOwnerMiddlewareTest()); suite('StatusComponentMiddleware test suite', async () => statusComponentMiddlewareTest()); + suite('RunModeMiddleware test suite', async () => runModeMiddlewareTest()); + suite('RunStatusFilterMiddleware test suite', async () => runStatusFilterMiddlewareTest()); suite('BookkeepingServiceTest test suite', async () => await bookkeepingServiceTestSuite()); suite('ObjectsGetValidationMiddleware test suite', async () => objectsGetValidationMiddlewareTest()); suite('ObjectGetContentsValidationMiddleware test suite', async () => From a1378bb71fe16c7d656ecb9f595c2145cd73f04b Mon Sep 17 00:00:00 2001 From: Alejandro Mariscal Romero <87366244+mariscalromeroalejandro@users.noreply.github.com> Date: Mon, 8 Sep 2025 12:57:33 +0200 Subject: [PATCH 26/77] [OGUI-1722] Integrate runs mode functionality (#3023) This PR updates the frontend pages (objects tree list view, object view and layout view) to integrate with the new backend support for Runs Mode. Changes include: - Added logic to query the run status using the new backend endpoint. - Implemented input validation for run numbers before sending requests. - Updated UI components to display run status and handle loading/error states. - Tests --- .../common/library/runStatus.enum.js | 1 + QualityControl/docs/Features.md | 21 +- .../lib/controllers/FilterController.js | 2 +- .../lib/services/BookkeepingService.js | 20 +- QualityControl/public/Model.js | 62 +++--- QualityControl/public/app.css | 17 ++ .../public/common/filters/filterViews.js | 102 ++++++++- .../common/filters/model/FilterModel.js | 195 +++++++++++++++++- QualityControl/public/common/header.js | 28 ++- QualityControl/public/common/runModeHeader.js | 171 +++++++++++++++ QualityControl/public/layout/Layout.js | 3 + QualityControl/public/object/QCObject.js | 87 +++++++- .../public/object/objectTreeHeader.js | 7 +- .../aboutView/components/aboutViewHeader.js | 5 +- .../components/LayoutListHeader.js | 4 +- .../public/services/Filter.service.js | 26 +++ .../public/services/QCObject.service.js | 11 +- .../lib/services/BookkeepingService.test.js | 32 ++- .../test/public/features/filterTest.test.js | 52 ++--- .../runsMode/runsModeLayoutShow.test.js | 92 +++++++++ .../runsMode/runsModeObjectTree.test.js | 82 ++++++++ .../test/public/pages/object-tree.test.js | 11 + QualityControl/test/setup/testSetupForBkp.js | 8 + QualityControl/test/test-index.js | 12 ++ 24 files changed, 935 insertions(+), 116 deletions(-) create mode 100644 QualityControl/public/common/runModeHeader.js create mode 100644 QualityControl/test/public/features/runsMode/runsModeLayoutShow.test.js create mode 100644 QualityControl/test/public/features/runsMode/runsModeObjectTree.test.js diff --git a/QualityControl/common/library/runStatus.enum.js b/QualityControl/common/library/runStatus.enum.js index 4ed34f412..4b24f9a8b 100644 --- a/QualityControl/common/library/runStatus.enum.js +++ b/QualityControl/common/library/runStatus.enum.js @@ -17,4 +17,5 @@ export const RunStatus = Object.freeze({ ONGOING: 'ONGOING', NOT_FOUND: 'NOT_FOUND', UNKNOWN: 'UNKNOWN', + BOOKKEEPING_UNAVAILABLE: 'BOOKKEEPING_UNAVAILABLE', }); diff --git a/QualityControl/docs/Features.md b/QualityControl/docs/Features.md index 1f3bbfc92..bf5fd8027 100644 --- a/QualityControl/docs/Features.md +++ b/QualityControl/docs/Features.md @@ -7,6 +7,7 @@ - [AutoTransitioning Tabs within Layouts](#autotransitioning-tabs-within-layouts) - [Filters](#filters) - [Available Filters](#available-filters) +- [Runs Mode](#runs-mode) - [Actions](#actions) - [Edit a Layout](#edit-a-layout) - [Via GUI](#1-via-gui) @@ -55,6 +56,23 @@ Filters allow users to refine the displayed objects within a layout, ensuring on Only objects in the layout that match the selected filters will be displayed. +## Runs Mode +Runs Mode is a specialized viewing mode that allows users to focus on data from a specific run. When activated, it simplifies the interface by removing all other filters and applying only the run number filter. If the run is still ongoing, it will refresh the latest paths generated periodically. + +### How to Use Runs Mode +1. Navigate to the object tree or layout view. +2. Select a specific run number to enter Runs Mode. +3. The interface will automatically switch to show only data from the selected run. +4. Use the "Exit" button in the run mode header to return to normal filtering mode. + +### Run Mode Header +When in Runs Mode, a header appears at the top of the interface showing: +- The current run number (e.g., "Run #12345") +- The run status (ONGOING or ENDED) +- An information button that provides status explanations +- An exit button to leave Runs Mode + + ## Actions Users can perform the following actions within the layout editor: @@ -81,4 +99,5 @@ The GUI provides an intuitive and user-friendly way for layout creators to edit 4. A popup will appear, displaying the layout’s current configuration in plain JSON text format. - The system validates the JSON structure to ensure it is correctly formatted. - Certain fields, such as the `ID`, cannot be set manually. -5. Make the necessary changes and click `Save`. \ No newline at end of file +5. Make the necessary changes and click `Save`. + diff --git a/QualityControl/lib/controllers/FilterController.js b/QualityControl/lib/controllers/FilterController.js index f4178c3b9..fbc61afa2 100644 --- a/QualityControl/lib/controllers/FilterController.js +++ b/QualityControl/lib/controllers/FilterController.js @@ -43,7 +43,7 @@ export class FilterController { try { const runStatus = await this._filterService.getRunStatus(req.params.runNumber); res.status(200).json({ - runStatus: runStatus, + runStatus, }); } catch (error) { this._logger.errorMessage('Error getting run status:', error); diff --git a/QualityControl/lib/services/BookkeepingService.js b/QualityControl/lib/services/BookkeepingService.js index 154224e7c..d5b96f43b 100644 --- a/QualityControl/lib/services/BookkeepingService.js +++ b/QualityControl/lib/services/BookkeepingService.js @@ -134,7 +134,7 @@ export class BookkeepingService { async retrieveRunStatus(runNumber) { if (!this.active) { logger.warnMessage('Could not connect to bookkeeping'); - return RunStatus.NOT_FOUND; + return RunStatus.BOOKKEEPING_UNAVAILABLE; } try { @@ -144,18 +144,18 @@ export class BookkeepingService { }); if (!data) { - logger.warnMessage(`The run status was invalid for run number ${runNumber}`); - return RunStatus.NOT_FOUND; - } - - if (data.timeO2End) { - return RunStatus.ENDED; + throw new Error('No data available'); } - return RunStatus.ONGOING; + return data.timeO2End ? RunStatus.ENDED : RunStatus.ONGOING; } catch (error) { - logger.errorMessage(`An error occurred whilst fetching run status: ${error.message || error}`); - return RunStatus.NOT_FOUND; + const msg = error?.message ?? String(error); + if (msg.includes('404')) { + logger.warnMessage(`Run number ${runNumber} not found in bookkeeping`); + return RunStatus.NOT_FOUND; + } + logger.errorMessage(`Error fetching run status: ${error.message || error}`); + return RunStatus.UNKNOWN; } } diff --git a/QualityControl/public/Model.js b/QualityControl/public/Model.js index 750891ab6..58fe5d609 100644 --- a/QualityControl/public/Model.js +++ b/QualityControl/public/Model.js @@ -168,7 +168,7 @@ export default class Model extends Observable { */ async handleLocationChange() { this.object.objects = {}; // Remove any in-memory loaded objects - clearInterval(this.layout.tabInterval); + this._clearAllIntervals(); await this.filterModel.filterService.initFilterService(); this.filterModel.setFilterFromURL(); this.filterModel.setFilterToURL(); @@ -179,6 +179,7 @@ export default class Model extends Observable { switch (params.page) { case 'layoutList': + this.clearURL('layoutList'); this.page = 'layoutList'; setBrowserTabTitle('QCG-Layouts'); this.services.layout.getLayouts(RequestFields.LAYOUT_CARD); @@ -235,6 +236,7 @@ export default class Model extends Observable { this.router.go(`?page=layoutShow&layoutId=${this.router.params.layoutId}`, true, true); } + this.filterModel.restartRunsModeIntervals(this.layout); this.notify(); }).catch(() => true); // Error is handled inside loadItem break; @@ -246,6 +248,7 @@ export default class Model extends Observable { if (this.object.selected) { this.object.loadObjectByName(this.object.selected.name); } + this.filterModel.restartRunsModeIntervals(this.object); this.notify(); break; case 'objectView': { @@ -254,10 +257,12 @@ export default class Model extends Observable { setBrowserTabTitle('QCG-View'); const { params } = this.router; this.objectViewModel.init(params); + this.filterModel.restartRunsModeIntervals(this.objectViewModel); this.notify(); break; } case 'about': + this.clearURL('about'); this.page = 'about'; setBrowserTabTitle('QCG-About'); this.aboutViewModel.retrieveAllServicesStatus(); @@ -270,6 +275,15 @@ export default class Model extends Observable { } } + /** + * Clear URL parameters and redirect to a certain page + * @param {*} pageName - name of the page to be redirected to + * @returns {undefined} + */ + clearURL(pageName) { + this.router.go(`?page=${pageName}`, true, true); + } + /** * Show or hide sidebar * @returns {undefined} @@ -288,6 +302,26 @@ export default class Model extends Observable { this.notify(); } + /** + * Clears all active intervals in the application + * @returns {void} + */ + _clearAllIntervals() { + // Clear layout tab interval + if (this.layout?.tabInterval) { + clearInterval(this.layout.tabInterval); + } + + // Clear filter model runs mode interval + this.filterModel.clearRunsModeInterval(); + + // Clear main refresh timer if it exists + if (this._refreshTimer) { + clearInterval(this._refreshTimer); + this._refreshTimer = null; + } + } + /** * Method to check if connection is secure to enable certain improvements * e.g navigator.clipboard, notifications, service workers @@ -297,32 +331,6 @@ export default class Model extends Observable { return window.isSecureContext; } - /** - * Set the interval to update objects currently loaded and shown to user. - * This will reload only data associated to them - * @param {number} intervalSeconds - in seconds - * @returns {undefined} - */ - setRefreshInterval(intervalSeconds) { - // Stop any other timer - clearTimeout(this.refreshTimer); - - // Validate user input - let parsedValue = parseInt(intervalSeconds, 10); - if (isNaN(parsedValue) || parsedValue < 1) { - parsedValue = 2; - } - - // Start new timer - this.refreshInterval = parsedValue; - this.refreshTimer = setTimeout(() => { - this.setRefreshInterval(this.refreshInterval); - }, this.refreshInterval * 1000); - this.notify(); - - this.object.refreshObjects(); - } - /** * Getters / Setters */ diff --git a/QualityControl/public/app.css b/QualityControl/public/app.css index 5b235addc..1967d1423 100644 --- a/QualityControl/public/app.css +++ b/QualityControl/public/app.css @@ -119,3 +119,20 @@ font-size: 2em; margin-bottom: .5em; } + +.status-ongoing { + color: var(--color-success); + animation: ongoing-pulse 1s ease-in-out infinite; +} + +@keyframes ongoing-pulse { + 0% { + color: var(--color-success); + } + 50% { + color: var(--color-success-dark); + } + 100% { + color: var(--color-success); + } +} diff --git a/QualityControl/public/common/filters/filterViews.js b/QualityControl/public/common/filters/filterViews.js index 2db8555aa..4b6cac0b4 100644 --- a/QualityControl/public/common/filters/filterViews.js +++ b/QualityControl/public/common/filters/filterViews.js @@ -47,25 +47,25 @@ const createFilterElement = (config, filterMap, onInputCallback, onEnterCallback /** * Builds a panel containing multiple filters to allow user to apply for objectTree show/view * @param {FilterModel} filterModel - Model that manages filter state - * @param {PageModel} pageModel - Model that manages the state of the page that the filter is on. + * @param {object} viewModel - Model that manages the state of the page that the filter is on. * @returns {vnode} - virtual node element */ -export function filtersPanel(filterModel, pageModel) { +export function filtersPanel(filterModel, viewModel) { const { filterMap, setFilterValue, filterService, isVisible, clearFilter } = filterModel; const onInputCallback = setFilterValue.bind(filterModel); const onChangeCallback = setFilterValue.bind(filterModel); - const onEnterCallback = () => filterModel.triggerFilter(pageModel); - const clearFilterCallback = clearFilter.bind(filterModel, pageModel); + const onEnterCallback = () => filterModel.triggerFilter(viewModel); + const clearFilterCallback = clearFilter.bind(filterModel, viewModel); const filtersList = filtersConfig(filterService); - if (!isVisible) { + if (!isVisible || filterModel.inRunMode) { return null; } return h( '.w-100.flex-row.p2.g2.justify-center#filterElement', [ - triggerFiltersButton(onEnterCallback), + triggerFiltersButton(onEnterCallback, filterModel, viewModel), clearFiltersButton(clearFilterCallback), ...filtersList.map((filter) => createFilterElement(filter, filterMap, onInputCallback, onEnterCallback, onChangeCallback)), @@ -73,13 +73,99 @@ export function filtersPanel(filterModel, pageModel) { ); }; +/** + * Determines if runs mode is allowed based on current page and context + * @param {object} viewModel - Model that manages the state of the page + * @returns {boolean} - whether runs mode is allowed + */ +const isRunsModeAllowed = (viewModel) => { + const { model } = viewModel; + + const allowedPages = ['objectTree', 'layoutShow', 'objectView']; + if (!model || !allowedPages.includes(model.page)) { + return false; + } + + // not allow runs mode if in edit mode + if (model.page === 'layoutShow' && viewModel.editEnabled) { + return false; + } + + return true; +}; + /** * Button which will allow the user to update filter parameters after the input * @param {Function} onClickCallback - Function to trigger the filter mechanism + * @param {FilterModel} filterModel - Model that manages filter state + * @param {object} viewModel - Model that manages the state of the page * @returns {vnode} - virtual node element */ -const triggerFiltersButton = (onClickCallback) => - h('button.btn.btn-primary#triggerFilterButton', { onclick: onClickCallback, title: 'Update filters' }, 'Update'); +const triggerFiltersButton = (onClickCallback, filterModel, viewModel) => { + const runNumber = filterModel.filterMap.RunNumber; + if (filterModel.isValidRunNumber(runNumber) && isRunsModeAllowed(viewModel)) { + return updateDropdownButton(onClickCallback, filterModel, viewModel); + } + + return h( + 'button.btn.btn-primary', + { id: 'triggerFilterButton', onclick: onClickCallback, title: 'Update filters' }, + 'Update', + ); +}; + +/** + * Dropdown button for update options when run number is present + * @param {Function} onClickCallback - Function to trigger the filter mechanism + * @param {FilterModel} filterModel - Model that manages filter state + * @param {object} viewModel - Model that manages the state of the page + * @returns {vnode} - virtual node element + */ +const updateDropdownButton = (onClickCallback, filterModel, viewModel) => { + // Use a simple property on the filterModel to track dropdown state + const isDropdownOpen = filterModel.dropdownOpen || false; + + return h('.dropdown', { + class: isDropdownOpen ? 'dropdown-open' : '', + }, [ + h('button.btn.btn-primary', { + id: 'triggerFilterButton', + onclick: (e) => { + e.stopPropagation(); + filterModel.dropdownOpen = !isDropdownOpen; + filterModel.notify(); + }, + title: 'Update options', + }, [ + 'Update ', + isDropdownOpen ? iconChevronTop() : iconChevronBottom(), + ]), + isDropdownOpen && h('.dropdown-menu', [ + h('.p2', [ + h('div.menu-item', { + id: 'updateOnlyButton', + onclick: (e) => { + e.stopPropagation(); + filterModel.dropdownOpen = false; + filterModel.notify(); + onClickCallback(); + }, + style: 'white-space: nowrap;', + }, 'Update only'), + h('div.menu-item', { + id: 'updateAndRunModeButton', + onclick: async (e) => { + e.stopPropagation(); + filterModel.dropdownOpen = false; + filterModel.notify(); + await filterModel.activateRunsMode(viewModel); + }, + style: 'white-space: nowrap;', + }, 'Update & Run Mode'), + ]), + ]), + ]); +}; /** * Button which will allow the user to clear the filter element diff --git a/QualityControl/public/common/filters/model/FilterModel.js b/QualityControl/public/common/filters/model/FilterModel.js index bd1800e13..cb3411812 100644 --- a/QualityControl/public/common/filters/model/FilterModel.js +++ b/QualityControl/public/common/filters/model/FilterModel.js @@ -15,6 +15,7 @@ import { Observable } from '/js/src/index.js'; import { buildQueryParametersString } from '../../buildQueryParametersString.js'; import FilterService from '../../../services/Filter.service.js'; +import { RunStatus } from '../../../library/runStatus.enum.js'; const CCDB_QUERY_PARAMS = ['PeriodName', 'PassName', 'RunNumber', 'RunType']; /** @@ -32,6 +33,14 @@ export default class FilterModel extends Observable { this.filterService = new FilterService(this); this._filterMap = {}; this.isVisible = true; + this._runsModeInterval = null; + + // Run mode + this._inRunMode = false; + this._runNumber = null; + this._runStatus = RunStatus.UNKNOWN; + this.dropdownOpen = false; + this.statusInfoOpen = false; } /** @@ -73,7 +82,7 @@ export default class FilterModel extends Observable { parameters[filterKey] = encodeURI(this._filterMap[filterKey]); } }); - this.model.router.go(buildQueryParametersString(parameters, { }), true, isSilent); + this.model.router.go(buildQueryParametersString(parameters, {}), true, isSilent); } /** @@ -103,8 +112,11 @@ export default class FilterModel extends Observable { * @param {BaseViewModel} baseViewModel - The view model that should be filtered * @returns {undefined} */ - triggerFilter(baseViewModel) { + async triggerFilter(baseViewModel) { this.setFilterToURL(); + if (this.inRunMode) { + this.runStatus = await this.filterService.getRunStatus(this.runNumber); + } baseViewModel.triggerFilter(); } @@ -141,4 +153,183 @@ export default class FilterModel extends Observable { const { params } = this.model.router; return CCDB_QUERY_PARAMS.some((filterKey) => params[filterKey]?.trim()); } + + /** + * Activates the runs mode + * @param {object} baseViewModel - The view model that provides the triggerFilter method. + * @returns {Promise} + */ + async activateRunsMode(baseViewModel) { + // Save current filters before activating run mode + this._previousFilterMap = { ...this._filterMap }; + this.runNumber = this._filterMap.RunNumber; + + // Clear all filters except RunNumber + this._filterMap = { RunNumber: this._runNumber }; + + // Activate run mode + this.inRunMode = true; + await this.triggerFilter(baseViewModel); + this._manageRunsModeInterval(baseViewModel); + this.notify(); + } + + /** + * Deactivates the runs mode + * @param {object} baseViewModel - The view model that provides the triggerFilter method. + * @returns {Promise} + */ + async deactivateRunsMode(baseViewModel) { + this._filterMap = this._previousFilterMap || {}; + this.resetRunsMode(); + this.setFilterToURL(); + await baseViewModel.triggerFilter(); + this.notify(); + } + + /** + * Resets the runs mode state + * @returns {void} + */ + resetRunsMode() { + this.inRunMode = false; + this.runNumber = null; + this.runStatus = RunStatus.UNKNOWN; + this.clearRunsModeInterval(); + this.dropdownOpen = false; + this.statusInfoOpen = false; + this._previousFilterMap = null; + this.notify(); + } + + /** + * Starts an interval to refresh data periodically while the run is ongoing. + * The interval is cleared if the run ends. + * @param {object} baseViewModel - The view model used to trigger data refresh. + * @returns {Promise} + */ + async _manageRunsModeInterval(baseViewModel) { + this.clearRunsModeInterval(); + this._currentViewModel = baseViewModel; + if (this.runStatus === RunStatus.ONGOING) { + this._runsModeInterval = setInterval(async () => { + if (this._currentViewModel) { + await this.triggerFilter(this._currentViewModel); + if (this.runStatus !== RunStatus.ONGOING) { + this.clearRunsModeInterval(); + } + } + // TODO: Should be provided in config file (ticket OGUI-1743) + }, 5000); + } + } + + /** + * Clears the interval set during runs mode. + * @returns {void} + */ + clearRunsModeInterval() { + if (this._runsModeInterval) { + clearInterval(this._runsModeInterval); + this._runsModeInterval = null; + } + this._currentViewModel = null; + } + + /** + * Restarts the runs mode interval if needed + * @param {object} baseViewModel - The view model that provides the triggerFilter method + * @returns {void} + */ + restartRunsModeIntervals(baseViewModel) { + if (this.inRunMode && this.runStatus === RunStatus.ONGOING) { + this._manageRunsModeInterval(baseViewModel); + } + } + + /** + * Checks if run mode is activated + * @returns {boolean} true if activated + */ + get inRunMode() { + return this._inRunMode; + } + + /** + * Set run mode + * @param {boolean} value - Whether to activate or deactivate run mode + * @returns {void} + */ + set inRunMode(value) { + this._inRunMode = value; + this.notify(); + } + + /** + * Get run number + * @returns {null | number} Run number or null if not set + */ + get runNumber() { + return this._runNumber; + } + + /** + * Set run number + * @param {number} runNumber - The run number to set + * @returns {void} + */ + set runNumber(runNumber) { + this._runNumber = runNumber; + this.notify(); + } + + /** + * Get run status + * @returns {RunStatus} The current run status + */ + get runStatus() { + return this._runStatus; + } + + /** + * Set run status + * @param {RunStatus} runStatus - The run status to set + * @returns {void} + */ + set runStatus(runStatus) { + this._runStatus = runStatus; + + // exit runs mode if run is not found or status is unknown + if (this.inRunMode && runStatus !== RunStatus.ONGOING && runStatus !== RunStatus.ENDED) { + setTimeout(async () => { + if (this._currentViewModel) { + let reason = ''; + switch (runStatus) { + case RunStatus.NOT_FOUND: + reason = 'The run number provided does not correspond to any known run.'; + break; + case RunStatus.BOOKKEEPING_UNAVAILABLE: + reason = 'The bookkeeping service is not available.'; + break; + default: + reason = 'Unable to retrieve the run status.'; + } + + await this.deactivateRunsMode(this._currentViewModel); + this.model.notification.show(`Runs mode cannot be accesed: ${reason}`, 'warning', 4000); + } + }, 0); + } + + this.notify(); + } + + /** + * Validates if a run number is a valid number + * @param {string|number} runNumber - The run number to validate + * @returns {boolean} True if the run number is valid + */ + isValidRunNumber(runNumber) { + return runNumber && !isNaN(Number(runNumber)) && Number.isInteger(Number(runNumber)); + } } diff --git a/QualityControl/public/common/header.js b/QualityControl/public/common/header.js index 09cef7429..a9a6112ff 100644 --- a/QualityControl/public/common/header.js +++ b/QualityControl/public/common/header.js @@ -21,6 +21,7 @@ import aboutViewHeader from '../pages/aboutView/components/aboutViewHeader.js'; import LayoutListHeader from '../pages/layoutListView/components/LayoutListHeader.js'; import { objectViewHeader } from '../pages/objectView/components/header.js'; import { filtersPanel } from './filters/filterViews.js'; +import { runModeHeader } from './runModeHeader.js'; /** * Shows header of the application, split with 3 parts: @@ -31,10 +32,11 @@ import { filtersPanel } from './filters/filterViews.js'; * @returns {vnode} - header element */ export default (model) => h('.flex-col', [ - h('.flex-row.p2', [ + h('.flex-row.p2.items-center', [ commonHeader(model), headerSpecific(model), ]), + runsModeSpecific(model), filterSpecific(model), ]); @@ -46,11 +48,11 @@ export default (model) => h('.flex-col', [ const headerSpecific = (model) => { const { layoutListModel, filterModel, layout, object, page } = model; switch (page) { - case 'layoutList': return LayoutListHeader(layoutListModel, filterModel); + case 'layoutList': return LayoutListHeader(layoutListModel); case 'layoutShow': return layoutViewHeader(layout, filterModel); case 'objectTree': return objectTreeHeader(object, filterModel); case 'objectView': return objectViewHeader(model); - case 'about': return aboutViewHeader(filterModel); + case 'about': return aboutViewHeader(); default: return null; } }; @@ -61,14 +63,28 @@ const headerSpecific = (model) => { * @returns {vnode} - virtual node element */ const filterSpecific = (model) => { - const { page, filterModel, layout, object, objectViewModel, aboutViewModel, layoutListModel } = model; + const { page, filterModel, layout, object, objectViewModel } = model; switch (page) { - case 'layoutList': return filtersPanel(filterModel, layoutListModel); case 'layoutShow': return filtersPanel(filterModel, layout); case 'objectTree': return filtersPanel(filterModel, object); case 'objectView': return filtersPanel(filterModel, objectViewModel); - case 'about': return filtersPanel(filterModel, aboutViewModel); + default: return null; + } +}; + +/** + * Shows the runs mode component + * @param {Model} model - root model of the application + * @returns {vnode} - virtual node element + */ +const runsModeSpecific = (model) => { + const { page, filterModel, object, layout, objectViewModel } = model; + + switch (page) { + case 'objectTree': return runModeHeader(filterModel, object); + case 'layoutShow': return runModeHeader(filterModel, layout); + case 'objectView': return runModeHeader(filterModel, objectViewModel); default: return null; } }; diff --git a/QualityControl/public/common/runModeHeader.js b/QualityControl/public/common/runModeHeader.js new file mode 100644 index 000000000..7117cbc10 --- /dev/null +++ b/QualityControl/public/common/runModeHeader.js @@ -0,0 +1,171 @@ +/** + * @license + * Copyright 2019-2020 CERN and copyright holders of ALICE O2. + * See http://alice-o2.web.cern.ch/copyright for details of the copyright holders. + * All rights not expressly granted are reserved. + * + * This software is distributed under the terms of the GNU General Public + * License v3 (GPL Version 3), copied verbatim in the file "COPYING". + * + * In applying this license CERN does not waive the privileges and immunities + * granted to it by virtue of its status as an Intergovernmental Organization + * or submit itself to any jurisdiction. + */ + +import { RunStatus } from '../../library/runStatus.enum.js'; +import { h, info } from '/js/src/index.js'; + +/** + * Run mode header component showing run information and exit button + * @param {FilterModel} filterModel - model that manages filter state + * @param {object} viewModel - model that manages the state of the view + * @returns {vnode} - virtual node element + */ +export function runModeHeader(filterModel, viewModel) { + if (!filterModel.inRunMode) { + return null; + } + + return h('.flex-row.items-center.justify-center.p2.g2.bg-gray-lighter', { + id: 'runModeHeader', + }, [ + renderRunModeInfo(filterModel), + renderExitButton(filterModel, viewModel), + ]); + + /** + * Renders the run mode information section + * @param {FilterModel} filterModel - model that manages filter state + * @returns {vnode} - virtual node element + */ + function renderRunModeInfo(filterModel) { + return h('.flex-row.items-center.g2', [ + renderRunNumber(filterModel.runNumber), + h('div.mh2', { + style: 'width: 1px; height: 1.2em; background-color: var(--color-gray-dark);', + }), + renderRunStatus(filterModel), + ]); + } + + /** + * Renders a run detail item for run number with copy functionality + * @param {string} runNumber - The run number value to display + * @returns {vnode} - virtual node element + */ + function renderRunNumber(runNumber) { + return h( + '.flex-row.items-center.g1', + { id: 'runNumber' }, + [ + h('span.gray-darker', 'Run'), + h('b', `#${runNumber}`), + ], + ); + } + + /** + * Renders the status detail with dropdown + * @param {FilterModel} filterModel - model that manages filter state + * @returns {vnode} - virtual node element + */ + function renderRunStatus(filterModel) { + const statusClass = filterModel.runStatus === RunStatus.ONGOING ? 'status-ongoing' : 'primary'; + return h('.flex-row.items-center.g1', { + id: 'runStatus', + }, [ + h('span.gray-darker', 'Status:'), + h(`b.${statusClass}`, filterModel.runStatus), + renderStatusInfoDropdown(filterModel), + ]); + } + + /** + * Renders the status info dropdown + * @param {FilterModel} filterModel - model that manages filter state + * @returns {vnode} - virtual node element + */ + function renderStatusInfoDropdown(filterModel) { + return h('.dropdown.mh1', { + class: filterModel.statusInfoOpen ? 'dropdown-open' : '', + }, [ + renderInfoButton(filterModel), + filterModel.statusInfoOpen && renderDropdownMenu(), + ]); + } + + /** + * Renders the info button + * @param {FilterModel} filterModel - model that manages filter state + * @returns {vnode} - virtual node element + */ + function renderInfoButton(filterModel) { + return h('button.btn.btn-sm', { + id: 'runsModeInfoButton', + title: 'Show status information', + onclick: (e) => { + e.stopPropagation(); + filterModel.statusInfoOpen = !filterModel.statusInfoOpen; + filterModel.notify(); + }, + }, info()); + } + + /** + * Renders the dropdown menu content + * @returns {vnode} - virtual node element + */ + function renderDropdownMenu() { + return h('.dropdown-menu', { + id: 'statusInfoDropdown', + }, [ + h('.p2', [ + h('div.gray-darker.mv1', 'Status meanings:'), + h('hr.mv1'), + renderStatusList(), + h('span', '* Note: All other filters have been removed. Only the run number filter is applied.'), + ]), + ]); + } + + /** + * Renders the list of all possible statuses + * @returns {vnode} - virtual node element + */ + function renderStatusList() { + return h('div', { + id: 'runStatusList', + }, [ + h('div.flex-row.items-center.mv1', { + style: 'white-space: nowrap;', + }, [ + h('div.flex-row.items-center.g1', [ + h('b.status-ongoing', [RunStatus.ONGOING]), + h('span.gray-darker', ' - The run is currently ongoing. New paths and objects will be added periodically.'), + ]), + ]), + h('div.flex-row.items-center.mv1', { + style: 'white-space: nowrap;', + }, [ + h('div.flex-row.items-center.g1', [ + h('b.primary', [RunStatus.ENDED]), + h('span.gray-darker', ' - The run has ended successfully. No new paths or objects will be added.'), + ]), + ]), + ]); + } + + /** + * Renders the exit button + * @param {FilterModel} filterModel - model that manages filter state + * @param {object} viewModel - model that manages the state of the view + * @returns {vnode} - virtual node element + */ + function renderExitButton(filterModel, viewModel) { + return h('button.btn.btn-sm', { + id: 'exitRunModeButton', + onclick: async () => await filterModel.deactivateRunsMode(viewModel), + title: 'Exit run mode and show all filters', + }, 'Exit'); + } +} diff --git a/QualityControl/public/layout/Layout.js b/QualityControl/public/layout/Layout.js index b847d89fc..85ecfe2fd 100644 --- a/QualityControl/public/layout/Layout.js +++ b/QualityControl/public/layout/Layout.js @@ -404,6 +404,9 @@ export default class Layout extends BaseViewModel { * @returns {undefined} */ edit() { + if (this.model.filterModel.inRunMode) { + this.model.filterModel.deactivateRunsMode(this); + } this.toggleEditMenu(); this.listObjects(); diff --git a/QualityControl/public/object/QCObject.js b/QualityControl/public/object/QCObject.js index d7c5e3ea9..962ee7d37 100644 --- a/QualityControl/public/object/QCObject.js +++ b/QualityControl/public/object/QCObject.js @@ -55,7 +55,6 @@ export default class QCObject extends BaseViewModel { this.queryingObjects = false; this.scrollTop = 0; this.scrollHeight = 0; - this.filterModel = model.filterModel; } /** @@ -178,19 +177,35 @@ export default class QCObject extends BaseViewModel { this.notify(); this.queryingObjects = true; let offlineObjects = []; - const result = await this.model.services.object.getObjects(this.filterModel.filterMap); + const result = await this.model.services.object.getObjects(this.model.filterModel.inRunMode); + if (result.isSuccess()) { - offlineObjects = result.payload; + offlineObjects = this.model.filterModel.inRunMode ? result.payload.paths : result.payload; } else { - const failureMessage = 'Failed to retrieve list of objects. Please contact an administrator'; - this.model.notification.show(failureMessage, 'danger', Infinity); + const errorMessage = + result?._error?.message || 'Failed to retrieve list of objects. Please contact an administrator'; + this.model.notification.show(errorMessage, 'danger', Infinity); } this.sortListByField(offlineObjects, this.sortBy.field, this.sortBy.order); this.list = offlineObjects; + let treeState = null; + let selectedObject = null; + + // save the state of the tree in run mode + if (this.model.filterModel.inRunMode) { + treeState = this.saveTreeState(); + selectedObject = this.selected; + } + this.tree.initTree('database'); this.tree.addChildren(offlineObjects); + // restore tree state if in run mode + if (this.model.filterModel.inRunMode && treeState) { + this.restoreTreeState(treeState); + } + this.currentList = offlineObjects; this.sortBy = { field: 'name', @@ -201,7 +216,13 @@ export default class QCObject extends BaseViewModel { }; this._computeFilters(); - if (this.selected && !this.selected.lastModified) { + // if w are in run mode and an object was opened + if (this.model.filterModel.inRunMode && selectedObject) { + const foundObject = this.list.find((object) => object.name === selectedObject.name); + if (foundObject) { + this.selected = foundObject; + } + } else if (this.selected && !this.selected.lastModified) { this.selected = this.list.find((object) => object.name === this.selected.name); } this.queryingObjects = false; @@ -464,12 +485,62 @@ export default class QCObject extends BaseViewModel { } } + /** + * Save the current state of the tree + * @returns {object} - Map of path strings to their open state + */ + saveTreeState() { + const state = {}; + + /** + * Save the state of each node in the tree + * @param {object} node - The tree node to save state for + * @returns {undefined} + */ + function saveNodeState(node) { + if (node.pathString) { + state[node.pathString] = node.open; + } + for (let i = 0; i < node.children.length; i++) { + saveNodeState(node.children[i]); + } + } + saveNodeState(this.tree); + return state; + } + + /** + * Restore the tree state from a previously saved state + * @param {object} state - Map of path strings to their open state + * @returns {undefined} + */ + restoreTreeState(state) { + /** + * Restore the state of each node in the tree + * @param {object} node - The tree node to save state for + * @returns {undefined} + */ + function restoreNodeState(node) { + if (node.pathString && state[node.pathString] !== undefined) { + node.open = state[node.pathString]; + } + for (let i = 0; i < node.children.length; i++) { + restoreNodeState(node.children[i]); + } + }; + + restoreNodeState(this.tree); + } + /** * Function that reloads the object list with filters applied * @returns {undefined} */ async triggerFilter() { - this.selected = null; - await this.loadList(); + // don't clear selected object refreshing in run mode + if (!this.model.filterModel.inRunMode) { + this.selected = null; + } + this.loadList(); } } diff --git a/QualityControl/public/object/objectTreeHeader.js b/QualityControl/public/object/objectTreeHeader.js index 22c021510..08d0744e1 100644 --- a/QualityControl/public/object/objectTreeHeader.js +++ b/QualityControl/public/object/objectTreeHeader.js @@ -33,13 +33,13 @@ export default function objectTreeHeader(qcObject, filterModel) { : `${qcObject.currentList.length} items`; return [ - h('.w-33.text-center', [ + h('.w-33.text-center.flex-grow.flex-row.justify-center.items-center', [ h('b.f4', 'Objects'), ' ', qcObject.objectsRemote.isSuccess() && h('span', `(${howMany})`), ]), - h('.flex-grow.text-right', [ - filterPanelToggleButton(filterModel), + h('.flex-row.items-center.g2.justify-end', [ + filterModel.inRunMode ? null : filterPanelToggleButton(filterModel), ' ', h('.dropdown', { title: 'Sort by', class: qcObject.sortBy.open ? 'dropdown-open' : '', @@ -68,6 +68,7 @@ export default function objectTreeHeader(qcObject, filterModel) { disabled: qcObject.queryingObjects ? true : false, oninput: (e) => qcObject.search(e.target.value), }), + ' ', ]), ]; } diff --git a/QualityControl/public/pages/aboutView/components/aboutViewHeader.js b/QualityControl/public/pages/aboutView/components/aboutViewHeader.js index fdc6dc508..ac398d72e 100644 --- a/QualityControl/public/pages/aboutView/components/aboutViewHeader.js +++ b/QualityControl/public/pages/aboutView/components/aboutViewHeader.js @@ -12,19 +12,16 @@ * or submit itself to any jurisdiction. */ -import { filterPanelToggleButton } from '../../../common/filters/filterViews.js'; import { h } from '/js/src/index.js'; /** * Shows header of Framework Information - * @param {FilterModel} filterModel - model that controlls the filter state * @returns {vnode} - virtual node element */ -export default (filterModel) => [ +export default () => [ h( '.w-50.flex-row.justify-center', h('b.f4.ph2', 'About'), ), h('.flex-grow'), - filterPanelToggleButton(filterModel), ]; diff --git a/QualityControl/public/pages/layoutListView/components/LayoutListHeader.js b/QualityControl/public/pages/layoutListView/components/LayoutListHeader.js index 09f6d90ca..f8ce9a27f 100644 --- a/QualityControl/public/pages/layoutListView/components/LayoutListHeader.js +++ b/QualityControl/public/pages/layoutListView/components/LayoutListHeader.js @@ -12,7 +12,6 @@ * or submit itself to any jurisdiction. */ -import { filterPanelToggleButton } from '../../../common/filters/filterViews.js'; import { h } from '/js/src/index.js'; /** @@ -21,10 +20,9 @@ import { h } from '/js/src/index.js'; * @param {FilterModel} filterModel - The model handeling the filter state * @returns {vnode} - virtual node element */ -export default (layoutListModel, filterModel) => [ +export default (layoutListModel) => [ h('.w-50.text-center', [h('b.f4', 'Layouts')]), h('.flex-grow.text-right', [ - filterPanelToggleButton(filterModel), h('input.form-control.form-inline.mh1.w-33', { placeholder: 'Search', type: 'text', diff --git a/QualityControl/public/services/Filter.service.js b/QualityControl/public/services/Filter.service.js index 1a7d37dba..f7814f463 100644 --- a/QualityControl/public/services/Filter.service.js +++ b/QualityControl/public/services/Filter.service.js @@ -12,6 +12,7 @@ * or submit itself to any jurisdiction. */ +import { RunStatus } from '../../library/runStatus.enum.js'; import { RemoteData } from '/js/src/index.js'; /** @@ -45,6 +46,31 @@ export default class FilterService { this.filterModel.notify(); } + /** + * Method to get run status for a specific run number + * @param {number} runNumber - The run number to get status for + * @returns {Promise} - Run status string + */ + async getRunStatus(runNumber) { + try { + const parsedRunNumber = parseInt(runNumber, 10); + + if (Number.isNaN(parsedRunNumber)) { + return RunStatus.UNKNOWN; + } + + const { result, ok } = await this.loader.get(`/api/filter/run-status/${parsedRunNumber}`); + + if (!ok || !result || !Object.values(RunStatus).includes(result?.runStatus)) { + return RunStatus.UNKNOWN; + } + + return result?.runStatus; + } catch { + return RunStatus.UNKNOWN; + } + } + /** * Method to initialize the filter service * @returns {void} diff --git a/QualityControl/public/services/QCObject.service.js b/QualityControl/public/services/QCObject.service.js index 17dbf3cfe..f03dfc3bf 100644 --- a/QualityControl/public/services/QCObject.service.js +++ b/QualityControl/public/services/QCObject.service.js @@ -168,13 +168,20 @@ export default class QCObjectService { /** * Ask server for all available objects from CCDB + * @param {boolean} inRunMode - if true, inRunMode is added to the path * @returns {JSON} List of Objects * @deprecated */ - async getObjects() { + async getObjects(inRunMode = false) { const hasFilters = Object.values(this.filterModel.filterMap).some(Boolean); const fields = hasFilters ? ['path'] : undefined; // If there are filters more unneeded fields are sent down. - const url = this._buildURL('/api/objects?', undefined, undefined, undefined, fields); + const url = this._buildURL( + `/api/objects?${inRunMode ? 'inRunMode=true' : ''}`, + undefined, + undefined, + undefined, + fields, + ); const { result, ok } = await this.model.loader.get(url); return ok ? RemoteData.success(result) : RemoteData.failure(result); } diff --git a/QualityControl/test/lib/services/BookkeepingService.test.js b/QualityControl/test/lib/services/BookkeepingService.test.js index aa326d45e..755d1c457 100644 --- a/QualityControl/test/lib/services/BookkeepingService.test.js +++ b/QualityControl/test/lib/services/BookkeepingService.test.js @@ -31,7 +31,7 @@ export const bookkeepingServiceTestSuite = async () => { token: 'valid-token', runTypesRefreshInterval: 15000, runStatusRefreshInterval: 15000, - } + }, }; before(() => nock.cleanAll()); suite('Create a new instance of BookkeepingService', () => { @@ -157,7 +157,7 @@ export const bookkeepingServiceTestSuite = async () => { status: { ok: true, configured: true, - } + }, }, }); @@ -175,7 +175,7 @@ export const bookkeepingServiceTestSuite = async () => { status: { ok: false, configured: false, - } + }, }, }); @@ -269,25 +269,39 @@ export const bookkeepingServiceTestSuite = async () => { strictEqual(result, RunStatus.ONGOING); }); - test('should return NOT_FOUND status when no data is returned', async () => { + test('should return UNKNOWN status when no data is returned', async () => { nock(VALID_CONFIG.bookkeeping.url).get(runsPathPattern).reply(200, {}); const result = await bkpService.retrieveRunStatus(789); - strictEqual(result, RunStatus.NOT_FOUND); + strictEqual(result, RunStatus.UNKNOWN); + }); + + test('should return UNKNOWN status when request fails', async () => { + nock(VALID_CONFIG.bookkeeping.url).get(runsPathPattern).reply(500); + + const result = await bkpService.retrieveRunStatus(1010); + strictEqual(result, RunStatus.UNKNOWN); }); test('should return NOT_FOUND status when request fails', async () => { - nock(VALID_CONFIG.bookkeeping.url).get(runsPathPattern).replyWithError('connection failed'); + nock(VALID_CONFIG.bookkeeping.url).get(runsPathPattern).reply(404, { + errors: [ + { + status: '404', + title: 'Run with this run number (1010) could not be found', + }, + ], + }); - const result = await bkpService.retrieveRunStatus(404); + const result = await bkpService.retrieveRunStatus(1010); strictEqual(result, RunStatus.NOT_FOUND); }); - test('should return NOT_FOUND status when service is not active', async () => { + test('should return BOOKKEEPING_UNAVAILABLE status when service is not active', async () => { bkpService.active = false; const result = await bkpService.retrieveRunStatus(123); - strictEqual(result, RunStatus.NOT_FOUND); + strictEqual(result, RunStatus.BOOKKEEPING_UNAVAILABLE); }); }); }); diff --git a/QualityControl/test/public/features/filterTest.test.js b/QualityControl/test/public/features/filterTest.test.js index e49d7c938..a97379528 100644 --- a/QualityControl/test/public/features/filterTest.test.js +++ b/QualityControl/test/public/features/filterTest.test.js @@ -11,55 +11,43 @@ * or submit itself to any jurisdiction. */ -import { strictEqual, ok, deepStrictEqual } from 'node:assert'; - -const LAYOUT_LIST_PAGE_PARAM = '?page=layoutList'; -const FILTER_SELECTOR = 'header #filterElement'; +import { strictEqual } from 'node:assert'; export const filterTests = async (url, page, timeout = 5000, testParent) => { - await testParent.test('should successfully load filter element on layoutListPage', { timeout }, async () => { - await page.goto(`${url}${LAYOUT_LIST_PAGE_PARAM}`, { waitUntil: 'networkidle0' }); - await page.waitForSelector(FILTER_SELECTOR); - - const element = await page.$(FILTER_SELECTOR); - ok(element !== null, 'Filter element does not exist, or is not inside the header'); - - const location = await page.evaluate(() => window.location); - deepStrictEqual(location.search, '?page=layoutList'); - }); - await testParent.test('filter should persist between pages', { timeout }, async () => { const runNumber = '0'; - await page.locator('#runNumberFilter').fill(runNumber); - await page.locator('#filterElement #triggerFilterButton').click(); - - let value = await page.evaluate(() => document.querySelector('#runNumberFilter').value); - strictEqual(value, runNumber, 'RunNumber is no longer set'); - await page.locator('.sidebar > a:nth-of-type(3)').click(); // navigate to aboutPage. + await page.locator('.sidebar > a:nth-of-type(2)').click(); // navigate to ObjectTreePage + await page.waitForSelector('#runNumberFilter', { visible: true }); - value = await page.evaluate(() => document.querySelector('#runNumberFilter').value); - strictEqual(value, runNumber, 'RunNumber is no longer set'); + await page.locator('#runNumberFilter').fill(runNumber); - await page.locator('.sidebar > a:nth-of-type(2)').click(); // navigate to ObjectTreePage. + await page.locator('#triggerFilterButton').click(); + await page.locator('#updateOnlyButton').click(); - value = await page.evaluate(() => document.querySelector('#runNumberFilter').value); - strictEqual(value, runNumber, 'RunNumber is no longer set'); + // Check that URL contains RunNumber=0 + const location = await page.evaluate(() => window.location); + strictEqual(location.href.includes('RunNumber=0'), true, 'URL should contain RunNumber=0'); await page.waitForSelector('tr:last-of-type td'); await extendTree(3, 5); await page.locator('tr:last-of-type td').click(); // This will select an object await page.waitForSelector('.resize-button a'); await page.locator('.resize-button a').click(); // This would navigate to the objectViewPage + await page.waitForSelector('#runNumberFilter', { visible: true }); - value = await page.evaluate(() => document.querySelector('#runNumberFilter').value); - strictEqual(value, runNumber, 'RunNumber is no longer set'); + // Check that filter is still set to 0 + let value = await page.evaluate(() => document.querySelector('#runNumberFilter').value); + strictEqual(value, runNumber, 'RunNumber filter should still be set to 0 on objectView page'); + // Navigate to layout show await page.waitForSelector('.sidebar > div:nth-of-type(3) a:nth-child(1)', { visible: true, stable: true }); await page.locator('.sidebar > div:nth-of-type(3) a:nth-child(1)').click(); // navigate to layout show + await page.waitForSelector('#runNumberFilter', { visible: true }); + // Check that filter is still set to 0 value = await page.evaluate(() => document.querySelector('#runNumberFilter').value); - strictEqual(value, runNumber, 'RunNumber is no longer set'); + strictEqual(value, runNumber, 'RunNumber filter should still be set to 0 on layout show page'); }); await testParent.test('should list all objects when disabling objectFilters', { timeout }, async () => { @@ -93,7 +81,6 @@ export const filterTests = async (url, page, timeout = 5000, testParent) => { strictEqual(versionCount, 1); await page.locator('#filterElement #clearFilterButton').click(); - await page.locator('#filterElement #triggerFilterButton').click(); await page.waitForSelector('#ObjectPlot select option:nth-child(2)'); @@ -111,6 +98,7 @@ export const filterTests = async (url, page, timeout = 5000, testParent) => { const runNumber = '0'; await page.locator('#runNumberFilter').fill(runNumber); await page.locator('#filterElement #triggerFilterButton').click(); + await page.locator('#updateOnlyButton').click(); await extendTree(3, 5); @@ -124,7 +112,7 @@ export const filterTests = async (url, page, timeout = 5000, testParent) => { await page.waitForSelector(versionsPath); let versionCount = await page.evaluate((path) => document.querySelectorAll(path).length, versionsPath); - strictEqual(versionCount, 1); + strictEqual(versionCount, 1, 'Number of versions is not 1'); await page.locator('#filterElement #clearFilterButton').click(); await page.locator('#filterElement #triggerFilterButton').click(); @@ -135,7 +123,7 @@ export const filterTests = async (url, page, timeout = 5000, testParent) => { await page.waitForSelector(versionsPath); versionCount = await page.evaluate((path) => document.querySelectorAll(path).length, versionsPath); - strictEqual(versionCount, 2); + strictEqual(versionCount, 2, 'Number of versions is not 2'); }); /** diff --git a/QualityControl/test/public/features/runsMode/runsModeLayoutShow.test.js b/QualityControl/test/public/features/runsMode/runsModeLayoutShow.test.js new file mode 100644 index 000000000..140f20ca1 --- /dev/null +++ b/QualityControl/test/public/features/runsMode/runsModeLayoutShow.test.js @@ -0,0 +1,92 @@ +/** + * @license + * Copyright CERN and copyright holders of ALICE O2. This software is + * distributed under the terms of the GNU General Public License v3 (GPL + * Version 3), copied verbatim in the file "COPYING". + * + * See http://alice-o2.web.cern.ch/license for full licensing information. + * + * In applying this license CERN does not waive the privileges and immunities + * granted to it by virtue of its status as an Intergovernmental Organization + * or submit itself to any jurisdiction. + */ + +import { strictEqual } from 'node:assert'; + +const OBJECT_TREE_PAGE_PARAM = '?page=objectTree'; +export const runsModeLayoutShowTests = async (url, page, timeout = 5000, testParent) => { + await testParent.test('should activate runs mode in object tree page', async () => { + await page.goto(`${url}${OBJECT_TREE_PAGE_PARAM}`, { waitUntil: 'networkidle0' }); + //wait for filters + await page.waitForSelector('#runNumberFilter', { timeout }); + await page.waitForSelector('#runTypeFilter', { timeout }); + //select run number and run type + await page.type('#runNumberFilter', '0'); + await page.click('#runTypeFilter'); + await page.select('#runTypeFilter', 'runType1'); + //check dropdown is available + await page.waitForSelector('#triggerFilterButton', { timeout }); + await page.click('#triggerFilterButton'); + await page.waitForSelector('#updateAndRunModeButton', { timeout }); + const isButtonEnabled = await page.evaluate(() => { + const button = document.querySelector('#updateAndRunModeButton'); + return button && !button.disabled; + }); + strictEqual(isButtonEnabled, true, 'updateAndRunModeButton should be enabled when run number is entered'); + + // Activate runs mode + await page.click('#updateAndRunModeButton'); + await page.waitForSelector('#runModeHeader', { timeout }); + }); + + await testParent.test('should navigate to layout page and verify runs mode persists', async () => { + // Navigate to layout page using the provided selector + await page.waitForSelector('.sidebar > div:nth-of-type(3) a:nth-child(1)', { visible: true, stable: true }); + await page.locator('.sidebar > div:nth-of-type(3) a:nth-child(1)').click(); // navigate to layout show + + //wait for network + + // Wait for layout page to load + await page.waitForSelector('#runModeHeader', { timeout }); + + // Verify runs mode header elements are present + await page.waitForSelector('#runNumber', { timeout }); + await page.waitForSelector('#runStatus', { timeout }); + await page.waitForSelector('#runsModeInfoButton', { timeout }); + await page.waitForSelector('#exitRunModeButton', { timeout }); + + const [runNumberDisplayed, runStatusDisplayed, infoButtonDisplayed, exitButtonDisplayed] = + await page.evaluate(() => { + const runNumber = document.querySelector('#runNumber'); + const runStatus = document.querySelector('#runStatus'); + const infoButton = document.querySelector('#runsModeInfoButton'); + const exitButton = document.querySelector('#exitRunModeButton'); + + return [ + runNumber?.children[0]?.textContent === 'Run' && runNumber?.children[1]?.textContent === '#0', + runStatus?.children[0]?.textContent === 'Status:' && runStatus?.children[1]?.textContent === 'ONGOING', + infoButton?.title === 'Show status information', + exitButton?.textContent === 'Exit' && exitButton?.title === 'Exit run mode and show all filters', + ]; + }); + strictEqual(runNumberDisplayed, true, 'runNumber should be displayed in layout page'); + strictEqual(runStatusDisplayed, true, 'runStatus should be displayed in layout page'); + strictEqual(infoButtonDisplayed, true, 'infoButton should be displayed in layout page'); + strictEqual(exitButtonDisplayed, true, 'exitRunModeButton should be displayed in layout page'); + + // Verify runs mode is still active + const isRunMode = await page.evaluate(() => window.model.filterModel.inRunMode); + strictEqual(isRunMode, true, 'inRunMode should persist in layout page'); + }); + + await testParent.test('should exit run mode from layout page', async () => { + await page.click('#exitRunModeButton'); + + // filters are shown again + await page.waitForSelector('#filterElement', { timeout }); + await page.waitForSelector('#triggerFilterButton', { timeout }); + // window.model.filterModel.inRunMode is false + const isRunMode = await page.evaluate(() => window.model.filterModel.inRunMode); + strictEqual(isRunMode, false, 'inRunMode should be false after exiting from layout page'); + }); +}; diff --git a/QualityControl/test/public/features/runsMode/runsModeObjectTree.test.js b/QualityControl/test/public/features/runsMode/runsModeObjectTree.test.js new file mode 100644 index 000000000..c4e8a8e18 --- /dev/null +++ b/QualityControl/test/public/features/runsMode/runsModeObjectTree.test.js @@ -0,0 +1,82 @@ +/** + * @license + * Copyright CERN and copyright holders of ALICE O2. This software is + * distributed under the terms of the GNU General Public License v3 (GPL + * Version 3), copied verbatim in the file "COPYING". + * + * See http://alice-o2.web.cern.ch/license for full licensing information. + * + * In applying this license CERN does not waive the privileges and immunities + * granted to it by virtue of its status as an Intergovernmental Organization + * or submit itself to any jurisdiction. + */ + +import { strictEqual } from 'node:assert'; + +const OBJECT_TREE_PAGE_PARAM = '?page=objectTree'; +export const runsModeObjectTreeTests = async (url, page, timeout = 5000, testParent) => { + await testParent.test('should enable updateAndRunModeButton when run number is entered', async () => { + await page.goto(`${url}${OBJECT_TREE_PAGE_PARAM}`, { waitUntil: 'networkidle0' }); + //wait for filters + await page.waitForSelector('#runNumberFilter', { timeout }); + await page.waitForSelector('#runTypeFilter', { timeout }); + //select run number and run type + await page.type('#runNumberFilter', '0'); + await page.click('#runTypeFilter'); + await page.select('#runTypeFilter', 'runType1'); + //check dropdown is available + await page.waitForSelector('#triggerFilterButton', { timeout }); + await page.click('#triggerFilterButton'); + await page.waitForSelector('#updateAndRunModeButton', { timeout }); + const isButtonEnabled = await page.evaluate(() => { + const button = document.querySelector('#updateAndRunModeButton'); + return button && !button.disabled; + }); + strictEqual(isButtonEnabled, true, 'updateAndRunModeButton should be enabled when run number is entered'); + }); + + await testParent.test('should show runModeHeader when updateAndRunModeButton is clicked', async () => { + await page.click('#updateAndRunModeButton'); + //check the url to not have runType as filter + const currentUrl = page.url(); + strictEqual(currentUrl.includes('RunType'), false, 'RunType should not be in url'); + strictEqual(currentUrl.includes('RunNumber'), true, 'RunNumber should be in url'); + + //wait for elements in run mode header + await page.waitForSelector('#runModeHeader', { timeout }); + await page.waitForSelector('#runNumber', { timeout }); + await page.waitForSelector('#runStatus', { timeout }); + await page.waitForSelector('#runsModeInfoButton', { timeout }); + await page.waitForSelector('#exitRunModeButton', { timeout }); + + const [runNumberDisplayed, runStatusDisplayed, infoButtonDisplayed, exitButtonDisplayed] = + await page.evaluate(() => { + const runNumber = document.querySelector('#runNumber'); + const runStatus = document.querySelector('#runStatus'); + const infoButton = document.querySelector('#runsModeInfoButton'); + const exitButton = document.querySelector('#exitRunModeButton'); + + return [ + runNumber?.children[0]?.textContent === 'Run' && runNumber?.children[1]?.textContent === '#0', + runStatus?.children[0]?.textContent === 'Status:' && runStatus?.children[1]?.textContent === 'ONGOING', + infoButton?.title === 'Show status information', + exitButton?.textContent === 'Exit' && exitButton?.title === 'Exit run mode and show all filters', + ]; + }); + strictEqual(runNumberDisplayed, true, 'runNumber should be displayed'); + strictEqual(runStatusDisplayed, true, 'runStatus should be displayed'); + strictEqual(infoButtonDisplayed, true, 'infoButton should be displayed'); + strictEqual(exitButtonDisplayed, true, 'exitRunModeButton should be displayed'); + }); + + await testParent.test('should show statusInfoDropdown when runsModeInfoButton is clicked', async () => { + await page.click('#runsModeInfoButton'); + await page.waitForSelector('#statusInfoDropdown', { timeout }); + await page.waitForSelector('#runStatusList', { timeout }); + const runStatusList = await page.evaluate(() => { + const runStatusList = document.querySelector('#runStatusList'); + return runStatusList?.children?.length === 2; + }); + strictEqual(runStatusList, true, 'list of status should have 2 elements'); + }); +}; diff --git a/QualityControl/test/public/pages/object-tree.test.js b/QualityControl/test/public/pages/object-tree.test.js index aceae36f0..79a63305f 100644 --- a/QualityControl/test/public/pages/object-tree.test.js +++ b/QualityControl/test/public/pages/object-tree.test.js @@ -39,6 +39,17 @@ export const objectTreePageTests = async (url, page, timeout = 5000, testParent) ok(rowsCount > 1); // more than 1 object in the tree }); + await testParent.test('should not preserve state if refreshed not in run mode', { timeout }, async () => { + const tbodyPath = 'section > div > div > div > table > tbody'; + await page.locator(`${tbodyPath} > tr:nth-child(2)`).click(); + await page.reload({ waitUntil: 'networkidle0' }); + + const rowCount = await page.evaluate(() => + document.querySelectorAll('section > div > div > div > table > tbody > tr').length); + + strictEqual(rowCount, 2); + }); + await testParent.test('should have a button to sort by (default "Name" ASC)', async () => { const sortByButtonTitle = await page.evaluate((path) => document.querySelector(path).title, SORTING_BUTTON_PATH); strictEqual(sortByButtonTitle, 'Sort by'); diff --git a/QualityControl/test/setup/testSetupForBkp.js b/QualityControl/test/setup/testSetupForBkp.js index 3d2a31642..c4fe4d175 100644 --- a/QualityControl/test/setup/testSetupForBkp.js +++ b/QualityControl/test/setup/testSetupForBkp.js @@ -42,4 +42,12 @@ export const initializeNockForBkp = () => { }, }, }); + nock(BKP_URL) + .persist() + .get(`/api/runs/0${TOKEN_PATH}`) + .reply(200, { + data: { + timeO2End: null, + }, + }); }; diff --git a/QualityControl/test/test-index.js b/QualityControl/test/test-index.js index abb9b81d1..72c2ca2c5 100644 --- a/QualityControl/test/test-index.js +++ b/QualityControl/test/test-index.js @@ -36,6 +36,8 @@ import { objectViewFromObjectTreeTests } from './public/pages/object-view-from-o import { objectViewFromLayoutShowTests } from './public/pages/object-view-from-layout-show.test.js'; import { layoutShowTests } from './public/pages/layout-show.test.js'; import { aboutPageTests } from './public/pages/about-page.test.js'; +import { runsModeObjectTreeTests } from './public/features/runsMode/runsModeObjectTree.test.js'; +import { runsModeLayoutShowTests } from './public/features/runsMode/runsModeLayoutShow.test.js'; /** * Backend tests imports @@ -97,6 +99,7 @@ const OBJECT_VIEW_FROM_OBJECT_TREE_PAGE_TIMEOUT = FRONT_END_PER_TEST_TIMEOUT * 5 const OBJECT_VIEW_FROM_LAYOUT_SHOW_PAGE_TIMEOUT = FRONT_END_PER_TEST_TIMEOUT * 4; const LAYOUT_SHOW_PAGE_TIMEOUT = FRONT_END_PER_TEST_TIMEOUT * 23; const ABOUT_VIEW_PAGE_TIMEOUT = FRONT_END_PER_TEST_TIMEOUT * 4; +const RUNS_MODE_TIMEOUT = FRONT_END_PER_TEST_TIMEOUT * 4; const FRONT_END_TIMEOUT = INITIAL_PAGE_SETUP_TIMEOUT + QC_DRAWING_OPTIONS_TIMEOUT @@ -170,6 +173,15 @@ suite('All Tests - QCG', { timeout: FRONT_END_TIMEOUT + BACK_END_TIMEOUT }, asyn ); test('should successfully import and run tests for filter', async (testParent) => filterTests(url, page, FRONT_END_PER_TEST_TIMEOUT, testParent)); + + test( + 'should successfully run runs mode tests', + { timeout: RUNS_MODE_TIMEOUT * 2 }, + async (testParent) => { + await runsModeObjectTreeTests(url, page, FRONT_END_PER_TEST_TIMEOUT, testParent); + await runsModeLayoutShowTests(url, page, FRONT_END_PER_TEST_TIMEOUT, testParent); + }, + ); }); suite('API - test suite', { timeout: FRONT_END_TIMEOUT }, async () => { From 7f7e16c2656d78bbe89ed4c047964cb399c230ef Mon Sep 17 00:00:00 2001 From: George Raduta Date: Mon, 8 Sep 2025 14:03:11 +0200 Subject: [PATCH 27/77] [release/qcg/3.14.0] (#3042) * Bump QCG version * Fix one vulnerability on dependency --- QualityControl/package-lock.json | 22 +++++++++++----------- QualityControl/package.json | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/QualityControl/package-lock.json b/QualityControl/package-lock.json index f13bd9e3b..8962b7dce 100644 --- a/QualityControl/package-lock.json +++ b/QualityControl/package-lock.json @@ -1,12 +1,12 @@ { "name": "@aliceo2/qc", - "version": "3.13.0", + "version": "3.14.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@aliceo2/qc", - "version": "3.13.0", + "version": "3.14.0", "bundleDependencies": [ "@aliceo2/web-ui", "jsroot", @@ -1625,9 +1625,9 @@ "license": "MIT" }, "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -2313,9 +2313,9 @@ } }, "node_modules/editorconfig/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3354,9 +3354,9 @@ } }, "node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { diff --git a/QualityControl/package.json b/QualityControl/package.json index 753416211..5a9472110 100644 --- a/QualityControl/package.json +++ b/QualityControl/package.json @@ -1,6 +1,6 @@ { "name": "@aliceo2/qc", - "version": "3.13.0", + "version": "3.14.0", "description": "O2 Quality Control Web User Interface", "author": "George Raduta", "contributors": [ From 57a20e3f1e6a0794436d66ff84fb3795c29007da Mon Sep 17 00:00:00 2001 From: Jasper H <50981003+Houwie7000@users.noreply.github.com> Date: Mon, 8 Sep 2025 16:29:59 +0200 Subject: [PATCH 28/77] [OGUI-1757] Update layouts controller to allow objects path (#3038) * `getLayoutsHandler` now accepts object_path as query parameter * Introduced new Filter object which can contain the objectPath for seaching layouts. --- .../lib/controllers/LayoutController.js | 7 +- QualityControl/lib/dtos/LayoutDto.js | 4 + QualityControl/lib/dtos/ObjectPathDto.js | 17 +++ .../lib/controllers/LayoutController.test.js | 127 +++++++++++++++++- 4 files changed, 150 insertions(+), 5 deletions(-) create mode 100644 QualityControl/lib/dtos/ObjectPathDto.js diff --git a/QualityControl/lib/controllers/LayoutController.js b/QualityControl/lib/controllers/LayoutController.js index 0ebbbd3d6..aba65e93e 100644 --- a/QualityControl/lib/controllers/LayoutController.js +++ b/QualityControl/lib/controllers/LayoutController.js @@ -52,7 +52,7 @@ export class LayoutController { /** * HTTP GET endpoint for retrieving a list of layouts - * * can be filtered by "owner_id" + * * can be filtered by "owner_id" or "object_path" * * if no owner_id is provided, all layouts will be fetched; * @param {Request} req - HTTP request object with information on owner_id * @param {Response} res - HTTP response object to provide layouts information @@ -61,10 +61,11 @@ export class LayoutController { async getLayoutsHandler(req, res) { let fields = undefined; let owner_id = undefined; + let filter = undefined; try { const validated = await LayoutsGetDto.validateAsync(req.query); - ({ fields, owner_id } = validated); + ({ fields, owner_id, filter } = validated); } catch (error) { const responseError = error.isJoi ? new InvalidInputError(`Invalid query parameters: ${error.details[0].message}`) : @@ -75,7 +76,7 @@ export class LayoutController { } try { - const layouts = await this._layoutRepository.listLayouts({ owner_id, fields }); + const layouts = await this._layoutRepository.listLayouts({ owner_id, fields, filter }); return res.status(200).json(layouts); } catch (error) { logger.errorMessage(`Error retrieving layouts: ${error}`); diff --git a/QualityControl/lib/dtos/LayoutDto.js b/QualityControl/lib/dtos/LayoutDto.js index 958e1e8d6..a285ddb94 100644 --- a/QualityControl/lib/dtos/LayoutDto.js +++ b/QualityControl/lib/dtos/LayoutDto.js @@ -13,6 +13,7 @@ */ import Joi from 'joi'; +import { ObjectPathDto } from './ObjectPathDto.js'; const ALLOWED_LAYOUT_FIELDS = [ 'isOfficial', @@ -84,6 +85,9 @@ export const LayoutDto = Joi.object({ export const LayoutsGetDto = Joi.object({ owner_id: Joi.number().integer().optional(), name: Joi.string().optional(), + filter: Joi.object({ + objectPath: ObjectPathDto, + }).optional(), token: Joi.string().required(), fields: Joi.string() .custom(parseAndValidateFields, 'Field validation') diff --git a/QualityControl/lib/dtos/ObjectPathDto.js b/QualityControl/lib/dtos/ObjectPathDto.js new file mode 100644 index 000000000..a9be32a37 --- /dev/null +++ b/QualityControl/lib/dtos/ObjectPathDto.js @@ -0,0 +1,17 @@ +/** + * @license + * Copyright 2019-2020 CERN and copyright holders of ALICE O2. + * See http://alice-o2.web.cern.ch/copyright for details of the copyright holders. + * All rights not expressly granted are reserved. + * + * This software is distributed under the terms of the GNU General Public + * License v3 (GPL Version 3), copied verbatim in the file "COPYING". + * + * In applying this license CERN does not waive the privileges and immunities + * granted to it by virtue of its status as an Intergovernmental Organization + * or submit itself to any jurisdiction. + */ + +import Joi from 'joi'; + +export const ObjectPathDto = Joi.string().pattern(/^[A-Za-z0-9_\-/]+$/).optional().max(100).label('Object path'); diff --git a/QualityControl/test/lib/controllers/LayoutController.test.js b/QualityControl/test/lib/controllers/LayoutController.test.js index 8779fe792..17dadd83f 100644 --- a/QualityControl/test/lib/controllers/LayoutController.test.js +++ b/QualityControl/test/lib/controllers/LayoutController.test.js @@ -101,7 +101,7 @@ export const layoutControllerTestSuite = async () => { ok(res.status.calledWith(200), 'Response status was not 200'); ok(res.json.calledWith(response), 'A list of layouts should have been sent back'); ok( - jsonStub.listLayouts.calledWith({ owner_id: undefined, fields }), + jsonStub.listLayouts.calledWith({ owner_id: undefined, fields, filter: undefined }), 'Fields were not passed correctly', ); }); @@ -122,7 +122,7 @@ export const layoutControllerTestSuite = async () => { ok(res.status.calledWith(200), 'Response status was not 200'); ok(res.json.calledWith(response), 'A list of layouts should have been sent back'); ok( - jsonStub.listLayouts.calledWith({ owner_id: 1, fields: [fields] }), + jsonStub.listLayouts.calledWith({ owner_id: 1, fields: [fields], filter: undefined }), 'Owner id was not used in data connector call', ); }); @@ -147,6 +147,129 @@ export const layoutControllerTestSuite = async () => { ok(responseArg.message === 'Invalid query parameters: "token" is required', 'Error message incorrect'); }); + test('should return 400 when filter.objectPath contains an invalid type, number', async () => { + const jsonStub = sinon.createStubInstance(LayoutRepository); + const req = { + query: { + filter: { + objectPath: 12345, + }, + token: 'fasdfsdfa', + }, + }; + const layoutConnector = new LayoutController(jsonStub); + + await layoutConnector.getLayoutsHandler(req, res); + + ok(res.status.calledWith(400), 'Response status was not 400'); + ok(res.json.calledOnce, 'Response was not sent'); + + ok(res.json.calledWith({ + message: 'Invalid query parameters: "Object path" must be a string', + status: 400, + title: 'Invalid Input', + }), 'Error message was incorrect'); + }); + + test('should return layouts when filter.objectPath contains a valid value', async () => { + const response = [ + { user_id: 1, name: 'somelayout' }, + { user_id: 2, name: 'somelayout2' }, + ]; + + const jsonStub = sinon.createStubInstance(LayoutRepository, { + listLayouts: sinon.stub().resolves(response), + }); + const req = { + query: { + filter: { + objectPath: 'qc/CPV/MO/NoiseOnFLP/BadChannelMapM2', + }, + token: 'fasdfsdfa', + }, + }; + const layoutConnector = new LayoutController(jsonStub); + + await layoutConnector.getLayoutsHandler(req, res); + + ok(res.json.calledOnce, 'Response was not sent'); + ok(res.json.calledWith(response), 'A list of layouts should have been sent back'); + }); + + test('should return layouts when filter.objectPath contains a valid value, minus character', async () => { + const response = [ + { user_id: 1, name: 'somelayout' }, + { user_id: 2, name: 'somelayout2' }, + ]; + + const jsonStub = sinon.createStubInstance(LayoutRepository, { + listLayouts: sinon.stub().resolves(response), + }); + const req = { + query: { + filter: { + objectPath: 'qc/CPV/MO/NoiseOn-FLP/BadChannelMapM2', + }, + token: 'fasdfsdfa', + }, + }; + const layoutConnector = new LayoutController(jsonStub); + + await layoutConnector.getLayoutsHandler(req, res); + + ok(res.json.calledOnce, 'Response was not sent'); + ok(res.json.calledWith(response), 'A list of layouts should have been sent back'); + }); + + test('should return layouts when filter is present but contains no objectPath', async () => { + const response = [ + { user_id: 1, name: 'somelayout' }, + { user_id: 2, name: 'somelayout2' }, + ]; + + const jsonStub = sinon.createStubInstance(LayoutRepository, { + listLayouts: sinon.stub().resolves(response), + }); + const req = { + query: { + filter: {}, + token: 'fasdfsdfa', + }, + }; + const layoutConnector = new LayoutController(jsonStub); + + await layoutConnector.getLayoutsHandler(req, res); + + ok(res.json.calledOnce, 'Response was not sent'); + ok(res.json.calledWith(response), 'A list of layouts should have been sent back'); + }); + + test('should return 400 when filter.objectPath contain an invalid character: #', async () => { + const jsonStub = sinon.createStubInstance(LayoutRepository); + const req = { + query: { + filter: { + objectPath: 'qc/CPV/MO/Noise#OnFLP/BadChannelMapM2', + }, + token: 'fasdfsdfa', + }, + }; + const layoutConnector = new LayoutController(jsonStub); + + await layoutConnector.getLayoutsHandler(req, res); + + const message = 'Invalid query parameters: "Object path" with value ' + + '"qc/CPV/MO/Noise#OnFLP/BadChannelMapM2" fails to match the required pattern: /^[A-Za-z0-9_\\-/]+$/'; + + ok(res.status.calledWith(400), 'Response status was not 400'); + ok(res.status.calledWith(400), 'Response status was not 400'); + ok(res.json.calledWith({ + message: message, + status: 400, + title: 'Invalid Input', + }), 'Error message is not as expected'); + }); + test('should return 400 when fields contain invalid values', async () => { const jsonStub = sinon.createStubInstance(LayoutRepository); const req = { From ffab90aaa15dfd25619e81a8d5789023b40f7130 Mon Sep 17 00:00:00 2001 From: Jasper H <50981003+Houwie7000@users.noreply.github.com> Date: Tue, 9 Sep 2025 14:48:48 +0200 Subject: [PATCH 29/77] [OGUI-1758] object path filtering in repository layer (#3041) * Repository of layout method, `listLayouts` now accepts objectPath parameter. If defined this parameter will be used to filter layouts by object_paths --- .../lib/repositories/LayoutRepository.js | 34 ++++++++++++++++--- .../lib/repositories/LayoutRepository.test.js | 29 ++++++++++++++++ 2 files changed, 59 insertions(+), 4 deletions(-) diff --git a/QualityControl/lib/repositories/LayoutRepository.js b/QualityControl/lib/repositories/LayoutRepository.js index 442587e77..db43785ef 100644 --- a/QualityControl/lib/repositories/LayoutRepository.js +++ b/QualityControl/lib/repositories/LayoutRepository.js @@ -24,16 +24,42 @@ export class LayoutRepository extends BaseRepository { * @param {number} [options.owner_id] - Filter layouts by owner ID * @param {string} [options.name] - Filter layouts by exact name match * @param {Array} [options.fields] - Array of field names to include in each returned layout object + * @param {object} [options.filter] - Filter layouts by containing filter.objectPath, case insensitive * @returns {Array} Array of layout objects matching the filters, containing only the specified fields * @throws {TypeError} If fields parameter is provided but is not an array * @throws {Error} If any specified field does not exist in the layout objects */ - listLayouts({ name, owner_id, fields = [] } = {}) { + listLayouts({ name, owner_id, fields = [], filter } = {}) { const { layouts } = this._jsonFileService.data; - const layoutFilter = (layout) => - (owner_id === undefined || layout.owner_id === owner_id) && - (name === undefined || layout.name === name); + // Better to lowercase once rather than at every single object_path comparison. + if (filter?.objectPath !== undefined) { + filter.objectPath = filter.objectPath.toLowerCase(); + } + + // Filter using filter.objectPath should filter and its objectPath be defined, + // otherwise filter by name and owner_id. + const layoutFilter = filter?.objectPath !== undefined ? + + /** + * Filter layouts using the objectPath on included objects + * @param {Layout} layout - layout to filter trough + * @returns {boolean} - filter condition satisfied, based on objectPath + */ + (layout) => + (layout.tabs ?? []) + .flatMap((tab) => tab.objects ?? []) + .filter((object) => (object.name ?? '').toLowerCase().includes(filter.objectPath)).length > 0 + : + + /** + * Filter layouts using the layout.owner_id and or layout.name + * @param {Layout} layout - layout to filter trough + * @returns {boolean} - filter condition satisfied, based on owner_id and or layout.name + */ + (layout) => + (owner_id === undefined || layout.owner_id === owner_id) && + (name === undefined || layout.name === name); const filteredLayouts = layouts.filter(layoutFilter); diff --git a/QualityControl/test/lib/repositories/LayoutRepository.test.js b/QualityControl/test/lib/repositories/LayoutRepository.test.js index 97fd83e86..d5d1b2104 100644 --- a/QualityControl/test/lib/repositories/LayoutRepository.test.js +++ b/QualityControl/test/lib/repositories/LayoutRepository.test.js @@ -68,6 +68,35 @@ export const layoutRepositoryTest = async () => { ); }); + test('should return only layout with specified filter.objectPath', () => { + const objectPath = 'qc/MCH/QO/DataDecodingCheck'; + const result = layoutRepository.listLayouts({ filter: { + objectPath: objectPath, + } }); + ok(result.length === 1, "listLayouts's filter.objectPath should only return one layout"); + }); + + test('should return layouts with specified partial filter.objectPath', () => { + const objectPath = '/1'; + const result = layoutRepository.listLayouts({ filter: { + objectPath, + } }); + ok(result.length === 2, "listLayouts's filter.objectPath should only return 2 layouts"); + }); + + test('should return all layouts when filter.objectPath is empty string', () => { + const objectPath = ''; + const result = layoutRepository.listLayouts({ filter: { + objectPath, + } }); + ok(result.length === 3, "listLayouts's filter.objectPath should only return 3 (all) layouts"); + }); + + test('should return all layouts when filter is an empty object', () => { + const result = layoutRepository.listLayouts({ filter: {} }); + ok(result.length === 3, "listLayouts's empty filter object should only return 3 (all) layouts"); + }); + test('should return only specified fields when fields array is provided', () => { const fields = ['id', 'name']; const result = layoutRepository.listLayouts({ fields }); From 4645d4c985300bef2fb1b421491fac6a36c26976 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Sep 2025 16:04:08 +0200 Subject: [PATCH 30/77] Bump puppeteer in /Control in the dev-dependencies group (#3044) Bumps the dev-dependencies group in /Control with 1 update: [puppeteer](https://github.com/puppeteer/puppeteer). Updates `puppeteer` from 24.18.0 to 24.19.0 - [Release notes](https://github.com/puppeteer/puppeteer/releases) - [Changelog](https://github.com/puppeteer/puppeteer/blob/main/CHANGELOG.md) - [Commits](https://github.com/puppeteer/puppeteer/compare/puppeteer-v24.18.0...puppeteer-v24.19.0) --- updated-dependencies: - dependency-name: puppeteer dependency-version: 24.19.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-dependencies ... --- Control/package-lock.json | 26 +++++++++++++------------- Control/package.json | 2 +- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Control/package-lock.json b/Control/package-lock.json index 7a0b2c9ce..6f23d0e4c 100644 --- a/Control/package-lock.json +++ b/Control/package-lock.json @@ -27,7 +27,7 @@ "nock": "^14.0.0", "nyc": "^17.1.0", "proxyquire": "^2.1.3", - "puppeteer": "^24.18.0", + "puppeteer": "^24.19.0", "sinon": "21.0.0", "supertest": "7.1.0" }, @@ -1985,9 +1985,9 @@ } }, "node_modules/devtools-protocol": { - "version": "0.0.1475386", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1475386.tgz", - "integrity": "sha512-RQ809ykTfJ+dgj9bftdeL2vRVxASAuGU+I9LEx9Ij5TXU5HrgAQVmzi72VA+mkzscE12uzlRv5/tWWv9R9J1SA==", + "version": "0.0.1495869", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1495869.tgz", + "integrity": "sha512-i+bkd9UYFis40RcnkW7XrOprCujXRAHg62IVh/Ah3G8MmNXpCGt1m0dTFhSdx/AVs8XEMbdOGRwdkR1Bcta8AA==", "dev": true, "license": "BSD-3-Clause" }, @@ -5030,9 +5030,9 @@ } }, "node_modules/puppeteer": { - "version": "24.18.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.18.0.tgz", - "integrity": "sha512-Ke8oL/87GhzKIM2Ag6Yj49t5xbGc4rspGIuSuFLFCQBtYzWqCSanvqoCu08WkI78rbqcwnHjxiTH6oDlYFrjrw==", + "version": "24.19.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.19.0.tgz", + "integrity": "sha512-gUWgHX36m9K6yUbvNBEA7CXElIL92yXMoAVFrO8OpZkItqrruLVqYA8ikmfgwcw/cNfYgkt0n2+yP9jd9RSETA==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", @@ -5040,8 +5040,8 @@ "@puppeteer/browsers": "2.10.8", "chromium-bidi": "8.0.0", "cosmiconfig": "^9.0.0", - "devtools-protocol": "0.0.1475386", - "puppeteer-core": "24.18.0", + "devtools-protocol": "0.0.1495869", + "puppeteer-core": "24.19.0", "typed-query-selector": "^2.12.0" }, "bin": { @@ -5052,16 +5052,16 @@ } }, "node_modules/puppeteer-core": { - "version": "24.18.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.18.0.tgz", - "integrity": "sha512-As0BvfXxek2MbV0m7iqBmQKFnfSrzSvTM4zGipjd4cL+9f2Ccgut6RvHlc8+qBieKHqCMFy9BSI4QyveoYXTug==", + "version": "24.19.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.19.0.tgz", + "integrity": "sha512-qsEys4OIb2VGC2tNWKAs4U0mnjkIAxueMOOzk2nEFM9g4Y8QuvYkEMtmwsEdvzNGsUFd7DprOQfABmlN7WBOlg==", "dev": true, "license": "Apache-2.0", "dependencies": { "@puppeteer/browsers": "2.10.8", "chromium-bidi": "8.0.0", "debug": "^4.4.1", - "devtools-protocol": "0.0.1475386", + "devtools-protocol": "0.0.1495869", "typed-query-selector": "^2.12.0", "ws": "^8.18.3" }, diff --git a/Control/package.json b/Control/package.json index 49d987a6b..f5ce0472e 100644 --- a/Control/package.json +++ b/Control/package.json @@ -46,7 +46,7 @@ "nock": "^14.0.0", "nyc": "^17.1.0", "proxyquire": "^2.1.3", - "puppeteer": "^24.18.0", + "puppeteer": "^24.19.0", "sinon": "21.0.0", "supertest": "7.1.0" }, From c766c3fbf4928d6495a7538df3d31af4486bb96e Mon Sep 17 00:00:00 2001 From: Alejandro Mariscal Romero <87366244+mariscalromeroalejandro@users.noreply.github.com> Date: Tue, 9 Sep 2025 17:21:31 +0200 Subject: [PATCH 31/77] [OGUI-1762] Improve user messages when accessing runs mode (#3049) * New ERROR status to display error notifications when the run number set is not allowed * Warning notifications for: not found, bookkeeping unavailable or unknown statuses * Remove the double validation made to run numbers and apply only validation using the DTO in one middleware * Runs mode middleware will only check if the run number is provided when in run mode as it will be validated previously by the ObjectsGetDTO if provided --- .../common/library/runStatus.enum.js | 1 + QualityControl/lib/dtos/ObjectGetDto.js | 3 +- .../lib/dtos/filters/RunNumberDto.js | 4 +- .../middleware/filters/runMode.middleware.js | 17 ++--- .../filters/runStatusFilter.middleware.js | 5 ++ QualityControl/lib/services/FilterService.js | 5 -- .../common/filters/model/FilterModel.js | 21 ++++-- .../public/services/Filter.service.js | 24 ++++--- .../api/filters/api-get-run-status.test.js | 2 +- .../filters/runMode.middleware.test.js | 70 ------------------- .../runStatusFilter.middleware.test.js | 2 +- ...GetByContentsValidation.middleware.test.js | 2 +- ...objectGetByIdValidation.middleware.test.js | 2 +- .../objectsGetValidation.middleware.test.js | 4 +- .../test/lib/services/FilterService.test.js | 27 ------- 15 files changed, 48 insertions(+), 141 deletions(-) diff --git a/QualityControl/common/library/runStatus.enum.js b/QualityControl/common/library/runStatus.enum.js index 4b24f9a8b..0e23723e0 100644 --- a/QualityControl/common/library/runStatus.enum.js +++ b/QualityControl/common/library/runStatus.enum.js @@ -18,4 +18,5 @@ export const RunStatus = Object.freeze({ NOT_FOUND: 'NOT_FOUND', UNKNOWN: 'UNKNOWN', BOOKKEEPING_UNAVAILABLE: 'BOOKKEEPING_UNAVAILABLE', + ERROR: 'ERROR', }); diff --git a/QualityControl/lib/dtos/ObjectGetDto.js b/QualityControl/lib/dtos/ObjectGetDto.js index 551da7b2f..0cb7aa032 100644 --- a/QualityControl/lib/dtos/ObjectGetDto.js +++ b/QualityControl/lib/dtos/ObjectGetDto.js @@ -13,6 +13,7 @@ */ import Joi from 'joi'; +import { RunNumberDto } from './filters/RunNumberDto.js'; const periodNamePattern = /^LHC\d{1,2}[a-z]+$/i; @@ -23,7 +24,7 @@ const periodNamePattern = /^LHC\d{1,2}[a-z]+$/i; */ function createFiltersSchema(runTypes) { return Joi.object({ - RunNumber: Joi.number().integer().min(0).max(999999).optional(), + RunNumber: RunNumberDto.optional(), RunType: runTypes.length > 0 ? Joi.string().valid(...runTypes).optional() : Joi.string().optional(), diff --git a/QualityControl/lib/dtos/filters/RunNumberDto.js b/QualityControl/lib/dtos/filters/RunNumberDto.js index 02f3d8923..1ea1da806 100644 --- a/QualityControl/lib/dtos/filters/RunNumberDto.js +++ b/QualityControl/lib/dtos/filters/RunNumberDto.js @@ -15,14 +15,12 @@ import Joi from 'joi'; export const RunNumberDto = Joi.number() - .required() .integer() .min(0) .max(999999) .messages({ - 'any.required': 'Run number is required', 'number.base': 'Run number must be a number', 'number.integer': 'Run number must be an integer', - 'number.min': 'Run number must be positive', + 'number.min': 'Run number must be greater than 0', 'number.max': 'Run number must not exceed 999999', }); diff --git a/QualityControl/lib/middleware/filters/runMode.middleware.js b/QualityControl/lib/middleware/filters/runMode.middleware.js index f012a3c6e..a82fec34e 100644 --- a/QualityControl/lib/middleware/filters/runMode.middleware.js +++ b/QualityControl/lib/middleware/filters/runMode.middleware.js @@ -13,7 +13,6 @@ */ import { InvalidInputError, updateAndSendExpressResponseFromNativeError } from '@aliceo2/web-ui'; -import { RunNumberDto } from '../../dtos/filters/RunNumberDto.js'; /** * Middleware function to validate the run number if in run mode. @@ -24,20 +23,12 @@ import { RunNumberDto } from '../../dtos/filters/RunNumberDto.js'; */ export const runModeMiddleware = async (req, res, next) => { const { inRunMode = false, filters = {} } = req.query; - if (!inRunMode) { - next(); - return; - } - try { - const validatedRunNumber = await RunNumberDto.validateAsync(filters?.RunNumber); - req.query.filters = { ...filters, RunNumber: validatedRunNumber }; - next(); - } catch (error) { + if (inRunMode && !filters.RunNumber) { updateAndSendExpressResponseFromNativeError( res, - error.isJoi - ? new InvalidInputError(error.details[0].message) - : error, + new InvalidInputError('Run number is required'), ); + return; } + next(); }; diff --git a/QualityControl/lib/middleware/filters/runStatusFilter.middleware.js b/QualityControl/lib/middleware/filters/runStatusFilter.middleware.js index 9b18170f2..1f6782a45 100644 --- a/QualityControl/lib/middleware/filters/runStatusFilter.middleware.js +++ b/QualityControl/lib/middleware/filters/runStatusFilter.middleware.js @@ -25,9 +25,13 @@ f */ export const runStatusFilterMiddleware = async (req, res, next) => { try { + if (!req.params.runNumber) { + throw new InvalidInputError('Run number is required'); + } const validatedRunNumber = await RunNumberDto.validateAsync(req.params.runNumber); req.params.runNumber = validatedRunNumber; next(); + return; } catch (error) { updateAndSendExpressResponseFromNativeError( res, @@ -35,5 +39,6 @@ export const runStatusFilterMiddleware = async (req, res, next) => { ? new InvalidInputError(error.details[0].message) : error, ); + return; } }; diff --git a/QualityControl/lib/services/FilterService.js b/QualityControl/lib/services/FilterService.js index c5778f148..9a3a4f435 100644 --- a/QualityControl/lib/services/FilterService.js +++ b/QualityControl/lib/services/FilterService.js @@ -92,11 +92,6 @@ export class FilterService { async getRunStatus(runNumber) { try { const runStatus = await this._bookkeepingService.retrieveRunStatus(runNumber); - - if (!runStatus || !Object.values(RunStatus).includes(runStatus)) { - this._logger.warnMessage(`Invalid run status received for run ${runNumber}: ${runStatus}`); - return RunStatus.UNKNOWN; - } return runStatus; } catch (error) { const message = `Error while retrieving run status for run ${runNumber}: ${error.message || error}`; diff --git a/QualityControl/public/common/filters/model/FilterModel.js b/QualityControl/public/common/filters/model/FilterModel.js index cb3411812..12937216f 100644 --- a/QualityControl/public/common/filters/model/FilterModel.js +++ b/QualityControl/public/common/filters/model/FilterModel.js @@ -39,6 +39,7 @@ export default class FilterModel extends Observable { this._inRunMode = false; this._runNumber = null; this._runStatus = RunStatus.UNKNOWN; + this._reason = ''; this.dropdownOpen = false; this.statusInfoOpen = false; } @@ -115,7 +116,9 @@ export default class FilterModel extends Observable { async triggerFilter(baseViewModel) { this.setFilterToURL(); if (this.inRunMode) { - this.runStatus = await this.filterService.getRunStatus(this.runNumber); + const { status, reason } = await this.filterService.getRunStatus(this.runNumber); + this._reason = reason; + this.runStatus = status; } baseViewModel.triggerFilter(); } @@ -297,8 +300,6 @@ export default class FilterModel extends Observable { * @returns {void} */ set runStatus(runStatus) { - this._runStatus = runStatus; - // exit runs mode if run is not found or status is unknown if (this.inRunMode && runStatus !== RunStatus.ONGOING && runStatus !== RunStatus.ENDED) { setTimeout(async () => { @@ -311,16 +312,22 @@ export default class FilterModel extends Observable { case RunStatus.BOOKKEEPING_UNAVAILABLE: reason = 'The bookkeeping service is not available.'; break; + case RunStatus.UNKNOWN: + reason = 'Unknwon reason'; + break; default: - reason = 'Unable to retrieve the run status.'; + reason = this._reason; } - await this.deactivateRunsMode(this._currentViewModel); - this.model.notification.show(`Runs mode cannot be accesed: ${reason}`, 'warning', 4000); + this.model.notification.show( + `Runs mode cannot be accesed: ${reason}`, + runStatus === RunStatus.ERROR ? 'danger' : 'warning', + 4000, + ); } }, 0); } - + this._runStatus = runStatus; this.notify(); } diff --git a/QualityControl/public/services/Filter.service.js b/QualityControl/public/services/Filter.service.js index f7814f463..0724e1e37 100644 --- a/QualityControl/public/services/Filter.service.js +++ b/QualityControl/public/services/Filter.service.js @@ -53,19 +53,25 @@ export default class FilterService { */ async getRunStatus(runNumber) { try { + let status = RunStatus.UNKNOWN; + let reason = ''; const parsedRunNumber = parseInt(runNumber, 10); if (Number.isNaN(parsedRunNumber)) { - return RunStatus.UNKNOWN; + status = RunStatus.ERROR; + reason = 'Run number provided is not a number'; + } else { + const { result, ok } = await this.loader.get(`/api/filter/run-status/${parsedRunNumber}`); + if (!ok || !result || !Object.values(RunStatus).includes(result?.runStatus)) { + status = RunStatus.ERROR; + reason = result?.message; + } else { + status = result?.runStatus; + } } - - const { result, ok } = await this.loader.get(`/api/filter/run-status/${parsedRunNumber}`); - - if (!ok || !result || !Object.values(RunStatus).includes(result?.runStatus)) { - return RunStatus.UNKNOWN; - } - - return result?.runStatus; + return { + status, reason, + }; } catch { return RunStatus.UNKNOWN; } diff --git a/QualityControl/test/api/filters/api-get-run-status.test.js b/QualityControl/test/api/filters/api-get-run-status.test.js index c5fc67343..e8c77413e 100644 --- a/QualityControl/test/api/filters/api-get-run-status.test.js +++ b/QualityControl/test/api/filters/api-get-run-status.test.js @@ -37,7 +37,7 @@ export const apiGetRunStatusTests = () => { await request(`${URL_ADDRESS}/api/filter/run-status/-1`) .get(`?token=${OWNER_TEST_TOKEN}`) .expect(400, { - message: 'Run number must be positive', + message: 'Run number must be greater than 0', status: 400, title: 'Invalid Input', }); diff --git a/QualityControl/test/lib/middlewares/filters/runMode.middleware.test.js b/QualityControl/test/lib/middlewares/filters/runMode.middleware.test.js index dfc6d6ac2..0dfa34f28 100644 --- a/QualityControl/test/lib/middlewares/filters/runMode.middleware.test.js +++ b/QualityControl/test/lib/middlewares/filters/runMode.middleware.test.js @@ -48,76 +48,6 @@ export const runModeMiddlewareTest = () => { ok(next.calledOnce, 'next() should be called once'); }); - test('should return 400 error if in run mode but RunNumber filter is invalid', async () => { - const req = { - query: { - inRunMode: true, - filters: { - RunNumber: 'invalid', - }, - }, - }; - const res = { - status: sinon.stub().returnsThis(), - json: sinon.stub(), - }; - const next = sinon.stub(); - - await runModeMiddleware(req, res, next); - - ok(res.status.calledWith(400), 'Status should be 400'); - ok(res.json.calledWith({ - message: 'Run number must be a number', - status: 400, - title: 'Invalid Input', - }), 'Should return validation error message'); - ok(!next.called, 'next() should not be called'); - }); - - test('should return 400 error if in run mode but RunNumber is negative', async () => { - const req = { - query: { - inRunMode: true, - filters: { - RunNumber: -1, - }, - }, - }; - const res = { - status: sinon.stub().returnsThis(), - json: sinon.stub(), - }; - const next = sinon.stub(); - - await runModeMiddleware(req, res, next); - - ok(res.status.calledWith(400), 'Status should be 400'); - ok(res.json.calledWith({ - message: 'Run number must be positive', - status: 400, - title: 'Invalid Input', - }), 'Should return validation error message'); - ok(!next.called, 'next() should not be called'); - }); - - test('should successfully validate and parse RunNumber when in run mode', async () => { - const req = { - query: { - inRunMode: true, - filters: { - RunNumber: '123456', - }, - }, - }; - const res = {}; - const next = sinon.stub(); - - await runModeMiddleware(req, res, next); - - ok(req.query.filters.RunNumber === 123456, 'RunNumber should be parsed to integer'); - ok(next.calledOnce, 'next() should be called once'); - }); - test('should handle missing filters object when in run mode', async () => { const req = { query: { diff --git a/QualityControl/test/lib/middlewares/filters/runStatusFilter.middleware.test.js b/QualityControl/test/lib/middlewares/filters/runStatusFilter.middleware.test.js index 7cd72cf14..01f642dfb 100644 --- a/QualityControl/test/lib/middlewares/filters/runStatusFilter.middleware.test.js +++ b/QualityControl/test/lib/middlewares/filters/runStatusFilter.middleware.test.js @@ -82,7 +82,7 @@ export const runStatusFilterMiddlewareTest = () => { ok(res.status.calledWith(400), 'Status should be 400'); ok(res.json.calledWith({ - message: 'Run number must be positive', + message: 'Run number must be greater than 0', status: 400, title: 'Invalid Input', }), 'Should return validation error message'); diff --git a/QualityControl/test/lib/middlewares/objects/objectGetByContentsValidation.middleware.test.js b/QualityControl/test/lib/middlewares/objects/objectGetByContentsValidation.middleware.test.js index b78a719d1..116627b90 100644 --- a/QualityControl/test/lib/middlewares/objects/objectGetByContentsValidation.middleware.test.js +++ b/QualityControl/test/lib/middlewares/objects/objectGetByContentsValidation.middleware.test.js @@ -120,7 +120,7 @@ export const objectGetContentsValidationMiddlewareTest = () => { await middleWare(req, res, next); ok(res.status.calledWith(400), 'Should return 400 status'); ok(res.json.calledWithMatch({ - message: 'Invalid query parameters: "filters.RunNumber" must be a number', + message: 'Invalid query parameters: Run number must be a number', status: 400, title: 'Invalid Input', }), 'Should return validation error'); diff --git a/QualityControl/test/lib/middlewares/objects/objectGetByIdValidation.middleware.test.js b/QualityControl/test/lib/middlewares/objects/objectGetByIdValidation.middleware.test.js index da8f643c1..39c2d35e5 100644 --- a/QualityControl/test/lib/middlewares/objects/objectGetByIdValidation.middleware.test.js +++ b/QualityControl/test/lib/middlewares/objects/objectGetByIdValidation.middleware.test.js @@ -96,7 +96,7 @@ export const objectGetByIdValidationMiddlewareTest = () => { await middleWare(req, res, next); ok(res.status.calledWith(400), 'Should return 400 status'); ok(res.json.calledWithMatch({ - message: 'Invalid query parameters: "filters.RunNumber" must be a number', + message: 'Invalid query parameters: Run number must be a number', status: 400, title: 'Invalid Input', }), 'Should return validation error'); diff --git a/QualityControl/test/lib/middlewares/objects/objectsGetValidation.middleware.test.js b/QualityControl/test/lib/middlewares/objects/objectsGetValidation.middleware.test.js index 528630811..5bfd13093 100644 --- a/QualityControl/test/lib/middlewares/objects/objectsGetValidation.middleware.test.js +++ b/QualityControl/test/lib/middlewares/objects/objectsGetValidation.middleware.test.js @@ -80,7 +80,7 @@ export const objectsGetValidationMiddlewareTest = () => { ok(res.status.calledWith(400), 'Should return 400 status'); ok(res.json.calledWithMatch({ - message: 'Invalid query parameters: "filters.RunNumber" must be less than or equal to 999999', + message: 'Invalid query parameters: Run number must not exceed 999999', status: 400, title: 'Invalid Input', }), 'Should return validation error'); @@ -92,7 +92,7 @@ export const objectsGetValidationMiddlewareTest = () => { ok(res.status.calledWith(400), 'Should return 400 status'); ok(res.json.calledWithMatch({ - message: 'Invalid query parameters: "filters.RunNumber" must be greater than or equal to 0', + message: 'Invalid query parameters: Run number must be greater than 0', status: 400, title: 'Invalid Input', }), 'Should return validation error'); diff --git a/QualityControl/test/lib/services/FilterService.test.js b/QualityControl/test/lib/services/FilterService.test.js index 0df1af87a..68b09b685 100644 --- a/QualityControl/test/lib/services/FilterService.test.js +++ b/QualityControl/test/lib/services/FilterService.test.js @@ -145,33 +145,6 @@ export const filterServiceTestSuite = async () => { deepStrictEqual(result, RunStatus.NOT_FOUND); }); - test('should return UNKNOWN when bookkeeping service returns null', async () => { - bookkeepingServiceMock.retrieveRunStatus.resolves(null); - - const result = await filterService.getRunStatus(123456); - - deepStrictEqual(bookkeepingServiceMock.retrieveRunStatus.calledWith(123456), true); - deepStrictEqual(result, RunStatus.UNKNOWN); - }); - - test('should return UNKNOWN when bookkeeping service returns undefined', async () => { - bookkeepingServiceMock.retrieveRunStatus.resolves(undefined); - - const result = await filterService.getRunStatus(123456); - - deepStrictEqual(bookkeepingServiceMock.retrieveRunStatus.calledWith(123456), true); - deepStrictEqual(result, RunStatus.UNKNOWN); - }); - - test('should return UNKNOWN when bookkeeping service returns invalid status', async () => { - bookkeepingServiceMock.retrieveRunStatus.resolves('INVALID_STATUS'); - - const result = await filterService.getRunStatus(123456); - - deepStrictEqual(bookkeepingServiceMock.retrieveRunStatus.calledWith(123456), true); - deepStrictEqual(result, RunStatus.UNKNOWN); - }); - test('should return UNKNOWN when bookkeeping service throws error', async () => { const testError = new Error('Bookkeeping service unavailable'); bookkeepingServiceMock.retrieveRunStatus.rejects(testError); From 402d54ab61b3c23d44082471b5328da9100ab07c Mon Sep 17 00:00:00 2001 From: George Raduta Date: Wed, 10 Sep 2025 15:59:45 +0200 Subject: [PATCH 32/77] [OGUI-1748] QC should be using logging that has facility set per process env (#3052) * [OGUI-1748] Logging to use process.env in QCG and documentation (#3008) --- QualityControl/README.md | 1 + .../docs/QCG_Developer_Logging_Conventions.md | 41 +++++++++++++++++++ .../lib/controllers/ObjectController.js | 4 +- .../lib/controllers/UserController.js | 13 +++--- .../lib/database/SequelizeDatabase.js | 4 +- QualityControl/lib/database/index.js | 4 +- .../20250424113921-add-default-options.mjs | 1 - .../lib/services/BookkeepingService.js | 17 ++++---- QualityControl/lib/services/FilterService.js | 4 +- .../lib/services/JsonFileService.js | 13 +++--- .../lib/services/QcObject.service.js | 2 +- .../lib/services/ccdb/CcdbService.js | 3 +- QualityControl/lib/utils/httpRequests.js | 4 +- .../test/setup/testRepositorySetup.js | 2 +- 14 files changed, 85 insertions(+), 28 deletions(-) create mode 100644 QualityControl/docs/QCG_Developer_Logging_Conventions.md diff --git a/QualityControl/README.md b/QualityControl/README.md index b9c1383b2..21d6e8104 100644 --- a/QualityControl/README.md +++ b/QualityControl/README.md @@ -12,6 +12,7 @@ QCG is a **Web-based graphical user interface (GUI)** designed for [**O2/` +The standard for the log_facility is: `/` + +> **Note:** The `` portion should be a descriptive name for the service, module, or controller (e.g., `bkp-service`, `obj-controller`). This helps make logs more readable and traceable. Avoid using generic filenames; prefer meaningful service names as shown in the examples below. +### Setting the Log Facility + +The log facility string should be built using the `process.env.npm_config_log_label` environment variable. If not set, a sensible default (e.g., `qcg`) should be used. + +### Example: Setting Up Logging in BookkeepingService + +```js +import { LogManager } from '@aliceo2/web-ui'; + +// Use the environment variable or a default value +const LOG_FACILITY = `${process.env.npm_config_log_label ?? 'qcg'}/bkp-service`; + +// Initialize the logger for this service +this._logger = LogManager.getLogger(LOG_FACILITY); + +// Usage example +this._logger.infoMessage('BookkeepingService started'); +``` + +### Best Practices + +- **Always use the provided logger:** Do not use `console.log` or other logging libraries directly. +- **Set the log label via environment variable:** This ensures logs are correctly attributed in multi-instance deployments. +- **Log meaningful events:** Include context in log messages to aid debugging and monitoring. diff --git a/QualityControl/lib/controllers/ObjectController.js b/QualityControl/lib/controllers/ObjectController.js index 022c334e2..1dfdcda90 100644 --- a/QualityControl/lib/controllers/ObjectController.js +++ b/QualityControl/lib/controllers/ObjectController.js @@ -14,6 +14,8 @@ 'use strict'; import { LogManager, updateAndSendExpressResponseFromNativeError } from '@aliceo2/web-ui'; +const LOG_FACILITY = `${process.env.npm_config_log_label ?? 'qcg'}/obj-controller`; + /** * Gateway for all QC Objects requests * @class @@ -35,7 +37,7 @@ export class ObjectController { * @type {RunMonitoringService} */ this._runModeService = runModeService; - this._logger = LogManager.getLogger(`${process.env.npm_config_log_label ?? 'qcg'}/object-ctrl`); + this._logger = LogManager.getLogger(LOG_FACILITY); } /** diff --git a/QualityControl/lib/controllers/UserController.js b/QualityControl/lib/controllers/UserController.js index be611f4d8..9c67da4ca 100644 --- a/QualityControl/lib/controllers/UserController.js +++ b/QualityControl/lib/controllers/UserController.js @@ -13,14 +13,14 @@ */ import assert from 'assert'; -import { LogManager } from '@aliceo2/web-ui'; +import { LogLevel, LogManager } from '@aliceo2/web-ui'; + +const LOG_FACILITY = `${process.env.npm_config_log_label ?? 'qcg'}/user-controller`; /** * @typedef {import('../repositories/UserRepository.js').UserRepository} UserRepository */ -const logger = LogManager.getLogger(`${process.env.npm_config_log_label ?? 'qcg'}/user`); - /** * Gateway for all User data calls */ @@ -32,6 +32,7 @@ export class UserController { */ constructor(userRepository) { assert(userRepository, 'Missing User Repository'); + this._logger = LogManager.getLogger(LOG_FACILITY); /** * User repository for interacting with user data. @@ -56,9 +57,11 @@ export class UserController { res.status(200).json({ ok: true }); } catch (err) { if (err.stack) { - logger.trace(err); + this._logger.trace(err); } - logger.error('Unable to add user to memory'); + this._logger.errorMessage('Unable to add user to memory', { + level: LogLevel.SUPPORT, + }); res.status(502).json({ ok: false, message: 'Unable to add user to memory' }); } } diff --git a/QualityControl/lib/database/SequelizeDatabase.js b/QualityControl/lib/database/SequelizeDatabase.js index 07eeb9b39..9542e4ff2 100644 --- a/QualityControl/lib/database/SequelizeDatabase.js +++ b/QualityControl/lib/database/SequelizeDatabase.js @@ -21,12 +21,14 @@ import { getDbConfig } from '../config/database.js'; import models from './models/index.js'; import { SequelizeStorage } from 'umzug'; +const LOG_FACILITY = `${process.env.npm_config_log_label ?? 'qcg'}/database`; + /** * Sequelize implementation of the Database. */ export class SequelizeDatabase { constructor(config) { - this._logger = LogManager.getLogger('qcg/database'); + this._logger = LogManager.getLogger(LOG_FACILITY); if (!config) { this._logger.warnMessage('No configuration provided for SequelizeDatabase. Using default configuration.'); diff --git a/QualityControl/lib/database/index.js b/QualityControl/lib/database/index.js index ea90a4f5d..7553cdfc6 100644 --- a/QualityControl/lib/database/index.js +++ b/QualityControl/lib/database/index.js @@ -14,13 +14,15 @@ import { LogManager } from '@aliceo2/web-ui'; +const LOG_FACILITY = `${process.env.npm_config_log_label ?? 'qcg'}/database`; + /** * Initializes the database connection and runs migrations. * @param {object} sequelizeDatabase - The Sequelize database instance. * @returns {Promise} A promise that resolves when the database is initialized. */ export const initDatabase = async (sequelizeDatabase) => { - const _logger = LogManager.getLogger('qcg/database'); + const _logger = LogManager.getLogger(LOG_FACILITY); try { await sequelizeDatabase.connect(); await sequelizeDatabase.migrate(); diff --git a/QualityControl/lib/database/migrations/20250424113921-add-default-options.mjs b/QualityControl/lib/database/migrations/20250424113921-add-default-options.mjs index 4c4a342fb..0a71ce0d8 100644 --- a/QualityControl/lib/database/migrations/20250424113921-add-default-options.mjs +++ b/QualityControl/lib/database/migrations/20250424113921-add-default-options.mjs @@ -15,7 +15,6 @@ /** * Creates default options for drawing and display hints in the database. * @param {object} queryInterface - The Sequelize query interface. - * @param {Sequelize} Sequelize - The Sequelize library. * @returns {Promise} A promise that resolves when the options are created. */ export const up = async (queryInterface) => { diff --git a/QualityControl/lib/services/BookkeepingService.js b/QualityControl/lib/services/BookkeepingService.js index d5b96f43b..561e97fc0 100644 --- a/QualityControl/lib/services/BookkeepingService.js +++ b/QualityControl/lib/services/BookkeepingService.js @@ -16,11 +16,12 @@ import { RunStatus } from '../../common/library/runStatus.enum.js'; import { httpGetJson } from '../utils/httpRequests.js'; import { LogManager } from '@aliceo2/web-ui'; -const logger = LogManager.getLogger(`${process.env.npm_config_log_label ?? 'bkp-service'}`); const GET_BKP_DATABASE_STATUS_PATH = '/api/status/database'; const GET_RUN_TYPES_PATH = '/api/runTypes'; const GET_RUN_PATH = '/api/runs'; +const LOG_FACILITY = `${process.env.npm_config_log_label ?? 'qcg'}/bkp-service`; + /** * BookkeepingService class to be used to retrieve data from Bookkeeping */ @@ -34,6 +35,8 @@ export class BookkeepingService { this._port = null; this._token = ''; this._protocol = ''; + + this._logger = LogManager.getLogger(LOG_FACILITY); } /** @@ -69,12 +72,12 @@ export class BookkeepingService { */ async connect() { if (!this.validateConfig()) { - logger.infoMessage(`Bookkeeping service will not be used. Reason: ${this.error}`); + this._logger.infoMessage(`Bookkeeping service will not be used. Reason: ${this.error}`); return; } this.active = await this.simulateConnection(); if (!this.active) { - logger.infoMessage(`Bookkeeping service will not be used. Reason: ${this.error}`); + this._logger.infoMessage(`Bookkeeping service will not be used. Reason: ${this.error}`); } } @@ -94,7 +97,7 @@ export class BookkeepingService { }, ); if (data && data?.status?.ok && data?.status?.configured) { - logger.infoMessage('Successfully connected to Bookkeeping'); + this._logger.infoMessage('Successfully connected to Bookkeeping'); return true; } else { this.error = 'Bookkeeping service is not configured or status is not OK'; @@ -133,7 +136,7 @@ export class BookkeepingService { */ async retrieveRunStatus(runNumber) { if (!this.active) { - logger.warnMessage('Could not connect to bookkeeping'); + this._logger.warnMessage('Could not connect to bookkeeping'); return RunStatus.BOOKKEEPING_UNAVAILABLE; } @@ -151,10 +154,10 @@ export class BookkeepingService { } catch (error) { const msg = error?.message ?? String(error); if (msg.includes('404')) { - logger.warnMessage(`Run number ${runNumber} not found in bookkeeping`); + this._logger.warnMessage(`Run number ${runNumber} not found in bookkeeping`); return RunStatus.NOT_FOUND; } - logger.errorMessage(`Error fetching run status: ${error.message || error}`); + this._logger.errorMessage(`Error fetching run status: ${error.message || error}`); return RunStatus.UNKNOWN; } } diff --git a/QualityControl/lib/services/FilterService.js b/QualityControl/lib/services/FilterService.js index 9a3a4f435..0612dc39c 100644 --- a/QualityControl/lib/services/FilterService.js +++ b/QualityControl/lib/services/FilterService.js @@ -14,7 +14,8 @@ import { LogManager } from '@aliceo2/web-ui'; import { RunStatus } from '../../common/library/runStatus.enum.js'; -const LOG_FACILITY = `${process.env.npm_config_log_label ?? 'qcg'}/filter-svc`; + +const LOG_FACILITY = `${process.env.npm_config_log_label ?? 'qcg'}/filter-service`; /** * High level service that composes, processes and maps data from the bookkeeping service @@ -29,6 +30,7 @@ export class FilterService { this._logger = LogManager.getLogger(LOG_FACILITY); this._bookkeepingService = bookkeepingService; this._runTypes = []; + this.initFilters(); this._runTypesRefreshInterval = config?.bookkeeping?.runTypesRefreshInterval ?? (config?.bookkeeping ? 24 * 60 * 60 * 1000 : -1); diff --git a/QualityControl/lib/services/JsonFileService.js b/QualityControl/lib/services/JsonFileService.js index 25c64a262..1ac827086 100644 --- a/QualityControl/lib/services/JsonFileService.js +++ b/QualityControl/lib/services/JsonFileService.js @@ -13,10 +13,11 @@ */ import { LogManager } from '@aliceo2/web-ui'; -const logger = LogManager.getLogger(`${process.env.npm_config_log_label ?? 'qcg'}/json`); import fs from 'fs'; import path from 'path'; +const LOG_FACILITY = `${process.env.npm_config_log_label ?? 'qcg'}/json-service`; + /** * Store layouts inside JSON based file with atomic write */ @@ -26,6 +27,8 @@ export class JsonFileService { * @param {string} pathname - path to JSON DB file */ constructor(pathname) { + this._logger = LogManager.getLogger(LOG_FACILITY); + // Path of the file to store data this.pathname = path.join(pathname); this.pathnameTmp = `${this.pathname}~tmp`; @@ -41,7 +44,7 @@ export class JsonFileService { async _syncFileAndInternalState() { await this._readFromFile(); await this.writeToFile(); - logger.infoMessage(`Preferences will be saved in ${this.pathname}`); + this._logger.infoMessage(`Preferences will be saved in ${this.pathname}`); } /** @@ -54,7 +57,7 @@ export class JsonFileService { if (err) { // File does not exist, it's ok, we will create it if (err.code === 'ENOENT') { - logger.info('DB file does not exist, will create one'); + this._logger.infoMessage('DB file does not exist, will create one'); return resolve(); } @@ -93,9 +96,9 @@ export class JsonFileService { const dataToFile = JSON.stringify(this.data, null, 1); await fs.promises.writeFile(this.pathnameTmp, dataToFile); await fs.promises.rename(this.pathnameTmp, this.pathname); - logger.infoMessage('DB file updated'); + this._logger.infoMessage('DB file updated'); } catch (err) { - logger.errorMessage('Error writing to DB file:', err); + this._logger.errorMessage('Error writing to DB file:', err); throw err; } finally { this.lock.release(); diff --git a/QualityControl/lib/services/QcObject.service.js b/QualityControl/lib/services/QcObject.service.js index 140c20307..b6d405ad1 100644 --- a/QualityControl/lib/services/QcObject.service.js +++ b/QualityControl/lib/services/QcObject.service.js @@ -21,7 +21,7 @@ import QcObjectIdentificationDto from '../dtos/QcObjectIdentificationDto.js'; * @typedef {import('../repositories/ChartRepository.js').ChartRepository} ChartRepository */ -const LOG_FACILITY = 'qcg/obj-service'; +const LOG_FACILITY = `${process.env.npm_config_log_label ?? 'qcg'}/obj-service`; /** * High-level service class for retrieving and composing object information from storage (CCDB/QCDB) diff --git a/QualityControl/lib/services/ccdb/CcdbService.js b/QualityControl/lib/services/ccdb/CcdbService.js index 46f9629c2..2b2fa3a7c 100644 --- a/QualityControl/lib/services/ccdb/CcdbService.js +++ b/QualityControl/lib/services/ccdb/CcdbService.js @@ -55,10 +55,9 @@ export class CcdbService { * @returns {CcdbService} - an instance of the newly created service */ static setup(config = {}) { - const logger = LogManager.getLogger(`${process.env.npm_config_log_label ?? 'qcg'}/ccdb-setup`); - const { hostname, port } = config; if (!hostname || !port) { + const logger = LogManager.getLogger(`${process.env.npm_config_log_label ?? 'qcg'}/ccdb-setup`); logger.warnMessage( 'Missing or incomplete configuration for CCDB. Will proceed with using default values', { level: 11, system: 'GUI', facility: 'qcg/ccdb-setup' }, diff --git a/QualityControl/lib/utils/httpRequests.js b/QualityControl/lib/utils/httpRequests.js index bdee648ad..99ee55c31 100644 --- a/QualityControl/lib/utils/httpRequests.js +++ b/QualityControl/lib/utils/httpRequests.js @@ -46,7 +46,7 @@ export function httpGetJson(hostname, port, path, options) { * @param {number} port - Target server port. * @param {string} path - Request path. * @param {object} options - Additional HTTP options. - * @returns {Promise<{status: number, headers: object}>} + * @returns {Promise<{status: number, headers: object}>} - HTTP headers and status code. */ export function httpHeadJson(hostname, port, path, options) { const httpOptions = _getHttpOptions(options); @@ -135,7 +135,7 @@ function _getHttpOptions(options = {}) { /** * Returns the correct HTTP(S) client based on protocol. * @param {string} protocol - 'http:' or 'https:' - * @returns {typeof http | typeof https} + * @returns {typeof http | typeof https} - The HTTP(S) module to use for requests. */ function _getHttpModuleByProtocol(protocol) { return protocol === 'https:' ? https : http; diff --git a/QualityControl/test/setup/testRepositorySetup.js b/QualityControl/test/setup/testRepositorySetup.js index 0e6b9fd49..8090d1bab 100644 --- a/QualityControl/test/setup/testRepositorySetup.js +++ b/QualityControl/test/setup/testRepositorySetup.js @@ -21,7 +21,7 @@ import { copyMockDataFileToUse } from './testServerSetup.js'; export const initTest = async () => { await copyMockDataFileToUse(); const jsonFile = config.dbFile; - const _logger = LogManager.getLogger('TESTS'); + const _logger = LogManager.getLogger(`${process.env.npm_config_log_label ?? 'qcg'}/tests-repository-setup`); let mockedLayouts = []; try { From 05cd4299173314fad228264057065b2236db2ede Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Sep 2025 16:02:14 +0200 Subject: [PATCH 33/77] Bump the dev-dependencies group in /InfoLogger with 4 updates (#3047) Bumps the dev-dependencies group in /InfoLogger with 4 updates: [@eslint/js](https://github.com/eslint/eslint/tree/HEAD/packages/js), [eslint](https://github.com/eslint/eslint), [eslint-plugin-jsdoc](https://github.com/gajus/eslint-plugin-jsdoc) and [puppeteer](https://github.com/puppeteer/puppeteer). Updates `@eslint/js` from 9.34.0 to 9.35.0 - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/commits/v9.35.0/packages/js) Updates `eslint` from 9.34.0 to 9.35.0 - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v9.34.0...v9.35.0) Updates `eslint-plugin-jsdoc` from 54.1.0 to 55.0.3 - [Release notes](https://github.com/gajus/eslint-plugin-jsdoc/releases) - [Changelog](https://github.com/gajus/eslint-plugin-jsdoc/blob/main/.releaserc) - [Commits](https://github.com/gajus/eslint-plugin-jsdoc/compare/v54.1.0...v55.0.3) Updates `puppeteer` from 24.18.0 to 24.19.0 - [Release notes](https://github.com/puppeteer/puppeteer/releases) - [Changelog](https://github.com/puppeteer/puppeteer/blob/main/CHANGELOG.md) - [Commits](https://github.com/puppeteer/puppeteer/compare/puppeteer-v24.18.0...puppeteer-v24.19.0) --- updated-dependencies: - dependency-name: "@eslint/js" dependency-version: 9.35.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-dependencies - dependency-name: eslint dependency-version: 9.35.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-dependencies - dependency-name: eslint-plugin-jsdoc dependency-version: 55.0.3 dependency-type: direct:development update-type: version-update:semver-major dependency-group: dev-dependencies - dependency-name: puppeteer dependency-version: 24.19.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: George Raduta --- InfoLogger/package-lock.json | 114 +++++++++++++++++++++-------------- InfoLogger/package.json | 8 +-- 2 files changed, 73 insertions(+), 49 deletions(-) diff --git a/InfoLogger/package-lock.json b/InfoLogger/package-lock.json index 4d2cb6cc6..00367e82a 100644 --- a/InfoLogger/package-lock.json +++ b/InfoLogger/package-lock.json @@ -16,14 +16,14 @@ "mariadb": "3.4.0" }, "devDependencies": { - "@eslint/js": "^9.34.0", + "@eslint/js": "^9.35.0", "@stylistic/eslint-plugin": "^5.3.1", - "eslint": "^9.34.0", - "eslint-plugin-jsdoc": "^54.1.0", + "eslint": "^9.35.0", + "eslint-plugin-jsdoc": "^55.0.3", "globals": "^16.3.0", "mocha": "^11.7.0", "nyc": "^17.1.0", - "puppeteer": "^24.18.0", + "puppeteer": "^24.19.0", "sinon": "^21.0.0" }, "engines": { @@ -409,26 +409,26 @@ } }, "node_modules/@es-joy/jsdoccomment": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.53.0.tgz", - "integrity": "sha512-Wyed8Wfn3vMNVwrZrgLMxmqwmlcCE1/RfUAOHFzMJb3QLH03mi9Yv1iOCZjif0yx5EZUeJ+17VD1MHPka9IQjQ==", + "version": "0.56.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.56.0.tgz", + "integrity": "sha512-c6EW+aA1w2rjqOMjbL93nZlwxp6c1Ln06vTYs5FjRRhmJXK8V/OrSXdT+pUr4aRYgjCgu8/OkiZr0tzeVrRSbw==", "dev": true, "license": "MIT", "dependencies": { "@types/estree": "^1.0.8", - "@typescript-eslint/types": "^8.39.1", + "@typescript-eslint/types": "^8.42.0", "comment-parser": "1.4.1", "esquery": "^1.6.0", - "jsdoc-type-pratt-parser": "~4.8.0" + "jsdoc-type-pratt-parser": "~5.1.0" }, "engines": { "node": ">=20.11.0" } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", - "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", "dev": true, "license": "MIT", "dependencies": { @@ -540,9 +540,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.34.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.34.0.tgz", - "integrity": "sha512-EoyvqQnBNsV1CWaEJ559rxXL4c8V92gxirbawSmVUOWXlsRxxQXl6LmCpdUblgxgSkDIqKnhzba2SjRTI/A5Rw==", + "version": "9.35.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.35.0.tgz", + "integrity": "sha512-30iXE9whjlILfWobBkNerJo+TXYsgVM5ERQwMcMKCHckHflCmf7wXDAHlARoWnh0s1U72WqlbeyE7iAcCzuCPw==", "dev": true, "license": "MIT", "engines": { @@ -1116,9 +1116,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.41.0.tgz", - "integrity": "sha512-9EwxsWdVqh42afLbHP90n2VdHaWU/oWgbH2P0CfcNfdKL7CuKpwMQGjwev56vWu9cSKU7FWSu6r9zck6CVfnag==", + "version": "8.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.43.0.tgz", + "integrity": "sha512-vQ2FZaxJpydjSZJKiSW/LJsabFFvV7KgLC5DiLhkBcykhQj8iK9BOaDmQt74nnKdLvceM5xmhaTF+pLekrxEkw==", "dev": true, "license": "MIT", "engines": { @@ -1312,9 +1312,9 @@ "optional": true }, "node_modules/bare-fs": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.2.2.tgz", - "integrity": "sha512-5vn+bdnlCYMwETIm1FqQXDP6TYPbxr2uJd88ve40kr4oPbiTZJVrTNzqA3/4sfWZeWKuQR/RkboBt7qEEDtfMA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.2.3.tgz", + "integrity": "sha512-1aGs5pRVLToMQ79elP+7cc0u0s/wXAzfBv/7hDloT7WFggLqECCas5qqPky7WHCFdsBH5WDq6sD4fAoz5sJbtA==", "dev": true, "license": "Apache-2.0", "optional": true, @@ -1955,9 +1955,9 @@ } }, "node_modules/devtools-protocol": { - "version": "0.0.1475386", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1475386.tgz", - "integrity": "sha512-RQ809ykTfJ+dgj9bftdeL2vRVxASAuGU+I9LEx9Ij5TXU5HrgAQVmzi72VA+mkzscE12uzlRv5/tWWv9R9J1SA==", + "version": "0.0.1495869", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1495869.tgz", + "integrity": "sha512-i+bkd9UYFis40RcnkW7XrOprCujXRAHg62IVh/Ah3G8MmNXpCGt1m0dTFhSdx/AVs8XEMbdOGRwdkR1Bcta8AA==", "dev": true, "license": "BSD-3-Clause" }, @@ -2155,19 +2155,19 @@ } }, "node_modules/eslint": { - "version": "9.34.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.34.0.tgz", - "integrity": "sha512-RNCHRX5EwdrESy3Jc9o8ie8Bog+PeYvvSR8sDGoZxNFTvZ4dlxUB3WzQ3bQMztFrSRODGrLLj8g6OFuGY/aiQg==", + "version": "9.35.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.35.0.tgz", + "integrity": "sha512-QePbBFMJFjgmlE+cXAlbHZbHpdFVS2E/6vzCy7aKlebddvl1vadiC4JFV5u/wqTkNUwEV8WrQi257jf5f06hrg==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.0", "@eslint/config-helpers": "^0.3.1", "@eslint/core": "^0.15.2", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.34.0", + "@eslint/js": "9.35.0", "@eslint/plugin-kit": "^0.3.5", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", @@ -2216,19 +2216,20 @@ } }, "node_modules/eslint-plugin-jsdoc": { - "version": "54.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-54.1.0.tgz", - "integrity": "sha512-tZJuW6s3gtveVsg08IbJgmfgAA1SpSkEz7KjxPEVmyAO4fPlz7zsMHdxjyn+Zku1l+wejr2JUdTFTNirRgHOrQ==", + "version": "55.0.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-55.0.3.tgz", + "integrity": "sha512-xU2/QZgBXIGFXOzyWsNaSwrcF80Rq2h084GvIU+pkfzwE55xnr+ShEUfVL6+fZ0Jrh0hWGHdk0RiN0axhK1new==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "@es-joy/jsdoccomment": "~0.53.0", + "@es-joy/jsdoccomment": "~0.56.0", "are-docs-informative": "^0.0.2", "comment-parser": "1.4.1", "debug": "^4.4.1", "escape-string-regexp": "^4.0.0", "espree": "^10.4.0", "esquery": "^1.6.0", + "object-deep-merge": "^1.0.5", "parse-imports-exports": "^0.2.4", "semver": "^7.7.2", "spdx-expression-parse": "^4.0.0" @@ -3346,9 +3347,9 @@ } }, "node_modules/jsdoc-type-pratt-parser": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.8.0.tgz", - "integrity": "sha512-iZ8Bdb84lWRuGHamRXFyML07r21pcwBrLkHEuHgEY5UbCouBwv7ECknDRKzsQIXMiqpPymqtIf8TC/shYKB5rw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-5.1.1.tgz", + "integrity": "sha512-DYYlVP1fe4QBMh2xTIs20/YeTz2GYVbWAEZweHSZD+qQ/Cx2d5RShuhhsdk64eTjNq0FeVnteP/qVOgaywSRbg==", "dev": true, "license": "MIT", "engines": { @@ -4152,6 +4153,29 @@ "node": ">=6" } }, + "node_modules/object-deep-merge": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/object-deep-merge/-/object-deep-merge-1.0.5.tgz", + "integrity": "sha512-3DioFgOzetbxbeUq8pB2NunXo8V0n4EvqsWM/cJoI6IA9zghd7cl/2pBOuWRf4dlvA+fcg5ugFMZaN2/RuoaGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "4.2.0" + } + }, + "node_modules/object-deep-merge/node_modules/type-fest": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.2.0.tgz", + "integrity": "sha512-5zknd7Dss75pMSED270A1RQS3KloqRJA9XbXLe0eCxyw7xXFb3rd+9B0UQ/0E+LQT6lnrLviEolYORlRWamn4w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/object-hash": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", @@ -4710,9 +4734,9 @@ } }, "node_modules/puppeteer": { - "version": "24.18.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.18.0.tgz", - "integrity": "sha512-Ke8oL/87GhzKIM2Ag6Yj49t5xbGc4rspGIuSuFLFCQBtYzWqCSanvqoCu08WkI78rbqcwnHjxiTH6oDlYFrjrw==", + "version": "24.19.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.19.0.tgz", + "integrity": "sha512-gUWgHX36m9K6yUbvNBEA7CXElIL92yXMoAVFrO8OpZkItqrruLVqYA8ikmfgwcw/cNfYgkt0n2+yP9jd9RSETA==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", @@ -4720,8 +4744,8 @@ "@puppeteer/browsers": "2.10.8", "chromium-bidi": "8.0.0", "cosmiconfig": "^9.0.0", - "devtools-protocol": "0.0.1475386", - "puppeteer-core": "24.18.0", + "devtools-protocol": "0.0.1495869", + "puppeteer-core": "24.19.0", "typed-query-selector": "^2.12.0" }, "bin": { @@ -4732,16 +4756,16 @@ } }, "node_modules/puppeteer-core": { - "version": "24.18.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.18.0.tgz", - "integrity": "sha512-As0BvfXxek2MbV0m7iqBmQKFnfSrzSvTM4zGipjd4cL+9f2Ccgut6RvHlc8+qBieKHqCMFy9BSI4QyveoYXTug==", + "version": "24.19.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.19.0.tgz", + "integrity": "sha512-qsEys4OIb2VGC2tNWKAs4U0mnjkIAxueMOOzk2nEFM9g4Y8QuvYkEMtmwsEdvzNGsUFd7DprOQfABmlN7WBOlg==", "dev": true, "license": "Apache-2.0", "dependencies": { "@puppeteer/browsers": "2.10.8", "chromium-bidi": "8.0.0", "debug": "^4.4.1", - "devtools-protocol": "0.0.1475386", + "devtools-protocol": "0.0.1495869", "typed-query-selector": "^2.12.0", "ws": "^8.18.3" }, diff --git a/InfoLogger/package.json b/InfoLogger/package.json index 05efdb60a..7b49117a1 100644 --- a/InfoLogger/package.json +++ b/InfoLogger/package.json @@ -34,14 +34,14 @@ "mariadb": "3.4.0" }, "devDependencies": { - "@eslint/js": "^9.34.0", + "@eslint/js": "^9.35.0", "@stylistic/eslint-plugin": "^5.3.1", - "eslint": "^9.34.0", - "eslint-plugin-jsdoc": "^54.1.0", + "eslint": "^9.35.0", + "eslint-plugin-jsdoc": "^55.0.3", "globals": "^16.3.0", "mocha": "^11.7.0", "nyc": "^17.1.0", - "puppeteer": "^24.18.0", + "puppeteer": "^24.19.0", "sinon": "^21.0.0" }, "bundleDependencies": [ From 59672d43e4b14e864955df4cb1c45529a5798642 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Sep 2025 16:24:20 +0200 Subject: [PATCH 34/77] Bump the dev-dependencies group in /QualityControl with 4 updates (#3045) Bumps the dev-dependencies group in /QualityControl with 4 updates: [@eslint/js](https://github.com/eslint/eslint/tree/HEAD/packages/js), [eslint](https://github.com/eslint/eslint), [eslint-plugin-jsdoc](https://github.com/gajus/eslint-plugin-jsdoc) and [puppeteer](https://github.com/puppeteer/puppeteer). Updates `@eslint/js` from 9.34.0 to 9.35.0 - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/commits/v9.35.0/packages/js) Updates `eslint` from 9.34.0 to 9.35.0 - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v9.34.0...v9.35.0) Updates `eslint-plugin-jsdoc` from 54.1.0 to 55.0.3 - [Release notes](https://github.com/gajus/eslint-plugin-jsdoc/releases) - [Changelog](https://github.com/gajus/eslint-plugin-jsdoc/blob/main/.releaserc) - [Commits](https://github.com/gajus/eslint-plugin-jsdoc/compare/v54.1.0...v55.0.3) Updates `puppeteer` from 24.18.0 to 24.19.0 - [Release notes](https://github.com/puppeteer/puppeteer/releases) - [Changelog](https://github.com/puppeteer/puppeteer/blob/main/CHANGELOG.md) - [Commits](https://github.com/puppeteer/puppeteer/compare/puppeteer-v24.18.0...puppeteer-v24.19.0) --- updated-dependencies: - dependency-name: "@eslint/js" dependency-version: 9.35.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-dependencies - dependency-name: eslint dependency-version: 9.35.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-dependencies - dependency-name: eslint-plugin-jsdoc dependency-version: 55.0.3 dependency-type: direct:development update-type: version-update:semver-major dependency-group: dev-dependencies - dependency-name: puppeteer dependency-version: 24.19.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-dependencies ... --- QualityControl/package-lock.json | 114 +++++++++++++++++++------------ QualityControl/package.json | 8 +-- 2 files changed, 73 insertions(+), 49 deletions(-) diff --git a/QualityControl/package-lock.json b/QualityControl/package-lock.json index 8962b7dce..127ec9eb4 100644 --- a/QualityControl/package-lock.json +++ b/QualityControl/package-lock.json @@ -22,13 +22,13 @@ "umzug": "^3.8.2" }, "devDependencies": { - "@eslint/js": "^9.34.0", + "@eslint/js": "^9.35.0", "@stylistic/eslint-plugin-js": "^4.4.0", - "eslint": "^9.34.0", - "eslint-plugin-jsdoc": "^54.1.0", + "eslint": "^9.35.0", + "eslint-plugin-jsdoc": "^55.0.3", "globals": "^16.3.0", "nock": "^14.0.4", - "puppeteer": "^24.18.0", + "puppeteer": "^24.19.0", "sequelize-cli": "^6.6.2", "sinon": "^21.0.0", "supertest": "^7.1.0" @@ -236,26 +236,26 @@ } }, "node_modules/@es-joy/jsdoccomment": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.53.0.tgz", - "integrity": "sha512-Wyed8Wfn3vMNVwrZrgLMxmqwmlcCE1/RfUAOHFzMJb3QLH03mi9Yv1iOCZjif0yx5EZUeJ+17VD1MHPka9IQjQ==", + "version": "0.56.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.56.0.tgz", + "integrity": "sha512-c6EW+aA1w2rjqOMjbL93nZlwxp6c1Ln06vTYs5FjRRhmJXK8V/OrSXdT+pUr4aRYgjCgu8/OkiZr0tzeVrRSbw==", "dev": true, "license": "MIT", "dependencies": { "@types/estree": "^1.0.8", - "@typescript-eslint/types": "^8.39.1", + "@typescript-eslint/types": "^8.42.0", "comment-parser": "1.4.1", "esquery": "^1.6.0", - "jsdoc-type-pratt-parser": "~4.8.0" + "jsdoc-type-pratt-parser": "~5.1.0" }, "engines": { "node": ">=20.11.0" } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.5.1.tgz", - "integrity": "sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", "dev": true, "license": "MIT", "dependencies": { @@ -369,9 +369,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.34.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.34.0.tgz", - "integrity": "sha512-EoyvqQnBNsV1CWaEJ559rxXL4c8V92gxirbawSmVUOWXlsRxxQXl6LmCpdUblgxgSkDIqKnhzba2SjRTI/A5Rw==", + "version": "9.35.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.35.0.tgz", + "integrity": "sha512-30iXE9whjlILfWobBkNerJo+TXYsgVM5ERQwMcMKCHckHflCmf7wXDAHlARoWnh0s1U72WqlbeyE7iAcCzuCPw==", "dev": true, "license": "MIT", "engines": { @@ -1196,9 +1196,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.40.0.tgz", - "integrity": "sha512-ETdbFlgbAmXHyFPwqUIYrfc12ArvpBhEVgGAxVYSwli26dn8Ko+lIo4Su9vI9ykTZdJn+vJprs/0eZU0YMAEQg==", + "version": "8.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.43.0.tgz", + "integrity": "sha512-vQ2FZaxJpydjSZJKiSW/LJsabFFvV7KgLC5DiLhkBcykhQj8iK9BOaDmQt74nnKdLvceM5xmhaTF+pLekrxEkw==", "dev": true, "license": "MIT", "engines": { @@ -1439,9 +1439,9 @@ "optional": true }, "node_modules/bare-fs": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.2.2.tgz", - "integrity": "sha512-5vn+bdnlCYMwETIm1FqQXDP6TYPbxr2uJd88ve40kr4oPbiTZJVrTNzqA3/4sfWZeWKuQR/RkboBt7qEEDtfMA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.2.3.tgz", + "integrity": "sha512-1aGs5pRVLToMQ79elP+7cc0u0s/wXAzfBv/7hDloT7WFggLqECCas5qqPky7WHCFdsBH5WDq6sD4fAoz5sJbtA==", "dev": true, "license": "Apache-2.0", "optional": true, @@ -2228,9 +2228,9 @@ } }, "node_modules/devtools-protocol": { - "version": "0.0.1475386", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1475386.tgz", - "integrity": "sha512-RQ809ykTfJ+dgj9bftdeL2vRVxASAuGU+I9LEx9Ij5TXU5HrgAQVmzi72VA+mkzscE12uzlRv5/tWWv9R9J1SA==", + "version": "0.0.1495869", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1495869.tgz", + "integrity": "sha512-i+bkd9UYFis40RcnkW7XrOprCujXRAHg62IVh/Ah3G8MmNXpCGt1m0dTFhSdx/AVs8XEMbdOGRwdkR1Bcta8AA==", "dev": true, "license": "BSD-3-Clause" }, @@ -2582,19 +2582,19 @@ } }, "node_modules/eslint": { - "version": "9.34.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.34.0.tgz", - "integrity": "sha512-RNCHRX5EwdrESy3Jc9o8ie8Bog+PeYvvSR8sDGoZxNFTvZ4dlxUB3WzQ3bQMztFrSRODGrLLj8g6OFuGY/aiQg==", + "version": "9.35.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.35.0.tgz", + "integrity": "sha512-QePbBFMJFjgmlE+cXAlbHZbHpdFVS2E/6vzCy7aKlebddvl1vadiC4JFV5u/wqTkNUwEV8WrQi257jf5f06hrg==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.0", "@eslint/config-helpers": "^0.3.1", "@eslint/core": "^0.15.2", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.34.0", + "@eslint/js": "9.35.0", "@eslint/plugin-kit": "^0.3.5", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", @@ -2643,19 +2643,20 @@ } }, "node_modules/eslint-plugin-jsdoc": { - "version": "54.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-54.1.0.tgz", - "integrity": "sha512-tZJuW6s3gtveVsg08IbJgmfgAA1SpSkEz7KjxPEVmyAO4fPlz7zsMHdxjyn+Zku1l+wejr2JUdTFTNirRgHOrQ==", + "version": "55.0.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-55.0.3.tgz", + "integrity": "sha512-xU2/QZgBXIGFXOzyWsNaSwrcF80Rq2h084GvIU+pkfzwE55xnr+ShEUfVL6+fZ0Jrh0hWGHdk0RiN0axhK1new==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "@es-joy/jsdoccomment": "~0.53.0", + "@es-joy/jsdoccomment": "~0.56.0", "are-docs-informative": "^0.0.2", "comment-parser": "1.4.1", "debug": "^4.4.1", "escape-string-regexp": "^4.0.0", "espree": "^10.4.0", "esquery": "^1.6.0", + "object-deep-merge": "^1.0.5", "parse-imports-exports": "^0.2.4", "semver": "^7.7.2", "spdx-expression-parse": "^4.0.0" @@ -3866,9 +3867,9 @@ } }, "node_modules/jsdoc-type-pratt-parser": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.8.0.tgz", - "integrity": "sha512-iZ8Bdb84lWRuGHamRXFyML07r21pcwBrLkHEuHgEY5UbCouBwv7ECknDRKzsQIXMiqpPymqtIf8TC/shYKB5rw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-5.1.1.tgz", + "integrity": "sha512-DYYlVP1fe4QBMh2xTIs20/YeTz2GYVbWAEZweHSZD+qQ/Cx2d5RShuhhsdk64eTjNq0FeVnteP/qVOgaywSRbg==", "dev": true, "license": "MIT", "engines": { @@ -4577,6 +4578,29 @@ "inBundle": true, "license": "MIT" }, + "node_modules/object-deep-merge": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/object-deep-merge/-/object-deep-merge-1.0.5.tgz", + "integrity": "sha512-3DioFgOzetbxbeUq8pB2NunXo8V0n4EvqsWM/cJoI6IA9zghd7cl/2pBOuWRf4dlvA+fcg5ugFMZaN2/RuoaGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "4.2.0" + } + }, + "node_modules/object-deep-merge/node_modules/type-fest": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.2.0.tgz", + "integrity": "sha512-5zknd7Dss75pMSED270A1RQS3KloqRJA9XbXLe0eCxyw7xXFb3rd+9B0UQ/0E+LQT6lnrLviEolYORlRWamn4w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/object-hash": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", @@ -5102,9 +5126,9 @@ } }, "node_modules/puppeteer": { - "version": "24.18.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.18.0.tgz", - "integrity": "sha512-Ke8oL/87GhzKIM2Ag6Yj49t5xbGc4rspGIuSuFLFCQBtYzWqCSanvqoCu08WkI78rbqcwnHjxiTH6oDlYFrjrw==", + "version": "24.19.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.19.0.tgz", + "integrity": "sha512-gUWgHX36m9K6yUbvNBEA7CXElIL92yXMoAVFrO8OpZkItqrruLVqYA8ikmfgwcw/cNfYgkt0n2+yP9jd9RSETA==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", @@ -5112,8 +5136,8 @@ "@puppeteer/browsers": "2.10.8", "chromium-bidi": "8.0.0", "cosmiconfig": "^9.0.0", - "devtools-protocol": "0.0.1475386", - "puppeteer-core": "24.18.0", + "devtools-protocol": "0.0.1495869", + "puppeteer-core": "24.19.0", "typed-query-selector": "^2.12.0" }, "bin": { @@ -5124,16 +5148,16 @@ } }, "node_modules/puppeteer-core": { - "version": "24.18.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.18.0.tgz", - "integrity": "sha512-As0BvfXxek2MbV0m7iqBmQKFnfSrzSvTM4zGipjd4cL+9f2Ccgut6RvHlc8+qBieKHqCMFy9BSI4QyveoYXTug==", + "version": "24.19.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.19.0.tgz", + "integrity": "sha512-qsEys4OIb2VGC2tNWKAs4U0mnjkIAxueMOOzk2nEFM9g4Y8QuvYkEMtmwsEdvzNGsUFd7DprOQfABmlN7WBOlg==", "dev": true, "license": "Apache-2.0", "dependencies": { "@puppeteer/browsers": "2.10.8", "chromium-bidi": "8.0.0", "debug": "^4.4.1", - "devtools-protocol": "0.0.1475386", + "devtools-protocol": "0.0.1495869", "typed-query-selector": "^2.12.0", "ws": "^8.18.3" }, diff --git a/QualityControl/package.json b/QualityControl/package.json index 5a9472110..f053b48d3 100644 --- a/QualityControl/package.json +++ b/QualityControl/package.json @@ -46,13 +46,13 @@ "umzug": "^3.8.2" }, "devDependencies": { - "@eslint/js": "^9.34.0", + "@eslint/js": "^9.35.0", "@stylistic/eslint-plugin-js": "^4.4.0", - "eslint": "^9.34.0", - "eslint-plugin-jsdoc": "^54.1.0", + "eslint": "^9.35.0", + "eslint-plugin-jsdoc": "^55.0.3", "globals": "^16.3.0", "nock": "^14.0.4", - "puppeteer": "^24.18.0", + "puppeteer": "^24.19.0", "sequelize-cli": "^6.6.2", "sinon": "^21.0.0", "supertest": "^7.1.0" From 2584f2071ad0f301946c5db9348bee9db106cbdf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Sep 2025 16:27:40 +0200 Subject: [PATCH 35/77] Bump the dev-dependencies group in /Framework with 4 updates (#3046) Bumps the dev-dependencies group in /Framework with 4 updates: [@eslint/js](https://github.com/eslint/eslint/tree/HEAD/packages/js), [eslint](https://github.com/eslint/eslint), [eslint-plugin-jsdoc](https://github.com/gajus/eslint-plugin-jsdoc) and [puppeteer](https://github.com/puppeteer/puppeteer). Updates `@eslint/js` from 9.34.0 to 9.35.0 - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/commits/v9.35.0/packages/js) Updates `eslint` from 9.34.0 to 9.35.0 - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v9.34.0...v9.35.0) Updates `eslint-plugin-jsdoc` from 54.3.1 to 55.0.3 - [Release notes](https://github.com/gajus/eslint-plugin-jsdoc/releases) - [Changelog](https://github.com/gajus/eslint-plugin-jsdoc/blob/main/.releaserc) - [Commits](https://github.com/gajus/eslint-plugin-jsdoc/compare/v54.3.1...v55.0.3) Updates `puppeteer` from 24.18.0 to 24.19.0 - [Release notes](https://github.com/puppeteer/puppeteer/releases) - [Changelog](https://github.com/puppeteer/puppeteer/blob/main/CHANGELOG.md) - [Commits](https://github.com/puppeteer/puppeteer/compare/puppeteer-v24.18.0...puppeteer-v24.19.0) --- updated-dependencies: - dependency-name: "@eslint/js" dependency-version: 9.35.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-dependencies - dependency-name: eslint dependency-version: 9.35.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-dependencies - dependency-name: eslint-plugin-jsdoc dependency-version: 55.0.3 dependency-type: direct:development update-type: version-update:semver-major dependency-group: dev-dependencies - dependency-name: puppeteer dependency-version: 24.19.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-dependencies ... --- Framework/package-lock.json | 108 ++++++++++++++++++++++-------------- Framework/package.json | 8 +-- 2 files changed, 70 insertions(+), 46 deletions(-) diff --git a/Framework/package-lock.json b/Framework/package-lock.json index 86106bd2e..a10d50bb7 100644 --- a/Framework/package-lock.json +++ b/Framework/package-lock.json @@ -21,16 +21,16 @@ "ws": "^8.18.0" }, "devDependencies": { - "@eslint/js": "^9.34.0", + "@eslint/js": "^9.35.0", "@stylistic/eslint-plugin": "^5.3.1", - "eslint": "^9.34.0", - "eslint-plugin-jsdoc": "^54.3.1", + "eslint": "^9.35.0", + "eslint-plugin-jsdoc": "^55.0.3", "globals": "^16.3.0", "long": "^5.3.1", "mocha": "^11.7.0", "nock": "14.0.0", "nyc": "^17.1.0", - "puppeteer": "^24.18.0", + "puppeteer": "^24.19.0", "sinon": "21.0.0", "supertest": "^7.1.0" }, @@ -415,26 +415,26 @@ } }, "node_modules/@es-joy/jsdoccomment": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.53.0.tgz", - "integrity": "sha512-Wyed8Wfn3vMNVwrZrgLMxmqwmlcCE1/RfUAOHFzMJb3QLH03mi9Yv1iOCZjif0yx5EZUeJ+17VD1MHPka9IQjQ==", + "version": "0.56.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.56.0.tgz", + "integrity": "sha512-c6EW+aA1w2rjqOMjbL93nZlwxp6c1Ln06vTYs5FjRRhmJXK8V/OrSXdT+pUr4aRYgjCgu8/OkiZr0tzeVrRSbw==", "dev": true, "license": "MIT", "dependencies": { "@types/estree": "^1.0.8", - "@typescript-eslint/types": "^8.39.1", + "@typescript-eslint/types": "^8.42.0", "comment-parser": "1.4.1", "esquery": "^1.6.0", - "jsdoc-type-pratt-parser": "~4.8.0" + "jsdoc-type-pratt-parser": "~5.1.0" }, "engines": { "node": ">=20.11.0" } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", - "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", "dev": true, "license": "MIT", "dependencies": { @@ -534,9 +534,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.34.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.34.0.tgz", - "integrity": "sha512-EoyvqQnBNsV1CWaEJ559rxXL4c8V92gxirbawSmVUOWXlsRxxQXl6LmCpdUblgxgSkDIqKnhzba2SjRTI/A5Rw==", + "version": "9.35.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.35.0.tgz", + "integrity": "sha512-30iXE9whjlILfWobBkNerJo+TXYsgVM5ERQwMcMKCHckHflCmf7wXDAHlARoWnh0s1U72WqlbeyE7iAcCzuCPw==", "dev": true, "license": "MIT", "engines": { @@ -1155,9 +1155,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.41.0.tgz", - "integrity": "sha512-9EwxsWdVqh42afLbHP90n2VdHaWU/oWgbH2P0CfcNfdKL7CuKpwMQGjwev56vWu9cSKU7FWSu6r9zck6CVfnag==", + "version": "8.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.43.0.tgz", + "integrity": "sha512-vQ2FZaxJpydjSZJKiSW/LJsabFFvV7KgLC5DiLhkBcykhQj8iK9BOaDmQt74nnKdLvceM5xmhaTF+pLekrxEkw==", "dev": true, "license": "MIT", "engines": { @@ -1992,9 +1992,9 @@ } }, "node_modules/devtools-protocol": { - "version": "0.0.1475386", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1475386.tgz", - "integrity": "sha512-RQ809ykTfJ+dgj9bftdeL2vRVxASAuGU+I9LEx9Ij5TXU5HrgAQVmzi72VA+mkzscE12uzlRv5/tWWv9R9J1SA==", + "version": "0.0.1495869", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1495869.tgz", + "integrity": "sha512-i+bkd9UYFis40RcnkW7XrOprCujXRAHg62IVh/Ah3G8MmNXpCGt1m0dTFhSdx/AVs8XEMbdOGRwdkR1Bcta8AA==", "dev": true, "license": "BSD-3-Clause" }, @@ -2205,19 +2205,19 @@ } }, "node_modules/eslint": { - "version": "9.34.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.34.0.tgz", - "integrity": "sha512-RNCHRX5EwdrESy3Jc9o8ie8Bog+PeYvvSR8sDGoZxNFTvZ4dlxUB3WzQ3bQMztFrSRODGrLLj8g6OFuGY/aiQg==", + "version": "9.35.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.35.0.tgz", + "integrity": "sha512-QePbBFMJFjgmlE+cXAlbHZbHpdFVS2E/6vzCy7aKlebddvl1vadiC4JFV5u/wqTkNUwEV8WrQi257jf5f06hrg==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.0", "@eslint/config-helpers": "^0.3.1", "@eslint/core": "^0.15.2", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.34.0", + "@eslint/js": "9.35.0", "@eslint/plugin-kit": "^0.3.5", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", @@ -2266,19 +2266,20 @@ } }, "node_modules/eslint-plugin-jsdoc": { - "version": "54.3.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-54.3.1.tgz", - "integrity": "sha512-6KlEwRCaQfSi1Wsis4cxsqDfOuQDPG56ozSPCkG+N9aISTQpahbo2n0YZs6c7CIVXQzVdYSxuvQ6w31rfeiMhw==", + "version": "55.0.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-55.0.3.tgz", + "integrity": "sha512-xU2/QZgBXIGFXOzyWsNaSwrcF80Rq2h084GvIU+pkfzwE55xnr+ShEUfVL6+fZ0Jrh0hWGHdk0RiN0axhK1new==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "@es-joy/jsdoccomment": "~0.53.0", + "@es-joy/jsdoccomment": "~0.56.0", "are-docs-informative": "^0.0.2", "comment-parser": "1.4.1", "debug": "^4.4.1", "escape-string-regexp": "^4.0.0", "espree": "^10.4.0", "esquery": "^1.6.0", + "object-deep-merge": "^1.0.5", "parse-imports-exports": "^0.2.4", "semver": "^7.7.2", "spdx-expression-parse": "^4.0.0" @@ -3387,9 +3388,9 @@ } }, "node_modules/jsdoc-type-pratt-parser": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.8.0.tgz", - "integrity": "sha512-iZ8Bdb84lWRuGHamRXFyML07r21pcwBrLkHEuHgEY5UbCouBwv7ECknDRKzsQIXMiqpPymqtIf8TC/shYKB5rw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-5.1.1.tgz", + "integrity": "sha512-DYYlVP1fe4QBMh2xTIs20/YeTz2GYVbWAEZweHSZD+qQ/Cx2d5RShuhhsdk64eTjNq0FeVnteP/qVOgaywSRbg==", "dev": true, "license": "MIT", "engines": { @@ -4139,6 +4140,16 @@ "node": ">=6" } }, + "node_modules/object-deep-merge": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/object-deep-merge/-/object-deep-merge-1.0.5.tgz", + "integrity": "sha512-3DioFgOzetbxbeUq8pB2NunXo8V0n4EvqsWM/cJoI6IA9zghd7cl/2pBOuWRf4dlvA+fcg5ugFMZaN2/RuoaGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "4.2.0" + } + }, "node_modules/object-hash": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", @@ -4679,9 +4690,9 @@ } }, "node_modules/puppeteer": { - "version": "24.18.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.18.0.tgz", - "integrity": "sha512-Ke8oL/87GhzKIM2Ag6Yj49t5xbGc4rspGIuSuFLFCQBtYzWqCSanvqoCu08WkI78rbqcwnHjxiTH6oDlYFrjrw==", + "version": "24.19.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.19.0.tgz", + "integrity": "sha512-gUWgHX36m9K6yUbvNBEA7CXElIL92yXMoAVFrO8OpZkItqrruLVqYA8ikmfgwcw/cNfYgkt0n2+yP9jd9RSETA==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", @@ -4689,8 +4700,8 @@ "@puppeteer/browsers": "2.10.8", "chromium-bidi": "8.0.0", "cosmiconfig": "^9.0.0", - "devtools-protocol": "0.0.1475386", - "puppeteer-core": "24.18.0", + "devtools-protocol": "0.0.1495869", + "puppeteer-core": "24.19.0", "typed-query-selector": "^2.12.0" }, "bin": { @@ -4701,16 +4712,16 @@ } }, "node_modules/puppeteer-core": { - "version": "24.18.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.18.0.tgz", - "integrity": "sha512-As0BvfXxek2MbV0m7iqBmQKFnfSrzSvTM4zGipjd4cL+9f2Ccgut6RvHlc8+qBieKHqCMFy9BSI4QyveoYXTug==", + "version": "24.19.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.19.0.tgz", + "integrity": "sha512-qsEys4OIb2VGC2tNWKAs4U0mnjkIAxueMOOzk2nEFM9g4Y8QuvYkEMtmwsEdvzNGsUFd7DprOQfABmlN7WBOlg==", "dev": true, "license": "Apache-2.0", "dependencies": { "@puppeteer/browsers": "2.10.8", "chromium-bidi": "8.0.0", "debug": "^4.4.1", - "devtools-protocol": "0.0.1475386", + "devtools-protocol": "0.0.1495869", "typed-query-selector": "^2.12.0", "ws": "^8.18.3" }, @@ -5485,6 +5496,19 @@ "node": ">=4" } }, + "node_modules/type-fest": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.2.0.tgz", + "integrity": "sha512-5zknd7Dss75pMSED270A1RQS3KloqRJA9XbXLe0eCxyw7xXFb3rd+9B0UQ/0E+LQT6lnrLviEolYORlRWamn4w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "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", diff --git a/Framework/package.json b/Framework/package.json index 6f1d5d33d..00a23dba9 100644 --- a/Framework/package.json +++ b/Framework/package.json @@ -43,15 +43,15 @@ "protobufjs": "^7.5.0" }, "devDependencies": { - "@eslint/js": "^9.34.0", + "@eslint/js": "^9.35.0", "@stylistic/eslint-plugin": "^5.3.1", - "eslint": "^9.34.0", - "eslint-plugin-jsdoc": "^54.3.1", + "eslint": "^9.35.0", + "eslint-plugin-jsdoc": "^55.0.3", "globals": "^16.3.0", "mocha": "^11.7.0", "nock": "14.0.0", "nyc": "^17.1.0", - "puppeteer": "^24.18.0", + "puppeteer": "^24.19.0", "sinon": "21.0.0", "supertest": "^7.1.0", "long": "^5.3.1" From 4ae5e9ea4924bf2daddb8da09f548f1b4039bda9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Sep 2025 16:37:35 +0200 Subject: [PATCH 36/77] Bump vite from 6.3.5 to 6.3.6 in /Configuration/webapp (#3051) Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 6.3.5 to 6.3.6. - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/v6.3.6/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v6.3.6/packages/vite) --- updated-dependencies: - dependency-name: vite dependency-version: 6.3.6 dependency-type: direct:development ... --- Configuration/webapp/package-lock.json | 8 ++++---- Configuration/webapp/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Configuration/webapp/package-lock.json b/Configuration/webapp/package-lock.json index 98cddcad9..12b8d61b9 100644 --- a/Configuration/webapp/package-lock.json +++ b/Configuration/webapp/package-lock.json @@ -36,7 +36,7 @@ "tsx": "^4.20.4", "typescript": "^5.7.2", "typescript-eslint": "^8.34.0", - "vite": "^6.3.5", + "vite": "^6.3.6", "vite-tsconfig-paths": "^5.1.4" } }, @@ -9157,9 +9157,9 @@ } }, "node_modules/vite": { - "version": "6.3.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", - "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", + "version": "6.3.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.6.tgz", + "integrity": "sha512-0msEVHJEScQbhkbVTb/4iHZdJ6SXp/AvxL2sjwYQFfBqleHtnCqv1J3sa9zbWz/6kW1m9Tfzn92vW+kZ1WV6QA==", "dev": true, "license": "MIT", "dependencies": { diff --git a/Configuration/webapp/package.json b/Configuration/webapp/package.json index 517f7c7f5..55cadb98d 100644 --- a/Configuration/webapp/package.json +++ b/Configuration/webapp/package.json @@ -45,7 +45,7 @@ "tsx": "^4.20.4", "typescript": "^5.7.2", "typescript-eslint": "^8.34.0", - "vite": "^6.3.5", + "vite": "^6.3.6", "vite-tsconfig-paths": "^5.1.4" } } From d5179f2acd214193bbd8d8e71b38e9f207648615 Mon Sep 17 00:00:00 2001 From: George Raduta Date: Wed, 10 Sep 2025 17:04:55 +0200 Subject: [PATCH 37/77] [qcg] Refactor/remove unused refresh timer (#3053) * removes dead code from the old Online Mode of QCG, this has been replaced by the RunMode --- QualityControl/public/Model.js | 7 ------- 1 file changed, 7 deletions(-) diff --git a/QualityControl/public/Model.js b/QualityControl/public/Model.js index 58fe5d609..230ba8153 100644 --- a/QualityControl/public/Model.js +++ b/QualityControl/public/Model.js @@ -66,7 +66,6 @@ export default class Model extends Observable { this.aboutViewModel = new AboutViewModel(this); this.aboutViewModel.bubbleTo(this); - this.refreshTimer = 0; this.refreshInterval = 0; // Seconds this.sidebar = true; this.accountMenuEnabled = false; @@ -314,12 +313,6 @@ export default class Model extends Observable { // Clear filter model runs mode interval this.filterModel.clearRunsModeInterval(); - - // Clear main refresh timer if it exists - if (this._refreshTimer) { - clearInterval(this._refreshTimer); - this._refreshTimer = null; - } } /** From b9b4e557b4bbc3ec7ac062fd4c5c36d99438ee94 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Sep 2025 09:20:25 +0200 Subject: [PATCH 38/77] Bump puppeteer in /Control in the dev-dependencies group (#3055) Bumps the dev-dependencies group in /Control with 1 update: [puppeteer](https://github.com/puppeteer/puppeteer). Updates `puppeteer` from 24.19.0 to 24.21.0 - [Release notes](https://github.com/puppeteer/puppeteer/releases) - [Changelog](https://github.com/puppeteer/puppeteer/blob/main/CHANGELOG.md) - [Commits](https://github.com/puppeteer/puppeteer/compare/puppeteer-v24.19.0...puppeteer-v24.21.0) --- updated-dependencies: - dependency-name: puppeteer dependency-version: 24.21.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-dependencies ... --- Control/package-lock.json | 81 ++++++++++++++++++++++++++------------- Control/package.json | 2 +- 2 files changed, 56 insertions(+), 27 deletions(-) diff --git a/Control/package-lock.json b/Control/package-lock.json index 6f23d0e4c..bff1ec9ab 100644 --- a/Control/package-lock.json +++ b/Control/package-lock.json @@ -27,7 +27,7 @@ "nock": "^14.0.0", "nyc": "^17.1.0", "proxyquire": "^2.1.3", - "puppeteer": "^24.19.0", + "puppeteer": "^24.21.0", "sinon": "21.0.0", "supertest": "7.1.0" }, @@ -938,13 +938,13 @@ "license": "BSD-3-Clause" }, "node_modules/@puppeteer/browsers": { - "version": "2.10.8", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.8.tgz", - "integrity": "sha512-f02QYEnBDE0p8cteNoPYHHjbDuwyfbe4cCIVlNi8/MRicIxFW4w4CfgU0LNgWEID6s06P+hRJ1qjpBLMhPRCiQ==", + "version": "2.10.10", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.10.tgz", + "integrity": "sha512-3ZG500+ZeLql8rE0hjfhkycJjDj0pI/btEh3L9IkWUYcOrgP0xCNRq3HbtbqOPbvDhFaAWD88pDFtlLv8ns8gA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "debug": "^4.4.1", + "debug": "^4.4.3", "extract-zip": "^2.0.1", "progress": "^2.0.3", "proxy-agent": "^6.5.0", @@ -1216,11 +1216,19 @@ "license": "MIT" }, "node_modules/b4a": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", - "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.1.tgz", + "integrity": "sha512-ZovbrBV0g6JxK5cGUF1Suby1vLfKjv4RWi8IxoaO/Mon8BDD9I21RxjHFtgQ+kskJqLAVyQZly3uMBui+vhc8Q==", "dev": true, - "license": "Apache-2.0" + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } }, "node_modules/balanced-match": { "version": "1.0.2", @@ -1238,16 +1246,18 @@ "optional": true }, "node_modules/bare-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.2.3.tgz", - "integrity": "sha512-1aGs5pRVLToMQ79elP+7cc0u0s/wXAzfBv/7hDloT7WFggLqECCas5qqPky7WHCFdsBH5WDq6sD4fAoz5sJbtA==", + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.4.4.tgz", + "integrity": "sha512-Q8yxM1eLhJfuM7KXVP3zjhBvtMJCYRByoTT+wHXjpdMELv0xICFJX+1w4c7csa+WZEOsq4ItJ4RGwvzid6m/dw==", "dev": true, "license": "Apache-2.0", "optional": true, "dependencies": { "bare-events": "^2.5.4", "bare-path": "^3.0.0", - "bare-stream": "^2.6.4" + "bare-stream": "^2.6.4", + "bare-url": "^2.2.2", + "fast-fifo": "^1.3.2" }, "engines": { "bare": ">=1.16.0" @@ -1306,6 +1316,17 @@ } } }, + "node_modules/bare-url": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.2.2.tgz", + "integrity": "sha512-g+ueNGKkrjMazDG3elZO1pNs3HY5+mMmOet1jtKyhOaCnkLzitxf26z7hoAEkDNgdNmnc1KIlt/dw6Po6xZMpA==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-path": "^3.0.0" + } + }, "node_modules/basic-ftp": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", @@ -1870,9 +1891,9 @@ } }, "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", "dependencies": { @@ -5030,18 +5051,18 @@ } }, "node_modules/puppeteer": { - "version": "24.19.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.19.0.tgz", - "integrity": "sha512-gUWgHX36m9K6yUbvNBEA7CXElIL92yXMoAVFrO8OpZkItqrruLVqYA8ikmfgwcw/cNfYgkt0n2+yP9jd9RSETA==", + "version": "24.21.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.21.0.tgz", + "integrity": "sha512-JNY9JluUXepKzqKoPHsNVsrkpRRTare8geNP2L8YMkFHOKIvWSki/yUL9l2VJpani49epEHLpVg+zDcbTYibWA==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@puppeteer/browsers": "2.10.8", + "@puppeteer/browsers": "2.10.10", "chromium-bidi": "8.0.0", "cosmiconfig": "^9.0.0", "devtools-protocol": "0.0.1495869", - "puppeteer-core": "24.19.0", + "puppeteer-core": "24.21.0", "typed-query-selector": "^2.12.0" }, "bin": { @@ -5052,17 +5073,18 @@ } }, "node_modules/puppeteer-core": { - "version": "24.19.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.19.0.tgz", - "integrity": "sha512-qsEys4OIb2VGC2tNWKAs4U0mnjkIAxueMOOzk2nEFM9g4Y8QuvYkEMtmwsEdvzNGsUFd7DprOQfABmlN7WBOlg==", + "version": "24.21.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.21.0.tgz", + "integrity": "sha512-WR4FehOs4XJ8OSp7MkGyVB4mfMs9Q6t8Y48TxiTCRxc8G2lJ5OKYPJvgU80dtKl+aIqIbdcNTgIooY49S5SsmA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@puppeteer/browsers": "2.10.8", + "@puppeteer/browsers": "2.10.10", "chromium-bidi": "8.0.0", - "debug": "^4.4.1", + "debug": "^4.4.3", "devtools-protocol": "0.0.1495869", "typed-query-selector": "^2.12.0", + "webdriver-bidi-protocol": "0.2.11", "ws": "^8.18.3" }, "engines": { @@ -6194,6 +6216,13 @@ "node": ">= 0.8" } }, + "node_modules/webdriver-bidi-protocol": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.2.11.tgz", + "integrity": "sha512-Y9E1/oi4XMxcR8AT0ZC4OvYntl34SPgwjmELH+owjBr0korAX4jKgZULBWILGCVGdVCQ0dodTToIETozhG8zvA==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/Control/package.json b/Control/package.json index f5ce0472e..ff3d27102 100644 --- a/Control/package.json +++ b/Control/package.json @@ -46,7 +46,7 @@ "nock": "^14.0.0", "nyc": "^17.1.0", "proxyquire": "^2.1.3", - "puppeteer": "^24.19.0", + "puppeteer": "^24.21.0", "sinon": "21.0.0", "supertest": "7.1.0" }, From da65c3927774b99b86869eed1461efe0e377f20a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Sep 2025 09:30:18 +0200 Subject: [PATCH 39/77] Bump the dev-dependencies group in /QualityControl with 3 updates (#3057) Bumps the dev-dependencies group in /QualityControl with 3 updates: [eslint-plugin-jsdoc](https://github.com/gajus/eslint-plugin-jsdoc), [globals](https://github.com/sindresorhus/globals) and [puppeteer](https://github.com/puppeteer/puppeteer). Updates `eslint-plugin-jsdoc` from 55.0.3 to 57.2.1 - [Release notes](https://github.com/gajus/eslint-plugin-jsdoc/releases) - [Changelog](https://github.com/gajus/eslint-plugin-jsdoc/blob/main/.releaserc) - [Commits](https://github.com/gajus/eslint-plugin-jsdoc/compare/v55.0.3...v57.2.1) Updates `globals` from 16.3.0 to 16.4.0 - [Release notes](https://github.com/sindresorhus/globals/releases) - [Commits](https://github.com/sindresorhus/globals/compare/v16.3.0...v16.4.0) Updates `puppeteer` from 24.19.0 to 24.21.0 - [Release notes](https://github.com/puppeteer/puppeteer/releases) - [Changelog](https://github.com/puppeteer/puppeteer/blob/main/CHANGELOG.md) - [Commits](https://github.com/puppeteer/puppeteer/compare/puppeteer-v24.19.0...puppeteer-v24.21.0) --- updated-dependencies: - dependency-name: eslint-plugin-jsdoc dependency-version: 57.2.1 dependency-type: direct:development update-type: version-update:semver-major dependency-group: dev-dependencies - dependency-name: globals dependency-version: 16.4.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-dependencies - dependency-name: puppeteer dependency-version: 24.21.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-dependencies ... --- QualityControl/package-lock.json | 124 +++++++++++++++++++------------ QualityControl/package.json | 6 +- 2 files changed, 80 insertions(+), 50 deletions(-) diff --git a/QualityControl/package-lock.json b/QualityControl/package-lock.json index 127ec9eb4..3d02cb7cc 100644 --- a/QualityControl/package-lock.json +++ b/QualityControl/package-lock.json @@ -25,10 +25,10 @@ "@eslint/js": "^9.35.0", "@stylistic/eslint-plugin-js": "^4.4.0", "eslint": "^9.35.0", - "eslint-plugin-jsdoc": "^55.0.3", - "globals": "^16.3.0", + "eslint-plugin-jsdoc": "^57.2.1", + "globals": "^16.4.0", "nock": "^14.0.4", - "puppeteer": "^24.19.0", + "puppeteer": "^24.21.0", "sequelize-cli": "^6.6.2", "sinon": "^21.0.0", "supertest": "^7.1.0" @@ -236,17 +236,17 @@ } }, "node_modules/@es-joy/jsdoccomment": { - "version": "0.56.0", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.56.0.tgz", - "integrity": "sha512-c6EW+aA1w2rjqOMjbL93nZlwxp6c1Ln06vTYs5FjRRhmJXK8V/OrSXdT+pUr4aRYgjCgu8/OkiZr0tzeVrRSbw==", + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.58.0.tgz", + "integrity": "sha512-smMc5pDht/UVsCD3hhw/a/e/p8m0RdRYiluXToVfd+d4yaQQh7nn9bACjkk6nXJvat7EWPAxuFkMEFfrxeGa3Q==", "dev": true, "license": "MIT", "dependencies": { "@types/estree": "^1.0.8", - "@typescript-eslint/types": "^8.42.0", + "@typescript-eslint/types": "^8.43.0", "comment-parser": "1.4.1", "esquery": "^1.6.0", - "jsdoc-type-pratt-parser": "~5.1.0" + "jsdoc-type-pratt-parser": "~5.4.0" }, "engines": { "node": ">=20.11.0" @@ -831,13 +831,13 @@ "license": "BSD-3-Clause" }, "node_modules/@puppeteer/browsers": { - "version": "2.10.8", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.8.tgz", - "integrity": "sha512-f02QYEnBDE0p8cteNoPYHHjbDuwyfbe4cCIVlNi8/MRicIxFW4w4CfgU0LNgWEID6s06P+hRJ1qjpBLMhPRCiQ==", + "version": "2.10.10", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.10.tgz", + "integrity": "sha512-3ZG500+ZeLql8rE0hjfhkycJjDj0pI/btEh3L9IkWUYcOrgP0xCNRq3HbtbqOPbvDhFaAWD88pDFtlLv8ns8gA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "debug": "^4.4.1", + "debug": "^4.4.3", "extract-zip": "^2.0.1", "progress": "^2.0.3", "proxy-agent": "^6.5.0", @@ -1196,9 +1196,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.43.0.tgz", - "integrity": "sha512-vQ2FZaxJpydjSZJKiSW/LJsabFFvV7KgLC5DiLhkBcykhQj8iK9BOaDmQt74nnKdLvceM5xmhaTF+pLekrxEkw==", + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.44.0.tgz", + "integrity": "sha512-ZSl2efn44VsYM0MfDQe68RKzBz75NPgLQXuGypmym6QVOWL5kegTZuZ02xRAT9T+onqvM6T8CdQk0OwYMB6ZvA==", "dev": true, "license": "MIT", "engines": { @@ -1417,11 +1417,19 @@ } }, "node_modules/b4a": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", - "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.1.tgz", + "integrity": "sha512-ZovbrBV0g6JxK5cGUF1Suby1vLfKjv4RWi8IxoaO/Mon8BDD9I21RxjHFtgQ+kskJqLAVyQZly3uMBui+vhc8Q==", "dev": true, - "license": "Apache-2.0" + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } }, "node_modules/balanced-match": { "version": "1.0.2", @@ -1439,16 +1447,18 @@ "optional": true }, "node_modules/bare-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.2.3.tgz", - "integrity": "sha512-1aGs5pRVLToMQ79elP+7cc0u0s/wXAzfBv/7hDloT7WFggLqECCas5qqPky7WHCFdsBH5WDq6sD4fAoz5sJbtA==", + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.4.4.tgz", + "integrity": "sha512-Q8yxM1eLhJfuM7KXVP3zjhBvtMJCYRByoTT+wHXjpdMELv0xICFJX+1w4c7csa+WZEOsq4ItJ4RGwvzid6m/dw==", "dev": true, "license": "Apache-2.0", "optional": true, "dependencies": { "bare-events": "^2.5.4", "bare-path": "^3.0.0", - "bare-stream": "^2.6.4" + "bare-stream": "^2.6.4", + "bare-url": "^2.2.2", + "fast-fifo": "^1.3.2" }, "engines": { "bare": ">=1.16.0" @@ -1507,6 +1517,17 @@ } } }, + "node_modules/bare-url": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.2.2.tgz", + "integrity": "sha512-g+ueNGKkrjMazDG3elZO1pNs3HY5+mMmOet1jtKyhOaCnkLzitxf26z7hoAEkDNgdNmnc1KIlt/dw6Po6xZMpA==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-path": "^3.0.0" + } + }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -2105,9 +2126,9 @@ } }, "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "inBundle": true, "license": "MIT", "dependencies": { @@ -2643,16 +2664,16 @@ } }, "node_modules/eslint-plugin-jsdoc": { - "version": "55.0.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-55.0.3.tgz", - "integrity": "sha512-xU2/QZgBXIGFXOzyWsNaSwrcF80Rq2h084GvIU+pkfzwE55xnr+ShEUfVL6+fZ0Jrh0hWGHdk0RiN0axhK1new==", + "version": "57.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-57.2.1.tgz", + "integrity": "sha512-HeTWN2VVVu7lzoKqH0uxB3UM3CBS+jMm91mSq3jb12CfWtSfverJDfhYDmRWiMGDzL9NUS/XCWPIWTQLsgjS4Q==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "@es-joy/jsdoccomment": "~0.56.0", + "@es-joy/jsdoccomment": "~0.58.0", "are-docs-informative": "^0.0.2", "comment-parser": "1.4.1", - "debug": "^4.4.1", + "debug": "^4.4.3", "escape-string-regexp": "^4.0.0", "espree": "^10.4.0", "esquery": "^1.6.0", @@ -3381,10 +3402,11 @@ } }, "node_modules/globals": { - "version": "16.3.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-16.3.0.tgz", - "integrity": "sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==", + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz", + "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -3867,9 +3889,9 @@ } }, "node_modules/jsdoc-type-pratt-parser": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-5.1.1.tgz", - "integrity": "sha512-DYYlVP1fe4QBMh2xTIs20/YeTz2GYVbWAEZweHSZD+qQ/Cx2d5RShuhhsdk64eTjNq0FeVnteP/qVOgaywSRbg==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-5.4.0.tgz", + "integrity": "sha512-F9GQ+F1ZU6qvSrZV8fNFpjDNf614YzR2eF6S0+XbDjAcUI28FSoXnYZFjQmb1kFx3rrJb5PnxUH3/Yti6fcM+g==", "dev": true, "license": "MIT", "engines": { @@ -5126,18 +5148,18 @@ } }, "node_modules/puppeteer": { - "version": "24.19.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.19.0.tgz", - "integrity": "sha512-gUWgHX36m9K6yUbvNBEA7CXElIL92yXMoAVFrO8OpZkItqrruLVqYA8ikmfgwcw/cNfYgkt0n2+yP9jd9RSETA==", + "version": "24.21.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.21.0.tgz", + "integrity": "sha512-JNY9JluUXepKzqKoPHsNVsrkpRRTare8geNP2L8YMkFHOKIvWSki/yUL9l2VJpani49epEHLpVg+zDcbTYibWA==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@puppeteer/browsers": "2.10.8", + "@puppeteer/browsers": "2.10.10", "chromium-bidi": "8.0.0", "cosmiconfig": "^9.0.0", "devtools-protocol": "0.0.1495869", - "puppeteer-core": "24.19.0", + "puppeteer-core": "24.21.0", "typed-query-selector": "^2.12.0" }, "bin": { @@ -5148,17 +5170,18 @@ } }, "node_modules/puppeteer-core": { - "version": "24.19.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.19.0.tgz", - "integrity": "sha512-qsEys4OIb2VGC2tNWKAs4U0mnjkIAxueMOOzk2nEFM9g4Y8QuvYkEMtmwsEdvzNGsUFd7DprOQfABmlN7WBOlg==", + "version": "24.21.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.21.0.tgz", + "integrity": "sha512-WR4FehOs4XJ8OSp7MkGyVB4mfMs9Q6t8Y48TxiTCRxc8G2lJ5OKYPJvgU80dtKl+aIqIbdcNTgIooY49S5SsmA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@puppeteer/browsers": "2.10.8", + "@puppeteer/browsers": "2.10.10", "chromium-bidi": "8.0.0", - "debug": "^4.4.1", + "debug": "^4.4.3", "devtools-protocol": "0.0.1495869", "typed-query-selector": "^2.12.0", + "webdriver-bidi-protocol": "0.2.11", "ws": "^8.18.3" }, "engines": { @@ -6526,6 +6549,13 @@ "node": ">=18" } }, + "node_modules/webdriver-bidi-protocol": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.2.11.tgz", + "integrity": "sha512-Y9E1/oi4XMxcR8AT0ZC4OvYntl34SPgwjmELH+owjBr0korAX4jKgZULBWILGCVGdVCQ0dodTToIETozhG8zvA==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", diff --git a/QualityControl/package.json b/QualityControl/package.json index f053b48d3..6ec93a069 100644 --- a/QualityControl/package.json +++ b/QualityControl/package.json @@ -49,10 +49,10 @@ "@eslint/js": "^9.35.0", "@stylistic/eslint-plugin-js": "^4.4.0", "eslint": "^9.35.0", - "eslint-plugin-jsdoc": "^55.0.3", - "globals": "^16.3.0", + "eslint-plugin-jsdoc": "^57.2.1", + "globals": "^16.4.0", "nock": "^14.0.4", - "puppeteer": "^24.19.0", + "puppeteer": "^24.21.0", "sequelize-cli": "^6.6.2", "sinon": "^21.0.0", "supertest": "^7.1.0" From 41ecb5d9cda9645fd90682fcd57a7793a52130db Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Sep 2025 09:33:03 +0200 Subject: [PATCH 40/77] Bump the dev-dependencies group in /InfoLogger with 3 updates (#3056) Bumps the dev-dependencies group in /InfoLogger with 3 updates: [eslint-plugin-jsdoc](https://github.com/gajus/eslint-plugin-jsdoc), [globals](https://github.com/sindresorhus/globals) and [puppeteer](https://github.com/puppeteer/puppeteer). Updates `eslint-plugin-jsdoc` from 55.0.3 to 57.2.1 - [Release notes](https://github.com/gajus/eslint-plugin-jsdoc/releases) - [Changelog](https://github.com/gajus/eslint-plugin-jsdoc/blob/main/.releaserc) - [Commits](https://github.com/gajus/eslint-plugin-jsdoc/compare/v55.0.3...v57.2.1) Updates `globals` from 16.3.0 to 16.4.0 - [Release notes](https://github.com/sindresorhus/globals/releases) - [Commits](https://github.com/sindresorhus/globals/compare/v16.3.0...v16.4.0) Updates `puppeteer` from 24.19.0 to 24.21.0 - [Release notes](https://github.com/puppeteer/puppeteer/releases) - [Changelog](https://github.com/puppeteer/puppeteer/blob/main/CHANGELOG.md) - [Commits](https://github.com/puppeteer/puppeteer/compare/puppeteer-v24.19.0...puppeteer-v24.21.0) --- updated-dependencies: - dependency-name: eslint-plugin-jsdoc dependency-version: 57.2.1 dependency-type: direct:development update-type: version-update:semver-major dependency-group: dev-dependencies - dependency-name: globals dependency-version: 16.4.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-dependencies - dependency-name: puppeteer dependency-version: 24.21.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-dependencies ... --- InfoLogger/package-lock.json | 117 ++++++++++++++++++++++------------- InfoLogger/package.json | 6 +- 2 files changed, 76 insertions(+), 47 deletions(-) diff --git a/InfoLogger/package-lock.json b/InfoLogger/package-lock.json index 00367e82a..58930c9f6 100644 --- a/InfoLogger/package-lock.json +++ b/InfoLogger/package-lock.json @@ -19,11 +19,11 @@ "@eslint/js": "^9.35.0", "@stylistic/eslint-plugin": "^5.3.1", "eslint": "^9.35.0", - "eslint-plugin-jsdoc": "^55.0.3", - "globals": "^16.3.0", + "eslint-plugin-jsdoc": "^57.2.1", + "globals": "^16.4.0", "mocha": "^11.7.0", "nyc": "^17.1.0", - "puppeteer": "^24.19.0", + "puppeteer": "^24.21.0", "sinon": "^21.0.0" }, "engines": { @@ -409,17 +409,17 @@ } }, "node_modules/@es-joy/jsdoccomment": { - "version": "0.56.0", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.56.0.tgz", - "integrity": "sha512-c6EW+aA1w2rjqOMjbL93nZlwxp6c1Ln06vTYs5FjRRhmJXK8V/OrSXdT+pUr4aRYgjCgu8/OkiZr0tzeVrRSbw==", + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.58.0.tgz", + "integrity": "sha512-smMc5pDht/UVsCD3hhw/a/e/p8m0RdRYiluXToVfd+d4yaQQh7nn9bACjkk6nXJvat7EWPAxuFkMEFfrxeGa3Q==", "dev": true, "license": "MIT", "dependencies": { "@types/estree": "^1.0.8", - "@typescript-eslint/types": "^8.42.0", + "@typescript-eslint/types": "^8.43.0", "comment-parser": "1.4.1", "esquery": "^1.6.0", - "jsdoc-type-pratt-parser": "~5.1.0" + "jsdoc-type-pratt-parser": "~5.4.0" }, "engines": { "node": ">=20.11.0" @@ -980,13 +980,13 @@ "license": "BSD-3-Clause" }, "node_modules/@puppeteer/browsers": { - "version": "2.10.8", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.8.tgz", - "integrity": "sha512-f02QYEnBDE0p8cteNoPYHHjbDuwyfbe4cCIVlNi8/MRicIxFW4w4CfgU0LNgWEID6s06P+hRJ1qjpBLMhPRCiQ==", + "version": "2.10.10", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.10.tgz", + "integrity": "sha512-3ZG500+ZeLql8rE0hjfhkycJjDj0pI/btEh3L9IkWUYcOrgP0xCNRq3HbtbqOPbvDhFaAWD88pDFtlLv8ns8gA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "debug": "^4.4.1", + "debug": "^4.4.3", "extract-zip": "^2.0.1", "progress": "^2.0.3", "proxy-agent": "^6.5.0", @@ -1291,11 +1291,19 @@ "license": "MIT" }, "node_modules/b4a": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", - "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.1.tgz", + "integrity": "sha512-ZovbrBV0g6JxK5cGUF1Suby1vLfKjv4RWi8IxoaO/Mon8BDD9I21RxjHFtgQ+kskJqLAVyQZly3uMBui+vhc8Q==", "dev": true, - "license": "Apache-2.0" + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } }, "node_modules/balanced-match": { "version": "1.0.2", @@ -1312,16 +1320,18 @@ "optional": true }, "node_modules/bare-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.2.3.tgz", - "integrity": "sha512-1aGs5pRVLToMQ79elP+7cc0u0s/wXAzfBv/7hDloT7WFggLqECCas5qqPky7WHCFdsBH5WDq6sD4fAoz5sJbtA==", + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.4.4.tgz", + "integrity": "sha512-Q8yxM1eLhJfuM7KXVP3zjhBvtMJCYRByoTT+wHXjpdMELv0xICFJX+1w4c7csa+WZEOsq4ItJ4RGwvzid6m/dw==", "dev": true, "license": "Apache-2.0", "optional": true, "dependencies": { "bare-events": "^2.5.4", "bare-path": "^3.0.0", - "bare-stream": "^2.6.4" + "bare-stream": "^2.6.4", + "bare-url": "^2.2.2", + "fast-fifo": "^1.3.2" }, "engines": { "bare": ">=1.16.0" @@ -1380,6 +1390,17 @@ } } }, + "node_modules/bare-url": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.2.2.tgz", + "integrity": "sha512-g+ueNGKkrjMazDG3elZO1pNs3HY5+mMmOet1jtKyhOaCnkLzitxf26z7hoAEkDNgdNmnc1KIlt/dw6Po6xZMpA==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-path": "^3.0.0" + } + }, "node_modules/basic-ftp": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", @@ -1862,9 +1883,9 @@ } }, "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", "dependencies": { @@ -2216,16 +2237,16 @@ } }, "node_modules/eslint-plugin-jsdoc": { - "version": "55.0.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-55.0.3.tgz", - "integrity": "sha512-xU2/QZgBXIGFXOzyWsNaSwrcF80Rq2h084GvIU+pkfzwE55xnr+ShEUfVL6+fZ0Jrh0hWGHdk0RiN0axhK1new==", + "version": "57.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-57.2.1.tgz", + "integrity": "sha512-HeTWN2VVVu7lzoKqH0uxB3UM3CBS+jMm91mSq3jb12CfWtSfverJDfhYDmRWiMGDzL9NUS/XCWPIWTQLsgjS4Q==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "@es-joy/jsdoccomment": "~0.56.0", + "@es-joy/jsdoccomment": "~0.58.0", "are-docs-informative": "^0.0.2", "comment-parser": "1.4.1", - "debug": "^4.4.1", + "debug": "^4.4.3", "escape-string-regexp": "^4.0.0", "espree": "^10.4.0", "esquery": "^1.6.0", @@ -2851,9 +2872,9 @@ } }, "node_modules/globals": { - "version": "16.3.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-16.3.0.tgz", - "integrity": "sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==", + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz", + "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==", "dev": true, "license": "MIT", "engines": { @@ -3347,9 +3368,9 @@ } }, "node_modules/jsdoc-type-pratt-parser": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-5.1.1.tgz", - "integrity": "sha512-DYYlVP1fe4QBMh2xTIs20/YeTz2GYVbWAEZweHSZD+qQ/Cx2d5RShuhhsdk64eTjNq0FeVnteP/qVOgaywSRbg==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-5.4.0.tgz", + "integrity": "sha512-F9GQ+F1ZU6qvSrZV8fNFpjDNf614YzR2eF6S0+XbDjAcUI28FSoXnYZFjQmb1kFx3rrJb5PnxUH3/Yti6fcM+g==", "dev": true, "license": "MIT", "engines": { @@ -4734,18 +4755,18 @@ } }, "node_modules/puppeteer": { - "version": "24.19.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.19.0.tgz", - "integrity": "sha512-gUWgHX36m9K6yUbvNBEA7CXElIL92yXMoAVFrO8OpZkItqrruLVqYA8ikmfgwcw/cNfYgkt0n2+yP9jd9RSETA==", + "version": "24.21.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.21.0.tgz", + "integrity": "sha512-JNY9JluUXepKzqKoPHsNVsrkpRRTare8geNP2L8YMkFHOKIvWSki/yUL9l2VJpani49epEHLpVg+zDcbTYibWA==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@puppeteer/browsers": "2.10.8", + "@puppeteer/browsers": "2.10.10", "chromium-bidi": "8.0.0", "cosmiconfig": "^9.0.0", "devtools-protocol": "0.0.1495869", - "puppeteer-core": "24.19.0", + "puppeteer-core": "24.21.0", "typed-query-selector": "^2.12.0" }, "bin": { @@ -4756,17 +4777,18 @@ } }, "node_modules/puppeteer-core": { - "version": "24.19.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.19.0.tgz", - "integrity": "sha512-qsEys4OIb2VGC2tNWKAs4U0mnjkIAxueMOOzk2nEFM9g4Y8QuvYkEMtmwsEdvzNGsUFd7DprOQfABmlN7WBOlg==", + "version": "24.21.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.21.0.tgz", + "integrity": "sha512-WR4FehOs4XJ8OSp7MkGyVB4mfMs9Q6t8Y48TxiTCRxc8G2lJ5OKYPJvgU80dtKl+aIqIbdcNTgIooY49S5SsmA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@puppeteer/browsers": "2.10.8", + "@puppeteer/browsers": "2.10.10", "chromium-bidi": "8.0.0", - "debug": "^4.4.1", + "debug": "^4.4.3", "devtools-protocol": "0.0.1495869", "typed-query-selector": "^2.12.0", + "webdriver-bidi-protocol": "0.2.11", "ws": "^8.18.3" }, "engines": { @@ -5716,6 +5738,13 @@ "node": ">= 0.8" } }, + "node_modules/webdriver-bidi-protocol": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.2.11.tgz", + "integrity": "sha512-Y9E1/oi4XMxcR8AT0ZC4OvYntl34SPgwjmELH+owjBr0korAX4jKgZULBWILGCVGdVCQ0dodTToIETozhG8zvA==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/InfoLogger/package.json b/InfoLogger/package.json index 7b49117a1..de054df42 100644 --- a/InfoLogger/package.json +++ b/InfoLogger/package.json @@ -37,11 +37,11 @@ "@eslint/js": "^9.35.0", "@stylistic/eslint-plugin": "^5.3.1", "eslint": "^9.35.0", - "eslint-plugin-jsdoc": "^55.0.3", - "globals": "^16.3.0", + "eslint-plugin-jsdoc": "^57.2.1", + "globals": "^16.4.0", "mocha": "^11.7.0", "nyc": "^17.1.0", - "puppeteer": "^24.19.0", + "puppeteer": "^24.21.0", "sinon": "^21.0.0" }, "bundleDependencies": [ From 2373ddbe1c25c5dfe105bb1780af13ee57e45046 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Sep 2025 09:35:37 +0200 Subject: [PATCH 41/77] Bump the dev-dependencies group in /Framework with 3 updates (#3058) Bumps the dev-dependencies group in /Framework with 3 updates: [eslint-plugin-jsdoc](https://github.com/gajus/eslint-plugin-jsdoc), [globals](https://github.com/sindresorhus/globals) and [puppeteer](https://github.com/puppeteer/puppeteer). Updates `eslint-plugin-jsdoc` from 55.0.3 to 57.2.1 - [Release notes](https://github.com/gajus/eslint-plugin-jsdoc/releases) - [Changelog](https://github.com/gajus/eslint-plugin-jsdoc/blob/main/.releaserc) - [Commits](https://github.com/gajus/eslint-plugin-jsdoc/compare/v55.0.3...v57.2.1) Updates `globals` from 16.3.0 to 16.4.0 - [Release notes](https://github.com/sindresorhus/globals/releases) - [Commits](https://github.com/sindresorhus/globals/compare/v16.3.0...v16.4.0) Updates `puppeteer` from 24.19.0 to 24.21.0 - [Release notes](https://github.com/puppeteer/puppeteer/releases) - [Changelog](https://github.com/puppeteer/puppeteer/blob/main/CHANGELOG.md) - [Commits](https://github.com/puppeteer/puppeteer/compare/puppeteer-v24.19.0...puppeteer-v24.21.0) --- updated-dependencies: - dependency-name: eslint-plugin-jsdoc dependency-version: 57.2.1 dependency-type: direct:development update-type: version-update:semver-major dependency-group: dev-dependencies - dependency-name: globals dependency-version: 16.4.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-dependencies - dependency-name: puppeteer dependency-version: 24.21.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-dependencies ... --- Framework/package-lock.json | 117 ++++++++++++++++++++++-------------- Framework/package.json | 6 +- 2 files changed, 76 insertions(+), 47 deletions(-) diff --git a/Framework/package-lock.json b/Framework/package-lock.json index a10d50bb7..a2f938c19 100644 --- a/Framework/package-lock.json +++ b/Framework/package-lock.json @@ -24,13 +24,13 @@ "@eslint/js": "^9.35.0", "@stylistic/eslint-plugin": "^5.3.1", "eslint": "^9.35.0", - "eslint-plugin-jsdoc": "^55.0.3", - "globals": "^16.3.0", + "eslint-plugin-jsdoc": "^57.2.1", + "globals": "^16.4.0", "long": "^5.3.1", "mocha": "^11.7.0", "nock": "14.0.0", "nyc": "^17.1.0", - "puppeteer": "^24.19.0", + "puppeteer": "^24.21.0", "sinon": "21.0.0", "supertest": "^7.1.0" }, @@ -415,17 +415,17 @@ } }, "node_modules/@es-joy/jsdoccomment": { - "version": "0.56.0", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.56.0.tgz", - "integrity": "sha512-c6EW+aA1w2rjqOMjbL93nZlwxp6c1Ln06vTYs5FjRRhmJXK8V/OrSXdT+pUr4aRYgjCgu8/OkiZr0tzeVrRSbw==", + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.58.0.tgz", + "integrity": "sha512-smMc5pDht/UVsCD3hhw/a/e/p8m0RdRYiluXToVfd+d4yaQQh7nn9bACjkk6nXJvat7EWPAxuFkMEFfrxeGa3Q==", "dev": true, "license": "MIT", "dependencies": { "@types/estree": "^1.0.8", - "@typescript-eslint/types": "^8.42.0", + "@typescript-eslint/types": "^8.43.0", "comment-parser": "1.4.1", "esquery": "^1.6.0", - "jsdoc-type-pratt-parser": "~5.1.0" + "jsdoc-type-pratt-parser": "~5.4.0" }, "engines": { "node": ">=20.11.0" @@ -1014,13 +1014,13 @@ "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" }, "node_modules/@puppeteer/browsers": { - "version": "2.10.8", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.8.tgz", - "integrity": "sha512-f02QYEnBDE0p8cteNoPYHHjbDuwyfbe4cCIVlNi8/MRicIxFW4w4CfgU0LNgWEID6s06P+hRJ1qjpBLMhPRCiQ==", + "version": "2.10.10", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.10.tgz", + "integrity": "sha512-3ZG500+ZeLql8rE0hjfhkycJjDj0pI/btEh3L9IkWUYcOrgP0xCNRq3HbtbqOPbvDhFaAWD88pDFtlLv8ns8gA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "debug": "^4.4.1", + "debug": "^4.4.3", "extract-zip": "^2.0.1", "progress": "^2.0.3", "proxy-agent": "^6.5.0", @@ -1336,11 +1336,19 @@ "dev": true }, "node_modules/b4a": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", - "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.1.tgz", + "integrity": "sha512-ZovbrBV0g6JxK5cGUF1Suby1vLfKjv4RWi8IxoaO/Mon8BDD9I21RxjHFtgQ+kskJqLAVyQZly3uMBui+vhc8Q==", "dev": true, - "license": "Apache-2.0" + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } }, "node_modules/balanced-match": { "version": "1.0.2", @@ -1357,16 +1365,18 @@ "optional": true }, "node_modules/bare-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.2.3.tgz", - "integrity": "sha512-1aGs5pRVLToMQ79elP+7cc0u0s/wXAzfBv/7hDloT7WFggLqECCas5qqPky7WHCFdsBH5WDq6sD4fAoz5sJbtA==", + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.4.4.tgz", + "integrity": "sha512-Q8yxM1eLhJfuM7KXVP3zjhBvtMJCYRByoTT+wHXjpdMELv0xICFJX+1w4c7csa+WZEOsq4ItJ4RGwvzid6m/dw==", "dev": true, "license": "Apache-2.0", "optional": true, "dependencies": { "bare-events": "^2.5.4", "bare-path": "^3.0.0", - "bare-stream": "^2.6.4" + "bare-stream": "^2.6.4", + "bare-url": "^2.2.2", + "fast-fifo": "^1.3.2" }, "engines": { "bare": ">=1.16.0" @@ -1425,6 +1435,17 @@ } } }, + "node_modules/bare-url": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.2.2.tgz", + "integrity": "sha512-g+ueNGKkrjMazDG3elZO1pNs3HY5+mMmOet1jtKyhOaCnkLzitxf26z7hoAEkDNgdNmnc1KIlt/dw6Po6xZMpA==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-path": "^3.0.0" + } + }, "node_modules/basic-ftp": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", @@ -1903,9 +1924,9 @@ } }, "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", "dependencies": { @@ -2266,16 +2287,16 @@ } }, "node_modules/eslint-plugin-jsdoc": { - "version": "55.0.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-55.0.3.tgz", - "integrity": "sha512-xU2/QZgBXIGFXOzyWsNaSwrcF80Rq2h084GvIU+pkfzwE55xnr+ShEUfVL6+fZ0Jrh0hWGHdk0RiN0axhK1new==", + "version": "57.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-57.2.1.tgz", + "integrity": "sha512-HeTWN2VVVu7lzoKqH0uxB3UM3CBS+jMm91mSq3jb12CfWtSfverJDfhYDmRWiMGDzL9NUS/XCWPIWTQLsgjS4Q==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "@es-joy/jsdoccomment": "~0.56.0", + "@es-joy/jsdoccomment": "~0.58.0", "are-docs-informative": "^0.0.2", "comment-parser": "1.4.1", - "debug": "^4.4.1", + "debug": "^4.4.3", "escape-string-regexp": "^4.0.0", "espree": "^10.4.0", "esquery": "^1.6.0", @@ -2890,9 +2911,9 @@ } }, "node_modules/globals": { - "version": "16.3.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-16.3.0.tgz", - "integrity": "sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==", + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz", + "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==", "dev": true, "license": "MIT", "engines": { @@ -3388,9 +3409,9 @@ } }, "node_modules/jsdoc-type-pratt-parser": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-5.1.1.tgz", - "integrity": "sha512-DYYlVP1fe4QBMh2xTIs20/YeTz2GYVbWAEZweHSZD+qQ/Cx2d5RShuhhsdk64eTjNq0FeVnteP/qVOgaywSRbg==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-5.4.0.tgz", + "integrity": "sha512-F9GQ+F1ZU6qvSrZV8fNFpjDNf614YzR2eF6S0+XbDjAcUI28FSoXnYZFjQmb1kFx3rrJb5PnxUH3/Yti6fcM+g==", "dev": true, "license": "MIT", "engines": { @@ -4690,18 +4711,18 @@ } }, "node_modules/puppeteer": { - "version": "24.19.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.19.0.tgz", - "integrity": "sha512-gUWgHX36m9K6yUbvNBEA7CXElIL92yXMoAVFrO8OpZkItqrruLVqYA8ikmfgwcw/cNfYgkt0n2+yP9jd9RSETA==", + "version": "24.21.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.21.0.tgz", + "integrity": "sha512-JNY9JluUXepKzqKoPHsNVsrkpRRTare8geNP2L8YMkFHOKIvWSki/yUL9l2VJpani49epEHLpVg+zDcbTYibWA==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@puppeteer/browsers": "2.10.8", + "@puppeteer/browsers": "2.10.10", "chromium-bidi": "8.0.0", "cosmiconfig": "^9.0.0", "devtools-protocol": "0.0.1495869", - "puppeteer-core": "24.19.0", + "puppeteer-core": "24.21.0", "typed-query-selector": "^2.12.0" }, "bin": { @@ -4712,17 +4733,18 @@ } }, "node_modules/puppeteer-core": { - "version": "24.19.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.19.0.tgz", - "integrity": "sha512-qsEys4OIb2VGC2tNWKAs4U0mnjkIAxueMOOzk2nEFM9g4Y8QuvYkEMtmwsEdvzNGsUFd7DprOQfABmlN7WBOlg==", + "version": "24.21.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.21.0.tgz", + "integrity": "sha512-WR4FehOs4XJ8OSp7MkGyVB4mfMs9Q6t8Y48TxiTCRxc8G2lJ5OKYPJvgU80dtKl+aIqIbdcNTgIooY49S5SsmA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@puppeteer/browsers": "2.10.8", + "@puppeteer/browsers": "2.10.10", "chromium-bidi": "8.0.0", - "debug": "^4.4.1", + "debug": "^4.4.3", "devtools-protocol": "0.0.1495869", "typed-query-selector": "^2.12.0", + "webdriver-bidi-protocol": "0.2.11", "ws": "^8.18.3" }, "engines": { @@ -5637,6 +5659,13 @@ "node": ">= 0.8" } }, + "node_modules/webdriver-bidi-protocol": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.2.11.tgz", + "integrity": "sha512-Y9E1/oi4XMxcR8AT0ZC4OvYntl34SPgwjmELH+owjBr0korAX4jKgZULBWILGCVGdVCQ0dodTToIETozhG8zvA==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/Framework/package.json b/Framework/package.json index 00a23dba9..28fb695d8 100644 --- a/Framework/package.json +++ b/Framework/package.json @@ -46,12 +46,12 @@ "@eslint/js": "^9.35.0", "@stylistic/eslint-plugin": "^5.3.1", "eslint": "^9.35.0", - "eslint-plugin-jsdoc": "^55.0.3", - "globals": "^16.3.0", + "eslint-plugin-jsdoc": "^57.2.1", + "globals": "^16.4.0", "mocha": "^11.7.0", "nock": "14.0.0", "nyc": "^17.1.0", - "puppeteer": "^24.19.0", + "puppeteer": "^24.21.0", "sinon": "21.0.0", "supertest": "^7.1.0", "long": "^5.3.1" From 52972c4be99672d8b77a54528d5fc6476ccfdd92 Mon Sep 17 00:00:00 2001 From: George Raduta Date: Tue, 16 Sep 2025 13:06:03 +0200 Subject: [PATCH 42/77] [OGUI-1769] Keep in-memory information from user's request (#3062) * adds static information from the user's request to the environment cache object so that it can be displayed to the user during the virtual state PENDING. --- .../lib/controllers/Deployment.controller.js | 1 + Control/lib/services/Deployment.service.js | 3 ++- Control/lib/services/Environment.service.js | 22 ++++++++++++++++++- .../buttonToAcknowledgeDeployment.js | 2 +- .../mocha-deployment.controller.js | 4 ++++ 5 files changed, 29 insertions(+), 3 deletions(-) diff --git a/Control/lib/controllers/Deployment.controller.js b/Control/lib/controllers/Deployment.controller.js index cd1d53c36..c9200e6fe 100644 --- a/Control/lib/controllers/Deployment.controller.js +++ b/Control/lib/controllers/Deployment.controller.js @@ -111,6 +111,7 @@ class DeploymentController { workflowTemplate, user, shouldAutoTransition, + detectors, }); res.status(201).json(environment); } catch (error) { diff --git a/Control/lib/services/Deployment.service.js b/Control/lib/services/Deployment.service.js index 9673cbb82..289b1cb90 100644 --- a/Control/lib/services/Deployment.service.js +++ b/Control/lib/services/Deployment.service.js @@ -55,12 +55,13 @@ class DeploymentService { workflowTemplate, user, shouldAutoTransition, + detectors, }) { userVars = await this._retrieveUserVars(userVars, selectedConfiguration); userVars = await this._buildUserVarsBasedOnSavedToIgnore(userVars, workflowTemplate); const environment = await this._environmentService.newEnvironmentAsync({ - workflowTemplate, userVars, user, shouldAutoTransition + workflowTemplate, userVars, user, shouldAutoTransition, detectors }); return environment; } diff --git a/Control/lib/services/Environment.service.js b/Control/lib/services/Environment.service.js index 405f08718..7a88c3eda 100644 --- a/Control/lib/services/Environment.service.js +++ b/Control/lib/services/Environment.service.js @@ -189,7 +189,7 @@ class EnvironmentService { * @returns {Promise.<{EnvironmentInfo}, Error>} - if operation was a success ECS will return a partialEnvironmentInfo object * @throws {Error} - if the operation failed */ - async newEnvironmentAsync({ workflowTemplate, userVars, user, shouldAutoTransition = false }) { + async newEnvironmentAsync({ workflowTemplate, userVars, user, shouldAutoTransition = false, detectors }) { let environment = undefined; try { ({ environment } = await this._coreGrpc.NewEnvironmentAsync({ @@ -213,6 +213,26 @@ class EnvironmentService { * @property {string} currentTransition - the current transition of the environment */ environment.isDeploying = true; + /** + * As per ticket OCTRL-1045, ECS is not able to respond with the static information yet. Thus, the GUI + * should keep track of the user that requested the environment and the detectors included in the deployment + * to be able to show this information in the UI. + */ + if (!environment?.userVars?.last_request_user) { + if (!environment.userVars) { + environment.userVars = {}; + } + environment.userVars.last_request_user = { + externalId: user.personid, + name: user.username, + }; + } + if (!environment.rootRole) { + environment.rootRole = workflowTemplate; + } + if (!environment.includedDetectors || environment.includedDetectors.length === 0) { + environment.includedDetectors = detectors ?? []; + } const environmentInfo = EnvironmentInfoAdapter.toEntity(environment, '', detectorsAll, hostsByDetector); this._environmentCacheService.addOrUpdateEnvironment(environmentInfo, true); return environmentInfo; diff --git a/Control/public/pages/Environments/components/buttonToAcknowledgeDeployment.js b/Control/public/pages/Environments/components/buttonToAcknowledgeDeployment.js index f2d880d54..c23af5a50 100644 --- a/Control/public/pages/Environments/components/buttonToAcknowledgeDeployment.js +++ b/Control/public/pages/Environments/components/buttonToAcknowledgeDeployment.js @@ -26,7 +26,7 @@ import { ROLES } from '../../../workflow/constants.js'; * @return {vnode} - Virtual node representing the button */ export const buttonToAcknowledgeDeployment = (environmentId, user, acknowledgeCallback) => { - if (isUserAllowedRole(ROLES.Admin) || di.session.personid === user.externalId) { + if (isUserAllowedRole(ROLES.Admin) || di.session.personid === user?.externalId) { return h('button.btn.btn-danger', { title: 'Acknowledge failed deployment and remove it from the cache', onclick: () => acknowledgeCallback(environmentId) diff --git a/Control/test/lib/controllers/mocha-deployment.controller.js b/Control/test/lib/controllers/mocha-deployment.controller.js index 3459e9aa6..bad17c9a4 100644 --- a/Control/test/lib/controllers/mocha-deployment.controller.js +++ b/Control/test/lib/controllers/mocha-deployment.controller.js @@ -56,6 +56,7 @@ describe('DeploymentController test suite', function() { template, repository, revision, + detectors: ['TST'], userVars: { var1: 'value1' } }; mockDeploymentService.deployEnvironment.returns({ id: 'env123' }); @@ -68,6 +69,7 @@ describe('DeploymentController test suite', function() { selectedConfiguration: undefined, shouldAutoTransition: undefined, userVars: { var1: 'value1' }, + detectors: ['TST'], user: new User(req.session.username, req.session.name, req.session.personid) }); @@ -103,6 +105,7 @@ describe('DeploymentController test suite', function() { const template = 'readout-dataflow'; req.body = { template, + detectors: ['TST'], userVars: { var1: 'value1' } }; mockDeploymentService.deployEnvironment.returns({ id: 'env123' }); @@ -116,6 +119,7 @@ describe('DeploymentController test suite', function() { selectedConfiguration: undefined, shouldAutoTransition: undefined, userVars: { var1: 'value1' }, + detectors: ['TST'], user: new User(req.session.username, req.session.name, req.session.personid) }); From cf1ca024ef72af5a06f9d5a95f58c3d65f92be17 Mon Sep 17 00:00:00 2001 From: Jasper H <50981003+Houwie7000@users.noreply.github.com> Date: Fri, 19 Sep 2025 09:04:06 +0200 Subject: [PATCH 43/77] [OGUI-1759] /layoutes endpoint now accepts filter query param (#3050) * listLayouts now accepts filter parameter as generalized query param --------- Co-authored-by: George Raduta --- .../lib/controllers/LayoutController.js | 4 +- .../lib/repositories/LayoutRepository.js | 68 +++++++++---------- .../common/buildQueryParametersString.js | 29 ++++++-- .../layoutListView/model/LayoutListModel.js | 20 ++++-- .../public/services/Layout.service.js | 12 +++- .../lib/controllers/LayoutController.test.js | 7 +- .../lib/repositories/LayoutRepository.test.js | 4 +- 7 files changed, 88 insertions(+), 56 deletions(-) diff --git a/QualityControl/lib/controllers/LayoutController.js b/QualityControl/lib/controllers/LayoutController.js index aba65e93e..c014da497 100644 --- a/QualityControl/lib/controllers/LayoutController.js +++ b/QualityControl/lib/controllers/LayoutController.js @@ -52,7 +52,7 @@ export class LayoutController { /** * HTTP GET endpoint for retrieving a list of layouts - * * can be filtered by "owner_id" or "object_path" + * * Can be filtered by "owner_id" or "objectPath" using filter.objectPath * * if no owner_id is provided, all layouts will be fetched; * @param {Request} req - HTTP request object with information on owner_id * @param {Response} res - HTTP response object to provide layouts information @@ -76,7 +76,7 @@ export class LayoutController { } try { - const layouts = await this._layoutRepository.listLayouts({ owner_id, fields, filter }); + const layouts = await this._layoutRepository.listLayouts({ fields, filter: { ...filter, owner_id } }); return res.status(200).json(layouts); } catch (error) { logger.errorMessage(`Error retrieving layouts: ${error}`); diff --git a/QualityControl/lib/repositories/LayoutRepository.js b/QualityControl/lib/repositories/LayoutRepository.js index db43785ef..266245016 100644 --- a/QualityControl/lib/repositories/LayoutRepository.js +++ b/QualityControl/lib/repositories/LayoutRepository.js @@ -21,52 +21,18 @@ export class LayoutRepository extends BaseRepository { /** * Retrieves a filtered list of layouts with optional field selection * @param {object} [options] - Filtering and field selection options - * @param {number} [options.owner_id] - Filter layouts by owner ID * @param {string} [options.name] - Filter layouts by exact name match * @param {Array} [options.fields] - Array of field names to include in each returned layout object * @param {object} [options.filter] - Filter layouts by containing filter.objectPath, case insensitive * @returns {Array} Array of layout objects matching the filters, containing only the specified fields - * @throws {TypeError} If fields parameter is provided but is not an array - * @throws {Error} If any specified field does not exist in the layout objects */ - listLayouts({ name, owner_id, fields = [], filter } = {}) { + listLayouts({ name, fields = [], filter } = {}) { const { layouts } = this._jsonFileService.data; - - // Better to lowercase once rather than at every single object_path comparison. - if (filter?.objectPath !== undefined) { - filter.objectPath = filter.objectPath.toLowerCase(); - } - - // Filter using filter.objectPath should filter and its objectPath be defined, - // otherwise filter by name and owner_id. - const layoutFilter = filter?.objectPath !== undefined ? - - /** - * Filter layouts using the objectPath on included objects - * @param {Layout} layout - layout to filter trough - * @returns {boolean} - filter condition satisfied, based on objectPath - */ - (layout) => - (layout.tabs ?? []) - .flatMap((tab) => tab.objects ?? []) - .filter((object) => (object.name ?? '').toLowerCase().includes(filter.objectPath)).length > 0 - : - - /** - * Filter layouts using the layout.owner_id and or layout.name - * @param {Layout} layout - layout to filter trough - * @returns {boolean} - filter condition satisfied, based on owner_id and or layout.name - */ - (layout) => - (owner_id === undefined || layout.owner_id === owner_id) && - (name === undefined || layout.name === name); - - const filteredLayouts = layouts.filter(layoutFilter); + const filteredLayouts = this._filterLayouts(layouts, { ...filter, name }); if (fields.length === 0) { return filteredLayouts; } - return filteredLayouts.map((layout) => { const layoutObj = {}; fields.forEach((field) => { @@ -76,6 +42,36 @@ export class LayoutRepository extends BaseRepository { }); } + /** + * Filters layouts by filter object + * @param {Array} layouts - Array of layouts to filter + * @param {object} filter - Filtering object + * @param {number} [filter.owner_id] - owner id to filter by + * @param {string} [filter.name] - name to filter by + * @param {string} [filter.objectPath] - object path prefix for potential objects to be contained by layout + * @returns {Array} Filtered layouts. + */ + _filterLayouts(layouts, { owner_id, name, objectPath } = {}) { + const objectPathLowerCase = objectPath?.toLowerCase(); + return layouts.filter((layout) => { + if (owner_id !== undefined && layout.owner_id !== owner_id) { + return false; + } + if (name !== undefined && layout.name !== name) { + return false; + } + if (objectPathLowerCase) { + const hasMatchingObject = layout.tabs?.some((tab) => + tab.objects?.some((obj) => + obj.name?.toLowerCase().includes(objectPathLowerCase))); + if (!hasMatchingObject) { + return false; + } + } + return true; + }); + } + /** * Retrieve a layout by its id or throws an error * @param {string} layoutId - layout id diff --git a/QualityControl/public/common/buildQueryParametersString.js b/QualityControl/public/common/buildQueryParametersString.js index 0bcac1010..2559ee464 100644 --- a/QualityControl/public/common/buildQueryParametersString.js +++ b/QualityControl/public/common/buildQueryParametersString.js @@ -14,6 +14,10 @@ /** * Given an existing object of used parameters and new ones to add/update, return a string with desired URL format + * @example + * { page: 'test', filter: { name: 'mylayout', objectPath: 'test' } } + * results in: + * ?page=test&filter[name]=mylayout&filter[objectPath]=test * @param {object} currentParameters - current parameters in the URL * @param {object} parameters - object containing what parameters should be added or updated * @returns {string} - updated URL @@ -22,8 +26,25 @@ export function buildQueryParametersString(currentParameters, parameters) { Object.assign(currentParameters, parameters); let url = '?'; - Object.keys(currentParameters).forEach((param) => { - url += `${param}=${currentParameters[param]}&`; - }); - return url.substring(0, url.length - 1); + /** + * Encodes a parameter for URL query string, supporting nested objects. + * @param {string} key - The parameter key + * @param {string|object} value - The parameter value, string or nested object + * @returns {string} Encoded parameter string + */ + function encodeParam(key, value) { + if (value && typeof value === 'object' && !Array.isArray(value)) { + return Object.keys(value) + .map((subKey) => `${key}[${subKey}]=${encodeURIComponent(value[subKey])}`) + .join('&'); + } else { + return `${key}=${encodeURIComponent(value)}`; + } + } + + url += Object.keys(currentParameters) + .map((param) => encodeParam(param, currentParameters[param])) + .filter(Boolean) + .join('&'); + return url; } diff --git a/QualityControl/public/pages/layoutListView/model/LayoutListModel.js b/QualityControl/public/pages/layoutListView/model/LayoutListModel.js index 2617f6beb..6df49f5e1 100644 --- a/QualityControl/public/pages/layoutListView/model/LayoutListModel.js +++ b/QualityControl/public/pages/layoutListView/model/LayoutListModel.js @@ -15,6 +15,7 @@ import FolderModel, { FolderType } from '../../../folder/model/FolderModel.js'; import LayoutCardModel from './LayoutCardModel.js'; import { BaseViewModel } from '../../../common/abstracts/BaseViewModel.js'; +import { RequestFields } from '../../../common/RequestFields.enum.js'; /** * LayoutListModel namespace to control the layoutCards spread between its folders @@ -70,14 +71,21 @@ export default class LayoutListModel extends BaseViewModel { * Set user's input for search and use a fuzzy algo to filter list of layouts. * Fuzzy allows missing chars "aaa" can find "a/a/a" or "aa/a/bbbbb" * @param {string} searchInput - string input from the user to search by + * @param {string} objectPath - string input from the user to search layouts by objectPath * @returns {undefined} */ - search(searchInput) { - this._searchInput = searchInput; - this.folders.forEach((folder) => { - folder.searchInput = new RegExp(searchInput, 'i'); - }); - this.notify(); + search(searchInput, objectPath) { + if (objectPath === undefined) { + this._searchInput = searchInput; + this.folders.forEach((folder) => { + folder.searchInput = new RegExp(searchInput, 'i'); + }); + this.notify(); + } else { + const layoutService = this.model.services.layout; + this._searchInput = objectPath; + layoutService.getLayouts(RequestFields.LAYOUT_CARD, { objectPath }, this.model); + } } /** diff --git a/QualityControl/public/services/Layout.service.js b/QualityControl/public/services/Layout.service.js index 0710acf6d..80550e7b5 100644 --- a/QualityControl/public/services/Layout.service.js +++ b/QualityControl/public/services/Layout.service.js @@ -16,6 +16,7 @@ import { jsonDelete } from './utils/jsonDelete.js'; import { jsonPatch } from './utils/jsonPatch.js'; import { jsonPut } from './utils/jsonPut.js'; import { RemoteData } from '/js/src/index.js'; +import { buildQueryParametersString } from '../common/buildQueryParametersString.js'; /** * Model namespace with all CRUD requests for layouts @@ -38,16 +39,21 @@ export default class LayoutService { /** * Method to get all layouts shared between users - * @param {string|undefined} fields - comma seperated string values. Represent the fields that should be fetched. + * @param {string|undefined} fields - comma separated string values. Represent the fields that should be fetched. + * @param {object|undefined} filter - filter information to be parsed by the backend. * If left empty all available fields will be fetched * @param {Class} that - Observer requesting data that should be notified of changes * @returns {undefined} */ - async getLayouts(fields = undefined, that = this.model) { + async getLayouts(fields = undefined, filter = {}, that = this.model) { this.list = RemoteData.loading(); that.notify(); - const url = `/api/layouts${fields !== undefined ? `?fields=${fields}` : ''}`; + const queryString = buildQueryParametersString({}, { + ...fields !== undefined ? { fields } : '', + filter, + }); + const url = `/api/layouts${queryString}`; const { result, ok } = await this.loader.get(url); if (ok) { diff --git a/QualityControl/test/lib/controllers/LayoutController.test.js b/QualityControl/test/lib/controllers/LayoutController.test.js index 17dadd83f..f6411ce91 100644 --- a/QualityControl/test/lib/controllers/LayoutController.test.js +++ b/QualityControl/test/lib/controllers/LayoutController.test.js @@ -61,6 +61,7 @@ export const layoutControllerTestSuite = async () => { title: 'Unknown Error', }), 'Error message was incorrect'); }); + test('should log error when non-Joi validation error occurs', async () => { const response = [{ id: 5, name: 'somelayout' }]; const jsonStub = sinon.createStubInstance(LayoutRepository, { @@ -101,7 +102,7 @@ export const layoutControllerTestSuite = async () => { ok(res.status.calledWith(200), 'Response status was not 200'); ok(res.json.calledWith(response), 'A list of layouts should have been sent back'); ok( - jsonStub.listLayouts.calledWith({ owner_id: undefined, fields, filter: undefined }), + jsonStub.listLayouts.calledWith({ fields, filter: { owner_id: undefined } }), 'Fields were not passed correctly', ); }); @@ -122,7 +123,7 @@ export const layoutControllerTestSuite = async () => { ok(res.status.calledWith(200), 'Response status was not 200'); ok(res.json.calledWith(response), 'A list of layouts should have been sent back'); ok( - jsonStub.listLayouts.calledWith({ owner_id: 1, fields: [fields], filter: undefined }), + jsonStub.listLayouts.calledWith({ fields: [fields], filter: { owner_id: 1 } }), 'Owner id was not used in data connector call', ); }); @@ -244,7 +245,7 @@ export const layoutControllerTestSuite = async () => { ok(res.json.calledWith(response), 'A list of layouts should have been sent back'); }); - test('should return 400 when filter.objectPath contain an invalid character: #', async () => { + test('should return 400 when filter.objectPath contains an invalid character: #', async () => { const jsonStub = sinon.createStubInstance(LayoutRepository); const req = { query: { diff --git a/QualityControl/test/lib/repositories/LayoutRepository.test.js b/QualityControl/test/lib/repositories/LayoutRepository.test.js index d5d1b2104..84309ac09 100644 --- a/QualityControl/test/lib/repositories/LayoutRepository.test.js +++ b/QualityControl/test/lib/repositories/LayoutRepository.test.js @@ -54,7 +54,7 @@ export const layoutRepositoryTest = async () => { test('should filter layouts by owner_id', () => { const ownerId = 0; - const result = layoutRepository.listLayouts({ owner_id: ownerId }); + const result = layoutRepository.listLayouts({ filter: { owner_id: ownerId } }); strictEqual(result.length, 2, 'number of layouts is incorrect'); result.forEach((layout) => { @@ -71,7 +71,7 @@ export const layoutRepositoryTest = async () => { test('should return only layout with specified filter.objectPath', () => { const objectPath = 'qc/MCH/QO/DataDecodingCheck'; const result = layoutRepository.listLayouts({ filter: { - objectPath: objectPath, + objectPath, } }); ok(result.length === 1, "listLayouts's filter.objectPath should only return one layout"); }); From d31f1b9887281a30f1642be0c662c5a8cf336c47 Mon Sep 17 00:00:00 2001 From: Alejandro Mariscal Romero <87366244+mariscalromeroalejandro@users.noreply.github.com> Date: Fri, 19 Sep 2025 15:31:16 +0200 Subject: [PATCH 44/77] [OGUI-1766] Run mode checkout (#3054) This PR updates the runs mode functionality by replacing the previous activation method with a checkbox, making it more intuitive for users to enter runs mode. --- .../public/common/filters/filterViews.js | 129 ++++------- .../public/common/filters/filtersConfig.js | 15 ++ .../common/filters/model/FilterModel.js | 207 +++++++++--------- .../common/filters/runMode/runModeCheckbox.js | 58 +++++ .../common/filters/runMode/runStatusPanel.js | 50 +++++ QualityControl/public/common/header.js | 24 +- .../public/common/object/dateSelector.js | 1 + QualityControl/public/common/runModeHeader.js | 171 --------------- QualityControl/public/layout/Layout.js | 2 +- .../public/layout/panels/editModal.js | 1 + QualityControl/public/layout/view/header.js | 11 +- QualityControl/public/object/QCObject.js | 13 +- .../public/object/objectTreeHeader.js | 5 +- .../components/LayoutListHeader.js | 1 - .../pages/objectView/components/header.js | 4 +- .../public/services/Filter.service.js | 43 ++-- .../public/services/QCObject.service.js | 7 +- .../test/public/features/filterTest.test.js | 93 ++++---- .../test/public/features/runMode.test.js | 124 +++++++++++ .../runsMode/runsModeLayoutShow.test.js | 92 -------- .../runsMode/runsModeObjectTree.test.js | 82 ------- .../test/public/pages/layout-list.test.js | 4 +- .../test/public/pages/layout-show.test.js | 47 ++-- .../test/public/pages/object-tree.test.js | 12 +- QualityControl/test/setup/testSetupForBkp.js | 23 ++ QualityControl/test/setup/testSetupForCcdb.js | 6 + QualityControl/test/test-index.js | 14 +- 27 files changed, 545 insertions(+), 694 deletions(-) create mode 100644 QualityControl/public/common/filters/runMode/runModeCheckbox.js create mode 100644 QualityControl/public/common/filters/runMode/runStatusPanel.js delete mode 100644 QualityControl/public/common/runModeHeader.js create mode 100644 QualityControl/test/public/features/runMode.test.js delete mode 100644 QualityControl/test/public/features/runsMode/runsModeLayoutShow.test.js delete mode 100644 QualityControl/test/public/features/runsMode/runsModeObjectTree.test.js diff --git a/QualityControl/public/common/filters/filterViews.js b/QualityControl/public/common/filters/filterViews.js index 4b6cac0b4..bf0993889 100644 --- a/QualityControl/public/common/filters/filterViews.js +++ b/QualityControl/public/common/filters/filterViews.js @@ -14,7 +14,9 @@ import { filterInput, dynamicSelector } from './filter.js'; import { FilterType } from './filterTypes.js'; -import { filtersConfig } from './filtersConfig.js'; +import { filtersConfig, runModeFilterConfig } from './filtersConfig.js'; +import { runModeCheckbox } from './runMode/runModeCheckbox.js'; +import { runStatusPanel } from './runMode/runStatusPanel.js'; import { h, iconChevronBottom, iconChevronTop } from '/js/src/index.js'; /** @@ -27,7 +29,7 @@ import { h, iconChevronBottom, iconChevronTop } from '/js/src/index.js'; * @returns {undefined} */ const createFilterElement = (config, filterMap, onInputCallback, onEnterCallback, onChangeCallback) => { - const { type, queryLabel, placeholder, id, inputType = 'text', options } = config; + const { type, queryLabel, placeholder, id, inputType = 'text', options, width } = config; const commonConfig = { queryLabel, placeholder, @@ -35,8 +37,8 @@ const createFilterElement = (config, filterMap, onInputCallback, onEnterCallback filterMap, onInputCallback, onEnterCallback, + width, }; - switch (type) { case FilterType.INPUT: return filterInput({ ...commonConfig, type: inputType }); case FilterType.DROPDOWN: return dynamicSelector({ ...commonConfig, options, onChangeCallback }); @@ -51,24 +53,41 @@ const createFilterElement = (config, filterMap, onInputCallback, onEnterCallback * @returns {vnode} - virtual node element */ export function filtersPanel(filterModel, viewModel) { - const { filterMap, setFilterValue, filterService, isVisible, clearFilter } = filterModel; + const { + filterMap, + setFilterValue, + filterService, + clearFilter, + isRunModeActivated, + runNumber, + runStatus, + isVisible, + } = filterModel; const onInputCallback = setFilterValue.bind(filterModel); const onChangeCallback = setFilterValue.bind(filterModel); const onEnterCallback = () => filterModel.triggerFilter(viewModel); const clearFilterCallback = clearFilter.bind(filterModel, viewModel); - const filtersList = filtersConfig(filterService); - - if (!isVisible || filterModel.inRunMode) { + if (!isVisible) { return null; } + const filtersList = isRunModeActivated + ? runModeFilterConfig() + : filtersConfig(filterService); return h( - '.w-100.flex-row.p2.g2.justify-center#filterElement', + '.w-100.flex-column.p2.g2.justify-center#filterElement', [ - triggerFiltersButton(onEnterCallback, filterModel, viewModel), - clearFiltersButton(clearFilterCallback), - ...filtersList.map((filter) => - createFilterElement(filter, filterMap, onInputCallback, onEnterCallback, onChangeCallback)), + h('.flex-row.g2.justify-center', [ + runModeCheckbox(filterModel, viewModel), + triggerFiltersButton(onEnterCallback, filterModel), + !isRunModeActivated && clearFiltersButton(clearFilterCallback), + ...filtersList.map((filter) => + createFilterElement(filter, filterMap, onInputCallback, onEnterCallback, onChangeCallback)), + ]), + isRunModeActivated && runStatusPanel( + runNumber, + runStatus, + ), ], ); }; @@ -78,95 +97,31 @@ export function filtersPanel(filterModel, viewModel) { * @param {object} viewModel - Model that manages the state of the page * @returns {boolean} - whether runs mode is allowed */ -const isRunsModeAllowed = (viewModel) => { - const { model } = viewModel; - - const allowedPages = ['objectTree', 'layoutShow', 'objectView']; - if (!model || !allowedPages.includes(model.page)) { - return false; - } - - // not allow runs mode if in edit mode - if (model.page === 'layoutShow' && viewModel.editEnabled) { - return false; - } - - return true; -}; /** * Button which will allow the user to update filter parameters after the input * @param {Function} onClickCallback - Function to trigger the filter mechanism * @param {FilterModel} filterModel - Model that manages filter state - * @param {object} viewModel - Model that manages the state of the page * @returns {vnode} - virtual node element */ -const triggerFiltersButton = (onClickCallback, filterModel, viewModel) => { - const runNumber = filterModel.filterMap.RunNumber; - if (filterModel.isValidRunNumber(runNumber) && isRunsModeAllowed(viewModel)) { - return updateDropdownButton(onClickCallback, filterModel, viewModel); - } +const triggerFiltersButton = (onClickCallback, filterModel) => { + const isRunModeActivated = filterModel?.isRunModeActivated; + const { isValid, title } = filterModel.validateRunNumber(); + + const buttonId = isRunModeActivated ? 'updateAndRunModeButton' : 'triggerFilterButton'; return h( 'button.btn.btn-primary', - { id: 'triggerFilterButton', onclick: onClickCallback, title: 'Update filters' }, + { + id: buttonId, + onclick: isValid ? onClickCallback : null, + disabled: !isValid, + title, + }, 'Update', ); }; -/** - * Dropdown button for update options when run number is present - * @param {Function} onClickCallback - Function to trigger the filter mechanism - * @param {FilterModel} filterModel - Model that manages filter state - * @param {object} viewModel - Model that manages the state of the page - * @returns {vnode} - virtual node element - */ -const updateDropdownButton = (onClickCallback, filterModel, viewModel) => { - // Use a simple property on the filterModel to track dropdown state - const isDropdownOpen = filterModel.dropdownOpen || false; - - return h('.dropdown', { - class: isDropdownOpen ? 'dropdown-open' : '', - }, [ - h('button.btn.btn-primary', { - id: 'triggerFilterButton', - onclick: (e) => { - e.stopPropagation(); - filterModel.dropdownOpen = !isDropdownOpen; - filterModel.notify(); - }, - title: 'Update options', - }, [ - 'Update ', - isDropdownOpen ? iconChevronTop() : iconChevronBottom(), - ]), - isDropdownOpen && h('.dropdown-menu', [ - h('.p2', [ - h('div.menu-item', { - id: 'updateOnlyButton', - onclick: (e) => { - e.stopPropagation(); - filterModel.dropdownOpen = false; - filterModel.notify(); - onClickCallback(); - }, - style: 'white-space: nowrap;', - }, 'Update only'), - h('div.menu-item', { - id: 'updateAndRunModeButton', - onclick: async (e) => { - e.stopPropagation(); - filterModel.dropdownOpen = false; - filterModel.notify(); - await filterModel.activateRunsMode(viewModel); - }, - style: 'white-space: nowrap;', - }, 'Update & Run Mode'), - ]), - ]), - ]); -}; - /** * Button which will allow the user to clear the filter element * @param {Function} clearFilterCallback - Function that clears the filter state. diff --git a/QualityControl/public/common/filters/filtersConfig.js b/QualityControl/public/common/filters/filtersConfig.js index 6e9733ed0..5a3577862 100644 --- a/QualityControl/public/common/filters/filtersConfig.js +++ b/QualityControl/public/common/filters/filtersConfig.js @@ -48,3 +48,18 @@ export const filtersConfig = ({ runTypes }) => [ id: 'passNameFilter', }, ]; + +/** + * Returns a filter configuration object used to render dynamic filter in run mode. + * @returns {object} Filter configuration object + */ +export const runModeFilterConfig = () => [ + { + type: FilterType.INPUT, + queryLabel: 'RunNumber', + placeholder: 'RunNumber (e.g. 546783)', + id: 'runNumberFilter', + inputType: 'number', + width: 'w-10', + }, +]; diff --git a/QualityControl/public/common/filters/model/FilterModel.js b/QualityControl/public/common/filters/model/FilterModel.js index 12937216f..715a57ca6 100644 --- a/QualityControl/public/common/filters/model/FilterModel.js +++ b/QualityControl/public/common/filters/model/FilterModel.js @@ -12,7 +12,7 @@ * or submit itself to any jurisdiction. */ -import { Observable } from '/js/src/index.js'; +import { Observable, RemoteData } from '/js/src/index.js'; import { buildQueryParametersString } from '../../buildQueryParametersString.js'; import FilterService from '../../../services/Filter.service.js'; import { RunStatus } from '../../../library/runStatus.enum.js'; @@ -35,13 +35,11 @@ export default class FilterModel extends Observable { this.isVisible = true; this._runsModeInterval = null; - // Run mode - this._inRunMode = false; this._runNumber = null; - this._runStatus = RunStatus.UNKNOWN; - this._reason = ''; - this.dropdownOpen = false; - this.statusInfoOpen = false; + this._runStatus = RemoteData.notAsked(); + this._isRunModeActivated = false; + + this.ONGOING_RUN_INTERVAL_MS = 15000; } /** @@ -115,10 +113,13 @@ export default class FilterModel extends Observable { */ async triggerFilter(baseViewModel) { this.setFilterToURL(); - if (this.inRunMode) { - const { status, reason } = await this.filterService.getRunStatus(this.runNumber); - this._reason = reason; - this.runStatus = status; + if (this.isRunModeActivated) { + this.runNumber = this._filterMap['RunNumber']; + this.runStatus = RemoteData.loading(); + this.notify(); + this.runStatus = await this.filterService.getRunStatus(this.runNumber); + this.notify(); + this._manageRunsModeInterval(baseViewModel); } baseViewModel.triggerFilter(); } @@ -159,21 +160,17 @@ export default class FilterModel extends Observable { /** * Activates the runs mode - * @param {object} baseViewModel - The view model that provides the triggerFilter method. + * @param {object} viewModel The model of the view * @returns {Promise} */ - async activateRunsMode(baseViewModel) { - // Save current filters before activating run mode - this._previousFilterMap = { ...this._filterMap }; - this.runNumber = this._filterMap.RunNumber; - - // Clear all filters except RunNumber - this._filterMap = { RunNumber: this._runNumber }; - - // Activate run mode - this.inRunMode = true; - await this.triggerFilter(baseViewModel); - this._manageRunsModeInterval(baseViewModel); + async activateRunsMode(viewModel) { + this.isRunModeActivated = true; + if (this._filterMap.RunNumber) { + this._filterMap = { RunNumber: this._filterMap.RunNumber }; + this.triggerFilter(viewModel); + } else { + this._filterMap = {}; + } this.notify(); } @@ -183,9 +180,7 @@ export default class FilterModel extends Observable { * @returns {Promise} */ async deactivateRunsMode(baseViewModel) { - this._filterMap = this._previousFilterMap || {}; this.resetRunsMode(); - this.setFilterToURL(); await baseViewModel.triggerFilter(); this.notify(); } @@ -195,13 +190,10 @@ export default class FilterModel extends Observable { * @returns {void} */ resetRunsMode() { - this.inRunMode = false; + this.isRunModeActivated = false; this.runNumber = null; - this.runStatus = RunStatus.UNKNOWN; + this.runStatus = RemoteData.notAsked(); this.clearRunsModeInterval(); - this.dropdownOpen = false; - this.statusInfoOpen = false; - this._previousFilterMap = null; this.notify(); } @@ -214,17 +206,25 @@ export default class FilterModel extends Observable { async _manageRunsModeInterval(baseViewModel) { this.clearRunsModeInterval(); this._currentViewModel = baseViewModel; - if (this.runStatus === RunStatus.ONGOING) { - this._runsModeInterval = setInterval(async () => { - if (this._currentViewModel) { - await this.triggerFilter(this._currentViewModel); - if (this.runStatus !== RunStatus.ONGOING) { + this._runsModeInterval = setInterval(async () => { + if (!this._currentViewModel) { + return; + } + this.runStatus = RemoteData.loading(); + this.notify(); + this.runStatus = await this.filterService.getRunStatus(this.runNumber); + this.notify(); + this.runStatus.match({ + Success: (res) => { + if (res?.runStatus !== RunStatus.ONGOING) { this.clearRunsModeInterval(); + } else { + baseViewModel.triggerFilter(); } - } - // TODO: Should be provided in config file (ticket OGUI-1743) - }, 5000); - } + }, + Other: () => this.clearRunsModeInterval(), + }); + }, this.ONGOING_RUN_INTERVAL_MS); } /** @@ -245,98 +245,95 @@ export default class FilterModel extends Observable { * @returns {void} */ restartRunsModeIntervals(baseViewModel) { - if (this.inRunMode && this.runStatus === RunStatus.ONGOING) { - this._manageRunsModeInterval(baseViewModel); + if (!this.isRunModeActivated) { + return; } + + this.runStatus.match({ + Success: (res) => { + if (res?.runStatus === RunStatus.ONGOING && !this._runsModeInterval) { + this._manageRunsModeInterval(baseViewModel); + } + }, + Other: () => null, + }); } /** - * Checks if run mode is activated - * @returns {boolean} true if activated + * Gets the current run number. + * @returns {number} The run number. */ - get inRunMode() { - return this._inRunMode; + get runNumber() { + return this._runNumber; } /** - * Set run mode - * @param {boolean} value - Whether to activate or deactivate run mode - * @returns {void} + * Sets the run number. + * @param {number} value - The new run number. */ - set inRunMode(value) { - this._inRunMode = value; - this.notify(); + set runNumber(value) { + this._runNumber = value; } /** - * Get run number - * @returns {null | number} Run number or null if not set + * Gets the current run status. + * @returns {RemoteData} The run status. */ - get runNumber() { - return this._runNumber; + get runStatus() { + return this._runStatus; } /** - * Set run number - * @param {number} runNumber - The run number to set - * @returns {void} + * Sets the run status. + * @param {RemoteData} value - The new run status. */ - set runNumber(runNumber) { - this._runNumber = runNumber; - this.notify(); + set runStatus(value) { + this._runStatus = value; } /** - * Get run status - * @returns {RunStatus} The current run status + * Gets the current run mode status. + * @returns {boolean} True if turned on. */ - get runStatus() { - return this._runStatus; + get isRunModeActivated() { + return this._isRunModeActivated; } /** - * Set run status - * @param {RunStatus} runStatus - The run status to set - * @returns {void} + * Sets the run mode status. + * @param {boolean} value - True if should be turned on. */ - set runStatus(runStatus) { - // exit runs mode if run is not found or status is unknown - if (this.inRunMode && runStatus !== RunStatus.ONGOING && runStatus !== RunStatus.ENDED) { - setTimeout(async () => { - if (this._currentViewModel) { - let reason = ''; - switch (runStatus) { - case RunStatus.NOT_FOUND: - reason = 'The run number provided does not correspond to any known run.'; - break; - case RunStatus.BOOKKEEPING_UNAVAILABLE: - reason = 'The bookkeeping service is not available.'; - break; - case RunStatus.UNKNOWN: - reason = 'Unknwon reason'; - break; - default: - reason = this._reason; - } - await this.deactivateRunsMode(this._currentViewModel); - this.model.notification.show( - `Runs mode cannot be accesed: ${reason}`, - runStatus === RunStatus.ERROR ? 'danger' : 'warning', - 4000, - ); - } - }, 0); - } - this._runStatus = runStatus; - this.notify(); + set isRunModeActivated(value) { + this._isRunModeActivated = value; } /** - * Validates if a run number is a valid number - * @param {string|number} runNumber - The run number to validate - * @returns {boolean} True if the run number is valid + * Validates a run number for run mode. + * @returns {{ isValid: boolean, title: string }} An object indicating + * whether the run number is valid and a corresponding message. */ - isValidRunNumber(runNumber) { - return runNumber && !isNaN(Number(runNumber)) && Number.isInteger(Number(runNumber)); - } + validateRunNumber() { + const runNumber = this._filterMap?.RunNumber; + if (runNumber === undefined || runNumber === null || runNumber === '') { + if (this.isRunModeActivated) { + return { isValid: false, title: 'Run number is required' }; + } else { + return { isValid: true, title: 'Update filters' }; + } + } + if (isNaN(runNumber)) { + return { isValid: false, title: 'Run number must be a valid number' }; + } + if (!Number.isInteger(Number(runNumber))) { + return { isValid: false, title: 'Run number must be an integer' }; + } + //must be positive + if (Number(runNumber) < 0) { + return { isValid: false, title: 'Run number must be a positive integer' }; + } + if (Number(runNumber) > 999999) { + return { isValid: false, title: 'Run number must be 999999 or less' }; + } + return { isValid: true, title: 'Update filters' }; + }; } diff --git a/QualityControl/public/common/filters/runMode/runModeCheckbox.js b/QualityControl/public/common/filters/runMode/runModeCheckbox.js new file mode 100644 index 000000000..6cae8536e --- /dev/null +++ b/QualityControl/public/common/filters/runMode/runModeCheckbox.js @@ -0,0 +1,58 @@ +/** + * @license + * Copyright CERN and copyright holders of ALICE O2. This software is + * distributed under the terms of the GNU General Public License v3 (GPL + * Version 3), copied verbatim in the file "COPYING". + * + * See http://alice-o2.web.cern.ch/license for full licensing information. + * + * In applying this license CERN does not waive the privileges and immunities + * granted to it by virtue of its status as an Intergovernmental Organization + * or submit itself to any jurisdiction. + */ + +import { h } from '/js/src/index.js'; + +/** + * Render a run mode switch + * @param {object} filterModel the filter model + * @param {object} viewModel the model of the view + * @returns {Component} the run mode switch component + */ +export const runModeCheckbox = (filterModel, viewModel) => { + const { isRunModeActivated } = filterModel; + + const handleClick = () => { + if (isRunModeActivated) { + filterModel.deactivateRunsMode(viewModel); + } else { + filterModel.activateRunsMode(viewModel); + } + }; + const isAvailable = filterModel.validateRunNumber(); + return h( + 'label.flex-row.g1.items-center.form-check-label', + { + style: `cursor:${isAvailable ? 'pointer' : 'not-allowed'}`, + }, + [ + h( + '.switch', + [ + h('input', { + onchange: () => isAvailable && handleClick(), + type: 'checkbox', + checked: isRunModeActivated, + }), + h(`span.slider.round.bg-${ + isRunModeActivated ? 'primary' : 'gray' + }`, { + style: ` + cursor: ${isAvailable ? 'pointer' : 'not-allowed'};`, + }), + ], + ), + 'Runs mode', + ], + ); +}; diff --git a/QualityControl/public/common/filters/runMode/runStatusPanel.js b/QualityControl/public/common/filters/runMode/runStatusPanel.js new file mode 100644 index 000000000..faa3a2fb2 --- /dev/null +++ b/QualityControl/public/common/filters/runMode/runStatusPanel.js @@ -0,0 +1,50 @@ +/** + * @license + * Copyright CERN and copyright holders of ALICE O2. This software is + * distributed under the terms of the GNU General Public License v3 (GPL + * Version 3), copied verbatim in the file "COPYING". + * + * See http://alice-o2.web.cern.ch/license for full licensing information. + * + * In applying this license CERN does not waive the privileges and immunities + * granted to it by virtue of its status as an Intergovernmental Organization + * or submit itself to any jurisdiction. + */ + +import { h } from '/js/src/index.js'; + +/** + * Render a run mode switch + * @param {number} runNumber - The run number + * @param {RunStatus} status - The run status + * @returns {HTMLElement} - The rendered run status panel + */ +export const runStatusPanel = (runNumber, status) => + status.match({ + Loading: () => + h('.flex-row.g1.items-center.justify-center', [ + h('b', { id: 'runNumberLabel' }, `#${runNumber}`), + h('.flex-row.g1', [ + h('label', 'Status: '), + h('b.color-gray', 'Loading...'), + ]), + ]), + + Success: (res) => + h('.flex-row.g1.items-center.justify-center', { id: 'runStatusPanel' }, [ + h('b', { id: 'runNumberLabel' }, `#${runNumber}`), + h('.flex-row.g1', [ + h('span', 'Status: '), + h( + `b.${ + res?.runStatus === 'ONGOING' ? 'success' : 'gray' + }`, + { + id: 'runStatus', + }, + res?.runStatus, + ), + ]), + ]), + Other: () => null, + }); diff --git a/QualityControl/public/common/header.js b/QualityControl/public/common/header.js index a9a6112ff..3bea814d5 100644 --- a/QualityControl/public/common/header.js +++ b/QualityControl/public/common/header.js @@ -21,7 +21,6 @@ import aboutViewHeader from '../pages/aboutView/components/aboutViewHeader.js'; import LayoutListHeader from '../pages/layoutListView/components/LayoutListHeader.js'; import { objectViewHeader } from '../pages/objectView/components/header.js'; import { filtersPanel } from './filters/filterViews.js'; -import { runModeHeader } from './runModeHeader.js'; /** * Shows header of the application, split with 3 parts: @@ -32,11 +31,10 @@ import { runModeHeader } from './runModeHeader.js'; * @returns {vnode} - header element */ export default (model) => h('.flex-col', [ - h('.flex-row.p2.items-center', [ + h('.flex-row.p2.items-center', { id: 'qcg-header' }, [ commonHeader(model), - headerSpecific(model), + h('.flex-grow.flex-row', headerSpecific(model)), ]), - runsModeSpecific(model), filterSpecific(model), ]); @@ -73,28 +71,12 @@ const filterSpecific = (model) => { } }; -/** - * Shows the runs mode component - * @param {Model} model - root model of the application - * @returns {vnode} - virtual node element - */ -const runsModeSpecific = (model) => { - const { page, filterModel, object, layout, objectViewModel } = model; - - switch (page) { - case 'objectTree': return runModeHeader(filterModel, object); - case 'layoutShow': return runModeHeader(filterModel, layout); - case 'objectView': return runModeHeader(filterModel, objectViewModel); - default: return null; - } -}; - /** * Shows app header, common to all pages (profile button + app title) * @param {Model} model - root model of the application * @returns {vnode} - virtual node element */ -const commonHeader = (model) => h('.flex-grow.flex-row.items-center', [ +const commonHeader = (model) => h('.flex-row.items-center.w-33', [ loginButton(model), ' ', h('span.f4.gray', { diff --git a/QualityControl/public/common/object/dateSelector.js b/QualityControl/public/common/object/dateSelector.js index 22e49fbe6..f52e58c2c 100644 --- a/QualityControl/public/common/object/dateSelector.js +++ b/QualityControl/public/common/object/dateSelector.js @@ -25,6 +25,7 @@ import { prettyFormatDate } from './../utils.js'; export const dateSelector = (selected, versions, callback) => h( '.w-100.flex-row', h('select.form-control.gray-darker.text-center.w-25', { + id: 'dateSelector', onchange: (e) => { const { value } = e.target; const { validFrom, id } = JSON.parse(value); diff --git a/QualityControl/public/common/runModeHeader.js b/QualityControl/public/common/runModeHeader.js deleted file mode 100644 index 7117cbc10..000000000 --- a/QualityControl/public/common/runModeHeader.js +++ /dev/null @@ -1,171 +0,0 @@ -/** - * @license - * Copyright 2019-2020 CERN and copyright holders of ALICE O2. - * See http://alice-o2.web.cern.ch/copyright for details of the copyright holders. - * All rights not expressly granted are reserved. - * - * This software is distributed under the terms of the GNU General Public - * License v3 (GPL Version 3), copied verbatim in the file "COPYING". - * - * In applying this license CERN does not waive the privileges and immunities - * granted to it by virtue of its status as an Intergovernmental Organization - * or submit itself to any jurisdiction. - */ - -import { RunStatus } from '../../library/runStatus.enum.js'; -import { h, info } from '/js/src/index.js'; - -/** - * Run mode header component showing run information and exit button - * @param {FilterModel} filterModel - model that manages filter state - * @param {object} viewModel - model that manages the state of the view - * @returns {vnode} - virtual node element - */ -export function runModeHeader(filterModel, viewModel) { - if (!filterModel.inRunMode) { - return null; - } - - return h('.flex-row.items-center.justify-center.p2.g2.bg-gray-lighter', { - id: 'runModeHeader', - }, [ - renderRunModeInfo(filterModel), - renderExitButton(filterModel, viewModel), - ]); - - /** - * Renders the run mode information section - * @param {FilterModel} filterModel - model that manages filter state - * @returns {vnode} - virtual node element - */ - function renderRunModeInfo(filterModel) { - return h('.flex-row.items-center.g2', [ - renderRunNumber(filterModel.runNumber), - h('div.mh2', { - style: 'width: 1px; height: 1.2em; background-color: var(--color-gray-dark);', - }), - renderRunStatus(filterModel), - ]); - } - - /** - * Renders a run detail item for run number with copy functionality - * @param {string} runNumber - The run number value to display - * @returns {vnode} - virtual node element - */ - function renderRunNumber(runNumber) { - return h( - '.flex-row.items-center.g1', - { id: 'runNumber' }, - [ - h('span.gray-darker', 'Run'), - h('b', `#${runNumber}`), - ], - ); - } - - /** - * Renders the status detail with dropdown - * @param {FilterModel} filterModel - model that manages filter state - * @returns {vnode} - virtual node element - */ - function renderRunStatus(filterModel) { - const statusClass = filterModel.runStatus === RunStatus.ONGOING ? 'status-ongoing' : 'primary'; - return h('.flex-row.items-center.g1', { - id: 'runStatus', - }, [ - h('span.gray-darker', 'Status:'), - h(`b.${statusClass}`, filterModel.runStatus), - renderStatusInfoDropdown(filterModel), - ]); - } - - /** - * Renders the status info dropdown - * @param {FilterModel} filterModel - model that manages filter state - * @returns {vnode} - virtual node element - */ - function renderStatusInfoDropdown(filterModel) { - return h('.dropdown.mh1', { - class: filterModel.statusInfoOpen ? 'dropdown-open' : '', - }, [ - renderInfoButton(filterModel), - filterModel.statusInfoOpen && renderDropdownMenu(), - ]); - } - - /** - * Renders the info button - * @param {FilterModel} filterModel - model that manages filter state - * @returns {vnode} - virtual node element - */ - function renderInfoButton(filterModel) { - return h('button.btn.btn-sm', { - id: 'runsModeInfoButton', - title: 'Show status information', - onclick: (e) => { - e.stopPropagation(); - filterModel.statusInfoOpen = !filterModel.statusInfoOpen; - filterModel.notify(); - }, - }, info()); - } - - /** - * Renders the dropdown menu content - * @returns {vnode} - virtual node element - */ - function renderDropdownMenu() { - return h('.dropdown-menu', { - id: 'statusInfoDropdown', - }, [ - h('.p2', [ - h('div.gray-darker.mv1', 'Status meanings:'), - h('hr.mv1'), - renderStatusList(), - h('span', '* Note: All other filters have been removed. Only the run number filter is applied.'), - ]), - ]); - } - - /** - * Renders the list of all possible statuses - * @returns {vnode} - virtual node element - */ - function renderStatusList() { - return h('div', { - id: 'runStatusList', - }, [ - h('div.flex-row.items-center.mv1', { - style: 'white-space: nowrap;', - }, [ - h('div.flex-row.items-center.g1', [ - h('b.status-ongoing', [RunStatus.ONGOING]), - h('span.gray-darker', ' - The run is currently ongoing. New paths and objects will be added periodically.'), - ]), - ]), - h('div.flex-row.items-center.mv1', { - style: 'white-space: nowrap;', - }, [ - h('div.flex-row.items-center.g1', [ - h('b.primary', [RunStatus.ENDED]), - h('span.gray-darker', ' - The run has ended successfully. No new paths or objects will be added.'), - ]), - ]), - ]); - } - - /** - * Renders the exit button - * @param {FilterModel} filterModel - model that manages filter state - * @param {object} viewModel - model that manages the state of the view - * @returns {vnode} - virtual node element - */ - function renderExitButton(filterModel, viewModel) { - return h('button.btn.btn-sm', { - id: 'exitRunModeButton', - onclick: async () => await filterModel.deactivateRunsMode(viewModel), - title: 'Exit run mode and show all filters', - }, 'Exit'); - } -} diff --git a/QualityControl/public/layout/Layout.js b/QualityControl/public/layout/Layout.js index 85ecfe2fd..c6002b646 100644 --- a/QualityControl/public/layout/Layout.js +++ b/QualityControl/public/layout/Layout.js @@ -404,7 +404,7 @@ export default class Layout extends BaseViewModel { * @returns {undefined} */ edit() { - if (this.model.filterModel.inRunMode) { + if (this.model.filterModel.isRunModeActivated) { this.model.filterModel.deactivateRunsMode(this); } this.toggleEditMenu(); diff --git a/QualityControl/public/layout/panels/editModal.js b/QualityControl/public/layout/panels/editModal.js index 96892aaa4..fa9bacce3 100644 --- a/QualityControl/public/layout/panels/editModal.js +++ b/QualityControl/public/layout/panels/editModal.js @@ -39,6 +39,7 @@ export default (model) => h('.o2-modal', [ style: 'display:flex; justify-content:center;', }, [ h('button.btn.btn-primary', { + id: 'updateLayoutButton', disabled: model.services.layout.update.isFailure(), onclick: () => model.layout.updateLayout(), }, 'Update layout'), diff --git a/QualityControl/public/layout/view/header.js b/QualityControl/public/layout/view/header.js index 59bcb9ad6..b496f70bb 100644 --- a/QualityControl/public/layout/view/header.js +++ b/QualityControl/public/layout/view/header.js @@ -44,7 +44,7 @@ const toolbarViewMode = (layout, filterModel) => { const { isOfficial, owner_id, name } = layoutItem; return [ - h('.flex-grow.text-center', h('div.header-layout', [tabViewLinks(layoutItem, layout)])), + h('.flex-grow.text-center', h('.header-layout', [tabViewLinks(layoutItem, layout)])), h('.flex-grow.text-right', [ h('b.f4.items-center', [isOfficial ? iconBadge() : '', layoutItem.name]), ' ', @@ -76,7 +76,7 @@ const toolbarViewModeTab = (layout, tab, i) => { const selectTab = () => layout.selectTab(i); return [ - h('button.br-pill.ph2.btn.btn-tab', { class: linkClass, onclick: selectTab }, tab.name), + h('button.br-pill.ph2.btn.btn-tab', { id: `tab-${i}`, class: linkClass, onclick: selectTab }, tab.name), ' ', ]; }; @@ -110,7 +110,7 @@ const toolbarEditMode = (layout, filterModel) => { ]), ]), ]), - h('.text-right', [ + h('.text-right.flex-grow', [ h('input.form-control.form-inline', { type: 'text', value: layout.item.name, @@ -189,8 +189,9 @@ const editDropdown = (layout) => h('button.btn.btn-primary', { onclick: () => layout.toggleEditMenu() }, iconPencil()), h('.dropdown-menu.right-menu', [ h('.text-ellipsis', [ - h('a.menu-item', { title: 'Edit via GUI', onclick: () => layout.edit() }, 'Edit via GUI'), + h('a.menu-item', { id: 'editByGui', title: 'Edit via GUI', onclick: () => layout.edit() }, 'Edit via GUI'), h('a.menu-item', { + id: 'editByJson', title: 'Edit via JSON', onclick: () => layout.initializeEditViaJson(), }, 'Edit via JSON'), @@ -255,7 +256,7 @@ const saveButton = (layout) => */ const cancelButton = (layout) => h('button.btn', { - key: 'cancel-button', + id: 'cancel-button', onclick: () => layout.cancelEdit(), title: 'Cancel', }, iconBan()); diff --git a/QualityControl/public/object/QCObject.js b/QualityControl/public/object/QCObject.js index 962ee7d37..7349e90b3 100644 --- a/QualityControl/public/object/QCObject.js +++ b/QualityControl/public/object/QCObject.js @@ -177,10 +177,10 @@ export default class QCObject extends BaseViewModel { this.notify(); this.queryingObjects = true; let offlineObjects = []; - const result = await this.model.services.object.getObjects(this.model.filterModel.inRunMode); + const result = await this.model.services.object.getObjects(this.model.filterModel.isRunModeActivated); if (result.isSuccess()) { - offlineObjects = this.model.filterModel.inRunMode ? result.payload.paths : result.payload; + offlineObjects = this.model.filterModel.isRunModeActivated ? result.payload.paths : result.payload; } else { const errorMessage = result?._error?.message || 'Failed to retrieve list of objects. Please contact an administrator'; @@ -193,7 +193,7 @@ export default class QCObject extends BaseViewModel { let selectedObject = null; // save the state of the tree in run mode - if (this.model.filterModel.inRunMode) { + if (this.model.filterModel.isRunModeActivated) { treeState = this.saveTreeState(); selectedObject = this.selected; } @@ -202,7 +202,7 @@ export default class QCObject extends BaseViewModel { this.tree.addChildren(offlineObjects); // restore tree state if in run mode - if (this.model.filterModel.inRunMode && treeState) { + if (this.model.filterModel.isRunModeActivated && treeState) { this.restoreTreeState(treeState); } @@ -217,7 +217,7 @@ export default class QCObject extends BaseViewModel { this._computeFilters(); // if w are in run mode and an object was opened - if (this.model.filterModel.inRunMode && selectedObject) { + if (this.model.filterModel.isRunModeActivated && selectedObject) { const foundObject = this.list.find((object) => object.name === selectedObject.name); if (foundObject) { this.selected = foundObject; @@ -336,6 +336,7 @@ export default class QCObject extends BaseViewModel { search(searchInput) { this.searchInput = searchInput; this._computeFilters(); + this.sortListByField(this.searchResult, this.sortBy.field, this.sortBy.order); this.notify(); } @@ -538,7 +539,7 @@ export default class QCObject extends BaseViewModel { */ async triggerFilter() { // don't clear selected object refreshing in run mode - if (!this.model.filterModel.inRunMode) { + if (!this.model.filterModel.isRunModeActivated) { this.selected = null; } this.loadList(); diff --git a/QualityControl/public/object/objectTreeHeader.js b/QualityControl/public/object/objectTreeHeader.js index 08d0744e1..86efe25ae 100644 --- a/QualityControl/public/object/objectTreeHeader.js +++ b/QualityControl/public/object/objectTreeHeader.js @@ -39,10 +39,10 @@ export default function objectTreeHeader(qcObject, filterModel) { qcObject.objectsRemote.isSuccess() && h('span', `(${howMany})`), ]), h('.flex-row.items-center.g2.justify-end', [ - filterModel.inRunMode ? null : filterPanelToggleButton(filterModel), + filterModel.isRunModeActivated ? null : filterPanelToggleButton(filterModel), ' ', h('.dropdown', { - title: 'Sort by', class: qcObject.sortBy.open ? 'dropdown-open' : '', + id: 'sortTreeButton', title: 'Sort by', class: qcObject.sortBy.open ? 'dropdown-open' : '', }, [ h('button.btn', { title: 'Sort by', @@ -62,6 +62,7 @@ export default function objectTreeHeader(qcObject, filterModel) { }, iconCollapseUp()), ' ', h('input.form-control.form-inline.mh1.w-33', { + id: 'searchObjectTree', placeholder: 'Search', type: 'text', value: qcObject.searchInput, diff --git a/QualityControl/public/pages/layoutListView/components/LayoutListHeader.js b/QualityControl/public/pages/layoutListView/components/LayoutListHeader.js index f8ce9a27f..736036207 100644 --- a/QualityControl/public/pages/layoutListView/components/LayoutListHeader.js +++ b/QualityControl/public/pages/layoutListView/components/LayoutListHeader.js @@ -17,7 +17,6 @@ import { h } from '/js/src/index.js'; /** * Shows header of list of layouts with one search input to filter them * @param {LayoutListModel} layoutListModel - The model handeling the state of the LayoutListPage - * @param {FilterModel} filterModel - The model handeling the filter state * @returns {vnode} - virtual node element */ export default (layoutListModel) => [ diff --git a/QualityControl/public/pages/objectView/components/header.js b/QualityControl/public/pages/objectView/components/header.js index 48b220a26..1487c7fb3 100644 --- a/QualityControl/public/pages/objectView/components/header.js +++ b/QualityControl/public/pages/objectView/components/header.js @@ -25,8 +25,8 @@ export const objectViewHeader = (model) => { const title = computeTitle(objectViewModel, router); return [ - h('.flex-column.text-center.justify-center.w-33', h('b', title)), - h('.flex-row.items-center.p2.g2.w-33.justify-end', [ + h('.flex-column.text-center.justify-center.w-50', h('b', title)), + h('.flex-row.flex-grow.items-center.p2.g2.w-33.justify-end', [ getBackToQCGButton(objectViewModel, router), filterPanelToggleButton(filterModel), model.isContextSecure() && h('.flex-row', getCopyURLToClipboardButton(model)), diff --git a/QualityControl/public/services/Filter.service.js b/QualityControl/public/services/Filter.service.js index 0724e1e37..e4819273b 100644 --- a/QualityControl/public/services/Filter.service.js +++ b/QualityControl/public/services/Filter.service.js @@ -12,7 +12,6 @@ * or submit itself to any jurisdiction. */ -import { RunStatus } from '../../library/runStatus.enum.js'; import { RemoteData } from '/js/src/index.js'; /** @@ -49,32 +48,12 @@ export default class FilterService { /** * Method to get run status for a specific run number * @param {number} runNumber - The run number to get status for - * @returns {Promise} - Run status string + * @returns {RemoteData} - result within a RemoteData object */ async getRunStatus(runNumber) { - try { - let status = RunStatus.UNKNOWN; - let reason = ''; - const parsedRunNumber = parseInt(runNumber, 10); - - if (Number.isNaN(parsedRunNumber)) { - status = RunStatus.ERROR; - reason = 'Run number provided is not a number'; - } else { - const { result, ok } = await this.loader.get(`/api/filter/run-status/${parsedRunNumber}`); - if (!ok || !result || !Object.values(RunStatus).includes(result?.runStatus)) { - status = RunStatus.ERROR; - reason = result?.message; - } else { - status = result?.runStatus; - } - } - return { - status, reason, - }; - } catch { - return RunStatus.UNKNOWN; - } + const parsedRunNumber = parseInt(runNumber, 10); + const { result, ok } = await this.loader.get(`/api/filter/run-status/${parsedRunNumber}`); + return this.parseResult(result, ok); } /** @@ -84,4 +63,18 @@ export default class FilterService { async initFilterService() { await this.getRunTypes(); } + + /** + * Method which will return RemoteData object based on the status of the request + * @param {object} result - value to be added in RemoteData object + * @param {boolean} ok - whether result was ok or not + * @returns {RemoteData} - passed result in a RemoteData object + */ + parseResult(result, ok) { + if (!ok) { + return RemoteData.failure(result.error || result.message); + } else { + return RemoteData.success(result); + } + } } diff --git a/QualityControl/public/services/QCObject.service.js b/QualityControl/public/services/QCObject.service.js index f03dfc3bf..d4ef8e353 100644 --- a/QualityControl/public/services/QCObject.service.js +++ b/QualityControl/public/services/QCObject.service.js @@ -75,7 +75,10 @@ export default class QCObjectService { try { // `/api/object?path=${objectName}×tamp=${timestamp}&filter=${filter}` - const url = this._buildURL(`/api/object?path=${objectName}`, id, validFrom, this.filterModel.filterMap); + const filters = this.filterModel.isRunModeActivated + ? { RunNumber: this.filterModel.runNumber } + : this.filterModel.filterMap; + const url = this._buildURL(`/api/object?path=${objectName}`, id, validFrom, filters); const { result, ok } = await this.model.loader.get(url); if (ok) { result.qcObject = { @@ -179,7 +182,7 @@ export default class QCObjectService { `/api/objects?${inRunMode ? 'inRunMode=true' : ''}`, undefined, undefined, - undefined, + inRunMode ? { RunNumber: this.filterModel.runNumber } : this.filterModel.filterMap, fields, ); const { result, ok } = await this.model.loader.get(url); diff --git a/QualityControl/test/public/features/filterTest.test.js b/QualityControl/test/public/features/filterTest.test.js index a97379528..93146c13d 100644 --- a/QualityControl/test/public/features/filterTest.test.js +++ b/QualityControl/test/public/features/filterTest.test.js @@ -12,93 +12,90 @@ */ import { strictEqual } from 'node:assert'; +import { delay } from '../../testUtils/delay.js'; export const filterTests = async (url, page, timeout = 5000, testParent) => { await testParent.test('filter should persist between pages', { timeout }, async () => { - const runNumber = '0'; - - await page.locator('.sidebar > a:nth-of-type(2)').click(); // navigate to ObjectTreePage - await page.waitForSelector('#runNumberFilter', { visible: true }); - - await page.locator('#runNumberFilter').fill(runNumber); - + // Navigate to objects tree + await page.goto( + `${url}?page=objectTree`, + { waitUntil: 'networkidle0' }, + ); + + //Fill and trigger the filter + await page.locator('#runNumberFilter').fill('0'); await page.locator('#triggerFilterButton').click(); - await page.locator('#updateOnlyButton').click(); - // Check that URL contains RunNumber=0 + // URL should contain run number const location = await page.evaluate(() => window.location); strictEqual(location.href.includes('RunNumber=0'), true, 'URL should contain RunNumber=0'); - await page.waitForSelector('tr:last-of-type td'); + //Naviagte to object view await extendTree(3, 5); - await page.locator('tr:last-of-type td').click(); // This will select an object + await page.locator('tr:last-of-type td').click(); await page.waitForSelector('.resize-button a'); - await page.locator('.resize-button a').click(); // This would navigate to the objectViewPage + await page.locator('.resize-button a').click(); await page.waitForSelector('#runNumberFilter', { visible: true }); // Check that filter is still set to 0 let value = await page.evaluate(() => document.querySelector('#runNumberFilter').value); - strictEqual(value, runNumber, 'RunNumber filter should still be set to 0 on objectView page'); + strictEqual(value, '0', 'RunNumber filter should still be set to 0 on objectView page'); // Navigate to layout show - await page.waitForSelector('.sidebar > div:nth-of-type(3) a:nth-child(1)', { visible: true, stable: true }); - await page.locator('.sidebar > div:nth-of-type(3) a:nth-child(1)').click(); // navigate to layout show + await page.locator('.menu-item:nth-child(1)').click(); await page.waitForSelector('#runNumberFilter', { visible: true }); // Check that filter is still set to 0 value = await page.evaluate(() => document.querySelector('#runNumberFilter').value); - strictEqual(value, runNumber, 'RunNumber filter should still be set to 0 on layout show page'); + strictEqual(value, '0', 'RunNumber filter should still be set to 0 on layout show page'); }); - await testParent.test('should list all objects when disabling objectFilters', { timeout }, async () => { - const buttonPath = 'header > div > div > div:nth-child(3) > div > div> button'; - const optionPath = 'header > div > div > div:nth-child(3) > div > div > div > div > a:nth-child(1)'; - await page.waitForSelector(buttonPath, { visible: true, stable: true }); - await page.locator(buttonPath).click(); - - await page.waitForSelector(optionPath, { visible: true, stable: true }); - await page.locator(optionPath).click(); + await testParent.test('should list all objects when clearing filters', { timeout }, async () => { + //Navigate to object tree + ///html/body/div[1]/div/nav/a[2] + await page.locator('nav > a:nth-child(3)').click(); - await extendTree(2, 4); - let rowCount = await page.evaluate(() => document.querySelectorAll('tr').length); - - strictEqual(rowCount, 4); // Due to the filter there are two objects fewer. - - await page.locator('#inputApplyFilters').click(); // Will prevent filter from affecting it. - - await extendTree(2, 4); - rowCount = await page.evaluate(() => document.querySelectorAll('tr').length); + //With filter applied + let objectList = await page.evaluate(() => window.model.object.list); + strictEqual(objectList.length, 1); - strictEqual(rowCount, 6); // Due to the filter being removed, there are now 6 rows. + //Clear filters + await page.locator('#clearFilterButton').click(); + await delay(100); + objectList = await page.evaluate(() => window.model.object.list); + strictEqual(objectList.length, 3); }); await testParent.test('ObjectShow should only list versions based on the filter', { timeout }, async () => { - // For whatever reason, click and locator.click cannot be used for this. Hence why evalutate is used. - await page.evaluate(() => document.querySelector('#subcanvas > div:nth-child(1) a.btn').click()); - await page.waitForSelector('#ObjectPlot select option'); - - let versionCount = await page.evaluate(() => document.querySelectorAll('#ObjectPlot select option').length); - strictEqual(versionCount, 1); - - await page.locator('#filterElement #clearFilterButton').click(); + await page.goto( + `${url}?page=objectView&objectName=qc/test/object/1`, + { waitUntil: 'networkidle0' }, + ); + let optionsCount = await page.evaluate(() => document.querySelector('#dateSelector').length); + strictEqual(optionsCount, 2); + + await page.locator('#runNumberFilter').fill('0'); + await page.locator('#triggerFilterButton').click(); - await page.waitForSelector('#ObjectPlot select option:nth-child(2)'); + await delay(200); - versionCount = await page.evaluate(() => document.querySelectorAll('#ObjectPlot select option').length); - strictEqual(versionCount, 2); + optionsCount = await page.evaluate(() => document.querySelector('#dateSelector').length); + strictEqual(optionsCount, 1); }); await testParent.test('ObjectTreePage should apply filters for the objects', { timeout }, async () => { - await page.locator('.sidebar > a:nth-of-type(2)').click(); // navigate to ObjectTreePage. + await page.goto( + `${url}?page=objectTree`, + { waitUntil: 'networkidle0' }, + ); await extendTree(3, 5); let rowCount = await page.evaluate(() => document.querySelectorAll('tr').length); - strictEqual(rowCount, 7); // Due to the filter there are two objects fewer. + strictEqual(rowCount, 7); const runNumber = '0'; await page.locator('#runNumberFilter').fill(runNumber); await page.locator('#filterElement #triggerFilterButton').click(); - await page.locator('#updateOnlyButton').click(); await extendTree(3, 5); diff --git a/QualityControl/test/public/features/runMode.test.js b/QualityControl/test/public/features/runMode.test.js new file mode 100644 index 000000000..88ae59a94 --- /dev/null +++ b/QualityControl/test/public/features/runMode.test.js @@ -0,0 +1,124 @@ +/** + * @license + * Copyright CERN and copyright holders of ALICE O2. This software is + * distributed under the terms of the GNU General Public License v3 (GPL + * Version 3), copied verbatim in the file "COPYING". + * + * See http://alice-o2.web.cern.ch/license for full licensing information. + * + * In applying this license CERN does not waive the privileges and immunities + * granted to it by virtue of its status as an Intergovernmental Organization + * or submit itself to any jurisdiction. + */ + +import { strictEqual, ok } from 'node:assert'; +import { delay } from '../../testUtils/delay.js'; +export const runModeTests = async (url, page, timeout = 5000, testParent) => { + // + await testParent.test('should have a switch to enable runs mode', { timeout }, async () => { + await page.goto( + `${url}?page=objectTree`, + { waitUntil: 'networkidle0' }, + ); + await page.locator('.form-check-label > .switch'); + const runsModeTitle = await page.evaluate(() => + document.querySelector('.form-check-label').textContent); + strictEqual(runsModeTitle, 'Runs mode', 'The text displayed is not `Runs mode`'); + }); + + await testParent.test('should enter runs mode successfully', { timeout }, async () => { + await page.locator('.form-check-label > .switch').click(); + await delay(50); + await page.locator('#filterElement'); + + const updateButtonIsDisabled = await page.evaluate(() => + document.querySelector('#updateAndRunModeButton').disabled); + const isRunNumberFilterEmpty = await page.evaluate(() => + document.querySelector('#runNumberFilter').value === ''); + const isRunModeActivated = await page.evaluate(() => + window.model.filterModel.isRunModeActivated); + ok(updateButtonIsDisabled); + ok(isRunNumberFilterEmpty); + ok(isRunModeActivated); + delay(200); + }); + + await testParent.test('should allow user to track a run', { timeout }, async () => { + const urlRunStatus = '/api/filter/run-status/566138'; + const urlObjects = '/api/objects?inRunMode=true&filters[RunNumber]=566138'; + let countRunStatusCalls = 0; + let countObjectsCalls = 0; + page.on('request', (req) => { + if (req.url().includes(encodeURI(urlRunStatus))) { + countRunStatusCalls++; + } + if (req.url().includes(encodeURI(urlObjects))) { + countObjectsCalls++; + } + }); + await page.evaluate(() => { + window.model.filterModel.ONGOING_RUN_INTERVAL_MS = 500; + }); + await page.locator('#runNumberFilter').fill('566138'); + await delay(100); + const updateButtonIsDisabled = await page.evaluate(() => + document.querySelector('#updateAndRunModeButton').disabled); + strictEqual(updateButtonIsDisabled, false, 'Button should be disabled if run number has not been set'); + await page.locator('#updateAndRunModeButton').click(); + await delay(100); + await page.waitForSelector('#runStatusPanel'); + const runStatusInfo = await page.evaluate(() => { + const runNumber = document.querySelector('#runNumberLabel').textContent; + const status = document.querySelector('#runStatus').textContent; + return { runNumber, status }; + }); + strictEqual(runStatusInfo.runNumber, '#566138'); + strictEqual(runStatusInfo.status, 'ONGOING'); + await delay(1000); + strictEqual(countRunStatusCalls, 3, `Expected 3 requests to filter/run-status, but got ${countRunStatusCalls}`); + //2 because the third one returns an 'ENDED' status + strictEqual(countObjectsCalls, 2, `Expected requests to api/objects, but got ${countObjectsCalls}`); + }); + + await testParent.test('should show `ENDED` if a run that was ongoing, finishes', { timeout }, async () => { + let count = 0; + page.on('request', (req) => { + if (req.url().includes('/api/filter/run-status/566138')) { + count++; + } + }); + + //nock has been configured to stop the run after 3 calls + await page.waitForSelector('#runStatusPanel'); + const runStatusInfo = await page.evaluate(() => { + const runNumber = document.querySelector('#runNumberLabel').textContent; + const status = document.querySelector('#runStatus').textContent; + return { runNumber, status }; + }); + strictEqual(runStatusInfo.runNumber, '#566138'); + strictEqual(runStatusInfo.status, 'ENDED'); + await delay(500); + strictEqual(count, 0, `No requests expected, but got ${count}`); + }); + + await testParent.test('should persist runs mode between pages', { timeout }, async () => { + await page.locator('.menu-item:nth-child(3) > .ph2').click(); + await page.waitForSelector('#runStatusPanel'); + const runInfo = await page.evaluate(() => { + const runNumber = document.querySelector('#runNumberLabel').textContent; + const status = document.querySelector('#runStatus').textContent; + return { runNumber, status }; + }); + const isRunModeActivated = await page.evaluate(() => window.model.filterModel.isRunModeActivated); + ok(isRunModeActivated); + ok(runInfo.runNumber, '#566138'); + ok(runInfo.status, 'ENDED'); + }); + + await testParent.test('should exit runs mode successfully', { timeout }, async () => { + await page.locator('.form-check-label > .switch').click(); + await delay(50); + const isRunModeActivated = await page.evaluate(() => window.model.filterModel.isRunModeActivated); + ok(!isRunModeActivated); + }); +}; diff --git a/QualityControl/test/public/features/runsMode/runsModeLayoutShow.test.js b/QualityControl/test/public/features/runsMode/runsModeLayoutShow.test.js deleted file mode 100644 index 140f20ca1..000000000 --- a/QualityControl/test/public/features/runsMode/runsModeLayoutShow.test.js +++ /dev/null @@ -1,92 +0,0 @@ -/** - * @license - * Copyright CERN and copyright holders of ALICE O2. This software is - * distributed under the terms of the GNU General Public License v3 (GPL - * Version 3), copied verbatim in the file "COPYING". - * - * See http://alice-o2.web.cern.ch/license for full licensing information. - * - * In applying this license CERN does not waive the privileges and immunities - * granted to it by virtue of its status as an Intergovernmental Organization - * or submit itself to any jurisdiction. - */ - -import { strictEqual } from 'node:assert'; - -const OBJECT_TREE_PAGE_PARAM = '?page=objectTree'; -export const runsModeLayoutShowTests = async (url, page, timeout = 5000, testParent) => { - await testParent.test('should activate runs mode in object tree page', async () => { - await page.goto(`${url}${OBJECT_TREE_PAGE_PARAM}`, { waitUntil: 'networkidle0' }); - //wait for filters - await page.waitForSelector('#runNumberFilter', { timeout }); - await page.waitForSelector('#runTypeFilter', { timeout }); - //select run number and run type - await page.type('#runNumberFilter', '0'); - await page.click('#runTypeFilter'); - await page.select('#runTypeFilter', 'runType1'); - //check dropdown is available - await page.waitForSelector('#triggerFilterButton', { timeout }); - await page.click('#triggerFilterButton'); - await page.waitForSelector('#updateAndRunModeButton', { timeout }); - const isButtonEnabled = await page.evaluate(() => { - const button = document.querySelector('#updateAndRunModeButton'); - return button && !button.disabled; - }); - strictEqual(isButtonEnabled, true, 'updateAndRunModeButton should be enabled when run number is entered'); - - // Activate runs mode - await page.click('#updateAndRunModeButton'); - await page.waitForSelector('#runModeHeader', { timeout }); - }); - - await testParent.test('should navigate to layout page and verify runs mode persists', async () => { - // Navigate to layout page using the provided selector - await page.waitForSelector('.sidebar > div:nth-of-type(3) a:nth-child(1)', { visible: true, stable: true }); - await page.locator('.sidebar > div:nth-of-type(3) a:nth-child(1)').click(); // navigate to layout show - - //wait for network - - // Wait for layout page to load - await page.waitForSelector('#runModeHeader', { timeout }); - - // Verify runs mode header elements are present - await page.waitForSelector('#runNumber', { timeout }); - await page.waitForSelector('#runStatus', { timeout }); - await page.waitForSelector('#runsModeInfoButton', { timeout }); - await page.waitForSelector('#exitRunModeButton', { timeout }); - - const [runNumberDisplayed, runStatusDisplayed, infoButtonDisplayed, exitButtonDisplayed] = - await page.evaluate(() => { - const runNumber = document.querySelector('#runNumber'); - const runStatus = document.querySelector('#runStatus'); - const infoButton = document.querySelector('#runsModeInfoButton'); - const exitButton = document.querySelector('#exitRunModeButton'); - - return [ - runNumber?.children[0]?.textContent === 'Run' && runNumber?.children[1]?.textContent === '#0', - runStatus?.children[0]?.textContent === 'Status:' && runStatus?.children[1]?.textContent === 'ONGOING', - infoButton?.title === 'Show status information', - exitButton?.textContent === 'Exit' && exitButton?.title === 'Exit run mode and show all filters', - ]; - }); - strictEqual(runNumberDisplayed, true, 'runNumber should be displayed in layout page'); - strictEqual(runStatusDisplayed, true, 'runStatus should be displayed in layout page'); - strictEqual(infoButtonDisplayed, true, 'infoButton should be displayed in layout page'); - strictEqual(exitButtonDisplayed, true, 'exitRunModeButton should be displayed in layout page'); - - // Verify runs mode is still active - const isRunMode = await page.evaluate(() => window.model.filterModel.inRunMode); - strictEqual(isRunMode, true, 'inRunMode should persist in layout page'); - }); - - await testParent.test('should exit run mode from layout page', async () => { - await page.click('#exitRunModeButton'); - - // filters are shown again - await page.waitForSelector('#filterElement', { timeout }); - await page.waitForSelector('#triggerFilterButton', { timeout }); - // window.model.filterModel.inRunMode is false - const isRunMode = await page.evaluate(() => window.model.filterModel.inRunMode); - strictEqual(isRunMode, false, 'inRunMode should be false after exiting from layout page'); - }); -}; diff --git a/QualityControl/test/public/features/runsMode/runsModeObjectTree.test.js b/QualityControl/test/public/features/runsMode/runsModeObjectTree.test.js deleted file mode 100644 index c4e8a8e18..000000000 --- a/QualityControl/test/public/features/runsMode/runsModeObjectTree.test.js +++ /dev/null @@ -1,82 +0,0 @@ -/** - * @license - * Copyright CERN and copyright holders of ALICE O2. This software is - * distributed under the terms of the GNU General Public License v3 (GPL - * Version 3), copied verbatim in the file "COPYING". - * - * See http://alice-o2.web.cern.ch/license for full licensing information. - * - * In applying this license CERN does not waive the privileges and immunities - * granted to it by virtue of its status as an Intergovernmental Organization - * or submit itself to any jurisdiction. - */ - -import { strictEqual } from 'node:assert'; - -const OBJECT_TREE_PAGE_PARAM = '?page=objectTree'; -export const runsModeObjectTreeTests = async (url, page, timeout = 5000, testParent) => { - await testParent.test('should enable updateAndRunModeButton when run number is entered', async () => { - await page.goto(`${url}${OBJECT_TREE_PAGE_PARAM}`, { waitUntil: 'networkidle0' }); - //wait for filters - await page.waitForSelector('#runNumberFilter', { timeout }); - await page.waitForSelector('#runTypeFilter', { timeout }); - //select run number and run type - await page.type('#runNumberFilter', '0'); - await page.click('#runTypeFilter'); - await page.select('#runTypeFilter', 'runType1'); - //check dropdown is available - await page.waitForSelector('#triggerFilterButton', { timeout }); - await page.click('#triggerFilterButton'); - await page.waitForSelector('#updateAndRunModeButton', { timeout }); - const isButtonEnabled = await page.evaluate(() => { - const button = document.querySelector('#updateAndRunModeButton'); - return button && !button.disabled; - }); - strictEqual(isButtonEnabled, true, 'updateAndRunModeButton should be enabled when run number is entered'); - }); - - await testParent.test('should show runModeHeader when updateAndRunModeButton is clicked', async () => { - await page.click('#updateAndRunModeButton'); - //check the url to not have runType as filter - const currentUrl = page.url(); - strictEqual(currentUrl.includes('RunType'), false, 'RunType should not be in url'); - strictEqual(currentUrl.includes('RunNumber'), true, 'RunNumber should be in url'); - - //wait for elements in run mode header - await page.waitForSelector('#runModeHeader', { timeout }); - await page.waitForSelector('#runNumber', { timeout }); - await page.waitForSelector('#runStatus', { timeout }); - await page.waitForSelector('#runsModeInfoButton', { timeout }); - await page.waitForSelector('#exitRunModeButton', { timeout }); - - const [runNumberDisplayed, runStatusDisplayed, infoButtonDisplayed, exitButtonDisplayed] = - await page.evaluate(() => { - const runNumber = document.querySelector('#runNumber'); - const runStatus = document.querySelector('#runStatus'); - const infoButton = document.querySelector('#runsModeInfoButton'); - const exitButton = document.querySelector('#exitRunModeButton'); - - return [ - runNumber?.children[0]?.textContent === 'Run' && runNumber?.children[1]?.textContent === '#0', - runStatus?.children[0]?.textContent === 'Status:' && runStatus?.children[1]?.textContent === 'ONGOING', - infoButton?.title === 'Show status information', - exitButton?.textContent === 'Exit' && exitButton?.title === 'Exit run mode and show all filters', - ]; - }); - strictEqual(runNumberDisplayed, true, 'runNumber should be displayed'); - strictEqual(runStatusDisplayed, true, 'runStatus should be displayed'); - strictEqual(infoButtonDisplayed, true, 'infoButton should be displayed'); - strictEqual(exitButtonDisplayed, true, 'exitRunModeButton should be displayed'); - }); - - await testParent.test('should show statusInfoDropdown when runsModeInfoButton is clicked', async () => { - await page.click('#runsModeInfoButton'); - await page.waitForSelector('#statusInfoDropdown', { timeout }); - await page.waitForSelector('#runStatusList', { timeout }); - const runStatusList = await page.evaluate(() => { - const runStatusList = document.querySelector('#runStatusList'); - return runStatusList?.children?.length === 2; - }); - strictEqual(runStatusList, true, 'list of status should have 2 elements'); - }); -}; diff --git a/QualityControl/test/public/pages/layout-list.test.js b/QualityControl/test/public/pages/layout-list.test.js index ca1997979..115b1d83f 100644 --- a/QualityControl/test/public/pages/layout-list.test.js +++ b/QualityControl/test/public/pages/layout-list.test.js @@ -34,8 +34,6 @@ export const layoutListPageTests = async (url, page, timeout = 5000, testParent) const cardLayoutLinkPath = (cardPath) => `${cardPath} a`; const cardOfficialButtonPath = (cardPath) => `${cardPath} > .cardHeader > button`; - const filterPath = 'header > div > div:nth-child(1) > div:nth-child(3) > input'; - await testParent.test('should successfully load layoutList page "/"', { timeout }, async () => { await page.goto(`${url}${LAYOUT_LIST_PAGE_PARAM}`, { waitUntil: 'networkidle0' }); const location = await page.evaluate(() => window.location); @@ -174,7 +172,7 @@ export const layoutListPageTests = async (url, page, timeout = 5000, testParent) await testParent.test('should have a folder with one card after filtering', async () => { const preFilterCardCount = await page.evaluate(() => document.querySelectorAll('.card').length); strictEqual(preFilterCardCount, 2); - await page.locator(filterPath).fill('a'); + await page.locator('.form-control').fill('a'); await delay(100); const postFilterCardCount = await page.evaluate(() => document.querySelectorAll('.card').length); diff --git a/QualityControl/test/public/pages/layout-show.test.js b/QualityControl/test/public/pages/layout-show.test.js index a4d89cd0a..0825d365d 100644 --- a/QualityControl/test/public/pages/layout-show.test.js +++ b/QualityControl/test/public/pages/layout-show.test.js @@ -158,7 +158,7 @@ export const layoutShowTests = async (url, page, timeout = 5000, testParent) => ); await testParent.test('should have second tab to be empty (according to demo data)', { timeout }, async () => { - await page.locator('header > div > div > div:nth-child(2) > div > button:nth-child(2)').click(); + await page.locator('#tab-1').click(); await delay(50); const plotPath = 'section svg.jsroot'; const plotsCount = await page.evaluate((plotPath) => document.querySelectorAll(plotPath).length, plotPath); @@ -181,7 +181,7 @@ export const layoutShowTests = async (url, page, timeout = 5000, testParent) => 'should have one duplicate button in the header to create a new duplicated layout', { timeout }, async () => { - const buttonPath = 'header > div > div > div:nth-child(3) > div > button:nth-child(2)'; + const buttonPath = '.btn-group > button:nth-child(2)'; const duplicateButton = await page.evaluate((buttonPath) => document.querySelector(buttonPath).title, buttonPath); strictEqual(duplicateButton, 'Duplicate layout'); }, @@ -191,7 +191,7 @@ export const layoutShowTests = async (url, page, timeout = 5000, testParent) => 'should have one delete button in the header to delete layout', { timeout }, async () => { - const buttonPath = 'header > div > div > div:nth-child(3) > div > button:nth-child(5)'; + const buttonPath = '.btn-group > button:nth-of-type(3)'; const deleteButton = await page.evaluate((buttonPath) => document.querySelector(buttonPath).title, buttonPath); strictEqual(deleteButton, 'Delete layout'); }, @@ -201,7 +201,7 @@ export const layoutShowTests = async (url, page, timeout = 5000, testParent) => 'should have one link button in the header to download layout skeleton', { timeout }, async () => { - const buttonPath = 'header > div > div > div:nth-child(3) > div > a'; + const buttonPath = '.btn-group > a:nth-of-type(1)'; const editButton = await page.evaluate((buttonPath) => document.querySelector(buttonPath).title, buttonPath); strictEqual(editButton, 'Export layout skeleton as JSON file'); }, @@ -211,11 +211,11 @@ export const layoutShowTests = async (url, page, timeout = 5000, testParent) => 'should have two options for editing the layout', { timeout }, async () => { - const editButtonPath = 'header > div > div > div:nth-child(3) > div > div > button'; + const editButtonPath = '.btn-group > div > button'; await page.locator(editButtonPath).click(); const titles = await page.evaluate(() => { - const firstLinkPath = 'header > div > div > div:nth-child(3) > div > div > div > div > a:nth-child(1)'; - const secondLinkPath = 'header > div > div > div:nth-child(3) > div > div > div > div > a:nth-child(2)'; + const firstLinkPath = '#editByGui'; + const secondLinkPath = '#editByJson'; const firstLinkTitle = document.querySelector(firstLinkPath).title; const secondLinkTitle = document.querySelector(secondLinkPath).title; return [firstLinkTitle, secondLinkTitle]; @@ -230,7 +230,7 @@ export const layoutShowTests = async (url, page, timeout = 5000, testParent) => 'should click the edit button in the header and enter edit mode', { timeout }, async () => { - const editViaGUIButtonPath = 'header > div > div > div:nth-child(3) > div > div > div > div > a:nth-child(1)'; + const editViaGUIButtonPath = '#editByGui'; await page.locator(editViaGUIButtonPath).click(); }, ); @@ -311,7 +311,7 @@ export const layoutShowTests = async (url, page, timeout = 5000, testParent) => 'should show normal sidebar after Cancel click', { timeout }, async () => { - const cancelButtonPath = 'header > div > div:nth-child(1) > div:nth-of-type(3) > div > button:nth-of-type(2)'; + const cancelButtonPath = '#cancel-button'; await page.locator(cancelButtonPath).click(); await page.waitForSelector('nav .menu-title', { timeout: 5000 }); }, @@ -321,9 +321,9 @@ export const layoutShowTests = async (url, page, timeout = 5000, testParent) => 'should open JSON editor when clicking "Edit via JSON"', { timeout }, async () => { - const editDropdownButtonPath = 'header > div > div:nth-child(1) > div:nth-of-type(3) > div > div > button'; + const editDropdownButtonPath = '.btn-group > div > button'; const editViaJSONButtonPath = - 'header > div > div:nth-child(1) > div:nth-of-type(3) > div > div > div > div > a:nth-child(2)'; + '#editByJson'; await page.locator(editDropdownButtonPath).click(); await delay(100); await page.locator(editViaJSONButtonPath).click(); @@ -405,27 +405,26 @@ export const layoutShowTests = async (url, page, timeout = 5000, testParent) => 'should update layout when clicking "Update layout"', { timeout }, async () => { - const pencilButtonPath = 'header > div > div > div:nth-child(3) > div > div > button'; + const pencilButtonPath = '.btn-group > div > button'; await page.locator(pencilButtonPath).click(); - const editViaJSONButtonPath = - 'header > div > div > div:nth-child(3) > div > div > div > div > a:nth-child(2)'; - page.locator(editViaJSONButtonPath).click(); - const textareaPath = 'body > div > div > div > div > textarea'; + const editViaJSONButtonPath = '#editByJson'; + await page.locator(editViaJSONButtonPath).click(); + + const textareaPath = '#layout-json-editor'; const mockedJSON = JSON.stringify(editedMockedLayout); await page.locator(textareaPath).fill(mockedJSON); - const updateButtonPath = 'body > div > div > div > div > button:nth-child(1)'; + const updateButtonPath = '#updateLayoutButton'; await page.locator(updateButtonPath).click(); - await delay(50); - const buttonsPath = 'header > div > div > div:nth-child(2) > div > button'; - const result = await page.evaluate((buttonsPath) => { - const tabs = document.querySelectorAll(buttonsPath); - return tabs.length === 3 && tabs[2].textContent === 'test'; - }, buttonsPath); + await delay(50); - strictEqual(result, true); + const newTabName = await page.evaluate(() => { + const tab = document.querySelector('#tab-2'); + return tab.textContent; + }); + strictEqual(newTabName, 'test'); }, ); diff --git a/QualityControl/test/public/pages/object-tree.test.js b/QualityControl/test/public/pages/object-tree.test.js index 79a63305f..3760574e5 100644 --- a/QualityControl/test/public/pages/object-tree.test.js +++ b/QualityControl/test/public/pages/object-tree.test.js @@ -51,7 +51,7 @@ export const objectTreePageTests = async (url, page, timeout = 5000, testParent) }); await testParent.test('should have a button to sort by (default "Name" ASC)', async () => { - const sortByButtonTitle = await page.evaluate((path) => document.querySelector(path).title, SORTING_BUTTON_PATH); + const sortByButtonTitle = await page.evaluate((path) => document.querySelector(path).title, '#sortTreeButton'); strictEqual(sortByButtonTitle, 'Sort by'); }); @@ -61,8 +61,8 @@ export const objectTreePageTests = async (url, page, timeout = 5000, testParent) }); await testParent.test('should sort list of histograms by name in descending order', async () => { - await page.locator(SORTING_BUTTON_PATH).click(); - const sortingByNameOptionPath = 'header > div > div > div:nth-child(3) > div > div > a:nth-child(2)'; + await page.locator('#sortTreeButton').click(); + const sortingByNameOptionPath = '#sortTreeButton > div > a:nth-child(2)'; await page.locator(sortingByNameOptionPath).click(); const sorted = await page.evaluate(() => ({ @@ -76,8 +76,8 @@ export const objectTreePageTests = async (url, page, timeout = 5000, testParent) }); await testParent.test('should sort list of histograms by name in ascending order', async () => { - await page.locator(SORTING_BUTTON_PATH).click(); - const sortingByNameOptionPath = 'header > div > div > div:nth-child(3) > div > div > a:nth-child(1)'; + await page.locator('#sortTreeButton').click(); + const sortingByNameOptionPath = '#sortTreeButton > div > a:nth-child(1)'; await page.locator(sortingByNameOptionPath).click(); const sorted = await page.evaluate(() => ({ list: window.model.object.currentList, @@ -90,7 +90,7 @@ export const objectTreePageTests = async (url, page, timeout = 5000, testParent) }); await testParent.test('should have filtered results on input search', async () => { - await page.type('header > div > div:nth-child(1) > div:nth-child(3) > input', 'qc/test/object/1'); + await page.type('#searchObjectTree', 'qc/test/object/1'); const rowsDisplayed = await page.evaluate(() => { const rows = []; document.querySelectorAll('section > div > div > div > table > tbody > tr') diff --git a/QualityControl/test/setup/testSetupForBkp.js b/QualityControl/test/setup/testSetupForBkp.js index c4fe4d175..775beb77a 100644 --- a/QualityControl/test/setup/testSetupForBkp.js +++ b/QualityControl/test/setup/testSetupForBkp.js @@ -50,4 +50,27 @@ export const initializeNockForBkp = () => { timeO2End: null, }, }); + nock(BKP_URL) + .get(`/api/runs/566138${TOKEN_PATH}`) + .reply(200, { + data: { + timeO2End: null, + }, + }) + .get(`/api/runs/566138${TOKEN_PATH}`) + .reply(200, { + data: { + timeO2End: null, + }, + }) + .get(`/api/runs/566138${TOKEN_PATH}`) + .reply(200, { + data: { + timeO2End: null, + }, + }) + .get(`/api/runs/566138${TOKEN_PATH}`) + .reply(200, { + data: { timeO2End: 'hello' }, + }); }; diff --git a/QualityControl/test/setup/testSetupForCcdb.js b/QualityControl/test/setup/testSetupForCcdb.js index 865e0b539..cfdbef373 100644 --- a/QualityControl/test/setup/testSetupForCcdb.js +++ b/QualityControl/test/setup/testSetupForCcdb.js @@ -70,6 +70,10 @@ export const initializeNockForCcdb = () => { .get(`${CCDB_API_PATH_LATEST}.*/RunNumber=0`) .reply(200, MOCK_LATEST_OBJECT_FILTERED_BY_RUN_NUMBER); + nock(CCDB_URL, xFieldHeader1).persist() + .get(`${CCDB_API_PATH_LATEST}.*/RunNumber=566138`) + .reply(200, MOCK_LATEST_OBJECT_FILTERED_BY_RUN_NUMBER); + nock(CCDB_URL, acceptHeader).persist() .get(`${CCDB_API_PATH_TREE}.*`) .reply(200, { subfolders }) @@ -112,4 +116,6 @@ export const initializeNockForCcdb = () => { .replyContentLength() .get(`${CCDB_API_DOWNLOAD_ROOT_OBJECT.path}/${CCDB_API_DOWNLOAD_ROOT_OBJECT.id}`) .reply(200, fileContent); + + //runs mode }; diff --git a/QualityControl/test/test-index.js b/QualityControl/test/test-index.js index 72c2ca2c5..be896ef43 100644 --- a/QualityControl/test/test-index.js +++ b/QualityControl/test/test-index.js @@ -36,8 +36,6 @@ import { objectViewFromObjectTreeTests } from './public/pages/object-view-from-o import { objectViewFromLayoutShowTests } from './public/pages/object-view-from-layout-show.test.js'; import { layoutShowTests } from './public/pages/layout-show.test.js'; import { aboutPageTests } from './public/pages/about-page.test.js'; -import { runsModeObjectTreeTests } from './public/features/runsMode/runsModeObjectTree.test.js'; -import { runsModeLayoutShowTests } from './public/features/runsMode/runsModeLayoutShow.test.js'; /** * Backend tests imports @@ -87,6 +85,7 @@ import { filterTests } from './public/features/filterTest.test.js'; import { qcObjectServiceTestSuite } from './lib/services/QcObjectService.test.js'; import { runModeServiceTestSuite } from './lib/services/RunModeService.test.js'; import { apiGetRunStatusTests } from './api/filters/api-get-run-status.test.js'; +import { runModeTests } from './public/features/runMode.test.js'; const FRONT_END_PER_TEST_TIMEOUT = 5000; // each front-end test is allowed this timeout // remaining tests are based on the number of individual tests in each suite @@ -99,7 +98,6 @@ const OBJECT_VIEW_FROM_OBJECT_TREE_PAGE_TIMEOUT = FRONT_END_PER_TEST_TIMEOUT * 5 const OBJECT_VIEW_FROM_LAYOUT_SHOW_PAGE_TIMEOUT = FRONT_END_PER_TEST_TIMEOUT * 4; const LAYOUT_SHOW_PAGE_TIMEOUT = FRONT_END_PER_TEST_TIMEOUT * 23; const ABOUT_VIEW_PAGE_TIMEOUT = FRONT_END_PER_TEST_TIMEOUT * 4; -const RUNS_MODE_TIMEOUT = FRONT_END_PER_TEST_TIMEOUT * 4; const FRONT_END_TIMEOUT = INITIAL_PAGE_SETUP_TIMEOUT + QC_DRAWING_OPTIONS_TIMEOUT @@ -174,14 +172,8 @@ suite('All Tests - QCG', { timeout: FRONT_END_TIMEOUT + BACK_END_TIMEOUT }, asyn test('should successfully import and run tests for filter', async (testParent) => filterTests(url, page, FRONT_END_PER_TEST_TIMEOUT, testParent)); - test( - 'should successfully run runs mode tests', - { timeout: RUNS_MODE_TIMEOUT * 2 }, - async (testParent) => { - await runsModeObjectTreeTests(url, page, FRONT_END_PER_TEST_TIMEOUT, testParent); - await runsModeLayoutShowTests(url, page, FRONT_END_PER_TEST_TIMEOUT, testParent); - }, - ); + test('should successfully use run mode when available', async (testParent) => + await runModeTests(url, page, FRONT_END_PER_TEST_TIMEOUT, testParent)); }); suite('API - test suite', { timeout: FRONT_END_TIMEOUT }, async () => { From eb94270dfd1980f546e6c6b86d5e810dde4b5f85 Mon Sep 17 00:00:00 2001 From: Alejandro Mariscal Romero <87366244+mariscalromeroalejandro@users.noreply.github.com> Date: Fri, 19 Sep 2025 17:50:49 +0200 Subject: [PATCH 45/77] [OGUI-1767] Runs mode object tree smart refresh + header refactor (#3066) This PR provides with a smart refresh in which the objects tree list is refreshed only if new paths need to be listed. It also includes a refactor of the headers for a better styling. --- .../public/common/filters/filterViews.js | 7 +- .../common/filters/model/FilterModel.js | 42 ++++++++-- .../common/filters/runMode/runStatusPanel.js | 83 +++++++++++++------ QualityControl/public/common/header.js | 22 +++-- QualityControl/public/layout/view/header.js | 17 ++-- QualityControl/public/object/QCObject.js | 20 ++++- .../public/object/objectTreeHeader.js | 11 +-- .../aboutView/components/aboutViewHeader.js | 11 +-- .../components/LayoutListHeader.js | 12 +-- .../pages/objectView/components/header.js | 11 +-- .../test/public/features/runMode.test.js | 24 ++++-- 11 files changed, 173 insertions(+), 87 deletions(-) diff --git a/QualityControl/public/common/filters/filterViews.js b/QualityControl/public/common/filters/filterViews.js index bf0993889..56c2eea93 100644 --- a/QualityControl/public/common/filters/filterViews.js +++ b/QualityControl/public/common/filters/filterViews.js @@ -62,6 +62,8 @@ export function filtersPanel(filterModel, viewModel) { runNumber, runStatus, isVisible, + lastRefresh, + ONGOING_RUN_INTERVAL_MS: refreshRate, } = filterModel; const onInputCallback = setFilterValue.bind(filterModel); const onChangeCallback = setFilterValue.bind(filterModel); @@ -84,10 +86,7 @@ export function filtersPanel(filterModel, viewModel) { ...filtersList.map((filter) => createFilterElement(filter, filterMap, onInputCallback, onEnterCallback, onChangeCallback)), ]), - isRunModeActivated && runStatusPanel( - runNumber, - runStatus, - ), + isRunModeActivated && runStatusPanel({ runNumber, runStatus, lastRefresh, refreshRate }), ], ); }; diff --git a/QualityControl/public/common/filters/model/FilterModel.js b/QualityControl/public/common/filters/model/FilterModel.js index 715a57ca6..35a4d5411 100644 --- a/QualityControl/public/common/filters/model/FilterModel.js +++ b/QualityControl/public/common/filters/model/FilterModel.js @@ -38,6 +38,7 @@ export default class FilterModel extends Observable { this._runNumber = null; this._runStatus = RemoteData.notAsked(); this._isRunModeActivated = false; + this._lastRefresh = null; this.ONGOING_RUN_INTERVAL_MS = 15000; } @@ -122,6 +123,8 @@ export default class FilterModel extends Observable { this._manageRunsModeInterval(baseViewModel); } baseViewModel.triggerFilter(); + this._lastRefresh = Date.now(); + this.notify(); } /** @@ -193,6 +196,7 @@ export default class FilterModel extends Observable { this.isRunModeActivated = false; this.runNumber = null; this.runStatus = RemoteData.notAsked(); + this._lastRefresh = null; this.clearRunsModeInterval(); this.notify(); } @@ -205,22 +209,26 @@ export default class FilterModel extends Observable { */ async _manageRunsModeInterval(baseViewModel) { this.clearRunsModeInterval(); - this._currentViewModel = baseViewModel; + const currentRunNumber = this.runNumber; + if (this.runStatus?.payload?.runStatus !== RunStatus.ONGOING) { + return; + } this._runsModeInterval = setInterval(async () => { - if (!this._currentViewModel) { + if (!baseViewModel) { return; } this.runStatus = RemoteData.loading(); this.notify(); - this.runStatus = await this.filterService.getRunStatus(this.runNumber); + this.runStatus = await this.filterService.getRunStatus(currentRunNumber); this.notify(); this.runStatus.match({ Success: (res) => { if (res?.runStatus !== RunStatus.ONGOING) { this.clearRunsModeInterval(); - } else { - baseViewModel.triggerFilter(); } + baseViewModel.triggerFilter(); + this._lastRefresh = Date.now(); + this.notify(); }, Other: () => this.clearRunsModeInterval(), }); @@ -236,7 +244,6 @@ export default class FilterModel extends Observable { clearInterval(this._runsModeInterval); this._runsModeInterval = null; } - this._currentViewModel = null; } /** @@ -307,6 +314,14 @@ export default class FilterModel extends Observable { this._isRunModeActivated = value; } + get lastRefresh() { + return this._lastRefresh; + } + + get runsModeInterval() { + return this._runsModeInterval; + } + /** * Validates a run number for run mode. * @returns {{ isValid: boolean, title: string }} An object indicating @@ -336,4 +351,19 @@ export default class FilterModel extends Observable { } return { isValid: true, title: 'Update filters' }; }; + + /** + * Executes a generic check to determine if a refresh is required. + * @param {() => Promise} fetchFn - Async function to fetch the data or object. + * @param {(RemoteData) => boolean} validateFn - Validates whether the fetched result means no refresh is needed. + * @returns {Promise<{ refreshNeeded: boolean, data: object | null }>} + */ + async refreshCheck(fetchFn, validateFn) { + if (this._runsModeInterval) { + const data = await fetchFn(); + const refreshNeeded = validateFn(data); + return { refreshNeeded, data }; + } + return { refreshNeeded: true, data: null }; + } } diff --git a/QualityControl/public/common/filters/runMode/runStatusPanel.js b/QualityControl/public/common/filters/runMode/runStatusPanel.js index faa3a2fb2..cae05611d 100644 --- a/QualityControl/public/common/filters/runMode/runStatusPanel.js +++ b/QualityControl/public/common/filters/runMode/runStatusPanel.js @@ -11,40 +11,71 @@ * or submit itself to any jurisdiction. */ +import { RunStatus } from '../../../../../library/runStatus.enum.js'; +import { spinner } from '../../spinner.js'; import { h } from '/js/src/index.js'; /** - * Render a run mode switch - * @param {number} runNumber - The run number - * @param {RunStatus} status - The run status - * @returns {HTMLElement} - The rendered run status panel + * Creates and returns a run status panel element displaying the current run number, + * its status, the last refresh timestamp, and the refresh rate. + * @param {object} options Options for rendering the run status panel. + * @param {number} options.runNumber The current run number to display. + * @param {string} options.runStatus The status of the run (e.g., "running", "completed"). + * @param {Date} options.lastRefresh Timestamp of the last refresh. + * @param {number} options.refreshRate - Refresh rate in milliseconds. + * @returns {vnode} The element representing the run status panel. */ -export const runStatusPanel = (runNumber, status) => - status.match({ +export const runStatusPanel = ({ runNumber, runStatus, lastRefresh, refreshRate = 15000 }) => { + const runNumberPanel = h('span', { id: 'runNumberLabel' }, [ + 'Run ', + h('b', `#${runNumber}`), + ]); + const statusPanel = (runStatus) => + runStatus + ? h( + `.badge.white.bg-${runStatus === RunStatus.ONGOING ? 'success' : 'gray-darker'}`, + { id: 'runStatusBadge' }, + runStatus, + ) + : h('span', spinner(1)); + const formatDateTime = (dateStr) => + new Date(dateStr).toLocaleString('en-GB'); // dd/mm/yyyy, hh:mm:ss + + const lastUpdatePanel = (runStatus) => [ + h( + 'span.highlight', + { id: 'lastUpdate' }, + `Last update: ${formatDateTime(lastRefresh)}`, + ), + runStatus === RunStatus.ONGOING && + h( + 'span', + { id: 'refreshInfo' }, + ` - As run is ONGOING, will refresh every ${refreshRate / 1000} seconds`, + ), + ]; + + return runStatus.match({ Loading: () => h('.flex-row.g1.items-center.justify-center', [ - h('b', { id: 'runNumberLabel' }, `#${runNumber}`), - h('.flex-row.g1', [ - h('label', 'Status: '), - h('b.color-gray', 'Loading...'), - ]), + runNumberPanel, + statusPanel(null), ]), - Success: (res) => - h('.flex-row.g1.items-center.justify-center', { id: 'runStatusPanel' }, [ - h('b', { id: 'runNumberLabel' }, `#${runNumber}`), - h('.flex-row.g1', [ - h('span', 'Status: '), - h( - `b.${ - res?.runStatus === 'ONGOING' ? 'success' : 'gray' - }`, - { - id: 'runStatus', - }, - res?.runStatus, - ), + Success: (res) => { + const runStatus = res?.runStatus; + const shouldShowTimestamp = runStatus === RunStatus.ONGOING || runStatus === RunStatus.ENDED; + return h('.flex-column', [ + h('.flex-row.g1.items-center.justify-center', { id: 'runStatusPanel' }, [ + runNumberPanel, + statusPanel(runStatus), ]), - ]), + shouldShowTimestamp && h( + '.flex-row.g1.items-center.justify-center.f7.gray-darker.text-center', + lastUpdatePanel(runStatus), + ), + ]); + }, Other: () => null, }); +}; diff --git a/QualityControl/public/common/header.js b/QualityControl/public/common/header.js index 3bea814d5..986f40efc 100644 --- a/QualityControl/public/common/header.js +++ b/QualityControl/public/common/header.js @@ -30,18 +30,24 @@ import { filtersPanel } from './filters/filterViews.js'; * @param {Model} model - root model of the application * @returns {vnode} - header element */ -export default (model) => h('.flex-col', [ - h('.flex-row.p2.items-center', { id: 'qcg-header' }, [ - commonHeader(model), - h('.flex-grow.flex-row', headerSpecific(model)), - ]), - filterSpecific(model), -]); +export default (model) => { + const specific = headerSpecific(model) || {}; + const { centerCol, rightCol } = specific; + + return h('.flex-col', [ + h('.flex-row.p2.items-center', { id: 'qcg-header' }, [ + commonHeader(model), + centerCol || h('.flex-grow'), + rightCol || h('.w-33'), + ]), + filterSpecific(model), + ]); +}; /** * Shows the page specific header (center and right side) * @param {Model} model - root model of the application - * @returns {vnode} - virtual node element + * @returns {{centerCol: vnode, rightCol: vnode} | null} */ const headerSpecific = (model) => { const { layoutListModel, filterModel, layout, object, page } = model; diff --git a/QualityControl/public/layout/view/header.js b/QualityControl/public/layout/view/header.js index b496f70bb..7b0881d96 100644 --- a/QualityControl/public/layout/view/header.js +++ b/QualityControl/public/layout/view/header.js @@ -43,12 +43,11 @@ const toolbarViewMode = (layout, filterModel) => { const layoutItem = layout.item; const { isOfficial, owner_id, name } = layoutItem; - return [ - h('.flex-grow.text-center', h('.header-layout', [tabViewLinks(layoutItem, layout)])), - h('.flex-grow.text-right', [ + return { + centerCol: h('.flex-grow.text-center', [h('.header-layout', [tabViewLinks(layoutItem, layout)])]), + rightCol: h('.w-33.text-right.g2.flex-row.justify-end', [ h('b.f4.items-center', [isOfficial ? iconBadge() : '', layoutItem.name]), ' ', - // Show group button edit/duplicate only for owner of the layout shown h('.btn-group', [ filterPanelToggleButton(filterModel), newLayoutButton(layout), @@ -56,7 +55,7 @@ const toolbarViewMode = (layout, filterModel) => { layout.ownsLayout(owner_id) && [editDropdown(layout), deleteButton(layout)], ]), ]), - ]; + }; }; /** @@ -92,8 +91,8 @@ const toolbarEditMode = (layout, filterModel) => { layout.item.name = e.target.value.trim(); }; - return [ - h('.w-50.text-center', [ + return { + centerCol: h('.flex-grow.text-center', [ h('div', { class: 'header-layout' }, [ h('span', editTabLinks(layout)), h('.btn-group', [ @@ -110,7 +109,7 @@ const toolbarEditMode = (layout, filterModel) => { ]), ]), ]), - h('.text-right.flex-grow', [ + rightCol: h('.w-33.text-right.flex-row.justify-end', [ h('input.form-control.form-inline', { type: 'text', value: layout.item.name, @@ -122,7 +121,7 @@ const toolbarEditMode = (layout, filterModel) => { cancelButton(layout), ]), ]), - ]; + }; }; /** diff --git a/QualityControl/public/object/QCObject.js b/QualityControl/public/object/QCObject.js index 7349e90b3..e004a3181 100644 --- a/QualityControl/public/object/QCObject.js +++ b/QualityControl/public/object/QCObject.js @@ -168,16 +168,32 @@ export default class QCObject extends BaseViewModel { this.notify(); } + /** + * Checks if the object list needs to be refreshed. + * @returns {Promise<{ refreshNeeded: boolean, data: object | null }>} + * whether a refresh is needed and the fetched data + */ + checkIfListHasToBeRefreshed() { + const fetchFn = async () => await this.model.services.object.getObjects(true); + const validateFn = (result) => result.isSuccess() && result.payload.paths?.length !== this.list?.length; + return this.model.filterModel.refreshCheck(fetchFn, validateFn); + } + /** * Ask server for all available objects, fills `tree` of objects * @returns {undefined} */ async loadList() { + const { refreshNeeded, data } = await this.checkIfListHasToBeRefreshed(); + if (!refreshNeeded) { + this.notify(); + return; + } this.objectsRemote = RemoteData.loading(); this.notify(); this.queryingObjects = true; let offlineObjects = []; - const result = await this.model.services.object.getObjects(this.model.filterModel.isRunModeActivated); + const result = data ?? await this.model.services.object.getObjects(this.model.filterModel.isRunModeActivated); if (result.isSuccess()) { offlineObjects = this.model.filterModel.isRunModeActivated ? result.payload.paths : result.payload; @@ -539,7 +555,7 @@ export default class QCObject extends BaseViewModel { */ async triggerFilter() { // don't clear selected object refreshing in run mode - if (!this.model.filterModel.isRunModeActivated) { + if (!this.model.filterModel.isRunModeActivated || !this.model.filterModel.runsModeInterval) { this.selected = null; } this.loadList(); diff --git a/QualityControl/public/object/objectTreeHeader.js b/QualityControl/public/object/objectTreeHeader.js index 86efe25ae..c4f7bd0b5 100644 --- a/QualityControl/public/object/objectTreeHeader.js +++ b/QualityControl/public/object/objectTreeHeader.js @@ -21,7 +21,7 @@ import { filterPanelToggleButton } from '../common/filters/filterViews.js'; * by name. * @param {QcObject} qcObject - Model that manages the QCObject state. * @param {FilterModel} filterModel - The model handeling the filter state - * @returns {vnode} - virtual node element + * @returns {{centerCol: vnode, rightCol: vnode} | null} - object with vnode elements */ export default function objectTreeHeader(qcObject, filterModel) { if (!qcObject.currentList) { @@ -32,13 +32,14 @@ export default function objectTreeHeader(qcObject, filterModel) { ? `${qcObject.searchResult.length} found of ${qcObject.currentList.length}` : `${qcObject.currentList.length} items`; - return [ - h('.w-33.text-center.flex-grow.flex-row.justify-center.items-center', [ + return { + centerCol: h('.flex-grow.text-center.flex-row.justify-center.items-center', [ h('b.f4', 'Objects'), ' ', qcObject.objectsRemote.isSuccess() && h('span', `(${howMany})`), ]), - h('.flex-row.items-center.g2.justify-end', [ + + rightCol: h('.w-33.flex-row.items-center.g2.justify-end', [ filterModel.isRunModeActivated ? null : filterPanelToggleButton(filterModel), ' ', h('.dropdown', { @@ -71,7 +72,7 @@ export default function objectTreeHeader(qcObject, filterModel) { }), ' ', ]), - ]; + }; } /** diff --git a/QualityControl/public/pages/aboutView/components/aboutViewHeader.js b/QualityControl/public/pages/aboutView/components/aboutViewHeader.js index ac398d72e..0c57bf3b4 100644 --- a/QualityControl/public/pages/aboutView/components/aboutViewHeader.js +++ b/QualityControl/public/pages/aboutView/components/aboutViewHeader.js @@ -18,10 +18,7 @@ import { h } from '/js/src/index.js'; * Shows header of Framework Information * @returns {vnode} - virtual node element */ -export default () => [ - h( - '.w-50.flex-row.justify-center', - h('b.f4.ph2', 'About'), - ), - h('.flex-grow'), -]; +export default () => ({ + centerCol: h('.flex-row.justify-center.flex-grow', [h('b.f4.ph2', 'About')]), + rightCol: h('.w-33'), +}); diff --git a/QualityControl/public/pages/layoutListView/components/LayoutListHeader.js b/QualityControl/public/pages/layoutListView/components/LayoutListHeader.js index 736036207..1a85c3fde 100644 --- a/QualityControl/public/pages/layoutListView/components/LayoutListHeader.js +++ b/QualityControl/public/pages/layoutListView/components/LayoutListHeader.js @@ -16,12 +16,12 @@ import { h } from '/js/src/index.js'; /** * Shows header of list of layouts with one search input to filter them - * @param {LayoutListModel} layoutListModel - The model handeling the state of the LayoutListPage - * @returns {vnode} - virtual node element + * @param {LayoutListModel} layoutListModel - The model handling the state of the LayoutListPage + * @returns {{centerCol: vnode, rightCol: vnode}} - object with virtual node elements */ -export default (layoutListModel) => [ - h('.w-50.text-center', [h('b.f4', 'Layouts')]), - h('.flex-grow.text-right', [ +export default (layoutListModel) => ({ + centerCol: h('.flex-grow.text-center', [h('b.f4', 'Layouts')]), + rightCol: h('.w-33.text-right', [ h('input.form-control.form-inline.mh1.w-33', { placeholder: 'Search', type: 'text', @@ -29,4 +29,4 @@ export default (layoutListModel) => [ oninput: (e) => layoutListModel.search(e.target.value), }), ]), -]; +}); diff --git a/QualityControl/public/pages/objectView/components/header.js b/QualityControl/public/pages/objectView/components/header.js index 1487c7fb3..86e9c6817 100644 --- a/QualityControl/public/pages/objectView/components/header.js +++ b/QualityControl/public/pages/objectView/components/header.js @@ -18,20 +18,21 @@ import { filterPanelToggleButton } from '../../../common/filters/filterViews.js' /** * Builds header which contains information on plotted object and actions that can be applied * @param {Model} model - root model of the application - * @returns {vnode} - virtual node element + * @returns {{centerCol: vnode, rightCol: vnode} | null} - object with vnode elements */ export const objectViewHeader = (model) => { const { objectViewModel, filterModel, router } = model; const title = computeTitle(objectViewModel, router); - return [ - h('.flex-column.text-center.justify-center.w-50', h('b', title)), - h('.flex-row.flex-grow.items-center.p2.g2.w-33.justify-end', [ + return { + centerCol: h('.text-center.justify-center.flex-grow', [h('b', title)]), + + rightCol: h('.w-33.flex-row.flex-grow.items-center.p2.g2.justify-end', [ getBackToQCGButton(objectViewModel, router), filterPanelToggleButton(filterModel), model.isContextSecure() && h('.flex-row', getCopyURLToClipboardButton(model)), ]), - ]; + }; }; const computeTitle = (objectViewModel, router) => { diff --git a/QualityControl/test/public/features/runMode.test.js b/QualityControl/test/public/features/runMode.test.js index 88ae59a94..f0a0b16d1 100644 --- a/QualityControl/test/public/features/runMode.test.js +++ b/QualityControl/test/public/features/runMode.test.js @@ -11,7 +11,7 @@ * or submit itself to any jurisdiction. */ -import { strictEqual, ok } from 'node:assert'; +import { strictEqual, ok, match } from 'node:assert'; import { delay } from '../../testUtils/delay.js'; export const runModeTests = async (url, page, timeout = 5000, testParent) => { // @@ -46,6 +46,8 @@ export const runModeTests = async (url, page, timeout = 5000, testParent) => { await testParent.test('should allow user to track a run', { timeout }, async () => { const urlRunStatus = '/api/filter/run-status/566138'; const urlObjects = '/api/objects?inRunMode=true&filters[RunNumber]=566138'; + const regex = + /^Last update: \d{2}\/\d{2}\/\d{4}, \d{2}:\d{2}:\d{2}$/; let countRunStatusCalls = 0; let countObjectsCalls = 0; page.on('request', (req) => { @@ -69,15 +71,19 @@ export const runModeTests = async (url, page, timeout = 5000, testParent) => { await page.waitForSelector('#runStatusPanel'); const runStatusInfo = await page.evaluate(() => { const runNumber = document.querySelector('#runNumberLabel').textContent; - const status = document.querySelector('#runStatus').textContent; - return { runNumber, status }; + const status = document.querySelector('#runStatusBadge').textContent; + const lastUpdate = document.querySelector('#lastUpdate').textContent; + const refreshInfo = document.querySelector('#refreshInfo')?.textContent; + return { runNumber, status, lastUpdate, refreshInfo }; }); - strictEqual(runStatusInfo.runNumber, '#566138'); + strictEqual(runStatusInfo.runNumber, 'Run #566138'); strictEqual(runStatusInfo.status, 'ONGOING'); + strictEqual(runStatusInfo.refreshInfo, ' - As run is ONGOING, will refresh every 0.5 seconds'); + match(runStatusInfo.lastUpdate, regex); + await delay(1000); strictEqual(countRunStatusCalls, 3, `Expected 3 requests to filter/run-status, but got ${countRunStatusCalls}`); - //2 because the third one returns an 'ENDED' status - strictEqual(countObjectsCalls, 2, `Expected requests to api/objects, but got ${countObjectsCalls}`); + strictEqual(countObjectsCalls, 3, `Expected 3 requests to api/objects, but got ${countObjectsCalls}`); }); await testParent.test('should show `ENDED` if a run that was ongoing, finishes', { timeout }, async () => { @@ -92,10 +98,10 @@ export const runModeTests = async (url, page, timeout = 5000, testParent) => { await page.waitForSelector('#runStatusPanel'); const runStatusInfo = await page.evaluate(() => { const runNumber = document.querySelector('#runNumberLabel').textContent; - const status = document.querySelector('#runStatus').textContent; + const status = document.querySelector('#runStatusBadge').textContent; return { runNumber, status }; }); - strictEqual(runStatusInfo.runNumber, '#566138'); + strictEqual(runStatusInfo.runNumber, 'Run #566138'); strictEqual(runStatusInfo.status, 'ENDED'); await delay(500); strictEqual(count, 0, `No requests expected, but got ${count}`); @@ -106,7 +112,7 @@ export const runModeTests = async (url, page, timeout = 5000, testParent) => { await page.waitForSelector('#runStatusPanel'); const runInfo = await page.evaluate(() => { const runNumber = document.querySelector('#runNumberLabel').textContent; - const status = document.querySelector('#runStatus').textContent; + const status = document.querySelector('#runStatusBadge').textContent; return { runNumber, status }; }); const isRunModeActivated = await page.evaluate(() => window.model.filterModel.isRunModeActivated); From f98f593b01f316840a363313fc08b08183047b5a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 23 Sep 2025 18:40:33 +0200 Subject: [PATCH 46/77] Bump @stylistic/eslint-plugin from 5.3.1 to 5.4.0 in /Framework (#3074) Bumps [@stylistic/eslint-plugin](https://github.com/eslint-stylistic/eslint-stylistic/tree/HEAD/packages/eslint-plugin) from 5.3.1 to 5.4.0. - [Release notes](https://github.com/eslint-stylistic/eslint-stylistic/releases) - [Changelog](https://github.com/eslint-stylistic/eslint-stylistic/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint-stylistic/eslint-stylistic/commits/v5.4.0/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@stylistic/eslint-plugin" dependency-version: 5.4.0 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Framework/package-lock.json | 18 +++++++++--------- Framework/package.json | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Framework/package-lock.json b/Framework/package-lock.json index a2f938c19..f3b1803ee 100644 --- a/Framework/package-lock.json +++ b/Framework/package-lock.json @@ -22,7 +22,7 @@ }, "devDependencies": { "@eslint/js": "^9.35.0", - "@stylistic/eslint-plugin": "^5.3.1", + "@stylistic/eslint-plugin": "^5.4.0", "eslint": "^9.35.0", "eslint-plugin-jsdoc": "^57.2.1", "globals": "^16.4.0", @@ -1075,14 +1075,14 @@ } }, "node_modules/@stylistic/eslint-plugin": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.3.1.tgz", - "integrity": "sha512-Ykums1VYonM0TgkD0VteVq9mrlO2FhF48MDJnPyv3MktIB2ydtuhlO0AfWm7xnW1kyf5bjOqA6xc7JjviuVTxg==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.4.0.tgz", + "integrity": "sha512-UG8hdElzuBDzIbjG1QDwnYH0MQ73YLXDFHgZzB4Zh/YJfnw8XNsloVtytqzx0I2Qky9THSdpTmi8Vjn/pf/Lew==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/types": "^8.41.0", + "@eslint-community/eslint-utils": "^4.9.0", + "@typescript-eslint/types": "^8.44.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "estraverse": "^5.3.0", @@ -1155,9 +1155,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.43.0.tgz", - "integrity": "sha512-vQ2FZaxJpydjSZJKiSW/LJsabFFvV7KgLC5DiLhkBcykhQj8iK9BOaDmQt74nnKdLvceM5xmhaTF+pLekrxEkw==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.44.1.tgz", + "integrity": "sha512-Lk7uj7y9uQUOEguiDIDLYLJOrYHQa7oBiURYVFqIpGxclAFQ78f6VUOM8lI2XEuNOKNB7XuvM2+2cMXAoq4ALQ==", "dev": true, "license": "MIT", "engines": { diff --git a/Framework/package.json b/Framework/package.json index 28fb695d8..ceef2e578 100644 --- a/Framework/package.json +++ b/Framework/package.json @@ -44,7 +44,7 @@ }, "devDependencies": { "@eslint/js": "^9.35.0", - "@stylistic/eslint-plugin": "^5.3.1", + "@stylistic/eslint-plugin": "^5.4.0", "eslint": "^9.35.0", "eslint-plugin-jsdoc": "^57.2.1", "globals": "^16.4.0", From cd06cf9598dfb345742f24797c0ebc2176fbe644 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 23 Sep 2025 18:40:47 +0200 Subject: [PATCH 47/77] Bump @stylistic/eslint-plugin from 5.3.1 to 5.4.0 in /InfoLogger (#3075) Bumps [@stylistic/eslint-plugin](https://github.com/eslint-stylistic/eslint-stylistic/tree/HEAD/packages/eslint-plugin) from 5.3.1 to 5.4.0. - [Release notes](https://github.com/eslint-stylistic/eslint-stylistic/releases) - [Changelog](https://github.com/eslint-stylistic/eslint-stylistic/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint-stylistic/eslint-stylistic/commits/v5.4.0/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@stylistic/eslint-plugin" dependency-version: 5.4.0 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- InfoLogger/package-lock.json | 18 +++++++++--------- InfoLogger/package.json | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/InfoLogger/package-lock.json b/InfoLogger/package-lock.json index 58930c9f6..d9dd0360a 100644 --- a/InfoLogger/package-lock.json +++ b/InfoLogger/package-lock.json @@ -17,7 +17,7 @@ }, "devDependencies": { "@eslint/js": "^9.35.0", - "@stylistic/eslint-plugin": "^5.3.1", + "@stylistic/eslint-plugin": "^5.4.0", "eslint": "^9.35.0", "eslint-plugin-jsdoc": "^57.2.1", "globals": "^16.4.0", @@ -1041,14 +1041,14 @@ } }, "node_modules/@stylistic/eslint-plugin": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.3.1.tgz", - "integrity": "sha512-Ykums1VYonM0TgkD0VteVq9mrlO2FhF48MDJnPyv3MktIB2ydtuhlO0AfWm7xnW1kyf5bjOqA6xc7JjviuVTxg==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.4.0.tgz", + "integrity": "sha512-UG8hdElzuBDzIbjG1QDwnYH0MQ73YLXDFHgZzB4Zh/YJfnw8XNsloVtytqzx0I2Qky9THSdpTmi8Vjn/pf/Lew==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/types": "^8.41.0", + "@eslint-community/eslint-utils": "^4.9.0", + "@typescript-eslint/types": "^8.44.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "estraverse": "^5.3.0", @@ -1116,9 +1116,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.43.0.tgz", - "integrity": "sha512-vQ2FZaxJpydjSZJKiSW/LJsabFFvV7KgLC5DiLhkBcykhQj8iK9BOaDmQt74nnKdLvceM5xmhaTF+pLekrxEkw==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.44.1.tgz", + "integrity": "sha512-Lk7uj7y9uQUOEguiDIDLYLJOrYHQa7oBiURYVFqIpGxclAFQ78f6VUOM8lI2XEuNOKNB7XuvM2+2cMXAoq4ALQ==", "dev": true, "license": "MIT", "engines": { diff --git a/InfoLogger/package.json b/InfoLogger/package.json index de054df42..09de8d877 100644 --- a/InfoLogger/package.json +++ b/InfoLogger/package.json @@ -35,7 +35,7 @@ }, "devDependencies": { "@eslint/js": "^9.35.0", - "@stylistic/eslint-plugin": "^5.3.1", + "@stylistic/eslint-plugin": "^5.4.0", "eslint": "^9.35.0", "eslint-plugin-jsdoc": "^57.2.1", "globals": "^16.4.0", From ca0fc1710403a074eda9910fc8e37b7af661695b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 23 Sep 2025 18:41:06 +0200 Subject: [PATCH 48/77] Bump the dev-dependencies group in /QualityControl with 4 updates (#3072) Bumps the dev-dependencies group in /QualityControl with 4 updates: [@eslint/js](https://github.com/eslint/eslint/tree/HEAD/packages/js), [eslint](https://github.com/eslint/eslint), [eslint-plugin-jsdoc](https://github.com/gajus/eslint-plugin-jsdoc) and [puppeteer](https://github.com/puppeteer/puppeteer). Updates `@eslint/js` from 9.35.0 to 9.36.0 - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/commits/v9.36.0/packages/js) Updates `eslint` from 9.35.0 to 9.36.0 - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v9.35.0...v9.36.0) Updates `eslint-plugin-jsdoc` from 57.2.1 to 60.1.1 - [Release notes](https://github.com/gajus/eslint-plugin-jsdoc/releases) - [Changelog](https://github.com/gajus/eslint-plugin-jsdoc/blob/main/.releaserc) - [Commits](https://github.com/gajus/eslint-plugin-jsdoc/compare/v57.2.1...v60.1.1) Updates `puppeteer` from 24.21.0 to 24.22.0 - [Release notes](https://github.com/puppeteer/puppeteer/releases) - [Changelog](https://github.com/puppeteer/puppeteer/blob/main/CHANGELOG.md) - [Commits](https://github.com/puppeteer/puppeteer/compare/puppeteer-v24.21.0...puppeteer-v24.22.0) --- updated-dependencies: - dependency-name: "@eslint/js" dependency-version: 9.36.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-dependencies - dependency-name: eslint dependency-version: 9.36.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-dependencies - dependency-name: eslint-plugin-jsdoc dependency-version: 60.1.1 dependency-type: direct:development update-type: version-update:semver-major dependency-group: dev-dependencies - dependency-name: puppeteer dependency-version: 24.22.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- QualityControl/package-lock.json | 77 +++++++++++++++++--------------- QualityControl/package.json | 8 ++-- 2 files changed, 46 insertions(+), 39 deletions(-) diff --git a/QualityControl/package-lock.json b/QualityControl/package-lock.json index 3d02cb7cc..4b7c94e02 100644 --- a/QualityControl/package-lock.json +++ b/QualityControl/package-lock.json @@ -22,13 +22,13 @@ "umzug": "^3.8.2" }, "devDependencies": { - "@eslint/js": "^9.35.0", + "@eslint/js": "^9.36.0", "@stylistic/eslint-plugin-js": "^4.4.0", - "eslint": "^9.35.0", - "eslint-plugin-jsdoc": "^57.2.1", + "eslint": "^9.36.0", + "eslint-plugin-jsdoc": "^60.1.1", "globals": "^16.4.0", "nock": "^14.0.4", - "puppeteer": "^24.21.0", + "puppeteer": "^24.22.0", "sequelize-cli": "^6.6.2", "sinon": "^21.0.0", "supertest": "^7.1.0" @@ -369,9 +369,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.35.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.35.0.tgz", - "integrity": "sha512-30iXE9whjlILfWobBkNerJo+TXYsgVM5ERQwMcMKCHckHflCmf7wXDAHlARoWnh0s1U72WqlbeyE7iAcCzuCPw==", + "version": "9.36.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.36.0.tgz", + "integrity": "sha512-uhCbYtYynH30iZErszX78U+nR3pJU3RHGQ57NXy5QupD4SBVwDeU8TNBy+MjMngc1UyIW9noKqsRqfjQTBU2dw==", "dev": true, "license": "MIT", "engines": { @@ -853,9 +853,9 @@ } }, "node_modules/@puppeteer/browsers/node_modules/tar-fs": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.0.tgz", - "integrity": "sha512-5Mty5y/sOF1YWj1J6GiBodjlDc05CUR8PKXrsnFAiSG0xA+GHeWLovaZPYUDXkH/1iKRf2+M5+OrRgzC7O9b7w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz", + "integrity": "sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==", "dev": true, "license": "MIT", "dependencies": { @@ -1439,12 +1439,11 @@ "license": "MIT" }, "node_modules/bare-events": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.6.1.tgz", - "integrity": "sha512-AuTJkq9XmE6Vk0FJVNq5QxETrSA/vKHarWVBG5l/JbdCL1prJemiyJqUS0jrlXO0MftuPq4m3YVYhoNc5+aE/g==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.7.0.tgz", + "integrity": "sha512-b3N5eTW1g7vXkw+0CXh/HazGTcO5KYuu/RCNaJbDMPI6LHDi+7qe8EmxKUVe1sUbY2KZOVZFyj62x0OEz9qyAA==", "dev": true, - "license": "Apache-2.0", - "optional": true + "license": "Apache-2.0" }, "node_modules/bare-fs": { "version": "4.4.4", @@ -2603,9 +2602,9 @@ } }, "node_modules/eslint": { - "version": "9.35.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.35.0.tgz", - "integrity": "sha512-QePbBFMJFjgmlE+cXAlbHZbHpdFVS2E/6vzCy7aKlebddvl1vadiC4JFV5u/wqTkNUwEV8WrQi257jf5f06hrg==", + "version": "9.36.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.36.0.tgz", + "integrity": "sha512-hB4FIzXovouYzwzECDcUkJ4OcfOEkXTv2zRY6B9bkwjx/cprAq0uvm1nl7zvQ0/TsUk0zQiN4uPfJpB9m+rPMQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2615,7 +2614,7 @@ "@eslint/config-helpers": "^0.3.1", "@eslint/core": "^0.15.2", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.35.0", + "@eslint/js": "9.36.0", "@eslint/plugin-kit": "^0.3.5", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", @@ -2664,9 +2663,9 @@ } }, "node_modules/eslint-plugin-jsdoc": { - "version": "57.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-57.2.1.tgz", - "integrity": "sha512-HeTWN2VVVu7lzoKqH0uxB3UM3CBS+jMm91mSq3jb12CfWtSfverJDfhYDmRWiMGDzL9NUS/XCWPIWTQLsgjS4Q==", + "version": "60.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-60.1.1.tgz", + "integrity": "sha512-eEyINuG4pZtVFplyCPTeUif/+C14zh4fmm5IrDE5YY2Zc3IYKpdGjeaWahJcxWDDwjTVjWCw1zL9XbX3Fb0Wjg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -2834,6 +2833,16 @@ "es5-ext": "~0.10.14" } }, + "node_modules/events-universal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.0.tgz", + "integrity": "sha512-1KVXP1Oq8SiC0HsRraCryA4XGrZ2uJgIt/h4X+mB/8pzMKE7L8yBDN2lBlqJZeUwLAt7kf80m/5GX3HvoCrSGA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.7.0" + } + }, "node_modules/expand-template": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", @@ -5148,9 +5157,9 @@ } }, "node_modules/puppeteer": { - "version": "24.21.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.21.0.tgz", - "integrity": "sha512-JNY9JluUXepKzqKoPHsNVsrkpRRTare8geNP2L8YMkFHOKIvWSki/yUL9l2VJpani49epEHLpVg+zDcbTYibWA==", + "version": "24.22.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.22.0.tgz", + "integrity": "sha512-QabGIvu7F0hAMiKGHZCIRHMb6UoH0QAJA2OaqxEU2tL5noXPrxUcotg2l3ttOA4p1PFnVIGkr6PXRAWlM2evVQ==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", @@ -5159,7 +5168,7 @@ "chromium-bidi": "8.0.0", "cosmiconfig": "^9.0.0", "devtools-protocol": "0.0.1495869", - "puppeteer-core": "24.21.0", + "puppeteer-core": "24.22.0", "typed-query-selector": "^2.12.0" }, "bin": { @@ -5170,9 +5179,9 @@ } }, "node_modules/puppeteer-core": { - "version": "24.21.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.21.0.tgz", - "integrity": "sha512-WR4FehOs4XJ8OSp7MkGyVB4mfMs9Q6t8Y48TxiTCRxc8G2lJ5OKYPJvgU80dtKl+aIqIbdcNTgIooY49S5SsmA==", + "version": "24.22.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.22.0.tgz", + "integrity": "sha512-oUeWlIg0pMz8YM5pu0uqakM+cCyYyXkHBxx9di9OUELu9X9+AYrNGGRLK9tNME3WfN3JGGqQIH3b4/E9LGek/w==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -5983,17 +5992,15 @@ } }, "node_modules/streamx": { - "version": "2.22.1", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.1.tgz", - "integrity": "sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==", + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", + "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", "dev": true, "license": "MIT", "dependencies": { + "events-universal": "^1.0.0", "fast-fifo": "^1.3.2", "text-decoder": "^1.1.0" - }, - "optionalDependencies": { - "bare-events": "^2.2.0" } }, "node_modules/strict-event-emitter": { diff --git a/QualityControl/package.json b/QualityControl/package.json index 6ec93a069..9ca849c1a 100644 --- a/QualityControl/package.json +++ b/QualityControl/package.json @@ -46,13 +46,13 @@ "umzug": "^3.8.2" }, "devDependencies": { - "@eslint/js": "^9.35.0", + "@eslint/js": "^9.36.0", "@stylistic/eslint-plugin-js": "^4.4.0", - "eslint": "^9.35.0", - "eslint-plugin-jsdoc": "^57.2.1", + "eslint": "^9.36.0", + "eslint-plugin-jsdoc": "^60.1.1", "globals": "^16.4.0", "nock": "^14.0.4", - "puppeteer": "^24.21.0", + "puppeteer": "^24.22.0", "sequelize-cli": "^6.6.2", "sinon": "^21.0.0", "supertest": "^7.1.0" From efd4b50672ff75911d6ff38235821c5e5ead0816 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 23 Sep 2025 18:44:51 +0200 Subject: [PATCH 49/77] Bump @grpc/grpc-js from 1.13.0 to 1.14.0 in /Control in the grpc group (#3070) Bumps the grpc group in /Control with 1 update: [@grpc/grpc-js](https://github.com/grpc/grpc-node). Updates `@grpc/grpc-js` from 1.13.0 to 1.14.0 - [Release notes](https://github.com/grpc/grpc-node/releases) - [Commits](https://github.com/grpc/grpc-node/compare/@grpc/grpc-js@1.13.0...@grpc/grpc-js@1.14.0) --- updated-dependencies: - dependency-name: "@grpc/grpc-js" dependency-version: 1.14.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: grpc ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: George Raduta --- Control/package-lock.json | 29 +++++------------------------ Control/package.json | 2 +- 2 files changed, 6 insertions(+), 25 deletions(-) diff --git a/Control/package-lock.json b/Control/package-lock.json index bff1ec9ab..9d68dfa9a 100644 --- a/Control/package-lock.json +++ b/Control/package-lock.json @@ -15,7 +15,7 @@ "license": "GPL-3.0", "dependencies": { "@aliceo2/web-ui": "2.8.4", - "@grpc/grpc-js": "1.13.0", + "@grpc/grpc-js": "1.14.0", "@grpc/proto-loader": "0.8.0", "google-protobuf": "4.0.0", "kafkajs": "2.2.4" @@ -424,38 +424,19 @@ } }, "node_modules/@grpc/grpc-js": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.13.0.tgz", - "integrity": "sha512-pMuxInZjUnUkgMT2QLZclRqwk2ykJbIU05aZgPgJYXEpN9+2I7z7aNwcjWZSycRPl232FfhPszyBFJyOxTHNog==", + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.0.tgz", + "integrity": "sha512-N8Jx6PaYzcTRNzirReJCtADVoq4z7+1KQ4E70jTg/koQiMoUSN1kbNjPOqpPbhMFhfU1/l7ixspPl8dNY+FoUg==", "inBundle": true, "license": "Apache-2.0", "dependencies": { - "@grpc/proto-loader": "^0.7.13", + "@grpc/proto-loader": "^0.8.0", "@js-sdsl/ordered-map": "^4.4.2" }, "engines": { "node": ">=12.10.0" } }, - "node_modules/@grpc/grpc-js/node_modules/@grpc/proto-loader": { - "version": "0.7.13", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz", - "integrity": "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "lodash.camelcase": "^4.3.0", - "long": "^5.0.0", - "protobufjs": "^7.2.5", - "yargs": "^17.7.2" - }, - "bin": { - "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/@grpc/proto-loader": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.8.0.tgz", diff --git a/Control/package.json b/Control/package.json index ff3d27102..4d221abd0 100644 --- a/Control/package.json +++ b/Control/package.json @@ -34,7 +34,7 @@ ], "dependencies": { "@aliceo2/web-ui": "2.8.4", - "@grpc/grpc-js": "1.13.0", + "@grpc/grpc-js": "1.14.0", "@grpc/proto-loader": "0.8.0", "google-protobuf": "4.0.0", "kafkajs": "2.2.4" From e913cd06910c98b0165bf7cabe9d9616c4114165 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 23 Sep 2025 18:47:35 +0200 Subject: [PATCH 50/77] Bump puppeteer in /Control in the dev-dependencies group (#3069) Bumps the dev-dependencies group in /Control with 1 update: [puppeteer](https://github.com/puppeteer/puppeteer). Updates `puppeteer` from 24.21.0 to 24.22.0 - [Release notes](https://github.com/puppeteer/puppeteer/releases) - [Changelog](https://github.com/puppeteer/puppeteer/blob/main/CHANGELOG.md) - [Commits](https://github.com/puppeteer/puppeteer/compare/puppeteer-v24.21.0...puppeteer-v24.22.0) --- updated-dependencies: - dependency-name: puppeteer dependency-version: 24.22.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: George Raduta --- Control/package-lock.json | 51 ++++++++++++++++++++++----------------- Control/package.json | 2 +- 2 files changed, 30 insertions(+), 23 deletions(-) diff --git a/Control/package-lock.json b/Control/package-lock.json index 9d68dfa9a..1ee176b29 100644 --- a/Control/package-lock.json +++ b/Control/package-lock.json @@ -27,7 +27,7 @@ "nock": "^14.0.0", "nyc": "^17.1.0", "proxyquire": "^2.1.3", - "puppeteer": "^24.21.0", + "puppeteer": "^24.22.0", "sinon": "21.0.0", "supertest": "7.1.0" }, @@ -1219,12 +1219,11 @@ "license": "MIT" }, "node_modules/bare-events": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.6.1.tgz", - "integrity": "sha512-AuTJkq9XmE6Vk0FJVNq5QxETrSA/vKHarWVBG5l/JbdCL1prJemiyJqUS0jrlXO0MftuPq4m3YVYhoNc5+aE/g==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.7.0.tgz", + "integrity": "sha512-b3N5eTW1g7vXkw+0CXh/HazGTcO5KYuu/RCNaJbDMPI6LHDi+7qe8EmxKUVe1sUbY2KZOVZFyj62x0OEz9qyAA==", "dev": true, - "license": "Apache-2.0", - "optional": true + "license": "Apache-2.0" }, "node_modules/bare-fs": { "version": "4.4.4", @@ -2410,6 +2409,16 @@ "node": ">= 0.6" } }, + "node_modules/events-universal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.0.tgz", + "integrity": "sha512-1KVXP1Oq8SiC0HsRraCryA4XGrZ2uJgIt/h4X+mB/8pzMKE7L8yBDN2lBlqJZeUwLAt7kf80m/5GX3HvoCrSGA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.7.0" + } + }, "node_modules/express": { "version": "4.21.2", "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", @@ -5032,9 +5041,9 @@ } }, "node_modules/puppeteer": { - "version": "24.21.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.21.0.tgz", - "integrity": "sha512-JNY9JluUXepKzqKoPHsNVsrkpRRTare8geNP2L8YMkFHOKIvWSki/yUL9l2VJpani49epEHLpVg+zDcbTYibWA==", + "version": "24.22.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.22.0.tgz", + "integrity": "sha512-QabGIvu7F0hAMiKGHZCIRHMb6UoH0QAJA2OaqxEU2tL5noXPrxUcotg2l3ttOA4p1PFnVIGkr6PXRAWlM2evVQ==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", @@ -5043,7 +5052,7 @@ "chromium-bidi": "8.0.0", "cosmiconfig": "^9.0.0", "devtools-protocol": "0.0.1495869", - "puppeteer-core": "24.21.0", + "puppeteer-core": "24.22.0", "typed-query-selector": "^2.12.0" }, "bin": { @@ -5054,9 +5063,9 @@ } }, "node_modules/puppeteer-core": { - "version": "24.21.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.21.0.tgz", - "integrity": "sha512-WR4FehOs4XJ8OSp7MkGyVB4mfMs9Q6t8Y48TxiTCRxc8G2lJ5OKYPJvgU80dtKl+aIqIbdcNTgIooY49S5SsmA==", + "version": "24.22.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.22.0.tgz", + "integrity": "sha512-oUeWlIg0pMz8YM5pu0uqakM+cCyYyXkHBxx9di9OUELu9X9+AYrNGGRLK9tNME3WfN3JGGqQIH3b4/E9LGek/w==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -5689,17 +5698,15 @@ } }, "node_modules/streamx": { - "version": "2.22.1", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.1.tgz", - "integrity": "sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==", + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", + "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", "dev": true, "license": "MIT", "dependencies": { + "events-universal": "^1.0.0", "fast-fifo": "^1.3.2", "text-decoder": "^1.1.0" - }, - "optionalDependencies": { - "bare-events": "^2.2.0" } }, "node_modules/strict-event-emitter": { @@ -5921,9 +5928,9 @@ } }, "node_modules/tar-fs": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.0.tgz", - "integrity": "sha512-5Mty5y/sOF1YWj1J6GiBodjlDc05CUR8PKXrsnFAiSG0xA+GHeWLovaZPYUDXkH/1iKRf2+M5+OrRgzC7O9b7w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz", + "integrity": "sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==", "dev": true, "license": "MIT", "dependencies": { diff --git a/Control/package.json b/Control/package.json index 4d221abd0..75d5406ba 100644 --- a/Control/package.json +++ b/Control/package.json @@ -46,7 +46,7 @@ "nock": "^14.0.0", "nyc": "^17.1.0", "proxyquire": "^2.1.3", - "puppeteer": "^24.21.0", + "puppeteer": "^24.22.0", "sinon": "21.0.0", "supertest": "7.1.0" }, From 8cde06d1c8b20b137b9298f96daeb956f636e5f8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 23 Sep 2025 18:50:12 +0200 Subject: [PATCH 51/77] Bump the dev-dependencies group in /Framework with 4 updates (#3071) Bumps the dev-dependencies group in /Framework with 4 updates: [@eslint/js](https://github.com/eslint/eslint/tree/HEAD/packages/js), [eslint](https://github.com/eslint/eslint), [eslint-plugin-jsdoc](https://github.com/gajus/eslint-plugin-jsdoc) and [puppeteer](https://github.com/puppeteer/puppeteer). Updates `@eslint/js` from 9.35.0 to 9.36.0 - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/commits/v9.36.0/packages/js) Updates `eslint` from 9.35.0 to 9.36.0 - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v9.35.0...v9.36.0) Updates `eslint-plugin-jsdoc` from 57.2.1 to 60.1.1 - [Release notes](https://github.com/gajus/eslint-plugin-jsdoc/releases) - [Changelog](https://github.com/gajus/eslint-plugin-jsdoc/blob/main/.releaserc) - [Commits](https://github.com/gajus/eslint-plugin-jsdoc/compare/v57.2.1...v60.1.1) Updates `puppeteer` from 24.21.0 to 24.22.0 - [Release notes](https://github.com/puppeteer/puppeteer/releases) - [Changelog](https://github.com/puppeteer/puppeteer/blob/main/CHANGELOG.md) - [Commits](https://github.com/puppeteer/puppeteer/compare/puppeteer-v24.21.0...puppeteer-v24.22.0) --- updated-dependencies: - dependency-name: "@eslint/js" dependency-version: 9.36.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-dependencies - dependency-name: eslint dependency-version: 9.36.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-dependencies - dependency-name: eslint-plugin-jsdoc dependency-version: 60.1.1 dependency-type: direct:development update-type: version-update:semver-major dependency-group: dev-dependencies - dependency-name: puppeteer dependency-version: 24.22.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: George Raduta --- Framework/package-lock.json | 83 ++++++++++++++++++++----------------- Framework/package.json | 8 ++-- 2 files changed, 49 insertions(+), 42 deletions(-) diff --git a/Framework/package-lock.json b/Framework/package-lock.json index f3b1803ee..b63ed05fd 100644 --- a/Framework/package-lock.json +++ b/Framework/package-lock.json @@ -21,16 +21,16 @@ "ws": "^8.18.0" }, "devDependencies": { - "@eslint/js": "^9.35.0", + "@eslint/js": "^9.36.0", "@stylistic/eslint-plugin": "^5.4.0", - "eslint": "^9.35.0", - "eslint-plugin-jsdoc": "^57.2.1", + "eslint": "^9.36.0", + "eslint-plugin-jsdoc": "^60.2.0", "globals": "^16.4.0", "long": "^5.3.1", "mocha": "^11.7.0", "nock": "14.0.0", "nyc": "^17.1.0", - "puppeteer": "^24.21.0", + "puppeteer": "^24.22.1", "sinon": "21.0.0", "supertest": "^7.1.0" }, @@ -534,9 +534,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.35.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.35.0.tgz", - "integrity": "sha512-30iXE9whjlILfWobBkNerJo+TXYsgVM5ERQwMcMKCHckHflCmf7wXDAHlARoWnh0s1U72WqlbeyE7iAcCzuCPw==", + "version": "9.36.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.36.0.tgz", + "integrity": "sha512-uhCbYtYynH30iZErszX78U+nR3pJU3RHGQ57NXy5QupD4SBVwDeU8TNBy+MjMngc1UyIW9noKqsRqfjQTBU2dw==", "dev": true, "license": "MIT", "engines": { @@ -1336,9 +1336,9 @@ "dev": true }, "node_modules/b4a": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.1.tgz", - "integrity": "sha512-ZovbrBV0g6JxK5cGUF1Suby1vLfKjv4RWi8IxoaO/Mon8BDD9I21RxjHFtgQ+kskJqLAVyQZly3uMBui+vhc8Q==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.2.tgz", + "integrity": "sha512-DyUOdz+E8R6+sruDpQNOaV0y/dBbV6X/8ZkxrDcR0Ifc3BgKlpgG0VAtfOozA0eMtJO5GGe9FsZhueLs00pTww==", "dev": true, "license": "Apache-2.0", "peerDependencies": { @@ -1357,12 +1357,11 @@ "dev": true }, "node_modules/bare-events": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.6.1.tgz", - "integrity": "sha512-AuTJkq9XmE6Vk0FJVNq5QxETrSA/vKHarWVBG5l/JbdCL1prJemiyJqUS0jrlXO0MftuPq4m3YVYhoNc5+aE/g==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.7.0.tgz", + "integrity": "sha512-b3N5eTW1g7vXkw+0CXh/HazGTcO5KYuu/RCNaJbDMPI6LHDi+7qe8EmxKUVe1sUbY2KZOVZFyj62x0OEz9qyAA==", "dev": true, - "license": "Apache-2.0", - "optional": true + "license": "Apache-2.0" }, "node_modules/bare-fs": { "version": "4.4.4", @@ -2226,9 +2225,9 @@ } }, "node_modules/eslint": { - "version": "9.35.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.35.0.tgz", - "integrity": "sha512-QePbBFMJFjgmlE+cXAlbHZbHpdFVS2E/6vzCy7aKlebddvl1vadiC4JFV5u/wqTkNUwEV8WrQi257jf5f06hrg==", + "version": "9.36.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.36.0.tgz", + "integrity": "sha512-hB4FIzXovouYzwzECDcUkJ4OcfOEkXTv2zRY6B9bkwjx/cprAq0uvm1nl7zvQ0/TsUk0zQiN4uPfJpB9m+rPMQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2238,7 +2237,7 @@ "@eslint/config-helpers": "^0.3.1", "@eslint/core": "^0.15.2", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.35.0", + "@eslint/js": "9.36.0", "@eslint/plugin-kit": "^0.3.5", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", @@ -2287,9 +2286,9 @@ } }, "node_modules/eslint-plugin-jsdoc": { - "version": "57.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-57.2.1.tgz", - "integrity": "sha512-HeTWN2VVVu7lzoKqH0uxB3UM3CBS+jMm91mSq3jb12CfWtSfverJDfhYDmRWiMGDzL9NUS/XCWPIWTQLsgjS4Q==", + "version": "60.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-60.2.0.tgz", + "integrity": "sha512-VQNycH0EbjIvgdX6llnLidv7X/yQTJMoQl/L5bXAPasAlPZQFJQi7r5OLc29ushbeQJ7+BFf8UFt9JAQNBZhXg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -2449,6 +2448,16 @@ "node": ">= 0.6" } }, + "node_modules/events-universal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", + "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.7.0" + } + }, "node_modules/express": { "version": "4.21.2", "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", @@ -4711,9 +4720,9 @@ } }, "node_modules/puppeteer": { - "version": "24.21.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.21.0.tgz", - "integrity": "sha512-JNY9JluUXepKzqKoPHsNVsrkpRRTare8geNP2L8YMkFHOKIvWSki/yUL9l2VJpani49epEHLpVg+zDcbTYibWA==", + "version": "24.22.1", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.22.1.tgz", + "integrity": "sha512-jEeKDdJxXrv8Ki0I3q0amyv2FXZhucRG0Oh0EHF+igx8FiPG54y/E97j0+4WxITI7EjwoSxZFyxh61ZJ+TUo2w==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", @@ -4722,7 +4731,7 @@ "chromium-bidi": "8.0.0", "cosmiconfig": "^9.0.0", "devtools-protocol": "0.0.1495869", - "puppeteer-core": "24.21.0", + "puppeteer-core": "24.22.1", "typed-query-selector": "^2.12.0" }, "bin": { @@ -4733,9 +4742,9 @@ } }, "node_modules/puppeteer-core": { - "version": "24.21.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.21.0.tgz", - "integrity": "sha512-WR4FehOs4XJ8OSp7MkGyVB4mfMs9Q6t8Y48TxiTCRxc8G2lJ5OKYPJvgU80dtKl+aIqIbdcNTgIooY49S5SsmA==", + "version": "24.22.1", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.22.1.tgz", + "integrity": "sha512-2IuC+w6270i8uCr2wGzD9pOi+JUe1CZn4TgPaonsgNryY1BGMcccdO0XBmekFlLYxkqaHrUMzzZnpc+T33mF9g==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -5252,17 +5261,15 @@ } }, "node_modules/streamx": { - "version": "2.22.1", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.1.tgz", - "integrity": "sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==", + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", + "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", "dev": true, "license": "MIT", "dependencies": { + "events-universal": "^1.0.0", "fast-fifo": "^1.3.2", "text-decoder": "^1.1.0" - }, - "optionalDependencies": { - "bare-events": "^2.2.0" } }, "node_modules/strict-event-emitter": { @@ -5419,9 +5426,9 @@ } }, "node_modules/tar-fs": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.0.tgz", - "integrity": "sha512-5Mty5y/sOF1YWj1J6GiBodjlDc05CUR8PKXrsnFAiSG0xA+GHeWLovaZPYUDXkH/1iKRf2+M5+OrRgzC7O9b7w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz", + "integrity": "sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==", "dev": true, "license": "MIT", "dependencies": { diff --git a/Framework/package.json b/Framework/package.json index ceef2e578..8fd2b1efe 100644 --- a/Framework/package.json +++ b/Framework/package.json @@ -43,15 +43,15 @@ "protobufjs": "^7.5.0" }, "devDependencies": { - "@eslint/js": "^9.35.0", + "@eslint/js": "^9.36.0", "@stylistic/eslint-plugin": "^5.4.0", - "eslint": "^9.35.0", - "eslint-plugin-jsdoc": "^57.2.1", + "eslint": "^9.36.0", + "eslint-plugin-jsdoc": "^60.2.0", "globals": "^16.4.0", "mocha": "^11.7.0", "nock": "14.0.0", "nyc": "^17.1.0", - "puppeteer": "^24.21.0", + "puppeteer": "^24.22.1", "sinon": "21.0.0", "supertest": "^7.1.0", "long": "^5.3.1" From 42e1bb1f1ab840c91e1b5a2e0c59231e7d893153 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 23 Sep 2025 19:00:44 +0200 Subject: [PATCH 52/77] Bump the dev-dependencies group in /InfoLogger with 4 updates (#3073) Bumps the dev-dependencies group in /InfoLogger with 4 updates: [@eslint/js](https://github.com/eslint/eslint/tree/HEAD/packages/js), [eslint](https://github.com/eslint/eslint), [eslint-plugin-jsdoc](https://github.com/gajus/eslint-plugin-jsdoc) and [puppeteer](https://github.com/puppeteer/puppeteer). Updates `@eslint/js` from 9.35.0 to 9.36.0 - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/commits/v9.36.0/packages/js) Updates `eslint` from 9.35.0 to 9.36.0 - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v9.35.0...v9.36.0) Updates `eslint-plugin-jsdoc` from 57.2.1 to 60.1.1 - [Release notes](https://github.com/gajus/eslint-plugin-jsdoc/releases) - [Changelog](https://github.com/gajus/eslint-plugin-jsdoc/blob/main/.releaserc) - [Commits](https://github.com/gajus/eslint-plugin-jsdoc/compare/v57.2.1...v60.1.1) Updates `puppeteer` from 24.21.0 to 24.22.0 - [Release notes](https://github.com/puppeteer/puppeteer/releases) - [Changelog](https://github.com/puppeteer/puppeteer/blob/main/CHANGELOG.md) - [Commits](https://github.com/puppeteer/puppeteer/compare/puppeteer-v24.21.0...puppeteer-v24.22.0) --- updated-dependencies: - dependency-name: "@eslint/js" dependency-version: 9.36.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-dependencies - dependency-name: eslint dependency-version: 9.36.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-dependencies - dependency-name: eslint-plugin-jsdoc dependency-version: 60.1.1 dependency-type: direct:development update-type: version-update:semver-major dependency-group: dev-dependencies - dependency-name: puppeteer dependency-version: 24.22.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: George Raduta --- InfoLogger/package-lock.json | 83 +++++++++++++++++++----------------- InfoLogger/package.json | 8 ++-- 2 files changed, 49 insertions(+), 42 deletions(-) diff --git a/InfoLogger/package-lock.json b/InfoLogger/package-lock.json index d9dd0360a..da2816eac 100644 --- a/InfoLogger/package-lock.json +++ b/InfoLogger/package-lock.json @@ -16,14 +16,14 @@ "mariadb": "3.4.0" }, "devDependencies": { - "@eslint/js": "^9.35.0", + "@eslint/js": "^9.36.0", "@stylistic/eslint-plugin": "^5.4.0", - "eslint": "^9.35.0", - "eslint-plugin-jsdoc": "^57.2.1", + "eslint": "^9.36.0", + "eslint-plugin-jsdoc": "^60.2.0", "globals": "^16.4.0", "mocha": "^11.7.0", "nyc": "^17.1.0", - "puppeteer": "^24.21.0", + "puppeteer": "^24.22.1", "sinon": "^21.0.0" }, "engines": { @@ -540,9 +540,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.35.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.35.0.tgz", - "integrity": "sha512-30iXE9whjlILfWobBkNerJo+TXYsgVM5ERQwMcMKCHckHflCmf7wXDAHlARoWnh0s1U72WqlbeyE7iAcCzuCPw==", + "version": "9.36.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.36.0.tgz", + "integrity": "sha512-uhCbYtYynH30iZErszX78U+nR3pJU3RHGQ57NXy5QupD4SBVwDeU8TNBy+MjMngc1UyIW9noKqsRqfjQTBU2dw==", "dev": true, "license": "MIT", "engines": { @@ -1291,9 +1291,9 @@ "license": "MIT" }, "node_modules/b4a": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.1.tgz", - "integrity": "sha512-ZovbrBV0g6JxK5cGUF1Suby1vLfKjv4RWi8IxoaO/Mon8BDD9I21RxjHFtgQ+kskJqLAVyQZly3uMBui+vhc8Q==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.2.tgz", + "integrity": "sha512-DyUOdz+E8R6+sruDpQNOaV0y/dBbV6X/8ZkxrDcR0Ifc3BgKlpgG0VAtfOozA0eMtJO5GGe9FsZhueLs00pTww==", "dev": true, "license": "Apache-2.0", "peerDependencies": { @@ -1312,12 +1312,11 @@ "dev": true }, "node_modules/bare-events": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.6.1.tgz", - "integrity": "sha512-AuTJkq9XmE6Vk0FJVNq5QxETrSA/vKHarWVBG5l/JbdCL1prJemiyJqUS0jrlXO0MftuPq4m3YVYhoNc5+aE/g==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.7.0.tgz", + "integrity": "sha512-b3N5eTW1g7vXkw+0CXh/HazGTcO5KYuu/RCNaJbDMPI6LHDi+7qe8EmxKUVe1sUbY2KZOVZFyj62x0OEz9qyAA==", "dev": true, - "license": "Apache-2.0", - "optional": true + "license": "Apache-2.0" }, "node_modules/bare-fs": { "version": "4.4.4", @@ -2176,9 +2175,9 @@ } }, "node_modules/eslint": { - "version": "9.35.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.35.0.tgz", - "integrity": "sha512-QePbBFMJFjgmlE+cXAlbHZbHpdFVS2E/6vzCy7aKlebddvl1vadiC4JFV5u/wqTkNUwEV8WrQi257jf5f06hrg==", + "version": "9.36.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.36.0.tgz", + "integrity": "sha512-hB4FIzXovouYzwzECDcUkJ4OcfOEkXTv2zRY6B9bkwjx/cprAq0uvm1nl7zvQ0/TsUk0zQiN4uPfJpB9m+rPMQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2188,7 +2187,7 @@ "@eslint/config-helpers": "^0.3.1", "@eslint/core": "^0.15.2", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.35.0", + "@eslint/js": "9.36.0", "@eslint/plugin-kit": "^0.3.5", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", @@ -2237,9 +2236,9 @@ } }, "node_modules/eslint-plugin-jsdoc": { - "version": "57.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-57.2.1.tgz", - "integrity": "sha512-HeTWN2VVVu7lzoKqH0uxB3UM3CBS+jMm91mSq3jb12CfWtSfverJDfhYDmRWiMGDzL9NUS/XCWPIWTQLsgjS4Q==", + "version": "60.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-60.2.0.tgz", + "integrity": "sha512-VQNycH0EbjIvgdX6llnLidv7X/yQTJMoQl/L5bXAPasAlPZQFJQi7r5OLc29ushbeQJ7+BFf8UFt9JAQNBZhXg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -2376,6 +2375,16 @@ "node": ">= 0.6" } }, + "node_modules/events-universal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", + "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.7.0" + } + }, "node_modules/express": { "version": "4.21.2", "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", @@ -4755,9 +4764,9 @@ } }, "node_modules/puppeteer": { - "version": "24.21.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.21.0.tgz", - "integrity": "sha512-JNY9JluUXepKzqKoPHsNVsrkpRRTare8geNP2L8YMkFHOKIvWSki/yUL9l2VJpani49epEHLpVg+zDcbTYibWA==", + "version": "24.22.1", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.22.1.tgz", + "integrity": "sha512-jEeKDdJxXrv8Ki0I3q0amyv2FXZhucRG0Oh0EHF+igx8FiPG54y/E97j0+4WxITI7EjwoSxZFyxh61ZJ+TUo2w==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", @@ -4766,7 +4775,7 @@ "chromium-bidi": "8.0.0", "cosmiconfig": "^9.0.0", "devtools-protocol": "0.0.1495869", - "puppeteer-core": "24.21.0", + "puppeteer-core": "24.22.1", "typed-query-selector": "^2.12.0" }, "bin": { @@ -4777,9 +4786,9 @@ } }, "node_modules/puppeteer-core": { - "version": "24.21.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.21.0.tgz", - "integrity": "sha512-WR4FehOs4XJ8OSp7MkGyVB4mfMs9Q6t8Y48TxiTCRxc8G2lJ5OKYPJvgU80dtKl+aIqIbdcNTgIooY49S5SsmA==", + "version": "24.22.1", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.22.1.tgz", + "integrity": "sha512-2IuC+w6270i8uCr2wGzD9pOi+JUe1CZn4TgPaonsgNryY1BGMcccdO0XBmekFlLYxkqaHrUMzzZnpc+T33mF9g==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -5350,17 +5359,15 @@ } }, "node_modules/streamx": { - "version": "2.22.1", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.1.tgz", - "integrity": "sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==", + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", + "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", "dev": true, "license": "MIT", "dependencies": { + "events-universal": "^1.0.0", "fast-fifo": "^1.3.2", "text-decoder": "^1.1.0" - }, - "optionalDependencies": { - "bare-events": "^2.2.0" } }, "node_modules/string_decoder": { @@ -5466,9 +5473,9 @@ } }, "node_modules/tar-fs": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.0.tgz", - "integrity": "sha512-5Mty5y/sOF1YWj1J6GiBodjlDc05CUR8PKXrsnFAiSG0xA+GHeWLovaZPYUDXkH/1iKRf2+M5+OrRgzC7O9b7w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz", + "integrity": "sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==", "dev": true, "license": "MIT", "dependencies": { diff --git a/InfoLogger/package.json b/InfoLogger/package.json index 09de8d877..1db4d3abd 100644 --- a/InfoLogger/package.json +++ b/InfoLogger/package.json @@ -34,14 +34,14 @@ "mariadb": "3.4.0" }, "devDependencies": { - "@eslint/js": "^9.35.0", + "@eslint/js": "^9.36.0", "@stylistic/eslint-plugin": "^5.4.0", - "eslint": "^9.35.0", - "eslint-plugin-jsdoc": "^57.2.1", + "eslint": "^9.36.0", + "eslint-plugin-jsdoc": "^60.2.0", "globals": "^16.4.0", "mocha": "^11.7.0", "nyc": "^17.1.0", - "puppeteer": "^24.21.0", + "puppeteer": "^24.22.1", "sinon": "^21.0.0" }, "bundleDependencies": [ From ecc05aa9bdfcba9ea4edc0931b58e045c2f2d906 Mon Sep 17 00:00:00 2001 From: Jasper H <50981003+Houwie7000@users.noreply.github.com> Date: Wed, 24 Sep 2025 18:19:39 +0200 Subject: [PATCH 53/77] [OGUI-1760] Update search UI for object path and add filters (#3065) * Adds Search/filter layout functionality in Model for layoutList Page * Adds a SearchModel to be used with registered filter parameters --- .vscode/launch.json | 13 ++ QualityControl/public/common/header.js | 4 +- .../pages/layoutListView/FilterTypes.js | 49 ++++++ .../pages/layoutListView/LayoutListPage.js | 40 ++++- .../components/LayoutListHeader.js | 12 +- .../layoutListView/filtersPanelPopover.js | 89 ++++++++++ .../layoutListView/model/LayoutListModel.js | 42 +++-- .../layoutListView/model/SearchFilterModel.js | 161 ++++++++++++++++++ .../public/services/Layout.service.js | 3 + QualityControl/public/view.js | 2 +- .../test/public/pages/layout-list.test.js | 94 ++++++++-- 11 files changed, 461 insertions(+), 48 deletions(-) create mode 100644 QualityControl/public/pages/layoutListView/FilterTypes.js create mode 100644 QualityControl/public/pages/layoutListView/filtersPanelPopover.js create mode 100644 QualityControl/public/pages/layoutListView/model/SearchFilterModel.js diff --git a/.vscode/launch.json b/.vscode/launch.json index 3b0cc7401..88a9dc3f3 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -18,6 +18,19 @@ "windows": { "localRoot": "${workspaceFolder}\\InfoLogger\\" } + }, + { + "name": "Launch firefox", + "type": "firefox", + "request": "attach", + "url": "http://localhost:8080/", + "webRoot": "${workspaceFolder}", + "pathMappings": [ + { + "url": "http://localhost:8080/", + "path": "${workspaceFolder}/QualityControl/public/" + } + ] } ] } diff --git a/QualityControl/public/common/header.js b/QualityControl/public/common/header.js index 986f40efc..de022d67f 100644 --- a/QualityControl/public/common/header.js +++ b/QualityControl/public/common/header.js @@ -50,9 +50,9 @@ export default (model) => { * @returns {{centerCol: vnode, rightCol: vnode} | null} */ const headerSpecific = (model) => { - const { layoutListModel, filterModel, layout, object, page } = model; + const { filterModel, layout, object, page } = model; switch (page) { - case 'layoutList': return LayoutListHeader(layoutListModel); + case 'layoutList': return LayoutListHeader(); case 'layoutShow': return layoutViewHeader(layout, filterModel); case 'objectTree': return objectTreeHeader(object, filterModel); case 'objectView': return objectViewHeader(model); diff --git a/QualityControl/public/pages/layoutListView/FilterTypes.js b/QualityControl/public/pages/layoutListView/FilterTypes.js new file mode 100644 index 000000000..f48408fd8 --- /dev/null +++ b/QualityControl/public/pages/layoutListView/FilterTypes.js @@ -0,0 +1,49 @@ +/** + * @license + * Copyright 2019-2020 CERN and copyright holders of ALICE O2. + * See http://alice-o2.web.cern.ch/copyright for details of the copyright holders. + * All rights not expressly granted are reserved. + * + * This software is distributed under the terms of the GNU General Public + * License v3 (GPL Version 3), copied verbatim in the file "COPYING". + * + * In applying this license CERN does not waive the privileges and immunities + * granted to it by virtue of its status as an Intergovernmental Organization + * or submit itself to any jurisdiction. + */ + +/** + * @typedef {object} Filter + * @property {string} key - searchable key of the filter. + * @property {function(): (string)} friendlyName - friendly name of the filter else key. + * @property {function(): (string)} inputPlaceholder - Input element's placeholder, use examples of filter. + * @property {function(): (boolean)} isActive - has the filter any active value('s) + * @property {function(): (string|string[]|null)} getValue - gets the current value('s) of the filter + * @property {function(string): void} set - set value of the filter + * @property {Function} reset - reset filter to default state + */ + +/** + * creates a key-value filter. + * @param {string} key - key used to save and retrieve value. + * @param {string|null} friendlyName - friendly name of the filter. + * @param {string|null} inputPlaceholder - input placeholder text. + * @param {string} value - value associated with key. + * @returns {Filter} key-value filter object. + */ +export function createKeyValueFilter(key, friendlyName = null, inputPlaceholder = null, value = '') { + return { + key, + friendlyName: () => friendlyName ? friendlyName : key, + inputPlaceholder: () => inputPlaceholder ? inputPlaceholder : '', + getValue: () => value ? value : null, + // trim checks if value is a string value, test this + isActive: () => Boolean(value && value.trim()), + set: (v) => { + value = v; + }, + reset: () => { + value = ''; + }, + }; +} diff --git a/QualityControl/public/pages/layoutListView/LayoutListPage.js b/QualityControl/public/pages/layoutListView/LayoutListPage.js index 315f6f832..996d63adc 100644 --- a/QualityControl/public/pages/layoutListView/LayoutListPage.js +++ b/QualityControl/public/pages/layoutListView/LayoutListPage.js @@ -14,14 +14,42 @@ import FolderComponent from '../../folder/view/FolderComponent.js'; import { h } from '/js/src/index.js'; +import { filtersPanelPopover } from './filtersPanelPopover.js'; /** * Shows a list of layouts grouped by user and more - * @param {Array} folderModels - LayoutListModel.folders: The Folders used by LayoutListModel + * @param {LayoutListModel} layoutListModel - LayoutListModel which contains the folders and searchfiltermodel. * @returns {vnode} - virtual node element + * @import LayoutListModel from './model/LayoutListModel.js'; */ -export default function (folderModels) { - return h('.scroll-y.absolute-fill', { - style: 'display: flex; flex-direction: column', - }, Array.from(folderModels.values()).map(FolderComponent)); -} +export default (layoutListModel) => [ + h('.scroll-y.absolute-fill', [ + h( + '.flex-row.text-right.m2', + [ + filtersPanelPopover(layoutListModel.searchFilterModel), + h( + 'input.form-control.form-inline.mh1.w-33', + { + placeholder: 'Layout name', + type: 'text', + value: layoutListModel.searchFilterModel.searchInput, + oninput: (e) => { + layoutListModel.search(e.target.value); + }, + }, + ), + h('.p1', [ + h( + '.mh1', + layoutListModel.searchFilterModel.stringifyActiveFiltersFriendly(), + ), + ]), + ], + ), + + h('', { + style: 'display: flex; flex-direction: column', + }, Array.from(layoutListModel.folders.values()).map(FolderComponent)), + ]), +]; diff --git a/QualityControl/public/pages/layoutListView/components/LayoutListHeader.js b/QualityControl/public/pages/layoutListView/components/LayoutListHeader.js index 1a85c3fde..76cbc8dee 100644 --- a/QualityControl/public/pages/layoutListView/components/LayoutListHeader.js +++ b/QualityControl/public/pages/layoutListView/components/LayoutListHeader.js @@ -16,17 +16,9 @@ import { h } from '/js/src/index.js'; /** * Shows header of list of layouts with one search input to filter them - * @param {LayoutListModel} layoutListModel - The model handling the state of the LayoutListPage * @returns {{centerCol: vnode, rightCol: vnode}} - object with virtual node elements */ -export default (layoutListModel) => ({ +export default () => ({ centerCol: h('.flex-grow.text-center', [h('b.f4', 'Layouts')]), - rightCol: h('.w-33.text-right', [ - h('input.form-control.form-inline.mh1.w-33', { - placeholder: 'Search', - type: 'text', - value: layoutListModel.searchInput, - oninput: (e) => layoutListModel.search(e.target.value), - }), - ]), + rightCol: h('.w-33.text-right'), }); diff --git a/QualityControl/public/pages/layoutListView/filtersPanelPopover.js b/QualityControl/public/pages/layoutListView/filtersPanelPopover.js new file mode 100644 index 000000000..a68b13253 --- /dev/null +++ b/QualityControl/public/pages/layoutListView/filtersPanelPopover.js @@ -0,0 +1,89 @@ +/** + * @license + * Copyright 2019-2020 CERN and copyright holders of ALICE O2. + * See http://alice-o2.web.cern.ch/copyright for details of the copyright holders. + * All rights not expressly granted are reserved. + * + * This software is distributed under the terms of the GNU General Public + * License v3 (GPL Version 3), copied verbatim in the file "COPYING". + * + * In applying this license CERN does not waive the privileges and immunities + * granted to it by virtue of its status as an Intergovernmental Organization + * or submit itself to any jurisdiction. + */ + +// Adopted from Bookkeeping/lib/public/components/Filters/common/filtersPanelPopover.js +import { h, popover, PopoverAnchors, PopoverTriggerPreConfiguration } from '/js/src/index.js'; + +/** + * imports for JSDoc + VSCode navigation: + * @import { SearchFilterModel } from './model/SearchFilterModel.js'; + */ + +/** + * Return the filters panel popover trigger + * @returns {Component} the button component + */ +const filtersToggleTrigger = () => h('button#openFilterToggle.btn.btn.btn-primary', 'Filters'); + +/** + * Create main header of the filters panel + * @param {SearchFilterModel} searchFilterModel {@link SearchFilterModel} filtering model. + * @returns {Component} main panel header. + */ +const filtersToggleContentHeader = (searchFilterModel) => h('.flex-row.justify-between', [ + h('.f4', 'Filters'), + h( + 'button#reset-filters.btn.btn-danger', + { + onclick: () => searchFilterModel.resetAll(), + disabled: searchFilterModel.allInactive() ? true : false, + }, + 'Reset all filters', + ), +]); + +/** + * Return the filters panel popover content section + * @param {SearchFilterModel} searchFilterModel the searchFilter model + * @returns {Component} the filters section + */ +export const filtersSection = (searchFilterModel = {}) => [ + searchFilterModel.getAll().flatMap((filter) => [ + h('.flex-row.g2', [ + h('.w-30.f5.flex-row.items-center.g2', filter.friendlyName()), + h('.w-70', [ + h('input.form-control.w-100', { + placeholder: filter.inputPlaceholder(), + type: 'text', + value: filter.getValue(), + onchange: (e) => searchFilterModel.setValue(filter.key, e.target.value), + }), + ]), + ]), + ]), +]; + +/** + * Return the filters panel popover content (i.e. the actual filters) + * @param {SearchFilterModel} searchFilterModel the filtering model + * @returns {Component} the filters panel + */ +const filtersToggleContent = (searchFilterModel) => h('.w-l.flex-column.p3.g3', [ + filtersToggleContentHeader(searchFilterModel), + filtersSection(searchFilterModel), +]); + +/** + * Return component composed of the filtering popover and its button trigger + * @param {SearchFilterModel} searchFilterModel the filtering model + * @returns {Component} the filter component + */ +export const filtersPanelPopover = (searchFilterModel) => popover( + filtersToggleTrigger(), + filtersToggleContent(searchFilterModel), + { + ...PopoverTriggerPreConfiguration.click, + anchor: PopoverAnchors.RIGHT_START, + }, +); diff --git a/QualityControl/public/pages/layoutListView/model/LayoutListModel.js b/QualityControl/public/pages/layoutListView/model/LayoutListModel.js index 6df49f5e1..5b541abba 100644 --- a/QualityControl/public/pages/layoutListView/model/LayoutListModel.js +++ b/QualityControl/public/pages/layoutListView/model/LayoutListModel.js @@ -16,6 +16,8 @@ import FolderModel, { FolderType } from '../../../folder/model/FolderModel.js'; import LayoutCardModel from './LayoutCardModel.js'; import { BaseViewModel } from '../../../common/abstracts/BaseViewModel.js'; import { RequestFields } from '../../../common/RequestFields.enum.js'; +import { SearchFilterModel } from './SearchFilterModel.js'; +import { createKeyValueFilter } from '../FilterTypes.js'; /** * LayoutListModel namespace to control the layoutCards spread between its folders @@ -28,8 +30,16 @@ export default class LayoutListModel extends BaseViewModel { constructor(model) { super(); this.model = model; - this._searchInput = ''; this.folders = new Map(); + this.searchFilterModel = new SearchFilterModel(); + this.searchFilterModel.register(createKeyValueFilter('objectPath', 'Object path', 'e.g. TPC')); + this.searchFilterModel.observe(() => { + if (!this.searchFilterModel.allInactive()) { + this.search(undefined, this.searchFilterModel.getAllActiveAsObject()); + } else { + this.search(undefined, undefined); + } + }); this._initializeFolders(); } @@ -64,27 +74,35 @@ export default class LayoutListModel extends BaseViewModel { * @returns {string} The trimmed search input */ get searchInput() { - return this._searchInput.trim(); + return this.searchFilterModel.searchInput.trim(); + } + + set searchInput(value) { + this.searchFilterModel.searchInput = value; } /** * Set user's input for search and use a fuzzy algo to filter list of layouts. - * Fuzzy allows missing chars "aaa" can find "a/a/a" or "aa/a/bbbbb" - * @param {string} searchInput - string input from the user to search by - * @param {string} objectPath - string input from the user to search layouts by objectPath - * @returns {undefined} + * Fuzzy allows missing chars "aaa" can find "a/a/a" or "aa/a/bbbbb". + * If searchInput and objectPath are not included get all non-filtered layouts. + * All params can be undefined if you want all layouts. + * @param {string} searchInput - string input from the user to search by. + * @param {object} filters - filters object contains all filter key value pairs in one object. */ - search(searchInput, objectPath) { - if (objectPath === undefined) { - this._searchInput = searchInput; + search(searchInput, filters) { + if (searchInput === undefined && filters === undefined) { + // Get all layouts + this.model.services.layout.getLayouts(RequestFields.LAYOUT_CARD, undefined); + } else if (filters === undefined) { + // Normal offline search + this.searchInput = searchInput; this.folders.forEach((folder) => { folder.searchInput = new RegExp(searchInput, 'i'); }); this.notify(); } else { - const layoutService = this.model.services.layout; - this._searchInput = objectPath; - layoutService.getLayouts(RequestFields.LAYOUT_CARD, { objectPath }, this.model); + // online search using filters + this.model.services.layout.getLayouts(RequestFields.LAYOUT_CARD, filters); } } diff --git a/QualityControl/public/pages/layoutListView/model/SearchFilterModel.js b/QualityControl/public/pages/layoutListView/model/SearchFilterModel.js new file mode 100644 index 000000000..7db8309f2 --- /dev/null +++ b/QualityControl/public/pages/layoutListView/model/SearchFilterModel.js @@ -0,0 +1,161 @@ +/** + * @license + * Copyright 2019-2020 CERN and copyright holders of ALICE O2. + * See http://alice-o2.web.cern.ch/copyright for details of the copyright holders. + * All rights not expressly granted are reserved. + * + * This software is distributed under the terms of the GNU General Public + * License v3 (GPL Version 3), copied verbatim in the file "COPYING". + * + * In applying this license CERN does not waive the privileges and immunities + * granted to it by virtue of its status as an Intergovernmental Organization + * or submit itself to any jurisdiction. + */ + +import { BaseViewModel } from '../../../common/abstracts/BaseViewModel.js'; + +/** + * SearchFilter model to control the search and filter state + * @import { Filter } from '../FilterTypes.js'; + */ +export class SearchFilterModel extends BaseViewModel { + constructor() { + super(); + + /** + * Filters storage map + * @type {Map} + */ + this.filters = new Map(); // key -> filter instance + this.searchInput = ''; + } + + /** + * Register a filter object. + * @param {Filter} filter - Filter object to register. + * @returns {Filter} - Filter object that was registered. + */ + register(filter) { + if (!filter?.key) { + throw new Error('Invalid filter'); + } + if (this.filters.has(filter.key)) { + throw new Error(`Filter already registered: ${filter.key}`); + } + this.filters.set(filter.key, filter); + this.notify(); + return filter; + } + + /** + * Unregisters a specified filter by key. + * @param {string} key - filter key. + * @returns {void|boolean} void when key is not registered or true when the filter was successfully unregistered. + */ + unregister(key) { + const filter = this.get(key); + if (!filter) { + return; + } + const result = this.filters.delete(key); + this.notify(); + return result; + } + + /** + * Gets a specified filter object by filter.key + * @param {string} key - filter key. + * @returns {Filter} - Filter object + */ + get(key) { + return this.filters.get(key); + } + + /** + * Gets all registered filters + * @returns {Array} - Filter object that was registered. + */ + getAll() { + return Array.from(this.filters.values()); + } + + /** + * Set filter by key with specified value('s) + * @param {string} key - filter key. + * @param {any[]} args - value('s) to set. + * @returns {void} - void. + */ + setValue(key, ...args) { + const filter = this.get(key); + if (!filter) { + throw new Error(`Unknown filter: ${key}`); + } + if (typeof filter.set !== 'function') { + // not a proper filter, we need the setter. + throw new Error(`Filter has no set method: ${key}`); + } + filter.set(...args); + this.notify(); + return; + } + + resetAll() { + if (this.allInactive()) { + return; + } else { + for (const filter of this.filters.values()) { + if (typeof filter.reset === 'function') { + filter.reset(); + } + } + this.notify(); + } + } + + /** + * Get all the currently active filters. + * @returns {Array} all active filters + */ + getAllActive() { + return this.filters.values().filter((filter) => filter.isActive()).toArray(); + } + + /** + * check if all filters are inactive or not. + * @returns {boolean} all filters are inactive + */ + allInactive() { + const activeCount = this.getAllActive().length; + return activeCount > 0 ? false : true; + } + + /** + * Returns all active filters in a object like so + * This is the object that we can actually search with. + * { + * objectPath: 'TPC', + * pizza: 'Peperoni', + * } + * @returns {object} object containing all key/value pairs from all active filters. + */ + getAllActiveAsObject() { + return Object.fromEntries(this.getAllActive().map((filter) => [filter.key, filter.getValue()])); + } + + /** + * Return the active filters in a representable way. + * @returns {string} Active filters: filter.friendlyName(), ... . + */ + stringifyActiveFiltersFriendly() { + let activeFilterText = 'Active filters: '; + if (this.allInactive()) { + activeFilterText = ''; + return activeFilterText; + } else { + const activeNames = this.getAllActive().map((filter) => filter.friendlyName()); + activeFilterText += `${activeNames.join(', ')}.`; + + return activeFilterText; + } + } +} diff --git a/QualityControl/public/services/Layout.service.js b/QualityControl/public/services/Layout.service.js index 80550e7b5..debc99702 100644 --- a/QualityControl/public/services/Layout.service.js +++ b/QualityControl/public/services/Layout.service.js @@ -39,6 +39,9 @@ export default class LayoutService { /** * Method to get all layouts shared between users + * username is used for matching the user to their own layouts. + * This is chosen over user_id due to CERN users sometimes having multiple accounts, + * different user_id but same user_name. * @param {string|undefined} fields - comma separated string values. Represent the fields that should be fetched. * @param {object|undefined} filter - filter information to be parsed by the backend. * If left empty all available fields will be fetched diff --git a/QualityControl/public/view.js b/QualityControl/public/view.js index 654140bf5..ac3418cfe 100644 --- a/QualityControl/public/view.js +++ b/QualityControl/public/view.js @@ -51,7 +51,7 @@ export default (model) => [ */ function page(model) { switch (model.page) { - case 'layoutList': return LayoutListPage(model.layoutListModel.folders); + case 'layoutList': return LayoutListPage(model.layoutListModel); case 'layoutShow': return layoutViewPage(model); case 'objectTree': return objectTreePage(model); case 'objectView': return ObjectViewPage(model.objectViewModel); diff --git a/QualityControl/test/public/pages/layout-list.test.js b/QualityControl/test/public/pages/layout-list.test.js index 115b1d83f..70fee4890 100644 --- a/QualityControl/test/public/pages/layout-list.test.js +++ b/QualityControl/test/public/pages/layout-list.test.js @@ -24,16 +24,21 @@ const LAYOUT_LIST_PAGE_PARAM = '?page=layoutList'; * @param {object} testParent - Node.js test object which ensures sub-tests are being awaited */ export const layoutListPageTests = async (url, page, timeout = 5000, testParent) => { - const officialLayoutIndex = 1; + const officialLayoutIndex = 2; + const officialLayoutIndex2 = 1; const myLayoutIndex = 2; - const allLayoutIndex = 3; + const allLayoutIndex = 2; + const allLayoutIndex2 = 3; const basePath = (index) => `section > div > div:nth-child(${index})`; - const toggleFolderPath = (index) => `${basePath(index)} div > b`; + const toggleFolderPath = (index, index2) => index2 ? `${basePath(index)} > div:nth-child(${index2}) > div > b` : + `${basePath(index)} div > b`; const cardPath = (index, cardIndex) => `${basePath(index)} .card:nth-child(${cardIndex})`; const cardLayoutLinkPath = (cardPath) => `${cardPath} a`; const cardOfficialButtonPath = (cardPath) => `${cardPath} > .cardHeader > button`; + const filterPath = 'section > div > div:nth-child(1) > input'; + const filterObjectPath = 'input.form-control:nth-child(1)'; await testParent.test('should successfully load layoutList page "/"', { timeout }, async () => { await page.goto(`${url}${LAYOUT_LIST_PAGE_PARAM}`, { waitUntil: 'networkidle0' }); const location = await page.evaluate(() => window.location); @@ -51,53 +56,57 @@ export const layoutListPageTests = async (url, page, timeout = 5000, testParent) await testParent.test('should have folder for official layouts', async () => { const label = await page.evaluate((path) => - document.querySelector(path).textContent.trim(), toggleFolderPath(officialLayoutIndex)); + document.querySelector(path).textContent.trim(), toggleFolderPath(officialLayoutIndex, officialLayoutIndex2)); strictEqual(label, 'Official'); }); await testParent.test('should have folder for personal layouts', async () => { const label = await page.evaluate((path) => - document.querySelector(path).textContent.trim(), toggleFolderPath(myLayoutIndex)); + document.querySelector(path).textContent.trim(), toggleFolderPath(myLayoutIndex, myLayoutIndex)); strictEqual(label, 'My Layouts'); }); await testParent.test('should be able to close folders', async () => { + let nrOfOpenedFolders = await page.evaluate(() => document.querySelectorAll('.cardGrid').length); + await page.click(toggleFolderPath(officialLayoutIndex)); // This will close a folder await delay(1000); - let nrOfOpenedFolders = await page.evaluate(() => document.querySelectorAll('.cardGrid').length); + const nrOfOpenedFolders2 = await page.evaluate(() => document.querySelectorAll('.cardGrid').length); - strictEqual(nrOfOpenedFolders, 1, 'Official Layouts should have closed'); + strictEqual(nrOfOpenedFolders - 1, nrOfOpenedFolders2, 'Official Layouts should have closed'); - await page.click(toggleFolderPath(myLayoutIndex)); // This will close a folder + await page.click(toggleFolderPath(myLayoutIndex, myLayoutIndex)); // This will close a folder await delay(100); nrOfOpenedFolders = await page.evaluate(() => document.querySelectorAll('.cardGrid').length); - strictEqual(nrOfOpenedFolders, 0, 'My Layouts should have closed'); + strictEqual(nrOfOpenedFolders, nrOfOpenedFolders2 - 1, 'My Layouts should have closed'); }); - await testParent.test('should be able to close folders', async () => { + await testParent.test('should be able to open folders', async () => { + let nrOfOpenedFolders = await page.evaluate(() => document.querySelectorAll('.cardGrid').length); + await page.click(toggleFolderPath(officialLayoutIndex)); // This will open a folder await delay(100); - let nrOfOpenedFolders = await page.evaluate(() => document.querySelectorAll('.cardGrid').length); + const nrOfOpenedFolders2 = await page.evaluate(() => document.querySelectorAll('.cardGrid').length); - strictEqual(nrOfOpenedFolders, 1, 'Official Layouts should have opened'); + strictEqual(nrOfOpenedFolders, nrOfOpenedFolders2 - 1, 'Official Layouts should have opened'); - await page.click(toggleFolderPath(myLayoutIndex)); // This will open a folder + await page.click(toggleFolderPath(myLayoutIndex, myLayoutIndex)); // This will open a folder await delay(100); nrOfOpenedFolders = await page.evaluate(() => document.querySelectorAll('.cardGrid').length); - strictEqual(nrOfOpenedFolders, 2, 'My Layouts should have opened'); + strictEqual(nrOfOpenedFolders - 1, nrOfOpenedFolders2, 'My Layouts should have opened'); }); await testParent.test('should have folder for all layouts', async () => { const label = await page.evaluate((path) => - document.querySelector(path)?.textContent.trim(), toggleFolderPath(allLayoutIndex)); + document.querySelector(path)?.textContent.trim(), toggleFolderPath(allLayoutIndex, allLayoutIndex2)); strictEqual(label, 'All Layouts'); }); @@ -159,7 +168,7 @@ export const layoutListPageTests = async (url, page, timeout = 5000, testParent) await testParent.test('should remove official layouts from official folder when made unofficial', async () => { const buttonPath = cardOfficialButtonPath(cardPath(myLayoutIndex, 1)); - const officialLayoutCardPath = cardPath(officialLayoutIndex, 1); + const officialLayoutCardPath = cardPath(officialLayoutIndex - 1, 1); await page.click(buttonPath); await delay(100); // Making a layout official takes a bit. @@ -169,10 +178,61 @@ export const layoutListPageTests = async (url, page, timeout = 5000, testParent) strictEqual(officialLayoutCard, true, 'The official layout folder should have had a card added in previous test'); }); + await testParent.test('should have a folder with one card after object path filtering', async () => { + const preFilterCardCount = await page.evaluate(() => document.querySelectorAll('.card').length); + strictEqual(preFilterCardCount, 2); + await page.locator('#openFilterToggle').click(); + await delay(100); + await page.locator(filterObjectPath).fill('qc/MCH/QO/'); + await page.locator('#openFilterToggle').click(); + await delay(100); + const postFilterCardCount = await page.evaluate(() => document.querySelectorAll('.card').length); + strictEqual(postFilterCardCount, 1); + }); + + await testParent.test('should show the active filter name', async () => { + // reset page, thus reset filter/search. + await page.goto(`${url}${LAYOUT_LIST_PAGE_PARAM}`, { waitUntil: 'networkidle0' }); + await delay(100); + const preFilterText = await page.evaluate(() => document.querySelector('div.mh1').textContent.trim()); + strictEqual(preFilterText, ''); + await page.locator('#openFilterToggle').click(); + await delay(100); + await page.locator(filterObjectPath).fill('TPC'); + await page.locator('#openFilterToggle').click(); + await delay(100); + const postFilterText = await page.evaluate(() => document.querySelector('div.mh1').textContent.trim()); + strictEqual(postFilterText, 'Active filters: Object path.'); + }); + + await testParent.test('should have a folder with 1 card after object path filtering + regular search', async () => { + // reset page, thus reset filter/search. + await page.goto(`${url}${LAYOUT_LIST_PAGE_PARAM}`, { waitUntil: 'networkidle0' }); + await delay(100); + await page.locator('div.m2:nth-child(3) > div:nth-child(1)').click(); + await delay(100); + const preFilterCardCount = await page.evaluate(() => document.querySelectorAll('.card').length); + strictEqual(preFilterCardCount, 5); + await page.locator('#openFilterToggle').click(); + await delay(100); + await page.locator(filterObjectPath).fill('object'); + await page.locator('#openFilterToggle').click(); + await delay(100); + let postFilterCardCount = await page.evaluate(() => document.querySelectorAll('.card').length); + strictEqual(postFilterCardCount, 3); + await page.locator(filterPath).fill('pdpBeamType'); + await delay(100); + postFilterCardCount = await page.evaluate(() => document.querySelectorAll('.card').length); + strictEqual(postFilterCardCount, 1); + }); + await testParent.test('should have a folder with one card after filtering', async () => { + // reset page, thus reset filter/search. + await page.goto(`${url}${LAYOUT_LIST_PAGE_PARAM}`, { waitUntil: 'networkidle0' }); + await delay(100); const preFilterCardCount = await page.evaluate(() => document.querySelectorAll('.card').length); strictEqual(preFilterCardCount, 2); - await page.locator('.form-control').fill('a'); + await page.locator(filterPath).fill('a'); await delay(100); const postFilterCardCount = await page.evaluate(() => document.querySelectorAll('.card').length); From 1ce1eaf406351024eecf371e59dd9d97f863e84e Mon Sep 17 00:00:00 2001 From: George Raduta Date: Wed, 24 Sep 2025 18:24:46 +0200 Subject: [PATCH 54/77] [OGUI-329] Add Kafka from ECS Syncronizer in QCG (#3068) * Adds AliEcsSyncronizer in QCG to consume Kafka Events from ECS as proto objects * Add internal EventEmitter to update ongoing runs stored by QCG * Adds `kafkajs` as dependency --- .../common/library/enums/emitterKeys.enum.js | 20 +++++ .../common/library/enums/transition.enum.js | 23 ++++++ QualityControl/config-default.js | 9 ++- QualityControl/docs/Configuration.md | 15 +++- QualityControl/index.js | 3 +- QualityControl/lib/QCModel.js | 31 +++++++- QualityControl/lib/api.js | 4 +- .../lib/dtos/KafkaConfigurationDto.js | 58 ++++++++++++++ QualityControl/lib/services/RunModeService.js | 38 +++++++++ .../services/external/AliEcsSynchronizer.js | 78 +++++++++++++++++++ QualityControl/lib/utils/environment.js | 17 ++++ QualityControl/package-lock.json | 1 + QualityControl/package.json | 1 + .../lib/services/BookkeepingService.test.js | 2 +- .../test/lib/services/RunModeService.test.js | 44 ++++++++++- .../external/AliEcsSynchronizer.test.js | 61 +++++++++++++++ QualityControl/test/test-index.js | 4 +- QualityControl/test/testUtils/delay.js | 19 +++++ 18 files changed, 417 insertions(+), 11 deletions(-) create mode 100644 QualityControl/common/library/enums/emitterKeys.enum.js create mode 100644 QualityControl/common/library/enums/transition.enum.js create mode 100644 QualityControl/lib/dtos/KafkaConfigurationDto.js create mode 100644 QualityControl/lib/services/external/AliEcsSynchronizer.js create mode 100644 QualityControl/lib/utils/environment.js create mode 100644 QualityControl/test/lib/services/external/AliEcsSynchronizer.test.js diff --git a/QualityControl/common/library/enums/emitterKeys.enum.js b/QualityControl/common/library/enums/emitterKeys.enum.js new file mode 100644 index 000000000..4b3b7a612 --- /dev/null +++ b/QualityControl/common/library/enums/emitterKeys.enum.js @@ -0,0 +1,20 @@ +/** + * @license + * Copyright 2019-2020 CERN and copyright holders of ALICE O2. + * See http://alice-o2.web.cern.ch/copyright for details of the copyright holders. + * All rights not expressly granted are reserved. + * + * This software is distributed under the terms of the GNU General Public + * License v3 (GPL Version 3), copied verbatim in the file "COPYING". + * + * In applying this license CERN does not waive the privileges and immunities + * granted to it by virtue of its status as an Intergovernmental Organization + * or submit itself to any jurisdiction. + */ + +/** + * Keys that are used define the tracks to follow events on the Node Emitter + */ +export const EmitterKeys = Object.freeze({ + RUN_TRACK: 'RUN_TRACK', +}); diff --git a/QualityControl/common/library/enums/transition.enum.js b/QualityControl/common/library/enums/transition.enum.js new file mode 100644 index 000000000..fe9b41897 --- /dev/null +++ b/QualityControl/common/library/enums/transition.enum.js @@ -0,0 +1,23 @@ +/** + * @license + * Copyright 2019-2020 CERN and copyright holders of ALICE O2. + * See http://alice-o2.web.cern.ch/copyright for details of the copyright holders. + * All rights not expressly granted are reserved. + * + * This software is distributed under the terms of the GNU General Public + * License v3 (GPL Version 3), copied verbatim in the file "COPYING". + * + * In applying this license CERN does not waive the privileges and immunities + * granted to it by virtue of its status as an Intergovernmental Organization + * or submit itself to any jurisdiction. + */ + +/** + * Enumeration for different types of transitions + * @enum {string} + * @readonly + */ +export const Transition = Object.freeze({ + START_ACTIVITY: 'START_ACTIVITY', + STOP_ACTIVITY: 'STOP_ACTIVITY', +}); diff --git a/QualityControl/config-default.js b/QualityControl/config-default.js index f6127eef1..8d635505c 100644 --- a/QualityControl/config-default.js +++ b/QualityControl/config-default.js @@ -56,7 +56,14 @@ export const config = { runTypesRefreshInterval: 15000, runStatusRefreshInterval: 30000, }, - + kafka: { + enabled: true, + clientId: 'qcg-client-local', + consumerGroups: { + QCG_RUN: 'qcg-run-local' + }, + brokers: ['localhost:9092'], + }, /* * Absolute path where to save layouts, default = root of this app diff --git a/QualityControl/docs/Configuration.md b/QualityControl/docs/Configuration.md index eca0a7600..9d00c16b1 100644 --- a/QualityControl/docs/Configuration.md +++ b/QualityControl/docs/Configuration.md @@ -58,7 +58,20 @@ bookkeeping: { }, ``` - +### KafkaJS +QCG provides live updates with respect to the ongoing runs in the configured environment. This is achieved via Kafka and [QCG Run Mode](./Features.md#runs-mode) +The following object should be used as configuration template if use of Kafka is desired: + +```js + kafka: { + enabled: false, // if kafka should be used in QCG startup + clientId: 'qcg-client-local', + consumerGroups: { + QCG_RUN: 'qcg-run-local' + }, + brokers: ['localhost:9092'], + }, +``` ### QC Environment Configuration In the qc section, you can define whether QCG should be started as part of a Quality Control (QC) integrated environment. diff --git a/QualityControl/index.js b/QualityControl/index.js index 64cf6f68e..ab76e8291 100644 --- a/QualityControl/index.js +++ b/QualityControl/index.js @@ -42,6 +42,7 @@ http.addStaticPath(path.join(__dirname, 'common')); http.addStaticPath(path.join(__dirname, 'public')); import { createRequire } from 'module'; +import { isRunningInTest } from './lib/utils/environment.js'; const require = createRequire(import.meta.url); const pathName = require.resolve('jsroot'); @@ -49,7 +50,7 @@ http.addStaticPath(path.join(pathName, '../..'), 'jsroot'); const ws = new WebSocket(http); -if (process.env.NODE_ENV === 'test') { +if (isRunningInTest) { // Initialize nock for CCDB and Bookkeeping only if we are in test environment const { initializeNockForCcdb } = await import('./test/setup/testSetupForCcdb.js'); const { initializeNockForBkp } = await import('./test/setup/testSetupForBkp.js'); diff --git a/QualityControl/lib/QCModel.js b/QualityControl/lib/QCModel.js index 1a0390072..61d0ee6b2 100644 --- a/QualityControl/lib/QCModel.js +++ b/QualityControl/lib/QCModel.js @@ -15,8 +15,11 @@ import { fileURLToPath } from 'url'; import { dirname } from 'path'; import { readFileSync } from 'fs'; +import { EventEmitter } from 'events'; +import { LogManager } from '@aliceo2/web-ui'; import { openFile, toJSON } from 'jsroot'; +import { Kafka, logLevel } from 'kafkajs'; import { CcdbService } from './services/ccdb/CcdbService.js'; import { IntervalsService } from './services/Intervals.service.js'; @@ -25,6 +28,7 @@ import { JsonFileService } from './services/JsonFileService.js'; import { QcObjectService } from './services/QcObject.service.js'; import { FilterService } from './services/FilterService.js'; import { BookkeepingService } from './services/BookkeepingService.js'; +import { AliEcsSynchronizer } from './services/external/AliEcsSynchronizer.js'; import { LayoutController } from './controllers/LayoutController.js'; import { StatusController } from './controllers/StatusController.js'; @@ -44,12 +48,17 @@ import { objectsGetValidationMiddlewareFactory } from './middleware/objects/obje import { objectGetContentsValidationMiddlewareFactory } from './middleware/objects/objectGetContentsValidationMiddlewareFactory.js'; import { RunModeService } from './services/RunModeService.js'; +import { KafkaConfigDto } from './dtos/KafkaConfigurationDto.js'; + +const LOG_FACILITY = `${process.env.npm_config_log_label ?? 'qcg'}/model-setup`; /** * Model initialization for the QCG application * @returns {Promise} Multiple services and controllers that are to be used by the QCG application */ -export const setupQcModel = () => { +export const setupQcModel = async () => { + const logger = LogManager.getLogger(LOG_FACILITY); + const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); const packageJSON = JSON.parse(readFileSync(`${__dirname}/../package.json`)); @@ -59,6 +68,24 @@ export const setupQcModel = () => { initDatabase(new SequelizeDatabase(config?.database || {})); } + const eventEmitter = new EventEmitter(); + if (config?.kafka?.enabled) { + try { + const validConfig = await KafkaConfigDto.validateAsync(config.kafka); + const { clientId, brokers, consumerGroups } = validConfig; + const kafkaClient = new Kafka({ + clientId, + brokers, + retry: { retries: Infinity }, + logLevel: logLevel.NOTHING, + }); + const aliEcsSynchronizer = new AliEcsSynchronizer(kafkaClient, consumerGroups, eventEmitter); + aliEcsSynchronizer.start(); + } catch (error) { + logger.errorMessage(`Kafka initialization/connection failed: ${error.message}`); + } + } + const layoutRepository = new LayoutRepository(jsonFileService); const userRepository = new UserRepository(jsonFileService); const chartRepository = new ChartRepository(jsonFileService); @@ -79,7 +106,7 @@ export const setupQcModel = () => { const bookkeepingService = new BookkeepingService(config.bookkeeping); const filterService = new FilterService(bookkeepingService, config); - const runModeService = new RunModeService(config.bookkeeping, bookkeepingService, ccdbService); + const runModeService = new RunModeService(config.bookkeeping, bookkeepingService, ccdbService, eventEmitter); const objectController = new ObjectController(qcObjectService, runModeService); const filterController = new FilterController(filterService); diff --git a/QualityControl/lib/api.js b/QualityControl/lib/api.js index 541b3137d..d7184bd64 100644 --- a/QualityControl/lib/api.js +++ b/QualityControl/lib/api.js @@ -28,7 +28,7 @@ import { runModeMiddleware } from './middleware/filters/runMode.middleware.js'; * @param {WebSocket} ws - web-ui websocket server implementation * @returns {void} */ -export const setup = (http, ws) => { +export const setup = async (http, ws) => { /** * @type {{ * layoutController: import('./controllers/LayoutController.js').LayoutController, @@ -51,7 +51,7 @@ export const setup = (http, ws) => { objectGetByIdValidation, objectsGetValidation, objectGetContentsValidation, - } = setupQcModel(); + } = await setupQcModel(); statusService.ws = ws; http.get('/object/:id', objectGetByIdValidation, objectController.getObjectById.bind(objectController)); diff --git a/QualityControl/lib/dtos/KafkaConfigurationDto.js b/QualityControl/lib/dtos/KafkaConfigurationDto.js new file mode 100644 index 000000000..25ff77b8c --- /dev/null +++ b/QualityControl/lib/dtos/KafkaConfigurationDto.js @@ -0,0 +1,58 @@ +/** + * @license + * Copyright 2019-2020 CERN and copyright holders of ALICE O2. + * See http://alice-o2.web.cern.ch/copyright for details of the copyright holders. + * All rights not expressly granted are reserved. + * + * This software is distributed under the terms of the GNU General Public + * License v3 (GPL Version 3), copied verbatim in the file "COPYING". + * + * In applying this license CERN does not waive the privileges and immunities + * granted to it by virtue of its status as an Intergovernmental Organization + * or submit itself to any jurisdiction. + */ + +import Joi from 'joi'; +import { isRunningInProduction } from '../utils/environment.js'; + +/** + * @typedef {KafkaConfiguration} + * @param {boolean} enabled - if kafka should be used in current deployment + * @param {string} clientId - ID to be used as client and not qc-gui + * @param {Map} consumerGroups - topics to be followed + * @param {string[]} brokers - brokers to connect to + */ + +/** + * Function for validating the Kafka configuration + * @returns {KafkaConfiguration} - validated kafka configuration to be used + * @throws {InvalidInputError} + */ +export const KafkaConfigDto = Joi.object({ + enabled: Joi.boolean().default(false), + clientId: Joi.string() + .custom((value, helpers) => { + if (isRunningInProduction) { + return value; + } + if (value === 'qc-gui') { + return helpers.message('clientId "qc-gui" is not allowed outside PRODUCTION'); + } + return value; + }, 'kafka clientId validation') + .default('qcg-client-local'), + consumerGroups: Joi.object() + .custom((obj, helpers) => { + if (isRunningInProduction) { + return obj; + } + for (const [key, value] of Object.entries(obj)) { + if (key === 'qcg-run' || value === 'qcg-run') { + return helpers.message('No key or value can be qcg-run unless in PRODUCTION'); + } + } + return obj; + }, 'kafka consumerGroups validation') + .default({ QCG_RUN: 'qcg-run-local' }), + brokers: Joi.array().items(Joi.string()), +}); diff --git a/QualityControl/lib/services/RunModeService.js b/QualityControl/lib/services/RunModeService.js index 354dc91d0..7247326cd 100644 --- a/QualityControl/lib/services/RunModeService.js +++ b/QualityControl/lib/services/RunModeService.js @@ -13,6 +13,8 @@ */ import { LogManager } from '@aliceo2/web-ui'; +import { EmitterKeys } from '../../common/library/enums/emitterKeys.enum.js'; +import { Transition } from '../../common/library/enums/transition.enum.js'; import { RunStatus } from '../../common/library/runStatus.enum.js'; import { parseObjects } from '../../common/library/qcObject/utils.js'; import QCObjectDto from '../dtos/QCObjectDto.js'; @@ -26,14 +28,17 @@ export class RunModeService { * @param {object} config - Configuration defined as `bookkeeping` in the config file. * @param {BookkeepingService} bookkeepingService - Used to check the status of a run. * @param {CcdbService} dataService - Used to fetch data from the CCDB. + * @param {EventEmitter} eventEmitter - Event emitter to be used to emit events when new data is available */ constructor( config, bookkeepingService, dataService, + eventEmitter, ) { this._bookkeepingService = bookkeepingService; this._dataService = dataService; + this._eventEmitter = eventEmitter; this._ongoingRuns = new Map(); this._lastRunsRefresh = 0; @@ -44,6 +49,7 @@ export class RunModeService { } this._logger = LogManager.getLogger(`${process.env.npm_config_log_label ?? 'qcg'}/run-mode-service`); + this._listenToEvents(); } /** @@ -98,6 +104,38 @@ export class RunModeService { this._lastOngoingRunsRefresh = Date.now(); } + /** + * Listens to events emitted by the event emitter and handles them accordingly. + * @returns {void} + */ + _listenToEvents() { + this._eventEmitter.on(EmitterKeys.RUN_TRACK, (runEvent) => this._onRunTrackEvent(runEvent)); + } + + /** + * Handles run track events emitted by the event emitter. + * Updates the ongoing runs cache based on the transition type. + * @param {object} runEvent - Object containing runNumber and transition type. + * @param {number} runEvent.runNumber - The run number associated with the event. + * @param {string} runEvent.transition - The transition type (e.g., 'START_ACTIVITY', 'STOP_ACTIVITY'). + * @returns {Promise} + */ + async _onRunTrackEvent({ runNumber, transition }) { + if (transition === Transition.START_ACTIVITY) { + let rawPaths = []; + try { + rawPaths = await this._dataService.getObjectsLatestVersionList({ + filters: { RunNumber: runNumber }, + }); + } catch (error) { + this._logger.errorMessage(`Error fetching initial paths for run ${runNumber}: ${error.message || error}`); + } + this._ongoingRuns.set(runNumber, rawPaths); + } else if (transition === Transition.STOP_ACTIVITY) { + this._ongoingRuns.delete(runNumber); + } + } + /** * Returns the last time the ongoing runs cache was refreshed. * @returns {number} - Timestamp of the last refresh. (ms) diff --git a/QualityControl/lib/services/external/AliEcsSynchronizer.js b/QualityControl/lib/services/external/AliEcsSynchronizer.js new file mode 100644 index 000000000..bb2b0d902 --- /dev/null +++ b/QualityControl/lib/services/external/AliEcsSynchronizer.js @@ -0,0 +1,78 @@ +/** + * @license + * Copyright CERN and copyright holders of ALICE O2. This software is + * distributed under the terms of the GNU General Public License v3 (GPL + * Version 3), copied verbatim in the file "COPYING". + * + * See http://alice-o2.web.cern.ch/license for full licensing information. + * + * In applying this license CERN does not waive the privileges and immunities + * granted to it by virtue of its status as an Intergovernmental Organization + * or submit itself to any jurisdiction. + */ + +import { AliEcsEventMessagesConsumer, LogManager } from '@aliceo2/web-ui'; +import { EmitterKeys } from './../../../common/library/enums/emitterKeys.enum.js'; + +const LOG_FACILITY = `${process.env.npm_config_log_label ?? 'qcg'}/ecs-synchronizer`; +const RUN_TOPICS = ['aliecs.run']; + +/** + * Service for processing events sent via Kafka from AliECS with proto objects + */ +export class AliEcsSynchronizer { + /** + * Constructor + * @param {import('kafkajs').Kafka} kafkaClient - configured kafka client + * @param {KafkaConfiguration.consumerGroups} consumerGroups - consumer groups to be used for various topics + * @param {EventEmitter} eventEmitter - event emitter to be used to emit events when new data is available + * @param {class} ConsumerClass - class to be used for creating the consumer, defaults to AliEcsEventMessagesConsumer + */ + constructor(kafkaClient, consumerGroups, eventEmitter, ConsumerClass = AliEcsEventMessagesConsumer) { + this._logger = LogManager.getLogger(LOG_FACILITY); + this._eventEmitter = eventEmitter; + + this._ecsRunConsumer = new ConsumerClass( + kafkaClient, + consumerGroups.QCG_RUN, + RUN_TOPICS, + ); + this._ecsRunConsumer.onMessageReceived(this._onRunMessage.bind(this)); + } + + /** + * Start the synchronization process and listen to events from various topics via their consumers + * @returns {void} + */ + start() { + this._logger.infoMessage('Starting to consume AliECS messages for topics:'); + this._ecsRunConsumer + .start() + .catch((error) => + this._logger.errorMessage(`Error when starting ECS run consumer: ${error.message}\n${error.stack}`)); + } + + /** + * Callback for when a message is received on the run topic + * @param {events.proto.Event} eventMessage - message received on run topic + * @returns {void} + */ + async _onRunMessage(eventMessage) { + const { runEvent, timestamp } = eventMessage; + if (!runEvent) { + this._logger.warnMessage('Received run message on run topic without runEvent field'); + return; + } if (!runEvent.runNumber) { + this._logger.warnMessage('Received run message on run topic without runEvent.runNumber field'); + } else if (!runEvent.transition) { + this._logger.warnMessage('Received run message on run topic without runEvent.transition field'); + } else { + const { runNumber, transition } = runEvent; + this._eventEmitter.emit(EmitterKeys.RUN_TRACK, { + runNumber, + transition, + timestamp: timestamp.toNumber(), + }); + } + } +} diff --git a/QualityControl/lib/utils/environment.js b/QualityControl/lib/utils/environment.js new file mode 100644 index 000000000..1d447ac27 --- /dev/null +++ b/QualityControl/lib/utils/environment.js @@ -0,0 +1,17 @@ +/** + * @license + * Copyright 2019-2020 CERN and copyright holders of ALICE O2. + * See http://alice-o2.web.cern.ch/copyright for details of the copyright holders. + * All rights not expressly granted are reserved. + * + * This software is distributed under the terms of the GNU General Public + * License v3 (GPL Version 3), copied verbatim in the file "COPYING". + * + * In applying this license CERN does not waive the privileges and immunities + * granted to it by virtue of its status as an Intergovernmental Organization + * or submit itself to any jurisdiction. + */ + +export const isRunningInProduction = process.env?.NODE_ENV === 'PRODUCTION' || process.env?.NODE_ENV === 'production'; +export const isRunningInTest = process.env?.NODE_ENV === 'test' || process.env?.NODE_ENV === 'TEST'; +export const isRunningInDevelopment = !isRunningInProduction && !isRunningInTest; diff --git a/QualityControl/package-lock.json b/QualityControl/package-lock.json index 4b7c94e02..5848e98bb 100644 --- a/QualityControl/package-lock.json +++ b/QualityControl/package-lock.json @@ -17,6 +17,7 @@ "@aliceo2/web-ui": "2.8.4", "joi": "18.0.0", "jsroot": "7.9.0", + "kafkajs": "^2.2.4", "mariadb": "^3.4.1", "sequelize": "^6.37.7", "umzug": "^3.8.2" diff --git a/QualityControl/package.json b/QualityControl/package.json index 9ca849c1a..d49685d46 100644 --- a/QualityControl/package.json +++ b/QualityControl/package.json @@ -41,6 +41,7 @@ "@aliceo2/web-ui": "2.8.4", "joi": "18.0.0", "jsroot": "7.9.0", + "kafkajs": "^2.2.4", "mariadb": "^3.4.1", "sequelize": "^6.37.7", "umzug": "^3.8.2" diff --git a/QualityControl/test/lib/services/BookkeepingService.test.js b/QualityControl/test/lib/services/BookkeepingService.test.js index 755d1c457..972a18724 100644 --- a/QualityControl/test/lib/services/BookkeepingService.test.js +++ b/QualityControl/test/lib/services/BookkeepingService.test.js @@ -15,9 +15,9 @@ import { strictEqual, deepStrictEqual, ok } from 'node:assert'; import { suite, test, before, beforeEach, afterEach } from 'node:test'; import nock from 'nock'; +import { stub, restore } from 'sinon'; import { BookkeepingService } from '../../../lib/services/BookkeepingService.js'; -import { stub, restore } from 'sinon'; import { RunStatus } from '../../../common/library/runStatus.enum.js'; /** diff --git a/QualityControl/test/lib/services/RunModeService.test.js b/QualityControl/test/lib/services/RunModeService.test.js index 940378365..02b4723cd 100644 --- a/QualityControl/test/lib/services/RunModeService.test.js +++ b/QualityControl/test/lib/services/RunModeService.test.js @@ -13,16 +13,21 @@ */ import { suite, test, beforeEach } from 'node:test'; -import { strictEqual, deepStrictEqual } from 'assert'; +import { strictEqual, deepStrictEqual, ok } from 'assert'; +import { EventEmitter } from 'events'; import sinon from 'sinon'; import { RunModeService } from '../../../lib/services/RunModeService.js'; import { RunStatus } from '../../../common/library/runStatus.enum.js'; +import { EmitterKeys } from '../../../common/library/enums/emitterKeys.enum.js'; +import { Transition } from '../../../common/library/enums/transition.enum.js'; +import { delayAndCheck } from '../../testUtils/delay.js'; export const runModeServiceTestSuite = async () => { suite('RunModeService', () => { let runModeService = undefined; let bookkeepingService = undefined; let dataService = undefined; + const eventEmitter = new EventEmitter(); beforeEach(() => { bookkeepingService = { @@ -34,7 +39,7 @@ export const runModeServiceTestSuite = async () => { }; const config = { refreshInterval: 60000 }; - runModeService = new RunModeService(config, bookkeepingService, dataService); + runModeService = new RunModeService(config, bookkeepingService, dataService, eventEmitter); }); suite('retrievePathsAndSetRunStatus', () => { test('should retrieve paths and cache them if run is ongoing', async () => { @@ -114,5 +119,40 @@ export const runModeServiceTestSuite = async () => { strictEqual(runModeService.refreshInterval, 60000); }); }); + + suite('_onRunTrackEvent - test suite', () => { + test('should correctly parse event to RUN_TRACK and update ongoing runs map', async () => { + const runEvent = { runNumber: 1234, transition: 'START_ACTIVITY' }; + runModeService._dataService.getObjectsLatestVersionList = sinon.stub().resolves([{ path: '/path/from/event' }]); + + await runModeService._onRunTrackEvent(runEvent); + + strictEqual(runModeService._ongoingRuns.has(runEvent.runNumber), true); + ok(runModeService._dataService.getObjectsLatestVersionList.calledOnceWith({ + filters: { RunNumber: runEvent.runNumber }, + })); + }); + + test('should listen to events on RUN_TRACK and update ongoing runs map', async () => { + const runEvent = { runNumber: 1234, transition: Transition.START_ACTIVITY }; + runModeService._dataService.getObjectsLatestVersionList = sinon.stub().resolves([{ path: '/path/from/event' }]); + + eventEmitter.emit(EmitterKeys.RUN_TRACK, runEvent); + await delayAndCheck(() => runModeService._ongoingRuns.has(runEvent.runNumber), 500, 10); + ok(runModeService._ongoingRuns.has(runEvent.runNumber)); + ok(runModeService._dataService.getObjectsLatestVersionList.calledOnceWith({ + filters: { RunNumber: runEvent.runNumber }, + })); + }); + + test('should remove run from ongoing runs map on STOP_ACTIVITY event', async () => { + const runEventStop = { runNumber: 5678, transition: Transition.STOP_ACTIVITY }; + runModeService._ongoingRuns.set(runEventStop.runNumber, [{ path: '/some/path' }]); + + eventEmitter.emit(EmitterKeys.RUN_TRACK, runEventStop); + await delayAndCheck(() => !runModeService._ongoingRuns.has(runEventStop.runNumber), 500, 10); + ok(!runModeService._ongoingRuns.has(runEventStop.runNumber)); + }); + }); }); }; diff --git a/QualityControl/test/lib/services/external/AliEcsSynchronizer.test.js b/QualityControl/test/lib/services/external/AliEcsSynchronizer.test.js new file mode 100644 index 000000000..51ae5b515 --- /dev/null +++ b/QualityControl/test/lib/services/external/AliEcsSynchronizer.test.js @@ -0,0 +1,61 @@ +/** + * @license + * Copyright 2019-2020 CERN and copyright holders of ALICE O2. + * See http://alice-o2.web.cern.ch/copyright for details of the copyright holders. + * All rights not expressly granted are reserved. + * + * This software is distributed under the terms of the GNU General Public + * License v3 (GPL Version 3), copied verbatim in the file 'COPYING'. + * + * In applying this license CERN does not waive the privileges and immunities + * granted to it by virtue of its status as an Intergovernmental Organization + * or submit itself to any jurisdiction. + */ + +import { ok, deepStrictEqual } from 'node:assert'; +import { test, beforeEach, afterEach } from 'node:test'; +import { stub, restore } from 'sinon'; +import { AliEcsSynchronizer } from '../../../../lib/services/external/AliEcsSynchronizer.js'; +import { Transition } from '../../../../common/library/enums/transition.enum.js'; +import { EmitterKeys } from '../../../../common/library/enums/emitterKeys.enum.js'; + +export const aliecsSynchronizerTestSuite = async () => { + let aliecsSynchronizer = null; + const ConsumerStub = stub().returns({ onMessageReceived: stub(), start: stub().resolves() }); + const eventEmitterMock = { + emit: stub().returns(), + }; + + beforeEach(() => { + aliecsSynchronizer = new AliEcsSynchronizer(undefined, { QCG_RUN: 'QCG_RUN' }, eventEmitterMock, ConsumerStub); + }); + + afterEach(() => { + eventEmitterMock.emit.resetHistory(); + ConsumerStub.resetHistory(); + restore(); + }); + + test('should initialize the aliecs syncronizer with a passed emitter', () => { + deepStrictEqual(aliecsSynchronizer._eventEmitter, eventEmitterMock); + }); + + test('should warn if a run message is received without runEvent field', () => { + const loggerWarnStub = stub(aliecsSynchronizer._logger, 'warnMessage'); + aliecsSynchronizer._onRunMessage({ timestamp: { toNumber: () => Date.now() } }); + ok(loggerWarnStub.calledOnce); + deepStrictEqual(loggerWarnStub.firstCall.args[0], 'Received run message on run topic without runEvent field'); + }); + + test('should emit a run track event when a valid run message is received', () => { + const runNumber = 123; + const transition = Transition.START_ACTIVITY; + const timestamp = { toNumber: () => Date.now() } ; + aliecsSynchronizer._onRunMessage({ runEvent: { runNumber, transition }, timestamp }); + ok(eventEmitterMock.emit.called); + deepStrictEqual(eventEmitterMock.emit.firstCall.args[0], EmitterKeys.RUN_TRACK); + deepStrictEqual(eventEmitterMock.emit.firstCall.args[1], { + runNumber, transition, timestamp: timestamp.toNumber() + }); + }); +}; diff --git a/QualityControl/test/test-index.js b/QualityControl/test/test-index.js index be896ef43..964518733 100644 --- a/QualityControl/test/test-index.js +++ b/QualityControl/test/test-index.js @@ -86,6 +86,7 @@ import { qcObjectServiceTestSuite } from './lib/services/QcObjectService.test.js import { runModeServiceTestSuite } from './lib/services/RunModeService.test.js'; import { apiGetRunStatusTests } from './api/filters/api-get-run-status.test.js'; import { runModeTests } from './public/features/runMode.test.js'; +import { aliecsSynchronizerTestSuite } from './lib/services/external/AliEcsSynchronizer.test.js'; const FRONT_END_PER_TEST_TIMEOUT = 5000; // each front-end test is allowed this timeout // remaining tests are based on the number of individual tests in each suite @@ -220,6 +221,8 @@ suite('All Tests - QCG', { timeout: FRONT_END_TIMEOUT + BACK_END_TIMEOUT }, asyn suite('FilterService', async () => await filterServiceTestSuite()); suite('RunModeService - Test Suite', async () => await runModeServiceTestSuite()); suite('QcObjectService - Test Suite', async () => await qcObjectServiceTestSuite()); + suite('BookkeepingServiceTest test suite', async () => await bookkeepingServiceTestSuite()); + suite('AliEcsSynchronizer - Test Suite', async () => await aliecsSynchronizerTestSuite()); }); suite('Middleware - Test Suite', async () => { @@ -229,7 +232,6 @@ suite('All Tests - QCG', { timeout: FRONT_END_TIMEOUT + BACK_END_TIMEOUT }, asyn suite('StatusComponentMiddleware test suite', async () => statusComponentMiddlewareTest()); suite('RunModeMiddleware test suite', async () => runModeMiddlewareTest()); suite('RunStatusFilterMiddleware test suite', async () => runStatusFilterMiddlewareTest()); - suite('BookkeepingServiceTest test suite', async () => await bookkeepingServiceTestSuite()); suite('ObjectsGetValidationMiddleware test suite', async () => objectsGetValidationMiddlewareTest()); suite('ObjectGetContentsValidationMiddleware test suite', async () => objectGetContentsValidationMiddlewareTest()); diff --git a/QualityControl/test/testUtils/delay.js b/QualityControl/test/testUtils/delay.js index 7952318cf..23b21c314 100644 --- a/QualityControl/test/testUtils/delay.js +++ b/QualityControl/test/testUtils/delay.js @@ -17,3 +17,22 @@ * @returns {Promise} */ export const delay = (ms = 500) => new Promise((resolve) => setTimeout(() => resolve(), ms)); + +/** + * Delay until a condition is met or a timeout occurs + * @param {Function} conditionFunc - Function that returns a boolean indicating if the condition is met + * @param {number} ms - Time in milliseconds to wait between checks + * @param {number} maxRetries - Maximum number of retries before giving up + * @returns {Promise} + */ +export const delayAndCheck = async (conditionFunc, ms = 500, maxRetries = 10) => { + let retries = 0; + while (retries < maxRetries) { + const isConditionMet = await conditionFunc(); + if (isConditionMet) { + return; + } + await delay(ms); + retries += 1; + } +}; From 4640a508c327c9e5a781e9cb7aac217a634f2b5a Mon Sep 17 00:00:00 2001 From: Alejandro Mariscal Romero <87366244+mariscalromeroalejandro@users.noreply.github.com> Date: Wed, 24 Sep 2025 18:30:41 +0200 Subject: [PATCH 55/77] [OGUI-1768] Run mode: smart refresh for object view(s) (#3067) * This PR adds a new check to the object view page and the object tree visualization. When in run mode with an active run, the view will now refresh only when necessary (specifically, if the ID of the last fetch differs from the currently selected ID) --- QualityControl/public/object/QCObject.js | 33 ++++++++++++++++--- .../pages/objectView/ObjectViewModel.js | 16 +++++---- 2 files changed, 38 insertions(+), 11 deletions(-) diff --git a/QualityControl/public/object/QCObject.js b/QualityControl/public/object/QCObject.js index e004a3181..c72384c75 100644 --- a/QualityControl/public/object/QCObject.js +++ b/QualityControl/public/object/QCObject.js @@ -329,9 +329,10 @@ export default class QCObject extends BaseViewModel { * Set the current selected object by user * Search within `currentList`; * @param {QCObject} object - object to be selected and loaded - * @returns {undefined} + * @param {object} [preloadedData] - optional object data already fetched + * @returns {undefined} */ - async select(object) { + async select(object, preloadedData = null) { let foundObject = this.currentList.find((obj) => obj.name === object.name); if (foundObject && this.list && this.list.length > 0) { @@ -340,7 +341,11 @@ export default class QCObject extends BaseViewModel { this.selected = foundObject || object; setBrowserTabTitle(this.selected.name); - await this.loadObjectByName(this.selected.name); + if (preloadedData) { + this.objects[this.selected.name] = RemoteData.success(preloadedData); + } else { + await this.loadObjectByName(this.selected.name); + } this.notify(); } @@ -549,15 +554,35 @@ export default class QCObject extends BaseViewModel { restoreNodeState(this.tree); } + /** + * Checks if the given object needs to be refreshed by comparing its ID + * @param {object} object - The object to check for refresh. + * @param {string} object.name - The name of the object to look up. + * @param {string|number} object.id - The current ID of the object being validated. + * @returns {Promise} A promise that resolves to `true` if the object should be refreshed + */ + async checkIfRefreshObject(object) { + const fetchFn = async () => + await this.model.services.object.getObjectByName(object.name, undefined, undefined, this); + const validateFn = (result) => + result.isSuccess() && result.payload.id !== object.id; + return this.model.filterModel.refreshCheck(fetchFn, validateFn); + } + /** * Function that reloads the object list with filters applied * @returns {undefined} */ async triggerFilter() { - // don't clear selected object refreshing in run mode if (!this.model.filterModel.isRunModeActivated || !this.model.filterModel.runsModeInterval) { this.selected = null; } + if (this.selected && this.selected.name) { + const { refreshNeeded, data } = await this.checkIfRefreshObject(this.objects[this.selected.name].payload); + if (refreshNeeded && data?.payload) { + this.select({ name: this.selected.name }, data.payload); + } + } this.loadList(); } } diff --git a/QualityControl/public/pages/objectView/ObjectViewModel.js b/QualityControl/public/pages/objectView/ObjectViewModel.js index 950d16760..76b2ca773 100644 --- a/QualityControl/public/pages/objectView/ObjectViewModel.js +++ b/QualityControl/public/pages/objectView/ObjectViewModel.js @@ -51,9 +51,6 @@ export default class ObjectViewModel extends BaseViewModel { * @returns {undefined} */ async init(urlParams) { - this.selected = RemoteData.loading(); - this.notify(); - const { objectName, layoutId, objectId, id, ts = undefined } = urlParams; if (objectName) { this.updateObjectSelection({ objectName }, ts, id); @@ -74,16 +71,21 @@ export default class ObjectViewModel extends BaseViewModel { async updateObjectSelection(object, validFrom = undefined, id = '') { const { objectName = undefined, objectId = undefined } = object; const { params } = this.model.router; - - if (!objectName && !objectId && !params.objectId && !params.objectName && !this.selected.isSuccess()) { - return; // This will permanently put the page in loading mode. + const { refreshNeeded, data } = await this.model.object.checkIfRefreshObject(this.selected.payload); + if (!refreshNeeded) { + return; } + this._setParameters(objectName, objectId, params); this.selected = RemoteData.loading(); this.notify(); + if (!objectName && !objectId && !params.objectId && !params.objectName && !this.selected.isSuccess()) { + return; // This will permanently put the page in loading mode. + } + let currentParams = '?page=objectView'; - this.selected = params.objectName + this.selected = data ?? params.objectName ? await this.model.services.object.getObjectByName(params.objectName, id, validFrom, this) : await this.model.services.object.getObjectById(params.objectId, id, validFrom, this); From d91800d42e10d1655e5f0643cd6faa32975d4442 Mon Sep 17 00:00:00 2001 From: Alejandro Mariscal Romero <87366244+mariscalromeroalejandro@users.noreply.github.com> Date: Wed, 24 Sep 2025 18:39:06 +0200 Subject: [PATCH 56/77] [OGUI-1722] Runs mode layout smart refresh (#3078) This PR removes the unnecessary objects refresh in layout view by checking their ids and comparing them with the previous one loaded (in run mode) when a run is ongoing. It also removes the property of run status of being RemoteData, so that we avoid an unnecessary blink when it changes. --- .../common/filters/model/FilterModel.js | 43 +++++++------------ .../common/filters/runMode/runStatusPanel.js | 36 ++++++---------- QualityControl/public/common/header.js | 2 +- QualityControl/public/layout/Layout.js | 4 ++ QualityControl/public/object/QCObject.js | 30 +++++++++---- .../public/services/Filter.service.js | 3 +- 6 files changed, 55 insertions(+), 63 deletions(-) diff --git a/QualityControl/public/common/filters/model/FilterModel.js b/QualityControl/public/common/filters/model/FilterModel.js index 35a4d5411..edd7e7c6d 100644 --- a/QualityControl/public/common/filters/model/FilterModel.js +++ b/QualityControl/public/common/filters/model/FilterModel.js @@ -12,7 +12,7 @@ * or submit itself to any jurisdiction. */ -import { Observable, RemoteData } from '/js/src/index.js'; +import { Observable } from '/js/src/index.js'; import { buildQueryParametersString } from '../../buildQueryParametersString.js'; import FilterService from '../../../services/Filter.service.js'; import { RunStatus } from '../../../library/runStatus.enum.js'; @@ -36,7 +36,7 @@ export default class FilterModel extends Observable { this._runsModeInterval = null; this._runNumber = null; - this._runStatus = RemoteData.notAsked(); + this._runStatus = null; this._isRunModeActivated = false; this._lastRefresh = null; @@ -116,8 +116,6 @@ export default class FilterModel extends Observable { this.setFilterToURL(); if (this.isRunModeActivated) { this.runNumber = this._filterMap['RunNumber']; - this.runStatus = RemoteData.loading(); - this.notify(); this.runStatus = await this.filterService.getRunStatus(this.runNumber); this.notify(); this._manageRunsModeInterval(baseViewModel); @@ -195,7 +193,7 @@ export default class FilterModel extends Observable { resetRunsMode() { this.isRunModeActivated = false; this.runNumber = null; - this.runStatus = RemoteData.notAsked(); + this.runStatus = null; this._lastRefresh = null; this.clearRunsModeInterval(); this.notify(); @@ -210,28 +208,22 @@ export default class FilterModel extends Observable { async _manageRunsModeInterval(baseViewModel) { this.clearRunsModeInterval(); const currentRunNumber = this.runNumber; - if (this.runStatus?.payload?.runStatus !== RunStatus.ONGOING) { + if (this.runStatus !== RunStatus.ONGOING) { return; } this._runsModeInterval = setInterval(async () => { if (!baseViewModel) { return; } - this.runStatus = RemoteData.loading(); - this.notify(); this.runStatus = await this.filterService.getRunStatus(currentRunNumber); this.notify(); - this.runStatus.match({ - Success: (res) => { - if (res?.runStatus !== RunStatus.ONGOING) { - this.clearRunsModeInterval(); - } - baseViewModel.triggerFilter(); - this._lastRefresh = Date.now(); - this.notify(); - }, - Other: () => this.clearRunsModeInterval(), - }); + + if (this.runStatus !== RunStatus.ONGOING) { + this.clearRunsModeInterval(); + } + baseViewModel.triggerFilter(); + this._lastRefresh = Date.now(); + this.notify(); }, this.ONGOING_RUN_INTERVAL_MS); } @@ -255,15 +247,9 @@ export default class FilterModel extends Observable { if (!this.isRunModeActivated) { return; } - - this.runStatus.match({ - Success: (res) => { - if (res?.runStatus === RunStatus.ONGOING && !this._runsModeInterval) { - this._manageRunsModeInterval(baseViewModel); - } - }, - Other: () => null, - }); + if (this.runStatus === RunStatus.ONGOING && !this._runsModeInterval) { + this._manageRunsModeInterval(baseViewModel); + } } /** @@ -357,6 +343,7 @@ export default class FilterModel extends Observable { * @param {() => Promise} fetchFn - Async function to fetch the data or object. * @param {(RemoteData) => boolean} validateFn - Validates whether the fetched result means no refresh is needed. * @returns {Promise<{ refreshNeeded: boolean, data: object | null }>} + * a promise with if is needed to refresh and the fetched data (if fetched) */ async refreshCheck(fetchFn, validateFn) { if (this._runsModeInterval) { diff --git a/QualityControl/public/common/filters/runMode/runStatusPanel.js b/QualityControl/public/common/filters/runMode/runStatusPanel.js index cae05611d..d7209a41b 100644 --- a/QualityControl/public/common/filters/runMode/runStatusPanel.js +++ b/QualityControl/public/common/filters/runMode/runStatusPanel.js @@ -43,7 +43,7 @@ export const runStatusPanel = ({ runNumber, runStatus, lastRefresh, refreshRate const lastUpdatePanel = (runStatus) => [ h( - 'span.highlight', + 'span', { id: 'lastUpdate' }, `Last update: ${formatDateTime(lastRefresh)}`, ), @@ -54,28 +54,16 @@ export const runStatusPanel = ({ runNumber, runStatus, lastRefresh, refreshRate ` - As run is ONGOING, will refresh every ${refreshRate / 1000} seconds`, ), ]; + const shouldShowTimestamp = runStatus === RunStatus.ONGOING || runStatus === RunStatus.ENDED; - return runStatus.match({ - Loading: () => - h('.flex-row.g1.items-center.justify-center', [ - runNumberPanel, - statusPanel(null), - ]), - - Success: (res) => { - const runStatus = res?.runStatus; - const shouldShowTimestamp = runStatus === RunStatus.ONGOING || runStatus === RunStatus.ENDED; - return h('.flex-column', [ - h('.flex-row.g1.items-center.justify-center', { id: 'runStatusPanel' }, [ - runNumberPanel, - statusPanel(runStatus), - ]), - shouldShowTimestamp && h( - '.flex-row.g1.items-center.justify-center.f7.gray-darker.text-center', - lastUpdatePanel(runStatus), - ), - ]); - }, - Other: () => null, - }); + return runNumber && runStatus && h('.flex-column', [ + h('.flex-row.g1.items-center.justify-center', { id: 'runStatusPanel' }, [ + runNumberPanel, + statusPanel(runStatus), + ]), + shouldShowTimestamp && h( + '.flex-row.g1.items-center.justify-center.f7.gray-darker.text-center', + lastUpdatePanel(runStatus), + ), + ]); }; diff --git a/QualityControl/public/common/header.js b/QualityControl/public/common/header.js index de022d67f..9e241d0f7 100644 --- a/QualityControl/public/common/header.js +++ b/QualityControl/public/common/header.js @@ -47,7 +47,7 @@ export default (model) => { /** * Shows the page specific header (center and right side) * @param {Model} model - root model of the application - * @returns {{centerCol: vnode, rightCol: vnode} | null} + * @returns {{centerCol: vnode, rightCol: vnode} | null} center column and right column */ const headerSpecific = (model) => { const { filterModel, layout, object, page } = model; diff --git a/QualityControl/public/layout/Layout.js b/QualityControl/public/layout/Layout.js index c6002b646..8a6ed14b1 100644 --- a/QualityControl/public/layout/Layout.js +++ b/QualityControl/public/layout/Layout.js @@ -758,6 +758,10 @@ export default class Layout extends BaseViewModel { * @returns {undefined} */ triggerFilter() { + if (this.model.filterModel.runsModeInterval) { + this.model.object.refreshObjects(this.tab.objects.map((object) => object.name)); + return; + } this.selectTab(this.tabIndex); if (this.editEnabled) { // To re-render the objectTree in edit mode this.listObjects(); diff --git a/QualityControl/public/object/QCObject.js b/QualityControl/public/object/QCObject.js index c72384c75..8050280fc 100644 --- a/QualityControl/public/object/QCObject.js +++ b/QualityControl/public/object/QCObject.js @@ -296,23 +296,35 @@ export default class QCObject extends BaseViewModel { this.notify(); return; } - await Promise.allSettled(objectsName.map(async (objectName) => { - this.objects[objectName] = RemoteData.Loading(); - this.notify(); - this.objects[objectName] = - await this.model.services.object.getObjectByName(objectName, undefined, undefined, this); - this.notify(); - })); + await this.refreshObjects(objectsName); this.objectsRemote = RemoteData.success(); this.notify(); } /** * Refreshes currently displayed objects + * @param {Array.} objectsName - e.g. /FULL/OBJECT/PATH * @returns {undefined} */ - refreshObjects() { - this.loadObjects(Object.keys(this.objects)); + async refreshObjects(objectsName) { + await Promise.allSettled(objectsName.map(async (objectName) => { + let fetchedData = null; + if (this.objects[objectName]?.isSuccess() && this.objects[objectName]?.payload?.name) { + const { refreshNeeded, data } = await this.checkIfRefreshObject(this.objects[objectName].payload); + fetchedData = data; + if (!refreshNeeded) { + return; + } + } + + this.objects[objectName] = RemoteData.Loading(); + this.notify(); + + this.objects[objectName] = + fetchedData ?? await this.model.services.object.getObjectByName(objectName, undefined, undefined, this); + + this.notify(); + })); } /** diff --git a/QualityControl/public/services/Filter.service.js b/QualityControl/public/services/Filter.service.js index e4819273b..bf74437a6 100644 --- a/QualityControl/public/services/Filter.service.js +++ b/QualityControl/public/services/Filter.service.js @@ -13,6 +13,7 @@ */ import { RemoteData } from '/js/src/index.js'; +import { RunStatus } from '../../library/runStatus.enum.js'; /** * Service to get the data to populate the filters @@ -53,7 +54,7 @@ export default class FilterService { async getRunStatus(runNumber) { const parsedRunNumber = parseInt(runNumber, 10); const { result, ok } = await this.loader.get(`/api/filter/run-status/${parsedRunNumber}`); - return this.parseResult(result, ok); + return ok ? result?.runStatus : RunStatus.UNKNOWN; } /** From 2002edd98df19c217c62a6c67cb130ddbed04480 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 24 Sep 2025 18:42:22 +0200 Subject: [PATCH 57/77] Bump vite from 6.3.5 to 6.3.6 in /Tokenization/webapp (#3060) Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 6.3.5 to 6.3.6. - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/v6.3.6/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v6.3.6/packages/vite) --- updated-dependencies: - dependency-name: vite dependency-version: 6.3.6 dependency-type: direct:development ... Signed-off-by: dependabot[bot] --- Tokenization/webapp/package-lock.json | 4974 +++++++++++++++++++++---- Tokenization/webapp/package.json | 2 +- 2 files changed, 4200 insertions(+), 776 deletions(-) diff --git a/Tokenization/webapp/package-lock.json b/Tokenization/webapp/package-lock.json index 1de631491..3efb7f3d1 100644 --- a/Tokenization/webapp/package-lock.json +++ b/Tokenization/webapp/package-lock.json @@ -20,12 +20,21 @@ "react-router": "^7.5.0" }, "devDependencies": { + "@eslint/js": "^9.28.0", "@react-router/dev": "^7.5.0", + "@stylistic/eslint-plugin-js": "^2.10.1", + "@stylistic/eslint-plugin-ts": "^2.10.1", "@types/node": "^20", "@types/react": "^19.0.1", "@types/react-dom": "^19.0.1", + "eslint": "^9.28.0", + "eslint-plugin-jsdoc": "^50.7.1", + "eslint-plugin-react": "^7.37.5", + "eslint-plugin-react-hooks": "^5.0.0", + "globals": "^16.2.0", "typescript": "^5.7.2", - "vite": "^6.0.11", + "typescript-eslint": "^8.34.0", + "vite": "^6.3.6", "vite-tsconfig-paths": "^5.1.4" } }, @@ -579,6 +588,15 @@ } } }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/traverse/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -779,6 +797,23 @@ "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", "license": "MIT" }, + "node_modules/@es-joy/jsdoccomment": { + "version": "0.50.2", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.50.2.tgz", + "integrity": "sha512-YAdE/IJSpwbOTiaURNCKECdAwqrJuFiZhylmesBcIRawtYKnBR2wxPhoIewMg+Yu+QuYvHfJNReWpoxGBKOChA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.6", + "@typescript-eslint/types": "^8.11.0", + "comment-parser": "1.4.1", + "esquery": "^1.6.0", + "jsdoc-type-pratt-parser": "~4.1.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.25.5", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz", @@ -1204,6 +1239,310 @@ "node": ">=18" } }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", + "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/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", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/config-array/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/@eslint/config-helpers": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", + "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", + "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/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", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/eslintrc/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/@eslint/js": { + "version": "9.35.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.35.0.tgz", + "integrity": "sha512-30iXE9whjlILfWobBkNerJo+TXYsgVM5ERQwMcMKCHckHflCmf7wXDAHlARoWnh0s1U72WqlbeyE7iAcCzuCPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", + "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.15.2", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -1483,6 +1822,44 @@ } } }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/@npmcli/git": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.1.0.tgz", @@ -1994,6 +2371,41 @@ "win32" ] }, + "node_modules/@stylistic/eslint-plugin-js": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-js/-/eslint-plugin-js-2.13.0.tgz", + "integrity": "sha512-GPPDK4+fcbsQD58a3abbng2Dx+jBoxM5cnYjBM4T24WFZRZdlNSKvR19TxP8CPevzMOodQ9QVzNeqWvMXzfJRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": ">=8.40.0" + } + }, + "node_modules/@stylistic/eslint-plugin-ts": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-ts/-/eslint-plugin-ts-2.13.0.tgz", + "integrity": "sha512-nooe1oTwz60T4wQhZ+5u0/GAu3ygkKF9vPPZeRn/meG71ntQ0EZXVOKEonluAYl/+CV2T+nN0dknHa4evAW13Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "^8.13.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": ">=8.40.0" + } + }, "node_modules/@types/estree": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", @@ -2001,6 +2413,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/node": { "version": "20.17.50", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.50.tgz", @@ -2056,911 +2475,2882 @@ "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==", + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.44.0.tgz", + "integrity": "sha512-EGDAOGX+uwwekcS0iyxVDmRV9HX6FLSM5kzrAToLTsr9OWCIKG/y3lQheCq18yZ5Xh78rRKJiEpP0ZaCs4ryOQ==", + "dev": true, "license": "MIT", "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.44.0", + "@typescript-eslint/type-utils": "8.44.0", + "@typescript-eslint/utils": "8.44.0", + "@typescript-eslint/visitor-keys": "8.44.0", + "graphemer": "^1.4.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.0" }, "engines": { - "node": ">= 0.6" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.44.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "dev": true, "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "node": ">= 4" } }, - "node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "node_modules/@typescript-eslint/parser": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.44.0.tgz", + "integrity": "sha512-VGMpFQGUQWYT9LfnPcX8ouFojyrZ/2w3K5BucvxL/spdNehccKhB4jUyB1yBCXpr2XFm0jkECxgrpXBW2ipoAw==", "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.44.0", + "@typescript-eslint/types": "8.44.0", + "@typescript-eslint/typescript-estree": "8.44.0", + "@typescript-eslint/visitor-keys": "8.44.0", + "debug": "^4.3.4" + }, "engines": { - "node": ">=12" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "node_modules/@typescript-eslint/parser/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" - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "license": "MIT" + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } }, - "node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "node_modules/@typescript-eslint/parser/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==", + "dev": true, "license": "MIT" }, - "node_modules/babel-dead-code-elimination": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/babel-dead-code-elimination/-/babel-dead-code-elimination-1.0.10.tgz", - "integrity": "sha512-DV5bdJZTzZ0zn0DC24v3jD7Mnidh6xhKa4GfKCbq3sfW8kaWhDdZjP3i81geA8T33tdYqWKw4D3fVv0CwEgKVA==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.44.0.tgz", + "integrity": "sha512-ZeaGNraRsq10GuEohKTo4295Z/SuGcSq2LzfGlqiuEvfArzo/VRrT0ZaJsVPuKZ55lVbNk8U6FcL+ZMH8CoyVA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.23.7", - "@babel/parser": "^7.23.6", - "@babel/traverse": "^7.23.7", - "@babel/types": "^7.23.6" + "@typescript-eslint/tsconfig-utils": "^8.44.0", + "@typescript-eslint/types": "^8.44.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/babel-plugin-macros": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", - "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "node_modules/@typescript-eslint/project-service/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", "dependencies": { - "@babel/runtime": "^7.12.5", - "cosmiconfig": "^7.0.0", - "resolve": "^1.19.0" + "ms": "^2.1.3" }, "engines": { - "node": ">=10", - "npm": ">=6" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "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==", + "node_modules/@typescript-eslint/project-service/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==", "dev": true, "license": "MIT" }, - "node_modules/bignumber.js": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", - "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.44.0.tgz", + "integrity": "sha512-87Jv3E+al8wpD+rIdVJm/ItDBe/Im09zXIjFoipOjr5gHUhJmTzfFLuTJ/nPTMc2Srsroy4IBXwcTCHyRR7KzA==", + "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.44.0", + "@typescript-eslint/visitor-keys": "8.44.0" + }, "engines": { - "node": "*" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.44.0.tgz", + "integrity": "sha512-x5Y0+AuEPqAInc6yd0n5DAcvtoQ/vyaGwuX5HE9n6qAefk1GaedqrLQF8kQGylLUb9pnZyLf+iEiL9fr8APDtQ==", + "dev": true, "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "node_modules/@typescript-eslint/type-utils": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.44.0.tgz", + "integrity": "sha512-9cwsoSxJ8Sak67Be/hD2RNt/fsqmWnNE1iHohG8lxqLSNY8xNfyY7wloo5zpW3Nu9hxVgURevqfcH6vvKCt6yg==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "@typescript-eslint/types": "8.44.0", + "@typescript-eslint/typescript-estree": "8.44.0", + "@typescript-eslint/utils": "8.44.0", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/browserslist": { - "version": "4.24.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.5.tgz", - "integrity": "sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==", + "node_modules/@typescript-eslint/type-utils/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "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": { - "caniuse-lite": "^1.0.30001716", - "electron-to-chromium": "^1.5.149", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.3" - }, - "bin": { - "browserslist": "cli.js" + "ms": "^2.1.3" }, "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", - "license": "BSD-3-Clause" - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "node_modules/@typescript-eslint/type-utils/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==", + "dev": true, "license": "MIT" }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "node_modules/@typescript-eslint/types": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.44.0.tgz", + "integrity": "sha512-ZSl2efn44VsYM0MfDQe68RKzBz75NPgLQXuGypmym6QVOWL5kegTZuZ02xRAT9T+onqvM6T8CdQk0OwYMB6ZvA==", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.44.0.tgz", + "integrity": "sha512-lqNj6SgnGcQZwL4/SBJ3xdPEfcBuhCG8zdcwCPgYcmiPLgokiNDKlbPzCwEwu7m279J/lBYWtDYL+87OEfn8Jw==", "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.44.0", + "@typescript-eslint/tsconfig-utils": "8.44.0", + "@typescript-eslint/types": "8.44.0", + "@typescript-eslint/visitor-keys": "8.44.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, "engines": { - "node": ">=8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" } }, - "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==", + "node_modules/@typescript-eslint/typescript-estree/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", "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" + "ms": "^2.1.3" }, "engines": { - "node": ">= 0.4" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "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==", + "node_modules/@typescript-eslint/typescript-estree/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.44.0.tgz", + "integrity": "sha512-nktOlVcg3ALo0mYlV+L7sWUD58KG4CMj1rb2HUVOO4aL3K/6wcD+NERqd0rrA5Vg06b42YhF6cFxeixsp9Riqg==", + "dev": true, "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.44.0", + "@typescript-eslint/types": "8.44.0", + "@typescript-eslint/typescript-estree": "8.44.0" }, "engines": { - "node": ">= 0.4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.44.0.tgz", + "integrity": "sha512-zaz9u8EJ4GBmnehlrpoKvj/E3dNbuQ7q0ucyZImm3cLqJ8INTc970B1qEqDX/Rzq65r3TvVTN7kHWPBoyW7DWw==", + "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.44.0", + "eslint-visitor-keys": "^4.2.1" + }, "engines": { - "node": ">=6" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001718", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001718.tgz", - "integrity": "sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "dev": true, + "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==", "license": "MIT", "dependencies": { - "readdirp": "^4.0.1" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" }, "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "node": ">= 0.6" } }, - "node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, "engines": { - "node": ">=6" - } - }, - "node_modules/color": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", - "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.3", - "color-string": "^1.6.0" + "node": ">=0.4.0" } }, - "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==", + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, "license": "MIT", - "dependencies": { - "color-name": "1.1.3" + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "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==", - "license": "MIT" - }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, "license": "MIT", "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" + "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", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/colorspace": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", - "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", + "node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, "license": "MIT", - "dependencies": { - "color": "^3.1.3", - "text-hex": "1.0.x" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "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==", + "node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, "engines": { - "node": ">= 0.6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "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==", + "node_modules/are-docs-informative": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", + "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=14" } }, - "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==", + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", "dev": true, "license": "MIT" }, - "node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "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/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": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, "engines": { - "node": ">= 0.6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "license": "MIT" - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "license": "MIT" }, - "node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "dev": true, "license": "MIT", "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" }, "engines": { - "node": ">=10" - } - }, - "node_modules/cosmiconfig/node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "license": "ISC", - "engines": { - "node": ">= 6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", "dev": true, "license": "MIT", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" }, "engines": { - "node": ">= 8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/cross-spawn/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" }, "engines": { - "node": ">= 8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "license": "MIT" - }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, "license": "MIT", "dependencies": { - "ms": "2.0.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/dedent": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.6.0.tgz", - "integrity": "sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==", + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", "dev": true, "license": "MIT", - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } + "engines": { + "node": ">= 0.4" } }, - "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==", + "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": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, "engines": { - "node": ">= 0.8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "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": { + "node": ">= 0.4" + } + }, + "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": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/babel-dead-code-elimination": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/babel-dead-code-elimination/-/babel-dead-code-elimination-1.0.10.tgz", + "integrity": "sha512-DV5bdJZTzZ0zn0DC24v3jD7Mnidh6xhKa4GfKCbq3sfW8kaWhDdZjP3i81geA8T33tdYqWKw4D3fVv0CwEgKVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.23.7", + "@babel/parser": "^7.23.6", + "@babel/traverse": "^7.23.7", + "@babel/types": "^7.23.6" + } + }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "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/bignumber.js": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", + "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.24.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.5.tgz", + "integrity": "sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==", + "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": { + "caniuse-lite": "^1.0.30001716", + "electron-to-chromium": "^1.5.149", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "license": "BSD-3-Clause" + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001718", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001718.tgz", + "integrity": "sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "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/chalk/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/chalk/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", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/chalk/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" + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "license": "MIT", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/colorspace": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", + "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", + "license": "MIT", + "dependencies": { + "color": "^3.1.3", + "text-hex": "1.0.x" + } + }, + "node_modules/comment-parser": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz", + "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12.0.0" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.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==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "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/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cosmiconfig/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "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/cross-spawn/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/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" + }, + "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": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "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": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/dedent": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.6.0.tgz", + "integrity": "sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "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": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "license": "MIT", "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.158", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.158.tgz", + "integrity": "sha512-9vcp2xHhkvraY6AHw2WMi+GDSLPX42qe2xjYaVoZqFRJiOcilVQFq9mZmpuHEQpzlgGDelKlV7ZiGcmMsc8WxQ==", + "dev": true, + "license": "ISC" + }, + "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/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": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true, + "license": "MIT" + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-ex/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==", + "license": "MIT" + }, + "node_modules/es-abstract": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", + "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.6", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.4", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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/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==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz", + "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.5", + "@esbuild/android-arm": "0.25.5", + "@esbuild/android-arm64": "0.25.5", + "@esbuild/android-x64": "0.25.5", + "@esbuild/darwin-arm64": "0.25.5", + "@esbuild/darwin-x64": "0.25.5", + "@esbuild/freebsd-arm64": "0.25.5", + "@esbuild/freebsd-x64": "0.25.5", + "@esbuild/linux-arm": "0.25.5", + "@esbuild/linux-arm64": "0.25.5", + "@esbuild/linux-ia32": "0.25.5", + "@esbuild/linux-loong64": "0.25.5", + "@esbuild/linux-mips64el": "0.25.5", + "@esbuild/linux-ppc64": "0.25.5", + "@esbuild/linux-riscv64": "0.25.5", + "@esbuild/linux-s390x": "0.25.5", + "@esbuild/linux-x64": "0.25.5", + "@esbuild/netbsd-arm64": "0.25.5", + "@esbuild/netbsd-x64": "0.25.5", + "@esbuild/openbsd-arm64": "0.25.5", + "@esbuild/openbsd-x64": "0.25.5", + "@esbuild/sunos-x64": "0.25.5", + "@esbuild/win32-arm64": "0.25.5", + "@esbuild/win32-ia32": "0.25.5", + "@esbuild/win32-x64": "0.25.5" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.35.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.35.0.tgz", + "integrity": "sha512-QePbBFMJFjgmlE+cXAlbHZbHpdFVS2E/6vzCy7aKlebddvl1vadiC4JFV5u/wqTkNUwEV8WrQi257jf5f06hrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.3.1", + "@eslint/core": "^0.15.2", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.35.0", + "@eslint/plugin-kit": "^0.3.5", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-jsdoc": { + "version": "50.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-50.8.0.tgz", + "integrity": "sha512-UyGb5755LMFWPrZTEqqvTJ3urLz1iqj+bYOHFNag+sw3NvaMWP9K2z+uIn37XfNALmQLQyrBlJ5mkiVPL7ADEg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@es-joy/jsdoccomment": "~0.50.2", + "are-docs-informative": "^0.0.2", + "comment-parser": "1.4.1", + "debug": "^4.4.1", + "escape-string-regexp": "^4.0.0", + "espree": "^10.3.0", + "esquery": "^1.6.0", + "parse-imports-exports": "^0.2.4", + "semver": "^7.7.2", + "spdx-expression-parse": "^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-jsdoc/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", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-jsdoc/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint-plugin-jsdoc/node_modules/spdx-expression-parse": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", + "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", + "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-react/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-react/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/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/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", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/exit-hook": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-2.2.1.tgz", + "integrity": "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/express": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "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": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "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-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fdir": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", + "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "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/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "license": "MIT" + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "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/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": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "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==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/dom-helpers": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", - "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "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": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "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==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/dunder-proto": { + "node_modules/get-proto": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.1", + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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": { + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "gopd": "^1.2.0" + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, - "license": "MIT" + "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/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "license": "Apache-2.0", + "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": { - "safe-buffer": "^5.0.1" + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" } }, - "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==", + "node_modules/globals": { + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz", + "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true, "license": "MIT" }, - "node_modules/electron-to-chromium": { - "version": "1.5.158", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.158.tgz", - "integrity": "sha512-9vcp2xHhkvraY6AHw2WMi+GDSLPX42qe2xjYaVoZqFRJiOcilVQFq9mZmpuHEQpzlgGDelKlV7ZiGcmMsc8WxQ==", + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/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/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true, "license": "MIT" }, - "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/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": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "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", + "engines": { + "node": ">=8" + } + }, + "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": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/helmet": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/helmet/-/helmet-8.1.0.tgz", + "integrity": "sha512-jOiHyAZsmnr8LqoPGmCjYAaiuWwjAPLgY8ZX2XrmHawt99/u1y6RgrZMTeoPfpUbV96HOalYgz1qzkRbw54Pmg==", "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">=18.0.0" } }, - "node_modules/err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true, - "license": "MIT" - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "license": "MIT", + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", "dependencies": { - "is-arrayish": "^0.2.1" + "react-is": "^16.7.0" } }, - "node_modules/error-ex/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==", + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "license": "MIT" }, - "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==", - "license": "MIT", + "node_modules/hosted-git-info": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.3.tgz", + "integrity": "sha512-HVJyzUrLIL1c0QmviVh5E8VGyUS7xCFPS6yydaVd1UegW+ibV/CohqTH9MkOLDp5o+rb82DMo77PTuc9F/8GKw==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^7.5.1" + }, "engines": { - "node": ">= 0.4" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "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==", - "license": "MIT", + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "license": "ISC", "engines": { - "node": ">= 0.4" + "node": ">=12" } }, - "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/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==", + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "license": "MIT", "dependencies": { - "es-errors": "^1.3.0" + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">= 0.8" } }, - "node_modules/esbuild": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz", - "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==", - "dev": true, - "hasInstallScript": true, + "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==", "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" }, "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.5", - "@esbuild/android-arm": "0.25.5", - "@esbuild/android-arm64": "0.25.5", - "@esbuild/android-x64": "0.25.5", - "@esbuild/darwin-arm64": "0.25.5", - "@esbuild/darwin-x64": "0.25.5", - "@esbuild/freebsd-arm64": "0.25.5", - "@esbuild/freebsd-x64": "0.25.5", - "@esbuild/linux-arm": "0.25.5", - "@esbuild/linux-arm64": "0.25.5", - "@esbuild/linux-ia32": "0.25.5", - "@esbuild/linux-loong64": "0.25.5", - "@esbuild/linux-mips64el": "0.25.5", - "@esbuild/linux-ppc64": "0.25.5", - "@esbuild/linux-riscv64": "0.25.5", - "@esbuild/linux-s390x": "0.25.5", - "@esbuild/linux-x64": "0.25.5", - "@esbuild/netbsd-arm64": "0.25.5", - "@esbuild/netbsd-x64": "0.25.5", - "@esbuild/openbsd-arm64": "0.25.5", - "@esbuild/openbsd-x64": "0.25.5", - "@esbuild/sunos-x64": "0.25.5", - "@esbuild/win32-arm64": "0.25.5", - "@esbuild/win32-ia32": "0.25.5", - "@esbuild/win32-x64": "0.25.5" + "node": ">=0.10.0" } }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">= 4" } }, - "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==", - "license": "MIT" - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, "engines": { - "node": ">=10" + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=0.8.19" } }, - "node_modules/exit-hook": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-2.2.1.tgz", - "integrity": "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==", + "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/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", - "engines": { - "node": ">=6" + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 0.4" } }, - "node_modules/express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", - "proxy-addr": "~2.0.7", - "qs": "6.13.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, "engines": { - "node": ">= 0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "node": ">= 0.10" } }, - "node_modules/fdir": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", - "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", + "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", - "peerDependencies": { - "picomatch": "^3 || ^4" + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", "license": "MIT" }, - "node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "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": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", - "license": "MIT" - }, - "node_modules/fn.name": { + "node_modules/is-bigint": { "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/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" + "has-bigints": "^1.0.2" }, "engines": { - "node": ">=14" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "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": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, "engines": { - "node": ">= 0.6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "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": { - "node": ">= 0.6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, + "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==", "license": "MIT", "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "hasown": "^2.0.2" }, "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "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, - "hasInstallScript": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "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": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": ">=0.10.0" } }, - "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==", + "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": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" + "call-bound": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -2969,60 +5359,53 @@ "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "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", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, "engines": { - "node": ">= 0.4" + "node": ">=8" } }, - "node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "node_modules/is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", "dev": true, - "license": "ISC", + "license": "MIT", "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" + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" }, - "bin": { - "glob": "dist/esm/bin.mjs" + "engines": { + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/globrex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", - "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "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" - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -3031,17 +5414,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "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": "ISC" - }, - "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==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -3050,137 +5427,165 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "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": { - "function-bind": "^1.1.2" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/helmet": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/helmet/-/helmet-8.1.0.tgz", - "integrity": "sha512-jOiHyAZsmnr8LqoPGmCjYAaiuWwjAPLgY8ZX2XrmHawt99/u1y6RgrZMTeoPfpUbV96HOalYgz1qzkRbw54Pmg==", + "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": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, "engines": { - "node": ">=18.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "license": "BSD-3-Clause", - "dependencies": { - "react-is": "^16.7.0" + "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": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hoist-non-react-statics/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "license": "MIT" - }, - "node_modules/hosted-git-info": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.3.tgz", - "integrity": "sha512-HVJyzUrLIL1c0QmviVh5E8VGyUS7xCFPS6yydaVd1UegW+ibV/CohqTH9MkOLDp5o+rb82DMo77PTuc9F/8GKw==", + "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": "ISC", + "license": "MIT", "dependencies": { - "lru-cache": "^7.5.1" + "call-bound": "^1.0.3" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "license": "ISC", + "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": ">=12" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "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": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "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": { - "safer-buffer": ">= 2.1.2 < 3" + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "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": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "which-typed-array": "^1.1.16" }, "engines": { - "node": ">=6" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "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/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "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": { - "node": ">= 0.10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "license": "MIT" - }, - "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==", + "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": { - "hasown": "^2.0.2" + "call-bound": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -3189,26 +5594,21 @@ "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "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": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, "engines": { - "node": ">=8" - } - }, - "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" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/isarray": { @@ -3233,6 +5633,24 @@ "dev": true, "license": "ISC" }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/jackspeak": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", @@ -3264,6 +5682,29 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "license": "MIT" }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdoc-type-pratt-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.1.0.tgz", + "integrity": "sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/jsesc": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", @@ -3276,6 +5717,13 @@ "node": ">=6" } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "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", @@ -3286,6 +5734,20 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -3340,6 +5802,22 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, "node_modules/jwa": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz", @@ -3370,18 +5848,58 @@ "node": ">=14.0.0" } }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, "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/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "license": "MIT" }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -3425,6 +5943,13 @@ "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", "license": "MIT" }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, "node_modules/lodash.once": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", @@ -3511,6 +6036,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -3520,6 +6055,33 @@ "node": ">= 0.6" } }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -3635,6 +6197,13 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -3728,23 +6297,108 @@ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", + "license": "MIT", + "engines": { + "node": ">= 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==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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": { + "node": ">= 0.4" + } + }, + "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": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" } }, - "node_modules/object-hash": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", - "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, "engines": { - "node": ">= 6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -3797,6 +6451,74 @@ "url": "https://github.com/sponsors/panva" } }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "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": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/package-json-from-dist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", @@ -3816,6 +6538,16 @@ "node": ">=6" } }, + "node_modules/parse-imports-exports": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/parse-imports-exports/-/parse-imports-exports-0.2.4.tgz", + "integrity": "sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse-statements": "1.0.11" + } + }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -3840,6 +6572,13 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "license": "MIT" }, + "node_modules/parse-statements": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/parse-statements/-/parse-statements-1.0.11.tgz", + "integrity": "sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==", + "dev": true, + "license": "MIT" + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -3849,6 +6588,16 @@ "node": ">= 0.8" } }, + "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/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -3930,6 +6679,16 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "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": { + "node": ">= 0.4" + } + }, "node_modules/postcss": { "version": "8.5.3", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", @@ -3959,6 +6718,16 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/prettier": { "version": "2.8.8", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", @@ -4066,6 +6835,16 @@ "node": ">= 0.10" } }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/qs": { "version": "6.13.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", @@ -4081,6 +6860,27 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -4224,6 +7024,50 @@ "url": "https://paulmillr.com/funding/" } }, + "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": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/resolve": { "version": "1.22.10", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", @@ -4263,6 +7107,17 @@ "node": ">= 4" } }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, "node_modules/rollup": { "version": "4.41.1", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.41.1.tgz", @@ -4303,6 +7158,57 @@ "fsevents": "~2.3.2" } }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "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": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-array-concat/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/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -4323,6 +7229,48 @@ ], "license": "MIT" }, + "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": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-push-apply/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/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": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safe-stable-stringify": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", @@ -4416,6 +7364,55 @@ "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", "license": "MIT" }, + "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": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -4631,6 +7628,20 @@ "node": ">= 0.8" } }, + "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": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/stream-slice": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/stream-slice/-/stream-slice-0.1.2.tgz", @@ -4716,6 +7727,104 @@ "node": ">=8" } }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "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": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/strip-ansi": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", @@ -4756,12 +7865,38 @@ "node": ">=8" } }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/stylis": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", "license": "MIT" }, + "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", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "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", @@ -4797,6 +7932,19 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -4815,6 +7963,19 @@ "node": ">= 14.0.0" } }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, "node_modules/tsconfck": { "version": "3.1.6", "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.6.tgz", @@ -4836,6 +7997,19 @@ } } }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -4849,6 +8023,84 @@ "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==", + "dev": true, + "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" + }, + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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": { + "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/typescript": { "version": "5.8.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", @@ -4863,6 +8115,49 @@ "node": ">=14.17" } }, + "node_modules/typescript-eslint": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.44.0.tgz", + "integrity": "sha512-ib7mCkYuIzYonCq9XWF5XNw+fkj2zg629PSa9KNIQ47RXFF763S5BIX4wqz1+FLPogTZoiw8KmCiRPRa8bL3qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.44.0", + "@typescript-eslint/parser": "8.44.0", + "@typescript-eslint/typescript-estree": "8.44.0", + "@typescript-eslint/utils": "8.44.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "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": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/undici": { "version": "6.21.3", "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.3.tgz", @@ -4928,6 +8223,16 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -4989,9 +8294,9 @@ } }, "node_modules/vite": { - "version": "6.3.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", - "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", + "version": "6.3.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.6.tgz", + "integrity": "sha512-0msEVHJEScQbhkbVTb/4iHZdJ6SXp/AvxL2sjwYQFfBqleHtnCqv1J3sa9zbWz/6kW1m9Tfzn92vW+kZ1WV6QA==", "dev": true, "license": "MIT", "dependencies": { @@ -5172,6 +8477,102 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "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": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type/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/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": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/winston": { "version": "3.17.0", "resolved": "https://registry.npmjs.org/winston/-/winston-3.17.0.tgz", @@ -5236,6 +8637,16 @@ "node": ">= 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": { + "node": ">=0.10.0" + } + }, "node_modules/wrap-ansi": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", @@ -5395,6 +8806,19 @@ "engines": { "node": ">= 14.6" } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } } } diff --git a/Tokenization/webapp/package.json b/Tokenization/webapp/package.json index c15a8433a..a1636ae9b 100644 --- a/Tokenization/webapp/package.json +++ b/Tokenization/webapp/package.json @@ -40,7 +40,7 @@ "@types/react": "^19.0.1", "@types/react-dom": "^19.0.1", "typescript": "^5.7.2", - "vite": "^6.0.11", + "vite": "^6.3.6", "vite-tsconfig-paths": "^5.1.4", "@eslint/js": "^9.28.0", "@stylistic/eslint-plugin-ts": "^2.10.1", From 69631453d074044d4d8c0eae956cd729b8456d28 Mon Sep 17 00:00:00 2001 From: Alejandro Mariscal Romero <87366244+mariscalromeroalejandro@users.noreply.github.com> Date: Thu, 25 Sep 2025 13:25:01 +0200 Subject: [PATCH 58/77] [OGUI-329] Adapt frontend to kafka events (#3079) This PR adapts the frontend to use a dropdown with the ongoing runs provided by Kafka in runs mode. --- QualityControl/index.js | 9 +- QualityControl/lib/QCModel.js | 7 +- QualityControl/lib/api.js | 10 +- .../lib/controllers/FilterController.js | 19 +- QualityControl/lib/services/RunModeService.js | 8 + .../public/common/filters/filter.js | 63 +++++++ .../public/common/filters/filterTypes.js | 1 + .../public/common/filters/filterViews.js | 65 ++++--- .../public/common/filters/filtersConfig.js | 13 +- .../common/filters/model/FilterModel.js | 9 +- .../common/filters/runMode/runStatusPanel.js | 44 ++--- .../public/services/Filter.service.js | 17 ++ QualityControl/test/config.js | 10 ++ .../test/public/features/runMode.test.js | 164 ++++++++++-------- QualityControl/test/setup/mockKafkaEvents.js | 38 ++++ QualityControl/test/setup/testSetupForBkp.js | 35 ++++ QualityControl/test/setup/testSetupForCcdb.js | 12 ++ 17 files changed, 381 insertions(+), 143 deletions(-) create mode 100644 QualityControl/test/setup/mockKafkaEvents.js diff --git a/QualityControl/index.js b/QualityControl/index.js index ab76e8291..ae369c0f8 100644 --- a/QualityControl/index.js +++ b/QualityControl/index.js @@ -43,6 +43,7 @@ http.addStaticPath(path.join(__dirname, 'public')); import { createRequire } from 'module'; import { isRunningInTest } from './lib/utils/environment.js'; +import EventEmitter from 'events'; const require = createRequire(import.meta.url); const pathName = require.resolve('jsroot'); @@ -50,12 +51,16 @@ http.addStaticPath(path.join(pathName, '../..'), 'jsroot'); const ws = new WebSocket(http); +const eventEmitter = new EventEmitter(); + if (isRunningInTest) { - // Initialize nock for CCDB and Bookkeeping only if we are in test environment + // Initialize nock for CCDB, Bookkeeping and Kafka only if we are in test environment const { initializeNockForCcdb } = await import('./test/setup/testSetupForCcdb.js'); const { initializeNockForBkp } = await import('./test/setup/testSetupForBkp.js'); + const { setupMockKafkaEvents } = await import('./test/setup/mockKafkaEvents.js'); initializeNockForCcdb(); initializeNockForBkp(); + setupMockKafkaEvents(eventEmitter); } -setup(http, ws); +setup(http, ws, eventEmitter); diff --git a/QualityControl/lib/QCModel.js b/QualityControl/lib/QCModel.js index 61d0ee6b2..ed38adea6 100644 --- a/QualityControl/lib/QCModel.js +++ b/QualityControl/lib/QCModel.js @@ -15,7 +15,6 @@ import { fileURLToPath } from 'url'; import { dirname } from 'path'; import { readFileSync } from 'fs'; -import { EventEmitter } from 'events'; import { LogManager } from '@aliceo2/web-ui'; import { openFile, toJSON } from 'jsroot'; @@ -54,9 +53,10 @@ const LOG_FACILITY = `${process.env.npm_config_log_label ?? 'qcg'}/model-setup`; /** * Model initialization for the QCG application + * @param {EventEmitter} eventEmitter - Event emitter instance for inter-service communication * @returns {Promise} Multiple services and controllers that are to be used by the QCG application */ -export const setupQcModel = async () => { +export const setupQcModel = async (eventEmitter) => { const logger = LogManager.getLogger(LOG_FACILITY); const __filename = fileURLToPath(import.meta.url); @@ -68,7 +68,6 @@ export const setupQcModel = async () => { initDatabase(new SequelizeDatabase(config?.database || {})); } - const eventEmitter = new EventEmitter(); if (config?.kafka?.enabled) { try { const validConfig = await KafkaConfigDto.validateAsync(config.kafka); @@ -109,7 +108,7 @@ export const setupQcModel = async () => { const runModeService = new RunModeService(config.bookkeeping, bookkeepingService, ccdbService, eventEmitter); const objectController = new ObjectController(qcObjectService, runModeService); - const filterController = new FilterController(filterService); + const filterController = new FilterController(filterService, runModeService); const objectGetByIdValidation = objectGetByIdValidationMiddlewareFactory(filterService); const objectsGetValidation = objectsGetValidationMiddlewareFactory(filterService); diff --git a/QualityControl/lib/api.js b/QualityControl/lib/api.js index d7184bd64..2b5d3751f 100644 --- a/QualityControl/lib/api.js +++ b/QualityControl/lib/api.js @@ -26,9 +26,9 @@ import { runModeMiddleware } from './middleware/filters/runMode.middleware.js'; * Adds paths and binds websocket to instance of HttpServer passed * @param {HttpServer} http - web-ui based server implementation * @param {WebSocket} ws - web-ui websocket server implementation - * @returns {void} + * @param {EventEmitter} eventEmitter - Event emitter instance (Kafka) */ -export const setup = async (http, ws) => { +export const setup = async (http, ws, eventEmitter) => { /** * @type {{ * layoutController: import('./controllers/LayoutController.js').LayoutController, @@ -51,7 +51,7 @@ export const setup = async (http, ws) => { objectGetByIdValidation, objectsGetValidation, objectGetContentsValidation, - } = await setupQcModel(); + } = await setupQcModel(eventEmitter); statusService.ws = ws; http.get('/object/:id', objectGetByIdValidation, objectController.getObjectById.bind(objectController)); @@ -106,4 +106,8 @@ export const setup = async (http, ws) => { runStatusFilterMiddleware, filterController.getRunStatusHandler.bind(filterController), ); + http.get( + '/filter/ongoingRuns', + filterController.getOngoingRunsHandler.bind(filterController), + ); }; diff --git a/QualityControl/lib/controllers/FilterController.js b/QualityControl/lib/controllers/FilterController.js index fbc61afa2..d32da8a75 100644 --- a/QualityControl/lib/controllers/FilterController.js +++ b/QualityControl/lib/controllers/FilterController.js @@ -25,12 +25,19 @@ export class FilterController { /** * Creates an instance of FilterController class * @param {FilterService} filterService To retrieve the information displayed in the filters + * @param {RunModeService} runsModeService To retrieve the ongoing runs */ - constructor(filterService) { + constructor(filterService, runsModeService) { /** * @type {FilterService} */ this._filterService = filterService; + + /** + * @type {RunModeService} + */ + this._runsModeService = runsModeService; + this._logger = LogManager.getLogger(`${process.env.npm_config_log_label ?? 'qcg'}/filter-ctrl`); } @@ -69,4 +76,14 @@ export class FilterController { res.status(503).json({ error: error.message || error }); } } + + /** + * HTTP GET endpoint for retrieving a list of ongoing runs from Runs Mode Service + * @param {Request} req HTTP Request + * @param {Response} res HTTP Response with the ongoing runs + */ + getOngoingRunsHandler(req, res) { + const ongoingRuns = this._runsModeService?.ongoingRuns ?? []; + res.status(200).json({ ongoingRuns }); + } } diff --git a/QualityControl/lib/services/RunModeService.js b/QualityControl/lib/services/RunModeService.js index 7247326cd..12f48f8f1 100644 --- a/QualityControl/lib/services/RunModeService.js +++ b/QualityControl/lib/services/RunModeService.js @@ -143,4 +143,12 @@ export class RunModeService { get refreshInterval() { return this._refreshRunsInterval; } + + /** + * Returns the list of runs that are ongoing + * @returns {Array} array of run numbers + */ + get ongoingRuns() { + return [...this._ongoingRuns.keys()]; + } } diff --git a/QualityControl/public/common/filters/filter.js b/QualityControl/public/common/filters/filter.js index 8a2b53996..6d658d9e2 100644 --- a/QualityControl/public/common/filters/filter.js +++ b/QualityControl/public/common/filters/filter.js @@ -133,3 +133,66 @@ const dropdownSelector = (config) => { ]), ]); }; + +/** + * Renders a dropdown selector for ongoing runs. + * @param {object} config - Selector config ({ id, placeholder, width }). + * @param {object} filterMap - Current filters (RunNumber or empty). + * @param {RemoteData} options - Available ongoing runs. + * @param {Function} onChangeCallback - To change the selection and update the filterMap + * @param {Function} onEnterCallback - To trigger the filter + * @param {Function} [onFocusCallback] - To retrieve ongoing runs + * @returns {object} Virtual DOM node (hyperscript element). + */ +export const ongoingRunsSelector = (config, filterMap, options, onChangeCallback, onEnterCallback, onFocusCallback) => { + const handleChange = (value) => { + onChangeCallback('RunNumber', value, false); + if (value) { + setTimeout(() => onEnterCallback(), 50); + } + }; + const availableOptions = options.isSuccess() + ? [...new Set([...options.payload].map((v) => String(v)))] + : []; + + const selectedValue = filterMap['RunNumber'] || ''; + + const handleFocus = () => { + if (onFocusCallback) { + onFocusCallback(); + } + }; + + const buildOptions = () => { + const options = []; + options.push(h('option', { value: '', disabled: true }, config.placeholder || 'Select a run')); + if (selectedValue) { + options.push(h('option', { value: selectedValue }, selectedValue)); + } + + availableOptions + .filter((option) => option !== selectedValue) + .forEach((option) => { + options.push(h('option', { value: option }, option)); + }); + + return options; + }; + + return h(`.${config.width}`, [ + h( + 'select.form-control', + { + placeholder: config.placeholder || 'Select a run', + id: config.id, + name: config.id, + value: selectedValue, + onfocus: handleFocus, + onchange: (event) => handleChange(event.target.value), + }, + availableOptions.length > 0 || selectedValue + ? buildOptions() + : [h('option', { value: '', disabled: true }, 'No ongoing runs available')], + ), + ]); +}; diff --git a/QualityControl/public/common/filters/filterTypes.js b/QualityControl/public/common/filters/filterTypes.js index 869cbae2b..1ef8f14b2 100644 --- a/QualityControl/public/common/filters/filterTypes.js +++ b/QualityControl/public/common/filters/filterTypes.js @@ -15,6 +15,7 @@ const FilterType = { INPUT: 'input', DROPDOWN: 'dropdownSelector', + RUN_MODE: 'runModeSelector', }; export { FilterType }; diff --git a/QualityControl/public/common/filters/filterViews.js b/QualityControl/public/common/filters/filterViews.js index 56c2eea93..de12fb28a 100644 --- a/QualityControl/public/common/filters/filterViews.js +++ b/QualityControl/public/common/filters/filterViews.js @@ -12,11 +12,11 @@ * or submit itself to any jurisdiction. */ -import { filterInput, dynamicSelector } from './filter.js'; +import { filterInput, dynamicSelector, ongoingRunsSelector } from './filter.js'; import { FilterType } from './filterTypes.js'; import { filtersConfig, runModeFilterConfig } from './filtersConfig.js'; import { runModeCheckbox } from './runMode/runModeCheckbox.js'; -import { runStatusPanel } from './runMode/runStatusPanel.js'; +import { lastUpdatePanel, runStatusPanel } from './runMode/runStatusPanel.js'; import { h, iconChevronBottom, iconChevronTop } from '/js/src/index.js'; /** @@ -26,25 +26,37 @@ import { h, iconChevronBottom, iconChevronTop } from '/js/src/index.js'; * @param {Function} onInputCallback - A callback function that triggers upon Input * @param {Function} onEnterCallback - A callback function that triggers upon Enter * @param {Function} onChangeCallback - A callback function that triggers upon Change + * @param onFocusCallback * @returns {undefined} */ -const createFilterElement = (config, filterMap, onInputCallback, onEnterCallback, onChangeCallback) => { - const { type, queryLabel, placeholder, id, inputType = 'text', options, width } = config; - const commonConfig = { - queryLabel, - placeholder, - id, - filterMap, - onInputCallback, - onEnterCallback, - width, +const createFilterElement = + (config, filterMap, onInputCallback, onEnterCallback, onChangeCallback, onFocusCallback) => { + const { type, queryLabel, placeholder, id, inputType = 'text', options, width } = config; + const commonConfig = { + queryLabel, + placeholder, + id, + filterMap, + onInputCallback, + onEnterCallback, + width, + }; + switch (type) { + case FilterType.INPUT: return filterInput({ ...commonConfig, type: inputType }); + case FilterType.DROPDOWN: + return dynamicSelector({ ...commonConfig, options, onChangeCallback, inputType }); + case FilterType.RUN_MODE: + return ongoingRunsSelector( + { ...commonConfig }, + filterMap, + options, + onChangeCallback, + onEnterCallback, + onFocusCallback, + ); + default: return null; + } }; - switch (type) { - case FilterType.INPUT: return filterInput({ ...commonConfig, type: inputType }); - case FilterType.DROPDOWN: return dynamicSelector({ ...commonConfig, options, onChangeCallback }); - default: return null; - } -}; /** * Builds a panel containing multiple filters to allow user to apply for objectTree show/view @@ -59,21 +71,22 @@ export function filtersPanel(filterModel, viewModel) { filterService, clearFilter, isRunModeActivated, - runNumber, runStatus, isVisible, lastRefresh, ONGOING_RUN_INTERVAL_MS: refreshRate, } = filterModel; + const { fetchOngoingRuns } = filterService; const onInputCallback = setFilterValue.bind(filterModel); const onChangeCallback = setFilterValue.bind(filterModel); + const onFocusCallback = fetchOngoingRuns.bind(filterService); const onEnterCallback = () => filterModel.triggerFilter(viewModel); const clearFilterCallback = clearFilter.bind(filterModel, viewModel); if (!isVisible) { return null; } const filtersList = isRunModeActivated - ? runModeFilterConfig() + ? runModeFilterConfig(filterService) : filtersConfig(filterService); return h( @@ -81,12 +94,13 @@ export function filtersPanel(filterModel, viewModel) { [ h('.flex-row.g2.justify-center', [ runModeCheckbox(filterModel, viewModel), - triggerFiltersButton(onEnterCallback, filterModel), - !isRunModeActivated && clearFiltersButton(clearFilterCallback), + !isRunModeActivated && + [triggerFiltersButton(onEnterCallback, filterModel), clearFiltersButton(clearFilterCallback)], ...filtersList.map((filter) => - createFilterElement(filter, filterMap, onInputCallback, onEnterCallback, onChangeCallback)), + createFilterElement(filter, filterMap, onInputCallback, onEnterCallback, onChangeCallback, onFocusCallback)), + isRunModeActivated && runStatusPanel(runStatus), ]), - isRunModeActivated && runStatusPanel({ runNumber, runStatus, lastRefresh, refreshRate }), + lastUpdatePanel(runStatus, lastRefresh, refreshRate), ], ); }; @@ -104,10 +118,9 @@ export function filtersPanel(filterModel, viewModel) { * @returns {vnode} - virtual node element */ const triggerFiltersButton = (onClickCallback, filterModel) => { - const isRunModeActivated = filterModel?.isRunModeActivated; const { isValid, title } = filterModel.validateRunNumber(); - const buttonId = isRunModeActivated ? 'updateAndRunModeButton' : 'triggerFilterButton'; + const buttonId = 'triggerFilterButton'; return h( 'button.btn.btn-primary', diff --git a/QualityControl/public/common/filters/filtersConfig.js b/QualityControl/public/common/filters/filtersConfig.js index 5a3577862..74f4faf7a 100644 --- a/QualityControl/public/common/filters/filtersConfig.js +++ b/QualityControl/public/common/filters/filtersConfig.js @@ -51,15 +51,20 @@ export const filtersConfig = ({ runTypes }) => [ /** * Returns a filter configuration object used to render dynamic filter in run mode. + * @param {FilterService} filterService - service to get the data to populate the filters + * @param {Array} filterService.ongoingRuns - run numbers to show in the dropdown * @returns {object} Filter configuration object */ -export const runModeFilterConfig = () => [ +export const runModeFilterConfig = ({ ongoingRuns }) => [ { - type: FilterType.INPUT, + type: FilterType.RUN_MODE, queryLabel: 'RunNumber', - placeholder: 'RunNumber (e.g. 546783)', - id: 'runNumberFilter', + placeholder: 'Select a run number', + id: 'ongoingRunsFilter', inputType: 'number', width: 'w-10', + options: ongoingRuns, + defaultToFirst: true, + noOptionsTitle: 'There are no runs ongoing currently', }, ]; diff --git a/QualityControl/public/common/filters/model/FilterModel.js b/QualityControl/public/common/filters/model/FilterModel.js index edd7e7c6d..eede54f49 100644 --- a/QualityControl/public/common/filters/model/FilterModel.js +++ b/QualityControl/public/common/filters/model/FilterModel.js @@ -166,11 +166,18 @@ export default class FilterModel extends Observable { */ async activateRunsMode(viewModel) { this.isRunModeActivated = true; + await this.filterService.fetchOngoingRuns(); if (this._filterMap.RunNumber) { this._filterMap = { RunNumber: this._filterMap.RunNumber }; this.triggerFilter(viewModel); } else { - this._filterMap = {}; + const { ongoingRuns } = this.filterService; + if (ongoingRuns.isSuccess() && ongoingRuns.payload.length > 0) { + this._filterMap = { RunNumber: String(ongoingRuns.payload[0]) }; + this.triggerFilter(viewModel); + } else { + this._filterMap = {}; + } } this.notify(); } diff --git a/QualityControl/public/common/filters/runMode/runStatusPanel.js b/QualityControl/public/common/filters/runMode/runStatusPanel.js index d7209a41b..c876f741f 100644 --- a/QualityControl/public/common/filters/runMode/runStatusPanel.js +++ b/QualityControl/public/common/filters/runMode/runStatusPanel.js @@ -12,36 +12,34 @@ */ import { RunStatus } from '../../../../../library/runStatus.enum.js'; -import { spinner } from '../../spinner.js'; import { h } from '/js/src/index.js'; /** * Creates and returns a run status panel element displaying the current run number, * its status, the last refresh timestamp, and the refresh rate. - * @param {object} options Options for rendering the run status panel. - * @param {number} options.runNumber The current run number to display. - * @param {string} options.runStatus The status of the run (e.g., "running", "completed"). - * @param {Date} options.lastRefresh Timestamp of the last refresh. - * @param {number} options.refreshRate - Refresh rate in milliseconds. + * @param {string} runStatus The status of the run (e.g., "running", "completed"). * @returns {vnode} The element representing the run status panel. */ -export const runStatusPanel = ({ runNumber, runStatus, lastRefresh, refreshRate = 15000 }) => { - const runNumberPanel = h('span', { id: 'runNumberLabel' }, [ - 'Run ', - h('b', `#${runNumber}`), - ]); - const statusPanel = (runStatus) => - runStatus - ? h( +export const runStatusPanel = (runStatus) => + runStatus && h( + '.flex-row.g1.items-center.justify-center', + { id: 'runStatusPanel' }, + [ + h( `.badge.white.bg-${runStatus === RunStatus.ONGOING ? 'success' : 'gray-darker'}`, { id: 'runStatusBadge' }, runStatus, - ) - : h('span', spinner(1)); + ), + ], + ); + +export const lastUpdatePanel = (runStatus, lastRefresh, refreshRate = 15000) => { + const shouldShowTimestamp = runStatus === RunStatus.ONGOING || runStatus === RunStatus.ENDED; + const formatDateTime = (dateStr) => new Date(dateStr).toLocaleString('en-GB'); // dd/mm/yyyy, hh:mm:ss - const lastUpdatePanel = (runStatus) => [ + return shouldShowTimestamp && h('.flex-row.g1.items-center.justify-center.f7.gray-darker.text-center', [ h( 'span', { id: 'lastUpdate' }, @@ -53,17 +51,5 @@ export const runStatusPanel = ({ runNumber, runStatus, lastRefresh, refreshRate { id: 'refreshInfo' }, ` - As run is ONGOING, will refresh every ${refreshRate / 1000} seconds`, ), - ]; - const shouldShowTimestamp = runStatus === RunStatus.ONGOING || runStatus === RunStatus.ENDED; - - return runNumber && runStatus && h('.flex-column', [ - h('.flex-row.g1.items-center.justify-center', { id: 'runStatusPanel' }, [ - runNumberPanel, - statusPanel(runStatus), - ]), - shouldShowTimestamp && h( - '.flex-row.g1.items-center.justify-center.f7.gray-darker.text-center', - lastUpdatePanel(runStatus), - ), ]); }; diff --git a/QualityControl/public/services/Filter.service.js b/QualityControl/public/services/Filter.service.js index bf74437a6..d39ffac68 100644 --- a/QualityControl/public/services/Filter.service.js +++ b/QualityControl/public/services/Filter.service.js @@ -28,6 +28,7 @@ export default class FilterService { this.loader = filterModel.model.loader; this.runTypes = RemoteData.notAsked(); + this.ongoingRuns = RemoteData.notAsked(); } /** @@ -78,4 +79,20 @@ export default class FilterService { return RemoteData.success(result); } } + + /** + * Gets the run numbers for the ongoing runs + * @returns {void} assigns the remoteData object to ongoingRuns + */ + async fetchOngoingRuns() { + this.ongoingRuns = RemoteData.loading(); + this.filterModel.notify(); + const { result, ok } = await this.loader.get('/api/filter/ongoingRuns'); + if (ok) { + this.ongoingRuns = RemoteData.success(result?.ongoingRuns); + } else { + this.ongoingRuns = RemoteData.failure('Error retrieving ongoing runs'); + } + this.filterModel.notify(); + } } diff --git a/QualityControl/test/config.js b/QualityControl/test/config.js index 1d8908f0a..201bf9f54 100644 --- a/QualityControl/test/config.js +++ b/QualityControl/test/config.js @@ -46,4 +46,14 @@ export const config = { runTypesRefreshInterval: 15000, runStatusRefreshInterval: 15000, }, + + // Mock Kafka configuration for testing + kafka: { + enabled: false, // Disabled for tests, but we'll mock the events + clientId: 'qcg-client-test', + consumerGroups: { + QCG_RUN: 'qcg-run-test', + }, + brokers: ['localhost:9092'], + }, }; diff --git a/QualityControl/test/public/features/runMode.test.js b/QualityControl/test/public/features/runMode.test.js index f0a0b16d1..6818afb74 100644 --- a/QualityControl/test/public/features/runMode.test.js +++ b/QualityControl/test/public/features/runMode.test.js @@ -11,120 +11,138 @@ * or submit itself to any jurisdiction. */ -import { strictEqual, ok, match } from 'node:assert'; +import { strictEqual, ok } from 'node:assert'; import { delay } from '../../testUtils/delay.js'; + +// If using nock for HTTP mocking (uncomment if available) +// import nock from 'nock'; export const runModeTests = async (url, page, timeout = 5000, testParent) => { - // + let countOngoingRunsCalls = 0; + let countRunStatusCalls = 0; + let countObjectsCalls = 0; + + page.on('request', (req) => { + const url = req.url(); + const decodedUrl = decodeURIComponent(url); + if (url.includes('/api/filter/ongoingRuns')) { + countOngoingRunsCalls++; + } + if (url.includes('/api/filter/run-status/500001')) { + countRunStatusCalls++; + } + if (url.includes('/api/objects') && decodedUrl.includes('filters[RunNumber]=500001')) { + countObjectsCalls++; + } + }); + await testParent.test('should have a switch to enable runs mode', { timeout }, async () => { await page.goto( `${url}?page=objectTree`, { waitUntil: 'networkidle0' }, ); + await page.evaluate(() => { + window.model.filterModel.ONGOING_RUN_INTERVAL_MS = 500; + }); await page.locator('.form-check-label > .switch'); const runsModeTitle = await page.evaluate(() => document.querySelector('.form-check-label').textContent); strictEqual(runsModeTitle, 'Runs mode', 'The text displayed is not `Runs mode`'); }); - await testParent.test('should enter runs mode successfully', { timeout }, async () => { + await testParent.test('should activate run mode', { timeout }, async () => { await page.locator('.form-check-label > .switch').click(); await delay(50); - await page.locator('#filterElement'); - const updateButtonIsDisabled = await page.evaluate(() => - document.querySelector('#updateAndRunModeButton').disabled); - const isRunNumberFilterEmpty = await page.evaluate(() => - document.querySelector('#runNumberFilter').value === ''); - const isRunModeActivated = await page.evaluate(() => - window.model.filterModel.isRunModeActivated); - ok(updateButtonIsDisabled); - ok(isRunNumberFilterEmpty); - ok(isRunModeActivated); - delay(200); + const isRunModeActivated = await page.evaluate(() => window.model.filterModel.isRunModeActivated); + ok(isRunModeActivated, 'Run mode should be activated'); }); - await testParent.test('should allow user to track a run', { timeout }, async () => { - const urlRunStatus = '/api/filter/run-status/566138'; - const urlObjects = '/api/objects?inRunMode=true&filters[RunNumber]=566138'; - const regex = - /^Last update: \d{2}\/\d{2}\/\d{4}, \d{2}:\d{2}:\d{2}$/; - let countRunStatusCalls = 0; - let countObjectsCalls = 0; - page.on('request', (req) => { - if (req.url().includes(encodeURI(urlRunStatus))) { - countRunStatusCalls++; - } - if (req.url().includes(encodeURI(urlObjects))) { - countObjectsCalls++; - } - }); - await page.evaluate(() => { - window.model.filterModel.ONGOING_RUN_INTERVAL_MS = 500; - }); - await page.locator('#runNumberFilter').fill('566138'); - await delay(100); - const updateButtonIsDisabled = await page.evaluate(() => - document.querySelector('#updateAndRunModeButton').disabled); - strictEqual(updateButtonIsDisabled, false, 'Button should be disabled if run number has not been set'); - await page.locator('#updateAndRunModeButton').click(); - await delay(100); - await page.waitForSelector('#runStatusPanel'); - const runStatusInfo = await page.evaluate(() => { - const runNumber = document.querySelector('#runNumberLabel').textContent; - const status = document.querySelector('#runStatusBadge').textContent; - const lastUpdate = document.querySelector('#lastUpdate').textContent; - const refreshInfo = document.querySelector('#refreshInfo')?.textContent; - return { runNumber, status, lastUpdate, refreshInfo }; + await testParent.test('should make a request to ongoing runs API', { timeout }, async () => { + await delay(200); + strictEqual(countOngoingRunsCalls, 1, `Expect 1 req to /api/filter/ongoingRuns, but got ${countOngoingRunsCalls}`); + }); + + await testParent.test('should display ongoing runs selector', { timeout }, async () => { + await page.waitForSelector('#ongoingRunsFilter', { timeout: 1000 }); + const selector = await page.locator('#ongoingRunsFilter'); + ok(selector, 'Ongoing runs selector should be present'); + }); + + await testParent.test('should have correct options in ongoing runs selector', { timeout }, async () => { + const availableOptions = await page.evaluate(() => { + const selector = document.querySelector('#ongoingRunsFilter'); + return Array.from(selector.options) + .map((option) => option.value) + .filter((value) => value !== ''); }); - strictEqual(runStatusInfo.runNumber, 'Run #566138'); - strictEqual(runStatusInfo.status, 'ONGOING'); - strictEqual(runStatusInfo.refreshInfo, ' - As run is ONGOING, will refresh every 0.5 seconds'); - match(runStatusInfo.lastUpdate, regex); - await delay(1000); - strictEqual(countRunStatusCalls, 3, `Expected 3 requests to filter/run-status, but got ${countRunStatusCalls}`); - strictEqual(countObjectsCalls, 3, `Expected 3 requests to api/objects, but got ${countObjectsCalls}`); + ok(availableOptions.length > 0, 'Should have ongoing runs available in selector'); + ['500001', '500002', '500003'].forEach((run) => { + ok(availableOptions.includes(run), `Should include mock run ${run}`); + }); }); - await testParent.test('should show `ENDED` if a run that was ongoing, finishes', { timeout }, async () => { - let count = 0; - page.on('request', (req) => { - if (req.url().includes('/api/filter/run-status/566138')) { - count++; - } + await testParent.test('should automatically select first run and update URL', { timeout }, async () => { + await delay(500); + const currentUrl = await page.evaluate(() => window.location.href); + ok(currentUrl.includes('RunNumber=500001'), 'URL should contain RunNumber=500001 parameter'); + + const selectedRunNumber = await page.evaluate(() => { + const selector = document.querySelector('#ongoingRunsFilter'); + return selector.value; }); + strictEqual(selectedRunNumber, '500001', 'First ongoing run should be automatically selected'); + }); - //nock has been configured to stop the run after 3 calls + await testParent.test('should make requests for run status and objects of selected run', { timeout }, async () => { + strictEqual(countRunStatusCalls, 2, `Expected: 2 req to /api/filter/run-status, actual: ${countRunStatusCalls}`); + strictEqual(countObjectsCalls, 2, `Expected: 2 req to /api/objects, actual: ${countObjectsCalls}`); + }); + + await testParent.test('should show ENDED status when run finishes', { timeout }, async () => { + await delay(1000); await page.waitForSelector('#runStatusPanel'); const runStatusInfo = await page.evaluate(() => { - const runNumber = document.querySelector('#runNumberLabel').textContent; - const status = document.querySelector('#runStatusBadge').textContent; - return { runNumber, status }; + const status = document.querySelector('#runStatusBadge')?.textContent; + return { status }; }); - strictEqual(runStatusInfo.runNumber, 'Run #566138'); - strictEqual(runStatusInfo.status, 'ENDED'); - await delay(500); - strictEqual(count, 0, `No requests expected, but got ${count}`); + + // Verify the run status changed to ENDED + strictEqual(runStatusInfo.status, 'ENDED', 'Run status should be ENDED'); }); await testParent.test('should persist runs mode between pages', { timeout }, async () => { await page.locator('.menu-item:nth-child(3) > .ph2').click(); await page.waitForSelector('#runStatusPanel'); const runInfo = await page.evaluate(() => { - const runNumber = document.querySelector('#runNumberLabel').textContent; const status = document.querySelector('#runStatusBadge').textContent; - return { runNumber, status }; + const selector = document.querySelector('#ongoingRunsFilter'); + const [, firstOption] = selector.options; + const isSelected = firstOption.selected; + const { value } = firstOption; + return { status, isSelected, value }; }); const isRunModeActivated = await page.evaluate(() => window.model.filterModel.isRunModeActivated); ok(isRunModeActivated); - ok(runInfo.runNumber, '#566138'); + ok(runInfo.isSelected); + ok(runInfo.value, '500001'); ok(runInfo.status, 'ENDED'); }); await testParent.test('should exit runs mode successfully', { timeout }, async () => { + // Verify run mode is currently active + let isRunModeActive = await page.evaluate(() => window.model.filterModel.isRunModeActivated); + ok(isRunModeActive, 'Run mode should be active before disabling'); + + // Click the run mode checkbox to disable it await page.locator('.form-check-label > .switch').click(); - await delay(50); - const isRunModeActivated = await page.evaluate(() => window.model.filterModel.isRunModeActivated); - ok(!isRunModeActivated); + await delay(100); + + // Verify run mode is now deactivated + isRunModeActive = await page.evaluate(() => window.model.filterModel.isRunModeActivated); + ok(!isRunModeActive, 'Run mode should be deactivated after clicking checkbox'); + + //check the filters element is back again + await page.locator('#filterElement'); }); }; diff --git a/QualityControl/test/setup/mockKafkaEvents.js b/QualityControl/test/setup/mockKafkaEvents.js new file mode 100644 index 000000000..f656bbaf0 --- /dev/null +++ b/QualityControl/test/setup/mockKafkaEvents.js @@ -0,0 +1,38 @@ +/** + * @license + * Copyright 2019-2020 CERN and copyright holders of ALICE O2. + * See http://alice-o2.web.cern.ch/copyright for details of the copyright holders. + * All rights not expressly granted are reserved. + * + * This software is distributed under the terms of the GNU General Public + * License v3 (GPL Version 3), copied verbatim in the file "COPYING". + * + * In applying this license CERN does not waive the privileges and immunities + * granted to it by virtue of its status as an Intergovernmental Organization + * or submit itself to any jurisdiction. + */ + +import { EmitterKeys } from '../../common/library/enums/emitterKeys.enum.js'; +import { Transition } from '../../common/library/enums/transition.enum.js'; + +/** + * Mock Kafka events for testing purposes + * @param {EventEmitter} eventEmitter - Event emitter to emit mock events + */ +export const setupMockKafkaEvents = (eventEmitter) => { + // Simulate some ongoing runs being started + const mockOngoingRuns = ['500001', '500002', '500003']; + + // Emit START_ACTIVITY events for mock runs after a short delay + setTimeout(() => { + mockOngoingRuns.forEach((runNumber) => { + eventEmitter.emit(EmitterKeys.RUN_TRACK, { + runNumber: parseInt(runNumber, 10), + transition: Transition.START_ACTIVITY, + timestamp: Date.now(), + }); + }); + }, 100); + + return mockOngoingRuns; +}; diff --git a/QualityControl/test/setup/testSetupForBkp.js b/QualityControl/test/setup/testSetupForBkp.js index 775beb77a..a37d49ab8 100644 --- a/QualityControl/test/setup/testSetupForBkp.js +++ b/QualityControl/test/setup/testSetupForBkp.js @@ -50,6 +50,41 @@ export const initializeNockForBkp = () => { timeO2End: null, }, }); + nock(BKP_URL) + .get(`/api/runs/500001${TOKEN_PATH}`) + .reply(200, { + data: { + timeO2End: null, + }, + }) + .get(`/api/runs/500001${TOKEN_PATH}`) + .reply(200, { + data: { + timeO2End: null, + }, + }) + .get(`/api/runs/500001${TOKEN_PATH}`) + .reply(200, { + data: { + timeO2End: '2023-12-01T10:30:00Z', + }, + }); + nock(BKP_URL) + .persist() + .get(`/api/runs/500002${TOKEN_PATH}`) + .reply(200, { + data: { + timeO2End: null, + }, + }); + nock(BKP_URL) + .persist() + .get(`/api/runs/500003${TOKEN_PATH}`) + .reply(200, { + data: { + timeO2End: null, + }, + }); nock(BKP_URL) .get(`/api/runs/566138${TOKEN_PATH}`) .reply(200, { diff --git a/QualityControl/test/setup/testSetupForCcdb.js b/QualityControl/test/setup/testSetupForCcdb.js index cfdbef373..be8b78d2d 100644 --- a/QualityControl/test/setup/testSetupForCcdb.js +++ b/QualityControl/test/setup/testSetupForCcdb.js @@ -70,6 +70,18 @@ export const initializeNockForCcdb = () => { .get(`${CCDB_API_PATH_LATEST}.*/RunNumber=0`) .reply(200, MOCK_LATEST_OBJECT_FILTERED_BY_RUN_NUMBER); + nock(CCDB_URL, xFieldHeader1).persist() + .get(`${CCDB_API_PATH_LATEST}.*/RunNumber=500001`) + .reply(200, MOCK_LATEST_OBJECT_FILTERED_BY_RUN_NUMBER); + + nock(CCDB_URL, xFieldHeader1).persist() + .get(`${CCDB_API_PATH_LATEST}.*/RunNumber=500002`) + .reply(200, MOCK_LATEST_OBJECT_FILTERED_BY_RUN_NUMBER); + + nock(CCDB_URL, xFieldHeader1).persist() + .get(`${CCDB_API_PATH_LATEST}.*/RunNumber=500003`) + .reply(200, MOCK_LATEST_OBJECT_FILTERED_BY_RUN_NUMBER); + nock(CCDB_URL, xFieldHeader1).persist() .get(`${CCDB_API_PATH_LATEST}.*/RunNumber=566138`) .reply(200, MOCK_LATEST_OBJECT_FILTERED_BY_RUN_NUMBER); From 5f9926ee48c0bebbdc0db7481eee14cf9af00fe5 Mon Sep 17 00:00:00 2001 From: George Raduta Date: Thu, 25 Sep 2025 13:30:41 +0200 Subject: [PATCH 59/77] Patch release for COG to fix an issue with undefined users (#3081) --- Control/package-lock.json | 4 ++-- Control/package.json | 2 +- Control/public/pages/Environments/Environments.page.js | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Control/package-lock.json b/Control/package-lock.json index 1ee176b29..e48cccd1f 100644 --- a/Control/package-lock.json +++ b/Control/package-lock.json @@ -1,12 +1,12 @@ { "name": "@aliceo2/control", - "version": "2.0.1", + "version": "2.0.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@aliceo2/control", - "version": "2.0.1", + "version": "2.0.2", "bundleDependencies": [ "@aliceo2/web-ui", "@grpc/grpc-js", diff --git a/Control/package.json b/Control/package.json index 75d5406ba..2ffb96072 100644 --- a/Control/package.json +++ b/Control/package.json @@ -1,6 +1,6 @@ { "name": "@aliceo2/control", - "version": "2.0.1", + "version": "2.0.2", "description": "ALICE O2 Control GUI", "author": "George Raduta", "contributors": [ diff --git a/Control/public/pages/Environments/Environments.page.js b/Control/public/pages/Environments/Environments.page.js index e20ec4f74..3a3f60952 100644 --- a/Control/public/pages/Environments/Environments.page.js +++ b/Control/public/pages/Environments/Environments.page.js @@ -221,7 +221,7 @@ const runColumn = (item, model) => { * Extracts the user information from the userVars object * @param {Object} userVars - The userVars object containing user information */ -const getUserFromUserVars = ({last_request_user}) => { +const getUserFromUserVars = ({last_request_user} = {}) => { if (!last_request_user) { return null; } From 78e5a74a1f9fcb79258785e53140d8e2d21e2369 Mon Sep 17 00:00:00 2001 From: George Raduta Date: Thu, 25 Sep 2025 13:35:10 +0200 Subject: [PATCH 60/77] [release/qcg/3.15.0] (#3082) * Bump QCG --- QualityControl/package-lock.json | 4 ++-- QualityControl/package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/QualityControl/package-lock.json b/QualityControl/package-lock.json index 5848e98bb..700a47e68 100644 --- a/QualityControl/package-lock.json +++ b/QualityControl/package-lock.json @@ -1,12 +1,12 @@ { "name": "@aliceo2/qc", - "version": "3.14.0", + "version": "3.15.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@aliceo2/qc", - "version": "3.14.0", + "version": "3.15.0", "bundleDependencies": [ "@aliceo2/web-ui", "jsroot", diff --git a/QualityControl/package.json b/QualityControl/package.json index d49685d46..93ac77dcb 100644 --- a/QualityControl/package.json +++ b/QualityControl/package.json @@ -1,6 +1,6 @@ { "name": "@aliceo2/qc", - "version": "3.14.0", + "version": "3.15.0", "description": "O2 Quality Control Web User Interface", "author": "George Raduta", "contributors": [ From 8205ce71c2f3faf0e6eadc61d055cb59b6f32357 Mon Sep 17 00:00:00 2001 From: Alejandro Mariscal Romero <87366244+mariscalromeroalejandro@users.noreply.github.com> Date: Fri, 26 Sep 2025 13:38:22 +0200 Subject: [PATCH 61/77] [OGUI-1774] Bugfix: get object by ID properly if in object view from a layout (#3084) * get object by name or id, based on a context * patch qcg to v3.15.1 --- QualityControl/package-lock.json | 4 +-- QualityControl/package.json | 2 +- QualityControl/public/object/QCObject.js | 36 +++++++++++++++---- .../pages/objectView/ObjectViewModel.js | 15 +++++--- 4 files changed, 44 insertions(+), 13 deletions(-) diff --git a/QualityControl/package-lock.json b/QualityControl/package-lock.json index 700a47e68..5799de790 100644 --- a/QualityControl/package-lock.json +++ b/QualityControl/package-lock.json @@ -1,12 +1,12 @@ { "name": "@aliceo2/qc", - "version": "3.15.0", + "version": "3.15.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@aliceo2/qc", - "version": "3.15.0", + "version": "3.15.1", "bundleDependencies": [ "@aliceo2/web-ui", "jsroot", diff --git a/QualityControl/package.json b/QualityControl/package.json index 93ac77dcb..066e26224 100644 --- a/QualityControl/package.json +++ b/QualityControl/package.json @@ -1,6 +1,6 @@ { "name": "@aliceo2/qc", - "version": "3.15.0", + "version": "3.15.1", "description": "O2 Quality Control Web User Interface", "author": "George Raduta", "contributors": [ diff --git a/QualityControl/public/object/QCObject.js b/QualityControl/public/object/QCObject.js index 8050280fc..e661f874e 100644 --- a/QualityControl/public/object/QCObject.js +++ b/QualityControl/public/object/QCObject.js @@ -122,7 +122,7 @@ export default class QCObject extends BaseViewModel { * @returns {undefined} */ sortListByField(listSource, field, order) { - listSource.sort((a, b) => typeof a[field] === 'string' ? + listSource?.sort((a, b) => typeof a[field] === 'string' ? this._compareStrings(a[field], b[field], order) : this._compareNumbers(a[field], b[field], order)); } @@ -310,7 +310,8 @@ export default class QCObject extends BaseViewModel { await Promise.allSettled(objectsName.map(async (objectName) => { let fetchedData = null; if (this.objects[objectName]?.isSuccess() && this.objects[objectName]?.payload?.name) { - const { refreshNeeded, data } = await this.checkIfRefreshObject(this.objects[objectName].payload); + const context = { objectName }; + const { refreshNeeded, data } = await this.checkIfRefreshObject(this.objects[objectName].payload, context); fetchedData = data; if (!refreshNeeded) { return; @@ -571,11 +572,32 @@ export default class QCObject extends BaseViewModel { * @param {object} object - The object to check for refresh. * @param {string} object.name - The name of the object to look up. * @param {string|number} object.id - The current ID of the object being validated. + * @param {object} context - Additional context to determine fetch method + * @param {string} context.objectName - Object name from URL params + * @param {string} context.objectId - Object ID from URL params * @returns {Promise} A promise that resolves to `true` if the object should be refreshed */ - async checkIfRefreshObject(object) { - const fetchFn = async () => - await this.model.services.object.getObjectByName(object.name, undefined, undefined, this); + async checkIfRefreshObject(object, context = {}) { + const { objectName, objectId } = context; + + const fetchFn = async () => { + if (objectId) { + return await this.model.services.object.getObjectById( + objectId, + undefined, + undefined, + this, + ); + } else { + return await this.model.services.object.getObjectByName( + objectName || object.name, + undefined, + undefined, + this, + ); + } + }; + const validateFn = (result) => result.isSuccess() && result.payload.id !== object.id; return this.model.filterModel.refreshCheck(fetchFn, validateFn); @@ -590,7 +612,9 @@ export default class QCObject extends BaseViewModel { this.selected = null; } if (this.selected && this.selected.name) { - const { refreshNeeded, data } = await this.checkIfRefreshObject(this.objects[this.selected.name].payload); + const context = { objectName: this.selected.name }; + const { refreshNeeded, data } = + await this.checkIfRefreshObject(this.objects[this.selected.name].payload, context); if (refreshNeeded && data?.payload) { this.select({ name: this.selected.name }, data.payload); } diff --git a/QualityControl/public/pages/objectView/ObjectViewModel.js b/QualityControl/public/pages/objectView/ObjectViewModel.js index 76b2ca773..c9e92f020 100644 --- a/QualityControl/public/pages/objectView/ObjectViewModel.js +++ b/QualityControl/public/pages/objectView/ObjectViewModel.js @@ -71,7 +71,8 @@ export default class ObjectViewModel extends BaseViewModel { async updateObjectSelection(object, validFrom = undefined, id = '') { const { objectName = undefined, objectId = undefined } = object; const { params } = this.model.router; - const { refreshNeeded, data } = await this.model.object.checkIfRefreshObject(this.selected.payload); + const context = { objectName: objectName || params.objectName, objectId: objectId || params.objectId }; + const { refreshNeeded, data } = await this.model.object.checkIfRefreshObject(this.selected.payload, context); if (!refreshNeeded) { return; } @@ -85,9 +86,15 @@ export default class ObjectViewModel extends BaseViewModel { } let currentParams = '?page=objectView'; - this.selected = data ?? params.objectName - ? await this.model.services.object.getObjectByName(params.objectName, id, validFrom, this) - : await this.model.services.object.getObjectById(params.objectId, id, validFrom, this); + + // Use refreshed data if available, otherwise fetch based on available parameters + if (data) { + this.selected = data; + } else if (params.objectName) { + this.selected = await this.model.services.object.getObjectByName(params.objectName, id, validFrom, this); + } else if (params.objectId) { + this.selected = await this.model.services.object.getObjectById(params.objectId, id, validFrom, this); + } setBrowserTabTitle(this.selected.payload.name); From cb2cb9aad14249acf7f172313e8322b36d43fe8b Mon Sep 17 00:00:00 2001 From: Alejandro Mariscal Romero <87366244+mariscalromeroalejandro@users.noreply.github.com> Date: Fri, 3 Oct 2025 11:03:36 +0200 Subject: [PATCH 62/77] [OGUI-1782] Bug in safari: error using filter property by an iterator (#3095) * bugfix: convert iterator into an array to be supported by safari * Bump QCG from 3.15.1 to 3.15.2 --- QualityControl/package-lock.json | 4 ++-- QualityControl/package.json | 2 +- .../public/pages/layoutListView/model/SearchFilterModel.js | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/QualityControl/package-lock.json b/QualityControl/package-lock.json index 5799de790..c9073803f 100644 --- a/QualityControl/package-lock.json +++ b/QualityControl/package-lock.json @@ -1,12 +1,12 @@ { "name": "@aliceo2/qc", - "version": "3.15.1", + "version": "3.15.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@aliceo2/qc", - "version": "3.15.1", + "version": "3.15.2", "bundleDependencies": [ "@aliceo2/web-ui", "jsroot", diff --git a/QualityControl/package.json b/QualityControl/package.json index 066e26224..1ce14209a 100644 --- a/QualityControl/package.json +++ b/QualityControl/package.json @@ -1,6 +1,6 @@ { "name": "@aliceo2/qc", - "version": "3.15.1", + "version": "3.15.2", "description": "O2 Quality Control Web User Interface", "author": "George Raduta", "contributors": [ diff --git a/QualityControl/public/pages/layoutListView/model/SearchFilterModel.js b/QualityControl/public/pages/layoutListView/model/SearchFilterModel.js index 7db8309f2..904b9d279 100644 --- a/QualityControl/public/pages/layoutListView/model/SearchFilterModel.js +++ b/QualityControl/public/pages/layoutListView/model/SearchFilterModel.js @@ -117,7 +117,7 @@ export class SearchFilterModel extends BaseViewModel { * @returns {Array} all active filters */ getAllActive() { - return this.filters.values().filter((filter) => filter.isActive()).toArray(); + return [...this.filters.values()].filter((f) => f.isActive()); } /** From fab41bfbddaffe6e58e076e444903ebc6455f820 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Oct 2025 13:39:56 +0200 Subject: [PATCH 63/77] Bump nock in /Control in the dev-dependencies group (#3086) Bumps the dev-dependencies group in /Control with 1 update: [nock](https://github.com/nock/nock). Updates `nock` from 14.0.0 to 15.0.0 - [Release notes](https://github.com/nock/nock/releases) - [Changelog](https://github.com/nock/nock/blob/main/CHANGELOG.md) - [Commits](https://github.com/nock/nock/compare/v14.0.0...v15.0.0) --- updated-dependencies: - dependency-name: nock dependency-version: 15.0.0 dependency-type: direct:development update-type: version-update:semver-major dependency-group: dev-dependencies ... --- Control/package-lock.json | 31 ++++++++++--------------------- Control/package.json | 2 +- 2 files changed, 11 insertions(+), 22 deletions(-) diff --git a/Control/package-lock.json b/Control/package-lock.json index e48cccd1f..214cc3578 100644 --- a/Control/package-lock.json +++ b/Control/package-lock.json @@ -24,7 +24,7 @@ "eslint": "^8.56.0", "jsonwebtoken": "^9.0.2", "mocha": "^11.7.0", - "nock": "^14.0.0", + "nock": "^15.0.0", "nyc": "^17.1.0", "proxyquire": "^2.1.3", "puppeteer": "^24.22.0", @@ -730,9 +730,9 @@ } }, "node_modules/@mswjs/interceptors": { - "version": "0.37.5", - "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.37.5.tgz", - "integrity": "sha512-AAwRb5vXFcY4L+FvZ7LZusDuZ0vEe0Zm8ohn1FM6/X7A3bj4mqmkAcGRWuvC2JwSygNwHAAmMnAI73vPHeqsHA==", + "version": "0.39.7", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.39.7.tgz", + "integrity": "sha512-sURvQbbKsq5f8INV54YJgJEdk8oxBanqkTiXXd33rKmofFCwZLhLRszPduMZ9TA9b8/1CHc/IJmOlBHJk2Q5AQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4185,18 +4185,17 @@ } }, "node_modules/nock": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/nock/-/nock-14.0.0.tgz", - "integrity": "sha512-3Z2ZoZoYTR/y2I+NI16+6IzfZFKBX7MrADtoBAm7v/QKqxQUhKw+Dh+847PPS1j/FDutjfIXfrh3CJF74yITWg==", + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/nock/-/nock-15.0.0.tgz", + "integrity": "sha512-EoAVk4Y8Yv4JUQz62sv8zmv+DoBblD/pht/q7aW/td1WietaFWrivzhMGGCLmx2qjpLcOrbyammedW8IRUU5TA==", "dev": true, "license": "MIT", "dependencies": { - "@mswjs/interceptors": "^0.37.3", - "json-stringify-safe": "^5.0.1", - "propagate": "^2.0.0" + "@mswjs/interceptors": "^0.39.5", + "json-stringify-safe": "^5.0.1" }, "engines": { - "node": ">= 18" + "node": ">=18.20.0 <20 || >=20.12.1" } }, "node_modules/node-preload": { @@ -4921,16 +4920,6 @@ "node": ">=0.4.0" } }, - "node_modules/propagate": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/propagate/-/propagate-2.0.1.tgz", - "integrity": "sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, "node_modules/protobufjs": { "version": "7.5.3", "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.3.tgz", diff --git a/Control/package.json b/Control/package.json index 2ffb96072..52a082a27 100644 --- a/Control/package.json +++ b/Control/package.json @@ -43,7 +43,7 @@ "eslint": "^8.56.0", "jsonwebtoken": "^9.0.2", "mocha": "^11.7.0", - "nock": "^14.0.0", + "nock": "^15.0.0", "nyc": "^17.1.0", "proxyquire": "^2.1.3", "puppeteer": "^24.22.0", From 085f04d47ad7f59ef230b9e37f9768e6c496c77d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Oct 2025 13:44:14 +0200 Subject: [PATCH 64/77] Bump winston from 3.17.0 to 3.18.0 in /Framework (#3090) Bumps [winston](https://github.com/winstonjs/winston) from 3.17.0 to 3.18.0. - [Release notes](https://github.com/winstonjs/winston/releases) - [Changelog](https://github.com/winstonjs/winston/blob/master/CHANGELOG.md) - [Commits](https://github.com/winstonjs/winston/compare/v3.17.0...v3.18.0) --- updated-dependencies: - dependency-name: winston dependency-version: 3.18.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: George Raduta --- Framework/package-lock.json | 120 +++++++++++++++++++++--------------- Framework/package.json | 2 +- 2 files changed, 70 insertions(+), 52 deletions(-) diff --git a/Framework/package-lock.json b/Framework/package-lock.json index b63ed05fd..0e8aa0129 100644 --- a/Framework/package-lock.json +++ b/Framework/package-lock.json @@ -17,7 +17,7 @@ "mysql": "^2.18.1", "openid-client": "^5.6.0", "protobufjs": "^7.5.0", - "winston": "3.17.0", + "winston": "3.18.0", "ws": "^8.18.0" }, "devDependencies": { @@ -405,11 +405,12 @@ } }, "node_modules/@dabh/diagnostics": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", - "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.5.tgz", + "integrity": "sha512-yKBJUnt9U2uuSZ0i1+Uh4ifeQBqqVgPC2jux99ixYW8n63f5d3O/HvsHiJm++idfKvRYsdbQHQ4tfkR3fTHHow==", + "license": "MIT", "dependencies": { - "colorspace": "1.1.x", + "@so-ric/colorspace": "^1.1.4", "enabled": "2.0.x", "kuler": "^2.0.0" } @@ -1074,6 +1075,16 @@ "node": ">=4" } }, + "node_modules/@so-ric/colorspace": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@so-ric/colorspace/-/colorspace-1.1.5.tgz", + "integrity": "sha512-m2yI81kZ+2J2psTYtmBs3lfl/LM4WgLMCzkweMfQdbbyndcyOmFa6pblHjvjfblphPaGDzTDK+lmC/dUMSnv0A==", + "license": "MIT", + "dependencies": { + "color": "^5.0.2", + "text-hex": "1.0.x" + } + }, "node_modules/@stylistic/eslint-plugin": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.4.0.tgz", @@ -1724,12 +1735,16 @@ } }, "node_modules/color": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", - "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/color/-/color-5.0.2.tgz", + "integrity": "sha512-e2hz5BzbUPcYlIRHo8ieAhYgoajrJr+hWoceg6E345TPsATMUKqDgzt8fSXZJJbxfpiPzkWyphz8yn8At7q3fA==", + "license": "MIT", "dependencies": { - "color-convert": "^1.9.3", - "color-string": "^1.6.0" + "color-convert": "^3.0.1", + "color-string": "^2.0.0" + }, + "engines": { + "node": ">=18" } }, "node_modules/color-convert": { @@ -1747,37 +1762,49 @@ "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==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.2.tgz", + "integrity": "sha512-RxmjYxbWemV9gKu4zPgiZagUxbH3RQpEIO77XoSSX0ivgABDZ+h8Zuash/EMFLTI4N9QgFPOJ6JQpPZKFxa+dA==", + "license": "MIT", "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" + "color-name": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/color-string/node_modules/color-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.0.2.tgz", + "integrity": "sha512-9vEt7gE16EW7Eu7pvZnR0abW9z6ufzhXxGXZEVU9IqPdlsUiMwJeJfRtq0zePUmnbHGT9zajca7mX8zgoayo4A==", + "license": "MIT", + "engines": { + "node": ">=12.20" } }, "node_modules/color/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==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.2.tgz", + "integrity": "sha512-UNqkvCDXstVck3kdowtOTWROIJQwafjOfXSmddoDrXo4cewMKmusCeF22Q24zvjR8nwWib/3S/dfyzPItPEiJg==", + "license": "MIT", "dependencies": { - "color-name": "1.1.3" + "color-name": "^2.0.0" + }, + "engines": { + "node": ">=14.6" } }, "node_modules/color/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==" - }, - "node_modules/colorspace": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", - "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", - "dependencies": { - "color": "^3.1.3", - "text-hex": "1.0.x" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.0.2.tgz", + "integrity": "sha512-9vEt7gE16EW7Eu7pvZnR0abW9z6ufzhXxGXZEVU9IqPdlsUiMwJeJfRtq0zePUmnbHGT9zajca7mX8zgoayo4A==", + "license": "MIT", + "engines": { + "node": ">=12.20" } }, "node_modules/combined-stream": { @@ -2086,7 +2113,8 @@ "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==" + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", + "license": "MIT" }, "node_modules/encodeurl": { "version": "2.0.0", @@ -3536,7 +3564,8 @@ "node_modules/kuler": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", - "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", + "license": "MIT" }, "node_modules/levn": { "version": "0.4.1", @@ -5110,19 +5139,6 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/simple-swizzle/node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" - }, "node_modules/sinon": { "version": "21.0.0", "resolved": "https://registry.npmjs.org/sinon/-/sinon-21.0.0.tgz", @@ -5479,7 +5495,8 @@ "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==" + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", + "license": "MIT" }, "node_modules/toidentifier": { "version": "1.0.1", @@ -5695,12 +5712,13 @@ "dev": true }, "node_modules/winston": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.17.0.tgz", - "integrity": "sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==", + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.18.0.tgz", + "integrity": "sha512-P1w1/arnQP3RmAlmYoSVt9UerYnwPo2yocGMKyb/D5nMR2PbBXTvqT0XxXGsyuRlq5BXLO0co3zJjgzTmp5gnw==", + "license": "MIT", "dependencies": { "@colors/colors": "^1.6.0", - "@dabh/diagnostics": "^2.0.2", + "@dabh/diagnostics": "^2.0.5", "async": "^3.2.3", "is-stream": "^2.0.0", "logform": "^2.7.0", diff --git a/Framework/package.json b/Framework/package.json index 8fd2b1efe..b9116aa07 100644 --- a/Framework/package.json +++ b/Framework/package.json @@ -38,7 +38,7 @@ "mithril": "1.1.7", "mysql": "^2.18.1", "openid-client": "^5.6.0", - "winston": "3.17.0", + "winston": "3.18.0", "ws": "^8.18.0", "protobufjs": "^7.5.0" }, From bb3d214129b2730d7ffb95b2e5014a2e676b649b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Oct 2025 13:46:29 +0200 Subject: [PATCH 65/77] Bump eslint-plugin-jsdoc in /InfoLogger in the dev-dependencies group (#3088) Bumps the dev-dependencies group in /InfoLogger with 1 update: [eslint-plugin-jsdoc](https://github.com/gajus/eslint-plugin-jsdoc). Updates `eslint-plugin-jsdoc` from 60.2.0 to 60.5.0 - [Release notes](https://github.com/gajus/eslint-plugin-jsdoc/releases) - [Changelog](https://github.com/gajus/eslint-plugin-jsdoc/blob/main/.releaserc) - [Commits](https://github.com/gajus/eslint-plugin-jsdoc/compare/v60.2.0...v60.5.0) --- updated-dependencies: - dependency-name: eslint-plugin-jsdoc dependency-version: 60.5.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-dependencies ... --- InfoLogger/package-lock.json | 44 +++++++++++++++++++++++++----------- InfoLogger/package.json | 2 +- 2 files changed, 32 insertions(+), 14 deletions(-) diff --git a/InfoLogger/package-lock.json b/InfoLogger/package-lock.json index da2816eac..73ff5d263 100644 --- a/InfoLogger/package-lock.json +++ b/InfoLogger/package-lock.json @@ -19,7 +19,7 @@ "@eslint/js": "^9.36.0", "@stylistic/eslint-plugin": "^5.4.0", "eslint": "^9.36.0", - "eslint-plugin-jsdoc": "^60.2.0", + "eslint-plugin-jsdoc": "^60.5.0", "globals": "^16.4.0", "mocha": "^11.7.0", "nyc": "^17.1.0", @@ -409,17 +409,17 @@ } }, "node_modules/@es-joy/jsdoccomment": { - "version": "0.58.0", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.58.0.tgz", - "integrity": "sha512-smMc5pDht/UVsCD3hhw/a/e/p8m0RdRYiluXToVfd+d4yaQQh7nn9bACjkk6nXJvat7EWPAxuFkMEFfrxeGa3Q==", + "version": "0.62.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.62.0.tgz", + "integrity": "sha512-yWi6sm7INEwnfS7IJvE0dU+RTrwzLPFcY7e7eGpu/l5Q9lWfQ2ROwZ0qVnc242jw2TUPsfHX3XMIISkGBv57RQ==", "dev": true, "license": "MIT", "dependencies": { "@types/estree": "^1.0.8", - "@typescript-eslint/types": "^8.43.0", + "@typescript-eslint/types": "^8.44.1", "comment-parser": "1.4.1", "esquery": "^1.6.0", - "jsdoc-type-pratt-parser": "~5.4.0" + "jsdoc-type-pratt-parser": "~5.9.0" }, "engines": { "node": ">=20.11.0" @@ -2236,19 +2236,20 @@ } }, "node_modules/eslint-plugin-jsdoc": { - "version": "60.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-60.2.0.tgz", - "integrity": "sha512-VQNycH0EbjIvgdX6llnLidv7X/yQTJMoQl/L5bXAPasAlPZQFJQi7r5OLc29ushbeQJ7+BFf8UFt9JAQNBZhXg==", + "version": "60.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-60.5.0.tgz", + "integrity": "sha512-3ivSigRDi/04GFRRYqvv4PgLD/+ZBLfHEk/0WKNpDBcmucnEAhqFjmJhLo4W4SIpXKZ/WVQNVPEsFXVPz9fRjA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "@es-joy/jsdoccomment": "~0.58.0", + "@es-joy/jsdoccomment": "~0.62.0", "are-docs-informative": "^0.0.2", "comment-parser": "1.4.1", "debug": "^4.4.3", "escape-string-regexp": "^4.0.0", "espree": "^10.4.0", "esquery": "^1.6.0", + "html-entities": "^2.6.0", "object-deep-merge": "^1.0.5", "parse-imports-exports": "^0.2.4", "semver": "^7.7.2", @@ -2982,6 +2983,23 @@ "node": ">=18.0.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", @@ -3377,9 +3395,9 @@ } }, "node_modules/jsdoc-type-pratt-parser": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-5.4.0.tgz", - "integrity": "sha512-F9GQ+F1ZU6qvSrZV8fNFpjDNf614YzR2eF6S0+XbDjAcUI28FSoXnYZFjQmb1kFx3rrJb5PnxUH3/Yti6fcM+g==", + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-5.9.2.tgz", + "integrity": "sha512-TYzkACp/wPvDJLRY7qpHXtrhgwoAaojIOnLaaVNi+AbPU2u1kkjfKd9hXXTq0qSAGsyYXvwUXt99h9I5iCmjjw==", "dev": true, "license": "MIT", "engines": { diff --git a/InfoLogger/package.json b/InfoLogger/package.json index 1db4d3abd..6f2183caf 100644 --- a/InfoLogger/package.json +++ b/InfoLogger/package.json @@ -37,7 +37,7 @@ "@eslint/js": "^9.36.0", "@stylistic/eslint-plugin": "^5.4.0", "eslint": "^9.36.0", - "eslint-plugin-jsdoc": "^60.2.0", + "eslint-plugin-jsdoc": "^60.5.0", "globals": "^16.4.0", "mocha": "^11.7.0", "nyc": "^17.1.0", From cb71471366b008867e928c4bda8bb33c5c7e2436 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Oct 2025 13:50:33 +0200 Subject: [PATCH 66/77] Bump the dev-dependencies group across 1 directory with 3 updates (#3097) Bumps the dev-dependencies group with 3 updates in the /Framework directory: [eslint-plugin-jsdoc](https://github.com/gajus/eslint-plugin-jsdoc), [nock](https://github.com/nock/nock) and [puppeteer](https://github.com/puppeteer/puppeteer). Updates `eslint-plugin-jsdoc` from 60.2.0 to 60.7.1 - [Release notes](https://github.com/gajus/eslint-plugin-jsdoc/releases) - [Changelog](https://github.com/gajus/eslint-plugin-jsdoc/blob/main/.releaserc) - [Commits](https://github.com/gajus/eslint-plugin-jsdoc/compare/v60.2.0...v60.7.1) Updates `nock` from 14.0.0 to 15.0.0 - [Release notes](https://github.com/nock/nock/releases) - [Changelog](https://github.com/nock/nock/blob/main/CHANGELOG.md) - [Commits](https://github.com/nock/nock/compare/v14.0.0...v15.0.0) Updates `puppeteer` from 24.22.1 to 24.23.0 - [Release notes](https://github.com/puppeteer/puppeteer/releases) - [Changelog](https://github.com/puppeteer/puppeteer/blob/main/CHANGELOG.md) - [Commits](https://github.com/puppeteer/puppeteer/compare/puppeteer-v24.22.1...puppeteer-v24.23.0) --- updated-dependencies: - dependency-name: eslint-plugin-jsdoc dependency-version: 60.7.1 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-dependencies - dependency-name: nock dependency-version: 15.0.0 dependency-type: direct:development update-type: version-update:semver-major dependency-group: dev-dependencies - dependency-name: puppeteer dependency-version: 24.23.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-dependencies ... --- Framework/package-lock.json | 138 +++++++++++++++++++----------------- Framework/package.json | 6 +- 2 files changed, 76 insertions(+), 68 deletions(-) diff --git a/Framework/package-lock.json b/Framework/package-lock.json index 0e8aa0129..577863daa 100644 --- a/Framework/package-lock.json +++ b/Framework/package-lock.json @@ -24,13 +24,13 @@ "@eslint/js": "^9.36.0", "@stylistic/eslint-plugin": "^5.4.0", "eslint": "^9.36.0", - "eslint-plugin-jsdoc": "^60.2.0", + "eslint-plugin-jsdoc": "^60.7.1", "globals": "^16.4.0", "long": "^5.3.1", "mocha": "^11.7.0", - "nock": "14.0.0", + "nock": "15.0.0", "nyc": "^17.1.0", - "puppeteer": "^24.22.1", + "puppeteer": "^24.23.0", "sinon": "21.0.0", "supertest": "^7.1.0" }, @@ -416,17 +416,17 @@ } }, "node_modules/@es-joy/jsdoccomment": { - "version": "0.58.0", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.58.0.tgz", - "integrity": "sha512-smMc5pDht/UVsCD3hhw/a/e/p8m0RdRYiluXToVfd+d4yaQQh7nn9bACjkk6nXJvat7EWPAxuFkMEFfrxeGa3Q==", + "version": "0.65.2", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.65.2.tgz", + "integrity": "sha512-/rrj5oayCc7xdoQZ24Tz/+V41IDm+9ILYpTFJOZgav9vfncMNApKR0t/4d1oRXYTcyLZEcGHGOg4xBsD0Doing==", "dev": true, "license": "MIT", "dependencies": { "@types/estree": "^1.0.8", - "@typescript-eslint/types": "^8.43.0", + "@typescript-eslint/types": "^8.45.0", "comment-parser": "1.4.1", "esquery": "^1.6.0", - "jsdoc-type-pratt-parser": "~5.4.0" + "jsdoc-type-pratt-parser": "~6.1.2" }, "engines": { "node": ">=20.11.0" @@ -885,9 +885,9 @@ } }, "node_modules/@mswjs/interceptors": { - "version": "0.37.5", - "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.37.5.tgz", - "integrity": "sha512-AAwRb5vXFcY4L+FvZ7LZusDuZ0vEe0Zm8ohn1FM6/X7A3bj4mqmkAcGRWuvC2JwSygNwHAAmMnAI73vPHeqsHA==", + "version": "0.39.7", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.39.7.tgz", + "integrity": "sha512-sURvQbbKsq5f8INV54YJgJEdk8oxBanqkTiXXd33rKmofFCwZLhLRszPduMZ9TA9b8/1CHc/IJmOlBHJk2Q5AQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1166,9 +1166,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.44.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.44.1.tgz", - "integrity": "sha512-Lk7uj7y9uQUOEguiDIDLYLJOrYHQa7oBiURYVFqIpGxclAFQ78f6VUOM8lI2XEuNOKNB7XuvM2+2cMXAoq4ALQ==", + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.45.0.tgz", + "integrity": "sha512-WugXLuOIq67BMgQInIxxnsSyRLFxdkJEJu8r4ngLR56q/4Q5LrbfkFRH27vMTjxEK8Pyz7QfzuZe/G15qQnVRA==", "dev": true, "license": "MIT", "engines": { @@ -1347,9 +1347,9 @@ "dev": true }, "node_modules/b4a": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.2.tgz", - "integrity": "sha512-DyUOdz+E8R6+sruDpQNOaV0y/dBbV6X/8ZkxrDcR0Ifc3BgKlpgG0VAtfOozA0eMtJO5GGe9FsZhueLs00pTww==", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", + "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", "dev": true, "license": "Apache-2.0", "peerDependencies": { @@ -1375,9 +1375,9 @@ "license": "Apache-2.0" }, "node_modules/bare-fs": { - "version": "4.4.4", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.4.4.tgz", - "integrity": "sha512-Q8yxM1eLhJfuM7KXVP3zjhBvtMJCYRByoTT+wHXjpdMELv0xICFJX+1w4c7csa+WZEOsq4ItJ4RGwvzid6m/dw==", + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.4.5.tgz", + "integrity": "sha512-TCtu93KGLu6/aiGWzMr12TmSRS6nKdfhAnzTQRbXoSWxkbb9eRd53jQ51jG7g1gYjjtto3hbBrrhzg6djcgiKg==", "dev": true, "license": "Apache-2.0", "optional": true, @@ -1697,9 +1697,9 @@ } }, "node_modules/chromium-bidi": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-8.0.0.tgz", - "integrity": "sha512-d1VmE0FD7lxZQHzcDUCKZSNRtRwISXDsdg4HjdTR5+Ll5nQ/vzU12JeNmupD6VWffrPSlrnGhEWlLESKH3VO+g==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-9.1.0.tgz", + "integrity": "sha512-rlUzQ4WzIAWdIbY/viPShhZU2n21CxDUgazXVbw4Hu1MwaeUSEksSeM6DqPgpRjCLXRk702AVRxJxoOz0dw4OA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -2039,9 +2039,9 @@ } }, "node_modules/devtools-protocol": { - "version": "0.0.1495869", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1495869.tgz", - "integrity": "sha512-i+bkd9UYFis40RcnkW7XrOprCujXRAHg62IVh/Ah3G8MmNXpCGt1m0dTFhSdx/AVs8XEMbdOGRwdkR1Bcta8AA==", + "version": "0.0.1508733", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1508733.tgz", + "integrity": "sha512-QJ1R5gtck6nDcdM+nlsaJXcelPEI7ZxSMw1ujHpO1c4+9l+Nue5qlebi9xO1Z2MGr92bFOQTW7/rrheh5hHxDg==", "dev": true, "license": "BSD-3-Clause" }, @@ -2314,19 +2314,20 @@ } }, "node_modules/eslint-plugin-jsdoc": { - "version": "60.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-60.2.0.tgz", - "integrity": "sha512-VQNycH0EbjIvgdX6llnLidv7X/yQTJMoQl/L5bXAPasAlPZQFJQi7r5OLc29ushbeQJ7+BFf8UFt9JAQNBZhXg==", + "version": "60.7.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-60.7.1.tgz", + "integrity": "sha512-JCLls7B3Tlb2YS5M6+aZqxb0gnEkr+H9/qMm5HSzynlvq3wqbxS7+4RS954EGuLrITfbaB6nmf3FyZAhOeCUEg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "@es-joy/jsdoccomment": "~0.58.0", + "@es-joy/jsdoccomment": "~0.65.2", "are-docs-informative": "^0.0.2", "comment-parser": "1.4.1", "debug": "^4.4.3", "escape-string-regexp": "^4.0.0", "espree": "^10.4.0", "esquery": "^1.6.0", + "html-entities": "^2.6.0", "object-deep-merge": "^1.0.5", "parse-imports-exports": "^0.2.4", "semver": "^7.7.2", @@ -3070,6 +3071,23 @@ "node": ">=18.0.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", @@ -3446,13 +3464,13 @@ } }, "node_modules/jsdoc-type-pratt-parser": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-5.4.0.tgz", - "integrity": "sha512-F9GQ+F1ZU6qvSrZV8fNFpjDNf614YzR2eF6S0+XbDjAcUI28FSoXnYZFjQmb1kFx3rrJb5PnxUH3/Yti6fcM+g==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-6.1.2.tgz", + "integrity": "sha512-ruy+JcplsWkqnYq1m/qokaErhEURwf/vhdTzlPNpei7RJabVWxPxGWoCPSCP0sbsz03d590hTkjLdXjyMxH0iA==", "dev": true, "license": "MIT", "engines": { - "node": ">=12.0.0" + "node": ">=20.0.0" } }, "node_modules/jsesc": { @@ -3971,18 +3989,17 @@ } }, "node_modules/nock": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/nock/-/nock-14.0.0.tgz", - "integrity": "sha512-3Z2ZoZoYTR/y2I+NI16+6IzfZFKBX7MrADtoBAm7v/QKqxQUhKw+Dh+847PPS1j/FDutjfIXfrh3CJF74yITWg==", + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/nock/-/nock-15.0.0.tgz", + "integrity": "sha512-EoAVk4Y8Yv4JUQz62sv8zmv+DoBblD/pht/q7aW/td1WietaFWrivzhMGGCLmx2qjpLcOrbyammedW8IRUU5TA==", "dev": true, "license": "MIT", "dependencies": { - "@mswjs/interceptors": "^0.37.3", - "json-stringify-safe": "^5.0.1", - "propagate": "^2.0.0" + "@mswjs/interceptors": "^0.39.5", + "json-stringify-safe": "^5.0.1" }, "engines": { - "node": ">= 18" + "node": ">=18.20.0 <20 || >=20.12.1" } }, "node_modules/node-preload": { @@ -4645,15 +4662,6 @@ "node": ">=0.4.0" } }, - "node_modules/propagate": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/propagate/-/propagate-2.0.1.tgz", - "integrity": "sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, "node_modules/protobufjs": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.0.tgz", @@ -4749,18 +4757,18 @@ } }, "node_modules/puppeteer": { - "version": "24.22.1", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.22.1.tgz", - "integrity": "sha512-jEeKDdJxXrv8Ki0I3q0amyv2FXZhucRG0Oh0EHF+igx8FiPG54y/E97j0+4WxITI7EjwoSxZFyxh61ZJ+TUo2w==", + "version": "24.23.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.23.0.tgz", + "integrity": "sha512-BVR1Lg8sJGKXY79JARdIssFWK2F6e1j+RyuJP66w4CUmpaXjENicmA3nNpUXA8lcTdDjAndtP+oNdni3T/qQqA==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { "@puppeteer/browsers": "2.10.10", - "chromium-bidi": "8.0.0", + "chromium-bidi": "9.1.0", "cosmiconfig": "^9.0.0", - "devtools-protocol": "0.0.1495869", - "puppeteer-core": "24.22.1", + "devtools-protocol": "0.0.1508733", + "puppeteer-core": "24.23.0", "typed-query-selector": "^2.12.0" }, "bin": { @@ -4771,18 +4779,18 @@ } }, "node_modules/puppeteer-core": { - "version": "24.22.1", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.22.1.tgz", - "integrity": "sha512-2IuC+w6270i8uCr2wGzD9pOi+JUe1CZn4TgPaonsgNryY1BGMcccdO0XBmekFlLYxkqaHrUMzzZnpc+T33mF9g==", + "version": "24.23.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.23.0.tgz", + "integrity": "sha512-yl25C59gb14sOdIiSnJ08XiPP+O2RjuyZmEG+RjYmCXO7au0jcLf7fRiyii96dXGUBW7Zwei/mVKfxMx/POeFw==", "dev": true, "license": "Apache-2.0", "dependencies": { "@puppeteer/browsers": "2.10.10", - "chromium-bidi": "8.0.0", + "chromium-bidi": "9.1.0", "debug": "^4.4.3", - "devtools-protocol": "0.0.1495869", + "devtools-protocol": "0.0.1508733", "typed-query-selector": "^2.12.0", - "webdriver-bidi-protocol": "0.2.11", + "webdriver-bidi-protocol": "0.3.6", "ws": "^8.18.3" }, "engines": { @@ -5684,9 +5692,9 @@ } }, "node_modules/webdriver-bidi-protocol": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.2.11.tgz", - "integrity": "sha512-Y9E1/oi4XMxcR8AT0ZC4OvYntl34SPgwjmELH+owjBr0korAX4jKgZULBWILGCVGdVCQ0dodTToIETozhG8zvA==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.3.6.tgz", + "integrity": "sha512-mlGndEOA9yK9YAbvtxaPTqdi/kaCWYYfwrZvGzcmkr/3lWM+tQj53BxtpVd6qbC6+E5OnHXgCcAhre6AkXzxjA==", "dev": true, "license": "Apache-2.0" }, diff --git a/Framework/package.json b/Framework/package.json index b9116aa07..e33135973 100644 --- a/Framework/package.json +++ b/Framework/package.json @@ -46,12 +46,12 @@ "@eslint/js": "^9.36.0", "@stylistic/eslint-plugin": "^5.4.0", "eslint": "^9.36.0", - "eslint-plugin-jsdoc": "^60.2.0", + "eslint-plugin-jsdoc": "^60.7.1", "globals": "^16.4.0", "mocha": "^11.7.0", - "nock": "14.0.0", + "nock": "15.0.0", "nyc": "^17.1.0", - "puppeteer": "^24.22.1", + "puppeteer": "^24.23.0", "sinon": "21.0.0", "supertest": "^7.1.0", "long": "^5.3.1" From 4a2715bae2e26e37a6189860130739bff8b273af Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Oct 2025 14:14:51 +0200 Subject: [PATCH 67/77] Bump the dev-dependencies group across 1 directory with 3 updates (#3096) * Bump the dev-dependencies group across 1 directory with 3 updates Bumps the dev-dependencies group with 3 updates in the /QualityControl directory: [eslint-plugin-jsdoc](https://github.com/gajus/eslint-plugin-jsdoc), [nock](https://github.com/nock/nock) and [puppeteer](https://github.com/puppeteer/puppeteer). Updates `eslint-plugin-jsdoc` from 60.1.1 to 60.7.1 - [Release notes](https://github.com/gajus/eslint-plugin-jsdoc/releases) - [Changelog](https://github.com/gajus/eslint-plugin-jsdoc/blob/main/.releaserc) - [Commits](https://github.com/gajus/eslint-plugin-jsdoc/compare/v60.1.1...v60.7.1) Updates `nock` from 14.0.4 to 15.0.0 - [Release notes](https://github.com/nock/nock/releases) - [Changelog](https://github.com/nock/nock/blob/main/CHANGELOG.md) - [Commits](https://github.com/nock/nock/compare/v14.0.4...v15.0.0) Updates `puppeteer` from 24.22.0 to 24.23.0 - [Release notes](https://github.com/puppeteer/puppeteer/releases) - [Changelog](https://github.com/puppeteer/puppeteer/blob/main/CHANGELOG.md) - [Commits](https://github.com/puppeteer/puppeteer/compare/puppeteer-v24.22.0...puppeteer-v24.23.0) --- updated-dependencies: - dependency-name: eslint-plugin-jsdoc dependency-version: 60.7.1 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-dependencies - dependency-name: nock dependency-version: 15.0.0 dependency-type: direct:development update-type: version-update:semver-major dependency-group: dev-dependencies - dependency-name: puppeteer dependency-version: 24.23.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-dependencies ... Signed-off-by: dependabot[bot] * Update docker deps * Update jsroot patch --------- Co-authored-by: George Raduta --- QualityControl/Dockerfile | 2 +- QualityControl/package-lock.json | 151 ++++++++++++++++--------------- QualityControl/package.json | 8 +- 3 files changed, 84 insertions(+), 77 deletions(-) diff --git a/QualityControl/Dockerfile b/QualityControl/Dockerfile index 9adda01a2..94061ef34 100644 --- a/QualityControl/Dockerfile +++ b/QualityControl/Dockerfile @@ -38,7 +38,7 @@ RUN apk add --no-cache \ freetype=2.13.2-r0 \ freetype-dev=2.13.2-r0 \ harfbuzz=8.5.0-r0 \ - ca-certificates=20250619-r0 + ca-certificates=20250911-r0 ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true ENV PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium-browser diff --git a/QualityControl/package-lock.json b/QualityControl/package-lock.json index c9073803f..cce33a297 100644 --- a/QualityControl/package-lock.json +++ b/QualityControl/package-lock.json @@ -16,7 +16,7 @@ "dependencies": { "@aliceo2/web-ui": "2.8.4", "joi": "18.0.0", - "jsroot": "7.9.0", + "jsroot": "7.9.1", "kafkajs": "^2.2.4", "mariadb": "^3.4.1", "sequelize": "^6.37.7", @@ -26,10 +26,10 @@ "@eslint/js": "^9.36.0", "@stylistic/eslint-plugin-js": "^4.4.0", "eslint": "^9.36.0", - "eslint-plugin-jsdoc": "^60.1.1", + "eslint-plugin-jsdoc": "^60.7.1", "globals": "^16.4.0", - "nock": "^14.0.4", - "puppeteer": "^24.22.0", + "nock": "^15.0.0", + "puppeteer": "^24.23.0", "sequelize-cli": "^6.6.2", "sinon": "^21.0.0", "supertest": "^7.1.0" @@ -237,17 +237,17 @@ } }, "node_modules/@es-joy/jsdoccomment": { - "version": "0.58.0", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.58.0.tgz", - "integrity": "sha512-smMc5pDht/UVsCD3hhw/a/e/p8m0RdRYiluXToVfd+d4yaQQh7nn9bACjkk6nXJvat7EWPAxuFkMEFfrxeGa3Q==", + "version": "0.65.2", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.65.2.tgz", + "integrity": "sha512-/rrj5oayCc7xdoQZ24Tz/+V41IDm+9ILYpTFJOZgav9vfncMNApKR0t/4d1oRXYTcyLZEcGHGOg4xBsD0Doing==", "dev": true, "license": "MIT", "dependencies": { "@types/estree": "^1.0.8", - "@typescript-eslint/types": "^8.43.0", + "@typescript-eslint/types": "^8.45.0", "comment-parser": "1.4.1", "esquery": "^1.6.0", - "jsdoc-type-pratt-parser": "~5.4.0" + "jsdoc-type-pratt-parser": "~6.1.2" }, "engines": { "node": ">=20.11.0" @@ -629,9 +629,9 @@ } }, "node_modules/@mswjs/interceptors": { - "version": "0.38.6", - "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.38.6.tgz", - "integrity": "sha512-qFlpmObPqeUs4u3oFYv/OM/xyX+pNa5TRAjqjvMhbGYlyMhzSrE5UfncL2rUcEeVfD9Gebgff73hPwqcOwJQNA==", + "version": "0.39.7", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.39.7.tgz", + "integrity": "sha512-sURvQbbKsq5f8INV54YJgJEdk8oxBanqkTiXXd33rKmofFCwZLhLRszPduMZ9TA9b8/1CHc/IJmOlBHJk2Q5AQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1197,9 +1197,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.44.0.tgz", - "integrity": "sha512-ZSl2efn44VsYM0MfDQe68RKzBz75NPgLQXuGypmym6QVOWL5kegTZuZ02xRAT9T+onqvM6T8CdQk0OwYMB6ZvA==", + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.45.0.tgz", + "integrity": "sha512-WugXLuOIq67BMgQInIxxnsSyRLFxdkJEJu8r4ngLR56q/4Q5LrbfkFRH27vMTjxEK8Pyz7QfzuZe/G15qQnVRA==", "dev": true, "license": "MIT", "engines": { @@ -1418,9 +1418,9 @@ } }, "node_modules/b4a": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.1.tgz", - "integrity": "sha512-ZovbrBV0g6JxK5cGUF1Suby1vLfKjv4RWi8IxoaO/Mon8BDD9I21RxjHFtgQ+kskJqLAVyQZly3uMBui+vhc8Q==", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", + "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", "dev": true, "license": "Apache-2.0", "peerDependencies": { @@ -1447,9 +1447,9 @@ "license": "Apache-2.0" }, "node_modules/bare-fs": { - "version": "4.4.4", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.4.4.tgz", - "integrity": "sha512-Q8yxM1eLhJfuM7KXVP3zjhBvtMJCYRByoTT+wHXjpdMELv0xICFJX+1w4c7csa+WZEOsq4ItJ4RGwvzid6m/dw==", + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.4.5.tgz", + "integrity": "sha512-TCtu93KGLu6/aiGWzMr12TmSRS6nKdfhAnzTQRbXoSWxkbb9eRd53jQ51jG7g1gYjjtto3hbBrrhzg6djcgiKg==", "dev": true, "license": "Apache-2.0", "optional": true, @@ -1801,9 +1801,9 @@ "license": "ISC" }, "node_modules/chromium-bidi": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-8.0.0.tgz", - "integrity": "sha512-d1VmE0FD7lxZQHzcDUCKZSNRtRwISXDsdg4HjdTR5+Ll5nQ/vzU12JeNmupD6VWffrPSlrnGhEWlLESKH3VO+g==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-9.1.0.tgz", + "integrity": "sha512-rlUzQ4WzIAWdIbY/viPShhZU2n21CxDUgazXVbw4Hu1MwaeUSEksSeM6DqPgpRjCLXRk702AVRxJxoOz0dw4OA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -2249,9 +2249,9 @@ } }, "node_modules/devtools-protocol": { - "version": "0.0.1495869", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1495869.tgz", - "integrity": "sha512-i+bkd9UYFis40RcnkW7XrOprCujXRAHg62IVh/Ah3G8MmNXpCGt1m0dTFhSdx/AVs8XEMbdOGRwdkR1Bcta8AA==", + "version": "0.0.1508733", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1508733.tgz", + "integrity": "sha512-QJ1R5gtck6nDcdM+nlsaJXcelPEI7ZxSMw1ujHpO1c4+9l+Nue5qlebi9xO1Z2MGr92bFOQTW7/rrheh5hHxDg==", "dev": true, "license": "BSD-3-Clause" }, @@ -2664,19 +2664,20 @@ } }, "node_modules/eslint-plugin-jsdoc": { - "version": "60.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-60.1.1.tgz", - "integrity": "sha512-eEyINuG4pZtVFplyCPTeUif/+C14zh4fmm5IrDE5YY2Zc3IYKpdGjeaWahJcxWDDwjTVjWCw1zL9XbX3Fb0Wjg==", + "version": "60.7.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-60.7.1.tgz", + "integrity": "sha512-JCLls7B3Tlb2YS5M6+aZqxb0gnEkr+H9/qMm5HSzynlvq3wqbxS7+4RS954EGuLrITfbaB6nmf3FyZAhOeCUEg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "@es-joy/jsdoccomment": "~0.58.0", + "@es-joy/jsdoccomment": "~0.65.2", "are-docs-informative": "^0.0.2", "comment-parser": "1.4.1", "debug": "^4.4.3", "escape-string-regexp": "^4.0.0", "espree": "^10.4.0", "esquery": "^1.6.0", + "html-entities": "^2.6.0", "object-deep-merge": "^1.0.5", "parse-imports-exports": "^0.2.4", "semver": "^7.7.2", @@ -2835,9 +2836,9 @@ } }, "node_modules/events-universal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.0.tgz", - "integrity": "sha512-1KVXP1Oq8SiC0HsRraCryA4XGrZ2uJgIt/h4X+mB/8pzMKE7L8yBDN2lBlqJZeUwLAt7kf80m/5GX3HvoCrSGA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", + "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3517,6 +3518,23 @@ "node": ">=18" } }, + "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/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", @@ -3899,13 +3917,13 @@ } }, "node_modules/jsdoc-type-pratt-parser": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-5.4.0.tgz", - "integrity": "sha512-F9GQ+F1ZU6qvSrZV8fNFpjDNf614YzR2eF6S0+XbDjAcUI28FSoXnYZFjQmb1kFx3rrJb5PnxUH3/Yti6fcM+g==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-6.1.2.tgz", + "integrity": "sha512-ruy+JcplsWkqnYq1m/qokaErhEURwf/vhdTzlPNpei7RJabVWxPxGWoCPSCP0sbsz03d590hTkjLdXjyMxH0iA==", "dev": true, "license": "MIT", "engines": { - "node": ">=12.0.0" + "node": ">=20.0.0" } }, "node_modules/jsdom": { @@ -4019,9 +4037,9 @@ } }, "node_modules/jsroot": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/jsroot/-/jsroot-7.9.0.tgz", - "integrity": "sha512-MHy7xk+oFXP3RWvU4qEGtsh02jcbapidP/ZCpg8av09u38g6KCf6jwrmZVgy7wWZAdAT53QC+blIqwRDC396pg==", + "version": "7.9.1", + "resolved": "https://registry.npmjs.org/jsroot/-/jsroot-7.9.1.tgz", + "integrity": "sha512-iG3O0sUhG9ffAcfPoFifXF+L2w3t8pdCTXHsvWaUexmHJxCOmdp6MT4Sp1F2F40ufB7G3qE75WUWu8UtO9lv3g==", "inBundle": true, "license": "MIT", "dependencies": { @@ -4553,15 +4571,14 @@ "license": "ISC" }, "node_modules/nock": { - "version": "14.0.4", - "resolved": "https://registry.npmjs.org/nock/-/nock-14.0.4.tgz", - "integrity": "sha512-86fh+gIKH8H02+y0/HKAOZZXn6OwgzXvl6JYwfjvKkoKxUWz54wIIDU/+w24xzMvk/R8pNVXOrvTubyl+Ml6cg==", + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/nock/-/nock-15.0.0.tgz", + "integrity": "sha512-EoAVk4Y8Yv4JUQz62sv8zmv+DoBblD/pht/q7aW/td1WietaFWrivzhMGGCLmx2qjpLcOrbyammedW8IRUU5TA==", "dev": true, "license": "MIT", "dependencies": { - "@mswjs/interceptors": "^0.38.5", - "json-stringify-safe": "^5.0.1", - "propagate": "^2.0.0" + "@mswjs/interceptors": "^0.39.5", + "json-stringify-safe": "^5.0.1" }, "engines": { "node": ">=18.20.0 <20 || >=20.12.1" @@ -5043,16 +5060,6 @@ "node": ">=0.4.0" } }, - "node_modules/propagate": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/propagate/-/propagate-2.0.1.tgz", - "integrity": "sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, "node_modules/proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", @@ -5158,18 +5165,18 @@ } }, "node_modules/puppeteer": { - "version": "24.22.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.22.0.tgz", - "integrity": "sha512-QabGIvu7F0hAMiKGHZCIRHMb6UoH0QAJA2OaqxEU2tL5noXPrxUcotg2l3ttOA4p1PFnVIGkr6PXRAWlM2evVQ==", + "version": "24.23.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.23.0.tgz", + "integrity": "sha512-BVR1Lg8sJGKXY79JARdIssFWK2F6e1j+RyuJP66w4CUmpaXjENicmA3nNpUXA8lcTdDjAndtP+oNdni3T/qQqA==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { "@puppeteer/browsers": "2.10.10", - "chromium-bidi": "8.0.0", + "chromium-bidi": "9.1.0", "cosmiconfig": "^9.0.0", - "devtools-protocol": "0.0.1495869", - "puppeteer-core": "24.22.0", + "devtools-protocol": "0.0.1508733", + "puppeteer-core": "24.23.0", "typed-query-selector": "^2.12.0" }, "bin": { @@ -5180,18 +5187,18 @@ } }, "node_modules/puppeteer-core": { - "version": "24.22.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.22.0.tgz", - "integrity": "sha512-oUeWlIg0pMz8YM5pu0uqakM+cCyYyXkHBxx9di9OUELu9X9+AYrNGGRLK9tNME3WfN3JGGqQIH3b4/E9LGek/w==", + "version": "24.23.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.23.0.tgz", + "integrity": "sha512-yl25C59gb14sOdIiSnJ08XiPP+O2RjuyZmEG+RjYmCXO7au0jcLf7fRiyii96dXGUBW7Zwei/mVKfxMx/POeFw==", "dev": true, "license": "Apache-2.0", "dependencies": { "@puppeteer/browsers": "2.10.10", - "chromium-bidi": "8.0.0", + "chromium-bidi": "9.1.0", "debug": "^4.4.3", - "devtools-protocol": "0.0.1495869", + "devtools-protocol": "0.0.1508733", "typed-query-selector": "^2.12.0", - "webdriver-bidi-protocol": "0.2.11", + "webdriver-bidi-protocol": "0.3.6", "ws": "^8.18.3" }, "engines": { @@ -6558,9 +6565,9 @@ } }, "node_modules/webdriver-bidi-protocol": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.2.11.tgz", - "integrity": "sha512-Y9E1/oi4XMxcR8AT0ZC4OvYntl34SPgwjmELH+owjBr0korAX4jKgZULBWILGCVGdVCQ0dodTToIETozhG8zvA==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.3.6.tgz", + "integrity": "sha512-mlGndEOA9yK9YAbvtxaPTqdi/kaCWYYfwrZvGzcmkr/3lWM+tQj53BxtpVd6qbC6+E5OnHXgCcAhre6AkXzxjA==", "dev": true, "license": "Apache-2.0" }, diff --git a/QualityControl/package.json b/QualityControl/package.json index 1ce14209a..3bc3b5b4b 100644 --- a/QualityControl/package.json +++ b/QualityControl/package.json @@ -40,7 +40,7 @@ "dependencies": { "@aliceo2/web-ui": "2.8.4", "joi": "18.0.0", - "jsroot": "7.9.0", + "jsroot": "7.9.1", "kafkajs": "^2.2.4", "mariadb": "^3.4.1", "sequelize": "^6.37.7", @@ -50,10 +50,10 @@ "@eslint/js": "^9.36.0", "@stylistic/eslint-plugin-js": "^4.4.0", "eslint": "^9.36.0", - "eslint-plugin-jsdoc": "^60.1.1", + "eslint-plugin-jsdoc": "^60.7.1", "globals": "^16.4.0", - "nock": "^14.0.4", - "puppeteer": "^24.22.0", + "nock": "^15.0.0", + "puppeteer": "^24.23.0", "sequelize-cli": "^6.6.2", "sinon": "^21.0.0", "supertest": "^7.1.0" From cdad3bf17bd3a2915525f86fc9839ec53a51e55a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Oct 2025 14:20:11 +0200 Subject: [PATCH 68/77] Bump actions/setup-node from 4 to 5 (#3092) Bumps [actions/setup-node](https://github.com/actions/setup-node) from 4 to 5. - [Release notes](https://github.com/actions/setup-node/releases) - [Commits](https://github.com/actions/setup-node/compare/v4...v5) --- updated-dependencies: - dependency-name: actions/setup-node dependency-version: '5' dependency-type: direct:production update-type: version-update:semver-major ... --- .github/workflows/configuration.yml | 4 ++-- .github/workflows/control.yml | 4 ++-- .github/workflows/framework.yml | 12 ++++++------ .github/workflows/infologger.yml | 4 ++-- .github/workflows/qc.yml | 6 +++--- .github/workflows/release.yml | 4 ++-- 6 files changed, 17 insertions(+), 17 deletions(-) diff --git a/.github/workflows/configuration.yml b/.github/workflows/configuration.yml index 3495d4884..3b4d48393 100644 --- a/.github/workflows/configuration.yml +++ b/.github/workflows/configuration.yml @@ -17,7 +17,7 @@ jobs: steps: - uses: actions/checkout@v5 - name: Setup node - uses: actions/setup-node@v4 + uses: actions/setup-node@v5 with: node-version: '22.x' - run: (cd Configuration/webapp; npm ci ) @@ -29,7 +29,7 @@ jobs: steps: - uses: actions/checkout@v5 - name: Setup node - uses: actions/setup-node@v4 + uses: actions/setup-node@v5 with: node-version: '22.x' - run: (cd Configuration/webapp; npm ci ) diff --git a/.github/workflows/control.yml b/.github/workflows/control.yml index d5f1ffafb..3dfb2c644 100644 --- a/.github/workflows/control.yml +++ b/.github/workflows/control.yml @@ -17,7 +17,7 @@ jobs: steps: - uses: actions/checkout@v5 - name: Setup node - uses: actions/setup-node@v4 + uses: actions/setup-node@v5 with: node-version: '22.x' - run: (cd Control; npm ci ) @@ -29,7 +29,7 @@ jobs: steps: - uses: actions/checkout@v5 - name: Setup node - uses: actions/setup-node@v4 + uses: actions/setup-node@v5 with: node-version: '22.x' - run: (cd Control; npm ci ) diff --git a/.github/workflows/framework.yml b/.github/workflows/framework.yml index 66d178972..6b7eb2644 100644 --- a/.github/workflows/framework.yml +++ b/.github/workflows/framework.yml @@ -17,7 +17,7 @@ jobs: steps: - uses: actions/checkout@v5 - name: Setup node - uses: actions/setup-node@v4 + uses: actions/setup-node@v5 with: node-version: '22.x' - run: (cd Framework/Backend; openssl req -new -newkey rsa:2048 -days 365 -nodes -x509 -subj "/C=CH/ST=Test/L=Test/O=Tst/CN=localhost" -keyout test.key -out test.pem) @@ -29,7 +29,7 @@ jobs: timeout-minutes: 6 steps: - uses: actions/checkout@v5 - - uses: actions/setup-node@v4 + - uses: actions/setup-node@v5 with: node-version: '22.x' - run: (cd Framework; npm ci ) @@ -47,7 +47,7 @@ jobs: timeout-minutes: 10 steps: - uses: actions/checkout@v5 - - uses: actions/setup-node@v4 + - uses: actions/setup-node@v5 with: node-version: '22.x' - run: cd Framework; npm ci @@ -64,7 +64,7 @@ jobs: run : (echo "Run Control tests by using @aliceo2/web-ui from local ../Framework";) - uses: actions/checkout@v5 - name: Setup node - uses: actions/setup-node@v4 + uses: actions/setup-node@v5 with: node-version: '22.x' - run: (cd Framework; npm ci) @@ -86,7 +86,7 @@ jobs: # run : (echo "Run QualityControl tests by using @aliceo2/web-ui from local ../Framework";) # - uses: actions/checkout@v5 # - name: Setup node - # uses: actions/setup-node@v4 + # uses: actions/setup-node@v5 # with: # node-version: '22.x' # - run: (cd Framework; npm ci) @@ -107,7 +107,7 @@ jobs: run : (echo "Run InfoLogger tests by using @aliceo2/web-ui from local ../Framework";) - uses: actions/checkout@v5 - name: Setup node - uses: actions/setup-node@v4 + uses: actions/setup-node@v5 with: node-version: '22.x' - run: (cd Framework; npm ci) diff --git a/.github/workflows/infologger.yml b/.github/workflows/infologger.yml index 624469141..16c4b4245 100644 --- a/.github/workflows/infologger.yml +++ b/.github/workflows/infologger.yml @@ -16,7 +16,7 @@ jobs: steps: - uses: actions/checkout@v5 - name: Setup node - uses: actions/setup-node@v4 + uses: actions/setup-node@v5 with: node-version: '22.x' - run: (cd InfoLogger; npm ci ) @@ -27,7 +27,7 @@ jobs: timeout-minutes: 6 steps: - uses: actions/checkout@v5 - - uses: actions/setup-node@v4 + - uses: actions/setup-node@v5 with: node-version: '22.x' - run: (cd InfoLogger; npm ci ) diff --git a/.github/workflows/qc.yml b/.github/workflows/qc.yml index 680986e0e..931e1e512 100644 --- a/.github/workflows/qc.yml +++ b/.github/workflows/qc.yml @@ -17,7 +17,7 @@ jobs: steps: - uses: actions/checkout@v5 - name: Setup node - uses: actions/setup-node@v4 + uses: actions/setup-node@v5 with: node-version: '22.x' - run: (cd QualityControl; npm ci ) @@ -30,7 +30,7 @@ jobs: steps: - uses: actions/checkout@v5 - name: Setup node - uses: actions/setup-node@v4 + uses: actions/setup-node@v5 with: node-version: '22.x' - run: (cd QualityControl; npm run docker-test ) @@ -42,7 +42,7 @@ jobs: steps: - uses: actions/checkout@v5 - name: Setup node - uses: actions/setup-node@v4 + uses: actions/setup-node@v5 with: node-version: '22.x' - run: mkdir -p QualityControl/coverage diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 51f7dba79..6c752ee84 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -12,7 +12,7 @@ jobs: TAG: ${{ steps.set-project.outputs.tag }} steps: - uses: actions/checkout@v5 - - uses: actions/setup-node@v4 + - uses: actions/setup-node@v5 with: node-version: '22.x' registry-url: 'https://registry.npmjs.org' @@ -52,7 +52,7 @@ jobs: ASSET_URL: ${{ steps.upload.outputs.asset_url }} steps: - uses: actions/checkout@v5 - - uses: actions/setup-node@v4 + - uses: actions/setup-node@v5 with: node-version: '22.x' registry-url: 'https://registry.npmjs.org' From 6709e9e93f79e8a2c85a28aba18da23d6ebac5de Mon Sep 17 00:00:00 2001 From: George Raduta Date: Mon, 6 Oct 2025 13:13:27 +0200 Subject: [PATCH 69/77] [OGUI-1761] Restrict Lock force ALL actions to admin users only (#3102) * updates the front-end to display lock buttons for 'Force Release ALL'&'Force Take ALL' to admin users only * updates the API endpoint to restrict those actions via the middleware * add tests for aforementioned cases Reason: * restriction is needed to prevent shifters from force taking all locks and attempting to start a run with detectors that should not be used. * in this manner the shifter has to take the locks one by one, confirming which ones are to be used with SL --- Control/lib/api.js | 9 ++++++++- Control/public/lock/lockPage.js | 4 +++- Control/test/api/lock/api-put-locks.test.js | 22 +++++++++++++++------ 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/Control/lib/api.js b/Control/lib/api.js index d77a5c6d2..328e023a6 100644 --- a/Control/lib/api.js +++ b/Control/lib/api.js @@ -260,9 +260,16 @@ module.exports.setup = (http, ws) => { requireDetectorOrGlobalRoleMiddleware, lockController.actionLockHandler.bind(lockController) ); + + http.put(`/locks/force/:action/${DetectorId.ALL}`, + minimumRoleMiddleware(Role.ADMIN), + addDetectorIdMiddleware(DetectorId.ALL), + lockController.actionForceLockHandler.bind(lockController) + ); http.put('/locks/force/:action/:detectorId', minimumRoleMiddleware(Role.GLOBAL), - lockController.actionForceLockHandler.bind(lockController)); + lockController.actionForceLockHandler.bind(lockController) + ); // Status Service http.get('/status/consul', statusController.getConsulStatus.bind(statusController)); diff --git a/Control/public/lock/lockPage.js b/Control/public/lock/lockPage.js index 24915eabf..8208aadf6 100644 --- a/Control/public/lock/lockPage.js +++ b/Control/public/lock/lockPage.js @@ -60,9 +60,11 @@ export const content = (model) => { Failure: (error) => errorPage(error), Success: (detectorsLocksState) => h('.flex-column', [ h('.flex-row.g2.pv2', [ - isUserAllowedRole(ROLES.Global) && [ + isUserAllowedRole(ROLES.Admin) && [ detectorLockActionButton(lock, DETECTOR_ALL, {}, DetectorLockAction.RELEASE, true, 'Force Release ALL'), detectorLockActionButton(lock, DETECTOR_ALL, {}, DetectorLockAction.TAKE, true, 'Force Take ALL'), + ], + isUserAllowedRole(ROLES.Global) && [ detectorLockActionButton(lock, DETECTOR_ALL, {}, DetectorLockAction.RELEASE, false, 'Release ALL*'), detectorLockActionButton(lock, DETECTOR_ALL, {}, DetectorLockAction.TAKE, false, 'Take ALL*'), ], diff --git a/Control/test/api/lock/api-put-locks.test.js b/Control/test/api/lock/api-put-locks.test.js index ca41de7c8..f02c5f2e8 100644 --- a/Control/test/api/lock/api-put-locks.test.js +++ b/Control/test/api/lock/api-put-locks.test.js @@ -138,13 +138,13 @@ describe(`'API - PUT - /locks/:action/:detectorId' test suite`, () => { }); }); - it('should successfully FORCE take ALL available lock as Global user', async () => { + it('should fail to FORCE take ALL available lock as Global user', async () => { await request(`${TEST_URL}/api/locks`) .put(`/force/${DetectorLockAction.TAKE}/ALL?token=${GLOBAL_TEST_TOKEN}`) - .expect(200, { - MID: { name: 'MID', state: 'TAKEN', owner: { username: 'global', fullName: 'Global User', personid: 1 } }, - DCS: { name: 'DCS', state: 'TAKEN', owner: { username: 'global', fullName: 'Global User', personid: 1 } }, - ODC: { name: 'ODC', state: 'TAKEN', owner: { username: 'global', fullName: 'Global User', personid: 1 } }, + .expect(403, { + message: 'Not enough permissions for this operation', + status: 403, + title: 'Unauthorized Access', }); }); @@ -198,7 +198,7 @@ describe(`'API - PUT - /locks/:action/:detectorId' test suite`, () => { }); }); - it('should successfully force release ALL locks from all users', async () => { + it('should fail to force release ALL locks from all users as global', async () => { // first we retake a lock to ensure we have a lock to release from different types of users await request(`${TEST_URL}/api/locks`) .put(`/${DetectorLockAction.TAKE}/DCS?token=${GLOBAL_TEST_TOKEN}`) @@ -210,6 +210,16 @@ describe(`'API - PUT - /locks/:action/:detectorId' test suite`, () => { await request(`${TEST_URL}/api/locks`) .put(`/force/${DetectorLockAction.RELEASE}/ALL?token=${GLOBAL_TEST_TOKEN}`) + .expect(403, { + message: 'Not enough permissions for this operation', + status: 403, + title: 'Unauthorized Access', + }); + }); + + it('should successfully force release ALL locks from all users as admin', async () => { + await request(`${TEST_URL}/api/locks`) + .put(`/force/${DetectorLockAction.RELEASE}/ALL?token=${ADMIN_TEST_TOKEN}`) .expect(200, { MID: { name: 'MID', state: 'FREE' }, DCS: { name: 'DCS', state: 'FREE' }, From e74270a8f1963b66e4eed0c213e01507d9a120e3 Mon Sep 17 00:00:00 2001 From: Deaponn Date: Wed, 11 Jun 2025 14:08:04 +0200 Subject: [PATCH 70/77] Configure docker compose to wait for previous stages Configure nginx proxy to communicate with Control backend which is running locally Configure Prettier (for formatting) and ESLint (for more agressive linting) --- Configuration/webapp/package-lock.json | 32 ++++++++++++------------- Configuration/webapp/prettier.config.ts | 22 +++++++++++++++++ 2 files changed, 38 insertions(+), 16 deletions(-) create mode 100644 Configuration/webapp/prettier.config.ts diff --git a/Configuration/webapp/package-lock.json b/Configuration/webapp/package-lock.json index 12b8d61b9..0539cdaec 100644 --- a/Configuration/webapp/package-lock.json +++ b/Configuration/webapp/package-lock.json @@ -1955,7 +1955,7 @@ "semver": "^7.3.7", "set-cookie-parser": "^2.6.0", "valibot": "^0.41.0", - "vite-node": "3.0.0-beta.2" + "vite-node": "^3.1.4" }, "bin": { "react-router": "bin.js" @@ -7604,8 +7604,7 @@ "license": "MIT", "dependencies": { "cookie": "^1.0.1", - "set-cookie-parser": "^2.6.0", - "turbo-stream": "2.4.0" + "set-cookie-parser": "^2.6.0" }, "engines": { "node": ">=20.0.0" @@ -8837,12 +8836,6 @@ "fsevents": "~2.3.3" } }, - "node_modules/turbo-stream": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/turbo-stream/-/turbo-stream-2.4.0.tgz", - "integrity": "sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==", - "license": "ISC" - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -9232,17 +9225,17 @@ } }, "node_modules/vite-node": { - "version": "3.0.0-beta.2", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.0.0-beta.2.tgz", - "integrity": "sha512-ofTf6cfRdL30Wbl9n/BX81EyIR5s4PReLmSurrxQ+koLaWUNOEo8E0lCM53OJkb8vpa2URM2nSrxZsIFyvY1rg==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.3.tgz", + "integrity": "sha512-gc8aAifGuDIpZHrPjuHyP4dpQmYXqWw7D1GmDnWeNWP654UEXzVfQ5IHPSK5HaHkwB/+p1atpYpSdw/2kOv8iQ==", "dev": true, "license": "MIT", "dependencies": { "cac": "^6.7.14", - "debug": "^4.4.0", - "es-module-lexer": "^1.5.4", - "pathe": "^1.1.2", - "vite": "^5.0.0 || ^6.0.0" + "debug": "^4.4.1", + "es-module-lexer": "^1.7.0", + "pathe": "^2.0.3", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" }, "bin": { "vite-node": "vite-node.mjs" @@ -9254,6 +9247,13 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/vite-node/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, "node_modules/vite-tsconfig-paths": { "version": "5.1.4", "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-5.1.4.tgz", diff --git a/Configuration/webapp/prettier.config.ts b/Configuration/webapp/prettier.config.ts new file mode 100644 index 000000000..5b892cee6 --- /dev/null +++ b/Configuration/webapp/prettier.config.ts @@ -0,0 +1,22 @@ +/** + * @license + * Copyright 2019-2020 CERN and copyright holders of ALICE O2. + * See http://alice-o2.web.cern.ch/copyright for details of the copyright holders. + * All rights not expressly granted are reserved. + * + * This software is distributed under the terms of the GNU General Public + * License v3 (GPL Version 3), copied verbatim in the file "COPYING". + * + * In applying this license CERN does not waive the privileges and immunities + * granted to it by virtue of its status as an Intergovernmental Organization + * or submit itself to any jurisdiction. + */ + +import { type Config } from 'prettier'; + +const config: Config = { + printWidth: 100, + trailingComma: 'es5', +}; + +export default config; From 0f192ce4dd39fbefb3aa8602b28f7bde141582ba Mon Sep 17 00:00:00 2001 From: Deaponn Date: Thu, 12 Jun 2025 18:02:28 +0200 Subject: [PATCH 71/77] revert: configuring ESLint and Prettier - commit fbafe80 --- Configuration/webapp/package-lock.json | 50 ++++++++++++-------------- Configuration/webapp/package.json | 1 - 2 files changed, 23 insertions(+), 28 deletions(-) diff --git a/Configuration/webapp/package-lock.json b/Configuration/webapp/package-lock.json index 0539cdaec..39321fc5e 100644 --- a/Configuration/webapp/package-lock.json +++ b/Configuration/webapp/package-lock.json @@ -22,7 +22,6 @@ "@stylistic/eslint-plugin": "^4.4.1", "@types/mocha": "^10.0.10", "@types/node": "^20", - "@types/prettier": "^2.7.3", "@types/react": "^19.0.1", "@types/react-dom": "^19.0.1", "eslint": "^9.28.0", @@ -1955,7 +1954,7 @@ "semver": "^7.3.7", "set-cookie-parser": "^2.6.0", "valibot": "^0.41.0", - "vite-node": "^3.1.4" + "vite-node": "3.0.0-beta.2" }, "bin": { "react-router": "bin.js" @@ -2378,13 +2377,6 @@ "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", "license": "MIT" }, - "node_modules/@types/prettier": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", - "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/prop-types": { "version": "15.7.15", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", @@ -4112,9 +4104,9 @@ } }, "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==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", + "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", "dev": true, "license": "MIT" }, @@ -5211,6 +5203,10 @@ "integrity": "sha512-O+7l9tPdHCU320IigZZPj5zmRCFG9xHmx9cU8FqU2Rp+JN714seHV+2S9+JslCpY4gJwU2vOGox0wzgae/MCEg==", "dev": true, "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, "engines": { "node": ">=18" }, @@ -7604,7 +7600,8 @@ "license": "MIT", "dependencies": { "cookie": "^1.0.1", - "set-cookie-parser": "^2.6.0" + "set-cookie-parser": "^2.6.0", + "turbo-stream": "2.4.0" }, "engines": { "node": ">=20.0.0" @@ -8836,6 +8833,12 @@ "fsevents": "~2.3.3" } }, + "node_modules/turbo-stream": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/turbo-stream/-/turbo-stream-2.4.0.tgz", + "integrity": "sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==", + "license": "ISC" + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -9225,17 +9228,17 @@ } }, "node_modules/vite-node": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.3.tgz", - "integrity": "sha512-gc8aAifGuDIpZHrPjuHyP4dpQmYXqWw7D1GmDnWeNWP654UEXzVfQ5IHPSK5HaHkwB/+p1atpYpSdw/2kOv8iQ==", + "version": "3.0.0-beta.2", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.0.0-beta.2.tgz", + "integrity": "sha512-ofTf6cfRdL30Wbl9n/BX81EyIR5s4PReLmSurrxQ+koLaWUNOEo8E0lCM53OJkb8vpa2URM2nSrxZsIFyvY1rg==", "dev": true, "license": "MIT", "dependencies": { "cac": "^6.7.14", - "debug": "^4.4.1", - "es-module-lexer": "^1.7.0", - "pathe": "^2.0.3", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + "debug": "^4.4.0", + "es-module-lexer": "^1.5.4", + "pathe": "^1.1.2", + "vite": "^5.0.0 || ^6.0.0" }, "bin": { "vite-node": "vite-node.mjs" @@ -9247,13 +9250,6 @@ "url": "https://opencollective.com/vitest" } }, - "node_modules/vite-node/node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true, - "license": "MIT" - }, "node_modules/vite-tsconfig-paths": { "version": "5.1.4", "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-5.1.4.tgz", diff --git a/Configuration/webapp/package.json b/Configuration/webapp/package.json index 55cadb98d..087124070 100644 --- a/Configuration/webapp/package.json +++ b/Configuration/webapp/package.json @@ -31,7 +31,6 @@ "@stylistic/eslint-plugin": "^4.4.1", "@types/mocha": "^10.0.10", "@types/node": "^20", - "@types/prettier": "^2.7.3", "@types/react": "^19.0.1", "@types/react-dom": "^19.0.1", "eslint": "^9.28.0", From 8ef15fb3bc7d1034702527c10403cdc930cd629c Mon Sep 17 00:00:00 2001 From: Deaponn Date: Tue, 1 Jul 2025 21:00:04 +0200 Subject: [PATCH 72/77] cherry-pick: apply 9c9337c (chore: fix ESLint for test files) --- Configuration/webapp/package-lock.json | 27 ++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/Configuration/webapp/package-lock.json b/Configuration/webapp/package-lock.json index 39321fc5e..8d9d1fb6d 100644 --- a/Configuration/webapp/package-lock.json +++ b/Configuration/webapp/package-lock.json @@ -4384,6 +4384,33 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/eslint-plugin-mocha": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-11.1.0.tgz", + "integrity": "sha512-rKntVWRsQFPbf8OkSgVNRVRrcVAPaGTyEgWCEyXaPDJkTl0v5/lwu1vTk5sWiUJU8l2sxwvGUZzSNrEKdVMeQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.1", + "globals": "^15.14.0" + }, + "peerDependencies": { + "eslint": ">=9.0.0" + } + }, + "node_modules/eslint-plugin-mocha/node_modules/globals": { + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/eslint-plugin-react": { "version": "7.37.5", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", From 3e81860c0d333f07bc344ec3ffa1812c8704d45b Mon Sep 17 00:00:00 2001 From: Deaponn Date: Sun, 17 Aug 2025 14:51:49 +0200 Subject: [PATCH 73/77] feat: implement testing using TypeScript --- Configuration/webapp/app/test/mocha-index.ts | 72 ++ .../webapp/app/test/services/session.spec.ts | 51 ++ Configuration/webapp/app/test/test-config.ts | 20 + Configuration/webapp/eslint.config.js | 7 + Configuration/webapp/package-lock.json | 797 +++++++++--------- Configuration/webapp/package.json | 4 + 6 files changed, 540 insertions(+), 411 deletions(-) create mode 100644 Configuration/webapp/app/test/mocha-index.ts create mode 100644 Configuration/webapp/app/test/services/session.spec.ts create mode 100644 Configuration/webapp/app/test/test-config.ts diff --git a/Configuration/webapp/app/test/mocha-index.ts b/Configuration/webapp/app/test/mocha-index.ts new file mode 100644 index 000000000..a7445c9c1 --- /dev/null +++ b/Configuration/webapp/app/test/mocha-index.ts @@ -0,0 +1,72 @@ +/** + * @license + * Copyright 2019-2020 CERN and copyright holders of ALICE O2. + * See http://alice-o2.web.cern.ch/copyright for details of the copyright holders. + * All rights not expressly granted are reserved. + * + * This software is distributed under the terms of the GNU General Public + * License v3 (GPL Version 3), copied verbatim in the file "COPYING". + * + * In applying this license CERN does not waive the privileges and immunities + * granted to it by virtue of its status as an Intergovernmental Organization + * or submit itself to any jurisdiction. + */ + +import puppeteer, { Browser, Page } from 'puppeteer'; +import config from './test-config'; + +let page: Page | null = null; + +type Global = { + test: { + page: Page | null; + browser: Browser | null; + helpers: Record; + }; +}; + +const global: Global = { + test: { + page: null, + browser: null, + helpers: {}, + }, +}; + +export const mochaHooks = { + async beforeAll() { + let browser: Browser | null = null; + const url = `http://${config.http.hostname}:${config.http.port}/`; + browser = await puppeteer.launch({ + args: ['--no-sandbox', '--disable-setuid-sandbox'], + headless: true, + }); + page = await browser.newPage(); + + // Listen to browser + page.on('error', (pageerror) => { + console.error(' ', pageerror); + }); + page.on('pageerror', (pageerror) => { + console.error(' ', pageerror); + }); + page.on('console', (msg) => { + console.log(msg.args()); + }); + await page.setViewport({ width: 1200, height: 770 }); + + global.test.page = page; + global.test.browser = browser; + global.test.helpers.url = url; + }, + + async afterAll() { + const { test: { browser } } = global; + if (browser === null) { + return; + } + await browser.close(); + }, +}; + +export default global; diff --git a/Configuration/webapp/app/test/services/session.spec.ts b/Configuration/webapp/app/test/services/session.spec.ts new file mode 100644 index 000000000..302baa732 --- /dev/null +++ b/Configuration/webapp/app/test/services/session.spec.ts @@ -0,0 +1,51 @@ +/** + * @license + * Copyright 2019-2020 CERN and copyright holders of ALICE O2. + * See http://alice-o2.web.cern.ch/copyright for details of the copyright holders. + * All rights not expressly granted are reserved. + * + * This software is distributed under the terms of the GNU General Public + * License v3 (GPL Version 3), copied verbatim in the file "COPYING". + * + * In applying this license CERN does not waive the privileges and immunities + * granted to it by virtue of its status as an Intergovernmental Organization + * or submit itself to any jurisdiction. + */ + +import assert from 'assert'; +import { Page } from 'puppeteer'; +import global from '../mocha-index'; +import { fetchSessionData, getSessionData } from '../../services/session'; + +describe('`pageRoot` test-suite', function () { + let url: string | null = null; + let page: Page | null = null; + + before(function () { + ({ test: { page, helpers: { url } } } = global); + }); + + it('should load root page', async function () { + if (page === null || url === null) { + assert.equal('Page is null', 'test suite failed'); + return; + } + + await page.goto(url, { waitUntil: 'networkidle0' }); + + const location = await page.evaluate(() => window.location); + assert.strictEqual(location.search, ''); + }); + + it('should load session data into memory', async function () { + if (page === null) { + assert.equal('Page is null', 'test suite failed'); + return; + } + + await fetchSessionData(); + const session = getSessionData(); + + assert.strictEqual(session.username, 'anonymous'); + }); +}); diff --git a/Configuration/webapp/app/test/test-config.ts b/Configuration/webapp/app/test/test-config.ts new file mode 100644 index 000000000..2b8cd1a4f --- /dev/null +++ b/Configuration/webapp/app/test/test-config.ts @@ -0,0 +1,20 @@ +/** + * @license + * Copyright 2019-2020 CERN and copyright holders of ALICE O2. + * See http://alice-o2.web.cern.ch/copyright for details of the copyright holders. + * All rights not expressly granted are reserved. + * + * This software is distributed under the terms of the GNU General Public + * License v3 (GPL Version 3), copied verbatim in the file "COPYING". + * + * In applying this license CERN does not waive the privileges and immunities + * granted to it by virtue of its status as an Intergovernmental Organization + * or submit itself to any jurisdiction. + */ + +export default { + http: { + port: 8080, + hostname: 'localhost', + }, +}; diff --git a/Configuration/webapp/eslint.config.js b/Configuration/webapp/eslint.config.js index 0d4a230b5..01f2baa82 100644 --- a/Configuration/webapp/eslint.config.js +++ b/Configuration/webapp/eslint.config.js @@ -307,4 +307,11 @@ export default tseslint.config( 'prefer-arrow-callback': 'off' }, }, + { + files: ['app/test/**'], + rules: { + 'no-console': 'off', + 'prefer-arrow-callback': 'off' + } + }, ); diff --git a/Configuration/webapp/package-lock.json b/Configuration/webapp/package-lock.json index 8d9d1fb6d..8b98d0f63 100644 --- a/Configuration/webapp/package-lock.json +++ b/Configuration/webapp/package-lock.json @@ -22,6 +22,7 @@ "@stylistic/eslint-plugin": "^4.4.1", "@types/mocha": "^10.0.10", "@types/node": "^20", + "@types/prettier": "^2.7.3", "@types/react": "^19.0.1", "@types/react-dom": "^19.0.1", "eslint": "^9.28.0", @@ -31,11 +32,9 @@ "globals": "^16.2.0", "mocha": "^11.7.1", "prettier": "3.5.3", - "puppeteer": "^24.18.0", - "tsx": "^4.20.4", "typescript": "^5.7.2", "typescript-eslint": "^8.34.0", - "vite": "^6.3.6", + "vite": "^6.3.5", "vite-tsconfig-paths": "^5.1.4" } }, @@ -46,18 +45,17 @@ "license": "GPL-3.0", "dependencies": { "express": "^4.21.2", - "helmet": "^8.1.0", + "helmet": "^8.0.0", "jsonwebtoken": "^9.0.0", "kafkajs": "^2.2.0", "mithril": "1.1.7", "mysql": "^2.18.1", "openid-client": "^5.6.0", - "protobufjs": "^7.5.0", "winston": "3.17.0", "ws": "^8.18.0" }, "engines": { - "node": ">= 22.x" + "node": ">= 20.x" } }, "node_modules/@ampproject/remapping": { @@ -129,13 +127,6 @@ "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", @@ -335,9 +326,9 @@ } }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -392,13 +383,13 @@ } }, "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.27.1.tgz", - "integrity": "sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.25.9.tgz", + "integrity": "sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -408,13 +399,13 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", - "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", + "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -440,14 +431,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", - "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz", + "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -477,17 +468,17 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.27.1.tgz", - "integrity": "sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.27.0.tgz", + "integrity": "sha512-vxaPFfJtHhgeOVXRKuHpHPAOgymmy8V8I65T1q53R7GCZlefKeCaTyDs3zOPHTTbmquvNlQYC5klEvWsBAtrBQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-syntax-jsx": "^7.27.1", - "@babel/plugin-transform-modules-commonjs": "^7.27.1", - "@babel/plugin-transform-typescript": "^7.27.1" + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-syntax-jsx": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.26.3", + "@babel/plugin-transform-typescript": "^7.27.0" }, "engines": { "node": ">=6.9.0" @@ -552,8 +543,8 @@ "integrity": "sha512-8OLQgDScAOHXnAz2cV+RfzzNMipuLVBz2biuAJFMV9bfkNf393je3VM8CLkjQodW5+iWsSJdSgSWT6rsZoXHPw==", "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -598,6 +589,21 @@ "stylis": "4.2.0" } }, + "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "node_modules/@emotion/babel-plugin/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@emotion/cache": { "version": "11.14.0", "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz", @@ -1472,8 +1478,12 @@ "integrity": "sha512-C512c1ytBTio4MrpWKlJpyFHT6+qfFL8SZ58zBzJ1OOzUEjHeF1BtjY2fH7n4x/g2OV/KiiMLAivOp1DXmiMMw==", "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { @@ -1485,6 +1495,15 @@ "node": ">=6.0.0" } }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.3.tgz", @@ -1566,6 +1585,12 @@ } } }, + "node_modules/@mui/material/node_modules/react-is": { + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.1.1.tgz", + "integrity": "sha512-tr41fA15Vn8p4X9ntI+yCyeGSf1TlYaY5vlTZfQmeLBrFo3psOPX6HhTDnFNL9uj3EhP0KAQ80cugCl4b4BERA==", + "license": "MIT" + }, "node_modules/@mui/private-theming": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-7.2.0.tgz", @@ -1714,6 +1739,12 @@ } } }, + "node_modules/@mui/utils/node_modules/react-is": { + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.1.1.tgz", + "integrity": "sha512-tr41fA15Vn8p4X9ntI+yCyeGSf1TlYaY5vlTZfQmeLBrFo3psOPX6HhTDnFNL9uj3EhP0KAQ80cugCl4b4BERA==", + "license": "MIT" + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1835,78 +1866,13 @@ "url": "https://opencollective.com/popperjs" } }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", - "license": "BSD-3-Clause" - }, "node_modules/@puppeteer/browsers": { - "version": "2.10.8", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.8.tgz", - "integrity": "sha512-f02QYEnBDE0p8cteNoPYHHjbDuwyfbe4cCIVlNi8/MRicIxFW4w4CfgU0LNgWEID6s06P+hRJ1qjpBLMhPRCiQ==", - "dev": true, + "version": "2.10.5", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.5.tgz", + "integrity": "sha512-eifa0o+i8dERnngJwKrfp3dEq7ia5XFyoqB17S4gK8GhsQE4/P8nxOfQSE0zQHxzzLo/cmF+7+ywEQ7wK7Fb+w==", "license": "Apache-2.0", "dependencies": { - "debug": "^4.4.1", + "debug": "^4.4.3", "extract-zip": "^2.0.1", "progress": "^2.0.3", "proxy-agent": "^6.5.0", @@ -1924,7 +1890,7 @@ "node_modules/@react-router/dev": { "version": "7.5.3", "resolved": "https://registry.npmjs.org/@react-router/dev/-/dev-7.5.3.tgz", - "integrity": "sha512-U+n8JYAREKg6eHIAXCjazsYlwPo/vcAbShpqePnDBUdDnePBwZ2JmoqhWV+7tIhyHvvHGQKlw6BcrSZtF549WQ==", + "integrity": "sha512-BuG83Ug2C/P+zMYErTz/KKuXoxbOefh3oR66r13XWG9txwooC9nt2QDt2u8yt7Eo/9BATnx+TmXnOHEWqMyB8w==", "dev": true, "license": "MIT", "dependencies": { @@ -1954,7 +1920,7 @@ "semver": "^7.3.7", "set-cookie-parser": "^2.6.0", "valibot": "^0.41.0", - "vite-node": "3.0.0-beta.2" + "vite-node": "^3.1.4" }, "bin": { "react-router": "bin.js" @@ -1981,19 +1947,6 @@ } } }, - "node_modules/@react-router/dev/node_modules/jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/@react-router/dev/node_modules/prettier": { "version": "2.8.8", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", @@ -2013,7 +1966,7 @@ "node_modules/@react-router/node": { "version": "7.5.3", "resolved": "https://registry.npmjs.org/@react-router/node/-/node-7.5.3.tgz", - "integrity": "sha512-w85YL6UngvhxGmgTBL3qwlVLFiA1EzNyG5S55qGcnhDikfb9z84gqMlTU4UqlZm8PjQ021HPTTN6I3kd7QE5sg==", + "integrity": "sha512-KrxfnfJVU1b+020VKemkxpc7ssItsAL8MOJthcoGwPyKwrgovdwc+8NKJUqw3P7yk/Si0ZmVh9QYAzi9qF96dg==", "license": "MIT", "dependencies": { "@mjackson/node-fetch-server": "^0.2.0", @@ -2342,9 +2295,9 @@ "license": "MIT" }, "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", "dev": true, "license": "MIT" }, @@ -2366,9 +2319,10 @@ "version": "20.19.2", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.2.tgz", "integrity": "sha512-9pLGGwdzOUBDYi0GNjM97FIA+f92fqSke6joWeBjWXllfNxZBs7qeMF7tvtOIsbY45xkWkxrdwUfUf3MnQa9gA==", + "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~6.21.0" + "undici-types": "~6.19.2" } }, "node_modules/@types/parse-json": { @@ -2377,6 +2331,13 @@ "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", "license": "MIT" }, + "node_modules/@types/prettier": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/prop-types": { "version": "15.7.15", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", @@ -2672,6 +2633,15 @@ "node": ">= 0.6" } }, + "node_modules/accepts/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==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/acorn": { "version": "8.15.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", @@ -2739,13 +2709,9 @@ "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" + "node": ">=12" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" @@ -2968,7 +2934,6 @@ "version": "1.6.7", "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", - "dev": true, "license": "Apache-2.0" }, "node_modules/babel-dead-code-elimination": { @@ -2999,6 +2964,51 @@ "npm": ">=6" } }, + "node_modules/babel-plugin-macros/node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/babel-plugin-macros/node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "license": "MIT", + "dependencies": { + "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/babel-plugin-macros/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -3007,24 +3017,24 @@ "license": "MIT" }, "node_modules/bare-events": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.6.1.tgz", - "integrity": "sha512-AuTJkq9XmE6Vk0FJVNq5QxETrSA/vKHarWVBG5l/JbdCL1prJemiyJqUS0jrlXO0MftuPq4m3YVYhoNc5+aE/g==", - "dev": true, + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", + "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", "license": "Apache-2.0", "optional": true }, "node_modules/bare-fs": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.2.1.tgz", - "integrity": "sha512-mELROzV0IhqilFgsl1gyp48pnZsaV9xhQapHLDsvn4d4ZTfbFhcghQezl7FTEDNBcGqLUnNI3lUlm6ecrLWdFA==", - "dev": true, + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.1.5.tgz", + "integrity": "sha512-1zccWBMypln0jEE05LzZt+V/8y8AQsQQqxtklqaIyg5nu6OAYFhZxPXinJTSG+kU5qyNmeLgcn9AW7eHiCHVLA==", "license": "Apache-2.0", "optional": true, "dependencies": { "bare-events": "^2.5.4", "bare-path": "^3.0.0", - "bare-stream": "^2.6.4" + "bare-stream": "^2.6.4", + "bare-url": "^2.2.2", + "fast-fifo": "^1.3.2" }, "engines": { "bare": ">=1.16.0" @@ -3039,10 +3049,9 @@ } }, "node_modules/bare-os": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.2.tgz", - "integrity": "sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==", - "dev": true, + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.1.tgz", + "integrity": "sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==", "license": "Apache-2.0", "optional": true, "engines": { @@ -3083,6 +3092,17 @@ } } }, + "node_modules/bare-url": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.2.2.tgz", + "integrity": "sha512-g+ueNGKkrjMazDG3elZO1pNs3HY5+mMmOet1jtKyhOaCnkLzitxf26z7hoAEkDNgdNmnc1KIlt/dw6Po6xZMpA==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-path": "^3.0.0" + } + }, "node_modules/basic-ftp": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", @@ -3145,7 +3165,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" @@ -3195,7 +3214,7 @@ "caniuse-lite": "^1.0.30001726", "electron-to-chromium": "^1.5.173", "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.3" + "update-browserslist-db": "^1.1.1" }, "bin": { "browserslist": "cli.js" @@ -3353,6 +3372,22 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/chalk/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/chokidar": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", @@ -3370,10 +3405,9 @@ } }, "node_modules/chromium-bidi": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-8.0.0.tgz", - "integrity": "sha512-d1VmE0FD7lxZQHzcDUCKZSNRtRwISXDsdg4HjdTR5+Ll5nQ/vzU12JeNmupD6VWffrPSlrnGhEWlLESKH3VO+g==", - "dev": true, + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-5.1.0.tgz", + "integrity": "sha512-9MSRhWRVoRPDG0TgzkHrshFSJJNZzfY5UFqUMuksg7zL1yoZIZ3jLB0YAgHclbiAxPI86pBnwDX1tbzoiV8aFw==", "license": "Apache-2.0", "dependencies": { "mitt": "^3.0.1", @@ -3408,6 +3442,22 @@ "node": ">=8" } }, + "node_modules/cliui/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/cliui/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -3573,9 +3623,10 @@ } }, "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "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/cookie": { @@ -3600,28 +3651,30 @@ "license": "MIT" }, "node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, "license": "MIT", "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" }, "engines": { - "node": ">=10" - } - }, - "node_modules/cosmiconfig/node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "license": "ISC", - "engines": { - "node": ">= 6" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/cross-spawn": { @@ -3726,9 +3779,9 @@ } }, "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -3756,9 +3809,9 @@ } }, "node_modules/dedent": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.6.0.tgz", - "integrity": "sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", + "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -3848,10 +3901,9 @@ } }, "node_modules/devtools-protocol": { - "version": "0.0.1475386", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1475386.tgz", - "integrity": "sha512-RQ809ykTfJ+dgj9bftdeL2vRVxASAuGU+I9LEx9Ij5TXU5HrgAQVmzi72VA+mkzscE12uzlRv5/tWWv9R9J1SA==", - "dev": true, + "version": "0.0.1464554", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1464554.tgz", + "integrity": "sha512-CAoP3lYfwAGQTaAXYvA6JZR0fjGUb7qec1qf4mToyoH2TZgUFeIqYcjh6f9jNuhHfuZiEdH+PONHYrLhRQX6aw==", "license": "BSD-3-Clause" }, "node_modules/diff": { @@ -3988,6 +4040,12 @@ "is-arrayish": "^0.2.1" } }, + "node_modules/error-ex/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==", + "license": "MIT" + }, "node_modules/es-abstract": { "version": "1.24.0", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", @@ -4104,9 +4162,9 @@ } }, "node_modules/es-module-lexer": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", - "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", + "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" }, @@ -4264,7 +4322,6 @@ "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", "optional": true, "engines": { @@ -4468,24 +4525,6 @@ "node": "*" } }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/eslint-plugin-react/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -4637,6 +4676,16 @@ "node": ">= 0.6" } }, + "node_modules/events-universal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", + "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.7.0" + } + }, "node_modules/exit-hook": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-2.2.1.tgz", @@ -5230,10 +5279,6 @@ "integrity": "sha512-O+7l9tPdHCU320IigZZPj5zmRCFG9xHmx9cU8FqU2Rp+JN714seHV+2S9+JslCpY4gJwU2vOGox0wzgae/MCEg==", "dev": true, "license": "MIT", - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, "engines": { "node": ">=18" }, @@ -5591,9 +5636,9 @@ } }, "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==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", "license": "MIT" }, "node_modules/is-async-function": { @@ -6069,6 +6114,18 @@ "@pkgjs/parseargs": "^0.11.0" } }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, "node_modules/jose": { "version": "4.15.9", "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz", @@ -6108,9 +6165,9 @@ } }, "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", "license": "MIT", "bin": { "jsesc": "bin/jsesc" @@ -6215,12 +6272,12 @@ } }, "node_modules/jwa": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz", - "integrity": "sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", "license": "MIT", "dependencies": { - "buffer-equal-constant-time": "^1.0.1", + "buffer-equal-constant-time": "1.0.1", "ecdsa-sig-formatter": "1.0.11", "safe-buffer": "^5.0.1" } @@ -6386,12 +6443,6 @@ "node": ">= 12.0.0" } }, - "node_modules/long": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", - "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", - "license": "Apache-2.0" - }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -6499,15 +6550,6 @@ "node": ">=4" } }, - "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==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", @@ -6520,6 +6562,15 @@ "node": ">= 0.6" } }, + "node_modules/mime-types/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==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", @@ -6668,15 +6719,6 @@ "dev": true, "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==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/netmask": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", @@ -6774,15 +6816,6 @@ "node": ">=0.10.0" } }, - "node_modules/object-hash": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", - "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, "node_modules/object-inspect": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", @@ -6947,6 +6980,15 @@ "node": ">=10" } }, + "node_modules/openid-client/node_modules/object-hash": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, "node_modules/openid-client/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -7233,9 +7275,9 @@ } }, "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", "dev": true, "funding": [ { @@ -7253,7 +7295,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.11", + "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -7351,30 +7393,6 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "license": "MIT" }, - "node_modules/protobufjs": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.3.tgz", - "integrity": "sha512-sildjKwVqOI2kmFDiXQ6aEB0fjYTafpEvIBs8tOR8qI4spuL9OPROLVu2qZqi/xgCfsHIwVqlaF8JBjWFHnKbw==", - "hasInstallScript": true, - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -7447,18 +7465,17 @@ } }, "node_modules/puppeteer": { - "version": "24.18.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.18.0.tgz", - "integrity": "sha512-Ke8oL/87GhzKIM2Ag6Yj49t5xbGc4rspGIuSuFLFCQBtYzWqCSanvqoCu08WkI78rbqcwnHjxiTH6oDlYFrjrw==", - "dev": true, + "version": "24.11.1", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.11.1.tgz", + "integrity": "sha512-QbccB/LgxX4tSZRzr9KQ1Jajdvu3n35Dlf/Otjz0QfR+6mDoZdMWLcWF94uQoC3OJerCyYm5hlU2Ru4nBoId2A==", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@puppeteer/browsers": "2.10.8", - "chromium-bidi": "8.0.0", + "@puppeteer/browsers": "2.10.5", + "chromium-bidi": "5.1.0", "cosmiconfig": "^9.0.0", - "devtools-protocol": "0.0.1475386", - "puppeteer-core": "24.18.0", + "devtools-protocol": "0.0.1464554", + "puppeteer-core": "24.11.1", "typed-query-selector": "^2.12.0" }, "bin": { @@ -7469,18 +7486,17 @@ } }, "node_modules/puppeteer-core": { - "version": "24.18.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.18.0.tgz", - "integrity": "sha512-As0BvfXxek2MbV0m7iqBmQKFnfSrzSvTM4zGipjd4cL+9f2Ccgut6RvHlc8+qBieKHqCMFy9BSI4QyveoYXTug==", - "dev": true, + "version": "24.11.1", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.11.1.tgz", + "integrity": "sha512-I0Gv3jWBRY9E3NTBElp7br7Gaid5RbFTxCRRMHym1kCf0ompO0Pel4REGsGDwMWkg3uwFzIH7t7qXs3T4DKRWA==", "license": "Apache-2.0", "dependencies": { - "@puppeteer/browsers": "2.10.8", - "chromium-bidi": "8.0.0", + "@puppeteer/browsers": "2.10.5", + "chromium-bidi": "5.1.0", "debug": "^4.4.1", - "devtools-protocol": "0.0.1475386", + "devtools-protocol": "0.0.1464554", "typed-query-selector": "^2.12.0", - "ws": "^8.18.3" + "ws": "^8.18.2" }, "engines": { "node": ">=18" @@ -7490,7 +7506,6 @@ "version": "9.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", - "dev": true, "license": "MIT", "dependencies": { "env-paths": "^2.2.1", @@ -7604,12 +7619,6 @@ "react": "^19.1.0" } }, - "node_modules/react-is": { - "version": "19.1.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.1.0.tgz", - "integrity": "sha512-Oe56aUPnkHyyDxxkvqtd7KkdQP5uIUfHxd5XTb3wE9d/kRnZLmKbDB0GWk919tdQ+mxxPtG6EAs6RMT6i1qtHg==", - "license": "MIT" - }, "node_modules/react-refresh": { "version": "0.14.2", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", @@ -7623,12 +7632,11 @@ "node_modules/react-router": { "version": "7.5.3", "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.5.3.tgz", - "integrity": "sha512-3iUDM4/fZCQ89SXlDa+Ph3MevBrozBAI655OAfWQlTm9nBR0IKlrmNwFow5lPHttbwvITZfkeeeZFP6zt3F7pw==", + "integrity": "sha512-U7Nv3y+bMimgWjhlT5CRdzHPu2/KVmqPwKUCChW8en5P3znxUqwlYFlbmyj8Rgp1SF6zs5X4+77kBVknkg6a0w==", "license": "MIT", "dependencies": { "cookie": "^1.0.1", - "set-cookie-parser": "^2.6.0", - "turbo-stream": "2.4.0" + "set-cookie-parser": "^2.6.0" }, "engines": { "node": ">=20.0.0" @@ -7758,21 +7766,19 @@ } }, "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.16.0", + "is-core-module": "^2.13.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" } @@ -7824,7 +7830,7 @@ "dev": true, "license": "MIT", "dependencies": { - "@types/estree": "1.0.8" + "@types/estree": "1.0.7" }, "bin": { "rollup": "dist/bin/rollup" @@ -8254,12 +8260,6 @@ "is-arrayish": "^0.3.1" } }, - "node_modules/simple-swizzle/node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "license": "MIT" - }, "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -8302,9 +8302,9 @@ } }, "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -8330,15 +8330,6 @@ "source-map": "^0.6.0" } }, - "node_modules/source-map-support/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==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/spdx-correct": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", @@ -8350,17 +8341,6 @@ "spdx-license-ids": "^3.0.0" } }, - "node_modules/spdx-correct/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": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, "node_modules/spdx-exceptions": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", @@ -8369,9 +8349,9 @@ "license": "CC-BY-3.0" }, "node_modules/spdx-expression-parse": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", - "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", + "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": { @@ -8437,14 +8417,11 @@ "version": "2.22.1", "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.1.tgz", "integrity": "sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==", - "dev": true, "license": "MIT", "dependencies": { + "events-universal": "^1.0.0", "fast-fifo": "^1.3.2", "text-decoder": "^1.1.0" - }, - "optionalDependencies": { - "bare-events": "^2.2.0" } }, "node_modules/string_decoder": { @@ -8709,10 +8686,9 @@ } }, "node_modules/tar-fs": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.0.tgz", - "integrity": "sha512-5Mty5y/sOF1YWj1J6GiBodjlDc05CUR8PKXrsnFAiSG0xA+GHeWLovaZPYUDXkH/1iKRf2+M5+OrRgzC7O9b7w==", - "dev": true, + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz", + "integrity": "sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==", "license": "MIT", "dependencies": { "pump": "^3.0.0", @@ -8752,9 +8728,9 @@ "license": "MIT" }, "node_modules/tinyglobby": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", - "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", + "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", "dev": true, "license": "MIT", "dependencies": { @@ -8813,9 +8789,9 @@ } }, "node_modules/tsconfck": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.6.tgz", - "integrity": "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.5.tgz", + "integrity": "sha512-CLDfGgUp7XPswWnezWwsCRxNmgQjhYq3VXHM0/XIRxhVrKw0M1if9agzryh1QS3nxjCROvV+xWxoJO1YctzzWg==", "dev": true, "license": "MIT", "bin": { @@ -8840,26 +8816,6 @@ "dev": true, "license": "0BSD" }, - "node_modules/tsx": { - "version": "4.20.5", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.5.tgz", - "integrity": "sha512-+wKjMNU9w/EaQayHXb7WA7ZaHY6hN8WgfvHNQ3t1PnU91/7O8TcTnIhCDYTZwnt8JsO9IBqZ30Ln1r7pPF52Aw==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "~0.25.0", - "get-tsconfig": "^4.7.5" - }, - "bin": { - "tsx": "dist/cli.mjs" - }, - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - } - }, "node_modules/turbo-stream": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/turbo-stream/-/turbo-stream-2.4.0.tgz", @@ -9034,18 +8990,19 @@ } }, "node_modules/undici": { - "version": "6.21.3", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.3.tgz", - "integrity": "sha512-gBLkYIlEnSp8pFbT64yFgGE6UIB9tAkhukC23PmMDCe5Nd+cRqKxSjw5y54MK2AZMgZfJWMaNE4nYUHgi1XEOw==", + "version": "6.21.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.2.tgz", + "integrity": "sha512-uROZWze0R0itiAKVPsYhFov9LxrPMHLMEQFszeI2gCN6bnIIZ8twzBCJcN2LJrBBLfrP0t1FW0g+JmKVl8Vk1g==", "license": "MIT", "engines": { "node": ">=18.17" } }, "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==", + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true, "license": "MIT" }, "node_modules/universalify": { @@ -9149,17 +9106,6 @@ "spdx-expression-parse": "^3.0.0" } }, - "node_modules/validate-npm-package-license/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": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.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", @@ -9180,9 +9126,9 @@ } }, "node_modules/vite": { - "version": "6.3.6", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.6.tgz", - "integrity": "sha512-0msEVHJEScQbhkbVTb/4iHZdJ6SXp/AvxL2sjwYQFfBqleHtnCqv1J3sa9zbWz/6kW1m9Tfzn92vW+kZ1WV6QA==", + "version": "6.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", + "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9255,17 +9201,17 @@ } }, "node_modules/vite-node": { - "version": "3.0.0-beta.2", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.0.0-beta.2.tgz", - "integrity": "sha512-ofTf6cfRdL30Wbl9n/BX81EyIR5s4PReLmSurrxQ+koLaWUNOEo8E0lCM53OJkb8vpa2URM2nSrxZsIFyvY1rg==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.3.tgz", + "integrity": "sha512-gc8aAifGuDIpZHrPjuHyP4dpQmYXqWw7D1GmDnWeNWP654UEXzVfQ5IHPSK5HaHkwB/+p1atpYpSdw/2kOv8iQ==", "dev": true, "license": "MIT", "dependencies": { "cac": "^6.7.14", - "debug": "^4.4.0", - "es-module-lexer": "^1.5.4", - "pathe": "^1.1.2", - "vite": "^5.0.0 || ^6.0.0" + "debug": "^4.4.1", + "es-module-lexer": "^1.7.0", + "pathe": "^2.0.3", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" }, "bin": { "vite-node": "vite-node.mjs" @@ -9277,6 +9223,13 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/vite-node/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, "node_modules/vite-tsconfig-paths": { "version": "5.1.4", "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-5.1.4.tgz", @@ -9297,6 +9250,13 @@ } } }, + "node_modules/webdriver-bidi-protocol": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.3.6.tgz", + "integrity": "sha512-mlGndEOA9yK9YAbvtxaPTqdi/kaCWYYfwrZvGzcmkr/3lWM+tQj53BxtpVd6qbC6+E5OnHXgCcAhre6AkXzxjA==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/which": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", @@ -9537,6 +9497,22 @@ "node": ">=8" } }, + "node_modules/wrap-ansi-cjs/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/wrap-ansi-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -9576,7 +9552,6 @@ "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -9642,7 +9617,7 @@ "yaml": "bin.mjs" }, "engines": { - "node": ">= 14.6" + "node": ">= 14" } }, "node_modules/yargs": { diff --git a/Configuration/webapp/package.json b/Configuration/webapp/package.json index 087124070..d22c1328f 100644 --- a/Configuration/webapp/package.json +++ b/Configuration/webapp/package.json @@ -40,7 +40,11 @@ "globals": "^16.2.0", "mocha": "^11.7.1", "prettier": "3.5.3", +<<<<<<< HEAD "puppeteer": "^24.18.0", +======= + "puppeteer": "^24.16.2", +>>>>>>> dcd805c7 (feat: implement testing using TypeScript) "tsx": "^4.20.4", "typescript": "^5.7.2", "typescript-eslint": "^8.34.0", From a1fe94f57bb73225617e2523b2f5a03f62c86504 Mon Sep 17 00:00:00 2001 From: Deaponn Date: Mon, 1 Sep 2025 14:02:05 +0200 Subject: [PATCH 74/77] build: fix package.json and package-lock.json --- Configuration/webapp/package-lock.json | 792 +++++++++++++------------ Configuration/webapp/package.json | 4 - 2 files changed, 411 insertions(+), 385 deletions(-) diff --git a/Configuration/webapp/package-lock.json b/Configuration/webapp/package-lock.json index 8b98d0f63..cca46f8e9 100644 --- a/Configuration/webapp/package-lock.json +++ b/Configuration/webapp/package-lock.json @@ -22,7 +22,6 @@ "@stylistic/eslint-plugin": "^4.4.1", "@types/mocha": "^10.0.10", "@types/node": "^20", - "@types/prettier": "^2.7.3", "@types/react": "^19.0.1", "@types/react-dom": "^19.0.1", "eslint": "^9.28.0", @@ -32,9 +31,11 @@ "globals": "^16.2.0", "mocha": "^11.7.1", "prettier": "3.5.3", + "puppeteer": "^24.18.0", + "tsx": "^4.20.4", "typescript": "^5.7.2", "typescript-eslint": "^8.34.0", - "vite": "^6.3.5", + "vite": "^6.3.6", "vite-tsconfig-paths": "^5.1.4" } }, @@ -45,17 +46,18 @@ "license": "GPL-3.0", "dependencies": { "express": "^4.21.2", - "helmet": "^8.0.0", + "helmet": "^8.1.0", "jsonwebtoken": "^9.0.0", "kafkajs": "^2.2.0", "mithril": "1.1.7", "mysql": "^2.18.1", "openid-client": "^5.6.0", + "protobufjs": "^7.5.0", "winston": "3.17.0", "ws": "^8.18.0" }, "engines": { - "node": ">= 20.x" + "node": ">= 22.x" } }, "node_modules/@ampproject/remapping": { @@ -127,6 +129,13 @@ "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", @@ -326,9 +335,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -383,13 +392,13 @@ } }, "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.25.9.tgz", - "integrity": "sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.27.1.tgz", + "integrity": "sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -399,13 +408,13 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", - "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -431,14 +440,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz", - "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", + "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -468,17 +477,17 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.27.0.tgz", - "integrity": "sha512-vxaPFfJtHhgeOVXRKuHpHPAOgymmy8V8I65T1q53R7GCZlefKeCaTyDs3zOPHTTbmquvNlQYC5klEvWsBAtrBQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.27.1.tgz", + "integrity": "sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.26.5", - "@babel/helper-validator-option": "^7.25.9", - "@babel/plugin-syntax-jsx": "^7.25.9", - "@babel/plugin-transform-modules-commonjs": "^7.26.3", - "@babel/plugin-transform-typescript": "^7.27.0" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-typescript": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -543,8 +552,8 @@ "integrity": "sha512-8OLQgDScAOHXnAz2cV+RfzzNMipuLVBz2biuAJFMV9bfkNf393je3VM8CLkjQodW5+iWsSJdSgSWT6rsZoXHPw==", "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -589,21 +598,6 @@ "stylis": "4.2.0" } }, - "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "license": "MIT" - }, - "node_modules/@emotion/babel-plugin/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/@emotion/cache": { "version": "11.14.0", "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz", @@ -1478,12 +1472,8 @@ "integrity": "sha512-C512c1ytBTio4MrpWKlJpyFHT6+qfFL8SZ58zBzJ1OOzUEjHeF1BtjY2fH7n4x/g2OV/KiiMLAivOp1DXmiMMw==", "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { @@ -1495,15 +1485,6 @@ "node": ">=6.0.0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.3.tgz", @@ -1585,12 +1566,6 @@ } } }, - "node_modules/@mui/material/node_modules/react-is": { - "version": "19.1.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.1.1.tgz", - "integrity": "sha512-tr41fA15Vn8p4X9ntI+yCyeGSf1TlYaY5vlTZfQmeLBrFo3psOPX6HhTDnFNL9uj3EhP0KAQ80cugCl4b4BERA==", - "license": "MIT" - }, "node_modules/@mui/private-theming": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-7.2.0.tgz", @@ -1739,12 +1714,6 @@ } } }, - "node_modules/@mui/utils/node_modules/react-is": { - "version": "19.1.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.1.1.tgz", - "integrity": "sha512-tr41fA15Vn8p4X9ntI+yCyeGSf1TlYaY5vlTZfQmeLBrFo3psOPX6HhTDnFNL9uj3EhP0KAQ80cugCl4b4BERA==", - "license": "MIT" - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1866,10 +1835,75 @@ "url": "https://opencollective.com/popperjs" } }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", + "license": "BSD-3-Clause" + }, "node_modules/@puppeteer/browsers": { - "version": "2.10.5", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.5.tgz", - "integrity": "sha512-eifa0o+i8dERnngJwKrfp3dEq7ia5XFyoqB17S4gK8GhsQE4/P8nxOfQSE0zQHxzzLo/cmF+7+ywEQ7wK7Fb+w==", + "version": "2.10.10", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.10.tgz", + "integrity": "sha512-3ZG500+ZeLql8rE0hjfhkycJjDj0pI/btEh3L9IkWUYcOrgP0xCNRq3HbtbqOPbvDhFaAWD88pDFtlLv8ns8gA==", + "dev": true, "license": "Apache-2.0", "dependencies": { "debug": "^4.4.3", @@ -1890,7 +1924,7 @@ "node_modules/@react-router/dev": { "version": "7.5.3", "resolved": "https://registry.npmjs.org/@react-router/dev/-/dev-7.5.3.tgz", - "integrity": "sha512-BuG83Ug2C/P+zMYErTz/KKuXoxbOefh3oR66r13XWG9txwooC9nt2QDt2u8yt7Eo/9BATnx+TmXnOHEWqMyB8w==", + "integrity": "sha512-U+n8JYAREKg6eHIAXCjazsYlwPo/vcAbShpqePnDBUdDnePBwZ2JmoqhWV+7tIhyHvvHGQKlw6BcrSZtF549WQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1920,7 +1954,7 @@ "semver": "^7.3.7", "set-cookie-parser": "^2.6.0", "valibot": "^0.41.0", - "vite-node": "^3.1.4" + "vite-node": "3.0.0-beta.2" }, "bin": { "react-router": "bin.js" @@ -1947,6 +1981,19 @@ } } }, + "node_modules/@react-router/dev/node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/@react-router/dev/node_modules/prettier": { "version": "2.8.8", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", @@ -1966,7 +2013,7 @@ "node_modules/@react-router/node": { "version": "7.5.3", "resolved": "https://registry.npmjs.org/@react-router/node/-/node-7.5.3.tgz", - "integrity": "sha512-KrxfnfJVU1b+020VKemkxpc7ssItsAL8MOJthcoGwPyKwrgovdwc+8NKJUqw3P7yk/Si0ZmVh9QYAzi9qF96dg==", + "integrity": "sha512-w85YL6UngvhxGmgTBL3qwlVLFiA1EzNyG5S55qGcnhDikfb9z84gqMlTU4UqlZm8PjQ021HPTTN6I3kd7QE5sg==", "license": "MIT", "dependencies": { "@mjackson/node-fetch-server": "^0.2.0", @@ -2295,9 +2342,9 @@ "license": "MIT" }, "node_modules/@types/estree": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", - "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true, "license": "MIT" }, @@ -2319,10 +2366,9 @@ "version": "20.19.2", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.2.tgz", "integrity": "sha512-9pLGGwdzOUBDYi0GNjM97FIA+f92fqSke6joWeBjWXllfNxZBs7qeMF7tvtOIsbY45xkWkxrdwUfUf3MnQa9gA==", - "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~6.19.2" + "undici-types": "~6.21.0" } }, "node_modules/@types/parse-json": { @@ -2331,13 +2377,6 @@ "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", "license": "MIT" }, - "node_modules/@types/prettier": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", - "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/prop-types": { "version": "15.7.15", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", @@ -2633,15 +2672,6 @@ "node": ">= 0.6" } }, - "node_modules/accepts/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==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/acorn": { "version": "8.15.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", @@ -2709,9 +2739,13 @@ "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": ">=12" + "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" @@ -2931,10 +2965,19 @@ } }, "node_modules/b4a": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", - "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", - "license": "Apache-2.0" + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", + "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", + "dev": true, + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } }, "node_modules/babel-dead-code-elimination": { "version": "1.0.10", @@ -2964,51 +3007,6 @@ "npm": ">=6" } }, - "node_modules/babel-plugin-macros/node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "license": "MIT", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/babel-plugin-macros/node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "license": "MIT", - "dependencies": { - "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/babel-plugin-macros/node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "license": "ISC", - "engines": { - "node": ">= 6" - } - }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -3017,16 +3015,17 @@ "license": "MIT" }, "node_modules/bare-events": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", - "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", - "license": "Apache-2.0", - "optional": true + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.7.0.tgz", + "integrity": "sha512-b3N5eTW1g7vXkw+0CXh/HazGTcO5KYuu/RCNaJbDMPI6LHDi+7qe8EmxKUVe1sUbY2KZOVZFyj62x0OEz9qyAA==", + "dev": true, + "license": "Apache-2.0" }, "node_modules/bare-fs": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.1.5.tgz", - "integrity": "sha512-1zccWBMypln0jEE05LzZt+V/8y8AQsQQqxtklqaIyg5nu6OAYFhZxPXinJTSG+kU5qyNmeLgcn9AW7eHiCHVLA==", + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.4.5.tgz", + "integrity": "sha512-TCtu93KGLu6/aiGWzMr12TmSRS6nKdfhAnzTQRbXoSWxkbb9eRd53jQ51jG7g1gYjjtto3hbBrrhzg6djcgiKg==", + "dev": true, "license": "Apache-2.0", "optional": true, "dependencies": { @@ -3049,9 +3048,10 @@ } }, "node_modules/bare-os": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.1.tgz", - "integrity": "sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.2.tgz", + "integrity": "sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==", + "dev": true, "license": "Apache-2.0", "optional": true, "engines": { @@ -3165,6 +3165,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" @@ -3214,7 +3215,7 @@ "caniuse-lite": "^1.0.30001726", "electron-to-chromium": "^1.5.173", "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.1" + "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" @@ -3372,22 +3373,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/chalk/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/chokidar": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", @@ -3405,9 +3390,10 @@ } }, "node_modules/chromium-bidi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-5.1.0.tgz", - "integrity": "sha512-9MSRhWRVoRPDG0TgzkHrshFSJJNZzfY5UFqUMuksg7zL1yoZIZ3jLB0YAgHclbiAxPI86pBnwDX1tbzoiV8aFw==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-9.1.0.tgz", + "integrity": "sha512-rlUzQ4WzIAWdIbY/viPShhZU2n21CxDUgazXVbw4Hu1MwaeUSEksSeM6DqPgpRjCLXRk702AVRxJxoOz0dw4OA==", + "dev": true, "license": "Apache-2.0", "dependencies": { "mitt": "^3.0.1", @@ -3442,22 +3428,6 @@ "node": ">=8" } }, - "node_modules/cliui/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/cliui/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -3623,10 +3593,9 @@ } }, "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, + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "license": "MIT" }, "node_modules/cookie": { @@ -3651,30 +3620,28 @@ "license": "MIT" }, "node_modules/cosmiconfig": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", - "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", - "dev": true, + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", "license": "MIT", "dependencies": { - "env-paths": "^2.2.1", - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0" + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" }, "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">=10" + } + }, + "node_modules/cosmiconfig/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "license": "ISC", + "engines": { + "node": ">= 6" } }, "node_modules/cross-spawn": { @@ -3809,9 +3776,9 @@ } }, "node_modules/dedent": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", - "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.6.0.tgz", + "integrity": "sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==", "dev": true, "license": "MIT", "peerDependencies": { @@ -3901,9 +3868,10 @@ } }, "node_modules/devtools-protocol": { - "version": "0.0.1464554", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1464554.tgz", - "integrity": "sha512-CAoP3lYfwAGQTaAXYvA6JZR0fjGUb7qec1qf4mToyoH2TZgUFeIqYcjh6f9jNuhHfuZiEdH+PONHYrLhRQX6aw==", + "version": "0.0.1508733", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1508733.tgz", + "integrity": "sha512-QJ1R5gtck6nDcdM+nlsaJXcelPEI7ZxSMw1ujHpO1c4+9l+Nue5qlebi9xO1Z2MGr92bFOQTW7/rrheh5hHxDg==", + "dev": true, "license": "BSD-3-Clause" }, "node_modules/diff": { @@ -4040,12 +4008,6 @@ "is-arrayish": "^0.2.1" } }, - "node_modules/error-ex/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==", - "license": "MIT" - }, "node_modules/es-abstract": { "version": "1.24.0", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", @@ -4322,6 +4284,7 @@ "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", "optional": true, "engines": { @@ -4441,33 +4404,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-plugin-mocha": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-11.1.0.tgz", - "integrity": "sha512-rKntVWRsQFPbf8OkSgVNRVRrcVAPaGTyEgWCEyXaPDJkTl0v5/lwu1vTk5sWiUJU8l2sxwvGUZzSNrEKdVMeQw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.1", - "globals": "^15.14.0" - }, - "peerDependencies": { - "eslint": ">=9.0.0" - } - }, - "node_modules/eslint-plugin-mocha/node_modules/globals": { - "version": "15.15.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", - "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/eslint-plugin-react": { "version": "7.37.5", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", @@ -4525,6 +4461,24 @@ "node": "*" } }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/eslint-plugin-react/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -5636,9 +5590,9 @@ } }, "node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "license": "MIT" }, "node_modules/is-async-function": { @@ -6114,18 +6068,6 @@ "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/jiti": { - "version": "1.21.7", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", - "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "bin": { - "jiti": "bin/jiti.js" - } - }, "node_modules/jose": { "version": "4.15.9", "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz", @@ -6165,9 +6107,9 @@ } }, "node_modules/jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "license": "MIT", "bin": { "jsesc": "bin/jsesc" @@ -6272,12 +6214,12 @@ } }, "node_modules/jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz", + "integrity": "sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==", "license": "MIT", "dependencies": { - "buffer-equal-constant-time": "1.0.1", + "buffer-equal-constant-time": "^1.0.1", "ecdsa-sig-formatter": "1.0.11", "safe-buffer": "^5.0.1" } @@ -6443,6 +6385,12 @@ "node": ">= 12.0.0" } }, + "node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "license": "Apache-2.0" + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -6550,6 +6498,15 @@ "node": ">=4" } }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", @@ -6562,15 +6519,6 @@ "node": ">= 0.6" } }, - "node_modules/mime-types/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==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", @@ -6719,6 +6667,15 @@ "dev": true, "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==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/netmask": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", @@ -6816,6 +6773,15 @@ "node": ">=0.10.0" } }, + "node_modules/object-hash": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, "node_modules/object-inspect": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", @@ -6980,15 +6946,6 @@ "node": ">=10" } }, - "node_modules/openid-client/node_modules/object-hash": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", - "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, "node_modules/openid-client/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -7275,9 +7232,9 @@ } }, "node_modules/postcss": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", - "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "dev": true, "funding": [ { @@ -7295,7 +7252,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.8", + "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -7393,6 +7350,30 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "license": "MIT" }, + "node_modules/protobufjs": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.4.tgz", + "integrity": "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -7465,17 +7446,18 @@ } }, "node_modules/puppeteer": { - "version": "24.11.1", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.11.1.tgz", - "integrity": "sha512-QbccB/LgxX4tSZRzr9KQ1Jajdvu3n35Dlf/Otjz0QfR+6mDoZdMWLcWF94uQoC3OJerCyYm5hlU2Ru4nBoId2A==", + "version": "24.23.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.23.0.tgz", + "integrity": "sha512-BVR1Lg8sJGKXY79JARdIssFWK2F6e1j+RyuJP66w4CUmpaXjENicmA3nNpUXA8lcTdDjAndtP+oNdni3T/qQqA==", + "dev": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@puppeteer/browsers": "2.10.5", - "chromium-bidi": "5.1.0", + "@puppeteer/browsers": "2.10.10", + "chromium-bidi": "9.1.0", "cosmiconfig": "^9.0.0", - "devtools-protocol": "0.0.1464554", - "puppeteer-core": "24.11.1", + "devtools-protocol": "0.0.1508733", + "puppeteer-core": "24.23.0", "typed-query-selector": "^2.12.0" }, "bin": { @@ -7486,17 +7468,19 @@ } }, "node_modules/puppeteer-core": { - "version": "24.11.1", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.11.1.tgz", - "integrity": "sha512-I0Gv3jWBRY9E3NTBElp7br7Gaid5RbFTxCRRMHym1kCf0ompO0Pel4REGsGDwMWkg3uwFzIH7t7qXs3T4DKRWA==", + "version": "24.23.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.23.0.tgz", + "integrity": "sha512-yl25C59gb14sOdIiSnJ08XiPP+O2RjuyZmEG+RjYmCXO7au0jcLf7fRiyii96dXGUBW7Zwei/mVKfxMx/POeFw==", + "dev": true, "license": "Apache-2.0", "dependencies": { - "@puppeteer/browsers": "2.10.5", - "chromium-bidi": "5.1.0", - "debug": "^4.4.1", - "devtools-protocol": "0.0.1464554", + "@puppeteer/browsers": "2.10.10", + "chromium-bidi": "9.1.0", + "debug": "^4.4.3", + "devtools-protocol": "0.0.1508733", "typed-query-selector": "^2.12.0", - "ws": "^8.18.2" + "webdriver-bidi-protocol": "0.3.6", + "ws": "^8.18.3" }, "engines": { "node": ">=18" @@ -7506,6 +7490,7 @@ "version": "9.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, "license": "MIT", "dependencies": { "env-paths": "^2.2.1", @@ -7619,6 +7604,12 @@ "react": "^19.1.0" } }, + "node_modules/react-is": { + "version": "19.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.0.tgz", + "integrity": "sha512-x3Ax3kNSMIIkyVYhWPyO09bu0uttcAIoecO/um/rKGQ4EltYWVYtyiGkS/3xMynrbVQdS69Jhlv8FXUEZehlzA==", + "license": "MIT" + }, "node_modules/react-refresh": { "version": "0.14.2", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", @@ -7632,11 +7623,12 @@ "node_modules/react-router": { "version": "7.5.3", "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.5.3.tgz", - "integrity": "sha512-U7Nv3y+bMimgWjhlT5CRdzHPu2/KVmqPwKUCChW8en5P3znxUqwlYFlbmyj8Rgp1SF6zs5X4+77kBVknkg6a0w==", + "integrity": "sha512-3iUDM4/fZCQ89SXlDa+Ph3MevBrozBAI655OAfWQlTm9nBR0IKlrmNwFow5lPHttbwvITZfkeeeZFP6zt3F7pw==", "license": "MIT", "dependencies": { "cookie": "^1.0.1", - "set-cookie-parser": "^2.6.0" + "set-cookie-parser": "^2.6.0", + "turbo-stream": "2.4.0" }, "engines": { "node": ">=20.0.0" @@ -7766,19 +7758,21 @@ } }, "node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "dev": true, + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "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" } @@ -7830,7 +7824,7 @@ "dev": true, "license": "MIT", "dependencies": { - "@types/estree": "1.0.7" + "@types/estree": "1.0.8" }, "bin": { "rollup": "dist/bin/rollup" @@ -8260,6 +8254,12 @@ "is-arrayish": "^0.3.1" } }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "license": "MIT" + }, "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -8302,9 +8302,9 @@ } }, "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==", + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -8330,6 +8330,15 @@ "source-map": "^0.6.0" } }, + "node_modules/source-map-support/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==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/spdx-correct": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", @@ -8341,6 +8350,17 @@ "spdx-license-ids": "^3.0.0" } }, + "node_modules/spdx-correct/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": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, "node_modules/spdx-exceptions": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", @@ -8349,9 +8369,9 @@ "license": "CC-BY-3.0" }, "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", + "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8414,9 +8434,10 @@ "license": "MIT" }, "node_modules/streamx": { - "version": "2.22.1", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.1.tgz", - "integrity": "sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==", + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", + "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", + "dev": true, "license": "MIT", "dependencies": { "events-universal": "^1.0.0", @@ -8689,6 +8710,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz", "integrity": "sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==", + "dev": true, "license": "MIT", "dependencies": { "pump": "^3.0.0", @@ -8728,9 +8750,9 @@ "license": "MIT" }, "node_modules/tinyglobby": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", - "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8789,9 +8811,9 @@ } }, "node_modules/tsconfck": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.5.tgz", - "integrity": "sha512-CLDfGgUp7XPswWnezWwsCRxNmgQjhYq3VXHM0/XIRxhVrKw0M1if9agzryh1QS3nxjCROvV+xWxoJO1YctzzWg==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.6.tgz", + "integrity": "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==", "dev": true, "license": "MIT", "bin": { @@ -8816,6 +8838,26 @@ "dev": true, "license": "0BSD" }, + "node_modules/tsx": { + "version": "4.20.6", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.6.tgz", + "integrity": "sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.25.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, "node_modules/turbo-stream": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/turbo-stream/-/turbo-stream-2.4.0.tgz", @@ -8990,19 +9032,18 @@ } }, "node_modules/undici": { - "version": "6.21.2", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.2.tgz", - "integrity": "sha512-uROZWze0R0itiAKVPsYhFov9LxrPMHLMEQFszeI2gCN6bnIIZ8twzBCJcN2LJrBBLfrP0t1FW0g+JmKVl8Vk1g==", + "version": "6.21.3", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.3.tgz", + "integrity": "sha512-gBLkYIlEnSp8pFbT64yFgGE6UIB9tAkhukC23PmMDCe5Nd+cRqKxSjw5y54MK2AZMgZfJWMaNE4nYUHgi1XEOw==", "license": "MIT", "engines": { "node": ">=18.17" } }, "node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", - "dev": true, + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "license": "MIT" }, "node_modules/universalify": { @@ -9106,6 +9147,17 @@ "spdx-expression-parse": "^3.0.0" } }, + "node_modules/validate-npm-package-license/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": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.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", @@ -9126,9 +9178,9 @@ } }, "node_modules/vite": { - "version": "6.3.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", - "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", + "version": "6.3.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.6.tgz", + "integrity": "sha512-0msEVHJEScQbhkbVTb/4iHZdJ6SXp/AvxL2sjwYQFfBqleHtnCqv1J3sa9zbWz/6kW1m9Tfzn92vW+kZ1WV6QA==", "dev": true, "license": "MIT", "dependencies": { @@ -9201,17 +9253,17 @@ } }, "node_modules/vite-node": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.3.tgz", - "integrity": "sha512-gc8aAifGuDIpZHrPjuHyP4dpQmYXqWw7D1GmDnWeNWP654UEXzVfQ5IHPSK5HaHkwB/+p1atpYpSdw/2kOv8iQ==", + "version": "3.0.0-beta.2", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.0.0-beta.2.tgz", + "integrity": "sha512-ofTf6cfRdL30Wbl9n/BX81EyIR5s4PReLmSurrxQ+koLaWUNOEo8E0lCM53OJkb8vpa2URM2nSrxZsIFyvY1rg==", "dev": true, "license": "MIT", "dependencies": { "cac": "^6.7.14", - "debug": "^4.4.1", - "es-module-lexer": "^1.7.0", - "pathe": "^2.0.3", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + "debug": "^4.4.0", + "es-module-lexer": "^1.5.4", + "pathe": "^1.1.2", + "vite": "^5.0.0 || ^6.0.0" }, "bin": { "vite-node": "vite-node.mjs" @@ -9223,13 +9275,6 @@ "url": "https://opencollective.com/vitest" } }, - "node_modules/vite-node/node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true, - "license": "MIT" - }, "node_modules/vite-tsconfig-paths": { "version": "5.1.4", "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-5.1.4.tgz", @@ -9497,22 +9542,6 @@ "node": ">=8" } }, - "node_modules/wrap-ansi-cjs/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/wrap-ansi-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -9552,6 +9581,7 @@ "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -9617,7 +9647,7 @@ "yaml": "bin.mjs" }, "engines": { - "node": ">= 14" + "node": ">= 14.6" } }, "node_modules/yargs": { diff --git a/Configuration/webapp/package.json b/Configuration/webapp/package.json index d22c1328f..087124070 100644 --- a/Configuration/webapp/package.json +++ b/Configuration/webapp/package.json @@ -40,11 +40,7 @@ "globals": "^16.2.0", "mocha": "^11.7.1", "prettier": "3.5.3", -<<<<<<< HEAD "puppeteer": "^24.18.0", -======= - "puppeteer": "^24.16.2", ->>>>>>> dcd805c7 (feat: implement testing using TypeScript) "tsx": "^4.20.4", "typescript": "^5.7.2", "typescript-eslint": "^8.34.0", From 63e8534483945ff5da5ff604ce91a338c9df4fd6 Mon Sep 17 00:00:00 2001 From: Deaponn Date: Mon, 1 Sep 2025 14:53:03 +0200 Subject: [PATCH 75/77] test: update tests and move them to correct directory --- Configuration/webapp/app/test/mocha-index.ts | 72 ------------------- .../webapp/app/test/services/session.spec.ts | 51 ------------- Configuration/webapp/app/test/test-config.ts | 20 ------ 3 files changed, 143 deletions(-) delete mode 100644 Configuration/webapp/app/test/mocha-index.ts delete mode 100644 Configuration/webapp/app/test/services/session.spec.ts delete mode 100644 Configuration/webapp/app/test/test-config.ts diff --git a/Configuration/webapp/app/test/mocha-index.ts b/Configuration/webapp/app/test/mocha-index.ts deleted file mode 100644 index a7445c9c1..000000000 --- a/Configuration/webapp/app/test/mocha-index.ts +++ /dev/null @@ -1,72 +0,0 @@ -/** - * @license - * Copyright 2019-2020 CERN and copyright holders of ALICE O2. - * See http://alice-o2.web.cern.ch/copyright for details of the copyright holders. - * All rights not expressly granted are reserved. - * - * This software is distributed under the terms of the GNU General Public - * License v3 (GPL Version 3), copied verbatim in the file "COPYING". - * - * In applying this license CERN does not waive the privileges and immunities - * granted to it by virtue of its status as an Intergovernmental Organization - * or submit itself to any jurisdiction. - */ - -import puppeteer, { Browser, Page } from 'puppeteer'; -import config from './test-config'; - -let page: Page | null = null; - -type Global = { - test: { - page: Page | null; - browser: Browser | null; - helpers: Record; - }; -}; - -const global: Global = { - test: { - page: null, - browser: null, - helpers: {}, - }, -}; - -export const mochaHooks = { - async beforeAll() { - let browser: Browser | null = null; - const url = `http://${config.http.hostname}:${config.http.port}/`; - browser = await puppeteer.launch({ - args: ['--no-sandbox', '--disable-setuid-sandbox'], - headless: true, - }); - page = await browser.newPage(); - - // Listen to browser - page.on('error', (pageerror) => { - console.error(' ', pageerror); - }); - page.on('pageerror', (pageerror) => { - console.error(' ', pageerror); - }); - page.on('console', (msg) => { - console.log(msg.args()); - }); - await page.setViewport({ width: 1200, height: 770 }); - - global.test.page = page; - global.test.browser = browser; - global.test.helpers.url = url; - }, - - async afterAll() { - const { test: { browser } } = global; - if (browser === null) { - return; - } - await browser.close(); - }, -}; - -export default global; diff --git a/Configuration/webapp/app/test/services/session.spec.ts b/Configuration/webapp/app/test/services/session.spec.ts deleted file mode 100644 index 302baa732..000000000 --- a/Configuration/webapp/app/test/services/session.spec.ts +++ /dev/null @@ -1,51 +0,0 @@ -/** - * @license - * Copyright 2019-2020 CERN and copyright holders of ALICE O2. - * See http://alice-o2.web.cern.ch/copyright for details of the copyright holders. - * All rights not expressly granted are reserved. - * - * This software is distributed under the terms of the GNU General Public - * License v3 (GPL Version 3), copied verbatim in the file "COPYING". - * - * In applying this license CERN does not waive the privileges and immunities - * granted to it by virtue of its status as an Intergovernmental Organization - * or submit itself to any jurisdiction. - */ - -import assert from 'assert'; -import { Page } from 'puppeteer'; -import global from '../mocha-index'; -import { fetchSessionData, getSessionData } from '../../services/session'; - -describe('`pageRoot` test-suite', function () { - let url: string | null = null; - let page: Page | null = null; - - before(function () { - ({ test: { page, helpers: { url } } } = global); - }); - - it('should load root page', async function () { - if (page === null || url === null) { - assert.equal('Page is null', 'test suite failed'); - return; - } - - await page.goto(url, { waitUntil: 'networkidle0' }); - - const location = await page.evaluate(() => window.location); - assert.strictEqual(location.search, ''); - }); - - it('should load session data into memory', async function () { - if (page === null) { - assert.equal('Page is null', 'test suite failed'); - return; - } - - await fetchSessionData(); - const session = getSessionData(); - - assert.strictEqual(session.username, 'anonymous'); - }); -}); diff --git a/Configuration/webapp/app/test/test-config.ts b/Configuration/webapp/app/test/test-config.ts deleted file mode 100644 index 2b8cd1a4f..000000000 --- a/Configuration/webapp/app/test/test-config.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * @license - * Copyright 2019-2020 CERN and copyright holders of ALICE O2. - * See http://alice-o2.web.cern.ch/copyright for details of the copyright holders. - * All rights not expressly granted are reserved. - * - * This software is distributed under the terms of the GNU General Public - * License v3 (GPL Version 3), copied verbatim in the file "COPYING". - * - * In applying this license CERN does not waive the privileges and immunities - * granted to it by virtue of its status as an Intergovernmental Organization - * or submit itself to any jurisdiction. - */ - -export default { - http: { - port: 8080, - hostname: 'localhost', - }, -}; From 47a28cebc072834cf3595d253307d494b2682c25 Mon Sep 17 00:00:00 2001 From: Deaponn Date: Mon, 6 Oct 2025 13:17:05 +0200 Subject: [PATCH 76/77] refactor: session service --- Configuration/webapp/app/services/session.ts | 7 +++- .../webapp/test/services/session.spec.ts | 38 ++----------------- 2 files changed, 8 insertions(+), 37 deletions(-) diff --git a/Configuration/webapp/app/services/session.ts b/Configuration/webapp/app/services/session.ts index c3f78d656..611422dca 100644 --- a/Configuration/webapp/app/services/session.ts +++ b/Configuration/webapp/app/services/session.ts @@ -17,7 +17,7 @@ const sessionData: Record = {}; /** * Function for fetching session data from the Control server */ -export async function fetchSessionData() { +async function fetchSessionData() { // only to get the data from server redirect // (line 264, commit 3ba4600 of github.com/AliceO2Group/WebUi/blob/dev/Framework/Backend/http/server.js) // this should be replaced with endpoint designed for authentication only @@ -32,7 +32,10 @@ export async function fetchSessionData() { * Function for reading session data fetched from the Control server * @returns {Record} sessionData */ -export function getSessionData(): Record { +export async function getSessionData(): Promise> { + if (Object.keys(sessionData).length === 0) { + await fetchSessionData(); + } return sessionData; } diff --git a/Configuration/webapp/test/services/session.spec.ts b/Configuration/webapp/test/services/session.spec.ts index cbbc64cb0..8716c1e1b 100644 --- a/Configuration/webapp/test/services/session.spec.ts +++ b/Configuration/webapp/test/services/session.spec.ts @@ -13,43 +13,11 @@ */ import assert from 'assert'; -import { Page } from 'puppeteer'; -import global from '../mocha-index'; -import { fetchSessionData, getSessionData } from '../../app/services/session'; - -describe('`pageRoot` test-suite', function () { - let url: string | null = null; - let page: Page | null = null; - - before(function () { - ({ - test: { - page, - helpers: { url }, - }, - } = global); - }); - - it('should load root page', async function () { - if (page === null || url === null) { - assert.equal('Page is null', 'test suite failed'); - return; - } - - await page.goto(url, { waitUntil: 'networkidle0' }); - - const location = await page.evaluate(() => window.location); - assert.strictEqual(location.search, ''); - }); +import { getSessionData } from '../../app/services/session'; +describe('`session` test-suite', function () { it('should load session data into memory', async function () { - if (page === null) { - assert.equal('Page is null', 'test suite failed'); - return; - } - - await fetchSessionData(); - const session = getSessionData(); + const session = await getSessionData(); assert.strictEqual(session.username, 'anonymous'); }); From a8dd2f246d412b8421b023c5393c4803ce6a0c98 Mon Sep 17 00:00:00 2001 From: Deaponn Date: Tue, 7 Oct 2025 17:03:14 +0200 Subject: [PATCH 77/77] fix: invocation of undefined function --- .../app/components/user-section/UserSection.tsx | 12 +++++++++++- Configuration/webapp/app/root.tsx | 6 ------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/Configuration/webapp/app/components/user-section/UserSection.tsx b/Configuration/webapp/app/components/user-section/UserSection.tsx index 8f2ef27f9..e129b513a 100644 --- a/Configuration/webapp/app/components/user-section/UserSection.tsx +++ b/Configuration/webapp/app/components/user-section/UserSection.tsx @@ -14,6 +14,7 @@ import { useState, type FC, type MouseEvent } from 'react'; import { Box, IconButton, Menu, MenuItem, Avatar } from '@mui/material'; +import { getSessionData } from '~/services/session'; interface UserSectionProps { userName: string; @@ -36,6 +37,15 @@ export const UserSection: FC = ({ userName }) => { setAnchorEl(null); }; + const displayProfileData = () => { + const getData = async () => { + const data = await getSessionData(); + alert(JSON.stringify(data)); + }; + + void getData(); + }; + return ( @@ -55,7 +65,7 @@ export const UserSection: FC = ({ userName }) => { onClose={handleClose} className="user-section__menu" > - Profile + Profile My account Logout diff --git a/Configuration/webapp/app/root.tsx b/Configuration/webapp/app/root.tsx index d6474824b..7dbfbd1c8 100644 --- a/Configuration/webapp/app/root.tsx +++ b/Configuration/webapp/app/root.tsx @@ -26,8 +26,6 @@ import './app.css'; import '@aliceo2/web-ui/Frontend/css/src/bootstrap.css'; import { Spinner } from '~/ui/spinner'; -import { useEffect } from 'react'; -import { fetchSessionData } from './services/session'; import MainLayout from './components/layout/MainLayout'; @@ -38,10 +36,6 @@ import MainLayout from './components/layout/MainLayout'; * @returns {React.ReactElement} Root */ export function Layout({ children }: { children: React.ReactNode }) { - useEffect(() => { - void fetchSessionData(); - }, []); - return (