From 2e507de72c6bba165b1fa0a26a9cfbda96e6b39d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 21 May 2026 17:16:01 +0000 Subject: [PATCH 1/8] Update Development Dependencies --- package-lock.json | 3671 +++++++++-------- .../package.json | 2 +- 2 files changed, 1971 insertions(+), 1702 deletions(-) diff --git a/package-lock.json b/package-lock.json index 23e1c7d5..930f9449 100644 --- a/package-lock.json +++ b/package-lock.json @@ -778,13 +778,13 @@ "license": "MIT" }, "node_modules/@changesets/apply-release-plan": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@changesets/apply-release-plan/-/apply-release-plan-7.1.0.tgz", - "integrity": "sha512-yq8ML3YS7koKQ/9bk1PqO0HMzApIFNwjlwCnwFEXMzNe8NpzeeYYKCmnhWJGkN8g7E51MnWaSbqRcTcdIxUgnQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@changesets/apply-release-plan/-/apply-release-plan-7.1.1.tgz", + "integrity": "sha512-9qPCm/rLx/xoOFXIHGB229+4GOL76S4MC+7tyOuTsR6+1jYlfFDQORdvwR5hDA6y4FL2BPt3qpbcQIS+dW85LA==", "dev": true, "license": "MIT", "dependencies": { - "@changesets/config": "^3.1.3", + "@changesets/config": "^3.1.4", "@changesets/get-version-range-type": "^0.4.0", "@changesets/git": "^3.0.4", "@changesets/should-skip-package": "^0.1.2", @@ -826,14 +826,14 @@ } }, "node_modules/@changesets/assemble-release-plan": { - "version": "6.0.9", - "resolved": "https://registry.npmjs.org/@changesets/assemble-release-plan/-/assemble-release-plan-6.0.9.tgz", - "integrity": "sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ==", + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/@changesets/assemble-release-plan/-/assemble-release-plan-6.0.10.tgz", + "integrity": "sha512-rSDcqdJ9KbVyjpBIuCidhvZNIiVt1XaIYp73ycVQRIA5n/j6wQaEk0ChRLMUQ1vkxZe51PTQ9OIhbg6HQMW45A==", "dev": true, "license": "MIT", "dependencies": { "@changesets/errors": "^0.2.0", - "@changesets/get-dependents-graph": "^2.1.3", + "@changesets/get-dependents-graph": "^2.1.4", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", @@ -851,19 +851,19 @@ } }, "node_modules/@changesets/cli": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/@changesets/cli/-/cli-2.30.0.tgz", - "integrity": "sha512-5D3Nk2JPqMI1wK25pEymeWRSlSMdo5QOGlyfrKg0AOufrUcjEE3RQgaCpHoBiM31CSNrtSgdJ0U6zL1rLDDfBA==", + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/@changesets/cli/-/cli-2.31.0.tgz", + "integrity": "sha512-AhI4enNTgHu2IZr6K4WZyf0EPch4XVMn1yOMFmCD9gsfBGqMYaHXls5HyDv6/CL5axVQABz68eG30eCtbr2wFg==", "dev": true, "license": "MIT", "dependencies": { - "@changesets/apply-release-plan": "^7.1.0", - "@changesets/assemble-release-plan": "^6.0.9", + "@changesets/apply-release-plan": "^7.1.1", + "@changesets/assemble-release-plan": "^6.0.10", "@changesets/changelog-git": "^0.2.1", - "@changesets/config": "^3.1.3", + "@changesets/config": "^3.1.4", "@changesets/errors": "^0.2.0", - "@changesets/get-dependents-graph": "^2.1.3", - "@changesets/get-release-plan": "^4.0.15", + "@changesets/get-dependents-graph": "^2.1.4", + "@changesets/get-release-plan": "^4.0.16", "@changesets/git": "^3.0.4", "@changesets/logger": "^0.1.1", "@changesets/pre": "^2.0.2", @@ -899,14 +899,14 @@ } }, "node_modules/@changesets/config": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@changesets/config/-/config-3.1.3.tgz", - "integrity": "sha512-vnXjcey8YgBn2L1OPWd3ORs0bGC4LoYcK/ubpgvzNVr53JXV5GiTVj7fWdMRsoKUH7hhhMAQnsJUqLr21EncNw==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@changesets/config/-/config-3.1.4.tgz", + "integrity": "sha512-pf0bvD/v6WI2cRlZ6hzpjtZdSlXDXMAJ+Iz7xfFzV4ZxJ8OGGAON+1qYc99ZPrijnt4xp3VGG7eNvAOGS24V1Q==", "dev": true, "license": "MIT", "dependencies": { "@changesets/errors": "^0.2.0", - "@changesets/get-dependents-graph": "^2.1.3", + "@changesets/get-dependents-graph": "^2.1.4", "@changesets/logger": "^0.1.1", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", @@ -926,9 +926,9 @@ } }, "node_modules/@changesets/get-dependents-graph": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@changesets/get-dependents-graph/-/get-dependents-graph-2.1.3.tgz", - "integrity": "sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@changesets/get-dependents-graph/-/get-dependents-graph-2.1.4.tgz", + "integrity": "sha512-ZsS00x6WvmHq3sQv8oCMwL0f/z3wbXCVuSVTJwCnnmbC/iBdNJGFx1EcbMG4PC6sXRyH69liM4A2WKXzn/kRPg==", "dev": true, "license": "MIT", "dependencies": { @@ -939,14 +939,14 @@ } }, "node_modules/@changesets/get-release-plan": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/@changesets/get-release-plan/-/get-release-plan-4.0.15.tgz", - "integrity": "sha512-Q04ZaRPuEVZtA+auOYgFaVQQSA98dXiVe/yFaZfY7hoSmQICHGvP0TF4u3EDNHWmmCS4ekA/XSpKlSM2PyTS2g==", + "version": "4.0.16", + "resolved": "https://registry.npmjs.org/@changesets/get-release-plan/-/get-release-plan-4.0.16.tgz", + "integrity": "sha512-2K5Om6CrMPm45rtvckfzWo7e9jOVCKLCnXia5eUPaURH7/LWzri7pK1TycdzAuAtehLkW7VPbWLCSExTHmiI6g==", "dev": true, "license": "MIT", "dependencies": { - "@changesets/assemble-release-plan": "^6.0.9", - "@changesets/config": "^3.1.3", + "@changesets/assemble-release-plan": "^6.0.10", + "@changesets/config": "^3.1.4", "@changesets/pre": "^2.0.2", "@changesets/read": "^0.6.7", "@changesets/types": "^6.1.0", @@ -1226,21 +1226,21 @@ } }, "node_modules/@emnapi/core": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.8.1.tgz", - "integrity": "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", + "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", "dev": true, "license": "MIT", "optional": true, "dependencies": { - "@emnapi/wasi-threads": "1.1.0", + "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" } }, "node_modules/@emnapi/runtime": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", - "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", "dev": true, "license": "MIT", "optional": true, @@ -1249,9 +1249,9 @@ } }, "node_modules/@emnapi/wasi-threads": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", - "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", "dev": true, "license": "MIT", "optional": true, @@ -1302,15 +1302,15 @@ } }, "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.21.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", + "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", "dev": true, "license": "Apache-2.0", "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", - "minimatch": "^3.1.2" + "minimatch": "^3.1.5" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1343,9 +1343,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.4.tgz", - "integrity": "sha512-4h4MVF8pmBsncB60r0wSJiIeUKTSD4m7FmTFThG8RHlsg9ajqckLm9OraguFGZE4vVdpiI1Q4+hFnisopmG6gQ==", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", + "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", "dev": true, "license": "MIT", "dependencies": { @@ -1356,7 +1356,7 @@ "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", - "minimatch": "^3.1.3", + "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" }, "engines": { @@ -1367,9 +1367,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.39.3", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.3.tgz", - "integrity": "sha512-1B1VkCq6FuUNlQvlBYb+1jDu/gV297TIs/OeiaSR9l1H27SVW55ONE1e1Vp16NqP683+xEGzxYtv4XCiDPaQiw==", + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", + "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==", "dev": true, "license": "MIT", "engines": { @@ -1404,16 +1404,16 @@ } }, "node_modules/@gerrit0/mini-shiki": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/@gerrit0/mini-shiki/-/mini-shiki-3.22.0.tgz", - "integrity": "sha512-jMpciqEVUBKE1QwU64S4saNMzpsSza6diNCk4MWAeCxO2+LFi2FIFmL2S0VDLzEJCxuvCbU783xi8Hp/gkM5CQ==", + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@gerrit0/mini-shiki/-/mini-shiki-3.23.0.tgz", + "integrity": "sha512-bEMORlG0cqdjVyCEuU0cDQbORWX+kYCeo0kV1lbxF5bt4r7SID2l9bqsxJEM0zndaxpOUT7riCyIVEuqq/Ynxg==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/engine-oniguruma": "^3.22.0", - "@shikijs/langs": "^3.22.0", - "@shikijs/themes": "^3.22.0", - "@shikijs/types": "^3.22.0", + "@shikijs/engine-oniguruma": "^3.23.0", + "@shikijs/langs": "^3.23.0", + "@shikijs/themes": "^3.23.0", + "@shikijs/types": "^3.23.0", "@shikijs/vscode-textmate": "^10.0.2" } }, @@ -1590,13 +1590,13 @@ } }, "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -1741,27 +1741,41 @@ } }, "node_modules/@jest/console": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-30.3.0.tgz", - "integrity": "sha512-PAwCvFJ4696XP2qZj+LAn1BWjZaJ6RjG6c7/lkMaUJnkyMS34ucuIsfqYvfskVNvUI27R/u4P1HMYFnlVXG/Ww==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-30.4.1.tgz", + "integrity": "sha512-v3bhyxUh9Hgmo5p6hAOXe14/R3ZxZDOsvHleh4B07z3m/x4/ngPUXEm9XwK4sF4u+f+P2ORb0Ge+MgpaqRMVDA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.3.0", + "@jest/types": "30.4.1", "@types/node": "*", "chalk": "^4.1.2", - "jest-message-util": "30.3.0", - "jest-util": "30.3.0", + "jest-message-util": "30.4.1", + "jest-util": "30.4.1", "slash": "^3.0.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, + "node_modules/@jest/console/node_modules/@jest/pattern": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.4.0.tgz", + "integrity": "sha512-RAWn3+f9u8BsHijKJ71uHcFp6vmyEt6VvoWXkl6hKF3qVIuWNmudVjg12DlBPGup/frIl5UcUlH5HfEuvHpEXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-regex-util": "30.4.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/@jest/console/node_modules/@jest/schemas": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", - "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.4.1.tgz", + "integrity": "sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==", "dev": true, "license": "MIT", "dependencies": { @@ -1772,14 +1786,14 @@ } }, "node_modules/@jest/console/node_modules/@jest/types": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.3.0.tgz", - "integrity": "sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.4.1.tgz", + "integrity": "sha512-f1x/vJXIfjOlEmejYpbkbgw1gOqpPECwMvMEtBqe47j7H2Hg8h8w3o3ikhSXq3MI15kg+oQ0exWO0uCtTNJLoQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/pattern": "30.0.1", - "@jest/schemas": "30.0.5", + "@jest/pattern": "30.4.0", + "@jest/schemas": "30.4.1", "@types/istanbul-lib-coverage": "^2.0.6", "@types/istanbul-reports": "^3.0.4", "@types/node": "*", @@ -1820,19 +1834,20 @@ } }, "node_modules/@jest/console/node_modules/jest-message-util": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.3.0.tgz", - "integrity": "sha512-Z/j4Bo+4ySJ+JPJN3b2Qbl9hDq3VrXmnjjGEWD/x0BCXeOXPTV1iZYYzl2X8c1MaCOL+ewMyNBcm88sboE6YWw==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.4.1.tgz", + "integrity": "sha512-kwCKIvq0MCW1HzLoGola9Te6JUdzgV0loyKJ3Qghrkz9i5/RRIHsL95BMQc2HBBhlBKC4j22K9p11TGHH8RBpQ==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@jest/types": "30.3.0", + "@jest/types": "30.4.1", "@types/stack-utils": "^2.0.3", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", + "jest-util": "30.4.1", "picomatch": "^4.0.3", - "pretty-format": "30.3.0", + "pretty-format": "30.4.1", "slash": "^3.0.0", "stack-utils": "^2.0.6" }, @@ -1840,14 +1855,24 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, + "node_modules/@jest/console/node_modules/jest-regex-util": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.4.0.tgz", + "integrity": "sha512-mWlvLviKIgIQ8VCuM1xRdD0TWp3zlzionlmDBjuXVBs+VkmXq6FgW9T4Emr7oGz/Rk6feDCGyiugolcQEyp3mg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/@jest/console/node_modules/jest-util": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.3.0.tgz", - "integrity": "sha512-/jZDa00a3Sz7rdyu55NLrQCIrbyIkbBxareejQI315f/i8HjYN+ZWsDLLpoQSiUIEIyZF/R8fDg3BmB8AtHttg==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.4.1.tgz", + "integrity": "sha512-vjQb1sACEiv13DKJMDToJpzVW0joCsIQrmbg0fi7CyOOt+g9jTuQl2A216pWRBYhOVt53XbL/2LbMKg1BECWOw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.3.0", + "@jest/types": "30.4.1", "@types/node": "*", "chalk": "^4.1.2", "ci-info": "^4.2.0", @@ -1859,53 +1884,55 @@ } }, "node_modules/@jest/console/node_modules/pretty-format": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz", - "integrity": "sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.4.1.tgz", + "integrity": "sha512-K6KiKMHTL4jjX4u3Kir2EW07nRfcqVTXIImx50wbjHQTcZPgg+gjVeNTIT3l3L1Rd4UefxfogquC9J37SoFyyw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/schemas": "30.0.5", + "@jest/schemas": "30.4.1", "ansi-styles": "^5.2.0", - "react-is": "^18.3.1" + "react-is-18": "npm:react-is@^18.3.1", + "react-is-19": "npm:react-is@^19.2.5" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/core": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-30.3.0.tgz", - "integrity": "sha512-U5mVPsBxLSO6xYbf+tgkymLx+iAhvZX43/xI1+ej2ZOPnPdkdO1CzDmFKh2mZBn2s4XZixszHeQnzp1gm/DIxw==", + "version": "30.4.2", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-30.4.2.tgz", + "integrity": "sha512-TZJA6cPJUFxoWhxaLo8t0VX/MZX2wPWr0uIDvLSHIvN4gu9h02vSzqI2kBADG1ExqQlC+cY09xKMSreivvrChQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "30.3.0", - "@jest/pattern": "30.0.1", - "@jest/reporters": "30.3.0", - "@jest/test-result": "30.3.0", - "@jest/transform": "30.3.0", - "@jest/types": "30.3.0", + "@jest/console": "30.4.1", + "@jest/pattern": "30.4.0", + "@jest/reporters": "30.4.1", + "@jest/test-result": "30.4.1", + "@jest/transform": "30.4.1", + "@jest/types": "30.4.1", "@types/node": "*", "ansi-escapes": "^4.3.2", "chalk": "^4.1.2", "ci-info": "^4.2.0", "exit-x": "^0.2.2", + "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.11", - "jest-changed-files": "30.3.0", - "jest-config": "30.3.0", - "jest-haste-map": "30.3.0", - "jest-message-util": "30.3.0", - "jest-regex-util": "30.0.1", - "jest-resolve": "30.3.0", - "jest-resolve-dependencies": "30.3.0", - "jest-runner": "30.3.0", - "jest-runtime": "30.3.0", - "jest-snapshot": "30.3.0", - "jest-util": "30.3.0", - "jest-validate": "30.3.0", - "jest-watcher": "30.3.0", - "pretty-format": "30.3.0", + "jest-changed-files": "30.4.1", + "jest-config": "30.4.2", + "jest-haste-map": "30.4.1", + "jest-message-util": "30.4.1", + "jest-regex-util": "30.4.0", + "jest-resolve": "30.4.1", + "jest-resolve-dependencies": "30.4.2", + "jest-runner": "30.4.2", + "jest-runtime": "30.4.2", + "jest-snapshot": "30.4.1", + "jest-util": "30.4.1", + "jest-validate": "30.4.1", + "jest-watcher": "30.4.1", + "pretty-format": "30.4.1", "slash": "^3.0.0" }, "engines": { @@ -1920,10 +1947,24 @@ } } }, + "node_modules/@jest/core/node_modules/@jest/pattern": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.4.0.tgz", + "integrity": "sha512-RAWn3+f9u8BsHijKJ71uHcFp6vmyEt6VvoWXkl6hKF3qVIuWNmudVjg12DlBPGup/frIl5UcUlH5HfEuvHpEXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-regex-util": "30.4.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/@jest/core/node_modules/@jest/schemas": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", - "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.4.1.tgz", + "integrity": "sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==", "dev": true, "license": "MIT", "dependencies": { @@ -1934,14 +1975,14 @@ } }, "node_modules/@jest/core/node_modules/@jest/types": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.3.0.tgz", - "integrity": "sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.4.1.tgz", + "integrity": "sha512-f1x/vJXIfjOlEmejYpbkbgw1gOqpPECwMvMEtBqe47j7H2Hg8h8w3o3ikhSXq3MI15kg+oQ0exWO0uCtTNJLoQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/pattern": "30.0.1", - "@jest/schemas": "30.0.5", + "@jest/pattern": "30.4.0", + "@jest/schemas": "30.4.1", "@types/istanbul-lib-coverage": "^2.0.6", "@types/istanbul-reports": "^3.0.4", "@types/node": "*", @@ -1982,19 +2023,20 @@ } }, "node_modules/@jest/core/node_modules/jest-message-util": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.3.0.tgz", - "integrity": "sha512-Z/j4Bo+4ySJ+JPJN3b2Qbl9hDq3VrXmnjjGEWD/x0BCXeOXPTV1iZYYzl2X8c1MaCOL+ewMyNBcm88sboE6YWw==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.4.1.tgz", + "integrity": "sha512-kwCKIvq0MCW1HzLoGola9Te6JUdzgV0loyKJ3Qghrkz9i5/RRIHsL95BMQc2HBBhlBKC4j22K9p11TGHH8RBpQ==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@jest/types": "30.3.0", + "@jest/types": "30.4.1", "@types/stack-utils": "^2.0.3", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", + "jest-util": "30.4.1", "picomatch": "^4.0.3", - "pretty-format": "30.3.0", + "pretty-format": "30.4.1", "slash": "^3.0.0", "stack-utils": "^2.0.6" }, @@ -2002,14 +2044,24 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, + "node_modules/@jest/core/node_modules/jest-regex-util": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.4.0.tgz", + "integrity": "sha512-mWlvLviKIgIQ8VCuM1xRdD0TWp3zlzionlmDBjuXVBs+VkmXq6FgW9T4Emr7oGz/Rk6feDCGyiugolcQEyp3mg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/@jest/core/node_modules/jest-util": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.3.0.tgz", - "integrity": "sha512-/jZDa00a3Sz7rdyu55NLrQCIrbyIkbBxareejQI315f/i8HjYN+ZWsDLLpoQSiUIEIyZF/R8fDg3BmB8AtHttg==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.4.1.tgz", + "integrity": "sha512-vjQb1sACEiv13DKJMDToJpzVW0joCsIQrmbg0fi7CyOOt+g9jTuQl2A216pWRBYhOVt53XbL/2LbMKg1BECWOw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.3.0", + "@jest/types": "30.4.1", "@types/node": "*", "chalk": "^4.1.2", "ci-info": "^4.2.0", @@ -2021,40 +2073,65 @@ } }, "node_modules/@jest/core/node_modules/pretty-format": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz", - "integrity": "sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.4.1.tgz", + "integrity": "sha512-K6KiKMHTL4jjX4u3Kir2EW07nRfcqVTXIImx50wbjHQTcZPgg+gjVeNTIT3l3L1Rd4UefxfogquC9J37SoFyyw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/schemas": "30.0.5", + "@jest/schemas": "30.4.1", "ansi-styles": "^5.2.0", - "react-is": "^18.3.1" + "react-is-18": "npm:react-is@^18.3.1", + "react-is-19": "npm:react-is@^19.2.5" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, + "node_modules/@jest/diff-sequences": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.4.0.tgz", + "integrity": "sha512-zOpzlfUs45l6u7jm39qr87JCHUDsaeCtvL+kQe/Vn9jSnRB4/5IPXISm0h9I1vZW/o00Kn4UTJ2MOlhnUGwv3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/@jest/environment": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.3.0.tgz", - "integrity": "sha512-SlLSF4Be735yQXyh2+mctBOzNDx5s5uLv88/j8Qn1wH679PDcwy67+YdADn8NJnGjzlXtN62asGH/T4vWOkfaw==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.4.1.tgz", + "integrity": "sha512-AK9yNRqgKxiabqMoe4oW+3/TSSeV8vkdC7BGaxZdU0AFXfOpofTLqdru2GXKZghP3sdgwE9XXpnVwfZ8JnFV4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "30.4.1", + "@jest/types": "30.4.1", + "@types/node": "*", + "jest-mock": "30.4.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/environment/node_modules/@jest/pattern": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.4.0.tgz", + "integrity": "sha512-RAWn3+f9u8BsHijKJ71uHcFp6vmyEt6VvoWXkl6hKF3qVIuWNmudVjg12DlBPGup/frIl5UcUlH5HfEuvHpEXg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/fake-timers": "30.3.0", - "@jest/types": "30.3.0", "@types/node": "*", - "jest-mock": "30.3.0" + "jest-regex-util": "30.4.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/environment/node_modules/@jest/schemas": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", - "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.4.1.tgz", + "integrity": "sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==", "dev": true, "license": "MIT", "dependencies": { @@ -2065,14 +2142,14 @@ } }, "node_modules/@jest/environment/node_modules/@jest/types": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.3.0.tgz", - "integrity": "sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.4.1.tgz", + "integrity": "sha512-f1x/vJXIfjOlEmejYpbkbgw1gOqpPECwMvMEtBqe47j7H2Hg8h8w3o3ikhSXq3MI15kg+oQ0exWO0uCtTNJLoQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/pattern": "30.0.1", - "@jest/schemas": "30.0.5", + "@jest/pattern": "30.4.0", + "@jest/schemas": "30.4.1", "@types/istanbul-lib-coverage": "^2.0.6", "@types/istanbul-reports": "^3.0.4", "@types/node": "*", @@ -2083,15 +2160,74 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, + "node_modules/@jest/environment/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", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/environment/node_modules/jest-mock": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.4.1.tgz", + "integrity": "sha512-/i8SVb8/NSB7RfNi8gfqu8gxLV23KaL5EpAttyb9iz8qWRIqXRLflycz/32wXsYkOnaUlx8NAKnJYtpsmXUmfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.4.1", + "@types/node": "*", + "jest-util": "30.4.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/environment/node_modules/jest-regex-util": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.4.0.tgz", + "integrity": "sha512-mWlvLviKIgIQ8VCuM1xRdD0TWp3zlzionlmDBjuXVBs+VkmXq6FgW9T4Emr7oGz/Rk6feDCGyiugolcQEyp3mg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/environment/node_modules/jest-util": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.4.1.tgz", + "integrity": "sha512-vjQb1sACEiv13DKJMDToJpzVW0joCsIQrmbg0fi7CyOOt+g9jTuQl2A216pWRBYhOVt53XbL/2LbMKg1BECWOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.4.1", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.3" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/@jest/expect": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-30.3.0.tgz", - "integrity": "sha512-76Nlh4xJxk2D/9URCn3wFi98d2hb19uWE1idLsTt2ywhvdOldbw3S570hBgn25P4ICUZ/cBjybrBex2g17IDbg==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-30.4.1.tgz", + "integrity": "sha512-ginrj6TMgh2GshLUGCjO94Ptx9HhdZA/I6A9iUfyeLKFtdAjnKzHDgzgP9HYQgbxM1lbXScQ2eUBz2lGeVDPWA==", "dev": true, "license": "MIT", "dependencies": { - "expect": "30.3.0", - "jest-snapshot": "30.3.0" + "expect": "30.4.1", + "jest-snapshot": "30.4.1" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -2110,33 +2246,37 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/expect/node_modules/@jest/diff-sequences": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.3.0.tgz", - "integrity": "sha512-cG51MVnLq1ecVUaQ3fr6YuuAOitHK1S4WUJHnsPFE/quQr33ADUx1FfrTCpMCRxvy0Yr9BThKpDjSlcTi91tMA==", + "node_modules/@jest/expect/node_modules/@jest/expect-utils": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.4.1.tgz", + "integrity": "sha512-ZBn5CglH8fBsQsvs4VWNzD4aWfUYks+IdOOQU3MEK71ol/BcVm+P+rtb1KpiFBpSWSCE27uOahyyf1vfqOVbcQ==", "dev": true, "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0" + }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/expect/node_modules/@jest/expect-utils": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.3.0.tgz", - "integrity": "sha512-j0+W5iQQ8hBh7tHZkTQv3q2Fh/M7Je72cIsYqC4OaktgtO7v1So9UTjp6uPBHIaB6beoF/RRsCgMJKvti0wADA==", + "node_modules/@jest/expect/node_modules/@jest/pattern": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.4.0.tgz", + "integrity": "sha512-RAWn3+f9u8BsHijKJ71uHcFp6vmyEt6VvoWXkl6hKF3qVIuWNmudVjg12DlBPGup/frIl5UcUlH5HfEuvHpEXg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/get-type": "30.1.0" + "@types/node": "*", + "jest-regex-util": "30.4.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/expect/node_modules/@jest/schemas": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", - "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.4.1.tgz", + "integrity": "sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==", "dev": true, "license": "MIT", "dependencies": { @@ -2147,14 +2287,14 @@ } }, "node_modules/@jest/expect/node_modules/@jest/types": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.3.0.tgz", - "integrity": "sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.4.1.tgz", + "integrity": "sha512-f1x/vJXIfjOlEmejYpbkbgw1gOqpPECwMvMEtBqe47j7H2Hg8h8w3o3ikhSXq3MI15kg+oQ0exWO0uCtTNJLoQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/pattern": "30.0.1", - "@jest/schemas": "30.0.5", + "@jest/pattern": "30.4.0", + "@jest/schemas": "30.4.1", "@types/istanbul-lib-coverage": "^2.0.6", "@types/istanbul-reports": "^3.0.4", "@types/node": "*", @@ -2195,69 +2335,70 @@ } }, "node_modules/@jest/expect/node_modules/expect": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-30.3.0.tgz", - "integrity": "sha512-1zQrciTiQfRdo7qJM1uG4navm8DayFa2TgCSRlzUyNkhcJ6XUZF3hjnpkyr3VhAqPH7i/9GkG7Tv5abz6fqz0Q==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-30.4.1.tgz", + "integrity": "sha512-PMARsyh/JtqC20HoGqlFcIlQAyqUtW4PlI1rup1uhYJtKuwAjbvWi3GQMAn+STdHum/dk8xrKfUM1+5SAwpolA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/expect-utils": "30.3.0", + "@jest/expect-utils": "30.4.1", "@jest/get-type": "30.1.0", - "jest-matcher-utils": "30.3.0", - "jest-message-util": "30.3.0", - "jest-mock": "30.3.0", - "jest-util": "30.3.0" + "jest-matcher-utils": "30.4.1", + "jest-message-util": "30.4.1", + "jest-mock": "30.4.1", + "jest-util": "30.4.1" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/expect/node_modules/jest-diff": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.3.0.tgz", - "integrity": "sha512-n3q4PDQjS4LrKxfWB3Z5KNk1XjXtZTBwQp71OP0Jo03Z6V60x++K5L8k6ZrW8MY8pOFylZvHM0zsjS1RqlHJZQ==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.4.1.tgz", + "integrity": "sha512-CRpFK0RtLriVDGcPPAnR6HMVI8bSR2jnUIgralhauzYQZIb4RH9AtEInTuQr65LmmGggGcRT6HIASxwqsVsmlA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/diff-sequences": "30.3.0", + "@jest/diff-sequences": "30.4.0", "@jest/get-type": "30.1.0", "chalk": "^4.1.2", - "pretty-format": "30.3.0" + "pretty-format": "30.4.1" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/expect/node_modules/jest-matcher-utils": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.3.0.tgz", - "integrity": "sha512-HEtc9uFQgaUHkC7nLSlQL3Tph4Pjxt/yiPvkIrrDCt9jhoLIgxaubo1G+CFOnmHYMxHwwdaSN7mkIFs6ZK8OhA==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.4.1.tgz", + "integrity": "sha512-zvYfX5CaeEkFrrLS9suWe9rvJrm9J1Iv3ua8kIBv9GEPzcnsfBf0bob37la7s67fs0nlBC3EuvkOLnXQKxtx4A==", "dev": true, "license": "MIT", "dependencies": { "@jest/get-type": "30.1.0", "chalk": "^4.1.2", - "jest-diff": "30.3.0", - "pretty-format": "30.3.0" + "jest-diff": "30.4.1", + "pretty-format": "30.4.1" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/expect/node_modules/jest-message-util": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.3.0.tgz", - "integrity": "sha512-Z/j4Bo+4ySJ+JPJN3b2Qbl9hDq3VrXmnjjGEWD/x0BCXeOXPTV1iZYYzl2X8c1MaCOL+ewMyNBcm88sboE6YWw==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.4.1.tgz", + "integrity": "sha512-kwCKIvq0MCW1HzLoGola9Te6JUdzgV0loyKJ3Qghrkz9i5/RRIHsL95BMQc2HBBhlBKC4j22K9p11TGHH8RBpQ==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@jest/types": "30.3.0", + "@jest/types": "30.4.1", "@types/stack-utils": "^2.0.3", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", + "jest-util": "30.4.1", "picomatch": "^4.0.3", - "pretty-format": "30.3.0", + "pretty-format": "30.4.1", "slash": "^3.0.0", "stack-utils": "^2.0.6" }, @@ -2265,14 +2406,39 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, + "node_modules/@jest/expect/node_modules/jest-mock": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.4.1.tgz", + "integrity": "sha512-/i8SVb8/NSB7RfNi8gfqu8gxLV23KaL5EpAttyb9iz8qWRIqXRLflycz/32wXsYkOnaUlx8NAKnJYtpsmXUmfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.4.1", + "@types/node": "*", + "jest-util": "30.4.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/expect/node_modules/jest-regex-util": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.4.0.tgz", + "integrity": "sha512-mWlvLviKIgIQ8VCuM1xRdD0TWp3zlzionlmDBjuXVBs+VkmXq6FgW9T4Emr7oGz/Rk6feDCGyiugolcQEyp3mg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/@jest/expect/node_modules/jest-util": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.3.0.tgz", - "integrity": "sha512-/jZDa00a3Sz7rdyu55NLrQCIrbyIkbBxareejQI315f/i8HjYN+ZWsDLLpoQSiUIEIyZF/R8fDg3BmB8AtHttg==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.4.1.tgz", + "integrity": "sha512-vjQb1sACEiv13DKJMDToJpzVW0joCsIQrmbg0fi7CyOOt+g9jTuQl2A216pWRBYhOVt53XbL/2LbMKg1BECWOw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.3.0", + "@jest/types": "30.4.1", "@types/node": "*", "chalk": "^4.1.2", "ci-info": "^4.2.0", @@ -2284,42 +2450,57 @@ } }, "node_modules/@jest/expect/node_modules/pretty-format": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz", - "integrity": "sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.4.1.tgz", + "integrity": "sha512-K6KiKMHTL4jjX4u3Kir2EW07nRfcqVTXIImx50wbjHQTcZPgg+gjVeNTIT3l3L1Rd4UefxfogquC9J37SoFyyw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/schemas": "30.0.5", + "@jest/schemas": "30.4.1", "ansi-styles": "^5.2.0", - "react-is": "^18.3.1" + "react-is-18": "npm:react-is@^18.3.1", + "react-is-19": "npm:react-is@^19.2.5" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/fake-timers": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.3.0.tgz", - "integrity": "sha512-WUQDs8SOP9URStX1DzhD425CqbN/HxUYCTwVrT8sTVBfMvFqYt/s61EK5T05qnHu0po6RitXIvP9otZxYDzTGQ==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.4.1.tgz", + "integrity": "sha512-iW5umdmfPeWzehrVhugFQZqCchSCud5S1l2YT0O9ZhjRR0ExclANDZkiSBwzqtnlOn0J1JXvO+HZ6rkuyOVOgQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.3.0", - "@sinonjs/fake-timers": "^15.0.0", + "@jest/types": "30.4.1", + "@sinonjs/fake-timers": "^15.4.0", "@types/node": "*", - "jest-message-util": "30.3.0", - "jest-mock": "30.3.0", - "jest-util": "30.3.0" + "jest-message-util": "30.4.1", + "jest-mock": "30.4.1", + "jest-util": "30.4.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/fake-timers/node_modules/@jest/pattern": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.4.0.tgz", + "integrity": "sha512-RAWn3+f9u8BsHijKJ71uHcFp6vmyEt6VvoWXkl6hKF3qVIuWNmudVjg12DlBPGup/frIl5UcUlH5HfEuvHpEXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-regex-util": "30.4.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/fake-timers/node_modules/@jest/schemas": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", - "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.4.1.tgz", + "integrity": "sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==", "dev": true, "license": "MIT", "dependencies": { @@ -2330,14 +2511,14 @@ } }, "node_modules/@jest/fake-timers/node_modules/@jest/types": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.3.0.tgz", - "integrity": "sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.4.1.tgz", + "integrity": "sha512-f1x/vJXIfjOlEmejYpbkbgw1gOqpPECwMvMEtBqe47j7H2Hg8h8w3o3ikhSXq3MI15kg+oQ0exWO0uCtTNJLoQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/pattern": "30.0.1", - "@jest/schemas": "30.0.5", + "@jest/pattern": "30.4.0", + "@jest/schemas": "30.4.1", "@types/istanbul-lib-coverage": "^2.0.6", "@types/istanbul-reports": "^3.0.4", "@types/node": "*", @@ -2378,19 +2559,20 @@ } }, "node_modules/@jest/fake-timers/node_modules/jest-message-util": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.3.0.tgz", - "integrity": "sha512-Z/j4Bo+4ySJ+JPJN3b2Qbl9hDq3VrXmnjjGEWD/x0BCXeOXPTV1iZYYzl2X8c1MaCOL+ewMyNBcm88sboE6YWw==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.4.1.tgz", + "integrity": "sha512-kwCKIvq0MCW1HzLoGola9Te6JUdzgV0loyKJ3Qghrkz9i5/RRIHsL95BMQc2HBBhlBKC4j22K9p11TGHH8RBpQ==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@jest/types": "30.3.0", + "@jest/types": "30.4.1", "@types/stack-utils": "^2.0.3", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", + "jest-util": "30.4.1", "picomatch": "^4.0.3", - "pretty-format": "30.3.0", + "pretty-format": "30.4.1", "slash": "^3.0.0", "stack-utils": "^2.0.6" }, @@ -2398,14 +2580,39 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, + "node_modules/@jest/fake-timers/node_modules/jest-mock": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.4.1.tgz", + "integrity": "sha512-/i8SVb8/NSB7RfNi8gfqu8gxLV23KaL5EpAttyb9iz8qWRIqXRLflycz/32wXsYkOnaUlx8NAKnJYtpsmXUmfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.4.1", + "@types/node": "*", + "jest-util": "30.4.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/fake-timers/node_modules/jest-regex-util": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.4.0.tgz", + "integrity": "sha512-mWlvLviKIgIQ8VCuM1xRdD0TWp3zlzionlmDBjuXVBs+VkmXq6FgW9T4Emr7oGz/Rk6feDCGyiugolcQEyp3mg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/@jest/fake-timers/node_modules/jest-util": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.3.0.tgz", - "integrity": "sha512-/jZDa00a3Sz7rdyu55NLrQCIrbyIkbBxareejQI315f/i8HjYN+ZWsDLLpoQSiUIEIyZF/R8fDg3BmB8AtHttg==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.4.1.tgz", + "integrity": "sha512-vjQb1sACEiv13DKJMDToJpzVW0joCsIQrmbg0fi7CyOOt+g9jTuQl2A216pWRBYhOVt53XbL/2LbMKg1BECWOw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.3.0", + "@jest/types": "30.4.1", "@types/node": "*", "chalk": "^4.1.2", "ci-info": "^4.2.0", @@ -2417,15 +2624,16 @@ } }, "node_modules/@jest/fake-timers/node_modules/pretty-format": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz", - "integrity": "sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.4.1.tgz", + "integrity": "sha512-K6KiKMHTL4jjX4u3Kir2EW07nRfcqVTXIImx50wbjHQTcZPgg+gjVeNTIT3l3L1Rd4UefxfogquC9J37SoFyyw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/schemas": "30.0.5", + "@jest/schemas": "30.4.1", "ansi-styles": "^5.2.0", - "react-is": "^18.3.1" + "react-is-18": "npm:react-is@^18.3.1", + "react-is-19": "npm:react-is@^19.2.5" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -2442,25 +2650,39 @@ } }, "node_modules/@jest/globals": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-30.3.0.tgz", - "integrity": "sha512-+owLCBBdfpgL3HU+BD5etr1SvbXpSitJK0is1kiYjJxAAJggYMRQz5hSdd5pq1sSggfxPbw2ld71pt4x5wwViA==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-30.4.1.tgz", + "integrity": "sha512-ZbuY4cmXC8DkxYjfvT2DbcHWL2T6vmsMhXCDcmTB2T0y0gaezBI77ufq5ZAIdcRkYZ7NEQEDg1xFeKbxUJ5v5Q==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "30.3.0", - "@jest/expect": "30.3.0", - "@jest/types": "30.3.0", - "jest-mock": "30.3.0" + "@jest/environment": "30.4.1", + "@jest/expect": "30.4.1", + "@jest/types": "30.4.1", + "jest-mock": "30.4.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/globals/node_modules/@jest/pattern": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.4.0.tgz", + "integrity": "sha512-RAWn3+f9u8BsHijKJ71uHcFp6vmyEt6VvoWXkl6hKF3qVIuWNmudVjg12DlBPGup/frIl5UcUlH5HfEuvHpEXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-regex-util": "30.4.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/globals/node_modules/@jest/schemas": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", - "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.4.1.tgz", + "integrity": "sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==", "dev": true, "license": "MIT", "dependencies": { @@ -2471,14 +2693,14 @@ } }, "node_modules/@jest/globals/node_modules/@jest/types": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.3.0.tgz", - "integrity": "sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.4.1.tgz", + "integrity": "sha512-f1x/vJXIfjOlEmejYpbkbgw1gOqpPECwMvMEtBqe47j7H2Hg8h8w3o3ikhSXq3MI15kg+oQ0exWO0uCtTNJLoQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/pattern": "30.0.1", - "@jest/schemas": "30.0.5", + "@jest/pattern": "30.4.0", + "@jest/schemas": "30.4.1", "@types/istanbul-lib-coverage": "^2.0.6", "@types/istanbul-reports": "^3.0.4", "@types/node": "*", @@ -2489,6 +2711,65 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, + "node_modules/@jest/globals/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", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/globals/node_modules/jest-mock": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.4.1.tgz", + "integrity": "sha512-/i8SVb8/NSB7RfNi8gfqu8gxLV23KaL5EpAttyb9iz8qWRIqXRLflycz/32wXsYkOnaUlx8NAKnJYtpsmXUmfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.4.1", + "@types/node": "*", + "jest-util": "30.4.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/globals/node_modules/jest-regex-util": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.4.0.tgz", + "integrity": "sha512-mWlvLviKIgIQ8VCuM1xRdD0TWp3zlzionlmDBjuXVBs+VkmXq6FgW9T4Emr7oGz/Rk6feDCGyiugolcQEyp3mg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/globals/node_modules/jest-util": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.4.1.tgz", + "integrity": "sha512-vjQb1sACEiv13DKJMDToJpzVW0joCsIQrmbg0fi7CyOOt+g9jTuQl2A216pWRBYhOVt53XbL/2LbMKg1BECWOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.4.1", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.3" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/@jest/pattern": { "version": "30.0.1", "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.0.1.tgz", @@ -2504,17 +2785,17 @@ } }, "node_modules/@jest/reporters": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.3.0.tgz", - "integrity": "sha512-a09z89S+PkQnL055bVj8+pe2Caed2PBOaczHcXCykW5ngxX9EWx/1uAwncxc/HiU0oZqfwseMjyhxgRjS49qPw==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.4.1.tgz", + "integrity": "sha512-/SnkPCzEQpUaBH81kjdEdDdo2WZl5hxw+BmLDGWjRkm8o7XlhjwsU36cqwe5PGBE5WYpBvDzRSdXx9rbGuJtNA==", "dev": true, "license": "MIT", "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "30.3.0", - "@jest/test-result": "30.3.0", - "@jest/transform": "30.3.0", - "@jest/types": "30.3.0", + "@jest/console": "30.4.1", + "@jest/test-result": "30.4.1", + "@jest/transform": "30.4.1", + "@jest/types": "30.4.1", "@jridgewell/trace-mapping": "^0.3.25", "@types/node": "*", "chalk": "^4.1.2", @@ -2527,9 +2808,9 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^5.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "30.3.0", - "jest-util": "30.3.0", - "jest-worker": "30.3.0", + "jest-message-util": "30.4.1", + "jest-util": "30.4.1", + "jest-worker": "30.4.1", "slash": "^3.0.0", "string-length": "^4.0.2", "v8-to-istanbul": "^9.0.1" @@ -2546,10 +2827,24 @@ } } }, + "node_modules/@jest/reporters/node_modules/@jest/pattern": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.4.0.tgz", + "integrity": "sha512-RAWn3+f9u8BsHijKJ71uHcFp6vmyEt6VvoWXkl6hKF3qVIuWNmudVjg12DlBPGup/frIl5UcUlH5HfEuvHpEXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-regex-util": "30.4.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/@jest/reporters/node_modules/@jest/schemas": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", - "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.4.1.tgz", + "integrity": "sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==", "dev": true, "license": "MIT", "dependencies": { @@ -2560,14 +2855,14 @@ } }, "node_modules/@jest/reporters/node_modules/@jest/types": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.3.0.tgz", - "integrity": "sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.4.1.tgz", + "integrity": "sha512-f1x/vJXIfjOlEmejYpbkbgw1gOqpPECwMvMEtBqe47j7H2Hg8h8w3o3ikhSXq3MI15kg+oQ0exWO0uCtTNJLoQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/pattern": "30.0.1", - "@jest/schemas": "30.0.5", + "@jest/pattern": "30.4.0", + "@jest/schemas": "30.4.1", "@types/istanbul-lib-coverage": "^2.0.6", "@types/istanbul-reports": "^3.0.4", "@types/node": "*", @@ -2592,9 +2887,9 @@ } }, "node_modules/@jest/reporters/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", "dev": true, "license": "MIT", "dependencies": { @@ -2640,19 +2935,20 @@ } }, "node_modules/@jest/reporters/node_modules/jest-message-util": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.3.0.tgz", - "integrity": "sha512-Z/j4Bo+4ySJ+JPJN3b2Qbl9hDq3VrXmnjjGEWD/x0BCXeOXPTV1iZYYzl2X8c1MaCOL+ewMyNBcm88sboE6YWw==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.4.1.tgz", + "integrity": "sha512-kwCKIvq0MCW1HzLoGola9Te6JUdzgV0loyKJ3Qghrkz9i5/RRIHsL95BMQc2HBBhlBKC4j22K9p11TGHH8RBpQ==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@jest/types": "30.3.0", + "@jest/types": "30.4.1", "@types/stack-utils": "^2.0.3", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", + "jest-util": "30.4.1", "picomatch": "^4.0.3", - "pretty-format": "30.3.0", + "pretty-format": "30.4.1", "slash": "^3.0.0", "stack-utils": "^2.0.6" }, @@ -2660,14 +2956,24 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, + "node_modules/@jest/reporters/node_modules/jest-regex-util": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.4.0.tgz", + "integrity": "sha512-mWlvLviKIgIQ8VCuM1xRdD0TWp3zlzionlmDBjuXVBs+VkmXq6FgW9T4Emr7oGz/Rk6feDCGyiugolcQEyp3mg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/@jest/reporters/node_modules/jest-util": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.3.0.tgz", - "integrity": "sha512-/jZDa00a3Sz7rdyu55NLrQCIrbyIkbBxareejQI315f/i8HjYN+ZWsDLLpoQSiUIEIyZF/R8fDg3BmB8AtHttg==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.4.1.tgz", + "integrity": "sha512-vjQb1sACEiv13DKJMDToJpzVW0joCsIQrmbg0fi7CyOOt+g9jTuQl2A216pWRBYhOVt53XbL/2LbMKg1BECWOw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.3.0", + "@jest/types": "30.4.1", "@types/node": "*", "chalk": "^4.1.2", "ci-info": "^4.2.0", @@ -2695,15 +3001,16 @@ } }, "node_modules/@jest/reporters/node_modules/pretty-format": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz", - "integrity": "sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.4.1.tgz", + "integrity": "sha512-K6KiKMHTL4jjX4u3Kir2EW07nRfcqVTXIImx50wbjHQTcZPgg+gjVeNTIT3l3L1Rd4UefxfogquC9J37SoFyyw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/schemas": "30.0.5", + "@jest/schemas": "30.4.1", "ansi-styles": "^5.2.0", - "react-is": "^18.3.1" + "react-is-18": "npm:react-is@^18.3.1", + "react-is-19": "npm:react-is@^19.2.5" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -2729,6 +3036,78 @@ "dev": true, "license": "MIT" }, + "node_modules/@jest/snapshot-utils": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/snapshot-utils/-/snapshot-utils-30.4.1.tgz", + "integrity": "sha512-ObY4ljvQ95mt6iwKtVLetR/4yXiAgl3H4nJxhztr0MTjrN97TwDYrnCp/kF60Ec9HdhkWTHSu+Hg05aXfngpOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.4.1", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "natural-compare": "^1.4.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/snapshot-utils/node_modules/@jest/pattern": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.4.0.tgz", + "integrity": "sha512-RAWn3+f9u8BsHijKJ71uHcFp6vmyEt6VvoWXkl6hKF3qVIuWNmudVjg12DlBPGup/frIl5UcUlH5HfEuvHpEXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-regex-util": "30.4.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/snapshot-utils/node_modules/@jest/schemas": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.4.1.tgz", + "integrity": "sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/snapshot-utils/node_modules/@jest/types": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.4.1.tgz", + "integrity": "sha512-f1x/vJXIfjOlEmejYpbkbgw1gOqpPECwMvMEtBqe47j7H2Hg8h8w3o3ikhSXq3MI15kg+oQ0exWO0uCtTNJLoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/pattern": "30.4.0", + "@jest/schemas": "30.4.1", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/snapshot-utils/node_modules/jest-regex-util": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.4.0.tgz", + "integrity": "sha512-mWlvLviKIgIQ8VCuM1xRdD0TWp3zlzionlmDBjuXVBs+VkmXq6FgW9T4Emr7oGz/Rk6feDCGyiugolcQEyp3mg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/@jest/source-map": { "version": "30.0.1", "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-30.0.1.tgz", @@ -2745,14 +3124,14 @@ } }, "node_modules/@jest/test-result": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.3.0.tgz", - "integrity": "sha512-e/52nJGuD74AKTSe0P4y5wFRlaXP0qmrS17rqOMHeSwm278VyNyXE3gFO/4DTGF9w+65ra3lo3VKj0LBrzmgdQ==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.4.1.tgz", + "integrity": "sha512-/ZG7pgEiOmmWkN9TplKbOu4id2N5lh7FHwRwlkgBVAzGdRH+OkkQ8wX/kIxg4zmd3ZQvAL1RwL2yWsvNYYECTw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "30.3.0", - "@jest/types": "30.3.0", + "@jest/console": "30.4.1", + "@jest/types": "30.4.1", "@types/istanbul-lib-coverage": "^2.0.6", "collect-v8-coverage": "^1.0.2" }, @@ -2760,10 +3139,24 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, + "node_modules/@jest/test-result/node_modules/@jest/pattern": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.4.0.tgz", + "integrity": "sha512-RAWn3+f9u8BsHijKJ71uHcFp6vmyEt6VvoWXkl6hKF3qVIuWNmudVjg12DlBPGup/frIl5UcUlH5HfEuvHpEXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-regex-util": "30.4.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/@jest/test-result/node_modules/@jest/schemas": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", - "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.4.1.tgz", + "integrity": "sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==", "dev": true, "license": "MIT", "dependencies": { @@ -2774,14 +3167,14 @@ } }, "node_modules/@jest/test-result/node_modules/@jest/types": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.3.0.tgz", - "integrity": "sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.4.1.tgz", + "integrity": "sha512-f1x/vJXIfjOlEmejYpbkbgw1gOqpPECwMvMEtBqe47j7H2Hg8h8w3o3ikhSXq3MI15kg+oQ0exWO0uCtTNJLoQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/pattern": "30.0.1", - "@jest/schemas": "30.0.5", + "@jest/pattern": "30.4.0", + "@jest/schemas": "30.4.1", "@types/istanbul-lib-coverage": "^2.0.6", "@types/istanbul-reports": "^3.0.4", "@types/node": "*", @@ -2792,16 +3185,26 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, + "node_modules/@jest/test-result/node_modules/jest-regex-util": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.4.0.tgz", + "integrity": "sha512-mWlvLviKIgIQ8VCuM1xRdD0TWp3zlzionlmDBjuXVBs+VkmXq6FgW9T4Emr7oGz/Rk6feDCGyiugolcQEyp3mg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/@jest/test-sequencer": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.3.0.tgz", - "integrity": "sha512-dgbWy9b8QDlQeRZcv7LNF+/jFiiYHTKho1xirauZ7kVwY7avjFF6uTT0RqlgudB5OuIPagFdVtfFMosjVbk1eA==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.4.1.tgz", + "integrity": "sha512-PeYE+4td5rKjoRPxztObrXU+H8hsjZfxKMXOcmrr34JerSyB/ROOxbbicz8B7A5j9R9VayDnVPvBmedqCsFCdw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/test-result": "30.3.0", + "@jest/test-result": "30.4.1", "graceful-fs": "^4.2.11", - "jest-haste-map": "30.3.0", + "jest-haste-map": "30.4.1", "slash": "^3.0.0" }, "engines": { @@ -2809,23 +3212,23 @@ } }, "node_modules/@jest/transform": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-30.3.0.tgz", - "integrity": "sha512-TLKY33fSLVd/lKB2YI1pH69ijyUblO/BQvCj566YvnwuzoTNr648iE0j22vRvVNk2HsPwByPxATg3MleS3gf5A==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-30.4.1.tgz", + "integrity": "sha512-Wz0LyktlTvRefoymh+n64hQ84KNXsRGcwdoZ8CSa0Ea+fgYcHZlnk+hDP7v2MS7il2bQ5uTEIxf4/NNfhMN4KQ==", "dev": true, "license": "MIT", "dependencies": { "@babel/core": "^7.27.4", - "@jest/types": "30.3.0", + "@jest/types": "30.4.1", "@jridgewell/trace-mapping": "^0.3.25", "babel-plugin-istanbul": "^7.0.1", "chalk": "^4.1.2", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.11", - "jest-haste-map": "30.3.0", - "jest-regex-util": "30.0.1", - "jest-util": "30.3.0", + "jest-haste-map": "30.4.1", + "jest-regex-util": "30.4.0", + "jest-util": "30.4.1", "pirates": "^4.0.7", "slash": "^3.0.0", "write-file-atomic": "^5.0.1" @@ -2834,10 +3237,24 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, + "node_modules/@jest/transform/node_modules/@jest/pattern": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.4.0.tgz", + "integrity": "sha512-RAWn3+f9u8BsHijKJ71uHcFp6vmyEt6VvoWXkl6hKF3qVIuWNmudVjg12DlBPGup/frIl5UcUlH5HfEuvHpEXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-regex-util": "30.4.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/@jest/transform/node_modules/@jest/schemas": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", - "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.4.1.tgz", + "integrity": "sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==", "dev": true, "license": "MIT", "dependencies": { @@ -2848,14 +3265,14 @@ } }, "node_modules/@jest/transform/node_modules/@jest/types": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.3.0.tgz", - "integrity": "sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.4.1.tgz", + "integrity": "sha512-f1x/vJXIfjOlEmejYpbkbgw1gOqpPECwMvMEtBqe47j7H2Hg8h8w3o3ikhSXq3MI15kg+oQ0exWO0uCtTNJLoQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/pattern": "30.0.1", - "@jest/schemas": "30.0.5", + "@jest/pattern": "30.4.0", + "@jest/schemas": "30.4.1", "@types/istanbul-lib-coverage": "^2.0.6", "@types/istanbul-reports": "^3.0.4", "@types/node": "*", @@ -2882,14 +3299,24 @@ "node": ">=8" } }, + "node_modules/@jest/transform/node_modules/jest-regex-util": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.4.0.tgz", + "integrity": "sha512-mWlvLviKIgIQ8VCuM1xRdD0TWp3zlzionlmDBjuXVBs+VkmXq6FgW9T4Emr7oGz/Rk6feDCGyiugolcQEyp3mg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/@jest/transform/node_modules/jest-util": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.3.0.tgz", - "integrity": "sha512-/jZDa00a3Sz7rdyu55NLrQCIrbyIkbBxareejQI315f/i8HjYN+ZWsDLLpoQSiUIEIyZF/R8fDg3BmB8AtHttg==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.4.1.tgz", + "integrity": "sha512-vjQb1sACEiv13DKJMDToJpzVW0joCsIQrmbg0fi7CyOOt+g9jTuQl2A216pWRBYhOVt53XbL/2LbMKg1BECWOw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.3.0", + "@jest/types": "30.4.1", "@types/node": "*", "chalk": "^4.1.2", "ci-info": "^4.2.0", @@ -3131,16 +3558,22 @@ } }, "node_modules/@napi-rs/wasm-runtime": { - "version": "0.2.12", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", - "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz", + "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==", "dev": true, "license": "MIT", "optional": true, "dependencies": { - "@emnapi/core": "^1.4.3", - "@emnapi/runtime": "^1.4.3", - "@tybys/wasm-util": "^0.10.0" + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" } }, "node_modules/@nodelib/fs.scandir": { @@ -3306,105 +3739,45 @@ "node": ">=8" } }, - "node_modules/@shikijs/core": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.29.2.tgz", - "integrity": "sha512-vju0lY9r27jJfOY4Z7+Rt/nIOjzJpZ3y+nYpqtUZInVoXQ/TJZcfGnNOGnKjFdVZb8qexiCuSlZRKcGfhhTTZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/engine-javascript": "1.29.2", - "@shikijs/engine-oniguruma": "1.29.2", - "@shikijs/types": "1.29.2", - "@shikijs/vscode-textmate": "^10.0.1", - "@types/hast": "^3.0.4", - "hast-util-to-html": "^9.0.4" - } - }, - "node_modules/@shikijs/core/node_modules/@shikijs/engine-oniguruma": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.29.2.tgz", - "integrity": "sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA==", + "node_modules/@shikijs/engine-oniguruma": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.23.0.tgz", + "integrity": "sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/types": "1.29.2", - "@shikijs/vscode-textmate": "^10.0.1" + "@shikijs/types": "3.23.0", + "@shikijs/vscode-textmate": "^10.0.2" } }, - "node_modules/@shikijs/core/node_modules/@shikijs/types": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.29.2.tgz", - "integrity": "sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw==", + "node_modules/@shikijs/langs": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.23.0.tgz", + "integrity": "sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/vscode-textmate": "^10.0.1", - "@types/hast": "^3.0.4" + "@shikijs/types": "3.23.0" } }, - "node_modules/@shikijs/engine-javascript": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.29.2.tgz", - "integrity": "sha512-iNEZv4IrLYPv64Q6k7EPpOCE/nuvGiKl7zxdq0WFuRPF5PAE9PRo2JGq/d8crLusM59BRemJ4eOqrFrC4wiQ+A==", + "node_modules/@shikijs/themes": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.23.0.tgz", + "integrity": "sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/types": "1.29.2", - "@shikijs/vscode-textmate": "^10.0.1", - "oniguruma-to-es": "^2.2.0" + "@shikijs/types": "3.23.0" } }, - "node_modules/@shikijs/engine-javascript/node_modules/@shikijs/types": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.29.2.tgz", - "integrity": "sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw==", + "node_modules/@shikijs/types": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.23.0.tgz", + "integrity": "sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/vscode-textmate": "^10.0.1", - "@types/hast": "^3.0.4" - } - }, - "node_modules/@shikijs/engine-oniguruma": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.22.0.tgz", - "integrity": "sha512-DyXsOG0vGtNtl7ygvabHd7Mt5EY8gCNqR9Y7Lpbbd/PbJvgWrqaKzH1JW6H6qFkuUa8aCxoiYVv8/YfFljiQxA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/types": "3.22.0", - "@shikijs/vscode-textmate": "^10.0.2" - } - }, - "node_modules/@shikijs/langs": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.22.0.tgz", - "integrity": "sha512-x/42TfhWmp6H00T6uwVrdTJGKgNdFbrEdhaDwSR5fd5zhQ1Q46bHq9EO61SCEWJR0HY7z2HNDMaBZp8JRmKiIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/types": "3.22.0" - } - }, - "node_modules/@shikijs/themes": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.22.0.tgz", - "integrity": "sha512-o+tlOKqsr6FE4+mYJG08tfCFDS+3CG20HbldXeVoyP+cYSUxDhrFf3GPjE60U55iOkkjbpY2uC3It/eeja35/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/types": "3.22.0" - } - }, - "node_modules/@shikijs/types": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.22.0.tgz", - "integrity": "sha512-491iAekgKDBFE67z70Ok5a8KBMsQ2IJwOWw3us/7ffQkIBCyOQfm/aNwVMBUriP02QshIfgHCBSIYAl3u2eWjg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/vscode-textmate": "^10.0.2", + "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, @@ -3432,9 +3805,9 @@ } }, "node_modules/@sinonjs/fake-timers": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-15.1.1.tgz", - "integrity": "sha512-cO5W33JgAPbOh07tvZjUOJ7oWhtaqGHiZw+11DPbyqh2kHTBc3eF/CjJDeQ4205RLQsX6rxCuYOroFQwl7JDRw==", + "version": "15.4.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-15.4.0.tgz", + "integrity": "sha512-DsG+8/LscQIQg68J6Ef3dv10u6nVyetYn923s3/sus5eaGfTo1of5WMZSLf0UJc9KDuKPilPH0UDJCjvNbDNCA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -3504,9 +3877,9 @@ "license": "MIT" }, "node_modules/@tybys/wasm-util": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", - "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", + "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", "dev": true, "license": "MIT", "optional": true, @@ -3921,16 +4294,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/mdast": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", - "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, "node_modules/@types/mime": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", @@ -4089,20 +4452,20 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.56.1.tgz", - "integrity": "sha512-Jz9ZztpB37dNC+HU2HI28Bs9QXpzCz+y/twHOwhyrIRdbuVDxSytJNDl6z/aAKlaRIwC7y8wJdkBv7FxYGgi0A==", + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.4.tgz", + "integrity": "sha512-PegsU+XfyJJNjd4+u/k6f9yTyp0lEXXiPopUNobZcIAUJFGICFLN+sP0Rb3JehVmiij1Ph0dFGYqODoRo/2+6A==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.56.1", - "@typescript-eslint/type-utils": "8.56.1", - "@typescript-eslint/utils": "8.56.1", - "@typescript-eslint/visitor-keys": "8.56.1", + "@typescript-eslint/scope-manager": "8.59.4", + "@typescript-eslint/type-utils": "8.59.4", + "@typescript-eslint/utils": "8.59.4", + "@typescript-eslint/visitor-keys": "8.59.4", "ignore": "^7.0.5", "natural-compare": "^1.4.0", - "ts-api-utils": "^2.4.0" + "ts-api-utils": "^2.5.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4112,9 +4475,9 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.56.1", + "@typescript-eslint/parser": "^8.59.4", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { @@ -4128,16 +4491,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.56.1.tgz", - "integrity": "sha512-klQbnPAAiGYFyI02+znpBRLyjL4/BrBd0nyWkdC0s/6xFLkXYQ8OoRrSkqacS1ddVxf/LDyODIKbQ5TgKAf/Fg==", + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.4.tgz", + "integrity": "sha512-zORHqO/tuhxY1zWuTvMUqddRxpiFJ72xVfcNoWpqdLjs6lfPbuQBJuW4pk+49/uBMy7Ssr4bzgjiKmmDB1UbZQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.56.1", - "@typescript-eslint/types": "8.56.1", - "@typescript-eslint/typescript-estree": "8.56.1", - "@typescript-eslint/visitor-keys": "8.56.1", + "@typescript-eslint/scope-manager": "8.59.4", + "@typescript-eslint/types": "8.59.4", + "@typescript-eslint/typescript-estree": "8.59.4", + "@typescript-eslint/visitor-keys": "8.59.4", "debug": "^4.4.3" }, "engines": { @@ -4149,18 +4512,18 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.56.1.tgz", - "integrity": "sha512-TAdqQTzHNNvlVFfR+hu2PDJrURiwKsUvxFn1M0h95BB8ah5jejas08jUWG4dBA68jDMI988IvtfdAI53JzEHOQ==", + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.4.tgz", + "integrity": "sha512-Ly00Vu4oAacfDeHp2Zg85ioNG6l8HG+tN1D7J+xTHSxu9y0awYKJ2zH1rFBn8ZSfuGK+7FxK3Cgl3uAz0aZZLg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.56.1", - "@typescript-eslint/types": "^8.56.1", + "@typescript-eslint/tsconfig-utils": "^8.59.4", + "@typescript-eslint/types": "^8.59.4", "debug": "^4.4.3" }, "engines": { @@ -4171,18 +4534,18 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.56.1.tgz", - "integrity": "sha512-YAi4VDKcIZp0O4tz/haYKhmIDZFEUPOreKbfdAN3SzUDMcPhJ8QI99xQXqX+HoUVq8cs85eRKnD+rne2UAnj2w==", + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.4.tgz", + "integrity": "sha512-mUeR/3H1WrTAddJrwut8OoPjfauaztMQmRwV5fQTUyNVJCLiUXXe4lGEyYIL2oFDpP7UtgbGJXCt72wT0z2S3Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.56.1", - "@typescript-eslint/visitor-keys": "8.56.1" + "@typescript-eslint/types": "8.59.4", + "@typescript-eslint/visitor-keys": "8.59.4" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4193,9 +4556,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.56.1.tgz", - "integrity": "sha512-qOtCYzKEeyr3aR9f28mPJqBty7+DBqsdd63eO0yyDwc6vgThj2UjWfJIcsFeSucYydqcuudMOprZ+x1SpF3ZuQ==", + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.4.tgz", + "integrity": "sha512-DLCpnKgD4alVxTBSKulK+gU1KCqOgUXfDRDXh2mZgzokQKa/70ax93I2uVO3m/LLvIAtWZIFoiifudmIqAxpMA==", "dev": true, "license": "MIT", "engines": { @@ -4206,21 +4569,21 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.56.1.tgz", - "integrity": "sha512-yB/7dxi7MgTtGhZdaHCemf7PuwrHMenHjmzgUW1aJpO+bBU43OycnM3Wn+DdvDO/8zzA9HlhaJ0AUGuvri4oGg==", + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.4.tgz", + "integrity": "sha512-uonTuPAAKr9XaBGqJ3LjYTh72zy5DyGesljO9gtmk/eFW0W1fRHjnwVYKB35Lm8d5Q5CluEW3gPHjTvZTmgrfA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.56.1", - "@typescript-eslint/typescript-estree": "8.56.1", - "@typescript-eslint/utils": "8.56.1", + "@typescript-eslint/types": "8.59.4", + "@typescript-eslint/typescript-estree": "8.59.4", + "@typescript-eslint/utils": "8.59.4", "debug": "^4.4.3", - "ts-api-utils": "^2.4.0" + "ts-api-utils": "^2.5.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4231,13 +4594,13 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/types": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.56.1.tgz", - "integrity": "sha512-dbMkdIUkIkchgGDIv7KLUpa0Mda4IYjo4IAMJUZ+3xNoUXxMsk9YtKpTHSChRS85o+H9ftm51gsK1dZReY9CVw==", + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.4.tgz", + "integrity": "sha512-F1o7WJcCq+bc8dwcO/YsSEOudAH8RDtaOhM6wcAQhcUsFhnWQl81JKy48q1hoxAU0qrzM89+31GYh1515Zde3Q==", "dev": true, "license": "MIT", "engines": { @@ -4249,21 +4612,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.56.1.tgz", - "integrity": "sha512-qzUL1qgalIvKWAf9C1HpvBjif+Vm6rcT5wZd4VoMb9+Km3iS3Cv9DY6dMRMDtPnwRAFyAi7YXJpTIEXLvdfPxg==", + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.4.tgz", + "integrity": "sha512-F+RuOmcDXo4+TPdfd/TCLS3m2nw8gE9XXyZLrA3JBfaA5tz9TtdkyD3YJFmPxulyc2cKbEok/CvFE3MgSLWnag==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.56.1", - "@typescript-eslint/tsconfig-utils": "8.56.1", - "@typescript-eslint/types": "8.56.1", - "@typescript-eslint/visitor-keys": "8.56.1", + "@typescript-eslint/project-service": "8.59.4", + "@typescript-eslint/tsconfig-utils": "8.59.4", + "@typescript-eslint/types": "8.59.4", + "@typescript-eslint/visitor-keys": "8.59.4", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.4.0" + "ts-api-utils": "^2.5.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4273,7 +4636,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { @@ -4287,9 +4650,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz", - "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", "dev": true, "license": "MIT", "dependencies": { @@ -4300,13 +4663,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.2.tgz", - "integrity": "sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==", + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^5.0.2" + "brace-expansion": "^5.0.5" }, "engines": { "node": "18 || 20 || >=22" @@ -4316,16 +4679,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.56.1.tgz", - "integrity": "sha512-HPAVNIME3tABJ61siYlHzSWCGtOoeP2RTIaHXFMPqjrQKCGB9OgUVdiNgH7TJS2JNIQ5qQ4RsAUDuGaGme/KOA==", + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.4.tgz", + "integrity": "sha512-cYXeNAUsG4lJo5dbc1FcKm+JwIWrj1/UpTORsC6tGMjEZ81DYcvIr9/ueikhMa/Y/gDQYGp+YX9/xQrXje5BJw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.56.1", - "@typescript-eslint/types": "8.56.1", - "@typescript-eslint/typescript-estree": "8.56.1" + "@typescript-eslint/scope-manager": "8.59.4", + "@typescript-eslint/types": "8.59.4", + "@typescript-eslint/typescript-estree": "8.59.4" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4336,17 +4699,17 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.56.1.tgz", - "integrity": "sha512-KiROIzYdEV85YygXw6BI/Dx4fnBlFQu6Mq4QE4MOH9fFnhohw6wX/OAvDY2/C+ut0I3RSPKenvZJIVYqJNkhEw==", + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.4.tgz", + "integrity": "sha512-U3gxVaDVnuZKhSspW/MzMxE1kq7zOdc072FcSNoqA1I9p8HyKbBFfEHoWckBAMgNMph4MamwS5iTVzFmrnt8TQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/types": "8.59.4", "eslint-visitor-keys": "^5.0.0" }, "engines": { @@ -4378,9 +4741,9 @@ "license": "ISC" }, "node_modules/@unrs/resolver-binding-android-arm-eabi": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", - "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.12.2.tgz", + "integrity": "sha512-g5T90pqg1bo/7mytQx6F4iBNC0Wsh9cu+z9veDbFjc7HjpesJFWD7QMS0NGStXM075+7dJPPVvBbpZlnrdpi/w==", "cpu": [ "arm" ], @@ -4392,9 +4755,9 @@ ] }, "node_modules/@unrs/resolver-binding-android-arm64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", - "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.12.2.tgz", + "integrity": "sha512-YGCRZv/9GLhwmz6mYDeTsm/92BAyR28l6c2ReweVW5pWgfsitWLY8upvfRlGdoyD8HjeTHSYJWyZGD4KJA/nFQ==", "cpu": [ "arm64" ], @@ -4406,9 +4769,9 @@ ] }, "node_modules/@unrs/resolver-binding-darwin-arm64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", - "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.12.2.tgz", + "integrity": "sha512-u9DiNT1auQMO20A9SyTuG3wUgQWB9Z7KjAg0uFuCDR1FsAY8A0CG2S6JpHS1xwm/w1G08bjXZDcyOCjv1WAm2w==", "cpu": [ "arm64" ], @@ -4420,9 +4783,9 @@ ] }, "node_modules/@unrs/resolver-binding-darwin-x64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", - "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.12.2.tgz", + "integrity": "sha512-f7rPLi/T1HVKZu/u6t87lroib16n8vrSzcyxI7lg4BGO9UF26KhQL44sd9eOUgrTYhvRXtWOIZT5PejdPyJfUA==", "cpu": [ "x64" ], @@ -4434,9 +4797,9 @@ ] }, "node_modules/@unrs/resolver-binding-freebsd-x64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", - "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.12.2.tgz", + "integrity": "sha512-BpcOjWCJub6nRZUS2zA20pmLvjtqAtGejETaIyRLiZiQf++cbrjltLA5NN/xaXfqeOBOSlMFbemIl5/S5tljmg==", "cpu": [ "x64" ], @@ -4448,9 +4811,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", - "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.12.2.tgz", + "integrity": "sha512-vZTDvdSISZjJx66OzJqtsOhzifbqRjbmI1Mnu49fQDwog5GtDI4QidRiEAYbZCRj9C8YZEW+3ZjqsyS9GR4k2A==", "cpu": [ "arm" ], @@ -4462,9 +4825,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", - "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.12.2.tgz", + "integrity": "sha512-BiPI+IrIlwcW4nLLMM21+B1dFPzd55yAVgVGrdgDjNef+ch03GdxrcyaIz8X9SsQirh/kCQ7mviyWlMxdh2D7g==", "cpu": [ "arm" ], @@ -4476,13 +4839,16 @@ ] }, "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", - "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.12.2.tgz", + "integrity": "sha512-zJc0H99FEPoFfSrNpa91HYfxzfAJCr502oxNK1cfdC9hlaFI43RT+JFCann9JUgZmLzzntChHyn13Sgn9ljHNg==", "cpu": [ "arm64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -4490,13 +4856,50 @@ ] }, "node_modules/@unrs/resolver-binding-linux-arm64-musl": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", - "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.12.2.tgz", + "integrity": "sha512-KQ3Lki6l+Pz1k/eBipN41ES+YUK30beLGb9YqcB1O542cyLCNE6GaxrfcY3T6EezmGGk84wb5XyO9loTM9tkcA==", "cpu": [ "arm64" ], "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-loong64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-loong64-gnu/-/resolver-binding-linux-loong64-gnu-1.12.2.tgz", + "integrity": "sha512-3SJGEh1DborhG6pyxvhPzCT4bbSIVihsvgJc13P1bHG7KLdNDaF9T3gsTwFc7Jw/5Y5/iWOjkEx7Zy0NvCGX3Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-loong64-musl": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-loong64-musl/-/resolver-binding-linux-loong64-musl-1.12.2.tgz", + "integrity": "sha512-jiuG/Obbel7uw1PwHNFfrkiKhLAF6mnyZ6aWlOAVN9WqKm8v0OFGnciJIHu8+CMvXLQ8AD51LPzAoUfT21D5Ew==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -4504,13 +4907,16 @@ ] }, "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", - "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.12.2.tgz", + "integrity": "sha512-q7xRvVpmcfeL+LlZg8Pbbo6QaTZwDU5BaGZbwfhkEsXJn3Was8xYfE0RBH266xZt0rM6B7i8xAYIvjthuUIWHg==", "cpu": [ "ppc64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -4518,13 +4924,16 @@ ] }, "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", - "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.12.2.tgz", + "integrity": "sha512-0CVdx6lcnT3Q9inOH8tsMIOJ6ImndllMjqJHg8RLVdB7Vq4SfkEXl9mCSsVNuNA4MCYycRicCUxPCabVHJRr6A==", "cpu": [ "riscv64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -4532,13 +4941,16 @@ ] }, "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", - "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.12.2.tgz", + "integrity": "sha512-iOwlRo9vnp6R6ohHQS11n0NnfdXx/omhkocmIfaPRpQhKZ+3BDMkkdRVh53qjkFkpPddf+FETA28NwGN7l5l+w==", "cpu": [ "riscv64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -4546,13 +4958,16 @@ ] }, "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", - "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.12.2.tgz", + "integrity": "sha512-HYJtLfXq94q8iZNFT1lknx258wlkkWhZeUXJRqzKBBUJ00CvZ+N33zgbCqimLjsyw5Va6uUxhVa12mI+kaveEw==", "cpu": [ "s390x" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -4560,13 +4975,16 @@ ] }, "node_modules/@unrs/resolver-binding-linux-x64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", - "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.12.2.tgz", + "integrity": "sha512-mPsUhunKKDih5O96Y6enDQyHc1SqBPlY1E/SfMWDM3EdJ95Z9CArPeCVwCCqbP45ljvivdEk8Fxn+SIb1rDAJQ==", "cpu": [ "x64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -4574,23 +4992,40 @@ ] }, "node_modules/@unrs/resolver-binding-linux-x64-musl": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", - "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.12.2.tgz", + "integrity": "sha512-azrt6+5ydLd8Vt210AAFis/lZevSfPw93EJRIJG+xPu4WCJ8K0kppCTpMyLPcKT7H15M4Jnt2tMp5bOvCkRC6A==", "cpu": [ "x64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ "linux" ] }, + "node_modules/@unrs/resolver-binding-openharmony-arm64": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-openharmony-arm64/-/resolver-binding-openharmony-arm64-1.12.2.tgz", + "integrity": "sha512-YZ9hP4O0X9PQb8eO980qmLNGH4zT3I9+SZTdt0Pr0YyuGQhYKoOZkV02VzrzyOZJ5xIJ3UFIenKkUkGg8GjgWQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, "node_modules/@unrs/resolver-binding-wasm32-wasi": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", - "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.12.2.tgz", + "integrity": "sha512-tYFDIkMxSflfEc/h92ZWNsZlHSwgimbNHSO3PL2JWQHfCuC2q316jMyYU9TIWZsFK2bQwyK5VAdYgn8ygPj69A==", "cpu": [ "wasm32" ], @@ -4598,16 +5033,18 @@ "license": "MIT", "optional": true, "dependencies": { - "@napi-rs/wasm-runtime": "^0.2.11" + "@emnapi/core": "1.10.0", + "@emnapi/runtime": "1.10.0", + "@napi-rs/wasm-runtime": "^1.1.4" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", - "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.12.2.tgz", + "integrity": "sha512-qzNyg3xL0VPQmCaUh+N5jSitce6k+uCBfMDesWRnlULOZaqUkaJ0ybdT+UqlAWJoQjuqfIU/0Ptx9bteN4D82g==", "cpu": [ "arm64" ], @@ -4619,9 +5056,9 @@ ] }, "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", - "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.12.2.tgz", + "integrity": "sha512-WD9sY00OfpHVGfsnHZoA8jVT+esS/Bg8z8jzxp5BnDCjjwsuKsPQrzswwpFy4J1AUJbXPRfkpcX0mXrzeXW79g==", "cpu": [ "ia32" ], @@ -4633,9 +5070,9 @@ ] }, "node_modules/@unrs/resolver-binding-win32-x64-msvc": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", - "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.12.2.tgz", + "integrity": "sha512-nAB74NfSNKknqQ1RrYj6uz8FcXEomu/MATJZxh/x+BArzN2U3JbOYC0APYzUIGhVY3m5hRxA8VPNdPBoG8txlA==", "cpu": [ "x64" ], @@ -4933,16 +5370,16 @@ "license": "MIT" }, "node_modules/babel-jest": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.3.0.tgz", - "integrity": "sha512-gRpauEU2KRrCox5Z296aeVHR4jQ98BCnu0IO332D/xpHNOsIH/bgSRk9k6GbKIbBw8vFeN6ctuu6tV8WOyVfYQ==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.4.1.tgz", + "integrity": "sha512-fATAbM8piYxkiXQp3RBXmZHxZVNJZAVXXfyeyCN2Tida3+qJ8ea9UxhiJ2y4fLO90ZImKt6k9FlcH2+rLkJGhw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/transform": "30.3.0", + "@jest/transform": "30.4.1", "@types/babel__core": "^7.20.5", "babel-plugin-istanbul": "^7.0.1", - "babel-preset-jest": "30.3.0", + "babel-preset-jest": "30.4.0", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", "slash": "^3.0.0" @@ -4975,9 +5412,9 @@ } }, "node_modules/babel-plugin-jest-hoist": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.3.0.tgz", - "integrity": "sha512-+TRkByhsws6sfPjVaitzadk1I0F5sPvOVUH5tyTSzhePpsGIVrdeunHSw/C36QeocS95OOk8lunc4rlu5Anwsg==", + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.4.0.tgz", + "integrity": "sha512-9EdtWM/sSfXLOGLwSn+GS6pIXyBnL07/8gyJlwFXjWy4DxMOyItqyUT29d4lQiS380EZwYlX7/At4PgBS+m2aA==", "dev": true, "license": "MIT", "dependencies": { @@ -5015,13 +5452,13 @@ } }, "node_modules/babel-preset-jest": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-30.3.0.tgz", - "integrity": "sha512-6ZcUbWHC+dMz2vfzdNwi87Z1gQsLNK2uLuK1Q89R11xdvejcivlYYwDlEv0FHX3VwEXpbBQ9uufB/MUNpZGfhQ==", + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-30.4.0.tgz", + "integrity": "sha512-lBY4jxsNmCnSiu7kquw8ZC9F4+XLMOKypT3RnNHPvU2Kpd4W0xaPuLr5ZkRyOsvLYAY4yaW1ZwTW4xB7NIiZzg==", "dev": true, "license": "MIT", "dependencies": { - "babel-plugin-jest-hoist": "30.3.0", + "babel-plugin-jest-hoist": "30.4.0", "babel-preset-current-node-syntax": "^1.2.0" }, "engines": { @@ -5422,17 +5859,6 @@ "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", "license": "Apache-2.0" }, - "node_modules/ccount": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -5459,28 +5885,6 @@ "node": ">=10" } }, - "node_modules/character-entities-html4": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", - "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-legacy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", - "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/chardet": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", @@ -5673,17 +6077,6 @@ "node": ">= 0.8" } }, - "node_modules/comma-separated-tokens": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -5882,9 +6275,9 @@ } }, "node_modules/dedent": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.1.tgz", - "integrity": "sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.2.tgz", + "integrity": "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==", "dev": true, "license": "MIT", "peerDependencies": { @@ -5939,16 +6332,6 @@ "node": ">= 0.8" } }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", @@ -5988,20 +6371,6 @@ "node": ">=8" } }, - "node_modules/devlop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", - "dev": true, - "license": "MIT", - "dependencies": { - "dequal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/diff": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.2.tgz", @@ -6164,13 +6533,6 @@ "dev": true, "license": "MIT" }, - "node_modules/emoji-regex-xs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz", - "integrity": "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==", - "dev": true, - "license": "MIT" - }, "node_modules/enabled": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", @@ -6305,25 +6667,25 @@ } }, "node_modules/eslint": { - "version": "9.39.3", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.3.tgz", - "integrity": "sha512-VmQ+sifHUbI/IcSopBCF/HO3YiHQx/AVd3UVyYL6weuwW+HvON9VYn5l6Zl1WZzPWXPNZrSQpxwkkZ/VuvJZzg==", + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", + "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.1", + "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.39.3", + "@eslint/eslintrc": "^3.3.5", + "@eslint/js": "9.39.4", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", - "ajv": "^6.12.4", + "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", @@ -6342,7 +6704,7 @@ "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", + "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, @@ -7206,9 +7568,9 @@ "license": "ISC" }, "node_modules/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "version": "4.7.9", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz", + "integrity": "sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7308,44 +7670,6 @@ "node": ">= 0.4" } }, - "node_modules/hast-util-to-html": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", - "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-whitespace": "^3.0.0", - "html-void-elements": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0", - "stringify-entities": "^4.0.0", - "zwitch": "^2.0.4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-whitespace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", - "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -7390,17 +7714,6 @@ "node": ">=14" } }, - "node_modules/html-void-elements": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", - "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/htmlencode": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/htmlencode/-/htmlencode-0.0.4.tgz", @@ -7963,16 +8276,16 @@ } }, "node_modules/jest": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-30.3.0.tgz", - "integrity": "sha512-AkXIIFcaazymvey2i/+F94XRnM6TsVLZDhBMLsd1Sf/W0wzsvvpjeyUrCZD6HGG4SDYPgDJDBKeiJTBb10WzMg==", + "version": "30.4.2", + "resolved": "https://registry.npmjs.org/jest/-/jest-30.4.2.tgz", + "integrity": "sha512-Yi1jqNC/Oq0N4hBgNH/YvBpP1P57QqundgytzYqy3yqAa7NZPNjSoi4SGbRAXDMdBzNE6xBCi5U7RgfrvMEUVQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/core": "30.3.0", - "@jest/types": "30.3.0", + "@jest/core": "30.4.2", + "@jest/types": "30.4.1", "import-local": "^3.2.0", - "jest-cli": "30.3.0" + "jest-cli": "30.4.2" }, "bin": { "jest": "bin/jest.js" @@ -7990,24 +8303,38 @@ } }, "node_modules/jest-changed-files": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-30.3.0.tgz", - "integrity": "sha512-B/7Cny6cV5At6M25EWDgf9S617lHivamL8vl6KEpJqkStauzcG4e+WPfDgMMF+H4FVH4A2PLRyvgDJan4441QA==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-30.4.1.tgz", + "integrity": "sha512-IuctmYrxi21iOSOaIXpJWalHyPAsVv0GeBHKDn8C1CA4W5htHn7INL+wdnL4Bo0+olEndvAFkmb++tIQJG+vvg==", "dev": true, "license": "MIT", "dependencies": { "execa": "^5.1.1", - "jest-util": "30.3.0", + "jest-util": "30.4.1", "p-limit": "^3.1.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, + "node_modules/jest-changed-files/node_modules/@jest/pattern": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.4.0.tgz", + "integrity": "sha512-RAWn3+f9u8BsHijKJ71uHcFp6vmyEt6VvoWXkl6hKF3qVIuWNmudVjg12DlBPGup/frIl5UcUlH5HfEuvHpEXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-regex-util": "30.4.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/jest-changed-files/node_modules/@jest/schemas": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", - "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.4.1.tgz", + "integrity": "sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==", "dev": true, "license": "MIT", "dependencies": { @@ -8018,14 +8345,14 @@ } }, "node_modules/jest-changed-files/node_modules/@jest/types": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.3.0.tgz", - "integrity": "sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.4.1.tgz", + "integrity": "sha512-f1x/vJXIfjOlEmejYpbkbgw1gOqpPECwMvMEtBqe47j7H2Hg8h8w3o3ikhSXq3MI15kg+oQ0exWO0uCtTNJLoQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/pattern": "30.0.1", - "@jest/schemas": "30.0.5", + "@jest/pattern": "30.4.0", + "@jest/schemas": "30.4.1", "@types/istanbul-lib-coverage": "^2.0.6", "@types/istanbul-reports": "^3.0.4", "@types/node": "*", @@ -8052,14 +8379,24 @@ "node": ">=8" } }, + "node_modules/jest-changed-files/node_modules/jest-regex-util": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.4.0.tgz", + "integrity": "sha512-mWlvLviKIgIQ8VCuM1xRdD0TWp3zlzionlmDBjuXVBs+VkmXq6FgW9T4Emr7oGz/Rk6feDCGyiugolcQEyp3mg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/jest-changed-files/node_modules/jest-util": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.3.0.tgz", - "integrity": "sha512-/jZDa00a3Sz7rdyu55NLrQCIrbyIkbBxareejQI315f/i8HjYN+ZWsDLLpoQSiUIEIyZF/R8fDg3BmB8AtHttg==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.4.1.tgz", + "integrity": "sha512-vjQb1sACEiv13DKJMDToJpzVW0joCsIQrmbg0fi7CyOOt+g9jTuQl2A216pWRBYhOVt53XbL/2LbMKg1BECWOw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.3.0", + "@jest/types": "30.4.1", "@types/node": "*", "chalk": "^4.1.2", "ci-info": "^4.2.0", @@ -8071,29 +8408,29 @@ } }, "node_modules/jest-circus": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.3.0.tgz", - "integrity": "sha512-PyXq5szeSfR/4f1lYqCmmQjh0vqDkURUYi9N6whnHjlRz4IUQfMcXkGLeEoiJtxtyPqgUaUUfyQlApXWBSN1RA==", + "version": "30.4.2", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.4.2.tgz", + "integrity": "sha512-rvHH7VlY6LgbJXJTQ87GW62g1FntOtbhh0zT+v04kC+pgL6aBKyYINXxWukCpj3dcIBMw5/XUbtDS9dU9JTXeQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "30.3.0", - "@jest/expect": "30.3.0", - "@jest/test-result": "30.3.0", - "@jest/types": "30.3.0", + "@jest/environment": "30.4.1", + "@jest/expect": "30.4.1", + "@jest/test-result": "30.4.1", + "@jest/types": "30.4.1", "@types/node": "*", "chalk": "^4.1.2", "co": "^4.6.0", "dedent": "^1.6.0", "is-generator-fn": "^2.1.0", - "jest-each": "30.3.0", - "jest-matcher-utils": "30.3.0", - "jest-message-util": "30.3.0", - "jest-runtime": "30.3.0", - "jest-snapshot": "30.3.0", - "jest-util": "30.3.0", + "jest-each": "30.4.1", + "jest-matcher-utils": "30.4.1", + "jest-message-util": "30.4.1", + "jest-runtime": "30.4.2", + "jest-snapshot": "30.4.1", + "jest-util": "30.4.1", "p-limit": "^3.1.0", - "pretty-format": "30.3.0", + "pretty-format": "30.4.1", "pure-rand": "^7.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.6" @@ -8102,20 +8439,24 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/jest-circus/node_modules/@jest/diff-sequences": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.3.0.tgz", - "integrity": "sha512-cG51MVnLq1ecVUaQ3fr6YuuAOitHK1S4WUJHnsPFE/quQr33ADUx1FfrTCpMCRxvy0Yr9BThKpDjSlcTi91tMA==", + "node_modules/jest-circus/node_modules/@jest/pattern": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.4.0.tgz", + "integrity": "sha512-RAWn3+f9u8BsHijKJ71uHcFp6vmyEt6VvoWXkl6hKF3qVIuWNmudVjg12DlBPGup/frIl5UcUlH5HfEuvHpEXg==", "dev": true, "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-regex-util": "30.4.0" + }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-circus/node_modules/@jest/schemas": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", - "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.4.1.tgz", + "integrity": "sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==", "dev": true, "license": "MIT", "dependencies": { @@ -8126,14 +8467,14 @@ } }, "node_modules/jest-circus/node_modules/@jest/types": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.3.0.tgz", - "integrity": "sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.4.1.tgz", + "integrity": "sha512-f1x/vJXIfjOlEmejYpbkbgw1gOqpPECwMvMEtBqe47j7H2Hg8h8w3o3ikhSXq3MI15kg+oQ0exWO0uCtTNJLoQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/pattern": "30.0.1", - "@jest/schemas": "30.0.5", + "@jest/pattern": "30.4.0", + "@jest/schemas": "30.4.1", "@types/istanbul-lib-coverage": "^2.0.6", "@types/istanbul-reports": "^3.0.4", "@types/node": "*", @@ -8174,51 +8515,52 @@ } }, "node_modules/jest-circus/node_modules/jest-diff": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.3.0.tgz", - "integrity": "sha512-n3q4PDQjS4LrKxfWB3Z5KNk1XjXtZTBwQp71OP0Jo03Z6V60x++K5L8k6ZrW8MY8pOFylZvHM0zsjS1RqlHJZQ==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.4.1.tgz", + "integrity": "sha512-CRpFK0RtLriVDGcPPAnR6HMVI8bSR2jnUIgralhauzYQZIb4RH9AtEInTuQr65LmmGggGcRT6HIASxwqsVsmlA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/diff-sequences": "30.3.0", + "@jest/diff-sequences": "30.4.0", "@jest/get-type": "30.1.0", "chalk": "^4.1.2", - "pretty-format": "30.3.0" + "pretty-format": "30.4.1" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-circus/node_modules/jest-matcher-utils": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.3.0.tgz", - "integrity": "sha512-HEtc9uFQgaUHkC7nLSlQL3Tph4Pjxt/yiPvkIrrDCt9jhoLIgxaubo1G+CFOnmHYMxHwwdaSN7mkIFs6ZK8OhA==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.4.1.tgz", + "integrity": "sha512-zvYfX5CaeEkFrrLS9suWe9rvJrm9J1Iv3ua8kIBv9GEPzcnsfBf0bob37la7s67fs0nlBC3EuvkOLnXQKxtx4A==", "dev": true, "license": "MIT", "dependencies": { "@jest/get-type": "30.1.0", "chalk": "^4.1.2", - "jest-diff": "30.3.0", - "pretty-format": "30.3.0" + "jest-diff": "30.4.1", + "pretty-format": "30.4.1" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-circus/node_modules/jest-message-util": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.3.0.tgz", - "integrity": "sha512-Z/j4Bo+4ySJ+JPJN3b2Qbl9hDq3VrXmnjjGEWD/x0BCXeOXPTV1iZYYzl2X8c1MaCOL+ewMyNBcm88sboE6YWw==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.4.1.tgz", + "integrity": "sha512-kwCKIvq0MCW1HzLoGola9Te6JUdzgV0loyKJ3Qghrkz9i5/RRIHsL95BMQc2HBBhlBKC4j22K9p11TGHH8RBpQ==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@jest/types": "30.3.0", + "@jest/types": "30.4.1", "@types/stack-utils": "^2.0.3", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", + "jest-util": "30.4.1", "picomatch": "^4.0.3", - "pretty-format": "30.3.0", + "pretty-format": "30.4.1", "slash": "^3.0.0", "stack-utils": "^2.0.6" }, @@ -8226,14 +8568,24 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, + "node_modules/jest-circus/node_modules/jest-regex-util": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.4.0.tgz", + "integrity": "sha512-mWlvLviKIgIQ8VCuM1xRdD0TWp3zlzionlmDBjuXVBs+VkmXq6FgW9T4Emr7oGz/Rk6feDCGyiugolcQEyp3mg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/jest-circus/node_modules/jest-util": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.3.0.tgz", - "integrity": "sha512-/jZDa00a3Sz7rdyu55NLrQCIrbyIkbBxareejQI315f/i8HjYN+ZWsDLLpoQSiUIEIyZF/R8fDg3BmB8AtHttg==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.4.1.tgz", + "integrity": "sha512-vjQb1sACEiv13DKJMDToJpzVW0joCsIQrmbg0fi7CyOOt+g9jTuQl2A216pWRBYhOVt53XbL/2LbMKg1BECWOw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.3.0", + "@jest/types": "30.4.1", "@types/node": "*", "chalk": "^4.1.2", "ci-info": "^4.2.0", @@ -8245,36 +8597,37 @@ } }, "node_modules/jest-circus/node_modules/pretty-format": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz", - "integrity": "sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.4.1.tgz", + "integrity": "sha512-K6KiKMHTL4jjX4u3Kir2EW07nRfcqVTXIImx50wbjHQTcZPgg+gjVeNTIT3l3L1Rd4UefxfogquC9J37SoFyyw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/schemas": "30.0.5", + "@jest/schemas": "30.4.1", "ansi-styles": "^5.2.0", - "react-is": "^18.3.1" + "react-is-18": "npm:react-is@^18.3.1", + "react-is-19": "npm:react-is@^19.2.5" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-cli": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-30.3.0.tgz", - "integrity": "sha512-l6Tqx+j1fDXJEW5bqYykDQQ7mQg+9mhWXtnj+tQZrTWYHyHoi6Be8HPumDSA+UiX2/2buEgjA58iJzdj146uCw==", + "version": "30.4.2", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-30.4.2.tgz", + "integrity": "sha512-jfA2ocvVHMXS2QijrJ0d31ektP+d/W0T5RpcTX2Pq+3sVqHlsXVCM2+FmwpL+bdY8OfHpIg9xMxLF17Zg0U49Q==", "dev": true, "license": "MIT", "dependencies": { - "@jest/core": "30.3.0", - "@jest/test-result": "30.3.0", - "@jest/types": "30.3.0", + "@jest/core": "30.4.2", + "@jest/test-result": "30.4.1", + "@jest/types": "30.4.1", "chalk": "^4.1.2", "exit-x": "^0.2.2", "import-local": "^3.2.0", - "jest-config": "30.3.0", - "jest-util": "30.3.0", - "jest-validate": "30.3.0", + "jest-config": "30.4.2", + "jest-util": "30.4.1", + "jest-validate": "30.4.1", "yargs": "^17.7.2" }, "bin": { @@ -8292,28 +8645,42 @@ } } }, - "node_modules/jest-cli/node_modules/@jest/schemas": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", - "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "node_modules/jest-cli/node_modules/@jest/pattern": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.4.0.tgz", + "integrity": "sha512-RAWn3+f9u8BsHijKJ71uHcFp6vmyEt6VvoWXkl6hKF3qVIuWNmudVjg12DlBPGup/frIl5UcUlH5HfEuvHpEXg==", "dev": true, "license": "MIT", "dependencies": { - "@sinclair/typebox": "^0.34.0" + "@types/node": "*", + "jest-regex-util": "30.4.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/jest-cli/node_modules/@jest/types": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.3.0.tgz", - "integrity": "sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw==", + "node_modules/jest-cli/node_modules/@jest/schemas": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.4.1.tgz", + "integrity": "sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==", "dev": true, "license": "MIT", "dependencies": { - "@jest/pattern": "30.0.1", - "@jest/schemas": "30.0.5", + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-cli/node_modules/@jest/types": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.4.1.tgz", + "integrity": "sha512-f1x/vJXIfjOlEmejYpbkbgw1gOqpPECwMvMEtBqe47j7H2Hg8h8w3o3ikhSXq3MI15kg+oQ0exWO0uCtTNJLoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/pattern": "30.4.0", + "@jest/schemas": "30.4.1", "@types/istanbul-lib-coverage": "^2.0.6", "@types/istanbul-reports": "^3.0.4", "@types/node": "*", @@ -8340,14 +8707,24 @@ "node": ">=8" } }, + "node_modules/jest-cli/node_modules/jest-regex-util": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.4.0.tgz", + "integrity": "sha512-mWlvLviKIgIQ8VCuM1xRdD0TWp3zlzionlmDBjuXVBs+VkmXq6FgW9T4Emr7oGz/Rk6feDCGyiugolcQEyp3mg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/jest-cli/node_modules/jest-util": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.3.0.tgz", - "integrity": "sha512-/jZDa00a3Sz7rdyu55NLrQCIrbyIkbBxareejQI315f/i8HjYN+ZWsDLLpoQSiUIEIyZF/R8fDg3BmB8AtHttg==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.4.1.tgz", + "integrity": "sha512-vjQb1sACEiv13DKJMDToJpzVW0joCsIQrmbg0fi7CyOOt+g9jTuQl2A216pWRBYhOVt53XbL/2LbMKg1BECWOw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.3.0", + "@jest/types": "30.4.1", "@types/node": "*", "chalk": "^4.1.2", "ci-info": "^4.2.0", @@ -8359,33 +8736,33 @@ } }, "node_modules/jest-config": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.3.0.tgz", - "integrity": "sha512-WPMAkMAtNDY9P/oKObtsRG/6KTrhtgPJoBTmk20uDn4Uy6/3EJnnaZJre/FMT1KVRx8cve1r7/FlMIOfRVWL4w==", + "version": "30.4.2", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.4.2.tgz", + "integrity": "sha512-rNHAShJQqQwFNoL0hbf3BphSBOWnpOUAKvidLS/AjNVLPfoj5mSf4jQMfW3cYOs6hXeZC7nF7mDHaBnbxELOzg==", "dev": true, "license": "MIT", "dependencies": { "@babel/core": "^7.27.4", "@jest/get-type": "30.1.0", - "@jest/pattern": "30.0.1", - "@jest/test-sequencer": "30.3.0", - "@jest/types": "30.3.0", - "babel-jest": "30.3.0", + "@jest/pattern": "30.4.0", + "@jest/test-sequencer": "30.4.1", + "@jest/types": "30.4.1", + "babel-jest": "30.4.1", "chalk": "^4.1.2", "ci-info": "^4.2.0", "deepmerge": "^4.3.1", "glob": "^10.5.0", "graceful-fs": "^4.2.11", - "jest-circus": "30.3.0", - "jest-docblock": "30.2.0", - "jest-environment-node": "30.3.0", - "jest-regex-util": "30.0.1", - "jest-resolve": "30.3.0", - "jest-runner": "30.3.0", - "jest-util": "30.3.0", - "jest-validate": "30.3.0", + "jest-circus": "30.4.2", + "jest-docblock": "30.4.0", + "jest-environment-node": "30.4.1", + "jest-regex-util": "30.4.0", + "jest-resolve": "30.4.1", + "jest-runner": "30.4.2", + "jest-util": "30.4.1", + "jest-validate": "30.4.1", "parse-json": "^5.2.0", - "pretty-format": "30.3.0", + "pretty-format": "30.4.1", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -8409,10 +8786,24 @@ } } }, + "node_modules/jest-config/node_modules/@jest/pattern": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.4.0.tgz", + "integrity": "sha512-RAWn3+f9u8BsHijKJ71uHcFp6vmyEt6VvoWXkl6hKF3qVIuWNmudVjg12DlBPGup/frIl5UcUlH5HfEuvHpEXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-regex-util": "30.4.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/jest-config/node_modules/@jest/schemas": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", - "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.4.1.tgz", + "integrity": "sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==", "dev": true, "license": "MIT", "dependencies": { @@ -8423,14 +8814,14 @@ } }, "node_modules/jest-config/node_modules/@jest/types": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.3.0.tgz", - "integrity": "sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.4.1.tgz", + "integrity": "sha512-f1x/vJXIfjOlEmejYpbkbgw1gOqpPECwMvMEtBqe47j7H2Hg8h8w3o3ikhSXq3MI15kg+oQ0exWO0uCtTNJLoQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/pattern": "30.0.1", - "@jest/schemas": "30.0.5", + "@jest/pattern": "30.4.0", + "@jest/schemas": "30.4.1", "@types/istanbul-lib-coverage": "^2.0.6", "@types/istanbul-reports": "^3.0.4", "@types/node": "*", @@ -8455,9 +8846,9 @@ } }, "node_modules/jest-config/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", "dev": true, "license": "MIT", "dependencies": { @@ -8502,14 +8893,24 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/jest-config/node_modules/jest-regex-util": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.4.0.tgz", + "integrity": "sha512-mWlvLviKIgIQ8VCuM1xRdD0TWp3zlzionlmDBjuXVBs+VkmXq6FgW9T4Emr7oGz/Rk6feDCGyiugolcQEyp3mg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/jest-config/node_modules/jest-util": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.3.0.tgz", - "integrity": "sha512-/jZDa00a3Sz7rdyu55NLrQCIrbyIkbBxareejQI315f/i8HjYN+ZWsDLLpoQSiUIEIyZF/R8fDg3BmB8AtHttg==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.4.1.tgz", + "integrity": "sha512-vjQb1sACEiv13DKJMDToJpzVW0joCsIQrmbg0fi7CyOOt+g9jTuQl2A216pWRBYhOVt53XbL/2LbMKg1BECWOw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.3.0", + "@jest/types": "30.4.1", "@types/node": "*", "chalk": "^4.1.2", "ci-info": "^4.2.0", @@ -8537,15 +8938,16 @@ } }, "node_modules/jest-config/node_modules/pretty-format": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz", - "integrity": "sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.4.1.tgz", + "integrity": "sha512-K6KiKMHTL4jjX4u3Kir2EW07nRfcqVTXIImx50wbjHQTcZPgg+gjVeNTIT3l3L1Rd4UefxfogquC9J37SoFyyw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/schemas": "30.0.5", + "@jest/schemas": "30.4.1", "ansi-styles": "^5.2.0", - "react-is": "^18.3.1" + "react-is-18": "npm:react-is@^18.3.1", + "react-is-19": "npm:react-is@^19.2.5" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -8568,9 +8970,9 @@ } }, "node_modules/jest-docblock": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-30.2.0.tgz", - "integrity": "sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA==", + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-30.4.0.tgz", + "integrity": "sha512-ZPMabUZCx5MpbZ2eBYSvZ0J8fvo3dR9oM+eeUpb3aKNQFuS2tu3Duw1TNlMoP8k3WQgKGJuhcMFvwcVuq6T7oA==", "dev": true, "license": "MIT", "dependencies": { @@ -8581,26 +8983,40 @@ } }, "node_modules/jest-each": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-30.3.0.tgz", - "integrity": "sha512-V8eMndg/aZ+3LnCJgSm13IxS5XSBM22QSZc9BtPK8Dek6pm+hfUNfwBdvsB3d342bo1q7wnSkC38zjX259qZNA==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-30.4.1.tgz", + "integrity": "sha512-/8MJbH6fuj48TstjrMf+u/pd06Qezz5xOXvZA6442heNOWr8bdeoGZX2d9fCn028CoMgYmroH9//zky5GfyYmA==", "dev": true, "license": "MIT", "dependencies": { "@jest/get-type": "30.1.0", - "@jest/types": "30.3.0", + "@jest/types": "30.4.1", "chalk": "^4.1.2", - "jest-util": "30.3.0", - "pretty-format": "30.3.0" + "jest-util": "30.4.1", + "pretty-format": "30.4.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-each/node_modules/@jest/pattern": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.4.0.tgz", + "integrity": "sha512-RAWn3+f9u8BsHijKJ71uHcFp6vmyEt6VvoWXkl6hKF3qVIuWNmudVjg12DlBPGup/frIl5UcUlH5HfEuvHpEXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-regex-util": "30.4.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-each/node_modules/@jest/schemas": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", - "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.4.1.tgz", + "integrity": "sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==", "dev": true, "license": "MIT", "dependencies": { @@ -8611,14 +9027,14 @@ } }, "node_modules/jest-each/node_modules/@jest/types": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.3.0.tgz", - "integrity": "sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.4.1.tgz", + "integrity": "sha512-f1x/vJXIfjOlEmejYpbkbgw1gOqpPECwMvMEtBqe47j7H2Hg8h8w3o3ikhSXq3MI15kg+oQ0exWO0uCtTNJLoQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/pattern": "30.0.1", - "@jest/schemas": "30.0.5", + "@jest/pattern": "30.4.0", + "@jest/schemas": "30.4.1", "@types/istanbul-lib-coverage": "^2.0.6", "@types/istanbul-reports": "^3.0.4", "@types/node": "*", @@ -8658,14 +9074,24 @@ "node": ">=8" } }, + "node_modules/jest-each/node_modules/jest-regex-util": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.4.0.tgz", + "integrity": "sha512-mWlvLviKIgIQ8VCuM1xRdD0TWp3zlzionlmDBjuXVBs+VkmXq6FgW9T4Emr7oGz/Rk6feDCGyiugolcQEyp3mg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/jest-each/node_modules/jest-util": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.3.0.tgz", - "integrity": "sha512-/jZDa00a3Sz7rdyu55NLrQCIrbyIkbBxareejQI315f/i8HjYN+ZWsDLLpoQSiUIEIyZF/R8fDg3BmB8AtHttg==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.4.1.tgz", + "integrity": "sha512-vjQb1sACEiv13DKJMDToJpzVW0joCsIQrmbg0fi7CyOOt+g9jTuQl2A216pWRBYhOVt53XbL/2LbMKg1BECWOw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.3.0", + "@jest/types": "30.4.1", "@types/node": "*", "chalk": "^4.1.2", "ci-info": "^4.2.0", @@ -8677,43 +9103,58 @@ } }, "node_modules/jest-each/node_modules/pretty-format": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz", - "integrity": "sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.4.1.tgz", + "integrity": "sha512-K6KiKMHTL4jjX4u3Kir2EW07nRfcqVTXIImx50wbjHQTcZPgg+gjVeNTIT3l3L1Rd4UefxfogquC9J37SoFyyw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/schemas": "30.0.5", + "@jest/schemas": "30.4.1", "ansi-styles": "^5.2.0", - "react-is": "^18.3.1" + "react-is-18": "npm:react-is@^18.3.1", + "react-is-19": "npm:react-is@^19.2.5" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-environment-node": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-30.3.0.tgz", - "integrity": "sha512-4i6HItw/JSiJVsC5q0hnKIe/hbYfZLVG9YJ/0pU9Hz2n/9qZe3Rhn5s5CUZA5ORZlcdT/vmAXRMyONXJwPrmYQ==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-30.4.1.tgz", + "integrity": "sha512-4FZYVOk85hz2AyT6BbarKy9u37g6DbrDyCdFhsnDdXqyrueYQvB+0zO4f/kqLCRD0BsPRXPMNJeQwihKZV8naw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "30.3.0", - "@jest/fake-timers": "30.3.0", - "@jest/types": "30.3.0", + "@jest/environment": "30.4.1", + "@jest/fake-timers": "30.4.1", + "@jest/types": "30.4.1", "@types/node": "*", - "jest-mock": "30.3.0", - "jest-util": "30.3.0", - "jest-validate": "30.3.0" + "jest-mock": "30.4.1", + "jest-util": "30.4.1", + "jest-validate": "30.4.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-environment-node/node_modules/@jest/pattern": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.4.0.tgz", + "integrity": "sha512-RAWn3+f9u8BsHijKJ71uHcFp6vmyEt6VvoWXkl6hKF3qVIuWNmudVjg12DlBPGup/frIl5UcUlH5HfEuvHpEXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-regex-util": "30.4.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-environment-node/node_modules/@jest/schemas": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", - "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.4.1.tgz", + "integrity": "sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==", "dev": true, "license": "MIT", "dependencies": { @@ -8724,14 +9165,14 @@ } }, "node_modules/jest-environment-node/node_modules/@jest/types": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.3.0.tgz", - "integrity": "sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.4.1.tgz", + "integrity": "sha512-f1x/vJXIfjOlEmejYpbkbgw1gOqpPECwMvMEtBqe47j7H2Hg8h8w3o3ikhSXq3MI15kg+oQ0exWO0uCtTNJLoQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/pattern": "30.0.1", - "@jest/schemas": "30.0.5", + "@jest/pattern": "30.4.0", + "@jest/schemas": "30.4.1", "@types/istanbul-lib-coverage": "^2.0.6", "@types/istanbul-reports": "^3.0.4", "@types/node": "*", @@ -8758,14 +9199,39 @@ "node": ">=8" } }, + "node_modules/jest-environment-node/node_modules/jest-mock": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.4.1.tgz", + "integrity": "sha512-/i8SVb8/NSB7RfNi8gfqu8gxLV23KaL5EpAttyb9iz8qWRIqXRLflycz/32wXsYkOnaUlx8NAKnJYtpsmXUmfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.4.1", + "@types/node": "*", + "jest-util": "30.4.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-environment-node/node_modules/jest-regex-util": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.4.0.tgz", + "integrity": "sha512-mWlvLviKIgIQ8VCuM1xRdD0TWp3zlzionlmDBjuXVBs+VkmXq6FgW9T4Emr7oGz/Rk6feDCGyiugolcQEyp3mg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/jest-environment-node/node_modules/jest-util": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.3.0.tgz", - "integrity": "sha512-/jZDa00a3Sz7rdyu55NLrQCIrbyIkbBxareejQI315f/i8HjYN+ZWsDLLpoQSiUIEIyZF/R8fDg3BmB8AtHttg==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.4.1.tgz", + "integrity": "sha512-vjQb1sACEiv13DKJMDToJpzVW0joCsIQrmbg0fi7CyOOt+g9jTuQl2A216pWRBYhOVt53XbL/2LbMKg1BECWOw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.3.0", + "@jest/types": "30.4.1", "@types/node": "*", "chalk": "^4.1.2", "ci-info": "^4.2.0", @@ -8787,20 +9253,20 @@ } }, "node_modules/jest-haste-map": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.3.0.tgz", - "integrity": "sha512-mMi2oqG4KRU0R9QEtscl87JzMXfUhbKaFqOxmjb2CKcbHcUGFrJCBWHmnTiUqi6JcnzoBlO4rWfpdl2k/RfLCA==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.4.1.tgz", + "integrity": "sha512-rFrcONd8jeFsyw+Z9CrScJgglRf2+NFmNam8dKu7n+SoHqNYT47mn0DdEcVUZJpvh7Iz6/si7f7yUH7GJHVgnw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.3.0", + "@jest/types": "30.4.1", "@types/node": "*", "anymatch": "^3.1.3", "fb-watchman": "^2.0.2", "graceful-fs": "^4.2.11", - "jest-regex-util": "30.0.1", - "jest-util": "30.3.0", - "jest-worker": "30.3.0", + "jest-regex-util": "30.4.0", + "jest-util": "30.4.1", + "jest-worker": "30.4.1", "picomatch": "^4.0.3", "walker": "^1.0.8" }, @@ -8811,10 +9277,24 @@ "fsevents": "^2.3.3" } }, + "node_modules/jest-haste-map/node_modules/@jest/pattern": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.4.0.tgz", + "integrity": "sha512-RAWn3+f9u8BsHijKJ71uHcFp6vmyEt6VvoWXkl6hKF3qVIuWNmudVjg12DlBPGup/frIl5UcUlH5HfEuvHpEXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-regex-util": "30.4.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/jest-haste-map/node_modules/@jest/schemas": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", - "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.4.1.tgz", + "integrity": "sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==", "dev": true, "license": "MIT", "dependencies": { @@ -8825,14 +9305,14 @@ } }, "node_modules/jest-haste-map/node_modules/@jest/types": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.3.0.tgz", - "integrity": "sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.4.1.tgz", + "integrity": "sha512-f1x/vJXIfjOlEmejYpbkbgw1gOqpPECwMvMEtBqe47j7H2Hg8h8w3o3ikhSXq3MI15kg+oQ0exWO0uCtTNJLoQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/pattern": "30.0.1", - "@jest/schemas": "30.0.5", + "@jest/pattern": "30.4.0", + "@jest/schemas": "30.4.1", "@types/istanbul-lib-coverage": "^2.0.6", "@types/istanbul-reports": "^3.0.4", "@types/node": "*", @@ -8859,14 +9339,24 @@ "node": ">=8" } }, + "node_modules/jest-haste-map/node_modules/jest-regex-util": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.4.0.tgz", + "integrity": "sha512-mWlvLviKIgIQ8VCuM1xRdD0TWp3zlzionlmDBjuXVBs+VkmXq6FgW9T4Emr7oGz/Rk6feDCGyiugolcQEyp3mg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/jest-haste-map/node_modules/jest-util": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.3.0.tgz", - "integrity": "sha512-/jZDa00a3Sz7rdyu55NLrQCIrbyIkbBxareejQI315f/i8HjYN+ZWsDLLpoQSiUIEIyZF/R8fDg3BmB8AtHttg==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.4.1.tgz", + "integrity": "sha512-vjQb1sACEiv13DKJMDToJpzVW0joCsIQrmbg0fi7CyOOt+g9jTuQl2A216pWRBYhOVt53XbL/2LbMKg1BECWOw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.3.0", + "@jest/types": "30.4.1", "@types/node": "*", "chalk": "^4.1.2", "ci-info": "^4.2.0", @@ -8878,23 +9368,23 @@ } }, "node_modules/jest-leak-detector": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-30.3.0.tgz", - "integrity": "sha512-cuKmUUGIjfXZAiGJ7TbEMx0bcqNdPPI6P1V+7aF+m/FUJqFDxkFR4JqkTu8ZOiU5AaX/x0hZ20KaaIPXQzbMGQ==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-30.4.1.tgz", + "integrity": "sha512-IpmyiioeHxiWDhesHnUFmOxcTzwCwKpgACgWajtAP+nYQXiY7DakTxB6Bx9JFiRMljr0AX1PvnQdaU1KFoz6NQ==", "dev": true, "license": "MIT", "dependencies": { "@jest/get-type": "30.1.0", - "pretty-format": "30.3.0" + "pretty-format": "30.4.1" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-leak-detector/node_modules/@jest/schemas": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", - "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.4.1.tgz", + "integrity": "sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==", "dev": true, "license": "MIT", "dependencies": { @@ -8918,15 +9408,16 @@ } }, "node_modules/jest-leak-detector/node_modules/pretty-format": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz", - "integrity": "sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.4.1.tgz", + "integrity": "sha512-K6KiKMHTL4jjX4u3Kir2EW07nRfcqVTXIImx50wbjHQTcZPgg+gjVeNTIT3l3L1Rd4UefxfogquC9J37SoFyyw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/schemas": "30.0.5", + "@jest/schemas": "30.4.1", "ansi-styles": "^5.2.0", - "react-is": "^18.3.1" + "react-is-18": "npm:react-is@^18.3.1", + "react-is-19": "npm:react-is@^19.2.5" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -9079,18 +9570,18 @@ } }, "node_modules/jest-resolve": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.3.0.tgz", - "integrity": "sha512-NRtTAHQlpd15F9rUR36jqwelbrDV/dY4vzNte3S2kxCKUJRYNd5/6nTSbYiak1VX5g8IoFF23Uj5TURkUW8O5g==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.4.1.tgz", + "integrity": "sha512-Zry8Yq/yJcNAZ7dJ5F2heic8AheXvbFZ7XI5V+h28nrYZ7Qoyy4dItq8OodjnYD270mvX+ZudmrNV9cysqhW5Q==", "dev": true, "license": "MIT", "dependencies": { "chalk": "^4.1.2", "graceful-fs": "^4.2.11", - "jest-haste-map": "30.3.0", + "jest-haste-map": "30.4.1", "jest-pnp-resolver": "^1.2.3", - "jest-util": "30.3.0", - "jest-validate": "30.3.0", + "jest-util": "30.4.1", + "jest-validate": "30.4.1", "slash": "^3.0.0", "unrs-resolver": "^1.7.11" }, @@ -9099,23 +9590,47 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.3.0.tgz", - "integrity": "sha512-9ev8s3YN6Hsyz9LV75XUwkCVFlwPbaFn6Wp75qnI0wzAINYWY8Fb3+6y59Rwd3QaS3kKXffHXsZMziMavfz/nw==", + "version": "30.4.2", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.4.2.tgz", + "integrity": "sha512-gDiVh1I+GxYzz9oXlyw+1wv6VOYX1WYxMOfjsA3iGKePV2oxmbHhwxfkALxNxYy1ciw6APWwkW2zZONwP97aEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-regex-util": "30.4.0", + "jest-snapshot": "30.4.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve-dependencies/node_modules/jest-regex-util": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.4.0.tgz", + "integrity": "sha512-mWlvLviKIgIQ8VCuM1xRdD0TWp3zlzionlmDBjuXVBs+VkmXq6FgW9T4Emr7oGz/Rk6feDCGyiugolcQEyp3mg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve/node_modules/@jest/pattern": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.4.0.tgz", + "integrity": "sha512-RAWn3+f9u8BsHijKJ71uHcFp6vmyEt6VvoWXkl6hKF3qVIuWNmudVjg12DlBPGup/frIl5UcUlH5HfEuvHpEXg==", "dev": true, "license": "MIT", "dependencies": { - "jest-regex-util": "30.0.1", - "jest-snapshot": "30.3.0" + "@types/node": "*", + "jest-regex-util": "30.4.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-resolve/node_modules/@jest/schemas": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", - "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.4.1.tgz", + "integrity": "sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==", "dev": true, "license": "MIT", "dependencies": { @@ -9126,14 +9641,14 @@ } }, "node_modules/jest-resolve/node_modules/@jest/types": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.3.0.tgz", - "integrity": "sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.4.1.tgz", + "integrity": "sha512-f1x/vJXIfjOlEmejYpbkbgw1gOqpPECwMvMEtBqe47j7H2Hg8h8w3o3ikhSXq3MI15kg+oQ0exWO0uCtTNJLoQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/pattern": "30.0.1", - "@jest/schemas": "30.0.5", + "@jest/pattern": "30.4.0", + "@jest/schemas": "30.4.1", "@types/istanbul-lib-coverage": "^2.0.6", "@types/istanbul-reports": "^3.0.4", "@types/node": "*", @@ -9160,14 +9675,24 @@ "node": ">=8" } }, + "node_modules/jest-resolve/node_modules/jest-regex-util": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.4.0.tgz", + "integrity": "sha512-mWlvLviKIgIQ8VCuM1xRdD0TWp3zlzionlmDBjuXVBs+VkmXq6FgW9T4Emr7oGz/Rk6feDCGyiugolcQEyp3mg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/jest-resolve/node_modules/jest-util": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.3.0.tgz", - "integrity": "sha512-/jZDa00a3Sz7rdyu55NLrQCIrbyIkbBxareejQI315f/i8HjYN+ZWsDLLpoQSiUIEIyZF/R8fDg3BmB8AtHttg==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.4.1.tgz", + "integrity": "sha512-vjQb1sACEiv13DKJMDToJpzVW0joCsIQrmbg0fi7CyOOt+g9jTuQl2A216pWRBYhOVt53XbL/2LbMKg1BECWOw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.3.0", + "@jest/types": "30.4.1", "@types/node": "*", "chalk": "^4.1.2", "ci-info": "^4.2.0", @@ -9179,32 +9704,32 @@ } }, "node_modules/jest-runner": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.3.0.tgz", - "integrity": "sha512-gDv6C9LGKWDPLia9TSzZwf4h3kMQCqyTpq+95PODnTRDO0g9os48XIYYkS6D236vjpBir2fF63YmJFtqkS5Duw==", + "version": "30.4.2", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.4.2.tgz", + "integrity": "sha512-2dw0PslVYXxffXGpLo+Ejad+KcI1Qkjn7f4X4619gf21oCUmL+SPfjqIa/losUem3yEOvfNZe/F1HWUcNpODcg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "30.3.0", - "@jest/environment": "30.3.0", - "@jest/test-result": "30.3.0", - "@jest/transform": "30.3.0", - "@jest/types": "30.3.0", + "@jest/console": "30.4.1", + "@jest/environment": "30.4.1", + "@jest/test-result": "30.4.1", + "@jest/transform": "30.4.1", + "@jest/types": "30.4.1", "@types/node": "*", "chalk": "^4.1.2", "emittery": "^0.13.1", "exit-x": "^0.2.2", "graceful-fs": "^4.2.11", - "jest-docblock": "30.2.0", - "jest-environment-node": "30.3.0", - "jest-haste-map": "30.3.0", - "jest-leak-detector": "30.3.0", - "jest-message-util": "30.3.0", - "jest-resolve": "30.3.0", - "jest-runtime": "30.3.0", - "jest-util": "30.3.0", - "jest-watcher": "30.3.0", - "jest-worker": "30.3.0", + "jest-docblock": "30.4.0", + "jest-environment-node": "30.4.1", + "jest-haste-map": "30.4.1", + "jest-leak-detector": "30.4.1", + "jest-message-util": "30.4.1", + "jest-resolve": "30.4.1", + "jest-runtime": "30.4.2", + "jest-util": "30.4.1", + "jest-watcher": "30.4.1", + "jest-worker": "30.4.1", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -9212,10 +9737,24 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, + "node_modules/jest-runner/node_modules/@jest/pattern": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.4.0.tgz", + "integrity": "sha512-RAWn3+f9u8BsHijKJ71uHcFp6vmyEt6VvoWXkl6hKF3qVIuWNmudVjg12DlBPGup/frIl5UcUlH5HfEuvHpEXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-regex-util": "30.4.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/jest-runner/node_modules/@jest/schemas": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", - "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.4.1.tgz", + "integrity": "sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==", "dev": true, "license": "MIT", "dependencies": { @@ -9226,14 +9765,14 @@ } }, "node_modules/jest-runner/node_modules/@jest/types": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.3.0.tgz", - "integrity": "sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.4.1.tgz", + "integrity": "sha512-f1x/vJXIfjOlEmejYpbkbgw1gOqpPECwMvMEtBqe47j7H2Hg8h8w3o3ikhSXq3MI15kg+oQ0exWO0uCtTNJLoQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/pattern": "30.0.1", - "@jest/schemas": "30.0.5", + "@jest/pattern": "30.4.0", + "@jest/schemas": "30.4.1", "@types/istanbul-lib-coverage": "^2.0.6", "@types/istanbul-reports": "^3.0.4", "@types/node": "*", @@ -9274,19 +9813,20 @@ } }, "node_modules/jest-runner/node_modules/jest-message-util": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.3.0.tgz", - "integrity": "sha512-Z/j4Bo+4ySJ+JPJN3b2Qbl9hDq3VrXmnjjGEWD/x0BCXeOXPTV1iZYYzl2X8c1MaCOL+ewMyNBcm88sboE6YWw==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.4.1.tgz", + "integrity": "sha512-kwCKIvq0MCW1HzLoGola9Te6JUdzgV0loyKJ3Qghrkz9i5/RRIHsL95BMQc2HBBhlBKC4j22K9p11TGHH8RBpQ==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@jest/types": "30.3.0", + "@jest/types": "30.4.1", "@types/stack-utils": "^2.0.3", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", + "jest-util": "30.4.1", "picomatch": "^4.0.3", - "pretty-format": "30.3.0", + "pretty-format": "30.4.1", "slash": "^3.0.0", "stack-utils": "^2.0.6" }, @@ -9294,14 +9834,24 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, + "node_modules/jest-runner/node_modules/jest-regex-util": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.4.0.tgz", + "integrity": "sha512-mWlvLviKIgIQ8VCuM1xRdD0TWp3zlzionlmDBjuXVBs+VkmXq6FgW9T4Emr7oGz/Rk6feDCGyiugolcQEyp3mg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/jest-runner/node_modules/jest-util": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.3.0.tgz", - "integrity": "sha512-/jZDa00a3Sz7rdyu55NLrQCIrbyIkbBxareejQI315f/i8HjYN+ZWsDLLpoQSiUIEIyZF/R8fDg3BmB8AtHttg==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.4.1.tgz", + "integrity": "sha512-vjQb1sACEiv13DKJMDToJpzVW0joCsIQrmbg0fi7CyOOt+g9jTuQl2A216pWRBYhOVt53XbL/2LbMKg1BECWOw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.3.0", + "@jest/types": "30.4.1", "@types/node": "*", "chalk": "^4.1.2", "ci-info": "^4.2.0", @@ -9313,47 +9863,48 @@ } }, "node_modules/jest-runner/node_modules/pretty-format": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz", - "integrity": "sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.4.1.tgz", + "integrity": "sha512-K6KiKMHTL4jjX4u3Kir2EW07nRfcqVTXIImx50wbjHQTcZPgg+gjVeNTIT3l3L1Rd4UefxfogquC9J37SoFyyw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/schemas": "30.0.5", + "@jest/schemas": "30.4.1", "ansi-styles": "^5.2.0", - "react-is": "^18.3.1" + "react-is-18": "npm:react-is@^18.3.1", + "react-is-19": "npm:react-is@^19.2.5" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-runtime": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.3.0.tgz", - "integrity": "sha512-CgC+hIBJbuh78HEffkhNKcbXAytQViplcl8xupqeIWyKQF50kCQA8J7GeJCkjisC6hpnC9Muf8jV5RdtdFbGng==", + "version": "30.4.2", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.4.2.tgz", + "integrity": "sha512-3/5e8iPz2k/VLqlr8DgTftYyLUv8Su3FkCAO2/Od81UsUTpSxOrS6O5x5KkoQwyUjmpYyDJKeyAvg2T2nvpNkQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "30.3.0", - "@jest/fake-timers": "30.3.0", - "@jest/globals": "30.3.0", + "@jest/environment": "30.4.1", + "@jest/fake-timers": "30.4.1", + "@jest/globals": "30.4.1", "@jest/source-map": "30.0.1", - "@jest/test-result": "30.3.0", - "@jest/transform": "30.3.0", - "@jest/types": "30.3.0", + "@jest/test-result": "30.4.1", + "@jest/transform": "30.4.1", + "@jest/types": "30.4.1", "@types/node": "*", "chalk": "^4.1.2", "cjs-module-lexer": "^2.1.0", "collect-v8-coverage": "^1.0.2", "glob": "^10.5.0", "graceful-fs": "^4.2.11", - "jest-haste-map": "30.3.0", - "jest-message-util": "30.3.0", - "jest-mock": "30.3.0", - "jest-regex-util": "30.0.1", - "jest-resolve": "30.3.0", - "jest-snapshot": "30.3.0", - "jest-util": "30.3.0", + "jest-haste-map": "30.4.1", + "jest-message-util": "30.4.1", + "jest-mock": "30.4.1", + "jest-regex-util": "30.4.0", + "jest-resolve": "30.4.1", + "jest-snapshot": "30.4.1", + "jest-util": "30.4.1", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -9361,10 +9912,24 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, + "node_modules/jest-runtime/node_modules/@jest/pattern": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.4.0.tgz", + "integrity": "sha512-RAWn3+f9u8BsHijKJ71uHcFp6vmyEt6VvoWXkl6hKF3qVIuWNmudVjg12DlBPGup/frIl5UcUlH5HfEuvHpEXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-regex-util": "30.4.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/jest-runtime/node_modules/@jest/schemas": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", - "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.4.1.tgz", + "integrity": "sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==", "dev": true, "license": "MIT", "dependencies": { @@ -9375,14 +9940,14 @@ } }, "node_modules/jest-runtime/node_modules/@jest/types": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.3.0.tgz", - "integrity": "sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.4.1.tgz", + "integrity": "sha512-f1x/vJXIfjOlEmejYpbkbgw1gOqpPECwMvMEtBqe47j7H2Hg8h8w3o3ikhSXq3MI15kg+oQ0exWO0uCtTNJLoQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/pattern": "30.0.1", - "@jest/schemas": "30.0.5", + "@jest/pattern": "30.4.0", + "@jest/schemas": "30.4.1", "@types/istanbul-lib-coverage": "^2.0.6", "@types/istanbul-reports": "^3.0.4", "@types/node": "*", @@ -9407,9 +9972,9 @@ } }, "node_modules/jest-runtime/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", "dev": true, "license": "MIT", "dependencies": { @@ -9455,19 +10020,20 @@ } }, "node_modules/jest-runtime/node_modules/jest-message-util": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.3.0.tgz", - "integrity": "sha512-Z/j4Bo+4ySJ+JPJN3b2Qbl9hDq3VrXmnjjGEWD/x0BCXeOXPTV1iZYYzl2X8c1MaCOL+ewMyNBcm88sboE6YWw==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.4.1.tgz", + "integrity": "sha512-kwCKIvq0MCW1HzLoGola9Te6JUdzgV0loyKJ3Qghrkz9i5/RRIHsL95BMQc2HBBhlBKC4j22K9p11TGHH8RBpQ==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@jest/types": "30.3.0", + "@jest/types": "30.4.1", "@types/stack-utils": "^2.0.3", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", + "jest-util": "30.4.1", "picomatch": "^4.0.3", - "pretty-format": "30.3.0", + "pretty-format": "30.4.1", "slash": "^3.0.0", "stack-utils": "^2.0.6" }, @@ -9475,14 +10041,39 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, + "node_modules/jest-runtime/node_modules/jest-mock": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.4.1.tgz", + "integrity": "sha512-/i8SVb8/NSB7RfNi8gfqu8gxLV23KaL5EpAttyb9iz8qWRIqXRLflycz/32wXsYkOnaUlx8NAKnJYtpsmXUmfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.4.1", + "@types/node": "*", + "jest-util": "30.4.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-runtime/node_modules/jest-regex-util": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.4.0.tgz", + "integrity": "sha512-mWlvLviKIgIQ8VCuM1xRdD0TWp3zlzionlmDBjuXVBs+VkmXq6FgW9T4Emr7oGz/Rk6feDCGyiugolcQEyp3mg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/jest-runtime/node_modules/jest-util": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.3.0.tgz", - "integrity": "sha512-/jZDa00a3Sz7rdyu55NLrQCIrbyIkbBxareejQI315f/i8HjYN+ZWsDLLpoQSiUIEIyZF/R8fDg3BmB8AtHttg==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.4.1.tgz", + "integrity": "sha512-vjQb1sACEiv13DKJMDToJpzVW0joCsIQrmbg0fi7CyOOt+g9jTuQl2A216pWRBYhOVt53XbL/2LbMKg1BECWOw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.3.0", + "@jest/types": "30.4.1", "@types/node": "*", "chalk": "^4.1.2", "ci-info": "^4.2.0", @@ -9510,24 +10101,25 @@ } }, "node_modules/jest-runtime/node_modules/pretty-format": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz", - "integrity": "sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.4.1.tgz", + "integrity": "sha512-K6KiKMHTL4jjX4u3Kir2EW07nRfcqVTXIImx50wbjHQTcZPgg+gjVeNTIT3l3L1Rd4UefxfogquC9J37SoFyyw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/schemas": "30.0.5", + "@jest/schemas": "30.4.1", "ansi-styles": "^5.2.0", - "react-is": "^18.3.1" + "react-is-18": "npm:react-is@^18.3.1", + "react-is-19": "npm:react-is@^19.2.5" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-snapshot": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.3.0.tgz", - "integrity": "sha512-f14c7atpb4O2DeNhwcvS810Y63wEn8O1HqK/luJ4F6M4NjvxmAKQwBUWjbExUtMxWJQ0wVgmCKymeJK6NZMnfQ==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.4.1.tgz", + "integrity": "sha512-tEOkkfOMppUyeiHwjZswOQ3lcnoTnws/q5FnGIaeIh/jmoU0ZlgMYRR8sTlTj+nNGCoJ0RDq6SfxGxCsyMTPmw==", "dev": true, "license": "MIT", "dependencies": { @@ -9536,20 +10128,20 @@ "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/plugin-syntax-typescript": "^7.27.1", "@babel/types": "^7.27.3", - "@jest/expect-utils": "30.3.0", + "@jest/expect-utils": "30.4.1", "@jest/get-type": "30.1.0", - "@jest/snapshot-utils": "30.3.0", - "@jest/transform": "30.3.0", - "@jest/types": "30.3.0", - "babel-preset-current-node-syntax": "^1.2.0", - "chalk": "^4.1.2", - "expect": "30.3.0", - "graceful-fs": "^4.2.11", - "jest-diff": "30.3.0", - "jest-matcher-utils": "30.3.0", - "jest-message-util": "30.3.0", - "jest-util": "30.3.0", - "pretty-format": "30.3.0", + "@jest/snapshot-utils": "30.4.1", + "@jest/transform": "30.4.1", + "@jest/types": "30.4.1", + "babel-preset-current-node-syntax": "^1.2.0", + "chalk": "^4.1.2", + "expect": "30.4.1", + "graceful-fs": "^4.2.11", + "jest-diff": "30.4.1", + "jest-matcher-utils": "30.4.1", + "jest-message-util": "30.4.1", + "jest-util": "30.4.1", + "pretty-format": "30.4.1", "semver": "^7.7.2", "synckit": "^0.11.8" }, @@ -9557,20 +10149,10 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/jest-snapshot/node_modules/@jest/diff-sequences": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.3.0.tgz", - "integrity": "sha512-cG51MVnLq1ecVUaQ3fr6YuuAOitHK1S4WUJHnsPFE/quQr33ADUx1FfrTCpMCRxvy0Yr9BThKpDjSlcTi91tMA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, "node_modules/jest-snapshot/node_modules/@jest/expect-utils": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.3.0.tgz", - "integrity": "sha512-j0+W5iQQ8hBh7tHZkTQv3q2Fh/M7Je72cIsYqC4OaktgtO7v1So9UTjp6uPBHIaB6beoF/RRsCgMJKvti0wADA==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.4.1.tgz", + "integrity": "sha512-ZBn5CglH8fBsQsvs4VWNzD4aWfUYks+IdOOQU3MEK71ol/BcVm+P+rtb1KpiFBpSWSCE27uOahyyf1vfqOVbcQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9580,44 +10162,42 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/jest-snapshot/node_modules/@jest/schemas": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", - "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "node_modules/jest-snapshot/node_modules/@jest/pattern": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.4.0.tgz", + "integrity": "sha512-RAWn3+f9u8BsHijKJ71uHcFp6vmyEt6VvoWXkl6hKF3qVIuWNmudVjg12DlBPGup/frIl5UcUlH5HfEuvHpEXg==", "dev": true, "license": "MIT", "dependencies": { - "@sinclair/typebox": "^0.34.0" + "@types/node": "*", + "jest-regex-util": "30.4.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/jest-snapshot/node_modules/@jest/snapshot-utils": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/snapshot-utils/-/snapshot-utils-30.3.0.tgz", - "integrity": "sha512-ORbRN9sf5PP82v3FXNSwmO1OTDR2vzR2YTaR+E3VkSBZ8zadQE6IqYdYEeFH1NIkeB2HIGdF02dapb6K0Mj05g==", + "node_modules/jest-snapshot/node_modules/@jest/schemas": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.4.1.tgz", + "integrity": "sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.3.0", - "chalk": "^4.1.2", - "graceful-fs": "^4.2.11", - "natural-compare": "^1.4.0" + "@sinclair/typebox": "^0.34.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-snapshot/node_modules/@jest/types": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.3.0.tgz", - "integrity": "sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.4.1.tgz", + "integrity": "sha512-f1x/vJXIfjOlEmejYpbkbgw1gOqpPECwMvMEtBqe47j7H2Hg8h8w3o3ikhSXq3MI15kg+oQ0exWO0uCtTNJLoQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/pattern": "30.0.1", - "@jest/schemas": "30.0.5", + "@jest/pattern": "30.4.0", + "@jest/schemas": "30.4.1", "@types/istanbul-lib-coverage": "^2.0.6", "@types/istanbul-reports": "^3.0.4", "@types/node": "*", @@ -9658,69 +10238,70 @@ } }, "node_modules/jest-snapshot/node_modules/expect": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-30.3.0.tgz", - "integrity": "sha512-1zQrciTiQfRdo7qJM1uG4navm8DayFa2TgCSRlzUyNkhcJ6XUZF3hjnpkyr3VhAqPH7i/9GkG7Tv5abz6fqz0Q==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-30.4.1.tgz", + "integrity": "sha512-PMARsyh/JtqC20HoGqlFcIlQAyqUtW4PlI1rup1uhYJtKuwAjbvWi3GQMAn+STdHum/dk8xrKfUM1+5SAwpolA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/expect-utils": "30.3.0", + "@jest/expect-utils": "30.4.1", "@jest/get-type": "30.1.0", - "jest-matcher-utils": "30.3.0", - "jest-message-util": "30.3.0", - "jest-mock": "30.3.0", - "jest-util": "30.3.0" + "jest-matcher-utils": "30.4.1", + "jest-message-util": "30.4.1", + "jest-mock": "30.4.1", + "jest-util": "30.4.1" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-snapshot/node_modules/jest-diff": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.3.0.tgz", - "integrity": "sha512-n3q4PDQjS4LrKxfWB3Z5KNk1XjXtZTBwQp71OP0Jo03Z6V60x++K5L8k6ZrW8MY8pOFylZvHM0zsjS1RqlHJZQ==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.4.1.tgz", + "integrity": "sha512-CRpFK0RtLriVDGcPPAnR6HMVI8bSR2jnUIgralhauzYQZIb4RH9AtEInTuQr65LmmGggGcRT6HIASxwqsVsmlA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/diff-sequences": "30.3.0", + "@jest/diff-sequences": "30.4.0", "@jest/get-type": "30.1.0", "chalk": "^4.1.2", - "pretty-format": "30.3.0" + "pretty-format": "30.4.1" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-snapshot/node_modules/jest-matcher-utils": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.3.0.tgz", - "integrity": "sha512-HEtc9uFQgaUHkC7nLSlQL3Tph4Pjxt/yiPvkIrrDCt9jhoLIgxaubo1G+CFOnmHYMxHwwdaSN7mkIFs6ZK8OhA==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.4.1.tgz", + "integrity": "sha512-zvYfX5CaeEkFrrLS9suWe9rvJrm9J1Iv3ua8kIBv9GEPzcnsfBf0bob37la7s67fs0nlBC3EuvkOLnXQKxtx4A==", "dev": true, "license": "MIT", "dependencies": { "@jest/get-type": "30.1.0", "chalk": "^4.1.2", - "jest-diff": "30.3.0", - "pretty-format": "30.3.0" + "jest-diff": "30.4.1", + "pretty-format": "30.4.1" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-snapshot/node_modules/jest-message-util": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.3.0.tgz", - "integrity": "sha512-Z/j4Bo+4ySJ+JPJN3b2Qbl9hDq3VrXmnjjGEWD/x0BCXeOXPTV1iZYYzl2X8c1MaCOL+ewMyNBcm88sboE6YWw==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.4.1.tgz", + "integrity": "sha512-kwCKIvq0MCW1HzLoGola9Te6JUdzgV0loyKJ3Qghrkz9i5/RRIHsL95BMQc2HBBhlBKC4j22K9p11TGHH8RBpQ==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@jest/types": "30.3.0", + "@jest/types": "30.4.1", "@types/stack-utils": "^2.0.3", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", + "jest-util": "30.4.1", "picomatch": "^4.0.3", - "pretty-format": "30.3.0", + "pretty-format": "30.4.1", "slash": "^3.0.0", "stack-utils": "^2.0.6" }, @@ -9728,14 +10309,39 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, + "node_modules/jest-snapshot/node_modules/jest-mock": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.4.1.tgz", + "integrity": "sha512-/i8SVb8/NSB7RfNi8gfqu8gxLV23KaL5EpAttyb9iz8qWRIqXRLflycz/32wXsYkOnaUlx8NAKnJYtpsmXUmfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.4.1", + "@types/node": "*", + "jest-util": "30.4.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/jest-regex-util": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.4.0.tgz", + "integrity": "sha512-mWlvLviKIgIQ8VCuM1xRdD0TWp3zlzionlmDBjuXVBs+VkmXq6FgW9T4Emr7oGz/Rk6feDCGyiugolcQEyp3mg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/jest-snapshot/node_modules/jest-util": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.3.0.tgz", - "integrity": "sha512-/jZDa00a3Sz7rdyu55NLrQCIrbyIkbBxareejQI315f/i8HjYN+ZWsDLLpoQSiUIEIyZF/R8fDg3BmB8AtHttg==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.4.1.tgz", + "integrity": "sha512-vjQb1sACEiv13DKJMDToJpzVW0joCsIQrmbg0fi7CyOOt+g9jTuQl2A216pWRBYhOVt53XbL/2LbMKg1BECWOw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.3.0", + "@jest/types": "30.4.1", "@types/node": "*", "chalk": "^4.1.2", "ci-info": "^4.2.0", @@ -9747,15 +10353,16 @@ } }, "node_modules/jest-snapshot/node_modules/pretty-format": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz", - "integrity": "sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.4.1.tgz", + "integrity": "sha512-K6KiKMHTL4jjX4u3Kir2EW07nRfcqVTXIImx50wbjHQTcZPgg+gjVeNTIT3l3L1Rd4UefxfogquC9J37SoFyyw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/schemas": "30.0.5", + "@jest/schemas": "30.4.1", "ansi-styles": "^5.2.0", - "react-is": "^18.3.1" + "react-is-18": "npm:react-is@^18.3.1", + "react-is-19": "npm:react-is@^19.2.5" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -9793,27 +10400,41 @@ } }, "node_modules/jest-validate": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-30.3.0.tgz", - "integrity": "sha512-I/xzC8h5G+SHCb2P2gWkJYrNiTbeL47KvKeW5EzplkyxzBRBw1ssSHlI/jXec0ukH2q7x2zAWQm7015iusg62Q==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-30.4.1.tgz", + "integrity": "sha512-PDWi4SOwLnwqNDfHZjOcsEFyZ4fc/2W2gVL3DEoyqnB6jCQMLRtfBong8s6omIw3lI0HWOus12xfnFmQtjW3fw==", "dev": true, "license": "MIT", "dependencies": { "@jest/get-type": "30.1.0", - "@jest/types": "30.3.0", + "@jest/types": "30.4.1", "camelcase": "^6.3.0", "chalk": "^4.1.2", "leven": "^3.1.0", - "pretty-format": "30.3.0" + "pretty-format": "30.4.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-validate/node_modules/@jest/pattern": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.4.0.tgz", + "integrity": "sha512-RAWn3+f9u8BsHijKJ71uHcFp6vmyEt6VvoWXkl6hKF3qVIuWNmudVjg12DlBPGup/frIl5UcUlH5HfEuvHpEXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-regex-util": "30.4.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-validate/node_modules/@jest/schemas": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", - "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.4.1.tgz", + "integrity": "sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==", "dev": true, "license": "MIT", "dependencies": { @@ -9824,14 +10445,14 @@ } }, "node_modules/jest-validate/node_modules/@jest/types": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.3.0.tgz", - "integrity": "sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.4.1.tgz", + "integrity": "sha512-f1x/vJXIfjOlEmejYpbkbgw1gOqpPECwMvMEtBqe47j7H2Hg8h8w3o3ikhSXq3MI15kg+oQ0exWO0uCtTNJLoQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/pattern": "30.0.1", - "@jest/schemas": "30.0.5", + "@jest/pattern": "30.4.0", + "@jest/schemas": "30.4.1", "@types/istanbul-lib-coverage": "^2.0.6", "@types/istanbul-reports": "^3.0.4", "@types/node": "*", @@ -9868,45 +10489,70 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/jest-validate/node_modules/jest-regex-util": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.4.0.tgz", + "integrity": "sha512-mWlvLviKIgIQ8VCuM1xRdD0TWp3zlzionlmDBjuXVBs+VkmXq6FgW9T4Emr7oGz/Rk6feDCGyiugolcQEyp3mg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/jest-validate/node_modules/pretty-format": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz", - "integrity": "sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.4.1.tgz", + "integrity": "sha512-K6KiKMHTL4jjX4u3Kir2EW07nRfcqVTXIImx50wbjHQTcZPgg+gjVeNTIT3l3L1Rd4UefxfogquC9J37SoFyyw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/schemas": "30.0.5", + "@jest/schemas": "30.4.1", "ansi-styles": "^5.2.0", - "react-is": "^18.3.1" + "react-is-18": "npm:react-is@^18.3.1", + "react-is-19": "npm:react-is@^19.2.5" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-watcher": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.3.0.tgz", - "integrity": "sha512-PJ1d9ThtTR8aMiBWUdcownq9mDdLXsQzJayTk4kmaBRHKvwNQn+ANveuhEBUyNI2hR1TVhvQ8D5kHubbzBHR/w==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.4.1.tgz", + "integrity": "sha512-/l9UonmvCwjHH7d2h3iAwIloLc1H0S8mJZ/LNK3i86hqwPAz8otUJjP9MfYtz9Tt77Su5FD2xGjZn8d31IZHlw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/test-result": "30.3.0", - "@jest/types": "30.3.0", + "@jest/test-result": "30.4.1", + "@jest/types": "30.4.1", "@types/node": "*", "ansi-escapes": "^4.3.2", "chalk": "^4.1.2", "emittery": "^0.13.1", - "jest-util": "30.3.0", + "jest-util": "30.4.1", "string-length": "^4.0.2" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, + "node_modules/jest-watcher/node_modules/@jest/pattern": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.4.0.tgz", + "integrity": "sha512-RAWn3+f9u8BsHijKJ71uHcFp6vmyEt6VvoWXkl6hKF3qVIuWNmudVjg12DlBPGup/frIl5UcUlH5HfEuvHpEXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-regex-util": "30.4.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/jest-watcher/node_modules/@jest/schemas": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", - "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.4.1.tgz", + "integrity": "sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==", "dev": true, "license": "MIT", "dependencies": { @@ -9917,14 +10563,14 @@ } }, "node_modules/jest-watcher/node_modules/@jest/types": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.3.0.tgz", - "integrity": "sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.4.1.tgz", + "integrity": "sha512-f1x/vJXIfjOlEmejYpbkbgw1gOqpPECwMvMEtBqe47j7H2Hg8h8w3o3ikhSXq3MI15kg+oQ0exWO0uCtTNJLoQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/pattern": "30.0.1", - "@jest/schemas": "30.0.5", + "@jest/pattern": "30.4.0", + "@jest/schemas": "30.4.1", "@types/istanbul-lib-coverage": "^2.0.6", "@types/istanbul-reports": "^3.0.4", "@types/node": "*", @@ -9951,14 +10597,24 @@ "node": ">=8" } }, + "node_modules/jest-watcher/node_modules/jest-regex-util": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.4.0.tgz", + "integrity": "sha512-mWlvLviKIgIQ8VCuM1xRdD0TWp3zlzionlmDBjuXVBs+VkmXq6FgW9T4Emr7oGz/Rk6feDCGyiugolcQEyp3mg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/jest-watcher/node_modules/jest-util": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.3.0.tgz", - "integrity": "sha512-/jZDa00a3Sz7rdyu55NLrQCIrbyIkbBxareejQI315f/i8HjYN+ZWsDLLpoQSiUIEIyZF/R8fDg3BmB8AtHttg==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.4.1.tgz", + "integrity": "sha512-vjQb1sACEiv13DKJMDToJpzVW0joCsIQrmbg0fi7CyOOt+g9jTuQl2A216pWRBYhOVt53XbL/2LbMKg1BECWOw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.3.0", + "@jest/types": "30.4.1", "@types/node": "*", "chalk": "^4.1.2", "ci-info": "^4.2.0", @@ -9970,15 +10626,15 @@ } }, "node_modules/jest-worker": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.3.0.tgz", - "integrity": "sha512-DrCKkaQwHexjRUFTmPzs7sHQe0TSj9nvDALKGdwmK5mW9v7j90BudWirKAJHt3QQ9Dhrg1F7DogPzhChppkJpQ==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.4.1.tgz", + "integrity": "sha512-SHynN/q/QD++iNyvMdy+WMmbCGk8jIsNcRxycXbWubSOhvo6T+j2afcfUSl+3hYsiBebOTo0cT7c2H7CXugu1g==", "dev": true, "license": "MIT", "dependencies": { "@types/node": "*", "@ungap/structured-clone": "^1.3.0", - "jest-util": "30.3.0", + "jest-util": "30.4.1", "merge-stream": "^2.0.0", "supports-color": "^8.1.1" }, @@ -9986,10 +10642,24 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, + "node_modules/jest-worker/node_modules/@jest/pattern": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.4.0.tgz", + "integrity": "sha512-RAWn3+f9u8BsHijKJ71uHcFp6vmyEt6VvoWXkl6hKF3qVIuWNmudVjg12DlBPGup/frIl5UcUlH5HfEuvHpEXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-regex-util": "30.4.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/jest-worker/node_modules/@jest/schemas": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", - "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.4.1.tgz", + "integrity": "sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==", "dev": true, "license": "MIT", "dependencies": { @@ -10000,14 +10670,14 @@ } }, "node_modules/jest-worker/node_modules/@jest/types": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.3.0.tgz", - "integrity": "sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.4.1.tgz", + "integrity": "sha512-f1x/vJXIfjOlEmejYpbkbgw1gOqpPECwMvMEtBqe47j7H2Hg8h8w3o3ikhSXq3MI15kg+oQ0exWO0uCtTNJLoQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/pattern": "30.0.1", - "@jest/schemas": "30.0.5", + "@jest/pattern": "30.4.0", + "@jest/schemas": "30.4.1", "@types/istanbul-lib-coverage": "^2.0.6", "@types/istanbul-reports": "^3.0.4", "@types/node": "*", @@ -10034,14 +10704,24 @@ "node": ">=8" } }, + "node_modules/jest-worker/node_modules/jest-regex-util": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.4.0.tgz", + "integrity": "sha512-mWlvLviKIgIQ8VCuM1xRdD0TWp3zlzionlmDBjuXVBs+VkmXq6FgW9T4Emr7oGz/Rk6feDCGyiugolcQEyp3mg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/jest-worker/node_modules/jest-util": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.3.0.tgz", - "integrity": "sha512-/jZDa00a3Sz7rdyu55NLrQCIrbyIkbBxareejQI315f/i8HjYN+ZWsDLLpoQSiUIEIyZF/R8fDg3BmB8AtHttg==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.4.1.tgz", + "integrity": "sha512-vjQb1sACEiv13DKJMDToJpzVW0joCsIQrmbg0fi7CyOOt+g9jTuQl2A216pWRBYhOVt53XbL/2LbMKg1BECWOw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.3.0", + "@jest/types": "30.4.1", "@types/node": "*", "chalk": "^4.1.2", "ci-info": "^4.2.0", @@ -10068,10 +10748,24 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/jest/node_modules/@jest/pattern": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.4.0.tgz", + "integrity": "sha512-RAWn3+f9u8BsHijKJ71uHcFp6vmyEt6VvoWXkl6hKF3qVIuWNmudVjg12DlBPGup/frIl5UcUlH5HfEuvHpEXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-regex-util": "30.4.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/jest/node_modules/@jest/schemas": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", - "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.4.1.tgz", + "integrity": "sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==", "dev": true, "license": "MIT", "dependencies": { @@ -10082,14 +10776,14 @@ } }, "node_modules/jest/node_modules/@jest/types": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.3.0.tgz", - "integrity": "sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.4.1.tgz", + "integrity": "sha512-f1x/vJXIfjOlEmejYpbkbgw1gOqpPECwMvMEtBqe47j7H2Hg8h8w3o3ikhSXq3MI15kg+oQ0exWO0uCtTNJLoQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/pattern": "30.0.1", - "@jest/schemas": "30.0.5", + "@jest/pattern": "30.4.0", + "@jest/schemas": "30.4.1", "@types/istanbul-lib-coverage": "^2.0.6", "@types/istanbul-reports": "^3.0.4", "@types/node": "*", @@ -10100,6 +10794,16 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, + "node_modules/jest/node_modules/jest-regex-util": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.4.0.tgz", + "integrity": "sha512-mWlvLviKIgIQ8VCuM1xRdD0TWp3zlzionlmDBjuXVBs+VkmXq6FgW9T4Emr7oGz/Rk6feDCGyiugolcQEyp3mg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -10616,28 +11320,6 @@ "resolved": "packages/matrix-protection-suite-for-matrix-bot-sdk", "link": true }, - "node_modules/mdast-util-to-hast": { - "version": "13.2.1", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", - "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@ungap/structured-clone": "^1.0.0", - "devlop": "^1.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "trim-lines": "^3.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/mdurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", @@ -10670,118 +11352,24 @@ "dev": true, "license": "MIT" }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-encode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", - "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-sanitize-uri": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", - "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", - "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } }, "node_modules/micromatch": { "version": "4.0.8", @@ -10872,9 +11460,9 @@ "license": "ISC" }, "node_modules/minimatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.3.tgz", - "integrity": "sha512-M2GCs7Vk83NxkUyQV1bkABc4yxgz9kILhHImZiBPAZ9ybuvCb0/H7lEl5XvIg3g+9d4eNotkZA5IWwYl0tibaA==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -11414,18 +12002,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/oniguruma-to-es": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-2.3.0.tgz", - "integrity": "sha512-bwALDxriqfKGfUufKGGepCzu9x7nJQuoRoAFp4AnwehhC2crqrDIAP/uN2qdlsAvSMpeRC3+Yzhqc7hLmle5+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex-xs": "^1.0.0", - "regex": "^5.1.1", - "regex-recursion": "^5.1.1" - } - }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -11835,9 +12411,9 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", "engines": { @@ -12062,9 +12638,9 @@ } }, "node_modules/prettier": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", - "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.3.tgz", + "integrity": "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==", "dev": true, "license": "MIT", "bin": { @@ -12118,17 +12694,6 @@ "node": "^16 || ^18 || >=20" } }, - "node_modules/property-information": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", - "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -12349,6 +12914,22 @@ "dev": true, "license": "MIT" }, + "node_modules/react-is-18": { + "name": "react-is", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/react-is-19": { + "name": "react-is", + "version": "19.2.6", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.6.tgz", + "integrity": "sha512-XjBR15BhXuylgWGuslhDKqlSayuqvqBX91BP8pauG8kd1zY8kotkNWbXksTCNRarse4kuGbe2kIY05ARtwNIvw==", + "dev": true, + "license": "MIT" + }, "node_modules/read-yaml-file": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/read-yaml-file/-/read-yaml-file-1.1.0.tgz", @@ -12449,34 +13030,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/regex": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/regex/-/regex-5.1.1.tgz", - "integrity": "sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "regex-utilities": "^2.3.0" - } - }, - "node_modules/regex-recursion": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-5.1.1.tgz", - "integrity": "sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w==", - "dev": true, - "license": "MIT", - "dependencies": { - "regex": "^5.1.1", - "regex-utilities": "^2.3.0" - } - }, - "node_modules/regex-utilities": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", - "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", - "dev": true, - "license": "MIT" - }, "node_modules/request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", @@ -12725,9 +13278,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.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -12829,65 +13382,6 @@ "node": ">=8" } }, - "node_modules/shiki": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.29.2.tgz", - "integrity": "sha512-njXuliz/cP+67jU2hukkxCNuH1yUi4QfdZZY+sMr5PPrIyXSu5iTb/qYC4BiWWB0vZ+7TbdvYUCeL23zpwCfbg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/core": "1.29.2", - "@shikijs/engine-javascript": "1.29.2", - "@shikijs/engine-oniguruma": "1.29.2", - "@shikijs/langs": "1.29.2", - "@shikijs/themes": "1.29.2", - "@shikijs/types": "1.29.2", - "@shikijs/vscode-textmate": "^10.0.1", - "@types/hast": "^3.0.4" - } - }, - "node_modules/shiki/node_modules/@shikijs/engine-oniguruma": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.29.2.tgz", - "integrity": "sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/types": "1.29.2", - "@shikijs/vscode-textmate": "^10.0.1" - } - }, - "node_modules/shiki/node_modules/@shikijs/langs": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-1.29.2.tgz", - "integrity": "sha512-FIBA7N3LZ+223U7cJDUYd5shmciFQlYkFXlkKVaHsCPgfVLiO+e12FmQE6Tf9vuyEsFe3dIl8qGWKXgEHL9wmQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/types": "1.29.2" - } - }, - "node_modules/shiki/node_modules/@shikijs/themes": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-1.29.2.tgz", - "integrity": "sha512-i9TNZlsq4uoyqSbluIcZkmPL9Bfi3djVxRnofUHwvx/h6SRW3cwgBC5SML7vsDcWyukY0eCzVN980rqP6qNl9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/types": "1.29.2" - } - }, - "node_modules/shiki/node_modules/@shikijs/types": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.29.2.tgz", - "integrity": "sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/vscode-textmate": "^10.0.1", - "@types/hast": "^3.0.4" - } - }, "node_modules/side-channel": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", @@ -13052,17 +13546,6 @@ "source-map": "^0.6.0" } }, - "node_modules/space-separated-tokens": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/spawndamnit": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spawndamnit/-/spawndamnit-3.0.1.tgz", @@ -13241,21 +13724,6 @@ "node": ">=8" } }, - "node_modules/stringify-entities": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", - "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", - "dev": true, - "license": "MIT", - "dependencies": { - "character-entities-html4": "^2.0.0", - "character-entities-legacy": "^3.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -13422,14 +13890,14 @@ "license": "MIT" }, "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", "dev": true, "license": "MIT", "dependencies": { "fdir": "^6.5.0", - "picomatch": "^4.0.3" + "picomatch": "^4.0.4" }, "engines": { "node": ">=12.0.0" @@ -13492,17 +13960,6 @@ "node": ">=18" } }, - "node_modules/trim-lines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", - "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/triple-beam": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", @@ -13513,9 +13970,9 @@ } }, "node_modules/ts-api-utils": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", - "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", "dev": true, "license": "MIT", "engines": { @@ -13544,19 +14001,19 @@ } }, "node_modules/ts-jest": { - "version": "29.4.6", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.6.tgz", - "integrity": "sha512-fSpWtOO/1AjSNQguk43hb/JCo16oJDnMJf3CdEGNkqsEX3t0KX96xvyX1D7PfLCpVoKu4MfVrqUkFyblYoY4lA==", + "version": "29.4.11", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.11.tgz", + "integrity": "sha512-IrFl7l9AuB/qrNw5quqvAv/hmKMb8dhWOH4jQOGo0Oq8tCeo1O86/iTFG1FaRimgUkF13l4PcepO8ATFT6Ns4g==", "dev": true, "license": "MIT", "dependencies": { "bs-logger": "^0.2.6", "fast-json-stable-stringify": "^2.1.0", - "handlebars": "^4.7.8", + "handlebars": "^4.7.9", "json5": "^2.2.3", "lodash.memoize": "^4.1.2", "make-error": "^1.3.6", - "semver": "^7.7.3", + "semver": "^7.8.0", "type-fest": "^4.41.0", "yargs-parser": "^21.1.1" }, @@ -13573,7 +14030,7 @@ "babel-jest": "^29.0.0 || ^30.0.0", "jest": "^29.0.0 || ^30.0.0", "jest-util": "^29.0.0 || ^30.0.0", - "typescript": ">=4.3 <6" + "typescript": ">=4.3 <7" }, "peerDependenciesMeta": { "@babel/core": { @@ -13739,17 +14196,17 @@ } }, "node_modules/typedoc": { - "version": "0.28.17", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.28.17.tgz", - "integrity": "sha512-ZkJ2G7mZrbxrKxinTQMjFqsCoYY6a5Luwv2GKbTnBCEgV2ihYm5CflA9JnJAwH0pZWavqfYxmDkFHPt4yx2oDQ==", + "version": "0.28.19", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.28.19.tgz", + "integrity": "sha512-wKh+lhdmMFivMlc6vRRcMGXeGEHGU2g8a2CkPTJjJlwRf1iXbimWIPcFolCqe4E0d/FRtGszpIrsp3WLpDB8Pw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@gerrit0/mini-shiki": "^3.17.0", + "@gerrit0/mini-shiki": "^3.23.0", "lunr": "^2.3.9", - "markdown-it": "^14.1.0", - "minimatch": "^9.0.5", - "yaml": "^2.8.1" + "markdown-it": "^14.1.1", + "minimatch": "^10.2.5", + "yaml": "^2.8.3" }, "bin": { "typedoc": "bin/typedoc" @@ -13759,7 +14216,7 @@ "pnpm": ">= 10" }, "peerDependencies": { - "typescript": "5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x || 5.9.x" + "typescript": "5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x || 5.9.x || 6.0.x" } }, "node_modules/typedoc/node_modules/balanced-match": { @@ -13773,9 +14230,9 @@ } }, "node_modules/typedoc/node_modules/brace-expansion": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz", - "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", "dev": true, "license": "MIT", "dependencies": { @@ -13786,16 +14243,16 @@ } }, "node_modules/typedoc/node_modules/minimatch": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.6.tgz", - "integrity": "sha512-kQAVowdR33euIqeA0+VZTDqU+qo1IeVY+hrKYtZMio3Pg0P0vuh/kwRylLUddJhB6pf3q/botcOvRtx4IN1wqQ==", + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^5.0.2" + "brace-expansion": "^5.0.5" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -13816,16 +14273,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.56.1.tgz", - "integrity": "sha512-U4lM6pjmBX7J5wk4szltF7I1cGBHXZopnAXCMXb3+fZ3B/0Z3hq3wS/CCUB2NZBNAExK92mCU2tEohWuwVMsDQ==", + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.59.4.tgz", + "integrity": "sha512-Rw6+44QNFaXtgHSjPy+Kw8hrJniMYzR85E9yLmOLcfZ91/rz+JXQbDTCmc6ccxMPY6K6PgAq26f0JCBfR7LIPQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.56.1", - "@typescript-eslint/parser": "8.56.1", - "@typescript-eslint/typescript-estree": "8.56.1", - "@typescript-eslint/utils": "8.56.1" + "@typescript-eslint/eslint-plugin": "8.59.4", + "@typescript-eslint/parser": "8.59.4", + "@typescript-eslint/typescript-estree": "8.59.4", + "@typescript-eslint/utils": "8.59.4" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -13836,7 +14293,7 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/uc.micro": { @@ -13884,79 +14341,6 @@ "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==", "license": "MIT" }, - "node_modules/unist-util-is": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", - "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-position": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", - "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-stringify-position": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", - "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", - "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit-parents": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", - "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/universalify": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", @@ -13976,38 +14360,41 @@ } }, "node_modules/unrs-resolver": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", - "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.12.2.tgz", + "integrity": "sha512-dmlRxBJJayXjqTwC+JtF1HhJmgf3ftQ3YejFcZrf4+KKtJv0qDsK1pjqaaVjG7wJ5NJ6UVP1OqRMQ71Z4C3rxQ==", "dev": true, "hasInstallScript": true, "license": "MIT", "dependencies": { - "napi-postinstall": "^0.3.0" + "napi-postinstall": "^0.3.4" }, "funding": { "url": "https://opencollective.com/unrs-resolver" }, "optionalDependencies": { - "@unrs/resolver-binding-android-arm-eabi": "1.11.1", - "@unrs/resolver-binding-android-arm64": "1.11.1", - "@unrs/resolver-binding-darwin-arm64": "1.11.1", - "@unrs/resolver-binding-darwin-x64": "1.11.1", - "@unrs/resolver-binding-freebsd-x64": "1.11.1", - "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", - "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", - "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", - "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", - "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", - "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-x64-musl": "1.11.1", - "@unrs/resolver-binding-wasm32-wasi": "1.11.1", - "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", - "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", - "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" + "@unrs/resolver-binding-android-arm-eabi": "1.12.2", + "@unrs/resolver-binding-android-arm64": "1.12.2", + "@unrs/resolver-binding-darwin-arm64": "1.12.2", + "@unrs/resolver-binding-darwin-x64": "1.12.2", + "@unrs/resolver-binding-freebsd-x64": "1.12.2", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.12.2", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.12.2", + "@unrs/resolver-binding-linux-arm64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-arm64-musl": "1.12.2", + "@unrs/resolver-binding-linux-loong64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-loong64-musl": "1.12.2", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-riscv64-musl": "1.12.2", + "@unrs/resolver-binding-linux-s390x-gnu": "1.12.2", + "@unrs/resolver-binding-linux-x64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-x64-musl": "1.12.2", + "@unrs/resolver-binding-openharmony-arm64": "1.12.2", + "@unrs/resolver-binding-wasm32-wasi": "1.12.2", + "@unrs/resolver-binding-win32-arm64-msvc": "1.12.2", + "@unrs/resolver-binding-win32-ia32-msvc": "1.12.2", + "@unrs/resolver-binding-win32-x64-msvc": "1.12.2" } }, "node_modules/update-browserslist-db": { @@ -14130,36 +14517,6 @@ "extsprintf": "^1.2.0" } }, - "node_modules/vfile": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", - "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-message": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", - "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/w3c-xmlserializer": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", @@ -14478,9 +14835,9 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", - "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", "license": "ISC", "bin": { "yaml": "bin.mjs" @@ -14573,17 +14930,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/zwitch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", - "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "packages/interface-manager": { "name": "@the-draupnir-project/interface-manager", "version": "4.2.6", @@ -14664,7 +15010,7 @@ "@types/node": "^24.12.4", "@vector-im/matrix-bot-sdk": "0.8.0-element.3", "matrix-protection-suite": "npm:@the-draupnir-project/matrix-protection-suite@7.1.0", - "typedoc": "^0.26.3" + "typedoc": "^0.28.0" }, "peerDependencies": { "@sinclair/typebox": "0.34.49", @@ -14683,83 +15029,6 @@ "undici-types": "~7.16.0" } }, - "packages/matrix-protection-suite-for-matrix-bot-sdk/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", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "packages/matrix-protection-suite-for-matrix-bot-sdk/node_modules/brace-expansion": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz", - "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - } - }, - "packages/matrix-protection-suite-for-matrix-bot-sdk/node_modules/minimatch": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.6.tgz", - "integrity": "sha512-kQAVowdR33euIqeA0+VZTDqU+qo1IeVY+hrKYtZMio3Pg0P0vuh/kwRylLUddJhB6pf3q/botcOvRtx4IN1wqQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^5.0.2" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "packages/matrix-protection-suite-for-matrix-bot-sdk/node_modules/typedoc": { - "version": "0.26.11", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.26.11.tgz", - "integrity": "sha512-sFEgRRtrcDl2FxVP58Ze++ZK2UQAEvtvvH8rRlig1Ja3o7dDaMHmaBfvJmdGnNEFaLTpQsN8dpvZaTqJSu/Ugw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "lunr": "^2.3.9", - "markdown-it": "^14.1.0", - "minimatch": "^9.0.5", - "shiki": "^1.16.2", - "yaml": "^2.5.1" - }, - "bin": { - "typedoc": "bin/typedoc" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x" - } - }, - "packages/matrix-protection-suite-for-matrix-bot-sdk/node_modules/typescript": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", - "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, "packages/matrix-protection-suite-for-matrix-bot-sdk/node_modules/undici-types": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", diff --git a/packages/matrix-protection-suite-for-matrix-bot-sdk/package.json b/packages/matrix-protection-suite-for-matrix-bot-sdk/package.json index 0fb4f6ec..44368e79 100644 --- a/packages/matrix-protection-suite-for-matrix-bot-sdk/package.json +++ b/packages/matrix-protection-suite-for-matrix-bot-sdk/package.json @@ -27,7 +27,7 @@ "@types/node": "^24.12.4", "@vector-im/matrix-bot-sdk": "0.8.0-element.3", "matrix-protection-suite": "npm:@the-draupnir-project/matrix-protection-suite@7.1.0", - "typedoc": "^0.26.3" + "typedoc": "^0.28.0" }, "dependencies": { "@gnuxie/typescript-result": "^1.0.0", From 490f7a772998106c570639e0c95a60dd4d65742d Mon Sep 17 00:00:00 2001 From: Catalan Lover Date: Thu, 21 May 2026 19:43:10 +0200 Subject: [PATCH 2/8] Run Eslint with Fix --- .../src/appservice/AppServiceDraupnirManager.ts | 2 +- apps/draupnir/src/commands/ProtectionsCommands.tsx | 4 ++-- apps/draupnir/src/config.ts | 4 ++-- .../src/protections/MissingProtectionPermissions.tsx | 2 +- .../src/protections/ProtectedRoomsSetRenderers.tsx | 2 +- .../invitation/JoinRoomsOnInviteProtection.tsx | 2 +- apps/draupnir/src/safemode/PersistentConfigEditor.ts | 2 +- .../SpamCheckEndpointPluginManager.ts | 2 +- .../integration/managedBootstrapStartTest.ts | 2 +- apps/draupnir/test/integration/abuseReportTest.ts | 4 ++-- apps/draupnir/test/integration/banPropagationTest.ts | 4 ++-- .../integration/commands/hijackRoomCommandTest.ts | 2 +- .../test/integration/commands/recoverCommandTest.ts | 2 +- .../test/integration/commands/redactCommandTest.ts | 6 +++--- apps/draupnir/test/integration/commands/roomsTest.ts | 2 +- .../test/integration/commands/shutdownCommandTest.ts | 2 +- apps/draupnir/test/integration/commands/unbanTest.ts | 12 ++++++------ apps/draupnir/test/integration/helloTest.ts | 2 +- apps/draupnir/test/integration/httpAntispamTest.ts | 2 +- .../protections/BlockInvitationsOnServerTest.ts | 2 +- .../integration/protections/JoinRoomsOnInviteTest.ts | 4 ++-- .../protections/RoomTakedownProtectionTest.ts | 4 ++-- apps/draupnir/test/integration/reportPollingTest.ts | 2 +- apps/draupnir/test/integration/utilsTest.ts | 2 +- .../AdaptorContextToCommandContextTranslator.ts | 10 +++++----- .../interface-manager/src/Command/CommandTable.ts | 2 +- .../src/Command/KeywordParameterDescription.ts | 4 ++-- .../src/Command/PresentationSchema.ts | 2 +- .../src/Command/RestParameterDescription.ts | 4 ++-- .../src/DeadDocument/DeadDocument.ts | 2 +- .../src/TextReader/TextPresentationRenderer.ts | 4 ++-- .../matrix-protection-suite/src/Interface/Value.ts | 2 +- .../PolicyList/RoomStatePolicyListRevisionIssuer.ts | 2 +- .../src/Protection/ProtectionHandles.test.ts | 2 +- .../ProtectionsManager/FakeProtectionsManager.ts | 2 +- .../ProtectionsManager/StandardProtectionsManager.ts | 2 +- .../MPSInterfaceAdaptor/MPSMatrixInterfaceAdaptor.ts | 2 +- .../MatrixPromptForConfirmation.tsx | 2 +- .../src/MPSInterfaceAdaptor/MatrixReactionHandler.ts | 4 +--- 39 files changed, 59 insertions(+), 61 deletions(-) diff --git a/apps/draupnir/src/appservice/AppServiceDraupnirManager.ts b/apps/draupnir/src/appservice/AppServiceDraupnirManager.ts index 92077fec..dfd59efe 100644 --- a/apps/draupnir/src/appservice/AppServiceDraupnirManager.ts +++ b/apps/draupnir/src/appservice/AppServiceDraupnirManager.ts @@ -285,7 +285,7 @@ export class AppServiceDraupnirManager { local_part: mjolnirLocalPart, owner: requestingUserID, management_room: managementRoom.ok.toRoomIDOrAlias(), - } as MjolnirRecord; + }; await this.dataStore.store(record); return Ok(record); } else { diff --git a/apps/draupnir/src/commands/ProtectionsCommands.tsx b/apps/draupnir/src/commands/ProtectionsCommands.tsx index 74976577..4ce25378 100644 --- a/apps/draupnir/src/commands/ProtectionsCommands.tsx +++ b/apps/draupnir/src/commands/ProtectionsCommands.tsx @@ -487,7 +487,7 @@ export const DraupnirProtectionsConfigResetCommand = describeCommand({ const newSettings = protectionDescription.protectionSettings.getDefaultConfig(); return await draupnir.protectedRoomsSet.protections.changeProtectionSettings( - protectionDescription as unknown as ProtectionDescription, + protectionDescription, draupnir.protectedRoomsSet, draupnir, newSettings @@ -517,7 +517,7 @@ export const DraupnirProtectionsCapabilityResetCommand = describeCommand({ ); } return await draupnir.protectedRoomsSet.protections.changeCapabilityProviderSet( - protectionDescription as unknown as ProtectionDescription, + protectionDescription, draupnir.protectedRoomsSet, draupnir, protectionDescription.defaultCapabilities diff --git a/apps/draupnir/src/config.ts b/apps/draupnir/src/config.ts index 03823e66..60d77b30 100644 --- a/apps/draupnir/src/config.ts +++ b/apps/draupnir/src/config.ts @@ -592,7 +592,7 @@ export function getUnknownPropertiesHelper( } else { const unknownSubProperties = getUnknownPropertiesHelper( config[key], - defaultConfig[key] as Record, + defaultConfig[key], [...currentPathProperties, key] ); unknownProperties.push(...unknownSubProperties); @@ -611,7 +611,7 @@ export function getUnknownConfigPropertyPaths(config: unknown): string[] { } return getUnknownPropertiesHelper( config, - defaultConfig as unknown as Record, + defaultConfig, [] ); } diff --git a/apps/draupnir/src/protections/MissingProtectionPermissions.tsx b/apps/draupnir/src/protections/MissingProtectionPermissions.tsx index 8b38932d..fbf7ecbd 100644 --- a/apps/draupnir/src/protections/MissingProtectionPermissions.tsx +++ b/apps/draupnir/src/protections/MissingProtectionPermissions.tsx @@ -106,7 +106,7 @@ export function makeHandleMissingProtectionPermissions( {renderMissingProtectionsPermissions(roomID, protectionPermissions)} , {} - ) as Promise> + ) ); }; } diff --git a/apps/draupnir/src/protections/ProtectedRoomsSetRenderers.tsx b/apps/draupnir/src/protections/ProtectedRoomsSetRenderers.tsx index 9cb11bc0..12c2ebfb 100644 --- a/apps/draupnir/src/protections/ProtectedRoomsSetRenderers.tsx +++ b/apps/draupnir/src/protections/ProtectedRoomsSetRenderers.tsx @@ -41,6 +41,6 @@ export async function renderProtectionFailedToStart( {error.message} , {} - ) as Promise> + ) ); } diff --git a/apps/draupnir/src/protections/invitation/JoinRoomsOnInviteProtection.tsx b/apps/draupnir/src/protections/invitation/JoinRoomsOnInviteProtection.tsx index 6d6cf50c..87651897 100644 --- a/apps/draupnir/src/protections/invitation/JoinRoomsOnInviteProtection.tsx +++ b/apps/draupnir/src/protections/invitation/JoinRoomsOnInviteProtection.tsx @@ -136,7 +136,7 @@ export class JoinRoomsOnInviteProtection this.draupnir.managementRoomID, renderUnknownInvite(), {} - ) as Promise> + ) ); } diff --git a/apps/draupnir/src/safemode/PersistentConfigEditor.ts b/apps/draupnir/src/safemode/PersistentConfigEditor.ts index 8f364110..08b9f9ec 100644 --- a/apps/draupnir/src/safemode/PersistentConfigEditor.ts +++ b/apps/draupnir/src/safemode/PersistentConfigEditor.ts @@ -134,7 +134,7 @@ export class StandardPersistentConfigEditor implements PersistentConfigEditor { } relevantStatus.error = new ConfigParseError( "There was a problem when using a property in the configuration.", - relevantStatus.description as unknown as ConfigDescription, + relevantStatus.description, [cause.error], relevantStatus.data ); diff --git a/apps/draupnir/src/webapis/SynapseHTTPAntispam/SpamCheckEndpointPluginManager.ts b/apps/draupnir/src/webapis/SynapseHTTPAntispam/SpamCheckEndpointPluginManager.ts index d5fcb2e9..a9e502e8 100644 --- a/apps/draupnir/src/webapis/SynapseHTTPAntispam/SpamCheckEndpointPluginManager.ts +++ b/apps/draupnir/src/webapis/SynapseHTTPAntispam/SpamCheckEndpointPluginManager.ts @@ -40,7 +40,7 @@ export class SpamCheckEndpointPluginManager { handle: BlockingCallback | NonBlockingCallback ): void { this.blockingHandles.delete(handle as BlockingCallback); - this.nonBlockingHandles.delete(handle as NonBlockingCallback); + this.nonBlockingHandles.delete(handle); } public unregisterListeners(): void { diff --git a/apps/draupnir/test/appservice/integration/managedBootstrapStartTest.ts b/apps/draupnir/test/appservice/integration/managedBootstrapStartTest.ts index da035456..6de8df62 100644 --- a/apps/draupnir/test/appservice/integration/managedBootstrapStartTest.ts +++ b/apps/draupnir/test/appservice/integration/managedBootstrapStartTest.ts @@ -19,7 +19,7 @@ describe("Managed room bootstrap startup integration", function (this: Mocha.Sui }; testConfigRecord.adminRoom = undefined; testConfigRecord.initialManager = - (await initialManager.getUserId()) as StringUserID; + (await initialManager.getUserId()); const testConfig = testConfigRecord as typeof config; let appservice: MjolnirAppService | undefined; diff --git a/apps/draupnir/test/integration/abuseReportTest.ts b/apps/draupnir/test/integration/abuseReportTest.ts index 187dbb98..abf9abbd 100644 --- a/apps/draupnir/test/integration/abuseReportTest.ts +++ b/apps/draupnir/test/integration/abuseReportTest.ts @@ -365,7 +365,7 @@ describe("Test: Reporting abuse", () => { throw new Error(`Didn't expect label ${matches[1]}`); } } - } as unknown as Mocha.AsyncFunc + } ); } it("The redact action works", async function (this: DraupnirTestContext) { @@ -544,5 +544,5 @@ describe("Test: Reporting abuse", () => { [], "Redaction should have removed the content of the offending event" ); - } as unknown as Mocha.AsyncFunc); + }); }); diff --git a/apps/draupnir/test/integration/banPropagationTest.ts b/apps/draupnir/test/integration/banPropagationTest.ts index b65eceb6..4663b9a1 100644 --- a/apps/draupnir/test/integration/banPropagationTest.ts +++ b/apps/draupnir/test/integration/banPropagationTest.ts @@ -42,7 +42,7 @@ describe("Ban propagation test", function () { banPropagationProtection ) ).toBeTruthy(); - } as unknown as Mocha.AsyncFunc); + }); it( "Should prompt to add bans to a policy list, then add the ban", async function (this: DraupnirTestContext) { @@ -174,6 +174,6 @@ describe("Ban propagation test", function () { membershipRevision.membershipForUser(spamUserID)?.membershipChangeType ).toBe(MembershipChangeType.Unbanned); } - } as unknown as Mocha.AsyncFunc + } ); }); diff --git a/apps/draupnir/test/integration/commands/hijackRoomCommandTest.ts b/apps/draupnir/test/integration/commands/hijackRoomCommandTest.ts index 62a1a8e4..c0e292a2 100644 --- a/apps/draupnir/test/integration/commands/hijackRoomCommandTest.ts +++ b/apps/draupnir/test/integration/commands/hijackRoomCommandTest.ts @@ -82,5 +82,5 @@ describe("Test: The make admin command", function () { undefined, "User A is not supposed to be a room admin." ); - } as unknown as Mocha.AsyncFunc); + }); }); diff --git a/apps/draupnir/test/integration/commands/recoverCommandTest.ts b/apps/draupnir/test/integration/commands/recoverCommandTest.ts index 26f44231..23c76412 100644 --- a/apps/draupnir/test/integration/commands/recoverCommandTest.ts +++ b/apps/draupnir/test/integration/commands/recoverCommandTest.ts @@ -21,5 +21,5 @@ describe("We should be able to restart and recover draupnir when it has bad acco (await moderator.getUserId()) as StringUserID, draupnir() ); - } as unknown as Mocha.AsyncFunc); + }); }); diff --git a/apps/draupnir/test/integration/commands/redactCommandTest.ts b/apps/draupnir/test/integration/commands/redactCommandTest.ts index 9d1f992f..25cb9bd7 100644 --- a/apps/draupnir/test/integration/commands/redactCommandTest.ts +++ b/apps/draupnir/test/integration/commands/redactCommandTest.ts @@ -137,7 +137,7 @@ describe("Test: The redaction command", function () { }); } ); - } as unknown as Mocha.AsyncFunc + } ); it( @@ -242,7 +242,7 @@ describe("Test: The redaction command", function () { ); }) ); - } as unknown as Mocha.AsyncFunc + } ); it("Redacts a single event when instructed to.", async function ( this: RedactionTestContext @@ -295,5 +295,5 @@ describe("Test: The redaction command", function () { 0, "This event should have been redacted" ); - } as unknown as Mocha.AsyncFunc); + }); }); diff --git a/apps/draupnir/test/integration/commands/roomsTest.ts b/apps/draupnir/test/integration/commands/roomsTest.ts index 3de50396..691aa09d 100644 --- a/apps/draupnir/test/integration/commands/roomsTest.ts +++ b/apps/draupnir/test/integration/commands/roomsTest.ts @@ -96,6 +96,6 @@ describe("Test: The rooms commands", function () { true, "Only the management room should be protected and the policy change notification room." ); - } as unknown as Mocha.AsyncFunc + } ); }); diff --git a/apps/draupnir/test/integration/commands/shutdownCommandTest.ts b/apps/draupnir/test/integration/commands/shutdownCommandTest.ts index db64211c..fba8844d 100644 --- a/apps/draupnir/test/integration/commands/shutdownCommandTest.ts +++ b/apps/draupnir/test/integration/commands/shutdownCommandTest.ts @@ -58,5 +58,5 @@ describe("Test: shutdown command", function (this: Mocha.Suite) { assert.equal(e.body.error, "This room has been blocked on this server"); return true; }); - } as unknown as Mocha.AsyncFunc); + }); }); diff --git a/apps/draupnir/test/integration/commands/unbanTest.ts b/apps/draupnir/test/integration/commands/unbanTest.ts index 6fd419ba..32a8daac 100644 --- a/apps/draupnir/test/integration/commands/unbanTest.ts +++ b/apps/draupnir/test/integration/commands/unbanTest.ts @@ -221,7 +221,7 @@ describe("unbanCommandTest", function () { membershipRevision.membershipForUser(falsePositiveUserID)?.membership ).toBe(Membership.Invite); } - } as unknown as Mocha.AsyncFunc + } ); it("Unbans users even when there are no policies", async function ( this: DraupnirTestContext @@ -267,7 +267,7 @@ describe("unbanCommandTest", function () { membershipRevision.membershipForUser(falsePositiveUserID)?.membership ).toBe(Membership.Leave); } - } as unknown as Mocha.AsyncFunc); + }); it( "Unbans and reinvites users when the invite option is provided", async function (this: DraupnirTestContext) { @@ -341,7 +341,7 @@ describe("unbanCommandTest", function () { membershipRevision.membershipForUser(falsePositiveUserID)?.membership ).toBe(Membership.Invite); } - } as unknown as Mocha.AsyncFunc + } ); it( "unbans users when there is no membership and only policies", @@ -398,7 +398,7 @@ describe("unbanCommandTest", function () { const policyRevision = draupnir.protectedRoomsSet.watchedPolicyRooms.currentRevision; expect(policyRevision.allRules().length).toBe(0); - } as unknown as Mocha.AsyncFunc + } ); it( "Unbans all members targetted by a glob that is being removed indirectly by unbanning a single user in the command", @@ -556,7 +556,7 @@ describe("unbanCommandTest", function () { const policyRevision = draupnir.protectedRoomsSet.watchedPolicyRooms.currentRevision; expect(policyRevision.allRules().length).toBe(1); - } as unknown as Mocha.AsyncFunc + } ); it( "removes glob rules when there are only glob rules and no banned members", @@ -622,6 +622,6 @@ describe("unbanCommandTest", function () { const policyRevision = draupnir.protectedRoomsSet.watchedPolicyRooms.currentRevision; expect(policyRevision.allRules().length).toBe(0); - } as unknown as Mocha.AsyncFunc + } ); }); diff --git a/apps/draupnir/test/integration/helloTest.ts b/apps/draupnir/test/integration/helloTest.ts index 895f6b00..5a2062ef 100644 --- a/apps/draupnir/test/integration/helloTest.ts +++ b/apps/draupnir/test/integration/helloTest.ts @@ -55,5 +55,5 @@ describe("Test: !help command", function (this: Mocha.Suite) { body: "!draupnir help", }); await reply; - } as unknown as Mocha.AsyncFunc); + }); }); diff --git a/apps/draupnir/test/integration/httpAntispamTest.ts b/apps/draupnir/test/integration/httpAntispamTest.ts index 7e17d362..4ace49c4 100644 --- a/apps/draupnir/test/integration/httpAntispamTest.ts +++ b/apps/draupnir/test/integration/httpAntispamTest.ts @@ -71,5 +71,5 @@ describe("Test for http antispam callbacks", function () { expect(matrixError.error).toBe("no."); expect(matrixError.errcode).toBe("M_FORBIDDEN"); } - } as unknown as Mocha.AsyncFunc); + }); }); diff --git a/apps/draupnir/test/integration/protections/BlockInvitationsOnServerTest.ts b/apps/draupnir/test/integration/protections/BlockInvitationsOnServerTest.ts index 36681eb8..1f18b933 100644 --- a/apps/draupnir/test/integration/protections/BlockInvitationsOnServerTest.ts +++ b/apps/draupnir/test/integration/protections/BlockInvitationsOnServerTest.ts @@ -105,5 +105,5 @@ describe("RoomTakedownProtectionTest", function () { ); await moderator.inviteUser(draupnir.clientUserID, takedownTargetRoomID); } - } as unknown as Mocha.AsyncFunc); + }); }); diff --git a/apps/draupnir/test/integration/protections/JoinRoomsOnInviteTest.ts b/apps/draupnir/test/integration/protections/JoinRoomsOnInviteTest.ts index e8191bfb..775117a9 100644 --- a/apps/draupnir/test/integration/protections/JoinRoomsOnInviteTest.ts +++ b/apps/draupnir/test/integration/protections/JoinRoomsOnInviteTest.ts @@ -73,7 +73,7 @@ describe("JoinRoomsOnInvite", function () { ).toBe(true); // allow for messages to send to the mangement room. await new Promise((resolve) => setTimeout(resolve, 1000)); - } as unknown as Mocha.AsyncFunc + } ); it( "That rooms will automatically be unprotected when protectAllJoinedRooms is false", @@ -133,6 +133,6 @@ describe("JoinRoomsOnInvite", function () { ).toBe(true); // allow for messages to send to the mangement room. await new Promise((resolve) => setTimeout(resolve, 1000)); - } as unknown as Mocha.AsyncFunc + } ); }); diff --git a/apps/draupnir/test/integration/protections/RoomTakedownProtectionTest.ts b/apps/draupnir/test/integration/protections/RoomTakedownProtectionTest.ts index 7780c3f6..912eb8a3 100644 --- a/apps/draupnir/test/integration/protections/RoomTakedownProtectionTest.ts +++ b/apps/draupnir/test/integration/protections/RoomTakedownProtectionTest.ts @@ -169,7 +169,7 @@ describe("RoomTakedownProtectionTest", function () { .joinRoom(takedownTargetRoomID) ).isOkay ).toBe(false); - } as unknown as Mocha.AsyncFunc); + }); it( "Takedown a room through discovery and a revealed Literal policy change", async function (this: DraupnirTestContext) { @@ -253,6 +253,6 @@ describe("RoomTakedownProtectionTest", function () { .joinRoom(takedownTargetRoomID) ).isOkay ).toBe(false); - } as unknown as Mocha.AsyncFunc + } ); }); diff --git a/apps/draupnir/test/integration/reportPollingTest.ts b/apps/draupnir/test/integration/reportPollingTest.ts index ad8d08b3..71faef9b 100644 --- a/apps/draupnir/test/integration/reportPollingTest.ts +++ b/apps/draupnir/test/integration/reportPollingTest.ts @@ -85,5 +85,5 @@ describe("Test: Report polling", function (this: Mocha.Suite) { await new Promise((resolve) => setTimeout(resolve, 5000)); expect(reportsFound.size).toBe(20); expect(duplicateReports.size).toBe(0); - } as unknown as Mocha.AsyncFunc); + }); }); diff --git a/apps/draupnir/test/integration/utilsTest.ts b/apps/draupnir/test/integration/utilsTest.ts index 45f070d4..670115a4 100644 --- a/apps/draupnir/test/integration/utilsTest.ts +++ b/apps/draupnir/test/integration/utilsTest.ts @@ -62,6 +62,6 @@ describe("Test: utils", function () { message.content.formatted_body, `it's fun here in ${managementRoomAlias}` ); - } as unknown as Mocha.AsyncFunc + } ); }); diff --git a/packages/interface-manager/src/Adaptor/AdaptorContextToCommandContextTranslator.ts b/packages/interface-manager/src/Adaptor/AdaptorContextToCommandContextTranslator.ts index e5836fcc..e5a8aa0f 100644 --- a/packages/interface-manager/src/Adaptor/AdaptorContextToCommandContextTranslator.ts +++ b/packages/interface-manager/src/Adaptor/AdaptorContextToCommandContextTranslator.ts @@ -48,12 +48,12 @@ export class StandardAdaptorContextToCommandContextTranslator< ): TCommandMeta["Context"] { const entry = this.translators.get( // i really don't care. - commandDescription as unknown as CommandDescription + commandDescription ); if (entry === undefined) { - return adaptorContext as unknown as TCommandMeta["Context"]; + return adaptorContext; } else { - return entry(adaptorContext) as TCommandMeta["Context"]; + return entry(adaptorContext); } } registerTranslation( @@ -64,14 +64,14 @@ export class StandardAdaptorContextToCommandContextTranslator< > ): AdaptorContextToCommandContextTranslator { if ( - this.translators.has(commandDescription as unknown as CommandDescription) + this.translators.has(commandDescription) ) { throw new TypeError( `There is already a translation function registered for the command ${commandDescription.summary}` ); } this.translators.set( - commandDescription as unknown as CommandDescription, + commandDescription, translationFunction ); return this; diff --git a/packages/interface-manager/src/Command/CommandTable.ts b/packages/interface-manager/src/Command/CommandTable.ts index 443b1d24..870d4021 100644 --- a/packages/interface-manager/src/Command/CommandTable.ts +++ b/packages/interface-manager/src/Command/CommandTable.ts @@ -238,7 +238,7 @@ export class StandardCommandTable implements CommandTable { new StandardPresentationArgumentStream( commandTableEntry.designator.map((d) => StringPresentationType.wrap(d) - ) as Presentation[] + ) ) ) ) { diff --git a/packages/interface-manager/src/Command/KeywordParameterDescription.ts b/packages/interface-manager/src/Command/KeywordParameterDescription.ts index e2f2b88e..b68d2443 100644 --- a/packages/interface-manager/src/Command/KeywordParameterDescription.ts +++ b/packages/interface-manager/src/Command/KeywordParameterDescription.ts @@ -142,7 +142,7 @@ export class KeywordParser { } else { const associatedPropertyResult = this.readKeywordAssociatedProperty( // idk why typescript is bottoming out here but whatever. - description as unknown as KeywordParametersDescription["keywordDescriptions"][string], + description, partialCommand ); if (isError(associatedPropertyResult)) { @@ -163,7 +163,7 @@ export class KeywordParser { if (restDescription !== undefined) { return restDescription.parseRest( partialCommand, - this as unknown as KeywordParser + this ); } else { const result = this.parseKeywords(partialCommand); diff --git a/packages/interface-manager/src/Command/PresentationSchema.ts b/packages/interface-manager/src/Command/PresentationSchema.ts index e3397fab..91c78b7c 100644 --- a/packages/interface-manager/src/Command/PresentationSchema.ts +++ b/packages/interface-manager/src/Command/PresentationSchema.ts @@ -180,5 +180,5 @@ export function union< return { schemaType: PresentationSchemaType.Union, variants: presentationTypes, - } as UnionPresentationSchema>; + }; } diff --git a/packages/interface-manager/src/Command/RestParameterDescription.ts b/packages/interface-manager/src/Command/RestParameterDescription.ts index 853da720..d4594d10 100644 --- a/packages/interface-manager/src/Command/RestParameterDescription.ts +++ b/packages/interface-manager/src/Command/RestParameterDescription.ts @@ -93,7 +93,7 @@ export class StandardRestDescription< return PromptRequiredError.Result( `A prompt is required for the missing argument for the ${this.name} parameter`, { - promptParameter: this as ParameterDescription, + promptParameter: this, partialCommand, } ); @@ -114,7 +114,7 @@ export class StandardRestDescription< return ArgumentParseError.Result( `Was expecting a match for the presentation type: ${printPresentationSchema(this.acceptor)} but got ${TextPresentationRenderer.render(nextItem)}.`, { - parameter: this as ParameterDescription, + parameter: this, partialCommand, } ); diff --git a/packages/interface-manager/src/DeadDocument/DeadDocument.ts b/packages/interface-manager/src/DeadDocument/DeadDocument.ts index 14b066be..91b4318e 100644 --- a/packages/interface-manager/src/DeadDocument/DeadDocument.ts +++ b/packages/interface-manager/src/DeadDocument/DeadDocument.ts @@ -416,7 +416,7 @@ export class FringeWalker { } this.renderer.getLeafRenderer(annotatedNode.node.tag)( annotatedNode.node.tag, - annotatedNode.node as unknown as LeafNode, + annotatedNode.node, this.context ); break; diff --git a/packages/interface-manager/src/TextReader/TextPresentationRenderer.ts b/packages/interface-manager/src/TextReader/TextPresentationRenderer.ts index 4804fbaf..6e3d8868 100644 --- a/packages/interface-manager/src/TextReader/TextPresentationRenderer.ts +++ b/packages/interface-manager/src/TextReader/TextPresentationRenderer.ts @@ -42,13 +42,13 @@ export const TextPresentationRenderer: TextPresentationRenderer = Object.freeze( type: PresentationType, renderFunction: TextPresentationRenderFunction ) { - if (TEXT_PRESENTATION_RENDERERS.has(type as PresentationType)) { + if (TEXT_PRESENTATION_RENDERERS.has(type)) { throw new TypeError( `There is already a text renderer registered for the presentation type ${type.name}` ); } TEXT_PRESENTATION_RENDERERS.set( - type as PresentationType, + type, renderFunction as TextPresentationRenderFunction ); return this; diff --git a/packages/matrix-protection-suite/src/Interface/Value.ts b/packages/matrix-protection-suite/src/Interface/Value.ts index 5c7ea70a..4ae16632 100644 --- a/packages/matrix-protection-suite/src/Interface/Value.ts +++ b/packages/matrix-protection-suite/src/Interface/Value.ts @@ -48,7 +48,7 @@ export class Value { const compiledCheck = TypeCompiler.Compile(schema); this.compiledSchema.set( schema, - compiledCheck as unknown as TypeCheck + compiledCheck ); return compiledCheck; } diff --git a/packages/matrix-protection-suite/src/PolicyList/RoomStatePolicyListRevisionIssuer.ts b/packages/matrix-protection-suite/src/PolicyList/RoomStatePolicyListRevisionIssuer.ts index fbc4ace5..ef8821a7 100644 --- a/packages/matrix-protection-suite/src/PolicyList/RoomStatePolicyListRevisionIssuer.ts +++ b/packages/matrix-protection-suite/src/PolicyList/RoomStatePolicyListRevisionIssuer.ts @@ -97,7 +97,7 @@ export class RoomStatePolicyRoomRevisionIssuer ); if (shortcodeChange !== undefined) { this.currentRevision = this.currentRevision.reviseFromShortcode( - shortcodeChange.state as unknown as MjolnirShortcodeEvent + shortcodeChange.state ); } if (this.currentRevision.revisionID !== previousRevision.revisionID) { diff --git a/packages/matrix-protection-suite/src/Protection/ProtectionHandles.test.ts b/packages/matrix-protection-suite/src/Protection/ProtectionHandles.test.ts index 01a9b60f..31317f1f 100644 --- a/packages/matrix-protection-suite/src/Protection/ProtectionHandles.test.ts +++ b/packages/matrix-protection-suite/src/Protection/ProtectionHandles.test.ts @@ -47,7 +47,7 @@ test("handlePermissionRequirementsMet is called when a new room is added with me content: { users_default: 100, ban: 0, - } as PowerLevelsEventContent, + }, type: "m.room.power_levels", sender: userID, }, diff --git a/packages/matrix-protection-suite/src/Protection/ProtectionsManager/FakeProtectionsManager.ts b/packages/matrix-protection-suite/src/Protection/ProtectionsManager/FakeProtectionsManager.ts index 9afbb24a..6e017e0c 100644 --- a/packages/matrix-protection-suite/src/Protection/ProtectionsManager/FakeProtectionsManager.ts +++ b/packages/matrix-protection-suite/src/Protection/ProtectionsManager/FakeProtectionsManager.ts @@ -20,7 +20,7 @@ export class FakeProtectionsManager extends StandardProtectionsManager { new MjolnirProtectionSettingsConfig(function () { return Ok(new FakePersistentConfigBackend({})); }), - ProtectionHandleRegistryDescription as never + ProtectionHandleRegistryDescription ); } } diff --git a/packages/matrix-protection-suite/src/Protection/ProtectionsManager/StandardProtectionsManager.ts b/packages/matrix-protection-suite/src/Protection/ProtectionsManager/StandardProtectionsManager.ts index 9b684d6a..c023d9e1 100644 --- a/packages/matrix-protection-suite/src/Protection/ProtectionsManager/StandardProtectionsManager.ts +++ b/packages/matrix-protection-suite/src/Protection/ProtectionsManager/StandardProtectionsManager.ts @@ -393,7 +393,7 @@ export class StandardProtectionsManager< ): Promise>> { return (await this.settingsConfig.getProtectionSettings( protectionDescription - )) as Result>; + )); } isEnabledProtection(protectionDescription: ProtectionDescription): boolean { return this.enabledProtections.has(protectionDescription.name); diff --git a/packages/mps-interface-adaptor/src/MPSInterfaceAdaptor/MPSMatrixInterfaceAdaptor.ts b/packages/mps-interface-adaptor/src/MPSInterfaceAdaptor/MPSMatrixInterfaceAdaptor.ts index d5060606..a6156639 100644 --- a/packages/mps-interface-adaptor/src/MPSInterfaceAdaptor/MPSMatrixInterfaceAdaptor.ts +++ b/packages/mps-interface-adaptor/src/MPSInterfaceAdaptor/MPSMatrixInterfaceAdaptor.ts @@ -142,7 +142,7 @@ export const matrixEventsFromDeadDocument: MatrixInterfaceEventsFromDeadDocument { replyToEvent: event } ); if (isError(sendResult)) { - return sendResult as Result; + return sendResult; } else { return Ok(undefined); } diff --git a/packages/mps-interface-adaptor/src/MPSInterfaceAdaptor/MatrixPromptForConfirmation.tsx b/packages/mps-interface-adaptor/src/MPSInterfaceAdaptor/MatrixPromptForConfirmation.tsx index 92e01ce7..c794da2a 100644 --- a/packages/mps-interface-adaptor/src/MPSInterfaceAdaptor/MatrixPromptForConfirmation.tsx +++ b/packages/mps-interface-adaptor/src/MPSInterfaceAdaptor/MatrixPromptForConfirmation.tsx @@ -139,7 +139,7 @@ export async function sendConfirmationPrompt( } ); if (isError(sendResult)) { - return sendResult as Result; + return sendResult; } if (sendResult.ok[0] === undefined) { throw new TypeError(`We exepct to have sent at least one event`); diff --git a/packages/mps-interface-adaptor/src/MPSInterfaceAdaptor/MatrixReactionHandler.ts b/packages/mps-interface-adaptor/src/MPSInterfaceAdaptor/MatrixReactionHandler.ts index dee61794..d9fe09f4 100644 --- a/packages/mps-interface-adaptor/src/MPSInterfaceAdaptor/MatrixReactionHandler.ts +++ b/packages/mps-interface-adaptor/src/MPSInterfaceAdaptor/MatrixReactionHandler.ts @@ -241,9 +241,7 @@ export class MatrixReactionHandler return; } void Task( - redacter.redactEvent(roomID, event.event_id, reason) as Promise< - ActionResult - > + redacter.redactEvent(roomID, event.event_id, reason) ); }, }); From 940deb6cb56b846d9c0af7ee338f2e6cd9c65c39 Mon Sep 17 00:00:00 2001 From: Catalan Lover Date: Thu, 21 May 2026 19:48:00 +0200 Subject: [PATCH 3/8] Fix Result is defined but never used. Draupnir\packages\mps-interface-adaptor\src\MPSInterfaceAdaptor\MPSMatrixInterfaceAdaptor.ts 42:10 error 'Result' is defined but never used @typescript-eslint/no-unused-vars Draupnir\packages\mps-interface-adaptor\src\MPSInterfaceAdaptor\MPSMatrixInterfaceAdaptor.ts 42:10 error 'Result' is defined but never used @typescript-eslint/no-unused-vars Draupnir\apps\draupnir\src\protections\ProtectedRoomsSetRenderers.tsx 20:10 error 'Result' is defined but never used @typescript-eslint/no-unused-vars --- apps/draupnir/src/protections/MissingProtectionPermissions.tsx | 1 - apps/draupnir/src/protections/ProtectedRoomsSetRenderers.tsx | 1 - .../src/MPSInterfaceAdaptor/MPSMatrixInterfaceAdaptor.ts | 1 - 3 files changed, 3 deletions(-) diff --git a/apps/draupnir/src/protections/MissingProtectionPermissions.tsx b/apps/draupnir/src/protections/MissingProtectionPermissions.tsx index fbf7ecbd..d7ce3203 100644 --- a/apps/draupnir/src/protections/MissingProtectionPermissions.tsx +++ b/apps/draupnir/src/protections/MissingProtectionPermissions.tsx @@ -20,7 +20,6 @@ import { DeadDocumentJSX, DocumentNode, } from "@the-draupnir-project/interface-manager"; -import { Result } from "@gnuxie/typescript-result"; function renderPermissions( title: DocumentNode, diff --git a/apps/draupnir/src/protections/ProtectedRoomsSetRenderers.tsx b/apps/draupnir/src/protections/ProtectedRoomsSetRenderers.tsx index 12c2ebfb..99b52e54 100644 --- a/apps/draupnir/src/protections/ProtectedRoomsSetRenderers.tsx +++ b/apps/draupnir/src/protections/ProtectedRoomsSetRenderers.tsx @@ -17,7 +17,6 @@ import { import { StringRoomID } from "@the-draupnir-project/matrix-basic-types"; import { sendMatrixEventsFromDeadDocument } from "@the-draupnir-project/mps-interface-adaptor"; import { DeadDocumentJSX } from "@the-draupnir-project/interface-manager"; -import { Result } from "@gnuxie/typescript-result"; // The callback that this is required for in MPS, is kinda silly and should // really be `void` and not `Promise`. If it wanted to be `Promise`, diff --git a/packages/mps-interface-adaptor/src/MPSInterfaceAdaptor/MPSMatrixInterfaceAdaptor.ts b/packages/mps-interface-adaptor/src/MPSInterfaceAdaptor/MPSMatrixInterfaceAdaptor.ts index a6156639..65391624 100644 --- a/packages/mps-interface-adaptor/src/MPSInterfaceAdaptor/MPSMatrixInterfaceAdaptor.ts +++ b/packages/mps-interface-adaptor/src/MPSInterfaceAdaptor/MPSMatrixInterfaceAdaptor.ts @@ -39,7 +39,6 @@ import { } from "@the-draupnir-project/interface-manager"; import { matrixCommandRenderer } from "./MatrixHelpRenderer"; import { promptDefault, promptSuggestions } from "./MatrixPromptForAccept"; -import { Result } from "@gnuxie/typescript-result"; import { matrixEventsFromConfirmationPrompt } from "./MatrixPromptForConfirmation"; export interface MatrixEventContext { From b54350aca9e098974bd577f4e9d7e47b57c55a1d Mon Sep 17 00:00:00 2001 From: Catalan Lover Date: Thu, 21 May 2026 19:54:36 +0200 Subject: [PATCH 4/8] Fix Presentation is defined but never used. \Draupnir\packages\interface-manager\src\Command\CommandTable.ts 19:3 error 'Presentation' is defined but never used @typescript-eslint/no-unused-vars --- packages/interface-manager/src/Command/CommandTable.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/interface-manager/src/Command/CommandTable.ts b/packages/interface-manager/src/Command/CommandTable.ts index 870d4021..a0e01445 100644 --- a/packages/interface-manager/src/Command/CommandTable.ts +++ b/packages/interface-manager/src/Command/CommandTable.ts @@ -16,7 +16,6 @@ import { StringPresentationType } from "../TextReader"; import { CommandDescription } from "./CommandDescription"; import { CommandMeta } from "./CommandMeta"; import { - Presentation, PresentationType, PresentationTypeWithoutWrap, } from "./Presentation"; From 829f661718aaab46281164203abdfc02b67d5d1a Mon Sep 17 00:00:00 2001 From: Catalan Lover Date: Thu, 21 May 2026 19:55:46 +0200 Subject: [PATCH 5/8] Fix StringUserID is defined but never used. Draupnir\apps\draupnir\test\appservice\integration\managedBootstrapStartTest.ts 5:10 error 'StringUserID' is defined but never used @typescript-eslint/no-unused-vars --- .../test/appservice/integration/managedBootstrapStartTest.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/draupnir/test/appservice/integration/managedBootstrapStartTest.ts b/apps/draupnir/test/appservice/integration/managedBootstrapStartTest.ts index 6de8df62..0b202e15 100644 --- a/apps/draupnir/test/appservice/integration/managedBootstrapStartTest.ts +++ b/apps/draupnir/test/appservice/integration/managedBootstrapStartTest.ts @@ -2,7 +2,6 @@ // // SPDX-License-Identifier: AFL-3.0 -import { StringUserID } from "@the-draupnir-project/matrix-basic-types"; import { readTestConfig, setupHarnessWithConfig } from "../utils/harness"; import { newTestUser } from "../../integration/clientHelper"; import { MjolnirAppService } from "../../../src/appservice/AppService"; From 27c686d5adec9c8dabbe3ae3e78f2d2006c22ed5 Mon Sep 17 00:00:00 2001 From: Catalan Lover Date: Thu, 21 May 2026 19:57:10 +0200 Subject: [PATCH 6/8] Fix PowerLevelsEventContent is defined but never used. Draupnir\packages\matrix-protection-suite\src\Protection\ProtectionHandles.test.ts 10:10 error 'PowerLevelsEventContent' is defined but never used @typescript-eslint/no-unused-vars --- .../src/Protection/ProtectionHandles.test.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/matrix-protection-suite/src/Protection/ProtectionHandles.test.ts b/packages/matrix-protection-suite/src/Protection/ProtectionHandles.test.ts index 31317f1f..b3c02c81 100644 --- a/packages/matrix-protection-suite/src/Protection/ProtectionHandles.test.ts +++ b/packages/matrix-protection-suite/src/Protection/ProtectionHandles.test.ts @@ -7,7 +7,6 @@ import { PowerLevelPermission } from "../Client/PowerLevelsMirror"; import { StandardConfigDescription } from "../Config/ConfigDescription"; import { Ok, isError } from "../Interface/Action"; import { Logger } from "../Logging/Logger"; -import { PowerLevelsEventContent } from "../MatrixTypes/PowerLevels"; import { Membership } from "../Membership/MembershipChange"; import { describeProtectedRoomsSet, From cf3e070652985c9631f53b469569a054b6de35cb Mon Sep 17 00:00:00 2001 From: Catalan Lover Date: Tue, 26 May 2026 10:42:34 +0200 Subject: [PATCH 7/8] Fix no-misused-promises in SpamCheckEndpointPluginManager Draupnir\apps\draupnir\src\webapis\SynapseHTTPAntispam\SpamCheckEndpointPluginManager.ts 43:36 error Promise returned in function argument where a void return was expected @typescript-eslint/no-misused-promises Trying to fix this naively will lead to a cascade of issues but this is ultimately a fix via splitting into blocking and non blocking. --- .../protections/BlockInvitationsOnServerProtection.tsx | 2 +- .../RoomTakedown/SynapseHTTPAntispamRoomExplorer.ts | 6 +++--- .../SpamCheckEndpointPluginManager.ts | 9 ++++++--- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/apps/draupnir/src/protections/BlockInvitationsOnServerProtection.tsx b/apps/draupnir/src/protections/BlockInvitationsOnServerProtection.tsx index 5dbfa93d..196e8623 100644 --- a/apps/draupnir/src/protections/BlockInvitationsOnServerProtection.tsx +++ b/apps/draupnir/src/protections/BlockInvitationsOnServerProtection.tsx @@ -112,7 +112,7 @@ export class SynapseHTTPUserMayInvite { } unregisterListeners(): void { - this.synapseHTTPAntispam.userMayInviteHandles.unregisterHandle( + this.synapseHTTPAntispam.userMayInviteHandles.unregisterBlockingHandle( this.synapseHTTPCallback ); } diff --git a/apps/draupnir/src/protections/RoomTakedown/SynapseHTTPAntispamRoomExplorer.ts b/apps/draupnir/src/protections/RoomTakedown/SynapseHTTPAntispamRoomExplorer.ts index d9e5dfbf..09f745ed 100644 --- a/apps/draupnir/src/protections/RoomTakedown/SynapseHTTPAntispamRoomExplorer.ts +++ b/apps/draupnir/src/protections/RoomTakedown/SynapseHTTPAntispamRoomExplorer.ts @@ -88,13 +88,13 @@ export class SynapseHTTPAntispamRoomExplorer implements RoomExplorer { }.bind(this); unregisterListeners(): void { - this.synapseHTTPAntispam.checkEventForSpamHandles.unregisterHandle( + this.synapseHTTPAntispam.checkEventForSpamHandles.unregisterNonBlockingHandle( this.handleCheckEventForSpam ); - this.synapseHTTPAntispam.userMayInviteHandles.unregisterHandle( + this.synapseHTTPAntispam.userMayInviteHandles.unregisterNonBlockingHandle( this.handleUserMayInvite ); - this.synapseHTTPAntispam.userMayJoinRoomHandles.unregisterHandle( + this.synapseHTTPAntispam.userMayJoinRoomHandles.unregisterNonBlockingHandle( this.handleUserMayJoin ); this.batcher.dispose(); diff --git a/apps/draupnir/src/webapis/SynapseHTTPAntispam/SpamCheckEndpointPluginManager.ts b/apps/draupnir/src/webapis/SynapseHTTPAntispam/SpamCheckEndpointPluginManager.ts index a9e502e8..bde66ad6 100644 --- a/apps/draupnir/src/webapis/SynapseHTTPAntispam/SpamCheckEndpointPluginManager.ts +++ b/apps/draupnir/src/webapis/SynapseHTTPAntispam/SpamCheckEndpointPluginManager.ts @@ -36,10 +36,13 @@ export class SpamCheckEndpointPluginManager { this.nonBlockingHandles.add(handle); } - public unregisterHandle( - handle: BlockingCallback | NonBlockingCallback + public unregisterBlockingHandle(handle: BlockingCallback): void { + this.blockingHandles.delete(handle); + } + + public unregisterNonBlockingHandle( + handle: NonBlockingCallback ): void { - this.blockingHandles.delete(handle as BlockingCallback); this.nonBlockingHandles.delete(handle); } From f674cfbbd1a8ba15fc1d379478557dd51d43b1c1 Mon Sep 17 00:00:00 2001 From: Catalan Lover Date: Tue, 26 May 2026 10:44:12 +0200 Subject: [PATCH 8/8] Run prettier across whole project. --- apps/draupnir/src/config.ts | 6 +- .../integration/managedBootstrapStartTest.ts | 3 +- .../test/integration/abuseReportTest.ts | 573 ++++++----- .../test/integration/banPropagationTest.ts | 251 +++-- .../commands/hijackRoomCommandTest.ts | 4 +- .../integration/commands/redactCommandTest.ts | 344 ++++--- .../test/integration/commands/roomsTest.ts | 143 ++- .../commands/shutdownCommandTest.ts | 4 +- .../test/integration/commands/unbanTest.ts | 897 +++++++++--------- apps/draupnir/test/integration/helloTest.ts | 4 +- .../test/integration/httpAntispamTest.ts | 4 +- .../BlockInvitationsOnServerTest.ts | 4 +- .../protections/JoinRoomsOnInviteTest.ts | 194 ++-- .../protections/RoomTakedownProtectionTest.ts | 165 ++-- .../test/integration/reportPollingTest.ts | 4 +- apps/draupnir/test/integration/utilsTest.ts | 79 +- ...daptorContextToCommandContextTranslator.ts | 9 +- .../src/Command/CommandTable.ts | 5 +- .../Command/KeywordParameterDescription.ts | 5 +- .../src/Interface/Value.ts | 5 +- .../StandardProtectionsManager.ts | 4 +- .../MatrixReactionHandler.ts | 4 +- 22 files changed, 1311 insertions(+), 1400 deletions(-) diff --git a/apps/draupnir/src/config.ts b/apps/draupnir/src/config.ts index 60d77b30..094fd746 100644 --- a/apps/draupnir/src/config.ts +++ b/apps/draupnir/src/config.ts @@ -609,11 +609,7 @@ export function getUnknownConfigPropertyPaths(config: unknown): string[] { if (typeof config !== "object" || config === null) { return []; } - return getUnknownPropertiesHelper( - config, - defaultConfig, - [] - ); + return getUnknownPropertiesHelper(config, defaultConfig, []); } /** diff --git a/apps/draupnir/test/appservice/integration/managedBootstrapStartTest.ts b/apps/draupnir/test/appservice/integration/managedBootstrapStartTest.ts index 0b202e15..cc905460 100644 --- a/apps/draupnir/test/appservice/integration/managedBootstrapStartTest.ts +++ b/apps/draupnir/test/appservice/integration/managedBootstrapStartTest.ts @@ -17,8 +17,7 @@ describe("Managed room bootstrap startup integration", function (this: Mocha.Sui ...(config as unknown as Record), }; testConfigRecord.adminRoom = undefined; - testConfigRecord.initialManager = - (await initialManager.getUserId()); + testConfigRecord.initialManager = await initialManager.getUserId(); const testConfig = testConfigRecord as typeof config; let appservice: MjolnirAppService | undefined; diff --git a/apps/draupnir/test/integration/abuseReportTest.ts b/apps/draupnir/test/integration/abuseReportTest.ts index abf9abbd..83eeee11 100644 --- a/apps/draupnir/test/integration/abuseReportTest.ts +++ b/apps/draupnir/test/integration/abuseReportTest.ts @@ -61,312 +61,309 @@ describe("Test: Reporting abuse", () => { // Note that this version change only affects the actual URL at which reports // are sent. for (const endpoint of ["v3", "r0"]) { - it( - `Draupnir intercepts abuse reports with endpoint ${endpoint}`, - async function (this: DraupnirTestContext) { - this.timeout(90000); - if (this.draupnir === undefined) { - throw new TypeError("setup must have failed."); + it(`Draupnir intercepts abuse reports with endpoint ${endpoint}`, async function (this: DraupnirTestContext) { + this.timeout(90000); + if (this.draupnir === undefined) { + throw new TypeError("setup must have failed."); + } + const draupnir = this.draupnir; + const draupnirSyncClient = draupnirSafeEmitter(); + // Listen for any notices that show up. + type NoticeEvent = Omit & { + content: NoticeMessageContent; + }; + const notices: NoticeEvent[] = []; + draupnirSyncClient.on("room.event", (roomId, event) => { + if ( + roomId === draupnir.managementRoomID && + event.type === "m.room.message" + ) { + notices.push(event as NoticeEvent); } - const draupnir = this.draupnir; - const draupnirSyncClient = draupnirSafeEmitter(); - // Listen for any notices that show up. - type NoticeEvent = Omit & { - content: NoticeMessageContent; - }; - const notices: NoticeEvent[] = []; - draupnirSyncClient.on("room.event", (roomId, event) => { - if ( - roomId === draupnir.managementRoomID && - event.type === "m.room.message" - ) { - notices.push(event as NoticeEvent); + }); + const reactions: UnredactedReaction[] = []; + draupnirSyncClient.on("room.event", (roomId, event) => { + if ( + roomId === draupnir.managementRoomID && + event.type === "m.reaction" + ) { + if (Value.Check(ReactionContent, event.content)) { + reactions.push(event as UnredactedReaction); } - }); - const reactions: UnredactedReaction[] = []; - draupnirSyncClient.on("room.event", (roomId, event) => { - if ( - roomId === draupnir.managementRoomID && - event.type === "m.reaction" - ) { - if (Value.Check(ReactionContent, event.content)) { - reactions.push(event as UnredactedReaction); + } + }); + + // Create a few users and a room. + const goodUser = await newTestUser(this.config.homeserverUrl, { + name: { contains: "reporting-abuse-good-user" }, + }); + const badUser = await newTestUser(this.config.homeserverUrl, { + name: { contains: "reporting-abuse-bad-user" }, + }); + const goodUserId = await goodUser.getUserId(); + const badUserId = await badUser.getUserId(); + + const roomId = await goodUser.createRoom({ + invite: [await badUser.getUserId()], + }); + await goodUser.inviteUser(await badUser.getUserId(), roomId); + await badUser.joinRoom(roomId); + + console.log("Test: Reporting abuse - send messages"); + // Exchange a few messages. + const badText = `BAD: ${Math.random()}`; // Will be reported as abuse. + const badText2 = `BAD: ${Math.random()}`; // Will be reported as abuse. + const badText3 = `BAD: ${Math.random()}`; // Will be reported as abuse. + const badText4 = [...Array(1024)] + .map((_) => `${Math.random()}`) + .join(""); // Text is too long. + const badText5 = [...Array(1024)].map((_) => "ABC").join("\n"); // Text has too many lines. + const badEventId = await badUser.sendText(roomId, badText); + const badEventId2 = await badUser.sendText(roomId, badText2); + const badEventId3 = await badUser.sendText(roomId, badText3); + const badEventId4 = await badUser.sendText(roomId, badText4); + const badEventId5 = await badUser.sendText(roomId, badText5); + const badEvent2Comment = `COMMENT: ${Math.random()}`; + + console.log("Test: Reporting abuse - send reports"); + const reportsToFind: ReportTemplate[] = []; + + // Time to report, first without a comment, then with one. + ( + await goodUser + .doRequest( + "POST", + `/_matrix/client/${endpoint}/rooms/${encodeURIComponent(roomId)}/report/${encodeURIComponent(badEventId)}` + ) + .then((_) => Ok(undefined), resultifyBotSDKRequestError) + ).expect("Could not send first report"); + reportsToFind.push({ + reporter_id: goodUserId, + accused_id: badUserId, + event_id: badEventId, + text: badText, + }); + + ( + await goodUser + .doRequest( + "POST", + `/_matrix/client/${endpoint}/rooms/${encodeURIComponent(roomId)}/report/${encodeURIComponent(badEventId2)}`, + "", + { + reason: badEvent2Comment, } - } - }); - - // Create a few users and a room. - const goodUser = await newTestUser(this.config.homeserverUrl, { - name: { contains: "reporting-abuse-good-user" }, - }); - const badUser = await newTestUser(this.config.homeserverUrl, { - name: { contains: "reporting-abuse-bad-user" }, - }); - const goodUserId = await goodUser.getUserId(); - const badUserId = await badUser.getUserId(); - - const roomId = await goodUser.createRoom({ - invite: [await badUser.getUserId()], - }); - await goodUser.inviteUser(await badUser.getUserId(), roomId); - await badUser.joinRoom(roomId); - - console.log("Test: Reporting abuse - send messages"); - // Exchange a few messages. - const badText = `BAD: ${Math.random()}`; // Will be reported as abuse. - const badText2 = `BAD: ${Math.random()}`; // Will be reported as abuse. - const badText3 = `BAD: ${Math.random()}`; // Will be reported as abuse. - const badText4 = [...Array(1024)] - .map((_) => `${Math.random()}`) - .join(""); // Text is too long. - const badText5 = [...Array(1024)].map((_) => "ABC").join("\n"); // Text has too many lines. - const badEventId = await badUser.sendText(roomId, badText); - const badEventId2 = await badUser.sendText(roomId, badText2); - const badEventId3 = await badUser.sendText(roomId, badText3); - const badEventId4 = await badUser.sendText(roomId, badText4); - const badEventId5 = await badUser.sendText(roomId, badText5); - const badEvent2Comment = `COMMENT: ${Math.random()}`; - - console.log("Test: Reporting abuse - send reports"); - const reportsToFind: ReportTemplate[] = []; - - // Time to report, first without a comment, then with one. - ( - await goodUser - .doRequest( - "POST", - `/_matrix/client/${endpoint}/rooms/${encodeURIComponent(roomId)}/report/${encodeURIComponent(badEventId)}` - ) - .then((_) => Ok(undefined), resultifyBotSDKRequestError) - ).expect("Could not send first report"); - reportsToFind.push({ - reporter_id: goodUserId, - accused_id: badUserId, - event_id: badEventId, - text: badText, - }); - - ( - await goodUser - .doRequest( - "POST", - `/_matrix/client/${endpoint}/rooms/${encodeURIComponent(roomId)}/report/${encodeURIComponent(badEventId2)}`, - "", - { - reason: badEvent2Comment, - } - ) - .then((_) => Ok(undefined), resultifyBotSDKRequestError) - ).expect("Could not send second report"); - reportsToFind.push({ - reporter_id: goodUserId, - accused_id: badUserId, - event_id: badEventId2, - text: badText2, - comment: badEvent2Comment, - }); - - ( - await goodUser - .doRequest( - "POST", - `/_matrix/client/${endpoint}/rooms/${encodeURIComponent(roomId)}/report/${encodeURIComponent(badEventId3)}`, - "" - ) - .then((_) => Ok(undefined), resultifyBotSDKRequestError) - ).expect("Could not send third report"); - reportsToFind.push({ - reporter_id: goodUserId, - accused_id: badUserId, - event_id: badEventId3, - text: badText3, - }); - - ( - await goodUser - .doRequest( - "POST", - `/_matrix/client/${endpoint}/rooms/${encodeURIComponent(roomId)}/report/${encodeURIComponent(badEventId4)}`, - "" - ) - .then((_) => Ok(undefined), resultifyBotSDKRequestError) - ).expect("Could not send fourth report"); - reportsToFind.push({ - reporter_id: goodUserId, - accused_id: badUserId, - event_id: badEventId4, - text_prefix: badText4.substring(0, 256), - }); - - ( - await goodUser - .doRequest( - "POST", - `/_matrix/client/${endpoint}/rooms/${encodeURIComponent(roomId)}/report/${encodeURIComponent(badEventId5)}`, - "" - ) - .then((_) => Ok(undefined), resultifyBotSDKRequestError) - ).expect("Could not send fifth report"); - reportsToFind.push({ - reporter_id: goodUserId, - accused_id: badUserId, - event_id: badEventId5, - text_prefix: badText5.substring(0, 256).split("\n").join(" "), - }); - - console.log("Test: Reporting abuse - wait"); - await new Promise((resolve) => setTimeout(resolve, 1000)); - const found: ReportTemplate[] = []; - for (const toFind of reportsToFind) { - for (const event of notices) { - if (Value.Check(RoomMessage, event)) { - if ( - !(ABUSE_REPORT_KEY in event.content) || - typeof event.content[ABUSE_REPORT_KEY] !== "object" || - event.content[ABUSE_REPORT_KEY] === null || - !("event_id" in event.content[ABUSE_REPORT_KEY]) || - typeof event.content[ABUSE_REPORT_KEY].event_id !== "string" || - event.content[ABUSE_REPORT_KEY].event_id !== toFind.event_id - ) { - // Not a report or not our report. - continue; - } - const report = event.content[ABUSE_REPORT_KEY] as IReport; - const body = event.content.body; - let matches: Map | null = new Map(); - for (const key of Object.keys( - REPORT_NOTICE_REGEXPS - ) as (keyof typeof REPORT_NOTICE_REGEXPS)[]) { - const match = body.match(REPORT_NOTICE_REGEXPS[key]); - if (match) { - console.debug( - "We have a match", - key, - REPORT_NOTICE_REGEXPS[key], - match.groups - ); - } else { - console.debug("Not a match", key, REPORT_NOTICE_REGEXPS[key]); - // Not a report, skipping. - matches = null; - break; - } - matches.set(key, match); - } - if (!matches) { + ) + .then((_) => Ok(undefined), resultifyBotSDKRequestError) + ).expect("Could not send second report"); + reportsToFind.push({ + reporter_id: goodUserId, + accused_id: badUserId, + event_id: badEventId2, + text: badText2, + comment: badEvent2Comment, + }); + + ( + await goodUser + .doRequest( + "POST", + `/_matrix/client/${endpoint}/rooms/${encodeURIComponent(roomId)}/report/${encodeURIComponent(badEventId3)}`, + "" + ) + .then((_) => Ok(undefined), resultifyBotSDKRequestError) + ).expect("Could not send third report"); + reportsToFind.push({ + reporter_id: goodUserId, + accused_id: badUserId, + event_id: badEventId3, + text: badText3, + }); + + ( + await goodUser + .doRequest( + "POST", + `/_matrix/client/${endpoint}/rooms/${encodeURIComponent(roomId)}/report/${encodeURIComponent(badEventId4)}`, + "" + ) + .then((_) => Ok(undefined), resultifyBotSDKRequestError) + ).expect("Could not send fourth report"); + reportsToFind.push({ + reporter_id: goodUserId, + accused_id: badUserId, + event_id: badEventId4, + text_prefix: badText4.substring(0, 256), + }); + + ( + await goodUser + .doRequest( + "POST", + `/_matrix/client/${endpoint}/rooms/${encodeURIComponent(roomId)}/report/${encodeURIComponent(badEventId5)}`, + "" + ) + .then((_) => Ok(undefined), resultifyBotSDKRequestError) + ).expect("Could not send fifth report"); + reportsToFind.push({ + reporter_id: goodUserId, + accused_id: badUserId, + event_id: badEventId5, + text_prefix: badText5.substring(0, 256).split("\n").join(" "), + }); + + console.log("Test: Reporting abuse - wait"); + await new Promise((resolve) => setTimeout(resolve, 1000)); + const found: ReportTemplate[] = []; + for (const toFind of reportsToFind) { + for (const event of notices) { + if (Value.Check(RoomMessage, event)) { + if ( + !(ABUSE_REPORT_KEY in event.content) || + typeof event.content[ABUSE_REPORT_KEY] !== "object" || + event.content[ABUSE_REPORT_KEY] === null || + !("event_id" in event.content[ABUSE_REPORT_KEY]) || + typeof event.content[ABUSE_REPORT_KEY].event_id !== "string" || + event.content[ABUSE_REPORT_KEY].event_id !== toFind.event_id + ) { + // Not a report or not our report. + continue; + } + const report = event.content[ABUSE_REPORT_KEY] as IReport; + const body = event.content.body; + let matches: Map | null = new Map(); + for (const key of Object.keys( + REPORT_NOTICE_REGEXPS + ) as (keyof typeof REPORT_NOTICE_REGEXPS)[]) { + const match = body.match(REPORT_NOTICE_REGEXPS[key]); + if (match) { + console.debug( + "We have a match", + key, + REPORT_NOTICE_REGEXPS[key], + match.groups + ); + } else { + console.debug("Not a match", key, REPORT_NOTICE_REGEXPS[key]); // Not a report, skipping. - continue; + matches = null; + break; } + matches.set(key, match); + } + if (!matches) { + // Not a report, skipping. + continue; + } - assert( - body.length < 3000, - `The report shouldn't be too long ${body.length}` - ); - assert( - body.split("\n").length < 200, - "The report shouldn't have too many newlines." - ); - - assert.equal( - matches.get("event")?.groups?.eventId, - toFind.event_id, - "The report should specify the correct event id" - ); - - assert.equal( - matches.get("reporter")?.groups?.reporterId, - toFind.reporter_id, - "The report should specify the correct reporter" - ); - assert.equal( - report.reporter_id, - toFind.reporter_id, - "The embedded report should specify the correct reporter" - ); - assert.ok( - ((reporter: string | undefined) => - reporter !== undefined && - toFind.reporter_id.includes(reporter))( - matches.get("reporter")?.groups?.reporterDisplay - ), - "The report should display the correct reporter" - ); - + assert( + body.length < 3000, + `The report shouldn't be too long ${body.length}` + ); + assert( + body.split("\n").length < 200, + "The report shouldn't have too many newlines." + ); + + assert.equal( + matches.get("event")?.groups?.eventId, + toFind.event_id, + "The report should specify the correct event id" + ); + + assert.equal( + matches.get("reporter")?.groups?.reporterId, + toFind.reporter_id, + "The report should specify the correct reporter" + ); + assert.equal( + report.reporter_id, + toFind.reporter_id, + "The embedded report should specify the correct reporter" + ); + assert.ok( + ((reporter: string | undefined) => + reporter !== undefined && + toFind.reporter_id.includes(reporter))( + matches.get("reporter")?.groups?.reporterDisplay + ), + "The report should display the correct reporter" + ); + + assert.equal( + matches.get("accused")?.groups?.accusedId, + toFind.accused_id, + "The report should specify the correct accused" + ); + assert.equal( + report.accused_id, + toFind.accused_id, + "The embedded report should specify the correct accused" + ); + assert.ok( + ((accused: string | undefined) => + accused !== undefined && toFind.accused_id.includes(accused))( + matches.get("accused")?.groups?.accusedDisplay + ), + "The report should display the correct reporter" + ); + + if (toFind.text) { assert.equal( - matches.get("accused")?.groups?.accusedId, - toFind.accused_id, - "The report should specify the correct accused" - ); - assert.equal( - report.accused_id, - toFind.accused_id, - "The embedded report should specify the correct accused" + matches.get("content")?.groups?.eventContent, + toFind.text, + "The report should contain the text we inserted in the event" ); + } + if (toFind.text_prefix) { assert.ok( - ((accused: string | undefined) => - accused !== undefined && toFind.accused_id.includes(accused))( - matches.get("accused")?.groups?.accusedDisplay - ), - "The report should display the correct reporter" - ); - - if (toFind.text) { - assert.equal( - matches.get("content")?.groups?.eventContent, - toFind.text, - "The report should contain the text we inserted in the event" - ); - } - if (toFind.text_prefix) { - assert.ok( - matches - .get("content") - ?.groups?.eventContent?.startsWith(toFind.text_prefix), - `The report should contain a prefix of the long text we inserted in the event: ${toFind.text_prefix} in? ${matches.get("content")?.groups?.eventContent}` - ); - } - if (toFind.comment) { - assert.equal( - matches.get("comments")?.groups?.comments, - toFind.comment, - "The report should contain the comment we added" - ); - } - assert.equal( - matches.get("room")?.groups?.roomAliasOrId, - roomId, - "The report should specify the correct room" + matches + .get("content") + ?.groups?.eventContent?.startsWith(toFind.text_prefix), + `The report should contain a prefix of the long text we inserted in the event: ${toFind.text_prefix} in? ${matches.get("content")?.groups?.eventContent}` ); + } + if (toFind.comment) { assert.equal( - report.room_id, - roomId, - "The embedded report should specify the correct room" + matches.get("comments")?.groups?.comments, + toFind.comment, + "The report should contain the comment we added" ); - found.push(toFind); - break; } + assert.equal( + matches.get("room")?.groups?.roomAliasOrId, + roomId, + "The report should specify the correct room" + ); + assert.equal( + report.room_id, + roomId, + "The embedded report should specify the correct room" + ); + found.push(toFind); + break; } } - assert.deepEqual(found, reportsToFind); - - // Since Draupnir is not a member of the room, the only buttons we should find - // are `help` and `ignore`. - for (const event of reactions) { - const regexp = /\/([[^]]*)\]/; - const matches = event.content["m.relates_to"]?.["key"]?.match(regexp); - if (!matches) { + } + assert.deepEqual(found, reportsToFind); + + // Since Draupnir is not a member of the room, the only buttons we should find + // are `help` and `ignore`. + for (const event of reactions) { + const regexp = /\/([[^]]*)\]/; + const matches = event.content["m.relates_to"]?.["key"]?.match(regexp); + if (!matches) { + continue; + } + switch (matches[1]) { + case "bad-report": + case "help": continue; - } - switch (matches[1]) { - case "bad-report": - case "help": - continue; - default: - throw new Error(`Didn't expect label ${matches[1]}`); - } + default: + throw new Error(`Didn't expect label ${matches[1]}`); } } - ); + }); } it("The redact action works", async function (this: DraupnirTestContext) { this.timeout(60000); diff --git a/apps/draupnir/test/integration/banPropagationTest.ts b/apps/draupnir/test/integration/banPropagationTest.ts index 4663b9a1..995e7ffd 100644 --- a/apps/draupnir/test/integration/banPropagationTest.ts +++ b/apps/draupnir/test/integration/banPropagationTest.ts @@ -24,9 +24,7 @@ import { // We will need to disable this in tests that are banning people otherwise it will cause // mocha to hang for awhile until it times out waiting for a response to a prompt. describe("Ban propagation test", function () { - it("Should be enabled by default", async function ( - this: DraupnirTestContext - ) { + it("Should be enabled by default", async function (this: DraupnirTestContext) { const draupnir = this.draupnir; if (draupnir === undefined) { throw new TypeError(`setup didn't run properly`); @@ -43,137 +41,132 @@ describe("Ban propagation test", function () { ) ).toBeTruthy(); }); - it( - "Should prompt to add bans to a policy list, then add the ban", - async function (this: DraupnirTestContext) { - const draupnir = this.draupnir; - if (draupnir === undefined) { - throw new TypeError(`setup didn't run properly`); - } - const draupnirMatrixClient = draupnirClient(); - if (draupnirMatrixClient === null) { - throw new TypeError(`setup didn't run properly`); - } - const moderator = await newTestUser(this.config.homeserverUrl, { - name: { contains: "moderator" }, - }); - const spammer = await newTestUser(this.config.homeserverUrl, { - name: { contains: "spam" }, - }); - const spamUserID = (await spammer.getUserId()) as StringUserID; - await moderator.joinRoom(draupnir.managementRoomID); - const protectedRooms = await Promise.all( - [...Array(5)].map(async (_) => { - const room = await moderator.createRoom({ - invite: [draupnir.clientUserID, spamUserID], - }); - await draupnir.client.joinRoom(room); - await moderator.setUserPowerLevel(draupnir.clientUserID, room, 100); - await draupnir.protectedRoomsSet.protectedRoomsManager.addRoom( - MatrixRoomReference.fromRoomID(room as StringRoomID) - ); - await spammer.joinRoom(room); - return room; - }) - ); - // create a policy list so that we can check it for a user rule later - const policyListId = await moderator.createRoom({ - invite: [draupnir.clientUserID], - }); - await moderator.setUserPowerLevel( - draupnir.clientUserID, - policyListId, - 100 - ); - await draupnir.client.joinRoom(policyListId); - await draupnir.protectedRoomsSet.watchedPolicyRooms.watchPolicyRoomDirectly( - MatrixRoomReference.fromRoomID(policyListId as StringRoomID) - ); + it("Should prompt to add bans to a policy list, then add the ban", async function (this: DraupnirTestContext) { + const draupnir = this.draupnir; + if (draupnir === undefined) { + throw new TypeError(`setup didn't run properly`); + } + const draupnirMatrixClient = draupnirClient(); + if (draupnirMatrixClient === null) { + throw new TypeError(`setup didn't run properly`); + } + const moderator = await newTestUser(this.config.homeserverUrl, { + name: { contains: "moderator" }, + }); + const spammer = await newTestUser(this.config.homeserverUrl, { + name: { contains: "spam" }, + }); + const spamUserID = (await spammer.getUserId()) as StringUserID; + await moderator.joinRoom(draupnir.managementRoomID); + const protectedRooms = await Promise.all( + [...Array(5)].map(async (_) => { + const room = await moderator.createRoom({ + invite: [draupnir.clientUserID, spamUserID], + }); + await draupnir.client.joinRoom(room); + await moderator.setUserPowerLevel(draupnir.clientUserID, room, 100); + await draupnir.protectedRoomsSet.protectedRoomsManager.addRoom( + MatrixRoomReference.fromRoomID(room as StringRoomID) + ); + await spammer.joinRoom(room); + return room; + }) + ); + // create a policy list so that we can check it for a user rule later + const policyListId = await moderator.createRoom({ + invite: [draupnir.clientUserID], + }); + await moderator.setUserPowerLevel(draupnir.clientUserID, policyListId, 100); + await draupnir.client.joinRoom(policyListId); + await draupnir.protectedRoomsSet.watchedPolicyRooms.watchPolicyRoomDirectly( + MatrixRoomReference.fromRoomID(policyListId as StringRoomID) + ); - // check for the prompt - const promptEvent = await getFirstEventMatching({ - matrix: draupnirMatrixClient, - targetRoom: draupnir.managementRoomID, - lookAfterEvent: async function () { - // ban a user in one of our protected rooms using the moderator - await moderator.banUser(spamUserID, protectedRooms[0], "spam"); - return undefined; - }, - predicate: function (event: unknown): boolean { - return ( - Value.Check(RoomMessage, event) && - Value.Check(NoticeMessageContent, event.content) && - event["content"]["body"].startsWith("The user") - ); - }, - }); - // select the prompt - await moderator.unstableApis.addReactionToEvent( - draupnir.managementRoomID, - promptEvent["event_id"], - "1️⃣" - ); - // check the policy list, after waiting a few seconds. - await new Promise((resolve) => setTimeout(resolve, 10000)); + // check for the prompt + const promptEvent = await getFirstEventMatching({ + matrix: draupnirMatrixClient, + targetRoom: draupnir.managementRoomID, + lookAfterEvent: async function () { + // ban a user in one of our protected rooms using the moderator + await moderator.banUser(spamUserID, protectedRooms[0], "spam"); + return undefined; + }, + predicate: function (event: unknown): boolean { + return ( + Value.Check(RoomMessage, event) && + Value.Check(NoticeMessageContent, event.content) && + event["content"]["body"].startsWith("The user") + ); + }, + }); + // select the prompt + await moderator.unstableApis.addReactionToEvent( + draupnir.managementRoomID, + promptEvent["event_id"], + "1️⃣" + ); + // check the policy list, after waiting a few seconds. + await new Promise((resolve) => setTimeout(resolve, 10000)); - const policyListRevisionAfterBan = - draupnir.protectedRoomsSet.watchedPolicyRooms.currentRevision; - const rules = policyListRevisionAfterBan.allRulesMatchingEntity( - spamUserID, - { - type: PolicyRuleType.User, - } - ); - expect(rules.length).toBe(1); - expect((rules[0] as LiteralPolicyRule).entity).toBe(spamUserID); - expect(rules[0]?.reason).toBe("spam"); + const policyListRevisionAfterBan = + draupnir.protectedRoomsSet.watchedPolicyRooms.currentRevision; + const rules = policyListRevisionAfterBan.allRulesMatchingEntity( + spamUserID, + { + type: PolicyRuleType.User, + } + ); + expect(rules.length).toBe(1); + expect((rules[0] as LiteralPolicyRule).entity).toBe(spamUserID); + expect(rules[0]?.reason).toBe("spam"); - // now unban them >:3 - const unbanPrompt = await getFirstEventMatching({ - matrix: draupnirMatrixClient, - targetRoom: draupnir.managementRoomID, - lookAfterEvent: async function () { - // ban a user in one of our protected rooms using the moderator - await moderator.unbanUser(spamUserID, protectedRooms[0]); - return undefined; - }, - predicate: function (event: unknown): boolean { - return ( - Value.Check(RoomMessage, event) && - Value.Check(NoticeMessageContent, event.content) && - event["content"]["body"].startsWith("The user") - ); - }, - }); + // now unban them >:3 + const unbanPrompt = await getFirstEventMatching({ + matrix: draupnirMatrixClient, + targetRoom: draupnir.managementRoomID, + lookAfterEvent: async function () { + // ban a user in one of our protected rooms using the moderator + await moderator.unbanUser(spamUserID, protectedRooms[0]); + return undefined; + }, + predicate: function (event: unknown): boolean { + return ( + Value.Check(RoomMessage, event) && + Value.Check(NoticeMessageContent, event.content) && + event["content"]["body"].startsWith("The user") + ); + }, + }); - await moderator.unstableApis.addReactionToEvent( - draupnir.managementRoomID, - unbanPrompt["event_id"], - "OK" - ); - await new Promise((resolve) => setTimeout(resolve, 10000)); - const policyListRevisionAfterUnBan = - draupnir.protectedRoomsSet.watchedPolicyRooms.currentRevision; + await moderator.unstableApis.addReactionToEvent( + draupnir.managementRoomID, + unbanPrompt["event_id"], + "OK" + ); + await new Promise((resolve) => setTimeout(resolve, 10000)); + const policyListRevisionAfterUnBan = + draupnir.protectedRoomsSet.watchedPolicyRooms.currentRevision; - const rulesAfterUnban = - policyListRevisionAfterUnBan.allRulesMatchingEntity(spamUserID, { - type: PolicyRuleType.User, - }); - expect(rulesAfterUnban.length).toBe(0); - for (const room of protectedRooms) { - const membershipRevision = - draupnir.protectedRoomsSet.setRoomMembership.getRevision( - room as StringRoomID - ); - if (membershipRevision === undefined) { - throw new TypeError( - `We should be able to get the membership for the protected room` - ); - } - expect( - membershipRevision.membershipForUser(spamUserID)?.membershipChangeType - ).toBe(MembershipChangeType.Unbanned); + const rulesAfterUnban = policyListRevisionAfterUnBan.allRulesMatchingEntity( + spamUserID, + { + type: PolicyRuleType.User, } + ); + expect(rulesAfterUnban.length).toBe(0); + for (const room of protectedRooms) { + const membershipRevision = + draupnir.protectedRoomsSet.setRoomMembership.getRevision( + room as StringRoomID + ); + if (membershipRevision === undefined) { + throw new TypeError( + `We should be able to get the membership for the protected room` + ); + } + expect( + membershipRevision.membershipForUser(spamUserID)?.membershipChangeType + ).toBe(MembershipChangeType.Unbanned); } - ); + }); }); diff --git a/apps/draupnir/test/integration/commands/hijackRoomCommandTest.ts b/apps/draupnir/test/integration/commands/hijackRoomCommandTest.ts index c0e292a2..3dfc460e 100644 --- a/apps/draupnir/test/integration/commands/hijackRoomCommandTest.ts +++ b/apps/draupnir/test/integration/commands/hijackRoomCommandTest.ts @@ -16,9 +16,7 @@ import { PowerLevelsEventContent } from "matrix-protection-suite"; // Breaks with this test. describe("Test: The make admin command", function () { - it("Draupnir make the bot self room administrator", async function ( - this: DraupnirTestContext - ) { + it("Draupnir make the bot self room administrator", async function (this: DraupnirTestContext) { this.timeout(90000); if (!this.config.admin?.enableMakeRoomAdminCommand) { return; diff --git a/apps/draupnir/test/integration/commands/redactCommandTest.ts b/apps/draupnir/test/integration/commands/redactCommandTest.ts index 25cb9bd7..3511c01f 100644 --- a/apps/draupnir/test/integration/commands/redactCommandTest.ts +++ b/apps/draupnir/test/integration/commands/redactCommandTest.ts @@ -32,70 +32,165 @@ describe("Test: The redaction command", function () { this.moderator?.stop(); }); - it( - "Draupnir redacts all of the events sent by a spammer when instructed to by giving their id and a room id.", - async function (this: RedactionTestContext) { - this.timeout(60000); - // Create a few users and a room. - const badUser = await newTestUser(this.config.homeserverUrl, { - name: { contains: "spammer-needs-redacting" }, - }); - const badUserId = await badUser.getUserId(); - const draupnirMatrixClient = draupnirClient(); - const draupnir = this.draupnir; - if (draupnirMatrixClient === null || draupnir === undefined) { - throw new TypeError(`Test isn't setup correctly`); + it("Draupnir redacts all of the events sent by a spammer when instructed to by giving their id and a room id.", async function (this: RedactionTestContext) { + this.timeout(60000); + // Create a few users and a room. + const badUser = await newTestUser(this.config.homeserverUrl, { + name: { contains: "spammer-needs-redacting" }, + }); + const badUserId = await badUser.getUserId(); + const draupnirMatrixClient = draupnirClient(); + const draupnir = this.draupnir; + if (draupnirMatrixClient === null || draupnir === undefined) { + throw new TypeError(`Test isn't setup correctly`); + } + const mjolnirUserId = await draupnirMatrixClient.getUserId(); + const moderator = await newTestUser(this.config.homeserverUrl, { + name: { contains: "moderator" }, + }); + this.moderator = moderator; + await moderator.joinRoom(draupnir.managementRoomID); + const targetRoom = await moderator.createRoom({ + invite: [await badUser.getUserId(), mjolnirUserId], + }); + await moderator.setUserPowerLevel(mjolnirUserId, targetRoom, 100); + await badUser.joinRoom(targetRoom); + await getFirstReaction( + draupnirSafeEmitter(), + draupnir.managementRoomID, + "✅", + async () => { + return moderator.sendMessage(draupnir.managementRoomID, { + msgtype: "m.text", + body: `!draupnir rooms add ${targetRoom}`, + }); } - const mjolnirUserId = await draupnirMatrixClient.getUserId(); - const moderator = await newTestUser(this.config.homeserverUrl, { - name: { contains: "moderator" }, + ); + LogService.debug( + "redactionTest", + `targetRoom: ${targetRoom}, managementRoom: ${this.config.managementRoom}` + ); + // Sandwich irrelevant messages in bad messages. + await badUser.sendMessage(targetRoom, { + msgtype: "m.text", + body: "Very Bad Stuff", + }); + await Promise.all( + [...Array(50).keys()].map((i) => + moderator.sendMessage(targetRoom, { + msgtype: "m.text", + body: `Irrelevant Message #${i}`, + }) + ) + ); + for (let i = 0; i < 5; i++) { + await badUser.sendMessage(targetRoom, { + msgtype: "m.text", + body: "Very Bad Stuff", }); - this.moderator = moderator; - await moderator.joinRoom(draupnir.managementRoomID); + } + await Promise.all( + [...Array(50).keys()].map((i) => + moderator.sendMessage(targetRoom, { + msgtype: "m.text", + body: `Irrelevant Message #${i}`, + }) + ) + ); + await badUser.sendMessage(targetRoom, { + msgtype: "m.text", + body: "Very Bad Stuff", + }); + + await getFirstReaction( + draupnirSafeEmitter(), + draupnir.managementRoomID, + "✅", + async () => { + return await moderator.sendMessage(draupnir.managementRoomID, { + msgtype: "m.text", + body: `!draupnir redact ${badUserId} --room ${targetRoom}`, + }); + } + ); + + await getMessagesByUserIn( + moderator, + badUserId, + targetRoom, + 1000, + function (events) { + events.map((e) => { + if (e.type === "m.room.member") { + assert.equal( + Object.keys(e.content).length, + 1, + "Only membership should be left on the membership even when it has been redacted." + ); + } else if (Object.keys(e.content).length !== 0) { + throw new Error( + `This event should have been redacted: ${JSON.stringify(e, null, 2)}` + ); + } + }); + } + ); + }); + + it("Draupnir redacts all of the events sent by a spammer when instructed to by giving their id in multiple rooms.", async function (this: RedactionTestContext) { + this.timeout(60000); + // Create a few users and a room. + const badUser = await newTestUser(this.config.homeserverUrl, { + name: { contains: "spammer-needs-redacting" }, + }); + const badUserId = await badUser.getUserId(); + const draupnir = this.draupnir; + if (draupnir === undefined) { + throw new TypeError(`Test isn't setup correctly`); + } + const mjolnirUserId = await draupnir.client.getUserId(); + const moderator = await newTestUser(this.config.homeserverUrl, { + name: { contains: "moderator" }, + }); + this.moderator = moderator; + await moderator.joinRoom(draupnir.managementRoomID); + const targetRooms: string[] = []; + for (let i = 0; i < 5; i++) { const targetRoom = await moderator.createRoom({ invite: [await badUser.getUserId(), mjolnirUserId], }); await moderator.setUserPowerLevel(mjolnirUserId, targetRoom, 100); await badUser.joinRoom(targetRoom); - await getFirstReaction( - draupnirSafeEmitter(), - draupnir.managementRoomID, - "✅", - async () => { - return moderator.sendMessage(draupnir.managementRoomID, { - msgtype: "m.text", - body: `!draupnir rooms add ${targetRoom}`, - }); - } - ); - LogService.debug( - "redactionTest", - `targetRoom: ${targetRoom}, managementRoom: ${this.config.managementRoom}` - ); + await moderator.sendMessage(draupnir.managementRoomID, { + msgtype: "m.text", + body: `!draupnir rooms add ${targetRoom}`, + }); + targetRooms.push(targetRoom); + // Sandwich irrelevant messages in bad messages. await badUser.sendMessage(targetRoom, { msgtype: "m.text", body: "Very Bad Stuff", }); await Promise.all( - [...Array(50).keys()].map((i) => + [...Array(50).keys()].map((j) => moderator.sendMessage(targetRoom, { msgtype: "m.text", - body: `Irrelevant Message #${i}`, + body: `Irrelevant Message #${j}`, }) ) ); - for (let i = 0; i < 5; i++) { + for (let j = 0; j < 5; j++) { await badUser.sendMessage(targetRoom, { msgtype: "m.text", body: "Very Bad Stuff", }); } await Promise.all( - [...Array(50).keys()].map((i) => + [...Array(50).keys()].map((j) => moderator.sendMessage(targetRoom, { msgtype: "m.text", - body: `Irrelevant Message #${i}`, + body: `Irrelevant Message #${j}`, }) ) ); @@ -103,150 +198,47 @@ describe("Test: The redaction command", function () { msgtype: "m.text", body: "Very Bad Stuff", }); - - await getFirstReaction( - draupnirSafeEmitter(), - draupnir.managementRoomID, - "✅", - async () => { - return await moderator.sendMessage(draupnir.managementRoomID, { - msgtype: "m.text", - body: `!draupnir redact ${badUserId} --room ${targetRoom}`, - }); - } - ); - - await getMessagesByUserIn( - moderator, - badUserId, - targetRoom, - 1000, - function (events) { - events.map((e) => { - if (e.type === "m.room.member") { - assert.equal( - Object.keys(e.content).length, - 1, - "Only membership should be left on the membership even when it has been redacted." - ); - } else if (Object.keys(e.content).length !== 0) { - throw new Error( - `This event should have been redacted: ${JSON.stringify(e, null, 2)}` - ); - } - }); - } - ); } - ); - it( - "Draupnir redacts all of the events sent by a spammer when instructed to by giving their id in multiple rooms.", - async function (this: RedactionTestContext) { - this.timeout(60000); - // Create a few users and a room. - const badUser = await newTestUser(this.config.homeserverUrl, { - name: { contains: "spammer-needs-redacting" }, - }); - const badUserId = await badUser.getUserId(); - const draupnir = this.draupnir; - if (draupnir === undefined) { - throw new TypeError(`Test isn't setup correctly`); - } - const mjolnirUserId = await draupnir.client.getUserId(); - const moderator = await newTestUser(this.config.homeserverUrl, { - name: { contains: "moderator" }, - }); - this.moderator = moderator; - await moderator.joinRoom(draupnir.managementRoomID); - const targetRooms: string[] = []; - for (let i = 0; i < 5; i++) { - const targetRoom = await moderator.createRoom({ - invite: [await badUser.getUserId(), mjolnirUserId], - }); - await moderator.setUserPowerLevel(mjolnirUserId, targetRoom, 100); - await badUser.joinRoom(targetRoom); - await moderator.sendMessage(draupnir.managementRoomID, { - msgtype: "m.text", - body: `!draupnir rooms add ${targetRoom}`, - }); - targetRooms.push(targetRoom); - - // Sandwich irrelevant messages in bad messages. - await badUser.sendMessage(targetRoom, { - msgtype: "m.text", - body: "Very Bad Stuff", - }); - await Promise.all( - [...Array(50).keys()].map((j) => - moderator.sendMessage(targetRoom, { - msgtype: "m.text", - body: `Irrelevant Message #${j}`, - }) - ) - ); - for (let j = 0; j < 5; j++) { - await badUser.sendMessage(targetRoom, { - msgtype: "m.text", - body: "Very Bad Stuff", - }); - } - await Promise.all( - [...Array(50).keys()].map((j) => - moderator.sendMessage(targetRoom, { - msgtype: "m.text", - body: `Irrelevant Message #${j}`, - }) - ) - ); - await badUser.sendMessage(targetRoom, { + await getFirstReaction( + draupnirSafeEmitter(), + draupnir.managementRoomID, + "✅", + async () => { + return await moderator.sendMessage(draupnir.managementRoomID, { msgtype: "m.text", - body: "Very Bad Stuff", + body: `!draupnir redact ${badUserId}`, }); } + ); - await getFirstReaction( - draupnirSafeEmitter(), - draupnir.managementRoomID, - "✅", - async () => { - return await moderator.sendMessage(draupnir.managementRoomID, { - msgtype: "m.text", - body: `!draupnir redact ${badUserId}`, - }); - } - ); - - await Promise.all( - targetRooms.map(async (targetRoom) => { - await getMessagesByUserIn( - moderator, - badUserId, - targetRoom, - 1000, - function (events) { - events.map((e) => { - if (e.type === "m.room.member") { - assert.equal( - Object.keys(e.content).length, - 1, - "Only membership should be left on the membership even when it has been redacted." - ); - } else if (Object.keys(e.content).length !== 0) { - throw new Error( - `This event should have been redacted: ${JSON.stringify(e, null, 2)}` - ); - } - }); - } - ); - }) - ); - } - ); - it("Redacts a single event when instructed to.", async function ( - this: RedactionTestContext - ) { + await Promise.all( + targetRooms.map(async (targetRoom) => { + await getMessagesByUserIn( + moderator, + badUserId, + targetRoom, + 1000, + function (events) { + events.map((e) => { + if (e.type === "m.room.member") { + assert.equal( + Object.keys(e.content).length, + 1, + "Only membership should be left on the membership even when it has been redacted." + ); + } else if (Object.keys(e.content).length !== 0) { + throw new Error( + `This event should have been redacted: ${JSON.stringify(e, null, 2)}` + ); + } + }); + } + ); + }) + ); + }); + it("Redacts a single event when instructed to.", async function (this: RedactionTestContext) { this.timeout(60000); // Create a few users and a room. const badUser = await newTestUser(this.config.homeserverUrl, { diff --git a/apps/draupnir/test/integration/commands/roomsTest.ts b/apps/draupnir/test/integration/commands/roomsTest.ts index 691aa09d..e501b8cb 100644 --- a/apps/draupnir/test/integration/commands/roomsTest.ts +++ b/apps/draupnir/test/integration/commands/roomsTest.ts @@ -24,78 +24,75 @@ describe("Test: The rooms commands", function () { this.moderator?.stop(); }); - it( - "Draupnir can protect a room, show that it is protected and then stop protecting the room.", - async function (this: RoomsTestContext) { - // Create a few users and a room. - const draupnir = this.draupnir; - if (draupnir === undefined) { - throw new TypeError(`Test isn't setup correctly`); - } - const moderator = await newTestUser(this.config.homeserverUrl, { - name: { contains: "moderator" }, - }); - this.moderator = moderator; - await moderator.joinRoom(draupnir.managementRoomID); - const targetRoom = await moderator.createRoom({ - invite: [draupnir.clientUserID], - }); - await moderator.setUserPowerLevel(draupnir.clientUserID, targetRoom, 100); - - await getFirstReaction( - draupnirSafeEmitter(), - draupnir.managementRoomID, - "✅", - async () => { - return await moderator.sendMessage(draupnir.managementRoomID, { - msgtype: "m.text", - body: `!draupnir rooms add ${targetRoom}`, - }); - } - ); - let protectedRoomsMessage = await getFirstReply( - draupnirSafeEmitter(), - draupnir.managementRoomID, - async () => { - return await moderator.sendMessage(draupnir.managementRoomID, { - msgtype: "m.text", - body: `!draupnir rooms`, - }); - } - ); - assert.equal( - protectedRoomsMessage["content"]["body"].includes("2"), - true, - "There should be two protected rooms (including the management room)" - ); - await getFirstReaction( - draupnirSafeEmitter(), - draupnir.managementRoomID, - "✅", - async () => { - return await moderator.sendMessage(draupnir.managementRoomID, { - msgtype: "m.text", - body: `!draupnir rooms remove ${targetRoom}`, - }); - } - ); - protectedRoomsMessage = await getFirstReply( - draupnirSafeEmitter(), - draupnir.managementRoomID, - async () => { - return await moderator.sendMessage(draupnir.managementRoomID, { - msgtype: "m.text", - body: `!draupnir rooms`, - }); - } - ); - // wait for policy change notification to create - await new Promise((resolve) => setTimeout(resolve, 1000)); - assert.equal( - protectedRoomsMessage["content"]["body"].includes("2"), - true, - "Only the management room should be protected and the policy change notification room." - ); + it("Draupnir can protect a room, show that it is protected and then stop protecting the room.", async function (this: RoomsTestContext) { + // Create a few users and a room. + const draupnir = this.draupnir; + if (draupnir === undefined) { + throw new TypeError(`Test isn't setup correctly`); } - ); + const moderator = await newTestUser(this.config.homeserverUrl, { + name: { contains: "moderator" }, + }); + this.moderator = moderator; + await moderator.joinRoom(draupnir.managementRoomID); + const targetRoom = await moderator.createRoom({ + invite: [draupnir.clientUserID], + }); + await moderator.setUserPowerLevel(draupnir.clientUserID, targetRoom, 100); + + await getFirstReaction( + draupnirSafeEmitter(), + draupnir.managementRoomID, + "✅", + async () => { + return await moderator.sendMessage(draupnir.managementRoomID, { + msgtype: "m.text", + body: `!draupnir rooms add ${targetRoom}`, + }); + } + ); + let protectedRoomsMessage = await getFirstReply( + draupnirSafeEmitter(), + draupnir.managementRoomID, + async () => { + return await moderator.sendMessage(draupnir.managementRoomID, { + msgtype: "m.text", + body: `!draupnir rooms`, + }); + } + ); + assert.equal( + protectedRoomsMessage["content"]["body"].includes("2"), + true, + "There should be two protected rooms (including the management room)" + ); + await getFirstReaction( + draupnirSafeEmitter(), + draupnir.managementRoomID, + "✅", + async () => { + return await moderator.sendMessage(draupnir.managementRoomID, { + msgtype: "m.text", + body: `!draupnir rooms remove ${targetRoom}`, + }); + } + ); + protectedRoomsMessage = await getFirstReply( + draupnirSafeEmitter(), + draupnir.managementRoomID, + async () => { + return await moderator.sendMessage(draupnir.managementRoomID, { + msgtype: "m.text", + body: `!draupnir rooms`, + }); + } + ); + // wait for policy change notification to create + await new Promise((resolve) => setTimeout(resolve, 1000)); + assert.equal( + protectedRoomsMessage["content"]["body"].includes("2"), + true, + "Only the management room should be protected and the policy change notification room." + ); + }); }); diff --git a/apps/draupnir/test/integration/commands/shutdownCommandTest.ts b/apps/draupnir/test/integration/commands/shutdownCommandTest.ts index fba8844d..d201b2ca 100644 --- a/apps/draupnir/test/integration/commands/shutdownCommandTest.ts +++ b/apps/draupnir/test/integration/commands/shutdownCommandTest.ts @@ -30,9 +30,7 @@ describe("Test: shutdown command", function (this: Mocha.Suite) { this.afterEach(async function (this: DraupnirTestContext) { client.stop(); } as unknown as Mocha.AsyncFunc); - it("Draupnir asks synapse to shut down a channel", async function ( - this: DraupnirTestContext - ) { + it("Draupnir asks synapse to shut down a channel", async function (this: DraupnirTestContext) { this.timeout(20000); const badRoom = await client.createRoom(); const draupnir = this.draupnir; diff --git a/apps/draupnir/test/integration/commands/unbanTest.ts b/apps/draupnir/test/integration/commands/unbanTest.ts index 32a8daac..fce5d22f 100644 --- a/apps/draupnir/test/integration/commands/unbanTest.ts +++ b/apps/draupnir/test/integration/commands/unbanTest.ts @@ -103,129 +103,124 @@ async function createWatchedPolicyRoom( } describe("unbanCommandTest", function () { - it( - "Should be able to unban members to protected rooms, removing all policies that will target them", - async function (this: DraupnirTestContext) { - const draupnir = this.draupnir; - if (draupnir === undefined) { - throw new TypeError(`setup didn't run properly`); - } - const falsePositiveUser = await newTestUser(this.config.homeserverUrl, { - name: { contains: "accidentally-banned" }, - }); - const falsePositiveUserID = - (await falsePositiveUser.getUserId()) as StringUserID; - const protectedRooms = await createProtectedRoomsSetWithBan( - draupnir, - falsePositiveUserID, - { numberOfRooms: 5 } - ); - const policyRoomID = await createWatchedPolicyRoom(draupnir); - const policyRoomEditor = ( - await draupnir.policyRoomManager.getPolicyRoomEditor( - MatrixRoomReference.fromRoomID(policyRoomID) - ) - ).expect( - "Should be able to get a policy room editor for the newly created policy room" - ); - await createPoliciesBanningUser(policyRoomEditor, falsePositiveUserID); - // wait for policies to be detected. - await new Promise((resolve) => setTimeout(resolve, 1000)); + it("Should be able to unban members to protected rooms, removing all policies that will target them", async function (this: DraupnirTestContext) { + const draupnir = this.draupnir; + if (draupnir === undefined) { + throw new TypeError(`setup didn't run properly`); + } + const falsePositiveUser = await newTestUser(this.config.homeserverUrl, { + name: { contains: "accidentally-banned" }, + }); + const falsePositiveUserID = + (await falsePositiveUser.getUserId()) as StringUserID; + const protectedRooms = await createProtectedRoomsSetWithBan( + draupnir, + falsePositiveUserID, + { numberOfRooms: 5 } + ); + const policyRoomID = await createWatchedPolicyRoom(draupnir); + const policyRoomEditor = ( + await draupnir.policyRoomManager.getPolicyRoomEditor( + MatrixRoomReference.fromRoomID(policyRoomID) + ) + ).expect( + "Should be able to get a policy room editor for the newly created policy room" + ); + await createPoliciesBanningUser(policyRoomEditor, falsePositiveUserID); + // wait for policies to be detected. + await new Promise((resolve) => setTimeout(resolve, 1000)); - // Now we can use the unban command to test the preview has no effects - // So the way this can work is we can send the command, get back the event and just know that we can send 'OK' and 'Cancel' to it later and it'll work. - const previewResult = ( - await draupnir.sendTextCommand( - draupnir.clientUserID, - `!draupnir unban ${falsePositiveUserID}` - ) - ).expect( - "We should have been able to get a preview" - ) as UnbanMembersPreview; - expect(previewResult.membersToUnban.length).toBe(1); // hmm we're going to have to put the user on a different server... - expect(previewResult.policyMatchesToRemove.length).toBe(1); - const listMatches = previewResult.policyMatchesToRemove.at(0); - if (listMatches === undefined) { - throw new TypeError("We should have some matches"); - } - expect(listMatches.matches.length).toBe(3); - const falsePositiveMember = previewResult.membersToUnban.at(0); - if (falsePositiveMember === undefined) { - throw new TypeError("We should have some details here"); - } - expect(falsePositiveMember.roomsBannedFrom.length).toBe(5); - expect(falsePositiveMember.roomsToInviteTo.length).toBe(0); - expect(falsePositiveMember.member).toBe(falsePositiveUserID); - // now checked that the user is still banned in all 5 rooms - for (const roomID of protectedRooms) { - const membershipRevision = - draupnir.protectedRoomsSet.setRoomMembership.getRevision(roomID); - if (membershipRevision === undefined) { - throw new TypeError( - "Unable to find membership revision for a protected room, shouldn't happen" - ); - } - expect( - membershipRevision.membershipForUser(falsePositiveUserID)?.membership - ).toBe(Membership.Ban); + // Now we can use the unban command to test the preview has no effects + // So the way this can work is we can send the command, get back the event and just know that we can send 'OK' and 'Cancel' to it later and it'll work. + const previewResult = ( + await draupnir.sendTextCommand( + draupnir.clientUserID, + `!draupnir unban ${falsePositiveUserID}` + ) + ).expect( + "We should have been able to get a preview" + ) as UnbanMembersPreview; + expect(previewResult.membersToUnban.length).toBe(1); // hmm we're going to have to put the user on a different server... + expect(previewResult.policyMatchesToRemove.length).toBe(1); + const listMatches = previewResult.policyMatchesToRemove.at(0); + if (listMatches === undefined) { + throw new TypeError("We should have some matches"); + } + expect(listMatches.matches.length).toBe(3); + const falsePositiveMember = previewResult.membersToUnban.at(0); + if (falsePositiveMember === undefined) { + throw new TypeError("We should have some details here"); + } + expect(falsePositiveMember.roomsBannedFrom.length).toBe(5); + expect(falsePositiveMember.roomsToInviteTo.length).toBe(0); + expect(falsePositiveMember.member).toBe(falsePositiveUserID); + // now checked that the user is still banned in all 5 rooms + for (const roomID of protectedRooms) { + const membershipRevision = + draupnir.protectedRoomsSet.setRoomMembership.getRevision(roomID); + if (membershipRevision === undefined) { + throw new TypeError( + "Unable to find membership revision for a protected room, shouldn't happen" + ); } - ( - await draupnir.sendTextCommand( - draupnir.clientUserID, - `!draupnir unban ${falsePositiveUserID} --no-confirm` - ) - ).expect( - "We should have been able to run the command" - ) as UnbanMembersResult; - // wait for events to come down sync - await new Promise((resolve) => setTimeout(resolve, 1000)); - // now check that they are unbanned - for (const roomID of protectedRooms) { - const membershipRevision = - draupnir.protectedRoomsSet.setRoomMembership.getRevision(roomID); - if (membershipRevision === undefined) { - throw new TypeError( - "Unable to find membership revision for a protected room, shouldn't happen" - ); - } - expect( - membershipRevision.membershipForUser(falsePositiveUserID)?.membership - ).toBe(Membership.Leave); + expect( + membershipRevision.membershipForUser(falsePositiveUserID)?.membership + ).toBe(Membership.Ban); + } + ( + await draupnir.sendTextCommand( + draupnir.clientUserID, + `!draupnir unban ${falsePositiveUserID} --no-confirm` + ) + ).expect( + "We should have been able to run the command" + ) as UnbanMembersResult; + // wait for events to come down sync + await new Promise((resolve) => setTimeout(resolve, 1000)); + // now check that they are unbanned + for (const roomID of protectedRooms) { + const membershipRevision = + draupnir.protectedRoomsSet.setRoomMembership.getRevision(roomID); + if (membershipRevision === undefined) { + throw new TypeError( + "Unable to find membership revision for a protected room, shouldn't happen" + ); } - // verify the policies are removed. - const policyRevision = - draupnir.protectedRoomsSet.watchedPolicyRooms.currentRevision; - expect(policyRevision.allRules.length).toBe(0); + expect( + membershipRevision.membershipForUser(falsePositiveUserID)?.membership + ).toBe(Membership.Leave); + } + // verify the policies are removed. + const policyRevision = + draupnir.protectedRoomsSet.watchedPolicyRooms.currentRevision; + expect(policyRevision.allRules.length).toBe(0); - // (Bonus) now check that if we run the command again, then the user will be reinvited even though they have been unbanned. - const inviteResult = ( - await draupnir.sendTextCommand( - draupnir.clientUserID, - `!draupnir unban ${falsePositiveUserID} --no-confirm --invite` - ) - ).expect( - "We should have been able to run the command" - ) as UnbanMembersResult; - expect(inviteResult.usersInvited.map.size).toBe(1); - expect(inviteResult.membersToUnban.at(0)?.roomsToInviteTo.length).toBe(5); - await new Promise((resolve) => setTimeout(resolve, 1000)); - for (const roomID of protectedRooms) { - const membershipRevision = - draupnir.protectedRoomsSet.setRoomMembership.getRevision(roomID); - if (membershipRevision === undefined) { - throw new TypeError( - "Unable to find membership revision for a protected room, shouldn't happen" - ); - } - expect( - membershipRevision.membershipForUser(falsePositiveUserID)?.membership - ).toBe(Membership.Invite); + // (Bonus) now check that if we run the command again, then the user will be reinvited even though they have been unbanned. + const inviteResult = ( + await draupnir.sendTextCommand( + draupnir.clientUserID, + `!draupnir unban ${falsePositiveUserID} --no-confirm --invite` + ) + ).expect( + "We should have been able to run the command" + ) as UnbanMembersResult; + expect(inviteResult.usersInvited.map.size).toBe(1); + expect(inviteResult.membersToUnban.at(0)?.roomsToInviteTo.length).toBe(5); + await new Promise((resolve) => setTimeout(resolve, 1000)); + for (const roomID of protectedRooms) { + const membershipRevision = + draupnir.protectedRoomsSet.setRoomMembership.getRevision(roomID); + if (membershipRevision === undefined) { + throw new TypeError( + "Unable to find membership revision for a protected room, shouldn't happen" + ); } + expect( + membershipRevision.membershipForUser(falsePositiveUserID)?.membership + ).toBe(Membership.Invite); } - ); - it("Unbans users even when there are no policies", async function ( - this: DraupnirTestContext - ) { + }); + it("Unbans users even when there are no policies", async function (this: DraupnirTestContext) { const draupnir = this.draupnir; if (draupnir === undefined) { throw new TypeError(`setup didn't run properly`); @@ -268,360 +263,344 @@ describe("unbanCommandTest", function () { ).toBe(Membership.Leave); } }); - it( - "Unbans and reinvites users when the invite option is provided", - async function (this: DraupnirTestContext) { - const draupnir = this.draupnir; - if (draupnir === undefined) { - throw new TypeError(`setup didn't run properly`); - } - const falsePositiveUser = await newTestUser(this.config.homeserverUrl, { - name: { contains: "accidentally-banned" }, - }); - const falsePositiveUserID = - (await falsePositiveUser.getUserId()) as StringUserID; - const protectedRooms = await createProtectedRoomsSetWithBan( - draupnir, - falsePositiveUserID, - { numberOfRooms: 5 } - ); + it("Unbans and reinvites users when the invite option is provided", async function (this: DraupnirTestContext) { + const draupnir = this.draupnir; + if (draupnir === undefined) { + throw new TypeError(`setup didn't run properly`); + } + const falsePositiveUser = await newTestUser(this.config.homeserverUrl, { + name: { contains: "accidentally-banned" }, + }); + const falsePositiveUserID = + (await falsePositiveUser.getUserId()) as StringUserID; + const protectedRooms = await createProtectedRoomsSetWithBan( + draupnir, + falsePositiveUserID, + { numberOfRooms: 5 } + ); - // Now we can use the unban command to test the preview has no effects - // So the way this can work is we can send the command, get back the event and just know that we can send 'OK' and 'Cancel' to it later and it'll work. - const previewResult = ( - await draupnir.sendTextCommand( - draupnir.clientUserID, - `!draupnir unban ${falsePositiveUserID} --invite` - ) - ).expect( - "We should have been able to get a preview" - ) as UnbanMembersPreview; - expect(previewResult.membersToUnban.length).toBe(1); // hmm we're going to have to put the user on a different server... - expect(previewResult.policyMatchesToRemove.length).toBe(0); - const falsePositiveMember = previewResult.membersToUnban.at(0); - if (falsePositiveMember === undefined) { - throw new TypeError("We should have some details here"); - } - expect(falsePositiveMember.roomsBannedFrom.length).toBe(5); - expect(falsePositiveMember.roomsToInviteTo.length).toBe(5); - expect(falsePositiveMember.member).toBe(falsePositiveUserID); - // now checked that the user is still banned in all 5 rooms - for (const roomID of protectedRooms) { - const membershipRevision = - draupnir.protectedRoomsSet.setRoomMembership.getRevision(roomID); - if (membershipRevision === undefined) { - throw new TypeError( - "Unable to find membership revision for a protected room, shouldn't happen" - ); - } - expect( - membershipRevision.membershipForUser(falsePositiveUserID)?.membership - ).toBe(Membership.Ban); - } - ( - await draupnir.sendTextCommand( - draupnir.clientUserID, - `!draupnir unban ${falsePositiveUserID} --invite --no-confirm` - ) - ).expect( - "We should have been able to run the command" - ) as UnbanMembersResult; - // wait for events to come down sync - await new Promise((resolve) => setTimeout(resolve, 1000)); - // now check that they are unbanned - for (const roomID of protectedRooms) { - const membershipRevision = - draupnir.protectedRoomsSet.setRoomMembership.getRevision(roomID); - if (membershipRevision === undefined) { - throw new TypeError( - "Unable to find membership revision for a protected room, shouldn't happen" - ); - } - expect( - membershipRevision.membershipForUser(falsePositiveUserID)?.membership - ).toBe(Membership.Invite); + // Now we can use the unban command to test the preview has no effects + // So the way this can work is we can send the command, get back the event and just know that we can send 'OK' and 'Cancel' to it later and it'll work. + const previewResult = ( + await draupnir.sendTextCommand( + draupnir.clientUserID, + `!draupnir unban ${falsePositiveUserID} --invite` + ) + ).expect( + "We should have been able to get a preview" + ) as UnbanMembersPreview; + expect(previewResult.membersToUnban.length).toBe(1); // hmm we're going to have to put the user on a different server... + expect(previewResult.policyMatchesToRemove.length).toBe(0); + const falsePositiveMember = previewResult.membersToUnban.at(0); + if (falsePositiveMember === undefined) { + throw new TypeError("We should have some details here"); + } + expect(falsePositiveMember.roomsBannedFrom.length).toBe(5); + expect(falsePositiveMember.roomsToInviteTo.length).toBe(5); + expect(falsePositiveMember.member).toBe(falsePositiveUserID); + // now checked that the user is still banned in all 5 rooms + for (const roomID of protectedRooms) { + const membershipRevision = + draupnir.protectedRoomsSet.setRoomMembership.getRevision(roomID); + if (membershipRevision === undefined) { + throw new TypeError( + "Unable to find membership revision for a protected room, shouldn't happen" + ); } + expect( + membershipRevision.membershipForUser(falsePositiveUserID)?.membership + ).toBe(Membership.Ban); } - ); - it( - "unbans users when there is no membership and only policies", - async function (this: DraupnirTestContext) { - const draupnir = this.draupnir; - if (draupnir === undefined) { - throw new TypeError(`setup didn't run properly`); + ( + await draupnir.sendTextCommand( + draupnir.clientUserID, + `!draupnir unban ${falsePositiveUserID} --invite --no-confirm` + ) + ).expect( + "We should have been able to run the command" + ) as UnbanMembersResult; + // wait for events to come down sync + await new Promise((resolve) => setTimeout(resolve, 1000)); + // now check that they are unbanned + for (const roomID of protectedRooms) { + const membershipRevision = + draupnir.protectedRoomsSet.setRoomMembership.getRevision(roomID); + if (membershipRevision === undefined) { + throw new TypeError( + "Unable to find membership revision for a protected room, shouldn't happen" + ); } - const falsePositiveUser = await newTestUser(this.config.homeserverUrl, { - name: { contains: "accidentally-banned" }, - }); - const falsePositiveUserID = - (await falsePositiveUser.getUserId()) as StringUserID; - const policyRoomID = await createWatchedPolicyRoom(draupnir); - const policyRoomEditor = ( - await draupnir.policyRoomManager.getPolicyRoomEditor( - MatrixRoomReference.fromRoomID(policyRoomID) - ) - ).expect( - "Should be able to get a policy room editor for the newly created policy room" - ); - await createPoliciesBanningUser(policyRoomEditor, falsePositiveUserID); - // wait for policies to be detected. - await new Promise((resolve) => setTimeout(resolve, 1000)); + expect( + membershipRevision.membershipForUser(falsePositiveUserID)?.membership + ).toBe(Membership.Invite); + } + }); + it("unbans users when there is no membership and only policies", async function (this: DraupnirTestContext) { + const draupnir = this.draupnir; + if (draupnir === undefined) { + throw new TypeError(`setup didn't run properly`); + } + const falsePositiveUser = await newTestUser(this.config.homeserverUrl, { + name: { contains: "accidentally-banned" }, + }); + const falsePositiveUserID = + (await falsePositiveUser.getUserId()) as StringUserID; + const policyRoomID = await createWatchedPolicyRoom(draupnir); + const policyRoomEditor = ( + await draupnir.policyRoomManager.getPolicyRoomEditor( + MatrixRoomReference.fromRoomID(policyRoomID) + ) + ).expect( + "Should be able to get a policy room editor for the newly created policy room" + ); + await createPoliciesBanningUser(policyRoomEditor, falsePositiveUserID); + // wait for policies to be detected. + await new Promise((resolve) => setTimeout(resolve, 1000)); - // Now we can use the unban command to test the preview has no effects - // So the way this can work is we can send the command, get back the event and just know that we can send 'OK' and 'Cancel' to it later and it'll work. - const previewResult = ( - await draupnir.sendTextCommand( - draupnir.clientUserID, - `!draupnir unban ${falsePositiveUserID}` - ) - ).expect( - "We should have been able to get a preview" - ) as UnbanMembersPreview; - expect(previewResult.membersToUnban.length).toBe(0); - expect(previewResult.policyMatchesToRemove.length).toBe(1); - const listMatches = previewResult.policyMatchesToRemove.at(0); - if (listMatches === undefined) { - throw new TypeError("We should have some matches"); - } - expect(listMatches.matches.length).toBe(3); - ( - await draupnir.sendTextCommand( - draupnir.clientUserID, - `!draupnir unban ${falsePositiveUserID} --no-confirm` - ) - ).expect( - "We should have been able to run the command" - ) as UnbanMembersResult; - // wait for events to come down sync - await new Promise((resolve) => setTimeout(resolve, 1000)); - // verify the policies are removed. - const policyRevision = - draupnir.protectedRoomsSet.watchedPolicyRooms.currentRevision; - expect(policyRevision.allRules().length).toBe(0); + // Now we can use the unban command to test the preview has no effects + // So the way this can work is we can send the command, get back the event and just know that we can send 'OK' and 'Cancel' to it later and it'll work. + const previewResult = ( + await draupnir.sendTextCommand( + draupnir.clientUserID, + `!draupnir unban ${falsePositiveUserID}` + ) + ).expect( + "We should have been able to get a preview" + ) as UnbanMembersPreview; + expect(previewResult.membersToUnban.length).toBe(0); + expect(previewResult.policyMatchesToRemove.length).toBe(1); + const listMatches = previewResult.policyMatchesToRemove.at(0); + if (listMatches === undefined) { + throw new TypeError("We should have some matches"); } - ); - it( - "Unbans all members targetted by a glob that is being removed indirectly by unbanning a single user in the command", - async function (this: DraupnirTestContext) { - const draupnir = this.draupnir; - if (draupnir === undefined) { - throw new TypeError(`setup didn't run properly`); - } - const falsePositiveUser = await newTestUser(this.config.homeserverUrl, { - name: { contains: "banned-and-cool" }, - }); - const indirectlyBannedUser = await newTestUser( - this.config.homeserverUrl, - { - name: { contains: "indirectly-banned-via-glob-and-cool" }, - } - ); - const indirectButShouldBeBanned = await newTestUser( - this.config.homeserverUrl, - { - name: { contains: "indirectly-banned-but-should-be-banned-and-cool" }, - } - ); - const falsePositiveUserID = - (await falsePositiveUser.getUserId()) as StringUserID; - const indirectlyBannedUserID = - (await indirectlyBannedUser.getUserId()) as StringUserID; - const indirectButShouldBeBannedUserID = - (await indirectButShouldBeBanned.getUserId()) as StringUserID; - const protectedRooms = await createProtectedRoomsSetWithBan( - draupnir, - falsePositiveUserID, - { numberOfRooms: 5 } - ); - for (const room of protectedRooms) { - ( - await draupnir.clientPlatform - .toRoomBanner() - .banUser(room, indirectlyBannedUserID, "spam") - ).expect("Should be able to ban people"); - ( - await draupnir.clientPlatform - .toRoomBanner() - .banUser(room, indirectButShouldBeBannedUserID, "spam") - ).expect("should be able to ban people"); + expect(listMatches.matches.length).toBe(3); + ( + await draupnir.sendTextCommand( + draupnir.clientUserID, + `!draupnir unban ${falsePositiveUserID} --no-confirm` + ) + ).expect( + "We should have been able to run the command" + ) as UnbanMembersResult; + // wait for events to come down sync + await new Promise((resolve) => setTimeout(resolve, 1000)); + // verify the policies are removed. + const policyRevision = + draupnir.protectedRoomsSet.watchedPolicyRooms.currentRevision; + expect(policyRevision.allRules().length).toBe(0); + }); + it("Unbans all members targetted by a glob that is being removed indirectly by unbanning a single user in the command", async function (this: DraupnirTestContext) { + const draupnir = this.draupnir; + if (draupnir === undefined) { + throw new TypeError(`setup didn't run properly`); + } + const falsePositiveUser = await newTestUser(this.config.homeserverUrl, { + name: { contains: "banned-and-cool" }, + }); + const indirectlyBannedUser = await newTestUser(this.config.homeserverUrl, { + name: { contains: "indirectly-banned-via-glob-and-cool" }, + }); + const indirectButShouldBeBanned = await newTestUser( + this.config.homeserverUrl, + { + name: { contains: "indirectly-banned-but-should-be-banned-and-cool" }, } - const policyRoomID = await createWatchedPolicyRoom(draupnir); - const policyRoomEditor = ( - await draupnir.policyRoomManager.getPolicyRoomEditor( - MatrixRoomReference.fromRoomID(policyRoomID) - ) - ).expect( - "Should be able to get a policy room editor for the newly created policy room" - ); - ( - await policyRoomEditor.createPolicy( - PolicyRuleType.User, - Recommendation.Ban, - indirectButShouldBeBannedUserID, - "spam", - {} - ) - ).expect( - "Should be able to create a policy banning just the user we want to stay banned" - ); + ); + const falsePositiveUserID = + (await falsePositiveUser.getUserId()) as StringUserID; + const indirectlyBannedUserID = + (await indirectlyBannedUser.getUserId()) as StringUserID; + const indirectButShouldBeBannedUserID = + (await indirectButShouldBeBanned.getUserId()) as StringUserID; + const protectedRooms = await createProtectedRoomsSetWithBan( + draupnir, + falsePositiveUserID, + { numberOfRooms: 5 } + ); + for (const room of protectedRooms) { ( - await policyRoomEditor.createPolicy( - PolicyRuleType.User, - Recommendation.Ban, - `@*and-cool*:*`, - "spam", - {} - ) - ).expect( - "Should be able to create a glob policy that bans all our targets" - ); - // wait for policies to be detected. - await new Promise((resolve) => setTimeout(resolve, 1000)); - // verify policies exist - expect( - draupnir.protectedRoomsSet.watchedPolicyRooms.currentRevision.allRules() - .length - ).toBe(2); - // Now we can use the unban command to test the preview has no effects - // So the way this can work is we can send the command, get back the event and just know that we can send 'OK' and 'Cancel' to it later and it'll work. - const previewResult = ( - await draupnir.sendTextCommand( - draupnir.clientUserID, - `!draupnir unban ${falsePositiveUserID}` - ) - ).expect( - "We should have been able to get a preview" - ) as UnbanMembersPreview; - expect(previewResult.membersToUnban.length).toBe(2); - expect(previewResult.policyMatchesToRemove.length).toBe(1); - const listMatches = previewResult.policyMatchesToRemove.at(0); - if (listMatches === undefined) { - throw new TypeError("We should have some matches"); - } - expect(listMatches.matches.length).toBe(1); - const falsePositiveMember = previewResult.membersToUnban.at(0); - if (falsePositiveMember === undefined) { - throw new TypeError("We should have some details here"); - } - const indirectlyBannedMember = previewResult.membersToUnban.at(1); - if (indirectlyBannedMember === undefined) { - throw new TypeError("We should have some details here"); - } - expect(indirectlyBannedMember.roomsBannedFrom.length).toBe(5); - expect(falsePositiveMember.member).toBe(falsePositiveUserID); - expect(indirectlyBannedMember.member).toBe(indirectlyBannedUserID); - // now checked that the user is still banned in all 5 rooms - for (const roomID of protectedRooms) { - const membershipRevision = - draupnir.protectedRoomsSet.setRoomMembership.getRevision(roomID); - if (membershipRevision === undefined) { - throw new TypeError( - "Unable to find membership revision for a protected room, shouldn't happen" - ); - } - expect( - membershipRevision.membershipForUser(indirectButShouldBeBannedUserID) - ?.membership - ).toBe(Membership.Ban); - } + await draupnir.clientPlatform + .toRoomBanner() + .banUser(room, indirectlyBannedUserID, "spam") + ).expect("Should be able to ban people"); ( - await draupnir.sendTextCommand( - draupnir.clientUserID, - `!draupnir unban ${falsePositiveUserID} --no-confirm` - ) - ).expect( - "We should have been able to run the command" - ) as UnbanMembersResult; - // wait for events to come down sync - await new Promise((resolve) => setTimeout(resolve, 1000)); - // now check that they are unbanned - for (const roomID of protectedRooms) { - const membershipRevision = - draupnir.protectedRoomsSet.setRoomMembership.getRevision(roomID); - if (membershipRevision === undefined) { - throw new TypeError( - "Unable to find membership revision for a protected room, shouldn't happen" - ); - } - expect( - membershipRevision.membershipForUser(indirectlyBannedUserID) - ?.membership - ).toBe(Membership.Leave); - expect( - membershipRevision.membershipForUser(indirectButShouldBeBannedUserID) - ?.membership - ).toBe(Membership.Ban); - } - // verify the policies are removed. - const policyRevision = - draupnir.protectedRoomsSet.watchedPolicyRooms.currentRevision; - expect(policyRevision.allRules().length).toBe(1); + await draupnir.clientPlatform + .toRoomBanner() + .banUser(room, indirectButShouldBeBannedUserID, "spam") + ).expect("should be able to ban people"); } - ); - it( - "removes glob rules when there are only glob rules and no banned members", - async function (this: DraupnirTestContext) { - const draupnir = this.draupnir; - if (draupnir === undefined) { - throw new TypeError(`setup didn't run properly`); + const policyRoomID = await createWatchedPolicyRoom(draupnir); + const policyRoomEditor = ( + await draupnir.policyRoomManager.getPolicyRoomEditor( + MatrixRoomReference.fromRoomID(policyRoomID) + ) + ).expect( + "Should be able to get a policy room editor for the newly created policy room" + ); + ( + await policyRoomEditor.createPolicy( + PolicyRuleType.User, + Recommendation.Ban, + indirectButShouldBeBannedUserID, + "spam", + {} + ) + ).expect( + "Should be able to create a policy banning just the user we want to stay banned" + ); + ( + await policyRoomEditor.createPolicy( + PolicyRuleType.User, + Recommendation.Ban, + `@*and-cool*:*`, + "spam", + {} + ) + ).expect( + "Should be able to create a glob policy that bans all our targets" + ); + // wait for policies to be detected. + await new Promise((resolve) => setTimeout(resolve, 1000)); + // verify policies exist + expect( + draupnir.protectedRoomsSet.watchedPolicyRooms.currentRevision.allRules() + .length + ).toBe(2); + // Now we can use the unban command to test the preview has no effects + // So the way this can work is we can send the command, get back the event and just know that we can send 'OK' and 'Cancel' to it later and it'll work. + const previewResult = ( + await draupnir.sendTextCommand( + draupnir.clientUserID, + `!draupnir unban ${falsePositiveUserID}` + ) + ).expect( + "We should have been able to get a preview" + ) as UnbanMembersPreview; + expect(previewResult.membersToUnban.length).toBe(2); + expect(previewResult.policyMatchesToRemove.length).toBe(1); + const listMatches = previewResult.policyMatchesToRemove.at(0); + if (listMatches === undefined) { + throw new TypeError("We should have some matches"); + } + expect(listMatches.matches.length).toBe(1); + const falsePositiveMember = previewResult.membersToUnban.at(0); + if (falsePositiveMember === undefined) { + throw new TypeError("We should have some details here"); + } + const indirectlyBannedMember = previewResult.membersToUnban.at(1); + if (indirectlyBannedMember === undefined) { + throw new TypeError("We should have some details here"); + } + expect(indirectlyBannedMember.roomsBannedFrom.length).toBe(5); + expect(falsePositiveMember.member).toBe(falsePositiveUserID); + expect(indirectlyBannedMember.member).toBe(indirectlyBannedUserID); + // now checked that the user is still banned in all 5 rooms + for (const roomID of protectedRooms) { + const membershipRevision = + draupnir.protectedRoomsSet.setRoomMembership.getRevision(roomID); + if (membershipRevision === undefined) { + throw new TypeError( + "Unable to find membership revision for a protected room, shouldn't happen" + ); } - const policyRoomID = await createWatchedPolicyRoom(draupnir); - const policyRoomEditor = ( - await draupnir.policyRoomManager.getPolicyRoomEditor( - MatrixRoomReference.fromRoomID(policyRoomID) - ) - ).expect( - "Should be able to get a policy room editor for the newly created policy room" - ); - const globRuleEntity = `@*glob*:*`; - ( - await policyRoomEditor.createPolicy( - PolicyRuleType.User, - Recommendation.Ban, - globRuleEntity, - "spam", - {} - ) - ).expect( - "Should be able to create a glob policy that bans all our targets" - ); - // wait for policies to be detected. - await new Promise((resolve) => setTimeout(resolve, 1000)); expect( - draupnir.protectedRoomsSet.watchedPolicyRooms.currentRevision.allRules() - .length - ).toBe(1); - // Now we can use the unban command to test the preview has no effects - // So the way this can work is we can send the command, get back the event and just know that we can send 'OK' and 'Cancel' to it later and it'll work. - const previewResult = ( - await draupnir.sendTextCommand( - draupnir.clientUserID, - `!draupnir unban ${globRuleEntity}` - ) - ).expect( - "We should have been able to get a preview" - ) as UnbanMembersPreview; - expect(previewResult.membersToUnban.length).toBe(0); - expect(previewResult.policyMatchesToRemove.length).toBe(1); - const listMatches = previewResult.policyMatchesToRemove.at(0); - if (listMatches === undefined) { - throw new TypeError("We should have some matches"); + membershipRevision.membershipForUser(indirectButShouldBeBannedUserID) + ?.membership + ).toBe(Membership.Ban); + } + ( + await draupnir.sendTextCommand( + draupnir.clientUserID, + `!draupnir unban ${falsePositiveUserID} --no-confirm` + ) + ).expect( + "We should have been able to run the command" + ) as UnbanMembersResult; + // wait for events to come down sync + await new Promise((resolve) => setTimeout(resolve, 1000)); + // now check that they are unbanned + for (const roomID of protectedRooms) { + const membershipRevision = + draupnir.protectedRoomsSet.setRoomMembership.getRevision(roomID); + if (membershipRevision === undefined) { + throw new TypeError( + "Unable to find membership revision for a protected room, shouldn't happen" + ); } - expect(listMatches.matches.length).toBe(1); - ( - await draupnir.sendTextCommand( - draupnir.clientUserID, - `!draupnir unban ${globRuleEntity} --no-confirm` - ) - ).expect( - "We should have been able to run the command" - ) as UnbanMembersResult; - // wait for events to come down sync - await new Promise((resolve) => setTimeout(resolve, 1000)); - // verify the policies are removed. - const policyRevision = - draupnir.protectedRoomsSet.watchedPolicyRooms.currentRevision; - expect(policyRevision.allRules().length).toBe(0); + expect( + membershipRevision.membershipForUser(indirectlyBannedUserID)?.membership + ).toBe(Membership.Leave); + expect( + membershipRevision.membershipForUser(indirectButShouldBeBannedUserID) + ?.membership + ).toBe(Membership.Ban); } - ); + // verify the policies are removed. + const policyRevision = + draupnir.protectedRoomsSet.watchedPolicyRooms.currentRevision; + expect(policyRevision.allRules().length).toBe(1); + }); + it("removes glob rules when there are only glob rules and no banned members", async function (this: DraupnirTestContext) { + const draupnir = this.draupnir; + if (draupnir === undefined) { + throw new TypeError(`setup didn't run properly`); + } + const policyRoomID = await createWatchedPolicyRoom(draupnir); + const policyRoomEditor = ( + await draupnir.policyRoomManager.getPolicyRoomEditor( + MatrixRoomReference.fromRoomID(policyRoomID) + ) + ).expect( + "Should be able to get a policy room editor for the newly created policy room" + ); + const globRuleEntity = `@*glob*:*`; + ( + await policyRoomEditor.createPolicy( + PolicyRuleType.User, + Recommendation.Ban, + globRuleEntity, + "spam", + {} + ) + ).expect( + "Should be able to create a glob policy that bans all our targets" + ); + // wait for policies to be detected. + await new Promise((resolve) => setTimeout(resolve, 1000)); + expect( + draupnir.protectedRoomsSet.watchedPolicyRooms.currentRevision.allRules() + .length + ).toBe(1); + // Now we can use the unban command to test the preview has no effects + // So the way this can work is we can send the command, get back the event and just know that we can send 'OK' and 'Cancel' to it later and it'll work. + const previewResult = ( + await draupnir.sendTextCommand( + draupnir.clientUserID, + `!draupnir unban ${globRuleEntity}` + ) + ).expect( + "We should have been able to get a preview" + ) as UnbanMembersPreview; + expect(previewResult.membersToUnban.length).toBe(0); + expect(previewResult.policyMatchesToRemove.length).toBe(1); + const listMatches = previewResult.policyMatchesToRemove.at(0); + if (listMatches === undefined) { + throw new TypeError("We should have some matches"); + } + expect(listMatches.matches.length).toBe(1); + ( + await draupnir.sendTextCommand( + draupnir.clientUserID, + `!draupnir unban ${globRuleEntity} --no-confirm` + ) + ).expect( + "We should have been able to run the command" + ) as UnbanMembersResult; + // wait for events to come down sync + await new Promise((resolve) => setTimeout(resolve, 1000)); + // verify the policies are removed. + const policyRevision = + draupnir.protectedRoomsSet.watchedPolicyRooms.currentRevision; + expect(policyRevision.allRules().length).toBe(0); + }); }); diff --git a/apps/draupnir/test/integration/helloTest.ts b/apps/draupnir/test/integration/helloTest.ts index 5a2062ef..4d55ad86 100644 --- a/apps/draupnir/test/integration/helloTest.ts +++ b/apps/draupnir/test/integration/helloTest.ts @@ -25,9 +25,7 @@ describe("Test: !help command", function (this: Mocha.Suite) { this.afterEach(async function (this: DraupnirTestContext) { client.stop(); } as unknown as Mocha.AsyncFunc); - it("Draupnir responded to !mjolnir help", async function ( - this: DraupnirTestContext - ) { + it("Draupnir responded to !mjolnir help", async function (this: DraupnirTestContext) { this.timeout(30000); // send a messgage const draupnir = this.draupnir; diff --git a/apps/draupnir/test/integration/httpAntispamTest.ts b/apps/draupnir/test/integration/httpAntispamTest.ts index 4ace49c4..398a3749 100644 --- a/apps/draupnir/test/integration/httpAntispamTest.ts +++ b/apps/draupnir/test/integration/httpAntispamTest.ts @@ -12,9 +12,7 @@ import { import { MatrixError } from "@vector-im/matrix-bot-sdk"; describe("Test for http antispam callbacks", function () { - it("We can process check_event_for_spam", async function ( - this: DraupnirTestContext - ) { + it("We can process check_event_for_spam", async function (this: DraupnirTestContext) { const draupnir = this.draupnir; if (draupnir === undefined) { throw new TypeError(`setup code is wrong`); diff --git a/apps/draupnir/test/integration/protections/BlockInvitationsOnServerTest.ts b/apps/draupnir/test/integration/protections/BlockInvitationsOnServerTest.ts index 1f18b933..8f61f999 100644 --- a/apps/draupnir/test/integration/protections/BlockInvitationsOnServerTest.ts +++ b/apps/draupnir/test/integration/protections/BlockInvitationsOnServerTest.ts @@ -31,9 +31,7 @@ async function createWatchedPolicyRoom( } describe("RoomTakedownProtectionTest", function () { - it("Will takedown a room that is added to the policy list", async function ( - this: DraupnirTestContext - ) { + it("Will takedown a room that is added to the policy list", async function (this: DraupnirTestContext) { const draupnir = this.draupnir; if (draupnir === undefined) { throw new TypeError(`setup didn't run properly`); diff --git a/apps/draupnir/test/integration/protections/JoinRoomsOnInviteTest.ts b/apps/draupnir/test/integration/protections/JoinRoomsOnInviteTest.ts index 775117a9..23f9b120 100644 --- a/apps/draupnir/test/integration/protections/JoinRoomsOnInviteTest.ts +++ b/apps/draupnir/test/integration/protections/JoinRoomsOnInviteTest.ts @@ -30,109 +30,103 @@ async function setupProtectedRooms( } describe("JoinRoomsOnInvite", function () { - it( - "Should automatically protect and unrpotect rooms when joining and leaving.\ + it("Should automatically protect and unrpotect rooms when joining and leaving.\ The principle is that we add a bunch of rooms, and then kick the bot.\ - You can go to the management room in a client and see what the output looks like for this flow.", - async function (this: DraupnirTestContext) { - const draupnir = this.draupnir; - if (draupnir === undefined) { - throw new TypeError(`setup didn't run properly`); - } - const moderator = await newTestUser(this.config.homeserverUrl, { - name: { contains: "moderator" }, - }); - // Mutate the config which is a little naughty, but protections - // currently access it dynamically. - draupnir.config.protectAllJoinedRooms = true; - const protectedRooms = await setupProtectedRooms(draupnir, moderator, { - numberOfRooms: 5, - }); - await new Promise((resolve) => setTimeout(resolve, 2000)); - expect( - protectedRooms.every((roomID: StringRoomID) => - draupnir.protectedRoomsSet.isProtectedRoom(roomID) - ) - ).toBe(true); - // now test that kicking them works - await Promise.all( - protectedRooms.map((roomID, i) => - moderator.kickUser( - draupnir.clientUserID, - roomID, - i === 0 ? "don't want this bot" : undefined - ) - ) - ); - await new Promise((resolve) => setTimeout(resolve, 1000)); - expect( - protectedRooms.every( - (roomID: StringRoomID) => - !draupnir.protectedRoomsSet.isProtectedRoom(roomID) - ) - ).toBe(true); - // allow for messages to send to the mangement room. - await new Promise((resolve) => setTimeout(resolve, 1000)); + You can go to the management room in a client and see what the output looks like for this flow.", async function (this: DraupnirTestContext) { + const draupnir = this.draupnir; + if (draupnir === undefined) { + throw new TypeError(`setup didn't run properly`); } - ); - it( - "That rooms will automatically be unprotected when protectAllJoinedRooms is false", - async function (this: DraupnirTestContext) { - const draupnir = this.draupnir; - if (draupnir === undefined) { - throw new TypeError(`setup didn't run properly`); - } - const moderator = await newTestUser(this.config.homeserverUrl, { - name: { contains: "moderator" }, - }); - // Mutate the config which is a little naughty, but protections - // currently access it dynamically. - draupnir.config.protectAllJoinedRooms = false; - const protectedRooms = await setupProtectedRooms(draupnir, moderator, { - numberOfRooms: 5, - }); - await new Promise((resolve) => setTimeout(resolve, 2000)); - // we shouldn't be protecting rooms automatically - expect( - protectedRooms.every( - (roomID: StringRoomID) => - !draupnir.protectedRoomsSet.isProtectedRoom(roomID) - ) - ).toBe(true); - // protect the rooms manually - await Promise.all( - protectedRooms.map((roomID) => - draupnir.protectedRoomsSet.protectedRoomsManager.addRoom( - MatrixRoomReference.fromRoomID(roomID) - ) - ) - ); - expect( - protectedRooms.every((roomID: StringRoomID) => - draupnir.protectedRoomsSet.isProtectedRoom(roomID) + const moderator = await newTestUser(this.config.homeserverUrl, { + name: { contains: "moderator" }, + }); + // Mutate the config which is a little naughty, but protections + // currently access it dynamically. + draupnir.config.protectAllJoinedRooms = true; + const protectedRooms = await setupProtectedRooms(draupnir, moderator, { + numberOfRooms: 5, + }); + await new Promise((resolve) => setTimeout(resolve, 2000)); + expect( + protectedRooms.every((roomID: StringRoomID) => + draupnir.protectedRoomsSet.isProtectedRoom(roomID) + ) + ).toBe(true); + // now test that kicking them works + await Promise.all( + protectedRooms.map((roomID, i) => + moderator.kickUser( + draupnir.clientUserID, + roomID, + i === 0 ? "don't want this bot" : undefined ) - ).toBe(true); - // now test that banning them works - await Promise.all( - protectedRooms.map((roomID, i) => - // I would have liked this to be ban, but for some reason bot-sdk - // doesn't allow informing of rooms you are banned from!!! - moderator.kickUser( - draupnir.clientUserID, - roomID, - i === 0 ? "don't want this bot" : undefined - ) + ) + ); + await new Promise((resolve) => setTimeout(resolve, 1000)); + expect( + protectedRooms.every( + (roomID: StringRoomID) => + !draupnir.protectedRoomsSet.isProtectedRoom(roomID) + ) + ).toBe(true); + // allow for messages to send to the mangement room. + await new Promise((resolve) => setTimeout(resolve, 1000)); + }); + it("That rooms will automatically be unprotected when protectAllJoinedRooms is false", async function (this: DraupnirTestContext) { + const draupnir = this.draupnir; + if (draupnir === undefined) { + throw new TypeError(`setup didn't run properly`); + } + const moderator = await newTestUser(this.config.homeserverUrl, { + name: { contains: "moderator" }, + }); + // Mutate the config which is a little naughty, but protections + // currently access it dynamically. + draupnir.config.protectAllJoinedRooms = false; + const protectedRooms = await setupProtectedRooms(draupnir, moderator, { + numberOfRooms: 5, + }); + await new Promise((resolve) => setTimeout(resolve, 2000)); + // we shouldn't be protecting rooms automatically + expect( + protectedRooms.every( + (roomID: StringRoomID) => + !draupnir.protectedRoomsSet.isProtectedRoom(roomID) + ) + ).toBe(true); + // protect the rooms manually + await Promise.all( + protectedRooms.map((roomID) => + draupnir.protectedRoomsSet.protectedRoomsManager.addRoom( + MatrixRoomReference.fromRoomID(roomID) ) - ); - await new Promise((resolve) => setTimeout(resolve, 1000)); - expect( - protectedRooms.every( - (roomID: StringRoomID) => - !draupnir.protectedRoomsSet.isProtectedRoom(roomID) + ) + ); + expect( + protectedRooms.every((roomID: StringRoomID) => + draupnir.protectedRoomsSet.isProtectedRoom(roomID) + ) + ).toBe(true); + // now test that banning them works + await Promise.all( + protectedRooms.map((roomID, i) => + // I would have liked this to be ban, but for some reason bot-sdk + // doesn't allow informing of rooms you are banned from!!! + moderator.kickUser( + draupnir.clientUserID, + roomID, + i === 0 ? "don't want this bot" : undefined ) - ).toBe(true); - // allow for messages to send to the mangement room. - await new Promise((resolve) => setTimeout(resolve, 1000)); - } - ); + ) + ); + await new Promise((resolve) => setTimeout(resolve, 1000)); + expect( + protectedRooms.every( + (roomID: StringRoomID) => + !draupnir.protectedRoomsSet.isProtectedRoom(roomID) + ) + ).toBe(true); + // allow for messages to send to the mangement room. + await new Promise((resolve) => setTimeout(resolve, 1000)); + }); }); diff --git a/apps/draupnir/test/integration/protections/RoomTakedownProtectionTest.ts b/apps/draupnir/test/integration/protections/RoomTakedownProtectionTest.ts index 912eb8a3..0c81c71f 100644 --- a/apps/draupnir/test/integration/protections/RoomTakedownProtectionTest.ts +++ b/apps/draupnir/test/integration/protections/RoomTakedownProtectionTest.ts @@ -123,9 +123,7 @@ function createRoomTakedownProtection( } describe("RoomTakedownProtectionTest", function () { - it("Will takedown a room that is added to the policy list", async function ( - this: DraupnirTestContext - ) { + it("Will takedown a room that is added to the policy list", async function (this: DraupnirTestContext) { const draupnir = this.draupnir; if (draupnir === undefined) { throw new TypeError(`setup didn't run properly`); @@ -170,89 +168,86 @@ describe("RoomTakedownProtectionTest", function () { ).isOkay ).toBe(false); }); - it( - "Takedown a room through discovery and a revealed Literal policy change", - async function (this: DraupnirTestContext) { - const draupnir = this.draupnir; - if (draupnir === undefined) { - throw new TypeError(`setup didn't run properly`); - } - const synapseHTTPAntispam = draupnir.synapseHTTPAntispam; - if (synapseHTTPAntispam === undefined) { - throw new TypeError("Setup code is wrong"); - } - const moderator = await newTestUser(this.config.homeserverUrl, { - name: { contains: "moderator" }, - }); - const takedownTarget = await newTestUser(this.config.homeserverUrl, { - name: { contains: "takedown-target" }, - }); - const takedownTargetRoomID = StringRoomID( - await takedownTarget.createRoom({ - preset: "public_chat", - }) - ); - await moderator.joinRoom(draupnir.managementRoomID); - const policyRoom = await createWatchedPolicyRoom(draupnir); + it("Takedown a room through discovery and a revealed Literal policy change", async function (this: DraupnirTestContext) { + const draupnir = this.draupnir; + if (draupnir === undefined) { + throw new TypeError(`setup didn't run properly`); + } + const synapseHTTPAntispam = draupnir.synapseHTTPAntispam; + if (synapseHTTPAntispam === undefined) { + throw new TypeError("Setup code is wrong"); + } + const moderator = await newTestUser(this.config.homeserverUrl, { + name: { contains: "moderator" }, + }); + const takedownTarget = await newTestUser(this.config.homeserverUrl, { + name: { contains: "takedown-target" }, + }); + const takedownTargetRoomID = StringRoomID( + await takedownTarget.createRoom({ + preset: "public_chat", + }) + ); + await moderator.joinRoom(draupnir.managementRoomID); + const policyRoom = await createWatchedPolicyRoom(draupnir); - const roomDiscovery = createRoomDiscovery(draupnir); - const roomTakedownProtection = createRoomTakedownProtection( - this.lifetime, - draupnir, - roomDiscovery, - [createSynapseHTTPAntispamRoomExplorer(draupnir, roomDiscovery)] - ); + const roomDiscovery = createRoomDiscovery(draupnir); + const roomTakedownProtection = createRoomTakedownProtection( + this.lifetime, + draupnir, + roomDiscovery, + [createSynapseHTTPAntispamRoomExplorer(draupnir, roomDiscovery)] + ); - const policyRoomEditor = ( - await draupnir.policyRoomManager.getPolicyRoomEditor( - MatrixRoomReference.fromRoomID(policyRoom) - ) - ).expect("Should be able to get the policy room editor"); - const policyEventID = ( - await policyRoomEditor.takedownEntity( - PolicyRuleType.Room, - takedownTargetRoomID, - { shouldHash: true } - ) - ).expect("Should be able to takedown the room via a policy list editor"); - const policyEvent = ( - await draupnir.clientPlatform - .toRoomEventGetter() - .getEvent(policyRoom, policyEventID) - ).expect("Should be able to find the policy event"); - const policy = parsePolicyRule(policyEvent as never).expect( - "Should be able to parse the policy rule" - ); + const policyRoomEditor = ( + await draupnir.policyRoomManager.getPolicyRoomEditor( + MatrixRoomReference.fromRoomID(policyRoom) + ) + ).expect("Should be able to get the policy room editor"); + const policyEventID = ( + await policyRoomEditor.takedownEntity( + PolicyRuleType.Room, + takedownTargetRoomID, + { shouldHash: true } + ) + ).expect("Should be able to takedown the room via a policy list editor"); + const policyEvent = ( + await draupnir.clientPlatform + .toRoomEventGetter() + .getEvent(policyRoom, policyEventID) + ).expect("Should be able to find the policy event"); + const policy = parsePolicyRule(policyEvent as never).expect( + "Should be able to parse the policy rule" + ); + ( + await roomTakedownProtection.handlePolicyChange( + draupnir.protectedRoomsSet.watchedPolicyRooms.currentRevision, + [ + { + changeType: PolicyRuleChangeType.Added, + rule: policy, + event: policyEvent as never, + sender: policyEvent.sender, + }, + ] + ) + ).expect("Should have been able to handle the policy change"); + // give some time for the room to be takendown, synapse can be quite slow at this... + await new Promise((resolve) => setTimeout(resolve, 1000)); + const bystander = await newTestUser(this.config.homeserverUrl, { + name: { contains: "bystander" }, + }); + await bystander.joinRoom(takedownTargetRoomID); + await new Promise((resolve) => setTimeout(resolve, 1000)); + expect( + draupnir.stores.roomAuditLog?.isRoomTakendown(takedownTargetRoomID) + ).toBe(true); + expect( ( - await roomTakedownProtection.handlePolicyChange( - draupnir.protectedRoomsSet.watchedPolicyRooms.currentRevision, - [ - { - changeType: PolicyRuleChangeType.Added, - rule: policy, - event: policyEvent as never, - sender: policyEvent.sender, - }, - ] - ) - ).expect("Should have been able to handle the policy change"); - // give some time for the room to be takendown, synapse can be quite slow at this... - await new Promise((resolve) => setTimeout(resolve, 1000)); - const bystander = await newTestUser(this.config.homeserverUrl, { - name: { contains: "bystander" }, - }); - await bystander.joinRoom(takedownTargetRoomID); - await new Promise((resolve) => setTimeout(resolve, 1000)); - expect( - draupnir.stores.roomAuditLog?.isRoomTakendown(takedownTargetRoomID) - ).toBe(true); - expect( - ( - await draupnir.clientPlatform - .toRoomJoiner() - .joinRoom(takedownTargetRoomID) - ).isOkay - ).toBe(false); - } - ); + await draupnir.clientPlatform + .toRoomJoiner() + .joinRoom(takedownTargetRoomID) + ).isOkay + ).toBe(false); + }); }); diff --git a/apps/draupnir/test/integration/reportPollingTest.ts b/apps/draupnir/test/integration/reportPollingTest.ts index 71faef9b..2f158367 100644 --- a/apps/draupnir/test/integration/reportPollingTest.ts +++ b/apps/draupnir/test/integration/reportPollingTest.ts @@ -32,9 +32,7 @@ describe("Test: Report polling", function (this: Mocha.Suite) { this.afterEach(function (this: DraupnirTestContext) { reportPoller?.stop(); } as unknown as Mocha.Func); - it("Draupnir correctly retrieves a report from synapse", async function ( - this: DraupnirTestContext - ) { + it("Draupnir correctly retrieves a report from synapse", async function (this: DraupnirTestContext) { const draupnir = this.draupnir; if (draupnir === undefined) { throw new TypeError(`Test didn't setup properly`); diff --git a/apps/draupnir/test/integration/utilsTest.ts b/apps/draupnir/test/integration/utilsTest.ts index 670115a4..dd4905ae 100644 --- a/apps/draupnir/test/integration/utilsTest.ts +++ b/apps/draupnir/test/integration/utilsTest.ts @@ -18,50 +18,47 @@ import { } from "matrix-protection-suite"; describe("Test: utils", function () { - it( - "replaceRoomIdsWithPills correctly turns a room ID in to a pill", - async function (this: DraupnirTestContext) { - const managementRoomAlias = "#moderators:localhost:9999"; - const draupnir = this.draupnir; - const draupnirMatrixClient = draupnirSafeEmitter(); - if (draupnir === undefined) { - throw new TypeError(`Setup code is broken`); - } - const managementRoomOutput = draupnir.managementRoomOutput; - await draupnir.client.sendStateEvent( - draupnir.managementRoomID, - "m.room.canonical_alias", - "", - { alias: managementRoomAlias } - ); + it("replaceRoomIdsWithPills correctly turns a room ID in to a pill", async function (this: DraupnirTestContext) { + const managementRoomAlias = "#moderators:localhost:9999"; + const draupnir = this.draupnir; + const draupnirMatrixClient = draupnirSafeEmitter(); + if (draupnir === undefined) { + throw new TypeError(`Setup code is broken`); + } + const managementRoomOutput = draupnir.managementRoomOutput; + await draupnir.client.sendStateEvent( + draupnir.managementRoomID, + "m.room.canonical_alias", + "", + { alias: managementRoomAlias } + ); - const message: RoomEvent = await new Promise((resolve) => { - draupnirMatrixClient.on("room.message", (roomId, event) => { - if ( - roomId === draupnir.managementRoomID && - Value.Check(NoticeMessageContent, event.content) - ) { - if (event.content.body.startsWith("it's")) { - resolve(event); - } + const message: RoomEvent = await new Promise((resolve) => { + draupnirMatrixClient.on("room.message", (roomId, event) => { + if ( + roomId === draupnir.managementRoomID && + Value.Check(NoticeMessageContent, event.content) + ) { + if (event.content.body.startsWith("it's")) { + resolve(event); } - }); - void managementRoomOutput.logMessage( - LogLevel.INFO, - "replaceRoomIdsWithPills test", - `it's fun here in ${draupnir.managementRoomID}`, - [draupnir.managementRoomID, "!myfaketestid:example.com"] - ); + } }); - if (!Value.Check(NoticeMessageContent, message.content)) { - throw new TypeError( - `This test is written with the expectation logMessage will send a notice` - ); - } - assert.equal( - message.content.formatted_body, - `it's fun here in ${managementRoomAlias}` + void managementRoomOutput.logMessage( + LogLevel.INFO, + "replaceRoomIdsWithPills test", + `it's fun here in ${draupnir.managementRoomID}`, + [draupnir.managementRoomID, "!myfaketestid:example.com"] + ); + }); + if (!Value.Check(NoticeMessageContent, message.content)) { + throw new TypeError( + `This test is written with the expectation logMessage will send a notice` ); } - ); + assert.equal( + message.content.formatted_body, + `it's fun here in ${managementRoomAlias}` + ); + }); }); diff --git a/packages/interface-manager/src/Adaptor/AdaptorContextToCommandContextTranslator.ts b/packages/interface-manager/src/Adaptor/AdaptorContextToCommandContextTranslator.ts index e5a8aa0f..b52c5fee 100644 --- a/packages/interface-manager/src/Adaptor/AdaptorContextToCommandContextTranslator.ts +++ b/packages/interface-manager/src/Adaptor/AdaptorContextToCommandContextTranslator.ts @@ -63,17 +63,12 @@ export class StandardAdaptorContextToCommandContextTranslator< TCommandMeta["Context"] > ): AdaptorContextToCommandContextTranslator { - if ( - this.translators.has(commandDescription) - ) { + if (this.translators.has(commandDescription)) { throw new TypeError( `There is already a translation function registered for the command ${commandDescription.summary}` ); } - this.translators.set( - commandDescription, - translationFunction - ); + this.translators.set(commandDescription, translationFunction); return this; } } diff --git a/packages/interface-manager/src/Command/CommandTable.ts b/packages/interface-manager/src/Command/CommandTable.ts index a0e01445..65c17028 100644 --- a/packages/interface-manager/src/Command/CommandTable.ts +++ b/packages/interface-manager/src/Command/CommandTable.ts @@ -15,10 +15,7 @@ import { StringPresentationType } from "../TextReader"; import { CommandDescription } from "./CommandDescription"; import { CommandMeta } from "./CommandMeta"; -import { - PresentationType, - PresentationTypeWithoutWrap, -} from "./Presentation"; +import { PresentationType, PresentationTypeWithoutWrap } from "./Presentation"; import { PresentationArgumentStream, StandardPresentationArgumentStream, diff --git a/packages/interface-manager/src/Command/KeywordParameterDescription.ts b/packages/interface-manager/src/Command/KeywordParameterDescription.ts index b68d2443..2bc2dea1 100644 --- a/packages/interface-manager/src/Command/KeywordParameterDescription.ts +++ b/packages/interface-manager/src/Command/KeywordParameterDescription.ts @@ -161,10 +161,7 @@ export class KeywordParser { ): Result { const stream = partialCommand.stream; if (restDescription !== undefined) { - return restDescription.parseRest( - partialCommand, - this - ); + return restDescription.parseRest(partialCommand, this); } else { const result = this.parseKeywords(partialCommand); if (isError(result)) { diff --git a/packages/matrix-protection-suite/src/Interface/Value.ts b/packages/matrix-protection-suite/src/Interface/Value.ts index 4ae16632..adb9071d 100644 --- a/packages/matrix-protection-suite/src/Interface/Value.ts +++ b/packages/matrix-protection-suite/src/Interface/Value.ts @@ -46,10 +46,7 @@ export class Value { const entry = this.compiledSchema.get(schema); if (entry === undefined) { const compiledCheck = TypeCompiler.Compile(schema); - this.compiledSchema.set( - schema, - compiledCheck - ); + this.compiledSchema.set(schema, compiledCheck); return compiledCheck; } return entry as unknown as TypeCheck; diff --git a/packages/matrix-protection-suite/src/Protection/ProtectionsManager/StandardProtectionsManager.ts b/packages/matrix-protection-suite/src/Protection/ProtectionsManager/StandardProtectionsManager.ts index c023d9e1..0b45e6e3 100644 --- a/packages/matrix-protection-suite/src/Protection/ProtectionsManager/StandardProtectionsManager.ts +++ b/packages/matrix-protection-suite/src/Protection/ProtectionsManager/StandardProtectionsManager.ts @@ -391,9 +391,9 @@ export class StandardProtectionsManager< >( protectionDescription: ProtectionDescription ): Promise>> { - return (await this.settingsConfig.getProtectionSettings( + return await this.settingsConfig.getProtectionSettings( protectionDescription - )); + ); } isEnabledProtection(protectionDescription: ProtectionDescription): boolean { return this.enabledProtections.has(protectionDescription.name); diff --git a/packages/mps-interface-adaptor/src/MPSInterfaceAdaptor/MatrixReactionHandler.ts b/packages/mps-interface-adaptor/src/MPSInterfaceAdaptor/MatrixReactionHandler.ts index d9fe09f4..825b29ff 100644 --- a/packages/mps-interface-adaptor/src/MPSInterfaceAdaptor/MatrixReactionHandler.ts +++ b/packages/mps-interface-adaptor/src/MPSInterfaceAdaptor/MatrixReactionHandler.ts @@ -240,9 +240,7 @@ export class MatrixReactionHandler if (key === "✅" || key === "❌") { return; } - void Task( - redacter.redactEvent(roomID, event.event_id, reason) - ); + void Task(redacter.redactEvent(roomID, event.event_id, reason)); }, }); }