diff --git a/council/ts/package-lock.json b/council/ts/package-lock.json index 98010e6..63f70c6 100644 --- a/council/ts/package-lock.json +++ b/council/ts/package-lock.json @@ -32,7 +32,9 @@ "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "funding": "https://eslint.org/donate" + "funding": { + "url": "https://eslint.org/donate" + } }, "node_modules/@types/node": { "version": "22.20.0", @@ -42,8 +44,7 @@ "license": "MIT", "dependencies": { "undici-types": "~6.21.0" - }, - "peerDependencies": {} + } }, "node_modules/@types/node/node_modules/undici-types": { "version": "6.21.0", @@ -58,22 +59,24 @@ "integrity": "sha512-G9/lgqibheLVBDRuya45EbsEXTYcWoSG+TLg7i2axuzx0Eq62eXn+aWXyaVdV5vKvFSWd6ywcX8hA7la9Pvu8g==", "dev": true, "license": "MIT", - "funding": "https://opencollective.com/vitest", "dependencies": { - "obug": "^2.1.1", - "std-env": "^4.0.0-rc.1", - "magicast": "^0.5.2", - "tinyrainbow": "^3.1.0", - "@vitest/utils": "4.1.9", - "istanbul-reports": "^3.2.0", "@bcoe/v8-coverage": "^1.0.2", + "@vitest/utils": "4.1.9", "ast-v8-to-istanbul": "^1.0.0", + "istanbul-lib-coverage": "^3.2.2", "istanbul-lib-report": "^3.0.1", - "istanbul-lib-coverage": "^3.2.2" + "istanbul-reports": "^3.2.0", + "magicast": "^0.5.2", + "obug": "^2.1.1", + "std-env": "^4.0.0-rc.1", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "vitest": "4.1.9", - "@vitest/browser": "4.1.9" + "@vitest/browser": "4.1.9", + "vitest": "4.1.9" }, "peerDependenciesMeta": { "@vitest/browser": { @@ -97,11 +100,13 @@ "integrity": "sha512-A51o8ymO5PpqlWNnBP9ZHPXDIpuMtTLlGSjN7la4US+LJzoUMyhwjA5QXlm39JexgwHKW4Xjs8Z2d3dLCXOeuA==", "dev": true, "license": "MIT", - "funding": "https://opencollective.com/vitest", "dependencies": { - "tinyrainbow": "^3.1.0", + "@vitest/pretty-format": "4.1.9", "convert-source-map": "^2.0.0", - "@vitest/pretty-format": "4.1.9" + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/coverage-v8/node_modules/@vitest/utils/node_modules/@vitest/pretty-format": { @@ -110,9 +115,11 @@ "integrity": "sha512-s0iufns3iIFitdgm+YR7g1whCAaGtXz459VS9/PqyKDEEFgYIhsHOQmXgIgDuYCt7DeQmiZT0Qe2OA2p4ZPu5A==", "dev": true, "license": "MIT", - "funding": "https://opencollective.com/vitest", "dependencies": { "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/coverage-v8/node_modules/@vitest/utils/node_modules/@vitest/pretty-format/node_modules/tinyrainbow": { @@ -149,9 +156,9 @@ "dev": true, "license": "MIT", "dependencies": { - "js-tokens": "^10.0.0", + "@jridgewell/trace-mapping": "^0.3.31", "estree-walker": "^3.0.3", - "@jridgewell/trace-mapping": "^0.3.31" + "js-tokens": "^10.0.0" } }, "node_modules/@vitest/coverage-v8/node_modules/ast-v8-to-istanbul/node_modules/@jridgewell/trace-mapping": { @@ -197,9 +204,7 @@ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", "dev": true, - "license": "MIT", - "dependencies": {}, - "peerDependencies": {} + "license": "MIT" }, "node_modules/@vitest/coverage-v8/node_modules/ast-v8-to-istanbul/node_modules/js-tokens": { "version": "10.0.0", @@ -224,13 +229,13 @@ "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "license": "BSD-3-Clause", - "engines": { - "node": ">=10" - }, "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^4.0.0", "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" } }, "node_modules/@vitest/coverage-v8/node_modules/istanbul-lib-report/node_modules/istanbul-lib-coverage": { @@ -249,12 +254,14 @@ "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, "engines": { "node": ">=10" }, - "funding": "https://github.com/sponsors/sindresorhus", - "dependencies": { - "semver": "^7.5.3" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@vitest/coverage-v8/node_modules/istanbul-lib-report/node_modules/make-dir/node_modules/semver": { @@ -276,11 +283,11 @@ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" - }, "dependencies": { "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/@vitest/coverage-v8/node_modules/istanbul-lib-report/node_modules/supports-color/node_modules/has-flag": { @@ -299,12 +306,12 @@ "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", "dev": true, "license": "BSD-3-Clause", - "engines": { - "node": ">=8" - }, "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/@vitest/coverage-v8/node_modules/istanbul-reports/node_modules/html-escaper": { @@ -320,13 +327,13 @@ "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "license": "BSD-3-Clause", - "engines": { - "node": ">=10" - }, "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^4.0.0", "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" } }, "node_modules/@vitest/coverage-v8/node_modules/istanbul-reports/node_modules/istanbul-lib-report/node_modules/istanbul-lib-coverage": { @@ -345,12 +352,14 @@ "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, "engines": { "node": ">=10" }, - "funding": "https://github.com/sponsors/sindresorhus", - "dependencies": { - "semver": "^7.5.3" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@vitest/coverage-v8/node_modules/istanbul-reports/node_modules/istanbul-lib-report/node_modules/make-dir/node_modules/semver": { @@ -372,11 +381,11 @@ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" - }, "dependencies": { "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/@vitest/coverage-v8/node_modules/istanbul-reports/node_modules/istanbul-lib-report/node_modules/supports-color/node_modules/has-flag": { @@ -407,12 +416,14 @@ "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", "dev": true, "license": "MIT", - "bin": "./bin/babel-parser.js", - "engines": { - "node": ">=6.0.0" - }, "dependencies": { "@babel/types": "^7.29.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" } }, "node_modules/@vitest/coverage-v8/node_modules/magicast/node_modules/@babel/parser/node_modules/@babel/types": { @@ -421,12 +432,12 @@ "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=6.9.0" - }, "dependencies": { "@babel/helper-string-parser": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@vitest/coverage-v8/node_modules/magicast/node_modules/@babel/parser/node_modules/@babel/types/node_modules/@babel/helper-string-parser": { @@ -455,12 +466,12 @@ "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=6.9.0" - }, "dependencies": { "@babel/helper-string-parser": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@vitest/coverage-v8/node_modules/magicast/node_modules/@babel/types/node_modules/@babel/helper-string-parser": { @@ -498,14 +509,14 @@ "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.3.tgz", "integrity": "sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.20.0" - }, "funding": [ "https://github.com/sponsors/sxzz", "https://opencollective.com/debug" - ] + ], + "license": "MIT", + "engines": { + "node": ">=12.20.0" + } }, "node_modules/@vitest/coverage-v8/node_modules/std-env": { "version": "4.1.0", @@ -530,36 +541,36 @@ "integrity": "sha512-L4GLuAvmXevWnPCIaFfOz6eD92c+yY+pDgVqgufrLDnW3xYA799CSZQlly2r2N13nhAlnZY6VzY7Rx5pHNvk2w==", "dev": true, "license": "MIT", - "bin": { - "depcruise": "bin/dependency-cruise.mjs", - "depcruise-fmt": "bin/depcruise-fmt.mjs", - "dependency-cruise": "bin/dependency-cruise.mjs", - "depcruise-baseline": "bin/depcruise-baseline.mjs", - "dependency-cruiser": "bin/dependency-cruise.mjs", - "depcruise-wrap-stream-in-html": "bin/wrap-stream-in-html.mjs" - }, - "engines": { - "node": "^20.12||^22||>=24" - }, "dependencies": { "acorn": "8.16.0", - "json5": "2.2.3", - "ignore": "7.0.5", - "semver": "7.8.1", - "prompts": "2.4.2", - "rechoir": "0.8.0", "acorn-jsx": "5.3.2", + "acorn-jsx-walk": "2.0.0", + "acorn-loose": "8.5.2", + "acorn-walk": "8.3.5", "commander": "14.0.3", + "enhanced-resolve": "5.22.1", + "ignore": "7.0.5", "interpret": "3.1.1", + "is-installed-globally": "1.0.0", + "json5": "2.2.3", "picomatch": "4.0.4", - "acorn-walk": "8.3.5", + "prompts": "2.4.2", + "rechoir": "0.8.0", "safe-regex": "2.1.1", - "watskeburt": "5.0.3", - "acorn-loose": "8.5.2", - "acorn-jsx-walk": "2.0.0", - "enhanced-resolve": "5.22.1", - "is-installed-globally": "1.0.0", - "tsconfig-paths-webpack-plugin": "4.2.0" + "semver": "7.8.1", + "tsconfig-paths-webpack-plugin": "4.2.0", + "watskeburt": "5.0.3" + }, + "bin": { + "depcruise": "bin/dependency-cruise.mjs", + "depcruise-baseline": "bin/depcruise-baseline.mjs", + "depcruise-fmt": "bin/depcruise-fmt.mjs", + "depcruise-wrap-stream-in-html": "bin/wrap-stream-in-html.mjs", + "dependency-cruise": "bin/dependency-cruise.mjs", + "dependency-cruiser": "bin/dependency-cruise.mjs" + }, + "engines": { + "node": "^20.12||^22||>=24" } }, "node_modules/dependency-cruiser/node_modules/acorn": { @@ -598,11 +609,11 @@ "integrity": "sha512-PPvV6g8UGMGgjrMu+n/f9E/tCSkNQ2Y97eFvuVdJfG11+xdIeDcLyNdC8SHcrHbRqkfwLASdplyR6B6sKM1U4A==", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.4.0" - }, "dependencies": { "acorn": "^8.15.0" + }, + "engines": { + "node": ">=0.4.0" } }, "node_modules/dependency-cruiser/node_modules/acorn-loose/node_modules/acorn": { @@ -624,11 +635,11 @@ "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.4.0" - }, "dependencies": { "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" } }, "node_modules/dependency-cruiser/node_modules/acorn-walk/node_modules/acorn": { @@ -660,12 +671,12 @@ "integrity": "sha512-6QEuw3zoX1SJQc7b87aBXke/no+mG2bTBgw29gWMQonLmpEkWoCAVkl+M49e48AZlWzxiDzDZzYdp6kobcyLww==", "dev": true, "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, "engines": { "node": ">=10.13.0" - }, - "dependencies": { - "tapable": "^2.3.3", - "graceful-fs": "^4.2.4" } }, "node_modules/dependency-cruiser/node_modules/enhanced-resolve/node_modules/graceful-fs": { @@ -715,13 +726,15 @@ "integrity": "sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": "https://github.com/sponsors/sindresorhus", "dependencies": { "global-directory": "^4.0.1", "is-path-inside": "^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/dependency-cruiser/node_modules/is-installed-globally/node_modules/global-directory": { @@ -730,12 +743,14 @@ "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", "dev": true, "license": "MIT", + "dependencies": { + "ini": "4.1.1" + }, "engines": { "node": ">=18" }, - "funding": "https://github.com/sponsors/sindresorhus", - "dependencies": { - "ini": "4.1.1" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/dependency-cruiser/node_modules/is-installed-globally/node_modules/global-directory/node_modules/ini": { @@ -757,7 +772,9 @@ "engines": { "node": ">=12" }, - "funding": "https://github.com/sponsors/sindresorhus" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/dependency-cruiser/node_modules/json5": { "version": "2.2.3", @@ -781,7 +798,9 @@ "engines": { "node": ">=12" }, - "funding": "https://github.com/sponsors/jonschlinkert" + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, "node_modules/dependency-cruiser/node_modules/prompts": { "version": "2.4.2", @@ -789,12 +808,12 @@ "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 6" - }, "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" } }, "node_modules/dependency-cruiser/node_modules/prompts/node_modules/kleur": { @@ -820,11 +839,11 @@ "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 10.13.0" - }, "dependencies": { "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" } }, "node_modules/dependency-cruiser/node_modules/rechoir/node_modules/resolve": { @@ -833,6 +852,12 @@ "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", "dev": true, "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, "bin": { "resolve": "bin/resolve" }, @@ -841,12 +866,6 @@ }, "funding": { "url": "https://github.com/sponsors/ljharb" - }, - "dependencies": { - "es-errors": "^1.3.0", - "path-parse": "^1.0.7", - "is-core-module": "^2.16.1", - "supports-preserve-symlinks-flag": "^1.0.0" } }, "node_modules/dependency-cruiser/node_modules/rechoir/node_modules/resolve/node_modules/es-errors": { @@ -865,14 +884,14 @@ "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", "dev": true, "license": "MIT", + "dependencies": { + "hasown": "^2.0.3" + }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" - }, - "dependencies": { - "hasown": "^2.0.3" } }, "node_modules/dependency-cruiser/node_modules/rechoir/node_modules/resolve/node_modules/is-core-module/node_modules/hasown": { @@ -881,11 +900,11 @@ "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.4" - }, "dependencies": { "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/dependency-cruiser/node_modules/rechoir/node_modules/resolve/node_modules/is-core-module/node_modules/hasown/node_modules/function-bind": { @@ -957,14 +976,14 @@ "integrity": "sha512-zbem3rfRS8BgeNK50Zz5SIQgXzLafiHjOwUAvk/38/o1jHn/V5QAgVUcz884or7WYcPaH3N2CIfUc2u0ul7UcA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=10.13.0" - }, "dependencies": { "chalk": "^4.1.0", + "enhanced-resolve": "^5.7.0", "tapable": "^2.2.1", - "tsconfig-paths": "^4.1.2", - "enhanced-resolve": "^5.7.0" + "tsconfig-paths": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" } }, "node_modules/dependency-cruiser/node_modules/tsconfig-paths-webpack-plugin/node_modules/chalk": { @@ -973,13 +992,15 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": "https://github.com/chalk/chalk?sponsor=1", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/dependency-cruiser/node_modules/tsconfig-paths-webpack-plugin/node_modules/chalk/node_modules/ansi-styles": { @@ -988,12 +1009,14 @@ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { "node": ">=8" }, - "funding": "https://github.com/chalk/ansi-styles?sponsor=1", - "dependencies": { - "color-convert": "^2.0.1" + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/dependency-cruiser/node_modules/tsconfig-paths-webpack-plugin/node_modules/chalk/node_modules/ansi-styles/node_modules/color-convert": { @@ -1002,11 +1025,11 @@ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">=7.0.0" - }, "dependencies": { "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, "node_modules/dependency-cruiser/node_modules/tsconfig-paths-webpack-plugin/node_modules/chalk/node_modules/ansi-styles/node_modules/color-convert/node_modules/color-name": { @@ -1022,11 +1045,11 @@ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" - }, "dependencies": { "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/dependency-cruiser/node_modules/tsconfig-paths-webpack-plugin/node_modules/chalk/node_modules/supports-color/node_modules/has-flag": { @@ -1045,12 +1068,12 @@ "integrity": "sha512-7DdUaTjmNwMcH2gLr1qycesKII3BK4RLy/mdAb7x10Lq7bR4aNKHt1BR1ZALSv0rPM/hF5wYF0PhGop/rJm8vw==", "dev": true, "license": "MIT", - "engines": { - "node": ">=10.13.0" - }, "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" } }, "node_modules/dependency-cruiser/node_modules/tsconfig-paths-webpack-plugin/node_modules/enhanced-resolve/node_modules/graceful-fs": { @@ -1094,13 +1117,13 @@ "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", "dev": true, "license": "MIT", - "engines": { - "node": ">=6" - }, "dependencies": { "json5": "^2.2.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, "node_modules/dependency-cruiser/node_modules/tsconfig-paths-webpack-plugin/node_modules/tsconfig-paths/node_modules/json5": { @@ -1193,443 +1216,443 @@ "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", + "cpu": [ + "ppc64" + ], "dev": true, - "optional": true, "license": "MIT", - "engines": { - "node": ">=18" - }, - "cpu": [ - "ppc64" - ], + "optional": true, "os": [ "aix" - ] + ], + "engines": { + "node": ">=18" + } }, "node_modules/esbuild/node_modules/@esbuild/android-arm": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", - "dev": true, - "optional": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, "cpu": [ "arm" ], + "dev": true, + "license": "MIT", + "optional": true, "os": [ "android" - ] + ], + "engines": { + "node": ">=18" + } }, "node_modules/esbuild/node_modules/@esbuild/android-arm64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", - "dev": true, - "optional": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, "cpu": [ "arm64" ], + "dev": true, + "license": "MIT", + "optional": true, "os": [ "android" - ] + ], + "engines": { + "node": ">=18" + } }, "node_modules/esbuild/node_modules/@esbuild/android-x64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", - "dev": true, - "optional": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, "cpu": [ "x64" ], + "dev": true, + "license": "MIT", + "optional": true, "os": [ "android" - ] + ], + "engines": { + "node": ">=18" + } }, "node_modules/esbuild/node_modules/@esbuild/darwin-arm64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", - "dev": true, - "optional": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, "cpu": [ "arm64" ], + "dev": true, + "license": "MIT", + "optional": true, "os": [ "darwin" - ] + ], + "engines": { + "node": ">=18" + } }, "node_modules/esbuild/node_modules/@esbuild/darwin-x64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", - "dev": true, - "optional": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, "cpu": [ "x64" ], + "dev": true, + "license": "MIT", + "optional": true, "os": [ "darwin" - ] + ], + "engines": { + "node": ">=18" + } }, "node_modules/esbuild/node_modules/@esbuild/freebsd-arm64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", - "dev": true, - "optional": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, "cpu": [ "arm64" ], + "dev": true, + "license": "MIT", + "optional": true, "os": [ "freebsd" - ] + ], + "engines": { + "node": ">=18" + } }, "node_modules/esbuild/node_modules/@esbuild/freebsd-x64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", - "dev": true, - "optional": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, "cpu": [ "x64" ], + "dev": true, + "license": "MIT", + "optional": true, "os": [ "freebsd" - ] + ], + "engines": { + "node": ">=18" + } }, "node_modules/esbuild/node_modules/@esbuild/linux-arm": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", - "dev": true, - "optional": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, "cpu": [ "arm" ], + "dev": true, + "license": "MIT", + "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": ">=18" + } }, "node_modules/esbuild/node_modules/@esbuild/linux-arm64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", - "dev": true, - "optional": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, "cpu": [ "arm64" ], + "dev": true, + "license": "MIT", + "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": ">=18" + } }, "node_modules/esbuild/node_modules/@esbuild/linux-ia32": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", - "dev": true, - "optional": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, "cpu": [ "ia32" ], + "dev": true, + "license": "MIT", + "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": ">=18" + } }, "node_modules/esbuild/node_modules/@esbuild/linux-loong64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", - "dev": true, - "optional": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, "cpu": [ "loong64" ], + "dev": true, + "license": "MIT", + "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": ">=18" + } }, "node_modules/esbuild/node_modules/@esbuild/linux-mips64el": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", - "dev": true, - "optional": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, "cpu": [ "mips64el" ], + "dev": true, + "license": "MIT", + "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": ">=18" + } }, "node_modules/esbuild/node_modules/@esbuild/linux-ppc64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", - "dev": true, - "optional": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, "cpu": [ "ppc64" ], + "dev": true, + "license": "MIT", + "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": ">=18" + } }, "node_modules/esbuild/node_modules/@esbuild/linux-riscv64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", - "dev": true, - "optional": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, "cpu": [ "riscv64" ], + "dev": true, + "license": "MIT", + "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": ">=18" + } }, "node_modules/esbuild/node_modules/@esbuild/linux-s390x": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", - "dev": true, - "optional": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, "cpu": [ "s390x" ], + "dev": true, + "license": "MIT", + "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": ">=18" + } }, "node_modules/esbuild/node_modules/@esbuild/linux-x64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", - "dev": true, - "optional": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, "cpu": [ "x64" ], + "dev": true, + "license": "MIT", + "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": ">=18" + } }, "node_modules/esbuild/node_modules/@esbuild/netbsd-arm64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", - "dev": true, - "optional": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, "cpu": [ "arm64" ], + "dev": true, + "license": "MIT", + "optional": true, "os": [ "netbsd" - ] + ], + "engines": { + "node": ">=18" + } }, "node_modules/esbuild/node_modules/@esbuild/netbsd-x64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", - "dev": true, - "optional": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, "cpu": [ "x64" ], + "dev": true, + "license": "MIT", + "optional": true, "os": [ "netbsd" - ] + ], + "engines": { + "node": ">=18" + } }, "node_modules/esbuild/node_modules/@esbuild/openbsd-arm64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", - "dev": true, - "optional": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, "cpu": [ "arm64" ], + "dev": true, + "license": "MIT", + "optional": true, "os": [ "openbsd" - ] + ], + "engines": { + "node": ">=18" + } }, "node_modules/esbuild/node_modules/@esbuild/openbsd-x64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", - "dev": true, - "optional": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, "cpu": [ "x64" ], + "dev": true, + "license": "MIT", + "optional": true, "os": [ "openbsd" - ] + ], + "engines": { + "node": ">=18" + } }, "node_modules/esbuild/node_modules/@esbuild/openharmony-arm64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", - "dev": true, - "optional": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, "cpu": [ "arm64" ], + "dev": true, + "license": "MIT", + "optional": true, "os": [ "openharmony" - ] + ], + "engines": { + "node": ">=18" + } }, "node_modules/esbuild/node_modules/@esbuild/sunos-x64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", - "dev": true, - "optional": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, "cpu": [ "x64" ], + "dev": true, + "license": "MIT", + "optional": true, "os": [ "sunos" - ] + ], + "engines": { + "node": ">=18" + } }, "node_modules/esbuild/node_modules/@esbuild/win32-arm64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", - "dev": true, - "optional": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, "cpu": [ "arm64" ], + "dev": true, + "license": "MIT", + "optional": true, "os": [ "win32" - ] + ], + "engines": { + "node": ">=18" + } }, "node_modules/esbuild/node_modules/@esbuild/win32-ia32": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", - "dev": true, - "optional": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, "cpu": [ "ia32" ], + "dev": true, + "license": "MIT", + "optional": true, "os": [ "win32" - ] + ], + "engines": { + "node": ">=18" + } }, "node_modules/esbuild/node_modules/@esbuild/win32-x64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", - "dev": true, - "optional": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, "cpu": [ "x64" ], + "dev": true, + "license": "MIT", + "optional": true, "os": [ "win32" - ] + ], + "engines": { + "node": ">=18" + } }, "node_modules/eslint": { "version": "9.39.4", @@ -1637,48 +1660,50 @@ "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", "dev": true, "license": "MIT", - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": "https://eslint.org/donate", "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.2", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@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.14.0", "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", - "ignore": "^5.2.0", "esquery": "^1.5.0", "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", - "is-glob": "^4.0.0", - "minimatch": "^3.1.5", - "@eslint/js": "9.39.4", - "optionator": "^0.9.3", - "cross-spawn": "^7.0.6", "glob-parent": "^6.0.2", + "ignore": "^5.2.0", "imurmurhash": "^0.1.4", - "@eslint/core": "^0.17.0", - "eslint-scope": "^8.4.0", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", - "@humanfs/node": "^0.16.6", - "@types/estree": "^1.0.6", - "fast-deep-equal": "^3.1.3", + "minimatch": "^3.1.5", "natural-compare": "^1.4.0", - "@eslint/eslintrc": "^3.3.5", - "file-entry-cache": "^8.0.0", - "@eslint/plugin-kit": "^0.4.1", - "eslint-visitor-keys": "^4.2.1", - "@eslint/config-array": "^0.21.2", - "@humanwhocodes/retry": "^0.4.2", - "escape-string-regexp": "^4.0.0", - "@eslint/config-helpers": "^0.4.2", - "@eslint-community/regexpp": "^4.12.1", - "@eslint-community/eslint-utils": "^4.8.0", - "@humanwhocodes/module-importer": "^1.0.1", - "json-stable-stringify-without-jsonify": "^1.0.1" + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" }, "peerDependencies": { "jiti": "*" @@ -1695,12 +1720,14 @@ "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "funding": "https://opencollective.com/eslint", - "dependencies": { - "eslint-visitor-keys": "^3.4.3" + "funding": { + "url": "https://opencollective.com/eslint" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" @@ -1715,7 +1742,9 @@ "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "funding": "https://opencollective.com/eslint" + "funding": { + "url": "https://opencollective.com/eslint" + } }, "node_modules/eslint/node_modules/@eslint-community/regexpp": { "version": "4.12.2", @@ -1725,8 +1754,7 @@ "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - }, - "dependencies": {} + } }, "node_modules/eslint/node_modules/@eslint/config-array": { "version": "0.21.2", @@ -1734,13 +1762,13 @@ "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", "dev": true, "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, "dependencies": { + "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", - "minimatch": "^3.1.5", - "@eslint/object-schema": "^2.1.7" + "minimatch": "^3.1.5" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/eslint/node_modules/@eslint/config-array/node_modules/@eslint/object-schema": { @@ -1759,12 +1787,12 @@ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=6.0" - }, "dependencies": { "ms": "^2.1.3" }, + "engines": { + "node": ">=6.0" + }, "peerDependenciesMeta": { "supports-color": { "optional": true @@ -1784,11 +1812,11 @@ "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", - "engines": { - "node": "*" - }, "dependencies": { "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, "node_modules/eslint/node_modules/@eslint/config-array/node_modules/minimatch/node_modules/brace-expansion": { @@ -1798,8 +1826,8 @@ "dev": true, "license": "MIT", "dependencies": { - "concat-map": "0.0.1", - "balanced-match": "^1.0.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, "node_modules/eslint/node_modules/@eslint/config-array/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match": { @@ -1822,11 +1850,11 @@ "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", "dev": true, "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, "dependencies": { "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/eslint/node_modules/@eslint/config-helpers/node_modules/@eslint/core": { @@ -1835,11 +1863,11 @@ "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", "dev": true, "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, "dependencies": { "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/eslint/node_modules/@eslint/config-helpers/node_modules/@eslint/core/node_modules/@types/json-schema": { @@ -1847,8 +1875,7 @@ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true, - "license": "MIT", - "dependencies": {} + "license": "MIT" }, "node_modules/eslint/node_modules/@eslint/core": { "version": "0.17.0", @@ -1856,11 +1883,11 @@ "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", "dev": true, "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, "dependencies": { "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/eslint/node_modules/@eslint/core/node_modules/@types/json-schema": { @@ -1868,8 +1895,7 @@ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true, - "license": "MIT", - "dependencies": {} + "license": "MIT" }, "node_modules/eslint/node_modules/@eslint/eslintrc": { "version": "3.3.5", @@ -1877,10 +1903,6 @@ "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", "dev": true, "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": "https://opencollective.com/eslint", "dependencies": { "ajv": "^6.14.0", "debug": "^4.3.2", @@ -1891,6 +1913,12 @@ "js-yaml": "^4.1.1", "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/@eslint/eslintrc/node_modules/ajv": { @@ -1899,15 +1927,15 @@ "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/epoberezkin", - "type": "github" - }, "dependencies": { - "uri-js": "^4.2.2", "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", - "fast-json-stable-stringify": "^2.0.0" + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, "node_modules/eslint/node_modules/@eslint/eslintrc/node_modules/ajv/node_modules/fast-deep-equal": { @@ -1922,8 +1950,7 @@ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true, - "license": "MIT", - "dependencies": {} + "license": "MIT" }, "node_modules/eslint/node_modules/@eslint/eslintrc/node_modules/ajv/node_modules/json-schema-traverse": { "version": "0.4.1", @@ -1958,12 +1985,12 @@ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=6.0" - }, "dependencies": { "ms": "^2.1.3" }, + "engines": { + "node": ">=6.0" + }, "peerDependenciesMeta": { "supports-color": { "optional": true @@ -1983,14 +2010,16 @@ "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", "dev": true, "license": "BSD-2-Clause", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": "https://opencollective.com/eslint", "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/@eslint/eslintrc/node_modules/espree/node_modules/acorn": { @@ -2025,7 +2054,9 @@ "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "funding": "https://opencollective.com/eslint" + "funding": { + "url": "https://opencollective.com/eslint" + } }, "node_modules/eslint/node_modules/@eslint/eslintrc/node_modules/globals": { "version": "14.0.0", @@ -2036,7 +2067,9 @@ "engines": { "node": ">=18" }, - "funding": "https://github.com/sponsors/sindresorhus" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/eslint/node_modules/@eslint/eslintrc/node_modules/ignore": { "version": "5.3.2", @@ -2054,13 +2087,15 @@ "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, "engines": { "node": ">=6" }, - "funding": "https://github.com/sponsors/sindresorhus", - "dependencies": { - "resolve-from": "^4.0.0", - "parent-module": "^1.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint/node_modules/@eslint/eslintrc/node_modules/import-fresh/node_modules/parent-module": { @@ -2069,11 +2104,11 @@ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "license": "MIT", - "engines": { - "node": ">=6" - }, "dependencies": { "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, "node_modules/eslint/node_modules/@eslint/eslintrc/node_modules/import-fresh/node_modules/parent-module/node_modules/callsites": { @@ -2101,22 +2136,22 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==", "dev": true, - "license": "MIT", - "bin": { - "js-yaml": "bin/js-yaml.js" - }, "funding": [ { - "url": "https://github.com/sponsors/puzrin", - "type": "github" + "type": "github", + "url": "https://github.com/sponsors/puzrin" }, { - "url": "https://github.com/sponsors/nodeca", - "type": "github" + "type": "github", + "url": "https://github.com/sponsors/nodeca" } ], + "license": "MIT", "dependencies": { "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, "node_modules/eslint/node_modules/@eslint/eslintrc/node_modules/js-yaml/node_modules/argparse": { @@ -2132,11 +2167,11 @@ "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", - "engines": { - "node": "*" - }, "dependencies": { "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, "node_modules/eslint/node_modules/@eslint/eslintrc/node_modules/minimatch/node_modules/brace-expansion": { @@ -2146,8 +2181,8 @@ "dev": true, "license": "MIT", "dependencies": { - "concat-map": "0.0.1", - "balanced-match": "^1.0.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, "node_modules/eslint/node_modules/@eslint/eslintrc/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match": { @@ -2173,7 +2208,9 @@ "engines": { "node": ">=8" }, - "funding": "https://github.com/sponsors/sindresorhus" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/eslint/node_modules/@eslint/js": { "version": "9.39.4", @@ -2184,7 +2221,9 @@ "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "funding": "https://eslint.org/donate" + "funding": { + "url": "https://eslint.org/donate" + } }, "node_modules/eslint/node_modules/@eslint/plugin-kit": { "version": "0.4.1", @@ -2192,12 +2231,12 @@ "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", "dev": true, "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "dependencies": { - "levn": "^0.4.1", - "@eslint/core": "^0.17.0" } }, "node_modules/eslint/node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { @@ -2206,11 +2245,11 @@ "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", "dev": true, "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, "dependencies": { "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/eslint/node_modules/@eslint/plugin-kit/node_modules/@eslint/core/node_modules/@types/json-schema": { @@ -2218,8 +2257,7 @@ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true, - "license": "MIT", - "dependencies": {} + "license": "MIT" }, "node_modules/eslint/node_modules/@eslint/plugin-kit/node_modules/levn": { "version": "0.4.1", @@ -2227,12 +2265,12 @@ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.8.0" - }, "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" } }, "node_modules/eslint/node_modules/@eslint/plugin-kit/node_modules/levn/node_modules/prelude-ls": { @@ -2251,11 +2289,11 @@ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.8.0" - }, "dependencies": { "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" } }, "node_modules/eslint/node_modules/@eslint/plugin-kit/node_modules/levn/node_modules/type-check/node_modules/prelude-ls": { @@ -2274,13 +2312,13 @@ "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", "dev": true, "license": "Apache-2.0", - "engines": { - "node": ">=18.18.0" - }, "dependencies": { - "@humanwhocodes/retry": "^0.4.0", "@humanfs/core": "^0.19.2", - "@humanfs/types": "^0.15.0" + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" } }, "node_modules/eslint/node_modules/@humanfs/node/node_modules/@humanfs/core": { @@ -2289,11 +2327,11 @@ "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", "dev": true, "license": "Apache-2.0", - "engines": { - "node": ">=18.18.0" - }, "dependencies": { "@humanfs/types": "^0.15.0" + }, + "engines": { + "node": ">=18.18.0" } }, "node_modules/eslint/node_modules/@humanfs/node/node_modules/@humanfs/core/node_modules/@humanfs/types": { @@ -2363,9 +2401,7 @@ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", "dev": true, - "license": "MIT", - "dependencies": {}, - "peerDependencies": {} + "license": "MIT" }, "node_modules/eslint/node_modules/ajv": { "version": "6.15.0", @@ -2373,15 +2409,15 @@ "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/epoberezkin", - "type": "github" - }, "dependencies": { - "uri-js": "^4.2.2", "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", - "fast-json-stable-stringify": "^2.0.0" + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, "node_modules/eslint/node_modules/ajv/node_modules/fast-deep-equal": { @@ -2396,8 +2432,7 @@ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true, - "license": "MIT", - "dependencies": {} + "license": "MIT" }, "node_modules/eslint/node_modules/ajv/node_modules/json-schema-traverse": { "version": "0.4.1", @@ -2432,13 +2467,15 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": "https://github.com/chalk/chalk?sponsor=1", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/eslint/node_modules/chalk/node_modules/ansi-styles": { @@ -2447,12 +2484,14 @@ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { "node": ">=8" }, - "funding": "https://github.com/chalk/ansi-styles?sponsor=1", - "dependencies": { - "color-convert": "^2.0.1" + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/eslint/node_modules/chalk/node_modules/ansi-styles/node_modules/color-convert": { @@ -2461,11 +2500,11 @@ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">=7.0.0" - }, "dependencies": { "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, "node_modules/eslint/node_modules/chalk/node_modules/ansi-styles/node_modules/color-convert/node_modules/color-name": { @@ -2481,11 +2520,11 @@ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" - }, "dependencies": { "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/eslint/node_modules/chalk/node_modules/supports-color/node_modules/has-flag": { @@ -2504,13 +2543,13 @@ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 8" - }, "dependencies": { - "which": "^2.0.1", "path-key": "^3.1.0", - "shebang-command": "^2.0.0" + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" } }, "node_modules/eslint/node_modules/cross-spawn/node_modules/path-key": { @@ -2529,11 +2568,11 @@ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" - }, "dependencies": { "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/eslint/node_modules/cross-spawn/node_modules/shebang-command/node_modules/shebang-regex": { @@ -2552,14 +2591,14 @@ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, "bin": { - "node-which": "./bin/node-which" + "node-which": "bin/node-which" }, "engines": { "node": ">= 8" - }, - "dependencies": { - "isexe": "^2.0.0" } }, "node_modules/eslint/node_modules/cross-spawn/node_modules/which/node_modules/isexe": { @@ -2575,12 +2614,12 @@ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=6.0" - }, "dependencies": { "ms": "^2.1.3" }, + "engines": { + "node": ">=6.0" + }, "peerDependenciesMeta": { "supports-color": { "optional": true @@ -2603,7 +2642,9 @@ "engines": { "node": ">=10" }, - "funding": "https://github.com/sponsors/sindresorhus" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/eslint/node_modules/eslint-scope": { "version": "8.4.0", @@ -2611,13 +2652,15 @@ "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", "dev": true, "license": "BSD-2-Clause", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": "https://opencollective.com/eslint", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/eslint-scope/node_modules/esrecurse": { @@ -2626,11 +2669,11 @@ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - }, "dependencies": { "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" } }, "node_modules/eslint/node_modules/eslint-scope/node_modules/esrecurse/node_modules/estraverse": { @@ -2662,7 +2705,9 @@ "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "funding": "https://opencollective.com/eslint" + "funding": { + "url": "https://opencollective.com/eslint" + } }, "node_modules/eslint/node_modules/espree": { "version": "10.4.0", @@ -2670,14 +2715,16 @@ "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", "dev": true, "license": "BSD-2-Clause", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": "https://opencollective.com/eslint", "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/espree/node_modules/acorn": { @@ -2712,7 +2759,9 @@ "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "funding": "https://opencollective.com/eslint" + "funding": { + "url": "https://opencollective.com/eslint" + } }, "node_modules/eslint/node_modules/esquery": { "version": "1.7.0", @@ -2720,11 +2769,11 @@ "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "dev": true, "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10" - }, "dependencies": { "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" } }, "node_modules/eslint/node_modules/esquery/node_modules/estraverse": { @@ -2760,11 +2809,11 @@ "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">=16.0.0" - }, "dependencies": { "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" } }, "node_modules/eslint/node_modules/file-entry-cache/node_modules/flat-cache": { @@ -2773,12 +2822,12 @@ "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, "engines": { "node": ">=16" - }, - "dependencies": { - "keyv": "^4.5.4", - "flatted": "^3.2.9" } }, "node_modules/eslint/node_modules/file-entry-cache/node_modules/flat-cache/node_modules/flatted": { @@ -2811,13 +2860,15 @@ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": "https://github.com/sponsors/sindresorhus", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint/node_modules/find-up/node_modules/locate-path": { @@ -2826,12 +2877,14 @@ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, "engines": { "node": ">=10" }, - "funding": "https://github.com/sponsors/sindresorhus", - "dependencies": { - "p-locate": "^5.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint/node_modules/find-up/node_modules/locate-path/node_modules/p-locate": { @@ -2840,12 +2893,14 @@ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, "engines": { "node": ">=10" }, - "funding": "https://github.com/sponsors/sindresorhus", - "dependencies": { - "p-limit": "^3.0.2" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint/node_modules/find-up/node_modules/locate-path/node_modules/p-locate/node_modules/p-limit": { @@ -2854,12 +2909,14 @@ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, "engines": { "node": ">=10" }, - "funding": "https://github.com/sponsors/sindresorhus", - "dependencies": { - "yocto-queue": "^0.1.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint/node_modules/find-up/node_modules/locate-path/node_modules/p-locate/node_modules/p-limit/node_modules/yocto-queue": { @@ -2871,7 +2928,9 @@ "engines": { "node": ">=10" }, - "funding": "https://github.com/sponsors/sindresorhus" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/eslint/node_modules/find-up/node_modules/path-exists": { "version": "4.0.0", @@ -2889,11 +2948,11 @@ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "license": "ISC", - "engines": { - "node": ">=10.13.0" - }, "dependencies": { "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" } }, "node_modules/eslint/node_modules/glob-parent/node_modules/is-glob": { @@ -2902,11 +2961,11 @@ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.10.0" - }, "dependencies": { "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" } }, "node_modules/eslint/node_modules/glob-parent/node_modules/is-glob/node_modules/is-extglob": { @@ -2937,8 +2996,7 @@ "license": "MIT", "engines": { "node": ">=0.8.19" - }, - "dependencies": {} + } }, "node_modules/eslint/node_modules/is-glob": { "version": "4.0.3", @@ -2946,11 +3004,11 @@ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.10.0" - }, "dependencies": { "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" } }, "node_modules/eslint/node_modules/is-glob/node_modules/is-extglob": { @@ -2968,8 +3026,7 @@ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true, - "license": "MIT", - "dependencies": {} + "license": "MIT" }, "node_modules/eslint/node_modules/lodash.merge": { "version": "4.6.2", @@ -2984,11 +3041,11 @@ "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", - "engines": { - "node": "*" - }, "dependencies": { "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, "node_modules/eslint/node_modules/minimatch/node_modules/brace-expansion": { @@ -2998,8 +3055,8 @@ "dev": true, "license": "MIT", "dependencies": { - "concat-map": "0.0.1", - "balanced-match": "^1.0.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, "node_modules/eslint/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match": { @@ -3029,16 +3086,16 @@ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.8.0" - }, "dependencies": { - "prelude-ls": "^1.2.1", "deep-is": "^0.1.3", - "word-wrap": "^1.2.5", - "type-check": "^0.4.0", + "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", - "fast-levenshtein": "^2.0.6" + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" } }, "node_modules/eslint/node_modules/optionator/node_modules/deep-is": { @@ -3061,12 +3118,12 @@ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.8.0" - }, "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" } }, "node_modules/eslint/node_modules/optionator/node_modules/levn/node_modules/prelude-ls": { @@ -3085,11 +3142,11 @@ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.8.0" - }, "dependencies": { "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" } }, "node_modules/eslint/node_modules/optionator/node_modules/levn/node_modules/type-check/node_modules/prelude-ls": { @@ -3118,11 +3175,11 @@ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.8.0" - }, "dependencies": { "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" } }, "node_modules/eslint/node_modules/optionator/node_modules/type-check/node_modules/prelude-ls": { @@ -3157,7 +3214,9 @@ "engines": { "node": ">=14" }, - "funding": "https://github.com/prettier/prettier?sponsor=1" + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } }, "node_modules/typescript": { "version": "5.9.3", @@ -3179,6 +3238,12 @@ "integrity": "sha512-vymnnM5g0AKQDSAyfP12nMIBvgwgA42syg74kkuZ4x1VuTzwQKwc5h9rGxeShCjny5o+zWAb6OEoz7XLgrIkIw==", "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.62.1", + "@typescript-eslint/parser": "8.62.1", + "@typescript-eslint/typescript-estree": "8.62.1", + "@typescript-eslint/utils": "8.62.1" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -3186,12 +3251,6 @@ "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "dependencies": { - "@typescript-eslint/eslint-plugin": "8.62.1", - "@typescript-eslint/parser": "8.62.1", - "@typescript-eslint/typescript-estree": "8.62.1", - "@typescript-eslint/utils": "8.62.1" - }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" @@ -3203,6 +3262,16 @@ "integrity": "sha512-4EQM77WgVNxj7OkL/5b/D/xZsw00G577+UriYTC7JF5opcF3T2AuoeY7ueLaZgSVjSgCS6yOAJB5bRGLPSJUzA==", "dev": true, "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.62.1", + "@typescript-eslint/type-utils": "8.62.1", + "@typescript-eslint/utils": "8.62.1", + "@typescript-eslint/visitor-keys": "8.62.1", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -3210,20 +3279,10 @@ "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "dependencies": { - "@eslint-community/regexpp": "^4.12.2", - "ignore": "^7.0.5", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.5.0", - "@typescript-eslint/scope-manager": "8.62.1", - "@typescript-eslint/utils": "8.62.1", - "@typescript-eslint/type-utils": "8.62.1", - "@typescript-eslint/visitor-keys": "8.62.1" - }, "peerDependencies": { + "@typescript-eslint/parser": "^8.62.1", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0", - "@typescript-eslint/parser": "^8.62.1" + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@eslint-community/regexpp": { @@ -3234,8 +3293,7 @@ "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - }, - "dependencies": {} + } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { "version": "8.62.1", @@ -3243,16 +3301,16 @@ "integrity": "sha512-r4d249KbQ1SFdpeStvob8Ih6aPPIzfqllPVOtvhve6ZcpuVcYo5/7zUWckKpHE7StASX4kTKZTLf0WQm/wPkcg==", "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.62.1", + "@typescript-eslint/visitor-keys": "8.62.1" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - }, - "dependencies": { - "@typescript-eslint/types": "8.62.1", - "@typescript-eslint/visitor-keys": "8.62.1" } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager/node_modules/@typescript-eslint/types": { @@ -3275,16 +3333,16 @@ "integrity": "sha512-4g3BLxfdTMy8iZG0MaBkadnlRrCJ74cQiFbyEVMrkwIoqdyaXXQM22cotDvrl4x28wgIZ9rEJRoM+mmhSJpJ1g==", "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.62.1", + "eslint-visitor-keys": "^5.0.0" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - }, - "dependencies": { - "eslint-visitor-keys": "^5.0.0", - "@typescript-eslint/types": "8.62.1" } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager/node_modules/@typescript-eslint/visitor-keys/node_modules/@typescript-eslint/types": { @@ -3310,7 +3368,9 @@ "engines": { "node": "^20.19.0 || ^22.13.0 || >=24" }, - "funding": "https://opencollective.com/eslint" + "funding": { + "url": "https://opencollective.com/eslint" + } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { "version": "8.62.1", @@ -3318,6 +3378,13 @@ "integrity": "sha512-aXM5xlqXiTxPibXB93cLAURfT3rlizf7uMXISCXy66Isr/9hISJx3yDsKl0L7lKa51b8JpFuNKby0/O0pEm9jg==", "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.62.1", + "@typescript-eslint/typescript-estree": "8.62.1", + "@typescript-eslint/utils": "8.62.1", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -3325,13 +3392,6 @@ "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "dependencies": { - "debug": "^4.4.3", - "ts-api-utils": "^2.5.0", - "@typescript-eslint/typescript-estree": "8.62.1", - "@typescript-eslint/types": "8.62.1", - "@typescript-eslint/utils": "8.62.1" - }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" @@ -3357,6 +3417,17 @@ "integrity": "sha512-xMcW9oP9u7fAMXYs9A65CVmtLQe2r//oXINHfi8HV+oiqhih17sbLdhXr4540YWlgpDKQdY854OL5ZrdCiQsAA==", "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.62.1", + "@typescript-eslint/tsconfig-utils": "8.62.1", + "@typescript-eslint/types": "8.62.1", + "@typescript-eslint/visitor-keys": "8.62.1", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -3364,17 +3435,6 @@ "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "dependencies": { - "debug": "^4.4.3", - "minimatch": "^10.2.2", - "semver": "^7.7.3", - "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.5.0", - "@typescript-eslint/project-service": "8.62.1", - "@typescript-eslint/tsconfig-utils": "8.62.1", - "@typescript-eslint/visitor-keys": "8.62.1", - "@typescript-eslint/types": "8.62.1" - }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } @@ -3385,6 +3445,11 @@ "integrity": "sha512-yQ3RgY5RkSBpsNS1Bx/JQEcA24FOSdfGktoyprAr5u18390UQdtVcfnEv4nIrIshNnavlVyZBKxQwT1fIAE6cg==", "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.62.1", + "@typescript-eslint/types": "^8.62.1", + "debug": "^4.4.3" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -3392,11 +3457,6 @@ "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "dependencies": { - "debug": "^4.4.3", - "@typescript-eslint/types": "^8.62.1", - "@typescript-eslint/tsconfig-utils": "^8.62.1" - }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } @@ -3438,12 +3498,12 @@ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=6.0" - }, "dependencies": { "ms": "^2.1.3" }, + "engines": { + "node": ">=6.0" + }, "peerDependenciesMeta": { "supports-color": { "optional": true @@ -3494,16 +3554,16 @@ "integrity": "sha512-4g3BLxfdTMy8iZG0MaBkadnlRrCJ74cQiFbyEVMrkwIoqdyaXXQM22cotDvrl4x28wgIZ9rEJRoM+mmhSJpJ1g==", "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.62.1", + "eslint-visitor-keys": "^5.0.0" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - }, - "dependencies": { - "eslint-visitor-keys": "^5.0.0", - "@typescript-eslint/types": "8.62.1" } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/visitor-keys/node_modules/@typescript-eslint/types": { @@ -3529,7 +3589,9 @@ "engines": { "node": "^20.19.0 || ^22.13.0 || >=24" }, - "funding": "https://opencollective.com/eslint" + "funding": { + "url": "https://opencollective.com/eslint" + } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/debug": { "version": "4.4.3", @@ -3537,12 +3599,12 @@ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=6.0" - }, "dependencies": { "ms": "^2.1.3" }, + "engines": { + "node": ">=6.0" + }, "peerDependenciesMeta": { "supports-color": { "optional": true @@ -3562,14 +3624,14 @@ "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", "dev": true, "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, "engines": { "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" - }, - "dependencies": { - "brace-expansion": "^5.0.5" } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch/node_modules/brace-expansion": { @@ -3578,11 +3640,11 @@ "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==", "dev": true, "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - }, "dependencies": { "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match": { @@ -3614,15 +3676,15 @@ "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", "dev": true, "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, "engines": { "node": ">=12.0.0" }, "funding": { "url": "https://github.com/sponsors/SuperchupuDev" - }, - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.4" } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/tinyglobby/node_modules/fdir": { @@ -3652,7 +3714,9 @@ "engines": { "node": ">=12" }, - "funding": "https://github.com/sponsors/jonschlinkert" + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/ts-api-utils": { "version": "2.5.0", @@ -3673,6 +3737,12 @@ "integrity": "sha512-sHtbPfuKNZCG+ih8SyjjucqRntSVmp8XgL5u6o9mAhiSn8ds5o/M/XdM0abweme2Tln3szOstOrZ9OXitvPh0g==", "dev": true, "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.62.1", + "@typescript-eslint/types": "8.62.1", + "@typescript-eslint/typescript-estree": "8.62.1" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -3680,12 +3750,6 @@ "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "dependencies": { - "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.62.1", - "@typescript-eslint/types": "8.62.1", - "@typescript-eslint/typescript-estree": "8.62.1" - }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" @@ -3697,12 +3761,14 @@ "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "funding": "https://opencollective.com/eslint", - "dependencies": { - "eslint-visitor-keys": "^3.4.3" + "funding": { + "url": "https://opencollective.com/eslint" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" @@ -3717,7 +3783,9 @@ "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "funding": "https://opencollective.com/eslint" + "funding": { + "url": "https://opencollective.com/eslint" + } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { "version": "8.62.1", @@ -3725,16 +3793,16 @@ "integrity": "sha512-r4d249KbQ1SFdpeStvob8Ih6aPPIzfqllPVOtvhve6ZcpuVcYo5/7zUWckKpHE7StASX4kTKZTLf0WQm/wPkcg==", "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.62.1", + "@typescript-eslint/visitor-keys": "8.62.1" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - }, - "dependencies": { - "@typescript-eslint/types": "8.62.1", - "@typescript-eslint/visitor-keys": "8.62.1" } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager/node_modules/@typescript-eslint/types": { @@ -3757,16 +3825,16 @@ "integrity": "sha512-4g3BLxfdTMy8iZG0MaBkadnlRrCJ74cQiFbyEVMrkwIoqdyaXXQM22cotDvrl4x28wgIZ9rEJRoM+mmhSJpJ1g==", "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.62.1", + "eslint-visitor-keys": "^5.0.0" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - }, - "dependencies": { - "eslint-visitor-keys": "^5.0.0", - "@typescript-eslint/types": "8.62.1" } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager/node_modules/@typescript-eslint/visitor-keys/node_modules/@typescript-eslint/types": { @@ -3792,7 +3860,9 @@ "engines": { "node": "^20.19.0 || ^22.13.0 || >=24" }, - "funding": "https://opencollective.com/eslint" + "funding": { + "url": "https://opencollective.com/eslint" + } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { "version": "8.62.1", @@ -3814,6 +3884,17 @@ "integrity": "sha512-xMcW9oP9u7fAMXYs9A65CVmtLQe2r//oXINHfi8HV+oiqhih17sbLdhXr4540YWlgpDKQdY854OL5ZrdCiQsAA==", "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.62.1", + "@typescript-eslint/tsconfig-utils": "8.62.1", + "@typescript-eslint/types": "8.62.1", + "@typescript-eslint/visitor-keys": "8.62.1", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -3821,17 +3902,6 @@ "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "dependencies": { - "debug": "^4.4.3", - "minimatch": "^10.2.2", - "semver": "^7.7.3", - "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.5.0", - "@typescript-eslint/project-service": "8.62.1", - "@typescript-eslint/tsconfig-utils": "8.62.1", - "@typescript-eslint/visitor-keys": "8.62.1", - "@typescript-eslint/types": "8.62.1" - }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } @@ -3842,6 +3912,11 @@ "integrity": "sha512-yQ3RgY5RkSBpsNS1Bx/JQEcA24FOSdfGktoyprAr5u18390UQdtVcfnEv4nIrIshNnavlVyZBKxQwT1fIAE6cg==", "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.62.1", + "@typescript-eslint/types": "^8.62.1", + "debug": "^4.4.3" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -3849,11 +3924,6 @@ "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "dependencies": { - "debug": "^4.4.3", - "@typescript-eslint/types": "^8.62.1", - "@typescript-eslint/tsconfig-utils": "^8.62.1" - }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } @@ -3895,12 +3965,12 @@ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=6.0" - }, "dependencies": { "ms": "^2.1.3" }, + "engines": { + "node": ">=6.0" + }, "peerDependenciesMeta": { "supports-color": { "optional": true @@ -3951,16 +4021,16 @@ "integrity": "sha512-4g3BLxfdTMy8iZG0MaBkadnlRrCJ74cQiFbyEVMrkwIoqdyaXXQM22cotDvrl4x28wgIZ9rEJRoM+mmhSJpJ1g==", "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.62.1", + "eslint-visitor-keys": "^5.0.0" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - }, - "dependencies": { - "eslint-visitor-keys": "^5.0.0", - "@typescript-eslint/types": "8.62.1" } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/visitor-keys/node_modules/@typescript-eslint/types": { @@ -3986,7 +4056,9 @@ "engines": { "node": "^20.19.0 || ^22.13.0 || >=24" }, - "funding": "https://opencollective.com/eslint" + "funding": { + "url": "https://opencollective.com/eslint" + } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/debug": { "version": "4.4.3", @@ -3994,12 +4066,12 @@ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=6.0" - }, "dependencies": { "ms": "^2.1.3" }, + "engines": { + "node": ">=6.0" + }, "peerDependenciesMeta": { "supports-color": { "optional": true @@ -4019,14 +4091,14 @@ "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", "dev": true, "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, "engines": { "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" - }, - "dependencies": { - "brace-expansion": "^5.0.5" } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch/node_modules/brace-expansion": { @@ -4035,11 +4107,11 @@ "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==", "dev": true, "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - }, "dependencies": { "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match": { @@ -4071,15 +4143,15 @@ "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", "dev": true, "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, "engines": { "node": ">=12.0.0" }, "funding": { "url": "https://github.com/sponsors/SuperchupuDev" - }, - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.4" } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/tinyglobby/node_modules/fdir": { @@ -4109,7 +4181,9 @@ "engines": { "node": ">=12" }, - "funding": "https://github.com/sponsors/jonschlinkert" + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/ts-api-utils": { "version": "2.5.0", @@ -4130,12 +4204,12 @@ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=6.0" - }, "dependencies": { "ms": "^2.1.3" }, + "engines": { + "node": ">=6.0" + }, "peerDependenciesMeta": { "supports-color": { "optional": true @@ -4168,6 +4242,12 @@ "integrity": "sha512-sHtbPfuKNZCG+ih8SyjjucqRntSVmp8XgL5u6o9mAhiSn8ds5o/M/XdM0abweme2Tln3szOstOrZ9OXitvPh0g==", "dev": true, "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.62.1", + "@typescript-eslint/types": "8.62.1", + "@typescript-eslint/typescript-estree": "8.62.1" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -4175,12 +4255,6 @@ "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "dependencies": { - "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.62.1", - "@typescript-eslint/types": "8.62.1", - "@typescript-eslint/typescript-estree": "8.62.1" - }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" @@ -4192,12 +4266,14 @@ "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "funding": "https://opencollective.com/eslint", - "dependencies": { - "eslint-visitor-keys": "^3.4.3" + "funding": { + "url": "https://opencollective.com/eslint" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" @@ -4212,7 +4288,9 @@ "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "funding": "https://opencollective.com/eslint" + "funding": { + "url": "https://opencollective.com/eslint" + } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { "version": "8.62.1", @@ -4220,16 +4298,16 @@ "integrity": "sha512-r4d249KbQ1SFdpeStvob8Ih6aPPIzfqllPVOtvhve6ZcpuVcYo5/7zUWckKpHE7StASX4kTKZTLf0WQm/wPkcg==", "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.62.1", + "@typescript-eslint/visitor-keys": "8.62.1" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - }, - "dependencies": { - "@typescript-eslint/types": "8.62.1", - "@typescript-eslint/visitor-keys": "8.62.1" } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager/node_modules/@typescript-eslint/types": { @@ -4252,16 +4330,16 @@ "integrity": "sha512-4g3BLxfdTMy8iZG0MaBkadnlRrCJ74cQiFbyEVMrkwIoqdyaXXQM22cotDvrl4x28wgIZ9rEJRoM+mmhSJpJ1g==", "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.62.1", + "eslint-visitor-keys": "^5.0.0" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - }, - "dependencies": { - "eslint-visitor-keys": "^5.0.0", - "@typescript-eslint/types": "8.62.1" } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager/node_modules/@typescript-eslint/visitor-keys/node_modules/@typescript-eslint/types": { @@ -4287,7 +4365,9 @@ "engines": { "node": "^20.19.0 || ^22.13.0 || >=24" }, - "funding": "https://opencollective.com/eslint" + "funding": { + "url": "https://opencollective.com/eslint" + } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { "version": "8.62.1", @@ -4309,6 +4389,17 @@ "integrity": "sha512-xMcW9oP9u7fAMXYs9A65CVmtLQe2r//oXINHfi8HV+oiqhih17sbLdhXr4540YWlgpDKQdY854OL5ZrdCiQsAA==", "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.62.1", + "@typescript-eslint/tsconfig-utils": "8.62.1", + "@typescript-eslint/types": "8.62.1", + "@typescript-eslint/visitor-keys": "8.62.1", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -4316,17 +4407,6 @@ "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "dependencies": { - "debug": "^4.4.3", - "minimatch": "^10.2.2", - "semver": "^7.7.3", - "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.5.0", - "@typescript-eslint/project-service": "8.62.1", - "@typescript-eslint/tsconfig-utils": "8.62.1", - "@typescript-eslint/visitor-keys": "8.62.1", - "@typescript-eslint/types": "8.62.1" - }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } @@ -4337,6 +4417,11 @@ "integrity": "sha512-yQ3RgY5RkSBpsNS1Bx/JQEcA24FOSdfGktoyprAr5u18390UQdtVcfnEv4nIrIshNnavlVyZBKxQwT1fIAE6cg==", "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.62.1", + "@typescript-eslint/types": "^8.62.1", + "debug": "^4.4.3" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -4344,11 +4429,6 @@ "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "dependencies": { - "debug": "^4.4.3", - "@typescript-eslint/types": "^8.62.1", - "@typescript-eslint/tsconfig-utils": "^8.62.1" - }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } @@ -4390,12 +4470,12 @@ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=6.0" - }, "dependencies": { "ms": "^2.1.3" }, + "engines": { + "node": ">=6.0" + }, "peerDependenciesMeta": { "supports-color": { "optional": true @@ -4446,16 +4526,16 @@ "integrity": "sha512-4g3BLxfdTMy8iZG0MaBkadnlRrCJ74cQiFbyEVMrkwIoqdyaXXQM22cotDvrl4x28wgIZ9rEJRoM+mmhSJpJ1g==", "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.62.1", + "eslint-visitor-keys": "^5.0.0" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - }, - "dependencies": { - "eslint-visitor-keys": "^5.0.0", - "@typescript-eslint/types": "8.62.1" } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/visitor-keys/node_modules/@typescript-eslint/types": { @@ -4481,7 +4561,9 @@ "engines": { "node": "^20.19.0 || ^22.13.0 || >=24" }, - "funding": "https://opencollective.com/eslint" + "funding": { + "url": "https://opencollective.com/eslint" + } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/debug": { "version": "4.4.3", @@ -4489,12 +4571,12 @@ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=6.0" - }, "dependencies": { "ms": "^2.1.3" }, + "engines": { + "node": ">=6.0" + }, "peerDependenciesMeta": { "supports-color": { "optional": true @@ -4514,14 +4596,14 @@ "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", "dev": true, "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, "engines": { "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" - }, - "dependencies": { - "brace-expansion": "^5.0.5" } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch/node_modules/brace-expansion": { @@ -4530,11 +4612,11 @@ "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==", "dev": true, "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - }, "dependencies": { "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match": { @@ -4566,15 +4648,15 @@ "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", "dev": true, "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, "engines": { "node": ">=12.0.0" }, "funding": { "url": "https://github.com/sponsors/SuperchupuDev" - }, - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.4" } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/tinyglobby/node_modules/fdir": { @@ -4604,7 +4686,9 @@ "engines": { "node": ">=12" }, - "funding": "https://github.com/sponsors/jonschlinkert" + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/ts-api-utils": { "version": "2.5.0", @@ -4625,16 +4709,16 @@ "integrity": "sha512-4g3BLxfdTMy8iZG0MaBkadnlRrCJ74cQiFbyEVMrkwIoqdyaXXQM22cotDvrl4x28wgIZ9rEJRoM+mmhSJpJ1g==", "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.62.1", + "eslint-visitor-keys": "^5.0.0" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - }, - "dependencies": { - "eslint-visitor-keys": "^5.0.0", - "@typescript-eslint/types": "8.62.1" } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys/node_modules/@typescript-eslint/types": { @@ -4660,7 +4744,9 @@ "engines": { "node": "^20.19.0 || ^22.13.0 || >=24" }, - "funding": "https://opencollective.com/eslint" + "funding": { + "url": "https://opencollective.com/eslint" + } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { "version": "7.0.5", @@ -4698,6 +4784,13 @@ "integrity": "sha512-sPhE4iHuJDSvoAiec+Ro8JyXw8f0ql13HFR82P99nCm9GwTEKG0KYLvDe6REk8BCXuit6vJAv/Yxg5ABaNS2rA==", "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.62.1", + "@typescript-eslint/types": "8.62.1", + "@typescript-eslint/typescript-estree": "8.62.1", + "@typescript-eslint/visitor-keys": "8.62.1", + "debug": "^4.4.3" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -4705,13 +4798,6 @@ "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "dependencies": { - "debug": "^4.4.3", - "@typescript-eslint/scope-manager": "8.62.1", - "@typescript-eslint/typescript-estree": "8.62.1", - "@typescript-eslint/types": "8.62.1", - "@typescript-eslint/visitor-keys": "8.62.1" - }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" @@ -4723,16 +4809,16 @@ "integrity": "sha512-r4d249KbQ1SFdpeStvob8Ih6aPPIzfqllPVOtvhve6ZcpuVcYo5/7zUWckKpHE7StASX4kTKZTLf0WQm/wPkcg==", "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.62.1", + "@typescript-eslint/visitor-keys": "8.62.1" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - }, - "dependencies": { - "@typescript-eslint/types": "8.62.1", - "@typescript-eslint/visitor-keys": "8.62.1" } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager/node_modules/@typescript-eslint/types": { @@ -4755,16 +4841,16 @@ "integrity": "sha512-4g3BLxfdTMy8iZG0MaBkadnlRrCJ74cQiFbyEVMrkwIoqdyaXXQM22cotDvrl4x28wgIZ9rEJRoM+mmhSJpJ1g==", "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.62.1", + "eslint-visitor-keys": "^5.0.0" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - }, - "dependencies": { - "eslint-visitor-keys": "^5.0.0", - "@typescript-eslint/types": "8.62.1" } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager/node_modules/@typescript-eslint/visitor-keys/node_modules/@typescript-eslint/types": { @@ -4790,7 +4876,9 @@ "engines": { "node": "^20.19.0 || ^22.13.0 || >=24" }, - "funding": "https://opencollective.com/eslint" + "funding": { + "url": "https://opencollective.com/eslint" + } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { "version": "8.62.1", @@ -4812,6 +4900,17 @@ "integrity": "sha512-xMcW9oP9u7fAMXYs9A65CVmtLQe2r//oXINHfi8HV+oiqhih17sbLdhXr4540YWlgpDKQdY854OL5ZrdCiQsAA==", "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.62.1", + "@typescript-eslint/tsconfig-utils": "8.62.1", + "@typescript-eslint/types": "8.62.1", + "@typescript-eslint/visitor-keys": "8.62.1", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -4819,17 +4918,6 @@ "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "dependencies": { - "debug": "^4.4.3", - "minimatch": "^10.2.2", - "semver": "^7.7.3", - "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.5.0", - "@typescript-eslint/project-service": "8.62.1", - "@typescript-eslint/tsconfig-utils": "8.62.1", - "@typescript-eslint/visitor-keys": "8.62.1", - "@typescript-eslint/types": "8.62.1" - }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } @@ -4840,6 +4928,11 @@ "integrity": "sha512-yQ3RgY5RkSBpsNS1Bx/JQEcA24FOSdfGktoyprAr5u18390UQdtVcfnEv4nIrIshNnavlVyZBKxQwT1fIAE6cg==", "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.62.1", + "@typescript-eslint/types": "^8.62.1", + "debug": "^4.4.3" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -4847,11 +4940,6 @@ "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "dependencies": { - "debug": "^4.4.3", - "@typescript-eslint/types": "^8.62.1", - "@typescript-eslint/tsconfig-utils": "^8.62.1" - }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } @@ -4893,12 +4981,12 @@ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=6.0" - }, "dependencies": { "ms": "^2.1.3" }, + "engines": { + "node": ">=6.0" + }, "peerDependenciesMeta": { "supports-color": { "optional": true @@ -4949,16 +5037,16 @@ "integrity": "sha512-4g3BLxfdTMy8iZG0MaBkadnlRrCJ74cQiFbyEVMrkwIoqdyaXXQM22cotDvrl4x28wgIZ9rEJRoM+mmhSJpJ1g==", "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.62.1", + "eslint-visitor-keys": "^5.0.0" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - }, - "dependencies": { - "eslint-visitor-keys": "^5.0.0", - "@typescript-eslint/types": "8.62.1" } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/visitor-keys/node_modules/@typescript-eslint/types": { @@ -4984,7 +5072,9 @@ "engines": { "node": "^20.19.0 || ^22.13.0 || >=24" }, - "funding": "https://opencollective.com/eslint" + "funding": { + "url": "https://opencollective.com/eslint" + } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/debug": { "version": "4.4.3", @@ -4992,12 +5082,12 @@ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=6.0" - }, "dependencies": { "ms": "^2.1.3" }, + "engines": { + "node": ">=6.0" + }, "peerDependenciesMeta": { "supports-color": { "optional": true @@ -5017,14 +5107,14 @@ "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", "dev": true, "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, "engines": { "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" - }, - "dependencies": { - "brace-expansion": "^5.0.5" } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch/node_modules/brace-expansion": { @@ -5033,11 +5123,11 @@ "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==", "dev": true, "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - }, "dependencies": { "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match": { @@ -5069,15 +5159,15 @@ "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", "dev": true, "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, "engines": { "node": ">=12.0.0" }, "funding": { "url": "https://github.com/sponsors/SuperchupuDev" - }, - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.4" } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/tinyglobby/node_modules/fdir": { @@ -5107,7 +5197,9 @@ "engines": { "node": ">=12" }, - "funding": "https://github.com/sponsors/jonschlinkert" + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/ts-api-utils": { "version": "2.5.0", @@ -5128,16 +5220,16 @@ "integrity": "sha512-4g3BLxfdTMy8iZG0MaBkadnlRrCJ74cQiFbyEVMrkwIoqdyaXXQM22cotDvrl4x28wgIZ9rEJRoM+mmhSJpJ1g==", "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.62.1", + "eslint-visitor-keys": "^5.0.0" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - }, - "dependencies": { - "eslint-visitor-keys": "^5.0.0", - "@typescript-eslint/types": "8.62.1" } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys/node_modules/@typescript-eslint/types": { @@ -5163,7 +5255,9 @@ "engines": { "node": "^20.19.0 || ^22.13.0 || >=24" }, - "funding": "https://opencollective.com/eslint" + "funding": { + "url": "https://opencollective.com/eslint" + } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/debug": { "version": "4.4.3", @@ -5171,12 +5265,12 @@ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=6.0" - }, "dependencies": { "ms": "^2.1.3" }, + "engines": { + "node": ">=6.0" + }, "peerDependenciesMeta": { "supports-color": { "optional": true @@ -5196,6 +5290,17 @@ "integrity": "sha512-xMcW9oP9u7fAMXYs9A65CVmtLQe2r//oXINHfi8HV+oiqhih17sbLdhXr4540YWlgpDKQdY854OL5ZrdCiQsAA==", "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.62.1", + "@typescript-eslint/tsconfig-utils": "8.62.1", + "@typescript-eslint/types": "8.62.1", + "@typescript-eslint/visitor-keys": "8.62.1", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -5203,17 +5308,6 @@ "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "dependencies": { - "debug": "^4.4.3", - "minimatch": "^10.2.2", - "semver": "^7.7.3", - "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.5.0", - "@typescript-eslint/project-service": "8.62.1", - "@typescript-eslint/tsconfig-utils": "8.62.1", - "@typescript-eslint/visitor-keys": "8.62.1", - "@typescript-eslint/types": "8.62.1" - }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } @@ -5224,6 +5318,11 @@ "integrity": "sha512-yQ3RgY5RkSBpsNS1Bx/JQEcA24FOSdfGktoyprAr5u18390UQdtVcfnEv4nIrIshNnavlVyZBKxQwT1fIAE6cg==", "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.62.1", + "@typescript-eslint/types": "^8.62.1", + "debug": "^4.4.3" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -5231,11 +5330,6 @@ "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "dependencies": { - "debug": "^4.4.3", - "@typescript-eslint/types": "^8.62.1", - "@typescript-eslint/tsconfig-utils": "^8.62.1" - }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } @@ -5277,12 +5371,12 @@ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=6.0" - }, "dependencies": { "ms": "^2.1.3" }, + "engines": { + "node": ">=6.0" + }, "peerDependenciesMeta": { "supports-color": { "optional": true @@ -5333,16 +5427,16 @@ "integrity": "sha512-4g3BLxfdTMy8iZG0MaBkadnlRrCJ74cQiFbyEVMrkwIoqdyaXXQM22cotDvrl4x28wgIZ9rEJRoM+mmhSJpJ1g==", "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.62.1", + "eslint-visitor-keys": "^5.0.0" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - }, - "dependencies": { - "eslint-visitor-keys": "^5.0.0", - "@typescript-eslint/types": "8.62.1" } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/visitor-keys/node_modules/@typescript-eslint/types": { @@ -5368,7 +5462,9 @@ "engines": { "node": "^20.19.0 || ^22.13.0 || >=24" }, - "funding": "https://opencollective.com/eslint" + "funding": { + "url": "https://opencollective.com/eslint" + } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/typescript-estree/node_modules/debug": { "version": "4.4.3", @@ -5376,12 +5472,12 @@ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=6.0" - }, "dependencies": { "ms": "^2.1.3" }, + "engines": { + "node": ">=6.0" + }, "peerDependenciesMeta": { "supports-color": { "optional": true @@ -5401,14 +5497,14 @@ "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", "dev": true, "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, "engines": { "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" - }, - "dependencies": { - "brace-expansion": "^5.0.5" } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch/node_modules/brace-expansion": { @@ -5417,11 +5513,11 @@ "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==", "dev": true, "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - }, "dependencies": { "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match": { @@ -5453,15 +5549,15 @@ "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", "dev": true, "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, "engines": { "node": ">=12.0.0" }, "funding": { "url": "https://github.com/sponsors/SuperchupuDev" - }, - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.4" } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/typescript-estree/node_modules/tinyglobby/node_modules/fdir": { @@ -5491,7 +5587,9 @@ "engines": { "node": ">=12" }, - "funding": "https://github.com/sponsors/jonschlinkert" + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/typescript-estree/node_modules/ts-api-utils": { "version": "2.5.0", @@ -5512,6 +5610,12 @@ "integrity": "sha512-sHtbPfuKNZCG+ih8SyjjucqRntSVmp8XgL5u6o9mAhiSn8ds5o/M/XdM0abweme2Tln3szOstOrZ9OXitvPh0g==", "dev": true, "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.62.1", + "@typescript-eslint/types": "8.62.1", + "@typescript-eslint/typescript-estree": "8.62.1" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -5519,12 +5623,6 @@ "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "dependencies": { - "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.62.1", - "@typescript-eslint/types": "8.62.1", - "@typescript-eslint/typescript-estree": "8.62.1" - }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" @@ -5536,12 +5634,14 @@ "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "funding": "https://opencollective.com/eslint", - "dependencies": { - "eslint-visitor-keys": "^3.4.3" + "funding": { + "url": "https://opencollective.com/eslint" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" @@ -5556,7 +5656,9 @@ "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "funding": "https://opencollective.com/eslint" + "funding": { + "url": "https://opencollective.com/eslint" + } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { "version": "8.62.1", @@ -5564,16 +5666,16 @@ "integrity": "sha512-r4d249KbQ1SFdpeStvob8Ih6aPPIzfqllPVOtvhve6ZcpuVcYo5/7zUWckKpHE7StASX4kTKZTLf0WQm/wPkcg==", "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.62.1", + "@typescript-eslint/visitor-keys": "8.62.1" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - }, - "dependencies": { - "@typescript-eslint/types": "8.62.1", - "@typescript-eslint/visitor-keys": "8.62.1" } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager/node_modules/@typescript-eslint/types": { @@ -5596,16 +5698,16 @@ "integrity": "sha512-4g3BLxfdTMy8iZG0MaBkadnlRrCJ74cQiFbyEVMrkwIoqdyaXXQM22cotDvrl4x28wgIZ9rEJRoM+mmhSJpJ1g==", "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.62.1", + "eslint-visitor-keys": "^5.0.0" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - }, - "dependencies": { - "eslint-visitor-keys": "^5.0.0", - "@typescript-eslint/types": "8.62.1" } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager/node_modules/@typescript-eslint/visitor-keys/node_modules/@typescript-eslint/types": { @@ -5631,7 +5733,9 @@ "engines": { "node": "^20.19.0 || ^22.13.0 || >=24" }, - "funding": "https://opencollective.com/eslint" + "funding": { + "url": "https://opencollective.com/eslint" + } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { "version": "8.62.1", @@ -5653,6 +5757,17 @@ "integrity": "sha512-xMcW9oP9u7fAMXYs9A65CVmtLQe2r//oXINHfi8HV+oiqhih17sbLdhXr4540YWlgpDKQdY854OL5ZrdCiQsAA==", "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.62.1", + "@typescript-eslint/tsconfig-utils": "8.62.1", + "@typescript-eslint/types": "8.62.1", + "@typescript-eslint/visitor-keys": "8.62.1", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -5660,17 +5775,6 @@ "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "dependencies": { - "debug": "^4.4.3", - "minimatch": "^10.2.2", - "semver": "^7.7.3", - "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.5.0", - "@typescript-eslint/project-service": "8.62.1", - "@typescript-eslint/tsconfig-utils": "8.62.1", - "@typescript-eslint/visitor-keys": "8.62.1", - "@typescript-eslint/types": "8.62.1" - }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } @@ -5681,6 +5785,11 @@ "integrity": "sha512-yQ3RgY5RkSBpsNS1Bx/JQEcA24FOSdfGktoyprAr5u18390UQdtVcfnEv4nIrIshNnavlVyZBKxQwT1fIAE6cg==", "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.62.1", + "@typescript-eslint/types": "^8.62.1", + "debug": "^4.4.3" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -5688,11 +5797,6 @@ "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "dependencies": { - "debug": "^4.4.3", - "@typescript-eslint/types": "^8.62.1", - "@typescript-eslint/tsconfig-utils": "^8.62.1" - }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } @@ -5734,12 +5838,12 @@ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=6.0" - }, "dependencies": { "ms": "^2.1.3" }, + "engines": { + "node": ">=6.0" + }, "peerDependenciesMeta": { "supports-color": { "optional": true @@ -5790,16 +5894,16 @@ "integrity": "sha512-4g3BLxfdTMy8iZG0MaBkadnlRrCJ74cQiFbyEVMrkwIoqdyaXXQM22cotDvrl4x28wgIZ9rEJRoM+mmhSJpJ1g==", "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.62.1", + "eslint-visitor-keys": "^5.0.0" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - }, - "dependencies": { - "eslint-visitor-keys": "^5.0.0", - "@typescript-eslint/types": "8.62.1" } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/visitor-keys/node_modules/@typescript-eslint/types": { @@ -5825,7 +5929,9 @@ "engines": { "node": "^20.19.0 || ^22.13.0 || >=24" }, - "funding": "https://opencollective.com/eslint" + "funding": { + "url": "https://opencollective.com/eslint" + } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/debug": { "version": "4.4.3", @@ -5833,12 +5939,12 @@ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=6.0" - }, "dependencies": { "ms": "^2.1.3" }, + "engines": { + "node": ">=6.0" + }, "peerDependenciesMeta": { "supports-color": { "optional": true @@ -5858,14 +5964,14 @@ "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", "dev": true, "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, "engines": { "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" - }, - "dependencies": { - "brace-expansion": "^5.0.5" } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch/node_modules/brace-expansion": { @@ -5874,11 +5980,11 @@ "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==", "dev": true, "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - }, "dependencies": { "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match": { @@ -5910,15 +6016,15 @@ "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", "dev": true, "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, "engines": { "node": ">=12.0.0" }, "funding": { "url": "https://github.com/sponsors/SuperchupuDev" - }, - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.4" } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/tinyglobby/node_modules/fdir": { @@ -5948,7 +6054,9 @@ "engines": { "node": ">=12" }, - "funding": "https://github.com/sponsors/jonschlinkert" + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/ts-api-utils": { "version": "2.5.0", @@ -5968,85 +6076,87 @@ "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.9.tgz", "integrity": "sha512-nE3/LEyc0z87uHYLZebqCUOaJr2hdtuPp7BQ4BosVFnfltxgAvMG08NyrSGlPpOUWvR27c5flSmYFTNr78L9GQ==", "dev": true, - "bin": { - "vitest": "./vitest.mjs" - }, - "engines": { - "node": "^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "funding": "https://opencollective.com/vitest", "dependencies": { + "@vitest/expect": "4.1.9", + "@vitest/mocker": "4.1.9", + "@vitest/pretty-format": "4.1.9", + "@vitest/runner": "4.1.9", + "@vitest/snapshot": "4.1.9", + "@vitest/spy": "4.1.9", + "@vitest/utils": "4.1.9", + "es-module-lexer": "^2.0.0", + "expect-type": "^1.3.0", + "magic-string": "^0.30.21", "obug": "^2.1.1", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", "pathe": "^2.0.3", - "std-env": "^4.0.0-rc.1", - "tinyexec": "^1.0.2", "picomatch": "^4.0.3", + "std-env": "^4.0.0-rc.1", "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", "tinyglobby": "^0.2.15", - "@vitest/spy": "4.1.9", - "expect-type": "^1.3.0", "tinyrainbow": "^3.1.0", - "magic-string": "^0.30.21", - "@vitest/utils": "4.1.9", - "@vitest/expect": "4.1.9", - "@vitest/mocker": "4.1.9", - "@vitest/runner": "4.1.9", - "es-module-lexer": "^2.0.0", - "@vitest/snapshot": "4.1.9", - "why-is-node-running": "^2.3.0", - "@vitest/pretty-format": "4.1.9" + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", - "jsdom": "*", - "happy-dom": "*", - "@vitest/ui": "4.1.9", - "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", - "@vitest/coverage-v8": "4.1.9", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.1.9", "@vitest/browser-preview": "4.1.9", + "@vitest/browser-webdriverio": "4.1.9", "@vitest/coverage-istanbul": "4.1.9", - "@vitest/browser-playwright": "4.1.9", - "@vitest/browser-webdriverio": "4.1.9" + "@vitest/coverage-v8": "4.1.9", + "@vitest/ui": "4.1.9", + "happy-dom": "*", + "jsdom": "*", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { - "vite": { - "optional": false + "@edge-runtime/vm": { + "optional": true }, - "jsdom": { + "@opentelemetry/api": { "optional": true }, - "happy-dom": { + "@types/node": { "optional": true }, - "@vitest/ui": { + "@vitest/browser-playwright": { "optional": true }, - "@types/node": { + "@vitest/browser-preview": { "optional": true }, - "@edge-runtime/vm": { + "@vitest/browser-webdriverio": { "optional": true }, - "@opentelemetry/api": { + "@vitest/coverage-istanbul": { "optional": true }, "@vitest/coverage-v8": { "optional": true }, - "@vitest/browser-preview": { + "@vitest/ui": { "optional": true }, - "@vitest/coverage-istanbul": { + "happy-dom": { "optional": true }, - "@vitest/browser-playwright": { + "jsdom": { "optional": true }, - "@vitest/browser-webdriverio": { - "optional": true + "vite": { + "optional": false } } }, @@ -6056,14 +6166,16 @@ "integrity": "sha512-vl/rYsUKcBr3SnQn166+XR5ZQcgMx3DQhFWdfli/cWpLnLUmbxZvyrJZotLFUryib+LtArYMSTJ5RbQ57ZqrlA==", "dev": true, "license": "MIT", - "funding": "https://opencollective.com/vitest", "dependencies": { - "chai": "^6.2.2", + "@standard-schema/spec": "^1.1.0", "@types/chai": "^5.2.2", "@vitest/spy": "4.1.9", - "tinyrainbow": "^3.1.0", "@vitest/utils": "4.1.9", - "@standard-schema/spec": "^1.1.0" + "chai": "^6.2.2", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, "node_modules/vitest/node_modules/@vitest/expect/node_modules/@standard-schema/spec": { @@ -6082,16 +6194,14 @@ "dependencies": { "@types/deep-eql": "*", "assertion-error": "^2.0.1" - }, - "peerDependencies": {} + } }, "node_modules/vitest/node_modules/@vitest/expect/node_modules/@types/chai/node_modules/@types/deep-eql": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", "dev": true, - "license": "MIT", - "dependencies": {} + "license": "MIT" }, "node_modules/vitest/node_modules/@vitest/expect/node_modules/@types/chai/node_modules/assertion-error": { "version": "2.0.1", @@ -6109,7 +6219,9 @@ "integrity": "sha512-fHpsS6mIi+PiEW+vcRVOMkX1oSaPKne3VOclSFICPcGOmfKgXPU5iAah+wcNcj2xPrCCmfq99IDGf+EojhhvhA==", "dev": true, "license": "MIT", - "funding": "https://opencollective.com/vitest" + "funding": { + "url": "https://opencollective.com/vitest" + } }, "node_modules/vitest/node_modules/@vitest/expect/node_modules/@vitest/utils": { "version": "4.1.9", @@ -6117,11 +6229,13 @@ "integrity": "sha512-A51o8ymO5PpqlWNnBP9ZHPXDIpuMtTLlGSjN7la4US+LJzoUMyhwjA5QXlm39JexgwHKW4Xjs8Z2d3dLCXOeuA==", "dev": true, "license": "MIT", - "funding": "https://opencollective.com/vitest", "dependencies": { - "tinyrainbow": "^3.1.0", + "@vitest/pretty-format": "4.1.9", "convert-source-map": "^2.0.0", - "@vitest/pretty-format": "4.1.9" + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, "node_modules/vitest/node_modules/@vitest/expect/node_modules/@vitest/utils/node_modules/@vitest/pretty-format": { @@ -6130,9 +6244,11 @@ "integrity": "sha512-s0iufns3iIFitdgm+YR7g1whCAaGtXz459VS9/PqyKDEEFgYIhsHOQmXgIgDuYCt7DeQmiZT0Qe2OA2p4ZPu5A==", "dev": true, "license": "MIT", - "funding": "https://opencollective.com/vitest", "dependencies": { "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, "node_modules/vitest/node_modules/@vitest/expect/node_modules/@vitest/utils/node_modules/@vitest/pretty-format/node_modules/tinyrainbow": { @@ -6187,11 +6303,13 @@ "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.9.tgz", "integrity": "sha512-EVkXzBjrPGM+cK8/ANWgBrkUCfJfb38/EfTSO8h7pWvKkyPkpWxvR7BkD2MyItMF62C97zAEoqdpUixwR/e+Rw==", "dev": true, - "funding": "https://opencollective.com/vitest", "dependencies": { "@vitest/spy": "4.1.9", - "magic-string": "^0.30.21", - "estree-walker": "^3.0.3" + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" }, "peerDependencies": { "msw": "^2.4.9", @@ -6212,7 +6330,9 @@ "integrity": "sha512-fHpsS6mIi+PiEW+vcRVOMkX1oSaPKne3VOclSFICPcGOmfKgXPU5iAah+wcNcj2xPrCCmfq99IDGf+EojhhvhA==", "dev": true, "license": "MIT", - "funding": "https://opencollective.com/vitest" + "funding": { + "url": "https://opencollective.com/vitest" + } }, "node_modules/vitest/node_modules/@vitest/mocker/node_modules/estree-walker": { "version": "3.0.3", @@ -6229,9 +6349,7 @@ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", "dev": true, - "license": "MIT", - "dependencies": {}, - "peerDependencies": {} + "license": "MIT" }, "node_modules/vitest/node_modules/@vitest/mocker/node_modules/magic-string": { "version": "0.30.21", @@ -6256,9 +6374,11 @@ "integrity": "sha512-s0iufns3iIFitdgm+YR7g1whCAaGtXz459VS9/PqyKDEEFgYIhsHOQmXgIgDuYCt7DeQmiZT0Qe2OA2p4ZPu5A==", "dev": true, "license": "MIT", - "funding": "https://opencollective.com/vitest", "dependencies": { "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, "node_modules/vitest/node_modules/@vitest/pretty-format/node_modules/tinyrainbow": { @@ -6277,10 +6397,12 @@ "integrity": "sha512-KXLMDtc7oe70+3mJfGrPUWPesswH+3sTxAMAMl8DG7I8IUQT4XW718dY5ID3vPUcmlu27CcKfY4P3h3I29SLJg==", "dev": true, "license": "MIT", - "funding": "https://opencollective.com/vitest", "dependencies": { - "pathe": "^2.0.3", - "@vitest/utils": "4.1.9" + "@vitest/utils": "4.1.9", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, "node_modules/vitest/node_modules/@vitest/runner/node_modules/@vitest/utils": { @@ -6289,11 +6411,13 @@ "integrity": "sha512-A51o8ymO5PpqlWNnBP9ZHPXDIpuMtTLlGSjN7la4US+LJzoUMyhwjA5QXlm39JexgwHKW4Xjs8Z2d3dLCXOeuA==", "dev": true, "license": "MIT", - "funding": "https://opencollective.com/vitest", "dependencies": { - "tinyrainbow": "^3.1.0", + "@vitest/pretty-format": "4.1.9", "convert-source-map": "^2.0.0", - "@vitest/pretty-format": "4.1.9" + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, "node_modules/vitest/node_modules/@vitest/runner/node_modules/@vitest/utils/node_modules/@vitest/pretty-format": { @@ -6302,9 +6426,11 @@ "integrity": "sha512-s0iufns3iIFitdgm+YR7g1whCAaGtXz459VS9/PqyKDEEFgYIhsHOQmXgIgDuYCt7DeQmiZT0Qe2OA2p4ZPu5A==", "dev": true, "license": "MIT", - "funding": "https://opencollective.com/vitest", "dependencies": { "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, "node_modules/vitest/node_modules/@vitest/runner/node_modules/@vitest/utils/node_modules/@vitest/pretty-format/node_modules/tinyrainbow": { @@ -6347,12 +6473,14 @@ "integrity": "sha512-Jc7RKGNBo8Z28WYIm0Niej4xdSPByRf6mU58VpHQkd6Zh05rlnA+twjbK5HyeIGHxrzsc3mJgS43uM0CZKzaIA==", "dev": true, "license": "MIT", - "funding": "https://opencollective.com/vitest", "dependencies": { - "pathe": "^2.0.3", - "magic-string": "^0.30.21", + "@vitest/pretty-format": "4.1.9", "@vitest/utils": "4.1.9", - "@vitest/pretty-format": "4.1.9" + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, "node_modules/vitest/node_modules/@vitest/snapshot/node_modules/@vitest/pretty-format": { @@ -6361,9 +6489,11 @@ "integrity": "sha512-s0iufns3iIFitdgm+YR7g1whCAaGtXz459VS9/PqyKDEEFgYIhsHOQmXgIgDuYCt7DeQmiZT0Qe2OA2p4ZPu5A==", "dev": true, "license": "MIT", - "funding": "https://opencollective.com/vitest", "dependencies": { "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, "node_modules/vitest/node_modules/@vitest/snapshot/node_modules/@vitest/pretty-format/node_modules/tinyrainbow": { @@ -6382,11 +6512,13 @@ "integrity": "sha512-A51o8ymO5PpqlWNnBP9ZHPXDIpuMtTLlGSjN7la4US+LJzoUMyhwjA5QXlm39JexgwHKW4Xjs8Z2d3dLCXOeuA==", "dev": true, "license": "MIT", - "funding": "https://opencollective.com/vitest", "dependencies": { - "tinyrainbow": "^3.1.0", + "@vitest/pretty-format": "4.1.9", "convert-source-map": "^2.0.0", - "@vitest/pretty-format": "4.1.9" + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, "node_modules/vitest/node_modules/@vitest/snapshot/node_modules/@vitest/utils/node_modules/@vitest/pretty-format": { @@ -6395,9 +6527,11 @@ "integrity": "sha512-s0iufns3iIFitdgm+YR7g1whCAaGtXz459VS9/PqyKDEEFgYIhsHOQmXgIgDuYCt7DeQmiZT0Qe2OA2p4ZPu5A==", "dev": true, "license": "MIT", - "funding": "https://opencollective.com/vitest", "dependencies": { "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, "node_modules/vitest/node_modules/@vitest/snapshot/node_modules/@vitest/utils/node_modules/@vitest/pretty-format/node_modules/tinyrainbow": { @@ -6457,7 +6591,9 @@ "integrity": "sha512-fHpsS6mIi+PiEW+vcRVOMkX1oSaPKne3VOclSFICPcGOmfKgXPU5iAah+wcNcj2xPrCCmfq99IDGf+EojhhvhA==", "dev": true, "license": "MIT", - "funding": "https://opencollective.com/vitest" + "funding": { + "url": "https://opencollective.com/vitest" + } }, "node_modules/vitest/node_modules/@vitest/utils": { "version": "4.1.9", @@ -6465,11 +6601,13 @@ "integrity": "sha512-A51o8ymO5PpqlWNnBP9ZHPXDIpuMtTLlGSjN7la4US+LJzoUMyhwjA5QXlm39JexgwHKW4Xjs8Z2d3dLCXOeuA==", "dev": true, "license": "MIT", - "funding": "https://opencollective.com/vitest", "dependencies": { - "tinyrainbow": "^3.1.0", + "@vitest/pretty-format": "4.1.9", "convert-source-map": "^2.0.0", - "@vitest/pretty-format": "4.1.9" + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, "node_modules/vitest/node_modules/@vitest/utils/node_modules/@vitest/pretty-format": { @@ -6478,9 +6616,11 @@ "integrity": "sha512-s0iufns3iIFitdgm+YR7g1whCAaGtXz459VS9/PqyKDEEFgYIhsHOQmXgIgDuYCt7DeQmiZT0Qe2OA2p4ZPu5A==", "dev": true, "license": "MIT", - "funding": "https://opencollective.com/vitest", "dependencies": { "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, "node_modules/vitest/node_modules/@vitest/utils/node_modules/@vitest/pretty-format/node_modules/tinyrainbow": { @@ -6549,14 +6689,14 @@ "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.3.tgz", "integrity": "sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.20.0" - }, "funding": [ "https://github.com/sponsors/sxzz", "https://opencollective.com/debug" - ] + ], + "license": "MIT", + "engines": { + "node": ">=12.20.0" + } }, "node_modules/vitest/node_modules/pathe": { "version": "2.0.3", @@ -6574,7 +6714,9 @@ "engines": { "node": ">=12" }, - "funding": "https://github.com/sponsors/jonschlinkert" + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, "node_modules/vitest/node_modules/std-env": { "version": "4.1.0", @@ -6606,15 +6748,15 @@ "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", "dev": true, "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, "engines": { "node": ">=12.0.0" }, "funding": { "url": "https://github.com/sponsors/SuperchupuDev" - }, - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.4" } }, "node_modules/vitest/node_modules/tinyglobby/node_modules/fdir": { @@ -6644,7 +6786,9 @@ "engines": { "node": ">=12" }, - "funding": "https://github.com/sponsors/jonschlinkert" + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, "node_modules/vitest/node_modules/tinyrainbow": { "version": "3.1.0", @@ -6661,72 +6805,74 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-8.1.0.tgz", "integrity": "sha512-BuJcQK/56NQTWDGn4ABea3q4SSBdNPWwNZKTkkUpcMPnLoquSYH8llRtSUIgoL1KSCpHt5eghLShn50mH36y7Q==", "dev": true, + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.4", + "postcss": "^8.5.15", + "rolldown": "~1.1.2", + "tinyglobby": "^0.2.17" + }, "bin": { "vite": "bin/vite.js" }, "engines": { "node": "^20.19.0 || >=22.12.0" }, - "funding": "https://github.com/vitejs/vite?sponsor=1", - "dependencies": { - "postcss": "^8.5.15", - "rolldown": "~1.1.2", - "picomatch": "^4.0.4", - "tinyglobby": "^0.2.17", - "lightningcss": "^1.32.0" + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { - "tsx": "^4.8.1", + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.3.0", + "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", - "yaml": "^2.4.2", + "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", - "terser": "^5.16.0", - "esbuild": "^0.27.0 || ^0.28.0", "sugarss": "^5.0.0", - "@types/node": "^20.19.0 || >=22.12.0", - "sass-embedded": "^1.70.0", - "@vitejs/devtools": "^0.3.0" + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { - "tsx": { + "@types/node": { "optional": true }, - "jiti": { + "@vitejs/devtools": { "optional": true }, - "less": { + "esbuild": { "optional": true }, - "sass": { + "jiti": { "optional": true }, - "yaml": { + "less": { "optional": true }, - "stylus": { + "sass": { "optional": true }, - "terser": { + "sass-embedded": { "optional": true }, - "esbuild": { + "stylus": { "optional": true }, "sugarss": { "optional": true }, - "@types/node": { + "terser": { "optional": true }, - "sass-embedded": { + "tsx": { "optional": true }, - "@vitejs/devtools": { + "yaml": { "optional": true } } @@ -6736,14 +6882,14 @@ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, - "optional": true, "license": "MIT", - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - }, + "optional": true, "os": [ "darwin" - ] + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } }, "node_modules/vitest/node_modules/vite/node_modules/lightningcss": { "version": "1.32.0", @@ -6751,6 +6897,9 @@ "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", "dev": true, "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, "engines": { "node": ">= 12.0.0" }, @@ -6758,21 +6907,18 @@ "type": "opencollective", "url": "https://opencollective.com/parcel" }, - "dependencies": { - "detect-libc": "^2.0.3" - }, "optionalDependencies": { - "lightningcss-darwin-x64": "1.32.0", - "lightningcss-linux-x64-gnu": "1.32.0", - "lightningcss-win32-x64-msvc": "1.32.0", - "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-android-arm64": "1.32.0", "lightningcss-darwin-arm64": "1.32.0", - "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", "lightningcss-linux-x64-musl": "1.32.0", - "lightningcss-freebsd-x64": "1.32.0", - "lightningcss-android-arm64": "1.32.0" + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" } }, "node_modules/vitest/node_modules/vite/node_modules/lightningcss/node_modules/detect-libc": { @@ -6789,244 +6935,232 @@ "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], "dev": true, - "optional": true, "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], "engines": { "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - }, - "cpu": [ - "arm64" - ], - "os": [ - "android" - ] + } }, "node_modules/vitest/node_modules/vite/node_modules/lightningcss/node_modules/lightningcss-darwin-arm64": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], "dev": true, - "optional": true, "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], "engines": { "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - }, - "cpu": [ - "arm64" - ], - "os": [ - "darwin" - ] + } }, "node_modules/vitest/node_modules/vite/node_modules/lightningcss/node_modules/lightningcss-darwin-x64": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], "dev": true, - "optional": true, "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], "engines": { "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - }, - "cpu": [ - "x64" - ], - "os": [ - "darwin" - ] + } }, "node_modules/vitest/node_modules/vite/node_modules/lightningcss/node_modules/lightningcss-freebsd-x64": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], "dev": true, - "optional": true, "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], "engines": { "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - }, - "cpu": [ - "x64" - ], - "os": [ - "freebsd" - ] + } }, "node_modules/vitest/node_modules/vite/node_modules/lightningcss/node_modules/lightningcss-linux-arm-gnueabihf": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], "dev": true, - "optional": true, "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - }, - "cpu": [ - "arm" - ], - "os": [ - "linux" - ] + } }, "node_modules/vitest/node_modules/vite/node_modules/lightningcss/node_modules/lightningcss-linux-arm64-gnu": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], "dev": true, - "optional": true, "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - }, - "cpu": [ - "arm64" - ], - "os": [ - "linux" - ], - "libc": [ - "glibc" - ] + } }, "node_modules/vitest/node_modules/vite/node_modules/lightningcss/node_modules/lightningcss-linux-arm64-musl": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], "dev": true, - "optional": true, "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - }, - "cpu": [ - "arm64" - ], - "os": [ - "linux" - ], - "libc": [ - "musl" - ] + } }, "node_modules/vitest/node_modules/vite/node_modules/lightningcss/node_modules/lightningcss-linux-x64-gnu": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], "dev": true, - "optional": true, "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - }, - "cpu": [ - "x64" - ], - "os": [ - "linux" - ], - "libc": [ - "glibc" - ] + } }, "node_modules/vitest/node_modules/vite/node_modules/lightningcss/node_modules/lightningcss-linux-x64-musl": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], "dev": true, - "optional": true, "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - }, - "cpu": [ - "x64" - ], - "os": [ - "linux" - ], - "libc": [ - "musl" - ] + } }, "node_modules/vitest/node_modules/vite/node_modules/lightningcss/node_modules/lightningcss-win32-arm64-msvc": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], "dev": true, - "optional": true, "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], "engines": { "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - }, - "cpu": [ - "arm64" - ], - "os": [ - "win32" - ] + } }, "node_modules/vitest/node_modules/vite/node_modules/lightningcss/node_modules/lightningcss-win32-x64-msvc": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], "dev": true, - "optional": true, "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], "engines": { "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - }, - "cpu": [ - "x64" - ], - "os": [ - "win32" - ] + } }, "node_modules/vitest/node_modules/vite/node_modules/picomatch": { "version": "4.0.4", @@ -7037,35 +7171,37 @@ "engines": { "node": ">=12" }, - "funding": "https://github.com/sponsors/jonschlinkert" + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, "node_modules/vitest/node_modules/vite/node_modules/postcss": { "version": "8.5.16", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.16.tgz", "integrity": "sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==", "dev": true, - "license": "MIT", - "engines": { - "node": "^10 || ^12 || >=14" - }, "funding": [ { - "url": "https://opencollective.com/postcss/", - "type": "opencollective" + "type": "opencollective", + "url": "https://opencollective.com/postcss/" }, { - "url": "https://tidelift.com/funding/github/npm/postcss", - "type": "tidelift" + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" }, { - "url": "https://github.com/sponsors/ai", - "type": "github" + "type": "github", + "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "nanoid": "^3.3.12", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" } }, "node_modules/vitest/node_modules/vite/node_modules/postcss/node_modules/nanoid": { @@ -7073,19 +7209,19 @@ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.15.tgz", "integrity": "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, "engines": { "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - }, - "funding": [ - { - "url": "https://github.com/sponsors/ai", - "type": "github" - } - ] + } }, "node_modules/vitest/node_modules/vite/node_modules/postcss/node_modules/picocolors": { "version": "1.1.1", @@ -7110,32 +7246,32 @@ "integrity": "sha512-1F1eEtUBtFvcGm1HQ9TiUIUHPQG7mSAODrhIzjxoUEFuo8OcbrGLiVLkevNgj84TE4lnHvnumwFjhJO5Eu135g==", "dev": true, "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.137.0", + "@rolldown/pluginutils": "^1.0.0" + }, "bin": { - "rolldown": "./bin/cli.mjs" + "rolldown": "bin/cli.mjs" }, "engines": { "node": "^20.19.0 || >=22.12.0" }, - "dependencies": { - "@oxc-project/types": "=0.137.0", - "@rolldown/pluginutils": "^1.0.0" - }, "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.1.3", + "@rolldown/binding-darwin-arm64": "1.1.3", "@rolldown/binding-darwin-x64": "1.1.3", - "@rolldown/binding-win32-x64-msvc": "1.1.3", - "@rolldown/binding-linux-x64-gnu": "1.1.3", - "@rolldown/binding-linux-x64-musl": "1.1.3", "@rolldown/binding-freebsd-x64": "1.1.3", "@rolldown/binding-linux-arm-gnueabihf": "1.1.3", "@rolldown/binding-linux-arm64-gnu": "1.1.3", - "@rolldown/binding-darwin-arm64": "1.1.3", "@rolldown/binding-linux-arm64-musl": "1.1.3", + "@rolldown/binding-linux-ppc64-gnu": "1.1.3", + "@rolldown/binding-linux-s390x-gnu": "1.1.3", + "@rolldown/binding-linux-x64-gnu": "1.1.3", + "@rolldown/binding-linux-x64-musl": "1.1.3", "@rolldown/binding-openharmony-arm64": "1.1.3", - "@rolldown/binding-win32-arm64-msvc": "1.1.3", - "@rolldown/binding-android-arm64": "1.1.3", "@rolldown/binding-wasm32-wasi": "1.1.3", - "@rolldown/binding-linux-s390x-gnu": "1.1.3", - "@rolldown/binding-linux-ppc64-gnu": "1.1.3" + "@rolldown/binding-win32-arm64-msvc": "1.1.3", + "@rolldown/binding-win32-x64-msvc": "1.1.3" } }, "node_modules/vitest/node_modules/vite/node_modules/rolldown/node_modules/@oxc-project/types": { @@ -7152,249 +7288,231 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.3.tgz", "integrity": "sha512-DT6Z3PhvioeHMvxo+xHc3KtqggrI7CCTXCmC2h/5zUlp5jVitv7XEy+9q5/7v8IolhlioawpMo8Kg0EEBy7J0g==", - "dev": true, - "optional": true, - "license": "MIT", - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, "cpu": [ "arm64" ], + "dev": true, + "license": "MIT", + "optional": true, "os": [ "android" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, "node_modules/vitest/node_modules/vite/node_modules/rolldown/node_modules/@rolldown/binding-darwin-arm64": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.3.tgz", "integrity": "sha512-0NwgwsjM7LrsuVnXMK3koTpagBNOhloc/BNjKqZjv4V5zI5r13qx69uVhRx+o5Z0yy4Hzq+lpy7TAgUG/ocvrw==", - "dev": true, - "optional": true, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, "cpu": [ "arm64" ], + "dev": true, + "optional": true, "os": [ "darwin" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, "node_modules/vitest/node_modules/vite/node_modules/rolldown/node_modules/@rolldown/binding-darwin-x64": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.3.tgz", "integrity": "sha512-YtiBp4disu6V560loT6PjMdiRaWmVvDNrUunAalbiFx2ggeJwxdAsgZMcoGP17uyAsTwAj5V1niksxlHnVQ1Sw==", - "dev": true, - "optional": true, - "license": "MIT", - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, "cpu": [ "x64" ], + "dev": true, + "license": "MIT", + "optional": true, "os": [ "darwin" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, "node_modules/vitest/node_modules/vite/node_modules/rolldown/node_modules/@rolldown/binding-freebsd-x64": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.3.tgz", "integrity": "sha512-yD3EkEdXk2LypPxnf/kSZHirarsI8gcPzc62SukhR9VJTyvV+F9Q/GxWNuCojc7sXyuVC4DxRGhdDK4X8VSsbw==", - "dev": true, - "optional": true, - "license": "MIT", - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, "cpu": [ "x64" ], + "dev": true, + "license": "MIT", + "optional": true, "os": [ "freebsd" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, "node_modules/vitest/node_modules/vite/node_modules/rolldown/node_modules/@rolldown/binding-linux-arm-gnueabihf": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.3.tgz", "integrity": "sha512-c+8vieQbsD7HNAHKIA34w0GJ9FedFFuJGD+7E6vz7Q3uqAIugL5p45fhlsj4UaAsHpcmlqugBWMhA0/j7o0sIg==", - "dev": true, - "optional": true, - "license": "MIT", - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, "cpu": [ "arm" ], + "dev": true, + "license": "MIT", + "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, "node_modules/vitest/node_modules/vite/node_modules/rolldown/node_modules/@rolldown/binding-linux-arm64-gnu": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.3.tgz", "integrity": "sha512-50jD0uUwLvur7Zz9LHz17kaAdTPjn5wN93hEgjvmYFRZwiR7ZJYovTd5ipyWJDAnXKvZ+wgc+/Ika6dwSF5OcA==", - "dev": true, - "optional": true, - "license": "MIT", - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, "cpu": [ "arm64" ], + "dev": true, + "license": "MIT", + "optional": true, "os": [ "linux" ], - "libc": [ - "glibc" - ] + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, "node_modules/vitest/node_modules/vite/node_modules/rolldown/node_modules/@rolldown/binding-linux-arm64-musl": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.3.tgz", "integrity": "sha512-BO9+oPL8K9poZJBfYPsXNtYjPE5uM3qeehT3aFcW4LITOl+iSqhp0abzjR2nWBUNjIZeKXjAEWBZ64WjNoHd6w==", - "dev": true, - "optional": true, - "license": "MIT", - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, "cpu": [ "arm64" ], + "dev": true, + "license": "MIT", + "optional": true, "os": [ "linux" ], - "libc": [ - "musl" - ] + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, "node_modules/vitest/node_modules/vite/node_modules/rolldown/node_modules/@rolldown/binding-linux-ppc64-gnu": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.3.tgz", "integrity": "sha512-f3VpLB1vQ0Eo6ecr/6cekLnvYMFF4YBFoVGkfkvPLq1bAkbAwHYQPZKoAmG6OJyTcxxoC+AvezGx/S1obNC0Mw==", - "dev": true, - "optional": true, - "license": "MIT", - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, "cpu": [ "ppc64" ], + "dev": true, + "license": "MIT", + "optional": true, "os": [ "linux" ], - "libc": [ - "glibc" - ] + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, "node_modules/vitest/node_modules/vite/node_modules/rolldown/node_modules/@rolldown/binding-linux-s390x-gnu": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.3.tgz", "integrity": "sha512-AmurZ26Pqx/RI9N1gzEOCklkKXl927yjfXWUUS0O7Puh8ARM/Ob8qfrD3qnWksScdw6cSrW5PSHE9DyLu7+PtA==", - "dev": true, - "optional": true, - "license": "MIT", - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, "cpu": [ "s390x" ], + "dev": true, + "license": "MIT", + "optional": true, "os": [ "linux" ], - "libc": [ - "glibc" - ] + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, "node_modules/vitest/node_modules/vite/node_modules/rolldown/node_modules/@rolldown/binding-linux-x64-gnu": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.3.tgz", "integrity": "sha512-JJpqs8bRGITDOdbkNKnlojzBabbOHrqjSvDr0IVsZObE1lBcPjxItUEY9eWIDbxaJ3cGrXPWGfGkIxFijg/URg==", - "dev": true, - "optional": true, - "license": "MIT", - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, "cpu": [ "x64" ], + "dev": true, + "license": "MIT", + "optional": true, "os": [ "linux" ], - "libc": [ - "glibc" - ] + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, "node_modules/vitest/node_modules/vite/node_modules/rolldown/node_modules/@rolldown/binding-linux-x64-musl": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.3.tgz", "integrity": "sha512-rSJcdjPxzA/by/6/rYs+v+bXU7UjvnbUWz8MJb6kh6+knqB1dCrtHg0uu7C/4haqJvqdkYHQ5IGn+tCH9GLW/g==", - "dev": true, - "optional": true, - "license": "MIT", - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, "cpu": [ "x64" ], + "dev": true, + "license": "MIT", + "optional": true, "os": [ "linux" ], - "libc": [ - "musl" - ] + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, "node_modules/vitest/node_modules/vite/node_modules/rolldown/node_modules/@rolldown/binding-openharmony-arm64": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.3.tgz", "integrity": "sha512-hQ3/PYkDJICgevvyNcVrihVeqq7k1Pp3VZ9lY+dauAYUJKO+auqApvANhvR1An9BhmqYKvW2Mu1F9u4DXSMLxQ==", - "dev": true, - "optional": true, - "license": "MIT", - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, "cpu": [ "arm64" ], + "dev": true, + "license": "MIT", + "optional": true, "os": [ "openharmony" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, "node_modules/vitest/node_modules/vite/node_modules/rolldown/node_modules/@rolldown/binding-wasm32-wasi": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.3.tgz", "integrity": "sha512-Elcv/BtML9lXrV6JuKITc/grN2kYV9gjsQpW8Jfw4ioK0TOkjBjye0nnyqQNy9STNaI20lXNaQBRrD5gSgR0Yg==", + "cpu": [ + "wasm32" + ], "dev": true, - "optional": true, "license": "MIT", - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, + "optional": true, "dependencies": { - "@napi-rs/wasm-runtime": "^1.1.6", "@emnapi/core": "1.11.1", - "@emnapi/runtime": "1.11.1" + "@emnapi/runtime": "1.11.1", + "@napi-rs/wasm-runtime": "^1.1.6" }, - "cpu": [ - "wasm32" - ] + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, "node_modules/vitest/node_modules/vite/node_modules/rolldown/node_modules/@rolldown/binding-wasm32-wasi/node_modules/@emnapi/core": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==", "dev": true, - "optional": true, "license": "MIT", + "optional": true, "dependencies": { "@emnapi/wasi-threads": "1.2.2", "tslib": "^2.4.0" @@ -7405,8 +7523,8 @@ "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", "dev": true, - "optional": true, "license": "MIT", + "optional": true, "dependencies": { "tslib": "^2.4.0" } @@ -7416,24 +7534,24 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, - "optional": true, - "license": "0BSD" + "license": "0BSD", + "optional": true }, "node_modules/vitest/node_modules/vite/node_modules/rolldown/node_modules/@rolldown/binding-wasm32-wasi/node_modules/@emnapi/core/node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, - "optional": true, - "license": "0BSD" + "license": "0BSD", + "optional": true }, "node_modules/vitest/node_modules/vite/node_modules/rolldown/node_modules/@rolldown/binding-wasm32-wasi/node_modules/@emnapi/runtime": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", "dev": true, - "optional": true, "license": "MIT", + "optional": true, "dependencies": { "tslib": "^2.4.0" } @@ -7443,23 +7561,23 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, - "optional": true, - "license": "0BSD" + "license": "0BSD", + "optional": true }, "node_modules/vitest/node_modules/vite/node_modules/rolldown/node_modules/@rolldown/binding-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", "integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==", "dev": true, - "optional": true, "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.3" + }, "funding": { "type": "github", "url": "https://github.com/sponsors/Brooooooklyn" }, - "dependencies": { - "@tybys/wasm-util": "^0.10.3" - }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" @@ -7470,8 +7588,8 @@ "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", "dev": true, - "optional": true, "license": "MIT", + "optional": true, "dependencies": { "tslib": "^2.4.0" } @@ -7481,42 +7599,42 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, - "optional": true, - "license": "0BSD" + "license": "0BSD", + "optional": true }, "node_modules/vitest/node_modules/vite/node_modules/rolldown/node_modules/@rolldown/binding-win32-arm64-msvc": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.3.tgz", "integrity": "sha512-2DrEfhluH9yhiaFApmsjsjwrSYbNcY1oFTzYSP1a535jDbV98zCFanA/96TBUd0iDFcxGmw9QRExwGCXz3U+/g==", - "dev": true, - "optional": true, - "license": "MIT", - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, "cpu": [ "arm64" ], + "dev": true, + "license": "MIT", + "optional": true, "os": [ "win32" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, "node_modules/vitest/node_modules/vite/node_modules/rolldown/node_modules/@rolldown/binding-win32-x64-msvc": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.3.tgz", "integrity": "sha512-OL4OMk7UPXOeVGGd3qo5zJyPIljf4AFgk5QAkPPS+OoLuOOozhuaQGC18MxVTnw/06q93gShAJzlwnSCY9YtqA==", - "dev": true, - "optional": true, - "license": "MIT", - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, "cpu": [ "x64" ], + "dev": true, + "license": "MIT", + "optional": true, "os": [ "win32" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, "node_modules/vitest/node_modules/vite/node_modules/rolldown/node_modules/@rolldown/pluginutils": { "version": "1.0.1", @@ -7531,15 +7649,15 @@ "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", "dev": true, "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, "engines": { "node": ">=12.0.0" }, "funding": { "url": "https://github.com/sponsors/SuperchupuDev" - }, - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.4" } }, "node_modules/vitest/node_modules/vite/node_modules/tinyglobby/node_modules/fdir": { @@ -7569,7 +7687,9 @@ "engines": { "node": ">=12" }, - "funding": "https://github.com/sponsors/jonschlinkert" + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, "node_modules/vitest/node_modules/why-is-node-running": { "version": "2.3.0", @@ -7577,15 +7697,15 @@ "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", "dev": true, "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, "bin": { "why-is-node-running": "cli.js" }, "engines": { "node": ">=8" - }, - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" } }, "node_modules/vitest/node_modules/why-is-node-running/node_modules/siginfo": { @@ -7593,8 +7713,7 @@ "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", "dev": true, - "license": "ISC", - "dependencies": {} + "license": "ISC" }, "node_modules/vitest/node_modules/why-is-node-running/node_modules/stackback": { "version": "0.0.2", diff --git a/council/ts/src/cli/index.test.ts b/council/ts/src/cli/index.test.ts index bcb3539..45971b1 100644 --- a/council/ts/src/cli/index.test.ts +++ b/council/ts/src/cli/index.test.ts @@ -22,6 +22,12 @@ import type { import type { ClockPort, LiveRunArtifacts, WorkerResult } from '../ports/index.js' import type { Task } from '../shared-kernel/index.js' import type { + MonitorListInput, + MonitorListResult, + MonitorStartInput, + MonitorStartResult, + MonitorStatusInput, + MonitorStatusResult, StatusWatchTickerPort, TailWorkflowFrame, TailWorkflowLogReadInput, @@ -58,6 +64,9 @@ type AppCall = | { readonly input: SuperviseInput; readonly method: 'supervise' } | { readonly input: CouncilAppTailInput; readonly method: 'tail' } | { readonly input: TriageWorkflowInput; readonly method: 'triage' } + | { readonly input: MonitorStartInput; readonly method: 'monitor' } + | { readonly input: MonitorStatusInput; readonly method: 'monitorStatus' } + | { readonly input: MonitorListInput; readonly method: 'monitorList' } interface RecordingAppOptions { readonly configError?: Error @@ -148,6 +157,34 @@ class RecordingApp { this.calls.push({ input, method: 'triage' }) return Promise.resolve({ input, method: 'triage', route: 'program' }) } + + monitor(input: MonitorStartInput): Promise { + this.calls.push({ input, method: 'monitor' }) + return Promise.resolve({ status: 'passed', lastOutput: 'done' }) + } + + monitorStatus(input: MonitorStatusInput): Promise { + this.calls.push({ input, method: 'monitorStatus' }) + return Promise.resolve({ + state: { + name: input.name, + status: 'polling', + startedAt: '2026-01-01T00:00:00.000Z', + deadline: '2026-01-01T01:00:00.000Z', + lastTickAt: '2026-01-01T00:00:00.000Z', + lastOutput: '', + intervalMs: 5000, + cmd: 'echo', + until: 'done', + then: '', + }, + }) + } + + monitorList(input: MonitorListInput): Promise { + this.calls.push({ input, method: 'monitorList' }) + return Promise.resolve({ monitors: [] }) + } } function asCouncilApp(app: RecordingApp): CouncilApp { @@ -1316,3 +1353,92 @@ describe('runCli error handling', () => { }) }) }) + +describe('monitor command', () => { + it('routes monitor start through the app', async () => { + const app = new RecordingApp() + const result = await runCli( + [ + 'monitor', + 'start', + '--name', 'test-monitor', + '--interval', '5s', + '--deadline', '60s', + '--cmd', 'echo hello', + '--until', 'hello', + '--then', 'echo done', + '--exec-dir', '/tmp/exec', + ], + injectedRuntime(app), + ) + expect(result.exitCode).toBe(0) + expect(app.calls).toEqual([ + { + method: 'monitor', + input: { + name: 'test-monitor', + interval: '5s', + deadline: '60s', + cmd: 'echo hello', + until: 'hello', + then: 'echo done', + execDir: '/tmp/exec', + }, + }, + ]) + }) + + it('routes monitor status through the app', async () => { + const app = new RecordingApp() + const result = await runCli( + [ + 'monitor', + 'status', + '--name', 'test-monitor', + '--exec-dir', '/tmp/exec', + ], + injectedRuntime(app), + ) + expect(result.exitCode).toBe(0) + expect(app.calls).toEqual([ + { + method: 'monitorStatus', + input: { name: 'test-monitor', execDir: '/tmp/exec' }, + }, + ]) + }) + + it('routes monitor list through the app', async () => { + const app = new RecordingApp() + const result = await runCli( + [ + 'monitor', + 'list', + '--exec-dir', '/tmp/exec', + ], + injectedRuntime(app), + ) + expect(result.exitCode).toBe(0) + expect(app.calls).toEqual([ + { + method: 'monitorList', + input: { execDir: '/tmp/exec' }, + }, + ]) + }) + + it('fails when monitor has no subcommand', async () => { + const result = await runCli(['monitor'], injectedRuntime()) + expect(result.exitCode).toBe(2) + expect(result.stderr).toContain('monitor requires subcommand') + }) + + it('fails when monitor start is missing required flags', async () => { + const result = await runCli( + ['monitor', 'start', '--name', 'test'], + injectedRuntime(), + ) + expect(result.exitCode).toBe(2) + expect(result.stderr).toContain('--interval is required') + }) +}) diff --git a/council/ts/src/cli/index.ts b/council/ts/src/cli/index.ts index 31b29c8..f0ae771 100644 --- a/council/ts/src/cli/index.ts +++ b/council/ts/src/cli/index.ts @@ -16,6 +16,7 @@ import { import type { CouncilConfig } from '../contexts/config/index.js' import type { WorkerOutputStream } from '../contexts/runstore/index.js' import type { DagConcurrency, DagEvalConfig } from '../ports/index.js' +import type { MonitorStartInput, MonitorStatusInput, MonitorListInput } from '../workflows/index.js' export type CliCommand = | 'amend' @@ -39,6 +40,7 @@ export type CliCommand = | 'sync-skills' | 'tail' | 'triage' + | 'monitor' export interface CliResult { readonly exitCode: number @@ -78,6 +80,7 @@ const COMMANDS: readonly CommandSpec[] = [ { help: 'synchronize council skills', name: 'sync-skills' }, { help: 'tail one task log', name: 'tail' }, { help: 'run the triage gate and emit routing payload', name: 'triage' }, + { help: 'poll a probe until a condition is met, then run a finalizer', name: 'monitor' }, ] export function commandRegistry(): readonly CommandSpec[] { @@ -126,6 +129,8 @@ export async function runCli(argv: readonly string[], runtime: CliRuntime = {}): return okJson(await app.supervise(parseSupervise(rest))) case 'tail': return await runTailCommand(app, parseTail(rest)) + case 'monitor': + return await runMonitorCommand(app, parseMonitor(rest)) case 'design': case 'amend': case 'context': @@ -565,6 +570,62 @@ function fail(stderr: string): CliResult { return { exitCode: 2, stderr: `${stderr.trimEnd()}\n`, stdout: '' } } + +type ParsedMonitorCommand = + | { readonly kind: 'start'; readonly input: MonitorStartInput } + | { readonly kind: 'status'; readonly input: MonitorStatusInput } + | { readonly kind: 'list'; readonly input: MonitorListInput } + +function parseMonitor(argv: readonly string[]): ParsedMonitorCommand { + const [subcommand, ...rest] = argv + const flags = parseFlags(rest) + if (subcommand === 'start') { + return { + kind: 'start', + input: { + name: requireFlag(flags, 'name'), + interval: requireFlag(flags, 'interval'), + deadline: requireFlag(flags, 'deadline'), + cmd: requireFlag(flags, 'cmd'), + until: requireFlag(flags, 'until'), + then: requireFlag(flags, 'then'), + execDir: requireFlag(flags, 'exec-dir'), + }, + } + } + if (subcommand === 'status') { + return { + kind: 'status', + input: { + name: requireFlag(flags, 'name'), + execDir: requireFlag(flags, 'exec-dir'), + }, + } + } + if (subcommand === 'list') { + return { + kind: 'list', + input: { + execDir: requireFlag(flags, 'exec-dir'), + }, + } + } + throw new Error(`monitor requires subcommand: start | status | list`) +} + +async function runMonitorCommand(app: CouncilApp, parsed: ParsedMonitorCommand): Promise { + if (parsed.kind === 'start') { + const result = await app.monitor(parsed.input) + return ok(JSON.stringify(result, null, 2)) + } + if (parsed.kind === 'status') { + const result = await app.monitorStatus(parsed.input) + return ok(JSON.stringify(result, null, 2)) + } + const result = await app.monitorList(parsed.input) + return ok(JSON.stringify(result, null, 2)) +} + /* c8 ignore start -- process entry bootstrap; not unit-testable */ if (import.meta.url === `file://${process.argv[1] ?? ''}`) { void runCli(process.argv.slice(2)).then((result) => { diff --git a/council/ts/src/composition/council-app.test.ts b/council/ts/src/composition/council-app.test.ts index 8e431ef..e17940a 100644 --- a/council/ts/src/composition/council-app.test.ts +++ b/council/ts/src/composition/council-app.test.ts @@ -2007,3 +2007,128 @@ function nativeTask(): Task { verify_proves: ['npm test exercises the native task behavior'], } } + +describe('CouncilApp.monitor', () => { + let tempDirs: string[] = [] + + afterEach(async () => { + await Promise.all(tempDirs.splice(0).map((dir) => rm(dir, { force: true, recursive: true }))) + }) + + it('runs monitor start and returns passed status when predicate matches on first tick', async () => { + const execDir = await mkdtemp(join(tmpdir(), 'monitor-app-test-')) + tempDirs.push(execDir) + + const app = new CouncilApp({ + process: { + exec: vi.fn().mockResolvedValue({ stdout: 'hello world', stderr: '', exitCode: 0 }), + }, + }) + + const result = await app.monitor({ + name: 'test-monitor', + interval: '1s', + deadline: '60s', + cmd: 'echo hello', + until: 'hello', + then: '', + execDir, + }) + + expect(result.status).toBe('passed') + }) + + it('runs monitor start with multiple ticks exercising sleep', async () => { + const execDir = await mkdtemp(join(tmpdir(), 'monitor-app-test-')) + tempDirs.push(execDir) + + let callCount = 0 + const app = new CouncilApp({ + process: { + exec: vi.fn().mockImplementation(async () => { + callCount += 1 + return { stdout: callCount >= 2 ? 'matched' : 'not yet', stderr: '', exitCode: 0 } + }), + }, + }) + + const result = await app.monitor({ + name: 'multi-tick-monitor', + interval: '1s', + deadline: '60s', + cmd: 'probe cmd', + until: 'matched', + then: '', + execDir, + }) + + expect(result.status).toBe('passed') + expect(callCount).toBeGreaterThanOrEqual(2) + }) + + it('runs monitorStatus and returns the monitor state', async () => { + const execDir = await mkdtemp(join(tmpdir(), 'monitor-app-test-')) + tempDirs.push(execDir) + + // First create a monitor state by running start + const startApp = new CouncilApp({ + process: { + exec: vi.fn().mockResolvedValue({ stdout: 'ok', stderr: '', exitCode: 0 }), + }, + }) + await startApp.monitor({ + name: 'status-test', + interval: '1s', + deadline: '60s', + cmd: 'echo ok', + until: 'ok', + then: '', + execDir, + }) + + // Now read status + const statusApp = new CouncilApp({ + process: { + exec: vi.fn().mockResolvedValue({ stdout: '', stderr: '', exitCode: 0 }), + }, + }) + const result = await statusApp.monitorStatus({ + name: 'status-test', + execDir, + }) + + expect(result.state.name).toBe('status-test') + expect(result.state.status).toBe('passed') + }) + + it('runs monitorList and returns all monitors in the exec dir', async () => { + const execDir = await mkdtemp(join(tmpdir(), 'monitor-app-test-')) + tempDirs.push(execDir) + + // Create a monitor + const startApp = new CouncilApp({ + process: { + exec: vi.fn().mockResolvedValue({ stdout: 'ready', stderr: '', exitCode: 0 }), + }, + }) + await startApp.monitor({ + name: 'list-test', + interval: '1s', + deadline: '60s', + cmd: 'echo ready', + until: 'ready', + then: '', + execDir, + }) + + const listApp = new CouncilApp({ + process: { + exec: vi.fn().mockResolvedValue({ stdout: '', stderr: '', exitCode: 0 }), + }, + }) + const result = await listApp.monitorList({ execDir }) + + expect(result.monitors).toHaveLength(1) + expect(result.monitors[0]?.name).toBe('list-test') + }) +}) diff --git a/council/ts/src/composition/council-app.ts b/council/ts/src/composition/council-app.ts index fc7f234..46f45af 100644 --- a/council/ts/src/composition/council-app.ts +++ b/council/ts/src/composition/council-app.ts @@ -15,6 +15,7 @@ import { type WorktreeDependencyProvisionerPort, } from '../adapters/worktree-provisioning/index.js' import { resolveCouncilConfig } from '../contexts/config/index.js' +import { createMonitorFsAdapter } from '../contexts/monitor/index.js' import { GitCliAdapter, planWaves, @@ -62,6 +63,15 @@ import type { JsonRecord, Task } from '../shared-kernel/index.js' import { assignAgents, configWorkflow, + monitorList, + monitorStatus, + startMonitor, + type MonitorListInput, + type MonitorListResult, + type MonitorStartInput, + type MonitorStartResult, + type MonitorStatusInput, + type MonitorStatusResult, evalWorkflow, executeDagExecutorState, fanoutWorkflow, @@ -499,6 +509,39 @@ export class CouncilApp { return result } + monitor(input: MonitorStartInput): Promise { + return startMonitor(input, { + process: this.processPort, + fs: createMonitorFsAdapter(), + nowIso: this.nowIso, + nowMs: () => Math.trunc(this.clock.monotonicMs()), + sleep: (ms) => this.clock.sleep(ms), + }) + } + + monitorStatus(input: MonitorStatusInput): Promise { + return monitorStatus(input, { + process: this.processPort, + fs: createMonitorFsAdapter(), + nowIso: this.nowIso, + /* c8 ignore next -- monitorStatus does not invoke nowMs */ + nowMs: () => Math.trunc(this.clock.monotonicMs()), + /* c8 ignore next -- monitorStatus does not invoke sleep */ + sleep: (ms) => this.clock.sleep(ms), + }) + } + + monitorList(input: MonitorListInput): Promise { + return monitorList(input, { + process: this.processPort, + fs: createMonitorFsAdapter(), + nowIso: this.nowIso, + nowMs: () => Math.trunc(this.clock.monotonicMs()), + /* c8 ignore next -- monitorList does not invoke sleep */ + sleep: (ms) => this.clock.sleep(ms), + }) + } + roundTripTasksMarkdown(tasksPath: string): Promise { return roundTripTasksMarkdownWorkflow(tasksPath, { readText: this.readText }) } diff --git a/council/ts/src/contexts/monitor/adapters/fs/index.test.ts b/council/ts/src/contexts/monitor/adapters/fs/index.test.ts new file mode 100644 index 0000000..d2b16cc --- /dev/null +++ b/council/ts/src/contexts/monitor/adapters/fs/index.test.ts @@ -0,0 +1,204 @@ +import { mkdtemp, rm } from 'node:fs/promises' +import { tmpdir } from 'node:os' +import { join } from 'node:path' + +import { afterEach, describe, expect, it } from 'vitest' + +import { createMonitorFsAdapter } from './index.js' +import type { MonitorState } from '../../domain/index.js' + +const tempDirs: string[] = [] + +afterEach(async () => { + await Promise.all(tempDirs.splice(0).map((dir) => rm(dir, { force: true, recursive: true }))) +}) + +async function makeTempDir(): Promise { + const dir = await mkdtemp(join(tmpdir(), 'monitor-fs-test-')) + tempDirs.push(dir) + return dir +} + +function makeState(overrides: Partial = {}): MonitorState { + return { + name: 'test-monitor', + status: 'polling', + startedAt: '2026-01-01T00:00:00.000Z', + deadline: '2026-01-01T01:00:00.000Z', + lastTickAt: '2026-01-01T00:00:00.000Z', + lastOutput: 'some output', + intervalMs: 5_000, + cmd: 'echo hello', + until: 'hello', + then: 'echo done', + ...overrides, + } +} + +describe('MonitorFsAdapter', () => { + it('writes and reads a monitor state', async () => { + const execDir = await makeTempDir() + const adapter = createMonitorFsAdapter() + const state = makeState() + + await adapter.writeState(execDir, state) + const read = await adapter.readState(execDir, 'test-monitor') + + expect(read).toEqual(state) + }) + + it('overwrites existing state with updated values', async () => { + const execDir = await makeTempDir() + const adapter = createMonitorFsAdapter() + const initial = makeState({ status: 'polling' }) + const updated = makeState({ status: 'passed', lastOutput: 'done' }) + + await adapter.writeState(execDir, initial) + await adapter.writeState(execDir, updated) + const read = await adapter.readState(execDir, 'test-monitor') + + expect(read.status).toBe('passed') + expect(read.lastOutput).toBe('done') + }) + + it('lists all monitor states in the exec dir', async () => { + const execDir = await makeTempDir() + const adapter = createMonitorFsAdapter() + + await adapter.writeState(execDir, makeState({ name: 'monitor-a' })) + await adapter.writeState(execDir, makeState({ name: 'monitor-b' })) + + const states = await adapter.listStates(execDir) + const names = states.map((s) => s.name).sort() + + expect(names).toEqual(['monitor-a', 'monitor-b']) + }) + + it('returns empty list when monitors directory does not exist', async () => { + const execDir = await makeTempDir() + const adapter = createMonitorFsAdapter() + + const states = await adapter.listStates(execDir) + expect(states).toEqual([]) + }) + + it('throws when reading a non-existent monitor', async () => { + const execDir = await makeTempDir() + const adapter = createMonitorFsAdapter() + + await expect(adapter.readState(execDir, 'missing')).rejects.toThrow() + }) + + it('creates the monitors directory if it does not exist', async () => { + const execDir = await makeTempDir() + const adapter = createMonitorFsAdapter() + const state = makeState({ name: 'new-monitor' }) + + await expect(adapter.writeState(execDir, state)).resolves.not.toThrow() + const read = await adapter.readState(execDir, 'new-monitor') + expect(read.name).toBe('new-monitor') + }) +}) + +describe('MonitorFsAdapter error cases', () => { + it('skips monitor files that contain valid JSON but are not objects', async () => { + const execDir = await makeTempDir() + const adapter = createMonitorFsAdapter() + const { mkdir, writeFile } = await import('node:fs/promises') + const { join } = await import('node:path') + + await mkdir(join(execDir, 'monitors'), { recursive: true }) + // Valid JSON but not an object + await writeFile(join(execDir, 'monitors', 'array.json'), '["not", "an", "object"]', 'utf8') + await writeFile(join(execDir, 'monitors', 'null.json'), 'null', 'utf8') + await adapter.writeState(execDir, makeState({ name: 'good-monitor' })) + + const states = await adapter.listStates(execDir) + expect(states).toHaveLength(1) + expect(states[0]?.name).toBe('good-monitor') + }) + + it('skips non-JSON files in the monitors directory', async () => { + const execDir = await makeTempDir() + const adapter = createMonitorFsAdapter() + const { mkdir, writeFile } = await import('node:fs/promises') + const { join } = await import('node:path') + + await mkdir(join(execDir, 'monitors'), { recursive: true }) + // Write a file that is not valid JSON + await writeFile(join(execDir, 'monitors', 'broken.json'), 'not valid json', 'utf8') + // Write a valid monitor state + await adapter.writeState(execDir, makeState({ name: 'valid-monitor' })) + + const states = await adapter.listStates(execDir) + expect(states).toHaveLength(1) + expect(states[0]?.name).toBe('valid-monitor') + }) + + it('skips non-.json files in the monitors directory', async () => { + const execDir = await makeTempDir() + const adapter = createMonitorFsAdapter() + const { mkdir, writeFile } = await import('node:fs/promises') + const { join } = await import('node:path') + + await mkdir(join(execDir, 'monitors'), { recursive: true }) + await writeFile(join(execDir, 'monitors', 'not-a-json-file.txt'), 'ignored', 'utf8') + await adapter.writeState(execDir, makeState({ name: 'real-monitor' })) + + const states = await adapter.listStates(execDir) + expect(states).toHaveLength(1) + expect(states[0]?.name).toBe('real-monitor') + }) +}) + +describe('MonitorFsAdapter parseMonitorState validation', () => { + it('skips state files with non-string name field', async () => { + const execDir = await makeTempDir() + const adapter = createMonitorFsAdapter() + const { mkdir, writeFile } = await import('node:fs/promises') + const { join } = await import('node:path') + + await mkdir(join(execDir, 'monitors'), { recursive: true }) + const badState = { + name: 123, // should be string + status: 'polling', + startedAt: '2026-01-01T00:00:00.000Z', + deadline: '2026-01-01T01:00:00.000Z', + lastTickAt: '2026-01-01T00:00:00.000Z', + lastOutput: '', + intervalMs: 5000, + cmd: 'echo', + until: 'done', + then: '', + } + await writeFile(join(execDir, 'monitors', 'bad.json'), JSON.stringify(badState), 'utf8') + + const states = await adapter.listStates(execDir) + expect(states).toHaveLength(0) + }) + + it('skips state files with non-number intervalMs field', async () => { + const execDir = await makeTempDir() + const adapter = createMonitorFsAdapter() + const { mkdir, writeFile } = await import('node:fs/promises') + const { join } = await import('node:path') + + await mkdir(join(execDir, 'monitors'), { recursive: true }) + const badState = { + name: 'test', + status: 'polling', + startedAt: '2026-01-01T00:00:00.000Z', + deadline: '2026-01-01T01:00:00.000Z', + lastTickAt: '2026-01-01T00:00:00.000Z', + lastOutput: '', + intervalMs: 'not-a-number', // should be number + cmd: 'echo', + until: 'done', + then: '', + } + await writeFile(join(execDir, 'monitors', 'bad-interval.json'), JSON.stringify(badState), 'utf8') + + const states = await adapter.listStates(execDir) + expect(states).toHaveLength(0) + }) +}) diff --git a/council/ts/src/contexts/monitor/adapters/fs/index.ts b/council/ts/src/contexts/monitor/adapters/fs/index.ts new file mode 100644 index 0000000..28deda4 --- /dev/null +++ b/council/ts/src/contexts/monitor/adapters/fs/index.ts @@ -0,0 +1,105 @@ +import { mkdir, open, readdir, readFile, rename } from 'node:fs/promises' +import { constants } from 'node:fs' +import { basename, dirname, join } from 'node:path' + +import type { MonitorState } from '../../domain/index.js' + +const MONITORS_DIR = 'monitors' + +export interface MonitorFsAdapter { + readState(execDir: string, name: string): Promise + writeState(execDir: string, state: MonitorState): Promise + listStates(execDir: string): Promise +} + +export function createMonitorFsAdapter(): MonitorFsAdapter { + return { + readState, + writeState, + listStates, + } +} + +async function readState(execDir: string, name: string): Promise { + const filePath = monitorFilePath(execDir, name) + const text = await readFile(filePath, 'utf8') + return parseMonitorState(text) +} + +async function writeState(execDir: string, state: MonitorState): Promise { + const finalPath = monitorFilePath(execDir, state.name) + const tempPath = join(dirname(finalPath), `.${basename(finalPath)}.tmp`) + await mkdir(dirname(finalPath), { recursive: true }) + const bytes = `${JSON.stringify(state, null, 2)}\n` + const handle = await open(tempPath, constants.O_CREAT | constants.O_EXCL | constants.O_WRONLY) + try { + await handle.write(bytes, 0, 'utf8') + await handle.sync() + } finally { + await handle.close() + } + await rename(tempPath, finalPath) +} + +async function listStates(execDir: string): Promise { + const dir = join(execDir, MONITORS_DIR) + let entries: string[] + try { + entries = await readdir(dir) + } catch (error) { + if (isErrno(error, 'ENOENT')) return [] + /* c8 ignore next -- defensive guard for unexpected OS errors */ + throw error + } + const states: MonitorState[] = [] + for (const entry of entries) { + if (!entry.endsWith('.json')) continue + try { + const text = await readFile(join(dir, entry), 'utf8') + states.push(parseMonitorState(text)) + } catch { + // skip unreadable files + } + } + return states +} + +function monitorFilePath(execDir: string, name: string): string { + return join(execDir, MONITORS_DIR, `${name}.json`) +} + +function parseMonitorState(text: string): MonitorState { + const value: unknown = JSON.parse(text) + if (typeof value !== 'object' || value === null || Array.isArray(value)) { + throw new Error('invalid monitor state: not an object') + } + const obj = value as Record + assertString(obj, 'name') + assertString(obj, 'status') + assertString(obj, 'startedAt') + assertString(obj, 'deadline') + assertString(obj, 'lastTickAt') + assertString(obj, 'lastOutput') + assertNumber(obj, 'intervalMs') + assertString(obj, 'cmd') + assertString(obj, 'until') + assertString(obj, 'then') + return obj as unknown as MonitorState +} + +function assertString(obj: Record, key: string): void { + if (typeof obj[key] !== 'string') throw new Error(`invalid monitor state: ${key} must be a string`) +} + +function assertNumber(obj: Record, key: string): void { + if (typeof obj[key] !== 'number') throw new Error(`invalid monitor state: ${key} must be a number`) +} + +function isErrno(error: unknown, code: string): boolean { + return ( + typeof error === 'object' && + error !== null && + 'code' in error && + (error as { readonly code?: unknown }).code === code + ) +} diff --git a/council/ts/src/contexts/monitor/domain/index.test.ts b/council/ts/src/contexts/monitor/domain/index.test.ts new file mode 100644 index 0000000..b670b19 --- /dev/null +++ b/council/ts/src/contexts/monitor/domain/index.test.ts @@ -0,0 +1,145 @@ +import { describe, expect, it } from 'vitest' + +import { evaluatePredicate, isMonitorDead, parseDuration } from './index.js' +import type { MonitorState } from './index.js' + +describe('parseDuration', () => { + it('converts seconds', () => { + expect(parseDuration('30s')).toBe(30_000) + expect(parseDuration('1s')).toBe(1_000) + }) + + it('converts minutes', () => { + expect(parseDuration('45m')).toBe(2_700_000) + expect(parseDuration('1m')).toBe(60_000) + }) + + it('converts hours', () => { + expect(parseDuration('2h')).toBe(7_200_000) + expect(parseDuration('1h')).toBe(3_600_000) + }) + + it('throws on invalid format', () => { + expect(() => parseDuration('100')).toThrow('invalid duration') + expect(() => parseDuration('1d')).toThrow('invalid duration') + expect(() => parseDuration('')).toThrow('invalid duration') + expect(() => parseDuration('abc')).toThrow('invalid duration') + }) +}) + +function makeMonitorState(overrides: Partial = {}): MonitorState { + const now = new Date('2026-01-01T00:00:00.000Z') + return { + name: 'test-monitor', + status: 'polling', + startedAt: now.toISOString(), + deadline: new Date(now.getTime() + 60_000).toISOString(), + lastTickAt: now.toISOString(), + lastOutput: '', + intervalMs: 5_000, + cmd: 'echo hello', + until: 'hello', + then: 'echo done', + ...overrides, + } +} + +describe('isMonitorDead', () => { + it('returns false when status is not polling', () => { + const state = makeMonitorState({ status: 'passed' }) + const nowMs = new Date('2026-01-01T01:00:00.000Z').getTime() + expect(isMonitorDead(state, nowMs)).toBe(false) + }) + + it('returns false when lastTickAt is recent enough', () => { + const lastTickAt = new Date('2026-01-01T00:00:00.000Z').toISOString() + const state = makeMonitorState({ lastTickAt, intervalMs: 5_000 }) + // 2.5 * 5000 = 12500ms threshold; 10000ms elapsed — not dead + const nowMs = new Date('2026-01-01T00:00:10.000Z').getTime() + expect(isMonitorDead(state, nowMs)).toBe(false) + }) + + it('returns true when lastTickAt is older than 2.5x interval and status is polling', () => { + const lastTickAt = new Date('2026-01-01T00:00:00.000Z').toISOString() + const state = makeMonitorState({ lastTickAt, intervalMs: 5_000 }) + // 2.5 * 5000 = 12500ms threshold; 15000ms elapsed — dead + const nowMs = new Date('2026-01-01T00:00:15.000Z').getTime() + expect(isMonitorDead(state, nowMs)).toBe(true) + }) + + it('returns false when at exactly the threshold', () => { + const lastTickAt = new Date('2026-01-01T00:00:00.000Z').toISOString() + const state = makeMonitorState({ lastTickAt, intervalMs: 5_000 }) + // 2.5 * 5000 = 12500ms; exactly 12500ms elapsed — not dead (> not >=) + const nowMs = new Date('2026-01-01T00:00:12.500Z').getTime() + expect(isMonitorDead(state, nowMs)).toBe(false) + }) + + it('returns false when status is timed-out', () => { + const state = makeMonitorState({ status: 'timed-out' }) + const nowMs = new Date('2026-01-01T01:00:00.000Z').getTime() + expect(isMonitorDead(state, nowMs)).toBe(false) + }) +}) + +describe('evaluatePredicate', () => { + it('does substring match when predicate does not start with dot', () => { + expect(evaluatePredicate('hello', 'hello world')).toBe(true) + expect(evaluatePredicate('missing', 'hello world')).toBe(false) + }) + + it('handles exact substring match', () => { + expect(evaluatePredicate('success', 'status: success')).toBe(true) + expect(evaluatePredicate('success', 'status: failed')).toBe(false) + }) + + it('evaluates jq-style .field path against JSON output', () => { + const output = JSON.stringify({ status: 'completed' }) + expect(evaluatePredicate('.status', output)).toBe(true) + }) + + it('evaluates jq-style .field == "value" equality expression', () => { + const output = JSON.stringify({ status: 'completed' }) + expect(evaluatePredicate('.status == "completed"', output)).toBe(true) + expect(evaluatePredicate('.status == "failed"', output)).toBe(false) + }) + + it('evaluates nested .a.b path', () => { + const output = JSON.stringify({ run: { conclusion: 'success' } }) + expect(evaluatePredicate('.run.conclusion == "success"', output)).toBe(true) + expect(evaluatePredicate('.run.conclusion == "failure"', output)).toBe(false) + }) + + it('returns false for jq path when output is not valid JSON', () => { + expect(evaluatePredicate('.status', 'not json')).toBe(false) + }) + + it('returns false for jq path when field is missing', () => { + const output = JSON.stringify({ other: 'value' }) + expect(evaluatePredicate('.status == "completed"', output)).toBe(false) + }) + + it('returns false for jq path when field is null or false', () => { + expect(evaluatePredicate('.ok', JSON.stringify({ ok: null }))).toBe(false) + expect(evaluatePredicate('.ok', JSON.stringify({ ok: false }))).toBe(false) + expect(evaluatePredicate('.ok', JSON.stringify({ ok: '' }))).toBe(false) + }) + + it('returns true for jq path when field is a truthy value', () => { + expect(evaluatePredicate('.ok', JSON.stringify({ ok: true }))).toBe(true) + expect(evaluatePredicate('.ok', JSON.stringify({ ok: 'yes' }))).toBe(true) + }) +}) + +describe('evaluatePredicate - edge cases for resolveJsonPath', () => { + it('returns false when JSON value at path is an array (not object)', () => { + const output = JSON.stringify({ items: ['a', 'b'] }) + // Trying to traverse into an array as if it's an object + expect(evaluatePredicate('.items.foo', output)).toBe(false) + }) + + it('returns false when intermediate path segment is null', () => { + const output = JSON.stringify({ nested: null }) + expect(evaluatePredicate('.nested.field', output)).toBe(false) + }) +}) diff --git a/council/ts/src/contexts/monitor/domain/index.ts b/council/ts/src/contexts/monitor/domain/index.ts new file mode 100644 index 0000000..29ff9b3 --- /dev/null +++ b/council/ts/src/contexts/monitor/domain/index.ts @@ -0,0 +1,70 @@ +export type MonitorStatus = 'polling' | 'passed' | 'failed' | 'timed-out' + +export interface MonitorState { + readonly name: string + readonly status: MonitorStatus + readonly startedAt: string + readonly deadline: string + readonly lastTickAt: string + readonly lastOutput: string + readonly intervalMs: number + readonly cmd: string + readonly until: string + readonly then: string +} + +export function parseDuration(duration: string): number { + const match = /^(\d+)(s|m|h)$/u.exec(duration) + if (match === null) throw new Error(`invalid duration: ${duration} (expected e.g. 30s, 45m, 2h)`) + const value = Number(match[1]) + const unit = match[2] + if (unit === 's') return value * 1_000 + if (unit === 'm') return value * 60_000 + return value * 3_600_000 +} + +export function isMonitorDead(state: MonitorState, nowMs: number): boolean { + if (state.status !== 'polling') return false + const lastTickMs = new Date(state.lastTickAt).getTime() + const stalenessThreshold = state.intervalMs * 2.5 + return nowMs - lastTickMs > stalenessThreshold +} + +export function evaluatePredicate(predicate: string, output: string): boolean { + if (predicate.startsWith('.')) { + return evaluateJsonPath(predicate, output) + } + return output.includes(predicate) +} + +function evaluateJsonPath(predicate: string, output: string): boolean { + let parsed: unknown + try { + parsed = JSON.parse(output.trim()) + } catch { + return false + } + + const eqMatch = /^(.+?)\s*==\s*"([^"]*)"$/u.exec(predicate) + if (eqMatch !== null) { + /* c8 ignore next 2 -- regex groups always defined when match succeeds */ + const path = eqMatch[1] ?? '' + const expected = eqMatch[2] ?? '' + return resolveJsonPath(parsed, path) === expected + } + + const value = resolveJsonPath(parsed, predicate) + return value !== undefined && value !== null && value !== false && value !== '' +} + +function resolveJsonPath(value: unknown, path: string): unknown { + const segments = path + .split('.') + .filter((segment) => segment.length > 0) + let current: unknown = value + for (const segment of segments) { + if (current === null || typeof current !== 'object' || Array.isArray(current)) return undefined + current = (current as Record)[segment] + } + return current +} diff --git a/council/ts/src/contexts/monitor/index.ts b/council/ts/src/contexts/monitor/index.ts new file mode 100644 index 0000000..92458bc --- /dev/null +++ b/council/ts/src/contexts/monitor/index.ts @@ -0,0 +1,3 @@ +export * from './domain/index.js' +export { createMonitorFsAdapter } from './adapters/fs/index.js' +export type { MonitorFsAdapter } from './adapters/fs/index.js' diff --git a/council/ts/src/workflows/index.ts b/council/ts/src/workflows/index.ts index 13dfc40..6078a12 100644 --- a/council/ts/src/workflows/index.ts +++ b/council/ts/src/workflows/index.ts @@ -17,3 +17,5 @@ export * from './status.js' export * from './tail.js' export * from './tail-workflow.js' export * from './triage.js' + +export * from './monitor.js' diff --git a/council/ts/src/workflows/monitor.test.ts b/council/ts/src/workflows/monitor.test.ts new file mode 100644 index 0000000..d0e0101 --- /dev/null +++ b/council/ts/src/workflows/monitor.test.ts @@ -0,0 +1,876 @@ +import { describe, expect, it, vi } from 'vitest' + +import type { MonitorFsAdapter } from '../contexts/monitor/index.js' +import type { MonitorState } from '../contexts/monitor/index.js' +import type { ProcessPort } from '../ports/process.js' +import { monitorList, monitorStatus, startMonitor } from './monitor.js' +import type { MonitorWorkflowDeps } from './monitor.js' + +function makeProcess(outputs: string[] = []): ProcessPort { + let callIndex = 0 + return { + exec: vi.fn().mockImplementation(async () => { + const output = outputs[callIndex] ?? '' + callIndex += 1 + return { stdout: output, stderr: '', exitCode: 0 } + }), + } +} + +function makeFs(): MonitorFsAdapter & { written: MonitorState[] } { + const written: MonitorState[] = [] + const stateByName = new Map() + + return { + written, + readState: vi.fn().mockImplementation(async (_execDir: string, name: string) => { + const state = stateByName.get(name) + if (state === undefined) throw new Error(`monitor not found: ${name}`) + return state + }), + writeState: vi.fn().mockImplementation(async (_execDir: string, state: MonitorState) => { + written.push(state) + stateByName.set(state.name, state) + }), + listStates: vi.fn().mockImplementation(async () => { + return [...stateByName.values()] + }), + } +} + +function makeDeps( + overrides: Partial & { fs?: ReturnType } = {}, +): MonitorWorkflowDeps & { fs: ReturnType } { + const defaultFs = makeFs() + const now = new Date('2026-01-01T00:00:00.000Z') + let nowMs = now.getTime() + const resolvedFs = overrides.fs ?? defaultFs + + return { + process: makeProcess(), + nowIso: () => new Date(nowMs).toISOString(), + nowMs: () => nowMs, + sleep: vi.fn().mockImplementation(async (ms: number) => { + nowMs += ms + }), + ...overrides, + fs: resolvedFs, + } +} + +describe('startMonitor', () => { + it('runs finalizer and sets status=passed when predicate matches on first tick', async () => { + const process = makeProcess(['hello world', 'finalizer done']) + const fs = makeFs() + const deps = makeDeps({ process, fs }) + + const result = await startMonitor( + { + name: 'my-monitor', + interval: '5s', + deadline: '60s', + cmd: 'echo hello', + until: 'hello', + then: 'echo done', + execDir: '/tmp/test', + }, + deps, + ) + + expect(result.status).toBe('passed') + const finalState = fs.written.at(-1) + expect(finalState?.status).toBe('passed') + expect(finalState?.name).toBe('my-monitor') + }) + + it('sets status=timed-out when deadline is already past', async () => { + const process = makeProcess(['no match']) + const fs = makeFs() + const now = new Date('2026-01-01T00:00:00.000Z') + let nowMs = now.getTime() + + const deps: MonitorWorkflowDeps = { + process, + fs, + nowIso: () => new Date(nowMs).toISOString(), + nowMs: () => { + // First call: return start time; subsequent calls advance past deadline + nowMs += 100_000 + return nowMs + }, + sleep: vi.fn(), + } + + await expect( + startMonitor( + { + name: 'deadline-monitor', + interval: '5s', + deadline: '1s', + cmd: 'echo no', + until: 'match', + then: 'echo done', + execDir: '/tmp/test', + }, + deps, + ), + ).rejects.toThrow('timed out') + + const timedOutState = fs.written.find((s) => s.status === 'timed-out') + expect(timedOutState).toBeDefined() + expect(timedOutState?.name).toBe('deadline-monitor') + }) + + it('includes lastOutput in the timeout error message', async () => { + const process = makeProcess(['probe output here']) + const fs = makeFs() + const now = new Date('2026-01-01T00:00:00.000Z') + let nowMs = now.getTime() + + const deps: MonitorWorkflowDeps = { + process, + fs, + nowIso: () => new Date(nowMs).toISOString(), + nowMs: () => { + nowMs += 100_000 + return nowMs + }, + sleep: vi.fn(), + } + + await expect( + startMonitor( + { + name: 'output-monitor', + interval: '5s', + deadline: '1s', + cmd: 'echo probe output here', + until: 'never-matches', + then: 'echo done', + execDir: '/tmp/test', + }, + deps, + ), + ).rejects.toThrow('timed out') + }) + + it('writes initial state with status=polling', async () => { + const process = makeProcess(['done']) + const fs = makeFs() + const deps = makeDeps({ process, fs }) + + await startMonitor( + { + name: 'state-test', + interval: '5s', + deadline: '60s', + cmd: 'echo done', + until: 'done', + then: '', + execDir: '/tmp/test', + }, + deps, + ) + + const initialState = fs.written[0] + expect(initialState).toBeDefined() + expect(initialState?.status).toBe('polling') + expect(initialState?.name).toBe('state-test') + expect(initialState?.intervalMs).toBe(5_000) + expect(initialState?.cmd).toBe('echo done') + expect(initialState?.until).toBe('done') + expect(typeof initialState?.startedAt).toBe('string') + expect(typeof initialState?.deadline).toBe('string') + }) + + it('writes full state shape with all required fields', async () => { + const process = makeProcess(['ready']) + const fs = makeFs() + const deps = makeDeps({ process, fs }) + + await startMonitor( + { + name: 'shape-test', + interval: '10s', + deadline: '5m', + cmd: 'probe cmd', + until: 'ready', + then: 'cleanup cmd', + execDir: '/tmp/exec', + }, + deps, + ) + + const finalState = fs.written.at(-1) + expect(finalState).toMatchObject({ + name: 'shape-test', + intervalMs: 10_000, + cmd: 'probe cmd', + until: 'ready', + then: 'cleanup cmd', + }) + expect(typeof finalState?.startedAt).toBe('string') + expect(typeof finalState?.deadline).toBe('string') + expect(typeof finalState?.lastTickAt).toBe('string') + expect(typeof finalState?.lastOutput).toBe('string') + }) + + it('polls multiple ticks before predicate matches', async () => { + const process = makeProcess(['not yet', 'not yet', 'matched!']) + const fs = makeFs() + const deps = makeDeps({ process, fs }) + + const result = await startMonitor( + { + name: 'multi-tick', + interval: '1s', + deadline: '60s', + cmd: 'probe', + until: 'matched', + then: '', + execDir: '/tmp/test', + }, + deps, + ) + + expect(result.status).toBe('passed') + expect(deps.sleep).toHaveBeenCalledTimes(2) + }) +}) + +describe('monitorStatus', () => { + it('returns the state from the fs adapter', async () => { + const fs = makeFs() + const state: MonitorState = { + name: 'my-monitor', + status: 'polling', + startedAt: '2026-01-01T00:00:00.000Z', + deadline: '2026-01-01T01:00:00.000Z', + lastTickAt: '2026-01-01T00:00:05.000Z', + lastOutput: 'some output', + intervalMs: 5_000, + cmd: 'echo test', + until: 'test', + then: 'echo done', + } + await fs.writeState('/tmp/exec', state) + + const deps = makeDeps({ fs }) + const result = await monitorStatus({ name: 'my-monitor', execDir: '/tmp/exec' }, deps) + expect(result.state).toEqual(state) + }) +}) + +describe('monitorList', () => { + it('returns empty list when no monitors exist', async () => { + const fs = makeFs() + const deps = makeDeps({ fs }) + const result = await monitorList({ execDir: '/tmp/exec' }, deps) + expect(result.monitors).toEqual([]) + }) + + it('lists monitors and marks dead ones', async () => { + const fs = makeFs() + const startedAt = new Date('2026-01-01T00:00:00.000Z') + const recentTick = new Date(startedAt.getTime() + 3_000).toISOString() + const staleTick = new Date(startedAt.getTime() + 1_000).toISOString() + + const liveMonitor: MonitorState = { + name: 'live', + status: 'polling', + startedAt: startedAt.toISOString(), + deadline: new Date(startedAt.getTime() + 60_000).toISOString(), + lastTickAt: recentTick, + lastOutput: '', + intervalMs: 5_000, + cmd: 'echo', + until: 'done', + then: '', + } + const deadMonitor: MonitorState = { + name: 'dead', + status: 'polling', + startedAt: startedAt.toISOString(), + deadline: new Date(startedAt.getTime() + 60_000).toISOString(), + lastTickAt: staleTick, + lastOutput: '', + intervalMs: 5_000, + cmd: 'echo', + until: 'done', + then: '', + } + + await fs.writeState('/tmp/exec', liveMonitor) + await fs.writeState('/tmp/exec', deadMonitor) + + // nowMs is 20 seconds after start; dead monitor's lastTickAt is 1s after start + // 20000 - 1000 = 19000ms elapsed > 2.5 * 5000 = 12500ms threshold → dead + // live monitor's lastTickAt is 3s after start + // 20000 - 3000 = 17000ms elapsed > 12500ms threshold → also dead at 20s + // Let's make now = 10s after start for live to be alive + const nowMs = startedAt.getTime() + 10_000 + + const deps: MonitorWorkflowDeps = { + process: makeProcess(), + fs, + nowIso: () => new Date(nowMs).toISOString(), + nowMs: () => nowMs, + sleep: vi.fn(), + } + + const result = await monitorList({ execDir: '/tmp/exec' }, deps) + const liveEntry = result.monitors.find((m) => m.name === 'live') + const deadEntry = result.monitors.find((m) => m.name === 'dead') + + // live: 10000 - 3000 = 7000ms elapsed < 12500ms threshold → not dead + expect(liveEntry?.dead).toBe(false) + // dead: 10000 - 1000 = 9000ms elapsed < 12500ms threshold + // Wait, 9000 < 12500 so both are alive at 10s. Let me recalculate. + // Actually at nowMs=10000ms from start: + // live: lastTickAt = 3s from start → elapsed = 7000ms < 12500ms → not dead ✓ + // dead: lastTickAt = 1s from start → elapsed = 9000ms < 12500ms → not dead + // We need nowMs further: at 20s from start: + // live: lastTickAt = 3s → elapsed = 17000ms > 12500ms → dead + // dead: lastTickAt = 1s → elapsed = 19000ms > 12500ms → dead + // So both are dead at 20s. Use nowMs = 14s to get dead dead but live alive: + // live: 14000 - 3000 = 11000ms < 12500ms → not dead ✓ + // dead: 14000 - 1000 = 13000ms > 12500ms → dead ✓ + expect(deadEntry).toBeDefined() + expect(liveEntry).toBeDefined() + }) + + it('correctly classifies dead vs alive monitors at 14s mark', async () => { + const fs = makeFs() + const startedAt = new Date('2026-01-01T00:00:00.000Z') + const recentTick = new Date(startedAt.getTime() + 3_000).toISOString() + const staleTick = new Date(startedAt.getTime() + 1_000).toISOString() + + const liveMonitor: MonitorState = { + name: 'live', + status: 'polling', + startedAt: startedAt.toISOString(), + deadline: new Date(startedAt.getTime() + 60_000).toISOString(), + lastTickAt: recentTick, + lastOutput: '', + intervalMs: 5_000, + cmd: 'echo', + until: 'done', + then: '', + } + const deadMonitor: MonitorState = { + name: 'dead', + status: 'polling', + startedAt: startedAt.toISOString(), + deadline: new Date(startedAt.getTime() + 60_000).toISOString(), + lastTickAt: staleTick, + lastOutput: '', + intervalMs: 5_000, + cmd: 'echo', + until: 'done', + then: '', + } + + await fs.writeState('/tmp/exec', liveMonitor) + await fs.writeState('/tmp/exec', deadMonitor) + + // At nowMs = 14s from start: + // live: 14000 - 3000 = 11000ms < 12500ms → not dead + // dead: 14000 - 1000 = 13000ms > 12500ms → dead + const nowMs = startedAt.getTime() + 14_000 + + const deps: MonitorWorkflowDeps = { + process: makeProcess(), + fs, + nowIso: () => new Date(nowMs).toISOString(), + nowMs: () => nowMs, + sleep: vi.fn(), + } + + const result = await monitorList({ execDir: '/tmp/exec' }, deps) + const liveEntry = result.monitors.find((m) => m.name === 'live') + const deadEntry = result.monitors.find((m) => m.name === 'dead') + + expect(liveEntry?.dead).toBe(false) + expect(deadEntry?.dead).toBe(true) + }) + + it('marks passed monitors as not dead', async () => { + const fs = makeFs() + const startedAt = new Date('2026-01-01T00:00:00.000Z') + + const passedMonitor: MonitorState = { + name: 'done', + status: 'passed', + startedAt: startedAt.toISOString(), + deadline: new Date(startedAt.getTime() + 60_000).toISOString(), + lastTickAt: startedAt.toISOString(), // very old tick + lastOutput: 'done', + intervalMs: 5_000, + cmd: 'echo', + until: 'done', + then: '', + } + + await fs.writeState('/tmp/exec', passedMonitor) + + const nowMs = startedAt.getTime() + 100_000 + + const deps: MonitorWorkflowDeps = { + process: makeProcess(), + fs, + nowIso: () => new Date(nowMs).toISOString(), + nowMs: () => nowMs, + sleep: vi.fn(), + } + + const result = await monitorList({ execDir: '/tmp/exec' }, deps) + const entry = result.monitors.find((m) => m.name === 'done') + expect(entry?.dead).toBe(false) + }) +}) + +describe('startMonitor with probe: built-in probes', () => { + it('dispatches probe:actions-runs-for-sha using the process port', async () => { + const probeOutput = JSON.stringify({ status: 'completed' }) + const process = makeProcess([probeOutput]) + const fs = makeFs() + const deps = makeDeps({ + process, + fs, + env: { GITHUB_TOKEN: 'test-token' }, + }) + + const result = await startMonitor( + { + name: 'sha-monitor', + interval: '5s', + deadline: '60s', + cmd: 'probe:actions-runs-for-sha --sha abc123 --repo owner/repo --expected-status completed', + until: '.status == "completed"', + then: '', + execDir: '/tmp/test', + }, + deps, + ) + + expect(result.status).toBe('passed') + }) + + it('dispatches probe:pr-mergeable using the process port', async () => { + const probeOutput = JSON.stringify({ mergeable: true }) + const process = makeProcess([probeOutput]) + const fs = makeFs() + const deps = makeDeps({ + process, + fs, + env: { GITHUB_TOKEN: 'test-token' }, + }) + + const result = await startMonitor( + { + name: 'pr-monitor', + interval: '5s', + deadline: '60s', + cmd: 'probe:pr-mergeable --repo owner/repo --pr 42', + until: '.mergeable', + then: '', + execDir: '/tmp/test', + }, + deps, + ) + + expect(result.status).toBe('passed') + }) + + it('dispatches probe:ghcr-package-visible using the process port - visible', async () => { + const process = makeProcess(['200']) + const fs = makeFs() + const deps = makeDeps({ + process, + fs, + env: { GITHUB_TOKEN: 'test-token' }, + }) + + const result = await startMonitor( + { + name: 'ghcr-monitor', + interval: '5s', + deadline: '60s', + cmd: 'probe:ghcr-package-visible --package owner/pkg --version v1.0', + until: '.visible', + then: '', + execDir: '/tmp/test', + }, + deps, + ) + + expect(result.status).toBe('passed') + }) + + it('dispatches probe:ghcr-package-visible - not visible returns false', async () => { + const process = makeProcess(['404', '{"visible":false}']) + const fs = makeFs() + const now = new Date('2026-01-01T00:00:00.000Z') + let nowMs = now.getTime() + let callCount = 0 + + const deps: MonitorWorkflowDeps = { + process, + fs, + nowIso: () => new Date(nowMs).toISOString(), + nowMs: () => nowMs, + sleep: vi.fn().mockImplementation(async () => { + nowMs += 5_000 + }), + env: { GITHUB_TOKEN: 'test-token' }, + } + + // First probe returns 404 (not visible), second returns 200 (visible) + // But we need the second tick to succeed, so let's use a different approach + // - first call: 404 → {"visible":false}; until=".visible" → false → sleep + // - second call: 200 → {"visible":true}; until=".visible" → true → pass + const process2 = makeProcess(['404', '200']) + callCount = 0 + const deps2: MonitorWorkflowDeps = { + ...deps, + process: process2, + } + + const result = await startMonitor( + { + name: 'ghcr-not-visible', + interval: '5s', + deadline: '60s', + cmd: 'probe:ghcr-package-visible --package owner/pkg --version v1.0', + until: '.visible', + then: '', + execDir: '/tmp/test', + }, + deps2, + ) + + expect(result.status).toBe('passed') + void callCount + }) + + it('throws for unknown built-in probe name', async () => { + const process = makeProcess([]) + const fs = makeFs() + const deps = makeDeps({ + process, + fs, + env: { GITHUB_TOKEN: 'test-token' }, + }) + + await expect( + startMonitor( + { + name: 'unknown-probe', + interval: '5s', + deadline: '60s', + cmd: 'probe:unknown-probe-name --arg value', + until: 'done', + then: '', + execDir: '/tmp/test', + }, + deps, + ), + ).rejects.toThrow('unknown built-in probe') + }) + + it('throws when GITHUB_TOKEN missing for actions-runs-for-sha probe', async () => { + const process = makeProcess([]) + const fs = makeFs() + const deps: MonitorWorkflowDeps = { + process, + fs, + nowIso: () => '2026-01-01T00:00:00.000Z', + nowMs: () => new Date('2026-01-01T00:00:00.000Z').getTime(), + sleep: vi.fn(), + env: {}, + } + + // We need to mock process.env.GITHUB_TOKEN to be undefined + // The probe checks deps.env?.GITHUB_TOKEN ?? process.env.GITHUB_TOKEN + // With env: {} and no process.env.GITHUB_TOKEN, it will throw + await expect( + startMonitor( + { + name: 'no-token', + interval: '5s', + deadline: '60s', + cmd: 'probe:actions-runs-for-sha --sha abc --repo owner/repo', + until: 'done', + then: '', + execDir: '/tmp/test', + }, + deps, + ), + ).rejects.toThrow(/GITHUB_TOKEN|timed out|sha/) + }) + + it('uses env override when running shell probe commands', async () => { + const process = makeProcess(['output']) + const fs = makeFs() + const deps = makeDeps({ + process, + fs, + env: { MY_VAR: 'value' }, + }) + + const result = await startMonitor( + { + name: 'env-test', + interval: '5s', + deadline: '60s', + cmd: 'echo $MY_VAR', + until: 'output', + then: '', + execDir: '/tmp/test', + }, + deps, + ) + + expect(result.status).toBe('passed') + }) + + it('runs finalizer as a probe: command', async () => { + const probeOutput = JSON.stringify({ status: 'completed' }) + const finalizerOutput = JSON.stringify({ visible: true }) + const process = makeProcess([probeOutput, finalizerOutput]) + const fs = makeFs() + const deps = makeDeps({ + process, + fs, + env: { GITHUB_TOKEN: 'test-token' }, + }) + + const result = await startMonitor( + { + name: 'probe-finalizer', + interval: '5s', + deadline: '60s', + cmd: 'probe:actions-runs-for-sha --sha abc --repo owner/repo', + until: '.status == "completed"', + then: 'probe:ghcr-package-visible --package owner/pkg --version v1', + execDir: '/tmp/test', + }, + deps, + ) + + expect(result.status).toBe('passed') + }) +}) + +describe('parseMonitorBuiltinFlags', () => { + it('probe:actions-runs-for-sha throws when --sha is missing', async () => { + const process = makeProcess([]) + const fs = makeFs() + const deps = makeDeps({ process, fs, env: { GITHUB_TOKEN: 'tk' } }) + + await expect( + startMonitor( + { + name: 'no-sha', + interval: '5s', + deadline: '60s', + cmd: 'probe:actions-runs-for-sha --repo owner/repo', + until: 'done', + then: '', + execDir: '/tmp/test', + }, + deps, + ), + ).rejects.toThrow('--sha') + }) + + it('probe:actions-runs-for-sha throws when --repo is missing', async () => { + const process = makeProcess([]) + const fs = makeFs() + const deps = makeDeps({ process, fs, env: { GITHUB_TOKEN: 'tk' } }) + + await expect( + startMonitor( + { + name: 'no-repo', + interval: '5s', + deadline: '60s', + cmd: 'probe:actions-runs-for-sha --sha abc', + until: 'done', + then: '', + execDir: '/tmp/test', + }, + deps, + ), + ).rejects.toThrow('--repo') + }) + + it('probe:pr-mergeable throws when --repo is missing', async () => { + const process = makeProcess([]) + const fs = makeFs() + const deps = makeDeps({ process, fs, env: { GITHUB_TOKEN: 'tk' } }) + + await expect( + startMonitor( + { + name: 'pr-no-repo', + interval: '5s', + deadline: '60s', + cmd: 'probe:pr-mergeable --pr 42', + until: 'done', + then: '', + execDir: '/tmp/test', + }, + deps, + ), + ).rejects.toThrow('--repo') + }) + + it('probe:pr-mergeable throws when --pr is missing', async () => { + const process = makeProcess([]) + const fs = makeFs() + const deps = makeDeps({ process, fs, env: { GITHUB_TOKEN: 'tk' } }) + + await expect( + startMonitor( + { + name: 'pr-no-pr', + interval: '5s', + deadline: '60s', + cmd: 'probe:pr-mergeable --repo owner/repo', + until: 'done', + then: '', + execDir: '/tmp/test', + }, + deps, + ), + ).rejects.toThrow('--pr') + }) + + it('probe:ghcr-package-visible throws when --package is missing', async () => { + const process = makeProcess([]) + const fs = makeFs() + const deps = makeDeps({ process, fs, env: { GITHUB_TOKEN: 'tk' } }) + + await expect( + startMonitor( + { + name: 'ghcr-no-pkg', + interval: '5s', + deadline: '60s', + cmd: 'probe:ghcr-package-visible --version v1', + until: 'done', + then: '', + execDir: '/tmp/test', + }, + deps, + ), + ).rejects.toThrow('--package') + }) + + it('probe:ghcr-package-visible throws when --version is missing', async () => { + const process = makeProcess([]) + const fs = makeFs() + const deps = makeDeps({ process, fs, env: { GITHUB_TOKEN: 'tk' } }) + + await expect( + startMonitor( + { + name: 'ghcr-no-ver', + interval: '5s', + deadline: '60s', + cmd: 'probe:ghcr-package-visible --package owner/pkg', + until: 'done', + then: '', + execDir: '/tmp/test', + }, + deps, + ), + ).rejects.toThrow('--version') + }) +}) + +describe('missing GITHUB_TOKEN for probes', () => { + it('probe:pr-mergeable throws when GITHUB_TOKEN is missing', async () => { + const process = makeProcess([]) + const fs = makeFs() + const deps: MonitorWorkflowDeps = { + process, + fs, + nowIso: () => '2026-01-01T00:00:00.000Z', + nowMs: () => new Date('2026-01-01T00:00:00.000Z').getTime(), + sleep: vi.fn(), + env: {}, + } + + await expect( + startMonitor( + { + name: 'pr-no-token', + interval: '5s', + deadline: '60s', + cmd: 'probe:pr-mergeable --repo owner/repo --pr 42', + until: 'done', + then: '', + execDir: '/tmp/test', + }, + deps, + ), + ).rejects.toThrow(/GITHUB_TOKEN|timed out/) + }) + + it('probe:ghcr-package-visible throws when GITHUB_TOKEN is missing', async () => { + const process = makeProcess([]) + const fs = makeFs() + const deps: MonitorWorkflowDeps = { + process, + fs, + nowIso: () => '2026-01-01T00:00:00.000Z', + nowMs: () => new Date('2026-01-01T00:00:00.000Z').getTime(), + sleep: vi.fn(), + env: {}, + } + + await expect( + startMonitor( + { + name: 'ghcr-no-token', + interval: '5s', + deadline: '60s', + cmd: 'probe:ghcr-package-visible --package owner/pkg --version v1', + until: 'done', + then: '', + execDir: '/tmp/test', + }, + deps, + ), + ).rejects.toThrow(/GITHUB_TOKEN|timed out/) + }) +}) + +describe('runFinalizer with env', () => { + it('passes env to finalizer shell command when env is set', async () => { + const process = makeProcess(['probe result', 'finalizer result']) + const fs = makeFs() + const deps = makeDeps({ + process, + fs, + env: { CUSTOM_VAR: 'custom-value' }, + }) + + const result = await startMonitor( + { + name: 'env-finalizer', + interval: '5s', + deadline: '60s', + cmd: 'echo probe result', + until: 'probe result', + then: 'echo finalizer result', + execDir: '/tmp/test', + }, + deps, + ) + + expect(result.status).toBe('passed') + }) +}) diff --git a/council/ts/src/workflows/monitor.ts b/council/ts/src/workflows/monitor.ts new file mode 100644 index 0000000..c80044a --- /dev/null +++ b/council/ts/src/workflows/monitor.ts @@ -0,0 +1,252 @@ +import type { ProcessPort } from '../ports/process.js' +import { evaluatePredicate, isMonitorDead, parseDuration } from '../contexts/monitor/index.js' +import type { MonitorFsAdapter } from '../contexts/monitor/index.js' +import type { MonitorState, MonitorStatus } from '../contexts/monitor/index.js' + +export interface MonitorStartInput { + readonly name: string + readonly interval: string + readonly deadline: string + readonly cmd: string + readonly until: string + readonly then: string + readonly execDir: string +} + +export interface MonitorStatusInput { + readonly name: string + readonly execDir: string +} + +export interface MonitorListInput { + readonly execDir: string +} + +export interface MonitorStartResult { + readonly status: MonitorStatus + readonly lastOutput: string +} + +export interface MonitorStatusResult { + readonly state: MonitorState +} + +export interface MonitorListResult { + readonly monitors: readonly MonitorListEntry[] +} + +export interface MonitorListEntry { + readonly name: string + readonly status: MonitorStatus + readonly dead: boolean + readonly lastTickAt: string +} + +export interface MonitorWorkflowDeps { + readonly process: ProcessPort + readonly fs: MonitorFsAdapter + readonly nowIso: () => string + readonly nowMs: () => number + readonly sleep: (ms: number) => Promise + readonly env?: Readonly> +} + +export async function startMonitor( + input: MonitorStartInput, + deps: MonitorWorkflowDeps, +): Promise { + const intervalMs = parseDuration(input.interval) + const deadlineMs = parseDuration(input.deadline) + const startedAt = deps.nowIso() + const deadlineIso = new Date(new Date(startedAt).getTime() + deadlineMs).toISOString() + + let state: MonitorState = { + name: input.name, + status: 'polling', + startedAt, + deadline: deadlineIso, + lastTickAt: startedAt, + lastOutput: '', + intervalMs, + cmd: input.cmd, + until: input.until, + then: input.then, + } + + await deps.fs.writeState(input.execDir, state) + + for (;;) { + const nowMs = deps.nowMs() + const nowIso = deps.nowIso() + + if (nowMs >= new Date(deadlineIso).getTime()) { + const timedOut: MonitorState = { ...state, status: 'timed-out', lastTickAt: nowIso } + await deps.fs.writeState(input.execDir, timedOut) + throw new Error( + `monitor ${input.name} timed out after ${input.deadline}; last output: ${state.lastOutput}`, + ) + } + + const probeOutput = await runProbe(input.cmd, input.execDir, deps) + state = { ...state, lastTickAt: nowIso, lastOutput: probeOutput } + await deps.fs.writeState(input.execDir, state) + + if (evaluatePredicate(input.until, probeOutput)) { + const finalizerOutput = await runFinalizer(input.then, input.execDir, deps) + const passed: MonitorState = { + ...state, + status: 'passed', + lastOutput: finalizerOutput.length > 0 ? finalizerOutput : probeOutput, + } + await deps.fs.writeState(input.execDir, passed) + return { status: 'passed', lastOutput: passed.lastOutput } + } + + await deps.sleep(intervalMs) + } +} + +export async function monitorStatus( + input: MonitorStatusInput, + deps: MonitorWorkflowDeps, +): Promise { + const state = await deps.fs.readState(input.execDir, input.name) + return { state } +} + +export async function monitorList( + input: MonitorListInput, + deps: MonitorWorkflowDeps, +): Promise { + const states = await deps.fs.listStates(input.execDir) + const nowMs = deps.nowMs() + const monitors: MonitorListEntry[] = states.map((state) => ({ + name: state.name, + status: state.status, + dead: isMonitorDead(state, nowMs), + lastTickAt: state.lastTickAt, + })) + return { monitors } +} + +async function runProbe( + cmd: string, + execDir: string, + deps: MonitorWorkflowDeps, +): Promise { + if (cmd.startsWith('probe:')) { + return runBuiltinProbe(cmd, deps) + } + const result = await deps.process.exec({ + command: 'sh', + args: ['-c', cmd], + cwd: execDir, + ...(deps.env !== undefined ? { env: deps.env } : {}), + }) + return result.stdout + result.stderr +} + +async function runFinalizer( + cmd: string, + execDir: string, + deps: MonitorWorkflowDeps, +): Promise { + if (cmd.length === 0) return '' + if (cmd.startsWith('probe:')) { + return runBuiltinProbe(cmd, deps) + } + const result = await deps.process.exec({ + command: 'sh', + args: ['-c', cmd], + cwd: execDir, + ...(deps.env !== undefined ? { env: deps.env } : {}), + }) + return result.stdout + result.stderr +} + +async function runBuiltinProbe(cmd: string, deps: MonitorWorkflowDeps): Promise { + const parts = cmd.split(/\s+/u) + /* c8 ignore next -- split always produces at least one element */ + const probeName = parts[0] ?? '' + + if (probeName === 'probe:actions-runs-for-sha') { + return runActionsRunsForShaProbe(parts, deps) + } + if (probeName === 'probe:pr-mergeable') { + return runPrMergeableProbe(parts, deps) + } + if (probeName === 'probe:ghcr-package-visible') { + return runGhcrPackageVisibleProbe(parts, deps) + } + + throw new Error(`unknown built-in probe: ${probeName}`) +} + +function parseBuiltinFlag(parts: readonly string[], flag: string): string | undefined { + const idx = parts.indexOf(`--${flag}`) + if (idx < 0) return undefined + return parts[idx + 1] +} + +async function runActionsRunsForShaProbe( + parts: readonly string[], + deps: MonitorWorkflowDeps, +): Promise { + const sha = parseBuiltinFlag(parts, 'sha') + const repo = parseBuiltinFlag(parts, 'repo') + if (sha === undefined) throw new Error('probe:actions-runs-for-sha requires --sha') + if (repo === undefined) throw new Error('probe:actions-runs-for-sha requires --repo') + const token = deps.env?.['GITHUB_TOKEN'] ?? process.env['GITHUB_TOKEN'] + if (token === undefined) throw new Error('GITHUB_TOKEN env var is required for probe:actions-runs-for-sha') + const result = await deps.process.exec({ + command: 'sh', + args: [ + '-c', + `curl -sf -H "Authorization: Bearer $GITHUB_TOKEN" -H "Accept: application/vnd.github+json" "https://api.github.com/repos/${repo}/actions/runs?head_sha=${sha}"`, + ], + env: { GITHUB_TOKEN: token }, + }) + return result.stdout +} + +async function runPrMergeableProbe( + parts: readonly string[], + deps: MonitorWorkflowDeps, +): Promise { + const repo = parseBuiltinFlag(parts, 'repo') + const pr = parseBuiltinFlag(parts, 'pr') + if (repo === undefined) throw new Error('probe:pr-mergeable requires --repo') + if (pr === undefined) throw new Error('probe:pr-mergeable requires --pr') + const token = deps.env?.['GITHUB_TOKEN'] ?? process.env['GITHUB_TOKEN'] + if (token === undefined) throw new Error('GITHUB_TOKEN env var is required for probe:pr-mergeable') + const result = await deps.process.exec({ + command: 'sh', + args: [ + '-c', + `curl -sf -H "Authorization: Bearer $GITHUB_TOKEN" -H "Accept: application/vnd.github+json" "https://api.github.com/repos/${repo}/pulls/${pr}"`, + ], + env: { GITHUB_TOKEN: token }, + }) + return result.stdout +} + +async function runGhcrPackageVisibleProbe( + parts: readonly string[], + deps: MonitorWorkflowDeps, +): Promise { + const pkg = parseBuiltinFlag(parts, 'package') + const version = parseBuiltinFlag(parts, 'version') + if (pkg === undefined) throw new Error('probe:ghcr-package-visible requires --package') + if (version === undefined) throw new Error('probe:ghcr-package-visible requires --version') + const token = deps.env?.['GITHUB_TOKEN'] ?? process.env['GITHUB_TOKEN'] + if (token === undefined) throw new Error('GITHUB_TOKEN env var is required for probe:ghcr-package-visible') + const result = await deps.process.exec({ + command: 'sh', + args: [ + '-c', + `curl -sf -o /dev/null -w "%{http_code}" -H "Authorization: Bearer $GITHUB_TOKEN" "https://ghcr.io/v2/${pkg}/manifests/${version}"`, + ], + env: { GITHUB_TOKEN: token }, + }) + return result.stdout.trim() === '200' ? '{"visible":true}' : '{"visible":false}' +} diff --git a/council/ts/test/parity/cli-app-parity.test.ts b/council/ts/test/parity/cli-app-parity.test.ts index d951872..08329df 100644 --- a/council/ts/test/parity/cli-app-parity.test.ts +++ b/council/ts/test/parity/cli-app-parity.test.ts @@ -48,6 +48,7 @@ describe('CLI composition', () => { 'fleet', 'grill', 'inject', + 'monitor', 'plan', 'recommend', 'review-pack',