diff --git a/.changeset/loose-crabs-sink.md b/.changeset/loose-crabs-sink.md new file mode 100644 index 00000000..a2f084e1 --- /dev/null +++ b/.changeset/loose-crabs-sink.md @@ -0,0 +1,5 @@ +--- +'sv': patch +--- + +fix: handle `satisfies` keyword for `vite.addPlugin` diff --git a/packages/core/tests/js/vite/with-satisfies/input.ts b/packages/core/tests/js/vite/with-satisfies/input.ts new file mode 100644 index 00000000..7a13e19c --- /dev/null +++ b/packages/core/tests/js/vite/with-satisfies/input.ts @@ -0,0 +1,46 @@ +import { sveltekit } from '@sveltejs/kit/vite'; +import examples from 'mdsvexamples/vite'; +import path from 'node:path'; +import { kitRoutes } from 'vite-plugin-kit-routes'; +import tailwindcss from '@tailwindcss/vite'; +import { browserslistToTargets } from 'lightningcss'; +import browserslist from 'browserslist'; +import { defineConfig, type UserConfig } from 'vite'; + +const $root = path.resolve(__dirname, './src'); +const $lib = path.resolve($root, './lib'); +const $routes = path.resolve($root, './routes'); +const $scripts = path.resolve($lib, './scripts'); +const $actions = path.resolve($lib, './actions'); + +const config = defineConfig({ + plugins: [ + // all plugins + examples, + tailwindcss(), + sveltekit(), + kitRoutes() + ], + resolve: { + alias: { + $lib, + $routes, + $scripts, + $actions + } + }, + build: { + sourcemap: true, + target: 'esnext', + cssMinify: 'lightningcss' + }, + css: { + transformer: 'lightningcss', + lightningcss: { + targets: browserslistToTargets(browserslist('defaults, not ie 11')) + } + }, + experimental: { enableNativePlugin: true } +}) satisfies UserConfig; + +export default config; diff --git a/packages/core/tests/js/vite/with-satisfies/output.ts b/packages/core/tests/js/vite/with-satisfies/output.ts new file mode 100644 index 00000000..4d6ed36e --- /dev/null +++ b/packages/core/tests/js/vite/with-satisfies/output.ts @@ -0,0 +1,41 @@ +import myPlugin from 'my-plugin'; +import { sveltekit } from '@sveltejs/kit/vite'; +import examples from 'mdsvexamples/vite'; +import path from 'node:path'; +import { kitRoutes } from 'vite-plugin-kit-routes'; +import tailwindcss from '@tailwindcss/vite'; +import { browserslistToTargets } from 'lightningcss'; +import browserslist from 'browserslist'; +import { defineConfig, type UserConfig } from 'vite'; + +const $root = path.resolve(__dirname, './src'); +const $lib = path.resolve($root, './lib'); +const $routes = path.resolve($root, './routes'); +const $scripts = path.resolve($lib, './scripts'); +const $actions = path.resolve($lib, './actions'); + +const config = defineConfig({ + plugins: [ + // all plugins + examples, + tailwindcss(), + sveltekit(), + kitRoutes(), + myPlugin() + ], + resolve: { alias: { $lib, $routes, $scripts, $actions } }, + build: { + sourcemap: true, + target: 'esnext', + cssMinify: 'lightningcss' + }, + css: { + transformer: 'lightningcss', + lightningcss: { + targets: browserslistToTargets(browserslist('defaults, not ie 11')) + } + }, + experimental: { enableNativePlugin: true } +}) satisfies UserConfig; + +export default config; diff --git a/packages/core/tests/js/vite/with-satisfies/run.ts b/packages/core/tests/js/vite/with-satisfies/run.ts new file mode 100644 index 00000000..174c7dba --- /dev/null +++ b/packages/core/tests/js/vite/with-satisfies/run.ts @@ -0,0 +1,7 @@ +import { imports, vite, type AstTypes } from '@sveltejs/cli-core/js'; + +export function run(ast: AstTypes.Program): void { + const vitePluginName = 'myPlugin'; + imports.addDefault(ast, { as: vitePluginName, from: 'my-plugin' }); + vite.addPlugin(ast, { code: `${vitePluginName}()` }); +} diff --git a/packages/core/tooling/js/vite.ts b/packages/core/tooling/js/vite.ts index 0654fd1d..599e8d5e 100644 --- a/packages/core/tooling/js/vite.ts +++ b/packages/core/tooling/js/vite.ts @@ -17,7 +17,10 @@ function exportDefaultConfig( fallbackExpression = object.create({}); } - const { value: rootObject } = exports.createDefault(ast, { fallback: fallbackExpression }); + const { value } = exports.createDefault(ast, { fallback: fallbackExpression }); + + // Handle TypeScript `satisfies` expressions + const rootObject = value.type === 'TSSatisfiesExpression' ? value.expression : value; // Handle wrapper functions (e.g., defineConfig({})) if ignoreWrapper is specified let configObject: AstTypes.ObjectExpression;