diff --git a/e2e-playwright/.eslintignore b/e2e-playwright/.eslintignore
new file mode 100644
index 000000000..d15f86d1c
--- /dev/null
+++ b/e2e-playwright/.eslintignore
@@ -0,0 +1,4 @@
+cucumber.js
+init.ts
+playwright.config.ts
+env.d.ts
\ No newline at end of file
diff --git a/e2e-playwright/.eslintrc.json b/e2e-playwright/.eslintrc.json
new file mode 100644
index 000000000..cdd8c5f0a
--- /dev/null
+++ b/e2e-playwright/.eslintrc.json
@@ -0,0 +1,42 @@
+{
+ "env": {
+ "browser": true,
+ "node": true
+ },
+ "parser": "@typescript-eslint/parser",
+ "parserOptions": {
+ "project": "tsconfig.json",
+ "sourceType": "module"
+ },
+ "plugins": ["import", "simple-import-sort", "n", "@typescript-eslint"],
+ "extends": [
+ "eslint:recommended",
+ "plugin:import/typescript",
+ "plugin:@typescript-eslint/eslint-recommended",
+ "plugin:@typescript-eslint/recommended",
+ "plugin:prettier/recommended"
+ ],
+ "rules": {
+ "import/no-cycle": "error",
+ "n/no-extraneous-import": "error",
+ "@typescript-eslint/ban-ts-ignore": "off",
+ "@typescript-eslint/ban-ts-comment": "off",
+ "@typescript-eslint/explicit-module-boundary-types": "off",
+ "@typescript-eslint/explicit-function-return-type": "off",
+ "@typescript-eslint/no-use-before-define": "off",
+ "@typescript-eslint/interface-name-prefix": "off",
+ "@typescript-eslint/member-delimiter-style": "off",
+ "@typescript-eslint/no-explicit-any": "error",
+ "@typescript-eslint/no-non-null-assertion": "error",
+ "simple-import-sort/imports": "error",
+ "simple-import-sort/exports": "error"
+ },
+ "overrides": [
+ {
+ "files": ["test/**"],
+ "rules": {
+ "@typescript-eslint/no-non-null-assertion": "off"
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/e2e-playwright/config/cucumber.js b/e2e-playwright/config/cucumber.js
index 339a10de9..7213fd230 100644
--- a/e2e-playwright/config/cucumber.js
+++ b/e2e-playwright/config/cucumber.js
@@ -1,3 +1,4 @@
+/* eslint-disable */
module.exports = {
default: {
timeout: 30000,
diff --git a/e2e-playwright/eslint.config.js b/e2e-playwright/eslint.config.js
new file mode 100644
index 000000000..6499b4df1
--- /dev/null
+++ b/e2e-playwright/eslint.config.js
@@ -0,0 +1,36 @@
+import { defineConfig } from "eslint/config";
+import js from "@eslint/js";
+import globals from "globals";
+import tseslint from "typescript-eslint";
+
+export default defineConfig([
+ js.configs.recommended,
+ {
+ files: ["**/*.{ts,tsx}"],
+ languageOptions: {
+ parser: tseslint.parser,
+ parserOptions: {
+ project: "./tsconfig.json",
+ },
+ globals: {
+ ...globals.node,
+ ...globals.browser,
+ },
+ },
+ plugins: {
+ "@typescript-eslint": tseslint.plugin,
+ },
+ rules: {
+ "no-trailing-spaces": "error",
+ "no-multiple-empty-lines": ["error", { max: 1 }],
+ "semi-spacing": ["error", { before: false, after: true }],
+ "keyword-spacing": ["error", { before: true, after: true }],
+ "space-infix-ops": "error",
+ "space-before-blocks": "error",
+ "space-before-function-paren": ["error", "never"],
+ "object-curly-spacing": ["error", "always"],
+ "array-bracket-spacing": ["error", "never"],
+ 'no-invalid-this': 'off',
+ },
+ },
+]);
\ No newline at end of file
diff --git a/e2e-playwright/package-lock.json b/e2e-playwright/package-lock.json
index 0ced03933..1a881775b 100644
--- a/e2e-playwright/package-lock.json
+++ b/e2e-playwright/package-lock.json
@@ -13,14 +13,20 @@
},
"devDependencies": {
"@cucumber/cucumber": "^11.2.0",
+ "@eslint/js": "^9.27.0",
"@playwright/test": "^1.48.2",
"@types/node": "^22.15.3",
+ "@typescript-eslint/eslint-plugin": "^8.32.1",
+ "@typescript-eslint/parser": "^8.32.1",
"cross-env": "^7.0.3",
"dotenv": "^16.5.0",
+ "eslint": "^9.27.0",
"fs-extra": "^11.3.0",
+ "globals": "^16.1.0",
"multiple-cucumber-html-reporter": "^3.9.2",
"ts-node": "^10.9.2",
"typescript": "^5.8.3",
+ "typescript-eslint": "^8.32.1",
"winston": "^3.17.0"
}
},
@@ -399,6 +405,271 @@
"kuler": "^2.0.0"
}
},
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz",
+ "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eslint-visitor-keys": "^3.4.3"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.12.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
+ "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/config-array": {
+ "version": "0.20.0",
+ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz",
+ "integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/object-schema": "^2.1.6",
+ "debug": "^4.3.1",
+ "minimatch": "^3.1.2"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/config-array/node_modules/brace-expansion": {
+ "version": "1.1.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/@eslint/config-array/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/@eslint/config-helpers": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.2.tgz",
+ "integrity": "sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/core": {
+ "version": "0.14.0",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz",
+ "integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@types/json-schema": "^7.0.15"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz",
+ "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^10.0.1",
+ "globals": "^14.0.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/brace-expansion": {
+ "version": "1.1.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/@eslint/eslintrc/node_modules/globals": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
+ "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "9.27.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.27.0.tgz",
+ "integrity": "sha512-G5JD9Tu5HJEu4z2Uo4aHY2sLV64B7CDMXxFzqzjl3NKd6RVzSXNoE80jk7Y0lJkTTkjiIhBAqmlYwjuBY3tvpA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ }
+ },
+ "node_modules/@eslint/object-schema": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz",
+ "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/plugin-kit": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.1.tgz",
+ "integrity": "sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^0.14.0",
+ "levn": "^0.4.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@humanfs/core": {
+ "version": "0.19.1",
+ "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
+ "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanfs/node": {
+ "version": "0.16.6",
+ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz",
+ "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@humanfs/core": "^0.19.1",
+ "@humanwhocodes/retry": "^0.3.0"
+ },
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz",
+ "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/retry": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
+ "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
"node_modules/@isaacs/cliui": {
"version": "8.0.2",
"resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
@@ -470,6 +741,44 @@
"@jridgewell/sourcemap-codec": "^1.4.10"
}
},
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
"node_modules/@pkgjs/parseargs": {
"version": "0.11.0",
"resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
@@ -535,6 +844,20 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/@types/estree": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz",
+ "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@types/node": {
"version": "22.15.3",
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.3.tgz",
@@ -566,6 +889,212 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "8.32.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.32.1.tgz",
+ "integrity": "sha512-6u6Plg9nP/J1GRpe/vcjjabo6Uc5YQPAMxsgQyGC/I0RuukiG1wIe3+Vtg3IrSCVJDmqK3j8adrtzXSENRtFgg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.10.0",
+ "@typescript-eslint/scope-manager": "8.32.1",
+ "@typescript-eslint/type-utils": "8.32.1",
+ "@typescript-eslint/utils": "8.32.1",
+ "@typescript-eslint/visitor-keys": "8.32.1",
+ "graphemer": "^1.4.0",
+ "ignore": "^7.0.0",
+ "natural-compare": "^1.4.0",
+ "ts-api-utils": "^2.1.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0",
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <5.9.0"
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "8.32.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.32.1.tgz",
+ "integrity": "sha512-LKMrmwCPoLhM45Z00O1ulb6jwyVr2kr3XJp+G+tSEZcbauNnScewcQwtJqXDhXeYPDEjZ8C1SjXm015CirEmGg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "8.32.1",
+ "@typescript-eslint/types": "8.32.1",
+ "@typescript-eslint/typescript-estree": "8.32.1",
+ "@typescript-eslint/visitor-keys": "8.32.1",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <5.9.0"
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "8.32.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.32.1.tgz",
+ "integrity": "sha512-7IsIaIDeZn7kffk7qXC3o6Z4UblZJKV3UBpkvRNpr5NSyLji7tvTcvmnMNYuYLyh26mN8W723xpo3i4MlD33vA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.32.1",
+ "@typescript-eslint/visitor-keys": "8.32.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "8.32.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.32.1.tgz",
+ "integrity": "sha512-mv9YpQGA8iIsl5KyUPi+FGLm7+bA4fgXaeRcFKRDRwDMu4iwrSHeDPipwueNXhdIIZltwCJv+NkxftECbIZWfA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/typescript-estree": "8.32.1",
+ "@typescript-eslint/utils": "8.32.1",
+ "debug": "^4.3.4",
+ "ts-api-utils": "^2.1.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <5.9.0"
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "8.32.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.32.1.tgz",
+ "integrity": "sha512-YmybwXUJcgGqgAp6bEsgpPXEg6dcCyPyCSr0CAAueacR/CCBi25G3V8gGQ2kRzQRBNol7VQknxMs9HvVa9Rvfg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "8.32.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.32.1.tgz",
+ "integrity": "sha512-Y3AP9EIfYwBb4kWGb+simvPaqQoT5oJuzzj9m0i6FCY6SPvlomY2Ei4UEMm7+FXtlNJbor80ximyslzaQF6xhg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.32.1",
+ "@typescript-eslint/visitor-keys": "8.32.1",
+ "debug": "^4.3.4",
+ "fast-glob": "^3.3.2",
+ "is-glob": "^4.0.3",
+ "minimatch": "^9.0.4",
+ "semver": "^7.6.0",
+ "ts-api-utils": "^2.1.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <5.9.0"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": {
+ "version": "7.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
+ "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "8.32.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.32.1.tgz",
+ "integrity": "sha512-DsSFNIgLSrc89gpq1LJB7Hm1YpuhK086DRDJSNrewcGvYloWW1vZLHBTIvarKZDcAORIy/uWNx8Gad+4oMpkSA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.7.0",
+ "@typescript-eslint/scope-manager": "8.32.1",
+ "@typescript-eslint/types": "8.32.1",
+ "@typescript-eslint/typescript-estree": "8.32.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <5.9.0"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "8.32.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.32.1.tgz",
+ "integrity": "sha512-ar0tjQfObzhSaW3C3QNmTc5ofj0hDoNQ5XWrCy6zDyabdr0TWhCkClp+rywGNj/odAFBVzzJrK4tEq5M4Hmu4w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.32.1",
+ "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/@typescript-eslint/visitor-keys/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==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
"node_modules/acorn": {
"version": "8.14.1",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz",
@@ -579,6 +1108,16 @@
"node": ">=0.4.0"
}
},
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
"node_modules/acorn-walk": {
"version": "8.3.4",
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz",
@@ -592,6 +1131,23 @@
"node": ">=0.4.0"
}
},
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
"node_modules/ansi-regex": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
@@ -630,7 +1186,14 @@
"resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
"integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
"dev": true,
- "license": "MIT"
+ "license": "MIT"
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true,
+ "license": "Python-2.0"
},
"node_modules/assertion-error-formatter": {
"version": "3.0.0",
@@ -668,6 +1231,19 @@
"balanced-match": "^1.0.0"
}
},
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/buffer-from": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
@@ -675,6 +1251,16 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/capital-case": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz",
@@ -820,6 +1406,13 @@
"node": ">=14"
}
},
+ "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/create-require": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
@@ -879,6 +1472,13 @@
}
}
},
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/define-lazy-prop": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
@@ -953,6 +1553,295 @@
"node": ">=0.8.0"
}
},
+ "node_modules/eslint": {
+ "version": "9.27.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.27.0.tgz",
+ "integrity": "sha512-ixRawFQuMB9DZ7fjU3iGGganFDp3+45bPOdaRurcFHSXO1e/sYwUX/FtQZpLZJR6SjMoJH8hR2pPEAfDyCoU2Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.12.1",
+ "@eslint/config-array": "^0.20.0",
+ "@eslint/config-helpers": "^0.2.1",
+ "@eslint/core": "^0.14.0",
+ "@eslint/eslintrc": "^3.3.1",
+ "@eslint/js": "9.27.0",
+ "@eslint/plugin-kit": "^0.3.1",
+ "@humanfs/node": "^0.16.6",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@humanwhocodes/retry": "^0.4.2",
+ "@types/estree": "^1.0.6",
+ "@types/json-schema": "^7.0.15",
+ "ajv": "^6.12.4",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.6",
+ "debug": "^4.3.2",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^8.3.0",
+ "eslint-visitor-keys": "^4.2.0",
+ "espree": "^10.3.0",
+ "esquery": "^1.5.0",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^8.0.0",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ },
+ "peerDependencies": {
+ "jiti": "*"
+ },
+ "peerDependenciesMeta": {
+ "jiti": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz",
+ "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint/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/eslint/node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/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==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint/node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/eslint/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/espree": {
+ "version": "10.3.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz",
+ "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "acorn": "^8.14.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^4.2.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/espree/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==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
+ "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.8"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fastq": {
+ "version": "1.19.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
+ "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
"node_modules/fecha": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz",
@@ -976,6 +1865,32 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/file-entry-cache": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
+ "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flat-cache": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/find": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/find/-/find-0.3.0.tgz",
@@ -986,6 +1901,23 @@
"traverse-chain": "~0.1.0"
}
},
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/find-up-simple": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz",
@@ -999,6 +1931,27 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/flat-cache": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
+ "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.4"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz",
+ "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
+ "dev": true,
+ "license": "ISC"
+ },
"node_modules/fn.name": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz",
@@ -1074,6 +2027,19 @@
"url": "https://github.com/sponsors/isaacs"
}
},
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
"node_modules/global-dirs": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz",
@@ -1090,6 +2056,19 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/globals": {
+ "version": "16.1.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-16.1.0.tgz",
+ "integrity": "sha512-aibexHNbb/jiUSObBgpHLj+sIuUmJnYcgXBlrfsiDZ9rt4aF2TFRbyLgZ2iFQuVZ1K5Mx3FVkbKRSgKrbK3K2g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/graceful-fs": {
"version": "4.2.11",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
@@ -1097,6 +2076,13 @@
"dev": true,
"license": "ISC"
},
+ "node_modules/graphemer": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/has-ansi": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-4.0.1.tgz",
@@ -1130,7 +2116,54 @@
"lru-cache": "^10.0.1"
},
"engines": {
- "node": "^16.14.0 || >=18.0.0"
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.4.tgz",
+ "integrity": "sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
+ "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/import-fresh/node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.19"
}
},
"node_modules/indent-string": {
@@ -1196,6 +2229,16 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
@@ -1206,6 +2249,19 @@
"node": ">=8"
}
},
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/is-installed-globally": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz",
@@ -1223,6 +2279,16 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
"node_modules/is-path-inside": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
@@ -1289,6 +2355,40 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/jsonfile": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
@@ -1302,6 +2402,16 @@
"graceful-fs": "^4.1.6"
}
},
+ "node_modules/keyv": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
"node_modules/knuth-shuffle-seeded": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/knuth-shuffle-seeded/-/knuth-shuffle-seeded-1.0.6.tgz",
@@ -1319,6 +2429,36 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
@@ -1402,6 +2542,30 @@
"dev": true,
"license": "ISC"
},
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
"node_modules/mime": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz",
@@ -1502,6 +2666,13 @@
"thenify-all": "^1.0.0"
}
},
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/no-case": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
@@ -1566,6 +2737,56 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/optionator": {
+ "version": "0.9.4",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
+ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.5"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/package-json-from-dist": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
@@ -1586,6 +2807,19 @@
"node": ">=0.10.0"
}
},
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/parse-json": {
"version": "8.3.0",
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz",
@@ -1604,6 +2838,16 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/path-key": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
@@ -1638,6 +2882,19 @@
"dev": true,
"license": "ISC"
},
+ "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/playwright": {
"version": "1.52.0",
"resolved": "https://registry.npmjs.org/playwright/-/playwright-1.52.0.tgz",
@@ -1670,6 +2927,16 @@
"node": ">=18"
}
},
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
"node_modules/progress": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
@@ -1687,6 +2954,37 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
"node_modules/read-package-up": {
"version": "11.0.0",
"resolved": "https://registry.npmjs.org/read-package-up/-/read-package-up-11.0.0.tgz",
@@ -1800,6 +3098,41 @@
"node": ">=8"
}
},
+ "node_modules/reusify": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
+ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
"node_modules/safe-buffer": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
@@ -2137,6 +3470,19 @@
"url": "https://github.com/chalk/ansi-regex?sponsor=1"
}
},
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/supports-color": {
"version": "8.1.1",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
@@ -2200,6 +3546,19 @@
"node": ">=14.14"
}
},
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
"node_modules/toposort": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz",
@@ -2224,6 +3583,19 @@
"node": ">= 14.0.0"
}
},
+ "node_modules/ts-api-utils": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
+ "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.12"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4"
+ }
+ },
"node_modules/ts-node": {
"version": "10.9.2",
"resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz",
@@ -2275,6 +3647,19 @@
"dev": true,
"license": "0BSD"
},
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
"node_modules/type-fest": {
"version": "4.40.1",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.40.1.tgz",
@@ -2302,6 +3687,29 @@
"node": ">=14.17"
}
},
+ "node_modules/typescript-eslint": {
+ "version": "8.32.1",
+ "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.32.1.tgz",
+ "integrity": "sha512-D7el+eaDHAmXvrZBy1zpzSNIRqnCOrkwTgZxTu3MUqRWk8k0q9m9Ho4+vPf7iHtgUfrK/o8IZaEApsxPlHTFCg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/eslint-plugin": "8.32.1",
+ "@typescript-eslint/parser": "8.32.1",
+ "@typescript-eslint/utils": "8.32.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <5.9.0"
+ }
+ },
"node_modules/undici-types": {
"version": "6.21.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
@@ -2342,6 +3750,16 @@
"tslib": "^2.0.3"
}
},
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
"node_modules/util-arity": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/util-arity/-/util-arity-1.1.0.tgz",
@@ -2451,6 +3869,16 @@
"node": ">=0.1.90"
}
},
+ "node_modules/word-wrap": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/wrap-ansi": {
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
@@ -2589,6 +4017,19 @@
"node": ">=6"
}
},
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/yup": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/yup/-/yup-1.2.0.tgz",
diff --git a/e2e-playwright/package.json b/e2e-playwright/package.json
index 320bb6ece..bc84432c7 100644
--- a/e2e-playwright/package.json
+++ b/e2e-playwright/package.json
@@ -8,7 +8,8 @@
"test": "cross-env ENV=prod FORCE_COLOR=0 cucumber-js --config=config/cucumber.js",
"test:stage": "cross-env ENV=stage FORCE_COLOR=0 cucumber-js --config=config/cucumber.js",
"posttest": "npx ts-node src/helper/report/report.ts",
- "test:failed": "cucumber-js -p rerun @rerun.txt"
+ "test:failed": "cucumber-js -p rerun @rerun.txt",
+ "lint": "eslint 'src/**/*.ts' --fix"
},
"keywords": [],
"author": "",
@@ -16,14 +17,20 @@
"description": "",
"devDependencies": {
"@cucumber/cucumber": "^11.2.0",
+ "@eslint/js": "^9.27.0",
"@playwright/test": "^1.48.2",
"@types/node": "^22.15.3",
+ "@typescript-eslint/eslint-plugin": "^8.32.1",
+ "@typescript-eslint/parser": "^8.32.1",
"cross-env": "^7.0.3",
"dotenv": "^16.5.0",
+ "eslint": "^9.27.0",
"fs-extra": "^11.3.0",
+ "globals": "^16.1.0",
"multiple-cucumber-html-reporter": "^3.9.2",
"ts-node": "^10.9.2",
"typescript": "^5.8.3",
+ "typescript-eslint": "^8.32.1",
"winston": "^3.17.0"
},
"dependencies": {
diff --git a/e2e-playwright/src/features/Topics.feature b/e2e-playwright/src/features/Topics.feature
index fae1f05cd..b241fb000 100644
--- a/e2e-playwright/src/features/Topics.feature
+++ b/e2e-playwright/src/features/Topics.feature
@@ -31,7 +31,7 @@ Feature: Topics page visibility and functions
And Topics CopySelectedTopic active is: "false"
And Topics PurgeMessagesOfSelectedTopics active is: "false"
- Scenario: Topics serchfield and ShowInternalTopics
+ Scenario: Topics serchfield and ShowInternalTopics
Given Topics is visible
When click on Topics link
And Topics Serchfield visible
@@ -43,4 +43,3 @@ Feature: Topics page visibility and functions
Then Topic named: "__consumer_offsets" visible is: "true"
When Topics serchfield input "users"
Then Topic named: "users" visible is: "true"
-
diff --git a/e2e-playwright/src/features/TopicsCreate.feature b/e2e-playwright/src/features/TopicsCreate.feature
index 397173163..5e663857f 100644
--- a/e2e-playwright/src/features/TopicsCreate.feature
+++ b/e2e-playwright/src/features/TopicsCreate.feature
@@ -1,6 +1,6 @@
Feature: TopicsCreate page
- Scenario: TopicCreate elemets visible
+ Scenario: TopicCreate elemets visible
Given Topics is visible
When click on Topics link
Given Topics AddATopic clicked
@@ -22,32 +22,32 @@ Feature: TopicsCreate page
Given TopicCreate Cancel button visible is: "true"
Given TopicCreate CreateTopic button visible is: "true"
-Scenario: TopicCreate ui functions
- Given Topics is visible
- When click on Topics link
- Given Topics AddATopic clicked
- Given TopicCreate heading visible is: "true"
- When TopicCreate Topic name starts with: "NewAutoTopic"
- When TopicCreate Number of partitons: 2
- When TopicCreate Time to retain data one day
- When TopicCreate Create topic clicked
- Then Header starts with: "NewAutoTopic"
- When click on Topics link
- Then Topic name started with: "NewAutoTopic" visible is: "true"
+ Scenario: TopicCreate ui functions
+ Given Topics is visible
+ When click on Topics link
+ Given Topics AddATopic clicked
+ Given TopicCreate heading visible is: "true"
+ When TopicCreate Topic name starts with: "NewAutoTopic"
+ When TopicCreate Number of partitons: 2
+ When TopicCreate Time to retain data one day
+ When TopicCreate Create topic clicked
+ Then Header starts with: "NewAutoTopic"
+ When click on Topics link
+ Then Topic name started with: "NewAutoTopic" visible is: "true"
-Scenario: TopicCreate time to retain data functions
- Given Topics is visible
- When click on Topics link
- Given Topics AddATopic clicked
- Given TopicCreate TimeToRetainData input visible is: "true"
- Then TopicCreate TimeToRetainData value is: ""
- When TopicCreate 12Hours button clicked
- Then TopicCreate TimeToRetainData value is: "43200000"
- When TopicCreate 1Day button clicked
- Then TopicCreate TimeToRetainData value is: "86400000"
- When TopicCreate 2Day button clicked
- Then TopicCreate TimeToRetainData value is: "172800000"
- When TopicCreate 7Day button clicked
- Then TopicCreate TimeToRetainData value is: "604800000"
- When TopicCreate 4Weeks button clicked
- Then TopicCreate TimeToRetainData value is: "2419200000"
\ No newline at end of file
+ Scenario: TopicCreate time to retain data functions
+ Given Topics is visible
+ When click on Topics link
+ Given Topics AddATopic clicked
+ Given TopicCreate TimeToRetainData input visible is: "true"
+ Then TopicCreate TimeToRetainData value is: ""
+ When TopicCreate 12Hours button clicked
+ Then TopicCreate TimeToRetainData value is: "43200000"
+ When TopicCreate 1Day button clicked
+ Then TopicCreate TimeToRetainData value is: "86400000"
+ When TopicCreate 2Day button clicked
+ Then TopicCreate TimeToRetainData value is: "172800000"
+ When TopicCreate 7Day button clicked
+ Then TopicCreate TimeToRetainData value is: "604800000"
+ When TopicCreate 4Weeks button clicked
+ Then TopicCreate TimeToRetainData value is: "2419200000"
diff --git a/e2e-playwright/src/features/navigation.feature b/e2e-playwright/src/features/navigation.feature
index 1f51ab1ff..645f8e81e 100644
--- a/e2e-playwright/src/features/navigation.feature
+++ b/e2e-playwright/src/features/navigation.feature
@@ -39,4 +39,4 @@ Feature: Navigation panel links
Scenario: Navigate to Dashboard
Given Dashboard is visible
When click on Dashboard link
- Then Dashboard heading visible
\ No newline at end of file
+ Then Dashboard heading visible
diff --git a/e2e-playwright/src/helper/browsers/browserManager.ts b/e2e-playwright/src/helper/browsers/browserManager.ts
index b51bab645..b30ab8dac 100644
--- a/e2e-playwright/src/helper/browsers/browserManager.ts
+++ b/e2e-playwright/src/helper/browsers/browserManager.ts
@@ -4,6 +4,7 @@ const options: LaunchOptions = {
headless: process.env.HEAD !== "true",
args: ['--lang=en-US'],
}
+
export const invokeBrowser = () => {
const browserType = process.env.npm_config_BROWSER || "chrome";
diff --git a/e2e-playwright/src/helper/types/env.d.ts b/e2e-playwright/src/helper/types/env.d.ts
index fa60884f3..3a68e3f66 100644
--- a/e2e-playwright/src/helper/types/env.d.ts
+++ b/e2e-playwright/src/helper/types/env.d.ts
@@ -1,3 +1,4 @@
+/* eslint-disable */
export { };
declare global {
diff --git a/e2e-playwright/src/helper/wrapper/PlaywrightWrappers.ts b/e2e-playwright/src/helper/wrapper/PlaywrightWrappers.ts
deleted file mode 100644
index e4c420167..000000000
--- a/e2e-playwright/src/helper/wrapper/PlaywrightWrappers.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-import { Page } from "@playwright/test";
-
-export default class PlaywrightWrapper {
-
- constructor(private page: Page) { }
-
- async goto(url: string) {
- await this.page.goto(url, {
- waitUntil: "domcontentloaded"
- });
- }
-
- async waitAndClick(locator: string) {
- const element = this.page.locator(locator);
- await element.waitFor({
- state: "visible"
- });
- await element.click();
- }
-
- async navigateTo(link: string) {
- await Promise.all([
- this.page.waitForNavigation(),
- this.page.click(link)
- ])
- }
-
-}
\ No newline at end of file
diff --git a/e2e-playwright/src/helper/wrapper/assert.ts b/e2e-playwright/src/helper/wrapper/assert.ts
index 272351752..409912e1d 100644
--- a/e2e-playwright/src/helper/wrapper/assert.ts
+++ b/e2e-playwright/src/helper/wrapper/assert.ts
@@ -2,7 +2,7 @@ import { Page } from "@playwright/test";
import expect from "../util/expect";
export default class Assert {
-
+// eslint-disable-next-line no-unused-vars
constructor(private page: Page) { }
async assertTitle(title: string) {
@@ -22,5 +22,4 @@ export default class Assert {
const pageURL = this.page.url();
expect(pageURL).toContain(title);
}
-
}
diff --git a/e2e-playwright/src/hooks/hooks.ts b/e2e-playwright/src/hooks/hooks.ts
index 3a4d9a2ff..8573d51c5 100644
--- a/e2e-playwright/src/hooks/hooks.ts
+++ b/e2e-playwright/src/hooks/hooks.ts
@@ -1,33 +1,23 @@
import '../helper/env/env';
-import { BeforeAll, AfterAll, Before, After, Status, setDefaultTimeout } from "@cucumber/cucumber";
-import { Browser, BrowserContext } from "@playwright/test";
-import { fixture } from "./pageFixture";
+import { BeforeAll, AfterAll, Before, After, Status, setDefaultTimeout, setWorldConstructor } from "@cucumber/cucumber";
+import { Browser } from "@playwright/test";
import { invokeBrowser } from "../helper/browsers/browserManager";
-import { createLogger } from "winston";
-import { options } from "../helper/util/logger";
-import PanelLocators from "../pages/Panel/PanelLocators";
-import BrokersLocators from "../pages/Brokers/BrokersLocators";
-import TopicsLocators from "../pages/Topics/TopicsLocators";
-import ConsumersLocators from "../pages/Consumers/ConsumersLocators";
-import SchemaRegistryLocators from "../pages/SchemaRegistry/SchemaRegistryLocators";
-import ConnectorsLocators from "../pages/Connectors/ConnectorsLocators";
-import ksqlDbLocators from "../pages/KSQLDB/ksqldbLocators";
-import DashboardLocators from '../pages/Dashboard/DashboardLocators';
-import TopicCreateLocators from "../pages/Topics/TopicsCreateLocators";
import fs from 'fs';
+import { PlaywrightCustomWorld } from '../support/PlaywrightCustomWorld';
let browser: Browser;
-let context: BrowserContext;
-BeforeAll(async function () {
+BeforeAll(async function() {
browser = await invokeBrowser();
});
setDefaultTimeout(60 * 1000);
-Before(async function ({ pickle }) {
+setWorldConstructor(PlaywrightCustomWorld);
+
+Before(async function(this: PlaywrightCustomWorld, { pickle }) {
const scenarioName = pickle.name + pickle.id
- context = await browser.newContext({
+ const context = await browser.newContext({
recordVideo: { dir: 'test-results/videos/' },
locale: 'en-US'
});
@@ -37,46 +27,23 @@ Before(async function ({ pickle }) {
sources: true,
screenshots: true, snapshots: true
});
- const page = await context.newPage();
-
- fixture.page = page;
-
- fixture.logger = createLogger(options(scenarioName));
-
- fixture.navigationPanel = new PanelLocators(page);
-
- fixture.brokers = new BrokersLocators(page);
-
- fixture.topics = new TopicsLocators(page);
- fixture.topicsCreate = new TopicCreateLocators(page);
-
- fixture.consumers = new ConsumersLocators(page);
-
- fixture.schemaRegistry = new SchemaRegistryLocators(page);
-
- fixture.connectors = new ConnectorsLocators(page);
-
- fixture.ksqlDb = new ksqlDbLocators(page);
-
- fixture.dashboard = new DashboardLocators(page);
-
+ await this.init(context, scenarioName);
});
-After({ timeout: 30000 }, async function ({ pickle, result }) {
- let img: Buffer | undefined;
+After({ timeout: 30000 }, async function(this: PlaywrightCustomWorld, { pickle, result }) {
+ let img: Buffer | undefined;
const path = `./test-results/trace/${pickle.id}.zip`;
-
try {
if (result?.status === Status.FAILED) {
- img = await fixture.page.screenshot({
+ img = await this.page?.screenshot({
path: `./test-results/screenshots/${pickle.name}.png`,
type: "png"
});
- const video = await fixture.page.video();
+ const video = this.page?.video();
if (video) {
const videoPath = await video.path();
const videoFile = fs.readFileSync(videoPath);
- await this.attach(videoFile, 'video/webm');
+ this.attach(videoFile, 'video/webm');
}
}
} catch (e) {
@@ -84,35 +51,35 @@ After({ timeout: 30000 }, async function ({ pickle, result }) {
}
try {
- await context.tracing.stop({ path });
+ await this.browserContext?.tracing.stop({ path });
} catch (e) {
console.error("Error stopping tracing:", e);
}
try {
- await fixture.page.close();
+ await this.page?.close();
} catch (e) {
console.error("Error closing page:", e);
}
try {
- await context.close();
+ await this.browserContext?.close();
} catch (e) {
console.error("Error closing context:", e);
}
try {
if (result?.status === Status.FAILED && img) {
- await this.attach(img, "image/png");
+ this.attach(img, "image/png");
const traceFileLink = `Open ${path}`;
- await this.attach(`Trace file: ${traceFileLink}`, "text/html");
+ this.attach(`Trace file: ${traceFileLink}`, "text/html");
}
} catch (e) {
console.error("Error attaching screenshot or trace:", e);
}
});
-AfterAll(async function () {
+AfterAll(async function() {
await browser.close();
})
diff --git a/e2e-playwright/src/hooks/pageFixture.ts b/e2e-playwright/src/hooks/pageFixture.ts
deleted file mode 100644
index 5b6b02938..000000000
--- a/e2e-playwright/src/hooks/pageFixture.ts
+++ /dev/null
@@ -1,45 +0,0 @@
-import { Page } from "@playwright/test";
-import { Logger } from "winston";
-import PanelLocators from "../pages/Panel/PanelLocators";
-import BrokersLocators from "../pages/Brokers/BrokersLocators";
-import TopicsLocators from "../pages/Topics/TopicsLocators";
-import ConsumersLocators from "../pages/Consumers/ConsumersLocators";
-import SchemaRegistryLocators from "../pages/SchemaRegistry/SchemaRegistryLocators";
-import ConnectorsLocators from "../pages/Connectors/ConnectorsLocators";
-import ksqlDbLocators from "../pages/KSQLDB/ksqldbLocators";
-import DashboardLocators from "../pages/Dashboard/DashboardLocators";
-import TopicCreateLocators from "../pages/Topics/TopicsCreateLocators";
-
-export const fixture = {
- // @ts-ignore
- page: undefined as Page,
-
- // @ts-ignore
- logger: undefined as Logger,
-
- // @ts-ignore
- navigationPanel: undefined as PanelLocators,
-
- // @ts-ignore
- brokers: undefined as BrokersLocators,
-
- // @ts-ignore
- topics: undefined as TopicsLocators,
- // @ts-ignore
- topicsCreate: undefined as TopicCreateLocators,
-
- // @ts-ignore
- consumers: undefined as ConsumersLocators,
-
- // @ts-ignore
- schemaRegistry: undefined as SchemaRegistryLocators,
-
- // @ts-ignore
- connectors: undefined as ConnectorsLocators,
-
- // @ts-ignore
- ksqlDb: undefined as ksqlDbLocators,
-
- // @ts-ignore
- dashboard: undefined as DashboardLocators
-}
\ No newline at end of file
diff --git a/e2e-playwright/src/pages/BaseLocators.ts b/e2e-playwright/src/pages/BaseLocators.ts
index 77e290087..980f7a984 100644
--- a/e2e-playwright/src/pages/BaseLocators.ts
+++ b/e2e-playwright/src/pages/BaseLocators.ts
@@ -1,6 +1,7 @@
import { Locator, Page } from '@playwright/test';
export class BaseLocators {
+ // eslint-disable-next-line no-unused-vars
constructor(private page: Page) {}
loadingSpinner:Locator = this.page.locator('div[role="progressbar"]');
diff --git a/e2e-playwright/src/pages/Brokers/BrokersLocators.ts b/e2e-playwright/src/pages/Brokers/BrokersLocators.ts
index eddd69207..50bd5d2b6 100644
--- a/e2e-playwright/src/pages/Brokers/BrokersLocators.ts
+++ b/e2e-playwright/src/pages/Brokers/BrokersLocators.ts
@@ -1,6 +1,6 @@
import { Page, Locator } from "@playwright/test";
-export default class BrokersLocators{
+export default class BrokersLocators {
private readonly page: Page;
constructor(page: Page) {
diff --git a/e2e-playwright/src/pages/Connectors/ConnectorsLocators.ts b/e2e-playwright/src/pages/Connectors/ConnectorsLocators.ts
index 7a014eb73..d372bfbb9 100644
--- a/e2e-playwright/src/pages/Connectors/ConnectorsLocators.ts
+++ b/e2e-playwright/src/pages/Connectors/ConnectorsLocators.ts
@@ -1,6 +1,6 @@
import { Page, Locator } from "@playwright/test";
-export default class ConnectorsLocators{
+export default class ConnectorsLocators {
private readonly page: Page;
constructor(page: Page) {
diff --git a/e2e-playwright/src/pages/Consumers/ConsumersLocators.ts b/e2e-playwright/src/pages/Consumers/ConsumersLocators.ts
index 9f4dbf379..327da5875 100644
--- a/e2e-playwright/src/pages/Consumers/ConsumersLocators.ts
+++ b/e2e-playwright/src/pages/Consumers/ConsumersLocators.ts
@@ -1,6 +1,6 @@
import { Page, Locator } from "@playwright/test";
-export default class ConsumersLocators{
+export default class ConsumersLocators {
private readonly page: Page;
constructor(page: Page) {
diff --git a/e2e-playwright/src/pages/Dashboard/DashboardLocators.ts b/e2e-playwright/src/pages/Dashboard/DashboardLocators.ts
index 415e8a62c..96561d820 100644
--- a/e2e-playwright/src/pages/Dashboard/DashboardLocators.ts
+++ b/e2e-playwright/src/pages/Dashboard/DashboardLocators.ts
@@ -1,6 +1,6 @@
import { Page, Locator } from "@playwright/test";
-export default class DashboardLocators{
+export default class DashboardLocators {
private readonly page: Page;
constructor(page: Page) {
diff --git a/e2e-playwright/src/pages/KSQLDB/ksqldbLocators.ts b/e2e-playwright/src/pages/KSQLDB/ksqldbLocators.ts
index bd98d0233..196fdcd6c 100644
--- a/e2e-playwright/src/pages/KSQLDB/ksqldbLocators.ts
+++ b/e2e-playwright/src/pages/KSQLDB/ksqldbLocators.ts
@@ -1,6 +1,6 @@
import { Page, Locator } from "@playwright/test";
-export default class ksqlDbLocators{
+export default class ksqlDbLocators {
private readonly page: Page;
constructor(page: Page) {
diff --git a/e2e-playwright/src/pages/Locators.ts b/e2e-playwright/src/pages/Locators.ts
new file mode 100644
index 000000000..924762740
--- /dev/null
+++ b/e2e-playwright/src/pages/Locators.ts
@@ -0,0 +1,64 @@
+import { Page } from "@playwright/test";
+import PanelLocators from "./Panel/PanelLocators";
+import BrokersLocators from "./Brokers/BrokersLocators";
+import TopicsLocators from "./Topics/TopicsLocators";
+import TopicCreateLocators from "./Topics/TopicsCreateLocators";
+import ConsumersLocators from "./Consumers/ConsumersLocators";
+import SchemaRegistryLocators from "./SchemaRegistry/SchemaRegistryLocators";
+import ConnectorsLocators from "./Connectors/ConnectorsLocators";
+import ksqlDbLocators from "./KSQLDB/ksqldbLocators";
+import DashboardLocators from "./Dashboard/DashboardLocators";
+
+export class Locators {
+ private readonly page: Page;
+
+ private _panel?: PanelLocators;
+ private _brokers?: BrokersLocators;
+ private _topics?: TopicsLocators;
+ private _topicsCreate?: TopicCreateLocators;
+ private _consumers?: ConsumersLocators;
+ private _schemaRegistry?: SchemaRegistryLocators;
+ private _connectors?: ConnectorsLocators;
+ private _ksqlDb?: ksqlDbLocators;
+ private _dashboard?: DashboardLocators;
+
+ constructor(page: Page) {
+ this.page = page;
+ }
+
+ get panel() {
+ return (this._panel ??= new PanelLocators(this.page));
+ }
+
+ get brokers() {
+ return (this._brokers ??= new BrokersLocators(this.page));
+ }
+
+ get topics() {
+ return (this._topics ??= new TopicsLocators(this.page));
+ }
+
+ get topicsCreate() {
+ return (this._topicsCreate ??= new TopicCreateLocators(this.page));
+ }
+
+ get consumers() {
+ return (this._consumers ??= new ConsumersLocators(this.page));
+ }
+
+ get schemaRegistry() {
+ return (this._schemaRegistry ??= new SchemaRegistryLocators(this.page));
+ }
+
+ get connectors() {
+ return (this._connectors ??= new ConnectorsLocators(this.page));
+ }
+
+ get ksqlDb() {
+ return (this._ksqlDb ??= new ksqlDbLocators(this.page));
+ }
+
+ get dashboard() {
+ return (this._dashboard ??= new DashboardLocators(this.page));
+ }
+}
diff --git a/e2e-playwright/src/pages/Panel/PanelLocators.ts b/e2e-playwright/src/pages/Panel/PanelLocators.ts
index 05e136167..c56fd9baf 100644
--- a/e2e-playwright/src/pages/Panel/PanelLocators.ts
+++ b/e2e-playwright/src/pages/Panel/PanelLocators.ts
@@ -1,20 +1,21 @@
import { Page, Locator } from "@playwright/test";
-export default class PanelLocators{
+export default class PanelLocators {
private readonly page: Page;
constructor(page: Page) {
this.page = page;
}
- private linkByName = (name: string): Locator =>
- this.page.getByRole('link', { name });
-
- brokersLink = (): Locator => this.linkByName('Brokers');
- topicsLink = (): Locator => this.page.getByTitle('Topics');
- consumersLink = (): Locator => this.linkByName('Consumers');
- schemaRegistryLink = (): Locator => this.linkByName('Schema Registry');
- ksqlDbLink = (): Locator => this.linkByName('KSQL DB');
- getDashboardLink = (): Locator => this.linkByName('Dashboard');
- kafkaConnectLink = (): Locator => this.linkByName('Kafka Connect');
+ linkByName(name: string): Locator {
+ return this.page.getByRole('link', { name });
+ }
+
+ brokersLink(): Locator { return this.linkByName('Brokers');}
+ topicsLink(): Locator { return this.page.getByTitle('Topics');}
+ consumersLink(): Locator { return this.linkByName('Consumers');}
+ schemaRegistryLink(): Locator { return this.linkByName('Schema Registry');}
+ ksqlDbLink(): Locator { return this.linkByName('KSQL DB');}
+ getDashboardLink(): Locator { return this.linkByName('Dashboard');}
+ kafkaConnectLink(): Locator { return this.linkByName('Kafka Connect');}
}
\ No newline at end of file
diff --git a/e2e-playwright/src/pages/SchemaRegistry/SchemaRegistryLocators.ts b/e2e-playwright/src/pages/SchemaRegistry/SchemaRegistryLocators.ts
index 438dac08e..f61d61e9b 100644
--- a/e2e-playwright/src/pages/SchemaRegistry/SchemaRegistryLocators.ts
+++ b/e2e-playwright/src/pages/SchemaRegistry/SchemaRegistryLocators.ts
@@ -1,6 +1,6 @@
import { Page, Locator } from "@playwright/test";
-export default class SchemaRegistryLocators{
+export default class SchemaRegistryLocators {
private readonly page: Page;
constructor(page: Page) {
diff --git a/e2e-playwright/src/pages/Topics/TopicsCreateLocators.ts b/e2e-playwright/src/pages/Topics/TopicsCreateLocators.ts
index a40fff49c..218b0f3dc 100644
--- a/e2e-playwright/src/pages/Topics/TopicsCreateLocators.ts
+++ b/e2e-playwright/src/pages/Topics/TopicsCreateLocators.ts
@@ -1,6 +1,6 @@
import { Page, Locator } from "@playwright/test";
-export default class TopicCreateLocators{
+export default class TopicCreateLocators {
private readonly page: Page;
constructor(page: Page) {
diff --git a/e2e-playwright/src/pages/Topics/TopicsLocators.ts b/e2e-playwright/src/pages/Topics/TopicsLocators.ts
index a38fe37bc..3d678c07e 100644
--- a/e2e-playwright/src/pages/Topics/TopicsLocators.ts
+++ b/e2e-playwright/src/pages/Topics/TopicsLocators.ts
@@ -1,6 +1,6 @@
import { Page, Locator } from "@playwright/test";
-export default class TopicsLocators{
+export default class TopicsLocators {
private readonly page: Page;
constructor(page: Page) {
diff --git a/e2e-playwright/playwright.config.ts b/e2e-playwright/src/playwright.config.ts
similarity index 98%
rename from e2e-playwright/playwright.config.ts
rename to e2e-playwright/src/playwright.config.ts
index dc2689df3..ecec420ae 100644
--- a/e2e-playwright/playwright.config.ts
+++ b/e2e-playwright/src/playwright.config.ts
@@ -1,5 +1,7 @@
+
import { defineConfig } from '@playwright/test';
export default defineConfig({
timeout: 30_000,
});
+
diff --git a/e2e-playwright/src/services/commonFunctions.ts b/e2e-playwright/src/services/commonFunctions.ts
index 359cf40af..f99fec670 100644
--- a/e2e-playwright/src/services/commonFunctions.ts
+++ b/e2e-playwright/src/services/commonFunctions.ts
@@ -1,5 +1,4 @@
import { v4 as uuidv4 } from 'uuid';
-import { Locator} from '@playwright/test';
export const generateName = (prefix: string): string => {
return `${prefix}-${uuidv4().slice(0, 8)}`;
diff --git a/e2e-playwright/src/services/uiHelper.ts b/e2e-playwright/src/services/uiHelper.ts
index 2e1ed05ad..340140dd4 100644
--- a/e2e-playwright/src/services/uiHelper.ts
+++ b/e2e-playwright/src/services/uiHelper.ts
@@ -1,7 +1,7 @@
import { Locator } from '@playwright/test';
import expect from "../helper/util/expect";
-export const expectVisibility = async (locator: Locator, visibleString: string): Promise => {
+ export const expectVisibility = async(locator: Locator, visibleString: string): Promise => {
if (visibleString === "true") {
await expect(locator).toBeVisible();
} else {
@@ -9,7 +9,7 @@ export const expectVisibility = async (locator: Locator, visibleString: string):
}
};
-export const ensureCheckboxState = async (checkbox: Locator, expectedState: string) => {
+export const ensureCheckboxState = async(checkbox: Locator, expectedState: string) => {
const desiredState = expectedState === 'true';
const isChecked = await checkbox.isChecked();
diff --git a/e2e-playwright/src/steps/Topics.steps.ts b/e2e-playwright/src/steps/Topics.steps.ts
index 442103eda..7d6109a33 100644
--- a/e2e-playwright/src/steps/Topics.steps.ts
+++ b/e2e-playwright/src/steps/Topics.steps.ts
@@ -1,86 +1,72 @@
import { Given, When, Then, setDefaultTimeout } from "@cucumber/cucumber";
import { expect } from "@playwright/test";
-import { fixture } from "../hooks/pageFixture";
import { expectVisibility, ensureCheckboxState } from "../services/uiHelper";
+import { PlaywrightCustomWorld } from "../support/PlaywrightCustomWorld";
setDefaultTimeout(60 * 1000 * 2);
-Given('Topics Serchfield visible', async () => {
- await expect(fixture.topics.topicSearchField()).toBeVisible();
+Given('Topics Serchfield visible', async function() {
+ await expect(this.locators.topics.topicSearchField()).toBeVisible();
});
-Given('Topics ShowInternalTopics visible', async () => {
- await expect(fixture.topics.topicShowInternalTopics()).toBeVisible();
+Given('Topics ShowInternalTopics visible', async function() {
+ await expect(this.locators.topics.topicShowInternalTopics()).toBeVisible();
});
-
-Given('Topics AddATopic visible', async () => {
- await expect(fixture.topics.topicAddTopicButton()).toBeVisible();
+Given('Topics AddATopic visible', async function() {
+ await expect(this.locators.topics.topicAddTopicButton()).toBeVisible();
});
-
-Given('Topics DeleteSelectedTopics active is: {string}', async (state: string) => {
- const isEnabled = await fixture.topics.topicDeleteSelectedTopicsButton().isEnabled();
-
+Given('Topics DeleteSelectedTopics active is: {string}', async function(this: PlaywrightCustomWorld, state: string) {
+ const isEnabled = await this.locators.topics.topicDeleteSelectedTopicsButton().isEnabled();
expect(isEnabled.toString()).toBe(state);
});
-
-Given('Topics CopySelectedTopic active is: {string}', async (state: string) => {
- const isEnabled = await fixture.topics.topicCopySelectedTopicButton().isEnabled();
-
+Given('Topics CopySelectedTopic active is: {string}', async function(this: PlaywrightCustomWorld, state: string) {
+ const isEnabled = await this.locators.topics.topicCopySelectedTopicButton().isEnabled();
expect(isEnabled.toString()).toBe(state);
});
-
-Given('Topics PurgeMessagesOfSelectedTopics active is: {string}', async (state: string) => {
- const isEnabled = await fixture.topics.topicPurgeMessagesOfSelectedTopicsButton().isEnabled();
-
+Given('Topics PurgeMessagesOfSelectedTopics active is: {string}', async function(this: PlaywrightCustomWorld, state: string) {
+ const isEnabled = await this.locators.topics.topicPurgeMessagesOfSelectedTopicsButton().isEnabled();
expect(isEnabled.toString()).toBe(state);
});
-When('Topic SelectAllTopic visible is: {string}', async (visible: string) => {
- await expectVisibility(fixture.topics.topicSelectAllCheckBox(), visible)
+When('Topic SelectAllTopic visible is: {string}', async function(this: PlaywrightCustomWorld, visible: string) {
+ await expectVisibility(this.locators.topics.topicSelectAllCheckBox(), visible);
});
-
-Then('Topic SelectAllTopic checked is: {string}', async (state: string) => {
- const checkbox = fixture.topics.topicSelectAllCheckBox();
+Then('Topic SelectAllTopic checked is: {string}', async function(this: PlaywrightCustomWorld, state: string) {
+ const checkbox = this.locators.topics.topicSelectAllCheckBox();
await ensureCheckboxState(checkbox, state);
const actual = await checkbox.isChecked();
expect(actual.toString()).toBe(state);
});
-When('Topics serchfield input {string}', async (topicName: string) => {
- const textBox = fixture.topics.topicSearchField();
-
- await textBox.fill(topicName);
-
- const actual = await textBox.inputValue();
- expect(actual, topicName)
+When('Topics serchfield input {string}', async function(this: PlaywrightCustomWorld, topicName: string) {
+ const textBox = this.locators.topics.topicSearchField();
+ await textBox.fill(topicName);
+ const actual = await textBox.inputValue();
+ expect(actual).toBe(topicName);
});
-Then('Topic named: {string} visible is: {string}', async (topicName: string, visible: string) => {
- await expectVisibility(fixture.topics.topicNameLink(topicName), visible);
+Then('Topic named: {string} visible is: {string}', async function(this: PlaywrightCustomWorld, topicName: string, visible: string) {
+ await expectVisibility(this.locators.topics.topicNameLink(topicName), visible);
});
-When('Topic serchfield input cleared', async () => {
- const textBox = fixture.topics.topicSearchField();
-
+When('Topic serchfield input cleared', async function() {
+ const textBox = this.locators.topics.topicSearchField();
await textBox.fill('');
-
const text = await textBox.inputValue();
expect(text).toBe('');
});
-When('Topics ShowInternalTopics switched is: {string}', async (state: string) => {
- const checkBox = fixture.topics.topicShowInternalTopics();
-
+When('Topics ShowInternalTopics switched is: {string}', async function(this: PlaywrightCustomWorld, state: string) {
+ const checkBox = this.locators.topics.topicShowInternalTopics();
await ensureCheckboxState(checkBox, state);
});
-When('Topic row named: {string} checked is: {string}', async (topicName: string, state: string) => {
- const checkbox = fixture.topics.topicRowCheckBox(topicName);
-
+When('Topic row named: {string} checked is: {string}', async function(this: PlaywrightCustomWorld, topicName: string, state: string) {
+ const checkbox = this.locators.topics.topicRowCheckBox(topicName);
await ensureCheckboxState(checkbox, state);
});
diff --git a/e2e-playwright/src/steps/TopicsCreate.steps.ts b/e2e-playwright/src/steps/TopicsCreate.steps.ts
index 65f8a4a3c..cb5be6697 100644
--- a/e2e-playwright/src/steps/TopicsCreate.steps.ts
+++ b/e2e-playwright/src/steps/TopicsCreate.steps.ts
@@ -1,143 +1,136 @@
import { Given, When, Then, setDefaultTimeout } from "@cucumber/cucumber";
-import { fixture } from "../hooks/pageFixture";
+import { expect } from "@playwright/test";
+import { PlaywrightCustomWorld } from "../support/PlaywrightCustomWorld";
import { expectVisibility } from "../services/uiHelper";
-import { CustomWorld } from "../support/customWorld";
import { generateName } from "../services/commonFunctions";
-import expect from "../helper/util/expect";
setDefaultTimeout(60 * 1000 * 2);
-
-Given('Topics AddATopic clicked', async () => {
- const button = fixture.topics.topicAddTopicButton();
+Given('Topics AddATopic clicked', async function() {
+ const button = this.locators.topics.topicAddTopicButton();
await expect(button).toBeVisible();
await button.click();
});
-Given('TopicCreate heading visible is: {string}', async (visible: string) => {
- await expectVisibility(fixture.topicsCreate.topicsCreateHeading(), visible);
+Given('TopicCreate heading visible is: {string}', async function(this: PlaywrightCustomWorld, visible: string) {
+ await expectVisibility(this.locators.topicsCreate.topicsCreateHeading(), visible);
});
-Given('TopicCreate TopicName input visible is: {string}', async (visible: string) => {
- await expectVisibility(fixture.topicsCreate.topicsCreateTopicName(), visible);
+Given('TopicCreate TopicName input visible is: {string}', async function(this: PlaywrightCustomWorld, visible: string) {
+ await expectVisibility(this.locators.topicsCreate.topicsCreateTopicName(), visible);
});
-Given('TopicCreate NumberOfPartitions input visible is: {string}', async (visible: string) => {
- await expectVisibility(fixture.topicsCreate.topicsCreateNumberOfPartitions(), visible);
+Given('TopicCreate NumberOfPartitions input visible is: {string}', async function(this: PlaywrightCustomWorld, visible: string) {
+ await expectVisibility(this.locators.topicsCreate.topicsCreateNumberOfPartitions(), visible);
});
-Given('TopicCreate CleanupPolicy select visible is: {string}', async (visible: string) => {
- await expectVisibility(fixture.topicsCreate.topicsCreateCleanupPolicy(), visible);
+Given('TopicCreate CleanupPolicy select visible is: {string}', async function(this: PlaywrightCustomWorld, visible: string) {
+ await expectVisibility(this.locators.topicsCreate.topicsCreateCleanupPolicy(), visible);
});
-Given('TopicCreate MinInSyncReplicas input visible is: {string}', async (visible: string) => {
- await expectVisibility(fixture.topicsCreate.topicsCreateMinInSyncReplicas(), visible);
+Given('TopicCreate MinInSyncReplicas input visible is: {string}', async function(this: PlaywrightCustomWorld, visible: string) {
+ await expectVisibility(this.locators.topicsCreate.topicsCreateMinInSyncReplicas(), visible);
});
-Given('TopicCreate ReplicationFactor input visible is: {string}', async (visible: string) => {
- await expectVisibility(fixture.topicsCreate.topicsCreateReplicationFactor(), visible);
+Given('TopicCreate ReplicationFactor input visible is: {string}', async function(this: PlaywrightCustomWorld, visible: string) {
+ await expectVisibility(this.locators.topicsCreate.topicsCreateReplicationFactor(), visible);
});
-Given('TopicCreate TimeToRetainData input visible is: {string}', async (visible: string) => {
- await expectVisibility(fixture.topicsCreate.topicsCreateTimeToRetainData(), visible);
+Given('TopicCreate TimeToRetainData input visible is: {string}', async function(this: PlaywrightCustomWorld, visible: string) {
+ await expectVisibility(this.locators.topicsCreate.topicsCreateTimeToRetainData(), visible);
});
-Given('TopicCreate 12Hours button visible is: {string}', async (visible: string) => {
- await expectVisibility(fixture.topicsCreate.topicsCreate12Hours(), visible);
+Given('TopicCreate 12Hours button visible is: {string}', async function(this: PlaywrightCustomWorld, visible: string) {
+ await expectVisibility(this.locators.topicsCreate.topicsCreate12Hours(), visible);
});
-Given('TopicCreate 1Day button visible is: {string}', async (visible: string) => {
- await expectVisibility(fixture.topicsCreate.topicsCreate1Day(), visible);
+Given('TopicCreate 1Day button visible is: {string}', async function(this: PlaywrightCustomWorld, visible: string) {
+ await expectVisibility(this.locators.topicsCreate.topicsCreate1Day(), visible);
});
-Given('TopicCreate 2Day button visible is: {string}', async (visible: string) => {
- await expectVisibility(fixture.topicsCreate.topicsCreate2Day(), visible);
+Given('TopicCreate 2Day button visible is: {string}', async function(this: PlaywrightCustomWorld, visible: string) {
+ await expectVisibility(this.locators.topicsCreate.topicsCreate2Day(), visible);
});
-Given('TopicCreate 7Day button visible is: {string}', async (visible: string) => {
- await expectVisibility(fixture.topicsCreate.topicsCreate7Day(), visible);
+Given('TopicCreate 7Day button visible is: {string}', async function(this: PlaywrightCustomWorld, visible: string) {
+ await expectVisibility(this.locators.topicsCreate.topicsCreate7Day(), visible);
});
-Given('TopicCreate 4Weeks button visible is: {string}', async (visible: string) => {
- await expectVisibility(fixture.topicsCreate.topicsCreate4Weeks(), visible);
+Given('TopicCreate 4Weeks button visible is: {string}', async function(this: PlaywrightCustomWorld, visible: string) {
+ await expectVisibility(this.locators.topicsCreate.topicsCreate4Weeks(), visible);
});
-Given('TopicCreate MaxPartitionSize select visible is: {string}', async (visible: string) => {
- await expectVisibility(fixture.topicsCreate.topicsCreateMaxPartitionSize(), visible);
+Given('TopicCreate MaxPartitionSize select visible is: {string}', async function(this: PlaywrightCustomWorld, visible: string) {
+ await expectVisibility(this.locators.topicsCreate.topicsCreateMaxPartitionSize(), visible);
});
-Given('TopicCreate MaxMessageSize input visible is: {string}', async (visible: string) => {
- await expectVisibility(fixture.topicsCreate.topicsCreateMaxMessageSize(), visible);
+Given('TopicCreate MaxMessageSize input visible is: {string}', async function(this: PlaywrightCustomWorld, visible: string) {
+ await expectVisibility(this.locators.topicsCreate.topicsCreateMaxMessageSize(), visible);
});
-Given('TopicCreate AddCustomParameter button visible is: {string}', async (visible: string) => {
- await expectVisibility(fixture.topicsCreate.topicsCreateAddCustomParameter(), visible);
+Given('TopicCreate AddCustomParameter button visible is: {string}', async function(this: PlaywrightCustomWorld, visible: string) {
+ await expectVisibility(this.locators.topicsCreate.topicsCreateAddCustomParameter(), visible);
});
-Given('TopicCreate Cancel button visible is: {string}', async (visible: string) => {
- await expectVisibility(fixture.topicsCreate.topicsCreateCancel(), visible);
+Given('TopicCreate Cancel button visible is: {string}', async function(this: PlaywrightCustomWorld, visible: string) {
+ await expectVisibility(this.locators.topicsCreate.topicsCreateCancel(), visible);
});
-Given('TopicCreate CreateTopic button visible is: {string}', async (visible: string) => {
- await expectVisibility(fixture.topicsCreate.topicCreateCreateTopicButton(), visible);
+Given('TopicCreate CreateTopic button visible is: {string}', async function(this: PlaywrightCustomWorld, visible: string) {
+ await expectVisibility(this.locators.topicsCreate.topicCreateCreateTopicButton(), visible);
});
-
-When('TopicCreate Topic name starts with: {string}', async function (this: CustomWorld, prefix: string) {
+When('TopicCreate Topic name starts with: {string}', async function(this: PlaywrightCustomWorld, prefix: string) {
const topicName = generateName(prefix);
this.setValue(`topicName-${prefix}`, topicName);
- await fixture.topicsCreate.topicsCreateTopicName().fill(topicName);
+ await this.locators.topicsCreate.topicsCreateTopicName().fill(topicName);
});
-When('TopicCreate Number of partitons: {int}', async function (this: CustomWorld, count: number) {
- const input = fixture.topicsCreate.topicsCreateNumberOfPartitions();
- await input.fill(count.toString());
+When('TopicCreate Number of partitons: {int}', async function(this: PlaywrightCustomWorld, count: number) {
+ await this.locators.topicsCreate.topicsCreateNumberOfPartitions().fill(count.toString());
});
-When('TopicCreate Time to retain data one day', async function (this: CustomWorld) {
- const button = fixture.topicsCreate.topicsCreate1Day();
- await button.click();
+When('TopicCreate Time to retain data one day', async function() {
+ await this.locators.topicsCreate.topicsCreate1Day().click();
});
-When('TopicCreate Create topic clicked', async function (this: CustomWorld) {
- const button = fixture.topicsCreate.topicCreateCreateTopicButton();
- await button.click();
+When('TopicCreate Create topic clicked', async function() {
+ await this.locators.topicsCreate.topicCreateCreateTopicButton().click();
});
-Then('Header starts with: {string}', async function (this: CustomWorld, prefix: string) {
+Then('Header starts with: {string}', async function(this: PlaywrightCustomWorld, prefix: string) {
const topicName = this.getValue(`topicName-${prefix}`);
- const header = fixture.page.getByRole('heading', { name: topicName });
-
+ const header = this.page.getByRole('heading', { name: topicName });
await expect(header).toBeVisible();
});
-Then('Topic name started with: {string} visible is: {string}', async function (this: CustomWorld, prefix: string, visible: string) {
+Then('Topic name started with: {string} visible is: {string}', async function(this: PlaywrightCustomWorld, prefix: string, visible: string) {
const topicName = this.getValue(`topicName-${prefix}`);
- await expectVisibility(fixture.topics.topicNameLink(topicName), visible);
+ await expectVisibility(this.locators.topics.topicNameLink(topicName), visible);
});
-Then('TopicCreate TimeToRetainData value is: {string}', async (expectedValue: string) => {
- const input = fixture.topicsCreate.topicsCreateTimeToRetainData();
+Then('TopicCreate TimeToRetainData value is: {string}', async function(this: PlaywrightCustomWorld, expectedValue: string) {
+ const input = this.locators.topicsCreate.topicsCreateTimeToRetainData();
const actualValue = await input.inputValue();
expect(actualValue).toBe(expectedValue);
});
-When('TopicCreate 12Hours button clicked', async () => {
- await fixture.topicsCreate.topicsCreate12Hours().click();
+When('TopicCreate 12Hours button clicked', async function() {
+ await this.locators.topicsCreate.topicsCreate12Hours().click();
});
-When('TopicCreate 1Day button clicked', async () => {
- await fixture.topicsCreate.topicsCreate1Day().click();
+When('TopicCreate 1Day button clicked', async function() {
+ await this.locators.topicsCreate.topicsCreate1Day().click();
});
-When('TopicCreate 2Day button clicked', async () => {
- await fixture.topicsCreate.topicsCreate2Day().click();
+When('TopicCreate 2Day button clicked', async function() {
+ await this.locators.topicsCreate.topicsCreate2Day().click();
});
-When('TopicCreate 7Day button clicked', async () => {
- await fixture.topicsCreate.topicsCreate7Day().click();
+When('TopicCreate 7Day button clicked', async function() {
+ await this.locators.topicsCreate.topicsCreate7Day().click();
});
-When('TopicCreate 4Weeks button clicked', async () => {
- await fixture.topicsCreate.topicsCreate4Weeks().click();
+When('TopicCreate 4Weeks button clicked', async function() {
+ await this.locators.topicsCreate.topicsCreate4Weeks().click();
});
diff --git a/e2e-playwright/src/steps/navigation.steps.ts b/e2e-playwright/src/steps/navigation.steps.ts
index eb9b442c6..ee691f051 100644
--- a/e2e-playwright/src/steps/navigation.steps.ts
+++ b/e2e-playwright/src/steps/navigation.steps.ts
@@ -1,115 +1,108 @@
import { Given, When, Then, setDefaultTimeout } from "@cucumber/cucumber";
-import { fixture } from "../hooks/pageFixture";
import expect from "../helper/util/expect";
+import { PlaywrightCustomWorld } from "../support/PlaywrightCustomWorld";
setDefaultTimeout(60 * 1000 * 2);
-Given('Brokers is visible', async () => {
- await fixture.page.goto(process.env.BASEURL!);
- await expect(fixture.navigationPanel.brokersLink()).toBeVisible();
- });
-
-When('click on Brokers link', async () => {
- await fixture.navigationPanel.brokersLink().click();
+Given('Brokers is visible', async function() {
+ await this.page.goto(process.env.BASEURL!);
+ await expect(this.locators.panel.brokersLink()).toBeVisible();
});
-Then('Brokers heading visible', async () => {
- await fixture.brokers.brokersHeading().waitFor({ state: 'visible' });
+When('click on Brokers link', async function() {
+ await this.locators.panel.brokersLink().click();
});
-
-Given('Topics is visible', async () => {
- await fixture.page.goto(process.env.BASEURL!);
- await expect(fixture.navigationPanel.topicsLink()).toBeVisible();
+Then('Brokers heading visible', async function() {
+ await this.locators.brokers.brokersHeading().waitFor({ state: 'visible' });
});
-When('click on Topics link', async () => {
- await fixture.navigationPanel.topicsLink().click();
+Given('Topics is visible', async function() {
+ await this.page.goto(process.env.BASEURL!);
+ await expect(this.locators.panel.topicsLink()).toBeVisible();
});
-Then('Topics heading visible', async () => {
- await fixture.topics.topicsHeading().waitFor({ state: 'visible' });
+When('click on Topics link', async function() {
+ await this.locators.panel.topicsLink().click();
});
-
-Given('Consumers is visible', async () => {
- await fixture.page.goto(process.env.BASEURL!);
- await expect(fixture.navigationPanel.consumersLink()).toBeVisible();
+Then('Topics heading visible', async function() {
+ await this.locators.topics.topicsHeading().waitFor({ state: 'visible' });
});
-When('click on Consumers link', async () => {
- await fixture.navigationPanel.consumersLink().click();
+Given('Consumers is visible', async function() {
+ await this.page.goto(process.env.BASEURL!);
+ await expect(this.locators.panel.consumersLink()).toBeVisible();
});
-Then('Consumers heading visible', async () => {
- await fixture.consumers.consumersHeading().waitFor({ state: 'visible' });
+When('click on Consumers link', async function() {
+ await this.locators.panel.consumersLink().click();
});
-
-Given('Schema Registry is visible', async () => {
- await fixture.page.goto(process.env.BASEURL!);
- await expect(fixture.navigationPanel.schemaRegistryLink()).toBeVisible();
+Then('Consumers heading visible', async function() {
+ await this.locators.consumers.consumersHeading().waitFor({ state: 'visible' });
});
-When('click on Schema Registry link', async () => {
- await fixture.navigationPanel.schemaRegistryLink().click();
+Given('Schema Registry is visible', async function() {
+ await this.page.goto(process.env.BASEURL!);
+ await expect(this.locators.panel.schemaRegistryLink()).toBeVisible();
});
-Then('Schema Registry heading visible', async () => {
- await fixture.schemaRegistry.schemaRegistryHeading().waitFor({ state: 'visible' });
+When('click on Schema Registry link', async function() {
+ await this.locators.panel.schemaRegistryLink().click();
});
-
-Given('Kafka Connect is visible', async () => {
- await fixture.page.goto(process.env.BASEURL!);
- await expect(fixture.navigationPanel.kafkaConnectLink()).toBeVisible();
+Then('Schema Registry heading visible', async function() {
+ await this.locators.schemaRegistry.schemaRegistryHeading().waitFor({ state: 'visible' });
});
-When('click on Kafka Connect link', async () => {
- await fixture.navigationPanel.kafkaConnectLink().click();
+Given('Kafka Connect is visible', async function() {
+ await this.page.goto(process.env.BASEURL!);
+ await expect(this.locators.panel.kafkaConnectLink()).toBeVisible();
});
-Then('Kafka Connect heading visible', async () => {
- await fixture.connectors.connectorsHeading().waitFor({ state: 'visible' });
+When('click on Kafka Connect link', async function() {
+ await this.locators.panel.kafkaConnectLink().click();
});
-Given('KSQL DB is visible', async () => {
- await fixture.page.goto(process.env.BASEURL!);
- await expect(fixture.navigationPanel.ksqlDbLink()).toBeVisible();
+Then('Kafka Connect heading visible', async function() {
+ await this.locators.connectors.connectorsHeading().waitFor({ state: 'visible' });
});
-When('click on KSQL DB link', async () => {
- await fixture.navigationPanel.ksqlDbLink().click();
+Given('KSQL DB is visible', async function() {
+ await this.page.goto(process.env.BASEURL!);
+ await expect(this.locators.panel.ksqlDbLink()).toBeVisible();
});
-Then('KSQL DB heading visible', async () => {
- await fixture.ksqlDb.ksqlDbHeading().waitFor({ state: 'visible' });
+When('click on KSQL DB link', async function() {
+ await this.locators.panel.ksqlDbLink().click();
});
-
-Given('Dashboard is visible', async () => {
- await fixture.page.goto(process.env.BASEURL!);
- var tmp = fixture.navigationPanel.getDashboardLink();
- await expect(fixture.navigationPanel.getDashboardLink()).toBeVisible();
+Then('KSQL DB heading visible', async function() {
+ await this.locators.ksqlDb.ksqlDbHeading().waitFor({ state: 'visible' });
});
-When('click on Dashboard link', async () => {
- const dashboard = fixture.navigationPanel.getDashboardLink()
- await dashboard.isVisible();
- await dashboard.click();
+Given('Dashboard is visible', async function() {
+ await this.page.goto(process.env.BASEURL!);
+ await expect(this.locators.panel.getDashboardLink()).toBeVisible();
});
-Then('Dashboard heading visible', async () => {
- await fixture.dashboard.dashboardHeading().waitFor({ state: 'visible' });
+When('click on Dashboard link', async function() {
+ const dashboard = this.locators.panel.getDashboardLink();
+ await dashboard.isVisible(); // Optional: could be removed if already handled in expect above
+ await dashboard.click();
});
+Then('Dashboard heading visible', async function() {
+ await this.locators.dashboard.dashboardHeading().waitFor({ state: 'visible' });
+});
-Then('the end of current URL should be {string}', async (expected: string) => {
- const actual = new URL(fixture.page.url()).pathname;
+Then('the end of current URL should be {string}', async function(this: PlaywrightCustomWorld, expected: string) {
+ const actual = new URL(this.page.url()).pathname;
expect(actual.endsWith(expected)).toBeTruthy();
});
-Then('the part of current URL should be {string}', async (expected: string) => {
- const actual = new URL(fixture.page.url()).pathname;
- expect(actual.includes(expected)).toBeTruthy();
- });
+Then('the part of current URL should be {string}', async function(this: PlaywrightCustomWorld, expected: string) {
+ const actual = new URL(this.page.url()).pathname;
+ expect(actual.includes(expected)).toBeTruthy();
+});
diff --git a/e2e-playwright/src/support/PlaywrightCustomWorld.ts b/e2e-playwright/src/support/PlaywrightCustomWorld.ts
new file mode 100644
index 000000000..41d54f92e
--- /dev/null
+++ b/e2e-playwright/src/support/PlaywrightCustomWorld.ts
@@ -0,0 +1,61 @@
+import { IWorldOptions, World } from '@cucumber/cucumber';
+import { Page } from "@playwright/test";
+import { Logger } from "winston";
+import { BrowserContext } from "@playwright/test";
+import { createLogger } from "winston";
+import { options } from "../helper/util/logger";
+import { Locators } from '../pages/Locators';
+
+export class PlaywrightCustomWorld extends World {
+
+ public logger?: Logger;
+ public browserContext?: BrowserContext;
+
+ private context: Map = new Map();
+ private _page?: Page;
+ private _locators?:Locators;
+ private _scenarioName?: string;
+
+ constructor(options: IWorldOptions) {
+ super(options);
+ }
+
+ setValue(key: string, value: any) {
+ this.context.set(key, value);
+ }
+
+ getValue(key: string): T {
+ const value = this.context.get(key);
+ if (value === undefined) throw new Error(`Key '${key}' not found in context.`);
+ return value as T;
+ }
+
+ async init(context: BrowserContext, scenarioName:string ) {
+ const page = await context.newPage();
+
+ this._page = page;
+ this.logger = createLogger(options(scenarioName));
+ this._scenarioName = scenarioName;
+ this.browserContext = context;
+ }
+
+ get page() : Page {
+ if (this._page) {
+ return this._page!;
+ }
+
+ throw new Error("No page");
+ }
+
+ get locators() : Locators {
+ return (this._locators ??= new Locators(this.page));
+ }
+
+ get scenarioName(): string {
+ return this._scenarioName ?? "No Name";
+ }
+
+ clear() {
+ this.context.clear();
+ }
+}
diff --git a/e2e-playwright/src/support/customWorld.ts b/e2e-playwright/src/support/customWorld.ts
deleted file mode 100644
index 764623bcb..000000000
--- a/e2e-playwright/src/support/customWorld.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-import { IWorldOptions, setWorldConstructor, World } from '@cucumber/cucumber';
-
-export class CustomWorld extends World {
- private context: Map = new Map();
-
- constructor(options: IWorldOptions) {
- super(options);
- }
-
- setValue(key: string, value: any) {
- this.context.set(key, value);
- }
-
- getValue(key: string): T {
- const value = this.context.get(key);
- if (value === undefined) throw new Error(`Key '${key}' not found in context.`);
- return value as T;
- }
-
- clear() {
- this.context.clear();
- }
-}
-
-setWorldConstructor(CustomWorld);
\ No newline at end of file
diff --git a/e2e-playwright/tsconfig.json b/e2e-playwright/tsconfig.json
index 264092083..a8a600d19 100644
--- a/e2e-playwright/tsconfig.json
+++ b/e2e-playwright/tsconfig.json
@@ -11,5 +11,5 @@
"rootDir": "src",
"sourceMap": true
},
- "include": ["src/**/*.ts", "src/steps/**/*.ts", "src/features/**/*.ts"]
+ "include": ["src/**/*.ts", "src/steps/**/*.ts", "src/features/**/*.ts", "src/playwright.config.ts"]
}
\ No newline at end of file