From 191e8d58fec724d7383eb4238ece19aea906aa6f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 Oct 2026 02:33:58 +0000 Subject: [PATCH 1/3] build(deps-dev): bump @aditosoftware/eslint-config-adito-platform Bumps [@aditosoftware/eslint-config-adito-platform](https://github.com/aditosoftware/eslint-config-adito-platform) from 2.0.4 to 2.1.0. - [Release notes](https://github.com/aditosoftware/eslint-config-adito-platform/releases) - [Changelog](https://github.com/aditosoftware/eslint-config-adito-platform/blob/main/CHANGELOG.md) - [Commits](https://github.com/aditosoftware/eslint-config-adito-platform/compare/2.0.4...2.1.0) --- updated-dependencies: - dependency-name: "@aditosoftware/eslint-config-adito-platform" dependency-version: 2.1.0 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 1287 +++++++++++++++++++++++++++++++++++++-------- 1 file changed, 1066 insertions(+), 221 deletions(-) diff --git a/package-lock.json b/package-lock.json index 66022ec..750bf2a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "@js-sdsl/link-list": "^4.4.2" }, "devDependencies": { - "@aditosoftware/eslint-config-adito-platform": "*", + "@aditosoftware/eslint-config-adito-platform": "latest", "@types/mocha": "^10.0.8", "@types/node": "^26.x", "@types/sinon": "^22.0.0", @@ -30,22 +30,26 @@ } }, "node_modules/@aditosoftware/eslint-config-adito-platform": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@aditosoftware/eslint-config-adito-platform/-/eslint-config-adito-platform-2.0.4.tgz", - "integrity": "sha512-+mCat4vieqQ0B5Y1P6CNM8rQxbzFSkESwmeJaMTuvNmWfEFmPW+c94bE2p8p/zbSJ+0TYpFZyZMG9MFUTk+cGA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@aditosoftware/eslint-config-adito-platform/-/eslint-config-adito-platform-2.1.0.tgz", + "integrity": "sha512-o/b59QRvPDTXUrc/cYBVjYfBuRMSBVnKJlnUz/vmWgZAh/qD4D7Kz+FyhfyIjrnVvteIua0tQ+00xrPc+mO0Wg==", "dev": true, "license": "MIT", "peerDependencies": { + "@eslint/eslintrc": "^3.3.7", + "@eslint/js": "^10.0.1", "@stylistic/eslint-plugin": "^5.10.0", "@typescript-eslint/eslint-plugin": "^8.57.0", "@typescript-eslint/parser": "^8.57.0", - "eslint": "^9.37.0", + "eslint": "^10.12.0", "eslint-config-prettier": "^10.1.8", "eslint-plugin-chai-expect": "^4.0.0", "eslint-plugin-chai-friendly": "^1.1.0", - "eslint-plugin-jsdoc": "^62.8.0", + "eslint-plugin-jsdoc": "^65.3.0", "eslint-plugin-prettier": "^5.5.5", "eslint-plugin-tsdoc": "^0.5.2", + "eslint-plugin-unicorn": "^77.0.0", + "globals": "^17.13.0", "prettier": "3.6.2" } }, @@ -70,6 +74,32 @@ "node": ">=18" } }, + "node_modules/@cacheable/memory": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@cacheable/memory/-/memory-2.2.0.tgz", + "integrity": "sha512-CTLKqLItRCEixEAewD3/j9DB3/o96gpTPD4eJ1v+DGOlxZRZncRQkGYqqnAGCscYd6RNeXfGeiuCphsPtqyIfQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@cacheable/utils": "^2.5.0", + "@keyv/bigmap": "^1.3.1", + "hookified": "^1.15.1", + "keyv": "^5.6.0" + } + }, + "node_modules/@cacheable/utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@cacheable/utils/-/utils-2.5.0.tgz", + "integrity": "sha512-buipgOVDkkPXNR5+xBpDw7Zk2n1EvU7qBJCNUcL7rhQ//kfpOXPAvQ511Os0vpLYJ1pZnvudNytkQt2hst3wqA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "hashery": "^1.5.1", + "keyv": "^5.6.0" + } + }, "node_modules/@colors/colors": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", @@ -93,21 +123,36 @@ } }, "node_modules/@es-joy/jsdoccomment": { - "version": "0.84.0", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.84.0.tgz", - "integrity": "sha512-0xew1CxOam0gV5OMjh2KjFQZsKL2bByX1+q4j3E73MpYIdyUxcZb/xQct9ccUb+ve5KGUYbCUxyPnYB7RbuP+w==", + "version": "0.98.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.98.0.tgz", + "integrity": "sha512-QS+b7I2aaSM+gZfDz1b9E4B367JJ2qTjFXRKF289iKkh9sYdZ21Q5MiF/Duzouy3J0C4VhM3I/8f2F4+zT8gYQ==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@types/estree": "^1.0.8", - "@typescript-eslint/types": "^8.54.0", - "comment-parser": "1.4.5", + "@types/estree": "^1.0.9", + "@typescript-eslint/types": "^8.70.0", + "comment-parser": "1.4.9", "esquery": "^1.7.0", - "jsdoc-type-pratt-parser": "~7.1.1" + "jsdoc-type-pratt-parser": "~9.2.2" }, "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" + "node": "^22.22.2 || >=24.15.0" + } + }, + "node_modules/@es-joy/jsdoccomment/node_modules/@typescript-eslint/types": { + "version": "8.71.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.71.2.tgz", + "integrity": "sha512-y5Ukl3oVp7e/VGxqIoEXoeb/Roj71PAJ4WG/N/RGj+eeDvKRLM15kGr9MijLbN0i03S52zxu31Z98E5gWChJKw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, "node_modules/@es-joy/resolve.exports": { @@ -122,9 +167,9 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", - "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", + "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", "dev": true, "license": "MIT", "peer": true, @@ -167,65 +212,81 @@ } }, "node_modules/@eslint/config-array": { - "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==", + "version": "0.23.5", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", + "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@eslint/object-schema": "^2.1.7", + "@eslint/object-schema": "^3.0.5", "debug": "^4.3.1", - "minimatch": "^3.1.2" + "minimatch": "^10.2.4" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/config-array/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "18 || 20 || >=22" } }, "node_modules/@eslint/config-array/node_modules/brace-expansion": { - "version": "1.1.21", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.21.tgz", - "integrity": "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==", + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.12.tgz", + "integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" } }, "node_modules/@eslint/config-array/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "peer": true, "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^5.0.8" }, "engines": { - "node": "*" + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@eslint/config-helpers": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.1.tgz", - "integrity": "sha512-csZAzkNhsgwb0I/UAV6/RGFTbiakPCf0ZrGmrIxQpYvGZ00PhTkSnyKNolphgIvmnJeGw6rcGVEXfTzUnFuEvw==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.7.0.tgz", + "integrity": "sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@eslint/core": "^0.16.0" + "@eslint/core": "^1.2.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@eslint/core": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.16.0.tgz", - "integrity": "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", + "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", "dev": true, "license": "Apache-2.0", "peer": true, @@ -233,25 +294,40 @@ "@types/json-schema": "^7.0.15" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/css-tree": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@eslint/css-tree/-/css-tree-4.1.2.tgz", + "integrity": "sha512-rVcxLmwSkEL3aWS3vAgsTRrQHoYE1b0XcgDtKHDJ92XOkyUpcbS/g0tUJKhvCtlEhYzgKBWsgDd+Z/aPhd166w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "mdn-data": "2.37.2", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@eslint/eslintrc": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", - "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.7.tgz", + "integrity": "sha512-F42g89Qd5oAWtp0k0nnSrjziAKza7w8SVT4mStc18LZMaRb4J1HQAHLCalEtDCxrTuksx7NU9qsmeLwpOfPqWw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "ajv": "^6.12.4", + "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", + "js-yaml": "^4.3.2", + "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" }, "engines": { @@ -273,6 +349,20 @@ "concat-map": "0.0.1" } }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@eslint/eslintrc/node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -299,43 +389,51 @@ } }, "node_modules/@eslint/js": { - "version": "9.38.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.38.0.tgz", - "integrity": "sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz", + "integrity": "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==", "dev": true, "license": "MIT", "peer": true, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "eslint": "^10.0.0" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } } }, "node_modules/@eslint/object-schema": { - "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==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", + "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", "dev": true, "license": "Apache-2.0", "peer": true, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@eslint/plugin-kit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.0.tgz", - "integrity": "sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.3.tgz", + "integrity": "sha512-IkO+/KEUvwbVpiURZg+P7zF74z5Jxe0UgJxVni+RtoHQ6IZieXaO02kmadomap/q+l6bc/jdPGGqTjhuZnuz1Q==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@eslint/core": "^0.16.0", + "@eslint/core": "^1.2.1", "levn": "^0.4.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@humanfs/core": { @@ -475,6 +573,32 @@ "url": "https://opencollective.com/js-sdsl" } }, + "node_modules/@keyv/bigmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@keyv/bigmap/-/bigmap-1.3.1.tgz", + "integrity": "sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "hashery": "^1.4.0", + "hookified": "^1.15.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "keyv": "^5.6.0" + } + }, + "node_modules/@keyv/serialize": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.1.1.tgz", + "integrity": "sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/@microsoft/tsdoc": { "version": "0.16.0", "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.16.0.tgz", @@ -625,10 +749,18 @@ "eslint": "^9.0.0 || ^10.0.0" } }, + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", "dev": true, "license": "MIT", "peer": true @@ -1242,9 +1374,9 @@ } }, "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, "license": "MIT", "peer": true, @@ -1289,14 +1421,14 @@ } }, "node_modules/are-docs-informative": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", - "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.1.1.tgz", + "integrity": "sha512-sqRsNQBwbKLRX0jV5Cu5uzmtflf892n4Vukz7T659ebL4pz3mpOqCMU7lxMoBTFwnp10E3YB5ZcyHM41W5bcDA==", "dev": true, "license": "MIT", "peer": true, "engines": { - "node": ">=14" + "node": ">=18" } }, "node_modules/argparse": { @@ -1320,6 +1452,20 @@ "dev": true, "license": "MIT" }, + "node_modules/baseline-browser-mapping": { + "version": "2.11.29", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.29.tgz", + "integrity": "sha512-YeesxhUmR4h5y5V8KF8iBCqJb8YFrBJ++XBTeGcWIaQOYXGN19JM0FoiOjAhwuDoln8owMgXcWBmgHtYSkky2w==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/brace-expansion": { "version": "2.1.7", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.7.tgz", @@ -1337,6 +1483,55 @@ "dev": true, "license": "ISC" }, + "node_modules/browserslist": { + "version": "4.29.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.29.3.tgz", + "integrity": "sha512-1R4kiYKXGViqEN0CnoDrXc1StD9niAwu+j2dukWzrD4bJgsD4lDmEp0CRbc6E/vYJIfTHwPmwyaKtVSudICdPA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "baseline-browser-mapping": "^2.11.26", + "caniuse-lite": "^1.0.30001813", + "electron-to-chromium": "^1.5.439", + "node-releases": "^2.0.57", + "update-browserslist-db": "^1.3.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/builtin-modules": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-5.4.0.tgz", + "integrity": "sha512-JCWSCdun+4Ovd9BhM/Vtlmwb7oD6Wl4YiPRXXwhAuwlPhW1un/MKgXn7GZoFm53ginnoNzus69V8JWx0K393jg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/c8": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/c8/-/c8-11.0.0.tgz", @@ -1371,6 +1566,21 @@ } } }, + "node_modules/cacheable": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-2.5.0.tgz", + "integrity": "sha512-60cyAOytib/OzBw1JNSoSV/boK1AtHryDIjvVBk7XbN4ugfkM3+Sry7fEjNgPMGgOjuaZPAp8ruZ0Cxafwyq9g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@cacheable/memory": "^2.2.0", + "@cacheable/utils": "^2.5.0", + "hookified": "^1.15.0", + "keyv": "^5.6.0", + "qified": "^0.10.1" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -1395,6 +1605,28 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/caniuse-lite": { + "version": "1.0.30001816", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001816.tgz", + "integrity": "sha512-+8Yx7BXCoqk6IF8yTicjfUR6D/ldJzdlsodlEOiOSPmhK844WIgk67/zIQaGAOxNkZyyvBlrRFnLvqKIoqbAFw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0", + "peer": true + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -1425,6 +1657,14 @@ "node": ">=8" } }, + "node_modules/change-case": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz", + "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/charenc": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", @@ -1451,6 +1691,23 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/ci-info": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, "node_modules/cli-cursor": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", @@ -1628,9 +1885,9 @@ } }, "node_modules/comment-parser": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.5.tgz", - "integrity": "sha512-aRDkn3uyIlCFfk5NUA+VdwMmMsh8JGhc4hapfV4yxymHGQ3BVskMQfoXGpCo5IoBuQ9tS5iiVKhCpTcB4pW4qw==", + "version": "1.4.9", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.9.tgz", + "integrity": "sha512-+2AvZKjJaNq9GQljm3tr0utwrig5BL+jgJGvz5rDpGKNIp+ojcRXWUwBbh/sGIi1QCprR6PsKFakub+w1v+4hQ==", "dev": true, "license": "MIT", "peer": true, @@ -1653,6 +1910,24 @@ "dev": true, "license": "MIT" }, + "node_modules/core-js-compat": { + "version": "3.50.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.50.0.tgz", + "integrity": "sha512-XGpFGbMLHwSt74YLTKho7Ib242qi6O8MSX+sRokV4oz7iKXvQWGYZthjIhjRGMxjzVkAubBO512dKGYcefmX3Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "browserslist": "^4.28.7" + }, + "engines": { + "node": ">=6.4.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", @@ -1724,6 +1999,20 @@ "license": "MIT", "peer": true }, + "node_modules/detect-indent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-7.0.2.tgz", + "integrity": "sha512-y+8xyqdGLL+6sh0tVeHcfP/QDd8gUgbasolJJpY7NgeQGSZ739bDtSiaiDgtoicy+mtYB81dKLxO9xRhCyIB3A==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/diff": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", @@ -1741,6 +2030,14 @@ "dev": true, "license": "MIT" }, + "node_modules/electron-to-chromium": { + "version": "1.5.459", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.459.tgz", + "integrity": "sha512-4SC9HHSFjO/liAhifpdOL5hG9b4BP7/5G3y3UPZVO8trlAXr1CaUEEJL0gWK3kOcYcZrOA5rkwG45Gra/lTIgg==", + "dev": true, + "license": "ISC", + "peer": true + }, "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", @@ -1769,6 +2066,20 @@ "node": ">=10.13.0" } }, + "node_modules/entities": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-8.1.0.tgz", + "integrity": "sha512-kxL7msIffSuh9aaFAMD7rxAIuTRMAHMeBtgHW2yUdWw732ZNh4MehkF2gdjvtdmikkaIP9bFDDJOPlsvm7avrA==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -1793,45 +2104,44 @@ } }, "node_modules/eslint": { - "version": "9.38.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.38.0.tgz", - "integrity": "sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw==", + "version": "10.13.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.13.0.tgz", + "integrity": "sha512-UohDjD4zSzEwhf58M3O7vc/ycc8O1I7dNlhtD0WxE8Px8EHNJKtUwzBqrzeGhisRuv2ag4sAYswszCJRgKXYUg==", "dev": true, "license": "MIT", "peer": true, + "workspaces": [ + "packages/*" + ], "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.1", - "@eslint/config-helpers": "^0.4.1", - "@eslint/core": "^0.16.0", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.38.0", - "@eslint/plugin-kit": "^0.4.0", + "@eslint-community/regexpp": "^4.12.2", + "@eslint/config-array": "^0.23.5", + "@eslint/config-helpers": "^0.7.0", + "@eslint/core": "^1.2.1", + "@eslint/plugin-kit": "^0.7.3", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", - "ajv": "^6.12.4", - "chalk": "^4.0.0", + "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.4.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "esquery": "^1.5.0", + "eslint-scope": "^9.1.2", + "eslint-visitor-keys": "^5.0.1", + "espree": "^11.2.0", + "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", + "file-entry-cache": "11.1.5 || >11.1.6 <12", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", + "minimatch": "^10.2.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, @@ -1839,7 +2149,7 @@ "eslint": "bin/eslint.js" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://eslint.org/donate" @@ -1899,33 +2209,227 @@ } }, "node_modules/eslint-plugin-jsdoc": { - "version": "62.8.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-62.8.1.tgz", - "integrity": "sha512-e9358PdHgvcMF98foNd3L7hVCw70Lt+YcSL7JzlJebB8eT5oRJtW6bHMQKoAwJtw6q0q0w/fRIr2kwnHdFDI6A==", + "version": "65.3.12", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-65.3.12.tgz", + "integrity": "sha512-oYzEwsNq5h3AsUmiEwaxdl5YMaINBudwepsplSKFxNOWKqJsb6FfRqNh6KEsMkMa7hrynHxw01/Y9Q5h/GeJxQ==", "dev": true, "license": "BSD-3-Clause", "peer": true, "dependencies": { - "@es-joy/jsdoccomment": "~0.84.0", + "@es-joy/jsdoccomment": "~0.98.0", "@es-joy/resolve.exports": "1.2.0", - "are-docs-informative": "^0.0.2", - "comment-parser": "1.4.5", + "@typescript-eslint/utils": "^8.70.1", + "are-docs-informative": "^0.1.1", + "comment-parser": "1.4.9", "debug": "^4.4.3", - "escape-string-regexp": "^4.0.0", - "espree": "^11.1.0", + "escape-string-regexp": "^5.0.0", + "espree": "^11.2.0", "esquery": "^1.7.0", "html-entities": "^2.6.0", - "object-deep-merge": "^2.0.0", + "object-deep-merge": "^2.0.1", "parse-imports-exports": "^0.2.4", - "semver": "^7.7.4", - "spdx-expression-parse": "^4.0.0", + "semver": "^7.8.5", + "spdx-expression-parse": "^5.0.0", "to-valid-identifier": "^1.0.0" }, "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" + "node": "^22.22.2 || >=24.15.0" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0" + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0", + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-jsdoc/node_modules/@typescript-eslint/project-service": { + "version": "8.71.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.71.2.tgz", + "integrity": "sha512-Pd68GsLVh5ZXlcEccFPdhSOvtHZ/2WU0XsA8zmXOS3F158lVlcTLhfQ6qvtL1RzbMie0Kp8xtbVwAg4nejKPHw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.71.2", + "@typescript-eslint/types": "^8.71.2", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-plugin-jsdoc/node_modules/@typescript-eslint/scope-manager": { + "version": "8.71.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.71.2.tgz", + "integrity": "sha512-YF4wgg5iUX5Obywoac27B56FhozMNFhdJSbh11H5GBAwmBtfyRhmgTQqW9tRNNmHDvsZ2CX6UGzoz+YfYn2Leg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@typescript-eslint/types": "8.71.2", + "@typescript-eslint/visitor-keys": "8.71.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-jsdoc/node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.71.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.71.2.tgz", + "integrity": "sha512-jz49TAWokm/7yWD9/o837nYax9DyALxIPOImdImvVzo6canBCZYzin8zJyqNR5k1j9K1DE0bVvr0XYB+99uAdg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-plugin-jsdoc/node_modules/@typescript-eslint/types": { + "version": "8.71.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.71.2.tgz", + "integrity": "sha512-y5Ukl3oVp7e/VGxqIoEXoeb/Roj71PAJ4WG/N/RGj+eeDvKRLM15kGr9MijLbN0i03S52zxu31Z98E5gWChJKw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-jsdoc/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.71.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.71.2.tgz", + "integrity": "sha512-DgNOEsl4pdYzwSL+N/Cl33tX1Hlw3FvId73LnKXfq7jnrF2viOEn7X+P7RBkkSWCVm92gnWd28GIC5vJuLREeA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@typescript-eslint/project-service": "8.71.2", + "@typescript-eslint/tsconfig-utils": "8.71.2", + "@typescript-eslint/types": "8.71.2", + "@typescript-eslint/visitor-keys": "8.71.2", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-plugin-jsdoc/node_modules/@typescript-eslint/utils": { + "version": "8.71.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.71.2.tgz", + "integrity": "sha512-RyKa1G1M9rKHDhrk+HJtiF1MvLD5Ux2JW3TSkzw+02pRALdpJb+QzG1Y5em+LvCgzGwgg8H7mBRFKljNz7ImPw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.71.2", + "@typescript-eslint/types": "8.71.2", + "@typescript-eslint/typescript-estree": "8.71.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-plugin-jsdoc/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.71.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.71.2.tgz", + "integrity": "sha512-zozlN0UA32bSG2zkKAgQyRYSbEISVoyU6vvkKYo2aSny74D8Jh4e+POkJ6Lk0dlezZi5x7TtD+88Xb06IB8nhg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@typescript-eslint/types": "8.71.2", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-jsdoc/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-plugin-jsdoc/node_modules/brace-expansion": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.12.tgz", + "integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/eslint-plugin-jsdoc/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint-plugin-jsdoc/node_modules/eslint-visitor-keys": { @@ -1961,6 +2465,23 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint-plugin-jsdoc/node_modules/minimatch": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", + "dev": true, + "license": "BlueOak-1.0.0", + "peer": true, + "dependencies": { + "brace-expansion": "^5.0.8" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/eslint-plugin-prettier": { "version": "5.5.5", "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.5.tgz", @@ -2154,7 +2675,136 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/eslint-plugin-tsdoc/node_modules/balanced-match": { + "node_modules/eslint-plugin-tsdoc/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-plugin-tsdoc/node_modules/brace-expansion": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.12.tgz", + "integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/eslint-plugin-tsdoc/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-tsdoc/node_modules/minimatch": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "dev": true, + "license": "BlueOak-1.0.0", + "peer": true, + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eslint-plugin-unicorn": { + "version": "77.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-77.0.0.tgz", + "integrity": "sha512-aayznMCKTXlPAsoyUjRok862sz3BJAfxpQX/t79AT/uVQTmWsCx3FXfXo+9hfhL8aR2mMZQYyXoDZo3/ly6lJw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.10.1", + "@eslint/css-tree": "^4.1.1", + "browserslist": "^4.29.1", + "change-case": "^5.4.4", + "ci-info": "^4.4.0", + "core-js-compat": "^3.50.0", + "detect-indent": "^7.0.2", + "entities": "^8.1.0", + "find-up-simple": "^1.0.1", + "globals": "^17.12.0", + "identifier-regex": "^1.1.0", + "indent-string": "^5.0.0", + "is-builtin-module": "^5.0.0", + "pluralize": "^8.0.0", + "quote-js-string": "^0.1.0", + "regjsparser": "^0.13.3", + "reserved-identifiers": "^1.2.0", + "semver": "^7.8.5", + "strip-indent": "^4.1.1", + "yaml": "^2.9.1" + }, + "engines": { + "node": ">=22" + }, + "funding": { + "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1" + }, + "peerDependencies": { + "eslint": ">=10.4" + } + }, + "node_modules/eslint-scope": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/balanced-match": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", @@ -2165,7 +2815,7 @@ "node": "18 || 20 || >=22" } }, - "node_modules/eslint-plugin-tsdoc/node_modules/brace-expansion": { + "node_modules/eslint/node_modules/brace-expansion": { "version": "5.0.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.12.tgz", "integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==", @@ -2179,7 +2829,7 @@ "node": "20 || >=22" } }, - "node_modules/eslint-plugin-tsdoc/node_modules/eslint-visitor-keys": { + "node_modules/eslint/node_modules/eslint-visitor-keys": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", @@ -2193,67 +2843,25 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint-plugin-tsdoc/node_modules/minimatch": { - "version": "10.2.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", - "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", - "dev": true, - "license": "BlueOak-1.0.0", - "peer": true, - "dependencies": { - "brace-expansion": "^5.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/eslint-scope": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "node_modules/eslint/node_modules/espree": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", "dev": true, "license": "BSD-2-Clause", "peer": true, "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "acorn": "^8.16.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^5.0.1" }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "license": "Apache-2.0", - "peer": true, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.21", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.21.tgz", - "integrity": "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/eslint/node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -2280,17 +2888,20 @@ } }, "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "peer": true, "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^5.0.8" }, "engines": { - "node": "*" + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/espree": { @@ -2439,17 +3050,14 @@ "peer": true }, "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "version": "11.1.5", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-11.1.5.tgz", + "integrity": "sha512-+PFTHITI08JIGhnNpGNI8T8inUpgZfk3GNEqfT9R2zZV2iFXg3CvqzSl/uEhs7TSGujYRELEANyDvS8Fj7+S7Q==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" + "flat-cache": "^6.1.23" } }, "node_modules/find-up": { @@ -2469,6 +3077,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/find-up-simple": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz", + "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/flat": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", @@ -2480,24 +3102,22 @@ } }, "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "version": "6.1.23", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.23.tgz", + "integrity": "sha512-f++BY9pTk+983xK1FLzlLpmM0i0z+jHmx3QESGkURMXujQZz1k5wzwX6hjnQ8goaD0B+sYnDK1yZ6MTyZfUaqA==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" + "cacheable": "^2.5.0", + "flatted": "^3.4.2", + "hookified": "^1.15.0" } }, "node_modules/flatted": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", - "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz", + "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", "dev": true, "license": "ISC", "peer": true @@ -2582,9 +3202,9 @@ } }, "node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "version": "17.13.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.13.0.tgz", + "integrity": "sha512-RwMTC61u7hrG3ZJMkZQOK4JLJrKS8QtoTii63EmWvFXHqycY9FObBJQCbsLxSO8kjKhWE5kV1GC+Vb1g3RI0Zg==", "dev": true, "license": "MIT", "peer": true, @@ -2612,6 +3232,20 @@ "node": ">=8" } }, + "node_modules/hashery": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/hashery/-/hashery-1.5.1.tgz", + "integrity": "sha512-iZyKG96/JwPz1N55vj2Ie2vXbhu440zfUfJvSwEqEbeLluk7NnapfGqa7LH0mOsnDxTF85Mx8/dyR6HfqcbmbQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "hookified": "^1.15.0" + }, + "engines": { + "node": ">=20" + } + }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -2636,6 +3270,14 @@ "he": "bin/he" } }, + "node_modules/hookified": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.15.1.tgz", + "integrity": "sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/html-entities": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", @@ -2689,6 +3331,23 @@ "node": ">= 14" } }, + "node_modules/identifier-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/identifier-regex/-/identifier-regex-1.1.0.tgz", + "integrity": "sha512-SLX4H/vtcYlYnL7XqnuJKHU7Z8517TgsW9nmQiGOgMCjQ8V/deLYu6bEmbGoXe7WMMhc9+EUGyFFneHja8KabA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "reserved-identifiers": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ignore": { "version": "7.0.5", "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", @@ -2736,6 +3395,20 @@ "node": ">=0.8.19" } }, + "node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -2756,6 +3429,23 @@ "dev": true, "license": "MIT" }, + "node_modules/is-builtin-module": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-5.0.0.tgz", + "integrity": "sha512-f4RqJKBUe5rQkJ2eJEJBXSticB3hGbN9j0yxxMQFqIW89Jp9WYFtzfTcRlstDKVUTRzSOTLKRfO9vIztenwtxA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "builtin-modules": "^5.0.0" + }, + "engines": { + "node": ">=18.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-core-module": { "version": "2.16.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", @@ -2981,23 +3671,32 @@ } }, "node_modules/jsdoc-type-pratt-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-7.1.1.tgz", - "integrity": "sha512-/2uqY7x6bsrpi3i9LVU6J89352C0rpMk0as8trXxCtvd4kPk1ke/Eyif6wqfSLvoNJqcDG9Vk4UsXgygzCt2xA==", + "version": "9.2.3", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-9.2.3.tgz", + "integrity": "sha512-xsCb5EbmLWNlQ8v5zQIgSYSyf1rSyVPjh8p9G2xviOl1weHm8a611fHWUOGn7ISquCL6LoBKZvh0tcKmpVGgzw==", "dev": true, "license": "MIT", "peer": true, + "dependencies": { + "@types/estree": "^1.0.9" + }, "engines": { - "node": ">=20.0.0" + "node": "^22.22.2 || >=24.15.0" } }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, "license": "MIT", - "peer": true + "peer": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } }, "node_modules/json-schema-traverse": { "version": "0.4.1", @@ -3029,14 +3728,14 @@ } }, "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.6.0.tgz", + "integrity": "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "json-buffer": "3.0.1" + "@keyv/serialize": "^1.1.1" } }, "node_modules/kuler": { @@ -3094,14 +3793,6 @@ "dev": true, "license": "MIT" }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -3172,6 +3863,14 @@ "is-buffer": "~1.1.6" } }, + "node_modules/mdn-data": { + "version": "2.37.2", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.37.2.tgz", + "integrity": "sha512-rz9YOBGItdSbe7HcSArUbhiAv4SB/4DKRYg96CSFS2CcIYMbUvBtZlzA1NCbk2AdgbmYwMqwNblLpR441lLeiQ==", + "dev": true, + "license": "CC0-1.0", + "peer": true + }, "node_modules/mimic-function": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", @@ -3415,10 +4114,21 @@ "license": "MIT", "peer": true }, + "node_modules/node-releases": { + "version": "2.0.59", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.59.tgz", + "integrity": "sha512-5qr2okC4ItAI0hG5SaV0HoYMpnM/Y6+Oqr7AmPYy/2uEoGvS+GbSKLeRxSS1uAdu59yz0ouzcuXievSgg///WA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18" + } + }, "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==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object-deep-merge/-/object-deep-merge-2.0.1.tgz", + "integrity": "sha512-aKttDKcU3pyZqKcCkDhsMn70WmZFG2JGDQLP9EcLyTSIFQRCPWLAmBZRLJnrVUrhPG1jETEEbfdgbNtJf1LyMg==", "dev": true, "license": "MIT", "peer": true @@ -3718,6 +4428,17 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=4" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -3778,6 +4499,42 @@ "node": ">=6" } }, + "node_modules/qified": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/qified/-/qified-0.10.1.tgz", + "integrity": "sha512-+Owyggi9IxT1ePKGafcI87ubSmxol6smwJ+RAHDQlx9+9cPwFWDiKFFCPuWhr9ignlGpZ9vDQLw67N4dcTVFEA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "hookified": "^2.1.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/qified/node_modules/hookified": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/hookified/-/hookified-2.2.0.tgz", + "integrity": "sha512-p/LgFzRN5FeoD3DLS6bkUapeye6E4SI6yJs6KetENd18S+FBthqYq2amJUWpt5z0EQwwHemidjY5OqJGEKm5uA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/quote-js-string": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/quote-js-string/-/quote-js-string-0.1.0.tgz", + "integrity": "sha512-Y3NoRtprEEZQD8RfxMCfS0ZTqc4e+i18OrXEXAvpM6TfC/3y+0L5rNbZiSnbBBEkDfFzbpd8o+cE8q3/anjMGA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=22" + }, + "funding": { + "url": "https://github.com/sindresorhus/quote-js-string?sponsor=1" + } + }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -3818,6 +4575,20 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/regjsparser": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.4.tgz", + "integrity": "sha512-EWV80YgFaVgFrjGCAsV7oybp4GOxbls5RzBg8OB0nKEVXsBJR1JlV8Di1JhCROg3MzTfe1RI8yitIm1eOs68iA==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "jsesc": "~3.1.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -3920,9 +4691,9 @@ } }, "node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "dev": true, "license": "ISC", "bin": { @@ -4022,6 +4793,17 @@ "node": ">=0.3.1" } }, + "node_modules/source-map-js": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.2.tgz", + "integrity": "sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/spdx-exceptions": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", @@ -4031,9 +4813,9 @@ "peer": true }, "node_modules/spdx-expression-parse": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", - "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-5.0.0.tgz", + "integrity": "sha512-vngmw3Rgn+o2arXNbnZaj5UtOEBuWBfvaI+Wc8GFfykIhA5/vdK9/Sp/XkLv63dykz2rxKDvKEHupF5P0FORcQ==", "dev": true, "license": "MIT", "peer": true, @@ -4043,9 +4825,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.23", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz", - "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==", + "version": "3.0.24", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.24.tgz", + "integrity": "sha512-cLS9TtWkIQFyLkJ3/5aFQAOHOSKTlOs/7WDut/XPSdjom1fJhUdkepeJAKXa9Y05+FabHd0sti+Et559vDtkpQ==", "dev": true, "license": "CC0-1.0", "peer": true @@ -4186,6 +4968,20 @@ "node": ">=8" } }, + "node_modules/strip-indent": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.1.1.tgz", + "integrity": "sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -4468,6 +5264,38 @@ "dev": true, "license": "MIT" }, + "node_modules/update-browserslist-db": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.4.tgz", + "integrity": "sha512-t8wonIOdQyOjtPd2VktlBu6QjTVTks6v8bSi7kd0r2Vll8TK1JYDZtRRdbmCHOAMphkZgrzK+L+vXK4pyZ8t4A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -4721,6 +5549,23 @@ "node": ">=10" } }, + "node_modules/yaml": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.1.tgz", + "integrity": "sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw==", + "dev": true, + "license": "ISC", + "peer": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", From fb0add6ef1ee760acb5ec24aaeaa92e8c9884874 Mon Sep 17 00:00:00 2001 From: Ramona Hartinger Date: Mon, 26 Oct 2026 06:50:11 +0100 Subject: [PATCH 2/3] ci: updated sonarqube pipline step to detect eslint warnings --- .github/workflows/nodejs.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index 2eb7063..3c8239b 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -45,6 +45,11 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v7.0.1 + # full history and all branch refs are needed, so the sonar scanner can + # resolve the base branch `main` for the new code period calculation + # (otherwise it warns: "Could not find ref 'main' in refs/heads, ...") + with: + fetch-depth: 0 - name: Set up Node.js uses: actions/setup-node@v7.1.0 @@ -74,7 +79,20 @@ jobs: env: SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} with: + # sonar.sources must be set explicitly when sonar.tests is set, + # otherwise the scanner indexes ONLY the test directories and the + # eslint report import cannot match any regular source file + # ("No input file found for ...") + # sonar.exclusions only applies to main (non-test) files, so the test + # dirs can be excluded here without affecting the sonar.tests indexing + # sonar.tests: explicit test classification instead of the path heuristic + # tsconfigPaths: both TS projects must be listed, otherwise only the + # root project is analyzed args: -Dsonar.projectKey=aditosoftware_vscode-input -Dsonar.organization=aditosoftware -Dsonar.eslint.reportPaths=eslint-results.json -Dsonar.javascript.lcov.reportPaths=coverage/lcov.info + -Dsonar.sources=. + -Dsonar.exclusions=**/*.ttf,**/*.woff,**/*.woff2,**/*.jar,**/*.png,**/*.jpg,**/*.jpeg,**/*.gif,**/*.ico,**/*.mp4,**/*.vsix,test/**,out/**,dist/** + -Dsonar.tests=test/ + -Dsonar.typescript.tsconfigPaths=tsconfig.json \ No newline at end of file From 377e663cbb608734a0b338a0bbb5e5552cd30f44 Mon Sep 17 00:00:00 2001 From: Ramona Hartinger Date: Mon, 26 Oct 2026 07:58:15 +0100 Subject: [PATCH 3/3] chore: fixed all new sonar issues and added additional tests --- src/DialogValues.ts | 4 +- src/handleMultiStepInput.ts | 47 +++++++------ src/type/AbstractInputBase.ts | 4 +- src/type/InputBox.ts | 19 ++++-- src/type/OpenDialog.ts | 47 ++++++------- src/type/quickPick/AbstractQuickPick.ts | 49 ++++++------- src/type/quickPick/LoadingQuickPick.ts | 4 +- src/type/quickPick/QuickPick.ts | 2 +- test/DialogValues.test.ts | 9 ++- test/handleMultiStepInput.test.ts | 64 ++++++++++------- test/sample/sample.ts | 29 ++++---- test/type/AbstractInputBase.test.ts | 91 +++++++++++++++++++++++++ test/type/ConfirmationDialog.test.ts | 2 +- test/type/InputBox.test.ts | 63 +++++++++++------ test/type/LoadingQuickPick.test.ts | 60 ++++++++++------ test/type/OpenDialog.test.ts | 12 ++-- test/type/QuickPick.test.ts | 36 +++++----- 17 files changed, 353 insertions(+), 189 deletions(-) create mode 100644 test/type/AbstractInputBase.test.ts diff --git a/src/DialogValues.ts b/src/DialogValues.ts index 8015896..6fc3c5a 100644 --- a/src/DialogValues.ts +++ b/src/DialogValues.ts @@ -28,7 +28,9 @@ export class DialogValues { if (typeof result === "string") { elements.push(result); } else if (Array.isArray(result)) { - result.forEach((pResult) => elements.push(pResult)); + for (const pResult of result) { + elements.push(pResult); + } } else if (typeof result === "boolean") { elements.push(result.toString()); } diff --git a/src/handleMultiStepInput.ts b/src/handleMultiStepInput.ts index 5bb7e12..8071d9d 100644 --- a/src/handleMultiStepInput.ts +++ b/src/handleMultiStepInput.ts @@ -13,6 +13,8 @@ export let logger: Logger; * @param pLogger - the logger that should be used for every logging */ export function initializeLogger(pLogger: Logger): void { + // This logger needs to be globally assigned. If you want to change it, this would be a breaking change. + // eslint-disable-next-line unicorn/no-top-level-assignment-in-function logger = pLogger; } @@ -31,7 +33,7 @@ export async function handleMultiStepInput( inputs: InputBase[], dialogValues?: DialogValues ): Promise { - dialogValues = dialogValues ?? new DialogValues(); + dialogValues ??= new DialogValues(); let currentStep: Step = { stepNumber: 1, totalNumber: inputs.length }; @@ -86,30 +88,32 @@ async function handleInputStep( // dispose everything no longer needed from the input input.dispose(); - if (typeof result === "undefined") { + if (result === undefined) { // User canceled the selection logger.debug({ message: `Command ${input.inputOptions.name} was cancelled` }); return; - } else if (result === InputAction.BACK) { + } + + if (result === InputAction.BACK) { // if the back button was pressed, set index and step counter to the last valid used elements return handleGoingBack(takenSteps, currentStep, iterator); - } else { - currentStep.goingBackProcess = false; + } - dialogValues.addValue(input.inputOptions.name, result); + currentStep.goingBackProcess = false; - // if there is some special behavior after the input, handle it - input.inputOptions.onAfterInput?.(dialogValues); + dialogValues.addValue(input.inputOptions.name, result); - // save the last valid step for going back - takenSteps.push({ - stepNumber: currentStep.stepNumber, - totalNumber: currentStep.totalNumber, - name: input.inputOptions.name, - }); + // if there is some special behavior after the input, handle it + input.inputOptions.onAfterInput?.(dialogValues); - currentStep.stepNumber++; - } + // save the last valid step for going back + takenSteps.push({ + stepNumber: currentStep.stepNumber, + totalNumber: currentStep.totalNumber, + name: input.inputOptions.name, + }); + + currentStep.stepNumber++; } else if (!currentStep.goingBackProcess) { // input not needed, count down total number currentStep.totalNumber--; @@ -118,11 +122,11 @@ async function handleInputStep( if (currentStep.goingBackProcess) { // if we are going back and skipping, then just go back one more step return handleGoingBack(takenSteps, currentStep, iterator); - } else { - // otherwise, get the next input - iterator.next(); - return currentStep; } + + // otherwise, get the next input + iterator.next(); + return currentStep; } /** @@ -168,9 +172,8 @@ function handleGoingBack( } return lastStep; - } else { - return currentStep; } + return currentStep; } /** diff --git a/src/type/AbstractInputBase.ts b/src/type/AbstractInputBase.ts index 09bf1c4..e69833c 100644 --- a/src/type/AbstractInputBase.ts +++ b/src/type/AbstractInputBase.ts @@ -85,6 +85,8 @@ export abstract class InputBase { * Disposes everything from the given input after the dialog was shown and the values was received. */ dispose(): void { - this.disposables.forEach((pDisposable) => pDisposable.dispose()); + for (const pDisposable of this.disposables) { + pDisposable.dispose(); + } } } diff --git a/src/type/InputBox.ts b/src/type/InputBox.ts index 4e35801..76615e9 100644 --- a/src/type/InputBox.ts +++ b/src/type/InputBox.ts @@ -16,6 +16,9 @@ export namespace InputBox { * in order to require a placeHolder input for every input box. */ type RequiredInputBoxOptions = BaseInputBoxOptions & { + /** + * The placeholder that is required for every input box. + */ placeHolder: NonNullable; }; @@ -141,13 +144,15 @@ export class InputBox extends InputBase { * @param inputBox - the input box */ private async validateInput(options: vscode.InputBoxOptions, text: string, inputBox: vscode.InputBox): Promise { - if (options.validateInput) { - const validationMessage = await options.validateInput(text); - if (validationMessage) { - inputBox.validationMessage = validationMessage; - } else { - inputBox.validationMessage = undefined; - } + if (!options.validateInput) { + return; + } + + const validationMessage = await options.validateInput(text); + if (validationMessage) { + inputBox.validationMessage = validationMessage; + } else { + inputBox.validationMessage = undefined; } } } diff --git a/src/type/OpenDialog.ts b/src/type/OpenDialog.ts index 541e9fc..8c31a24 100644 --- a/src/type/OpenDialog.ts +++ b/src/type/OpenDialog.ts @@ -17,6 +17,9 @@ export namespace OpenDialog { * in order to have a input for the user what to select. */ type RequiredOpenDialogOptions = BaseOpenDialogOptions & { + /** + * The label of the open button that is required for every open dialog. + */ openLabel: NonNullable; }; @@ -41,8 +44,7 @@ export class OpenDialog extends InputBase { async showDialog(currentResults: DialogValues, title: string): Promise { // copy the options, so they will not persist during multiple dialogs. // Also set them to vscode.OpenDialogOptions to be able to set the title which was omitted from our options. - const options: vscode.OpenDialogOptions = { ...this.inputOptions.openDialogOptions }; - options.title = title; + const options: vscode.OpenDialogOptions = { ...this.inputOptions.openDialogOptions, title: title }; // find out the default uri that should be used const defaultUri = this.findOutDefaultUri(currentResults, options.defaultUri); @@ -75,30 +77,29 @@ export class OpenDialog extends InputBase { if (currentValues.length === 1) { // if there was only one selection, transform it back into an URI return vscode.Uri.file(currentValues[0]); - } else { - // otherwise, we need to find out the common path among all given values - const normalizedPaths = currentValues.map((pPath) => path.normalize(pPath)); - const splitPaths = normalizedPaths.map((pPath) => pPath.split(path.sep)); + } - // find out the command segments among all path segments - const commonSegments: string[] = []; - for (let i = 0; i < splitPaths[0].length; i++) { - const segment = splitPaths[0][i]; - if (splitPaths.every((path) => path[i] === segment)) { - commonSegments.push(segment); - } else { - break; - } - } + // otherwise, we need to find out the common path among all given values + const normalizedPaths = currentValues.map((pPath) => path.normalize(pPath)); + const splitPaths = normalizedPaths.map((pPath) => pPath.split(path.sep)); - // Join the common segments back into a path - const commonPath = path.join(...commonSegments); - // and transform it into and URI - return vscode.Uri.file(commonPath); + // find out the command segments among all path segments + const commonSegments: string[] = []; + for (let index = 0; index < splitPaths[0].length; index++) { + const segment = splitPaths[0][index]; + if (splitPaths.every((path) => path[index] === segment)) { + commonSegments.push(segment); + } else { + break; + } } - } else { - // if there is no given selection, just use the value from the options - return defaultUriFromOptions; + + // Join the common segments back into a path + const commonPath = path.join(...commonSegments); + // and transform it into and URI + return vscode.Uri.file(commonPath); } + // if there is no given selection, just use the value from the options + return defaultUriFromOptions; } } diff --git a/src/type/quickPick/AbstractQuickPick.ts b/src/type/quickPick/AbstractQuickPick.ts index 58be953..23cb0ce 100644 --- a/src/type/quickPick/AbstractQuickPick.ts +++ b/src/type/quickPick/AbstractQuickPick.ts @@ -36,15 +36,14 @@ export abstract class GenericQuickPick extend /** * Generates the placeHolder for the quick picks. * - * @param additionalPlaceHolder - the additional placeHolder from the {@link QuickPickItem.additionalPlaceholder} + * @param additionalPlaceholder - the additional placeHolder from the {@link QuickPickItem.additionalPlaceholder} * @returns the placeHolder that should be used for any quick pick. */ - protected generatePlaceHolder(additionalPlaceHolder?: string): string { - if (additionalPlaceHolder) { - return `${this.inputOptions.placeHolder} (${additionalPlaceHolder})`; - } else { - return this.inputOptions.placeHolder; + protected generatePlaceholder(additionalPlaceholder?: string): string { + if (additionalPlaceholder) { + return `${this.inputOptions.placeHolder} (${additionalPlaceholder})`; } + return this.inputOptions.placeHolder; } /** @@ -59,28 +58,30 @@ export abstract class GenericQuickPick extend * @param currentResults - the current dialog values */ protected setSelectedItems(quickPick: vscode.QuickPick, currentResults: DialogValues): void { - if (quickPick.canSelectMany) { - const oldValues = currentResults.inputValues.get(this.inputOptions.name); + if (!quickPick.canSelectMany) { + return; + } - const selectedItems: vscode.QuickPickItem[] = []; + const oldValues = currentResults.inputValues.get(this.inputOptions.name); - quickPick.items.forEach((pItem) => { - const label = pItem.label; - if (oldValues?.includes(label)) { - // if the current item was in the oldValues, then pick it - pItem.picked = true; - selectedItems.push(pItem); - } else if (pItem.picked) { - // if there are no old values, then set the selected items to the picked items - selectedItems.push(pItem); - } - // There exists no fallback - either we select the given old values or the picked items that were loaded as picked. - // If we do not have any of those two cases, then nothing should be picked immediately. - }); + const selectedItems: vscode.QuickPickItem[] = []; - if (selectedItems && selectedItems.length !== 0) { - quickPick.selectedItems = selectedItems; + for (const pItem of quickPick.items) { + const label = pItem.label; + if (oldValues?.includes(label)) { + // if the current item was in the oldValues, then pick it + pItem.picked = true; + selectedItems.push(pItem); + } else if (pItem.picked) { + // if there are no old values, then set the selected items to the picked items + selectedItems.push(pItem); } + // There exists no fallback - either we select the given old values or the picked items that were loaded as picked. + // If we do not have any of those two cases, then nothing should be picked immediately. + } + + if (selectedItems && selectedItems.length !== 0) { + quickPick.selectedItems = selectedItems; } } } diff --git a/src/type/quickPick/LoadingQuickPick.ts b/src/type/quickPick/LoadingQuickPick.ts index 009b956..4c8ffd5 100644 --- a/src/type/quickPick/LoadingQuickPick.ts +++ b/src/type/quickPick/LoadingQuickPick.ts @@ -50,7 +50,7 @@ export class LoadingQuickPick extends GenericQuickPick { const quickPick = vscode.window.createQuickPick(); quickPick.title = title; - quickPick.placeholder = this.generatePlaceHolder(items.additionalPlaceholder); + quickPick.placeholder = this.generatePlaceholder(items.additionalPlaceholder); quickPick.canSelectMany = this.inputOptions.allowMultiple ?? false; quickPick.items = items.items; quickPick.ignoreFocusOut = this.inputOptions.ignoreFocusOut ?? false; diff --git a/test/DialogValues.test.ts b/test/DialogValues.test.ts index 0c171a6..2a71fa9 100644 --- a/test/DialogValues.test.ts +++ b/test/DialogValues.test.ts @@ -1,4 +1,4 @@ -import assert from "assert"; +import assert from "node:assert"; import { DialogValues } from "../src"; /** @@ -39,7 +39,10 @@ suite("DialogValues test", () => { /** * Tests that the adding of different boolean values is working correctly */ - [true, false].forEach((pValue) => { + for (const pValue of [true, false]) { + /** + * Tests that a boolean value can be added. + */ test(`add boolean (${pValue})`, () => { const dialogValues = new DialogValues(); @@ -48,5 +51,5 @@ suite("DialogValues test", () => { assert.deepStrictEqual(new Map([[name, [pValue.toString()]]]), dialogValues.inputValues); }); - }); + } }); diff --git a/test/handleMultiStepInput.test.ts b/test/handleMultiStepInput.test.ts index e181a53..7d5bbe7 100644 --- a/test/handleMultiStepInput.test.ts +++ b/test/handleMultiStepInput.test.ts @@ -1,4 +1,4 @@ -import assert from "assert"; +import assert from "node:assert"; import { DialogValues, InputAction, @@ -10,8 +10,8 @@ import { } from "../src"; import Sinon from "sinon"; import * as vscode from "vscode"; -import path from "path"; -import os from "os"; +import path from "node:path"; +import os from "node:os"; import { Logger } from "@aditosoftware/vscode-logging"; /** @@ -19,7 +19,7 @@ import { Logger } from "@aditosoftware/vscode-logging"; */ suite("handleMultiStepInput test", () => { const title = "My title"; - const placeHolder = "My placeholder"; + const placeholder = "My placeholder"; /** * Spy for the debug log. @@ -62,13 +62,25 @@ suite("handleMultiStepInput test", () => { debugLog = Sinon.spy(Logger.getLogger(), "debug"); // creates some test elements from the inputs - firstElement = new TestElement(new InputBox({ name: "firstElement", inputBoxOptions: { placeHolder } })); - secondElement = new TestElement(new InputBox({ name: "secondElement", inputBoxOptions: { placeHolder } })); + firstElement = new TestElement( + new InputBox({ name: "firstElement", inputBoxOptions: { placeHolder: placeholder } }) + ); + secondElement = new TestElement( + new InputBox({ name: "secondElement", inputBoxOptions: { placeHolder: placeholder } }) + ); beforeInputTrue = new TestElement( - new InputBox({ name: "beforeInputTrue", inputBoxOptions: { placeHolder }, onBeforeInput: () => true }) + new InputBox({ + name: "beforeInputTrue", + inputBoxOptions: { placeHolder: placeholder }, + onBeforeInput: () => true, + }) ); beforeInputFalse = new TestElement( - new InputBox({ name: "beforeInputFalse", inputBoxOptions: { placeHolder }, onBeforeInput: () => false }) + new InputBox({ + name: "beforeInputFalse", + inputBoxOptions: { placeHolder: placeholder }, + onBeforeInput: () => false, + }) ); }); @@ -91,7 +103,7 @@ suite("handleMultiStepInput test", () => { test("should work with no input value", async () => { const result = await handleMultiStepInput(title, []); - assert.ok(typeof result !== "undefined", "result is there"); + assert.ok(result !== undefined, "result is there"); assert.strictEqual(result.inputValues.size, 0, "no input values"); }); @@ -105,7 +117,7 @@ suite("handleMultiStepInput test", () => { const result = await handleMultiStepInput(title, [firstElement.input]); - assert.ok(typeof result !== "undefined", "result is there"); + assert.ok(result !== undefined, "result is there"); assert.deepStrictEqual(new Map([[firstElement.name, [myValue]]]), result.inputValues); Sinon.assert.calledOnce(firstElement.showDialogStub); @@ -120,7 +132,7 @@ suite("handleMultiStepInput test", () => { const result = await handleMultiStepInput(title, [firstElement.input]); - assert.ok(typeof result === "undefined", "result is not there"); + assert.ok(result === undefined, "result is not there"); Sinon.assert.calledOnce(firstElement.showDialogStub); Sinon.assert.calledWith(firstElement.showDialogStub, Sinon.match.any, `${title} (Step 1 of 1)`, false); @@ -138,7 +150,7 @@ suite("handleMultiStepInput test", () => { const result = await handleMultiStepInput(title, [firstElement.input, secondElement.input]); - assert.ok(typeof result !== "undefined", "result is there"); + assert.ok(result !== undefined, "result is there"); assert.deepStrictEqual( new Map([ [firstElement.name, [firstValues]], @@ -171,7 +183,7 @@ suite("handleMultiStepInput test", () => { const result = await handleMultiStepInput(title, [firstElement.input, secondElement.input]); - assert.ok(typeof result !== "undefined", "result is there"); + assert.ok(result !== undefined, "result is there"); assert.deepStrictEqual( new Map([ [firstElement.name, [firstValues]], @@ -215,7 +227,7 @@ suite("handleMultiStepInput test", () => { const result = await handleMultiStepInput(title, [beforeInputTrue.input, firstElement.input, secondElement.input]); - assert.ok(typeof result !== "undefined", "result is there"); + assert.ok(result !== undefined, "result is there"); assert.deepStrictEqual( new Map([ [beforeInputTrue.name, ["foo"]], @@ -245,14 +257,14 @@ suite("handleMultiStepInput test", () => { * 6. input in `secondElement` */ test("should go back when skipping one component on the second time encountered", async function () { - this.timeout(80_00000); + this.timeout(8_000_000); let shouldShow = true; const beforeInputFirstTrue = new TestElement( new InputBox({ name: "beforeInputFirstTrue", - inputBoxOptions: { placeHolder }, + inputBoxOptions: { placeHolder: placeholder }, onBeforeInput: () => { if (shouldShow) { shouldShow = false; @@ -276,7 +288,7 @@ suite("handleMultiStepInput test", () => { secondElement.input, ]); - assert.ok(typeof result !== "undefined", "result is there"); + assert.ok(result !== undefined, "result is there"); assert.deepStrictEqual( new Map([ [beforeInputFirstTrue.name, ["foo"]], @@ -307,7 +319,7 @@ suite("handleMultiStepInput test", () => { const result = await handleMultiStepInput(title, [firstElement.input]); - assert.ok(typeof result !== "undefined", "result is there"); + assert.ok(result !== undefined, "result is there"); assert.deepStrictEqual(new Map([[firstElement.name, [firstValues]]]), result.inputValues); Sinon.assert.calledTwice(firstElement.showDialogStub); @@ -327,7 +339,7 @@ suite("handleMultiStepInput test", () => { const result = await handleMultiStepInput(title, [beforeInputTrue.input]); - assert.ok(typeof result !== "undefined", "result is there"); + assert.ok(result !== undefined, "result is there"); assert.deepStrictEqual(new Map([[beforeInputTrue.name, [inputBoxValue]]]), result.inputValues); Sinon.assert.calledOnce(beforeInputTrue.showDialogStub); @@ -344,7 +356,7 @@ suite("handleMultiStepInput test", () => { const result = await handleMultiStepInput(title, [beforeInputFalse.input]); - assert.ok(typeof result !== "undefined", "result is there"); + assert.ok(result !== undefined, "result is there"); assert.deepStrictEqual(new Map(), result.inputValues); Sinon.assert.callCount(beforeInputFalse.showDialogStub, 0); @@ -364,9 +376,9 @@ suite("handleMultiStepInput test", () => { secondElement.input, ]); - assert.ok(typeof result !== "undefined", "result is there"); + assert.ok(result !== undefined, "result is there"); // only the values from first and second box are there - assert.deepStrictEqual([firstElement.name, secondElement.name], Array.from(result.inputValues.keys())); + assert.deepStrictEqual([firstElement.name, secondElement.name], [...result.inputValues.keys()]); Sinon.assert.calledOnce(firstElement.showDialogStub); Sinon.assert.calledWith(firstElement.showDialogStub, Sinon.match.any, `${title} (Step 1 of 3)`, false); @@ -393,7 +405,7 @@ suite("handleMultiStepInput test", () => { secondElement.input, ]); - assert.ok(typeof result !== "undefined", "result is there"); + assert.ok(result !== undefined, "result is there"); // only the values from first and second box are there assert.deepStrictEqual( new Map([ @@ -425,7 +437,7 @@ suite("handleMultiStepInput test", () => { const inputBox = new InputBox({ name: name, - inputBoxOptions: { placeHolder }, + inputBoxOptions: { placeHolder: placeholder }, onAfterInput: (dialogValues: DialogValues) => { afterInput = dialogValues.inputValues; }, @@ -434,7 +446,7 @@ suite("handleMultiStepInput test", () => { const result = await handleMultiStepInput(title, [inputBox]); - assert.ok(typeof result !== "undefined", "result is there"); + assert.ok(result !== undefined, "result is there"); assert.deepStrictEqual(new Map([[name, [myValue]]]), result.inputValues); // also check that after input was set to the new map assert.deepStrictEqual(new Map([[name, [myValue]]]), afterInput); @@ -460,7 +472,7 @@ suite("handleMultiStepInput test", () => { const result = await handleMultiStepInput(title, [firstElement.input], oldDialogValues); - assert.ok(typeof result !== "undefined", "result is there"); + assert.ok(result !== undefined, "result is there"); assert.deepStrictEqual( new Map([ [firstElement.name, [myValue]], diff --git a/test/sample/sample.ts b/test/sample/sample.ts index 045293c..0f94e3f 100644 --- a/test/sample/sample.ts +++ b/test/sample/sample.ts @@ -87,23 +87,26 @@ export async function generateExampleMultiStepInput(): Promise { const result = await handleMultiStepInput("Demonstration for inputs", components); - if (result) { - // now, handle the result + if (!result) { + console.error("No result was present"); + return; + } + + // now, handle the result - const userName = result.inputValues.get("userName")?.[0]; - const foodPreferenceLoading = result.inputValues.get("foodPreferenceLoading")?.[0]; - const chooseAnyFile = result.inputValues.get("chooseAnyFile")?.[0]; - const chooseTextFile = result.inputValues.get("chooseTextFile")?.[0]; - const foodPreference = result.inputValues.get("foodPreference")?.[0]; + const username = result.inputValues.get("userName")?.[0]; + const foodPreferenceLoading = result.inputValues.get("foodPreferenceLoading")?.[0]; + const chooseAnyFile = result.inputValues.get("chooseAnyFile")?.[0]; + const chooseTextFile = result.inputValues.get("chooseTextFile")?.[0]; + const foodPreference = result.inputValues.get("foodPreference")?.[0]; - // confirmation is also a string, because the boolean of it is transformed - const confirmation = result.inputValues.get("Confirmation")?.[0]; + // confirmation is also a string, because the boolean of it is transformed + const confirmation = result.inputValues.get("Confirmation")?.[0]; - if (userName && foodPreferenceLoading && chooseAnyFile && chooseTextFile && foodPreference && confirmation) { - console.log("all inputs are there"); + if (username && foodPreferenceLoading && chooseAnyFile && chooseTextFile && foodPreference && confirmation) { + console.log("all inputs are there"); - // now, you can do specific things with your results - } + // now, you can do specific things with your results } } diff --git a/test/type/AbstractInputBase.test.ts b/test/type/AbstractInputBase.test.ts new file mode 100644 index 0000000..d1fb1f2 --- /dev/null +++ b/test/type/AbstractInputBase.test.ts @@ -0,0 +1,91 @@ +import assert from "node:assert"; +import * as vscode from "vscode"; +import { InputAction, InputBase, InputBaseOptions } from "../../src"; + +/** + * Tests the abstract input base. + */ +suite("InputBase Tests", () => { + /** + * Tests the `dispose` method of the input base. + */ + suite("dispose", () => { + /** + * Tests that all registered disposables will be disposed, when the input base is disposed. + */ + test("should dispose all registered disposables", () => { + const inputBase = new TestInputBase({ name: "Unit" }); + + const firstDisposable = createDisposableSpy(); + const secondDisposable = createDisposableSpy(); + + inputBase.addDisposable(firstDisposable); + inputBase.addDisposable(secondDisposable); + + inputBase.dispose(); + + assert.strictEqual(firstDisposable.disposed, true, "first disposable should be disposed"); + assert.strictEqual(secondDisposable.disposed, true, "second disposable should be disposed"); + }); + + /** + * Tests that disposing the input base does not throw an error, when no disposables were registered. + */ + test("should not throw when no disposables are registered", () => { + const inputBase = new TestInputBase({ name: "Unit" }); + + assert.doesNotThrow(() => inputBase.dispose(), "dispose should not throw without disposables"); + }); + }); +}); + +/** + * A minimal implementation of the abstract {@link InputBase}, which is used for testing its behavior. + */ +class TestInputBase extends InputBase { + /** + * @override + */ + async showDialog(): Promise { + return undefined; + } + + /** + * Adds a disposable that should be disposed, when the input base is disposed. + * + * @param pDisposable - the disposable that should be added + */ + addDisposable(pDisposable: vscode.Disposable): void { + this.disposables.push(pDisposable); + } +} + +/** + * A disposable that tracks whether it was disposed. + */ +interface DisposableSpy extends vscode.Disposable { + /** + * Indicator, if the disposable was disposed. + */ + disposed: boolean; +} + +/** + * Creates a disposable that tracks whether it was disposed. + * + * @returns the created disposable spy + */ +function createDisposableSpy(): DisposableSpy { + const disposable = { + disposed: false, + + /** + * Marks the disposable as disposed. + */ + dispose: (): void => { + disposable.disposed = true; + }, + }; + + return disposable; +} diff --git a/test/type/ConfirmationDialog.test.ts b/test/type/ConfirmationDialog.test.ts index 9febd8f..0aa4de1 100644 --- a/test/type/ConfirmationDialog.test.ts +++ b/test/type/ConfirmationDialog.test.ts @@ -1,4 +1,4 @@ -import assert from "assert"; +import assert from "node:assert"; import { ConfirmationDialog, DialogValues } from "../../src"; import Sinon from "sinon"; import * as vscode from "vscode"; diff --git a/test/type/InputBox.test.ts b/test/type/InputBox.test.ts index 10654fb..d4c9de7 100644 --- a/test/type/InputBox.test.ts +++ b/test/type/InputBox.test.ts @@ -1,7 +1,7 @@ import Sinon from "sinon"; import { DialogValues, InputAction, InputBox } from "../../src"; import * as vscode from "vscode"; -import assert from "assert"; +import assert from "node:assert"; /** * Tests the input box dialog. @@ -14,7 +14,7 @@ suite("InputBox Tests", () => { let createInputBoxStub: Sinon.SinonStub; const title = "My Title"; - const placeHolder = "My placeholder"; + const placeholder = "My placeholder"; /** * Creates the necessary stubs before each test. @@ -44,7 +44,7 @@ suite("InputBox Tests", () => { createInputBoxStub.returns(inputBoxWithHide); - const inputBox = new InputBox({ name: "Unit", inputBoxOptions: { placeHolder } }); + const inputBox = new InputBox({ name: "Unit", inputBoxOptions: { placeHolder: placeholder } }); const result = await inputBox.showDialog(new DialogValues(), title, true); @@ -61,7 +61,7 @@ suite("InputBox Tests", () => { const dialogValues = new DialogValues(); dialogValues.addValue(name, value); - const inputBox = new InputBox({ name: name, inputBoxOptions: { placeHolder } }); + const inputBox = new InputBox({ name: name, inputBoxOptions: { placeHolder: placeholder } }); await inputBox.showDialog(dialogValues, title, true); @@ -78,7 +78,10 @@ suite("InputBox Tests", () => { const dialogValues = new DialogValues(); dialogValues.addValue(name, value); - const inputBox = new InputBox({ name: name, inputBoxOptions: { value: "not used old value", placeHolder } }); + const inputBox = new InputBox({ + name: name, + inputBoxOptions: { value: "not used old value", placeHolder: placeholder }, + }); await inputBox.showDialog(dialogValues, title, true); @@ -90,7 +93,7 @@ suite("InputBox Tests", () => { * The title is implicitly provided by the method call */ test("showDialog should work correctly, if no inputBoxOptions are provided", async () => { - const inputBox = new InputBox({ name: "Unit", inputBoxOptions: { placeHolder } }); + const inputBox = new InputBox({ name: "Unit", inputBoxOptions: { placeHolder: placeholder } }); await inputBox.showDialog(new DialogValues(), title, true); @@ -101,7 +104,7 @@ suite("InputBox Tests", () => { * Tests that the input box should not have a button, when it should not show the button. */ test("should not have a back button when it should not show the button", async () => { - const inputBox = new InputBox({ name: "Unit", inputBoxOptions: { placeHolder } }); + const inputBox = new InputBox({ name: "Unit", inputBoxOptions: { placeHolder: placeholder } }); await inputBox.showDialog(new DialogValues(), title, false); @@ -112,7 +115,7 @@ suite("InputBox Tests", () => { * Tests that the input box should have a back button, when it is requested. */ test("should have a back button when requested", async () => { - const inputBox = new InputBox({ name: "Unit", inputBoxOptions: { placeHolder } }); + const inputBox = new InputBox({ name: "Unit", inputBoxOptions: { placeHolder: placeholder } }); await inputBox.showDialog(new DialogValues(), title, true); @@ -127,7 +130,7 @@ suite("InputBox Tests", () => { createInputBoxStub.returns(inputBoxWithBack); - const inputBox = new InputBox({ name: "Unit", inputBoxOptions: { placeHolder } }); + const inputBox = new InputBox({ name: "Unit", inputBoxOptions: { placeHolder: placeholder } }); const result = await inputBox.showDialog(new DialogValues(), title, true); @@ -151,7 +154,7 @@ suite("InputBox Tests", () => { const inputBox = new InputBox({ name: "Unit", - inputBoxOptions: { placeHolder }, + inputBoxOptions: { placeHolder: placeholder }, customButton: { button: button, action: () => { @@ -170,7 +173,7 @@ suite("InputBox Tests", () => { ); }); - [ + for (const pArgument of [ { description: "with invalid value", textToValidate: "foo", @@ -181,7 +184,7 @@ suite("InputBox Tests", () => { textToValidate: "bar", expectedValidationMessage: undefined, }, - ].forEach((pArgument) => { + ]) { /** * Tests that the validation will work correctly in the onDidChangeValue method. */ @@ -192,7 +195,7 @@ suite("InputBox Tests", () => { const inputBox = new InputBox({ name: "Unit", inputBoxOptions: { - placeHolder, + placeHolder: placeholder, validateInput: (pValue) => (pValue === "foo" ? "Invalid" : undefined), }, }); @@ -205,10 +208,28 @@ suite("InputBox Tests", () => { "validationMessage" ); }); + } + + /** + * Tests that no validation message will be set, when no `validateInput` was provided in the options. + */ + test("should not set a validation message when no validateInput is provided", async () => { + const inputBoxWithValueChange = createInputBoxWithValueChange(normalInputBox, "foo"); + createInputBoxStub.returns(inputBoxWithValueChange); + + const inputBox = new InputBox({ name: "Unit", inputBoxOptions: { placeHolder: placeholder } }); + + await inputBox.showDialog(new DialogValues(), title, true); + + assert.strictEqual( + inputBoxWithValueChange.validationMessage, + undefined, + "no validation message should be set without a validateInput option" + ); }); const timeoutText = "Operation timed out"; - [ + for (const pArgument of [ { description: "with invalid value", value: "foo", @@ -219,7 +240,7 @@ suite("InputBox Tests", () => { value: "bar", result: "bar", }, - ].forEach((pArgument) => { + ]) { /** * Tests that the validation will be considered in the onDidAccept method. */ @@ -227,7 +248,7 @@ suite("InputBox Tests", () => { const inputBox = new InputBox({ name: "Unit", inputBoxOptions: { - placeHolder, + placeHolder: placeholder, value: pArgument.value, validateInput: (pValue) => (pValue === "foo" ? "Invalid" : undefined), }, @@ -247,15 +268,15 @@ suite("InputBox Tests", () => { clearTimeout(timer); resolve(value); }) - .catch((err) => { + .catch((error) => { clearTimeout(timer); - reject(err); + reject(error); }); }); assert.strictEqual(result, pArgument.result, "result"); }); - }); + } /** * Tests that various InputBoxOptions will be preserved after the execution. @@ -270,7 +291,7 @@ suite("InputBox Tests", () => { inputBoxOptions: { ignoreFocusOut: true, password: true, - placeHolder, + placeHolder: placeholder, prompt: "my prompt", value: "my value", valueSelection: [3, 7], @@ -283,7 +304,7 @@ suite("InputBox Tests", () => { assert.strictEqual(inputBoxWithValueChange.title, title, "title"); assert.strictEqual(inputBoxWithValueChange.ignoreFocusOut, true, "ignoreFocusOut"); assert.strictEqual(inputBoxWithValueChange.password, true, "password"); - assert.strictEqual(inputBoxWithValueChange.placeholder, placeHolder, "placeHolder"); + assert.strictEqual(inputBoxWithValueChange.placeholder, placeholder, "placeHolder"); assert.strictEqual(inputBoxWithValueChange.prompt, "my prompt", "prompt"); assert.strictEqual(inputBoxWithValueChange.value, "my value", "value"); assert.deepStrictEqual(inputBoxWithValueChange.valueSelection, [3, 7], "valueSelection"); diff --git a/test/type/LoadingQuickPick.test.ts b/test/type/LoadingQuickPick.test.ts index 6a90716..e3d57ce 100644 --- a/test/type/LoadingQuickPick.test.ts +++ b/test/type/LoadingQuickPick.test.ts @@ -1,13 +1,13 @@ import Sinon from "sinon"; import * as vscode from "vscode"; import { DialogValues, InputAction, LoadingQuickPick, initializeLogger } from "../../src"; -import assert from "assert"; +import assert from "node:assert"; import { Logger } from "@aditosoftware/vscode-logging"; -import path from "path"; -import os from "os"; +import path from "node:path"; +import os from "node:os"; const title = "My title"; -const placeHolder = "My placeholder"; +const placeholder = "My placeholder"; /** * Tests the loading quick pick. @@ -98,7 +98,7 @@ suite("LoadingQuickPick tests", () => { const loadingQuickPick = new LoadingQuickPick({ name, - placeHolder, + placeHolder: placeholder, generateItems: () => [ { label: "item1", description: "description1", detail: "detail1" }, { label: "item2", description: "description2", detail: "detail2" }, @@ -135,7 +135,7 @@ suite("LoadingQuickPick tests", () => { const loadingQuickPick = new LoadingQuickPick({ name: "loadingQuickPick", - placeHolder, + placeHolder: placeholder, generateItems: () => [{ label: "normal item" }], reloadItems: () => [{ label: "reload item" }], reloadTooltip: "my reload tooltip", @@ -155,7 +155,7 @@ suite("LoadingQuickPick tests", () => { const loadingQuickPick = new LoadingQuickPick({ name: "loadingQuickPick", - placeHolder, + placeHolder: placeholder, generateItems: () => generatedItems, reloadItems: () => [], reloadTooltip: "my reload tooltip", @@ -180,14 +180,26 @@ suite("LoadingQuickPick tests", () => { * A spy of the setter of the title of a quick pick. This can be used the check if the title was overwritten correctly. */ let titleSet: PropertyDescriptor & { + /** + * The spy of the getter of the title. + */ get: Sinon.SinonSpy<[], string | undefined>; + /** + * The spy of the setter of the title. + */ set: Sinon.SinonSpy<[string | undefined], void>; }; /** * A spy of the setter of the placeholder of a quick pick. This can be used the check if the placeholder was overwritten correctly. */ let placeholderSet: PropertyDescriptor & { + /** + * The spy of the getter of the placeholder. + */ get: Sinon.SinonSpy<[], string | undefined>; + /** + * The spy of the setter of the placeholder. + */ set: Sinon.SinonSpy<[string | undefined], void>; }; @@ -195,7 +207,13 @@ suite("LoadingQuickPick tests", () => { * A spy of the setter of the busy field of a quick pick. This can be used the check if busy was overwritten correctly. */ let busySet: PropertyDescriptor & { + /** + * The spy of the getter of the busy field. + */ get: Sinon.SinonSpy<[], boolean>; + /** + * The spy of the setter of the busy field. + */ set: Sinon.SinonSpy<[boolean], void>; }; @@ -203,7 +221,13 @@ suite("LoadingQuickPick tests", () => { * A spy of the setter of the enabled field of a quick pick. This can be used the check if enabled was overwritten correctly. */ let enabledSet: PropertyDescriptor & { + /** + * The spy of the getter of the enabled field. + */ get: Sinon.SinonSpy<[], boolean>; + /** + * The spy of the setter of the enabled field. + */ set: Sinon.SinonSpy<[boolean], void>; }; @@ -247,7 +271,7 @@ suite("LoadingQuickPick tests", () => { const loadingQuickPick = new LoadingQuickPick({ name: "loadingQuickPick", - placeHolder, + placeHolder: placeholder, generateItems: () => generatedItems, reloadItems: () => [{ label: "reload item" }], reloadTooltip: "my reload tooltip", @@ -272,7 +296,7 @@ suite("LoadingQuickPick tests", () => { const loadingQuickPick = new LoadingQuickPick({ name: "loadingQuickPick", - placeHolder, + placeHolder: placeholder, generateItems: () => generatedItems, reloadItems: () => [{ label: "reload item" }], reloadTooltip: "my reload tooltip", @@ -282,7 +306,7 @@ suite("LoadingQuickPick tests", () => { await showAndAssert(loadingQuickPick, expectedItems, quickPickWithAccept, false, [reloadButton]); }); - [ + for (const pElement of [ { name: "with separate reload function", expected: ["reload item"], @@ -293,7 +317,7 @@ suite("LoadingQuickPick tests", () => { expected: ["normal item", "Item 1", "Item 2"], reloadItems: undefined, }, - ].forEach((pElement) => { + ]) { /** * Validates that the reload is triggered normally. */ @@ -317,7 +341,7 @@ suite("LoadingQuickPick tests", () => { const reloadTooltip = "my reload tooltip"; const loadingQuickPick = new LoadingQuickPick({ name: "loadingQuickPick", - placeHolder, + placeHolder: placeholder, generateItems: () => generatedItems, reloadItems: pElement.reloadItems, reloadTooltip, @@ -333,9 +357,7 @@ suite("LoadingQuickPick tests", () => { validateResults(false, titleSet, placeholderSet, busySet, enabledSet); // get the reload button from all the buttons - const foundReloadButton = quickPickWithAccept.buttons - .filter((pButton) => pButton.tooltip === reloadTooltip) - .shift(); + const foundReloadButton = quickPickWithAccept.buttons.find((pButton) => pButton.tooltip === reloadTooltip); assert.ok(foundReloadButton, "reload button should exist"); // Trigger the reload @@ -366,7 +388,7 @@ suite("LoadingQuickPick tests", () => { debugLog.restore(); onDidTriggerButtonStub.restore(); }); - }); + } }); }); @@ -434,11 +456,11 @@ function validateResults( const loadingPlaceholder = placeholderSet.set.withArgs( "Please wait, loading is in progress. This might take a while." ); - const placeholder = placeholderSet.set.withArgs(placeHolder); + const placeholderCall = placeholderSet.set.withArgs(placeholder); Sinon.assert.callOrder( ...(duplicate - ? [loadingPlaceholder, placeholder, loadingPlaceholder, placeholder] - : [loadingPlaceholder, placeholder]) + ? [loadingPlaceholder, placeholderCall, loadingPlaceholder, placeholderCall] + : [loadingPlaceholder, placeholderCall]) ); // busy asserts diff --git a/test/type/OpenDialog.test.ts b/test/type/OpenDialog.test.ts index 71eae9b..d6ff0a2 100644 --- a/test/type/OpenDialog.test.ts +++ b/test/type/OpenDialog.test.ts @@ -1,8 +1,8 @@ import * as vscode from "vscode"; import Sinon from "sinon"; import { DialogValues, OpenDialog } from "../../src"; -import assert from "assert"; -import path from "path"; +import assert from "node:assert"; +import path from "node:path"; /** * Tests for the OpenDialog. @@ -44,8 +44,8 @@ suite("OpenDialog tests", () => { await openDialog.showDialog(dialogValues, title); // check that the fsPath is identical in both urls - const args = showOpenDialogStub.args[0][0]; - assert.deepStrictEqual(args.defaultUri.fsPath, value.fsPath); + const firstArguments = showOpenDialogStub.args[0][0]; + assert.deepStrictEqual(firstArguments.defaultUri.fsPath, value.fsPath); Sinon.assert.calledWithExactly(showOpenDialogStub, { canSelectFiles: true, @@ -75,8 +75,8 @@ suite("OpenDialog tests", () => { await openDialog.showDialog(dialogValues, title); // check that the fsPath is identical in both urls - const args = showOpenDialogStub.args[0][0]; - assert.deepStrictEqual(args.defaultUri.fsPath, value.fsPath); + const firstArguments = showOpenDialogStub.args[0][0]; + assert.deepStrictEqual(firstArguments.defaultUri.fsPath, value.fsPath); Sinon.assert.calledWithExactly(showOpenDialogStub, { title, diff --git a/test/type/QuickPick.test.ts b/test/type/QuickPick.test.ts index d707488..d782a05 100644 --- a/test/type/QuickPick.test.ts +++ b/test/type/QuickPick.test.ts @@ -1,7 +1,7 @@ import Sinon from "sinon"; import { DialogValues, InputAction, QuickPick } from "../../src"; import * as vscode from "vscode"; -import assert from "assert"; +import assert from "node:assert"; import { QuickPickItems } from "../../src/type/quickPick/GenericQuickPick"; /** @@ -9,7 +9,7 @@ import { QuickPickItems } from "../../src/type/quickPick/GenericQuickPick"; */ suite("QuickPick tests", () => { const title = "My Title"; - const placeHolder = "My placeholder"; + const placeholder = "My placeholder"; const normalQuickPick: vscode.QuickPick = vscode.window.createQuickPick(); @@ -32,7 +32,7 @@ suite("QuickPick tests", () => { */ const basicOptions = { name: "quickPick", - placeHolder, + placeHolder: placeholder, }; /** @@ -122,7 +122,7 @@ suite("QuickPick tests", () => { assert.strictEqual(quickPickWithAccept.title, title); assert.strictEqual(quickPickWithAccept.canSelectMany, false, "canSelectMany "); - assert.strictEqual(quickPickWithAccept.placeholder, placeHolder, "placeholder "); + assert.strictEqual(quickPickWithAccept.placeholder, placeholder, "placeholder "); }); /** @@ -141,7 +141,7 @@ suite("QuickPick tests", () => { assert.strictEqual(quickPickWithAccept.title, title, "title"); assert.strictEqual(quickPickWithAccept.canSelectMany, false, "canSelectMany "); - assert.strictEqual(quickPickWithAccept.placeholder, `${placeHolder} (${additionalPlaceholder})`, "placeholder "); + assert.strictEqual(quickPickWithAccept.placeholder, `${placeholder} (${additionalPlaceholder})`, "placeholder "); }); /** @@ -165,7 +165,7 @@ suite("QuickPick tests", () => { assert.strictEqual(quickPickWithAccept.title, title, "title"); assert.strictEqual(quickPickWithAccept.canSelectMany, true, "canSelectMany "); - assert.strictEqual(quickPickWithAccept.placeholder, placeHolder, "placeholder "); + assert.strictEqual(quickPickWithAccept.placeholder, placeholder, "placeholder "); }); /** @@ -174,11 +174,10 @@ suite("QuickPick tests", () => { test("should correctly handle multiple selection", async () => { const quickPick = new QuickPick({ ...basicOptions, - generateItems: () => [ - ...quickPickItems.map((pItem) => { + generateItems: () => + quickPickItems.map((pItem) => { return { ...pItem, picked: true }; }), - ], allowMultiple: true, }); @@ -186,7 +185,7 @@ suite("QuickPick tests", () => { assert.strictEqual(quickPickWithAccept.title, title, "title"); assert.strictEqual(quickPickWithAccept.canSelectMany, true, "canSelectMany "); - assert.strictEqual(quickPickWithAccept.placeholder, placeHolder, "placeholder "); + assert.strictEqual(quickPickWithAccept.placeholder, placeholder, "placeholder "); }); /** @@ -244,11 +243,11 @@ suite("QuickPick tests", () => { await showDialogAndAssert(undefined, quickPick, title); }); - [ + for (const pArgument of [ { ignoreFocusOut: undefined, expected: false }, { ignoreFocusOut: false, expected: false }, { ignoreFocusOut: true, expected: true }, - ].forEach((pArgument) => { + ]) { /** * Tests that a given ignoreFocusOut will be used correctly. */ @@ -256,11 +255,10 @@ suite("QuickPick tests", () => { const quickPick = new QuickPick({ ...basicOptions, ignoreFocusOut: pArgument.ignoreFocusOut, - generateItems: () => [ - ...quickPickItems.map((pItem) => { + generateItems: () => + quickPickItems.map((pItem) => { return { ...pItem, picked: true }; }), - ], allowMultiple: true, }); @@ -268,13 +266,13 @@ suite("QuickPick tests", () => { assert.strictEqual(quickPickWithAccept.ignoreFocusOut, pArgument.expected, "ignoreFocusOut"); }); - }); + } - [ + for (const pArgument of [ { allowMultiple: undefined, expected: false }, { allowMultiple: false, expected: false }, { allowMultiple: true, expected: true }, - ].forEach((pArgument) => { + ]) { /** * Tests that a given allowMultiple will be used correctly. */ @@ -289,7 +287,7 @@ suite("QuickPick tests", () => { assert.strictEqual(quickPickWithAccept.canSelectMany, pArgument.expected, "allowMultiple"); }); - }); + } }); /**