From c4f9f803125969ad414cba3a6fbb0e6262095047 Mon Sep 17 00:00:00 2001 From: jycouet Date: Tue, 18 Nov 2025 20:58:31 +0100 Subject: [PATCH] feat(vitest): 3 to 4 next steps --- .changeset/ripe-lines-beg.md | 5 ++++ packages/addons/vitest-addon/index.ts | 33 ++++++++++++++++++++++++++- packages/cli/commands/add/utils.ts | 3 ++- packages/core/addon/config.ts | 1 + 4 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 .changeset/ripe-lines-beg.md diff --git a/.changeset/ripe-lines-beg.md b/.changeset/ripe-lines-beg.md new file mode 100644 index 000000000..8ed9efa14 --- /dev/null +++ b/.changeset/ripe-lines-beg.md @@ -0,0 +1,5 @@ +--- +'sv': patch +--- + +feat(vitest): when `add vitest` is used within a project that uses vitest@3, the addon will display some next steps to finalize the migration to vitest@4 diff --git a/packages/addons/vitest-addon/index.ts b/packages/addons/vitest-addon/index.ts index 8253b78b7..e79e14259 100644 --- a/packages/addons/vitest-addon/index.ts +++ b/packages/addons/vitest-addon/index.ts @@ -15,16 +15,25 @@ const options = defineAddonOptions() }) .build(); +// Manage only version before current +let vitestV3Installed = false; + export default defineAddon({ id: 'vitest', shortDescription: 'unit testing', homepage: 'https://vitest.dev', options, - run: ({ sv, files, typescript, kit, options }) => { + + run: ({ sv, files, typescript, kit, options, dependencyVersion }) => { const ext = typescript ? 'ts' : 'js'; const unitTesting = options.usages.includes('unit'); const componentTesting = options.usages.includes('component'); + vitestV3Installed = (dependencyVersion('vitest') ?? '') + .replaceAll('^', '') + .replaceAll('~', '') + ?.startsWith('3.'); + sv.devDependency('vitest', '^4.0.10'); if (componentTesting) { @@ -149,5 +158,27 @@ export default defineAddon({ return generateCode(); }); + }, + + nextSteps: ({ highlighter, typescript, options }) => { + const toReturn: string[] = []; + + if (vitestV3Installed) { + const componentTesting = options.usages.includes('component'); + if (componentTesting) { + toReturn.push(`Uninstall ${highlighter.command('@vitest/browser')} package`); + toReturn.push( + `Update usage from ${highlighter.command("'@vitest/browser...'")} to ${highlighter.command("'vitest/browser'")}` + ); + } + toReturn.push( + `${highlighter.optional('Optional')} Check ${highlighter.path('./vite.config.ts')} and remove duplicate project definitions` + ); + toReturn.push( + `${highlighter.optional('Optional')} Remove ${highlighter.path('./vitest-setup-client' + (typescript ? '.ts' : '.js'))} file` + ); + } + + return toReturn; } }); diff --git a/packages/cli/commands/add/utils.ts b/packages/cli/commands/add/utils.ts index 76f4e1de7..c16181c16 100644 --- a/packages/cli/commands/add/utils.ts +++ b/packages/cli/commands/add/utils.ts @@ -123,6 +123,7 @@ export function getHighlighter(): Highlighter { env: (str) => pc.yellow(str), path: (str) => pc.green(str), route: (str) => pc.bold(str), - website: (str) => pc.whiteBright(str) + website: (str) => pc.whiteBright(str), + optional: (str) => pc.gray(str) }; } diff --git a/packages/core/addon/config.ts b/packages/core/addon/config.ts index 9d846d260..204cb952d 100644 --- a/packages/core/addon/config.ts +++ b/packages/core/addon/config.ts @@ -56,6 +56,7 @@ export type Highlighter = { website: (str: string) => string; route: (str: string) => string; env: (str: string) => string; // used for printing environment variable names + optional: (str: string) => string; }; export function defineAddon(config: Addon): Addon {