From 280d3e67d184c6016f5a162e0e338f1ca3113593 Mon Sep 17 00:00:00 2001 From: Yanick Minder Date: Fri, 15 Nov 2024 13:41:00 +0100 Subject: [PATCH 01/33] introduce spotless formatter --- backend/pom.xml | 28 +- backend/src/main/resources/formatting.xml | 380 ++++++++++++++++++++++ frontend/scripts/pre-commit | 12 +- 3 files changed, 404 insertions(+), 16 deletions(-) create mode 100644 backend/src/main/resources/formatting.xml diff --git a/backend/pom.xml b/backend/pom.xml index aa377694f3..d2439619a4 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -231,24 +231,32 @@ maven-surefire-plugin 3.5.2 - - net.revelc.code.formatter - formatter-maven-plugin - 2.24.1 - - ${maven.compiler.source} - ${maven.compiler.source} - ${maven.compiler.source} - + com.diffplug.spotless + spotless-maven-plugin + 2.43.0 code-format - format + apply + + + + 4.26 + ${project.basedir}/src/main/resources/formatting.xml + + + + java|javax,ch.puzzle,org,com,com.diffplug,,\#com.diffplug,\# + true + + + + diff --git a/backend/src/main/resources/formatting.xml b/backend/src/main/resources/formatting.xml new file mode 100644 index 0000000000..399b95d128 --- /dev/null +++ b/backend/src/main/resources/formatting.xml @@ -0,0 +1,380 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/scripts/pre-commit b/frontend/scripts/pre-commit index ac5a7fbde3..056309889c 100644 --- a/frontend/scripts/pre-commit +++ b/frontend/scripts/pre-commit @@ -1,20 +1,20 @@ #!/bin/sh -projectPath=$PWD -addedFiles=$(git diff --cached --name-only --diff-filter=a) +gitBasePath=$(git rev-parse --show-toplevel) +addedFiles=$(git diff --cached --name-only --diff-filter=d) echo "*****Running prettier******" -cd $projectPath/frontend +cd $gitBasePath/frontend npm run format echo "*****Finish running prettier******" echo "*****Running maven formatter******" -cd $projectPath/backend -mvn formatter:format +cd $gitBasePath/backend +mvn spotless:apply echo "*****Finish running maven formatter******" echo "*****Adding changes to git******" -cd $projectPath +cd $gitBasePath git add $addedFiles echo "*****Formatted files added again******" From 48bdc902a17e1879d8f256a078e3c54bd35004d5 Mon Sep 17 00:00:00 2001 From: Yanick Minder Date: Fri, 15 Nov 2024 13:50:24 +0100 Subject: [PATCH 02/33] update readme and pipeline --- .github/workflows/format-action.yml | 47 +++++------------------------ backend/README.md | 11 +++---- backend/pom.xml | 6 ++-- 3 files changed, 16 insertions(+), 48 deletions(-) diff --git a/.github/workflows/format-action.yml b/.github/workflows/format-action.yml index 8ab0c9dd70..e57db39e56 100644 --- a/.github/workflows/format-action.yml +++ b/.github/workflows/format-action.yml @@ -3,7 +3,7 @@ name: 'Format' on: [push] jobs: - Frontend: + frontend: runs-on: ubuntu-latest defaults: run: @@ -15,33 +15,19 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version: 22.10.0 + node-version: ${{vars.NODE_VERSION}} - name: Npm install run: npm ci - name: Format frontend - run: npm run format + run: npm run check - - name: Commit and Push formated frontend - shell: bash - env: - COMMITPREFIX: '[FM]' - run: | - git config --global user.email "actions@github.com" - git config --global user.name "GitHub Actions" - git add . || { - echo "No files were changed, so we did not commit anything" - exit 1 - } - git commit -m "$COMMITPREFIX Automated formating frontend" || { - echo "No changes to commit, skipping push" - exit 0 - } - git push -f - - Backend: + backend: runs-on: ubuntu-latest + defaults: + run: + working-directory: backend steps: - name: Checkout uses: actions/checkout@v4 @@ -55,21 +41,4 @@ jobs: settings-path: ${{github.workspace}} - name: Format backend - run: mvn formatter:format -f backend/pom.xml - - - name: Commit and Push formated backend - shell: bash - env: - COMMITPREFIX: '[FM]' - run: | - git config --global user.email "actions@github.com" - git config --global user.name "GitHub Actions" - git add . || { - echo "No files were changed, so we did not commit anything" - exit 1 - } - git commit -m "$COMMITPREFIX Automated formating backend" || { - echo "No changes to commit, skipping push" - exit 0 - } - git push -f \ No newline at end of file + run: mvn spotless:check \ No newline at end of file diff --git a/backend/README.md b/backend/README.md index 127c7150a1..b31e5267e7 100644 --- a/backend/README.md +++ b/backend/README.md @@ -33,17 +33,16 @@ USING DOCKER - backend/target Formatting: -- Check code formatting: `mvn formatter:validate` -- Format the code: `mvn formatter:format` +- Check code formatting: `mvn spotless:check` +- Format the code: `mvn spotless:apply` -The `compile` goal execute also a `formatter:format` goal. +The `compile` goal execute also a `spotless:apply` goal. Verify the Backend for coverage check: - `mvn clean verify` ## Formatting -We use the **formatter-maven-plugin** Plugin for formatting the Java code: -https://code.revelc.net/formatter-maven-plugin/ - +We use the **spotless** Plugin for formatting the Java code: +https://github.com/diffplug/spotless ## Build _tbd_ diff --git a/backend/pom.xml b/backend/pom.xml index d2439619a4..751e1c3ae1 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -313,9 +313,9 @@ - net.revelc.code.formatter - formatter-maven-plugin - 2.24.1 + com.diffplug.spotless + spotless-maven-plugin + 2.43.0 code-format From 3d71636e6ae891d136760e51f1aff68c12f58c60 Mon Sep 17 00:00:00 2001 From: Yanick Minder Date: Mon, 18 Nov 2024 08:50:18 +0100 Subject: [PATCH 03/33] add typescript formatter --- backend/pom.xml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/backend/pom.xml b/backend/pom.xml index 751e1c3ae1..27406acd74 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -256,6 +256,22 @@ + + + + src/**/*.ts + + + + + + + + + /* (C)$YEAR */ + (import|const|declare|export|var) + + From 80ca695e17c2dacbc70b2ffe64a4f7123ede1973 Mon Sep 17 00:00:00 2001 From: Yanick Minder Date: Mon, 18 Nov 2024 15:44:56 +0100 Subject: [PATCH 04/33] add frontedn config --- backend/pom.xml | 37 +++++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/backend/pom.xml b/backend/pom.xml index 27406acd74..07343a047b 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -259,18 +259,35 @@ - src/**/*.ts + ../frontend/src/app/**/*.ts - - - - - - - /* (C)$YEAR */ - (import|const|declare|export|var) - + + + 8.30.0 + + + + { + env: { + browser: true, + es2021: true + }, + extends: 'standard-with-typescript', + overrides: [ + ], + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + project: '../../frontend/tsconfig.json', + }, + rules: { + } + } + + + ${project.basedir}/../frontend/tsconfig.json + From 695bc4bf951f6d426c82ad80c51c76c42b81f7e6 Mon Sep 17 00:00:00 2001 From: Yanick Minder Date: Mon, 18 Nov 2024 16:39:58 +0100 Subject: [PATCH 05/33] update tsconfig.json --- frontend/tsconfig.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json index c4e3ae25fd..d5a401e42b 100644 --- a/frontend/tsconfig.json +++ b/frontend/tsconfig.json @@ -22,7 +22,9 @@ "resolveJsonModule": true, "esModuleInterop": true, "useDefineForClassFields": false, - "allowSyntheticDefaultImports": true + "allowSyntheticDefaultImports": true, + "noUnusedLocals": true, + "noUnusedParameters": true }, "angularCompilerOptions": { "enableI18nLegacyMessageIdFormat": false, From 1de3d84eab61a0688f334b728e890c5e0d69f931 Mon Sep 17 00:00:00 2001 From: Yanick Minder Date: Mon, 18 Nov 2024 17:02:52 +0100 Subject: [PATCH 06/33] install eslint for formating --- backend/pom.xml | 33 --------------------------------- frontend/eslint.config.mjs | 8 ++++++++ frontend/package.json | 10 ++++++---- frontend/tsconfig.json | 2 -- 4 files changed, 14 insertions(+), 39 deletions(-) create mode 100644 frontend/eslint.config.mjs diff --git a/backend/pom.xml b/backend/pom.xml index 07343a047b..751e1c3ae1 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -256,39 +256,6 @@ - - - - ../frontend/src/app/**/*.ts - - - - - 8.30.0 - - - - { - env: { - browser: true, - es2021: true - }, - extends: 'standard-with-typescript', - overrides: [ - ], - parserOptions: { - ecmaVersion: 'latest', - sourceType: 'module', - project: '../../frontend/tsconfig.json', - }, - rules: { - } - } - - - ${project.basedir}/../frontend/tsconfig.json - - diff --git a/frontend/eslint.config.mjs b/frontend/eslint.config.mjs new file mode 100644 index 0000000000..160194cb71 --- /dev/null +++ b/frontend/eslint.config.mjs @@ -0,0 +1,8 @@ + +import eslint from '@eslint/js'; +import tseslint from 'typescript-eslint'; + +export default tseslint.config( + eslint.configs.recommended, + ...tseslint.configs.recommended, +); \ No newline at end of file diff --git a/frontend/package.json b/frontend/package.json index accbcefc7f..cd4a13bd34 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -13,9 +13,8 @@ "cypress:run": "cypress run --browser chrome", "cypress:open-test": "concurrently \"npm start\" \"cypress open\"", "cypress:run-test": "npm run build && concurrently \"npm run serve:dist\" \"cypress run\"", - "format": "prettier --write \"./**/*.{js,ts,json,css,scss,html,md,yaml}\"", - "check": "prettier --check \"./**/*.{js,ts,json,css,scss,html,md,yaml}\"", - "format:upgrade": "npm install --save-exact prettier@latest && npm run format", + "format": "eslint --fix .", + "check": "eslint .", "prestart": "cp scripts/pre-commit ../.git/hooks/ && chmod +x ../.git/hooks/pre-commit && echo 'hook copied'", "prebuild": "version=$(grep -oP '\\K.*(?=-SNAPSHOT)' ../pom.xml); echo \"export const version = 'v$version';\" > src/app/version.ts\n", "e2e": "ng e2e" @@ -48,16 +47,19 @@ "@angular/compiler-cli": "^18.2.8", "@cypress/schematic": "^2.5.2", "@cypress/skip-test": "^2.6.1", + "@eslint/js": "^9.15.0", + "@types/eslint__js": "^8.42.3", "@types/jest": "^29.5.13", "@types/uuid": "^10.0.0", "browserslist": "^4.24.2", "cypress": "^13.15.0", "cypress-real-events": "^1.13.0", + "eslint": "^9.14.0", "jest": "^29.7.0", "jest-preset-angular": "^14.2.4", "ngx-translate-testing": "^7.0.0", - "prettier": "^3.3.3", "typescript": "^5.5.4", + "typescript-eslint": "^8.14.0", "uuid": "^11.0.0" }, "jest": { diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json index d5a401e42b..2e5b345397 100644 --- a/frontend/tsconfig.json +++ b/frontend/tsconfig.json @@ -23,8 +23,6 @@ "esModuleInterop": true, "useDefineForClassFields": false, "allowSyntheticDefaultImports": true, - "noUnusedLocals": true, - "noUnusedParameters": true }, "angularCompilerOptions": { "enableI18nLegacyMessageIdFormat": false, From 99711ceb5332c934fcdbd0abbb791557355a75c6 Mon Sep 17 00:00:00 2001 From: Miguel Lehmann Date: Tue, 19 Nov 2024 09:15:23 +0100 Subject: [PATCH 07/33] update typescript-eslint to 8.15.0 --- frontend/package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frontend/package.json b/frontend/package.json index cd4a13bd34..0acc4ed46f 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -34,6 +34,7 @@ "@angular/router": "^18.2.8", "@ngx-translate/core": "^16.0.0", "@ngx-translate/http-loader": "^16.0.0", + "@typescript-eslint/eslint-plugin": "^8.15.0", "angular-oauth2-oidc": "^17.0.2", "bootstrap": "^5.3.3", "moment": "^2.30.1", @@ -59,7 +60,7 @@ "jest-preset-angular": "^14.2.4", "ngx-translate-testing": "^7.0.0", "typescript": "^5.5.4", - "typescript-eslint": "^8.14.0", + "typescript-eslint": "^8.15.0", "uuid": "^11.0.0" }, "jest": { From 1759605ab4f61e1fcbb6e92af2dfb24c74532c2c Mon Sep 17 00:00:00 2001 From: Miguel Lehmann Date: Tue, 19 Nov 2024 10:28:52 +0100 Subject: [PATCH 08/33] edit config --- frontend/eslint.config.mjs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/frontend/eslint.config.mjs b/frontend/eslint.config.mjs index 160194cb71..9345f95782 100644 --- a/frontend/eslint.config.mjs +++ b/frontend/eslint.config.mjs @@ -1,8 +1,14 @@ import eslint from '@eslint/js'; import tseslint from 'typescript-eslint'; +import {rules} from "@typescript-eslint/eslint-plugin"; export default tseslint.config( eslint.configs.recommended, ...tseslint.configs.recommended, -); \ No newline at end of file + { + rules: { + "unused-imports/no-unused-imports": "error", + } + } +); From 8b3c705dac75fa095cbb987ddd85b27d7b685335 Mon Sep 17 00:00:00 2001 From: Miguel Lehmann Date: Tue, 19 Nov 2024 10:43:46 +0100 Subject: [PATCH 09/33] put unused-imports plugin into config --- frontend/eslint.config.mjs | 5 ++++- frontend/package.json | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/frontend/eslint.config.mjs b/frontend/eslint.config.mjs index 9345f95782..a52431b4e2 100644 --- a/frontend/eslint.config.mjs +++ b/frontend/eslint.config.mjs @@ -1,12 +1,15 @@ import eslint from '@eslint/js'; import tseslint from 'typescript-eslint'; -import {rules} from "@typescript-eslint/eslint-plugin"; +import unusedImports from "eslint-plugin-unused-imports"; export default tseslint.config( eslint.configs.recommended, ...tseslint.configs.recommended, { + plugins: { + "unused-imports": unusedImports, + }, rules: { "unused-imports/no-unused-imports": "error", } diff --git a/frontend/package.json b/frontend/package.json index 0acc4ed46f..f5a2ccf54a 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -56,6 +56,7 @@ "cypress": "^13.15.0", "cypress-real-events": "^1.13.0", "eslint": "^9.14.0", + "eslint-plugin-unused-imports": "^4.1.4", "jest": "^29.7.0", "jest-preset-angular": "^14.2.4", "ngx-translate-testing": "^7.0.0", From d8c740b78db0c54cad0341d7351e52ee535f285e Mon Sep 17 00:00:00 2001 From: Miguel Lehmann Date: Tue, 19 Nov 2024 14:20:28 +0100 Subject: [PATCH 10/33] change config for spec files --- frontend/eslint.config.mjs | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/frontend/eslint.config.mjs b/frontend/eslint.config.mjs index a52431b4e2..9ee4c8235a 100644 --- a/frontend/eslint.config.mjs +++ b/frontend/eslint.config.mjs @@ -3,15 +3,22 @@ import eslint from '@eslint/js'; import tseslint from 'typescript-eslint'; import unusedImports from "eslint-plugin-unused-imports"; + export default tseslint.config( - eslint.configs.recommended, - ...tseslint.configs.recommended, + eslint.configs.recommended, + ...tseslint.configs.recommended, + { + files: ['**/*.spec.ts'], + rules: { + "@typescript-eslint/no-explicit-any": "off" + }, + }, { plugins: { - "unused-imports": unusedImports, + 'unused-imports': unusedImports, }, rules: { - "unused-imports/no-unused-imports": "error", - } + 'unused-imports/no-unused-imports': 'error', + }, } ); From 973d301c239ce9753edd25fd95ad0d2a4e6d2704 Mon Sep 17 00:00:00 2001 From: Yanick Minder Date: Fri, 22 Nov 2024 08:40:02 +0100 Subject: [PATCH 11/33] add stylistic plugin to eslnt --- frontend/eslint.config.mjs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/frontend/eslint.config.mjs b/frontend/eslint.config.mjs index 9ee4c8235a..b436711f89 100644 --- a/frontend/eslint.config.mjs +++ b/frontend/eslint.config.mjs @@ -2,6 +2,8 @@ import eslint from '@eslint/js'; import tseslint from 'typescript-eslint'; import unusedImports from "eslint-plugin-unused-imports"; +import stylistic from '@stylistic/eslint-plugin' + export default tseslint.config( @@ -16,9 +18,13 @@ export default tseslint.config( { plugins: { 'unused-imports': unusedImports, + '@stylistic': stylistic }, rules: { 'unused-imports/no-unused-imports': 'error', + "@typescript-eslint/no-unused-vars": "off", + "@typescript-eslint/no-unused-expressions": "off", + "no-undef": "off", }, } ); From 6995046290a47a03bdde6723735c41727147a826 Mon Sep 17 00:00:00 2001 From: Yanick Minder Date: Fri, 22 Nov 2024 08:52:55 +0100 Subject: [PATCH 12/33] add eslint stylistic rules --- frontend/eslint.config.mjs | 22 +++++++++++----------- frontend/package.json | 1 + 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/frontend/eslint.config.mjs b/frontend/eslint.config.mjs index b436711f89..b797b944ab 100644 --- a/frontend/eslint.config.mjs +++ b/frontend/eslint.config.mjs @@ -1,24 +1,24 @@ -import eslint from '@eslint/js'; -import tseslint from 'typescript-eslint'; +import eslint from "@eslint/js"; +import tsEslint from "typescript-eslint"; import unusedImports from "eslint-plugin-unused-imports"; -import stylistic from '@stylistic/eslint-plugin' +import stylistic from "@stylistic/eslint-plugin"; - -export default tseslint.config( +export default tsEslint.config( eslint.configs.recommended, - ...tseslint.configs.recommended, - { - files: ['**/*.spec.ts'], - rules: { - "@typescript-eslint/no-explicit-any": "off" + ...tsEslint.configs.recommended, + stylistic.configs['all-flat'], + { + files: ['**/*.spec.ts'], + rules: { + "@typescript-eslint/no-explicit-any": "off" }, }, { plugins: { 'unused-imports': unusedImports, - '@stylistic': stylistic + '@stylistic': stylistic }, rules: { 'unused-imports/no-unused-imports': 'error', diff --git a/frontend/package.json b/frontend/package.json index f5a2ccf54a..b64243d8f2 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -34,6 +34,7 @@ "@angular/router": "^18.2.8", "@ngx-translate/core": "^16.0.0", "@ngx-translate/http-loader": "^16.0.0", + "@stylistic/eslint-plugin": "^2.11.0", "@typescript-eslint/eslint-plugin": "^8.15.0", "angular-oauth2-oidc": "^17.0.2", "bootstrap": "^5.3.3", From 4c4d8916f50837fe2ef59d849c717bfb8f75338d Mon Sep 17 00:00:00 2001 From: Yanick Minder Date: Fri, 22 Nov 2024 09:26:52 +0100 Subject: [PATCH 13/33] update config for eslint stylic --- frontend/eslint.config.mjs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/frontend/eslint.config.mjs b/frontend/eslint.config.mjs index b797b944ab..ee14055024 100644 --- a/frontend/eslint.config.mjs +++ b/frontend/eslint.config.mjs @@ -25,6 +25,10 @@ export default tsEslint.config( "@typescript-eslint/no-unused-vars": "off", "@typescript-eslint/no-unused-expressions": "off", "no-undef": "off", + "@stylistic/function-call-argument-newline": ["error", "never"], + "@stylistic/padded-blocks": ["error", "never"], + "@stylistic/dot-location": ["error", "property"], + "@stylistic/newline-per-chained-call": ["error", { "ignoreChainWithDepth": 1 }] }, } ); From 5577925eb539fb032cd50992a40df5d111ad2c3a Mon Sep 17 00:00:00 2001 From: Yanick Minder Date: Fri, 22 Nov 2024 09:31:35 +0100 Subject: [PATCH 14/33] rewrite package-lock --- frontend/package-lock.json | 4948 ++++++++++++++---------------------- 1 file changed, 1849 insertions(+), 3099 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index e9dee7c627..52dd646e28 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -21,6 +21,8 @@ "@angular/router": "^18.2.8", "@ngx-translate/core": "^16.0.0", "@ngx-translate/http-loader": "^16.0.0", + "@stylistic/eslint-plugin": "^2.11.0", + "@typescript-eslint/eslint-plugin": "^8.15.0", "angular-oauth2-oidc": "^17.0.2", "bootstrap": "^5.3.3", "moment": "^2.30.1", @@ -34,16 +36,20 @@ "@angular/compiler-cli": "^18.2.8", "@cypress/schematic": "^2.5.2", "@cypress/skip-test": "^2.6.1", + "@eslint/js": "^9.15.0", + "@types/eslint__js": "^8.42.3", "@types/jest": "^29.5.13", "@types/uuid": "^10.0.0", "browserslist": "^4.24.2", "cypress": "^13.15.0", "cypress-real-events": "^1.13.0", + "eslint": "^9.14.0", + "eslint-plugin-unused-imports": "^4.1.4", "jest": "^29.7.0", "jest-preset-angular": "^14.2.4", "ngx-translate-testing": "^7.0.0", - "prettier": "^3.3.3", "typescript": "^5.5.4", + "typescript-eslint": "^8.15.0", "uuid": "^11.0.0" }, "engines": { @@ -484,36 +490,6 @@ "typescript": ">=5.4 <5.6" } }, - "node_modules/@angular/compiler-cli/node_modules/chokidar": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", - "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@angular/compiler-cli/node_modules/readdirp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", - "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/@angular/core": { "version": "18.2.12", "resolved": "https://registry.npmjs.org/@angular/core/-/core-18.2.12.tgz", @@ -639,13 +615,14 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.9.tgz", - "integrity": "sha512-z88xeGxnzehn2sqZ8UdGQEvYErF1odv2CftxInpSYJt6uHuPe9YjahKZITGs3l5LeI9d2ROG+obuDAoSlqbNfQ==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/highlight": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", "picocolors": "^1.0.0" }, "engines": { @@ -653,9 +630,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.9.tgz", - "integrity": "sha512-yD+hEuJ/+wAJ4Ox2/rpNv5HIuPG82x3ZlQvYVn8iYCprdxzE7P1udpGF1jyjQVBU4dgznN+k2h103vxZ7NdPyw==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.2.tgz", + "integrity": "sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==", "dev": true, "license": "MIT", "engines": { @@ -867,9 +844,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", - "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz", + "integrity": "sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==", "dev": true, "license": "MIT", "dependencies": { @@ -912,14 +889,13 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.9.tgz", - "integrity": "sha512-TvLZY/F3+GvdRYFZFyxMvnsKi+4oJdgZzU3BoGN9Uc2d9C6zfNwJcKKhjqLAhK8i46mv93jsO74fDh3ih6rpHA==", + "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.25.9", - "@babel/helper-simple-access": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9", "@babel/traverse": "^7.25.9" }, @@ -1089,43 +1065,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.9.tgz", - "integrity": "sha512-oKWp3+usOJSzDZOucZUAMayhPz/xVjzymyDzUN8dk0Wd3RWMlGLXi07UCQ/CgQVb8LvXx3XBajJH4XGgkt7H7g==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", + "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", "dev": true, "license": "MIT", "dependencies": { "@babel/template": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.9.tgz", - "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "@babel/types": "^7.26.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.9.tgz", - "integrity": "sha512-aI3jjAAO1fh7vY/pBGsn1i9LDbRP43+asrRlkPuTXW5yHXtd1NgTEMudbBoDDxrf1daEEfPJqR+JBMakzrR4Dg==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz", + "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.25.9" + "@babel/types": "^7.26.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -1313,9 +1273,9 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.9.tgz", - "integrity": "sha512-4GHX5uzr5QMOOuzV0an9MFju4hKlm0OyePl/lHhcsTVae5t/IKVHnb8W67Vr6FuLlk5lPqLB7n7O+K5R46emYg==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz", + "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", "dev": true, "license": "MIT", "dependencies": { @@ -1632,9 +1592,9 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.25.9.tgz", - "integrity": "sha512-UIf+72C7YJ+PJ685/PpATbCz00XqiFEzHX5iysRwfvNT0Ko+FaXSvRgLytFSp8xUItrG9pFM/KoBBZDrY/cYyg==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz", + "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2580,13 +2540,14 @@ } }, "node_modules/@babel/traverse/node_modules/@babel/generator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.9.tgz", - "integrity": "sha512-omlUGkr5EaoIJrhLf9CJ0TvjBRpd9+AXRG//0GEQ9THSo8wPiTlbpy1/Ow8ZTrbXpjd9FHXfbFQx32I04ht0FA==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz", + "integrity": "sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.25.9", + "@babel/parser": "^7.26.2", + "@babel/types": "^7.26.0", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -2609,9 +2570,9 @@ } }, "node_modules/@babel/types": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.9.tgz", - "integrity": "sha512-OwS2CM5KocvQ/k7dFJa8i5bNGJP0hXWfVCfDkqRFP1IreH1JDC7wG6eCYCi0+McbfT8OR/kNqsI0UU0xP9H6PQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", + "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", "dev": true, "license": "MIT", "dependencies": { @@ -2670,19 +2631,6 @@ "node": ">= 6" } }, - "node_modules/@cypress/request/node_modules/tough-cookie": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.0.0.tgz", - "integrity": "sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tldts": "^6.1.32" - }, - "engines": { - "node": ">=16" - } - }, "node_modules/@cypress/request/node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -3174,6 +3122,260 @@ "node": ">=18" } }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", + "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", + "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==", + "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==", + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.0.tgz", + "integrity": "sha512-zdHg2FPIFNKPdcHWtiNT+jEFCHYVplAXRDlQDyqy0zGx/q2parwh7brGJSiTxRk/TSMkbM//zt/f5CHgyTyaSQ==", + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.4", + "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.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "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==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/core": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.0.tgz", + "integrity": "sha512-7ATR9F0e4W85D/0w7cU0SNj7qkAexMG+bAHEZOjo9akvGuhHE2m7umzWzfnpa0XAg5Kxc1BWmtPMV67jJ+9VUg==", + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", + "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", + "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/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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/@eslint/eslintrc/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==", + "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==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/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==", + "license": "MIT" + }, + "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==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "9.15.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.15.0.tgz", + "integrity": "sha512-tMTqrY+EzbXmKJR5ToI8lxu7jaN5EdmrBFJpQk5JmSlyLsx6o4t27r883K5xsLuCYCpfKBCGswMSWXsM+jB7lg==", + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", + "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.3.tgz", + "integrity": "sha512-2b/g5hRmpbb1o4GnTZax9N9m0FXzz9OV42ZzI4rDDMDuHUqigAiQCEWChBWCY4ztAGVRjoWT19v0yMmc5/L5kA==", + "license": "Apache-2.0", + "dependencies": { + "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==", + "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==", + "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==", + "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==", + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", + "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, "node_modules/@inquirer/checkbox": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-2.5.0.tgz", @@ -3273,9 +3475,9 @@ } }, "node_modules/@inquirer/figures": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.7.tgz", - "integrity": "sha512-m+Trk77mp54Zma6xLkLuY+mvanPxlE4A7yNKs2HBiyZ4UkVs28Mv5c/pgWrHeInx+USHeX/WEPzjrWrcJiQgjw==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.8.tgz", + "integrity": "sha512-tKd+jsmhq21AP1LhexC0pPwsCxEhGgAkg28byjJAd+xhmIs8LUX8JbUc3vBf3PhLxWiB5EvyBE5X7JSPAqMAqg==", "dev": true, "license": "MIT", "engines": { @@ -3528,116 +3730,137 @@ "node": ">=8" } }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "sprintf-js": "~1.0.2" } }, - "node_modules/@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" - }, + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/@jest/console/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==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@jest/console/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "p-try": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=6" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@jest/console/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==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "p-limit": "^2.2.0" }, "engines": { - "node": ">=7.0.0" + "node": ">=8" } }, - "node_modules/@jest/console/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/@jest/console/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==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/@jest/console/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/@jest/console/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==", + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/console/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -3690,64 +3913,17 @@ } } }, - "node_modules/@jest/core/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/@jest/core/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/@jest/core/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/@jest/core/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/@jest/core/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==", + "node_modules/@jest/core/node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], "license": "MIT", "engines": { "node": ">=8" @@ -3763,19 +3939,6 @@ "node": ">=8" } }, - "node_modules/@jest/core/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/@jest/environment": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", @@ -3897,69 +4060,6 @@ } } }, - "node_modules/@jest/reporters/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/@jest/reporters/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/@jest/reporters/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/@jest/reporters/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/@jest/reporters/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/@jest/reporters/node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -3970,19 +4070,6 @@ "node": ">=8" } }, - "node_modules/@jest/reporters/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/@jest/schemas": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", @@ -4080,76 +4167,13 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/transform/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/@jest/transform/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/@jest/transform/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/@jest/transform/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/@jest/transform/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/@jest/transform/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/@jest/transform/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/@jest/transform/node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -4160,19 +4184,6 @@ "node": ">=8" } }, - "node_modules/@jest/transform/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/@jest/types": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", @@ -4191,82 +4202,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/types/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/@jest/types/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/@jest/types/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/@jest/types/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/@jest/types/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/@jest/types/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/@jridgewell/gen-mapping": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", @@ -4626,7 +4561,6 @@ "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", @@ -4640,7 +4574,6 @@ "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" @@ -4650,7 +4583,6 @@ "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", @@ -4811,16 +4743,6 @@ "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/@npmcli/package-json/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/@npmcli/package-json/node_modules/glob": { "version": "10.4.5", "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", @@ -4842,22 +4764,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@npmcli/package-json/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/@npmcli/promise-spawn": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-7.0.2.tgz", @@ -5334,6 +5240,25 @@ "@sinonjs/commons": "^3.0.0" } }, + "node_modules/@stylistic/eslint-plugin": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-2.11.0.tgz", + "integrity": "sha512-PNRHbydNG5EH8NK4c+izdJlxajIR6GxcUhzsYNRsn6Myep4dsZt0qFCz3rCPnkvgO5FYibDcMqgNHUT+zvjYZw==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "^8.13.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "estraverse": "^5.3.0", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": ">=8.40.0" + } + }, "node_modules/@tootallnate/once": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", @@ -5368,32 +5293,6 @@ "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/@tufjs/models/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/@tufjs/models/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/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -5481,11 +5380,31 @@ "@types/node": "*" } }, - "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint__js": { + "version": "8.42.3", + "resolved": "https://registry.npmjs.org/@types/eslint__js/-/eslint__js-8.42.3.tgz", + "integrity": "sha512-alfG737uhmPdnvkrLdZLcEKJ/B8s9Y4hrZ+YAdzUeoArBlSUERA2E87ROfOaS4jd/C45fzOoZzidLc1IPwLqOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", "license": "MIT" }, "node_modules/@types/express": { @@ -5608,7 +5527,6 @@ "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/mime": { @@ -5629,13 +5547,13 @@ } }, "node_modules/@types/node": { - "version": "22.7.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.9.tgz", - "integrity": "sha512-jrTfRC7FM6nChvU7X2KqcrgquofrWLFDeYC1hKfwNWomVvrn7JIksqf344WN2X/y8xrgqBd2dJATZV4GbatBfg==", + "version": "22.9.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.1.tgz", + "integrity": "sha512-p8Yy/8sw1caA8CdRIQBG5tiLHmxtQKObCijiAa9Ez+d4+PRffM4054xbju0msf+cvhJpnFEeNjxmVT/0ipktrg==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~6.19.2" + "undici-types": "~6.19.8" } }, "node_modules/@types/node-forge": { @@ -5649,9 +5567,9 @@ } }, "node_modules/@types/qs": { - "version": "6.9.16", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.16.tgz", - "integrity": "sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==", + "version": "6.9.17", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.17.tgz", + "integrity": "sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==", "dev": true, "license": "MIT" }, @@ -5755,9 +5673,9 @@ "license": "MIT" }, "node_modules/@types/ws": { - "version": "8.5.12", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz", - "integrity": "sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==", + "version": "8.5.13", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.13.tgz", + "integrity": "sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==", "dev": true, "license": "MIT", "dependencies": { @@ -5792,87 +5710,277 @@ "@types/node": "*" } }, - "node_modules/@vitejs/plugin-basic-ssl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.1.0.tgz", - "integrity": "sha512-wO4Dk/rm8u7RNhOf95ZzcEmC9rYOncYgvq4z3duaJrCgjN8BxAnDVyndanfcJZ0O6XZzHz6Q0hTimxTg8Y9g/A==", - "dev": true, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.15.0.tgz", + "integrity": "sha512-+zkm9AR1Ds9uLWN3fkoeXgFppaQ+uEVtfOV62dDmsy9QCNqlRHWNEck4yarvRNrvRcHQLGfqBNui3cimoz8XAg==", "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.15.0", + "@typescript-eslint/type-utils": "8.15.0", + "@typescript-eslint/utils": "8.15.0", + "@typescript-eslint/visitor-keys": "8.15.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, "engines": { - "node": ">=14.6.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@webassemblyjs/ast": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", - "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", - "dev": true, + "node_modules/@typescript-eslint/parser": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.15.0.tgz", + "integrity": "sha512-7n59qFpghG4uazrF9qtGKBZXn7Oz4sOMm8dwNWDQY96Xlm2oX67eipqcblDj+oY1lLCbf1oltMZFpUso66Kl1A==", + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "8.15.0", + "@typescript-eslint/types": "8.15.0", + "@typescript-eslint/typescript-estree": "8.15.0", + "@typescript-eslint/visitor-keys": "8.15.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" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.15.0.tgz", + "integrity": "sha512-QRGy8ADi4J7ii95xz4UoiymmmMd/zuy9azCaamnZ3FM8T5fZcex8UfJcjkiEZjJSztKfEBe3dZ5T/5RHAmw2mA==", "license": "MIT", "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + "@typescript-eslint/types": "8.15.0", + "@typescript-eslint/visitor-keys": "8.15.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "dev": true, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.15.0.tgz", + "integrity": "sha512-UU6uwXDoI3JGSXmcdnP5d8Fffa2KayOhUUqr/AiBnG1Gl7+7ut/oyagVeSkh7bxQ0zSXV9ptRh/4N15nkCqnpw==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "8.15.0", + "@typescript-eslint/utils": "8.15.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.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" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.15.0.tgz", + "integrity": "sha512-n3Gt8Y/KyJNe0S3yDCD2RVKrHBC4gTUcLTebVBXacPy091E6tNspFLKRXlk3hwT4G55nfr1n2AdFqi/XMxzmPQ==", + "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.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.15.0.tgz", + "integrity": "sha512-1eMp2JgNec/niZsR7ioFBlsh/Fk0oJbhaqO0jRyQBMgkz7RrFfkqF9lYYmBoGBaSiLnu8TAPQTwoTUiSTUW9dg==", + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "8.15.0", + "@typescript-eslint/visitor-keys": "8.15.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": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.15.0.tgz", + "integrity": "sha512-k82RI9yGhr0QM3Dnq+egEpz9qB6Un+WLYhmoNcvl8ltMEededhh7otBVVIDDsEEttauwdY/hQoSsOv13lxrFzQ==", + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.15.0", + "@typescript-eslint/types": "8.15.0", + "@typescript-eslint/typescript-estree": "8.15.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" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.15.0.tgz", + "integrity": "sha512-h8vYOulWec9LhpwfAdZf2bjr8xIp0KNKnpgqSz0qqYYKAW/QZKw3ktRndbiAtUz4acH4QLQavwZBYCc0wulA/Q==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.15.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/@vitejs/plugin-basic-ssl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.1.0.tgz", + "integrity": "sha512-wO4Dk/rm8u7RNhOf95ZzcEmC9rYOncYgvq4z3duaJrCgjN8BxAnDVyndanfcJZ0O6XZzHz6Q0hTimxTg8Y9g/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.6.0" + }, + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", - "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", - "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "dev": true, "license": "MIT", "dependencies": { @@ -5880,9 +5988,9 @@ } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -5890,79 +5998,79 @@ } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", - "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-opt": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1", - "@webassemblyjs/wast-printer": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", - "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", - "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", - "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", - "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" } }, @@ -6030,10 +6138,9 @@ } }, "node_modules/acorn": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.13.0.tgz", - "integrity": "sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w==", - "dev": true, + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -6063,6 +6170,15 @@ "acorn": "^8" } }, + "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==", + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, "node_modules/acorn-walk": { "version": "8.3.4", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", @@ -6243,16 +6359,18 @@ } }, "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { - "color-convert": "^1.9.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/anymatch": { @@ -6304,14 +6422,10 @@ "license": "MIT" }, "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" }, "node_modules/array-flatten": { "version": "1.1.1", @@ -6451,69 +6565,6 @@ "@babel/core": "^7.8.0" } }, - "node_modules/babel-jest/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/babel-jest/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/babel-jest/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/babel-jest/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/babel-jest/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/babel-jest/node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -6524,19 +6575,6 @@ "node": ">=8" } }, - "node_modules/babel-jest/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/babel-loader": { "version": "9.1.3", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", @@ -6616,14 +6654,14 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", - "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", + "version": "0.4.12", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.12.tgz", + "integrity": "sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==", "dev": true, "license": "MIT", "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.2", + "@babel/helper-define-polyfill-provider": "^0.6.3", "semver": "^6.3.1" }, "peerDependencies": { @@ -6655,13 +6693,13 @@ } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", - "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.3.tgz", + "integrity": "sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2" + "@babel/helper-define-polyfill-provider": "^0.6.3" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -6715,7 +6753,6 @@ "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/base64-js": { @@ -6830,16 +6867,6 @@ "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/body-parser/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/body-parser/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -6858,9 +6885,9 @@ "license": "MIT" }, "node_modules/bonjour-service": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", - "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", + "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", "dev": true, "license": "MIT", "dependencies": { @@ -6895,21 +6922,18 @@ } }, "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==", - "dev": true, + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "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" @@ -6937,6 +6961,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "caniuse-lite": "^1.0.30001669", "electron-to-chromium": "^1.5.41", @@ -7032,9 +7057,9 @@ } }, "node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, "license": "MIT", "engines": { @@ -7065,16 +7090,6 @@ "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/cacache/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/cacache/node_modules/glob": { "version": "10.4.5", "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", @@ -7103,22 +7118,6 @@ "dev": true, "license": "ISC" }, - "node_modules/cacache/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/cachedir": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.4.0.tgz", @@ -7153,7 +7152,6 @@ "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" @@ -7170,9 +7168,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001669", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001669.tgz", - "integrity": "sha512-DlWzFDJqstqtIVx1zeSpIMLjunf5SmwOw0N2Ck/QSQdS8PLS4+9HrLaYei4w8BIAL7IB/UEDu889d8vhCTPA0w==", + "version": "1.0.30001683", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001683.tgz", + "integrity": "sha512-iqmNnThZ0n70mNwvxpEC2nBJ037ZHZUoBI5Gorh1Mw6IlEAZujEoU1tXA628iZfzm7R9FvFzxbfdgml82a3k8Q==", "dev": true, "funding": [ { @@ -7198,18 +7196,19 @@ "license": "Apache-2.0" }, "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/char-regex": { @@ -7240,41 +7239,19 @@ } }, "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", + "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", "dev": true, "license": "MIT", "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "readdirp": "^4.0.1" }, "engines": { - "node": ">= 8.10.0" + "node": ">= 14.16.0" }, "funding": { "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/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/chownr": { @@ -7298,9 +7275,9 @@ } }, "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.1.0.tgz", + "integrity": "sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A==", "dev": true, "funding": [ { @@ -7468,42 +7445,6 @@ "node": ">=12" } }, - "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/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/cliui/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/cliui/node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -7579,20 +7520,21 @@ "license": "MIT" }, "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "license": "MIT", "dependencies": { - "color-name": "1.1.3" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.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==", - "dev": true, + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, "node_modules/colorette": { @@ -7656,18 +7598,18 @@ } }, "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.5.tgz", + "integrity": "sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q==", "dev": true, "license": "MIT", "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", + "bytes": "3.1.2", + "compressible": "~2.0.18", "debug": "2.6.9", + "negotiator": "~0.6.4", "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", + "safe-buffer": "5.2.1", "vary": "~1.1.2" }, "engines": { @@ -7691,18 +7633,10 @@ "dev": true, "license": "MIT" }, - "node_modules/compression/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" - }, "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/connect-history-api-fallback": { @@ -7801,13 +7735,13 @@ } }, "node_modules/core-js-compat": { - "version": "3.38.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz", - "integrity": "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==", + "version": "3.39.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.39.0.tgz", + "integrity": "sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.23.3" + "browserslist": "^4.24.2" }, "funding": { "type": "opencollective", @@ -7848,26 +7782,6 @@ } } }, - "node_modules/cosmiconfig/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/cosmiconfig/node_modules/js-yaml": { - "version": "4.1.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/create-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", @@ -7890,292 +7804,140 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/create-jest/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==", + "node_modules/critters": { + "version": "0.0.24", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.24.tgz", + "integrity": "sha512-Oyqew0FGM0wYUSNqR0L6AteO5MpMoUU0rhKRieXeiKs+PmRTxiJMyaunYB2KF6fQ3dzChXKCpbFOEJx3OQ1v/Q==", + "deprecated": "Ownership of Critters has moved to the Nuxt team, who will be maintaining the project going forward. If you'd like to keep using Critters, please switch to the actively-maintained fork at https://github.com/danielroe/beasties", "dev": true, + "license": "Apache-2.0", + "dependencies": { + "chalk": "^4.1.0", + "css-select": "^5.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.2", + "htmlparser2": "^8.0.2", + "postcss": "^8.4.23", + "postcss-media-query-parser": "^0.2.3" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">= 8" } }, - "node_modules/create-jest/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/css-loader": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.2.tgz", + "integrity": "sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" }, "engines": { - "node": ">=10" + "node": ">= 18.12.0" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.27.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, - "node_modules/create-jest/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==", + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "color-name": "~1.1.4" + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" }, - "engines": { - "node": ">=7.0.0" + "funding": { + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/create-jest/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==", + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "dev": true, - "license": "MIT" + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } }, - "node_modules/create-jest/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==", + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true, "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/create-jest/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==", + "node_modules/cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", + "dev": true, + "license": "MIT" + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "cssom": "~0.3.6" }, "engines": { "node": ">=8" } }, - "node_modules/critters": { - "version": "0.0.24", - "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.24.tgz", - "integrity": "sha512-Oyqew0FGM0wYUSNqR0L6AteO5MpMoUU0rhKRieXeiKs+PmRTxiJMyaunYB2KF6fQ3dzChXKCpbFOEJx3OQ1v/Q==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "chalk": "^4.1.0", - "css-select": "^5.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.2", - "htmlparser2": "^8.0.2", - "postcss": "^8.4.23", - "postcss-media-query-parser": "^0.2.3" - } - }, - "node_modules/critters/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/critters/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/critters/node_modules/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/critters/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/critters/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/critters/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/css-loader": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.2.tgz", - "integrity": "sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==", - "dev": true, - "license": "MIT", - "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.33", - "postcss-modules-extract-imports": "^3.1.0", - "postcss-modules-local-by-default": "^4.0.5", - "postcss-modules-scope": "^3.2.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.27.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssom": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", - "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", - "dev": true, - "license": "MIT" - }, - "node_modules/cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssom": "~0.3.6" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", "dev": true, "license": "MIT" }, @@ -8248,151 +8010,59 @@ "cypress": "^4.x || ^5.x || ^6.x || ^7.x || ^8.x || ^9.x || ^10.x || ^11.x || ^12.x || ^13.x" } }, - "node_modules/cypress/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==", + "node_modules/cypress/node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", "dev": true, "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" }, "engines": { "node": ">=8" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cypress/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/cypress/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": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=8" } }, - "node_modules/cypress/node_modules/chalk/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==", + "node_modules/cypress/node_modules/listr2": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz", + "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==", "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "cli-truncate": "^2.1.0", + "colorette": "^2.0.16", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.5.1", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/cypress/node_modules/ci-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.1.0.tgz", - "integrity": "sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cypress/node_modules/cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cypress/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/cypress/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/cypress/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/cypress/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cypress/node_modules/listr2": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz", - "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "cli-truncate": "^2.1.0", - "colorette": "^2.0.16", - "log-update": "^4.0.0", - "p-map": "^4.0.0", - "rfdc": "^1.3.0", - "rxjs": "^7.5.1", - "through": "^2.3.8", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "enquirer": ">= 2.3.0 < 3" - }, - "peerDependenciesMeta": { - "enquirer": { - "optional": true - } + "node": ">=10.0.0" + }, + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" + }, + "peerDependenciesMeta": { + "enquirer": { + "optional": true + } } }, "node_modules/cypress/node_modules/listr2/node_modules/wrap-ansi": { @@ -8520,7 +8190,6 @@ "version": "4.3.7", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -8556,6 +8225,12 @@ } } }, + "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==", + "license": "MIT" + }, "node_modules/deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", @@ -8910,9 +8585,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.45", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.45.tgz", - "integrity": "sha512-vOzZS6uZwhhbkZbcRyiy99Wg+pYFV5hk+5YaECvx0+Z31NR3Tt5zS6dze2OepT6PCTzVzT0dIJItti+uAW5zmw==", + "version": "1.5.64", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.64.tgz", + "integrity": "sha512-IXEuxU+5ClW2IGEYFC2T7szbyVgehupCWQe5GNh+H065CD6U6IFN0s4KeAMFGNmQolRU4IV7zGBWSYMmZ8uuqQ==", "dev": true, "license": "ISC" }, @@ -9187,13 +8862,15 @@ "license": "MIT" }, "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, + "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": ">=0.8.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/escodegen": { @@ -9229,28 +8906,168 @@ "node": ">=0.10.0" } }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "node_modules/eslint": { + "version": "9.15.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.15.0.tgz", + "integrity": "sha512-7CrWySmIibCgT1Os28lUU6upBshZ+GxybLOrmRzi08kS8MBuO8QA7pXEgYgY5W8vK3e74xv0lpjo9DbaGU9Rkw==", + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.19.0", + "@eslint/core": "^0.9.0", + "@eslint/eslintrc": "^3.2.0", + "@eslint/js": "9.15.0", + "@eslint/plugin-kit": "^0.2.3", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.1", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.5", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.2.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-plugin-unused-imports": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-4.1.4.tgz", + "integrity": "sha512-YptD6IzQjDardkl0POxnnRBhU1OEePMV0nd6siHaRBbd+lyh6NAhFEobiznKU7kTsSsDeSD62Pe7kAM1b7dAZQ==", "dev": true, + "license": "MIT", + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0", + "eslint": "^9.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", + "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "estraverse": "^5.2.0" }, "engines": { - "node": ">=8.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint-scope/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, + "node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "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/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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/eslint/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==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/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==", + "license": "MIT" + }, + "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==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/espree": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.0" + }, "engines": { - "node": ">=4.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/esprima": { @@ -9267,11 +9084,22 @@ "node": ">=4" } }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "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" @@ -9284,7 +9112,6 @@ "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" @@ -9294,7 +9121,6 @@ "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" @@ -9541,14 +9367,12 @@ "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.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -9565,7 +9389,6 @@ "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" @@ -9578,7 +9401,12 @@ "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==", "license": "MIT" }, "node_modules/fast-uri": { @@ -9592,7 +9420,6 @@ "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, "license": "ISC", "dependencies": { "reusify": "^1.0.4" @@ -9647,6 +9474,28 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/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==", + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/filelist": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", @@ -9657,16 +9506,6 @@ "minimatch": "^5.0.1" } }, - "node_modules/filelist/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/filelist/node_modules/minimatch": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", @@ -9684,7 +9523,6 @@ "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" @@ -9747,17 +9585,19 @@ } }, "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "license": "MIT", "dependencies": { - "locate-path": "^5.0.0", + "locate-path": "^6.0.0", "path-exists": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/flat": { @@ -9770,7 +9610,26 @@ "flat": "cli.js" } }, - "node_modules/follow-redirects": { + "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==", + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", + "license": "ISC" + }, + "node_modules/follow-redirects": { "version": "1.15.9", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", @@ -10053,7 +9912,6 @@ "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" @@ -10069,6 +9927,30 @@ "dev": true, "license": "BSD-2-Clause" }, + "node_modules/glob/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/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/global-dirs": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", @@ -10146,6 +10028,12 @@ "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==", + "license": "MIT" + }, "node_modules/handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", @@ -10154,13 +10042,12 @@ "license": "MIT" }, "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "license": "MIT", "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/has-property-descriptors": { @@ -10537,7 +10424,6 @@ "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" @@ -10556,32 +10442,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/ignore-walk/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/ignore-walk/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/image-size": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", @@ -10607,7 +10467,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, "license": "MIT", "dependencies": { "parent-module": "^1.0.0", @@ -10620,16 +10479,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/import-local": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", @@ -10650,6 +10499,62 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/import-local/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/import-local/node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -10667,7 +10572,6 @@ "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" @@ -10726,13 +10630,6 @@ "node": ">= 12" } }, - "node_modules/ip-address/node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "dev": true, - "license": "BSD-3-Clause" - }, "node_modules/ipaddr.js": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", @@ -10799,7 +10696,6 @@ "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" @@ -10832,7 +10728,6 @@ "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" @@ -10911,7 +10806,6 @@ "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" @@ -11024,7 +10918,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, "license": "ISC" }, "node_modules/isobject": { @@ -11086,29 +10979,6 @@ "node": ">=10" } }, - "node_modules/istanbul-lib-report/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/istanbul-lib-report/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/istanbul-lib-source-maps": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", @@ -11183,80 +11053,28 @@ "node": ">=10" } }, - "node_modules/jake/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/jake/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/jake/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==", + "node_modules/jake/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==", "dev": true, "license": "MIT", "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jake/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/jake/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" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/jake/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==", + "node_modules/jake/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": "MIT", + "license": "ISC", "dependencies": { - "has-flag": "^4.0.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=8" + "node": "*" } }, "node_modules/jest": { @@ -11387,96 +11205,20 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-circus/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==", + "node_modules/jest-circus/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "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/jest-circus/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/jest-circus/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/jest-circus/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/jest-circus/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/jest-circus/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-circus/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/jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, "license": "MIT", "dependencies": { @@ -11507,82 +11249,6 @@ } } }, - "node_modules/jest-cli/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/jest-cli/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/jest-cli/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/jest-cli/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/jest-cli/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/jest-cli/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/jest-config": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", @@ -11629,64 +11295,17 @@ } } }, - "node_modules/jest-config/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/jest-config/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/jest-config/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/jest-config/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/jest-config/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==", + "node_modules/jest-config/node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], "license": "MIT", "engines": { "node": ">=8" @@ -11698,219 +11317,54 @@ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-config/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/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-diff/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/jest-diff/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/jest-diff/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/jest-diff/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/jest-diff/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/jest-diff/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/jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each/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/jest-each/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" + "engines": { + "node": ">=8" } }, - "node_modules/jest-each/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==", + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { - "node": ">=7.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-each/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/jest-each/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==", + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-each/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==", + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" }, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-environment-jsdom": { @@ -12025,82 +11479,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-matcher-utils/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/jest-matcher-utils/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/jest-matcher-utils/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/jest-matcher-utils/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/jest-matcher-utils/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/jest-matcher-utils/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/jest-message-util": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", @@ -12122,69 +11500,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-message-util/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/jest-message-util/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/jest-message-util/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/jest-message-util/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/jest-message-util/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/jest-message-util/node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -12195,19 +11510,6 @@ "node": ">=8" } }, - "node_modules/jest-message-util/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/jest-mock": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", @@ -12242,9 +11544,9 @@ } }, "node_modules/jest-preset-angular": { - "version": "14.3.2", - "resolved": "https://registry.npmjs.org/jest-preset-angular/-/jest-preset-angular-14.3.2.tgz", - "integrity": "sha512-Aoei1O/o7x1I6bSCpU08jGqtQ2RBq7HvNbMIo/vHHbM50v4HX1gF3sWZTkM0U0KorNkdwZeONjMsPNwHyUAKqA==", + "version": "14.3.3", + "resolved": "https://registry.npmjs.org/jest-preset-angular/-/jest-preset-angular-14.3.3.tgz", + "integrity": "sha512-GyUfZLkxj7Tb0a9kCSEdjIZ4HtVzB7Rh+/6HfsYNijEqW887uyZ3FJ8Hy0mXhjE3Y/w8QZI57UjJqG6DWoP1DQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12300,82 +11602,19 @@ "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } - }, - "node_modules/jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", - "dev": true, - "license": "MIT", - "dependencies": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve/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/jest-resolve/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/jest-resolve/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/jest-resolve/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/jest-resolve/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==", + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, "license": "MIT", + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-resolve/node_modules/slash": { @@ -12388,19 +11627,6 @@ "node": ">=8" } }, - "node_modules/jest-resolve/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/jest-runner": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", @@ -12434,69 +11660,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-runner/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/jest-runner/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/jest-runner/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/jest-runner/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/jest-runner/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/jest-runner/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -12518,19 +11681,6 @@ "source-map": "^0.6.0" } }, - "node_modules/jest-runner/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/jest-runtime": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", @@ -12565,198 +11715,46 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-runtime/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/jest-runtime/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/jest-runtime/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/jest-runtime/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/jest-runtime/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/jest-runtime/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runtime/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/jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", - "semver": "^7.5.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot/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/jest-snapshot/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/jest-snapshot/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/jest-snapshot/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/jest-snapshot/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==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/jest-snapshot/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==", + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" }, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-util": { @@ -12777,64 +11775,17 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-util/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/jest-util/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/jest-util/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/jest-util/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/jest-util/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==", + "node_modules/jest-util/node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], "license": "MIT", "engines": { "node": ">=8" @@ -12853,19 +11804,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/jest-util/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/jest-validate": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", @@ -12884,22 +11822,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-validate/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/jest-validate/node_modules/camelcase": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", @@ -12913,66 +11835,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-validate/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/jest-validate/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/jest-validate/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/jest-validate/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/jest-validate/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/jest-watcher": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", @@ -12993,82 +11855,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-watcher/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/jest-watcher/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/jest-watcher/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/jest-watcher/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/jest-watcher/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/jest-watcher/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/jest-worker": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", @@ -13082,17 +11868,7 @@ "supports-color": "^8.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker/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": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-worker/node_modules/supports-color": { @@ -13115,7 +11891,7 @@ "version": "1.21.6", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", - "dev": true, + "devOptional": true, "license": "MIT", "bin": { "jiti": "bin/jiti.js" @@ -13129,14 +11905,12 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "license": "MIT", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" @@ -13222,6 +11996,32 @@ "node": ">= 6" } }, + "node_modules/jsdom/node_modules/tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsdom/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -13235,6 +12035,12 @@ "node": ">=4" } }, + "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==", + "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", @@ -13259,6 +12065,12 @@ "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==", + "license": "MIT" + }, "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -13335,6 +12147,15 @@ "source-map-support": "^0.5.5" } }, + "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==", + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -13488,6 +12309,19 @@ "node": ">=6" } }, + "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==", + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/license-webpack-plugin": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", @@ -13670,16 +12504,18 @@ } }, "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "license": "MIT", "dependencies": { - "p-locate": "^4.1.0" + "p-locate": "^5.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/lodash": { @@ -13703,6 +12539,12 @@ "dev": true, "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==", + "license": "MIT" + }, "node_modules/lodash.once": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", @@ -13727,82 +12569,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-symbols/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/log-symbols/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/log-symbols/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/log-symbols/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/log-symbols/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/log-symbols/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/log-update": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", @@ -14134,7 +12900,6 @@ "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" @@ -14154,7 +12919,6 @@ "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", @@ -14168,7 +12932,6 @@ "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" @@ -14265,16 +13028,18 @@ "license": "ISC" }, "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, + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/minimist": { @@ -14497,13 +13262,12 @@ "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/msgpackr": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.0.tgz", - "integrity": "sha512-I8qXuuALqJe5laEBYoFykChhSXLikZmUhccjGsPuSJ/7uPip2TJ7lwdIQwWSAi0jGZDXv4WOP8Qg65QZRuXxXw==", + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.2.tgz", + "integrity": "sha512-F9UngXRlPyWCDEASDpTf6c9uNhGPTqnTeLVt7bN+bU1eajoR/8V9ys2BRaV5C/e5ihE6sJ9uPIKaYt6bFuO32g==", "dev": true, "license": "MIT", "optionalDependencies": { @@ -14580,7 +13344,6 @@ "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/needle": { @@ -14729,9 +13492,9 @@ } }, "node_modules/node-gyp-build": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.2.tgz", - "integrity": "sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==", + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", "dev": true, "license": "MIT", "optional": true, @@ -14756,16 +13519,6 @@ "node-gyp-build-optional-packages-test": "build-test.js" } }, - "node_modules/node-gyp/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/node-gyp/node_modules/glob": { "version": "10.4.5", "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", @@ -14797,22 +13550,6 @@ "node": ">=16" } }, - "node_modules/node-gyp/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/node-gyp/node_modules/which": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", @@ -15029,9 +13766,9 @@ "license": "MIT" }, "node_modules/object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", "dev": true, "license": "MIT", "engines": { @@ -15084,142 +13821,83 @@ "node_modules/onetime": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", - "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", - "dev": true, - "license": "MIT", - "dependencies": { - "default-browser": "^5.2.1", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "is-wsl": "^3.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora/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/ora/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "mimic-fn": "^2.1.0" }, "engines": { - "node": ">=10" + "node": ">=6" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ora/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==", + "node_modules/open": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", + "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", "dev": true, "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^3.1.0" }, "engines": { - "node": ">=7.0.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ora/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/ora/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, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "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": ">=8" + "node": ">= 0.8.0" } }, - "node_modules/ora/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==", + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/ordered-binary": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.5.2.tgz", - "integrity": "sha512-JTo+4+4Fw7FreyAvlSLjb1BBVaxEQAacmjD3jjuyPZclpbEghTvQZbXBb2qPd2LeIMxiHwXBZUcpmG2Gl/mDEA==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.5.3.tgz", + "integrity": "sha512-oGFr3T+pYdTGJ+YFEILMpS3es+GiIbs9h/XQrclBXUtd44ey7XwfsMzM31f64I1SQOawDoDr/D823kNCADI8TA==", "dev": true, "license": "MIT" }, @@ -15244,7 +13922,6 @@ "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" @@ -15257,29 +13934,15 @@ } }, "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-locate/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, + "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==", "license": "MIT", "dependencies": { - "p-try": "^2.0.0" + "p-limit": "^3.0.2" }, "engines": { - "node": ">=6" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -15302,9 +13965,9 @@ } }, "node_modules/p-retry": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.0.tgz", - "integrity": "sha512-JA6nkq6hKyWLLasXQXUrO4z8BUZGUt/LjlJxx8Gb2+2ntodU/SS63YZ8b0LUTbQ8ZB9iwOfhEPhg4ykKnn2KsA==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz", + "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==", "dev": true, "license": "MIT", "dependencies": { @@ -15382,7 +14045,6 @@ "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" @@ -15428,9 +14090,9 @@ } }, "node_modules/parse5": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.0.tgz", - "integrity": "sha512-ZkDsAOcxsUMZ4Lz5fVciOehNcJ+Gb8gTzcA4yl3wnc273BAybYWrQ+Ks/OjCjSEpjvQkDSeZbybK9qj2VHHdGA==", + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", "devOptional": true, "license": "MIT", "dependencies": { @@ -15482,7 +14144,6 @@ "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" @@ -15502,7 +14163,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -15584,7 +14244,6 @@ "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": { "node": ">=12" @@ -15809,14 +14468,14 @@ } }, "node_modules/postcss-modules-local-by-default": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", - "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.1.0.tgz", + "integrity": "sha512-rm0bdSv4jC3BDma3s9H19ZddW0aHX6EoqwDYU2IfZhRN+53QrufTRo2IdkAbRqLx4R2IYbZnbjKKxg4VN5oU9Q==", "dev": true, "license": "MIT", "dependencies": { "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", + "postcss-selector-parser": "^7.0.0", "postcss-value-parser": "^4.1.0" }, "engines": { @@ -15827,13 +14486,13 @@ } }, "node_modules/postcss-modules-scope": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", - "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", "dev": true, "license": "ISC", "dependencies": { - "postcss-selector-parser": "^6.0.4" + "postcss-selector-parser": "^7.0.0" }, "engines": { "node": "^10 || ^12 || >= 14" @@ -15859,9 +14518,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", "dev": true, "license": "MIT", "dependencies": { @@ -15879,20 +14538,13 @@ "dev": true, "license": "MIT" }, - "node_modules/prettier": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", - "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", - "dev": true, + "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==", "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "node": ">= 0.8.0" } }, "node_modules/pretty-bytes": { @@ -16038,11 +14690,14 @@ "optional": true }, "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.13.0.tgz", + "integrity": "sha512-BFwmFXiJoFqlUpZ5Qssolv15DMyc84gTBds1BjsV1BfXEo1UyyD7GsmN67n7J77uRhoSNW1AXtXKPLcBFQn9Aw==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + } }, "node_modules/pump": { "version": "3.0.2", @@ -16059,7 +14714,6 @@ "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" @@ -16109,7 +14763,6 @@ "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", @@ -16162,16 +14815,6 @@ "node": ">= 0.8" } }, - "node_modules/raw-body/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/react-is": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", @@ -16195,29 +14838,17 @@ } }, "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/readdirp/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", + "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", "dev": true, "license": "MIT", "engines": { - "node": ">=8.6" + "node": ">= 14.16.0" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, "node_modules/reflect-metadata": { @@ -16272,16 +14903,16 @@ "license": "MIT" }, "node_modules/regexpu-core": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.1.1.tgz", - "integrity": "sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", + "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", "dev": true, "license": "MIT", "dependencies": { "regenerate": "^1.4.2", "regenerate-unicode-properties": "^10.2.0", "regjsgen": "^0.8.0", - "regjsparser": "^0.11.0", + "regjsparser": "^0.12.0", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.1.0" }, @@ -16297,9 +14928,9 @@ "license": "MIT" }, "node_modules/regjsparser": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.11.1.tgz", - "integrity": "sha512-1DHODs4B8p/mQHU9kr+jv8+wIC9mtG4eBHxWxIq5mhjE3D5oORhCc6deRKzTjs9DcfRFmj9BHSDguZklqCGFWQ==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", + "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -16390,7 +15021,7 @@ "node": ">=8" } }, - "node_modules/resolve-from": { + "node_modules/resolve-cwd/node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", @@ -16400,6 +15031,15 @@ "node": ">=8" } }, + "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==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/resolve-url-loader": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", @@ -16487,7 +15127,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, "license": "MIT", "engines": { "iojs": ">=1.0.0", @@ -16517,16 +15156,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/rimraf/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/rimraf/node_modules/glob": { "version": "10.4.5", "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", @@ -16548,22 +15177,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/rimraf/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/rollup": { "version": "4.22.4", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.4.tgz", @@ -16600,6 +15213,13 @@ "fsevents": "~2.3.2" } }, + "node_modules/rollup/node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true, + "license": "MIT" + }, "node_modules/run-applescript": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", @@ -16617,7 +15237,6 @@ "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", @@ -16733,6 +15352,70 @@ } } }, + "node_modules/sass/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/sass/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/sass/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/sass/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, "node_modules/sax": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", @@ -16817,7 +15500,6 @@ "version": "7.6.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -17032,7 +15714,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" @@ -17045,7 +15726,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -17367,10 +16047,10 @@ "wbuf": "^1.7.3" } }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", "dev": true, "license": "BSD-3-Clause" }, @@ -17579,7 +16259,6 @@ "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" @@ -17589,16 +16268,15 @@ } }, "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/supports-preserve-symlinks-flag": { @@ -17783,16 +16461,6 @@ "ajv": "^6.9.1" } }, - "node_modules/terser-webpack-plugin/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/terser-webpack-plugin/node_modules/jest-worker": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", @@ -17872,6 +16540,30 @@ "node": ">=8" } }, + "node_modules/test-exclude/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/test-exclude/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/thingies": { "version": "1.21.0", "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", @@ -17910,22 +16602,22 @@ "license": "MIT" }, "node_modules/tldts": { - "version": "6.1.58", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.58.tgz", - "integrity": "sha512-MQJrJhjHOYGYb8DobR6Y4AdDbd4TYkyQ+KBDVc5ODzs1cbrvPpfN1IemYi9jfipJ/vR1YWvrDli0hg1y19VRoA==", + "version": "6.1.63", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.63.tgz", + "integrity": "sha512-YWwhsjyn9sB/1rOkSRYxvkN/wl5LFM1QDv6F2pVR+pb/jFne4EOBxHfkKVWvDIBEAw9iGOwwubHtQTm0WRT5sQ==", "dev": true, "license": "MIT", "dependencies": { - "tldts-core": "^6.1.58" + "tldts-core": "^6.1.63" }, "bin": { "tldts": "bin/cli.js" } }, "node_modules/tldts-core": { - "version": "6.1.58", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.58.tgz", - "integrity": "sha512-dR936xmhBm7AeqHIhCWwK765gZ7dFyL+IqLSFAjJbFlUXGMLCb8i2PzlzaOuWBuplBTaBYseSb565nk/ZEM0Bg==", + "version": "6.1.63", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.63.tgz", + "integrity": "sha512-H1XCt54xY+QPbwhTgmxLkepX0MVHu3USfMmejiCOdkMbRcP22Pn2FVF127r/GWXVDmXTRezyF3Ckvhn4Fs6j7Q==", "dev": true, "license": "MIT" }, @@ -17950,7 +16642,6 @@ "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" @@ -17970,29 +16661,16 @@ } }, "node_modules/tough-cookie": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", - "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.0.0.tgz", + "integrity": "sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" + "tldts": "^6.1.32" }, "engines": { - "node": ">=6" - } - }, - "node_modules/tough-cookie/node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.0.0" + "node": ">=16" } }, "node_modules/tr46": { @@ -18035,6 +16713,18 @@ "tree-kill": "cli.js" } }, + "node_modules/ts-api-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.0.tgz", + "integrity": "sha512-032cPxaEKwM+GT3vA5JXNzIaizx388rhsSW79vGRNGXfRRAdEAn2mvk36PvK5HnOchyWZ7afLEXqYCvPCrzuzQ==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, "node_modules/ts-jest": { "version": "29.2.5", "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.2.5.tgz", @@ -18125,6 +16815,18 @@ "dev": true, "license": "Unlicense" }, + "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==", + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", @@ -18173,7 +16875,6 @@ "version": "5.5.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", - "dev": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -18183,6 +16884,33 @@ "node": ">=14.17" } }, + "node_modules/typescript-eslint": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.15.0.tgz", + "integrity": "sha512-wY4FRGl0ZI+ZU4Jo/yjdBu0lVTSML58pu6PgGtJmCufvzfV565pUF6iACQt092uFOd49iLOTX/sEVmHtbSrS+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.15.0", + "@typescript-eslint/parser": "8.15.0", + "@typescript-eslint/utils": "8.15.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" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/undici-types": { "version": "6.19.8", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", @@ -18338,7 +17066,6 @@ "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" @@ -18945,9 +17672,9 @@ } }, "node_modules/vite/node_modules/postcss": { - "version": "8.4.47", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", - "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "dev": true, "funding": [ { @@ -18966,7 +17693,7 @@ "license": "MIT", "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.1.0", + "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, "engines": { @@ -19184,6 +17911,44 @@ } } }, + "node_modules/webpack-dev-server/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/webpack-dev-server/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/webpack-dev-server/node_modules/http-proxy-middleware": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", @@ -19209,6 +17974,32 @@ } } }, + "node_modules/webpack-dev-server/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/webpack-dev-server/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, "node_modules/webpack-merge": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", @@ -19283,6 +18074,30 @@ "ajv": "^6.9.1" } }, + "node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, "node_modules/webpack/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", @@ -19395,7 +18210,6 @@ "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" @@ -19414,6 +18228,15 @@ "dev": true, "license": "MIT" }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", @@ -19448,78 +18271,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "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/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/wrap-ansi-cjs/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/wrap-ansi/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/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/wrap-ansi/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/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -19648,7 +18399,6 @@ "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" From 855f967a63577e34fb581581bf7422816b21f972 Mon Sep 17 00:00:00 2001 From: Yanick Minder Date: Fri, 22 Nov 2024 09:40:12 +0100 Subject: [PATCH 15/33] styling indent set to 2 --- frontend/eslint.config.mjs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/frontend/eslint.config.mjs b/frontend/eslint.config.mjs index ee14055024..65d7cbb53e 100644 --- a/frontend/eslint.config.mjs +++ b/frontend/eslint.config.mjs @@ -28,7 +28,9 @@ export default tsEslint.config( "@stylistic/function-call-argument-newline": ["error", "never"], "@stylistic/padded-blocks": ["error", "never"], "@stylistic/dot-location": ["error", "property"], - "@stylistic/newline-per-chained-call": ["error", { "ignoreChainWithDepth": 1 }] + "@stylistic/newline-per-chained-call": ["error", { "ignoreChainWithDepth": 1 }], + "@stylistic/indent": ["error", 2], + // "@stylistic/quotes":"off" }, } ); From 076c15dfa27b47e64e1927acd45019ffbbf12902 Mon Sep 17 00:00:00 2001 From: Yanick Minder Date: Fri, 22 Nov 2024 10:09:30 +0100 Subject: [PATCH 16/33] add html formatting --- frontend/eslint.config.mjs | 14 ++- frontend/package-lock.json | 246 ++++++++++++++++--------------------- frontend/package.json | 2 + 3 files changed, 120 insertions(+), 142 deletions(-) diff --git a/frontend/eslint.config.mjs b/frontend/eslint.config.mjs index 65d7cbb53e..e1123b2735 100644 --- a/frontend/eslint.config.mjs +++ b/frontend/eslint.config.mjs @@ -1,9 +1,8 @@ - import eslint from "@eslint/js"; import tsEslint from "typescript-eslint"; import unusedImports from "eslint-plugin-unused-imports"; import stylistic from "@stylistic/eslint-plugin"; - +import html from "@html-eslint/eslint-plugin"; export default tsEslint.config( eslint.configs.recommended, @@ -13,8 +12,17 @@ export default tsEslint.config( files: ['**/*.spec.ts'], rules: { "@typescript-eslint/no-explicit-any": "off" + }, + }, + { + ...html.configs["flat/recommended"], + files: ["**/*.html"], + rules: { + ...html.configs["flat/recommended"].rules, + "@html-eslint/indent": ["error",2], + + } }, - }, { plugins: { 'unused-imports': unusedImports, diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 52dd646e28..f03847e085 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -37,6 +37,8 @@ "@cypress/schematic": "^2.5.2", "@cypress/skip-test": "^2.6.1", "@eslint/js": "^9.15.0", + "@html-eslint/eslint-plugin": "^0.27.0", + "@html-eslint/parser": "^0.27.0", "@types/eslint__js": "^8.42.3", "@types/jest": "^29.5.13", "@types/uuid": "^10.0.0", @@ -490,6 +492,36 @@ "typescript": ">=5.4 <5.6" } }, + "node_modules/@angular/compiler-cli/node_modules/chokidar": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", + "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@angular/compiler-cli/node_modules/readdirp": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", + "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@angular/core": { "version": "18.2.12", "resolved": "https://registry.npmjs.org/@angular/core/-/core-18.2.12.tgz", @@ -3315,6 +3347,29 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@html-eslint/eslint-plugin": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@html-eslint/eslint-plugin/-/eslint-plugin-0.27.0.tgz", + "integrity": "sha512-aAF14sgDKidMCCQpJ4kIhe+fwyAaAbvDlgVTIgd99F+HOWxokTTXDt39a3gewMBo76IeEHDaoizUDJQ/Vc7Mdg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@html-eslint/parser": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@html-eslint/parser/-/parser-0.27.0.tgz", + "integrity": "sha512-F/A1M0jnDAYoRvJiiSC7pIBD9DAsf4EhbndbvEi81aozD/wI8WWXON50xZPUaGHCI1C+2syTVifxDz8MvDKaQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-html-parser": "^0.0.9" + }, + "engines": { + "node": ">=8.10.0" + } + }, "node_modules/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", @@ -7239,19 +7294,41 @@ } }, "node_modules/chokidar": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", - "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, "license": "MIT", "dependencies": { - "readdirp": "^4.0.1" + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" }, "engines": { - "node": ">= 14.16.0" + "node": ">= 8.10.0" }, "funding": { "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/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/chownr": { @@ -8784,6 +8861,13 @@ "node": ">= 0.4" } }, + "node_modules/es-html-parser": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/es-html-parser/-/es-html-parser-0.0.9.tgz", + "integrity": "sha512-oniQMi+466VFsDzcdron9Ry/sqUJpDJg1bbDn0jFJKDdxXhwIOYDr4DgBnO5/yPLGj2xv+n5yy4L1Q0vAC5TYQ==", + "dev": true, + "license": "MIT" + }, "node_modules/es-module-lexer": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", @@ -14838,17 +14922,29 @@ } }, "node_modules/readdirp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", - "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, "engines": { - "node": ">= 14.16.0" + "node": ">=8.10.0" + } + }, + "node_modules/readdirp/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": { - "type": "individual", - "url": "https://paulmillr.com/funding/" + "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/reflect-metadata": { @@ -15352,70 +15448,6 @@ } } }, - "node_modules/sass/node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/sass/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/sass/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/sass/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, "node_modules/sax": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", @@ -17911,44 +17943,6 @@ } } }, - "node_modules/webpack-dev-server/node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/webpack-dev-server/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/webpack-dev-server/node_modules/http-proxy-middleware": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", @@ -17974,32 +17968,6 @@ } } }, - "node_modules/webpack-dev-server/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/webpack-dev-server/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, "node_modules/webpack-merge": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", diff --git a/frontend/package.json b/frontend/package.json index b64243d8f2..d250c8a59b 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -50,6 +50,8 @@ "@cypress/schematic": "^2.5.2", "@cypress/skip-test": "^2.6.1", "@eslint/js": "^9.15.0", + "@html-eslint/eslint-plugin": "^0.27.0", + "@html-eslint/parser": "^0.27.0", "@types/eslint__js": "^8.42.3", "@types/jest": "^29.5.13", "@types/uuid": "^10.0.0", From 5ae0a162c3e3f9c61907d68938743fd6384c0fa1 Mon Sep 17 00:00:00 2001 From: Yanick Minder Date: Fri, 22 Nov 2024 10:27:24 +0100 Subject: [PATCH 17/33] extract eslint format in seperated command --- frontend/package.json | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index d250c8a59b..1b36eba85a 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -13,8 +13,11 @@ "cypress:run": "cypress run --browser chrome", "cypress:open-test": "concurrently \"npm start\" \"cypress open\"", "cypress:run-test": "npm run build && concurrently \"npm run serve:dist\" \"cypress run\"", - "format": "eslint --fix .", - "check": "eslint .", + "format": "npm run esl-format", + "check": "npm run es-check", + "esl-format": "eslint --fix .", + "es-check": "eslint .", + "prestart": "cp scripts/pre-commit ../.git/hooks/ && chmod +x ../.git/hooks/pre-commit && echo 'hook copied'", "prebuild": "version=$(grep -oP '\\K.*(?=-SNAPSHOT)' ../pom.xml); echo \"export const version = 'v$version';\" > src/app/version.ts\n", "e2e": "ng e2e" From 875c9c5111d82e1d11d35ee3b2c548f96d68a58f Mon Sep 17 00:00:00 2001 From: Yanick Minder Date: Fri, 22 Nov 2024 10:39:22 +0100 Subject: [PATCH 18/33] readd prettier for css json and yaml --- frontend/package-lock.json | 17 +++++++++++++++++ frontend/package.json | 8 +++++--- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index f03847e085..edb80a3f66 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -50,6 +50,7 @@ "jest": "^29.7.0", "jest-preset-angular": "^14.2.4", "ngx-translate-testing": "^7.0.0", + "prettier": "^3.3.3", "typescript": "^5.5.4", "typescript-eslint": "^8.15.0", "uuid": "^11.0.0" @@ -14631,6 +14632,22 @@ "node": ">= 0.8.0" } }, + "node_modules/prettier": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/pretty-bytes": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", diff --git a/frontend/package.json b/frontend/package.json index 1b36eba85a..96db7dd4bc 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -13,11 +13,12 @@ "cypress:run": "cypress run --browser chrome", "cypress:open-test": "concurrently \"npm start\" \"cypress open\"", "cypress:run-test": "npm run build && concurrently \"npm run serve:dist\" \"cypress run\"", - "format": "npm run esl-format", - "check": "npm run es-check", + "format": "npm run esl-format && npm run prettier-format", + "check": "npm run es-check && npm run prettier-check", "esl-format": "eslint --fix .", "es-check": "eslint .", - + "prettier-format": "prettier --write \"./**/*.{json,css,scss,md,yaml,yml}\"", + "prettier-check": "prettier --check \"./**/*.{json,css,scss,md,yaml,yml}\"", "prestart": "cp scripts/pre-commit ../.git/hooks/ && chmod +x ../.git/hooks/pre-commit && echo 'hook copied'", "prebuild": "version=$(grep -oP '\\K.*(?=-SNAPSHOT)' ../pom.xml); echo \"export const version = 'v$version';\" > src/app/version.ts\n", "e2e": "ng e2e" @@ -66,6 +67,7 @@ "jest": "^29.7.0", "jest-preset-angular": "^14.2.4", "ngx-translate-testing": "^7.0.0", + "prettier": "^3.3.3", "typescript": "^5.5.4", "typescript-eslint": "^8.15.0", "uuid": "^11.0.0" From 4e7dd021b9725d8c8918ca5b12bd99b829c0b551 Mon Sep 17 00:00:00 2001 From: Yanick Minder Date: Fri, 22 Nov 2024 10:47:22 +0100 Subject: [PATCH 19/33] update eslint config --- frontend/eslint.config.mjs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/frontend/eslint.config.mjs b/frontend/eslint.config.mjs index e1123b2735..ded53f4afe 100644 --- a/frontend/eslint.config.mjs +++ b/frontend/eslint.config.mjs @@ -7,7 +7,10 @@ import html from "@html-eslint/eslint-plugin"; export default tsEslint.config( eslint.configs.recommended, ...tsEslint.configs.recommended, - stylistic.configs['all-flat'], + { + ...stylistic.configs['all-flat'], + files: ['**/*.ts'], + }, { files: ['**/*.spec.ts'], rules: { @@ -38,7 +41,7 @@ export default tsEslint.config( "@stylistic/dot-location": ["error", "property"], "@stylistic/newline-per-chained-call": ["error", { "ignoreChainWithDepth": 1 }], "@stylistic/indent": ["error", 2], - // "@stylistic/quotes":"off" + "@stylistic/quotes":["error","double"] }, } ); From 4a9642d9a52ad3ca19dffdbb8a0b77f8f7416481 Mon Sep 17 00:00:00 2001 From: Yanick Minder Date: Fri, 22 Nov 2024 11:04:01 +0100 Subject: [PATCH 20/33] disable check for multipline tenary --- frontend/eslint.config.mjs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frontend/eslint.config.mjs b/frontend/eslint.config.mjs index ded53f4afe..cffd667849 100644 --- a/frontend/eslint.config.mjs +++ b/frontend/eslint.config.mjs @@ -41,7 +41,8 @@ export default tsEslint.config( "@stylistic/dot-location": ["error", "property"], "@stylistic/newline-per-chained-call": ["error", { "ignoreChainWithDepth": 1 }], "@stylistic/indent": ["error", 2], - "@stylistic/quotes":["error","double"] + "@stylistic/quotes":["error","double"], + "@stylistic/multiline-ternary": ["off"], }, } ); From 6954b046108f9cf6cfba2a5b5e83f80f57a7aabc Mon Sep 17 00:00:00 2001 From: Yanick Minder Date: Fri, 22 Nov 2024 11:41:54 +0100 Subject: [PATCH 21/33] refactor config to extract rules to apply only on ts files --- frontend/eslint.config.mjs | 64 ++++++++++++++++++-------------------- 1 file changed, 31 insertions(+), 33 deletions(-) diff --git a/frontend/eslint.config.mjs b/frontend/eslint.config.mjs index cffd667849..38261eb1c8 100644 --- a/frontend/eslint.config.mjs +++ b/frontend/eslint.config.mjs @@ -5,44 +5,42 @@ import stylistic from "@stylistic/eslint-plugin"; import html from "@html-eslint/eslint-plugin"; export default tsEslint.config( - eslint.configs.recommended, - ...tsEslint.configs.recommended, - { - ...stylistic.configs['all-flat'], - files: ['**/*.ts'], - }, - { - files: ['**/*.spec.ts'], + eslint.configs.recommended, ...tsEslint.configs.recommended, { + ...stylistic.configs["all-flat"], + files: ["**/*.ts"], rules: { - "@typescript-eslint/no-explicit-any": "off" - }, - }, - { - ...html.configs["flat/recommended"], - files: ["**/*.html"], - rules: { - ...html.configs["flat/recommended"].rules, - "@html-eslint/indent": ["error",2], - - } - }, - { - plugins: { - 'unused-imports': unusedImports, - '@stylistic': stylistic - }, - rules: { - 'unused-imports/no-unused-imports': 'error', + "unused-imports/no-unused-imports": "error", + //disable rules so eslint passes, probably fix later "@typescript-eslint/no-unused-vars": "off", "@typescript-eslint/no-unused-expressions": "off", "no-undef": "off", - "@stylistic/function-call-argument-newline": ["error", "never"], - "@stylistic/padded-blocks": ["error", "never"], - "@stylistic/dot-location": ["error", "property"], - "@stylistic/newline-per-chained-call": ["error", { "ignoreChainWithDepth": 1 }], - "@stylistic/indent": ["error", 2], - "@stylistic/quotes":["error","double"], + "@typescript-eslint/no-explicit-any": "off", + //stylistic rules + "@stylistic/function-call-argument-newline": ["error", "never"], + "@stylistic/padded-blocks": ["error", "never"], + "@stylistic/dot-location": ["error", "property"], + "@stylistic/newline-per-chained-call": ["error", { "ignoreChainWithDepth": 1 }], + "@stylistic/indent": ["error", 2], + "@stylistic/quotes":["error","double"], "@stylistic/multiline-ternary": ["off"], + }, + }, { + files: ["**/*.spec.ts"], + rules: { + "@typescript-eslint/no-explicit-any": "off" + }, + }, { + ...html.configs["flat/recommended"], + files: ["**/*.html"], + rules: { + ...html.configs["flat/recommended"].rules, + "@html-eslint/indent": ["error",2], + + } + }, { + plugins: { + "unused-imports": unusedImports, + "@stylistic": stylistic }, } ); From 6b2e730e524fa48938b86d27229379eb8ad8f9a4 Mon Sep 17 00:00:00 2001 From: Yanick Minder Date: Fri, 22 Nov 2024 11:48:29 +0100 Subject: [PATCH 22/33] allow arguments --- frontend/eslint.config.mjs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/frontend/eslint.config.mjs b/frontend/eslint.config.mjs index 38261eb1c8..d93034e970 100644 --- a/frontend/eslint.config.mjs +++ b/frontend/eslint.config.mjs @@ -27,7 +27,9 @@ export default tsEslint.config( }, { files: ["**/*.spec.ts"], rules: { - "@typescript-eslint/no-explicit-any": "off" + "@typescript-eslint/no-explicit-any": "off", + "prefer-rest-params": "off", + }, }, { ...html.configs["flat/recommended"], From 3bd3813716eb30ae297259407024ad5965f690b0 Mon Sep 17 00:00:00 2001 From: Jannik Pulfer Date: Fri, 22 Nov 2024 15:32:23 +0100 Subject: [PATCH 23/33] Update excluded eslint rules that we want to resolve in follow up ticket --- frontend/eslint.config.mjs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/frontend/eslint.config.mjs b/frontend/eslint.config.mjs index d93034e970..ced92f755b 100644 --- a/frontend/eslint.config.mjs +++ b/frontend/eslint.config.mjs @@ -10,11 +10,13 @@ export default tsEslint.config( files: ["**/*.ts"], rules: { "unused-imports/no-unused-imports": "error", - //disable rules so eslint passes, probably fix later + // ToDo: Disable rules so eslint passes, fix in followup ticket "@typescript-eslint/no-unused-vars": "off", "@typescript-eslint/no-unused-expressions": "off", "no-undef": "off", "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-namespace": "off", + "prefer-rest-params": "off", //stylistic rules "@stylistic/function-call-argument-newline": ["error", "never"], "@stylistic/padded-blocks": ["error", "never"], @@ -29,15 +31,17 @@ export default tsEslint.config( rules: { "@typescript-eslint/no-explicit-any": "off", "prefer-rest-params": "off", - }, }, { ...html.configs["flat/recommended"], files: ["**/*.html"], rules: { ...html.configs["flat/recommended"].rules, + // ToDo: Disable rules so eslint passes, fix in followup ticket + "@html-eslint/require-img-alt": "off", + "@html-eslint/element-newline": "off", + //stylistic rules "@html-eslint/indent": ["error",2], - } }, { plugins: { From 91abb693766ceec6493332627b2414b842f2c0f8 Mon Sep 17 00:00:00 2001 From: Jannik Pulfer Date: Fri, 22 Nov 2024 15:45:08 +0100 Subject: [PATCH 24/33] Fix sentence in readme --- backend/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/README.md b/backend/README.md index b31e5267e7..58b7d8f264 100644 --- a/backend/README.md +++ b/backend/README.md @@ -36,7 +36,7 @@ Formatting: - Check code formatting: `mvn spotless:check` - Format the code: `mvn spotless:apply` -The `compile` goal execute also a `spotless:apply` goal. +We also run the formatter with `spotless:apply` in the `compile` goal. Verify the Backend for coverage check: - `mvn clean verify` From e038079b89a39ee4e3d06bb0e0c75e7b486238f6 Mon Sep 17 00:00:00 2001 From: Jannik Pulfer Date: Mon, 25 Nov 2024 08:31:08 +0100 Subject: [PATCH 25/33] Allow ts-ignores --- frontend/eslint.config.mjs | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/eslint.config.mjs b/frontend/eslint.config.mjs index ced92f755b..f62d12b602 100644 --- a/frontend/eslint.config.mjs +++ b/frontend/eslint.config.mjs @@ -13,6 +13,7 @@ export default tsEslint.config( // ToDo: Disable rules so eslint passes, fix in followup ticket "@typescript-eslint/no-unused-vars": "off", "@typescript-eslint/no-unused-expressions": "off", + "@typescript-eslint/ban-ts-comment": "off", "no-undef": "off", "@typescript-eslint/no-explicit-any": "off", "@typescript-eslint/no-namespace": "off", From e9cfeb0c7e832a0f1b3618c7efdf6a95bb25db9c Mon Sep 17 00:00:00 2001 From: Miguel Lehmann Date: Mon, 25 Nov 2024 15:48:04 +0100 Subject: [PATCH 26/33] remove unnecessary comma --- frontend/tsconfig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json index 2e5b345397..c4e3ae25fd 100644 --- a/frontend/tsconfig.json +++ b/frontend/tsconfig.json @@ -22,7 +22,7 @@ "resolveJsonModule": true, "esModuleInterop": true, "useDefineForClassFields": false, - "allowSyntheticDefaultImports": true, + "allowSyntheticDefaultImports": true }, "angularCompilerOptions": { "enableI18nLegacyMessageIdFormat": false, From b29b524a589397af0a3ae2783c4d3fcf19940981 Mon Sep 17 00:00:00 2001 From: Yanick Minder Date: Fri, 22 Nov 2024 12:02:06 +0100 Subject: [PATCH 27/33] run formatter --- frontend/cypress.config.ts | 6 +- frontend/cypress/e2e/check-in.cy.ts | 356 ++++++----- frontend/cypress/e2e/duplicated-scoring.cy.ts | 62 +- frontend/cypress/e2e/key-result.cy.ts | 453 ++++++++------ frontend/cypress/e2e/login.cy.ts | 47 +- frontend/cypress/e2e/objective-backlog.cy.ts | 213 ++++--- frontend/cypress/e2e/objective-crud.cy.ts | 109 ++-- frontend/cypress/e2e/objective.cy.ts | 324 ++++++---- frontend/cypress/e2e/overview.cy.ts | 44 +- frontend/cypress/e2e/routing.cy.ts | 38 +- frontend/cypress/e2e/scoring.cy.ts | 63 +- frontend/cypress/e2e/tab.cy.ts | 521 +++++++++------- frontend/cypress/e2e/team.cy.ts | 184 +++--- frontend/cypress/e2e/teammanagement.cy.ts | 590 +++++++++++------- frontend/cypress/support/commands.ts | 77 ++- frontend/cypress/support/component.ts | 4 +- frontend/cypress/support/e2e.ts | 8 +- .../helper/dom-helper/angularSearchBox.ts | 15 +- .../dom-helper/dialogs/checkInDialog.ts | 81 +-- .../dialogs/checkInHistoryDialog.ts | 20 +- .../dom-helper/dialogs/confirmDialog.ts | 18 +- .../helper/dom-helper/dialogs/dialog.ts | 14 +- .../dom-helper/dialogs/inviteMembersDialog.ts | 25 +- .../dom-helper/dialogs/keyResultDialog.ts | 86 +-- .../dom-helper/dialogs/objectiveDialog.ts | 24 +- .../helper/dom-helper/dialogs/teamDialog.ts | 12 +- .../support/helper/dom-helper/filterHelper.ts | 24 +- .../helper/dom-helper/pageObjectMapperBase.ts | 21 +- .../dom-helper/pages/keyResultDetailPage.ts | 47 +- .../helper/dom-helper/pages/overviewPage.ts | 127 ++-- .../support/helper/dom-helper/pages/page.ts | 5 +- .../dom-helper/pages/teammanagementPage.ts | 71 ++- .../cypress/support/helper/keyResultHelper.ts | 5 +- .../cypress/support/helper/objectiveHelper.ts | 8 +- .../cypress/support/helper/scoringSupport.ts | 74 ++- frontend/cypress/support/helper/utils.ts | 24 +- frontend/setup-jest.ts | 2 +- frontend/src/app/app-routing.module.ts | 40 +- frontend/src/app/app.component.spec.ts | 47 +- frontend/src/app/app.component.ts | 20 +- frontend/src/app/app.module.ts | 144 ++--- .../action-plan/action-plan.component.html | 14 +- .../action-plan/action-plan.component.spec.ts | 98 +-- .../action-plan/action-plan.component.ts | 46 +- .../application-banner.component.html | 6 +- .../application-banner.component.spec.ts | 88 +-- .../application-banner.component.ts | 24 +- .../application-top-bar.component.html | 40 +- .../application-top-bar.component.spec.ts | 66 +- .../application-top-bar.component.ts | 33 +- .../check-in-history-dialog.component.html | 14 +- .../check-in-history-dialog.component.spec.ts | 46 +- .../check-in-history-dialog.component.ts | 39 +- .../check-in-form-metric.component.html | 2 +- .../check-in-form-metric.component.spec.ts | 58 +- .../check-in-form-metric.component.ts | 40 +- .../metric-check-in-directive.spec.ts | 24 +- .../metric-check-in-directive.ts | 19 +- .../check-in-form-ordinal.component.html | 30 +- .../check-in-form-ordinal.component.spec.ts | 67 +- .../check-in-form-ordinal.component.ts | 16 +- .../check-in-form.component.html | 22 +- .../check-in-form.component.spec.ts | 171 ++--- .../check-in-form/check-in-form.component.ts | 55 +- .../confidence/confidence.component.html | 12 +- .../confidence/confidence.component.spec.ts | 57 +- .../confidence/confidence.component.ts | 12 +- .../key-result-form.component.html | 2 +- .../key-result-form.component.spec.ts | 209 ++++--- .../key-result-form.component.ts | 92 +-- .../keyresult-detail.component.html | 34 +- .../keyresult-detail.component.spec.ts | 101 +-- .../keyresult-detail.component.ts | 76 +-- .../keyresult-dialog.component.html | 14 +- .../keyresult-dialog.component.spec.ts | 443 +++++++------ .../keyresult-dialog.component.ts | 65 +- .../keyresult-type.component.html | 4 +- .../keyresult-type.component.spec.ts | 252 ++++---- .../keyresult-type.component.ts | 61 +- .../keyresult/keyresult.component.html | 8 +- .../keyresult/keyresult.component.spec.ts | 22 +- .../keyresult/keyresult.component.ts | 16 +- .../objective-detail.component.html | 21 +- .../objective-detail.component.spec.ts | 65 +- .../objective-detail.component.ts | 30 +- .../objective-filter.component.html | 8 +- .../objective-filter.component.spec.ts | 87 +-- .../objective-filter.component.ts | 32 +- .../objective/ObjectiveMenuActions.ts | 38 +- .../objective/ObjectiveMenuAfterActions.ts | 84 +-- .../objective/objective.component.html | 14 +- .../objective/objective.component.spec.ts | 100 +-- .../objective/objective.component.ts | 38 +- .../overview/overview.component.html | 18 +- .../overview/overview.component.spec.ts | 108 ++-- .../components/overview/overview.component.ts | 40 +- .../quarter-filter.component.spec.ts | 116 ++-- .../quarter-filter.component.ts | 55 +- .../team-filter/team-filter.component.html | 2 +- .../team-filter/team-filter.component.spec.ts | 229 ++++--- .../team-filter/team-filter.component.ts | 73 ++- .../app/components/team/team.component.html | 11 +- .../components/team/team.component.spec.ts | 59 +- .../src/app/components/team/team.component.ts | 35 +- frontend/src/app/guards/auth.guard.spec.ts | 73 ++- frontend/src/app/guards/auth.guard.ts | 35 +- .../interceptors/error-interceptor.service.ts | 68 +- .../interceptors/error.interceptor.spec.ts | 203 +++--- .../interceptors/oauth.interceptor.spec.ts | 15 +- .../src/app/interceptors/oauth.interceptor.ts | 40 +- .../src/app/services/action.service.spec.ts | 13 +- frontend/src/app/services/action.service.ts | 12 +- .../src/app/services/check-in.service.spec.ts | 34 +- frontend/src/app/services/check-in.service.ts | 16 +- frontend/src/app/services/completed.servce.ts | 14 +- .../app/services/completed.service.spec.ts | 13 +- .../src/app/services/config.service.spec.ts | 13 +- frontend/src/app/services/config.service.ts | 13 +- .../services/customization.service.spec.ts | 163 +++-- .../src/app/services/customization.service.ts | 33 +- .../src/app/services/dialog.service.spec.ts | 227 ++++--- frontend/src/app/services/dialog.service.ts | 24 +- .../app/services/keyresult.service.spec.ts | 13 +- .../src/app/services/keyresult.service.ts | 31 +- .../objective-menu-actions.service.spec.ts | 89 +-- .../objective-menu-actions.service.ts | 26 +- .../app/services/objective.service.spec.ts | 13 +- .../src/app/services/objective.service.ts | 14 +- .../src/app/services/overview.service.spec.ts | 41 +- frontend/src/app/services/overview.service.ts | 35 +- .../src/app/services/quarter.service.spec.ts | 13 +- frontend/src/app/services/quarter.service.ts | 14 +- .../app/services/refresh-data.service.spec.ts | 11 +- .../src/app/services/refresh-data.service.ts | 8 +- .../src/app/services/team.service.spec.ts | 13 +- frontend/src/app/services/team.service.ts | 43 +- .../src/app/services/toaster.service.spec.ts | 55 +- frontend/src/app/services/toaster.service.ts | 14 +- .../src/app/services/user.service.spec.ts | 89 +-- frontend/src/app/services/user.service.ts | 50 +- frontend/src/app/shared/common.spec.ts | 241 ++++--- frontend/src/app/shared/common.ts | 34 +- frontend/src/app/shared/constantLibary.ts | 30 +- .../dialog-template-core.component.html | 6 +- .../dialog-template-core.component.ts | 12 +- .../okr-tangram/okr-tangram.component.html | 8 +- .../okr-tangram/okr-tangram.component.ts | 14 +- .../puzzle-icon-button.component.html | 13 +- .../puzzle-icon-button.component.ts | 12 +- .../puzzle-icon/puzzle-icon.component.html | 7 +- .../puzzle-icon/puzzle-icon.component.ts | 6 +- .../custom/scoring/scoring.component.html | 25 +- .../custom/scoring/scoring.component.spec.ts | 92 +-- .../custom/scoring/scoring.component.ts | 68 +- .../custom/spinner/spinner.component.html | 6 +- .../custom/spinner/spinner.component.ts | 8 +- frontend/src/app/shared/customRouter.ts | 6 +- .../complete-dialog.component.html | 7 +- .../complete-dialog.component.spec.ts | 128 ++-- .../complete-dialog.component.ts | 31 +- .../confirm-dialog.component.spec.ts | 55 +- .../confirm-dialog.component.ts | 18 +- .../example-dialog.component.html | 6 +- .../example-dialog.component.spec.ts | 196 +++--- .../example-dialog.component.ts | 22 +- .../objective-form.component.html | 15 +- .../objective-form.component.spec.ts | 353 ++++++----- .../objective-form.component.ts | 164 ++--- .../unit-transformation.pipe.spec.ts | 56 +- .../unit-transformation.pipe.ts | 21 +- frontend/src/app/shared/regexLibrary.ts | 4 +- frontend/src/app/shared/routeUtils.spec.ts | 33 +- frontend/src/app/shared/routeUtils.ts | 4 +- frontend/src/app/shared/shared.module.ts | 52 +- .../shared/sidepanel/sidepanel.component.ts | 34 +- frontend/src/app/shared/testData.ts | 296 ++++----- .../src/app/shared/types/DTOs/KeyResultDTO.ts | 8 +- .../shared/types/DTOs/KeyResultMetricDTO.ts | 2 +- .../shared/types/DTOs/KeyResultOrdinalDTO.ts | 2 +- .../src/app/shared/types/enums/HttpType.ts | 8 +- frontend/src/app/shared/types/enums/State.ts | 8 +- frontend/src/app/shared/types/enums/Unit.ts | 10 +- .../src/app/shared/types/enums/UserRole.ts | 6 +- frontend/src/app/shared/types/enums/Zone.ts | 8 +- frontend/src/app/shared/types/menu-entry.ts | 2 +- .../src/app/shared/types/model/Completed.ts | 2 +- .../src/app/shared/types/model/KeyResult.ts | 8 +- .../app/shared/types/model/KeyResultMetric.ts | 2 +- .../shared/types/model/KeyResultMetricMin.ts | 2 +- .../shared/types/model/KeyResultObjective.ts | 4 +- .../shared/types/model/KeyResultOrdinal.ts | 2 +- .../shared/types/model/KeyResultOrdinalMin.ts | 2 +- .../app/shared/types/model/KeyresultMin.ts | 2 +- .../src/app/shared/types/model/Objective.ts | 4 +- .../app/shared/types/model/ObjectiveMin.ts | 6 +- .../app/shared/types/model/OverviewEntity.ts | 4 +- .../src/app/shared/types/model/Quarter.ts | 2 +- frontend/src/app/shared/types/model/User.ts | 4 +- .../app/shared/types/model/UserTableEntry.ts | 6 +- .../src/app/shared/types/model/UserTeam.ts | 2 +- frontend/src/app/shared/validators.ts | 23 +- .../add-edit-team-dialog.component.html | 9 +- .../add-edit-team-dialog.component.spec.ts | 88 +-- .../add-edit-team-dialog.component.ts | 60 +- .../add-member-to-team-dialog.component.html | 15 +- ...dd-member-to-team-dialog.component.spec.ts | 99 +-- .../add-member-to-team-dialog.component.ts | 71 ++- .../add-user-team.component.html | 18 +- .../add-user-team.component.spec.ts | 88 +-- .../add-user-team/add-user-team.component.ts | 48 +- .../delete-user/delete-user.component.html | 6 +- .../delete-user/delete-user.component.spec.ts | 152 +++-- .../delete-user/delete-user.component.ts | 89 ++- .../edit-okr-champion.component.html | 65 +- .../edit-okr-champion.component.ts | 16 +- .../invite-user-dialog.component.html | 45 +- .../invite-user-dialog.component.spec.ts | 80 +-- .../invite-user-dialog.component.ts | 31 +- .../member-detail.component.html | 35 +- .../member-detail.component.spec.ts | 116 ++-- .../member-detail/member-detail.component.ts | 79 +-- .../member-list-mobile.component.html | 30 +- .../member-list-mobile.component.spec.ts | 38 +- .../member-list-mobile.component.ts | 20 +- .../member-list-table.component.html | 12 +- .../member-list-table.component.spec.ts | 107 ++-- .../member-list-table.component.ts | 63 +- .../member-list/member-list.component.html | 18 +- .../member-list/member-list.component.spec.ts | 199 +++--- .../member-list/member-list.component.ts | 54 +- .../new-user/new-user.component.html | 24 +- .../new-user/new-user.component.spec.ts | 32 +- .../new-user/new-user.component.ts | 14 +- .../new-user/unique-mail.directive.spec.ts | 33 +- .../new-user/unique-mail.validator.ts | 13 +- .../team-management/okr-champion.pipe.spec.ts | 21 +- .../app/team-management/okr-champion.pipe.ts | 8 +- .../src/app/team-management/roles.pipe.ts | 13 +- .../search-team-management.component.html | 14 +- .../search-team-management.component.spec.ts | 140 +++-- .../search-team-management.component.ts | 65 +- .../show-edit-role.component.html | 5 +- .../show-edit-role.component.spec.ts | 30 +- .../show-edit-role.component.ts | 18 +- .../team-list/team-list.component.html | 4 +- .../team-list/team-list.component.spec.ts | 33 +- .../team-list/team-list.component.ts | 25 +- .../team-management-banner.component.html | 13 +- .../team-management-banner.component.spec.ts | 46 +- .../team-management-banner.component.ts | 21 +- ...am-management-mobile-filter.component.html | 6 +- ...management-mobile-filter.component.spec.ts | 82 +-- ...team-management-mobile-filter.component.ts | 26 +- .../team-management-routing.module.ts | 18 +- .../team-management.component.spec.ts | 62 +- .../team-management.component.ts | 8 +- .../team-management/team-management.module.ts | 88 +-- .../team-role-dropdown.component.html | 4 +- .../team-role-dropdown.component.spec.ts | 45 +- .../team-role-dropdown.component.ts | 10 +- .../app/team-management/teams.pipe.spec.ts | 29 +- .../src/app/team-management/teams.pipe.ts | 17 +- frontend/src/app/version.ts | 2 +- frontend/src/environments/environment.prod.ts | 10 +- frontend/src/environments/environment.ts | 10 +- frontend/src/global.ts | 5 +- frontend/src/index.html | 13 +- frontend/src/main.ts | 10 +- 268 files changed, 8079 insertions(+), 6296 deletions(-) diff --git a/frontend/cypress.config.ts b/frontend/cypress.config.ts index b188ef99ec..42cfaeffc4 100644 --- a/frontend/cypress.config.ts +++ b/frontend/cypress.config.ts @@ -1,14 +1,14 @@ -import { defineConfig } from 'cypress'; +import { defineConfig } from "cypress"; export default defineConfig({ e2e: { - baseUrl: 'http://pitc.okr.localhost:4200', + baseUrl: "http://pitc.okr.localhost:4200", experimentalMemoryManagement: true, testIsolation: true, viewportWidth: 1920, viewportHeight: 1080, }, env: { - login_url: 'http://localhost:8544', + login_url: "http://localhost:8544", }, }); diff --git a/frontend/cypress/e2e/check-in.cy.ts b/frontend/cypress/e2e/check-in.cy.ts index f1ff021f7c..58e4483cb5 100644 --- a/frontend/cypress/e2e/check-in.cy.ts +++ b/frontend/cypress/e2e/check-in.cy.ts @@ -1,14 +1,14 @@ -import * as users from '../fixtures/users.json'; -import { uniqueSuffix } from '../support/helper/utils'; -import CyOverviewPage from '../support/helper/dom-helper/pages/overviewPage'; -import { Unit } from '../../src/app/shared/types/enums/Unit'; -import KeyResultDetailPage from '../support/helper/dom-helper/pages/keyResultDetailPage'; -import CheckInDialog from '../support/helper/dom-helper/dialogs/checkInDialog'; -import CheckInHistoryDialog from '../support/helper/dom-helper/dialogs/checkInHistoryDialog'; -import ConfirmDialog from '../support/helper/dom-helper/dialogs/confirmDialog'; +import * as users from "../fixtures/users.json"; +import { uniqueSuffix } from "../support/helper/utils"; +import CyOverviewPage from "../support/helper/dom-helper/pages/overviewPage"; +import { Unit } from "../../src/app/shared/types/enums/Unit"; +import KeyResultDetailPage from "../support/helper/dom-helper/pages/keyResultDetailPage"; +import CheckInDialog from "../support/helper/dom-helper/dialogs/checkInDialog"; +import CheckInHistoryDialog from "../support/helper/dom-helper/dialogs/checkInHistoryDialog"; +import ConfirmDialog from "../support/helper/dom-helper/dialogs/confirmDialog"; -describe('OKR Check-in e2e tests', () => { - describe('tests via click', () => { +describe("OKR Check-in e2e tests", () => { + describe("tests via click", () => { let overviewPage = new CyOverviewPage(); let keyresultDetailPage = new KeyResultDetailPage(); @@ -18,268 +18,290 @@ describe('OKR Check-in e2e tests', () => { cy.loginAsUser(users.gl); }); - it(`Create checkin metric`, () => { + it("Create checkin metric", () => { overviewPage .addKeyResult() - .fillKeyResultTitle('Very important keyresult') - .withMetricValues(Unit.PERCENT, '21', '51') - .fillKeyResultDescription('This is my description') + .fillKeyResultTitle("Very important keyresult") + .withMetricValues(Unit.PERCENT, "21", "51") + .fillKeyResultDescription("This is my description") .submit(); keyresultDetailPage - .visit('Very important keyresult') + .visit("Very important keyresult") .createCheckIn() .checkForDialogTextMetric() - .fillMetricCheckInValue('30') + .fillMetricCheckInValue("30") .setCheckInConfidence(6) - .fillCheckInCommentary('We bought a new house') - .fillCheckInInitiatives('We have to buy more PCs') + .fillCheckInCommentary("We bought a new house") + .fillCheckInInitiatives("We have to buy more PCs") .submit(); - cy.contains('30%'); - cy.contains('6/10'); - cy.contains('Letztes Check-in (' + getCurrentDate() + ')'); - cy.contains('We bought a new house'); + cy.contains("30%"); + cy.contains("6/10"); + cy.contains("Letztes Check-in (" + getCurrentDate() + ")"); + cy.contains("We bought a new house"); }); - it(`Create checkin metric with confidence 0`, () => { + it("Create checkin metric with confidence 0", () => { overviewPage .addKeyResult() - .fillKeyResultTitle('Very important keyresult') - .withMetricValues(Unit.PERCENT, '21', '51') - .fillKeyResultDescription('This is my description') + .fillKeyResultTitle("Very important keyresult") + .withMetricValues(Unit.PERCENT, "21", "51") + .fillKeyResultDescription("This is my description") .submit(); keyresultDetailPage - .visit('Very important keyresult') + .visit("Very important keyresult") .createCheckIn() - .fillMetricCheckInValue('30') + .fillMetricCheckInValue("30") .setCheckInConfidence(0) - .fillCheckInCommentary('We bought a new house') - .fillCheckInInitiatives('We have to buy more PCs') + .fillCheckInCommentary("We bought a new house") + .fillCheckInInitiatives("We have to buy more PCs") .submit(); - cy.contains('30%'); - cy.contains('6/10'); - cy.contains('Letztes Check-in (' + getCurrentDate() + ')'); - cy.contains('We bought a new house'); + cy.contains("30%"); + cy.contains("6/10"); + cy.contains("Letztes Check-in (" + getCurrentDate() + ")"); + cy.contains("We bought a new house"); }); - it(`Create checkin metric with value below baseline`, () => { + it("Create checkin metric with value below baseline", () => { overviewPage .addKeyResult() - .fillKeyResultTitle('This will not be good') - .withMetricValues(Unit.PERCENT, '21', '52') - .fillKeyResultDescription('This is my description') + .fillKeyResultTitle("This will not be good") + .withMetricValues(Unit.PERCENT, "21", "52") + .fillKeyResultDescription("This is my description") .submit(); keyresultDetailPage - .visit('This will not be good') + .visit("This will not be good") .createCheckIn() - .fillMetricCheckInValue('5') + .fillMetricCheckInValue("5") .setCheckInConfidence(5) .submit(); - cy.contains('5%'); - cy.contains('!'); - cy.contains('5/10'); - cy.contains('Letztes Check-in (' + getCurrentDate() + ')'); + cy.contains("5%"); + cy.contains("!"); + cy.contains("5/10"); + cy.contains("Letztes Check-in (" + getCurrentDate() + ")"); }); - it('Create checkin ordinal', () => { + it("Create checkin ordinal", () => { overviewPage .addKeyResult() - .fillKeyResultTitle('A new ordinal keyresult for our company') - .withOrdinalValues('New house', 'New car', 'New pool') - .fillKeyResultDescription('This is my description') + .fillKeyResultTitle("A new ordinal keyresult for our company") + .withOrdinalValues("New house", "New car", "New pool") + .fillKeyResultDescription("This is my description") .submit(); keyresultDetailPage - .visit('A new ordinal keyresult for our company') + .visit("A new ordinal keyresult for our company") .createCheckIn() .checkForDialogTextOrdinal() - .selectOrdinalCheckInZone('commit') + .selectOrdinalCheckInZone("commit") .setCheckInConfidence(6) - .fillCheckInCommentary('There is a new car') - .fillCheckInInitiatives('Buy a new pool') + .fillCheckInCommentary("There is a new car") + .fillCheckInInitiatives("Buy a new pool") .submit(); - cy.contains('6/10'); - cy.contains('There is a new car'); - cy.contains('Letztes Check-in (' + getCurrentDate() + ')'); + cy.contains("6/10"); + cy.contains("There is a new car"); + cy.contains("Letztes Check-in (" + getCurrentDate() + ")"); }); - it('Should generate checkin list', () => { + it("Should generate checkin list", () => { overviewPage .addKeyResult() - .fillKeyResultTitle('This will give a checkin list') - .withMetricValues(Unit.PERCENT, '21', '52') - .fillKeyResultDescription('This is my description') + .fillKeyResultTitle("This will give a checkin list") + .withMetricValues(Unit.PERCENT, "21", "52") + .fillKeyResultDescription("This is my description") .submit(); keyresultDetailPage - .visit('This will give a checkin list') + .visit("This will give a checkin list") .createCheckIn() - .fillMetricCheckInValue('30') + .fillMetricCheckInValue("30") .setCheckInConfidence(5) - .fillCheckInCommentary('We bought a new house') - .fillCheckInInitiatives('We have to buy more PCs') + .fillCheckInCommentary("We bought a new house") + .fillCheckInInitiatives("We have to buy more PCs") .submit(); keyresultDetailPage .createCheckIn() - .fillMetricCheckInValue('50') + .fillMetricCheckInValue("50") .setCheckInConfidence(6) - .fillCheckInCommentary('This was a good idea') - .fillCheckInInitiatives('Will be difficult') + .fillCheckInCommentary("This was a good idea") + .fillCheckInInitiatives("Will be difficult") .submit(); keyresultDetailPage .showAllCheckins() - .checkForAttribute('Confidence:', '5 / 10') - .checkForAttribute('Confidence:', '6 / 10') - .checkForAttribute('Veränderungen:', 'We bought a new house') - .checkForAttribute('Veränderungen:', 'This was a good idea') - .checkForAttribute('Massnahmen:', 'We have to buy more PCs') - .checkForAttribute('Massnahmen:', 'Will be difficult'); + .checkForAttribute("Confidence:", "5 / 10") + .checkForAttribute("Confidence:", "6 / 10") + .checkForAttribute("Veränderungen:", "We bought a new house") + .checkForAttribute("Veränderungen:", "This was a good idea") + .checkForAttribute("Massnahmen:", "We have to buy more PCs") + .checkForAttribute("Massnahmen:", "Will be difficult"); - cy.contains('Check-in History'); + cy.contains("Check-in History"); cy.contains(getCurrentDate()); - cy.contains('Wert: 30%'); - cy.contains('Wert: 50%'); + cy.contains("Wert: 30%"); + cy.contains("Wert: 50%"); }); - it('Edit metric checkin', () => { + it("Edit metric checkin", () => { overviewPage .addKeyResult() - .fillKeyResultTitle('Here we edit a metric checkin') - .withMetricValues(Unit.CHF, '10', '300') - .fillKeyResultDescription('This is my description') + .fillKeyResultTitle("Here we edit a metric checkin") + .withMetricValues(Unit.CHF, "10", "300") + .fillKeyResultDescription("This is my description") .submit(); keyresultDetailPage - .visit('Here we edit a metric checkin') + .visit("Here we edit a metric checkin") .createCheckIn() - .fillMetricCheckInValue('30') + .fillMetricCheckInValue("30") .setCheckInConfidence(5) - .fillCheckInCommentary('Here we are') - .fillCheckInInitiatives('A cat would be great') + .fillCheckInCommentary("Here we are") + .fillCheckInInitiatives("A cat would be great") .submit(); - cy.contains('Aktuell: 30 CHF'); + cy.contains("Aktuell: 30 CHF"); keyresultDetailPage.showAllCheckins(); - cy.contains('Check-in History'); - cy.contains('Wert: 30 CHF'); - CheckInHistoryDialog.do().editLatestCheckIn(); - cy.contains('Here we edit a metric checkin'); - cy.contains('30 CHF'); - cy.contains('Confidence um Target Zone (213 CHF) zu erreichen'); - cy.contains('5/10'); - cy.contains('Here we are'); - cy.contains('A cat would be great'); - CheckInDialog.do().fillMetricCheckInValue('200').fillCheckInCommentary('We bought a new sheep').submit(); - cy.contains('200 CHF'); - cy.contains('We bought a new sheep'); + cy.contains("Check-in History"); + cy.contains("Wert: 30 CHF"); + CheckInHistoryDialog.do() + .editLatestCheckIn(); + cy.contains("Here we edit a metric checkin"); + cy.contains("30 CHF"); + cy.contains("Confidence um Target Zone (213 CHF) zu erreichen"); + cy.contains("5/10"); + cy.contains("Here we are"); + cy.contains("A cat would be great"); + CheckInDialog.do() + .fillMetricCheckInValue("200") + .fillCheckInCommentary("We bought a new sheep") + .submit(); + cy.contains("200 CHF"); + cy.contains("We bought a new sheep"); }); - it('Should generate right labels in checkin history list', () => { + it("Should generate right labels in checkin history list", () => { overviewPage .addKeyResult() - .fillKeyResultTitle('A new KeyResult for checking checkin list') - .withMetricValues(Unit.EUR, '10', '300') - .fillKeyResultDescription('This is my description') + .fillKeyResultTitle("A new KeyResult for checking checkin list") + .withMetricValues(Unit.EUR, "10", "300") + .fillKeyResultDescription("This is my description") .submit(); keyresultDetailPage - .visit('A new KeyResult for checking checkin list') + .visit("A new KeyResult for checking checkin list") .createCheckIn() - .fillMetricCheckInValue('30') + .fillMetricCheckInValue("30") .setCheckInConfidence(5) - .fillCheckInCommentary('Here we are') - .fillCheckInInitiatives('A cat would be great') + .fillCheckInCommentary("Here we are") + .fillCheckInInitiatives("A cat would be great") .submit(); - cy.contains('Aktuell: 30 EUR'); + cy.contains("Aktuell: 30 EUR"); keyresultDetailPage.showAllCheckins(); - cy.contains('Check-in History'); - cy.contains('Wert: 30 EUR'); - CheckInHistoryDialog.do().close(); + cy.contains("Check-in History"); + cy.contains("Wert: 30 EUR"); + CheckInHistoryDialog.do() + .close(); keyresultDetailPage.close(); overviewPage .addKeyResult() - .fillKeyResultTitle('There is another kr with fte') - .withMetricValues(Unit.FTE, '10', '300') - .fillKeyResultDescription('This is my description') + .fillKeyResultTitle("There is another kr with fte") + .withMetricValues(Unit.FTE, "10", "300") + .fillKeyResultDescription("This is my description") .submit(); keyresultDetailPage - .visit('There is another kr with fte') + .visit("There is another kr with fte") .createCheckIn() - .fillMetricCheckInValue('30') + .fillMetricCheckInValue("30") .setCheckInConfidence(5) - .fillCheckInCommentary('Here we are') - .fillCheckInInitiatives('A cat would be great') + .fillCheckInCommentary("Here we are") + .fillCheckInInitiatives("A cat would be great") .submit(); - cy.contains('Aktuell: 30 FTE'); + cy.contains("Aktuell: 30 FTE"); keyresultDetailPage.showAllCheckins(); - cy.contains('Check-in History'); - cy.contains('Wert: 30 FTE'); + cy.contains("Check-in History"); + cy.contains("Wert: 30 FTE"); }); - it('Edit ordinal checkin', () => { + it("Edit ordinal checkin", () => { overviewPage .addKeyResult() - .fillKeyResultTitle('For editing ordinal checkin') - .withOrdinalValues('New house', 'New car', 'New pool') - .fillKeyResultDescription('This is my description') + .fillKeyResultTitle("For editing ordinal checkin") + .withOrdinalValues("New house", "New car", "New pool") + .fillKeyResultDescription("This is my description") .submit(); keyresultDetailPage - .visit('For editing ordinal checkin') + .visit("For editing ordinal checkin") .createCheckIn() - .selectOrdinalCheckInZone('fail') + .selectOrdinalCheckInZone("fail") .setCheckInConfidence(6) - .fillCheckInCommentary('There is a new car') - .fillCheckInInitiatives('Buy now a new pool') + .fillCheckInCommentary("There is a new car") + .fillCheckInInitiatives("Buy now a new pool") .submit(); - keyresultDetailPage.showAllCheckins().editLatestCheckIn(); - cy.contains('For editing ordinal checkin'); - cy.contains('Confidence um Target Zone zu erreichen'); - cy.contains('6/10'); - cy.contains('There is a new car'); - cy.contains('Buy now a new pool'); - CheckInDialog.do().selectOrdinalCheckInZone('stretch').fillCheckInCommentary('We bought a new dog').submit(); - cy.contains('We bought a new dog'); - cy.contains('Buy now a new pool'); - cy.contains('STRETCH'); + keyresultDetailPage.showAllCheckins() + .editLatestCheckIn(); + cy.contains("For editing ordinal checkin"); + cy.contains("Confidence um Target Zone zu erreichen"); + cy.contains("6/10"); + cy.contains("There is a new car"); + cy.contains("Buy now a new pool"); + CheckInDialog.do() + .selectOrdinalCheckInZone("stretch") + .fillCheckInCommentary("We bought a new dog") + .submit(); + cy.contains("We bought a new dog"); + cy.contains("Buy now a new pool"); + cy.contains("STRETCH"); }); - it(`Should display confirm dialog when creating checkin on draft objective`, () => { - overviewPage.addObjective().fillObjectiveTitle('draft objective title').selectQuarter('3').submitDraftObjective(); + it("Should display confirm dialog when creating checkin on draft objective", () => { + overviewPage.addObjective() + .fillObjectiveTitle("draft objective title") + .selectQuarter("3") + .submitDraftObjective(); overviewPage.visitNextQuarter(); overviewPage - .addKeyResult(undefined, 'draft objective title') - .fillKeyResultTitle('I am a metric keyresult for testing') - .withMetricValues(Unit.PERCENT, '21', '52') - .fillKeyResultDescription('This is my description') + .addKeyResult(undefined, "draft objective title") + .fillKeyResultTitle("I am a metric keyresult for testing") + .withMetricValues(Unit.PERCENT, "21", "52") + .fillKeyResultDescription("This is my description") .submit(); - keyresultDetailPage.visit('I am a metric keyresult for testing'); - keyresultDetailPage.elements.addCheckin().click(); - ConfirmDialog.do().checkTitle('Check-in im Draft-Status'); - ConfirmDialog.do().checkDescription( - 'Dein Objective befindet sich noch im DRAFT Status. Möchtest du das Check-in trotzdem erfassen?', - ); + keyresultDetailPage.visit("I am a metric keyresult for testing"); + keyresultDetailPage.elements.addCheckin() + .click(); + ConfirmDialog.do() + .checkTitle("Check-in im Draft-Status"); + ConfirmDialog.do() + .checkDescription( + "Dein Objective befindet sich noch im DRAFT Status. Möchtest du das Check-in trotzdem erfassen?", + ); }); - it(`Should only display last value div if last checkin is present`, () => { - const objectiveName = uniqueSuffix('new objective'); + it("Should only display last value div if last checkin is present", () => { + const objectiveName = uniqueSuffix("new objective"); - overviewPage.addObjective().fillObjectiveTitle(objectiveName).selectQuarter('3').submit(); + overviewPage.addObjective() + .fillObjectiveTitle(objectiveName) + .selectQuarter("3") + .submit(); overviewPage.visitNextQuarter(); overviewPage .addKeyResult(undefined, objectiveName) - .fillKeyResultTitle('I am a keyresult metric') - .withMetricValues(Unit.PERCENT, '45', '60') - .fillKeyResultDescription('Description') + .fillKeyResultTitle("I am a keyresult metric") + .withMetricValues(Unit.PERCENT, "45", "60") + .fillKeyResultDescription("Description") .submit(); - keyresultDetailPage.visit('I am a keyresult metric').createCheckIn(); - cy.getByTestId('old-checkin-value').should('not.exist'); + keyresultDetailPage.visit("I am a keyresult metric") + .createCheckIn(); + cy.getByTestId("old-checkin-value") + .should("not.exist"); CheckInDialog.do() - .fillMetricCheckInValue('10') + .fillMetricCheckInValue("10") .setCheckInConfidence(0) - .fillCheckInCommentary('changeinfo') - .fillCheckInInitiatives('initiatives') + .fillCheckInCommentary("changeinfo") + .fillCheckInInitiatives("initiatives") .submit(); cy.contains(`Letztes Check-in (${getCurrentDate()})`); keyresultDetailPage.createCheckIn(); - cy.contains('Letzter Wert').siblings('div').contains('10%'); + cy.contains("Letzter Wert") + .siblings("div") + .contains("10%"); }); }); }); @@ -287,13 +309,13 @@ describe('OKR Check-in e2e tests', () => { function getCurrentDate() { const today = new Date(); const yyyy = today.getFullYear(); - let mm = today.getMonth() + 1; // Months start at 0! - let dd = today.getDate(); + const mm = today.getMonth() + 1; // Months start at 0! + const dd = today.getDate(); - let dd_str = '' + dd; - let mm_str = '' + mm; - if (dd < 10) dd_str = '0' + dd_str; - if (mm < 10) mm_str = '0' + mm_str; + let dd_str = "" + dd; + let mm_str = "" + mm; + if (dd < 10) dd_str = "0" + dd_str; + if (mm < 10) mm_str = "0" + mm_str; - return dd_str + '.' + mm_str + '.' + yyyy; + return dd_str + "." + mm_str + "." + yyyy; } diff --git a/frontend/cypress/e2e/duplicated-scoring.cy.ts b/frontend/cypress/e2e/duplicated-scoring.cy.ts index e3b2798a6d..bf23e816f9 100644 --- a/frontend/cypress/e2e/duplicated-scoring.cy.ts +++ b/frontend/cypress/e2e/duplicated-scoring.cy.ts @@ -1,8 +1,8 @@ -import * as users from '../fixtures/users.json'; -import CyOverviewPage from '../support/helper/dom-helper/pages/overviewPage'; -import KeyResultDetailPage from '../support/helper/dom-helper/pages/keyResultDetailPage'; +import * as users from "../fixtures/users.json"; +import CyOverviewPage from "../support/helper/dom-helper/pages/overviewPage"; +import KeyResultDetailPage from "../support/helper/dom-helper/pages/keyResultDetailPage"; -describe('e2e test for scoring adjustment on objective duplicate', () => { +describe("e2e test for scoring adjustment on objective duplicate", () => { let overviewPage = new CyOverviewPage(); let keyresultDetailPage = new KeyResultDetailPage(); @@ -12,48 +12,50 @@ describe('e2e test for scoring adjustment on objective duplicate', () => { cy.loginAsUser(users.gl); }); - it('Duplicate ordinal checkin and validate value of scoring component', () => { + it("Duplicate ordinal checkin and validate value of scoring component", () => { overviewPage - .addKeyResult('Puzzle ITC', 'Wir wollen die Kundenzufriedenheit steigern') - .fillKeyResultTitle('stretch keyresult for testing') - .withOrdinalValues('Ex. val', 'Ex. val', 'Ex. val') + .addKeyResult("Puzzle ITC", "Wir wollen die Kundenzufriedenheit steigern") + .fillKeyResultTitle("stretch keyresult for testing") + .withOrdinalValues("Ex. val", "Ex. val", "Ex. val") .submit(); - cy.contains('stretch keyresult for testing'); + cy.contains("stretch keyresult for testing"); keyresultDetailPage - .visit('stretch keyresult for testing') + .visit("stretch keyresult for testing") .createCheckIn() - .selectOrdinalCheckInZone('stretch') + .selectOrdinalCheckInZone("stretch") .setCheckInConfidence(8) - .fillCheckInCommentary('Testveränderungen') - .fillCheckInInitiatives('Testmassnahmen') + .fillCheckInCommentary("Testveränderungen") + .fillCheckInInitiatives("Testmassnahmen") .submit(); - cy.intercept('GET', '**/overview?*').as('indexPage'); + cy.intercept("GET", "**/overview?*") + .as("indexPage"); keyresultDetailPage.close(); - cy.wait('@indexPage'); + cy.wait("@indexPage"); overviewPage - .duplicateObjective('Wir wollen die Kundenzufriedenheit steigern') - .fillObjectiveTitle('A duplicated Objective for this tool') - .selectQuarter('3') + .duplicateObjective("Wir wollen die Kundenzufriedenheit steigern") + .fillObjectiveTitle("A duplicated Objective for this tool") + .selectQuarter("3") .submit(); - overviewPage.checkForToaster('Das Objective wurde erfolgreich erstellt.', 'success'); + overviewPage.checkForToaster("Das Objective wurde erfolgreich erstellt.", "success"); overviewPage.visitNextQuarter(); overviewPage - .getKeyResultByName('stretch keyresult for testing') - .findByTestId('scoring-component') - .findByTestId('fail') - .as('fail-area'); - - cy.get('@fail-area').should(($fail) => { - expect($fail).not.to.have.css('score-red'); - expect($fail).not.to.have.css('score-yellow'); - expect($fail).not.to.have.css('score-green'); - expect($fail).not.to.have.css('score-stretch'); - }); + .getKeyResultByName("stretch keyresult for testing") + .findByTestId("scoring-component") + .findByTestId("fail") + .as("fail-area"); + + cy.get("@fail-area") + .should(($fail) => { + expect($fail).not.to.have.css("score-red"); + expect($fail).not.to.have.css("score-yellow"); + expect($fail).not.to.have.css("score-green"); + expect($fail).not.to.have.css("score-stretch"); + }); }); }); diff --git a/frontend/cypress/e2e/key-result.cy.ts b/frontend/cypress/e2e/key-result.cy.ts index 0ba70755eb..2141b181cf 100644 --- a/frontend/cypress/e2e/key-result.cy.ts +++ b/frontend/cypress/e2e/key-result.cy.ts @@ -1,10 +1,10 @@ -import * as users from '../fixtures/users.json'; -import CyOverviewPage from '../support/helper/dom-helper/pages/overviewPage'; -import KeyResultDetailPage from '../support/helper/dom-helper/pages/keyResultDetailPage'; -import { Unit } from '../../src/app/shared/types/enums/Unit'; -import KeyResultDialog from '../support/helper/dom-helper/dialogs/keyResultDialog'; +import * as users from "../fixtures/users.json"; +import CyOverviewPage from "../support/helper/dom-helper/pages/overviewPage"; +import KeyResultDetailPage from "../support/helper/dom-helper/pages/keyResultDetailPage"; +import { Unit } from "../../src/app/shared/types/enums/Unit"; +import KeyResultDialog from "../support/helper/dom-helper/dialogs/keyResultDialog"; -describe('OKR Overview', () => { +describe("OKR Overview", () => { let overviewPage = new CyOverviewPage(); let keyResultDetailPage = new KeyResultDetailPage(); @@ -14,256 +14,317 @@ describe('OKR Overview', () => { cy.loginAsUser(users.gl); }); - it('Create new metric KeyResult', () => { + it("Create new metric KeyResult", () => { overviewPage .addKeyResult() .checkForDialogTextMetric() - .fillKeyResultTitle('I am a metric keyresult') - .withMetricValues(Unit.PERCENT, '21', '52') - .fillOwner('Bob Baumeister') - .fillKeyResultDescription('This is my description') + .fillKeyResultTitle("I am a metric keyresult") + .withMetricValues(Unit.PERCENT, "21", "52") + .fillOwner("Bob Baumeister") + .fillKeyResultDescription("This is my description") .submit(); - keyResultDetailPage.visit('I am a metric keyresult'); - - cy.contains('I am a metric keyresult'); - cy.contains('Metrisch'); - cy.contains('Bob Baumeister'); - cy.contains('21%'); - cy.contains('52%'); - cy.contains('Stretch'); - cy.contains('Confidence'); - cy.contains('Beschrieb'); - cy.contains('This is my description'); - cy.contains('Check-in erfassen'); - cy.contains('Key Result bearbeiten'); + keyResultDetailPage.visit("I am a metric keyresult"); + + cy.contains("I am a metric keyresult"); + cy.contains("Metrisch"); + cy.contains("Bob Baumeister"); + cy.contains("21%"); + cy.contains("52%"); + cy.contains("Stretch"); + cy.contains("Confidence"); + cy.contains("Beschrieb"); + cy.contains("This is my description"); + cy.contains("Check-in erfassen"); + cy.contains("Key Result bearbeiten"); }); - it('Create new ordinal KeyResult', () => { + it("Create new ordinal KeyResult", () => { overviewPage .addKeyResult() - .fillKeyResultTitle('I am a ordinal keyresult') - .withOrdinalValues('My commit zone', 'My target zone', 'My stretch goal') + .fillKeyResultTitle("I am a ordinal keyresult") + .withOrdinalValues("My commit zone", "My target zone", "My stretch goal") .checkForDialogTextOrdinal() - .fillOwner('Bob Baumeister') - .fillKeyResultDescription('This is my description') + .fillOwner("Bob Baumeister") + .fillKeyResultDescription("This is my description") .submit(); - keyResultDetailPage.visit('I am a ordinal keyresult'); - - cy.contains('I am a ordinal keyresult'); - cy.contains('Ordinal'); - cy.contains('Bob Baumeister'); - cy.contains('Fail'); - cy.contains('Commit'); - cy.contains('Target'); - cy.contains('My commit zone'); - cy.contains('My target zone'); - cy.contains('My stretch goal'); - cy.contains('Stretch'); - cy.contains('Confidence'); - cy.contains('Beschrieb'); - cy.contains('This is my description'); - cy.contains('Check-in erfassen'); - cy.contains('Key Result bearbeiten'); + keyResultDetailPage.visit("I am a ordinal keyresult"); + + cy.contains("I am a ordinal keyresult"); + cy.contains("Ordinal"); + cy.contains("Bob Baumeister"); + cy.contains("Fail"); + cy.contains("Commit"); + cy.contains("Target"); + cy.contains("My commit zone"); + cy.contains("My target zone"); + cy.contains("My stretch goal"); + cy.contains("Stretch"); + cy.contains("Confidence"); + cy.contains("Beschrieb"); + cy.contains("This is my description"); + cy.contains("Check-in erfassen"); + cy.contains("Key Result bearbeiten"); }); - it('Create new KeyResult and Save and New', () => { + it("Create new KeyResult and Save and New", () => { overviewPage .addKeyResult() .checkForDialogTextMetric() - .fillKeyResultTitle('I am a metric keyresult with a new one') - .withMetricValues(Unit.PERCENT, '21', '52') - .fillOwner('Bob Baumeister') - .fillKeyResultDescription('This is my description when creating and then open a new') + .fillKeyResultTitle("I am a metric keyresult with a new one") + .withMetricValues(Unit.PERCENT, "21", "52") + .fillOwner("Bob Baumeister") + .fillKeyResultDescription("This is my description when creating and then open a new") .saveAndNew(); - cy.contains('Jaya Norris'); - KeyResultDialog.do().checkForDialogTextMetric(); + cy.contains("Jaya Norris"); + KeyResultDialog.do() + .checkForDialogTextMetric(); }); - it('Create and edit KeyResult with Action Plan', () => { + it("Create and edit KeyResult with Action Plan", () => { overviewPage .addKeyResult() - .fillKeyResultTitle('This is a keyresult with an action plan') - .withOrdinalValues('My commit zone', 'My target zone', 'My stretch goal') - .fillOwner('Bob Baumeister') - .fillKeyResultDescription('This is my description') - .addActionPlanElement('A new car') - .addActionPlanElement('A new house') - .addActionPlanElement('A new company') + .fillKeyResultTitle("This is a keyresult with an action plan") + .withOrdinalValues("My commit zone", "My target zone", "My stretch goal") + .fillOwner("Bob Baumeister") + .fillKeyResultDescription("This is my description") + .addActionPlanElement("A new car") + .addActionPlanElement("A new house") + .addActionPlanElement("A new company") .submit(); - keyResultDetailPage.visit('This is a keyresult with an action plan'); + keyResultDetailPage.visit("This is a keyresult with an action plan"); - cy.contains('This is a keyresult with an action plan'); - cy.contains('Ordinal'); - cy.contains('My commit zone'); - cy.contains('My target zone'); - cy.contains('My stretch goal'); - cy.contains('A new car'); - cy.contains('A new house'); - cy.contains('A new company'); + cy.contains("This is a keyresult with an action plan"); + cy.contains("Ordinal"); + cy.contains("My commit zone"); + cy.contains("My target zone"); + cy.contains("My stretch goal"); + cy.contains("A new car"); + cy.contains("A new house"); + cy.contains("A new company"); keyResultDetailPage.editKeyResult(); - cy.getByTestId('actionInput').should('have.length', 3); + cy.getByTestId("actionInput") + .should("have.length", 3); }); - it('Edit a KeyResult without type change', () => { + it("Edit a KeyResult without type change", () => { overviewPage .addKeyResult() - .fillKeyResultTitle('We want not to change keyresult title') - .withOrdinalValues('My commit zone', 'My target zone', 'My stretch goal') + .fillKeyResultTitle("We want not to change keyresult title") + .withOrdinalValues("My commit zone", "My target zone", "My stretch goal") .checkForDialogTextOrdinal() - .fillKeyResultDescription('This is my description') + .fillKeyResultDescription("This is my description") .submit(); - keyResultDetailPage.visit('We want not to change keyresult title').editKeyResult(); - - cy.getByTestId('submit').should('not.be.disabled'); - cy.contains('Key Result bearbeiten'); - cy.getByTestId('titleInput').should('have.value', 'We want not to change keyresult title'); - cy.getByTestId('commitZone').should('have.value', 'My commit zone'); - cy.getByTestId('targetZone').should('have.value', 'My target zone'); - cy.getByTestId('stretchZone').should('have.value', 'My stretch goal'); - cy.getByTestId('ownerInput').should('have.value', 'Jaya Norris'); - cy.getByTestId('descriptionInput').should('have.value', 'This is my description'); + keyResultDetailPage.visit("We want not to change keyresult title") + .editKeyResult(); + + cy.getByTestId("submit") + .should("not.be.disabled"); + cy.contains("Key Result bearbeiten"); + cy.getByTestId("titleInput") + .should("have.value", "We want not to change keyresult title"); + cy.getByTestId("commitZone") + .should("have.value", "My commit zone"); + cy.getByTestId("targetZone") + .should("have.value", "My target zone"); + cy.getByTestId("stretchZone") + .should("have.value", "My stretch goal"); + cy.getByTestId("ownerInput") + .should("have.value", "Jaya Norris"); + cy.getByTestId("descriptionInput") + .should("have.value", "This is my description"); KeyResultDialog.do() - .fillKeyResultTitle('This is the new title') - .withOrdinalValues('New commit', 'New target', 'New stretch') - .fillKeyResultDescription('This is my new description') + .fillKeyResultTitle("This is the new title") + .withOrdinalValues("New commit", "New target", "New stretch") + .fillKeyResultDescription("This is my new description") .submit(); - cy.contains('This is the new title'); - cy.contains('New commit'); - cy.contains('New target'); - cy.contains('New stretch'); - cy.contains('Jaya Norris'); - cy.contains('This is my new description'); + cy.contains("This is the new title"); + cy.contains("New commit"); + cy.contains("New target"); + cy.contains("New stretch"); + cy.contains("Jaya Norris"); + cy.contains("This is my new description"); }); - it('Edit a KeyResult with type change', () => { + it("Edit a KeyResult with type change", () => { overviewPage .addKeyResult() - .fillKeyResultTitle('Here we want to change keyresult title') - .withOrdinalValues('My commit zone', 'My target zone', 'My stretch goal') + .fillKeyResultTitle("Here we want to change keyresult title") + .withOrdinalValues("My commit zone", "My target zone", "My stretch goal") .checkForDialogTextOrdinal() - .fillKeyResultDescription('This is my description') + .fillKeyResultDescription("This is my description") .submit(); - keyResultDetailPage.visit('Here we want to change keyresult title').editKeyResult(); - - cy.getByTestId('submit').should('not.be.disabled'); - cy.contains('Key Result bearbeiten'); - cy.getByTestId('titleInput').should('have.value', 'Here we want to change keyresult title'); - cy.getByTestId('commitZone').should('have.value', 'My commit zone'); - cy.getByTestId('targetZone').should('have.value', 'My target zone'); - cy.getByTestId('stretchZone').should('have.value', 'My stretch goal'); - cy.getByTestId('ownerInput').should('have.value', 'Jaya Norris'); - cy.getByTestId('descriptionInput').should('have.value', 'This is my description'); + keyResultDetailPage.visit("Here we want to change keyresult title") + .editKeyResult(); + + cy.getByTestId("submit") + .should("not.be.disabled"); + cy.contains("Key Result bearbeiten"); + cy.getByTestId("titleInput") + .should("have.value", "Here we want to change keyresult title"); + cy.getByTestId("commitZone") + .should("have.value", "My commit zone"); + cy.getByTestId("targetZone") + .should("have.value", "My target zone"); + cy.getByTestId("stretchZone") + .should("have.value", "My stretch goal"); + cy.getByTestId("ownerInput") + .should("have.value", "Jaya Norris"); + cy.getByTestId("descriptionInput") + .should("have.value", "This is my description"); KeyResultDialog.do() - .fillKeyResultTitle('This is my new title for the new metric keyresult') - .withMetricValues(Unit.PERCENT, '21', '56') - .fillKeyResultDescription('This is my new description') + .fillKeyResultTitle("This is my new title for the new metric keyresult") + .withMetricValues(Unit.PERCENT, "21", "56") + .fillKeyResultDescription("This is my new description") .submit(); - cy.contains('This is my new title for the new metric keyresult'); - cy.contains('21%'); - cy.contains('56%'); - cy.contains('Metrisch'); - cy.contains('Jaya Norris'); - cy.contains('This is my new description'); + cy.contains("This is my new title for the new metric keyresult"); + cy.contains("21%"); + cy.contains("56%"); + cy.contains("Metrisch"); + cy.contains("Jaya Norris"); + cy.contains("This is my new description"); }); - it('Check validation in keyresult dialog', () => { - overviewPage.addKeyResult().checkForDialogTextMetric(); - cy.getByTestId('submit').should('be.disabled'); + it("Check validation in keyresult dialog", () => { + overviewPage.addKeyResult() + .checkForDialogTextMetric(); + cy.getByTestId("submit") + .should("be.disabled"); + KeyResultDialog.do() + .fillKeyResultTitle("I am a metric keyresult") + .withMetricValues(Unit.PERCENT, "21", "52") + .fillKeyResultDescription("This is my description"); + + cy.getByTestId("submit") + .should("not.be.disabled"); + + cy.getByTestId("titleInput") + .clear(); + cy.getByTestId("submit") + .should("be.disabled"); + cy.contains("Titel muss folgende Länge haben: 2-250 Zeichen"); + + KeyResultDialog.do() + .fillKeyResultTitle("My title"); + cy.getByTestId("submit") + .should("not.be.disabled"); + cy.getByTestId("baseline") + .clear(); + cy.getByTestId("submit") + .should("be.disabled"); + cy.contains("Baseline muss eine Zahl sein"); + + KeyResultDialog.do() + .withMetricValues(Unit.PERCENT, "abc", "52"); + cy.getByTestId("submit") + .should("be.disabled"); + cy.contains("Baseline muss eine Zahl sein"); + + KeyResultDialog.do() + .withMetricValues(Unit.PERCENT, "45", "52"); + cy.getByTestId("submit") + .should("not.be.disabled"); + cy.getByTestId("stretchGoal") + .clear(); + cy.getByTestId("submit") + .should("be.disabled"); + cy.contains("Stretch Goal muss eine Zahl sein"); + + KeyResultDialog.do() + .withMetricValues(Unit.PERCENT, "45", "abc"); + cy.getByTestId("submit") + .should("be.disabled"); + cy.contains("Stretch Goal muss eine Zahl sein"); + + KeyResultDialog.do() + .withMetricValues(Unit.PERCENT, "45", "83"); + cy.getByTestId("submit") + .should("not.be.disabled"); + cy.getByTestId("ownerInput") + .clear(); + cy.getByTestId("submit") + .should("be.disabled"); + + cy.getByTestId("ownerInput") + .type("abc"); + cy.getByTestId("titleInput") + .type("Hello"); + cy.getByTestId("submit") + .should("be.disabled"); + cy.contains("Owner muss ausgewählt sein"); + + KeyResultDialog.do() + .fillOwner("Bob Baumeister"); + cy.getByTestId("submit") + .should("not.be.disabled"); + + cy.getByTestId("ordinalTab") + .click(); + cy.getByTestId("submit") + .should("be.disabled"); + + KeyResultDialog.do() + .withOrdinalValues("Commit", "Target", "Stretch"); + cy.getByTestId("submit") + .should("not.be.disabled"); + + cy.getByTestId("commitZone") + .clear(); + cy.getByTestId("submit") + .should("be.disabled"); + cy.contains("Commit Zone muss folgende Länge haben: 1-400 Zeichen"); + + KeyResultDialog.do() + .withOrdinalValues("Commit", "Target", "Stretch"); + cy.getByTestId("submit") + .should("not.be.disabled"); + cy.getByTestId("targetZone") + .clear(); + cy.getByTestId("submit") + .should("be.disabled"); + cy.contains("Target Zone muss folgende Länge haben: 1-400 Zeichen"); + + KeyResultDialog.do() + .withOrdinalValues("Commit", "Target", "Stretch"); + cy.getByTestId("submit") + .should("not.be.disabled"); + cy.getByTestId("stretchZone") + .clear(); + cy.getByTestId("submit") + .should("be.disabled"); + cy.contains("Stretch Zone muss folgende Länge haben: 1-400 Zeichen"); + KeyResultDialog.do() - .fillKeyResultTitle('I am a metric keyresult') - .withMetricValues(Unit.PERCENT, '21', '52') - .fillKeyResultDescription('This is my description'); - - cy.getByTestId('submit').should('not.be.disabled'); - - cy.getByTestId('titleInput').clear(); - cy.getByTestId('submit').should('be.disabled'); - cy.contains('Titel muss folgende Länge haben: 2-250 Zeichen'); - - KeyResultDialog.do().fillKeyResultTitle('My title'); - cy.getByTestId('submit').should('not.be.disabled'); - cy.getByTestId('baseline').clear(); - cy.getByTestId('submit').should('be.disabled'); - cy.contains('Baseline muss eine Zahl sein'); - - KeyResultDialog.do().withMetricValues(Unit.PERCENT, 'abc', '52'); - cy.getByTestId('submit').should('be.disabled'); - cy.contains('Baseline muss eine Zahl sein'); - - KeyResultDialog.do().withMetricValues(Unit.PERCENT, '45', '52'); - cy.getByTestId('submit').should('not.be.disabled'); - cy.getByTestId('stretchGoal').clear(); - cy.getByTestId('submit').should('be.disabled'); - cy.contains('Stretch Goal muss eine Zahl sein'); - - KeyResultDialog.do().withMetricValues(Unit.PERCENT, '45', 'abc'); - cy.getByTestId('submit').should('be.disabled'); - cy.contains('Stretch Goal muss eine Zahl sein'); - - KeyResultDialog.do().withMetricValues(Unit.PERCENT, '45', '83'); - cy.getByTestId('submit').should('not.be.disabled'); - cy.getByTestId('ownerInput').clear(); - cy.getByTestId('submit').should('be.disabled'); - - cy.getByTestId('ownerInput').type('abc'); - cy.getByTestId('titleInput').type('Hello'); - cy.getByTestId('submit').should('be.disabled'); - cy.contains('Owner muss ausgewählt sein'); - - KeyResultDialog.do().fillOwner('Bob Baumeister'); - cy.getByTestId('submit').should('not.be.disabled'); - - cy.getByTestId('ordinalTab').click(); - cy.getByTestId('submit').should('be.disabled'); - - KeyResultDialog.do().withOrdinalValues('Commit', 'Target', 'Stretch'); - cy.getByTestId('submit').should('not.be.disabled'); - - cy.getByTestId('commitZone').clear(); - cy.getByTestId('submit').should('be.disabled'); - cy.contains('Commit Zone muss folgende Länge haben: 1-400 Zeichen'); - - KeyResultDialog.do().withOrdinalValues('Commit', 'Target', 'Stretch'); - cy.getByTestId('submit').should('not.be.disabled'); - cy.getByTestId('targetZone').clear(); - cy.getByTestId('submit').should('be.disabled'); - cy.contains('Target Zone muss folgende Länge haben: 1-400 Zeichen'); - - KeyResultDialog.do().withOrdinalValues('Commit', 'Target', 'Stretch'); - cy.getByTestId('submit').should('not.be.disabled'); - cy.getByTestId('stretchZone').clear(); - cy.getByTestId('submit').should('be.disabled'); - cy.contains('Stretch Zone muss folgende Länge haben: 1-400 Zeichen'); - - KeyResultDialog.do().withOrdinalValues('Commit', 'Target', 'Stretch'); - cy.getByTestId('submit').should('not.be.disabled'); + .withOrdinalValues("Commit", "Target", "Stretch"); + cy.getByTestId("submit") + .should("not.be.disabled"); }); - it('Delete existing keyresult', () => { + it("Delete existing keyresult", () => { overviewPage .addKeyResult() - .fillKeyResultTitle('A keyresult to delete') - .withOrdinalValues('My commit zone', 'My target zone', 'My stretch goal') + .fillKeyResultTitle("A keyresult to delete") + .withOrdinalValues("My commit zone", "My target zone", "My stretch goal") .checkForDialogTextOrdinal() - .fillKeyResultDescription('This is my description') + .fillKeyResultDescription("This is my description") .submit(); keyResultDetailPage - .visit('A keyresult to delete') + .visit("A keyresult to delete") .editKeyResult() .deleteKeyResult() - .checkTitle('Key Result löschen') + .checkTitle("Key Result löschen") .checkDescription( - 'Möchtest du dieses Key Result wirklich löschen? Zugehörige Check-ins werden dadurch ebenfalls gelöscht!', + "Möchtest du dieses Key Result wirklich löschen? Zugehörige Check-ins werden dadurch ebenfalls gelöscht!", ) .submit(); - cy.contains('Puzzle ITC'); - cy.get('A keyresult to delete').should('not.exist'); + cy.contains("Puzzle ITC"); + cy.get("A keyresult to delete") + .should("not.exist"); }); }); diff --git a/frontend/cypress/e2e/login.cy.ts b/frontend/cypress/e2e/login.cy.ts index d7730d355b..dfe84ec8d3 100644 --- a/frontend/cypress/e2e/login.cy.ts +++ b/frontend/cypress/e2e/login.cy.ts @@ -1,31 +1,42 @@ -import * as users from '../fixtures/users.json'; +import * as users from "../fixtures/users.json"; -describe('OKR Login', () => { +describe("OKR Login", () => { beforeEach(() => { cy.loginAsUser(users.gl); }); - it('Login and check correct name is displayed', () => { - cy.title().should('equal', 'Puzzle OKR'); - cy.getByTestId('user-name').contains(users.gl.name); + it("Login and check correct name is displayed", () => { + cy.title() + .should("equal", "Puzzle OKR"); + cy.getByTestId("user-name") + .contains(users.gl.name); }); - it('Login and logout', () => { - cy.title().should('equal', 'Puzzle OKR'); - cy.getByTestId('user-options').click(); - cy.getByTestId('logout').click(); - cy.origin(Cypress.env('login_url'), () => { - cy.url().should('include', Cypress.env('login_url')); - cy.get('#kc-page-title').contains('Sign in to your account'); + it("Login and logout", () => { + cy.title() + .should("equal", "Puzzle OKR"); + cy.getByTestId("user-options") + .click(); + cy.getByTestId("logout") + .click(); + cy.origin(Cypress.env("login_url"), () => { + cy.url() + .should("include", Cypress.env("login_url")); + cy.get("#kc-page-title") + .contains("Sign in to your account"); }); }); - it('Click on the Hilfe button should open a new tab with the correct URL', () => { - cy.window().then((win) => { - cy.stub(win, 'open').as('openWindow'); - }); + it("Click on the Hilfe button should open a new tab with the correct URL", () => { + cy.window() + .then((win) => { + cy.stub(win, "open") + .as("openWindow"); + }); - cy.get('#hilfeButton').click(); - cy.get('@openWindow').should('be.calledWith', 'https://wiki.puzzle.ch/Puzzle/OKRs'); + cy.get("#hilfeButton") + .click(); + cy.get("@openWindow") + .should("be.calledWith", "https://wiki.puzzle.ch/Puzzle/OKRs"); }); }); diff --git a/frontend/cypress/e2e/objective-backlog.cy.ts b/frontend/cypress/e2e/objective-backlog.cy.ts index b9d58ff14b..cf9e3a315e 100644 --- a/frontend/cypress/e2e/objective-backlog.cy.ts +++ b/frontend/cypress/e2e/objective-backlog.cy.ts @@ -1,8 +1,8 @@ -import * as users from '../fixtures/users.json'; -import CyOverviewPage from '../support/helper/dom-helper/pages/overviewPage'; -import ObjectiveDialog from '../support/helper/dom-helper/dialogs/objectiveDialog'; +import * as users from "../fixtures/users.json"; +import CyOverviewPage from "../support/helper/dom-helper/pages/overviewPage"; +import ObjectiveDialog from "../support/helper/dom-helper/dialogs/objectiveDialog"; -describe('OKR Objective Backlog e2e tests', () => { +describe("OKR Objective Backlog e2e tests", () => { let overviewPage = new CyOverviewPage(); beforeEach(() => { @@ -10,152 +10,201 @@ describe('OKR Objective Backlog e2e tests', () => { cy.loginAsUser(users.gl); }); - it(`Create Objective in backlog quarter should not have save button`, () => { + it("Create Objective in backlog quarter should not have save button", () => { overviewPage .addObjective() - .fillObjectiveTitle('Objective in quarter backlog') - .selectQuarter('Backlog') - .run(cy.contains('Speichern').should('not.exist')) - .run(cy.contains('Als Draft speichern')) + .fillObjectiveTitle("Objective in quarter backlog") + .selectQuarter("Backlog") + .run(cy.contains("Speichern") + .should("not.exist")) + .run(cy.contains("Als Draft speichern")) .submitDraftObjective(); - cy.contains('Objective in quarter backlog').should('not.exist'); + cy.contains("Objective in quarter backlog") + .should("not.exist"); overviewPage.visitBacklogQuarter(); - cy.contains('Objective in quarter backlog'); + cy.contains("Objective in quarter backlog"); }); - it(`Edit Objective and move to backlog`, () => { - overviewPage.addObjective().fillObjectiveTitle('Move to another quarter on edit').submitDraftObjective(); + it("Edit Objective and move to backlog", () => { + overviewPage.addObjective() + .fillObjectiveTitle("Move to another quarter on edit") + .submitDraftObjective(); overviewPage - .getObjectiveByNameAndState('Move to another quarter on edit', 'draft') - .findByTestId('three-dot-menu') + .getObjectiveByNameAndState("Move to another quarter on edit", "draft") + .findByTestId("three-dot-menu") .click(); - overviewPage.selectFromThreeDotMenu('Objective bearbeiten'); + overviewPage.selectFromThreeDotMenu("Objective bearbeiten"); - ObjectiveDialog.do().fillObjectiveTitle('This goes now to backlog').selectQuarter('Backlog').submit(); + ObjectiveDialog.do() + .fillObjectiveTitle("This goes now to backlog") + .selectQuarter("Backlog") + .submit(); - cy.contains('This goes now to backlog').should('not.exist'); + cy.contains("This goes now to backlog") + .should("not.exist"); overviewPage.visitBacklogQuarter(); - cy.contains('This goes now to backlog'); + cy.contains("This goes now to backlog"); }); - it(`Edit ongoing Objective can not choose backlog in quarter select`, () => { - overviewPage.addObjective().fillObjectiveTitle('We can not move this to backlog').submit(); + it("Edit ongoing Objective can not choose backlog in quarter select", () => { + overviewPage.addObjective() + .fillObjectiveTitle("We can not move this to backlog") + .submit(); overviewPage - .getObjectiveByNameAndState('We can not move this to backlog', 'ongoing') - .findByTestId('three-dot-menu') + .getObjectiveByNameAndState("We can not move this to backlog", "ongoing") + .findByTestId("three-dot-menu") .click(); - overviewPage.selectFromThreeDotMenu('Objective bearbeiten'); + overviewPage.selectFromThreeDotMenu("Objective bearbeiten"); - cy.get('select#quarter').should('contain', 'GJ ForTests'); - cy.get('select#quarter').should('not.contain', 'Backlog'); + cy.get("select#quarter") + .should("contain", "GJ ForTests"); + cy.get("select#quarter") + .should("not.contain", "Backlog"); }); - it(`Can release Objective to another quarter from backlog`, () => { + it("Can release Objective to another quarter from backlog", () => { overviewPage.visitBacklogQuarter(); - overviewPage.addObjective().fillObjectiveTitle('We can not release this').submitDraftObjective(); - - overviewPage.getObjectiveByNameAndState('We can not release this', 'draft').findByTestId('three-dot-menu').click(); - overviewPage.selectFromThreeDotMenu('Objective veröffentlichen'); - - cy.contains('Objective veröffentlichen'); - cy.getByTestId('title').first().as('title'); - cy.get('@title').clear(); - cy.get('@title').type('This is our first released objective'); - - cy.get('select#quarter').should('not.contain', 'Backlog'); - cy.get('select#quarter').select('GJ ForTests'); + overviewPage.addObjective() + .fillObjectiveTitle("We can not release this") + .submitDraftObjective(); - cy.contains('Als Draft speichern').should('not.exist'); - cy.contains('Speichern'); - cy.getByTestId('save').click(); + overviewPage.getObjectiveByNameAndState("We can not release this", "draft") + .findByTestId("three-dot-menu") + .click(); + overviewPage.selectFromThreeDotMenu("Objective veröffentlichen"); + + cy.contains("Objective veröffentlichen"); + cy.getByTestId("title") + .first() + .as("title"); + cy.get("@title") + .clear(); + cy.get("@title") + .type("This is our first released objective"); + + cy.get("select#quarter") + .should("not.contain", "Backlog"); + cy.get("select#quarter") + .select("GJ ForTests"); + + cy.contains("Als Draft speichern") + .should("not.exist"); + cy.contains("Speichern"); + cy.getByTestId("save") + .click(); - cy.contains('This is our first released objective').should('not.exist'); + cy.contains("This is our first released objective") + .should("not.exist"); overviewPage.visitGJForTests(); - cy.contains('This is our first released objective'); + cy.contains("This is our first released objective"); }); - it(`Can edit Objective title in backlog`, () => { + it("Can edit Objective title in backlog", () => { overviewPage.visitBacklogQuarter(); - overviewPage.addObjective().fillObjectiveTitle('This is possible for edit').submitDraftObjective(); + overviewPage.addObjective() + .fillObjectiveTitle("This is possible for edit") + .submitDraftObjective(); overviewPage - .getObjectiveByNameAndState('This is possible for edit', 'draft') - .findByTestId('three-dot-menu') + .getObjectiveByNameAndState("This is possible for edit", "draft") + .findByTestId("three-dot-menu") .click(); - overviewPage.selectFromThreeDotMenu('Objective bearbeiten'); + overviewPage.selectFromThreeDotMenu("Objective bearbeiten"); - ObjectiveDialog.do().fillObjectiveTitle('My new title').submit(); + ObjectiveDialog.do() + .fillObjectiveTitle("My new title") + .submit(); - overviewPage.getObjectiveByNameAndState('My new title', 'draft'); + overviewPage.getObjectiveByNameAndState("My new title", "draft"); }); - it(`Can edit Objective in backlog and change quarter`, () => { + it("Can edit Objective in backlog and change quarter", () => { overviewPage.visitBacklogQuarter(); - overviewPage.addObjective().fillObjectiveTitle('This goes to other quarter later').submitDraftObjective(); + overviewPage.addObjective() + .fillObjectiveTitle("This goes to other quarter later") + .submitDraftObjective(); overviewPage - .getObjectiveByNameAndState('This goes to other quarter later', 'draft') - .findByTestId('three-dot-menu') + .getObjectiveByNameAndState("This goes to other quarter later", "draft") + .findByTestId("three-dot-menu") .click(); - overviewPage.selectFromThreeDotMenu('Objective bearbeiten'); + overviewPage.selectFromThreeDotMenu("Objective bearbeiten"); - ObjectiveDialog.do().selectQuarter('GJ ForTests').submit(); + ObjectiveDialog.do() + .selectQuarter("GJ ForTests") + .submit(); overviewPage.visitGJForTests(); - overviewPage.getObjectiveByNameAndState('This goes to other quarter later', 'draft'); + overviewPage.getObjectiveByNameAndState("This goes to other quarter later", "draft"); }); - it(`Can duplicate in backlog`, () => { + it("Can duplicate in backlog", () => { overviewPage.visitBacklogQuarter(); - overviewPage.addObjective().fillObjectiveTitle('Ready for duplicate in backlog').submitDraftObjective(); + overviewPage.addObjective() + .fillObjectiveTitle("Ready for duplicate in backlog") + .submitDraftObjective(); overviewPage - .getObjectiveByNameAndState('Ready for duplicate in backlog', 'draft') - .findByTestId('three-dot-menu') + .getObjectiveByNameAndState("Ready for duplicate in backlog", "draft") + .findByTestId("three-dot-menu") .click(); - overviewPage.selectFromThreeDotMenu('Objective duplizieren'); + overviewPage.selectFromThreeDotMenu("Objective duplizieren"); - ObjectiveDialog.do().fillObjectiveTitle('This is a new duplication in backlog').submit(); + ObjectiveDialog.do() + .fillObjectiveTitle("This is a new duplication in backlog") + .submit(); - overviewPage.getObjectiveByNameAndState('Ready for duplicate in backlog', 'draft'); - overviewPage.getObjectiveByNameAndState('This is a new duplication in backlog', 'draft'); + overviewPage.getObjectiveByNameAndState("Ready for duplicate in backlog", "draft"); + overviewPage.getObjectiveByNameAndState("This is a new duplication in backlog", "draft"); }); - it('should duplicate from backlog', () => { + it("should duplicate from backlog", () => { overviewPage.visitBacklogQuarter(); - overviewPage.addObjective().fillObjectiveTitle('Ready for duplicate to another quarter').submitDraftObjective(); + overviewPage.addObjective() + .fillObjectiveTitle("Ready for duplicate to another quarter") + .submitDraftObjective(); overviewPage - .getObjectiveByNameAndState('Ready for duplicate to another quarter', 'draft') - .findByTestId('three-dot-menu') + .getObjectiveByNameAndState("Ready for duplicate to another quarter", "draft") + .findByTestId("three-dot-menu") .click(); - overviewPage.selectFromThreeDotMenu('Objective duplizieren'); + overviewPage.selectFromThreeDotMenu("Objective duplizieren"); - ObjectiveDialog.do().fillObjectiveTitle('New duplication from backlog').selectQuarter('GJ ForTests').submit(); + ObjectiveDialog.do() + .fillObjectiveTitle("New duplication from backlog") + .selectQuarter("GJ ForTests") + .submit(); - overviewPage.getObjectiveByNameAndState('Ready for duplicate to another quarter', 'draft').should('exist'); - cy.contains('New duplication from backlog').should('not.exist'); + overviewPage.getObjectiveByNameAndState("Ready for duplicate to another quarter", "draft") + .should("exist"); + cy.contains("New duplication from backlog") + .should("not.exist"); overviewPage.visitGJForTests(); - overviewPage.getObjectiveByNameAndState('New duplication from backlog', 'draft').should('exist'); + overviewPage.getObjectiveByNameAndState("New duplication from backlog", "draft") + .should("exist"); }); - it(`Can duplicate ongoing Objective to backlog`, () => { - overviewPage.addObjective().fillObjectiveTitle('Possible to duplicate into backlog').submit(); + it("Can duplicate ongoing Objective to backlog", () => { + overviewPage.addObjective() + .fillObjectiveTitle("Possible to duplicate into backlog") + .submit(); overviewPage - .getObjectiveByNameAndState('Possible to duplicate into backlog', 'ongoing') - .findByTestId('three-dot-menu') + .getObjectiveByNameAndState("Possible to duplicate into backlog", "ongoing") + .findByTestId("three-dot-menu") .click(); - overviewPage.selectFromThreeDotMenu('Objective duplizieren'); + overviewPage.selectFromThreeDotMenu("Objective duplizieren"); - ObjectiveDialog.do().selectQuarter('Backlog').submit(); + ObjectiveDialog.do() + .selectQuarter("Backlog") + .submit(); overviewPage.visitBacklogQuarter(); - cy.contains('Possible to duplicate into backlog'); + cy.contains("Possible to duplicate into backlog"); }); }); diff --git a/frontend/cypress/e2e/objective-crud.cy.ts b/frontend/cypress/e2e/objective-crud.cy.ts index 06a7545d03..a779459d87 100644 --- a/frontend/cypress/e2e/objective-crud.cy.ts +++ b/frontend/cypress/e2e/objective-crud.cy.ts @@ -1,8 +1,8 @@ -import * as users from '../fixtures/users.json'; -import CyOverviewPage from '../support/helper/dom-helper/pages/overviewPage'; -import ObjectiveDialog from '../support/helper/dom-helper/dialogs/objectiveDialog'; +import * as users from "../fixtures/users.json"; +import CyOverviewPage from "../support/helper/dom-helper/pages/overviewPage"; +import ObjectiveDialog from "../support/helper/dom-helper/dialogs/objectiveDialog"; -describe('CRUD operations', () => { +describe("CRUD operations", () => { let overviewPage = new CyOverviewPage(); beforeEach(() => { @@ -11,66 +11,93 @@ describe('CRUD operations', () => { }); [ - ['ongoing objective title', 'save', 'ongoing-icon.svg'], - ['draft objective title', 'save-draft', 'draft-icon.svg'], + ["ongoing objective title", "save", "ongoing-icon.svg"], + ["draft objective title", "save-draft", "draft-icon.svg"], ].forEach(([objectiveTitle, buttonTestId, icon]) => { - it(`Create objective, no keyresults`, () => { - overviewPage.addObjective().fillObjectiveTitle(objectiveTitle).selectQuarter('3'); - cy.getByTestId(buttonTestId).click(); + it("Create objective, no keyresults", () => { + overviewPage.addObjective() + .fillObjectiveTitle(objectiveTitle) + .selectQuarter("3"); + cy.getByTestId(buttonTestId) + .click(); overviewPage.visitNextQuarter(); overviewPage .getObjectiveByName(objectiveTitle) - .findByTestId('objective-state') - .should('have.attr', 'src', `assets/icons/${icon}`); + .findByTestId("objective-state") + .should("have.attr", "src", `assets/icons/${icon}`); }); }); - it(`Create objective, should display error message`, () => { + it("Create objective, should display error message", () => { overviewPage.addObjective(); - cy.getByTestId('title').first().type('title').clear(); - cy.contains('Titel muss folgende Länge haben: 2-250 Zeichen'); - cy.getByTestId('save').should('be.disabled'); - cy.getByTestId('save-draft').should('be.disabled'); - cy.getByTestId('cancel').should('not.be.disabled'); + cy.getByTestId("title") + .first() + .type("title") + .clear(); + cy.contains("Titel muss folgende Länge haben: 2-250 Zeichen"); + cy.getByTestId("save") + .should("be.disabled"); + cy.getByTestId("save-draft") + .should("be.disabled"); + cy.getByTestId("cancel") + .should("not.be.disabled"); }); - it(`Create objective, cancel`, () => { - const objectiveTitle = 'this is a canceled objective'; - overviewPage.addObjective().selectQuarter('3').cancel(); + it("Create objective, cancel", () => { + const objectiveTitle = "this is a canceled objective"; + overviewPage.addObjective() + .selectQuarter("3") + .cancel(); overviewPage.visitNextQuarter(); - cy.contains(objectiveTitle).should('not.exist'); + cy.contains(objectiveTitle) + .should("not.exist"); }); - it(`Delete existing objective`, () => { - overviewPage.getFirstObjective().findByTestId('three-dot-menu').click(); - overviewPage.selectFromThreeDotMenu('Objective bearbeiten'); + it("Delete existing objective", () => { + overviewPage.getFirstObjective() + .findByTestId("three-dot-menu") + .click(); + overviewPage.selectFromThreeDotMenu("Objective bearbeiten"); ObjectiveDialog.do() .deleteObjective() - .checkTitle('Objective löschen') + .checkTitle("Objective löschen") .checkDescription( - 'Möchtest du dieses Objective wirklich löschen? Zugehörige Key Results werden dadurch ebenfalls gelöscht!', + "Möchtest du dieses Objective wirklich löschen? Zugehörige Key Results werden dadurch ebenfalls gelöscht!", ) .submit(); }); - it(`Open objective aside via click`, () => { - overviewPage.getFirstObjective().find('.title').click(); - cy.url().should('include', 'objective'); + it("Open objective aside via click", () => { + overviewPage.getFirstObjective() + .find(".title") + .click(); + cy.url() + .should("include", "objective"); }); - it(`update objective`, () => { - const updatedTitle = 'This is an updated title'; - overviewPage.getFirstObjective().findByTestId('three-dot-menu').click(); - overviewPage.selectFromThreeDotMenu('Objective bearbeiten'); - ObjectiveDialog.do().fillObjectiveTitle(updatedTitle).submit(); - cy.contains(updatedTitle).should('exist'); + it("update objective", () => { + const updatedTitle = "This is an updated title"; + overviewPage.getFirstObjective() + .findByTestId("three-dot-menu") + .click(); + overviewPage.selectFromThreeDotMenu("Objective bearbeiten"); + ObjectiveDialog.do() + .fillObjectiveTitle(updatedTitle) + .submit(); + cy.contains(updatedTitle) + .should("exist"); }); - it(`Duplicate objective`, () => { - const duplicatedTitle = 'This is a duplicated objective'; - overviewPage.getFirstObjective().findByTestId('three-dot-menu').click(); - overviewPage.selectFromThreeDotMenu('Objective duplizieren'); - ObjectiveDialog.do().fillObjectiveTitle(duplicatedTitle).submit(); - cy.contains(duplicatedTitle).should('exist'); + it("Duplicate objective", () => { + const duplicatedTitle = "This is a duplicated objective"; + overviewPage.getFirstObjective() + .findByTestId("three-dot-menu") + .click(); + overviewPage.selectFromThreeDotMenu("Objective duplizieren"); + ObjectiveDialog.do() + .fillObjectiveTitle(duplicatedTitle) + .submit(); + cy.contains(duplicatedTitle) + .should("exist"); }); }); diff --git a/frontend/cypress/e2e/objective.cy.ts b/frontend/cypress/e2e/objective.cy.ts index ebe6a41af5..28da14fa94 100644 --- a/frontend/cypress/e2e/objective.cy.ts +++ b/frontend/cypress/e2e/objective.cy.ts @@ -1,250 +1,310 @@ -import * as users from '../fixtures/users.json'; -import CyOverviewPage from '../support/helper/dom-helper/pages/overviewPage'; -import ObjectiveDialog from '../support/helper/dom-helper/dialogs/objectiveDialog'; -import ConfirmDialog from '../support/helper/dom-helper/dialogs/confirmDialog'; +import * as users from "../fixtures/users.json"; +import CyOverviewPage from "../support/helper/dom-helper/pages/overviewPage"; +import ObjectiveDialog from "../support/helper/dom-helper/dialogs/objectiveDialog"; +import ConfirmDialog from "../support/helper/dom-helper/dialogs/confirmDialog"; -describe('OKR Objective e2e tests', () => { +describe("OKR Objective e2e tests", () => { let overviewPage = new CyOverviewPage(); beforeEach(() => { overviewPage = new CyOverviewPage(); cy.loginAsUser(users.gl); }); - describe('tests via click', () => { - it(`Release Objective from Draft to Ongoing`, () => { - overviewPage.addObjective().fillObjectiveTitle('A objective in state draft').submitDraftObjective(); + describe("tests via click", () => { + it("Release Objective from Draft to Ongoing", () => { + overviewPage.addObjective() + .fillObjectiveTitle("A objective in state draft") + .submitDraftObjective(); overviewPage - .getObjectiveByNameAndState('A objective in state draft', 'draft') - .findByTestId('three-dot-menu') + .getObjectiveByNameAndState("A objective in state draft", "draft") + .findByTestId("three-dot-menu") .click(); - overviewPage.selectFromThreeDotMenu('Objective veröffentlichen'); + overviewPage.selectFromThreeDotMenu("Objective veröffentlichen"); ConfirmDialog.do() - .checkTitle('Objective veröffentlichen') - .checkDescription('Soll dieses Objective veröffentlicht werden?') + .checkTitle("Objective veröffentlichen") + .checkDescription("Soll dieses Objective veröffentlicht werden?") .submit(); - overviewPage.getObjectiveByNameAndState('A objective in state draft', 'ongoing').should('exist'); + overviewPage.getObjectiveByNameAndState("A objective in state draft", "ongoing") + .should("exist"); }); - it(`Complete Objective with Successful`, () => { - overviewPage.addObjective().fillObjectiveTitle('We want to complete this successful').submit(); + it("Complete Objective with Successful", () => { + overviewPage.addObjective() + .fillObjectiveTitle("We want to complete this successful") + .submit(); overviewPage - .getObjectiveByNameAndState('We want to complete this successful', 'ongoing') - .findByTestId('three-dot-menu') + .getObjectiveByNameAndState("We want to complete this successful", "ongoing") + .findByTestId("three-dot-menu") .click(); - overviewPage.selectFromThreeDotMenu('Objective abschliessen'); + overviewPage.selectFromThreeDotMenu("Objective abschliessen"); - cy.contains('Bewertung'); - cy.contains('Objective erreicht'); - cy.contains('Objective nicht erreicht'); - cy.contains('Kommentar (optional)'); - cy.contains('Objective abschliessen'); - cy.contains('Abbrechen'); + cy.contains("Bewertung"); + cy.contains("Objective erreicht"); + cy.contains("Objective nicht erreicht"); + cy.contains("Kommentar (optional)"); + cy.contains("Objective abschliessen"); + cy.contains("Abbrechen"); - cy.getByTestId('successful').click(); - cy.getByTestId('submit').click(); + cy.getByTestId("successful") + .click(); + cy.getByTestId("submit") + .click(); - overviewPage.getObjectiveByNameAndState('We want to complete this successful', 'successful'); + overviewPage.getObjectiveByNameAndState("We want to complete this successful", "successful"); }); - it(`Complete Objective with Not-Successful`, () => { - overviewPage.addObjective().fillObjectiveTitle('A not successful objective').submit(); + it("Complete Objective with Not-Successful", () => { + overviewPage.addObjective() + .fillObjectiveTitle("A not successful objective") + .submit(); overviewPage - .getObjectiveByNameAndState('A not successful objective', 'ongoing') - .findByTestId('three-dot-menu') + .getObjectiveByNameAndState("A not successful objective", "ongoing") + .findByTestId("three-dot-menu") .click(); - overviewPage.selectFromThreeDotMenu('Objective abschliessen'); + overviewPage.selectFromThreeDotMenu("Objective abschliessen"); - cy.contains('Bewertung'); - cy.contains('Objective erreicht'); - cy.contains('Objective nicht erreicht'); - cy.contains('Kommentar (optional)'); - cy.contains('Objective abschliessen'); - cy.contains('Abbrechen'); + cy.contains("Bewertung"); + cy.contains("Objective erreicht"); + cy.contains("Objective nicht erreicht"); + cy.contains("Kommentar (optional)"); + cy.contains("Objective abschliessen"); + cy.contains("Abbrechen"); - cy.getByTestId('not-successful').click(); - cy.getByTestId('submit').click(); + cy.getByTestId("not-successful") + .click(); + cy.getByTestId("submit") + .click(); - overviewPage.getObjectiveByNameAndState('A not successful objective', 'not-successful'); + overviewPage.getObjectiveByNameAndState("A not successful objective", "not-successful"); }); - it(`Reopen Successful Objective`, () => { - overviewPage.addObjective().fillObjectiveTitle('This objective will be reopened after').submit(); + it("Reopen Successful Objective", () => { + overviewPage.addObjective() + .fillObjectiveTitle("This objective will be reopened after") + .submit(); overviewPage - .getObjectiveByNameAndState('This objective will be reopened after', 'ongoing') - .findByTestId('three-dot-menu') + .getObjectiveByNameAndState("This objective will be reopened after", "ongoing") + .findByTestId("three-dot-menu") .click(); - overviewPage.selectFromThreeDotMenu('Objective abschliessen'); + overviewPage.selectFromThreeDotMenu("Objective abschliessen"); - cy.getByTestId('successful').click(); - cy.getByTestId('submit').click(); + cy.getByTestId("successful") + .click(); + cy.getByTestId("submit") + .click(); cy.wait(500); overviewPage - .getObjectiveByNameAndState('This objective will be reopened after', 'successful') - .findByTestId('three-dot-menu') + .getObjectiveByNameAndState("This objective will be reopened after", "successful") + .findByTestId("three-dot-menu") .click(); - overviewPage.selectFromThreeDotMenu('Objective wiedereröffnen'); + overviewPage.selectFromThreeDotMenu("Objective wiedereröffnen"); ConfirmDialog.do() - .checkTitle('Objective wiedereröffnen') - .checkDescription('Soll dieses Objective wiedereröffnet werden?') + .checkTitle("Objective wiedereröffnen") + .checkDescription("Soll dieses Objective wiedereröffnet werden?") .submit(); - overviewPage.getObjectiveByNameAndState('This objective will be reopened after', 'ongoing').should('exist'); + overviewPage.getObjectiveByNameAndState("This objective will be reopened after", "ongoing") + .should("exist"); }); - it(`Cancel Reopen Successful Objective`, () => { - overviewPage.addObjective().fillObjectiveTitle('The reopening of this objective will be canceled').submit(); + it("Cancel Reopen Successful Objective", () => { + overviewPage.addObjective() + .fillObjectiveTitle("The reopening of this objective will be canceled") + .submit(); overviewPage - .getObjectiveByNameAndState('The reopening of this objective will be canceled', 'ongoing') - .findByTestId('three-dot-menu') + .getObjectiveByNameAndState("The reopening of this objective will be canceled", "ongoing") + .findByTestId("three-dot-menu") .click(); - overviewPage.selectFromThreeDotMenu('Objective abschliessen'); + overviewPage.selectFromThreeDotMenu("Objective abschliessen"); - cy.getByTestId('successful').click(); - cy.getByTestId('submit').click(); + cy.getByTestId("successful") + .click(); + cy.getByTestId("submit") + .click(); cy.wait(500); overviewPage - .getObjectiveByNameAndState('he reopening of this objective will be canceled', 'successful') - .findByTestId('three-dot-menu') + .getObjectiveByNameAndState("he reopening of this objective will be canceled", "successful") + .findByTestId("three-dot-menu") .click(); - overviewPage.selectFromThreeDotMenu('Objective wiedereröffnen'); + overviewPage.selectFromThreeDotMenu("Objective wiedereröffnen"); ConfirmDialog.do() - .checkTitle('Objective wiedereröffnen') - .checkDescription('Soll dieses Objective wiedereröffnet werden?') + .checkTitle("Objective wiedereröffnen") + .checkDescription("Soll dieses Objective wiedereröffnet werden?") .cancel(); overviewPage - .getObjectiveByNameAndState('The reopening of this objective will be canceled', 'successful') - .should('exist'); + .getObjectiveByNameAndState("The reopening of this objective will be canceled", "successful") + .should("exist"); }); - it('Cancel Ongoing objective back to draft state', () => { - overviewPage.addObjective().fillObjectiveTitle('This objective will be returned to draft state').submit(); + it("Cancel Ongoing objective back to draft state", () => { + overviewPage.addObjective() + .fillObjectiveTitle("This objective will be returned to draft state") + .submit(); overviewPage - .getObjectiveByNameAndState('This objective will be returned to draft state', 'ongoing') - .findByTestId('three-dot-menu') + .getObjectiveByNameAndState("This objective will be returned to draft state", "ongoing") + .findByTestId("three-dot-menu") .click(); - overviewPage.selectFromThreeDotMenu('Objective als Draft speichern'); + overviewPage.selectFromThreeDotMenu("Objective als Draft speichern"); ConfirmDialog.do() - .checkTitle('Objective als Draft speichern') - .checkDescription('Soll dieses Objective als Draft gespeichert werden?') + .checkTitle("Objective als Draft speichern") + .checkDescription("Soll dieses Objective als Draft gespeichert werden?") .submit(); overviewPage - .getObjectiveByNameAndState('This objective will be returned to draft state', 'draft') - .should('exist'); + .getObjectiveByNameAndState("This objective will be returned to draft state", "draft") + .should("exist"); }); - it('Ongoing objective back to draft state', () => { + it("Ongoing objective back to draft state", () => { overviewPage .addObjective() - .fillObjectiveTitle('Putting this objective back to draft state will be canceled') + .fillObjectiveTitle("Putting this objective back to draft state will be canceled") .submit(); overviewPage - .getObjectiveByNameAndState('Putting this objective back to draft state will be canceled', 'ongoing') - .findByTestId('three-dot-menu') + .getObjectiveByNameAndState("Putting this objective back to draft state will be canceled", "ongoing") + .findByTestId("three-dot-menu") .click(); - overviewPage.selectFromThreeDotMenu('Objective als Draft speichern'); + overviewPage.selectFromThreeDotMenu("Objective als Draft speichern"); ConfirmDialog.do() - .checkTitle('Objective als Draft speichern') - .checkDescription('Soll dieses Objective als Draft gespeichert werden?') + .checkTitle("Objective als Draft speichern") + .checkDescription("Soll dieses Objective als Draft gespeichert werden?") .cancel(); overviewPage - .getObjectiveByNameAndState('Putting this objective back to draft state will be canceled', 'ongoing') - .should('exist'); + .getObjectiveByNameAndState("Putting this objective back to draft state will be canceled", "ongoing") + .should("exist"); }); - it(`Search for Objective`, () => { - overviewPage.addObjective().fillObjectiveTitle('Search after this objective').submit(); + it("Search for Objective", () => { + overviewPage.addObjective() + .fillObjectiveTitle("Search after this objective") + .submit(); - overviewPage.addObjective().fillObjectiveTitle('We dont want to search for this').submit(); + overviewPage.addObjective() + .fillObjectiveTitle("We dont want to search for this") + .submit(); - cy.contains('Search after this objective'); - cy.contains('We dont want to search for this'); + cy.contains("Search after this objective"); + cy.contains("We dont want to search for this"); cy.scrollTo(0, 0); cy.wait(500); - cy.getByTestId('objectiveSearch').first().click(); - cy.getByTestId('objectiveSearch').first().type('Search after').wait(350); - - cy.contains('Search after this objective'); - cy.contains('We dont want to search for this').should('not.exist'); - - cy.getByTestId('objectiveSearch').first().as('objective-search').clear(); - cy.get('@objective-search').type('this').wait(350); - - cy.contains('Search after this objective'); - cy.contains('We dont want to search for this'); - - cy.get('@objective-search').clear(); - cy.get('@objective-search').type('dont want to').wait(350); - - cy.contains('We dont want to search for this'); - cy.contains('Search after this objective').should('not.exist'); - - cy.get('@objective-search').clear(); - cy.get('@objective-search').type('there is no objective').wait(350); - - cy.contains('We dont want to search for this').should('not.exist'); - cy.contains('Search after this objective').should('not.exist'); + cy.getByTestId("objectiveSearch") + .first() + .click(); + cy.getByTestId("objectiveSearch") + .first() + .type("Search after") + .wait(350); + + cy.contains("Search after this objective"); + cy.contains("We dont want to search for this") + .should("not.exist"); + + cy.getByTestId("objectiveSearch") + .first() + .as("objective-search") + .clear(); + cy.get("@objective-search") + .type("this") + .wait(350); + + cy.contains("Search after this objective"); + cy.contains("We dont want to search for this"); + + cy.get("@objective-search") + .clear(); + cy.get("@objective-search") + .type("dont want to") + .wait(350); + + cy.contains("We dont want to search for this"); + cy.contains("Search after this objective") + .should("not.exist"); + + cy.get("@objective-search") + .clear(); + cy.get("@objective-search") + .type("there is no objective") + .wait(350); + + cy.contains("We dont want to search for this") + .should("not.exist"); + cy.contains("Search after this objective") + .should("not.exist"); }); - it(`Create Objective in other quarter`, () => { - overviewPage.addObjective().fillObjectiveTitle('Objective in quarter 3').selectQuarter('3').submit(); + it("Create Objective in other quarter", () => { + overviewPage.addObjective() + .fillObjectiveTitle("Objective in quarter 3") + .selectQuarter("3") + .submit(); - cy.contains('Objective in quarter 3').should('not.exist'); + cy.contains("Objective in quarter 3") + .should("not.exist"); overviewPage.visitNextQuarter(); - cy.contains('Objective in quarter 3'); + cy.contains("Objective in quarter 3"); }); - it(`Edit Objective and move to other quarter`, () => { - overviewPage.addObjective().fillObjectiveTitle('Move to another quarter on edit').submit(); + it("Edit Objective and move to other quarter", () => { + overviewPage.addObjective() + .fillObjectiveTitle("Move to another quarter on edit") + .submit(); overviewPage - .getObjectiveByNameAndState('Move to another quarter on edit', 'ongoing') - .findByTestId('three-dot-menu') + .getObjectiveByNameAndState("Move to another quarter on edit", "ongoing") + .findByTestId("three-dot-menu") .click(); - overviewPage.selectFromThreeDotMenu('Objective bearbeiten'); - ObjectiveDialog.do().selectQuarter('3').submit(); + overviewPage.selectFromThreeDotMenu("Objective bearbeiten"); + ObjectiveDialog.do() + .selectQuarter("3") + .submit(); - cy.contains('Move to another quarter on edit').should('not.exist'); + cy.contains("Move to another quarter on edit") + .should("not.exist"); overviewPage.visitNextQuarter(); - cy.contains('Move to another quarter on edit'); + cy.contains("Move to another quarter on edit"); }); }); - describe('tests via keyboard', () => { - it(`Open objective aside via enter`, () => { - cy.getByTestId('objective').first().find('[tabindex]').first().focus(); - cy.realPress('Enter'); - cy.url().should('include', 'objective'); + describe("tests via keyboard", () => { + it("Open objective aside via enter", () => { + cy.getByTestId("objective") + .first() + .find("[tabindex]") + .first() + .focus(); + cy.realPress("Enter"); + cy.url() + .should("include", "objective"); }); }); }); diff --git a/frontend/cypress/e2e/overview.cy.ts b/frontend/cypress/e2e/overview.cy.ts index 4528a5fb15..2c8927c0e7 100644 --- a/frontend/cypress/e2e/overview.cy.ts +++ b/frontend/cypress/e2e/overview.cy.ts @@ -1,27 +1,39 @@ -import * as users from '../fixtures/users.json'; -import FilterHelper from '../support/helper/dom-helper/filterHelper'; +import * as users from "../fixtures/users.json"; +import FilterHelper from "../support/helper/dom-helper/filterHelper"; -describe('OKR Overview', () => { +describe("OKR Overview", () => { beforeEach(() => { cy.loginAsUser(users.gl); }); - it('should have the current quarter with label Aktuell', () => { - cy.getByTestId('quarterFilter').contains('Aktuell'); + it("should have the current quarter with label Aktuell", () => { + cy.getByTestId("quarterFilter") + .contains("Aktuell"); }); - it('Check order of teams', () => { - FilterHelper.do().optionShouldNotBeSelected('Alle').toggleOption('Alle'); - const textsExpectedOrder = ['LoremIpsum', 'Puzzle ITC', '/BBT', 'we are cube.³']; - cy.get('.team-title:contains("we are cube.³")'); - cy.get('.team-title').then((elements) => { - const texts: string[] = elements.map((_, el) => Cypress.$(el).text()).get(); - expect(texts).to.deep.equal(textsExpectedOrder); - }); + it("Check order of teams", () => { + FilterHelper.do() + .optionShouldNotBeSelected("Alle") + .toggleOption("Alle"); + const textsExpectedOrder = ["LoremIpsum", "Puzzle ITC", "/BBT", "we are cube.³"]; + cy.get(".team-title:contains(\"we are cube.³\")"); + cy.get(".team-title") + .then((elements) => { + const texts: string[] = elements.map((_, el) => Cypress.$(el) + .text()) + .get(); + expect(texts).to.deep.equal(textsExpectedOrder); + }); }); - it('Check font ', () => { - cy.get('.team-title').first().invoke('css', 'font-family').should('eq', 'Roboto, sans-serif'); - cy.get('.team-title').first().invoke('css', 'font-weight').should('eq', '600'); + it("Check font ", () => { + cy.get(".team-title") + .first() + .invoke("css", "font-family") + .should("eq", "Roboto, sans-serif"); + cy.get(".team-title") + .first() + .invoke("css", "font-weight") + .should("eq", "600"); }); }); diff --git a/frontend/cypress/e2e/routing.cy.ts b/frontend/cypress/e2e/routing.cy.ts index 58f80ef982..41196d2372 100644 --- a/frontend/cypress/e2e/routing.cy.ts +++ b/frontend/cypress/e2e/routing.cy.ts @@ -1,33 +1,41 @@ -import * as users from '../fixtures/users.json'; -import CyOverviewPage from '../support/helper/dom-helper/pages/overviewPage'; -import TeammanagementPage from '../support/helper/dom-helper/pages/teammanagementPage'; +import * as users from "../fixtures/users.json"; +import CyOverviewPage from "../support/helper/dom-helper/pages/overviewPage"; +import TeammanagementPage from "../support/helper/dom-helper/pages/teammanagementPage"; -describe('Routing', () => { +describe("Routing", () => { beforeEach(() => { cy.loginAsUser(users.gl); }); - describe('Route via url', () => { - it('should route to overview', () => { + describe("Route via url", () => { + it("should route to overview", () => { // Visit autocalls the validatePage method - CyOverviewPage.do().visitViaURL(); + CyOverviewPage.do() + .visitViaURL(); }); - it('should route to teammanagement', () => { + it("should route to teammanagement", () => { // Visit autocalls the validatePage method - TeammanagementPage.do().visitViaURL(); + TeammanagementPage.do() + .visitViaURL(); }); - it('should route from overview to team management ', () => { - CyOverviewPage.do().visitViaURL().visitTeammanagement(); + it("should route from overview to team management ", () => { + CyOverviewPage.do() + .visitViaURL() + .visitTeammanagement(); }); - it('should route from team management to Overview via back button', () => { - TeammanagementPage.do().visitViaURL().backToOverview(); + it("should route from team management to Overview via back button", () => { + TeammanagementPage.do() + .visitViaURL() + .backToOverview(); }); - it('should route from team management to Overview via logo', () => { - TeammanagementPage.do().visitViaURL().visitOverview(); + it("should route from team management to Overview via logo", () => { + TeammanagementPage.do() + .visitViaURL() + .visitOverview(); }); }); }); diff --git a/frontend/cypress/e2e/scoring.cy.ts b/frontend/cypress/e2e/scoring.cy.ts index e86da67685..ad29d76805 100644 --- a/frontend/cypress/e2e/scoring.cy.ts +++ b/frontend/cypress/e2e/scoring.cy.ts @@ -1,10 +1,10 @@ -import * as users from '../fixtures/users.json'; -import { getPercentageMetric, getPercentageOrdinal } from 'cypress/support/helper/scoringSupport'; -import CyOverviewPage from '../support/helper/dom-helper/pages/overviewPage'; -import { Unit } from '../../src/app/shared/types/enums/Unit'; -import KeyResultDetailPage from '../support/helper/dom-helper/pages/keyResultDetailPage'; +import * as users from "../fixtures/users.json"; +import { getPercentageMetric, getPercentageOrdinal } from "cypress/support/helper/scoringSupport"; +import CyOverviewPage from "../support/helper/dom-helper/pages/overviewPage"; +import { Unit } from "../../src/app/shared/types/enums/Unit"; +import KeyResultDetailPage from "../support/helper/dom-helper/pages/keyResultDetailPage"; -describe('Scoring component e2e tests', () => { +describe("Scoring component e2e tests", () => { let overviewPage = new CyOverviewPage(); let keyresultDetailPage = new KeyResultDetailPage(); @@ -20,23 +20,23 @@ describe('Scoring component e2e tests', () => { [0, 100, 71], [0, 100, 100], ].forEach(([baseline, stretchgoal, value]) => { - it('Create metric checkin and validate value of scoring component', () => { + it("Create metric checkin and validate value of scoring component", () => { setupMetricKR(`Metric kr with check-in value ${value}`, baseline, stretchgoal, value); const percentage = getPercentageMetric(baseline, stretchgoal, value); cy.validateScoring(false, percentage); - cy.get('.keyResult-detail-attribute-show') - .contains('Aktuell') + cy.get(".keyResult-detail-attribute-show") + .contains("Aktuell") .parent() - .not(':contains(!)') - .should('have.css', 'border-color') - .and('not.equal', 'rgb(186, 56, 56)'); + .not(":contains(!)") + .should("have.css", "border-color") + .and("not.equal", "rgb(186, 56, 56)"); keyresultDetailPage.close(); cy.validateScoring(true, percentage); overviewPage .getKeyResultByName(`Metric kr with check-in value ${value}`) - .not(':contains(*[class="scoring-error-badge"])'); + .not(":contains(*[class=\"scoring-error-badge\"])"); }); }); @@ -44,40 +44,41 @@ describe('Scoring component e2e tests', () => { [0, 100, -1], [200, 100, 250], ].forEach(([baseline, stretchgoal, value]) => { - it('show indicator that value is negative', () => { + it("show indicator that value is negative", () => { setupMetricKR(`Check indicator with value ${value}`, baseline, stretchgoal, value); cy.validateScoring(false, 0); - cy.get('.keyResult-detail-attribute-show') - .contains('Aktuell') + cy.get(".keyResult-detail-attribute-show") + .contains("Aktuell") .parent() - .contains('!') - .should('have.css', 'border-color') - .and('equal', 'rgb(186, 56, 56)'); + .contains("!") + .should("have.css", "border-color") + .and("equal", "rgb(186, 56, 56)"); keyresultDetailPage.close(); cy.validateScoring(true, 0); - overviewPage.getKeyResultByName(`Check indicator with value ${value}`).get('.scoring-error-badge'); + overviewPage.getKeyResultByName(`Check indicator with value ${value}`) + .get(".scoring-error-badge"); }); }); - [['fail'], ['commit'], ['target'], ['stretch']].forEach(([zoneName]) => { - it('Create ordinal checkin and validate value of scoring component', () => { + [["fail"], ["commit"], ["target"], ["stretch"]].forEach(([zoneName]) => { + it("Create ordinal checkin and validate value of scoring component", () => { overviewPage .addKeyResult() - .fillKeyResultTitle('Ordinal scoring keyresult') - .withOrdinalValues('My commit zone', 'My target zone', 'My stretch goal') + .fillKeyResultTitle("Ordinal scoring keyresult") + .withOrdinalValues("My commit zone", "My target zone", "My stretch goal") .checkForDialogTextOrdinal() - .fillKeyResultDescription('This is my description') + .fillKeyResultDescription("This is my description") .submit(); keyresultDetailPage - .visit('Ordinal scoring keyresult') + .visit("Ordinal scoring keyresult") .createCheckIn() - .selectOrdinalCheckInZone(zoneName as 'fail' | 'commit' | 'target' | 'stretch') + .selectOrdinalCheckInZone(zoneName as "fail" | "commit" | "target" | "stretch") .setCheckInConfidence(8) - .fillCheckInCommentary('Testveränderungen') - .fillCheckInInitiatives('Testmassnahmen') + .fillCheckInCommentary("Testveränderungen") + .fillCheckInInitiatives("Testmassnahmen") .submit(); const percentage = getPercentageOrdinal(zoneName); cy.validateScoring(false, percentage); @@ -97,8 +98,8 @@ function setupMetricKR(name: string, baseline: number, stretchgoal: number, valu .visit(name) .createCheckIn() .fillMetricCheckInValue(value.toString()) - .fillCheckInCommentary('Testveränderungen') - .fillCheckInInitiatives('Testmassnahmen') + .fillCheckInCommentary("Testveränderungen") + .fillCheckInInitiatives("Testmassnahmen") .setCheckInConfidence(8) .submit(); } diff --git a/frontend/cypress/e2e/tab.cy.ts b/frontend/cypress/e2e/tab.cy.ts index 3a6a685159..ef096fbeae 100644 --- a/frontend/cypress/e2e/tab.cy.ts +++ b/frontend/cypress/e2e/tab.cy.ts @@ -1,325 +1,370 @@ -import * as users from '../fixtures/users.json'; -import CyOverviewPage from '../support/helper/dom-helper/pages/overviewPage'; -import { Unit } from '../../src/app/shared/types/enums/Unit'; -import KeyResultDetailPage from '../support/helper/dom-helper/pages/keyResultDetailPage'; +import * as users from "../fixtures/users.json"; +import CyOverviewPage from "../support/helper/dom-helper/pages/overviewPage"; +import { Unit } from "../../src/app/shared/types/enums/Unit"; +import KeyResultDetailPage from "../support/helper/dom-helper/pages/keyResultDetailPage"; -describe('Tab workflow tests', () => { +describe("Tab workflow tests", () => { let overviewPage = new CyOverviewPage(); beforeEach(() => { cy.loginAsUser(users.gl); overviewPage = new CyOverviewPage(); - overviewPage.elements.logo().parent().focus(); + overviewPage.elements.logo() + .parent() + .focus(); }); function focusedShouldHaveTestId(testId: string) { - cy.focused().should('have.attr', 'data-testId', testId); + cy.focused() + .should("have.attr", "data-testId", testId); } function tabAndCheck(testId: string, text?: string) { cy.tabForwardUntil(`[data-testId="${testId}"]`); focusedShouldHaveTestId(testId); if (text) { - cy.focused().contains(text); + cy.focused() + .contains(text); } } - it('should be able to tab to header items', () => { - tabAndCheck('team-management', 'Teamverwaltung'); - tabAndCheck('help-button', 'Hilfe'); - tabAndCheck('user-options', 'Jaya Norris'); - cy.realPress('Enter'); - cy.pressUntilContains('Logout', 'ArrowDown'); - focusedShouldHaveTestId('logout'); - cy.realPress('Escape'); - tabAndCheck('quarterFilter', 'GJ'); - tabAndCheck('objectiveSearch'); + it("should be able to tab to header items", () => { + tabAndCheck("team-management", "Teamverwaltung"); + tabAndCheck("help-button", "Hilfe"); + tabAndCheck("user-options", "Jaya Norris"); + cy.realPress("Enter"); + cy.pressUntilContains("Logout", "ArrowDown"); + focusedShouldHaveTestId("logout"); + cy.realPress("Escape"); + tabAndCheck("quarterFilter", "GJ"); + tabAndCheck("objectiveSearch"); cy.tabForward(); cy.focused() - .children('img') + .children("img") .first() - .should('have.attr', 'src') - .and('match', /search-icon.svg/); + .should("have.attr", "src") + .and("match", /search-icon.svg/); cy.tabForward(); - cy.focused().contains('Alle'); + cy.focused() + .contains("Alle"); }); - it('should be able to tab to overview items', () => { - tabAndCheck('team-management', 'Teamverwaltung'); - tabAndCheck('add-objective', 'Objective hinzufügen'); - tabAndCheck('objective'); - tabAndCheck('three-dot-menu'); - tabAndCheck('key-result'); - tabAndCheck('add-keyResult', 'Key Result hinzufügen'); + it("should be able to tab to overview items", () => { + tabAndCheck("team-management", "Teamverwaltung"); + tabAndCheck("add-objective", "Objective hinzufügen"); + tabAndCheck("objective"); + tabAndCheck("three-dot-menu"); + tabAndCheck("key-result"); + tabAndCheck("add-keyResult", "Key Result hinzufügen"); }); - describe('Objective', () => { - it('should be able to tab objective dialog', () => { - tabAndCheck('add-objective', 'Objective hinzufügen'); - cy.realPress('Enter'); - cy.contains('h2', 'Objective für'); - tabAndCheck('title'); - cy.realType('title'); - tabAndCheck('description'); - cy.realType('description'); - tabAndCheck('quarterSelect'); - tabAndCheck('save-draft'); - tabAndCheck('save'); - tabAndCheck('cancel'); + describe("Objective", () => { + it("should be able to tab objective dialog", () => { + tabAndCheck("add-objective", "Objective hinzufügen"); + cy.realPress("Enter"); + cy.contains("h2", "Objective für"); + tabAndCheck("title"); + cy.realType("title"); + tabAndCheck("description"); + cy.realType("description"); + tabAndCheck("quarterSelect"); + tabAndCheck("save-draft"); + tabAndCheck("save"); + tabAndCheck("cancel"); }); - it('should focus three dot menu after edit objective', () => { - overviewPage.getObjectiveByState('ongoing').focus(); - tabAndCheck('three-dot-menu'); - cy.realPress('Enter'); - tabToThreeDotMenuOption('Objective bearbeiten'); - cy.contains('h2', 'Objective von'); - tabAndCheck('title'); - cy.realType('title'); - tabAndCheck('description'); - cy.realType('description'); - tabAndCheck('quarterSelect'); - tabAndCheck('cancel', 'Abbrechen'); - tabAndCheck('save', 'Speichern'); - cy.realPress('Enter'); - focusedShouldHaveTestId('three-dot-menu'); + it("should focus three dot menu after edit objective", () => { + overviewPage.getObjectiveByState("ongoing") + .focus(); + tabAndCheck("three-dot-menu"); + cy.realPress("Enter"); + tabToThreeDotMenuOption("Objective bearbeiten"); + cy.contains("h2", "Objective von"); + tabAndCheck("title"); + cy.realType("title"); + tabAndCheck("description"); + cy.realType("description"); + tabAndCheck("quarterSelect"); + tabAndCheck("cancel", "Abbrechen"); + tabAndCheck("save", "Speichern"); + cy.realPress("Enter"); + focusedShouldHaveTestId("three-dot-menu"); }); - it('should be able to complete and reopen objective', () => { - overviewPage.getObjectiveByState('ongoing').focus(); - tabAndCheck('three-dot-menu'); - cy.realPress('Enter'); - tabToThreeDotMenuOption('Objective abschliessen'); - cy.contains('h2', 'Objective abschliessen '); - focusedShouldHaveTestId('close-dialog'); + it("should be able to complete and reopen objective", () => { + overviewPage.getObjectiveByState("ongoing") + .focus(); + tabAndCheck("three-dot-menu"); + cy.realPress("Enter"); + tabToThreeDotMenuOption("Objective abschliessen"); + cy.contains("h2", "Objective abschliessen "); + focusedShouldHaveTestId("close-dialog"); cy.tabForward(); - cy.focused().contains('Objective erreicht'); - cy.realPress('Enter'); + cy.focused() + .contains("Objective erreicht"); + cy.realPress("Enter"); cy.tabForward(); - cy.focused().contains('Objective nicht erreicht'); - tabAndCheck('completeComment'); - tabAndCheck('cancel', 'Abbrechen'); - tabAndCheck('submit', 'Objective abschliessen'); - cy.realPress('Enter'); + cy.focused() + .contains("Objective nicht erreicht"); + tabAndCheck("completeComment"); + tabAndCheck("cancel", "Abbrechen"); + tabAndCheck("submit", "Objective abschliessen"); + cy.realPress("Enter"); - focusedShouldHaveTestId('three-dot-menu'); - cy.realPress('Enter'); + focusedShouldHaveTestId("three-dot-menu"); + cy.realPress("Enter"); - tabToThreeDotMenuOption('Objective wiedereröffnen'); - cy.contains('h2', 'Objective wiedereröffnen'); - focusedShouldHaveTestId('close-dialog'); - cy.contains('Soll dieses Objective wiedereröffnet werden?'); - tabAndCheck('confirm-no', 'Nein'); - tabAndCheck('confirm-yes', 'Ja'); - cy.realPress('Enter'); - focusedShouldHaveTestId('three-dot-menu'); + tabToThreeDotMenuOption("Objective wiedereröffnen"); + cy.contains("h2", "Objective wiedereröffnen"); + focusedShouldHaveTestId("close-dialog"); + cy.contains("Soll dieses Objective wiedereröffnet werden?"); + tabAndCheck("confirm-no", "Nein"); + tabAndCheck("confirm-yes", "Ja"); + cy.realPress("Enter"); + focusedShouldHaveTestId("three-dot-menu"); }); - it('should be able to set objective to draft and publish it', () => { - overviewPage.getObjectiveByState('ongoing').focus(); - tabAndCheck('three-dot-menu'); - cy.realPress('Enter'); - tabToThreeDotMenuOption('Objective als Draft speichern'); - cy.contains('h2', 'Objective als Draft speichern'); - focusedShouldHaveTestId('close-dialog'); - cy.contains('Soll dieses Objective als Draft gespeichert werden?'); - tabAndCheck('confirm-no', 'Nein'); - tabAndCheck('confirm-yes', 'Ja'); - cy.realPress('Enter'); + it("should be able to set objective to draft and publish it", () => { + overviewPage.getObjectiveByState("ongoing") + .focus(); + tabAndCheck("three-dot-menu"); + cy.realPress("Enter"); + tabToThreeDotMenuOption("Objective als Draft speichern"); + cy.contains("h2", "Objective als Draft speichern"); + focusedShouldHaveTestId("close-dialog"); + cy.contains("Soll dieses Objective als Draft gespeichert werden?"); + tabAndCheck("confirm-no", "Nein"); + tabAndCheck("confirm-yes", "Ja"); + cy.realPress("Enter"); - focusedShouldHaveTestId('three-dot-menu'); - cy.realPress('Enter'); + focusedShouldHaveTestId("three-dot-menu"); + cy.realPress("Enter"); - tabToThreeDotMenuOption('Objective veröffentlichen'); - cy.contains('h2', 'Objective veröffentlichen'); - focusedShouldHaveTestId('close-dialog'); - cy.contains('Soll dieses Objective veröffentlicht werden?'); - tabAndCheck('confirm-no', 'Nein'); - tabAndCheck('confirm-yes', 'Ja'); - cy.realPress('Enter'); - focusedShouldHaveTestId('three-dot-menu'); + tabToThreeDotMenuOption("Objective veröffentlichen"); + cy.contains("h2", "Objective veröffentlichen"); + focusedShouldHaveTestId("close-dialog"); + cy.contains("Soll dieses Objective veröffentlicht werden?"); + tabAndCheck("confirm-no", "Nein"); + tabAndCheck("confirm-yes", "Ja"); + cy.realPress("Enter"); + focusedShouldHaveTestId("three-dot-menu"); }); - it('should be able to open objective detail view', () => { - overviewPage.getObjectiveByState('ongoing').focus(); - cy.realPress('Enter').tabForward(); - focusedShouldHaveTestId('closeDrawer'); - tabAndCheck('add-keyResult-objective-detail', 'Key Result hinzufügen'); - tabAndCheck('edit-objective', 'Objective bearbeiten'); + it("should be able to open objective detail view", () => { + overviewPage.getObjectiveByState("ongoing") + .focus(); + cy.realPress("Enter") + .tabForward(); + focusedShouldHaveTestId("closeDrawer"); + tabAndCheck("add-keyResult-objective-detail", "Key Result hinzufügen"); + tabAndCheck("edit-objective", "Objective bearbeiten"); }); }); - describe('Keyresult & Check-In', () => { - it('Should be able to tab Keyresult dialog', () => { - tabAndCheck('add-keyResult', 'Key Result hinzufügen'); - cy.realPress('Enter'); - focusedShouldHaveTestId('close-dialog'); - tabAndCheck('titleInput'); - cy.focused().type('Title'); - tabAndCheck('unit'); - tabAndCheck('baseline'); - tabAndCheck('stretchGoal'); - tabAndCheck('ownerInput'); - tabAndCheck('descriptionInput'); - tabAndCheck('actionInput'); - tabAndCheck('add-action-plan-line', 'Weitere Action hinzufügen'); - tabAndCheck('ordinalTab', 'Ordinal'); - cy.realPress('Enter'); - tabAndCheck('commitZone'); - cy.focused().type('Commit'); - tabAndCheck('targetZone'); - cy.focused().type('Target'); - tabAndCheck('stretchZone'); - cy.focused().type('Stretch'); - tabAndCheck('submit', 'Speichern'); - tabAndCheck('saveAndNew', 'Speichern & Neu'); - tabAndCheck('cancel', 'Abbrechen'); + describe("Keyresult & Check-In", () => { + it("Should be able to tab Keyresult dialog", () => { + tabAndCheck("add-keyResult", "Key Result hinzufügen"); + cy.realPress("Enter"); + focusedShouldHaveTestId("close-dialog"); + tabAndCheck("titleInput"); + cy.focused() + .type("Title"); + tabAndCheck("unit"); + tabAndCheck("baseline"); + tabAndCheck("stretchGoal"); + tabAndCheck("ownerInput"); + tabAndCheck("descriptionInput"); + tabAndCheck("actionInput"); + tabAndCheck("add-action-plan-line", "Weitere Action hinzufügen"); + tabAndCheck("ordinalTab", "Ordinal"); + cy.realPress("Enter"); + tabAndCheck("commitZone"); + cy.focused() + .type("Commit"); + tabAndCheck("targetZone"); + cy.focused() + .type("Target"); + tabAndCheck("stretchZone"); + cy.focused() + .type("Stretch"); + tabAndCheck("submit", "Speichern"); + tabAndCheck("saveAndNew", "Speichern & Neu"); + tabAndCheck("cancel", "Abbrechen"); }); - it('Should tab keyresult detail view', () => { - overviewPage.getObjectiveByState('ongoing').findByTestId('key-result').first().focus(); - cy.realPress('Enter').tabForward(); - focusedShouldHaveTestId('close-drawer'); - tabAndCheck('show-all-checkins', 'Alle Check-ins anzeigen'); - cy.realPress('Enter'); - cy.contains('Check-in History'); - focusedShouldHaveTestId('close-dialog'); - tabAndCheck('edit-check-in'); - tabAndCheck('closeButton', 'Schliessen'); - cy.realPress('Enter'); - tabAndCheck('add-check-in', 'Check-in erfassen'); - tabAndCheck('edit-keyResult', 'Key Result bearbeiten'); + it("Should tab keyresult detail view", () => { + overviewPage.getObjectiveByState("ongoing") + .findByTestId("key-result") + .first() + .focus(); + cy.realPress("Enter") + .tabForward(); + focusedShouldHaveTestId("close-drawer"); + tabAndCheck("show-all-checkins", "Alle Check-ins anzeigen"); + cy.realPress("Enter"); + cy.contains("Check-in History"); + focusedShouldHaveTestId("close-dialog"); + tabAndCheck("edit-check-in"); + tabAndCheck("closeButton", "Schliessen"); + cy.realPress("Enter"); + tabAndCheck("add-check-in", "Check-in erfassen"); + tabAndCheck("edit-keyResult", "Key Result bearbeiten"); }); - it('Should tab create-check-in metric', () => { + it("Should tab create-check-in metric", () => { overviewPage .addOngoingKeyResult() - .fillKeyResultTitle('A metric Keyresult for tabbing tests') - .withMetricValues(Unit.CHF, '10', '100') + .fillKeyResultTitle("A metric Keyresult for tabbing tests") + .withMetricValues(Unit.CHF, "10", "100") .submit(); - KeyResultDetailPage.do().visit('A metric Keyresult for tabbing tests'); - tabAndCheck('add-check-in', 'Check-in erfassen'); - cy.realPress('Enter'); - cy.contains('Check-in erfassen'); - focusedShouldHaveTestId('close-dialog'); - tabAndCheck('changeInfo'); - tabAndCheck('check-in-metric-value'); - cy.focused().type('20'); - tabAndCheck('initiatives'); - cy.contains('5/10'); + KeyResultDetailPage.do() + .visit("A metric Keyresult for tabbing tests"); + tabAndCheck("add-check-in", "Check-in erfassen"); + cy.realPress("Enter"); + cy.contains("Check-in erfassen"); + focusedShouldHaveTestId("close-dialog"); + tabAndCheck("changeInfo"); + tabAndCheck("check-in-metric-value"); + cy.focused() + .type("20"); + tabAndCheck("initiatives"); + cy.contains("5/10"); cy.tabForward(); - cy.realPress('ArrowLeft'); - cy.contains('4/10'); - tabAndCheck('submit-check-in', 'Check-in speichern'); - tabAndCheck('cancel', 'Abbrechen'); + cy.realPress("ArrowLeft"); + cy.contains("4/10"); + tabAndCheck("submit-check-in", "Check-in speichern"); + tabAndCheck("cancel", "Abbrechen"); }); - it('Should tab create-check-in ordinal', () => { + it("Should tab create-check-in ordinal", () => { overviewPage .addOngoingKeyResult() - .fillKeyResultTitle('A ordinal Keyresult for tabbing tests') - .withOrdinalValues('Commit', 'Target', 'Stretch') + .fillKeyResultTitle("A ordinal Keyresult for tabbing tests") + .withOrdinalValues("Commit", "Target", "Stretch") .submit(); - KeyResultDetailPage.do().visit('A ordinal Keyresult for tabbing tests'); - tabAndCheck('add-check-in', 'Check-in erfassen'); - cy.realPress('Enter'); - cy.contains('Check-in erfassen'); - focusedShouldHaveTestId('close-dialog'); - tabAndCheck('changeInfo'); + KeyResultDetailPage.do() + .visit("A ordinal Keyresult for tabbing tests"); + tabAndCheck("add-check-in", "Check-in erfassen"); + cy.realPress("Enter"); + cy.contains("Check-in erfassen"); + focusedShouldHaveTestId("close-dialog"); + tabAndCheck("changeInfo"); cy.tabForward(); - cy.focused().closest('mat-radio-button').should('have.attr', 'data-testId', 'fail-radio'); - cy.realPress('ArrowDown'); - cy.focused().closest('mat-radio-button').should('have.attr', 'data-testId', 'commit-radio'); - cy.realPress('ArrowDown'); - cy.focused().closest('mat-radio-button').should('have.attr', 'data-testId', 'target-radio'); - cy.realPress('ArrowDown'); - cy.focused().closest('mat-radio-button').should('have.attr', 'data-testId', 'stretch-radio'); - tabAndCheck('initiatives'); - cy.contains('5/10'); + cy.focused() + .closest("mat-radio-button") + .should("have.attr", "data-testId", "fail-radio"); + cy.realPress("ArrowDown"); + cy.focused() + .closest("mat-radio-button") + .should("have.attr", "data-testId", "commit-radio"); + cy.realPress("ArrowDown"); + cy.focused() + .closest("mat-radio-button") + .should("have.attr", "data-testId", "target-radio"); + cy.realPress("ArrowDown"); + cy.focused() + .closest("mat-radio-button") + .should("have.attr", "data-testId", "stretch-radio"); + tabAndCheck("initiatives"); + cy.contains("5/10"); cy.tabForward(); - cy.realPress('ArrowLeft'); - cy.contains('4/10'); - tabAndCheck('submit-check-in', 'Check-in speichern'); - tabAndCheck('cancel', 'Abbrechen'); + cy.realPress("ArrowLeft"); + cy.contains("4/10"); + tabAndCheck("submit-check-in", "Check-in speichern"); + tabAndCheck("cancel", "Abbrechen"); }); }); - describe('Team management', () => { - it('Should tab team management', () => { - tabAndCheck('team-management', 'Teamverwaltung'); - cy.realPress('Enter'); - tabAndCheck('routerLink-to-overview', 'Zurück zur OKR Übersicht'); - tabAndCheck('teamManagementSearch'); - tabAndCheck('add-team', 'Team erfassen'); - tabAndCheck('all-teams-selector', 'Alle Teams (4)'); - tabAndCheck('invite-member', 'Member registrieren'); + describe("Team management", () => { + it("Should tab team management", () => { + tabAndCheck("team-management", "Teamverwaltung"); + cy.realPress("Enter"); + tabAndCheck("routerLink-to-overview", "Zurück zur OKR Übersicht"); + tabAndCheck("teamManagementSearch"); + tabAndCheck("add-team", "Team erfassen"); + tabAndCheck("all-teams-selector", "Alle Teams (4)"); + tabAndCheck("invite-member", "Member registrieren"); }); - it('Should tab create team', () => { - cy.getByTestId('team-management').click(); - tabAndCheck('add-team'); - cy.realPress('Enter'); - cy.contains('Team erfassen'); - focusedShouldHaveTestId('close-dialog'); - tabAndCheck('add-team-name'); - cy.focused().type('Name of new team'); - tabAndCheck('save', 'Speichern'); - tabAndCheck('cancel', 'Abbrechen'); + it("Should tab create team", () => { + cy.getByTestId("team-management") + .click(); + tabAndCheck("add-team"); + cy.realPress("Enter"); + cy.contains("Team erfassen"); + focusedShouldHaveTestId("close-dialog"); + tabAndCheck("add-team-name"); + cy.focused() + .type("Name of new team"); + tabAndCheck("save", "Speichern"); + tabAndCheck("cancel", "Abbrechen"); }); - it('Should tab register member', () => { - cy.getByTestId('team-management').click(); - tabAndCheck('invite-member'); - cy.realPress('Enter'); - cy.contains('Member registrieren'); - focusedShouldHaveTestId('close-dialog'); - tabAndCheck('new-member-first-name'); - tabAndCheck('new-member-last-name'); - tabAndCheck('email-col_0'); + it("Should tab register member", () => { + cy.getByTestId("team-management") + .click(); + tabAndCheck("invite-member"); + cy.realPress("Enter"); + cy.contains("Member registrieren"); + focusedShouldHaveTestId("close-dialog"); + tabAndCheck("new-member-first-name"); + tabAndCheck("new-member-last-name"); + tabAndCheck("email-col_0"); cy.tabForward(); - cy.focused().closest('app-puzzle-icon-button').should('have.attr', 'icon', 'delete-icon.svg'); - tabAndCheck('new-member-add-row', 'Weiterer Member hinzufügen'); - tabAndCheck('invite', 'Einladen'); - tabAndCheck('new-member-cancel', 'Abbrechen'); + cy.focused() + .closest("app-puzzle-icon-button") + .should("have.attr", "icon", "delete-icon.svg"); + tabAndCheck("new-member-add-row", "Weiterer Member hinzufügen"); + tabAndCheck("invite", "Einladen"); + tabAndCheck("new-member-cancel", "Abbrechen"); }); - it('Should tab edit member', () => { - cy.getByTestId('team-management').click(); - cy.pressUntilContains('Alice Wunderland', 'Tab'); + it("Should tab edit member", () => { + cy.getByTestId("team-management") + .click(); + cy.pressUntilContains("Alice Wunderland", "Tab"); cy.tabForward(); - cy.realPress('Enter'); + cy.realPress("Enter"); cy.tabForward(); - focusedShouldHaveTestId('close-drawer'); + focusedShouldHaveTestId("close-drawer"); // Field to toggle if user is OKR-Champion cy.tabForward(); - cy.focused().closest('app-puzzle-icon-button').should('have.attr', 'icon', 'edit.svg'); - cy.realPress('Enter'); + cy.focused() + .closest("app-puzzle-icon-button") + .should("have.attr", "icon", "edit.svg"); + cy.realPress("Enter"); cy.tabForward(); - tabAndCheck('close-drawer'); + tabAndCheck("close-drawer"); cy.tabForward(); - cy.focused().closest('mat-checkbox').should('have.attr', 'data-testId', 'edit-okr-champion-checkbox'); + cy.focused() + .closest("mat-checkbox") + .should("have.attr", "data-testId", "edit-okr-champion-checkbox"); // Field to edit role of assigned team cy.tabForward(); - cy.focused().closest('app-puzzle-icon-button').should('have.attr', 'icon', 'edit.svg'); - cy.realPress('Enter'); + cy.focused() + .closest("app-puzzle-icon-button") + .should("have.attr", "icon", "edit.svg"); + cy.realPress("Enter"); cy.tabForward(); - tabAndCheck('select-team-role', 'Team-Member'); + tabAndCheck("select-team-role", "Team-Member"); // Button to delete assigned team cy.tabForward(); - cy.focused().closest('app-puzzle-icon-button').should('have.attr', 'icon', 'delete-icon.svg'); + cy.focused() + .closest("app-puzzle-icon-button") + .should("have.attr", "icon", "delete-icon.svg"); // Button to add user to another team - tabAndCheck('add-user'); - cy.realPress('Enter'); + tabAndCheck("add-user"); + cy.realPress("Enter"); cy.tabForward(); - tabAndCheck('select-team-dropdown', 'Puzzle ITC'); - tabAndCheck('select-team-role', 'Team-Member'); - tabAndCheck('add-user-to-team-save', 'Hinzufügen'); - tabAndCheck('add-user-to-team-cancel', 'Abbrechen'); + tabAndCheck("select-team-dropdown", "Puzzle ITC"); + tabAndCheck("select-team-role", "Team-Member"); + tabAndCheck("add-user-to-team-save", "Hinzufügen"); + tabAndCheck("add-user-to-team-cancel", "Abbrechen"); }); }); }); function tabToThreeDotMenuOption(name: string) { - cy.pressUntilContains(name, 'ArrowDown'); - cy.realPress('Enter'); + cy.pressUntilContains(name, "ArrowDown"); + cy.realPress("Enter"); } diff --git a/frontend/cypress/e2e/team.cy.ts b/frontend/cypress/e2e/team.cy.ts index 405eb2c993..f151a0685e 100644 --- a/frontend/cypress/e2e/team.cy.ts +++ b/frontend/cypress/e2e/team.cy.ts @@ -1,124 +1,144 @@ -import * as users from '../fixtures/users.json'; -import FilterHelper from '../support/helper/dom-helper/filterHelper'; -import CyOverviewPage from '../support/helper/dom-helper/pages/overviewPage'; -import TeammanagementPage from '../support/helper/dom-helper/pages/teammanagementPage'; +import * as users from "../fixtures/users.json"; +import FilterHelper from "../support/helper/dom-helper/filterHelper"; +import CyOverviewPage from "../support/helper/dom-helper/pages/overviewPage"; +import TeammanagementPage from "../support/helper/dom-helper/pages/teammanagementPage"; -describe('OKR team e2e tests', () => { - describe('tests via click', () => { +describe("OKR team e2e tests", () => { + describe("tests via click", () => { beforeEach(() => { cy.loginAsUser(users.gl); - CyOverviewPage.do().visitCurrentQuarter(); + CyOverviewPage.do() + .visitCurrentQuarter(); }); - it('Should select teams from teamfilter', () => { + it("Should select teams from teamfilter", () => { const filterHelper = FilterHelper.do() - .optionShouldBeSelected('Puzzle ITC') - .optionShouldBeSelected('LoremIpsum') - .optionShouldNotBeSelected('Alle') - .optionShouldNotBeSelected('/BBT') - .optionShouldNotBeSelected('we are cube'); + .optionShouldBeSelected("Puzzle ITC") + .optionShouldBeSelected("LoremIpsum") + .optionShouldNotBeSelected("Alle") + .optionShouldNotBeSelected("/BBT") + .optionShouldNotBeSelected("we are cube"); filterHelper - .toggleOption('Alle') - .optionShouldBeSelected('Alle', false) - .optionShouldBeSelected('/BBT') - .optionShouldBeSelected('Puzzle ITC') - .optionShouldBeSelected('LoremIpsum') - .optionShouldBeSelected('we are cube'); + .toggleOption("Alle") + .optionShouldBeSelected("Alle", false) + .optionShouldBeSelected("/BBT") + .optionShouldBeSelected("Puzzle ITC") + .optionShouldBeSelected("LoremIpsum") + .optionShouldBeSelected("we are cube"); filterHelper - .toggleOption('/BBT') - .optionShouldBeSelected('/BBT') - .optionShouldNotBeSelected('Alle') - .optionShouldNotBeSelected('Puzzle ITC') - .optionShouldNotBeSelected('LoremIpsum') - .optionShouldNotBeSelected('we are cube'); + .toggleOption("/BBT") + .optionShouldBeSelected("/BBT") + .optionShouldNotBeSelected("Alle") + .optionShouldNotBeSelected("Puzzle ITC") + .optionShouldNotBeSelected("LoremIpsum") + .optionShouldNotBeSelected("we are cube"); filterHelper - .toggleOption('Puzzle ITC') - .optionShouldBeSelected('/BBT') - .optionShouldNotBeSelected('Alle') - .optionShouldBeSelected('Puzzle ITC') - .optionShouldNotBeSelected('LoremIpsum') - .optionShouldNotBeSelected('we are cube'); + .toggleOption("Puzzle ITC") + .optionShouldBeSelected("/BBT") + .optionShouldNotBeSelected("Alle") + .optionShouldBeSelected("Puzzle ITC") + .optionShouldNotBeSelected("LoremIpsum") + .optionShouldNotBeSelected("we are cube"); }); - it('Deselect all teams from filter will display text on overview', () => { + it("Deselect all teams from filter will display text on overview", () => { const filterHelper = FilterHelper.do() - .optionShouldBeSelected('Puzzle ITC') - .optionShouldBeSelected('LoremIpsum') - .optionShouldNotBeSelected('Alle') - .optionShouldNotBeSelected('/BBT') - .optionShouldNotBeSelected('we are cube'); + .optionShouldBeSelected("Puzzle ITC") + .optionShouldBeSelected("LoremIpsum") + .optionShouldNotBeSelected("Alle") + .optionShouldNotBeSelected("/BBT") + .optionShouldNotBeSelected("we are cube"); - filterHelper.toggleOption('Puzzle ITC').toggleOption('LoremIpsum'); + filterHelper.toggleOption("Puzzle ITC") + .toggleOption("LoremIpsum"); - cy.contains('Kein Team ausgewählt'); + cy.contains("Kein Team ausgewählt"); }); - it('URL changes to the selected teams', () => { + it("URL changes to the selected teams", () => { const filterHelper = FilterHelper.do() - .optionShouldBeSelected('Puzzle ITC') - .optionShouldBeSelected('LoremIpsum') - .optionShouldNotBeSelected('Alle') - .optionShouldNotBeSelected('/BBT') - .optionShouldNotBeSelected('we are cube'); - - filterHelper.validateUrlParameter('teams', ['5', '6']); - - filterHelper.toggleOption('/BBT').validateUrlParameter('teams', ['4', '5', '6']); - filterHelper.toggleOption('Puzzle ITC').toggleOption('LoremIpsum').toggleOption('/BBT'); - cy.url().should('not.include', 'teams='); + .optionShouldBeSelected("Puzzle ITC") + .optionShouldBeSelected("LoremIpsum") + .optionShouldNotBeSelected("Alle") + .optionShouldNotBeSelected("/BBT") + .optionShouldNotBeSelected("we are cube"); + + filterHelper.validateUrlParameter("teams", ["5", "6"]); + + filterHelper.toggleOption("/BBT") + .validateUrlParameter("teams", ["4", "5", "6"]); + filterHelper.toggleOption("Puzzle ITC") + .toggleOption("LoremIpsum") + .toggleOption("/BBT"); + cy.url() + .should("not.include", "teams="); }); - it('Select teams by url', () => { - cy.url().should('not.include', 'teams'); + it("Select teams by url", () => { + cy.url() + .should("not.include", "teams"); - cy.visit('/?quarter=2&teams=4,5,8'); + cy.visit("/?quarter=2&teams=4,5,8"); FilterHelper.do() - .optionShouldNotBeSelected('Alle') - .optionShouldBeSelected('/BBT') - .optionShouldBeSelected('Puzzle ITC') - .optionShouldBeSelected('we are cube') - .optionShouldNotBeSelected('LoremIpsum'); + .optionShouldNotBeSelected("Alle") + .optionShouldBeSelected("/BBT") + .optionShouldBeSelected("Puzzle ITC") + .optionShouldBeSelected("we are cube") + .optionShouldNotBeSelected("LoremIpsum"); }); - it('should display less button on mobile header', () => { - let teammanagementPage = TeammanagementPage.do().visitViaURL(); - cy.intercept('POST', '**/teams').as('addTeam'); - - teammanagementPage.addTeam().fillName('X-Team').submit(); - cy.wait('@addTeam'); - cy.contains('X-Team'); - teammanagementPage.addTeam().fillName('Y-Team').submit(); - cy.wait('@addTeam'); - cy.contains('Y-Team'); - teammanagementPage.addTeam().fillName('Z-Team').submit(); - cy.wait('@addTeam'); - cy.contains('Z-Team'); + it("should display less button on mobile header", () => { + const teammanagementPage = TeammanagementPage.do() + .visitViaURL(); + cy.intercept("POST", "**/teams") + .as("addTeam"); + + teammanagementPage.addTeam() + .fillName("X-Team") + .submit(); + cy.wait("@addTeam"); + cy.contains("X-Team"); + teammanagementPage.addTeam() + .fillName("Y-Team") + .submit(); + cy.wait("@addTeam"); + cy.contains("Y-Team"); + teammanagementPage.addTeam() + .fillName("Z-Team") + .submit(); + cy.wait("@addTeam"); + cy.contains("Z-Team"); teammanagementPage.visitOverview(); // set viewport to < 768 to trigger mobile header cy.viewport(767, 1200); - cy.getByTestId('expansion-panel-header').click(); - cy.contains('Weniger'); + cy.getByTestId("expansion-panel-header") + .click(); + cy.contains("Weniger"); // reset viewport - cy.viewport(Cypress.config('viewportWidth'), Cypress.config('viewportHeight')); + cy.viewport(Cypress.config("viewportWidth"), Cypress.config("viewportHeight")); cy.visit(`${teammanagementPage.getURL()}`); - cy.intercept('DELETE', '**/teams/*').as('deleteTeam'); + cy.intercept("DELETE", "**/teams/*") + .as("deleteTeam"); - teammanagementPage.deleteTeam('X-Team').submit(); - cy.wait('@deleteTeam'); + teammanagementPage.deleteTeam("X-Team") + .submit(); + cy.wait("@deleteTeam"); - teammanagementPage.deleteTeam('Y-Team').submit(); - cy.wait('@deleteTeam'); + teammanagementPage.deleteTeam("Y-Team") + .submit(); + cy.wait("@deleteTeam"); - teammanagementPage.deleteTeam('Z-Team').submit(); - cy.wait('@deleteTeam'); + teammanagementPage.deleteTeam("Z-Team") + .submit(); + cy.wait("@deleteTeam"); }); }); }); diff --git a/frontend/cypress/e2e/teammanagement.cy.ts b/frontend/cypress/e2e/teammanagement.cy.ts index 5603e88143..ec0f7875b6 100644 --- a/frontend/cypress/e2e/teammanagement.cy.ts +++ b/frontend/cypress/e2e/teammanagement.cy.ts @@ -1,230 +1,303 @@ -import * as users from '../fixtures/users.json'; -import { uniqueSuffix } from '../support/helper/utils'; -import ConfirmDialog from '../support/helper/dom-helper/dialogs/confirmDialog'; -import TeammanagementPage from '../support/helper/dom-helper/pages/teammanagementPage'; -import CyOverviewPage from '../support/helper/dom-helper/pages/overviewPage'; -import InviteMembersDialog from '../support/helper/dom-helper/dialogs/inviteMembersDialog'; -import FilterHelper from '../support/helper/dom-helper/filterHelper'; - -describe('Team management tests', () => { - const teamName = uniqueSuffix('New Team'); +import * as users from "../fixtures/users.json"; +import { uniqueSuffix } from "../support/helper/utils"; +import ConfirmDialog from "../support/helper/dom-helper/dialogs/confirmDialog"; +import TeammanagementPage from "../support/helper/dom-helper/pages/teammanagementPage"; +import CyOverviewPage from "../support/helper/dom-helper/pages/overviewPage"; +import InviteMembersDialog from "../support/helper/dom-helper/dialogs/inviteMembersDialog"; +import FilterHelper from "../support/helper/dom-helper/filterHelper"; + +describe("Team management tests", () => { + const teamName = uniqueSuffix("New Team"); const nameEsha = users.bl.name; - describe('Routing to overview', () => { + describe("Routing to overview", () => { beforeEach(() => { cy.loginAsUser(users.gl); }); - it('should preserve team filter', () => { - CyOverviewPage.do().visitViaURL(); - FilterHelper.do().toggleOption('/BBT').toggleOption('Puzzle ITC'); + it("should preserve team filter", () => { + CyOverviewPage.do() + .visitViaURL(); + FilterHelper.do() + .toggleOption("/BBT") + .toggleOption("Puzzle ITC"); checkTeamsSelected(); - CyOverviewPage.do().visitTeammanagement(); + CyOverviewPage.do() + .visitTeammanagement(); checkTeamsSelected(); - TeammanagementPage.do().backToOverview(); + TeammanagementPage.do() + .backToOverview(); checkTeamsSelected(); - CyOverviewPage.do().visitTeammanagement(); - TeammanagementPage.do().visitOverview(); + CyOverviewPage.do() + .visitTeammanagement(); + TeammanagementPage.do() + .visitOverview(); checkTeamsSelected(); }); function checkTeamsSelected() { - FilterHelper.do().optionShouldBeSelected('LoremIpsum').optionShouldBeSelected('/BBT'); + FilterHelper.do() + .optionShouldBeSelected("LoremIpsum") + .optionShouldBeSelected("/BBT"); } }); - describe('As GL', () => { + describe("As GL", () => { let teammanagementPage: TeammanagementPage; before(() => { // login as bl to ensure this user exists in database cy.loginAsUser(users.bl); - cy.getByTestId('user-name').click(); - cy.getByTestId('logout').click(); + cy.getByTestId("user-name") + .click(); + cy.getByTestId("logout") + .click(); }); beforeEach(() => { cy.loginAsUser(users.gl); - teammanagementPage = TeammanagementPage.do().visitViaURL(); + teammanagementPage = TeammanagementPage.do() + .visitViaURL(); }); - it('Create team', () => { - cy.intercept('POST', '**/teams').as('addTeam'); + it("Create team", () => { + cy.intercept("POST", "**/teams") + .as("addTeam"); - teammanagementPage.addTeam().fillName(teamName).submit(); - cy.wait('@addTeam'); + teammanagementPage.addTeam() + .fillName(teamName) + .submit(); + cy.wait("@addTeam"); cy.contains(teamName); }); - it('Try to remove last admin of team should not work', () => { - cy.intercept('PUT', '**/removeuser').as('removeUser'); + it("Try to remove last admin of team should not work", () => { + cy.intercept("PUT", "**/removeuser") + .as("removeUser"); - cy.get('app-team-list .mat-mdc-list-item').contains(teamName).click(); - cy.getByTestId('member-list-more').click(); - cy.getByTestId('remove-from-member-list').click(); + cy.get("app-team-list .mat-mdc-list-item") + .contains(teamName) + .click(); + cy.getByTestId("member-list-more") + .click(); + cy.getByTestId("remove-from-member-list") + .click(); ConfirmDialog.do() - .checkTitle('Mitglied entfernen') + .checkTitle("Mitglied entfernen") .checkDescription(`Möchtest du Jaya Norris wirklich aus dem Team '${teamName}' entfernen?`) .submit(); - cy.wait('@removeUser'); + cy.wait("@removeUser"); - cy.contains('Der letzte Administrator eines Teams kann nicht entfernt werden').should('exist'); + cy.contains("Der letzte Administrator eines Teams kann nicht entfernt werden") + .should("exist"); }); - it('clicking cancel in dialog when removing user should not remove user', () => { - cy.intercept('PUT', '**/removeuser').as('removeUser'); + it("clicking cancel in dialog when removing user should not remove user", () => { + cy.intercept("PUT", "**/removeuser") + .as("removeUser"); - cy.get('app-team-list .mat-mdc-list-item').contains(teamName).click(); - cy.getByTestId('member-list-more').click(); - cy.getByTestId('remove-from-member-list').click(); + cy.get("app-team-list .mat-mdc-list-item") + .contains(teamName) + .click(); + cy.getByTestId("member-list-more") + .click(); + cy.getByTestId("remove-from-member-list") + .click(); // cancel dialog ConfirmDialog.do() - .checkTitle('Mitglied entfernen') + .checkTitle("Mitglied entfernen") .checkDescription(`Möchtest du Jaya Norris wirklich aus dem Team '${teamName}' entfernen?`) .cancel(); - cy.get('@removeUser.all').then((interceptions) => { - expect(interceptions).to.have.length(0); - }); + cy.get("@removeUser.all") + .then((interceptions) => { + expect(interceptions).to.have.length(0); + }); }); - it('Edit team', () => { - cy.intercept('GET', '**/users').as('getUsers'); - cy.intercept('GET', '**/teams').as('getTeams'); + it("Edit team", () => { + cy.intercept("GET", "**/users") + .as("getUsers"); + cy.intercept("GET", "**/teams") + .as("getTeams"); - cy.get('app-team-list .mat-mdc-list-item').contains('LoremIpsum').click(); - editTeamNameAndTest('IpsumLorem'); - cy.visit('team-management'); + cy.get("app-team-list .mat-mdc-list-item") + .contains("LoremIpsum") + .click(); + editTeamNameAndTest("IpsumLorem"); + cy.visit("team-management"); - cy.wait(['@getUsers', '@getTeams']); + cy.wait(["@getUsers", "@getTeams"]); - cy.contains('LoremIpsum').should('not.exist'); - cy.contains('IpsumLorem').should('exist'); + cy.contains("LoremIpsum") + .should("not.exist"); + cy.contains("IpsumLorem") + .should("exist"); // set old team name again - cy.get('app-team-list .mat-mdc-list-item').contains('IpsumLorem').click(); - editTeamNameAndTest('LoremIpsum'); + cy.get("app-team-list .mat-mdc-list-item") + .contains("IpsumLorem") + .click(); + editTeamNameAndTest("LoremIpsum"); }); - it('Delete team', () => { + it("Delete team", () => { //Click delete button and cancel - teammanagementPage.deleteTeam(teamName).cancel(); + teammanagementPage.deleteTeam(teamName) + .cancel(); // try again and confirm dialog - teammanagementPage.deleteTeam(teamName).submit(); + teammanagementPage.deleteTeam(teamName) + .submit(); }); - describe('Search', () => { - it('Search user', () => { + describe("Search", () => { + it("Search user", () => { teammanagementPage.elements .teamSearch() - .fill('pa') - .shouldHaveOption('Paco Eggimann (peggimann@puzzle.ch)') - .shouldHaveOption('Paco Egiman (egiman@puzzle.ch)') - .selectOption('Robin Papierer (papierer@puzzle.ch)'); + .fill("pa") + .shouldHaveOption("Paco Eggimann (peggimann@puzzle.ch)") + .shouldHaveOption("Paco Egiman (egiman@puzzle.ch)") + .selectOption("Robin Papierer (papierer@puzzle.ch)"); - cy.contains('app-member-detail h2', 'Robin Papierer'); + cy.contains("app-member-detail h2", "Robin Papierer"); }); - it('Search team', () => { - teammanagementPage.elements.teamSearch().fill('we are').selectOption('we are cube.³'); + it("Search team", () => { + teammanagementPage.elements.teamSearch() + .fill("we are") + .selectOption("we are cube.³"); - cy.contains('app-member-list h2', 'we are cube.³'); + cy.contains("app-member-list h2", "we are cube.³"); }); - it('Search mixed', () => { + it("Search mixed", () => { teammanagementPage.elements .teamSearch() - .fill('puz') - .shouldHaveLabel('Members') - .shouldHaveLabel('Teams') - .shouldHaveOption('Paco Eggimann (peggimann@puzzle.ch)') - .shouldHaveOption('Paco Egiman (egiman@puzzle.ch)') - .shouldHaveOption('Robin Papierer (papierer@puzzle.ch)') - .shouldHaveOption('Puzzle ITC'); + .fill("puz") + .shouldHaveLabel("Members") + .shouldHaveLabel("Teams") + .shouldHaveOption("Paco Eggimann (peggimann@puzzle.ch)") + .shouldHaveOption("Paco Egiman (egiman@puzzle.ch)") + .shouldHaveOption("Robin Papierer (papierer@puzzle.ch)") + .shouldHaveOption("Puzzle ITC"); }); }); - describe('invite members', () => { - it('invite two members', () => { - teammanagementPage.elements.registerMember().click(); + describe("invite members", () => { + it("invite two members", () => { + teammanagementPage.elements.registerMember() + .click(); const firstNames = InviteMembersDialog.do() - .enterUser('Claudia', 'Meier', 'claudia.meier@test.ch') + .enterUser("Claudia", "Meier", "claudia.meier@test.ch") .addAnotherUser() - .enterUser('Stefan', 'Schmidt', 'stefan.schmidt@test.ch') + .enterUser("Stefan", "Schmidt", "stefan.schmidt@test.ch") .addAnotherUser() .getFirstNames(); // test error messages - fillOutNewUser('Robin', '', 'papierer'); - cy.getByTestId('invite').click(); - cy.contains('Angabe benötigt'); - cy.contains('E-Mail ungültig'); - cy.getByTestId('email-col_2').focus(); - cy.realType('@puzzle.ch'); - cy.contains('E-Mail ungültig').should('not.exist'); - cy.contains('E-Mail existiert bereits'); + fillOutNewUser("Robin", "", "papierer"); + cy.getByTestId("invite") + .click(); + cy.contains("Angabe benötigt"); + cy.contains("E-Mail ungültig"); + cy.getByTestId("email-col_2") + .focus(); + cy.realType("@puzzle.ch"); + cy.contains("E-Mail ungültig") + .should("not.exist"); + cy.contains("E-Mail existiert bereits"); cy.tabBackward(); - cy.realType('Papirer'); - cy.contains('Angabe benötigt').should('not.exist'); + cy.realType("Papirer"); + cy.contains("Angabe benötigt") + .should("not.exist"); // delete last entry cy.tabForward(); cy.tabForward(); - cy.realPress('Enter'); - cy.contains('papiererr@puzzle.ch').should('not.exist'); + cy.realPress("Enter"); + cy.contains("papiererr@puzzle.ch") + .should("not.exist"); // save - cy.getByTestId('invite').click(); - cy.contains('Die Members wurden erfolgreich registriert'); + cy.getByTestId("invite") + .click(); + cy.contains("Die Members wurden erfolgreich registriert"); firstNames.forEach((email) => cy.contains(email)); }); }); - it('Navigate to Bobs profile and add him to BBT and LoremIpsum', () => { - cy.intercept('PUT', '**/updateaddteammembership/*').as('updateEsha'); + it("Navigate to Bobs profile and add him to BBT and LoremIpsum", () => { + cy.intercept("PUT", "**/updateaddteammembership/*") + .as("updateEsha"); navigateToUser(nameEsha); // add to team bbt as admin - cy.get('app-member-detail').findByTestId('add-user').click(); - cy.get('app-member-detail').findByTestId('select-team-dropdown').click(); - cy.getByTestId('select-team-dropdown-option').contains('/BBT').click(); - cy.get('app-member-detail').findByTestId('select-team-role').click(); - cy.getByTestId('select-team-role-admin').click(); - cy.get('app-member-detail').findByTestId('add-user-to-team-save').click(); + cy.get("app-member-detail") + .findByTestId("add-user") + .click(); + cy.get("app-member-detail") + .findByTestId("select-team-dropdown") + .click(); + cy.getByTestId("select-team-dropdown-option") + .contains("/BBT") + .click(); + cy.get("app-member-detail") + .findByTestId("select-team-role") + .click(); + cy.getByTestId("select-team-role-admin") + .click(); + cy.get("app-member-detail") + .findByTestId("add-user-to-team-save") + .click(); - cy.wait('@updateEsha'); + cy.wait("@updateEsha"); // add to team loremipsum as member - cy.get('app-member-detail').findByTestId('add-user').click(); - cy.get('app-member-detail').findByTestId('select-team-dropdown').click(); + cy.get("app-member-detail") + .findByTestId("add-user") + .click(); + cy.get("app-member-detail") + .findByTestId("select-team-dropdown") + .click(); // team BBT should not be in list anymore - cy.getByTestId('select-team-dropdown-option').should('not.contain', '/BBT'); + cy.getByTestId("select-team-dropdown-option") + .should("not.contain", "/BBT"); - cy.getByTestId('select-team-dropdown-option').contains('LoremIpsum').click(); - cy.get('app-member-detail').findByTestId('select-team-role').click(); - cy.getByTestId('select-team-role-member').click(); - cy.get('app-member-detail').findByTestId('add-user-to-team-save').click(); + cy.getByTestId("select-team-dropdown-option") + .contains("LoremIpsum") + .click(); + cy.get("app-member-detail") + .findByTestId("select-team-role") + .click(); + cy.getByTestId("select-team-role-member") + .click(); + cy.get("app-member-detail") + .findByTestId("add-user-to-team-save") + .click(); - cy.wait('@updateEsha'); + cy.wait("@updateEsha"); // check table checkRolesForEsha(); closeOverlay(); let foundEsha = false; - cy.get('app-member-list tbody tr') + cy.get("app-member-list tbody tr") .each(($row) => { - let usernameCell = $row.find('td:nth-child(2)'); - if (usernameCell.text().trim() === nameEsha) { + const usernameCell = $row.find("td:nth-child(2)"); + if (usernameCell.text() + .trim() === nameEsha) { foundEsha = true; - let roleCell = $row.find('td:nth-child(3)'); - let teamsCell = $row.find('td:nth-child(4)'); - expect(roleCell.text().trim()).to.equal('Team-Admin, Team-Member'); - expect(teamsCell.text().trim()).to.equal('/BBT, LoremIpsum'); + const roleCell = $row.find("td:nth-child(3)"); + const teamsCell = $row.find("td:nth-child(4)"); + expect(roleCell.text() + .trim()).to.equal("Team-Admin, Team-Member"); + expect(teamsCell.text() + .trim()).to.equal("/BBT, LoremIpsum"); return false; } return true; @@ -234,191 +307,280 @@ describe('Team management tests', () => { }); }); - it('Navigate to user Esha and set as okr champion', () => { + it("Navigate to user Esha and set as okr champion", () => { navigateToUser(nameEsha); - cy.getByTestId('edit-okr-champion-readonly').contains('OKR Champion:'); - cy.getByTestId('edit-okr-champion-readonly').contains('Nein'); - cy.getByTestId('edit-okr-champion-edit').click(); - cy.getByTestId('edit-okr-champion-readonly').should('not.exist'); - cy.getByTestId('edit-okr-champion-checkbox').click(); - cy.getByTestId('edit-okr-champion-readonly').contains('OKR Champion:'); - cy.getByTestId('edit-okr-champion-readonly').contains('Ja'); - cy.contains('Der Member wurde erfolgreich aktualisiert.'); + cy.getByTestId("edit-okr-champion-readonly") + .contains("OKR Champion:"); + cy.getByTestId("edit-okr-champion-readonly") + .contains("Nein"); + cy.getByTestId("edit-okr-champion-edit") + .click(); + cy.getByTestId("edit-okr-champion-readonly") + .should("not.exist"); + cy.getByTestId("edit-okr-champion-checkbox") + .click(); + cy.getByTestId("edit-okr-champion-readonly") + .contains("OKR Champion:"); + cy.getByTestId("edit-okr-champion-readonly") + .contains("Ja"); + cy.contains("Der Member wurde erfolgreich aktualisiert."); // reset okr champion to false - cy.getByTestId('edit-okr-champion-edit').click(); - cy.getByTestId('edit-okr-champion-checkbox').click(); - cy.getByTestId('edit-okr-champion-readonly').contains('OKR Champion:'); - cy.getByTestId('edit-okr-champion-readonly').contains('Nein'); + cy.getByTestId("edit-okr-champion-edit") + .click(); + cy.getByTestId("edit-okr-champion-checkbox") + .click(); + cy.getByTestId("edit-okr-champion-readonly") + .contains("OKR Champion:"); + cy.getByTestId("edit-okr-champion-readonly") + .contains("Nein"); // test click outside of element - cy.getByTestId('edit-okr-champion-edit').click(); - cy.get('app-member-detail').find('h2').click(); + cy.getByTestId("edit-okr-champion-edit") + .click(); + cy.get("app-member-detail") + .find("h2") + .click(); // checkbox should hide again - cy.getByTestId('edit-okr-champion-readonly').contains('OKR Champion:'); - cy.getByTestId('edit-okr-champion-readonly').contains('Nein'); + cy.getByTestId("edit-okr-champion-readonly") + .contains("OKR Champion:"); + cy.getByTestId("edit-okr-champion-readonly") + .contains("Nein"); }); }); - describe('As BL', () => { + describe("As BL", () => { beforeEach(() => { cy.loginAsUser(users.bl); - cy.getByTestId('team-management').click(); - cy.intercept('GET', '**/users/*').as('getEsha'); + cy.getByTestId("team-management") + .click(); + cy.intercept("GET", "**/users/*") + .as("getEsha"); }); - it('should check if correct roles for BL are set', () => { - cy.get('td').contains(nameEsha).click(); - cy.wait('@getEsha'); + it("should check if correct roles for BL are set", () => { + cy.get("td") + .contains(nameEsha) + .click(); + cy.wait("@getEsha"); checkRolesForEsha(); closeOverlay(); }); - it('should check if team loremIpsum cannot be edited', () => { - cy.get('app-team-management').contains('LoremIpsum').click(); - cy.getByTestId('teamMoreButton').should('not.exist'); - cy.getByTestId('editTeamButton').should('not.exist'); - cy.getByTestId('member-list-more').should('not.exist'); - cy.getByTestId('edit-role').should('not.exist'); + it("should check if team loremIpsum cannot be edited", () => { + cy.get("app-team-management") + .contains("LoremIpsum") + .click(); + cy.getByTestId("teamMoreButton") + .should("not.exist"); + cy.getByTestId("editTeamButton") + .should("not.exist"); + cy.getByTestId("member-list-more") + .should("not.exist"); + cy.getByTestId("edit-role") + .should("not.exist"); }); - it('should check if team /BBT can be edited and edit name', () => { - cy.get('app-team-management').contains('/BBT').click(); - cy.getByTestId('teamMoreButton').should('exist'); - editTeamNameAndTest('/BBT_edit'); + it("should check if team /BBT can be edited and edit name", () => { + cy.get("app-team-management") + .contains("/BBT") + .click(); + cy.getByTestId("teamMoreButton") + .should("exist"); + editTeamNameAndTest("/BBT_edit"); // restore old name - editTeamNameAndTest('/BBT'); + editTeamNameAndTest("/BBT"); }); - it('should add members to team /BBT', () => { - cy.get('app-team-management').contains('/BBT').click(); - cy.getByTestId('add-team-member').click(); - cy.getByTestId('search-member-to-add').click(); + it("should add members to team /BBT", () => { + cy.get("app-team-management") + .contains("/BBT") + .click(); + cy.getByTestId("add-team-member") + .click(); + cy.getByTestId("search-member-to-add") + .click(); // esha should not exist (is already member of team) - const matOption = '.cdk-overlay-container mat-option'; - cy.get(matOption).contains(nameEsha).should('not.exist'); + const matOption = ".cdk-overlay-container mat-option"; + cy.get(matOption) + .contains(nameEsha) + .should("not.exist"); // add findus peterson - cy.getByTestId('search-member-to-add').as('member-search').click(); - cy.get('@member-search').type('Find'); - cy.contains(matOption, 'Findus Peterson').click(); + cy.getByTestId("search-member-to-add") + .as("member-search") + .click(); + cy.get("@member-search") + .type("Find"); + cy.contains(matOption, "Findus Peterson") + .click(); // add robin papierer - cy.getByTestId('search-member-to-add').click(); - cy.get(matOption).contains('Findus Peterson').should('not.exist'); - cy.get(matOption).contains('Robin Papierer').click(); + cy.getByTestId("search-member-to-add") + .click(); + cy.get(matOption) + .contains("Findus Peterson") + .should("not.exist"); + cy.get(matOption) + .contains("Robin Papierer") + .click(); // check if Findus and Robin exists in table - const allMemberTableTr = '#all-member-table tbody tr'; - cy.get(allMemberTableTr).eq(0).should('contain', 'Findus Peterson'); - cy.get(allMemberTableTr).eq(1).should('contain', 'Robin Papierer'); + const allMemberTableTr = "#all-member-table tbody tr"; + cy.get(allMemberTableTr) + .eq(0) + .should("contain", "Findus Peterson"); + cy.get(allMemberTableTr) + .eq(1) + .should("contain", "Robin Papierer"); // remove robin papierer from list - cy.get(allMemberTableTr + ' button') + cy.get(allMemberTableTr + " button") .eq(1) .click(); - cy.get(allMemberTableTr).eq(1).should('not.exist'); + cy.get(allMemberTableTr) + .eq(1) + .should("not.exist"); - cy.getByTestId('save').click(); + cy.getByTestId("save") + .click(); }); - it('should change role of Findus Peterson to Team Admin', () => { - cy.get('app-team-management').contains('/BBT').click(); + it("should change role of Findus Peterson to Team Admin", () => { + cy.get("app-team-management") + .contains("/BBT") + .click(); - cy.get('app-member-list tbody tr') + cy.get("app-member-list tbody tr") .each(($row) => { - let usernameCell = $row.find('td:nth-child(2)'); - if (usernameCell.text().trim() !== 'Findus Peterson') { + const usernameCell = $row.find("td:nth-child(2)"); + if (usernameCell.text() + .trim() !== "Findus Peterson") { return; } - $row.find(`[data-testId='edit-role']`).click(); + $row.find("[data-testId='edit-role']") + .click(); cy.wait(500); // wait for dialog to open }) .then(() => { - cy.getByTestId('select-team-role').click(); - cy.getByTestId('select-team-role-admin').click(); - cy.getByTestId('select-team-role').should('not.exist'); - cy.contains('Das Team wurde erfolgreich aktualisiert.'); + cy.getByTestId("select-team-role") + .click(); + cy.getByTestId("select-team-role-admin") + .click(); + cy.getByTestId("select-team-role") + .should("not.exist"); + cy.contains("Das Team wurde erfolgreich aktualisiert."); }); }); - it('should test that Findus Peterson cannot be added to further teams', () => { - navigateToUser('Findus Peterson'); + it("should test that Findus Peterson cannot be added to further teams", () => { + navigateToUser("Findus Peterson"); // current user BL (Esha Harris) is only admin in /BBT team. // That's why 'add-team-member' should be disabled - cy.get('app-member-detail').getByTestId('add-user').should('be.disabled'); + cy.get("app-member-detail") + .getByTestId("add-user") + .should("be.disabled"); }); - it('should remove BBT membership of findus', () => { - navigateToUser('Findus Peterson'); - cy.getByTestId('delete-team-member').click(); + it("should remove BBT membership of findus", () => { + navigateToUser("Findus Peterson"); + cy.getByTestId("delete-team-member") + .click(); ConfirmDialog.do() - .checkTitle('Mitglied entfernen') - .checkDescription(`Möchtest du Findus Peterson wirklich aus dem Team '/BBT' entfernen?`) + .checkTitle("Mitglied entfernen") + .checkDescription("Möchtest du Findus Peterson wirklich aus dem Team '/BBT' entfernen?") .submit(); - cy.get('app-member-detail').contains('/BBT').should('not.exist'); + cy.get("app-member-detail") + .contains("/BBT") + .should("not.exist"); }); - it('should remove added memberships from esha', () => { - cy.intercept('PUT', '**/removeuser').as('removeUser'); + it("should remove added memberships from esha", () => { + cy.intercept("PUT", "**/removeuser") + .as("removeUser"); navigateToUser(nameEsha); - cy.getByTestId('delete-team-member').eq(0).click(); + cy.getByTestId("delete-team-member") + .eq(0) + .click(); ConfirmDialog.do() - .checkTitle('Mitglied entfernen') + .checkTitle("Mitglied entfernen") .checkDescription(`Möchtest du ${nameEsha} wirklich aus dem Team '/BBT' entfernen?`) .submit(); - cy.wait('@removeUser'); + cy.wait("@removeUser"); - cy.getByTestId('delete-team-member').eq(0).click(); + cy.getByTestId("delete-team-member") + .eq(0) + .click(); ConfirmDialog.do() - .checkTitle('Mitglied entfernen') + .checkTitle("Mitglied entfernen") .checkDescription(`Möchtest du ${nameEsha} wirklich aus dem Team 'LoremIpsum' entfernen?`) .submit(); - cy.get('app-member-detail').should('not.contain', '/BBT').and('not.contain', 'LoremIpsum'); + cy.get("app-member-detail") + .should("not.contain", "/BBT") + .and("not.contain", "LoremIpsum"); }); - it('Navigate to user Esha and check if okr champion is not editable', () => { + it("Navigate to user Esha and check if okr champion is not editable", () => { navigateToUser(nameEsha); - cy.getByTestId('edit-okr-champion-readonly').should('exist'); - cy.getByTestId('edit-okr-champion-edit').should('not.exist'); + cy.getByTestId("edit-okr-champion-readonly") + .should("exist"); + cy.getByTestId("edit-okr-champion-edit") + .should("not.exist"); }); }); }); function closeOverlay() { - cy.get('.cdk-overlay-backdrop').click(-50, -50, { force: true }); + cy.get(".cdk-overlay-backdrop") + .click(-50, -50, { force: true }); } function checkRolesForEsha() { - cy.get('app-member-detail tbody tr').eq(0).should('contain', '/BBT').and('contain', 'Team-Admin'); - cy.get('app-member-detail tbody tr').eq(1).should('contain', 'LoremIpsum').and('contain', 'Team-Member'); + cy.get("app-member-detail tbody tr") + .eq(0) + .should("contain", "/BBT") + .and("contain", "Team-Admin"); + cy.get("app-member-detail tbody tr") + .eq(1) + .should("contain", "LoremIpsum") + .and("contain", "Team-Member"); } function editTeamNameAndTest(teamName: string) { - cy.intercept('PUT', '**/teams/*').as('saveTeam'); - cy.getByTestId('editTeamButton').click(); - cy.getByTestId('add-team-name').as('team-name').click(); - cy.get('@team-name').clear(); - cy.get('@team-name').type(teamName); - cy.getByTestId('save').click(); - cy.wait('@saveTeam'); + cy.intercept("PUT", "**/teams/*") + .as("saveTeam"); + cy.getByTestId("editTeamButton") + .click(); + cy.getByTestId("add-team-name") + .as("team-name") + .click(); + cy.get("@team-name") + .clear(); + cy.get("@team-name") + .type(teamName); + cy.getByTestId("save") + .click(); + cy.wait("@saveTeam"); cy.contains(teamName); } function navigateToUser(userName: string) { - cy.intercept('GET', '**/users/*').as('getUser'); - cy.get('td').contains(userName).click(); - cy.wait('@getUser'); + cy.intercept("GET", "**/users/*") + .as("getUser"); + cy.get("td") + .contains(userName) + .click(); + cy.wait("@getUser"); } function fillOutNewUser(firstname: string, lastname: string, email: string) { diff --git a/frontend/cypress/support/commands.ts b/frontend/cypress/support/commands.ts index ac14a493d4..981f4a7edb 100644 --- a/frontend/cypress/support/commands.ts +++ b/frontend/cypress/support/commands.ts @@ -1,81 +1,90 @@ -import { validateScoring } from './helper/scoringSupport'; -import { keyCodeDefinitions } from 'cypress-real-events/keyCodeDefinitions'; -import { pressUntilContains, doUntilSelector } from './helper/utils'; +import { validateScoring } from "./helper/scoringSupport"; +import { keyCodeDefinitions } from "cypress-real-events/keyCodeDefinitions"; +import { pressUntilContains, doUntilSelector } from "./helper/utils"; import Chainable = Cypress.Chainable; -Cypress.Commands.add('loginAsUser', (user: any) => { +Cypress.Commands.add("loginAsUser", (user: any) => { loginWithCredentials(user.username, user.password); overviewIsLoaded(); }); -Cypress.Commands.add('getByTestId', (testId: string, text?: string): Chainable => { +Cypress.Commands.add("getByTestId", (testId: string, text?: string): Chainable => { const selector = `[data-testId=${testId}]`; if (text) { - return cy.get(selector).contains(text); + return cy.get(selector) + .contains(text); } else { return cy.get(selector); } }); Cypress.Commands.add( - 'findByTestId', - { prevSubject: true }, - (subject: JQuery, testId: string, text?: string): Chainable => { + "findByTestId", { prevSubject: true }, (subject: JQuery, testId: string, text?: string): Chainable => { const selector = `[data-testId=${testId}]`; if (text) { - return cy.wrap(subject).find(selector).contains(text); + return cy.wrap(subject) + .find(selector) + .contains(text); } else { - return cy.wrap(subject).find(selector); + return cy.wrap(subject) + .find(selector); } }, ); -Cypress.Commands.add('pressUntilContains', (text: string, key: keyof typeof keyCodeDefinitions) => { +Cypress.Commands.add("pressUntilContains", (text: string, key: keyof typeof keyCodeDefinitions) => { pressUntilContains(text, key); }); -Cypress.Commands.add('tabForward', () => { - cy.realPress('Tab'); +Cypress.Commands.add("tabForward", () => { + cy.realPress("Tab"); }); -Cypress.Commands.add('tabBackward', () => { - cy.realPress(['Shift', 'Tab']); +Cypress.Commands.add("tabBackward", () => { + cy.realPress(["Shift", "Tab"]); }); -Cypress.Commands.add('tabForwardUntil', (selector: string, limit?: number) => { +Cypress.Commands.add("tabForwardUntil", (selector: string, limit?: number) => { doUntilSelector(selector, cy.tabForward, limit); }); -Cypress.Commands.add('tabBackwardUntil', (selector: string, limit?: number) => { +Cypress.Commands.add("tabBackwardUntil", (selector: string, limit?: number) => { doUntilSelector(selector, cy.tabBackward, limit); }); -Cypress.Commands.add('getZone', (zone: string, onOverview: boolean) => { - return (onOverview ? cy.focused() : cy.getByTestId('side-panel')).findByTestId(zone); +Cypress.Commands.add("getZone", (zone: string, onOverview: boolean) => { + return (onOverview ? cy.focused() : cy.getByTestId("side-panel")).findByTestId(zone); }); -Cypress.Commands.add('validateScoring', (isOverview: boolean, percentage: number) => { +Cypress.Commands.add("validateScoring", (isOverview: boolean, percentage: number) => { validateScoring(isOverview, percentage); }); function loginWithCredentials(username: string, password: string) { - cy.visit('/'); - cy.intercept('GET', '**/users/current').as('getCurrentUser'); - cy.origin(Cypress.env('login_url'), { args: { username, password } }, ({ username, password }) => { - cy.get('input[name="username"]').type(username); - cy.get('input[name="password"]').type(password); - cy.get('button[type="submit"]').click(); - cy.wait('@getCurrentUser', { responseTimeout: 10000 }); - }); - cy.url().then((url) => { - const currentUrl = new URL(url); - const baseURL = new URL(Cypress.config().baseUrl!); - expect(currentUrl.pathname).equal(baseURL.pathname); + cy.visit("/"); + cy.intercept("GET", "**/users/current") + .as("getCurrentUser"); + cy.origin(Cypress.env("login_url"), { args: { username, password } }, ({ username, password }) => { + cy.get("input[name=\"username\"]") + .type(username); + cy.get("input[name=\"password\"]") + .type(password); + cy.get("button[type=\"submit\"]") + .click(); + cy.wait("@getCurrentUser", { responseTimeout: 10000 }); }); + cy.url() + .then((url) => { + const currentUrl = new URL(url); + const baseURL = new URL(Cypress.config().baseUrl!); + expect(currentUrl.pathname) + .equal(baseURL.pathname); + }); } -const overviewIsLoaded = () => cy.get('mat-chip').should('have.length.at.least', 2); +const overviewIsLoaded = () => cy.get("mat-chip") + .should("have.length.at.least", 2); // -- This is a parent command -- // Cypress.Commands.add("login", (email, password) => { ... }) diff --git a/frontend/cypress/support/component.ts b/frontend/cypress/support/component.ts index 2733f4b08b..2a4850ed6f 100644 --- a/frontend/cypress/support/component.ts +++ b/frontend/cypress/support/component.ts @@ -1,5 +1,5 @@ -import './commands'; -import { keyCodeDefinitions } from 'cypress-real-events/keyCodeDefinitions'; +import "./commands"; +import { keyCodeDefinitions } from "cypress-real-events/keyCodeDefinitions"; declare global { namespace Cypress { diff --git a/frontend/cypress/support/e2e.ts b/frontend/cypress/support/e2e.ts index 31baa58435..4ecd7cc3b3 100644 --- a/frontend/cypress/support/e2e.ts +++ b/frontend/cypress/support/e2e.ts @@ -13,14 +13,14 @@ // https://on.cypress.io/configuration // *********************************************************** -import './commands'; -import 'cypress-real-events'; -import { onlyOn } from '@cypress/skip-test'; +import "./commands"; +import "cypress-real-events"; +import { onlyOn } from "@cypress/skip-test"; Cypress.Keyboard.defaults({ keystrokeDelay: 0, }); beforeEach(() => { - onlyOn('chrome'); + onlyOn("chrome"); }); diff --git a/frontend/cypress/support/helper/dom-helper/angularSearchBox.ts b/frontend/cypress/support/helper/dom-helper/angularSearchBox.ts index f1966bc9ce..360f9a516f 100644 --- a/frontend/cypress/support/helper/dom-helper/angularSearchBox.ts +++ b/frontend/cypress/support/helper/dom-helper/angularSearchBox.ts @@ -1,4 +1,4 @@ -import { PageObjectMapperBase } from './pageObjectMapperBase'; +import { PageObjectMapperBase } from "./pageObjectMapperBase"; export default class AngularSearchBox extends PageObjectMapperBase { selector: string; @@ -10,24 +10,26 @@ export default class AngularSearchBox extends PageObjectMapperBase { } fill(value: string) { - const input = cy.get('input').first(); + const input = cy.get("input") + .first(); input.clear(); input.type(value); return this; } shouldHaveOption(option: string) { - cy.contains('.mat-mdc-autocomplete-panel mat-option', option); + cy.contains(".mat-mdc-autocomplete-panel mat-option", option); return this; } shouldHaveLabel(label: string) { - cy.contains('.mat-mdc-autocomplete-panel .mat-mdc-optgroup-label', label); + cy.contains(".mat-mdc-autocomplete-panel .mat-mdc-optgroup-label", label); return this; } selectOption(option: string) { - cy.contains('.mat-mdc-autocomplete-panel mat-option', option).click(); + cy.contains(".mat-mdc-autocomplete-panel mat-option", option) + .click(); } getPage() { @@ -39,6 +41,7 @@ export default class AngularSearchBox extends PageObjectMapperBase { } validatePage(): void { - this.getPage().should('exist'); + this.getPage() + .should("exist"); } } diff --git a/frontend/cypress/support/helper/dom-helper/dialogs/checkInDialog.ts b/frontend/cypress/support/helper/dom-helper/dialogs/checkInDialog.ts index 55ef5aab4f..e5a927286f 100644 --- a/frontend/cypress/support/helper/dom-helper/dialogs/checkInDialog.ts +++ b/frontend/cypress/support/helper/dom-helper/dialogs/checkInDialog.ts @@ -1,83 +1,90 @@ -import Dialog from './dialog'; +import Dialog from "./dialog"; import Chainable = Cypress.Chainable; export default class CheckInDialog extends Dialog { fillCheckInCommentary(commentary: string) { - this.fillInputByTestId('changeInfo', commentary); + this.fillInputByTestId("changeInfo", commentary); return this; } fillMetricCheckInValue(value: string) { - this.fillInputByTestId('check-in-metric-value', value); + this.fillInputByTestId("check-in-metric-value", value); return this; } - selectOrdinalCheckInZone(zone: 'fail' | 'commit' | 'target' | 'stretch') { + selectOrdinalCheckInZone(zone: "fail" | "commit" | "target" | "stretch") { switch (zone) { - case 'fail': - cy.getByTestId('fail-radio').click(); + case "fail": + cy.getByTestId("fail-radio") + .click(); break; - case 'commit': - cy.getByTestId('commit-radio').click(); + case "commit": + cy.getByTestId("commit-radio") + .click(); break; - case 'target': - cy.getByTestId('target-radio').click(); + case "target": + cy.getByTestId("target-radio") + .click(); break; - case 'stretch': - cy.getByTestId('stretch-radio').click(); + case "stretch": + cy.getByTestId("stretch-radio") + .click(); break; } return this; } fillCheckInInitiatives(value: string) { - this.fillInputByTestId('initiatives', value); + this.fillInputByTestId("initiatives", value); return this; } setCheckInConfidence(confidence: number) { - cy.getByTestId('confidence-slider').find('input').focus(); + cy.getByTestId("confidence-slider") + .find("input") + .focus(); for (let i = 0; i < 10; i++) { - cy.realPress('ArrowLeft'); + cy.realPress("ArrowLeft"); } for (let i = 0; i < confidence; i++) { - cy.realPress('ArrowRight'); + cy.realPress("ArrowRight"); } return this; } checkForDialogTextMetric() { - cy.contains('Very important keyresult'); - cy.contains('Check-in erfassen'); - cy.contains('Key Result'); - cy.contains('Neuer Wert'); - cy.contains('Confidence um Target Zone (42%) zu erreichen'); - cy.contains('Abbrechen'); + cy.contains("Very important keyresult"); + cy.contains("Check-in erfassen"); + cy.contains("Key Result"); + cy.contains("Neuer Wert"); + cy.contains("Confidence um Target Zone (42%) zu erreichen"); + cy.contains("Abbrechen"); return this; } checkForDialogTextOrdinal() { - cy.contains('A new ordinal keyresult for our company'); - cy.contains('Check-in erfassen'); - cy.contains('Key Result'); - cy.contains('Fail:'); - cy.contains('Commit / Target / Stretch noch nicht erreicht'); - cy.contains('Commit:'); - cy.contains('Target:'); - cy.contains('Stretch:'); - cy.contains('New car'); - cy.contains('New house'); - cy.contains('New pool'); - cy.contains('Confidence um Target Zone zu erreichen'); - cy.contains('Abbrechen'); + cy.contains("A new ordinal keyresult for our company"); + cy.contains("Check-in erfassen"); + cy.contains("Key Result"); + cy.contains("Fail:"); + cy.contains("Commit / Target / Stretch noch nicht erreicht"); + cy.contains("Commit:"); + cy.contains("Target:"); + cy.contains("Stretch:"); + cy.contains("New car"); + cy.contains("New house"); + cy.contains("New pool"); + cy.contains("Confidence um Target Zone zu erreichen"); + cy.contains("Abbrechen"); return this; } override submit() { - cy.getByTestId('submit-check-in').click(); + cy.getByTestId("submit-check-in") + .click(); } getPage(): Chainable { - return cy.get('app-check-in-form'); + return cy.get("app-check-in-form"); } } diff --git a/frontend/cypress/support/helper/dom-helper/dialogs/checkInHistoryDialog.ts b/frontend/cypress/support/helper/dom-helper/dialogs/checkInHistoryDialog.ts index d984f8b7a5..984b1ba520 100644 --- a/frontend/cypress/support/helper/dom-helper/dialogs/checkInHistoryDialog.ts +++ b/frontend/cypress/support/helper/dom-helper/dialogs/checkInHistoryDialog.ts @@ -1,27 +1,33 @@ -import Dialog from './dialog'; -import CheckInDialog from './checkInDialog'; +import Dialog from "./dialog"; +import CheckInDialog from "./checkInDialog"; import Chainable = Cypress.Chainable; export default class CheckInHistoryDialog extends Dialog { override submit() { - throw new Error('This dialog doesnt have a submit button'); + throw new Error("This dialog doesnt have a submit button"); } override cancel() { - cy.getByTestId('closeButton').click(); + cy.getByTestId("closeButton") + .click(); } editLatestCheckIn() { - cy.getByTestId('edit-check-in').first().click(); + cy.getByTestId("edit-check-in") + .first() + .click(); return new CheckInDialog(); } getPage(): Chainable { - return cy.get('app-check-in-history-dialog'); + return cy.get("app-check-in-history-dialog"); } checkForAttribute(title: string, value: string) { - cy.get('mat-dialog-container').contains(value).parent().should('contain', title); + cy.get("mat-dialog-container") + .contains(value) + .parent() + .should("contain", title); return this; } } diff --git a/frontend/cypress/support/helper/dom-helper/dialogs/confirmDialog.ts b/frontend/cypress/support/helper/dom-helper/dialogs/confirmDialog.ts index 688d4fb0eb..7f37a8e372 100644 --- a/frontend/cypress/support/helper/dom-helper/dialogs/confirmDialog.ts +++ b/frontend/cypress/support/helper/dom-helper/dialogs/confirmDialog.ts @@ -1,26 +1,32 @@ -import Dialog from './dialog'; +import Dialog from "./dialog"; import Chainable = Cypress.Chainable; export default class ConfirmDialog extends Dialog { checkTitle(title: string) { - this.getPage().contains(title).should('exist'); + this.getPage() + .contains(title) + .should("exist"); return this; } checkDescription(title: string) { - this.getPage().contains(title).should('exist'); + this.getPage() + .contains(title) + .should("exist"); return this; } override submit() { - cy.getByTestId('confirm-yes').click(); + cy.getByTestId("confirm-yes") + .click(); } override cancel() { - cy.getByTestId('confirm-no').click(); + cy.getByTestId("confirm-no") + .click(); } getPage(): Chainable { - return cy.get('app-confirm-dialog'); + return cy.get("app-confirm-dialog"); } } diff --git a/frontend/cypress/support/helper/dom-helper/dialogs/dialog.ts b/frontend/cypress/support/helper/dom-helper/dialogs/dialog.ts index e2d90e61a4..4de43ac229 100644 --- a/frontend/cypress/support/helper/dom-helper/dialogs/dialog.ts +++ b/frontend/cypress/support/helper/dom-helper/dialogs/dialog.ts @@ -1,4 +1,4 @@ -import { PageObjectMapperBase } from '../pageObjectMapperBase'; +import { PageObjectMapperBase } from "../pageObjectMapperBase"; import Chainable = Cypress.Chainable; export default abstract class Dialog extends PageObjectMapperBase { @@ -8,19 +8,23 @@ export default abstract class Dialog extends PageObjectMapperBase { } override validatePage() { - this.getPage().should('exist'); + this.getPage() + .should("exist"); } submit() { - cy.getByTestId('save').click(); + cy.getByTestId("save") + .click(); } cancel() { - cy.getByTestId('cancel').click(); + cy.getByTestId("cancel") + .click(); } close() { - cy.getByTestId('close-dialog').click(); + cy.getByTestId("close-dialog") + .click(); } protected fillInputByTestId(testId: string, value: string) { diff --git a/frontend/cypress/support/helper/dom-helper/dialogs/inviteMembersDialog.ts b/frontend/cypress/support/helper/dom-helper/dialogs/inviteMembersDialog.ts index f1c493bb32..0f4b7cd2e3 100644 --- a/frontend/cypress/support/helper/dom-helper/dialogs/inviteMembersDialog.ts +++ b/frontend/cypress/support/helper/dom-helper/dialogs/inviteMembersDialog.ts @@ -1,5 +1,5 @@ -import Dialog from './dialog'; -import { uniqueSuffix } from '../../utils'; +import Dialog from "./dialog"; +import { uniqueSuffix } from "../../utils"; import Chainable = Cypress.Chainable; export default class InviteMembersDialog extends Dialog { @@ -7,16 +7,21 @@ export default class InviteMembersDialog extends Dialog { override validatePage() { super.validatePage(); - this.getPage().contains('Members registrieren').should('exist'); + this.getPage() + .contains("Members registrieren") + .should("exist"); } enterUser(firstName: string, lastName: string, email: string) { firstName = uniqueSuffix(firstName); email = uniqueSuffix(email); this.firstnames.push(firstName); - const firstNameInput = cy.get('[formcontrolname="firstname"]').last(); - const lastNameInput = cy.get('[formcontrolname="lastname"]').last(); - const emailInput = cy.get('[formcontrolname="email"]').last(); + const firstNameInput = cy.get("[formcontrolname=\"firstname\"]") + .last(); + const lastNameInput = cy.get("[formcontrolname=\"lastname\"]") + .last(); + const emailInput = cy.get("[formcontrolname=\"email\"]") + .last(); this.fillInput(firstNameInput, firstName); this.fillInput(lastNameInput, lastName); this.fillInput(emailInput, email); @@ -24,7 +29,8 @@ export default class InviteMembersDialog extends Dialog { } addAnotherUser() { - cy.contains('Weiterer Member hinzufügen').click(); + cy.contains("Weiterer Member hinzufügen") + .click(); return this; } getFirstNames() { @@ -32,11 +38,12 @@ export default class InviteMembersDialog extends Dialog { } override submit() { - cy.getByTestId('invite').click(); + cy.getByTestId("invite") + .click(); return this.firstnames; } getPage(): Chainable { - return cy.get('app-invite-user-dialog'); + return cy.get("app-invite-user-dialog"); } } diff --git a/frontend/cypress/support/helper/dom-helper/dialogs/keyResultDialog.ts b/frontend/cypress/support/helper/dom-helper/dialogs/keyResultDialog.ts index 3225f4859b..050a2c27dd 100644 --- a/frontend/cypress/support/helper/dom-helper/dialogs/keyResultDialog.ts +++ b/frontend/cypress/support/helper/dom-helper/dialogs/keyResultDialog.ts @@ -1,46 +1,51 @@ -import Dialog from './dialog'; -import { Unit } from '../../../../../src/app/shared/types/enums/Unit'; -import ConfirmDialog from './confirmDialog'; +import Dialog from "./dialog"; +import { Unit } from "../../../../../src/app/shared/types/enums/Unit"; +import ConfirmDialog from "./confirmDialog"; import Chainable = Cypress.Chainable; export default class KeyResultDialog extends Dialog { fillKeyResultTitle(title: string) { - this.fillInputByTestId('titleInput', title); + this.fillInputByTestId("titleInput", title); return this; } fillKeyResultDescription(description: string) { - this.fillInputByTestId('descriptionInput', description); + this.fillInputByTestId("descriptionInput", description); return this; } withMetricValues(unit: Unit, baseline: string, stretchGoal: string) { - cy.getByTestId('metricTab').click(); - cy.getByTestId('unit').select(unit); - this.fillInputByTestId('baseline', baseline); - this.fillInputByTestId('stretchGoal', stretchGoal); + cy.getByTestId("metricTab") + .click(); + cy.getByTestId("unit") + .select(unit); + this.fillInputByTestId("baseline", baseline); + this.fillInputByTestId("stretchGoal", stretchGoal); return this; } withOrdinalValues(commitZone: string, targetZone: string, stretchGoal: string) { - cy.getByTestId('ordinalTab').click(); - this.fillInputByTestId('commitZone', commitZone); - this.fillInputByTestId('targetZone', targetZone); - this.fillInputByTestId('stretchZone', stretchGoal); + cy.getByTestId("ordinalTab") + .click(); + this.fillInputByTestId("commitZone", commitZone); + this.fillInputByTestId("targetZone", targetZone); + this.fillInputByTestId("stretchZone", stretchGoal); return this; } fillOwner(owner: string) { - this.fillInputByTestId('ownerInput', owner); - cy.realPress('ArrowDown').realPress('Enter'); + this.fillInputByTestId("ownerInput", owner); + cy.realPress("ArrowDown") + .realPress("Enter"); return this; } addActionPlanElement(action: string) { - cy.getByTestId('add-action-plan-line').click(); - cy.getByTestId('actionInput') + cy.getByTestId("add-action-plan-line") + .click(); + cy.getByTestId("actionInput") .filter((k, el) => { - return (el as HTMLInputElement).value.trim() === ''; + return (el as HTMLInputElement).value.trim() === ""; }) .first() .type(action); @@ -48,49 +53,52 @@ export default class KeyResultDialog extends Dialog { } deleteKeyResult() { - cy.getByTestId('delete-keyResult').click(); + cy.getByTestId("delete-keyResult") + .click(); return new ConfirmDialog(); } checkForDialogTextMetric() { - cy.contains('Einheit'); - cy.contains('Baseline'); - cy.contains('Stretch Goal'); + cy.contains("Einheit"); + cy.contains("Baseline"); + cy.contains("Stretch Goal"); this.checkForDialogText(); return this; } checkForDialogTextOrdinal() { - cy.contains('Commit Zone'); - cy.contains('Target Zone'); - cy.contains('Stretch Goal'); + cy.contains("Commit Zone"); + cy.contains("Target Zone"); + cy.contains("Stretch Goal"); this.checkForDialogText(); return this; } private checkForDialogText() { - cy.contains('Key Result erfassen'); - cy.contains('Titel'); - cy.contains('Metrisch'); - cy.contains('Ordinal'); - cy.contains('Owner'); - cy.contains('Beschreibung (optional)'); - cy.contains('Action Plan (optional)'); - cy.contains('Weitere Action hinzufügen'); - cy.contains('Speichern'); - cy.contains('Speichern & Neu'); - cy.contains('Abbrechen'); + cy.contains("Key Result erfassen"); + cy.contains("Titel"); + cy.contains("Metrisch"); + cy.contains("Ordinal"); + cy.contains("Owner"); + cy.contains("Beschreibung (optional)"); + cy.contains("Action Plan (optional)"); + cy.contains("Weitere Action hinzufügen"); + cy.contains("Speichern"); + cy.contains("Speichern & Neu"); + cy.contains("Abbrechen"); } override submit() { - cy.getByTestId('submit').click(); + cy.getByTestId("submit") + .click(); } saveAndNew() { - cy.getByTestId('saveAndNew').click(); + cy.getByTestId("saveAndNew") + .click(); } getPage(): Chainable { - return cy.get('app-key-result-form'); + return cy.get("app-key-result-form"); } } diff --git a/frontend/cypress/support/helper/dom-helper/dialogs/objectiveDialog.ts b/frontend/cypress/support/helper/dom-helper/dialogs/objectiveDialog.ts index dafddcea5e..f81d40bb13 100644 --- a/frontend/cypress/support/helper/dom-helper/dialogs/objectiveDialog.ts +++ b/frontend/cypress/support/helper/dom-helper/dialogs/objectiveDialog.ts @@ -1,38 +1,44 @@ -import Dialog from './dialog'; -import ConfirmDialog from './confirmDialog'; +import Dialog from "./dialog"; +import ConfirmDialog from "./confirmDialog"; import Chainable = Cypress.Chainable; export default class ObjectiveDialog extends Dialog { fillObjectiveTitle(title: string) { - this.fillInputByTestId('title', title); + this.fillInputByTestId("title", title); return this; } fillObjectiveDescription(description: string) { - this.fillInputByTestId('description', description); + this.fillInputByTestId("description", description); return this; } selectQuarter(quarter: string) { - cy.get('select#quarter').select(quarter); + cy.get("select#quarter") + .select(quarter); return this; } toggleCreateKeyResults() { - cy.getByTestId('keyResult-checkbox').find("[type='checkbox']").check(); + cy.getByTestId("keyResult-checkbox") + .find("[type='checkbox']") + .check(); return this; } deleteObjective() { - cy.getByTestId('delete').click(); + cy.getByTestId("delete") + .click(); return new ConfirmDialog(); } submitDraftObjective() { - cy.getByTestId('save-draft').click(); + cy.getByTestId("save-draft") + .click(); } getPage(): Chainable { - return cy.get('app-objective-form').should('exist'); + return cy.get("app-objective-form") + .should("exist"); } } diff --git a/frontend/cypress/support/helper/dom-helper/dialogs/teamDialog.ts b/frontend/cypress/support/helper/dom-helper/dialogs/teamDialog.ts index c486595d2b..977e9326cb 100644 --- a/frontend/cypress/support/helper/dom-helper/dialogs/teamDialog.ts +++ b/frontend/cypress/support/helper/dom-helper/dialogs/teamDialog.ts @@ -1,22 +1,24 @@ -import Dialog from './dialog'; +import Dialog from "./dialog"; import Chainable = Cypress.Chainable; export default class TeamDialog extends Dialog { override validatePage() { super.validatePage(); - this.getPage().contains('Team erfassen'); + this.getPage() + .contains("Team erfassen"); } fillName(name: string) { - this.fillInputByTestId('add-team-name', name); + this.fillInputByTestId("add-team-name", name); return this; } override submit() { - cy.getByTestId('save').click(); + cy.getByTestId("save") + .click(); } getPage(): Chainable { - return cy.get('app-add-edit-team-dialog'); + return cy.get("app-add-edit-team-dialog"); } } diff --git a/frontend/cypress/support/helper/dom-helper/filterHelper.ts b/frontend/cypress/support/helper/dom-helper/filterHelper.ts index aaeae2c944..1206dbcfcb 100644 --- a/frontend/cypress/support/helper/dom-helper/filterHelper.ts +++ b/frontend/cypress/support/helper/dom-helper/filterHelper.ts @@ -1,31 +1,37 @@ -import { PageObjectMapperBase } from './pageObjectMapperBase'; +import { PageObjectMapperBase } from "./pageObjectMapperBase"; export default class FilterHelper extends PageObjectMapperBase { validatePage(): void {} optionShouldBeSelected(text: string, onOverview = true): this { if (onOverview) { - cy.contains('h1:visible', text).should('have.length', 1); + cy.contains("h1:visible", text) + .should("have.length", 1); } - this.getOption(text).should('have.length', 1).should('have.css', 'background-color').and('eq', 'rgb(30, 90, 150)'); + this.getOption(text) + .should("have.length", 1) + .should("have.css", "background-color") + .and("eq", "rgb(30, 90, 150)"); return this; } optionShouldNotBeSelected(text: string): this { - cy.contains('h1:visible', text).should('not.exist'); + cy.contains("h1:visible", text) + .should("not.exist"); this.getOption(text) - .should('have.length', 1) - .should('have.css', 'background-color') - .and('eq', 'rgb(255, 255, 255)'); + .should("have.length", 1) + .should("have.css", "background-color") + .and("eq", "rgb(255, 255, 255)"); return this; } toggleOption(text: string): this { - this.getOption(text).click(); + this.getOption(text) + .click(); return this; } private getOption(text: string): Cypress.Chainable> { - return cy.contains('mat-chip:visible', text); + return cy.contains("mat-chip:visible", text); } } diff --git a/frontend/cypress/support/helper/dom-helper/pageObjectMapperBase.ts b/frontend/cypress/support/helper/dom-helper/pageObjectMapperBase.ts index 9b98d8fe97..db800ad3cf 100644 --- a/frontend/cypress/support/helper/dom-helper/pageObjectMapperBase.ts +++ b/frontend/cypress/support/helper/dom-helper/pageObjectMapperBase.ts @@ -9,17 +9,22 @@ export abstract class PageObjectMapperBase { return this; } - checkForToaster(content: any, type: 'success' | 'error') { - cy.get('#toast-container').find(`.toast-${type}`).contains(content).should('exist'); + checkForToaster(content: any, type: "success" | "error") { + cy.get("#toast-container") + .find(`.toast-${type}`) + .contains(content) + .should("exist"); return this; } validateUrlParameter(key: string, value: any[]) { - cy.url().then((url) => { - const params = new URL(url).searchParams; - const queryParamValues = params.get(key)?.split(','); - expect(queryParamValues).to.have.length(value.length); - value.forEach((v) => expect(queryParamValues).to.include(v)); - }); + cy.url() + .then((url) => { + const params = new URL(url).searchParams; + const queryParamValues = params.get(key) + ?.split(","); + expect(queryParamValues).to.have.length(value.length); + value.forEach((v) => expect(queryParamValues).to.include(v)); + }); } } diff --git a/frontend/cypress/support/helper/dom-helper/pages/keyResultDetailPage.ts b/frontend/cypress/support/helper/dom-helper/pages/keyResultDetailPage.ts index 4a06400230..b8f6bc8861 100644 --- a/frontend/cypress/support/helper/dom-helper/pages/keyResultDetailPage.ts +++ b/frontend/cypress/support/helper/dom-helper/pages/keyResultDetailPage.ts @@ -1,21 +1,23 @@ -import { Page } from './page'; -import CyOverviewPage from './overviewPage'; -import CheckInDialog from '../dialogs/checkInDialog'; -import KeyResultDialog from '../dialogs/keyResultDialog'; -import CheckInHistoryDialog from '../dialogs/checkInHistoryDialog'; +import { Page } from "./page"; +import CyOverviewPage from "./overviewPage"; +import CheckInDialog from "../dialogs/checkInDialog"; +import KeyResultDialog from "../dialogs/keyResultDialog"; +import CheckInHistoryDialog from "../dialogs/checkInHistoryDialog"; export default class KeyResultDetailPage extends Page { elements = { - logo: () => cy.getByTestId('logo'), - closeDrawer: () => cy.getByTestId('close-drawer'), - addCheckin: () => cy.getByTestId('add-check-in'), - showAllCheckins: () => cy.getByTestId('show-all-checkins'), - editKeyResult: () => cy.getByTestId('edit-keyResult'), + logo: () => cy.getByTestId("logo"), + closeDrawer: () => cy.getByTestId("close-drawer"), + addCheckin: () => cy.getByTestId("add-check-in"), + showAllCheckins: () => cy.getByTestId("show-all-checkins"), + editKeyResult: () => cy.getByTestId("edit-keyResult"), }; override validatePage() { - this.elements.addCheckin().contains('Check-in erfassen'); - this.elements.editKeyResult().contains('Key Result bearbeiten'); + this.elements.addCheckin() + .contains("Check-in erfassen"); + this.elements.editKeyResult() + .contains("Key Result bearbeiten"); } override visit(keyResultName: string): this { @@ -24,34 +26,41 @@ export default class KeyResultDetailPage extends Page { } protected doVisit(keyResultName: string): this { - CyOverviewPage.do().getKeyResultByName(keyResultName).click(); + CyOverviewPage.do() + .getKeyResultByName(keyResultName) + .click(); return this; } createCheckIn() { - this.elements.addCheckin().click(); + this.elements.addCheckin() + .click(); return new CheckInDialog(); } editKeyResult() { - this.elements.editKeyResult().click(); + this.elements.editKeyResult() + .click(); return new KeyResultDialog(); } showAllCheckins() { - this.elements.showAllCheckins().click(); + this.elements.showAllCheckins() + .click(); return new CheckInHistoryDialog(); } close(): void { - this.elements.closeDrawer().click({ force: true }); + this.elements.closeDrawer() + .click({ force: true }); } visitOverview(): void { - this.elements.logo().click(); + this.elements.logo() + .click(); } getURL(): string { - return '/details/keyresult'; + return "/details/keyresult"; } } diff --git a/frontend/cypress/support/helper/dom-helper/pages/overviewPage.ts b/frontend/cypress/support/helper/dom-helper/pages/overviewPage.ts index e261cc4efe..696bf5f331 100644 --- a/frontend/cypress/support/helper/dom-helper/pages/overviewPage.ts +++ b/frontend/cypress/support/helper/dom-helper/pages/overviewPage.ts @@ -1,13 +1,13 @@ -import { filterByObjectiveName, filterByObjectiveState, getObjectiveColumns } from '../../objectiveHelper'; -import ObjectiveDialog from '../dialogs/objectiveDialog'; -import { Page } from './page'; -import KeyResultDialog from '../dialogs/keyResultDialog'; -import { filterByKeyResultName, getKeyResults } from '../../keyResultHelper'; +import { filterByObjectiveName, filterByObjectiveState, getObjectiveColumns } from "../../objectiveHelper"; +import ObjectiveDialog from "../dialogs/objectiveDialog"; +import { Page } from "./page"; +import KeyResultDialog from "../dialogs/keyResultDialog"; +import { filterByKeyResultName, getKeyResults } from "../../keyResultHelper"; export default class CyOverviewPage extends Page { elements = { - logo: () => cy.getByTestId('logo'), - teammanagement: () => cy.getByTestId('team-management'), + logo: () => cy.getByTestId("logo"), + teammanagement: () => cy.getByTestId("team-management"), }; visitGJForTests() { @@ -32,112 +32,161 @@ export default class CyOverviewPage extends Page { addObjective(teamName?: string) { if (teamName) { - this.getTeamByName(teamName).find('.add-objective').first().click(); + this.getTeamByName(teamName) + .find(".add-objective") + .first() + .click(); return new ObjectiveDialog(); } - cy.getByTestId('add-objective').first().click(); + cy.getByTestId("add-objective") + .first() + .click(); return new ObjectiveDialog(); } addKeyResult(teamName?: string, objectiveName?: string) { if (teamName && objectiveName) { - this.getObjectiveByTeamAndName(teamName, objectiveName).findByTestId('add-keyResult').first().click(); + this.getObjectiveByTeamAndName(teamName, objectiveName) + .findByTestId("add-keyResult") + .first() + .click(); } else if (teamName) { - this.getTeamByName(teamName).findByTestId('add-keyResult').first().click(); + this.getTeamByName(teamName) + .findByTestId("add-keyResult") + .first() + .click(); } else if (objectiveName) { - this.getObjectiveByName(objectiveName).findByTestId('add-keyResult').first().click(); + this.getObjectiveByName(objectiveName) + .findByTestId("add-keyResult") + .first() + .click(); } else { - cy.getByTestId('add-keyResult').first().click(); + cy.getByTestId("add-keyResult") + .first() + .click(); } return new KeyResultDialog(); } addOngoingKeyResult() { - this.getObjectiveByState('ongoing').findByTestId('add-keyResult').first().click(); + this.getObjectiveByState("ongoing") + .findByTestId("add-keyResult") + .first() + .click(); return new KeyResultDialog(); } getTeamByName(teamName: string) { - return cy.contains('.team-title', teamName).parentsUntil('#overview').last(); + return cy.contains(".team-title", teamName) + .parentsUntil("#overview") + .last(); } getFirstObjective() { - return cy.get('.objective').first(); + return cy.get(".objective") + .first(); } getObjectiveByNameAndState(objectiveName: string, state: string) { - this.getObjectivesByNameAndState(objectiveName, state).last().as('objective').scrollIntoView(); - return cy.get('@objective'); + this.getObjectivesByNameAndState(objectiveName, state) + .last() + .as("objective") + .scrollIntoView(); + return cy.get("@objective"); } getObjectivesByNameAndState(objectiveName: string, state: string) { - return getObjectiveColumns().filter(filterByObjectiveName(objectiveName)).filter(filterByObjectiveState(state)); + return getObjectiveColumns() + .filter(filterByObjectiveName(objectiveName)) + .filter(filterByObjectiveState(state)); } getObjectiveByName(objectiveName: string) { - this.getObjectivesByName(objectiveName).last().as('objective').scrollIntoView(); - return cy.get('@objective'); + this.getObjectivesByName(objectiveName) + .last() + .as("objective") + .scrollIntoView(); + return cy.get("@objective"); } getObjectiveByTeamAndName(teamName: string, objectiveName: string) { this.getTeamByName(teamName) - .find('.objective') + .find(".objective") .filter(filterByObjectiveName(objectiveName)) .last() - .as('team') + .as("team") .scrollIntoView(); - return cy.get('@team'); + return cy.get("@team"); } getObjectivesByName(objectiveName: string) { - return getObjectiveColumns().filter(filterByObjectiveName(objectiveName)); + return getObjectiveColumns() + .filter(filterByObjectiveName(objectiveName)); } getObjectiveByState(state: string) { - this.getObjectivesByState(state).first().as('objective').scrollIntoView(); - return cy.get('@objective'); + this.getObjectivesByState(state) + .first() + .as("objective") + .scrollIntoView(); + return cy.get("@objective"); } getObjectivesByState(state: string) { - return getObjectiveColumns().filter(filterByObjectiveState(state)); + return getObjectiveColumns() + .filter(filterByObjectiveState(state)); } getKeyResultByName(keyResultName: string) { - this.getKeyResultsByName(keyResultName).last().as('keyResult').scrollIntoView(); - return cy.get('@keyResult'); + this.getKeyResultsByName(keyResultName) + .last() + .as("keyResult") + .scrollIntoView(); + return cy.get("@keyResult"); } getKeyResultsByName(keyresultName: string) { - return getKeyResults().filter(filterByKeyResultName(keyresultName)); + return getKeyResults() + .filter(filterByKeyResultName(keyresultName)); } selectFromThreeDotMenu(optionName: string) { - cy.contains(optionName).should('exist'); - cy.get('.objective-three-dot-menu').contains(optionName).as('option').scrollIntoView(); + cy.contains(optionName) + .should("exist"); + cy.get(".objective-three-dot-menu") + .contains(optionName) + .as("option") + .scrollIntoView(); - cy.get('@option').should('have.class', 'objective-menu-option').click(); + cy.get("@option") + .should("have.class", "objective-menu-option") + .click(); } duplicateObjective(objectiveName: string) { - this.getObjectiveByName(objectiveName).findByTestId('three-dot-menu').click(); - this.selectFromThreeDotMenu('Objective duplizieren'); + this.getObjectiveByName(objectiveName) + .findByTestId("three-dot-menu") + .click(); + this.selectFromThreeDotMenu("Objective duplizieren"); return new ObjectiveDialog(); } visitTeammanagement(): void { - this.elements.teammanagement().click(); + this.elements.teammanagement() + .click(); } getURL(): string { - return ''; + return ""; } validatePage(): void {} protected doVisit(): void { - this.elements.logo().click(); + this.elements.logo() + .click(); } } diff --git a/frontend/cypress/support/helper/dom-helper/pages/page.ts b/frontend/cypress/support/helper/dom-helper/pages/page.ts index 5cc2c63ec8..627e952746 100644 --- a/frontend/cypress/support/helper/dom-helper/pages/page.ts +++ b/frontend/cypress/support/helper/dom-helper/pages/page.ts @@ -1,4 +1,4 @@ -import { PageObjectMapperBase } from '../pageObjectMapperBase'; +import { PageObjectMapperBase } from "../pageObjectMapperBase"; export abstract class Page extends PageObjectMapperBase { visit(arg?: any): this { @@ -14,7 +14,8 @@ export abstract class Page extends PageObjectMapperBase { protected abstract doVisit(arg?: any): void; afterVisit(): this { - cy.url().should('include', this.getURL()); + cy.url() + .should("include", this.getURL()); this.validatePage(); return this; } diff --git a/frontend/cypress/support/helper/dom-helper/pages/teammanagementPage.ts b/frontend/cypress/support/helper/dom-helper/pages/teammanagementPage.ts index b2af165529..cf9c504bff 100644 --- a/frontend/cypress/support/helper/dom-helper/pages/teammanagementPage.ts +++ b/frontend/cypress/support/helper/dom-helper/pages/teammanagementPage.ts @@ -1,61 +1,76 @@ -import { Page } from './page'; -import TeamDialog from '../dialogs/teamDialog'; -import AngularSearchBox from '../angularSearchBox'; -import ConfirmDialog from '../dialogs/confirmDialog'; +import { Page } from "./page"; +import TeamDialog from "../dialogs/teamDialog"; +import AngularSearchBox from "../angularSearchBox"; +import ConfirmDialog from "../dialogs/confirmDialog"; export default class TeammanagementPage extends Page { elements = { - logo: () => cy.getByTestId('logo'), - teammanagement: () => cy.getByTestId('team-management'), - backToOverview: () => cy.getByTestId('routerLink-to-overview'), - teamMenu: () => cy.get('app-team-list'), - memberHeader: () => cy.get('#member-header'), - registerMember: () => cy.getByTestId('invite-member'), - addTeam: () => cy.getByTestId('add-team'), - teamSearch: () => AngularSearchBox.from('app-team-management-banner [data-testId="teamManagementSearch"]'), + logo: () => cy.getByTestId("logo"), + teammanagement: () => cy.getByTestId("team-management"), + backToOverview: () => cy.getByTestId("routerLink-to-overview"), + teamMenu: () => cy.get("app-team-list"), + memberHeader: () => cy.get("#member-header"), + registerMember: () => cy.getByTestId("invite-member"), + addTeam: () => cy.getByTestId("add-team"), + teamSearch: () => AngularSearchBox.from("app-team-management-banner [data-testId=\"teamManagementSearch\"]"), }; override validatePage() { - this.elements.teammanagement().contains('Teamverwaltung'); - this.elements.backToOverview().contains('Zurück zur OKR Übersicht'); - this.elements.addTeam().contains('Team erfassen'); - this.elements.teamMenu().contains('Alle Teams'); - this.elements.memberHeader().contains('Alle Teams'); - this.elements.memberHeader().contains('Members:'); - this.elements.registerMember().contains('Member registrieren'); + this.elements.teammanagement() + .contains("Teamverwaltung"); + this.elements.backToOverview() + .contains("Zurück zur OKR Übersicht"); + this.elements.addTeam() + .contains("Team erfassen"); + this.elements.teamMenu() + .contains("Alle Teams"); + this.elements.memberHeader() + .contains("Alle Teams"); + this.elements.memberHeader() + .contains("Members:"); + this.elements.registerMember() + .contains("Member registrieren"); } protected doVisit(): this { - this.elements.logo().click(); + this.elements.logo() + .click(); return this; } backToOverview(): void { - this.elements.backToOverview().click(); + this.elements.backToOverview() + .click(); } visitOverview(): void { - this.elements.logo().click(); + this.elements.logo() + .click(); } addTeam(): TeamDialog { - this.elements.addTeam().click(); + this.elements.addTeam() + .click(); return new TeamDialog(); } deleteTeam(teamName: string) { - cy.get('app-team-list .mat-mdc-list-item').contains(teamName).click(); - cy.getByTestId('teamMoreButton').click(); - cy.getByTestId('teamDeleteButton').click(); + cy.get("app-team-list .mat-mdc-list-item") + .contains(teamName) + .click(); + cy.getByTestId("teamMoreButton") + .click(); + cy.getByTestId("teamDeleteButton") + .click(); return ConfirmDialog.do() - .checkTitle('Team löschen') + .checkTitle("Team löschen") .checkDescription( `Möchtest du das Team '${teamName}' wirklich löschen? Zugehörige Objectives werden dadurch in allen Quartalen ebenfalls gelöscht!`, ); } getURL(): string { - return 'team-management'; + return "team-management"; } } diff --git a/frontend/cypress/support/helper/keyResultHelper.ts b/frontend/cypress/support/helper/keyResultHelper.ts index 9f86509330..3877ec5e93 100644 --- a/frontend/cypress/support/helper/keyResultHelper.ts +++ b/frontend/cypress/support/helper/keyResultHelper.ts @@ -3,9 +3,10 @@ export function filterByKeyResultName(keyResultName: string) { } const isKeyResultName = (element: HTMLElement, keyResultName: string) => { - return Cypress.$(element).find(`:contains("${keyResultName}")`).length > 0; + return Cypress.$(element) + .find(`:contains("${keyResultName}")`).length > 0; }; export function getKeyResults() { - return cy.get('.key-result'); + return cy.get(".key-result"); } diff --git a/frontend/cypress/support/helper/objectiveHelper.ts b/frontend/cypress/support/helper/objectiveHelper.ts index 54d633dbb3..b4b421cd9e 100644 --- a/frontend/cypress/support/helper/objectiveHelper.ts +++ b/frontend/cypress/support/helper/objectiveHelper.ts @@ -7,13 +7,15 @@ export function filterByObjectiveState(icon: string) { } const isObjectiveState = (element: HTMLElement, icon: string) => { - return Cypress.$(element).find(`[src='assets/icons/${icon}-icon.svg']`).length > 0; + return Cypress.$(element) + .find(`[src='assets/icons/${icon}-icon.svg']`).length > 0; }; const isObjectiveName = (element: HTMLElement, objectiveName: string) => { - return Cypress.$(element).find(`:contains("${objectiveName}")`).length > 0; + return Cypress.$(element) + .find(`:contains("${objectiveName}")`).length > 0; }; export function getObjectiveColumns() { - return cy.get('.objective'); + return cy.get(".objective"); } diff --git a/frontend/cypress/support/helper/scoringSupport.ts b/frontend/cypress/support/helper/scoringSupport.ts index e6a92fdd13..b83141cdeb 100644 --- a/frontend/cypress/support/helper/scoringSupport.ts +++ b/frontend/cypress/support/helper/scoringSupport.ts @@ -1,4 +1,4 @@ -import { isLastCheckInNegative } from '../../../src/app/shared/common'; +import { isLastCheckInNegative } from "../../../src/app/shared/common"; interface ScoringValue { failPercent: number; @@ -7,21 +7,23 @@ interface ScoringValue { } export function validateScoring(isOverview: boolean, percentage: number) { - let rgbCode = colorFromPercentage(percentage); - let scoringValue = scoringValueFromPercentage(percentage); + const rgbCode = colorFromPercentage(percentage); + const scoringValue = scoringValueFromPercentage(percentage); if (percentage >= 100) { - cy.getZone('stretch', isOverview).should('have.attr', 'src').should('include', 'star-filled-icon.svg'); + cy.getZone("stretch", isOverview) + .should("have.attr", "src") + .should("include", "star-filled-icon.svg"); } - validateScoringWidth('fail', scoringValue.failPercent, isOverview); - validateScoringWidth('commit', scoringValue.commitPercent, isOverview); - validateScoringWidth('target', scoringValue.targetPercent, isOverview); + validateScoringWidth("fail", scoringValue.failPercent, isOverview); + validateScoringWidth("commit", scoringValue.commitPercent, isOverview); + validateScoringWidth("target", scoringValue.targetPercent, isOverview); if (percentage == 0) return; - validateScoringColor('fail', rgbCode, isOverview); - validateScoringColor('commit', rgbCode, isOverview); - validateScoringColor('target', rgbCode, isOverview); + validateScoringColor("fail", rgbCode, isOverview); + validateScoringColor("commit", rgbCode, isOverview); + validateScoringColor("target", rgbCode, isOverview); } export function getPercentageMetric(baseline: number, stretchGoal: number, value: number) { @@ -32,61 +34,65 @@ export function getPercentageMetric(baseline: number, stretchGoal: number, value } export function getPercentageOrdinal(zone: string) { - if (zone == 'stretch') return 101; - if (zone == 'target') return 99.99; - if (zone == 'commit') return 70; - if (zone == 'fail') return 30; + if (zone == "stretch") return 101; + if (zone == "target") return 99.99; + if (zone == "commit") return 70; + if (zone == "fail") return 30; return 0; } function validateScoringWidth(zone: string, percent: number, isOverview: boolean) { cy.getZone(zone, isOverview) .parent() - .invoke('width') + .invoke("width") .then((parentWidth) => { expect(parentWidth).not.to.be.undefined; cy.getZone(zone, isOverview) - .invoke('width') - .should('be.within', parentWidth! * (percent / 100) - 3, parentWidth! * (percent / 100) + 3); + .invoke("width") + .should("be.within", parentWidth! * (percent / 100) - 3, parentWidth! * (percent / 100) + 3); }); } function validateScoringColor(zone: string, rgbCode: string, isOverview: boolean) { - cy.getZone(zone, isOverview).invoke('css', 'background-color').should('equal', rgbCode); - if (rgbCode == 'rgba(0, 0, 0, 0)') { - cy.getByTestId('star-scoring').invoke('css', 'background-image').should('contain', 'scoring-stars'); - checkVisibilityOfScoringComponent(isOverview, 'block', 'star-scoring'); - checkVisibilityOfScoringComponent(isOverview, 'none', 'normal-scoring'); + cy.getZone(zone, isOverview) + .invoke("css", "background-color") + .should("equal", rgbCode); + if (rgbCode == "rgba(0, 0, 0, 0)") { + cy.getByTestId("star-scoring") + .invoke("css", "background-image") + .should("contain", "scoring-stars"); + checkVisibilityOfScoringComponent(isOverview, "block", "star-scoring"); + checkVisibilityOfScoringComponent(isOverview, "none", "normal-scoring"); } else { - checkVisibilityOfScoringComponent(isOverview, 'none', 'star-scoring'); - checkVisibilityOfScoringComponent(isOverview, 'flex', 'normal-scoring'); + checkVisibilityOfScoringComponent(isOverview, "none", "star-scoring"); + checkVisibilityOfScoringComponent(isOverview, "flex", "normal-scoring"); } } function checkVisibilityOfScoringComponent(isOverview: boolean, displayProperty: string, componentTestId: string) { - (isOverview ? cy.focused() : cy.getByTestId('side-panel')) + (isOverview ? cy.focused() : cy.getByTestId("side-panel")) .findByTestId(componentTestId) - .invoke('css', 'display') - .should('equal', displayProperty); + .invoke("css", "display") + .should("equal", displayProperty); } function colorFromPercentage(percentage: number) { - if (percentage >= 100) return 'rgba(0, 0, 0, 0)'; - if (percentage > 70) return 'rgb(30, 138, 41)'; - if (percentage > 30) return 'rgb(255, 214, 0)'; - return 'rgb(186, 56, 56)'; + if (percentage >= 100) return "rgba(0, 0, 0, 0)"; + if (percentage > 70) return "rgb(30, 138, 41)"; + if (percentage > 30) return "rgb(255, 214, 0)"; + return "rgb(186, 56, 56)"; } function scoringValueFromPercentage(percentage: number): ScoringValue { if (percentage >= 100) { return { failPercent: 0, commitPercent: 0, targetPercent: 0 }; } else if (percentage > 70) { - let targetPercent = (percentage - 70) * (100 / 30); + const targetPercent = (percentage - 70) * (100 / 30); return { failPercent: 100, commitPercent: 100, targetPercent: targetPercent }; } else if (percentage > 30) { - let commitPercent = (percentage - 30) * (100 / 40); + const commitPercent = (percentage - 30) * (100 / 40); return { failPercent: 100, commitPercent: commitPercent, targetPercent: -1 }; } - let failPercent = percentage * (100 / 30); + const failPercent = percentage * (100 / 30); return { failPercent: failPercent, commitPercent: -1, targetPercent: -1 }; } diff --git a/frontend/cypress/support/helper/utils.ts b/frontend/cypress/support/helper/utils.ts index 5b573b0b77..3d4cc61bf8 100644 --- a/frontend/cypress/support/helper/utils.ts +++ b/frontend/cypress/support/helper/utils.ts @@ -1,5 +1,5 @@ -import { v4 as uuidv4 } from 'uuid'; -import { keyCodeDefinitions } from 'cypress-real-events/keyCodeDefinitions'; +import { v4 as uuidv4 } from "uuid"; +import { keyCodeDefinitions } from "cypress-real-events/keyCodeDefinitions"; export const uniqueSuffix = (value: string): string => { return `${value}-${uuidv4()}`; @@ -11,7 +11,8 @@ export function pressUntilContains(text: string, key: keyof typeof keyCodeDefini } export function doUntilSelector(selector: string, tab: () => void, limit: number = 100, count: number = 0) { - const condition = (element: HTMLElement) => Cypress.$(element).is(selector); + const condition = (element: HTMLElement) => Cypress.$(element) + .is(selector); doUntil(condition, tab, limit, count); } @@ -27,12 +28,13 @@ function doUntil( ) { if (count >= limit) return; - cy.focused().then((element) => { - if (condition(element.get(0))) { - return; - } else { - tab(); - doUntil(condition, tab, limit, count + 1); - } - }); + cy.focused() + .then((element) => { + if (condition(element.get(0))) { + return; + } else { + tab(); + doUntil(condition, tab, limit, count + 1); + } + }); } diff --git a/frontend/setup-jest.ts b/frontend/setup-jest.ts index 1100b3e8a6..a702c63396 100644 --- a/frontend/setup-jest.ts +++ b/frontend/setup-jest.ts @@ -1 +1 @@ -import 'jest-preset-angular/setup-jest'; +import "jest-preset-angular/setup-jest"; diff --git a/frontend/src/app/app-routing.module.ts b/frontend/src/app/app-routing.module.ts index a45b15ce2b..0fe067f031 100644 --- a/frontend/src/app/app-routing.module.ts +++ b/frontend/src/app/app-routing.module.ts @@ -1,14 +1,14 @@ -import { inject, NgModule } from '@angular/core'; -import { ResolveFn, RouterModule, Routes } from '@angular/router'; -import { OverviewComponent } from './components/overview/overview.component'; -import { of } from 'rxjs'; -import { SidepanelComponent } from './shared/sidepanel/sidepanel.component'; -import { authGuard } from './guards/auth.guard'; -import { UserService } from './services/user.service'; -import { User } from './shared/types/model/User'; -import { OAuthService } from 'angular-oauth2-oidc'; -import { ObjectiveDetailComponent } from './components/objective-detail/objective-detail.component'; -import { KeyresultDetailComponent } from './components/keyresult-detail/keyresult-detail.component'; +import { inject, NgModule } from "@angular/core"; +import { ResolveFn, RouterModule, Routes } from "@angular/router"; +import { OverviewComponent } from "./components/overview/overview.component"; +import { of } from "rxjs"; +import { SidepanelComponent } from "./shared/sidepanel/sidepanel.component"; +import { authGuard } from "./guards/auth.guard"; +import { UserService } from "./services/user.service"; +import { User } from "./shared/types/model/User"; +import { OAuthService } from "angular-oauth2-oidc"; +import { ObjectiveDetailComponent } from "./components/objective-detail/objective-detail.component"; +import { KeyresultDetailComponent } from "./components/keyresult-detail/keyresult-detail.component"; const currentUserResolver: ResolveFn = () => { const oauthService = inject(OAuthService); @@ -21,22 +21,22 @@ const currentUserResolver: ResolveFn = () => { const routes: Routes = [ { - path: '', + path: "", component: OverviewComponent, resolve: { user: currentUserResolver, }, children: [ { - path: 'details', + path: "details", component: SidepanelComponent, children: [ { - path: 'objective/:id', + path: "objective/:id", component: ObjectiveDetailComponent, }, { - path: 'keyresult/:id', + path: "keyresult/:id", component: KeyresultDetailComponent, }, ], @@ -45,14 +45,14 @@ const routes: Routes = [ canActivate: [authGuard], }, { - path: 'team-management', - loadChildren: () => import('./team-management/team-management.module').then((m) => m.TeamManagementModule), + path: "team-management", + loadChildren: () => import("./team-management/team-management.module").then((m) => m.TeamManagementModule), canActivate: [authGuard], resolve: { user: currentUserResolver }, }, - { path: 'objective', redirectTo: 'details/objective' }, - { path: 'keyresult', redirectTo: 'details/keyresult' }, - { path: '**', redirectTo: '', pathMatch: 'full' }, + { path: "objective", redirectTo: "details/objective" }, + { path: "keyresult", redirectTo: "details/keyresult" }, + { path: "**", redirectTo: "", pathMatch: "full" }, ]; @NgModule({ diff --git a/frontend/src/app/app.component.spec.ts b/frontend/src/app/app.component.spec.ts index 05f5175a80..40e062f4ca 100644 --- a/frontend/src/app/app.component.spec.ts +++ b/frontend/src/app/app.component.spec.ts @@ -1,21 +1,21 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { AppComponent } from './app.component'; -import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; -import { TranslateTestingModule } from 'ngx-translate-testing'; -import { AuthConfig, OAuthModule, OAuthService } from 'angular-oauth2-oidc'; -import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { ComponentFixture, TestBed } from "@angular/core/testing"; +import { RouterTestingModule } from "@angular/router/testing"; +import { AppComponent } from "./app.component"; +import { CUSTOM_ELEMENTS_SCHEMA } from "@angular/core"; +import { TranslateTestingModule } from "ngx-translate-testing"; +import { AuthConfig, OAuthModule, OAuthService } from "angular-oauth2-oidc"; +import { HttpClientTestingModule } from "@angular/common/http/testing"; // @ts-ignore -import * as de from '../assets/i18n/de.json'; -import { HarnessLoader } from '@angular/cdk/testing'; -import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed'; -import { MatSidenavModule } from '@angular/material/sidenav'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { NavigationEnd, Routes } from '@angular/router'; -import { of } from 'rxjs'; -import { OverviewComponent } from './components/overview/overview.component'; -import { ObjectiveDetailComponent } from './components/objective-detail/objective-detail.component'; -import { CommonModule } from '@angular/common'; +import * as de from "../assets/i18n/de.json"; +import { HarnessLoader } from "@angular/cdk/testing"; +import { TestbedHarnessEnvironment } from "@angular/cdk/testing/testbed"; +import { MatSidenavModule } from "@angular/material/sidenav"; +import { NoopAnimationsModule } from "@angular/platform-browser/animations"; +import { NavigationEnd, Routes } from "@angular/router"; +import { of } from "rxjs"; +import { OverviewComponent } from "./components/overview/overview.component"; +import { ObjectiveDetailComponent } from "./components/objective-detail/objective-detail.component"; +import { CommonModule } from "@angular/common"; const oauthServiceMock = { configure(environment: AuthConfig): void {}, @@ -33,18 +33,18 @@ const oauthServiceMock = { const routerMock = { root: jest.fn(), // Router - events: of(new NavigationEnd(0, 'http://localhost:4200/objective/2', 'http://localhost:4200/objective/2')), + events: of(new NavigationEnd(0, "http://localhost:4200/objective/2", "http://localhost:4200/objective/2")), }; const routes: Routes = [ { - path: '', + path: "", component: OverviewComponent, - children: [{ path: 'objective/:id', component: ObjectiveDetailComponent, pathMatch: 'full' }], + children: [{ path: "objective/:id", component: ObjectiveDetailComponent, pathMatch: "full" }], }, ]; -describe('AppComponent', () => { +describe("AppComponent", () => { let component: AppComponent; let fixture: ComponentFixture; let loader: HarnessLoader; @@ -77,7 +77,8 @@ describe('AppComponent', () => { }); }); - test('should create the app', () => { - expect(component).toBeTruthy(); + test("should create the app", () => { + expect(component) + .toBeTruthy(); }); }); diff --git a/frontend/src/app/app.component.ts b/frontend/src/app/app.component.ts index 854233b3af..3731932728 100644 --- a/frontend/src/app/app.component.ts +++ b/frontend/src/app/app.component.ts @@ -1,26 +1,24 @@ -import { ChangeDetectionStrategy, Component } from '@angular/core'; -import { MatIconRegistry } from '@angular/material/icon'; -import { DomSanitizer } from '@angular/platform-browser'; +import { ChangeDetectionStrategy, Component } from "@angular/core"; +import { MatIconRegistry } from "@angular/material/icon"; +import { DomSanitizer } from "@angular/platform-browser"; @Component({ - selector: 'app-root', - templateUrl: './app.component.html', - styleUrls: ['./app.component.scss'], + selector: "app-root", + templateUrl: "./app.component.html", + styleUrls: ["./app.component.scss"], changeDetection: ChangeDetectionStrategy.OnPush, }) export class AppComponent { - readonly PATH_PREFIX = '../assets/icons/'; + readonly PATH_PREFIX = "../assets/icons/"; constructor( private matIconRegistry: MatIconRegistry, private domSanitizer: DomSanitizer, ) { this.matIconRegistry.addSvgIcon( - 'pz-search', - this.domSanitizer.bypassSecurityTrustResourceUrl(this.PATH_PREFIX + 'search-icon.svg'), + "pz-search", this.domSanitizer.bypassSecurityTrustResourceUrl(this.PATH_PREFIX + "search-icon.svg"), ); this.matIconRegistry.addSvgIcon( - 'pz-menu-icon', - this.domSanitizer.bypassSecurityTrustResourceUrl(this.PATH_PREFIX + 'three-dot-menu-icon.svg'), + "pz-menu-icon", this.domSanitizer.bypassSecurityTrustResourceUrl(this.PATH_PREFIX + "three-dot-menu-icon.svg"), ); } } diff --git a/frontend/src/app/app.module.ts b/frontend/src/app/app.module.ts index cd2e70a8d3..0a918efed6 100644 --- a/frontend/src/app/app.module.ts +++ b/frontend/src/app/app.module.ts @@ -1,74 +1,74 @@ -import { APP_INITIALIZER, CUSTOM_ELEMENTS_SCHEMA, Injector, NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -import { AppRoutingModule } from './app-routing.module'; -import { AppComponent } from './app.component'; +import { APP_INITIALIZER, CUSTOM_ELEMENTS_SCHEMA, Injector, NgModule } from "@angular/core"; +import { BrowserModule } from "@angular/platform-browser"; +import { AppRoutingModule } from "./app-routing.module"; +import { AppComponent } from "./app.component"; import { HTTP_INTERCEPTORS, HttpBackend, HttpClient, provideHttpClient, withInterceptorsFromDi, -} from '@angular/common/http'; -import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatSelectModule } from '@angular/material/select'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatIconModule } from '@angular/material/icon'; -import { MatMenuModule } from '@angular/material/menu'; -import { MatButtonModule } from '@angular/material/button'; -import { MatProgressBarModule } from '@angular/material/progress-bar'; -import { MatExpansionModule } from '@angular/material/expansion'; -import { MatInputModule } from '@angular/material/input'; -import { MatDialogModule } from '@angular/material/dialog'; -import { ToastrModule } from 'ngx-toastr'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core'; -import { TranslateHttpLoader } from '@ngx-translate/http-loader'; -import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE } from '@angular/material/core'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; -import { OAuthModule, OAuthService, OAuthStorage } from 'angular-oauth2-oidc'; -import { MatTooltipModule } from '@angular/material/tooltip'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatRadioModule } from '@angular/material/radio'; -import { ConfigService } from './services/config.service'; -import { firstValueFrom } from 'rxjs'; -import { environment } from '../environments/environment'; -import { TeamComponent } from './components/team/team.component'; -import { OverviewComponent } from './components/overview/overview.component'; -import { ObjectiveComponent } from './components/objective/objective.component'; -import { CommonModule, NgOptimizedImage } from '@angular/common'; -import { KeyresultComponent } from './components/keyresult/keyresult.component'; -import { KeyresultDetailComponent } from './components/keyresult-detail/keyresult-detail.component'; -import { ObjectiveDetailComponent } from './components/objective-detail/objective-detail.component'; -import { MatSidenavModule } from '@angular/material/sidenav'; -import { ConfidenceComponent } from './components/confidence/confidence.component'; -import { MatSliderModule } from '@angular/material/slider'; -import { MatDividerModule } from '@angular/material/divider'; -import { ApplicationBannerComponent } from './components/application-banner/application-banner.component'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { OverlayModule } from '@angular/cdk/overlay'; -import { QuarterFilterComponent } from './components/quarter-filter/quarter-filter.component'; -import { TeamFilterComponent } from './components/team-filter/team-filter.component'; -import { MatChipsModule } from '@angular/material/chips'; -import { Router } from '@angular/router'; -import { KeyresultTypeComponent } from './components/keyresult-type/keyresult-type.component'; -import { ObjectiveFilterComponent } from './components/objective-filter/objective-filter.component'; -import { ActionPlanComponent } from './components/action-plan/action-plan.component'; -import { CdkDrag, CdkDragHandle, CdkDropList } from '@angular/cdk/drag-drop'; -import { SharedModule } from './shared/shared.module'; -import { OauthInterceptor } from './interceptors/oauth.interceptor'; -import { ErrorInterceptor } from './interceptors/error-interceptor.service'; -import { CustomRouter } from './shared/customRouter'; -import { KeyResultFormComponent } from './components/key-result-form/key-result-form.component'; -import { KeyresultDialogComponent } from './components/keyresult-dialog/keyresult-dialog.component'; -import { CheckInHistoryDialogComponent } from './components/check-in-history-dialog/check-in-history-dialog.component'; -import { CheckInFormMetricComponent } from './components/checkin/check-in-form-metric/check-in-form-metric.component'; -import { CheckInFormOrdinalComponent } from './components/checkin/check-in-form-ordinal/check-in-form-ordinal.component'; -import { CheckInFormComponent } from './components/checkin/check-in-form/check-in-form.component'; -import { ApplicationTopBarComponent } from './components/application-top-bar/application-top-bar.component'; -import { A11yModule } from '@angular/cdk/a11y'; -import { CustomizationService } from './services/customization.service'; -import { MetricCheckInDirective } from './components/checkin/check-in-form-metric/metric-check-in-directive'; +} from "@angular/common/http"; +import { BrowserAnimationsModule } from "@angular/platform-browser/animations"; +import { MatFormFieldModule } from "@angular/material/form-field"; +import { MatSelectModule } from "@angular/material/select"; +import { FormsModule, ReactiveFormsModule } from "@angular/forms"; +import { MatIconModule } from "@angular/material/icon"; +import { MatMenuModule } from "@angular/material/menu"; +import { MatButtonModule } from "@angular/material/button"; +import { MatProgressBarModule } from "@angular/material/progress-bar"; +import { MatExpansionModule } from "@angular/material/expansion"; +import { MatInputModule } from "@angular/material/input"; +import { MatDialogModule } from "@angular/material/dialog"; +import { ToastrModule } from "ngx-toastr"; +import { MatProgressSpinnerModule } from "@angular/material/progress-spinner"; +import { TranslateLoader, TranslateModule, TranslateService } from "@ngx-translate/core"; +import { TranslateHttpLoader } from "@ngx-translate/http-loader"; +import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE } from "@angular/material/core"; +import { MomentDateAdapter } from "@angular/material-moment-adapter"; +import { OAuthModule, OAuthService, OAuthStorage } from "angular-oauth2-oidc"; +import { MatTooltipModule } from "@angular/material/tooltip"; +import { MatAutocompleteModule } from "@angular/material/autocomplete"; +import { MatRadioModule } from "@angular/material/radio"; +import { ConfigService } from "./services/config.service"; +import { firstValueFrom } from "rxjs"; +import { environment } from "../environments/environment"; +import { TeamComponent } from "./components/team/team.component"; +import { OverviewComponent } from "./components/overview/overview.component"; +import { ObjectiveComponent } from "./components/objective/objective.component"; +import { CommonModule, NgOptimizedImage } from "@angular/common"; +import { KeyresultComponent } from "./components/keyresult/keyresult.component"; +import { KeyresultDetailComponent } from "./components/keyresult-detail/keyresult-detail.component"; +import { ObjectiveDetailComponent } from "./components/objective-detail/objective-detail.component"; +import { MatSidenavModule } from "@angular/material/sidenav"; +import { ConfidenceComponent } from "./components/confidence/confidence.component"; +import { MatSliderModule } from "@angular/material/slider"; +import { MatDividerModule } from "@angular/material/divider"; +import { ApplicationBannerComponent } from "./components/application-banner/application-banner.component"; +import { MatCheckboxModule } from "@angular/material/checkbox"; +import { OverlayModule } from "@angular/cdk/overlay"; +import { QuarterFilterComponent } from "./components/quarter-filter/quarter-filter.component"; +import { TeamFilterComponent } from "./components/team-filter/team-filter.component"; +import { MatChipsModule } from "@angular/material/chips"; +import { Router } from "@angular/router"; +import { KeyresultTypeComponent } from "./components/keyresult-type/keyresult-type.component"; +import { ObjectiveFilterComponent } from "./components/objective-filter/objective-filter.component"; +import { ActionPlanComponent } from "./components/action-plan/action-plan.component"; +import { CdkDrag, CdkDragHandle, CdkDropList } from "@angular/cdk/drag-drop"; +import { SharedModule } from "./shared/shared.module"; +import { OauthInterceptor } from "./interceptors/oauth.interceptor"; +import { ErrorInterceptor } from "./interceptors/error-interceptor.service"; +import { CustomRouter } from "./shared/customRouter"; +import { KeyResultFormComponent } from "./components/key-result-form/key-result-form.component"; +import { KeyresultDialogComponent } from "./components/keyresult-dialog/keyresult-dialog.component"; +import { CheckInHistoryDialogComponent } from "./components/check-in-history-dialog/check-in-history-dialog.component"; +import { CheckInFormMetricComponent } from "./components/checkin/check-in-form-metric/check-in-form-metric.component"; +import { CheckInFormOrdinalComponent } from "./components/checkin/check-in-form-ordinal/check-in-form-ordinal.component"; +import { CheckInFormComponent } from "./components/checkin/check-in-form/check-in-form.component"; +import { ApplicationTopBarComponent } from "./components/application-top-bar/application-top-bar.component"; +import { A11yModule } from "@angular/cdk/a11y"; +import { CustomizationService } from "./services/customization.service"; +import { MetricCheckInDirective } from "./components/checkin/check-in-form-metric/metric-check-in-directive"; function initOauthFactory(configService: ConfigService, oauthService: OAuthService) { return async () => { @@ -82,7 +82,7 @@ function initOauthFactory(configService: ConfigService, oauthService: OAuthServi } export function createTranslateLoader(http: HttpBackend) { - return new TranslateHttpLoader(new HttpClient(http), './assets/i18n/', '.json'); + return new TranslateHttpLoader(new HttpClient(http), "./assets/i18n/", ".json"); } export function storageFactory(): OAuthStorage { @@ -91,13 +91,13 @@ export function storageFactory(): OAuthStorage { export const MY_FORMATS = { parse: { - dateInput: 'LL', + dateInput: "LL", }, display: { - dateInput: 'DD.MM.YYYY', - monthYearLabel: 'DD.MM.YYYY', - dateA11yLabel: 'DD.MM.YYYY', - monthYearA11yLabel: 'DD.MM.YYYY', + dateInput: "DD.MM.YYYY", + monthYearLabel: "DD.MM.YYYY", + dateA11yLabel: "DD.MM.YYYY", + monthYearA11yLabel: "DD.MM.YYYY", }, }; @@ -149,7 +149,7 @@ export const MY_FORMATS = { ToastrModule.forRoot(), MatProgressSpinnerModule, TranslateModule.forRoot({ - defaultLanguage: 'de', + defaultLanguage: "de", loader: { provide: TranslateLoader, useFactory: createTranslateLoader, diff --git a/frontend/src/app/components/action-plan/action-plan.component.html b/frontend/src/app/components/action-plan/action-plan.component.html index 68388cea32..be0faa4957 100644 --- a/frontend/src/app/components/action-plan/action-plan.component.html +++ b/frontend/src/app/components/action-plan/action-plan.component.html @@ -9,7 +9,11 @@ (cdkDropListDropped)="drop($event)" id="actionlist" > -
+
Drag indicator + >
+ > Delete bin + >
@@ -56,7 +60,7 @@ alt="Add action button" class="add-cross-button" id="add-action" - /> + > Weitere Action hinzufügen diff --git a/frontend/src/app/components/action-plan/action-plan.component.spec.ts b/frontend/src/app/components/action-plan/action-plan.component.spec.ts index 2ce210d5f0..8c06173f14 100644 --- a/frontend/src/app/components/action-plan/action-plan.component.spec.ts +++ b/frontend/src/app/components/action-plan/action-plan.component.spec.ts @@ -1,22 +1,22 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { ActionPlanComponent } from './action-plan.component'; -import { HttpClientTestingModule } from '@angular/common/http/testing'; -import { MatDialogRef } from '@angular/material/dialog'; -import { CdkDrag, CdkDropList } from '@angular/cdk/drag-drop'; -import { ActionService } from '../../services/action.service'; -import { action1, action2, action3, addedAction } from '../../shared/testData'; -import { BehaviorSubject, of } from 'rxjs'; -import { Action } from '../../shared/types/model/Action'; -import { TranslateModule, TranslateService } from '@ngx-translate/core'; -import { DialogService } from '../../services/dialog.service'; -import { ConfirmDialogComponent } from '../../shared/dialog/confirm-dialog/confirm-dialog.component'; +import { ComponentFixture, TestBed } from "@angular/core/testing"; + +import { ActionPlanComponent } from "./action-plan.component"; +import { HttpClientTestingModule } from "@angular/common/http/testing"; +import { MatDialogRef } from "@angular/material/dialog"; +import { CdkDrag, CdkDropList } from "@angular/cdk/drag-drop"; +import { ActionService } from "../../services/action.service"; +import { action1, action2, action3, addedAction } from "../../shared/testData"; +import { BehaviorSubject, of } from "rxjs"; +import { Action } from "../../shared/types/model/Action"; +import { TranslateModule, TranslateService } from "@ngx-translate/core"; +import { DialogService } from "../../services/dialog.service"; +import { ConfirmDialogComponent } from "../../shared/dialog/confirm-dialog/confirm-dialog.component"; const actionServiceMock = { deleteAction: jest.fn(), }; -describe('ActionPlanComponent', () => { +describe("ActionPlanComponent", () => { let component: ActionPlanComponent; let fixture: ComponentFixture; let matDialogRef: MatDialogRef; @@ -44,89 +44,103 @@ describe('ActionPlanComponent', () => { actionServiceMock.deleteAction.mockReset(); }); - it('should create', () => { - expect(component).toBeTruthy(); + it("should create", () => { + expect(component) + .toBeTruthy(); }); - it('should remove item from actionplan array', () => { + it("should remove item from actionplan array", () => { component.control = new BehaviorSubject([action1, action2]); actionServiceMock.deleteAction.mockReturnValue(of(null)); jest - .spyOn(component.dialogService, 'openConfirmDialog') + .spyOn(component.dialogService, "openConfirmDialog") .mockReturnValue({ afterClosed: () => of(true) } as MatDialogRef); component.removeAction(0); - expect(actionServiceMock.deleteAction).toHaveBeenCalledWith(action1.id); - expect(component.control.getValue()).toHaveLength(1); - expect(component.control.getValue()![0]).toBe(action2); - expect(component.control.getValue()![0].priority).toBe(0); + expect(actionServiceMock.deleteAction) + .toHaveBeenCalledWith(action1.id); + expect(component.control.getValue()) + .toHaveLength(1); + expect(component.control.getValue()![0]) + .toBe(action2); + expect(component.control.getValue()![0].priority) + .toBe(0); }); - it('should remove item from actionplan without opening dialog when action has no text and id', () => { - const dialogSpy = jest.spyOn(component.dialogService, 'open'); + it("should remove item from actionplan without opening dialog when action has no text and id", () => { + const dialogSpy = jest.spyOn(component.dialogService, "open"); component.control = new BehaviorSubject([action3]); component.removeAction(0); - expect(component.control.getValue()!).toHaveLength(0); - expect(dialogSpy).toHaveBeenCalledTimes(0); + expect(component.control.getValue()!) + .toHaveLength(0); + expect(dialogSpy) + .toHaveBeenCalledTimes(0); expect(actionServiceMock.deleteAction).not.toHaveBeenCalled(); }); - it('should decrease index of active item when index is the same as the one of the removed item', () => { - jest.spyOn(component.dialogService, 'open'); + it("should decrease index of active item when index is the same as the one of the removed item", () => { + jest.spyOn(component.dialogService, "open"); component.control = new BehaviorSubject([action2, action3, action1]); component.activeItem = 2; component.removeAction(2); - expect(component.activeItem).toBe(1); + expect(component.activeItem) + .toBe(1); }); - it('should add new action with empty text into array', () => { + it("should add new action with empty text into array", () => { component.control = new BehaviorSubject([]); component.keyResultId = addedAction.keyResultId; component.addNewAction(); - expect(component.control.getValue()).toHaveLength(1); - expect(component.control.getValue()![0]).toStrictEqual(addedAction); + expect(component.control.getValue()) + .toHaveLength(1); + expect(component.control.getValue()![0]) + .toStrictEqual(addedAction); }); - it('should decrease index of active item', () => { - const keyEvent = new KeyboardEvent('keydown', { key: 'ArrowUp' }); + it("should decrease index of active item", () => { + const keyEvent = new KeyboardEvent("keydown", { key: "ArrowUp" }); component.control.next([action1, action2, action3]); component.handleKeyDown(keyEvent, 2); expect((component.activeItem = 1)); - expect(component.control.getValue()!.toString()).toBe([action1, action3, action2].toString()); + expect(component.control.getValue()!.toString()) + .toBe([action1, action3, action2].toString()); expect(component.control.getValue()![0].priority == 0); expect(component.control.getValue()![1].priority == 1); expect(component.control.getValue()![2].priority == 2); }); - it('should increase index of active item', () => { - const keyEvent = new KeyboardEvent('keydown', { key: 'ArrowDown' }); + it("should increase index of active item", () => { + const keyEvent = new KeyboardEvent("keydown", { key: "ArrowDown" }); component.control.next([action1, action2, action3, action1]); component.handleKeyDown(keyEvent, 2); expect((component.activeItem = 3)); - expect(component.control.getValue()!.toString()).toBe([action1, action3, action1, action3].toString()); + expect(component.control.getValue()!.toString()) + .toBe([action1, action3, action1, action3].toString()); expect(component.control.getValue()![0].priority == 0); expect(component.control.getValue()![1].priority == 1); expect(component.control.getValue()![2].priority == 2); expect(component.control.getValue()![3].priority == 3); }); - it('should increase active item index', () => { + it("should increase active item index", () => { component.activeItem = 0; component.control.next([action1, action2, action3]); component.increaseActiveItemWithTab(); - expect(component.activeItem).toBe(1); + expect(component.activeItem) + .toBe(1); }); - it('should decrease active item index', () => { + it("should decrease active item index", () => { component.activeItem = 2; component.control.next([action1, action2, action3]); component.decreaseActiveItemWithShiftTab(); - expect(component.activeItem).toBe(1); + expect(component.activeItem) + .toBe(1); }); }); diff --git a/frontend/src/app/components/action-plan/action-plan.component.ts b/frontend/src/app/components/action-plan/action-plan.component.ts index e08f5da787..c9efffdb2a 100644 --- a/frontend/src/app/components/action-plan/action-plan.component.ts +++ b/frontend/src/app/components/action-plan/action-plan.component.ts @@ -1,22 +1,22 @@ -import { Component, ElementRef, Input, QueryList, ViewChildren } from '@angular/core'; -import { CdkDragDrop, moveItemInArray, transferArrayItem } from '@angular/cdk/drag-drop'; -import { Action } from '../../shared/types/model/Action'; -import { ActionService } from '../../services/action.service'; -import { BehaviorSubject } from 'rxjs'; -import { trackByFn } from '../../shared/common'; -import { DialogService } from '../../services/dialog.service'; +import { Component, ElementRef, Input, QueryList, ViewChildren } from "@angular/core"; +import { CdkDragDrop, moveItemInArray, transferArrayItem } from "@angular/cdk/drag-drop"; +import { Action } from "../../shared/types/model/Action"; +import { ActionService } from "../../services/action.service"; +import { BehaviorSubject } from "rxjs"; +import { trackByFn } from "../../shared/common"; +import { DialogService } from "../../services/dialog.service"; @Component({ - selector: 'app-action-plan', - templateUrl: './action-plan.component.html', - styleUrls: ['./action-plan.component.scss'], + selector: "app-action-plan", + templateUrl: "./action-plan.component.html", + styleUrls: ["./action-plan.component.scss"], }) export class ActionPlanComponent { @Input() control: BehaviorSubject = new BehaviorSubject([]); @Input() keyResultId!: number | null; activeItem: number = 0; - @ViewChildren('listItem') + @ViewChildren("listItem") listItems!: QueryList; constructor( @@ -26,11 +26,11 @@ export class ActionPlanComponent { handleKeyDown(event: Event, currentIndex: number) { let newIndex = currentIndex; - if ((event as KeyboardEvent).key === 'ArrowDown') { + if ((event as KeyboardEvent).key === "ArrowDown") { if (newIndex + 1 <= this.control.getValue()!.length - 1) { newIndex += 1; } - } else if ((event as KeyboardEvent).key === 'ArrowUp') { + } else if ((event as KeyboardEvent).key === "ArrowUp") { if (newIndex - 1 >= 0) { newIndex -= 1; } @@ -41,7 +41,7 @@ export class ActionPlanComponent { changeItemPosition(newIndex: number, currentIndex: number) { this.activeItem = newIndex; - let currentActionPlan: Action[] = this.control.getValue()!; + const currentActionPlan: Action[] = this.control.getValue()!; this.updateActionTexts(currentActionPlan); moveItemInArray(currentActionPlan, currentIndex, newIndex); currentActionPlan.forEach((action: Action, index: number) => (action.priority = index)); @@ -49,7 +49,8 @@ export class ActionPlanComponent { } updateActionTexts(currentActionPlan: Action[]) { - let texts = Array.from(this.listItems).map((input: any) => input.nativeElement.value); + const texts = Array.from(this.listItems) + .map((input: any) => input.nativeElement.value); currentActionPlan.forEach((action: Action, index: number) => (action.action = texts[index])); } @@ -66,11 +67,11 @@ export class ActionPlanComponent { } drop(event: CdkDragDrop) { - let value: string = (( + const value: string = (( event.container.element.nativeElement.children[event.previousIndex].children[1] )).value; const actions: Action[] = this.control.getValue()!; - if (actions[event.previousIndex].action == '' && value != '') { + if (actions[event.previousIndex].action == "" && value != "") { actions[event.previousIndex] = { ...actions[event.previousIndex], action: value }; this.control.next(actions); } @@ -92,18 +93,19 @@ export class ActionPlanComponent { } removeAction(index: number) { - let actions: Action[] = this.control.getValue()!; + const actions: Action[] = this.control.getValue()!; if (this.activeItem == index && this.activeItem > 0) { this.activeItem--; } - if (actions[index].action !== '' || actions[index].id) { + if (actions[index].action !== "" || actions[index].id) { this.dialogService - .openConfirmDialog('DELETE.ACTION') + .openConfirmDialog("DELETE.ACTION") .afterClosed() .subscribe((result) => { if (result) { if (actions[index].id) { - this.actionService.deleteAction(actions[index].id!).subscribe(); + this.actionService.deleteAction(actions[index].id!) + .subscribe(); } actions.splice(index, 1); this.control.next(actions); @@ -119,7 +121,7 @@ export class ActionPlanComponent { addNewAction() { const actions: Action[] = this.control.getValue()!; - actions.push({ action: '', priority: actions.length, keyResultId: this.keyResultId } as Action); + actions.push({ action: "", priority: actions.length, keyResultId: this.keyResultId } as Action); this.control.next(actions); this.activeItem = actions.length - 1; } diff --git a/frontend/src/app/components/application-banner/application-banner.component.html b/frontend/src/app/components/application-banner/application-banner.component.html index 7b7d5272e7..769146b732 100644 --- a/frontend/src/app/components/application-banner/application-banner.component.html +++ b/frontend/src/app/components/application-banner/application-banner.component.html @@ -27,10 +27,12 @@
{{ (quarterLabel$ | async) || quarterLabel$.getValue() - }} + }} Filter
-

Filter

+ +

Filter

+
diff --git a/frontend/src/app/components/application-banner/application-banner.component.spec.ts b/frontend/src/app/components/application-banner/application-banner.component.spec.ts index 86e542750c..0469a74399 100644 --- a/frontend/src/app/components/application-banner/application-banner.component.spec.ts +++ b/frontend/src/app/components/application-banner/application-banner.component.spec.ts @@ -1,24 +1,24 @@ -import { ComponentFixture, fakeAsync, TestBed, tick } from '@angular/core/testing'; - -import { ApplicationBannerComponent } from './application-banner.component'; -import { By } from '@angular/platform-browser'; -import { RefreshDataService } from '../../services/refresh-data.service'; -import { PUZZLE_TOP_BAR_HEIGHT } from '../../shared/constantLibary'; -import { TeamFilterComponent } from '../team-filter/team-filter.component'; -import { QuarterFilterComponent } from '../quarter-filter/quarter-filter.component'; -import { HttpClientTestingModule } from '@angular/common/http/testing'; -import { ActivatedRoute } from '@angular/router'; -import { ObjectiveFilterComponent } from '../objective-filter/objective-filter.component'; -import { of } from 'rxjs'; -import { MatExpansionModule } from '@angular/material/expansion'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatChipsModule } from '@angular/material/chips'; -import { MatSelectModule } from '@angular/material/select'; -import { MatIconModule } from '@angular/material/icon'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { OkrTangramComponent } from '../../shared/custom/okr-tangram/okr-tangram.component'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatInputModule } from '@angular/material/input'; +import { ComponentFixture, fakeAsync, TestBed, tick } from "@angular/core/testing"; + +import { ApplicationBannerComponent } from "./application-banner.component"; +import { By } from "@angular/platform-browser"; +import { RefreshDataService } from "../../services/refresh-data.service"; +import { PUZZLE_TOP_BAR_HEIGHT } from "../../shared/constantLibary"; +import { TeamFilterComponent } from "../team-filter/team-filter.component"; +import { QuarterFilterComponent } from "../quarter-filter/quarter-filter.component"; +import { HttpClientTestingModule } from "@angular/common/http/testing"; +import { ActivatedRoute } from "@angular/router"; +import { ObjectiveFilterComponent } from "../objective-filter/objective-filter.component"; +import { of } from "rxjs"; +import { MatExpansionModule } from "@angular/material/expansion"; +import { MatFormFieldModule } from "@angular/material/form-field"; +import { MatChipsModule } from "@angular/material/chips"; +import { MatSelectModule } from "@angular/material/select"; +import { MatIconModule } from "@angular/material/icon"; +import { NoopAnimationsModule } from "@angular/platform-browser/animations"; +import { OkrTangramComponent } from "../../shared/custom/okr-tangram/okr-tangram.component"; +import { FormsModule, ReactiveFormsModule } from "@angular/forms"; +import { MatInputModule } from "@angular/material/input"; class ResizeObserverMock { observe() {} @@ -37,7 +37,7 @@ const routeMock = { queryParams: of(null), }; -describe('ApplicationBannerComponent', () => { +describe("ApplicationBannerComponent", () => { //@ts-ignore global.ResizeObserver = ResizeObserverMock; let component: ApplicationBannerComponent; @@ -75,15 +75,16 @@ describe('ApplicationBannerComponent', () => { fixture.detectChanges(); }); - it('should create', () => { - expect(component).toBeTruthy(); + it("should create", () => { + expect(component) + .toBeTruthy(); }); - it('should should hide banner if scrolled down', fakeAsync(() => { + it("should should hide banner if scrolled down", fakeAsync(() => { //Set bannerHeight to default - let bannerHeight: number = 160; + const bannerHeight: number = 160; //Scroll more than the height of the banner - let scrollTop: number = 180; + const scrollTop: number = 180; //Set lastScrollPosition to smaller than scrollTop => user scrolls down component.lastScrollPosition = 160; component.bannerHeight = bannerHeight; @@ -94,14 +95,15 @@ describe('ApplicationBannerComponent', () => { //Assert that banner is hidden was changed fixture.detectChanges(); - expect(fixture.debugElement.query(By.css('#okrBanner')).attributes['style']).toContain( - 'top: -' + (PUZZLE_TOP_BAR_HEIGHT + bannerHeight), - ); + expect(fixture.debugElement.query(By.css("#okrBanner")).attributes["style"]) + .toContain( + "top: -" + (PUZZLE_TOP_BAR_HEIGHT + bannerHeight), + ); })); - it('should show banner if scrolled up', fakeAsync(() => { + it("should show banner if scrolled up", fakeAsync(() => { //Scroll more than the height of the banner - let scrollTop: number = 180; + const scrollTop: number = 180; //Set lastScrollPosition to bigger than scrollTop => user scrolls up component.lastScrollPosition = 200; @@ -111,13 +113,15 @@ describe('ApplicationBannerComponent', () => { //Assert that banner is visible fixture.detectChanges(); - expect(fixture.debugElement.query(By.css('#okrBanner')).attributes['style']).toContain( - 'top: ' + PUZZLE_TOP_BAR_HEIGHT, - ); + expect(fixture.debugElement.query(By.css("#okrBanner")).attributes["style"]) + .toContain( + "top: " + PUZZLE_TOP_BAR_HEIGHT, + ); })); - it('should call setOKRBannerStyle() when changing header appearance', () => { - jest.spyOn(component, 'refreshBanner').mockReturnValue(); + it("should call setOKRBannerStyle() when changing header appearance", () => { + jest.spyOn(component, "refreshBanner") + .mockReturnValue(); //Set bannerHeight to default and execute header appearance change component.bannerHeight = 160; @@ -125,14 +129,16 @@ describe('ApplicationBannerComponent', () => { //Assert that banner is visible fixture.detectChanges(); - expect(component.refreshBanner).toHaveBeenCalled(); + expect(component.refreshBanner) + .toHaveBeenCalled(); }); - it('should call correct method after call scroll()', () => { - jest.spyOn(component, 'changeHeaderAppearance'); + it("should call correct method after call scroll()", () => { + jest.spyOn(component, "changeHeaderAppearance"); component.scroll(); - expect(component.changeHeaderAppearance).toHaveBeenCalled(); + expect(component.changeHeaderAppearance) + .toHaveBeenCalled(); }); }); diff --git a/frontend/src/app/components/application-banner/application-banner.component.ts b/frontend/src/app/components/application-banner/application-banner.component.ts index d9a064f348..cc09bdf1b5 100644 --- a/frontend/src/app/components/application-banner/application-banner.component.ts +++ b/frontend/src/app/components/application-banner/application-banner.component.ts @@ -6,20 +6,20 @@ import { HostListener, OnDestroy, ViewChild, -} from '@angular/core'; -import { BehaviorSubject } from 'rxjs'; -import { RefreshDataService } from '../../services/refresh-data.service'; -import { DEFAULT_HEADER_HEIGHT_PX, PUZZLE_TOP_BAR_HEIGHT } from '../../shared/constantLibary'; +} from "@angular/core"; +import { BehaviorSubject } from "rxjs"; +import { RefreshDataService } from "../../services/refresh-data.service"; +import { DEFAULT_HEADER_HEIGHT_PX, PUZZLE_TOP_BAR_HEIGHT } from "../../shared/constantLibary"; @Component({ - selector: 'app-application-banner', - templateUrl: './application-banner.component.html', - styleUrls: ['./application-banner.component.scss'], + selector: "app-application-banner", + templateUrl: "./application-banner.component.html", + styleUrls: ["./application-banner.component.scss"], changeDetection: ChangeDetectionStrategy.OnPush, }) export class ApplicationBannerComponent implements AfterViewInit, OnDestroy { - @ViewChild('okrBanner') okrBanner!: ElementRef; - quarterLabel$: BehaviorSubject = new BehaviorSubject(''); + @ViewChild("okrBanner") okrBanner!: ElementRef; + quarterLabel$: BehaviorSubject = new BehaviorSubject(""); panelOpenState = false; resizeObserver: ResizeObserver; bannerHeight: number = DEFAULT_HEADER_HEIGHT_PX; @@ -41,14 +41,14 @@ export class ApplicationBannerComponent implements AfterViewInit, OnDestroy { } changeHeaderAppearance() { - let scrollTop: number = window.scrollY || document.documentElement.scrollTop; + const scrollTop: number = window.scrollY || document.documentElement.scrollTop; this.refreshBanner(scrollTop); this.lastScrollPosition = scrollTop; } refreshBanner(scrollTop: number) { const newBannerPadding = this.getBannerTopPadding(scrollTop); - this.okrBanner.nativeElement.style.top = newBannerPadding + 'px'; + this.okrBanner.nativeElement.style.top = newBannerPadding + "px"; const overviewPadding = this.getOverviewPadding(newBannerPadding, this.bannerHeight); this.refreshDataService.okrBannerHeightSubject.next(overviewPadding); @@ -64,7 +64,7 @@ export class ApplicationBannerComponent implements AfterViewInit, OnDestroy { return newBannerPadding < 0 ? PUZZLE_TOP_BAR_HEIGHT * 2 : paddingAmount; } - @HostListener('window:scroll') + @HostListener("window:scroll") scroll() { this.changeHeaderAppearance(); } diff --git a/frontend/src/app/components/application-top-bar/application-top-bar.component.html b/frontend/src/app/components/application-top-bar/application-top-bar.component.html index 4d764f97ea..baabdc128e 100644 --- a/frontend/src/app/components/application-top-bar/application-top-bar.component.html +++ b/frontend/src/app/components/application-top-bar/application-top-bar.component.html @@ -1,6 +1,10 @@
- + okr-logo + >
@@ -28,7 +36,11 @@ [attr.data-testId]="'help-button'" (click)="window.open(helpSiteUrl, '_blank')" > - + Hilfe @@ -39,15 +51,29 @@ [matMenuTriggerFor]="menu" class="topBarEntry flex-nowrap btn" > - + {{ userFullName }} expand_more expand_less
- - diff --git a/frontend/src/app/components/application-top-bar/application-top-bar.component.spec.ts b/frontend/src/app/components/application-top-bar/application-top-bar.component.spec.ts index 66fa554e88..5d081b5607 100644 --- a/frontend/src/app/components/application-top-bar/application-top-bar.component.spec.ts +++ b/frontend/src/app/components/application-top-bar/application-top-bar.component.spec.ts @@ -1,21 +1,21 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { ComponentFixture, TestBed } from "@angular/core/testing"; -import { ApplicationTopBarComponent } from './application-top-bar.component'; -import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; -import { DateTimeProvider, OAuthLogger, OAuthService, UrlHelperService } from 'angular-oauth2-oidc'; -import { HttpClient, HttpHandler } from '@angular/common/http'; -import { MatMenuModule } from '@angular/material/menu'; -import { HarnessLoader } from '@angular/cdk/testing'; -import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed'; -import { MatMenuHarness } from '@angular/material/menu/testing'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { MatDialogModule } from '@angular/material/dialog'; -import { NavigationEnd, Router } from '@angular/router'; -import { of } from 'rxjs'; -import { testUser } from '../../shared/testData'; -import { UserService } from '../../services/user.service'; -import { ConfigService } from '../../services/config.service'; -import { DialogService } from '../../services/dialog.service'; +import { ApplicationTopBarComponent } from "./application-top-bar.component"; +import { CUSTOM_ELEMENTS_SCHEMA } from "@angular/core"; +import { DateTimeProvider, OAuthLogger, OAuthService, UrlHelperService } from "angular-oauth2-oidc"; +import { HttpClient, HttpHandler } from "@angular/common/http"; +import { MatMenuModule } from "@angular/material/menu"; +import { HarnessLoader } from "@angular/cdk/testing"; +import { TestbedHarnessEnvironment } from "@angular/cdk/testing/testbed"; +import { MatMenuHarness } from "@angular/material/menu/testing"; +import { NoopAnimationsModule } from "@angular/platform-browser/animations"; +import { MatDialogModule } from "@angular/material/dialog"; +import { NavigationEnd, Router } from "@angular/router"; +import { of } from "rxjs"; +import { testUser } from "../../shared/testData"; +import { UserService } from "../../services/user.service"; +import { ConfigService } from "../../services/config.service"; +import { DialogService } from "../../services/dialog.service"; const oAuthMock = { getIdentityClaims: jest.fn(), @@ -28,7 +28,7 @@ const dialogServiceMock = { }; const routerMock = { - events: of(new NavigationEnd(1, '', '')), + events: of(new NavigationEnd(1, "", "")), navigateByUrl: jest.fn(), }; @@ -40,7 +40,7 @@ const configServiceMock = { config$: of({}), }; -describe('ApplicationTopBarComponent', () => { +describe("ApplicationTopBarComponent", () => { let component: ApplicationTopBarComponent; let fixture: ComponentFixture; let loader: HarnessLoader; @@ -74,7 +74,8 @@ describe('ApplicationTopBarComponent', () => { }, ], schemas: [CUSTOM_ELEMENTS_SCHEMA], - }).compileComponents(); + }) + .compileComponents(); fixture = TestBed.createComponent(ApplicationTopBarComponent); component = fixture.componentInstance; @@ -82,22 +83,27 @@ describe('ApplicationTopBarComponent', () => { component.ngOnInit(); }); - it('should create', () => { - expect(component).toBeTruthy(); + it("should create", () => { + expect(component) + .toBeTruthy(); }); - it('should set full name from user service', () => { - expect(component.userFullName).toBe('Bob Baumeister'); + it("should set full name from user service", () => { + expect(component.userFullName) + .toBe("Bob Baumeister"); }); - it('logout function should get called on button click', async () => { - routerMock.navigateByUrl.mockReturnValue(of().toPromise()); + it("logout function should get called on button click", async () => { + routerMock.navigateByUrl.mockReturnValue(of() + .toPromise()); const harness = await loader.getHarness(MatMenuHarness); await harness.open(); fixture.detectChanges(); - harness.getItems().then((items) => { - items[0].click(); - expect(oAuthMock.logOut).toBeCalledTimes(1); - }); + harness.getItems() + .then((items) => { + items[0].click(); + expect(oAuthMock.logOut) + .toBeCalledTimes(1); + }); }); }); diff --git a/frontend/src/app/components/application-top-bar/application-top-bar.component.ts b/frontend/src/app/components/application-top-bar/application-top-bar.component.ts index c5e7640771..8b5977b254 100644 --- a/frontend/src/app/components/application-top-bar/application-top-bar.component.ts +++ b/frontend/src/app/components/application-top-bar/application-top-bar.component.ts @@ -1,22 +1,22 @@ -import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; -import { OAuthService } from 'angular-oauth2-oidc'; -import { BehaviorSubject, Subscription } from 'rxjs'; -import { ConfigService } from '../../services/config.service'; -import { NavigationEnd, Router } from '@angular/router'; -import { UserService } from '../../services/user.service'; -import { getFullNameFromUser } from '../../shared/types/model/User'; +import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from "@angular/core"; +import { OAuthService } from "angular-oauth2-oidc"; +import { BehaviorSubject, Subscription } from "rxjs"; +import { ConfigService } from "../../services/config.service"; +import { NavigationEnd, Router } from "@angular/router"; +import { UserService } from "../../services/user.service"; +import { getFullNameFromUser } from "../../shared/types/model/User"; @Component({ - selector: 'app-application-top-bar', - templateUrl: './application-top-bar.component.html', - styleUrls: ['./application-top-bar.component.scss'], + selector: "app-application-top-bar", + templateUrl: "./application-top-bar.component.html", + styleUrls: ["./application-top-bar.component.scss"], changeDetection: ChangeDetectionStrategy.OnPush, }) export class ApplicationTopBarComponent implements OnInit, OnDestroy { - userFullName: string = ''; + userFullName: string = ""; menuIsOpen = false; - logoSrc$ = new BehaviorSubject('assets/images/empty.svg'); - helpSiteUrl = new BehaviorSubject('https://en.wikipedia.org/wiki/Objectives_and_key_results'); + logoSrc$ = new BehaviorSubject("assets/images/empty.svg"); + helpSiteUrl = new BehaviorSubject("https://en.wikipedia.org/wiki/Objectives_and_key_results"); private subscription?: Subscription; constructor( @@ -47,9 +47,10 @@ export class ApplicationTopBarComponent implements OnInit, OnDestroy { logOut() { const currentUrlTree = this.router.createUrlTree([], { queryParams: {} }); - this.router.navigateByUrl(currentUrlTree).then(() => { - this.oauthService.logOut(); - }); + this.router.navigateByUrl(currentUrlTree) + .then(() => { + this.oauthService.logOut(); + }); } private initUserFullName() { diff --git a/frontend/src/app/components/check-in-history-dialog/check-in-history-dialog.component.html b/frontend/src/app/components/check-in-history-dialog/check-in-history-dialog.component.html index f3cb6896d8..e704d0f41d 100644 --- a/frontend/src/app/components/check-in-history-dialog/check-in-history-dialog.component.html +++ b/frontend/src/app/components/check-in-history-dialog/check-in-history-dialog.component.html @@ -15,7 +15,12 @@ *ngIf="!isComplete && checkIn.writeable" [attr.data-testId]="'edit-check-in'" > - edit check-in + edit check-in
@@ -48,7 +53,12 @@

Massnahmen:

- +
diff --git a/frontend/src/app/components/check-in-history-dialog/check-in-history-dialog.component.spec.ts b/frontend/src/app/components/check-in-history-dialog/check-in-history-dialog.component.spec.ts index ee75865c64..d0e7c68a25 100644 --- a/frontend/src/app/components/check-in-history-dialog/check-in-history-dialog.component.spec.ts +++ b/frontend/src/app/components/check-in-history-dialog/check-in-history-dialog.component.spec.ts @@ -1,25 +1,25 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { ComponentFixture, TestBed } from "@angular/core/testing"; -import { CheckInHistoryDialogComponent } from './check-in-history-dialog.component'; -import { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog'; -import { provideHttpClientTesting } from '@angular/common/http/testing'; -import { checkInMetric, checkInMetricWriteableFalse, keyResult } from '../../shared/testData'; -import { By } from '@angular/platform-browser'; -import { DialogService } from '../../services/dialog.service'; -import { TranslateModule, TranslateService } from '@ngx-translate/core'; -import { MatIconModule } from '@angular/material/icon'; -import { SpinnerComponent } from '../../shared/custom/spinner/spinner.component'; -import { MatProgressSpinner } from '@angular/material/progress-spinner'; -import { provideRouter } from '@angular/router'; -import { provideHttpClient } from '@angular/common/http'; -import { DialogTemplateCoreComponent } from '../../shared/custom/dialog-template-core/dialog-template-core.component'; -import { MatDividerModule } from '@angular/material/divider'; +import { CheckInHistoryDialogComponent } from "./check-in-history-dialog.component"; +import { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from "@angular/material/dialog"; +import { provideHttpClientTesting } from "@angular/common/http/testing"; +import { checkInMetric, checkInMetricWriteableFalse, keyResult } from "../../shared/testData"; +import { By } from "@angular/platform-browser"; +import { DialogService } from "../../services/dialog.service"; +import { TranslateModule, TranslateService } from "@ngx-translate/core"; +import { MatIconModule } from "@angular/material/icon"; +import { SpinnerComponent } from "../../shared/custom/spinner/spinner.component"; +import { MatProgressSpinner } from "@angular/material/progress-spinner"; +import { provideRouter } from "@angular/router"; +import { provideHttpClient } from "@angular/common/http"; +import { DialogTemplateCoreComponent } from "../../shared/custom/dialog-template-core/dialog-template-core.component"; +import { MatDividerModule } from "@angular/material/divider"; const checkInService = { getAllCheckInOfKeyResult: jest.fn(), }; -describe('CheckInHistoryDialogComponent', () => { +describe("CheckInHistoryDialogComponent", () => { let component: CheckInHistoryDialogComponent; let fixture: ComponentFixture; @@ -39,19 +39,21 @@ describe('CheckInHistoryDialogComponent', () => { ], }); jest - .spyOn(checkInService, 'getAllCheckInOfKeyResult') + .spyOn(checkInService, "getAllCheckInOfKeyResult") .mockReturnValue([checkInMetric, checkInMetricWriteableFalse]); fixture = TestBed.createComponent(CheckInHistoryDialogComponent); component = fixture.componentInstance; fixture.detectChanges(); }); - it('should create', () => { - expect(component).toBeTruthy(); + it("should create", () => { + expect(component) + .toBeTruthy(); }); - it.skip('should not display edit check-in button if writeable is false', async () => { - const buttons = fixture.debugElement.queryAll(By.css('button')); - expect(buttons.length).toBe(1); + it.skip("should not display edit check-in button if writeable is false", async () => { + const buttons = fixture.debugElement.queryAll(By.css("button")); + expect(buttons.length) + .toBe(1); }); }); diff --git a/frontend/src/app/components/check-in-history-dialog/check-in-history-dialog.component.ts b/frontend/src/app/components/check-in-history-dialog/check-in-history-dialog.component.ts index 19b1866b44..96ffbda97d 100644 --- a/frontend/src/app/components/check-in-history-dialog/check-in-history-dialog.component.ts +++ b/frontend/src/app/components/check-in-history-dialog/check-in-history-dialog.component.ts @@ -1,19 +1,19 @@ -import { Component, Inject, OnInit } from '@angular/core'; -import { CheckInMin } from '../../shared/types/model/CheckInMin'; -import { CheckInService } from '../../services/check-in.service'; -import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; -import { DATE_FORMAT } from '../../shared/constantLibary'; -import { KeyResult } from '../../shared/types/model/KeyResult'; -import { CheckInFormComponent } from '../checkin/check-in-form/check-in-form.component'; -import { Observable, of } from 'rxjs'; -import { KeyResultMetric } from '../../shared/types/model/KeyResultMetric'; -import { RefreshDataService } from '../../services/refresh-data.service'; -import { DialogService } from '../../services/dialog.service'; +import { Component, Inject, OnInit } from "@angular/core"; +import { CheckInMin } from "../../shared/types/model/CheckInMin"; +import { CheckInService } from "../../services/check-in.service"; +import { MAT_DIALOG_DATA, MatDialogRef } from "@angular/material/dialog"; +import { DATE_FORMAT } from "../../shared/constantLibary"; +import { KeyResult } from "../../shared/types/model/KeyResult"; +import { CheckInFormComponent } from "../checkin/check-in-form/check-in-form.component"; +import { Observable, of } from "rxjs"; +import { KeyResultMetric } from "../../shared/types/model/KeyResultMetric"; +import { RefreshDataService } from "../../services/refresh-data.service"; +import { DialogService } from "../../services/dialog.service"; @Component({ - selector: 'app-check-in-history-dialog', - templateUrl: './check-in-history-dialog.component.html', - styleUrls: ['./check-in-history-dialog.component.scss'], + selector: "app-check-in-history-dialog", + templateUrl: "./check-in-history-dialog.component.html", + styleUrls: ["./check-in-history-dialog.component.scss"], }) export class CheckInHistoryDialogComponent implements OnInit { keyResult!: KeyResult; @@ -42,11 +42,12 @@ export class CheckInHistoryDialogComponent implements OnInit { checkIn: checkIn, }, }); - dialogRef.afterClosed().subscribe(() => { - this.loadCheckInHistory(); - this.refreshDataService.reloadKeyResultSubject.next(); - this.refreshDataService.markDataRefresh(); - }); + dialogRef.afterClosed() + .subscribe(() => { + this.loadCheckInHistory(); + this.refreshDataService.reloadKeyResultSubject.next(); + this.refreshDataService.markDataRefresh(); + }); } loadCheckInHistory() { diff --git a/frontend/src/app/components/checkin/check-in-form-metric/check-in-form-metric.component.html b/frontend/src/app/components/checkin/check-in-form-metric/check-in-form-metric.component.html index a8b15fc2e0..e13f1bf125 100644 --- a/frontend/src/app/components/checkin/check-in-form-metric/check-in-form-metric.component.html +++ b/frontend/src/app/components/checkin/check-in-form-metric/check-in-form-metric.component.html @@ -12,7 +12,7 @@ formControlName="value" id="value" metricCheckIn - /> + >
{{ generateUnitLabel() }} diff --git a/frontend/src/app/components/checkin/check-in-form-metric/check-in-form-metric.component.spec.ts b/frontend/src/app/components/checkin/check-in-form-metric/check-in-form-metric.component.spec.ts index 6287808fcb..bd9f51f1eb 100644 --- a/frontend/src/app/components/checkin/check-in-form-metric/check-in-form-metric.component.spec.ts +++ b/frontend/src/app/components/checkin/check-in-form-metric/check-in-form-metric.component.spec.ts @@ -1,18 +1,18 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { ComponentFixture, TestBed, waitForAsync } from "@angular/core/testing"; -import { CheckInFormMetricComponent } from './check-in-form-metric.component'; -import { checkInMetric, keyResultMetric } from '../../../shared/testData'; -import { FormControl, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms'; -import { MatDialogModule } from '@angular/material/dialog'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { MatSelectModule } from '@angular/material/select'; -import { MatInputModule } from '@angular/material/input'; -import { MatRadioModule } from '@angular/material/radio'; -import { Unit } from '../../../shared/types/enums/Unit'; -import { TranslateTestingModule } from 'ngx-translate-testing'; -import * as de from '../../../../assets/i18n/de.json'; +import { CheckInFormMetricComponent } from "./check-in-form-metric.component"; +import { checkInMetric, keyResultMetric } from "../../../shared/testData"; +import { FormControl, FormGroup, ReactiveFormsModule, Validators } from "@angular/forms"; +import { MatDialogModule } from "@angular/material/dialog"; +import { NoopAnimationsModule } from "@angular/platform-browser/animations"; +import { MatSelectModule } from "@angular/material/select"; +import { MatInputModule } from "@angular/material/input"; +import { MatRadioModule } from "@angular/material/radio"; +import { Unit } from "../../../shared/types/enums/Unit"; +import { TranslateTestingModule } from "ngx-translate-testing"; +import * as de from "../../../../assets/i18n/de.json"; -describe('CheckInFormComponent', () => { +describe("CheckInFormComponent", () => { let component: CheckInFormMetricComponent; let fixture: ComponentFixture; @@ -36,38 +36,44 @@ describe('CheckInFormComponent', () => { component.keyResult = keyResultMetric; component.checkIn = checkInMetric; component.dialogForm = new FormGroup({ - value: new FormControl('', [Validators.required]), + value: new FormControl("", [Validators.required]), confidence: new FormControl(5, [Validators.required, Validators.min(1), Validators.max(10)]), }); fixture.detectChanges(); }); - it('should create', () => { - expect(component).toBeTruthy(); + it("should create", () => { + expect(component) + .toBeTruthy(); }); - it('should format percent correctly', waitForAsync(async () => { + it("should format percent correctly", waitForAsync(async () => { component.keyResult = { ...keyResultMetric, unit: Unit.PERCENT }; - expect(component.generateUnitLabel()).toEqual('%'); + expect(component.generateUnitLabel()) + .toEqual("%"); })); - it('should format chf correctly', waitForAsync(async () => { + it("should format chf correctly", waitForAsync(async () => { component.keyResult = { ...keyResultMetric, unit: Unit.CHF }; - expect(component.generateUnitLabel()).toEqual('CHF'); + expect(component.generateUnitLabel()) + .toEqual("CHF"); })); - it('should format eur correctly', waitForAsync(async () => { + it("should format eur correctly", waitForAsync(async () => { component.keyResult = { ...keyResultMetric, unit: Unit.EUR }; - expect(component.generateUnitLabel()).toEqual('EUR'); + expect(component.generateUnitLabel()) + .toEqual("EUR"); })); - it('should format fte correctly', waitForAsync(async () => { + it("should format fte correctly", waitForAsync(async () => { component.keyResult = { ...keyResultMetric, unit: Unit.FTE }; - expect(component.generateUnitLabel()).toEqual('FTE'); + expect(component.generateUnitLabel()) + .toEqual("FTE"); })); - it('should format number correctly', waitForAsync(async () => { + it("should format number correctly", waitForAsync(async () => { component.keyResult = { ...keyResultMetric, unit: Unit.NUMBER }; - expect(component.generateUnitLabel()).toEqual(''); + expect(component.generateUnitLabel()) + .toEqual(""); })); }); diff --git a/frontend/src/app/components/checkin/check-in-form-metric/check-in-form-metric.component.ts b/frontend/src/app/components/checkin/check-in-form-metric/check-in-form-metric.component.ts index 032f42373b..229649f39d 100644 --- a/frontend/src/app/components/checkin/check-in-form-metric/check-in-form-metric.component.ts +++ b/frontend/src/app/components/checkin/check-in-form-metric/check-in-form-metric.component.ts @@ -1,14 +1,14 @@ -import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core'; -import { FormGroup, Validators } from '@angular/forms'; -import { KeyResultMetric } from '../../../shared/types/model/KeyResultMetric'; -import { CheckInMin } from '../../../shared/types/model/CheckInMin'; -import { formInputCheck, hasFormFieldErrors } from '../../../shared/common'; -import { TranslateService } from '@ngx-translate/core'; +import { ChangeDetectionStrategy, Component, Input, OnInit } from "@angular/core"; +import { FormGroup, Validators } from "@angular/forms"; +import { KeyResultMetric } from "../../../shared/types/model/KeyResultMetric"; +import { CheckInMin } from "../../../shared/types/model/CheckInMin"; +import { formInputCheck, hasFormFieldErrors } from "../../../shared/common"; +import { TranslateService } from "@ngx-translate/core"; @Component({ - selector: 'app-check-in-form-metric', - templateUrl: './check-in-form-metric.component.html', - styleUrls: ['./check-in-form-metric.component.scss'], + selector: "app-check-in-form-metric", + templateUrl: "./check-in-form-metric.component.html", + styleUrls: ["./check-in-form-metric.component.scss"], changeDetection: ChangeDetectionStrategy.OnPush, }) export class CheckInFormMetricComponent implements OnInit { @@ -24,25 +24,25 @@ export class CheckInFormMetricComponent implements OnInit { constructor(private translate: TranslateService) {} ngOnInit() { - this.dialogForm.controls['value'].setValidators([Validators.required, Validators.pattern('^-?\\d+\\.?\\d*$')]); + this.dialogForm.controls["value"].setValidators([Validators.required, Validators.pattern("^-?\\d+\\.?\\d*$")]); } generateUnitLabel(): string { switch (this.keyResult.unit) { - case 'PERCENT': - return '%'; - case 'CHF': - return 'CHF'; - case 'EUR': - return 'EUR'; - case 'FTE': - return 'FTE'; + case "PERCENT": + return "%"; + case "CHF": + return "CHF"; + case "EUR": + return "EUR"; + case "FTE": + return "FTE"; default: - return ''; + return ""; } } getErrorMessage(error: string, field: string): string { - return field + this.translate.instant('DIALOG_ERRORS.' + error); + return field + this.translate.instant("DIALOG_ERRORS." + error); } } diff --git a/frontend/src/app/components/checkin/check-in-form-metric/metric-check-in-directive.spec.ts b/frontend/src/app/components/checkin/check-in-form-metric/metric-check-in-directive.spec.ts index acd3577f2e..f826c4ae31 100644 --- a/frontend/src/app/components/checkin/check-in-form-metric/metric-check-in-directive.spec.ts +++ b/frontend/src/app/components/checkin/check-in-form-metric/metric-check-in-directive.spec.ts @@ -1,25 +1,27 @@ -import { MetricCheckInDirective } from './metric-check-in-directive'; +import { MetricCheckInDirective } from "./metric-check-in-directive"; -describe('MetricCheckInDirective', () => { - it('create an instance', () => { +describe("MetricCheckInDirective", () => { + it("create an instance", () => { const directive = new MetricCheckInDirective(); - expect(directive).toBeTruthy(); + expect(directive) + .toBeTruthy(); }); it.each([ - ['HelloWorld200', 200], - ['200HelloWorld', 200], + ["HelloWorld200", 200], + ["200HelloWorld", 200], ["200'000", 200000], - ['1050&%ç*', 1050], - ['-1', -1], - ['-ç13&%', -13], - ])('should parse value %s correctly to %s', (value: string, expected: number) => { + ["1050&%ç*", 1050], + ["-1", -1], + ["-ç13&%", -13], + ])("should parse value %s correctly to %s", (value: string, expected: number) => { const mockOnChange = jest.fn(); const directive = new MetricCheckInDirective(); directive.registerOnChange(mockOnChange); directive.handleInput(value); - expect(mockOnChange).toHaveBeenCalledWith(expected); + expect(mockOnChange) + .toHaveBeenCalledWith(expected); }); }); diff --git a/frontend/src/app/components/checkin/check-in-form-metric/metric-check-in-directive.ts b/frontend/src/app/components/checkin/check-in-form-metric/metric-check-in-directive.ts index d7fa625061..dc03033106 100644 --- a/frontend/src/app/components/checkin/check-in-form-metric/metric-check-in-directive.ts +++ b/frontend/src/app/components/checkin/check-in-form-metric/metric-check-in-directive.ts @@ -1,8 +1,8 @@ -import { Directive, HostListener, forwardRef } from '@angular/core'; -import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'; +import { Directive, HostListener, forwardRef } from "@angular/core"; +import { ControlValueAccessor, NG_VALUE_ACCESSOR } from "@angular/forms"; @Directive({ - selector: '[metricCheckIn]', + selector: "[metricCheckIn]", providers: [ { provide: NG_VALUE_ACCESSOR, @@ -27,13 +27,16 @@ export class MetricCheckInDirective implements ControlValueAccessor { // does not need to be implemented } - @HostListener('input', ['$event.target.value']) + @HostListener("input", ["$event.target.value"]) handleInput(param: string): void { - const value: string = param || '0'; - if (value.toString().at(0) == '-') { - this.onChange(+('-' + value.toString().replace(this.CHAR_REGEX, ''))); + const value: string = param || "0"; + if (value.toString() + .at(0) == "-") { + this.onChange(+("-" + value.toString() + .replace(this.CHAR_REGEX, ""))); return; } - this.onChange(Number(value.toString().replace(this.CHAR_REGEX, ''))); + this.onChange(Number(value.toString() + .replace(this.CHAR_REGEX, ""))); } } diff --git a/frontend/src/app/components/checkin/check-in-form-ordinal/check-in-form-ordinal.component.html b/frontend/src/app/components/checkin/check-in-form-ordinal/check-in-form-ordinal.component.html index 1477819976..a15793ca9b 100644 --- a/frontend/src/app/components/checkin/check-in-form-ordinal/check-in-form-ordinal.component.html +++ b/frontend/src/app/components/checkin/check-in-form-ordinal/check-in-form-ordinal.component.html @@ -1,26 +1,46 @@
- - + +
Fail:  Commit / Target / Stretch noch nicht erreicht
- +
Commit: {{ keyResult.commitZone }}
- +
Target: {{ keyResult.targetZone }}
- +
Stretch: {{ keyResult.stretchZone }}
diff --git a/frontend/src/app/components/checkin/check-in-form-ordinal/check-in-form-ordinal.component.spec.ts b/frontend/src/app/components/checkin/check-in-form-ordinal/check-in-form-ordinal.component.spec.ts index f1b32bf4c0..a2a1a7a7bb 100644 --- a/frontend/src/app/components/checkin/check-in-form-ordinal/check-in-form-ordinal.component.spec.ts +++ b/frontend/src/app/components/checkin/check-in-form-ordinal/check-in-form-ordinal.component.spec.ts @@ -1,20 +1,20 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { ComponentFixture, TestBed, waitForAsync } from "@angular/core/testing"; -import { CheckInFormOrdinalComponent } from './check-in-form-ordinal.component'; -import { FormControl, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms'; -import { keyResultOrdinalMin } from '../../../shared/testData'; -import { KeyResultOrdinal } from '../../../shared/types/model/KeyResultOrdinal'; -import { MatDialogModule } from '@angular/material/dialog'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { MatSelectModule } from '@angular/material/select'; -import { MatInputModule } from '@angular/material/input'; -import { MatRadioModule } from '@angular/material/radio'; -import { Zone } from '../../../shared/types/enums/Zone'; -import { MatRadioButtonHarness } from '@angular/material/radio/testing'; -import { HarnessLoader } from '@angular/cdk/testing'; -import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed'; +import { CheckInFormOrdinalComponent } from "./check-in-form-ordinal.component"; +import { FormControl, FormGroup, ReactiveFormsModule, Validators } from "@angular/forms"; +import { keyResultOrdinalMin } from "../../../shared/testData"; +import { KeyResultOrdinal } from "../../../shared/types/model/KeyResultOrdinal"; +import { MatDialogModule } from "@angular/material/dialog"; +import { NoopAnimationsModule } from "@angular/platform-browser/animations"; +import { MatSelectModule } from "@angular/material/select"; +import { MatInputModule } from "@angular/material/input"; +import { MatRadioModule } from "@angular/material/radio"; +import { Zone } from "../../../shared/types/enums/Zone"; +import { MatRadioButtonHarness } from "@angular/material/radio/testing"; +import { HarnessLoader } from "@angular/cdk/testing"; +import { TestbedHarnessEnvironment } from "@angular/cdk/testing/testbed"; -describe('CheckInFormOrdinalComponent', () => { +describe("CheckInFormOrdinalComponent", () => { let component: CheckInFormOrdinalComponent; let fixture: ComponentFixture; let loader: HarnessLoader; @@ -35,49 +35,56 @@ describe('CheckInFormOrdinalComponent', () => { component = fixture.componentInstance; component.keyResult = keyResultOrdinalMin as unknown as KeyResultOrdinal; component.dialogForm = new FormGroup({ - value: new FormControl('', [Validators.required]), + value: new FormControl("", [Validators.required]), confidence: new FormControl(5, [Validators.required, Validators.min(1), Validators.max(10)]), }); fixture.detectChanges(); loader = TestbedHarnessEnvironment.loader(fixture); }); - it('should create', () => { - expect(component).toBeTruthy(); + it("should create", () => { + expect(component) + .toBeTruthy(); }); - it('should set zone of check-in to fail if value is empty', waitForAsync(async () => { - expect(component.dialogForm.controls['value'].value).toBe(''); + it("should set zone of check-in to fail if value is empty", waitForAsync(async () => { + expect(component.dialogForm.controls["value"].value) + .toBe(""); })); - it('should set zone to Fail', waitForAsync(async () => { + it("should set zone to Fail", waitForAsync(async () => { const radioButtons = await loader.getAllHarnesses(MatRadioButtonHarness); await radioButtons[0].check(); - expect(component.dialogForm.controls['value'].value).toBe(Zone.FAIL); + expect(component.dialogForm.controls["value"].value) + .toBe(Zone.FAIL); })); - it('should set zone to Commit', waitForAsync(async () => { + it("should set zone to Commit", waitForAsync(async () => { const radioButtons = await loader.getAllHarnesses(MatRadioButtonHarness); await radioButtons[1].check(); - expect(component.dialogForm.controls['value'].value).toBe(Zone.COMMIT); + expect(component.dialogForm.controls["value"].value) + .toBe(Zone.COMMIT); })); - it('should set zone to Target', waitForAsync(async () => { + it("should set zone to Target", waitForAsync(async () => { const radioButtons = await loader.getAllHarnesses(MatRadioButtonHarness); await radioButtons[2].check(); - expect(component.dialogForm.controls['value'].value).toBe(Zone.TARGET); + expect(component.dialogForm.controls["value"].value) + .toBe(Zone.TARGET); })); - it('should set zone to Stretch', waitForAsync(async () => { + it("should set zone to Stretch", waitForAsync(async () => { const radioButtons = await loader.getAllHarnesses(MatRadioButtonHarness); await radioButtons[3].check(); - expect(component.dialogForm.controls['value'].value).toBe(Zone.STRETCH); + expect(component.dialogForm.controls["value"].value) + .toBe(Zone.STRETCH); })); - it('should be able to switch options ', waitForAsync(async () => { + it("should be able to switch options ", waitForAsync(async () => { const radioButtons = await loader.getAllHarnesses(MatRadioButtonHarness); await radioButtons[3].check(); await radioButtons[1].check(); - expect(component.dialogForm.controls['value'].value).toBe(Zone.COMMIT); + expect(component.dialogForm.controls["value"].value) + .toBe(Zone.COMMIT); })); }); diff --git a/frontend/src/app/components/checkin/check-in-form-ordinal/check-in-form-ordinal.component.ts b/frontend/src/app/components/checkin/check-in-form-ordinal/check-in-form-ordinal.component.ts index 192c5156fb..7e6824c951 100644 --- a/frontend/src/app/components/checkin/check-in-form-ordinal/check-in-form-ordinal.component.ts +++ b/frontend/src/app/components/checkin/check-in-form-ordinal/check-in-form-ordinal.component.ts @@ -1,13 +1,13 @@ -import { Component, Input } from '@angular/core'; -import { FormGroup } from '@angular/forms'; -import { KeyResultOrdinal } from '../../../shared/types/model/KeyResultOrdinal'; -import { Zone } from '../../../shared/types/enums/Zone'; -import { CheckInMin } from '../../../shared/types/model/CheckInMin'; +import { Component, Input } from "@angular/core"; +import { FormGroup } from "@angular/forms"; +import { KeyResultOrdinal } from "../../../shared/types/model/KeyResultOrdinal"; +import { Zone } from "../../../shared/types/enums/Zone"; +import { CheckInMin } from "../../../shared/types/model/CheckInMin"; @Component({ - selector: 'app-check-in-form-ordinal', - templateUrl: './check-in-form-ordinal.component.html', - styleUrls: ['./check-in-form-ordinal.component.scss'], + selector: "app-check-in-form-ordinal", + templateUrl: "./check-in-form-ordinal.component.html", + styleUrls: ["./check-in-form-ordinal.component.scss"], }) export class CheckInFormOrdinalComponent { @Input() diff --git a/frontend/src/app/components/checkin/check-in-form/check-in-form.component.html b/frontend/src/app/components/checkin/check-in-form/check-in-form.component.html index 9be0aa023a..ab546c2027 100644 --- a/frontend/src/app/components/checkin/check-in-form/check-in-form.component.html +++ b/frontend/src/app/components/checkin/check-in-form/check-in-form.component.html @@ -12,12 +12,14 @@

Key Result

Action Plan:

- - -
+ +
{{ action.action }}
@@ -25,8 +27,7 @@

Key Result

- Kommentar/ Veränderung seit letztem Check-in (optional):