From e3d33db15444eb8fb59cea5a51dc6fa46ed82e73 Mon Sep 17 00:00:00 2001 From: Gauthier Roebroeck Date: Wed, 12 Nov 2025 15:28:26 +0800 Subject: [PATCH] update for vitest 4 --- next-ui/dir2json.d.ts | 4 +- next-ui/package-lock.json | 73 ++++++- next-ui/package.json | 2 +- next-ui/src/components.d.ts | 5 +- next-ui/src/typed-router.d.ts | 359 ++++++++++++++++++++++++++-------- next-ui/vite.config.mts | 3 +- 6 files changed, 362 insertions(+), 84 deletions(-) diff --git a/next-ui/dir2json.d.ts b/next-ui/dir2json.d.ts index b74ff1ef..62b99521 100644 --- a/next-ui/dir2json.d.ts +++ b/next-ui/dir2json.d.ts @@ -4,9 +4,7 @@ // noinspection JSUnusedGlobalSymbols // Auto generated by vite-plugin-dir2json declare module "*i18n?dir2json&ext=.json&1" { - const json: { - "en": string; -}; + const json: {}; export default json; } diff --git a/next-ui/package-lock.json b/next-ui/package-lock.json index 0e813d9c..23d65d40 100644 --- a/next-ui/package-lock.json +++ b/next-ui/package-lock.json @@ -39,7 +39,7 @@ "@types/node": "^24.10.1", "@unocss/preset-icons": "^66.5.6", "@vitejs/plugin-vue": "^6.0.1", - "@vitest/browser": "^4.0.8", + "@vitest/browser-playwright": "^4.0.8", "@vitest/coverage-v8": "^4.0.8", "@vue/eslint-config-prettier": "^10.2.0", "@vue/eslint-config-typescript": "^14.6.0", @@ -3816,6 +3816,77 @@ "vitest": "4.0.8" } }, + "node_modules/@vitest/browser-playwright": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@vitest/browser-playwright/-/browser-playwright-4.0.8.tgz", + "integrity": "sha512-MUi0msIAPXcA2YAuVMcssrSYP/yylxLt347xyTC6+ODl0c4XQFs0d2AN3Pc3iTa0pxIGmogflUV6eogXpPbJeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/browser": "4.0.8", + "@vitest/mocker": "4.0.8", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "playwright": "*", + "vitest": "4.0.8" + }, + "peerDependenciesMeta": { + "playwright": { + "optional": false + } + } + }, + "node_modules/@vitest/browser-playwright/node_modules/@vitest/mocker": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.8.tgz", + "integrity": "sha512-9FRM3MZCedXH3+pIh+ME5Up2NBBHDq0wqwhOKkN4VnvCiKbVxddqH9mSGPZeawjd12pCOGnl+lo/ZGHt0/dQSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.0.8", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/browser-playwright/node_modules/@vitest/spy": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.8.tgz", + "integrity": "sha512-nvGVqUunyCgZH7kmo+Ord4WgZ7lN0sOULYXUOYuHr55dvg9YvMz3izfB189Pgp28w0vWFbEEfNc/c3VTrqrXeA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/browser-playwright/node_modules/tinyrainbow": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", + "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@vitest/browser/node_modules/@vitest/mocker": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.8.tgz", diff --git a/next-ui/package.json b/next-ui/package.json index c79fe797..86133145 100644 --- a/next-ui/package.json +++ b/next-ui/package.json @@ -59,7 +59,7 @@ "@types/node": "^24.10.1", "@unocss/preset-icons": "^66.5.6", "@vitejs/plugin-vue": "^6.0.1", - "@vitest/browser": "^4.0.8", + "@vitest/browser-playwright": "^4.0.8", "@vitest/coverage-v8": "^4.0.8", "@vue/eslint-config-prettier": "^10.2.0", "@vue/eslint-config-typescript": "^14.6.0", diff --git a/next-ui/src/components.d.ts b/next-ui/src/components.d.ts index 1f0ce80c..76f07599 100644 --- a/next-ui/src/components.d.ts +++ b/next-ui/src/components.d.ts @@ -1,8 +1,11 @@ /* eslint-disable */ // @ts-nocheck +// biome-ignore lint: disable +// oxlint-disable +// ------ // Generated by unplugin-vue-components // Read more: https://github.com/vuejs/core/pull/3399 -// biome-ignore lint: disable + export {} /* prettier-ignore */ diff --git a/next-ui/src/typed-router.d.ts b/next-ui/src/typed-router.d.ts index cfef3dfc..3d1a6cfc 100644 --- a/next-ui/src/typed-router.d.ts +++ b/next-ui/src/typed-router.d.ts @@ -1,10 +1,15 @@ /* eslint-disable */ /* prettier-ignore */ // @ts-nocheck +// noinspection ES6UnusedImports // Generated by unplugin-vue-router. ‼️ DO NOT MODIFY THIS FILE ‼️ // It's recommended to commit this file. // Make sure to add this file to your tsconfig.json file as an "includes" or "files" entry. +declare module 'vue-router/auto-resolver' { + export type ParamParserCustom = never +} + declare module 'vue-router/auto-routes' { import type { RouteRecordInfo, @@ -18,36 +23,186 @@ declare module 'vue-router/auto-routes' { * Route name map generated by unplugin-vue-router */ export interface RouteNamedMap { - '/': RouteRecordInfo<'/', '/', Record, Record>, - '/[...path]': RouteRecordInfo<'/[...path]', '/:path(.*)', { path: ParamValue }, { path: ParamValue }>, - '/account/activity': RouteRecordInfo<'/account/activity', '/account/activity', Record, Record>, - '/account/api-keys': RouteRecordInfo<'/account/api-keys', '/account/api-keys', Record, Record>, - '/account/details': RouteRecordInfo<'/account/details', '/account/details', Record, Record>, - '/account/ui': RouteRecordInfo<'/account/ui', '/account/ui', Record, Record>, - '/claim': RouteRecordInfo<'/claim', '/claim', Record, Record>, - '/error': RouteRecordInfo<'/error', '/error', Record, Record>, - '/history': RouteRecordInfo<'/history', '/history', Record, Record>, - '/import/books': RouteRecordInfo<'/import/books', '/import/books', Record, Record>, - '/import/readlist': RouteRecordInfo<'/import/readlist', '/import/readlist', Record, Record>, - '/login': RouteRecordInfo<'/login', '/login', Record, Record>, - '/media/analysis': RouteRecordInfo<'/media/analysis', '/media/analysis', Record, Record>, - '/media/duplicate-files': RouteRecordInfo<'/media/duplicate-files', '/media/duplicate-files', Record, Record>, - '/media/duplicate-pages/known': RouteRecordInfo<'/media/duplicate-pages/known', '/media/duplicate-pages/known', Record, Record>, - '/media/duplicate-pages/unknown': RouteRecordInfo<'/media/duplicate-pages/unknown', '/media/duplicate-pages/unknown', Record, Record>, - '/media/missing-posters': RouteRecordInfo<'/media/missing-posters', '/media/missing-posters', Record, Record>, - '/server/activity': RouteRecordInfo<'/server/activity', '/server/activity', Record, Record>, - '/server/announcements': RouteRecordInfo<'/server/announcements', '/server/announcements', Record, Record>, - '/server/metrics': RouteRecordInfo<'/server/metrics', '/server/metrics', Record, Record>, - '/server/settings': RouteRecordInfo<'/server/settings', '/server/settings', Record, Record>, - '/server/ui': RouteRecordInfo<'/server/ui', '/server/ui', Record, Record>, - '/server/updates': RouteRecordInfo<'/server/updates', '/server/updates', Record, Record>, - '/server/users': RouteRecordInfo<'/server/users', '/server/users', Record, Record>, - '/startup': RouteRecordInfo<'/startup', '/startup', Record, Record>, + '/': RouteRecordInfo< + '/', + '/', + Record, + Record, + | never + >, + '/[...path]': RouteRecordInfo< + '/[...path]', + '/:path(.*)', + { path: ParamValue }, + { path: ParamValue }, + | never + >, + '/account/activity': RouteRecordInfo< + '/account/activity', + '/account/activity', + Record, + Record, + | never + >, + '/account/api-keys': RouteRecordInfo< + '/account/api-keys', + '/account/api-keys', + Record, + Record, + | never + >, + '/account/details': RouteRecordInfo< + '/account/details', + '/account/details', + Record, + Record, + | never + >, + '/account/ui': RouteRecordInfo< + '/account/ui', + '/account/ui', + Record, + Record, + | never + >, + '/claim': RouteRecordInfo< + '/claim', + '/claim', + Record, + Record, + | never + >, + '/error': RouteRecordInfo< + '/error', + '/error', + Record, + Record, + | never + >, + '/history': RouteRecordInfo< + '/history', + '/history', + Record, + Record, + | never + >, + '/import/books': RouteRecordInfo< + '/import/books', + '/import/books', + Record, + Record, + | never + >, + '/import/readlist': RouteRecordInfo< + '/import/readlist', + '/import/readlist', + Record, + Record, + | never + >, + '/login': RouteRecordInfo< + '/login', + '/login', + Record, + Record, + | never + >, + '/media/analysis': RouteRecordInfo< + '/media/analysis', + '/media/analysis', + Record, + Record, + | never + >, + '/media/duplicate-files': RouteRecordInfo< + '/media/duplicate-files', + '/media/duplicate-files', + Record, + Record, + | never + >, + '/media/duplicate-pages/known': RouteRecordInfo< + '/media/duplicate-pages/known', + '/media/duplicate-pages/known', + Record, + Record, + | never + >, + '/media/duplicate-pages/unknown': RouteRecordInfo< + '/media/duplicate-pages/unknown', + '/media/duplicate-pages/unknown', + Record, + Record, + | never + >, + '/media/missing-posters': RouteRecordInfo< + '/media/missing-posters', + '/media/missing-posters', + Record, + Record, + | never + >, + '/server/activity': RouteRecordInfo< + '/server/activity', + '/server/activity', + Record, + Record, + | never + >, + '/server/announcements': RouteRecordInfo< + '/server/announcements', + '/server/announcements', + Record, + Record, + | never + >, + '/server/metrics': RouteRecordInfo< + '/server/metrics', + '/server/metrics', + Record, + Record, + | never + >, + '/server/settings': RouteRecordInfo< + '/server/settings', + '/server/settings', + Record, + Record, + | never + >, + '/server/ui': RouteRecordInfo< + '/server/ui', + '/server/ui', + Record, + Record, + | never + >, + '/server/updates': RouteRecordInfo< + '/server/updates', + '/server/updates', + Record, + Record, + | never + >, + '/server/users': RouteRecordInfo< + '/server/users', + '/server/users', + Record, + Record, + | never + >, + '/startup': RouteRecordInfo< + '/startup', + '/startup', + Record, + Record, + | never + >, } /** * Route file to route info map by unplugin-vue-router. - * Used by the volar plugin to automatically type useRoute() + * Used by the \`sfc-typed-router\` Volar plugin to automatically type \`useRoute()\`. * * Each key is a file path relative to the project root with 2 properties: * - routes: union of route names of the possible routes when in this page (passed to useRoute<...>()) @@ -57,110 +212,160 @@ declare module 'vue-router/auto-routes' { */ export interface _RouteFileInfoMap { 'src/pages/index.vue': { - routes: '/' - views: never + routes: + | '/' + views: + | never } 'src/pages/[...path].vue': { - routes: '/[...path]' - views: never + routes: + | '/[...path]' + views: + | never } 'src/pages/account/activity.vue': { - routes: '/account/activity' - views: never + routes: + | '/account/activity' + views: + | never } 'src/pages/account/api-keys.vue': { - routes: '/account/api-keys' - views: never + routes: + | '/account/api-keys' + views: + | never } 'src/pages/account/details.vue': { - routes: '/account/details' - views: never + routes: + | '/account/details' + views: + | never } 'src/pages/account/ui.vue': { - routes: '/account/ui' - views: never + routes: + | '/account/ui' + views: + | never } 'src/pages/claim.vue': { - routes: '/claim' - views: never + routes: + | '/claim' + views: + | never } 'src/pages/error.vue': { - routes: '/error' - views: never + routes: + | '/error' + views: + | never } 'src/pages/history.vue': { - routes: '/history' - views: never + routes: + | '/history' + views: + | never } 'src/pages/import/books.vue': { - routes: '/import/books' - views: never + routes: + | '/import/books' + views: + | never } 'src/pages/import/readlist.vue': { - routes: '/import/readlist' - views: never + routes: + | '/import/readlist' + views: + | never } 'src/pages/login.vue': { - routes: '/login' - views: never + routes: + | '/login' + views: + | never } 'src/pages/media/analysis.vue': { - routes: '/media/analysis' - views: never + routes: + | '/media/analysis' + views: + | never } 'src/pages/media/duplicate-files.vue': { - routes: '/media/duplicate-files' - views: never + routes: + | '/media/duplicate-files' + views: + | never } 'src/pages/media/duplicate-pages/known.vue': { - routes: '/media/duplicate-pages/known' - views: never + routes: + | '/media/duplicate-pages/known' + views: + | never } 'src/pages/media/duplicate-pages/unknown.vue': { - routes: '/media/duplicate-pages/unknown' - views: never + routes: + | '/media/duplicate-pages/unknown' + views: + | never } 'src/pages/media/missing-posters.vue': { - routes: '/media/missing-posters' - views: never + routes: + | '/media/missing-posters' + views: + | never } 'src/pages/server/activity.vue': { - routes: '/server/activity' - views: never + routes: + | '/server/activity' + views: + | never } 'src/pages/server/announcements.vue': { - routes: '/server/announcements' - views: never + routes: + | '/server/announcements' + views: + | never } 'src/pages/server/metrics.vue': { - routes: '/server/metrics' - views: never + routes: + | '/server/metrics' + views: + | never } 'src/pages/server/settings.vue': { - routes: '/server/settings' - views: never + routes: + | '/server/settings' + views: + | never } 'src/pages/server/ui.vue': { - routes: '/server/ui' - views: never + routes: + | '/server/ui' + views: + | never } 'src/pages/server/updates.vue': { - routes: '/server/updates' - views: never + routes: + | '/server/updates' + views: + | never } 'src/pages/server/users.vue': { - routes: '/server/users' - views: never + routes: + | '/server/users' + views: + | never } 'src/pages/startup.vue': { - routes: '/startup' - views: never + routes: + | '/startup' + views: + | never } } /** * Get a union of possible route names in a certain route component file. - * Used by the volar plugin to automatically type useRoute() + * Used by the \`sfc-typed-router\` Volar plugin to automatically type \`useRoute()\`. * * @internal */ diff --git a/next-ui/vite.config.mts b/next-ui/vite.config.mts index 196ea52d..2ce7a67f 100644 --- a/next-ui/vite.config.mts +++ b/next-ui/vite.config.mts @@ -17,6 +17,7 @@ import { defineConfig } from 'vite' import { fileURLToPath, URL } from 'node:url' import { storybookTest } from '@storybook/addon-vitest/vitest-plugin' import * as path from 'path' +import { playwright } from '@vitest/browser-playwright' const dirname = typeof __dirname !== 'undefined' ? __dirname : path.dirname(fileURLToPath(import.meta.url)) @@ -119,7 +120,7 @@ export default defineConfig(({ mode }) => ({ browser: { enabled: true, headless: true, - provider: 'playwright', + provider: playwright(), instances: [{ browser: 'chromium' }], }, setupFiles: ['.storybook/vitest.setup.ts'],