Repository: sveltejs/cli
Pull request #436 (2025-02-04 13:53:12)

Remove comment about adapter-auto once a specific sveltekit adapter is chosen
Fixes https://github.com/sveltejs/cli/issues/430

changeset-bot[bot]: ###  ⚠️  No Changeset found

Latest commit: b20cb61f87a851003ff759b6923d392fc09fb7e4

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. **If these changes should result in a version bump, you need to add a changeset.**

<details><summary>This PR includes no changesets</summary>

  When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

</details>

[Click here to learn what changesets are, and how to add one](https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md).

[Click here if you're a maintainer who wants to add a changeset to this PR](https://github.com/ranjan-purbey/svelte-cli/new/main?filename=.changeset/wicked-pumas-behave.md&value=---%0A%22%40sveltejs%2Faddons%22%3A%20patch%0A---%0A%0ARemove%20comment%20about%20adapter-auto%20once%20a%20specific%20sveltekit%20adapter%20is%20chosen%0A)



Patch:
diff --git a/.changeset/config.json b/.changeset/config.json
index 01a284b..9c12e3e 100644
--- a/.changeset/config.json
+++ b/.changeset/config.json
@@ -7,5 +7,5 @@
 	"access": "public",
 	"baseBranch": "main",
 	"updateInternalDependencies": "patch",
-	"ignore": [ "!(sv|svelte-migrate)" ]
+	"ignore": [ "@sveltejs/*", "community-addon-template" ]
 }
diff --git a/.changeset/happy-news-drive.md b/.changeset/happy-news-drive.md
new file mode 100644
index 0000000..cf272c9
--- /dev/null
+++ b/.changeset/happy-news-drive.md
@@ -0,0 +1,5 @@
+---
+'sv': patch
+---
+
+Remove comment about adapter-auto once a specific sveltekit adapter is chosen
diff --git a/.changeset/nine-phones-shout.md b/.changeset/nine-phones-shout.md
new file mode 100644
index 0000000..41de9fe
--- /dev/null
+++ b/.changeset/nine-phones-shout.md
@@ -0,0 +1,5 @@
+---
+'sv': patch
+---
+
+fix: `onlyBuiltDependencies` not added on new projects
diff --git a/.changeset/pretty-panthers-call.md b/.changeset/pretty-panthers-call.md
new file mode 100644
index 0000000..7f954f6
--- /dev/null
+++ b/.changeset/pretty-panthers-call.md
@@ -0,0 +1,5 @@
+---
+'sv': patch
+---
+
+fix: generate correct table defintion for `turso` in `lucia` demo
diff --git a/community-addon-template/package.json b/community-addon-template/package.json
index e6afbc4..90d44a8 100644
--- a/community-addon-template/package.json
+++ b/community-addon-template/package.json
@@ -20,7 +20,7 @@
 	"devDependencies": {
 		"@playwright/test": "^1.49.1",
 		"sv": "workspace:*",
-		"vitest": "^3.0.3"
+		"vitest": "^3.0.5"
 	},
 	"keywords": [
 		"svelte-add-on",
diff --git a/package.json b/package.json
index c96a425..0aeaea1 100644
--- a/package.json
+++ b/package.json
@@ -5,7 +5,7 @@
 	"type": "module",
 	"description": "monorepo for sv and friends",
 	"engines": {
-		"pnpm": "^9.0.0"
+		"pnpm": "^10.0.0"
 	},
 	"scripts": {
 		"build": "rolldown --config",
@@ -37,7 +37,7 @@
 		"typescript": "^5.6.2",
 		"typescript-eslint": "^8.18.0",
 		"unplugin-isolated-decl": "^0.8.3",
-		"vitest": "^3.0.3"
+		"vitest": "^3.0.5"
 	},
-	"packageManager": "pnpm@9.7.0"
+	"packageManager": "pnpm@10.1.0"
 }
diff --git a/packages/addons/drizzle/index.ts b/packages/addons/drizzle/index.ts
index 698cdc1..0cf8fa6 100644
--- a/packages/addons/drizzle/index.ts
+++ b/packages/addons/drizzle/index.ts
@@ -89,6 +89,7 @@ export default defineAddon({
 		if (options.sqlite === 'better-sqlite3') {
 			sv.dependency('better-sqlite3', '^11.8.0');
 			sv.devDependency('@types/better-sqlite3', '^7.6.12');
+			sv.pnpmBuildDependendency('better-sqlite3');
 		}
 
 		if (options.sqlite === 'libsql' || options.sqlite === 'turso')
diff --git a/packages/addons/lucia/index.ts b/packages/addons/lucia/index.ts
index c32125b..bf559e4 100644
--- a/packages/addons/lucia/index.ts
+++ b/packages/addons/lucia/index.ts
@@ -16,10 +16,11 @@ import { addToDemoPage } from '../common.ts';
 const TABLE_TYPE = {
 	mysql: 'mysqlTable',
 	postgresql: 'pgTable',
-	sqlite: 'sqliteTable'
+	sqlite: 'sqliteTable',
+	turso: 'sqliteTable'
 };
 
-type Dialect = 'mysql' | 'postgresql' | 'sqlite';
+type Dialect = 'mysql' | 'postgresql' | 'sqlite' | 'turso';
 
 let drizzleDialect: Dialect;
 let schemaPath: string;
@@ -111,7 +112,7 @@ export default defineAddon({
 				throw new Error('unexpected shape of `user` or `session` table definition');
 			}
 
-			if (drizzleDialect === 'sqlite') {
+			if (drizzleDialect === 'sqlite' || drizzleDialect === 'turso') {
 				js.imports.addNamed(ast, 'drizzle-orm/sqlite-core', {
 					sqliteTable: 'sqliteTable',
 					text: 'text',
diff --git a/packages/addons/sveltekit-adapter/index.ts b/packages/addons/sveltekit-adapter/index.ts
index af3311e..f79d9e2 100644
--- a/packages/addons/sveltekit-adapter/index.ts
+++ b/packages/addons/sveltekit-adapter/index.ts
@@ -82,6 +82,14 @@ export default defineAddon({
 			) as AstTypes.ObjectProperty | undefined;
 
 			if (kitConfig && kitConfig.value.type === 'ObjectExpression') {
+				const adapterProp = kitConfig.value.properties.find(
+					(p) =>
+						p.type === 'ObjectProperty' && p.key.type === 'Identifier' && p.key.name === 'adapter'
+				);
+				if (adapterProp) {
+					adapterProp.comments = [];
+				}
+
 				// only overrides the `adapter` property so we can reset it's args
 				object.overrideProperties(kitConfig.value, {
 					adapter: functions.callByIdentifier(adapterName, [])
diff --git a/packages/addons/tailwindcss/index.ts b/packages/addons/tailwindcss/index.ts
index 80c581b..914e200 100644
--- a/packages/addons/tailwindcss/index.ts
+++ b/packages/addons/tailwindcss/index.ts
@@ -1,130 +1,50 @@
-import { defineAddon, defineAddonOptions } from '@sveltejs/cli-core';
+import { defineAddon } from '@sveltejs/cli-core';
 import { addImports } from '@sveltejs/cli-core/css';
-import { array, common, exports, imports, object } from '@sveltejs/cli-core/js';
-import { parseCss, parseScript, parseJson, parseSvelte } from '@sveltejs/cli-core/parsers';
+import { array, functions, imports, object, exports } from '@sveltejs/cli-core/js';
+import { parseCss, parseJson, parseScript, parseSvelte } from '@sveltejs/cli-core/parsers';
 import { addSlot } from '@sveltejs/cli-core/html';
 
-type Plugin = {
-	id: string;
-	package: string;
-	version: string;
-	identifier: string;
-};
-
-const plugins: Plugin[] = [
-	{
-		id: 'typography',
-		package: '@tailwindcss/typography',
-		version: '^0.5.16',
-		identifier: 'typography'
-	},
-	{
-		id: 'forms',
-		package: '@tailwindcss/forms',
-		version: '^0.5.10',
-		identifier: 'forms'
-	},
-	{
-		id: 'container-queries',
-		package: '@tailwindcss/container-queries',
-		version: '^0.1.1',
-		identifier: 'containerQueries'
-	}
-];
-
-const options = defineAddonOptions({
-	plugins: {
-		type: 'multiselect',
-		question: 'Which plugins would you like to add?',
-		options: plugins.map((p) => ({ value: p.id, label: p.id, hint: p.package })),
-		default: []
-	}
-});
-
 export default defineAddon({
 	id: 'tailwindcss',
 	alias: 'tailwind',
 	shortDescription: 'css framework',
 	homepage: 'https://tailwindcss.com',
-	options,
-	run: ({ sv, options, typescript, kit, dependencyVersion }) => {
+	options: {},
+	run: ({ sv, typescript, kit, dependencyVersion }) => {
 		const ext = typescript ? 'ts' : 'js';
 		const prettierInstalled = Boolean(dependencyVersion('prettier'));
 
-		sv.devDependency('tailwindcss', '^3.4.17');
-		sv.devDependency('autoprefixer', '^10.4.20');
-
-		if (prettierInstalled) sv.devDependency('prettier-plugin-tailwindcss', '^0.6.10');
+		sv.devDependency('tailwindcss', '^4.0.0');
+		sv.devDependency('@tailwindcss/vite', '^4.0.0');
 
-		for (const plugin of plugins) {
-			if (!options.plugins.includes(plugin.id)) continue;
+		if (prettierInstalled) sv.devDependency('prettier-plugin-tailwindcss', '^0.6.11');
 
-			sv.devDependency(plugin.package, plugin.version);
-		}
-
-		sv.file(`tailwind.config.${ext}`, (content) => {
+		// add the vite plugin
+		sv.file(`vite.config.${ext}`, (content) => {
 			const { ast, generateCode } = parseScript(content);
-			let root;
-			const rootExport = object.createEmpty();
-			if (typescript) {
-				imports.addNamed(ast, 'tailwindcss', { Config: 'Config' }, true);
-				root = common.satisfiesExpression(rootExport, 'Config');
-			}
-
-			const { astNode: exportDeclaration, value: node } = exports.defaultExport(
-				ast,
-				root ?? rootExport
-			);
-
-			const config = node.type === 'TSSatisfiesExpression' ? node.expression : node;
-			if (config.type !== 'ObjectExpression') {
-				throw new Error(`Unexpected tailwind config shape: ${config.type}`);
-			}
-
-			if (!typescript) {
-				common.addJsDocTypeComment(exportDeclaration, "import('tailwindcss').Config");
-			}
-
-			const contentArray = object.property(config, 'content', array.createEmpty());
-			array.push(contentArray, './src/**/*.{html,js,svelte,ts}');
-
-			const themeObject = object.property(config, 'theme', object.createEmpty());
-			object.property(themeObject, 'extend', object.createEmpty());
 
-			const pluginsArray = object.property(config, 'plugins', array.createEmpty());
+			const vitePluginName = 'tailwindcss';
+			imports.addDefault(ast, '@tailwindcss/vite', vitePluginName);
 
-			for (const plugin of plugins) {
-				if (!options.plugins.includes(plugin.id)) continue;
-				imports.addDefault(ast, plugin.package, plugin.identifier);
-				array.push(pluginsArray, { type: 'Identifier', name: plugin.identifier });
-			}
+			const { value: rootObject } = exports.defaultExport(ast, functions.call('defineConfig', []));
+			const param1 = functions.argumentByIndex(rootObject, 0, object.createEmpty());
 
-			return generateCode();
-		});
-
-		sv.file('postcss.config.js', (content) => {
-			const { ast, generateCode } = parseScript(content);
-			const { value: rootObject } = exports.defaultExport(ast, object.createEmpty());
-			const pluginsObject = object.property(rootObject, 'plugins', object.createEmpty());
+			const pluginsArray = object.property(param1, 'plugins', array.createEmpty());
+			const pluginFunctionCall = functions.call(vitePluginName, []);
+			array.push(pluginsArray, pluginFunctionCall);
 
-			object.property(pluginsObject, 'tailwindcss', object.createEmpty());
-			object.property(pluginsObject, 'autoprefixer', object.createEmpty());
 			return generateCode();
 		});
 
 		sv.file('src/app.css', (content) => {
-			const layerImports = ['base', 'components', 'utilities'].map(
-				(layer) => `tailwindcss/${layer}`
-			);
-			if (layerImports.every((i) => content.includes(i))) {
+			if (content.includes('tailwindcss')) {
 				return content;
 			}
 
 			const { ast, generateCode } = parseCss(content);
 			const originalFirst = ast.first;
 
-			const specifiers = layerImports.map((i) => `'${i}'`);
-			const nodes = addImports(ast, specifiers);
+			const nodes = addImports(ast, ["'tailwindcss'"]);
 
 			if (
 				originalFirst !== ast.first &&
diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md
index 5a55c78..7da6b69 100644
--- a/packages/cli/CHANGELOG.md
+++ b/packages/cli/CHANGELOG.md
@@ -1,5 +1,14 @@
 # sv
 
+## 0.6.19
+### Patch Changes
+
+
+- feat: update to `tailwindcss` v4.0.0 ([#422](https://github.com/sveltejs/cli/pull/422))
+
+
+- feat: support `pnpm` version `10` ([#432](https://github.com/sveltejs/cli/pull/432))
+
 ## 0.6.18
 ### Patch Changes
 
diff --git a/packages/cli/commands/add/index.ts b/packages/cli/commands/add/index.ts
index 32014c3..054b47b 100644
--- a/packages/cli/commands/add/index.ts
+++ b/packages/cli/commands/add/index.ts
@@ -18,7 +18,11 @@ import * as common from '../../utils/common.ts';
 import { createWorkspace } from './workspace.ts';
 import { formatFiles, getHighlighter } from './utils.ts';
 import { Directive, downloadPackage, getPackageJSON } from './fetch-packages.ts';
-import { installDependencies, packageManagerPrompt } from '../../utils/package-manager.ts';
+import {
+	addPnpmBuildDependendencies,
+	installDependencies,
+	packageManagerPrompt
+} from '../../utils/package-manager.ts';
 import { getGlobalPreconditions } from './preconditions.ts';
 import { type AddonMap, applyAddons, setupAddons } from '../../lib/install.ts';
 
@@ -425,13 +429,6 @@ export async function runAddCommand(
 	// indicating that installing deps was skipped and no PM was selected
 	if (selectedAddons.length === 0) return { packageManager: null };
 
-	// prompt for package manager
-	let packageManager: PackageManager | undefined;
-	if (options.install) {
-		packageManager = await packageManagerPrompt(options.cwd);
-		if (packageManager) workspace.packageManager = packageManager;
-	}
-
 	// apply addons
 	const officialDetails = Object.keys(official).map((id) => getAddonDetails(id));
 	const commDetails = Object.keys(community).map(
@@ -440,7 +437,7 @@ export async function runAddCommand(
 	const details = officialDetails.concat(commDetails);
 
 	const addonMap: AddonMap = Object.assign({}, ...details.map((a) => ({ [a.id]: a })));
-	const filesToFormat = await applyAddons({
+	const { filesToFormat, pnpmBuildDependencies: addonPnpmBuildDependencies } = await applyAddons({
 		workspace,
 		addonSetupResults,
 		addons: addonMap,
@@ -449,9 +446,21 @@ export async function runAddCommand(
 
 	p.log.success('Successfully setup add-ons');
 
-	// install dependencies
-	if (packageManager && options.install) {
-		await installDependencies(packageManager, options.cwd);
+	// prompt for package manager and install dependencies
+	let packageManager: PackageManager | undefined;
+	if (options.install) {
+		packageManager = await packageManagerPrompt(options.cwd);
+
+		if (packageManager) {
+			workspace.packageManager = packageManager;
+
+			addPnpmBuildDependendencies(workspace.cwd, packageManager, [
+				'esbuild',
+				...addonPnpmBuildDependencies
+			]);
+
+			await installDependencies(packageManager, options.cwd);
+		}
 	}
 
 	// format modified/created files with prettier (if available)
diff --git a/packages/cli/commands/create.ts b/packages/cli/commands/create.ts
index d6a8c55..77a5d8c 100644
--- a/packages/cli/commands/create.ts
+++ b/packages/cli/commands/create.ts
@@ -15,6 +15,7 @@ import * as common from '../utils/common.ts';
 import { runAddCommand } from './add/index.ts';
 import { detectSync, resolveCommand, type AgentName } from 'package-manager-detector';
 import {
+	addPnpmBuildDependendencies,
 	getUserAgent,
 	installDependencies,
 	packageManagerPrompt
@@ -164,6 +165,7 @@ async function createProject(cwd: ProjectPath, options: Options) {
 	let addOnNextSteps: string | undefined;
 	const installDeps = async () => {
 		packageManager = await packageManagerPrompt(projectPath);
+		addPnpmBuildDependendencies(projectPath, packageManager, ['esbuild']);
 		if (packageManager) await installDependencies(packageManager, projectPath);
 	};
 
diff --git a/packages/cli/lib/install.ts b/packages/cli/lib/install.ts
index 72d5173..6f98ce4 100644
--- a/packages/cli/lib/install.ts
+++ b/packages/cli/lib/install.ts
@@ -33,7 +33,7 @@ export async function installAddon<Addons extends AddonMap>({
 	cwd,
 	options,
 	packageManager = 'npm'
-}: InstallOptions<Addons>): Promise<string[]> {
+}: InstallOptions<Addons>): Promise<ReturnType<typeof applyAddons>> {
 	const workspace = createWorkspace({ cwd, packageManager });
 	const addonSetupResults = setupAddons(Object.values(addons), workspace);
 
@@ -51,8 +51,12 @@ export async function applyAddons({
 	workspace,
 	addonSetupResults,
 	options
-}: ApplyAddonOptions): Promise<string[]> {
+}: ApplyAddonOptions): Promise<{
+	filesToFormat: string[];
+	pnpmBuildDependencies: string[];
+}> {
 	const filesToFormat = new Set<string>();
+	const allPnpmBuildDependencies: string[] = [];
 
 	const mapped = Object.entries(addons).map(([, addon]) => addon);
 	const ordered = orderAddons(mapped, addonSetupResults);
@@ -60,11 +64,20 @@ export async function applyAddons({
 	for (const addon of ordered) {
 		workspace = createWorkspace({ ...workspace, options: options[addon.id] });
 
-		const files = await runAddon({ workspace, addon, multiple: ordered.length > 1 });
+		const { files, pnpmBuildDependencies } = await runAddon({
+			workspace,
+			addon,
+			multiple: ordered.length > 1
+		});
+
 		files.forEach((f) => filesToFormat.add(f));
+		pnpmBuildDependencies.forEach((s) => allPnpmBuildDependencies.push(s));
 	}
 
-	return Array.from(filesToFormat);
+	return {
+		filesToFormat: Array.from(filesToFormat),
+		pnpmBuildDependencies: allPnpmBuildDependencies
+	};
 }
 
 export function setupAddons(
@@ -91,7 +104,7 @@ type RunAddon = {
 	addon: Addon<Record<string, Question>>;
 	multiple: boolean;
 };
-async function runAddon({ addon, multiple, workspace }: RunAddon): Promise<string[]> {
+async function runAddon({ addon, multiple, workspace }: RunAddon) {
 	const files = new Set<string>();
 
 	// apply default addon options
@@ -103,6 +116,7 @@ async function runAddon({ addon, multiple, workspace }: RunAddon): Promise<strin
 	}
 
 	const dependencies: Array<{ pkg: string; version: string; dev: boolean }> = [];
+	const pnpmBuildDependencies: string[] = [];
 	const sv: SvApi = {
 		file: (path, content) => {
 			try {
@@ -150,6 +164,9 @@ async function runAddon({ addon, multiple, workspace }: RunAddon): Promise<strin
 		},
 		devDependency: (pkg, version) => {
 			dependencies.push({ pkg, version, dev: true });
+		},
+		pnpmBuildDependendency: (pkg) => {
+			pnpmBuildDependencies.push(pkg);
 		}
 	};
 	await addon.run({ ...workspace, sv });
@@ -157,7 +174,10 @@ async function runAddon({ addon, multiple, workspace }: RunAddon): Promise<strin
 	const pkgPath = installPackages(dependencies, workspace);
 	files.add(pkgPath);
 
-	return Array.from(files);
+	return {
+		files: Array.from(files),
+		pnpmBuildDependencies
+	};
 }
 
 // sorts them to their execution order
diff --git a/packages/cli/package.json b/packages/cli/package.json
index aae4a6c..3590714 100644
--- a/packages/cli/package.json
+++ b/packages/cli/package.json
@@ -1,6 +1,6 @@
 {
 	"name": "sv",
-	"version": "0.6.18",
+	"version": "0.6.19",
 	"type": "module",
 	"description": "A CLI for creating and updating SvelteKit projects",
 	"license": "MIT",
diff --git a/packages/cli/utils/package-manager.ts b/packages/cli/utils/package-manager.ts
index 0f979fc..fe9a8f8 100644
--- a/packages/cli/utils/package-manager.ts
+++ b/packages/cli/utils/package-manager.ts
@@ -1,4 +1,7 @@
+import fs from 'node:fs';
+import path from 'node:path';
 import process from 'node:process';
+import * as find from 'empathic/find';
 import { exec } from 'tinyexec';
 import * as p from '@sveltejs/clack-prompts';
 import {
@@ -8,6 +11,7 @@ import {
 	detectSync,
 	type AgentName
 } from 'package-manager-detector';
+import { parseJson } from '@sveltejs/cli-core/parsers';
 
 const agents = AGENTS.filter((agent): agent is AgentName => !agent.includes('@'));
 const agentOptions: PackageManagerOptions = agents.map((pm) => ({ value: pm, label: pm }));
@@ -67,3 +71,36 @@ export function getUserAgent(): AgentName | undefined {
 	const name = pmSpec.substring(0, separatorPos) as AgentName;
 	return AGENTS.includes(name) ? name : undefined;
 }
+
+export function addPnpmBuildDependendencies(
+	cwd: string,
+	packageManager: AgentName | null | undefined,
+	allowedPackages: string[]
+) {
+	// other package managers are currently not affected by this change
+	if (!packageManager || packageManager !== 'pnpm') return;
+
+	// find the workspace root (if present)
+	const pnpmWorkspacePath = find.up('pnpm-workspace.yaml', { cwd });
+	let packageDirectory;
+
+	if (pnpmWorkspacePath) packageDirectory = path.dirname(pnpmWorkspacePath);
+	else packageDirectory = cwd;
+
+	// load the package.json
+	const pkgPath = path.join(packageDirectory, 'package.json');
+	const content = fs.readFileSync(pkgPath, 'utf-8');
+	const { data, generateCode } = parseJson(content);
+
+	// add the packages where we install scripts should be executed
+	data.pnpm ??= {};
+	data.pnpm.onlyBuiltDependencies ??= [];
+	for (const allowedPackage of allowedPackages) {
+		if (data.pnpm.onlyBuiltDependencies.includes(allowedPackage)) continue;
+		data.pnpm.onlyBuiltDependencies.push(allowedPackage);
+	}
+
+	// save the updated package.json
+	const newContent = generateCode();
+	fs.writeFileSync(pkgPath, newContent);
+}
diff --git a/packages/core/addon/config.ts b/packages/core/addon/config.ts
index 9890046..be36f77 100644
--- a/packages/core/addon/config.ts
+++ b/packages/core/addon/config.ts
@@ -20,10 +20,11 @@ export type Scripts<Args extends OptionDefinition> = {
 };
 
 export type SvApi = {
-	file: (path: string, edit: (content: string) => string) => void;
+	pnpmBuildDependendency: (pkg: string) => void;
 	dependency: (pkg: string, version: string) => void;
 	devDependency: (pkg: string, version: string) => void;
 	execute: (args: string[], stdio: 'inherit' | 'pipe') => Promise<void>;
+	file: (path: string, edit: (content: string) => string) => void;
 };
 
 export type Addon<Args extends OptionDefinition> = {
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index f543123..8fab279 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -28,7 +28,7 @@ importers:
         version: 22.10.2
       '@vitest/ui':
         specifier: ^3.0.3
-        version: 3.0.3(vitest@3.0.3)
+        version: 3.0.3(vitest@3.0.5)
       eslint:
         specifier: ^9.17.0
         version: 9.17.0
@@ -61,10 +61,10 @@ importers:
         version: 8.18.0(eslint@9.17.0)(typescript@5.7.2)
       unplugin-isolated-decl:
         specifier: ^0.8.3
-        version: 0.8.3(rollup@4.28.1)(typescript@5.7.2)
+        version: 0.8.3(rollup@4.34.5)(typescript@5.7.2)
       vitest:
-        specifier: ^3.0.3
-        version: 3.0.3(@types/node@22.10.2)(@vitest/ui@3.0.3)
+        specifier: ^3.0.5
+        version: 3.0.5(@types/node@22.10.2)(@vitest/ui@3.0.3(vitest@3.0.5))
 
   community-addon-template:
     dependencies:
@@ -79,8 +79,8 @@ importers:
         specifier: workspace:*
         version: link:../packages/cli
       vitest:
-        specifier: ^3.0.3
-        version: 3.0.3(@types/node@22.10.2)(@vitest/ui@3.0.3)
+        specifier: ^3.0.5
+        version: 3.0.5(@types/node@22.10.2)(@vitest/ui@3.0.3(vitest@3.0.5))
 
   packages/addons:
     dependencies:
@@ -754,98 +754,98 @@ packages:
       rollup:
         optional: true
 
-  '@rollup/rollup-android-arm-eabi@4.28.1':
-    resolution: {integrity: sha512-2aZp8AES04KI2dy3Ss6/MDjXbwBzj+i0GqKtWXgw2/Ma6E4jJvujryO6gJAghIRVz7Vwr9Gtl/8na3nDUKpraQ==}
+  '@rollup/rollup-android-arm-eabi@4.34.5':
+    resolution: {integrity: sha512-JXmmQcKQtpf3Z6lvA8akkrHDZ5AEfgc2hLMix1/X5BhQbezBQ0AP5GYLdU8jsQRme8qr2sscCe3wizp7UT0L9g==}
     cpu: [arm]
     os: [android]
 
-  '@rollup/rollup-android-arm64@4.28.1':
-    resolution: {integrity: sha512-EbkK285O+1YMrg57xVA+Dp0tDBRB93/BZKph9XhMjezf6F4TpYjaUSuPt5J0fZXlSag0LmZAsTmdGGqPp4pQFA==}
+  '@rollup/rollup-android-arm64@4.34.5':
+    resolution: {integrity: sha512-9/A8/ZBOprUjkrJoP9BBEq2vdSud6BPd3LChw09bJQiEZH5oN4kWIkHu90cA0Cj0cSF5cIaD76+0lA+d5KHmpQ==}
     cpu: [arm64]
     os: [android]
 
-  '@rollup/rollup-darwin-arm64@4.28.1':
-    resolution: {integrity: sha512-prduvrMKU6NzMq6nxzQw445zXgaDBbMQvmKSJaxpaZ5R1QDM8w+eGxo6Y/jhT/cLoCvnZI42oEqf9KQNYz1fqQ==}
+  '@rollup/rollup-darwin-arm64@4.34.5':
+    resolution: {integrity: sha512-b9oCfgHKfc1AJEQ5sEpE8Kf6s7aeygj5bZAsl1hTpZc1V9cfZASFSXzzNj7o/BQNPbjmVkVxpCCLRhBfLXhJ5g==}
     cpu: [arm64]
     os: [darwin]
 
-  '@rollup/rollup-darwin-x64@4.28.1':
-    resolution: {integrity: sha512-WsvbOunsUk0wccO/TV4o7IKgloJ942hVFK1CLatwv6TJspcCZb9umQkPdvB7FihmdxgaKR5JyxDjWpCOp4uZlQ==}
+  '@rollup/rollup-darwin-x64@4.34.5':
+    resolution: {integrity: sha512-Gz42gKBQPoFdMYdsVqkcpttYOO/0aP7f+1CgMaeZEz0gss7dop1TsO3hT77Iroz/TV7PdPUG/RYlj9EA39L4dw==}
     cpu: [x64]
     os: [darwin]
 
-  '@rollup/rollup-freebsd-arm64@4.28.1':
-    resolution: {integrity: sha512-HTDPdY1caUcU4qK23FeeGxCdJF64cKkqajU0iBnTVxS8F7H/7BewvYoG+va1KPSL63kQ1PGNyiwKOfReavzvNA==}
+  '@rollup/rollup-freebsd-arm64@4.34.5':
+    resolution: {integrity: sha512-JPkafjkOFaupd8VQYsXfGFKC2pfMr7hwSYGkVGNwhbW0k0lHHyIdhCSNBendJ4O7YlT4yRyKXoms1TL7saO7SQ==}
     cpu: [arm64]
     os: [freebsd]
 
-  '@rollup/rollup-freebsd-x64@4.28.1':
-    resolution: {integrity: sha512-m/uYasxkUevcFTeRSM9TeLyPe2QDuqtjkeoTpP9SW0XxUWfcYrGDMkO/m2tTw+4NMAF9P2fU3Mw4ahNvo7QmsQ==}
+  '@rollup/rollup-freebsd-x64@4.34.5':
+    resolution: {integrity: sha512-j6Q8VFqyI8hZM33h1JC6DZK2w8ejkXqEMozTrtIEGfRVMpVZL3GrLOOYEUkAgUSpJ9sb2w+FEpjGj7IHRcQfdw==}
     cpu: [x64]
     os: [freebsd]
 
-  '@rollup/rollup-linux-arm-gnueabihf@4.28.1':
-    resolution: {integrity: sha512-QAg11ZIt6mcmzpNE6JZBpKfJaKkqTm1A9+y9O+frdZJEuhQxiugM05gnCWiANHj4RmbgeVJpTdmKRmH/a+0QbA==}
+  '@rollup/rollup-linux-arm-gnueabihf@4.34.5':
+    resolution: {integrity: sha512-6jyiXKF9Xq6x9yQjct5xrRT0VghJk5VzAfed3o0hgncwacZkzOdR0TXLRNjexsEXWN8tG7jWWwsVk7WeFi//gw==}
     cpu: [arm]
     os: [linux]
 
-  '@rollup/rollup-linux-arm-musleabihf@4.28.1':
-    resolution: {integrity: sha512-dRP9PEBfolq1dmMcFqbEPSd9VlRuVWEGSmbxVEfiq2cs2jlZAl0YNxFzAQS2OrQmsLBLAATDMb3Z6MFv5vOcXg==}
+  '@rollup/rollup-linux-arm-musleabihf@4.34.5':
+    resolution: {integrity: sha512-cOTYe5tLcGAvGztRLIqx87LE7j/qjaAqFrrHsPFlnuhhhFO5LSr2AzvdQYuxomJMzMBrXkMRNl9bQEpDZ5bjLQ==}
     cpu: [arm]
     os: [linux]
 
-  '@rollup/rollup-linux-arm64-gnu@4.28.1':
-    resolution: {integrity: sha512-uGr8khxO+CKT4XU8ZUH1TTEUtlktK6Kgtv0+6bIFSeiSlnGJHG1tSFSjm41uQ9sAO/5ULx9mWOz70jYLyv1QkA==}
+  '@rollup/rollup-linux-arm64-gnu@4.34.5':
+    resolution: {integrity: sha512-KHlrd+YqmS7rriW+LBb1kQNYmd5w1sAIG3z7HEpnQOrg/skeYYv9DAcclGL9gpFdpnzmiAEkzsTT74kZWUtChQ==}
     cpu: [arm64]
     os: [linux]
 
-  '@rollup/rollup-linux-arm64-musl@4.28.1':
-    resolution: {integrity: sha512-QF54q8MYGAqMLrX2t7tNpi01nvq5RI59UBNx+3+37zoKX5KViPo/gk2QLhsuqok05sSCRluj0D00LzCwBikb0A==}
+  '@rollup/rollup-linux-arm64-musl@4.34.5':
+    resolution: {integrity: sha512-uOb6hzDqym4Sw+qw3+svS3SmwQGVUhyTdPKyHDdlYg1Z0aHjdNmjwRY7zw/90/UfBe/yD7Mv2mYKhQpOfy4RYA==}
     cpu: [arm64]
     os: [linux]
 
-  '@rollup/rollup-linux-loongarch64-gnu@4.28.1':
-    resolution: {integrity: sha512-vPul4uodvWvLhRco2w0GcyZcdyBfpfDRgNKU+p35AWEbJ/HPs1tOUrkSueVbBS0RQHAf/A+nNtDpvw95PeVKOA==}
+  '@rollup/rollup-linux-loongarch64-gnu@4.34.5':
+    resolution: {integrity: sha512-pARu8ZKANZH4wINLdHLKG69EPwJswM6A+Ox1a9LpiclRQoyjacFFTtXN3akKQ2ufJXDasO/pWvxKN9ZfCgEoFA==}
     cpu: [loong64]
     os: [linux]
 
-  '@rollup/rollup-linux-powerpc64le-gnu@4.28.1':
-    resolution: {integrity: sha512-pTnTdBuC2+pt1Rmm2SV7JWRqzhYpEILML4PKODqLz+C7Ou2apEV52h19CR7es+u04KlqplggmN9sqZlekg3R1A==}
+  '@rollup/rollup-linux-powerpc64le-gnu@4.34.5':
+    resolution: {integrity: sha512-crUWn12NRmCdao2YwS1GvlPCVypMBMJlexTaantaP2+dAMd2eZBErFcKG8hZYEHjSbbk2UoH1aTlyeA4iKLqSA==}
     cpu: [ppc64]
     os: [linux]
 
-  '@rollup/rollup-linux-riscv64-gnu@4.28.1':
-    resolution: {integrity: sha512-vWXy1Nfg7TPBSuAncfInmAI/WZDd5vOklyLJDdIRKABcZWojNDY0NJwruY2AcnCLnRJKSaBgf/GiJfauu8cQZA==}
+  '@rollup/rollup-linux-riscv64-gnu@4.34.5':
+    resolution: {integrity: sha512-XtD/oMhCdixi3x8rCNyDRMUsLo1Z+1UQcK+oR7AsjglGov9ETiT3TNFhUPzaGC1jH+uaMtPhxrVRUub+pnAKTg==}
     cpu: [riscv64]
     os: [linux]
 
-  '@rollup/rollup-linux-s390x-gnu@4.28.1':
-    resolution: {integrity: sha512-/yqC2Y53oZjb0yz8PVuGOQQNOTwxcizudunl/tFs1aLvObTclTwZ0JhXF2XcPT/zuaymemCDSuuUPXJJyqeDOg==}
+  '@rollup/rollup-linux-s390x-gnu@4.34.5':
+    resolution: {integrity: sha512-V3+BvgyHb21aF7lw0sc78Tv0+xLp4lm2OM7CKFVrBuppsMvtl/9O5y2OX4tdDT0EhIsDP/ObJPqDuEg1ZoTwSQ==}
     cpu: [s390x]
     os: [linux]
 
-  '@rollup/rollup-linux-x64-gnu@4.28.1':
-    resolution: {integrity: sha512-fzgeABz7rrAlKYB0y2kSEiURrI0691CSL0+KXwKwhxvj92VULEDQLpBYLHpF49MSiPG4sq5CK3qHMnb9tlCjBw==}
+  '@rollup/rollup-linux-x64-gnu@4.34.5':
+    resolution: {integrity: sha512-SkCIXLGk42yldTcH8UXh++m0snVxp9DLf4meb1mWm0lC8jzxjFBwSLGtUSeLgQDsC05iBaIhyjNX46DlByrApQ==}
     cpu: [x64]
     os: [linux]
 
-  '@rollup/rollup-linux-x64-musl@4.28.1':
-    resolution: {integrity: sha512-xQTDVzSGiMlSshpJCtudbWyRfLaNiVPXt1WgdWTwWz9n0U12cI2ZVtWe/Jgwyv/6wjL7b66uu61Vg0POWVfz4g==}
+  '@rollup/rollup-linux-x64-musl@4.34.5':
+    resolution: {integrity: sha512-iUcH3FBtBN2/Ce0rI84suRhD0+bB5BVEffqOwsGaX5py5TuYLOQa7S7oVBP0NKtB5rub3i9IvZtMXiD96l5v0A==}
     cpu: [x64]
     os: [linux]
 
-  '@rollup/rollup-win32-arm64-msvc@4.28.1':
-    resolution: {integrity: sha512-wSXmDRVupJstFP7elGMgv+2HqXelQhuNf+IS4V+nUpNVi/GUiBgDmfwD0UGN3pcAnWsgKG3I52wMOBnk1VHr/A==}
+  '@rollup/rollup-win32-arm64-msvc@4.34.5':
+    resolution: {integrity: sha512-PUbWd+h/h6rUowalDYIdc9S9LJXbQDMcJe0BjABl3oT3efYRgZ8aUe8ZZDSie7y+fz6Z+rueNfdorIbkWv5Eqg==}
     cpu: [arm64]
     os: [win32]
 
-  '@rollup/rollup-win32-ia32-msvc@4.28.1':
-    resolution: {integrity: sha512-ZkyTJ/9vkgrE/Rk9vhMXhf8l9D+eAhbAVbsGsXKy2ohmJaWg0LPQLnIxRdRp/bKyr8tXuPlXhIoGlEB5XpJnGA==}
+  '@rollup/rollup-win32-ia32-msvc@4.34.5':
+    resolution: {integrity: sha512-3vncGhOJiAUR85fnAXJyvSp2GaDWYByIQmW68ZAr+e8kIxgvJ1VaZbfHD5BO5X6hwRQdY6Um/XfA3l5c2lV+OQ==}
     cpu: [ia32]
     os: [win32]
 
-  '@rollup/rollup-win32-x64-msvc@4.28.1':
-    resolution: {integrity: sha512-ZvK2jBafvttJjoIdKm/Q/Bh7IJ1Ose9IBOwpOXcOvW3ikGTQGmKDgxTC6oCAzW6PynbkKP8+um1du81XJHZ0JA==}
+  '@rollup/rollup-win32-x64-msvc@4.34.5':
+    resolution: {integrity: sha512-Mi8yVUlQOoeBpY72n75VLATptPGvj2lHa47rQdK9kZ4MoG5Ve86aVIU+PO3tBklTCBtILtdRfXS0EvIbXgmCAg==}
     cpu: [x64]
     os: [win32]
 
@@ -959,11 +959,11 @@ packages:
     resolution: {integrity: sha512-pCh/qEA8Lb1wVIqNvBke8UaRjJ6wrAWkJO5yyIbs8Yx6TNGYyfNjOo61tLv+WwLvoLPp4BQ8B7AHKijl8NGUfw==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
-  '@vitest/expect@3.0.3':
-    resolution: {integrity: sha512-SbRCHU4qr91xguu+dH3RUdI5dC86zm8aZWydbp961aIR7G8OYNN6ZiayFuf9WAngRbFOfdrLHCGgXTj3GtoMRQ==}
+  '@vitest/expect@3.0.5':
+    resolution: {integrity: sha512-nNIOqupgZ4v5jWuQx2DSlHLEs7Q4Oh/7AYwNyE+k0UQzG7tSmjPXShUikn1mpNGzYEN2jJbTvLejwShMitovBA==}
 
-  '@vitest/mocker@3.0.3':
-    resolution: {integrity: sha512-XT2XBc4AN9UdaxJAeIlcSZ0ILi/GzmG5G8XSly4gaiqIvPV3HMTSIDZWJVX6QRJ0PX1m+W8Cy0K9ByXNb/bPIA==}
+  '@vitest/mocker@3.0.5':
+    resolution: {integrity: sha512-CLPNBFBIE7x6aEGbIjaQAX03ZZlBMaWwAjBdMkIf/cAn6xzLTiM3zYqO/WAbieEjsAZir6tO71mzeHZoodThvw==}
     peerDependencies:
       msw: ^2.4.9
       vite: ^5.0.0 || ^6.0.0
@@ -976,14 +976,17 @@ packages:
   '@vitest/pretty-format@3.0.3':
     resolution: {integrity: sha512-gCrM9F7STYdsDoNjGgYXKPq4SkSxwwIU5nkaQvdUxiQ0EcNlez+PdKOVIsUJvh9P9IeIFmjn4IIREWblOBpP2Q==}
 
-  '@vitest/runner@3.0.3':
-    resolution: {integrity: sha512-Rgi2kOAk5ZxWZlwPguRJFOBmWs6uvvyAAR9k3MvjRvYrG7xYvKChZcmnnpJCS98311CBDMqsW9MzzRFsj2gX3g==}
+  '@vitest/pretty-format@3.0.5':
+    resolution: {integrity: sha512-CjUtdmpOcm4RVtB+up8r2vVDLR16Mgm/bYdkGFe3Yj/scRfCpbSi2W/BDSDcFK7ohw8UXvjMbOp9H4fByd/cOA==}
 
-  '@vitest/snapshot@3.0.3':
-    resolution: {integrity: sha512-kNRcHlI4txBGztuJfPEJ68VezlPAXLRT1u5UCx219TU3kOG2DplNxhWLwDf2h6emwmTPogzLnGVwP6epDaJN6Q==}
+  '@vitest/runner@3.0.5':
+    resolution: {integrity: sha512-BAiZFityFexZQi2yN4OX3OkJC6scwRo8EhRB0Z5HIGGgd2q+Nq29LgHU/+ovCtd0fOfXj5ZI6pwdlUmC5bpi8A==}
 
-  '@vitest/spy@3.0.3':
-    resolution: {integrity: sha512-7/dgux8ZBbF7lEIKNnEqQlyRaER9nkAL9eTmdKJkDO3hS8p59ATGwKOCUDHcBLKr7h/oi/6hP+7djQk8049T2A==}
+  '@vitest/snapshot@3.0.5':
+    resolution: {integrity: sha512-GJPZYcd7v8QNUJ7vRvLDmRwl+a1fGg4T/54lZXe+UOGy47F9yUfE18hRCtXL5aHN/AONu29NGzIXSVFh9K0feA==}
+
+  '@vitest/spy@3.0.5':
+    resolution: {integrity: sha512-5fOzHj0WbUNqPK6blI/8VzZdkBlQLnT25knX0r4dbZI9qoZDf3qAdjoMmDcLG5A83W6oUUFJgUd0EYBc2P5xqg==}
 
   '@vitest/ui@3.0.3':
     resolution: {integrity: sha512-kGavHxFA3dETa61mgzdvxc3u/JSCiHR2o/0Z99IE8EAwtFxSLZeb2MofPKNVCPY3IAIcTx4blH57BJ1GuiRAUA==}
@@ -993,6 +996,9 @@ packages:
   '@vitest/utils@3.0.3':
     resolution: {integrity: sha512-f+s8CvyzPtMFY1eZKkIHGhPsQgYo5qCm6O8KZoim9qm1/jT64qBgGpO5tHscNH6BzRHM+edLNOP+3vO8+8pE/A==}
 
+  '@vitest/utils@3.0.5':
+    resolution: {integrity: sha512-N9AX0NUoUtVwKwy21JtwzaqR5L5R5A99GAbrHfCCXK1lp593i/3AZAXhSP43wRQuxYsflrdzEfXZFo1reR1Nkg==}
+
   acorn-jsx@5.3.2:
     resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
     peerDependencies:
@@ -1247,8 +1253,8 @@ packages:
   end-of-stream@1.4.4:
     resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==}
 
-  enhanced-resolve@5.18.0:
-    resolution: {integrity: sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==}
+  enhanced-resolve@5.18.1:
+    resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==}
     engines: {node: '>=10.13.0'}
 
   enquirer@2.4.1:
@@ -1645,6 +1651,9 @@ packages:
   loupe@3.1.2:
     resolution: {integrity: sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==}
 
+  loupe@3.1.3:
+    resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==}
+
   lru-cache@10.4.3:
     resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
 
@@ -1940,8 +1949,8 @@ packages:
       '@babel/runtime':
         optional: true
 
-  rollup@4.28.1:
-    resolution: {integrity: sha512-61fXYl/qNVinKmGSTHAZ6Yy8I3YIJC/r2m9feHo6SwVAVcLT5MPwOUFe7EuURA/4m0NR8lXG4BBXuo/IZEsjMg==}
+  rollup@4.34.5:
+    resolution: {integrity: sha512-GyVCmpo9z/HYqFD8QWoBUnz1Q9xC22t8tPAZm/AvAcUg2U2/+DkboEvSioMwv042zE4I9N3FEhx7fiCT2YHzKQ==}
     engines: {node: '>=18.0.0', npm: '>=8.0.0'}
     hasBin: true
 
@@ -1956,6 +1965,11 @@ packages:
     engines: {node: '>=10'}
     hasBin: true
 
+  semver@7.7.1:
+    resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==}
+    engines: {node: '>=10'}
+    hasBin: true
+
   shebang-command@2.0.0:
     resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
     engines: {node: '>=8'}
@@ -2219,13 +2233,13 @@ packages:
       typescript:
         optional: true
 
-  vite-node@3.0.3:
-    resolution: {integrity: sha512-0sQcwhwAEw/UJGojbhOrnq3HtiZ3tC7BzpAa0lx3QaTX0S3YX70iGcik25UBdB96pmdwjyY2uyKNYruxCDmiEg==}
+  vite-node@3.0.5:
+    resolution: {integrity: sha512-02JEJl7SbtwSDJdYS537nU6l+ktdvcREfLksk/NDAqtdKWGqHl+joXzEubHROmS3E6pip+Xgu2tFezMu75jH7A==}
     engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
     hasBin: true
 
-  vite@6.0.11:
-    resolution: {integrity: sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg==}
+  vite@6.1.0:
+    resolution: {integrity: sha512-RjjMipCKVoR4hVfPY6GQTgveinjNuyLw+qruksLDvA5ktI1150VmcMBKmQaEWJhg/j6Uaf6dNCNA0AfdzUb/hQ==}
     engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
     hasBin: true
     peerDependencies:
@@ -2264,20 +2278,23 @@ packages:
       yaml:
         optional: true
 
-  vitest@3.0.3:
-    resolution: {integrity: sha512-dWdwTFUW9rcnL0LyF2F+IfvNQWB0w9DERySCk8VMG75F8k25C7LsZoh6XfCjPvcR8Nb+Lqi9JKr6vnzH7HSrpQ==}
+  vitest@3.0.5:
+    resolution: {integrity: sha512-4dof+HvqONw9bvsYxtkfUp2uHsTN9bV2CZIi1pWgoFpL1Lld8LA1ka9q/ONSsoScAKG7NVGf2stJTI7XRkXb2Q==}
     engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
     hasBin: true
     peerDependencies:
       '@edge-runtime/vm': '*'
+      '@types/debug': ^4.1.12
       '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0
-      '@vitest/browser': 3.0.3
-      '@vitest/ui': 3.0.3
+      '@vitest/browser': 3.0.5
+      '@vitest/ui': 3.0.5
       happy-dom: '*'
       jsdom: '*'
     peerDependenciesMeta:
       '@edge-runtime/vm':
         optional: true
+      '@types/debug':
+        optional: true
       '@types/node':
         optional: true
       '@vitest/browser':
@@ -2802,69 +2819,69 @@ snapshots:
   '@rolldown/binding-win32-x64-msvc@1.0.0-beta.1':
     optional: true
 
-  '@rollup/pluginutils@5.1.3(rollup@4.28.1)':
+  '@rollup/pluginutils@5.1.3(rollup@4.34.5)':
     dependencies:
       '@types/estree': 1.0.6
       estree-walker: 2.0.2
       picomatch: 4.0.2
     optionalDependencies:
-      rollup: 4.28.1
+      rollup: 4.34.5
 
-  '@rollup/rollup-android-arm-eabi@4.28.1':
+  '@rollup/rollup-android-arm-eabi@4.34.5':
     optional: true
 
-  '@rollup/rollup-android-arm64@4.28.1':
+  '@rollup/rollup-android-arm64@4.34.5':
     optional: true
 
-  '@rollup/rollup-darwin-arm64@4.28.1':
+  '@rollup/rollup-darwin-arm64@4.34.5':
     optional: true
 
-  '@rollup/rollup-darwin-x64@4.28.1':
+  '@rollup/rollup-darwin-x64@4.34.5':
     optional: true
 
-  '@rollup/rollup-freebsd-arm64@4.28.1':
+  '@rollup/rollup-freebsd-arm64@4.34.5':
     optional: true
 
-  '@rollup/rollup-freebsd-x64@4.28.1':
+  '@rollup/rollup-freebsd-x64@4.34.5':
     optional: true
 
-  '@rollup/rollup-linux-arm-gnueabihf@4.28.1':
+  '@rollup/rollup-linux-arm-gnueabihf@4.34.5':
     optional: true
 
-  '@rollup/rollup-linux-arm-musleabihf@4.28.1':
+  '@rollup/rollup-linux-arm-musleabihf@4.34.5':
     optional: true
 
-  '@rollup/rollup-linux-arm64-gnu@4.28.1':
+  '@rollup/rollup-linux-arm64-gnu@4.34.5':
     optional: true
 
-  '@rollup/rollup-linux-arm64-musl@4.28.1':
+  '@rollup/rollup-linux-arm64-musl@4.34.5':
     optional: true
 
-  '@rollup/rollup-linux-loongarch64-gnu@4.28.1':
+  '@rollup/rollup-linux-loongarch64-gnu@4.34.5':
     optional: true
 
-  '@rollup/rollup-linux-powerpc64le-gnu@4.28.1':
+  '@rollup/rollup-linux-powerpc64le-gnu@4.34.5':
     optional: true
 
-  '@rollup/rollup-linux-riscv64-gnu@4.28.1':
+  '@rollup/rollup-linux-riscv64-gnu@4.34.5':
     optional: true
 
-  '@rollup/rollup-linux-s390x-gnu@4.28.1':
+  '@rollup/rollup-linux-s390x-gnu@4.34.5':
     optional: true
 
-  '@rollup/rollup-linux-x64-gnu@4.28.1':
+  '@rollup/rollup-linux-x64-gnu@4.34.5':
     optional: true
 
-  '@rollup/rollup-linux-x64-musl@4.28.1':
+  '@rollup/rollup-linux-x64-musl@4.34.5':
     optional: true
 
-  '@rollup/rollup-win32-arm64-msvc@4.28.1':
+  '@rollup/rollup-win32-arm64-msvc@4.34.5':
     optional: true
 
-  '@rollup/rollup-win32-ia32-msvc@4.28.1':
+  '@rollup/rollup-win32-ia32-msvc@4.34.5':
     optional: true
 
-  '@rollup/rollup-win32-x64-msvc@4.28.1':
+  '@rollup/rollup-win32-x64-msvc@4.34.5':
     optional: true
 
   '@stylistic/eslint-plugin-js@2.10.1(eslint@9.17.0)':
@@ -3015,41 +3032,45 @@ snapshots:
       '@typescript-eslint/types': 8.18.0
       eslint-visitor-keys: 4.2.0
 
-  '@vitest/expect@3.0.3':
+  '@vitest/expect@3.0.5':
     dependencies:
-      '@vitest/spy': 3.0.3
-      '@vitest/utils': 3.0.3
+      '@vitest/spy': 3.0.5
+      '@vitest/utils': 3.0.5
       chai: 5.1.2
       tinyrainbow: 2.0.0
 
-  '@vitest/mocker@3.0.3(vite@6.0.11(@types/node@22.10.2))':
+  '@vitest/mocker@3.0.5(vite@6.1.0(@types/node@22.10.2))':
     dependencies:
-      '@vitest/spy': 3.0.3
+      '@vitest/spy': 3.0.5
       estree-walker: 3.0.3
       magic-string: 0.30.17
     optionalDependencies:
-      vite: 6.0.11(@types/node@22.10.2)
+      vite: 6.1.0(@types/node@22.10.2)
 
   '@vitest/pretty-format@3.0.3':
     dependencies:
       tinyrainbow: 2.0.0
 
-  '@vitest/runner@3.0.3':
+  '@vitest/pretty-format@3.0.5':
     dependencies:
-      '@vitest/utils': 3.0.3
+      tinyrainbow: 2.0.0
+
+  '@vitest/runner@3.0.5':
+    dependencies:
+      '@vitest/utils': 3.0.5
       pathe: 2.0.2
 
-  '@vitest/snapshot@3.0.3':
+  '@vitest/snapshot@3.0.5':
     dependencies:
-      '@vitest/pretty-format': 3.0.3
+      '@vitest/pretty-format': 3.0.5
       magic-string: 0.30.17
       pathe: 2.0.2
 
-  '@vitest/spy@3.0.3':
+  '@vitest/spy@3.0.5':
     dependencies:
       tinyspy: 3.0.2
 
-  '@vitest/ui@3.0.3(vitest@3.0.3)':
+  '@vitest/ui@3.0.3(vitest@3.0.5)':
     dependencies:
       '@vitest/utils': 3.0.3
       fflate: 0.8.2
@@ -3058,7 +3079,7 @@ snapshots:
       sirv: 3.0.0
       tinyglobby: 0.2.10
       tinyrainbow: 2.0.0
-      vitest: 3.0.3(@types/node@22.10.2)(@vitest/ui@3.0.3)
+      vitest: 3.0.5(@types/node@22.10.2)(@vitest/ui@3.0.3(vitest@3.0.5))
 
   '@vitest/utils@3.0.3':
     dependencies:
@@ -3066,6 +3087,12 @@ snapshots:
       loupe: 3.1.2
       tinyrainbow: 2.0.0
 
+  '@vitest/utils@3.0.5':
+    dependencies:
+      '@vitest/pretty-format': 3.0.5
+      loupe: 3.1.3
+      tinyrainbow: 2.0.0
+
   acorn-jsx@5.3.2(acorn@8.14.0):
     dependencies:
       acorn: 8.14.0
@@ -3168,7 +3195,7 @@ snapshots:
       assertion-error: 2.0.1
       check-error: 2.1.1
       deep-eql: 5.0.2
-      loupe: 3.1.2
+      loupe: 3.1.3
       pathval: 2.0.0
 
   chalk@4.1.2:
@@ -3277,7 +3304,7 @@ snapshots:
     dependencies:
       once: 1.4.0
 
-  enhanced-resolve@5.18.0:
+  enhanced-resolve@5.18.1:
     dependencies:
       graceful-fs: 4.2.11
       tapable: 2.2.1
@@ -3324,7 +3351,7 @@ snapshots:
   eslint-compat-utils@0.5.1(eslint@9.17.0):
     dependencies:
       eslint: 9.17.0
-      semver: 7.6.3
+      semver: 7.7.1
 
   eslint-config-prettier@9.1.0(eslint@9.17.0):
     dependencies:
@@ -3340,14 +3367,14 @@ snapshots:
   eslint-plugin-n@17.13.1(eslint@9.17.0):
     dependencies:
       '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0)
-      enhanced-resolve: 5.18.0
+      enhanced-resolve: 5.18.1
       eslint: 9.17.0
       eslint-plugin-es-x: 7.8.0(eslint@9.17.0)
       get-tsconfig: 4.10.0
       globals: 15.14.0
       ignore: 5.3.2
       minimatch: 9.0.5
-      semver: 7.6.3
+      semver: 7.7.1
 
   eslint-plugin-svelte@2.46.0(eslint@9.17.0)(svelte@5.12.0):
     dependencies:
@@ -3361,7 +3388,7 @@ snapshots:
       postcss-load-config: 3.1.4(postcss@8.5.1)
       postcss-safe-parser: 6.0.0(postcss@8.5.1)
       postcss-selector-parser: 6.1.2
-      semver: 7.6.3
+      semver: 7.7.1
       svelte-eslint-parser: 0.43.0(svelte@5.12.0)
     optionalDependencies:
       svelte: 5.12.0
@@ -3714,6 +3741,8 @@ snapshots:
 
   loupe@3.1.2: {}
 
+  loupe@3.1.3: {}
+
   lru-cache@10.4.3: {}
 
   magic-string@0.30.17:
@@ -3972,29 +4001,29 @@ snapshots:
       '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.1
       '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.1
 
-  rollup@4.28.1:
+  rollup@4.34.5:
     dependencies:
       '@types/estree': 1.0.6
     optionalDependencies:
-      '@rollup/rollup-android-arm-eabi': 4.28.1
-      '@rollup/rollup-android-arm64': 4.28.1
-      '@rollup/rollup-darwin-arm64': 4.28.1
-      '@rollup/rollup-darwin-x64': 4.28.1
-      '@rollup/rollup-freebsd-arm64': 4.28.1
-      '@rollup/rollup-freebsd-x64': 4.28.1
-      '@rollup/rollup-linux-arm-gnueabihf': 4.28.1
-      '@rollup/rollup-linux-arm-musleabihf': 4.28.1
-      '@rollup/rollup-linux-arm64-gnu': 4.28.1
-      '@rollup/rollup-linux-arm64-musl': 4.28.1
-      '@rollup/rollup-linux-loongarch64-gnu': 4.28.1
-      '@rollup/rollup-linux-powerpc64le-gnu': 4.28.1
-      '@rollup/rollup-linux-riscv64-gnu': 4.28.1
-      '@rollup/rollup-linux-s390x-gnu': 4.28.1
-      '@rollup/rollup-linux-x64-gnu': 4.28.1
-      '@rollup/rollup-linux-x64-musl': 4.28.1
-      '@rollup/rollup-win32-arm64-msvc': 4.28.1
-      '@rollup/rollup-win32-ia32-msvc': 4.28.1
-      '@rollup/rollup-win32-x64-msvc': 4.28.1
+      '@rollup/rollup-android-arm-eabi': 4.34.5
+      '@rollup/rollup-android-arm64': 4.34.5
+      '@rollup/rollup-darwin-arm64': 4.34.5
+      '@rollup/rollup-darwin-x64': 4.34.5
+      '@rollup/rollup-freebsd-arm64': 4.34.5
+      '@rollup/rollup-freebsd-x64': 4.34.5
+      '@rollup/rollup-linux-arm-gnueabihf': 4.34.5
+      '@rollup/rollup-linux-arm-musleabihf': 4.34.5
+      '@rollup/rollup-linux-arm64-gnu': 4.34.5
+      '@rollup/rollup-linux-arm64-musl': 4.34.5
+      '@rollup/rollup-linux-loongarch64-gnu': 4.34.5
+      '@rollup/rollup-linux-powerpc64le-gnu': 4.34.5
+      '@rollup/rollup-linux-riscv64-gnu': 4.34.5
+      '@rollup/rollup-linux-s390x-gnu': 4.34.5
+      '@rollup/rollup-linux-x64-gnu': 4.34.5
+      '@rollup/rollup-linux-x64-musl': 4.34.5
+      '@rollup/rollup-win32-arm64-msvc': 4.34.5
+      '@rollup/rollup-win32-ia32-msvc': 4.34.5
+      '@rollup/rollup-win32-x64-msvc': 4.34.5
       fsevents: 2.3.3
 
   run-parallel@1.2.0:
@@ -4005,6 +4034,8 @@ snapshots:
 
   semver@7.6.3: {}
 
+  semver@7.7.1: {}
+
   shebang-command@2.0.0:
     dependencies:
       shebang-regex: 3.0.0
@@ -4258,9 +4289,9 @@ snapshots:
 
   universalify@0.1.2: {}
 
-  unplugin-isolated-decl@0.8.3(rollup@4.28.1)(typescript@5.7.2):
+  unplugin-isolated-decl@0.8.3(rollup@4.34.5)(typescript@5.7.2):
     dependencies:
-      '@rollup/pluginutils': 5.1.3(rollup@4.28.1)
+      '@rollup/pluginutils': 5.1.3(rollup@4.34.5)
       debug: 4.4.0
       magic-string: 0.30.17
       oxc-parser: 0.37.0
@@ -4286,13 +4317,13 @@ snapshots:
     optionalDependencies:
       typescript: 5.7.2
 
-  vite-node@3.0.3(@types/node@22.10.2):
+  vite-node@3.0.5(@types/node@22.10.2):
     dependencies:
       cac: 6.7.14
       debug: 4.4.0
       es-module-lexer: 1.6.0
       pathe: 2.0.2
-      vite: 6.0.11(@types/node@22.10.2)
+      vite: 6.1.0(@types/node@22.10.2)
     transitivePeerDependencies:
       - '@types/node'
       - jiti
@@ -4307,24 +4338,24 @@ snapshots:
       - tsx
       - yaml
 
-  vite@6.0.11(@types/node@22.10.2):
+  vite@6.1.0(@types/node@22.10.2):
     dependencies:
       esbuild: 0.24.2
       postcss: 8.5.1
-      rollup: 4.28.1
+      rollup: 4.34.5
     optionalDependencies:
       '@types/node': 22.10.2
       fsevents: 2.3.3
 
-  vitest@3.0.3(@types/node@22.10.2)(@vitest/ui@3.0.3):
+  vitest@3.0.5(@types/node@22.10.2)(@vitest/ui@3.0.3(vitest@3.0.5)):
     dependencies:
-      '@vitest/expect': 3.0.3
-      '@vitest/mocker': 3.0.3(vite@6.0.11(@types/node@22.10.2))
-      '@vitest/pretty-format': 3.0.3
-      '@vitest/runner': 3.0.3
-      '@vitest/snapshot': 3.0.3
-      '@vitest/spy': 3.0.3
-      '@vitest/utils': 3.0.3
+      '@vitest/expect': 3.0.5
+      '@vitest/mocker': 3.0.5(vite@6.1.0(@types/node@22.10.2))
+      '@vitest/pretty-format': 3.0.5
+      '@vitest/runner': 3.0.5
+      '@vitest/snapshot': 3.0.5
+      '@vitest/spy': 3.0.5
+      '@vitest/utils': 3.0.5
       chai: 5.1.2
       debug: 4.4.0
       expect-type: 1.1.0
@@ -4335,12 +4366,12 @@ snapshots:
       tinyexec: 0.3.2
       tinypool: 1.0.2
       tinyrainbow: 2.0.0
-      vite: 6.0.11(@types/node@22.10.2)
-      vite-node: 3.0.3(@types/node@22.10.2)
+      vite: 6.1.0(@types/node@22.10.2)
+      vite-node: 3.0.5(@types/node@22.10.2)
       why-is-node-running: 2.3.0
     optionalDependencies:
       '@types/node': 22.10.2
-      '@vitest/ui': 3.0.3(vitest@3.0.3)
+      '@vitest/ui': 3.0.3(vitest@3.0.5)
     transitivePeerDependencies:
       - jiti
       - less


Test patch:
diff --git a/community-addon-template/tests/setup/suite.ts b/community-addon-template/tests/setup/suite.ts
index 46f3f8c..9b2dc0a 100644
--- a/community-addon-template/tests/setup/suite.ts
+++ b/community-addon-template/tests/setup/suite.ts
@@ -3,7 +3,13 @@ import path from 'node:path';
 import { execSync } from 'node:child_process';
 import * as vitest from 'vitest';
 import { installAddon, type AddonMap, type OptionMap } from 'sv';
-import { createProject, startPreview, type CreateProject, type ProjectVariant } from 'sv/testing';
+import {
+	addPnpmBuildDependendencies,
+	createProject,
+	startPreview,
+	type CreateProject,
+	type ProjectVariant
+} from 'sv/testing';
 import { chromium, type Browser, type Page } from '@playwright/test';
 import { fileURLToPath } from 'node:url';
 
@@ -40,9 +46,18 @@ export function setupTest<Addons extends AddonMap>(addons: Addons) {
 		// creates a pnpm workspace in each addon dir
 		fs.writeFileSync(
 			path.resolve(cwd, testName, 'pnpm-workspace.yaml'),
-			`packages:\n  - '**/*'`,
+			"packages:\n  - '**/*'",
 			'utf8'
 		);
+
+		// creates a barebones package.json in each addon dir
+		fs.writeFileSync(
+			path.resolve(cwd, testName, 'package.json'),
+			JSON.stringify({
+				name: `${testName}-workspace-root`,
+				private: true
+			})
+		);
 	});
 
 	// runs before each test case
@@ -57,7 +72,13 @@ export function setupTest<Addons extends AddonMap>(addons: Addons) {
 			fs.writeFileSync(metaPath, JSON.stringify({ variant, options }, null, '\t'), 'utf8');
 
 			// run addon
-			await installAddon({ cwd, addons, options, packageManager: 'pnpm' });
+			const { pnpmBuildDependencies } = await installAddon({
+				cwd,
+				addons,
+				options,
+				packageManager: 'pnpm'
+			});
+			addPnpmBuildDependendencies(cwd, 'pnpm', ['esbuild', ...pnpmBuildDependencies]);
 
 			return cwd;
 		};
diff --git a/packages/addons/_tests/_setup/suite.ts b/packages/addons/_tests/_setup/suite.ts
index 9af9de8..5c6e5a1 100644
--- a/packages/addons/_tests/_setup/suite.ts
+++ b/packages/addons/_tests/_setup/suite.ts
@@ -3,7 +3,13 @@ import path from 'node:path';
 import { execSync } from 'node:child_process';
 import * as vitest from 'vitest';
 import { installAddon, type AddonMap, type OptionMap } from 'sv';
-import { createProject, startPreview, type CreateProject, type ProjectVariant } from 'sv/testing';
+import {
+	createProject,
+	startPreview,
+	addPnpmBuildDependendencies,
+	type CreateProject,
+	type ProjectVariant
+} from 'sv/testing';
 import { chromium, type Browser, type Page } from '@playwright/test';
 
 const cwd = vitest.inject('testDir');
@@ -40,6 +46,15 @@ export function setupTest<Addons extends AddonMap>(addons: Addons) {
 			"packages:\n  - '**/*'",
 			'utf8'
 		);
+
+		// creates a barebones package.json in each addon dir
+		fs.writeFileSync(
+			path.resolve(cwd, testName, 'package.json'),
+			JSON.stringify({
+				name: `${testName}-workspace-root`,
+				private: true
+			})
+		);
 	});
 
 	// runs before each test case
@@ -54,7 +69,13 @@ export function setupTest<Addons extends AddonMap>(addons: Addons) {
 			fs.writeFileSync(metaPath, JSON.stringify({ variant, options }, null, '\t'), 'utf8');
 
 			// run addon
-			await installAddon({ cwd, addons, options, packageManager: 'pnpm' });
+			const { pnpmBuildDependencies } = await installAddon({
+				cwd,
+				addons,
+				options,
+				packageManager: 'pnpm'
+			});
+			addPnpmBuildDependendencies(cwd, 'pnpm', ['esbuild', ...pnpmBuildDependencies]);
 
 			return cwd;
 		};
diff --git a/packages/addons/_tests/sveltekit-adapter/test.ts b/packages/addons/_tests/sveltekit-adapter/test.ts
index ffdf6a4..3adc351 100644
--- a/packages/addons/_tests/sveltekit-adapter/test.ts
+++ b/packages/addons/_tests/sveltekit-adapter/test.ts
@@ -1,6 +1,8 @@
 import { expect } from '@playwright/test';
-import { setupTest } from '../_setup/suite.ts';
+import { readFile } from 'node:fs/promises';
+import { join } from 'node:path';
 import sveltekitAdapter from '../../sveltekit-adapter/index.ts';
+import { setupTest } from '../_setup/suite.ts';
 
 const addonId = sveltekitAdapter.id;
 const { test, variants, prepareServer } = setupTest({ [addonId]: sveltekitAdapter });
@@ -13,5 +15,5 @@ test.concurrent.for(kitOnly)('core - %s', async (variant, { page, ...ctx }) => {
 	// kill server process when we're done
 	ctx.onTestFinished(async () => await close());
 
-	expect(true).toBe(true);
+	expect(await readFile(join(cwd, 'svelte.config.js'), 'utf8')).not.toMatch('adapter-auto');
 });
diff --git a/packages/addons/_tests/tailwindcss/test.ts b/packages/addons/_tests/tailwindcss/test.ts
index 1ede105..cd692cf 100644
--- a/packages/addons/_tests/tailwindcss/test.ts
+++ b/packages/addons/_tests/tailwindcss/test.ts
@@ -16,25 +16,28 @@ test.concurrent.for(variants)('none - %s', async (variant, { page, ...ctx }) =>
 	ctx.onTestFinished(async () => await close());
 
 	const el = page.getByTestId('base');
-	await expect(el).toHaveCSS('background-color', 'rgb(71, 85, 105)');
-	await expect(el).toHaveCSS('border-color', 'rgb(249, 250, 251)');
+	await expect(el).toHaveCSS('background-color', 'oklch(0.446 0.043 257.281)');
+	await expect(el).toHaveCSS('border-color', 'oklch(0.985 0.002 247.839)');
 	await expect(el).toHaveCSS('border-width', '4px');
 	await expect(el).toHaveCSS('margin-top', '4px');
 });
 
-test.concurrent.for(variants)('typography - %s', async (variant, { page, ...ctx }) => {
-	const cwd = await ctx.run(variant, { tailwindcss: { plugins: ['typography'] } });
-
-	// ...add files
-	addFixture(cwd, variant);
-
-	const { close } = await prepareServer({ cwd, page });
-	// kill server process when we're done
-	ctx.onTestFinished(async () => await close());
-
-	const el = page.getByTestId('typography');
-	await expect(el).toHaveCSS('font-size', '18px');
-	await expect(el).toHaveCSS('line-height', '28px');
-	await expect(el).toHaveCSS('text-align', 'right');
-	await expect(el).toHaveCSS('text-decoration-line', 'line-through');
-});
+test.concurrent.for(variants)(
+	'typography without plugin - %s',
+	async (variant, { page, ...ctx }) => {
+		const cwd = await ctx.run(variant, { tailwindcss });
+
+		// ...add files
+		addFixture(cwd, variant);
+
+		const { close } = await prepareServer({ cwd, page });
+		// kill server process when we're done
+		ctx.onTestFinished(async () => await close());
+
+		const el = page.getByTestId('typography');
+		await expect(el).toHaveCSS('font-size', '18px');
+		await expect(el).toHaveCSS('line-height', '28px');
+		await expect(el).toHaveCSS('text-align', 'right');
+		await expect(el).toHaveCSS('text-decoration-line', 'line-through');
+	}
+);
diff --git a/packages/cli/lib/testing.ts b/packages/cli/lib/testing.ts
index 6285752..101214b 100644
--- a/packages/cli/lib/testing.ts
+++ b/packages/cli/lib/testing.ts
@@ -6,6 +6,7 @@ import { exec } from 'tinyexec';
 import { create } from '@sveltejs/create';
 import pstree, { type PS } from 'ps-tree';
 
+export { addPnpmBuildDependendencies } from '../utils/package-manager.ts';
 export type ProjectVariant = 'kit-js' | 'kit-ts' | 'vite-js' | 'vite-ts';
 
 const TEMPLATES_DIR = '.templates';