From def5a13386758d91017f290f487f3c76575d47b8 Mon Sep 17 00:00:00 2001 From: "Lutchanka, Valentin" Date: Sun, 25 Jan 2026 21:39:44 +0100 Subject: [PATCH] feat: update types for api-coverage and readme doc Co-authored-by: Valentin L solar1980@mail.ru --- fixtures/fixture.js | 2 +- package-lock.json | 928 +++++++++++++++----------- package.json | 20 +- readme.md | 36 + reports/Parabankapiservice.json | 8 + reports/Petsplaywrightapiservice.json | 4 + reports/history.json | 8 +- reports/report.html | 112 ++-- reports/report.json | 112 ++-- utils/api-coverage.d.ts | 180 ++++- utils/api-coverage.js | 80 ++- 11 files changed, 965 insertions(+), 525 deletions(-) diff --git a/fixtures/fixture.js b/fixtures/fixture.js index fb895c9..ed4a680 100644 --- a/fixtures/fixture.js +++ b/fixtures/fixture.js @@ -5,7 +5,7 @@ import config from '../config.json' with { type: 'json' } export { expect } from '@playwright/test' const apiCoverage = new ApiCoverage(config) await apiCoverage.loadSpec('https://parabank.parasoft.com/parabank/services/bank/openapi.yaml') -apiCoverage.setDebug(false) +apiCoverage.setDebug(true, 'error') const extension = { testHook: [ diff --git a/package-lock.json b/package-lock.json index 30e32c8..b93f0e8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,37 +1,39 @@ { "name": "api-coverage-tracker", - "version": "1.1.1", + "version": "2.0.3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "api-coverage-tracker", - "version": "1.1.1", + "version": "2.0.3", "license": "MIT", "dependencies": { - "@apidevtools/swagger-parser": "^10.1.1" + "@apidevtools/swagger-parser": "^12.1.0" + }, + "bin": { + "api-coverage-tracker": "utils/cli.js" }, "devDependencies": { - "@playwright/test": "^1.51.1", - "axios": "^1.8.4", - "eslint": "^9.24.0", - "eslint-config-prettier": "^10.1.2", - "eslint-plugin-jsdoc": "^50.6.9", + "@playwright/test": "^1.57.0", + "axios": "^1.13.2", + "eslint": "^9.39.2", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-jsdoc": "^62.1.0", "eslint-plugin-no-floating-promise": "^2.0.0", - "eslint-plugin-playwright": "2.2.0", - "prettier": "^3.5.3" + "eslint-plugin-playwright": "2.5.0", + "prettier": "^3.8.0" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@apidevtools/json-schema-ref-parser": { - "version": "11.7.2", - "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-11.7.2.tgz", - "integrity": "sha512-4gY54eEGEstClvEkGnwVkTkrx0sqwemEFG5OSRRn3tD91XH0+Q8XIkYIfo7IwEWPpJZwILb9GUXeShtplRc/eA==", + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-14.0.1.tgz", + "integrity": "sha512-Oc96zvmxx1fqoSEdUmfmvvb59/KDOnUoJ7s2t7bISyAn0XEz57LCCw8k2Y4Pf3mwKaZLMciESALORLgfe2frCw==", "license": "MIT", "dependencies": { - "@jsdevtools/ono": "^7.1.3", "@types/json-schema": "^7.0.15", "js-yaml": "^4.1.0" }, @@ -58,15 +60,14 @@ "license": "MIT" }, "node_modules/@apidevtools/swagger-parser": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/@apidevtools/swagger-parser/-/swagger-parser-10.1.1.tgz", - "integrity": "sha512-u/kozRnsPO/x8QtKYJOqoGtC4kH6yg1lfYkB9Au0WhYB0FNLpyFusttQtvhlwjtG3rOwiRz4D8DnnXa8iEpIKA==", + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/@apidevtools/swagger-parser/-/swagger-parser-12.1.0.tgz", + "integrity": "sha512-e5mJoswsnAX0jG+J09xHFYQXb/bUc5S3pLpMxUuRUA2H8T2kni3yEoyz2R3Dltw5f4A6j6rPNMpWTK+iVDFlng==", "license": "MIT", "dependencies": { - "@apidevtools/json-schema-ref-parser": "11.7.2", + "@apidevtools/json-schema-ref-parser": "14.0.1", "@apidevtools/openapi-schemas": "^2.1.0", "@apidevtools/swagger-methods": "^3.0.2", - "@jsdevtools/ono": "^7.1.3", "ajv": "^8.17.1", "ajv-draft-04": "^1.0.0", "call-me-maybe": "^1.0.2" @@ -76,24 +77,36 @@ } }, "node_modules/@es-joy/jsdoccomment": { - "version": "0.49.0", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.49.0.tgz", - "integrity": "sha512-xjZTSFgECpb9Ohuk5yMX5RhUEbfeQcuOp8IF60e+wyzWEF0M5xeSgqsfLtvPEX8BIyOX9saZqzuGPmZ8oWc+5Q==", + "version": "0.81.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.81.0.tgz", + "integrity": "sha512-4V4A0hFAB19id7w9iwiosV/rqwlH+PXEuYnnu1Cyc5jUjTwsE2G1qsX9TOCmfCmsWYBg6xeDC/XDFUzXAxDg3A==", "dev": true, "license": "MIT", "dependencies": { - "comment-parser": "1.4.1", - "esquery": "^1.6.0", - "jsdoc-type-pratt-parser": "~4.1.0" + "@types/estree": "^1.0.8", + "@typescript-eslint/types": "^8.53.0", + "comment-parser": "1.4.4", + "esquery": "^1.7.0", + "jsdoc-type-pratt-parser": "~7.0.0" }, "engines": { - "node": ">=16" + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@es-joy/resolve.exports": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@es-joy/resolve.exports/-/resolve.exports-1.2.0.tgz", + "integrity": "sha512-Q9hjxWI5xBM+qW2enxfe8wDKdFWMfd0Z29k5ZJnuBqD/CasY5Zryj09aCA6owbGATWz+39p5uIdaHXpopOcG8g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.6.0.tgz", - "integrity": "sha512-WhCn7Z7TauhBtmzhvKpoQs0Wwb/kBcy4CwpuI0/eEIr2Lx2auxmulAzLr91wVZJaz47iUZdkXOK7WlAfxGKCnA==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, "license": "MIT", "dependencies": { @@ -133,13 +146,13 @@ } }, "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==", + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/object-schema": "^2.1.6", + "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.2" }, @@ -148,19 +161,22 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.1.tgz", - "integrity": "sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", "dev": true, "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@eslint/core": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.12.0.tgz", - "integrity": "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -219,19 +235,22 @@ "license": "MIT" }, "node_modules/@eslint/js": { - "version": "9.24.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.24.0.tgz", - "integrity": "sha512-uIY/y3z0uvOGX8cp1C2fiC4+ZmBhp6yZWkojtHL1YEMnRt1Y63HB9TM17proGEmeG7HeUY+UP36F0aknKYTpYA==", + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", + "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", "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==", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -239,32 +258,19 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz", - "integrity": "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.13.0", + "@eslint/core": "^0.17.0", "levn": "^0.4.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz", - "integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, "node_modules/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", @@ -331,33 +337,14 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@jsdevtools/ono": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", - "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", - "license": "MIT" - }, - "node_modules/@pkgr/core": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.2.tgz", - "integrity": "sha512-fdDH1LSGfZdTH2sxdpVMw31BanV28K/Gry0cVFxaNP77neJSkd82mM8ErPNYs9e+0O7SdHBLTDzDgwUuy18RnQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" - } - }, "node_modules/@playwright/test": { - "version": "1.51.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.51.1.tgz", - "integrity": "sha512-nM+kEaTSAoVlXmMPH10017vn3FSiFqr/bh4fKg9vmAdMfd9SDqRZNvPSiAHADc/itWak+qPvMPZQOPwCBW7k7Q==", + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.57.0.tgz", + "integrity": "sha512-6TyEnHgd6SArQO8UO2OMTxshln3QMWBtPGrOCgs3wVEmQmwyuNtB10IZMfmYDE0riwNR1cu4q+pPcxMVtaG3TA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright": "1.51.1" + "playwright": "1.57.0" }, "bin": { "playwright": "cli.js" @@ -366,10 +353,23 @@ "node": ">=18" } }, + "node_modules/@sindresorhus/base62": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/base62/-/base62-1.0.0.tgz", + "integrity": "sha512-TeheYy0ILzBEI/CO55CP6zJCSdSWeRtGnHy8U8dWSUH4I68iqTsy7HkMktR4xakThc9jotkPQUXT4ITdbV7cHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@types/estree": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", - "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true, "license": "MIT" }, @@ -379,12 +379,27 @@ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "license": "MIT" }, + "node_modules/@typescript-eslint/types": { + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.53.0.tgz", + "integrity": "sha512-Bmh9KX31Vlxa13+PqPvt4RzKRN1XORYSLlAE+sO1i28NkisGbTtSLFVB3l7PWdHtR3E0mVMuC7JilWJ99m2HxQ==", + "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/acorn": { - "version": "8.14.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", - "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -407,6 +422,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -472,14 +488,14 @@ "license": "MIT" }, "node_modules/axios": { - "version": "1.8.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz", - "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", + "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", "dev": true, "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", + "form-data": "^4.0.4", "proxy-from-env": "^1.1.0" } }, @@ -582,9 +598,9 @@ } }, "node_modules/comment-parser": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz", - "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==", + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.4.tgz", + "integrity": "sha512-0D6qSQ5IkeRrGJFHRClzaMOenMeT0gErz3zIw3AprKMqhRN6LNU2jQOdkPG/FZ+8bCgXE1VidrgSzlBBDZRr8A==", "dev": true, "license": "MIT", "engines": { @@ -614,9 +630,9 @@ } }, "node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", "dependencies": { @@ -683,13 +699,6 @@ "node": ">= 0.4" } }, - "node_modules/es-module-lexer": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", - "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", - "dev": true, - "license": "MIT" - }, "node_modules/es-object-atoms": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", @@ -733,33 +742,33 @@ } }, "node_modules/eslint": { - "version": "9.24.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.24.0.tgz", - "integrity": "sha512-eh/jxIEJyZrvbWRe4XuVclLPDYSYYYgLy5zXGGxD6j8zjSAxFEzI2fL/8xNq6O2yKqVt+eF2YhV+hxjV6UKXwQ==", + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", + "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.20.0", - "@eslint/config-helpers": "^0.2.0", - "@eslint/core": "^0.12.0", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.24.0", - "@eslint/plugin-kit": "^0.2.7", + "@eslint/js": "9.39.2", + "@eslint/plugin-kit": "^0.4.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", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -794,44 +803,81 @@ } }, "node_modules/eslint-config-prettier": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.2.tgz", - "integrity": "sha512-Epgp/EofAUeEpIdZkW60MHKvPyru1ruQJxPL+WIycnaPApuseK0Zpkrh/FwL9oIpQvIhJwV7ptOy0DWUjTlCiA==", + "version": "10.1.8", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", + "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", "dev": true, "license": "MIT", "bin": { "eslint-config-prettier": "bin/cli.js" }, + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" + }, "peerDependencies": { "eslint": ">=7.0.0" } }, "node_modules/eslint-plugin-jsdoc": { - "version": "50.6.9", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-50.6.9.tgz", - "integrity": "sha512-7/nHu3FWD4QRG8tCVqcv+BfFtctUtEDWc29oeDXB4bwmDM2/r1ndl14AG/2DUntdqH7qmpvdemJKwb3R97/QEw==", + "version": "62.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-62.1.0.tgz", + "integrity": "sha512-HEK/u7FO/hPDNo5ERxru7OouIx6AVBjjNbNQCsq4CxQBtRxb9esr8PuxX2zy0zAdGJnfczg3+zytnkKWjsKWwQ==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "@es-joy/jsdoccomment": "~0.49.0", + "@es-joy/jsdoccomment": "~0.81.0", + "@es-joy/resolve.exports": "1.2.0", "are-docs-informative": "^0.0.2", - "comment-parser": "1.4.1", - "debug": "^4.3.6", + "comment-parser": "1.4.4", + "debug": "^4.4.3", "escape-string-regexp": "^4.0.0", - "espree": "^10.1.0", - "esquery": "^1.6.0", - "parse-imports": "^2.1.1", - "semver": "^7.6.3", + "espree": "^11.0.0", + "esquery": "^1.7.0", + "html-entities": "^2.6.0", + "object-deep-merge": "^2.0.0", + "parse-imports-exports": "^0.2.4", + "semver": "^7.7.3", "spdx-expression-parse": "^4.0.0", - "synckit": "^0.9.1" + "to-valid-identifier": "^1.0.0" }, "engines": { - "node": ">=18" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" } }, + "node_modules/eslint-plugin-jsdoc/node_modules/eslint-visitor-keys": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.0.tgz", + "integrity": "sha512-A0XeIi7CXU7nPlfHS9loMYEKxUaONu/hTEzHTGba9Huu94Cq1hPivf+DE5erJozZOky0LfvXAyrV/tcswpLI0Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-jsdoc/node_modules/espree": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.0.0.tgz", + "integrity": "sha512-+gMeWRrIh/NsG+3NaLeWHuyeyk70p2tbvZIWBYcqQ4/7Xvars6GYTZNhF1sIeLcc6Wb11He5ffz3hsHyXFrw5A==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/eslint-plugin-no-floating-promise": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/eslint-plugin-no-floating-promise/-/eslint-plugin-no-floating-promise-2.0.0.tgz", @@ -846,44 +892,38 @@ } }, "node_modules/eslint-plugin-playwright": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-playwright/-/eslint-plugin-playwright-2.2.0.tgz", - "integrity": "sha512-qSQpAw7RcSzE3zPp8FMGkthaCWovHZ/BsXtpmnGax9vQLIovlh1bsZHEa2+j2lv9DWhnyeLM/qZmp7ffQZfQvg==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-playwright/-/eslint-plugin-playwright-2.5.0.tgz", + "integrity": "sha512-1ckFw7Abdz+l23wtw5Tg4GTK3Y+MgEQQNjEr7FTJP3wwmIOj8DkbJ6G655aPc09c0Kfn/NoGA4xpMZzeSO4NWw==", "dev": true, "license": "MIT", - "workspaces": [ - "examples" - ], "dependencies": { - "globals": "^13.23.0" + "globals": "^16.4.0" }, "engines": { - "node": ">=16.6.0" + "node": ">=16.9.0" }, "peerDependencies": { "eslint": ">=8.40.0" } }, "node_modules/eslint-plugin-playwright/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", + "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", "dev": true, "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "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==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -927,6 +967,37 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/eslint/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -953,9 +1024,9 @@ } }, "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -1107,15 +1178,16 @@ } }, "node_modules/form-data": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", - "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", "dev": true, "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", "mime-types": "^2.1.12" }, "engines": { @@ -1277,6 +1349,23 @@ "node": ">= 0.4" } }, + "node_modules/html-entities": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", + "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -1357,13 +1446,13 @@ } }, "node_modules/jsdoc-type-pratt-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.1.0.tgz", - "integrity": "sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-7.0.0.tgz", + "integrity": "sha512-c7YbokssPOSHmqTbSAmTtnVgAVa/7lumWNYqomgd5KOMyPrRve2anx6lonfOsXEQacqF9FKVUj7bLg4vRSvdYA==", "dev": true, "license": "MIT", "engines": { - "node": ">=12.0.0" + "node": ">=20.0.0" } }, "node_modules/json-buffer": { @@ -1493,6 +1582,13 @@ "dev": true, "license": "MIT" }, + "node_modules/object-deep-merge": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/object-deep-merge/-/object-deep-merge-2.0.0.tgz", + "integrity": "sha512-3DC3UMpeffLTHiuXSy/UG4NOIYTLlY9u3V82+djSCLYClWobZiS4ivYzpIUWrRY/nfsJ8cWsKyG3QfyLePmhvg==", + "dev": true, + "license": "MIT" + }, "node_modules/openapi-types": { "version": "12.1.3", "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz", @@ -1563,20 +1659,23 @@ "node": ">=6" } }, - "node_modules/parse-imports": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/parse-imports/-/parse-imports-2.2.1.tgz", - "integrity": "sha512-OL/zLggRp8mFhKL0rNORUTR4yBYujK/uU+xZL+/0Rgm2QE4nLO9v8PzEweSJEbMGKmDRjJE4R3IMJlL2di4JeQ==", + "node_modules/parse-imports-exports": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/parse-imports-exports/-/parse-imports-exports-0.2.4.tgz", + "integrity": "sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==", "dev": true, - "license": "Apache-2.0 AND MIT", + "license": "MIT", "dependencies": { - "es-module-lexer": "^1.5.3", - "slashes": "^3.0.12" - }, - "engines": { - "node": ">= 18" + "parse-statements": "1.0.11" } }, + "node_modules/parse-statements": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/parse-statements/-/parse-statements-1.0.11.tgz", + "integrity": "sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==", + "dev": true, + "license": "MIT" + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -1598,13 +1697,13 @@ } }, "node_modules/playwright": { - "version": "1.51.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.51.1.tgz", - "integrity": "sha512-kkx+MB2KQRkyxjYPc3a0wLZZoDczmppyGJIvQ43l+aZihkaVvmu/21kiyaHeHjiFxjxNNFnUncKmcGIyOojsaw==", + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.57.0.tgz", + "integrity": "sha512-ilYQj1s8sr2ppEJ2YVadYBN0Mb3mdo9J0wQ+UuDhzYqURwSoW4n1Xs5vs7ORwgDGmyEh33tRMeS8KhdkMoLXQw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.51.1" + "playwright-core": "1.57.0" }, "bin": { "playwright": "cli.js" @@ -1617,9 +1716,9 @@ } }, "node_modules/playwright-core": { - "version": "1.51.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.51.1.tgz", - "integrity": "sha512-/crRMj8+j/Nq5s8QcvegseuyeZPxpQCZb6HNk3Sos3BlZyAknRjoyJPFWkpNn8v0+P3WiwqFF8P+zQo4eqiNuw==", + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.57.0.tgz", + "integrity": "sha512-agTcKlMw/mjBWOnD6kFZttAAGHgi/Nw0CZ2o6JqWSbMlI219lAFLZZCyqByTsvVAJq5XA5H8cA6PrvBRpBWEuQ==", "dev": true, "license": "Apache-2.0", "bin": { @@ -1640,9 +1739,9 @@ } }, "node_modules/prettier": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", - "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.0.tgz", + "integrity": "sha512-yEPsovQfpxYfgWNhCfECjG5AQaO+K3dp6XERmOepyPDVqcJm+bjyCVO3pmU+nAPe0N5dDvekfGezt/EIiRe1TA==", "dev": true, "license": "MIT", "bin": { @@ -1691,6 +1790,19 @@ "node": ">=0.10.5" } }, + "node_modules/reserved-identifiers": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/reserved-identifiers/-/reserved-identifiers-1.2.0.tgz", + "integrity": "sha512-yE7KUfFvaBFzGPs5H3Ops1RevfUEsDc5Iz65rOwWg4lE8HJSYtle77uul3+573457oHvBKuHYDl/xqUkKpEEdw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -1702,9 +1814,9 @@ } }, "node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "bin": { @@ -1737,13 +1849,6 @@ "node": ">=8" } }, - "node_modules/slashes": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/slashes/-/slashes-3.0.12.tgz", - "integrity": "sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==", - "dev": true, - "license": "ISC" - }, "node_modules/spdx-exceptions": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", @@ -1795,30 +1900,23 @@ "node": ">=8" } }, - "node_modules/synckit": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz", - "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==", + "node_modules/to-valid-identifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-valid-identifier/-/to-valid-identifier-1.0.0.tgz", + "integrity": "sha512-41wJyvKep3yT2tyPqX/4blcfybknGB4D+oETKLs7Q76UiPqRpUJK3hr1nxelyYO0PHKVzJwlu0aCeEAsGI6rpw==", "dev": true, "license": "MIT", "dependencies": { - "@pkgr/core": "^0.1.0", - "tslib": "^2.6.2" + "@sindresorhus/base62": "^1.0.0", + "reserved-identifiers": "^1.0.0" }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": ">=20" }, "funding": { - "url": "https://opencollective.com/unts" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD" - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -1832,19 +1930,6 @@ "node": ">= 0.8.0" } }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -1897,11 +1982,10 @@ }, "dependencies": { "@apidevtools/json-schema-ref-parser": { - "version": "11.7.2", - "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-11.7.2.tgz", - "integrity": "sha512-4gY54eEGEstClvEkGnwVkTkrx0sqwemEFG5OSRRn3tD91XH0+Q8XIkYIfo7IwEWPpJZwILb9GUXeShtplRc/eA==", + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-14.0.1.tgz", + "integrity": "sha512-Oc96zvmxx1fqoSEdUmfmvvb59/KDOnUoJ7s2t7bISyAn0XEz57LCCw8k2Y4Pf3mwKaZLMciESALORLgfe2frCw==", "requires": { - "@jsdevtools/ono": "^7.1.3", "@types/json-schema": "^7.0.15", "js-yaml": "^4.1.0" } @@ -1917,34 +2001,41 @@ "integrity": "sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==" }, "@apidevtools/swagger-parser": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/@apidevtools/swagger-parser/-/swagger-parser-10.1.1.tgz", - "integrity": "sha512-u/kozRnsPO/x8QtKYJOqoGtC4kH6yg1lfYkB9Au0WhYB0FNLpyFusttQtvhlwjtG3rOwiRz4D8DnnXa8iEpIKA==", + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/@apidevtools/swagger-parser/-/swagger-parser-12.1.0.tgz", + "integrity": "sha512-e5mJoswsnAX0jG+J09xHFYQXb/bUc5S3pLpMxUuRUA2H8T2kni3yEoyz2R3Dltw5f4A6j6rPNMpWTK+iVDFlng==", "requires": { - "@apidevtools/json-schema-ref-parser": "11.7.2", + "@apidevtools/json-schema-ref-parser": "14.0.1", "@apidevtools/openapi-schemas": "^2.1.0", "@apidevtools/swagger-methods": "^3.0.2", - "@jsdevtools/ono": "^7.1.3", "ajv": "^8.17.1", "ajv-draft-04": "^1.0.0", "call-me-maybe": "^1.0.2" } }, "@es-joy/jsdoccomment": { - "version": "0.49.0", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.49.0.tgz", - "integrity": "sha512-xjZTSFgECpb9Ohuk5yMX5RhUEbfeQcuOp8IF60e+wyzWEF0M5xeSgqsfLtvPEX8BIyOX9saZqzuGPmZ8oWc+5Q==", + "version": "0.81.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.81.0.tgz", + "integrity": "sha512-4V4A0hFAB19id7w9iwiosV/rqwlH+PXEuYnnu1Cyc5jUjTwsE2G1qsX9TOCmfCmsWYBg6xeDC/XDFUzXAxDg3A==", "dev": true, "requires": { - "comment-parser": "1.4.1", - "esquery": "^1.6.0", - "jsdoc-type-pratt-parser": "~4.1.0" + "@types/estree": "^1.0.8", + "@typescript-eslint/types": "^8.53.0", + "comment-parser": "1.4.4", + "esquery": "^1.7.0", + "jsdoc-type-pratt-parser": "~7.0.0" } }, + "@es-joy/resolve.exports": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@es-joy/resolve.exports/-/resolve.exports-1.2.0.tgz", + "integrity": "sha512-Q9hjxWI5xBM+qW2enxfe8wDKdFWMfd0Z29k5ZJnuBqD/CasY5Zryj09aCA6owbGATWz+39p5uIdaHXpopOcG8g==", + "dev": true + }, "@eslint-community/eslint-utils": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.6.0.tgz", - "integrity": "sha512-WhCn7Z7TauhBtmzhvKpoQs0Wwb/kBcy4CwpuI0/eEIr2Lx2auxmulAzLr91wVZJaz47iUZdkXOK7WlAfxGKCnA==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, "requires": { "eslint-visitor-keys": "^3.4.3" @@ -1965,26 +2056,29 @@ "dev": true }, "@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==", + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", "dev": true, "requires": { - "@eslint/object-schema": "^2.1.6", + "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "@eslint/config-helpers": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.1.tgz", - "integrity": "sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw==", - "dev": true + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "requires": { + "@eslint/core": "^0.17.0" + } }, "@eslint/core": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.12.0.tgz", - "integrity": "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", "dev": true, "requires": { "@types/json-schema": "^7.0.15" @@ -2028,36 +2122,25 @@ } }, "@eslint/js": { - "version": "9.24.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.24.0.tgz", - "integrity": "sha512-uIY/y3z0uvOGX8cp1C2fiC4+ZmBhp6yZWkojtHL1YEMnRt1Y63HB9TM17proGEmeG7HeUY+UP36F0aknKYTpYA==", + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", + "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", "dev": true }, "@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==", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", "dev": true }, "@eslint/plugin-kit": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz", - "integrity": "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", "dev": true, "requires": { - "@eslint/core": "^0.13.0", + "@eslint/core": "^0.17.0", "levn": "^0.4.1" - }, - "dependencies": { - "@eslint/core": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz", - "integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.15" - } - } } }, "@humanfs/core": { @@ -2096,30 +2179,25 @@ "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==", "dev": true }, - "@jsdevtools/ono": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", - "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==" - }, - "@pkgr/core": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.2.tgz", - "integrity": "sha512-fdDH1LSGfZdTH2sxdpVMw31BanV28K/Gry0cVFxaNP77neJSkd82mM8ErPNYs9e+0O7SdHBLTDzDgwUuy18RnQ==", - "dev": true - }, "@playwright/test": { - "version": "1.51.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.51.1.tgz", - "integrity": "sha512-nM+kEaTSAoVlXmMPH10017vn3FSiFqr/bh4fKg9vmAdMfd9SDqRZNvPSiAHADc/itWak+qPvMPZQOPwCBW7k7Q==", + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.57.0.tgz", + "integrity": "sha512-6TyEnHgd6SArQO8UO2OMTxshln3QMWBtPGrOCgs3wVEmQmwyuNtB10IZMfmYDE0riwNR1cu4q+pPcxMVtaG3TA==", "dev": true, "requires": { - "playwright": "1.51.1" + "playwright": "1.57.0" } }, + "@sindresorhus/base62": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/base62/-/base62-1.0.0.tgz", + "integrity": "sha512-TeheYy0ILzBEI/CO55CP6zJCSdSWeRtGnHy8U8dWSUH4I68iqTsy7HkMktR4xakThc9jotkPQUXT4ITdbV7cHA==", + "dev": true + }, "@types/estree": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", - "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true }, "@types/json-schema": { @@ -2127,12 +2205,19 @@ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" }, - "acorn": { - "version": "8.14.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", - "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "@typescript-eslint/types": { + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.53.0.tgz", + "integrity": "sha512-Bmh9KX31Vlxa13+PqPvt4RzKRN1XORYSLlAE+sO1i28NkisGbTtSLFVB3l7PWdHtR3E0mVMuC7JilWJ99m2HxQ==", "dev": true }, + "acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "peer": true + }, "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -2144,6 +2229,7 @@ "version": "8.17.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "peer": true, "requires": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -2184,13 +2270,13 @@ "dev": true }, "axios": { - "version": "1.8.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz", - "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", + "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", "dev": true, "requires": { "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", + "form-data": "^4.0.4", "proxy-from-env": "^1.1.0" } }, @@ -2266,9 +2352,9 @@ } }, "comment-parser": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz", - "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==", + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.4.tgz", + "integrity": "sha512-0D6qSQ5IkeRrGJFHRClzaMOenMeT0gErz3zIw3AprKMqhRN6LNU2jQOdkPG/FZ+8bCgXE1VidrgSzlBBDZRr8A==", "dev": true }, "concat-map": { @@ -2289,9 +2375,9 @@ } }, "debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "requires": { "ms": "^2.1.3" @@ -2332,12 +2418,6 @@ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true }, - "es-module-lexer": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", - "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", - "dev": true - }, "es-object-atoms": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", @@ -2366,32 +2446,32 @@ "dev": true }, "eslint": { - "version": "9.24.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.24.0.tgz", - "integrity": "sha512-eh/jxIEJyZrvbWRe4XuVclLPDYSYYYgLy5zXGGxD6j8zjSAxFEzI2fL/8xNq6O2yKqVt+eF2YhV+hxjV6UKXwQ==", + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", + "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", "dev": true, + "peer": true, "requires": { - "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.20.0", - "@eslint/config-helpers": "^0.2.0", - "@eslint/core": "^0.12.0", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.24.0", - "@eslint/plugin-kit": "^0.2.7", + "@eslint/js": "9.39.2", + "@eslint/plugin-kit": "^0.4.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", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -2420,6 +2500,23 @@ "uri-js": "^4.2.2" } }, + "eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true + }, + "espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "requires": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + } + }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -2429,29 +2526,51 @@ } }, "eslint-config-prettier": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.2.tgz", - "integrity": "sha512-Epgp/EofAUeEpIdZkW60MHKvPyru1ruQJxPL+WIycnaPApuseK0Zpkrh/FwL9oIpQvIhJwV7ptOy0DWUjTlCiA==", + "version": "10.1.8", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", + "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", "dev": true, "requires": {} }, "eslint-plugin-jsdoc": { - "version": "50.6.9", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-50.6.9.tgz", - "integrity": "sha512-7/nHu3FWD4QRG8tCVqcv+BfFtctUtEDWc29oeDXB4bwmDM2/r1ndl14AG/2DUntdqH7qmpvdemJKwb3R97/QEw==", + "version": "62.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-62.1.0.tgz", + "integrity": "sha512-HEK/u7FO/hPDNo5ERxru7OouIx6AVBjjNbNQCsq4CxQBtRxb9esr8PuxX2zy0zAdGJnfczg3+zytnkKWjsKWwQ==", "dev": true, "requires": { - "@es-joy/jsdoccomment": "~0.49.0", + "@es-joy/jsdoccomment": "~0.81.0", + "@es-joy/resolve.exports": "1.2.0", "are-docs-informative": "^0.0.2", - "comment-parser": "1.4.1", - "debug": "^4.3.6", + "comment-parser": "1.4.4", + "debug": "^4.4.3", "escape-string-regexp": "^4.0.0", - "espree": "^10.1.0", - "esquery": "^1.6.0", - "parse-imports": "^2.1.1", - "semver": "^7.6.3", + "espree": "^11.0.0", + "esquery": "^1.7.0", + "html-entities": "^2.6.0", + "object-deep-merge": "^2.0.0", + "parse-imports-exports": "^0.2.4", + "semver": "^7.7.3", "spdx-expression-parse": "^4.0.0", - "synckit": "^0.9.1" + "to-valid-identifier": "^1.0.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.0.tgz", + "integrity": "sha512-A0XeIi7CXU7nPlfHS9loMYEKxUaONu/hTEzHTGba9Huu94Cq1hPivf+DE5erJozZOky0LfvXAyrV/tcswpLI0Q==", + "dev": true + }, + "espree": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.0.0.tgz", + "integrity": "sha512-+gMeWRrIh/NsG+3NaLeWHuyeyk70p2tbvZIWBYcqQ4/7Xvars6GYTZNhF1sIeLcc6Wb11He5ffz3hsHyXFrw5A==", + "dev": true, + "requires": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^5.0.0" + } + } } }, "eslint-plugin-no-floating-promise": { @@ -2464,29 +2583,26 @@ } }, "eslint-plugin-playwright": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-playwright/-/eslint-plugin-playwright-2.2.0.tgz", - "integrity": "sha512-qSQpAw7RcSzE3zPp8FMGkthaCWovHZ/BsXtpmnGax9vQLIovlh1bsZHEa2+j2lv9DWhnyeLM/qZmp7ffQZfQvg==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-playwright/-/eslint-plugin-playwright-2.5.0.tgz", + "integrity": "sha512-1ckFw7Abdz+l23wtw5Tg4GTK3Y+MgEQQNjEr7FTJP3wwmIOj8DkbJ6G655aPc09c0Kfn/NoGA4xpMZzeSO4NWw==", "dev": true, "requires": { - "globals": "^13.23.0" + "globals": "^16.4.0" }, "dependencies": { "globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", + "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", + "dev": true } } }, "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==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", "dev": true, "requires": { "esrecurse": "^4.3.0", @@ -2511,9 +2627,9 @@ } }, "esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "dev": true, "requires": { "estraverse": "^5.1.0" @@ -2604,14 +2720,15 @@ "dev": true }, "form-data": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", - "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", "dev": true, "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, @@ -2707,6 +2824,12 @@ "function-bind": "^1.1.2" } }, + "html-entities": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", + "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", + "dev": true + }, "ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -2759,9 +2882,9 @@ } }, "jsdoc-type-pratt-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.1.0.tgz", - "integrity": "sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-7.0.0.tgz", + "integrity": "sha512-c7YbokssPOSHmqTbSAmTtnVgAVa/7lumWNYqomgd5KOMyPrRve2anx6lonfOsXEQacqF9FKVUj7bLg4vRSvdYA==", "dev": true }, "json-buffer": { @@ -2857,6 +2980,12 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "object-deep-merge": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/object-deep-merge/-/object-deep-merge-2.0.0.tgz", + "integrity": "sha512-3DC3UMpeffLTHiuXSy/UG4NOIYTLlY9u3V82+djSCLYClWobZiS4ivYzpIUWrRY/nfsJ8cWsKyG3QfyLePmhvg==", + "dev": true + }, "openapi-types": { "version": "12.1.3", "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz", @@ -2904,16 +3033,21 @@ "callsites": "^3.0.0" } }, - "parse-imports": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/parse-imports/-/parse-imports-2.2.1.tgz", - "integrity": "sha512-OL/zLggRp8mFhKL0rNORUTR4yBYujK/uU+xZL+/0Rgm2QE4nLO9v8PzEweSJEbMGKmDRjJE4R3IMJlL2di4JeQ==", + "parse-imports-exports": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/parse-imports-exports/-/parse-imports-exports-0.2.4.tgz", + "integrity": "sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==", "dev": true, "requires": { - "es-module-lexer": "^1.5.3", - "slashes": "^3.0.12" + "parse-statements": "1.0.11" } }, + "parse-statements": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/parse-statements/-/parse-statements-1.0.11.tgz", + "integrity": "sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==", + "dev": true + }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -2927,19 +3061,19 @@ "dev": true }, "playwright": { - "version": "1.51.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.51.1.tgz", - "integrity": "sha512-kkx+MB2KQRkyxjYPc3a0wLZZoDczmppyGJIvQ43l+aZihkaVvmu/21kiyaHeHjiFxjxNNFnUncKmcGIyOojsaw==", + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.57.0.tgz", + "integrity": "sha512-ilYQj1s8sr2ppEJ2YVadYBN0Mb3mdo9J0wQ+UuDhzYqURwSoW4n1Xs5vs7ORwgDGmyEh33tRMeS8KhdkMoLXQw==", "dev": true, "requires": { "fsevents": "2.3.2", - "playwright-core": "1.51.1" + "playwright-core": "1.57.0" } }, "playwright-core": { - "version": "1.51.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.51.1.tgz", - "integrity": "sha512-/crRMj8+j/Nq5s8QcvegseuyeZPxpQCZb6HNk3Sos3BlZyAknRjoyJPFWkpNn8v0+P3WiwqFF8P+zQo4eqiNuw==", + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.57.0.tgz", + "integrity": "sha512-agTcKlMw/mjBWOnD6kFZttAAGHgi/Nw0CZ2o6JqWSbMlI219lAFLZZCyqByTsvVAJq5XA5H8cA6PrvBRpBWEuQ==", "dev": true }, "prelude-ls": { @@ -2949,9 +3083,9 @@ "dev": true }, "prettier": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", - "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.0.tgz", + "integrity": "sha512-yEPsovQfpxYfgWNhCfECjG5AQaO+K3dp6XERmOepyPDVqcJm+bjyCVO3pmU+nAPe0N5dDvekfGezt/EIiRe1TA==", "dev": true }, "proxy-from-env": { @@ -2977,6 +3111,12 @@ "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==", "dev": true }, + "reserved-identifiers": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/reserved-identifiers/-/reserved-identifiers-1.2.0.tgz", + "integrity": "sha512-yE7KUfFvaBFzGPs5H3Ops1RevfUEsDc5Iz65rOwWg4lE8HJSYtle77uul3+573457oHvBKuHYDl/xqUkKpEEdw==", + "dev": true + }, "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -2984,9 +3124,9 @@ "dev": true }, "semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true }, "shebang-command": { @@ -3004,12 +3144,6 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, - "slashes": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/slashes/-/slashes-3.0.12.tgz", - "integrity": "sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==", - "dev": true - }, "spdx-exceptions": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", @@ -3047,22 +3181,16 @@ "has-flag": "^4.0.0" } }, - "synckit": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz", - "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==", + "to-valid-identifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-valid-identifier/-/to-valid-identifier-1.0.0.tgz", + "integrity": "sha512-41wJyvKep3yT2tyPqX/4blcfybknGB4D+oETKLs7Q76UiPqRpUJK3hr1nxelyYO0PHKVzJwlu0aCeEAsGI6rpw==", "dev": true, "requires": { - "@pkgr/core": "^0.1.0", - "tslib": "^2.6.2" + "@sindresorhus/base62": "^1.0.0", + "reserved-identifiers": "^1.0.0" } }, - "tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true - }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -3072,12 +3200,6 @@ "prelude-ls": "^1.2.1" } }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", diff --git a/package.json b/package.json index c5a8f9d..851b172 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "version": "2.0.3", "description": "A universal library for tracking API coverage against OpenAPI/Swagger specifications from URL or local file. Supports Axis, Fetch, Playwright and manual registry of the responses", "main": "./utils/api-coverage.js", + "types": "./utils/api-coverage.d.ts", "exports": { ".": "./utils/api-coverage.js" }, @@ -14,7 +15,8 @@ "test-axios": "node e2e/api-coverage-example.js", "test-playwright": "npx playwright test", "test-postman": "npx api-coverage-tracker --spec 'https://fakestoreapi.com/docs-data' --collection './e2e/data/FakeStoreAPI.postman_collection.json' --coverage detailed", - "lint": "eslint ." + "lint": "eslint .", + "bump": "npx -y npm-check-updates -u && npm prune" }, "keywords": [ "api", @@ -37,17 +39,17 @@ }, "homepage": "https://github.com/Valiantsin2021/api-coverage-tracker#readme", "dependencies": { - "@apidevtools/swagger-parser": "^10.1.1" + "@apidevtools/swagger-parser": "^12.1.0" }, "devDependencies": { - "@playwright/test": "^1.51.1", - "eslint": "^9.24.0", - "eslint-config-prettier": "^10.1.2", - "eslint-plugin-jsdoc": "^50.6.9", + "@playwright/test": "^1.57.0", + "eslint": "^9.39.2", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-jsdoc": "^62.1.0", "eslint-plugin-no-floating-promise": "^2.0.0", - "eslint-plugin-playwright": "2.2.0", - "prettier": "^3.5.3", - "axios": "^1.8.4" + "eslint-plugin-playwright": "2.5.0", + "prettier": "^3.8.0", + "axios": "^1.13.2" }, "engines": { "node": ">=18.0.0" diff --git a/readme.md b/readme.md index 953e3be..5919377 100644 --- a/readme.md +++ b/readme.md @@ -60,6 +60,42 @@ For Postman collections it also tracks the previous coverage statistics. Support ```bash npm install -D api-coverage-tracker ``` + +## TypeScript Support + +This library includes TypeScript definitions for full auto-completion support. When using in TypeScript projects, you'll get: + +- Auto-completion for all methods and properties +- Type checking for method parameters and return values +- IntelliSense for configuration objects and options + +```typescript +import { ApiCoverage, ApiCoverageConfig, StartTrackingOptions } from 'api-coverage-tracker'; + +const config: ApiCoverageConfig = { + services: [{ + key: 'my-api', + name: 'My API', + tags: ['api'], + repository: 'https://github.com/myorg/my-api', + swaggerUrl: 'https://api.example.com/swagger.json' + }], + 'report-path': './reports' +}; + +const apiCoverage = new ApiCoverage(config); + +// Full auto-completion available +await apiCoverage.loadSpec('https://api.example.com/swagger.json'); + +const options: StartTrackingOptions = { + clientType: 'axios', + coverage: 'detailed' +}; + +await apiCoverage.startTracking(axiosInstance, options); +``` + ## Configuration The library requires a configuration object with service information: diff --git a/reports/Parabankapiservice.json b/reports/Parabankapiservice.json index 733c5e3..a965503 100644 --- a/reports/Parabankapiservice.json +++ b/reports/Parabankapiservice.json @@ -6,5 +6,13 @@ { "createdAt": "2025-06-09T12:52:40.454Z", "totalCoverage": 100 + }, + { + "createdAt": "2025-11-22T21:25:16.153Z", + "totalCoverage": 100 + }, + { + "createdAt": "2026-01-25T20:25:47.897Z", + "totalCoverage": 100 } ] \ No newline at end of file diff --git a/reports/Petsplaywrightapiservice.json b/reports/Petsplaywrightapiservice.json index d9d1332..7341c47 100644 --- a/reports/Petsplaywrightapiservice.json +++ b/reports/Petsplaywrightapiservice.json @@ -2,5 +2,9 @@ { "createdAt": "2025-06-08T23:13:51.655Z", "totalCoverage": 56 + }, + { + "createdAt": "2026-01-18T19:25:40.391Z", + "totalCoverage": 56 } ] \ No newline at end of file diff --git a/reports/history.json b/reports/history.json index 5e76bdc..8dee80f 100644 --- a/reports/history.json +++ b/reports/history.json @@ -202,7 +202,7 @@ "method": "GET", "path": "/pet/findByStatus", "statuses": { - "200": 2 + "200": 1 }, "queryParams": [ "status" @@ -512,7 +512,8 @@ "method": "GET", "path": "/accounts/{accountId}", "statuses": { - "200": 1 + "200": 1, + "400": 1 }, "queryParams": [] }, @@ -520,7 +521,8 @@ "method": "GET", "path": "/accounts/{accountId}/transactions", "statuses": { - "200": 3 + "200": 3, + "400": 1 }, "queryParams": [ "amount", diff --git a/reports/report.html b/reports/report.html index 60724ba..d6e70bc 100644 --- a/reports/report.html +++ b/reports/report.html @@ -65,7 +65,7 @@ } ] }, - "createdAt": "2025-06-09T12:53:58.975Z", + "createdAt": "2026-01-25T20:25:47.898Z", "servicesCoverage": { "Fakestore-api-service": { "endpoints": [ @@ -595,7 +595,7 @@ "totalCoverage": 40, "totalCoverageHistory": [ { - "createdAt": "2025-06-08T23:13:51.655Z", + "createdAt": "2026-01-18T19:25:40.389Z", "totalCoverage": 40 } ] @@ -619,7 +619,7 @@ "totalCoverage": 40, "totalCoverageHistory": [ { - "createdAt": "2025-06-08T23:13:51.655Z", + "createdAt": "2026-01-18T19:25:40.390Z", "totalCoverage": 40 } ] @@ -655,7 +655,7 @@ "totalCoverage": 40, "totalCoverageHistory": [ { - "createdAt": "2025-06-08T23:13:51.655Z", + "createdAt": "2026-01-18T19:25:40.390Z", "totalCoverage": 40 } ] @@ -665,11 +665,11 @@ "method": "GET", "summary": "Finds Pets by status", "coverage": "COVERED", - "totalCases": 2, + "totalCases": 1, "statusCodes": [ { "value": 200, - "totalCases": 2, + "totalCases": 1, "description": "successful operation", "responseCoverage": "COVERED" }, @@ -690,7 +690,7 @@ "totalCoverage": 80, "totalCoverageHistory": [ { - "createdAt": "2025-06-08T23:13:51.655Z", + "createdAt": "2026-01-18T19:25:40.390Z", "totalCoverage": 80 } ] @@ -725,7 +725,7 @@ "totalCoverage": 80, "totalCoverageHistory": [ { - "createdAt": "2025-06-08T23:13:51.655Z", + "createdAt": "2026-01-18T19:25:40.391Z", "totalCoverage": 80 } ] @@ -761,7 +761,7 @@ "totalCoverage": 66.66666666666666, "totalCoverageHistory": [ { - "createdAt": "2025-06-08T23:13:51.655Z", + "createdAt": "2026-01-18T19:25:40.391Z", "totalCoverage": 66.66666666666666 } ] @@ -785,7 +785,7 @@ "totalCoverage": 40, "totalCoverageHistory": [ { - "createdAt": "2025-06-08T23:13:51.655Z", + "createdAt": "2026-01-18T19:25:40.391Z", "totalCoverage": 40 } ] @@ -815,7 +815,7 @@ "totalCoverage": 60, "totalCoverageHistory": [ { - "createdAt": "2025-06-08T23:13:51.655Z", + "createdAt": "2026-01-18T19:25:40.391Z", "totalCoverage": 60 } ] @@ -839,7 +839,7 @@ "totalCoverage": 80, "totalCoverageHistory": [ { - "createdAt": "2025-06-08T23:13:51.655Z", + "createdAt": "2026-01-18T19:25:40.391Z", "totalCoverage": 80 } ] @@ -869,7 +869,7 @@ "totalCoverage": 60, "totalCoverageHistory": [ { - "createdAt": "2025-06-08T23:13:51.655Z", + "createdAt": "2026-01-18T19:25:40.391Z", "totalCoverage": 60 } ] @@ -905,7 +905,7 @@ "totalCoverage": 66.66666666666666, "totalCoverageHistory": [ { - "createdAt": "2025-06-08T23:13:51.655Z", + "createdAt": "2026-01-18T19:25:40.391Z", "totalCoverage": 66.66666666666666 } ] @@ -935,7 +935,7 @@ "totalCoverage": 60, "totalCoverageHistory": [ { - "createdAt": "2025-06-08T23:13:51.655Z", + "createdAt": "2026-01-18T19:25:40.391Z", "totalCoverage": 60 } ] @@ -959,7 +959,7 @@ "totalCoverage": 40, "totalCoverageHistory": [ { - "createdAt": "2025-06-08T23:13:51.655Z", + "createdAt": "2026-01-18T19:25:40.391Z", "totalCoverage": 40 } ] @@ -995,7 +995,7 @@ "totalCoverage": 66.66666666666666, "totalCoverageHistory": [ { - "createdAt": "2025-06-08T23:13:51.655Z", + "createdAt": "2026-01-18T19:25:40.391Z", "totalCoverage": 66.66666666666666 } ] @@ -1025,7 +1025,7 @@ "totalCoverage": 40, "totalCoverageHistory": [ { - "createdAt": "2025-06-08T23:13:51.655Z", + "createdAt": "2026-01-18T19:25:40.391Z", "totalCoverage": 40 } ] @@ -1055,7 +1055,7 @@ "totalCoverage": 60, "totalCoverageHistory": [ { - "createdAt": "2025-06-08T23:13:51.655Z", + "createdAt": "2026-01-18T19:25:40.391Z", "totalCoverage": 60 } ] @@ -1094,7 +1094,7 @@ "totalCoverage": 80, "totalCoverageHistory": [ { - "createdAt": "2025-06-08T23:13:51.655Z", + "createdAt": "2026-01-18T19:25:40.391Z", "totalCoverage": 80 } ] @@ -1118,7 +1118,7 @@ "totalCoverage": 40, "totalCoverageHistory": [ { - "createdAt": "2025-06-08T23:13:51.655Z", + "createdAt": "2026-01-18T19:25:40.391Z", "totalCoverage": 40 } ] @@ -1142,7 +1142,7 @@ "totalCoverage": 40, "totalCoverageHistory": [ { - "createdAt": "2025-06-08T23:13:51.655Z", + "createdAt": "2026-01-18T19:25:40.391Z", "totalCoverage": 40 } ] @@ -1166,7 +1166,7 @@ "totalCoverage": 40, "totalCoverageHistory": [ { - "createdAt": "2025-06-08T23:13:51.655Z", + "createdAt": "2026-01-18T19:25:40.391Z", "totalCoverage": 40 } ] @@ -1177,6 +1177,10 @@ { "createdAt": "2025-06-08T23:13:51.655Z", "totalCoverage": 56 + }, + { + "createdAt": "2026-01-18T19:25:40.391Z", + "totalCoverage": 56 } ] }, @@ -1800,7 +1804,7 @@ "totalCoverage": 100, "totalCoverageHistory": [ { - "createdAt": "2025-06-09T12:52:40.454Z", + "createdAt": "2026-01-25T20:25:47.895Z", "totalCoverage": 100 } ] @@ -1845,7 +1849,7 @@ "totalCoverage": 100, "totalCoverageHistory": [ { - "createdAt": "2025-06-09T12:52:40.454Z", + "createdAt": "2026-01-25T20:25:47.896Z", "totalCoverage": 100 } ] @@ -1869,7 +1873,7 @@ "totalCoverage": 100, "totalCoverageHistory": [ { - "createdAt": "2025-06-09T12:52:40.454Z", + "createdAt": "2026-01-25T20:25:47.896Z", "totalCoverage": 100 } ] @@ -1906,7 +1910,7 @@ "totalCoverage": 100, "totalCoverageHistory": [ { - "createdAt": "2025-06-09T12:52:40.454Z", + "createdAt": "2026-01-25T20:25:47.896Z", "totalCoverage": 100 } ] @@ -1939,7 +1943,7 @@ "totalCoverage": 100, "totalCoverageHistory": [ { - "createdAt": "2025-06-09T12:52:40.454Z", + "createdAt": "2026-01-25T20:25:47.896Z", "totalCoverage": 100 } ] @@ -1963,7 +1967,7 @@ "totalCoverage": 100, "totalCoverageHistory": [ { - "createdAt": "2025-06-09T12:52:40.454Z", + "createdAt": "2026-01-25T20:25:47.896Z", "totalCoverage": 100 } ] @@ -1987,7 +1991,7 @@ "totalCoverage": 100, "totalCoverageHistory": [ { - "createdAt": "2025-06-09T12:52:40.454Z", + "createdAt": "2026-01-25T20:25:47.896Z", "totalCoverage": 100 } ] @@ -2011,7 +2015,7 @@ "totalCoverage": 100, "totalCoverageHistory": [ { - "createdAt": "2025-06-09T12:52:40.454Z", + "createdAt": "2026-01-25T20:25:47.896Z", "totalCoverage": 100 } ] @@ -2035,7 +2039,7 @@ "totalCoverage": 100, "totalCoverageHistory": [ { - "createdAt": "2025-06-09T12:52:40.454Z", + "createdAt": "2026-01-25T20:25:47.896Z", "totalCoverage": 100 } ] @@ -2059,7 +2063,7 @@ "totalCoverage": 100, "totalCoverageHistory": [ { - "createdAt": "2025-06-09T12:52:40.454Z", + "createdAt": "2026-01-25T20:25:47.896Z", "totalCoverage": 100 } ] @@ -2083,7 +2087,7 @@ "totalCoverage": 100, "totalCoverageHistory": [ { - "createdAt": "2025-06-09T12:52:40.454Z", + "createdAt": "2026-01-25T20:25:47.896Z", "totalCoverage": 100 } ] @@ -2107,7 +2111,7 @@ "totalCoverage": 100, "totalCoverageHistory": [ { - "createdAt": "2025-06-09T12:52:40.454Z", + "createdAt": "2026-01-25T20:25:47.896Z", "totalCoverage": 100 } ] @@ -2131,7 +2135,7 @@ "totalCoverage": 100, "totalCoverageHistory": [ { - "createdAt": "2025-06-09T12:52:40.454Z", + "createdAt": "2026-01-25T20:25:47.896Z", "totalCoverage": 100 } ] @@ -2155,7 +2159,7 @@ "totalCoverage": 100, "totalCoverageHistory": [ { - "createdAt": "2025-06-09T12:52:40.454Z", + "createdAt": "2026-01-25T20:25:47.896Z", "totalCoverage": 100 } ] @@ -2179,7 +2183,7 @@ "totalCoverage": 100, "totalCoverageHistory": [ { - "createdAt": "2025-06-09T12:52:40.454Z", + "createdAt": "2026-01-25T20:25:47.896Z", "totalCoverage": 100 } ] @@ -2203,7 +2207,7 @@ "totalCoverage": 100, "totalCoverageHistory": [ { - "createdAt": "2025-06-09T12:52:40.454Z", + "createdAt": "2026-01-25T20:25:47.896Z", "totalCoverage": 100 } ] @@ -2227,7 +2231,7 @@ "totalCoverage": 100, "totalCoverageHistory": [ { - "createdAt": "2025-06-09T12:52:40.454Z", + "createdAt": "2026-01-25T20:25:47.896Z", "totalCoverage": 100 } ] @@ -2251,7 +2255,7 @@ "totalCoverage": 100, "totalCoverageHistory": [ { - "createdAt": "2025-06-09T12:52:40.454Z", + "createdAt": "2026-01-25T20:25:47.897Z", "totalCoverage": 100 } ] @@ -2275,7 +2279,7 @@ "totalCoverage": 100, "totalCoverageHistory": [ { - "createdAt": "2025-06-09T12:52:40.454Z", + "createdAt": "2026-01-25T20:25:47.897Z", "totalCoverage": 100 } ] @@ -2316,7 +2320,7 @@ "totalCoverage": 100, "totalCoverageHistory": [ { - "createdAt": "2025-06-09T12:52:40.454Z", + "createdAt": "2026-01-25T20:25:47.897Z", "totalCoverage": 100 } ] @@ -2357,7 +2361,7 @@ "totalCoverage": 100, "totalCoverageHistory": [ { - "createdAt": "2025-06-09T12:52:40.454Z", + "createdAt": "2026-01-25T20:25:47.897Z", "totalCoverage": 100 } ] @@ -2381,7 +2385,7 @@ "totalCoverage": 100, "totalCoverageHistory": [ { - "createdAt": "2025-06-09T12:52:40.454Z", + "createdAt": "2026-01-25T20:25:47.897Z", "totalCoverage": 100 } ] @@ -2405,7 +2409,7 @@ "totalCoverage": 100, "totalCoverageHistory": [ { - "createdAt": "2025-06-09T12:52:40.454Z", + "createdAt": "2026-01-25T20:25:47.897Z", "totalCoverage": 100 } ] @@ -2429,7 +2433,7 @@ "totalCoverage": 100, "totalCoverageHistory": [ { - "createdAt": "2025-06-09T12:52:40.454Z", + "createdAt": "2026-01-25T20:25:47.897Z", "totalCoverage": 100 } ] @@ -2466,7 +2470,7 @@ "totalCoverage": 100, "totalCoverageHistory": [ { - "createdAt": "2025-06-09T12:52:40.454Z", + "createdAt": "2026-01-25T20:25:47.897Z", "totalCoverage": 100 } ] @@ -2531,7 +2535,7 @@ "totalCoverage": 100, "totalCoverageHistory": [ { - "createdAt": "2025-06-09T12:52:40.454Z", + "createdAt": "2026-01-25T20:25:47.897Z", "totalCoverage": 100 } ] @@ -2564,7 +2568,7 @@ "totalCoverage": 100, "totalCoverageHistory": [ { - "createdAt": "2025-06-09T12:52:40.454Z", + "createdAt": "2026-01-25T20:25:47.897Z", "totalCoverage": 100 } ] @@ -2579,6 +2583,14 @@ { "createdAt": "2025-06-09T12:52:40.454Z", "totalCoverage": 100 + }, + { + "createdAt": "2025-11-22T21:25:16.153Z", + "totalCoverage": 100 + }, + { + "createdAt": "2026-01-25T20:25:47.897Z", + "totalCoverage": 100 } ] } diff --git a/reports/report.json b/reports/report.json index 2713645..6b834f2 100644 --- a/reports/report.json +++ b/reports/report.json @@ -47,7 +47,7 @@ } ] }, - "createdAt": "2025-06-09T12:53:58.975Z", + "createdAt": "2026-01-25T20:25:47.898Z", "servicesCoverage": { "Fakestore-api-service": { "endpoints": [ @@ -577,7 +577,7 @@ "totalCoverage": 40, "totalCoverageHistory": [ { - "createdAt": "2025-06-08T23:13:51.655Z", + "createdAt": "2026-01-18T19:25:40.389Z", "totalCoverage": 40 } ] @@ -601,7 +601,7 @@ "totalCoverage": 40, "totalCoverageHistory": [ { - "createdAt": "2025-06-08T23:13:51.655Z", + "createdAt": "2026-01-18T19:25:40.390Z", "totalCoverage": 40 } ] @@ -637,7 +637,7 @@ "totalCoverage": 40, "totalCoverageHistory": [ { - "createdAt": "2025-06-08T23:13:51.655Z", + "createdAt": "2026-01-18T19:25:40.390Z", "totalCoverage": 40 } ] @@ -647,11 +647,11 @@ "method": "GET", "summary": "Finds Pets by status", "coverage": "COVERED", - "totalCases": 2, + "totalCases": 1, "statusCodes": [ { "value": 200, - "totalCases": 2, + "totalCases": 1, "description": "successful operation", "responseCoverage": "COVERED" }, @@ -672,7 +672,7 @@ "totalCoverage": 80, "totalCoverageHistory": [ { - "createdAt": "2025-06-08T23:13:51.655Z", + "createdAt": "2026-01-18T19:25:40.390Z", "totalCoverage": 80 } ] @@ -707,7 +707,7 @@ "totalCoverage": 80, "totalCoverageHistory": [ { - "createdAt": "2025-06-08T23:13:51.655Z", + "createdAt": "2026-01-18T19:25:40.391Z", "totalCoverage": 80 } ] @@ -743,7 +743,7 @@ "totalCoverage": 66.66666666666666, "totalCoverageHistory": [ { - "createdAt": "2025-06-08T23:13:51.655Z", + "createdAt": "2026-01-18T19:25:40.391Z", "totalCoverage": 66.66666666666666 } ] @@ -767,7 +767,7 @@ "totalCoverage": 40, "totalCoverageHistory": [ { - "createdAt": "2025-06-08T23:13:51.655Z", + "createdAt": "2026-01-18T19:25:40.391Z", "totalCoverage": 40 } ] @@ -797,7 +797,7 @@ "totalCoverage": 60, "totalCoverageHistory": [ { - "createdAt": "2025-06-08T23:13:51.655Z", + "createdAt": "2026-01-18T19:25:40.391Z", "totalCoverage": 60 } ] @@ -821,7 +821,7 @@ "totalCoverage": 80, "totalCoverageHistory": [ { - "createdAt": "2025-06-08T23:13:51.655Z", + "createdAt": "2026-01-18T19:25:40.391Z", "totalCoverage": 80 } ] @@ -851,7 +851,7 @@ "totalCoverage": 60, "totalCoverageHistory": [ { - "createdAt": "2025-06-08T23:13:51.655Z", + "createdAt": "2026-01-18T19:25:40.391Z", "totalCoverage": 60 } ] @@ -887,7 +887,7 @@ "totalCoverage": 66.66666666666666, "totalCoverageHistory": [ { - "createdAt": "2025-06-08T23:13:51.655Z", + "createdAt": "2026-01-18T19:25:40.391Z", "totalCoverage": 66.66666666666666 } ] @@ -917,7 +917,7 @@ "totalCoverage": 60, "totalCoverageHistory": [ { - "createdAt": "2025-06-08T23:13:51.655Z", + "createdAt": "2026-01-18T19:25:40.391Z", "totalCoverage": 60 } ] @@ -941,7 +941,7 @@ "totalCoverage": 40, "totalCoverageHistory": [ { - "createdAt": "2025-06-08T23:13:51.655Z", + "createdAt": "2026-01-18T19:25:40.391Z", "totalCoverage": 40 } ] @@ -977,7 +977,7 @@ "totalCoverage": 66.66666666666666, "totalCoverageHistory": [ { - "createdAt": "2025-06-08T23:13:51.655Z", + "createdAt": "2026-01-18T19:25:40.391Z", "totalCoverage": 66.66666666666666 } ] @@ -1007,7 +1007,7 @@ "totalCoverage": 40, "totalCoverageHistory": [ { - "createdAt": "2025-06-08T23:13:51.655Z", + "createdAt": "2026-01-18T19:25:40.391Z", "totalCoverage": 40 } ] @@ -1037,7 +1037,7 @@ "totalCoverage": 60, "totalCoverageHistory": [ { - "createdAt": "2025-06-08T23:13:51.655Z", + "createdAt": "2026-01-18T19:25:40.391Z", "totalCoverage": 60 } ] @@ -1076,7 +1076,7 @@ "totalCoverage": 80, "totalCoverageHistory": [ { - "createdAt": "2025-06-08T23:13:51.655Z", + "createdAt": "2026-01-18T19:25:40.391Z", "totalCoverage": 80 } ] @@ -1100,7 +1100,7 @@ "totalCoverage": 40, "totalCoverageHistory": [ { - "createdAt": "2025-06-08T23:13:51.655Z", + "createdAt": "2026-01-18T19:25:40.391Z", "totalCoverage": 40 } ] @@ -1124,7 +1124,7 @@ "totalCoverage": 40, "totalCoverageHistory": [ { - "createdAt": "2025-06-08T23:13:51.655Z", + "createdAt": "2026-01-18T19:25:40.391Z", "totalCoverage": 40 } ] @@ -1148,7 +1148,7 @@ "totalCoverage": 40, "totalCoverageHistory": [ { - "createdAt": "2025-06-08T23:13:51.655Z", + "createdAt": "2026-01-18T19:25:40.391Z", "totalCoverage": 40 } ] @@ -1159,6 +1159,10 @@ { "createdAt": "2025-06-08T23:13:51.655Z", "totalCoverage": 56 + }, + { + "createdAt": "2026-01-18T19:25:40.391Z", + "totalCoverage": 56 } ] }, @@ -1782,7 +1786,7 @@ "totalCoverage": 100, "totalCoverageHistory": [ { - "createdAt": "2025-06-09T12:52:40.454Z", + "createdAt": "2026-01-25T20:25:47.895Z", "totalCoverage": 100 } ] @@ -1827,7 +1831,7 @@ "totalCoverage": 100, "totalCoverageHistory": [ { - "createdAt": "2025-06-09T12:52:40.454Z", + "createdAt": "2026-01-25T20:25:47.896Z", "totalCoverage": 100 } ] @@ -1851,7 +1855,7 @@ "totalCoverage": 100, "totalCoverageHistory": [ { - "createdAt": "2025-06-09T12:52:40.454Z", + "createdAt": "2026-01-25T20:25:47.896Z", "totalCoverage": 100 } ] @@ -1888,7 +1892,7 @@ "totalCoverage": 100, "totalCoverageHistory": [ { - "createdAt": "2025-06-09T12:52:40.454Z", + "createdAt": "2026-01-25T20:25:47.896Z", "totalCoverage": 100 } ] @@ -1921,7 +1925,7 @@ "totalCoverage": 100, "totalCoverageHistory": [ { - "createdAt": "2025-06-09T12:52:40.454Z", + "createdAt": "2026-01-25T20:25:47.896Z", "totalCoverage": 100 } ] @@ -1945,7 +1949,7 @@ "totalCoverage": 100, "totalCoverageHistory": [ { - "createdAt": "2025-06-09T12:52:40.454Z", + "createdAt": "2026-01-25T20:25:47.896Z", "totalCoverage": 100 } ] @@ -1969,7 +1973,7 @@ "totalCoverage": 100, "totalCoverageHistory": [ { - "createdAt": "2025-06-09T12:52:40.454Z", + "createdAt": "2026-01-25T20:25:47.896Z", "totalCoverage": 100 } ] @@ -1993,7 +1997,7 @@ "totalCoverage": 100, "totalCoverageHistory": [ { - "createdAt": "2025-06-09T12:52:40.454Z", + "createdAt": "2026-01-25T20:25:47.896Z", "totalCoverage": 100 } ] @@ -2017,7 +2021,7 @@ "totalCoverage": 100, "totalCoverageHistory": [ { - "createdAt": "2025-06-09T12:52:40.454Z", + "createdAt": "2026-01-25T20:25:47.896Z", "totalCoverage": 100 } ] @@ -2041,7 +2045,7 @@ "totalCoverage": 100, "totalCoverageHistory": [ { - "createdAt": "2025-06-09T12:52:40.454Z", + "createdAt": "2026-01-25T20:25:47.896Z", "totalCoverage": 100 } ] @@ -2065,7 +2069,7 @@ "totalCoverage": 100, "totalCoverageHistory": [ { - "createdAt": "2025-06-09T12:52:40.454Z", + "createdAt": "2026-01-25T20:25:47.896Z", "totalCoverage": 100 } ] @@ -2089,7 +2093,7 @@ "totalCoverage": 100, "totalCoverageHistory": [ { - "createdAt": "2025-06-09T12:52:40.454Z", + "createdAt": "2026-01-25T20:25:47.896Z", "totalCoverage": 100 } ] @@ -2113,7 +2117,7 @@ "totalCoverage": 100, "totalCoverageHistory": [ { - "createdAt": "2025-06-09T12:52:40.454Z", + "createdAt": "2026-01-25T20:25:47.896Z", "totalCoverage": 100 } ] @@ -2137,7 +2141,7 @@ "totalCoverage": 100, "totalCoverageHistory": [ { - "createdAt": "2025-06-09T12:52:40.454Z", + "createdAt": "2026-01-25T20:25:47.896Z", "totalCoverage": 100 } ] @@ -2161,7 +2165,7 @@ "totalCoverage": 100, "totalCoverageHistory": [ { - "createdAt": "2025-06-09T12:52:40.454Z", + "createdAt": "2026-01-25T20:25:47.896Z", "totalCoverage": 100 } ] @@ -2185,7 +2189,7 @@ "totalCoverage": 100, "totalCoverageHistory": [ { - "createdAt": "2025-06-09T12:52:40.454Z", + "createdAt": "2026-01-25T20:25:47.896Z", "totalCoverage": 100 } ] @@ -2209,7 +2213,7 @@ "totalCoverage": 100, "totalCoverageHistory": [ { - "createdAt": "2025-06-09T12:52:40.454Z", + "createdAt": "2026-01-25T20:25:47.896Z", "totalCoverage": 100 } ] @@ -2233,7 +2237,7 @@ "totalCoverage": 100, "totalCoverageHistory": [ { - "createdAt": "2025-06-09T12:52:40.454Z", + "createdAt": "2026-01-25T20:25:47.897Z", "totalCoverage": 100 } ] @@ -2257,7 +2261,7 @@ "totalCoverage": 100, "totalCoverageHistory": [ { - "createdAt": "2025-06-09T12:52:40.454Z", + "createdAt": "2026-01-25T20:25:47.897Z", "totalCoverage": 100 } ] @@ -2298,7 +2302,7 @@ "totalCoverage": 100, "totalCoverageHistory": [ { - "createdAt": "2025-06-09T12:52:40.454Z", + "createdAt": "2026-01-25T20:25:47.897Z", "totalCoverage": 100 } ] @@ -2339,7 +2343,7 @@ "totalCoverage": 100, "totalCoverageHistory": [ { - "createdAt": "2025-06-09T12:52:40.454Z", + "createdAt": "2026-01-25T20:25:47.897Z", "totalCoverage": 100 } ] @@ -2363,7 +2367,7 @@ "totalCoverage": 100, "totalCoverageHistory": [ { - "createdAt": "2025-06-09T12:52:40.454Z", + "createdAt": "2026-01-25T20:25:47.897Z", "totalCoverage": 100 } ] @@ -2387,7 +2391,7 @@ "totalCoverage": 100, "totalCoverageHistory": [ { - "createdAt": "2025-06-09T12:52:40.454Z", + "createdAt": "2026-01-25T20:25:47.897Z", "totalCoverage": 100 } ] @@ -2411,7 +2415,7 @@ "totalCoverage": 100, "totalCoverageHistory": [ { - "createdAt": "2025-06-09T12:52:40.454Z", + "createdAt": "2026-01-25T20:25:47.897Z", "totalCoverage": 100 } ] @@ -2448,7 +2452,7 @@ "totalCoverage": 100, "totalCoverageHistory": [ { - "createdAt": "2025-06-09T12:52:40.454Z", + "createdAt": "2026-01-25T20:25:47.897Z", "totalCoverage": 100 } ] @@ -2513,7 +2517,7 @@ "totalCoverage": 100, "totalCoverageHistory": [ { - "createdAt": "2025-06-09T12:52:40.454Z", + "createdAt": "2026-01-25T20:25:47.897Z", "totalCoverage": 100 } ] @@ -2546,7 +2550,7 @@ "totalCoverage": 100, "totalCoverageHistory": [ { - "createdAt": "2025-06-09T12:52:40.454Z", + "createdAt": "2026-01-25T20:25:47.897Z", "totalCoverage": 100 } ] @@ -2561,6 +2565,14 @@ { "createdAt": "2025-06-09T12:52:40.454Z", "totalCoverage": 100 + }, + { + "createdAt": "2025-11-22T21:25:16.153Z", + "totalCoverage": 100 + }, + { + "createdAt": "2026-01-25T20:25:47.897Z", + "totalCoverage": 100 } ] } diff --git a/utils/api-coverage.d.ts b/utils/api-coverage.d.ts index e4f0f3d..d829a11 100644 --- a/utils/api-coverage.d.ts +++ b/utils/api-coverage.d.ts @@ -1 +1,179 @@ -declare module 'api-coverage-tracker'; +/** + * @typedef {Object} OpenAPISpec + * @property {Object} [paths] - API paths + * @property {string} [basePath] - Base path for OpenAPI 2.0 + * @property {Array<{url: string}>} [servers] - Servers for OpenAPI 3.0+ + * @property {Object} info - API info + * @property {Object} [components] - OpenAPI components + * @property {string} [jsonSchemaDialect] - JSON Schema dialect + * @property {Object} [webhooks] - Webhooks + */ +export interface OpenAPISpec { + paths?: Record + basePath?: string + servers?: Array<{ url: string }> + info: anysetDebug + components?: any + jsonSchemaDialect?: string + webhooks?: any +} + +/** + * @typedef {Object} ServiceConfig + * @property {string} key - Service key + * @property {string} name - Service name + * @property {string[]} tags - Service tags + * @property {string} repository - Service repository URL + * @property {string} swaggerUrl - Swagger/OpenAPI spec URL + * @property {string} swaggerFile - Local Swagger/OpenAPI spec file path + */ +export interface ServiceConfig { + key: string + name: string + tags: string[] + repository: string + swaggerUrl?: string + swaggerFile?: string +} + +/** + * Configuration object for ApiCoverage + */ +export interface ApiCoverageConfig { + services: ServiceConfig[] + 'report-path': string + 'html-report-path'?: string + source?: string +} + +/** + * Options for startTracking method + */ +export interface StartTrackingOptions { + clientType?: 'playwright' | 'axios' | 'fetch' + coverage?: 'basic' | 'detailed' +} + +/** + * Coverage statistics returned by getCoverageStats + */ +export interface CoverageStats { + total: number + covered: number + percentage: number + coveredDetails: Array<{ + method: string + path: string + statuses: Record + }> + uncoveredEndpoints: Array<{ + path: string + method: string + operationId: string + }> +} + +/** + * Class for tracking API coverage and generating coverage reports + */ +export class ApiCoverage { + /** + * Create a new ApiCoverage instance + * @param config - Configuration object + */ + constructor(config: ApiCoverageConfig) + + /** + * Enable or disable debug logging + * @param {string} level - Log level ('info', 'debug', 'error') + * @param {boolean} enabled - Whether to enable debug logging + * @example + * apiCoverage.setDebug(true); // Enable debug logging + * apiCoverage.setDebug(false); // Disable debug logging + */ + setDebug(enabled: boolean, level?: string): void + + /** + * Load OpenAPI specification from a file or URL + * @param {string} source - Path to the Swagger/OpenAPI spec file or URL + * @returns {Promise} - Returns parsed schema if the spec is successfully loaded + * @throws {Error} - Throws an error if the spec cannot be loaded or parsed + * @example + * // Load from URL + * await apiCoverage.loadSpec('https://api.example.com/swagger.json'); + * // Load from local file + * await apiCoverage.loadSpec('./swagger.json'); + */ + loadSpec(source: string): Promise + + /** + * Start tracking API requests by patching the provided HTTP client + * @param {Object} client - HTTP client instance (Playwright APIRequestContext, Axios instance, etc.) + * @param {Object} [options] - Options object + * @param {'playwright' | 'axios' | 'fetch'} [options.clientType='playwright'] - Type of client ('playwright', 'axios', 'fetch') + * @param {'basic' | 'detailed'} [options.coverage='basic'] - Coverage type ('basic', 'detailed') + * @returns {boolean} - Whether tracking was successfully started + * @throws {Error} - Throws an error if client type is unsupported + * @example + * // Start tracking with Playwright + * await apiCoverage.startTracking(playwright.request, { clientType: 'playwright' }); + * // Start tracking with Axios + * await apiCoverage.startTracking(axios, { clientType: 'axios' }); + */ + startTracking(client: any, options?: StartTrackingOptions): Promise + + /** + * Stop tracking API requests and restore original methods + * @param {Object} [client] - HTTP client instance (optional, will use stored instance if not provided) + * @returns {boolean} - Whether tracking was successfully stopped + * @example + * apiCoverage.stopTracking(); // Stop tracking with stored client + * apiCoverage.stopTracking(axios); // Stop tracking with specific client + */ + stopTracking(client?: any): boolean + + /** + * Get coverage statistics + * @returns {Object} Coverage statistics + * @property {number} total - Total number of endpoints + * @property {number} covered - Number of covered endpoints + * @property {number} percentage - Coverage percentage + * @property {Array} coveredDetails - Details of covered endpoints + * @property {Array} uncoveredEndpoints - List of uncovered endpoints + * @example + * const stats = apiCoverage.getCoverageStats(); + * console.log(`Coverage: ${stats.percentage}%`); + */ + getCoverageStats(): CoverageStats + + /** + * Generate coverage reports (JSON and HTML) from history file + * @returns {Promise} Generated report object + * @throws {Error} - Throws an error if file operations fail + * @example + * await apiCoverage.generateReport(); + */ + generateReport(): Promise + + /** + * Reset coverage tracking (useful between test runs) + * @returns {void} + * @example + * apiCoverage.resetCoverage(); // Reset all coverage data + */ + resetCoverage(): void + + /** + * Register requests from a Postman collection + * @param {Object} params - Configuration options + * @param {string} params.collectionPath - Path to Postman collection file + * @param {'basic' | 'detailed'} params.coverage - Coverage type ('basic', 'detailed') + * @returns {Promise} + * @example + * await apiCoverage.registerPostmanRequests({ + * collectionPath: './collection.json', + * coverage: 'detailed' + * }); + */ + registerPostmanRequests(collection: any, options?: any): Promise +} diff --git a/utils/api-coverage.js b/utils/api-coverage.js index 2c03422..9590ba8 100644 --- a/utils/api-coverage.js +++ b/utils/api-coverage.js @@ -116,7 +116,7 @@ export class ApiCoverage { // Handle both OpenAPI 2.0 (Swagger) and OpenAPI 3.0+ specs // @ts-ignore - We know these properties exist in OpenAPI specs this.basePath = - this.apiSpec.basePath || + this.apiSpec?.basePath || // @ts-ignore - We know these properties exist in OpenAPI specs (this.apiSpec.servers && this.apiSpec.servers[0]?.url ? // @ts-ignore - We know these properties exist in OpenAPI specs @@ -180,7 +180,7 @@ export class ApiCoverage { // Replace {paramName} with a regex that matches single path segment(s) pattern = pattern.replace(/\{[^/{}]+\}/g, '([^/]+)') // '([^/]+(?:/[^/]+)*)' - multimple path segments - + this.log('debug', `[DEBUG] - pattern: ${pattern}`) const segments = pattern.split('/').filter(Boolean) pattern = segments @@ -256,6 +256,7 @@ export class ApiCoverage { try { const parsedUrl = new URL(url) + this.log('debug', `[DEBUG] - url: ${url}`) pathname = parsedUrl.pathname for (const [key, value] of parsedUrl.searchParams.entries()) { queryParams[key] = value @@ -387,21 +388,33 @@ export class ApiCoverage { */ #patchFetch(fetchFn) { this.fetch = true - // Store original fetch for later restoration this.originalRequest = { fetch: fetchFn } - // Override the global fetch function - // @ts-ignore - We're intentionally replacing the global fetch with a compatible function global.fetch = async (input, init) => { - // Call the original fetch const response = await this.originalRequest.fetch(input, init) - // Track this endpoint try { const method = (init?.method || 'GET').toUpperCase() - const url = typeof input === 'string' ? input : input.url + + let url + if (typeof input === 'string') { + url = input + } else if (input instanceof Request) { + url = input.url + } else if (input && typeof input === 'object' && 'url' in input) { + url = input.url + } else { + url = String(input) + } + this.log('debug', `[DEBUG] input type: ${typeof input}, url: ${url}`) + + // Skip tracking if URL doesn't match any API server + if (!this.#shouldTrackRequest(url)) { + this.log('debug', `[DEBUG] Skipping non-API request: ${url}`) + return response + } const { pathname, queryParams } = this.#parseUrlAndParams(url) @@ -414,6 +427,49 @@ export class ApiCoverage { return response } } + /** + * Check if a URL should be tracked based on API servers + * @param {string} url - URL to check + * @returns {boolean} - Whether to track this request + */ + #shouldTrackRequest(url) { + if (!this.apiSpec || !this.apiSpec.servers) { + this.log('debug', `[DEBUG] No API spec or servers defined, tracking all requests`) + return true + } + + try { + const urlObj = new URL(url) + const urlOrigin = urlObj.origin + + this.log('debug', `[DEBUG] Checking if should track: ${url} (origin: ${urlOrigin})`) + + // Check if URL matches any defined API server + for (const server of this.apiSpec.servers) { + try { + const serverUrl = new URL(server.url) + const serverOrigin = serverUrl.origin + + this.log('debug', `[DEBUG] Comparing ${urlOrigin} with server: ${server.url} (origin: ${serverOrigin})`) + if (urlOrigin === serverOrigin) { + this.log('debug', `[DEBUG] ✓ URL matches server origin, will track`) + return true + } + } catch (e) { + // If server.url is relative, assume we should track + this.log('debug', `[DEBUG] Server URL is relative or invalid, will track`) + return true + } + } + + this.log('debug', `[DEBUG] ✗ URL doesn't match any server origin, will skip`) + return false + } catch (e) { + // If URL parsing fails, track it anyway + this.log('debug', `[DEBUG] URL parsing failed, will track anyway: ${e.message}`) + return true + } + } /** * Mark an endpoint as covered @@ -940,6 +996,8 @@ S */ } #processEndpoint(key, endpoint, covered, statusCountsMap, queryParamsMap) { + this.log('debug', `[DEBUG] - key: ${key}`) + const [path, method] = key.split(' ') const endpointKey = `${path} ${method}` const isCovered = covered.has(endpointKey) @@ -1059,6 +1117,11 @@ S */ this.currentService = this?.config.services.find( service => service?.swaggerUrl === this.config.source || service?.swaggerFile === this.config.source ) + this.log( + 'debug', + `Source used in client: ${this.config.source} current service swaggerUrl: ${this.currentService.swaggerUrl}, service swaggerFile: ${this.currentService.swaggerFile}` + ) + return { config: { services }, createdAt: new Date().toISOString(), @@ -1114,6 +1177,7 @@ S */ createdAt: new Date().toISOString(), servicesCoverage: mergedServicesCoverage } + this.log('info', `merged report: ${mergedReport}`) await this.#mergeStats(mergedReport) return await this.#safeWriteFile(this.JSON_REPORT_PATH, JSON.stringify(mergedReport, null, 2)) } catch (err) {