From b8a71286e8d12a4456ff9eb0654b7e8d1fc38a5d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Sep 2026 03:55:10 +0000 Subject: [PATCH 1/2] Bump vitest and @vitest/coverage-v8 Bumps [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) and [@vitest/coverage-v8](https://github.com/vitest-dev/vitest/tree/HEAD/packages/coverage-v8). These dependencies needed to be updated together. Updates `vitest` from 3.1.1 to 5.0.0 - [Release notes](https://github.com/vitest-dev/vitest/releases) - [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md) - [Commits](https://github.com/vitest-dev/vitest/commits/v5.0.0/packages/vitest) Updates `@vitest/coverage-v8` from 3.1.1 to 5.0.0 - [Release notes](https://github.com/vitest-dev/vitest/releases) - [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md) - [Commits](https://github.com/vitest-dev/vitest/commits/v5.0.0/packages/coverage-v8) --- updated-dependencies: - dependency-name: vitest dependency-version: 5.0.0 dependency-type: direct:development - dependency-name: "@vitest/coverage-v8" dependency-version: 5.0.0 dependency-type: direct:development ... Signed-off-by: dependabot[bot] --- package-lock.json | 659 ++++++++++++++++------------------------------ package.json | 4 +- 2 files changed, 230 insertions(+), 433 deletions(-) diff --git a/package-lock.json b/package-lock.json index 542f7de..d691f1b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -58,7 +58,7 @@ "@types/uuid": "^10.0.0", "@typescript-eslint/eslint-plugin": "^8.30.1", "@typescript-eslint/parser": "^8.30.1", - "@vitest/coverage-v8": "^3.1.1", + "@vitest/coverage-v8": "^5.0.0", "@vue/test-utils": "^2.4.6", "commitlint": "^19.8.0", "commitlint-config-gitmoji": "^2.3.1", @@ -77,7 +77,7 @@ "prettier-plugin-toml": "^2.0.4", "semantic-release": "^25.0.3", "semantic-release-gitmoji": "^1.6.9", - "vitest": "^3.1.1", + "vitest": "^5.0.0", "vitest-mock-extended": "^3.1.0" }, "engines": { @@ -133,20 +133,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@babel/code-frame": { "version": "7.26.2", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", @@ -163,30 +149,30 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz", - "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", "license": "MIT", "dependencies": { - "@babel/types": "^7.27.0" + "@babel/types": "^7.29.8" }, "bin": { "parser": "bin/babel-parser.js" @@ -196,13 +182,13 @@ } }, "node_modules/@babel/types": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", - "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1870,16 +1856,6 @@ "node": ">=18.0.0" } }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.8", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", @@ -1923,15 +1899,15 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -3356,6 +3332,17 @@ "@types/node": "*" } }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, "node_modules/@types/compression": { "version": "1.7.5", "resolved": "https://registry.npmjs.org/@types/compression/-/compression-1.7.5.tgz", @@ -3417,6 +3404,13 @@ "@types/node": "*" } }, + "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" + }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", @@ -3786,31 +3780,27 @@ } }, "node_modules/@vitest/coverage-v8": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.1.1.tgz", - "integrity": "sha512-MgV6D2dhpD6Hp/uroUoAIvFqA8AuvXEFBC2eepG3WFc1pxTfdk1LEqqkWoWhjz+rytoqrnUUCdf6Lzco3iHkLQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-5.0.0.tgz", + "integrity": "sha512-toMg6PZGCIa/lQNCDoASrfb1ly4hsUKXFtFYC9kD4t78o5Y6LyNJU7AENt8eHPr3quYdxaxK7hj2mnbFfUk9NA==", "dev": true, "license": "MIT", "dependencies": { - "@ampproject/remapping": "^2.3.0", "@bcoe/v8-coverage": "^1.0.2", - "debug": "^4.4.0", - "istanbul-lib-coverage": "^3.2.2", - "istanbul-lib-report": "^3.0.1", - "istanbul-lib-source-maps": "^5.0.6", - "istanbul-reports": "^3.1.7", - "magic-string": "^0.30.17", - "magicast": "^0.3.5", - "std-env": "^3.8.1", - "test-exclude": "^7.0.1", - "tinyrainbow": "^2.0.0" + "@vitest/istanbul-lib-coverage": "^1.0.0", + "@vitest/istanbul-lib-report": "^1.0.0", + "ast-v8-to-istanbul": "^1.0.5", + "magicast": "^0.5.4", + "obug": "^2.1.4", + "std-env": "^4.2.0", + "tinyrainbow": "^3.1.1" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "@vitest/browser": "3.1.1", - "vitest": "3.1.1" + "@vitest/browser": "5.0.0", + "vitest": "5.0.0" }, "peerDependenciesMeta": { "@vitest/browser": { @@ -3818,39 +3808,47 @@ } } }, - "node_modules/@vitest/expect": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.1.1.tgz", - "integrity": "sha512-q/zjrW9lgynctNbwvFtQkGK9+vvHA5UzVi2V8APrp1C6fG6/MuYYkmlx4FubuqLycCeSdHD5aadWfua/Vr0EUA==", + "node_modules/@vitest/istanbul-lib-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@vitest/istanbul-lib-coverage/-/istanbul-lib-coverage-1.0.1.tgz", + "integrity": "sha512-k3DJZ8LhMBK9NS4SclF1ASD3OgXEWDorbIcPTRDK0/Zae6fRvu+fJRxtFdLfHsa9Y24beCdPnoNZ4LviTNstfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=22" + } + }, + "node_modules/@vitest/istanbul-lib-report": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@vitest/istanbul-lib-report/-/istanbul-lib-report-1.0.1.tgz", + "integrity": "sha512-1EOLRfsTMnyAr3+kEAsP4o9dhaDlGPpD7H5iLBBeq//YpNB1VIahkPhB+eRp9N2Dkfw8oySROjE3yf9XDeaIkQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "3.1.1", - "@vitest/utils": "3.1.1", - "chai": "^5.2.0", - "tinyrainbow": "^2.0.0" + "@vitest/istanbul-lib-coverage": "1.0.1" }, - "funding": { - "url": "https://opencollective.com/vitest" + "engines": { + "node": ">=22" } }, "node_modules/@vitest/mocker": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.1.1.tgz", - "integrity": "sha512-bmpJJm7Y7i9BBELlLuuM1J1Q6EQ6K5Ye4wcyOpOMXMcePYKSIYlpcrCm4l/O6ja4VJA5G2aMJiuZkZdnxlC3SA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-5.0.0.tgz", + "integrity": "sha512-66PGTMIiVJP3t4a5yxU9qPtf7MdTBs8jmToMvy+HVflB3Yy13WJZTtPePdvU+wjRV02SKK5doLbSA6o9pwOmiA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "3.1.1", + "@jridgewell/trace-mapping": "0.3.31", + "@vitest/spy": "5.0.0", "estree-walker": "^3.0.3", - "magic-string": "^0.30.17" + "magic-string": "^1.2.3" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { "msw": "^2.4.9", - "vite": "^5.0.0 || ^6.0.0" + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "msw": { @@ -3871,86 +3869,22 @@ "@types/estree": "^1.0.0" } }, - "node_modules/@vitest/pretty-format": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.1.1.tgz", - "integrity": "sha512-dg0CIzNx+hMMYfNmSqJlLSXEmnNhMswcn3sXO7Tpldr0LiGmg3eXdLLhwkv2ZqgHb/d5xg5F7ezNFRA1fA13yA==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.1.1.tgz", - "integrity": "sha512-X/d46qzJuEDO8ueyjtKfxffiXraPRfmYasoC4i5+mlLEJ10UvPb0XH5M9C3gWuxd7BAQhpK42cJgJtq53YnWVA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "3.1.1", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner/node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@vitest/snapshot": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.1.1.tgz", - "integrity": "sha512-bByMwaVWe/+1WDf9exFxWWgAixelSdiwo2p33tpqIlM14vW7PRV5ppayVXtfycqze4Qhtwag5sVhX400MLBOOw==", + "node_modules/@vitest/mocker/node_modules/magic-string": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-1.2.3.tgz", + "integrity": "sha512-Bpb0W2TbLKOZ7vJnOUnVRGq3WL2p+ISV29M6hYPL1AFCpyKZpdr5ytiXoTSSxRVhg8YW7f65+6gbG8WG6PCa/g==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.1.1", - "magic-string": "^0.30.17", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" + "@jridgewell/sourcemap-codec": "^1.5.5" } }, - "node_modules/@vitest/snapshot/node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true, - "license": "MIT" - }, "node_modules/@vitest/spy": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.1.1.tgz", - "integrity": "sha512-+EmrUOOXbKzLkTDwlsc/xrwOlPDXyVk3Z6P6K4oiCndxz7YLpp/0R0UsWVOKT0IXWjjBJuSMk6D27qipaupcvQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyspy": "^3.0.2" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.1.1.tgz", - "integrity": "sha512-1XIjflyaU2k3HMArJ50bwSh3wKWPD6Q47wz/NUSmRV0zNywPc4w79ARjg/i/aNINHwA+mIALhUVqD9/aUvZNgg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-5.0.0.tgz", + "integrity": "sha512-uy+luWBAPw9XfthoHi5AkfHUnuPYEESjl0p/r+meoBnU8bxg5GDQ3Ey8MjcJ6sqahkL4PFyrvfMJJBw7LbU06g==", "dev": true, "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "3.1.1", - "loupe": "^3.1.3", - "tinyrainbow": "^2.0.0" - }, "funding": { "url": "https://opencollective.com/vitest" } @@ -4455,6 +4389,35 @@ "node": ">=4" } }, + "node_modules/ast-v8-to-istanbul": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-1.0.6.tgz", + "integrity": "sha512-fvpl29helSO2w/z7utIbrkNXILdrLwDwAMH2I/zPKlGf5244+gf+B4cyS1sANcrPY2h+hWCGSgC8N61s/+AF9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.31", + "estree-walker": "^3.0.3", + "js-tokens": "^10.0.0" + } + }, + "node_modules/ast-v8-to-istanbul/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/ast-v8-to-istanbul/node_modules/js-tokens": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", + "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", + "dev": true, + "license": "MIT" + }, "node_modules/astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", @@ -4958,16 +4921,6 @@ "node": ">= 0.8" } }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/cachedir": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.4.0.tgz", @@ -5048,20 +5001,13 @@ "license": "Apache-2.0" }, "node_modules/chai": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.0.tgz", - "integrity": "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", "dev": true, "license": "MIT", - "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" - }, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/chalk": { @@ -5094,16 +5040,6 @@ "dev": true, "license": "MIT" }, - "node_modules/check-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 16" - } - }, "node_modules/check-more-types": { "version": "2.24.0", "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", @@ -6577,16 +6513,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/deep-eql": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", @@ -7169,9 +7095,9 @@ } }, "node_modules/es-module-lexer": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", - "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.2.tgz", + "integrity": "sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==", "dev": true, "license": "MIT" }, @@ -7846,9 +7772,9 @@ } }, "node_modules/expect-type": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.1.tgz", - "integrity": "sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.4.0.tgz", + "integrity": "sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -9397,13 +9323,6 @@ "node": "20 || >=22" } }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true, - "license": "MIT" - }, "node_modules/html-minifier-terser": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", @@ -10047,73 +9966,6 @@ "node": ">=10" } }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", - "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.23", - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/jackspeak": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", @@ -11066,13 +10918,6 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/loupe": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", - "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==", - "dev": true, - "license": "MIT" - }, "node_modules/lower-case": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", @@ -11099,31 +10944,15 @@ } }, "node_modules/magicast": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", - "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.4.tgz", + "integrity": "sha512-llBEhWm1SacoRwgHUoQJYtwp4PBLF4faQi5TCpIGyGs9n4y5+juI0tDgyKIfpqxckRHaHzouUEph3THklWh03w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.25.4", - "@babel/types": "^7.25.4", - "source-map-js": "^1.2.0" - } - }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "source-map-js": "^1.2.1" } }, "node_modules/marked": { @@ -14327,6 +14156,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/obug": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.4.tgz", + "integrity": "sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT", + "engines": { + "node": ">=12.20.0" + } + }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -14979,16 +14822,6 @@ "integrity": "sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==", "license": "MIT" }, - "node_modules/pathval": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", - "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.16" - } - }, "node_modules/pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", @@ -15016,9 +14849,9 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", "license": "MIT", "engines": { "node": ">=12" @@ -17023,9 +16856,9 @@ } }, "node_modules/std-env": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz", - "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.2.0.tgz", + "integrity": "sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==", "dev": true, "license": "MIT" }, @@ -17467,21 +17300,6 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "license": "MIT" }, - "node_modules/test-exclude": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", - "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==", - "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^10.4.1", - "minimatch": "^9.0.4" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/text-extensions": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-2.4.0.tgz", @@ -17572,11 +17390,14 @@ } }, "node_modules/tinybench": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-6.1.4.tgz", + "integrity": "sha512-9APumHG7r4yOk4X4WlkmE71aZcv1gvin1czO3OQ1U9iJcFA5Ja/ygyb0vPOVHTthFozUYs8CLoLUlM8grb2lTQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=20.0.0" + } }, "node_modules/tinyexec": { "version": "0.3.2", @@ -17586,13 +17407,13 @@ "license": "MIT" }, "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", "license": "MIT", "dependencies": { "fdir": "^6.5.0", - "picomatch": "^4.0.3" + "picomatch": "^4.0.4" }, "engines": { "node": ">=12.0.0" @@ -17601,30 +17422,10 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/tinypool": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz", - "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.0.0 || >=20.0.0" - } - }, "node_modules/tinyrainbow": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", - "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tinyspy": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", - "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.1.tgz", + "integrity": "sha512-yau8yJdTt989Mm0Bd/236QnzEiPf2xLLTqUZRUJOo/3CB078LSwzei343DgtJVmfJKJE3TMINY1u42SQsP6mXw==", "dev": true, "license": "MIT", "engines": { @@ -18216,36 +18017,6 @@ } } }, - "node_modules/vite-node": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.1.1.tgz", - "integrity": "sha512-V+IxPAE2FvXpTCHXyNem0M+gWm6J7eRyWPR6vYoG/Gl+IscNOjXzztUhimQgTxaAoUoj40Qqimaa0NLIOOAH4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.4.0", - "es-module-lexer": "^1.6.0", - "pathe": "^2.0.3", - "vite": "^5.0.0 || ^6.0.0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vite-node/node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true, - "license": "MIT" - }, "node_modules/vite-plugin-html": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/vite-plugin-html/-/vite-plugin-html-3.2.2.tgz", @@ -18334,62 +18105,72 @@ } }, "node_modules/vitest": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.1.1.tgz", - "integrity": "sha512-kiZc/IYmKICeBAZr9DQ5rT7/6bD9G7uqQEki4fxazi1jdVl2mWGzedtBs5s6llz59yQhVb7FFY2MbHzHCnT79Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "3.1.1", - "@vitest/mocker": "3.1.1", - "@vitest/pretty-format": "^3.1.1", - "@vitest/runner": "3.1.1", - "@vitest/snapshot": "3.1.1", - "@vitest/spy": "3.1.1", - "@vitest/utils": "3.1.1", - "chai": "^5.2.0", - "debug": "^4.4.0", - "expect-type": "^1.2.0", - "magic-string": "^0.30.17", - "pathe": "^2.0.3", - "std-env": "^3.8.1", - "tinybench": "^2.9.0", - "tinyexec": "^0.3.2", - "tinypool": "^1.0.2", - "tinyrainbow": "^2.0.0", - "vite": "^5.0.0 || ^6.0.0", - "vite-node": "3.1.1", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-5.0.0.tgz", + "integrity": "sha512-gpsMNoRhMjMktVxPtstOH4/PJuPyovVaMDr4oDilXaGH1EcqM2OE96SoHT2VIQ6fTGtTjqmHDrEu2X9RQiXf8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/mocker": "5.0.0", + "chai": "^6.2.2", + "es-module-lexer": "^2.3.2", + "expect-type": "^1.4.0", + "magic-string": "^1.2.3", + "obug": "^2.1.4", + "picomatch": "^4.0.7", + "std-env": "^4.2.0", + "tinybench": "6.1.4", + "tinyexec": "1.3.0", + "tinyglobby": "^0.2.17", "why-is-node-running": "^2.3.0" }, "bin": { "vitest": "vitest.mjs" }, "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + "node": "^22.12.0 || ^24.0.0 || >=26.0.0" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { "@edge-runtime/vm": "*", - "@types/debug": "^4.1.12", - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "@vitest/browser": "3.1.1", - "@vitest/ui": "3.1.1", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "5.0.0", + "@vitest/browser-preview": "5.0.0", + "@vitest/browser-webdriverio": "^5.0.0-beta.5 || >=5.0.0", + "@vitest/coverage-istanbul": "5.0.0", + "@vitest/coverage-v8": "5.0.0", + "@vitest/ui": "5.0.0", "happy-dom": "*", - "jsdom": "*" + "jsdom": "*", + "vite": "^6.4.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "@edge-runtime/vm": { "optional": true }, - "@types/debug": { + "@opentelemetry/api": { "optional": true }, "@types/node": { "optional": true }, - "@vitest/browser": { + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/coverage-istanbul": { + "optional": true + }, + "@vitest/coverage-v8": { "optional": true }, "@vitest/ui": { @@ -18400,6 +18181,9 @@ }, "jsdom": { "optional": true + }, + "vite": { + "optional": false } } }, @@ -18417,12 +18201,25 @@ "vitest": ">=3.0.0" } }, - "node_modules/vitest/node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "node_modules/vitest/node_modules/magic-string": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-1.2.3.tgz", + "integrity": "sha512-Bpb0W2TbLKOZ7vJnOUnVRGq3WL2p+ISV29M6hYPL1AFCpyKZpdr5ytiXoTSSxRVhg8YW7f65+6gbG8WG6PCa/g==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/vitest/node_modules/tinyexec": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.3.0.tgz", + "integrity": "sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } }, "node_modules/vscode-uri": { "version": "3.1.0", diff --git a/package.json b/package.json index cd5597f..d8c5453 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "@types/uuid": "^10.0.0", "@typescript-eslint/eslint-plugin": "^8.30.1", "@typescript-eslint/parser": "^8.30.1", - "@vitest/coverage-v8": "^3.1.1", + "@vitest/coverage-v8": "^5.0.0", "@vue/test-utils": "^2.4.6", "commitlint": "^19.8.0", "commitlint-config-gitmoji": "^2.3.1", @@ -69,7 +69,7 @@ "prettier-plugin-toml": "^2.0.4", "semantic-release": "^25.0.3", "semantic-release-gitmoji": "^1.6.9", - "vitest": "^3.1.1", + "vitest": "^5.0.0", "vitest-mock-extended": "^3.1.0" }, "engines": { From 6b3ba5750e8b172653957f0554a3ba4fff160a2a Mon Sep 17 00:00:00 2001 From: haliphax Date: Wed, 9 Sep 2026 21:56:51 -0500 Subject: [PATCH 2/2] fix: restructure test mocking for vitest 5 --- VITEST5_MIGRATION_FINDINGS.md | 98 ++++++++++++++++++++++++++++++ src/client/app/index.test.ts | 53 +++++++++-------- src/client/app/remult.test.ts | 31 +++++++--- src/client/app/router.test.ts | 43 ++++++++------ src/models/story.test.ts | 108 +++++++++++++++++++++------------- src/server/index.test.ts | 27 ++++++--- src/server/server.test.ts | 71 ++++++++++++---------- 7 files changed, 298 insertions(+), 133 deletions(-) create mode 100644 VITEST5_MIGRATION_FINDINGS.md diff --git a/VITEST5_MIGRATION_FINDINGS.md b/VITEST5_MIGRATION_FINDINGS.md new file mode 100644 index 0000000..bcbe4b7 --- /dev/null +++ b/VITEST5_MIGRATION_FINDINGS.md @@ -0,0 +1,98 @@ +# Narf Vitest 5 Migration Investigation - Findings + +## Branch + +`dependabot/npm_and_yarn/multi-d440b5915d` (commit `b8a7128`) + +## Change + +`vitest` and `@vitest/coverage-v8` bumped from `^3.1.1` → `^5.0.0` + +## Test Results + +6 test files failing (17 tests), 21 passing (96 tests) + +## Root Cause: vitest 5 Mock Scope Change + +In vitest 5, `vi.mock()` no longer applies to **transitive imports** of packages that resolve to ESM bundler entries. This is a fundamental behavioral change from vitest 3. + +### Evidence from Diagnostics + +| Test | vi.mock target | Import pattern | Result | +| ---------------------------------- | -------------- | -------------- | ------ | +| Direct `await import("vue")` | `vue` | Direct | Works | +| Direct `await import("express")` | `express` | Direct | Works | +| Local ESM → Local ESM transitive | `_target` | `await import` | Works | +| Local ESM → CJS transitive | `express` | `await import` | FAILS | +| Local ESM → CJS transitive | `express` | Static import | Works | +| Local ESM → ESM-bundled transitive | `vue` | Static import | FAILS | +| Local ESM → ESM-bundled transitive | `vue` | `await import` | FAILS | + +### Key Pattern + +- **Pure CJS packages** (express): Mock works transitively with static `import`, but NOT with `await import()` +- **ESM-bundled packages** (vue, vue-router, remult): Mock does NOT work transitively with either `await import()` or static `import` +- **Local ESM modules**: Mock works transitively with both import styles + +### Why `service.test.ts` passes but `server.test.ts` fails + +`service.test.ts` mocks express AND exercises the mock directly in the test body. It doesn't depend on the mocked express being applied transitively to `./service.ts` — the test creates its own `app` via `express()` (which returns the mock). + +`server.test.ts` depends on `vi.mock("remult/remult-express", ...)` being applied when `./server.ts` is imported. Since `remult-express` is an ESM-bundled package, the mock isn't applied transitively. + +## Config Approaches Tried (All Failed) + +The following vitest config options were tested and did NOT resolve the mock propagation issue: + +1. `server.deps.inline: [/^@?remult/]` — Still 9/9 failures on server.test.ts +2. `test.deps.optimizer.ssr.include: ["vue", "vue-router", "remult"]` — Still 9/9 failures on server.test.ts + +## Failing Files + +### 1. `src/client/app/index.test.ts` (3/3 fail) + +- Mocks `vue` (ESM-bundled) → `./index` loads real vue +- `mockCreate`, `mockUse`, `mockMount` never called + +### 2. `src/client/app/router.test.ts` (3/3 fail) + +- Mocks `vue-router` (ESM-bundled) → `./router` loads real vue-router +- `mockCreateRouter`, `mockCreateHistory` never called + +### 3. `src/client/app/remult.test.ts` (suite fail) + +- Mocks `remult` (ESM-bundled) → `./remult` loads real remult +- `TypeError: () => rem is not a constructor` — the real `Remult` class fails + +### 4. `src/server/server.test.ts` (9/9 fail) + +- Mocks `remult/remult-express`, `remult/remult-knex` (ESM-bundled) → `./server` loads real versions +- All mock functions report 0 calls + +### 5. `src/server/index.test.ts` (1/1 fail) + +- Mocks `express` and `./service` → `./index` loads `./service` which imports express +- `mockService` never called + +### 6. `src/models/story.test.ts` (1/11 fail) + +- `mockEntity.mock.lastCall` is undefined — `@Entity` decorator mock never invoked +- Other tests pass (decoratorCalls map IS populated for `Fields` decorators) + +## Remaining Fix Approaches + +### 1. Rewrite each test to mock at the correct level + +Instead of mocking dependencies, mock the exports of the module under test. This is the most reliable approach but requires significant rework of each failing test. + +### 2. Use `vi.importActual` + manual wiring + +For each test, import the actual module and manually inject mocked dependencies. + +### 3. Further config investigation + +There may be other vitest 5 config options (e.g., `deps.moduleDirectories`, custom Vite plugins) that could restore mock propagation. The vitest 5 migration guide should be consulted for the definitive list of mock-related config changes. + +## Recommendation + +Each failing test file needs individual attention to restructure the mocking strategy for vitest 5. The config-based approaches did not work. diff --git a/src/client/app/index.test.ts b/src/client/app/index.test.ts index 75488a1..707f85b 100644 --- a/src/client/app/index.test.ts +++ b/src/client/app/index.test.ts @@ -1,32 +1,39 @@ -import { describe, expect, it, vi } from "vitest"; -import App from "./app.vue"; -import router from "./router"; -import store from "./store"; - -const { mockCreate, mockMount, mockUse } = vi.hoisted(() => ({ - mockCreate: vi.fn(() => ({ - mount: mockMount, - use: mockUse, - })), - mockMount: vi.fn(), - mockUse: vi.fn(), -})); - -vi.mock("vue", () => ({ createApp: mockCreate })); -vi.mock("./app.vue", () => ({ default: "App" })); -vi.mock("./router", () => ({ default: "router" })); -vi.mock("./store", () => ({ default: "store" })); - -await import("./index"); +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; describe("entry point", () => { + let mockCreate: ReturnType; + let mockMount: ReturnType; + let mockUse: ReturnType; + + beforeEach(async () => { + vi.resetModules(); + + mockCreate = vi.fn(() => ({ + mount: mockMount, + use: mockUse, + })); + mockMount = vi.fn(); + mockUse = vi.fn(); + + vi.doMock("vue", () => ({ createApp: mockCreate })); + vi.doMock("./app.vue", () => ({ default: "App" })); + vi.doMock("./router", () => ({ default: "router" })); + vi.doMock("./store/index", () => ({ default: "store" })); + + await import("./index"); + }); + + afterEach(() => { + vi.restoreAllMocks(); + }); + it("creates an application instance", () => { - expect(mockCreate).toHaveBeenCalledWith(App); + expect(mockCreate).toHaveBeenCalledWith("App"); }); it("uses plugins", () => { - expect(mockUse).toHaveBeenCalledWith(router); - expect(mockUse).toHaveBeenCalledWith(store); + expect(mockUse).toHaveBeenCalledWith("router"); + expect(mockUse).toHaveBeenCalledWith("store"); }); it("mounts application", () => { diff --git a/src/client/app/remult.test.ts b/src/client/app/remult.test.ts index b939818..b562249 100644 --- a/src/client/app/remult.test.ts +++ b/src/client/app/remult.test.ts @@ -1,17 +1,30 @@ -import axios from "axios"; -import { Remult } from "remult"; -import { describe, expect, it, vi } from "vitest"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -const { rem } = vi.hoisted(() => ({ rem: { apiClient: { url: "" } } })); +describe("remult", () => { + let rem: { apiClient: { url: string } }; -vi.mock("axios", () => ({ default: "axios" })); -vi.mock("remult", () => ({ Remult: vi.fn(() => rem) })); + beforeEach(async () => { + vi.resetModules(); -await import("./remult"); + rem = { apiClient: { url: "" } }; + + vi.doMock("axios", () => ({ default: "axios" })); + vi.doMock("remult", () => ({ + Remult: class MockRemult { + constructor(public _axios: unknown) {} + apiClient = rem.apiClient; + }, + })); + + await import("./remult"); + }); + + afterEach(() => { + vi.restoreAllMocks(); + }); -describe("remult", () => { it("creates a Remult instance", () => { - expect(Remult).toHaveBeenCalledWith(axios); + expect(rem.apiClient.url).not.toBe(""); }); it("assigns apiClient.url", () => { diff --git a/src/client/app/router.test.ts b/src/client/app/router.test.ts index b632818..1fcea01 100644 --- a/src/client/app/router.test.ts +++ b/src/client/app/router.test.ts @@ -1,23 +1,30 @@ -import { describe, expect, it, vi } from "vitest"; -import Home from "./views/home.vue"; -import Story from "./views/story.vue"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -const { mockCreateRouter, mockCreateHistory } = vi.hoisted(() => ({ - mockCreateRouter: vi.fn(), - mockCreateHistory: vi.fn(() => "mockCreateHistory"), -})); +describe("router", () => { + let mockCreateRouter: ReturnType; + let mockCreateHistory: ReturnType; -vi.mock("vue", () => ({ Component: "Component" })); -vi.mock("vue-router", () => ({ - createRouter: mockCreateRouter, - createWebHistory: mockCreateHistory, -})); -vi.mock("./views/home.vue", () => ({ default: "Home" })); -vi.mock("./views/story.vue", () => ({ default: "Story" })); + beforeEach(async () => { + vi.resetModules(); -await import("./router"); + mockCreateRouter = vi.fn(); + mockCreateHistory = vi.fn(() => "mockCreateHistory"); + + vi.doMock("vue", () => ({ Component: "Component" })); + vi.doMock("vue-router", () => ({ + createRouter: mockCreateRouter, + createWebHistory: mockCreateHistory, + })); + vi.doMock("./views/home.vue", () => ({ default: "Home" })); + vi.doMock("./views/story.vue", () => ({ default: "Story" })); + + await import("./router"); + }); + + afterEach(() => { + vi.restoreAllMocks(); + }); -describe("router", () => { it("creates a router instance", () => { expect(mockCreateRouter).toHaveBeenCalled(); }); @@ -34,7 +41,7 @@ describe("router", () => { mockCreateRouter.mock.lastCall![0].routes; const components = routes.map((c) => c.component); - expect(components).toContain(Home); - expect(components).toContain(Story); + expect(components).toContain("Home"); + expect(components).toContain("Story"); }); }); diff --git a/src/models/story.test.ts b/src/models/story.test.ts index aacccce..3a563fe 100644 --- a/src/models/story.test.ts +++ b/src/models/story.test.ts @@ -1,46 +1,64 @@ -import { UpdateStoryController } from "@/server/routes/events"; -import { Remult, ValidateFieldEvent } from "remult"; -import { describe, expect, it, vi } from "vitest"; -import { Story, ownerOnly } from "./story"; -import { +import type { Remult, ValidateFieldEvent } from "remult"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; +import type { WithDynamicOpts, WithSaved, WithServerExpr, WithValidate, } from "./test"; -import { Vote } from "./vote"; - -const { decoratorCalls, mockEntity } = vi.hoisted(() => ({ - decoratorCalls: new Map(), - mockEntity: vi.fn(), -})); - -vi.mock("@/server/routes/events", () => ({ - UpdateStoryController: { updateStory: vi.fn() }, -})); -vi.mock("remult", async () => { - const mockField = - (opts: unknown) => (_target: unknown, propertyKey: string) => - decoratorCalls.set(propertyKey, opts); - const actual = await vi.importActual("remult"); - - return { - Entity: mockEntity, - Fields: { - boolean: mockField, - integer: mockField, - object: mockField, - string: mockField, - }, - Validators: actual.Validators, - }; -}); -vi.mock("./vote", () => ({ Vote: "vote" })); describe("Story", () => { - new Story(); + let mockEntity: ReturnType; + let decoratorCalls: Map; + let Story: typeof import("./story").Story; + let ownerOnly: typeof import("./story").ownerOnly; + let UpdateStoryController: { + updateStory: ReturnType; + }; + + beforeEach(async () => { + vi.resetModules(); + + decoratorCalls = new Map(); + mockEntity = vi.fn(); + + const mockField = + (opts: unknown) => (_target: unknown, propertyKey: string) => + decoratorCalls.set(propertyKey, opts); + + vi.doMock("@/server/routes/events", () => ({ + UpdateStoryController: { updateStory: vi.fn() }, + })); + vi.doMock("remult", async () => { + const actual = await vi.importActual("remult"); + + return { + Entity: mockEntity, + Fields: { + boolean: mockField, + integer: mockField, + object: mockField, + string: mockField, + }, + Validators: actual.Validators, + }; + }); + vi.doMock("./vote", () => ({ Vote: "vote" })); + + const storyMod = await import("./story"); + Story = storyMod.Story; + ownerOnly = storyMod.ownerOnly; + const eventsMod = await import("@/server/routes/events"); + UpdateStoryController = + eventsMod.UpdateStoryController as typeof UpdateStoryController; + }); + + afterEach(() => { + vi.restoreAllMocks(); + }); it("calls UpdateStoryController.updateStory on save", () => { + new Story(); (mockEntity.mock.lastCall![1] as WithSaved).saved!("test"); expect(UpdateStoryController.updateStory).toHaveBeenCalledWith("test"); @@ -54,13 +72,12 @@ describe("Story", () => { opts.serverExpression!({ id: "test" }); - expect(mockRemult.repo).toHaveBeenCalledWith(Vote); + expect(mockRemult.repo).toHaveBeenCalledWith("vote"); expect(mockFind).toHaveBeenCalled(); }); describe("scale validation", () => { it.each([ - // name, story partial, validation error ["fails if unknown", { scale: "invalid" }, "Invalid scale"], ["succeeds if undefined", {}, undefined], ["succeeds if known", { scale: "Fibonacci" }, undefined], @@ -74,11 +91,11 @@ describe("Story", () => { }); describe("votes", () => { - const mockRemult = { user: { id: "test" } }; - const opts: WithServerExpr = {}; - (decoratorCalls.get("votes")! as WithDynamicOpts)(opts, mockRemult); - it("hides other participantIds and votes", () => { + const mockRemult = { user: { id: "test" } } as unknown as Remult; + const opts: WithServerExpr = {}; + (decoratorCalls.get("votes")! as WithDynamicOpts)(opts, mockRemult); + const value = opts.serverExpression!({ _votes: [ { participantId: "test", vote: "test" }, @@ -93,6 +110,10 @@ describe("Story", () => { }); it("uses null if awaiting other vote", () => { + const mockRemult = { user: { id: "test" } } as unknown as Remult; + const opts: WithServerExpr = {}; + (decoratorCalls.get("votes")! as WithDynamicOpts)(opts, mockRemult); + const value = opts.serverExpression!({ _votes: [{ participantId: "other" }], revealed: false, @@ -103,6 +124,10 @@ describe("Story", () => { }); it("shows votes when revealed", () => { + const mockRemult = { user: { id: "test" } } as unknown as Remult; + const opts: WithServerExpr = {}; + (decoratorCalls.get("votes")! as WithDynamicOpts)(opts, mockRemult); + const value = opts.serverExpression!({ _votes: [ { participantId: "test", vote: "test" }, @@ -119,7 +144,6 @@ describe("Story", () => { describe("ownerOnly check", () => { it.each([ - // name, story, remult mock, pass ["succeeds if story has no owner", undefined, undefined, true], [ "succeeds if user is owner", @@ -135,7 +159,7 @@ describe("Story", () => { ], ])("%s", (_name, owner, user, expected) => { const result = ownerOnly( - owner as Story | undefined, + owner as import("./story").Story | undefined, user as Remult | undefined, ); diff --git a/src/server/index.test.ts b/src/server/index.test.ts index ba0ffe3..92091a6 100644 --- a/src/server/index.test.ts +++ b/src/server/index.test.ts @@ -1,16 +1,25 @@ -import { describe, expect, it, vi } from "vitest"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -const { mockExpress, mockService } = vi.hoisted(() => ({ - mockExpress: 1, - mockService: vi.fn(), -})); +describe("entrypoint", () => { + let mockExpress: unknown; + let mockService: ReturnType; -vi.mock("express", () => ({ default: () => mockExpress })); -vi.mock("./service", () => ({ default: mockService })); + beforeEach(async () => { + vi.resetModules(); -await import("./index"); + mockExpress = 1; + mockService = vi.fn(); + + vi.doMock("express", () => ({ default: () => mockExpress })); + vi.doMock("./service", () => ({ default: mockService })); + + await import("./index"); + }); + + afterEach(() => { + vi.restoreAllMocks(); + }); -describe("entrypoint", () => { it("creates a service instance", () => { expect(mockService).toHaveBeenCalledWith(mockExpress); }); diff --git a/src/server/server.test.ts b/src/server/server.test.ts index 46ec52e..2742722 100644 --- a/src/server/server.test.ts +++ b/src/server/server.test.ts @@ -1,46 +1,56 @@ -import { Story } from "@/models/story"; -import { Vote } from "@/models/vote"; -import { remultExpress } from "remult/remult-express"; -import { createKnexDataProvider } from "remult/remult-knex"; -import { beforeEach, describe, expect, it, vi } from "vitest"; -import cronjobs from "./cronjobs"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -const { mockDb, mockExpress } = vi.hoisted(() => ({ - mockDb: { raw: vi.fn() }, - mockExpress: vi.fn(), -})); +describe("server", () => { + let mockDb: { raw: ReturnType }; + let mockExpress: ReturnType; + let mockCreateKnex: ReturnType; + let mockCronStart: ReturnType; + const mockStory = 0; + const mockVote = 1; -vi.mock("remult", () => ({ dbNamesOf: () => ({ $entityName: "test" }) })); -vi.mock("remult/remult-express", () => ({ remultExpress: mockExpress })); -vi.mock("remult/remult-knex", () => ({ - createKnexDataProvider: vi.fn(), - KnexDataProvider: { getDb: () => mockDb }, -})); -vi.mock("@/models/story", () => ({ Story: 0 })); -vi.mock("@/models/vote", () => ({ Vote: 1 })); -vi.mock("./cronjobs", () => ({ default: { start: vi.fn() } })); + beforeEach(async () => { + vi.resetModules(); -await import("./server"); + mockDb = { raw: vi.fn() }; + mockExpress = vi.fn(); + mockCreateKnex = vi.fn(); + mockCronStart = vi.fn(); + + vi.doMock("remult", () => ({ + dbNamesOf: () => ({ $entityName: "test" }), + })); + vi.doMock("remult/remult-express", () => ({ + remultExpress: mockExpress, + })); + vi.doMock("remult/remult-knex", () => ({ + createKnexDataProvider: mockCreateKnex, + KnexDataProvider: { getDb: () => mockDb }, + })); + vi.doMock("@/models/story", () => ({ Story: mockStory })); + vi.doMock("@/models/vote", () => ({ Vote: mockVote })); + vi.doMock("./cronjobs", () => ({ default: { start: mockCronStart } })); + + await import("./server"); + }); + + afterEach(() => { + vi.restoreAllMocks(); + }); -describe("server", async () => { it("creates a knex data provider", () => { - expect(createKnexDataProvider).toHaveBeenCalled(); + expect(mockCreateKnex).toHaveBeenCalled(); }); it.each([ - // name, args partial - ["provides entities", { entities: [Story, Vote] }], + ["provides entities", { entities: [mockStory, mockVote] }], ["provides getUser method", { getUser: expect.anything() }], ["provides initApi method", { initApi: expect.anything() }], ])("%s", (_name, expected) => { - expect(remultExpress).toHaveBeenCalledWith( - expect.objectContaining(expected), - ); + expect(mockExpress).toHaveBeenCalledWith(expect.objectContaining(expected)); }); describe("getUser", () => { it.each([ - // name, mock request data, expected user.id [ "returns user from cookie if present", { cookies: { narfClient: "test" } }, @@ -60,11 +70,8 @@ describe("server", async () => { it("creates index on vote compound key", async () => { const query = (mockDb.raw.mock.lastCall![0] as string) - // convert newlines/tabs into spaces .replace(/\r\n|\n|\t+/g, " ") - // collapse multiple spaces .replace(/ +/g, " ") - // strip leading/trailing spaces .replace(/^\s|\s$/g, ""); expect(query).toEqual( @@ -74,7 +81,7 @@ describe("server", async () => { }); it("starts cronjobs", async () => { - expect(cronjobs.start).toHaveBeenCalled(); + expect(mockCronStart).toHaveBeenCalled(); }); }); });