From 98eeb83cbde54334408b022130862f663a2762ba Mon Sep 17 00:00:00 2001 From: jycouet Date: Mon, 28 Jul 2025 08:12:20 +0200 Subject: [PATCH 1/4] fix: handle `satisfies` keyword for `vite.addPlugin` --- .changeset/loose-crabs-sink.md | 5 +++ .../tests/js/vite/with-satisfies/input.ts | 40 +++++++++++++++++++ .../tests/js/vite/with-satisfies/output.ts | 40 +++++++++++++++++++ .../core/tests/js/vite/with-satisfies/run.ts | 7 ++++ packages/core/tooling/js/vite.ts | 8 +++- 5 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 .changeset/loose-crabs-sink.md create mode 100644 packages/core/tests/js/vite/with-satisfies/input.ts create mode 100644 packages/core/tests/js/vite/with-satisfies/output.ts create mode 100644 packages/core/tests/js/vite/with-satisfies/run.ts 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..268b549a --- /dev/null +++ b/packages/core/tests/js/vite/with-satisfies/input.ts @@ -0,0 +1,40 @@ +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: [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..5b54e154 --- /dev/null +++ b/packages/core/tests/js/vite/with-satisfies/output.ts @@ -0,0 +1,40 @@ +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: [ + 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..27e4cb66 100644 --- a/packages/core/tooling/js/vite.ts +++ b/packages/core/tooling/js/vite.ts @@ -17,11 +17,17 @@ function exportDefaultConfig( fallbackExpression = object.create({}); } - const { value: rootObject } = exports.createDefault(ast, { fallback: fallbackExpression }); + const { value: _rootObject } = exports.createDefault(ast, { fallback: fallbackExpression }); // Handle wrapper functions (e.g., defineConfig({})) if ignoreWrapper is specified let configObject: AstTypes.ObjectExpression; + // Handle TypeScript satisfies expressions + let rootObject = _rootObject; + if (_rootObject.type === 'TSSatisfiesExpression') { + rootObject = _rootObject.expression; + } + // Early bail-out: if no wrapper to ignore or not a call expression if (!ignoreWrapper || !('arguments' in rootObject) || !Array.isArray(rootObject.arguments)) { configObject = rootObject as unknown as AstTypes.ObjectExpression; From d7d3b453315dcf54268a899546ec57581e3afec4 Mon Sep 17 00:00:00 2001 From: jycouet Date: Mon, 28 Jul 2025 08:15:58 +0200 Subject: [PATCH 2/4] format --- packages/core/tests/js/vite/with-satisfies/input.ts | 8 +++++++- packages/core/tests/js/vite/with-satisfies/output.ts | 1 + 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/core/tests/js/vite/with-satisfies/input.ts b/packages/core/tests/js/vite/with-satisfies/input.ts index 268b549a..7a13e19c 100644 --- a/packages/core/tests/js/vite/with-satisfies/input.ts +++ b/packages/core/tests/js/vite/with-satisfies/input.ts @@ -14,7 +14,13 @@ const $scripts = path.resolve($lib, './scripts'); const $actions = path.resolve($lib, './actions'); const config = defineConfig({ - plugins: [examples, tailwindcss(), sveltekit(), kitRoutes()], + plugins: [ + // all plugins + examples, + tailwindcss(), + sveltekit(), + kitRoutes() + ], resolve: { alias: { $lib, diff --git a/packages/core/tests/js/vite/with-satisfies/output.ts b/packages/core/tests/js/vite/with-satisfies/output.ts index 5b54e154..4d6ed36e 100644 --- a/packages/core/tests/js/vite/with-satisfies/output.ts +++ b/packages/core/tests/js/vite/with-satisfies/output.ts @@ -16,6 +16,7 @@ const $actions = path.resolve($lib, './actions'); const config = defineConfig({ plugins: [ + // all plugins examples, tailwindcss(), sveltekit(), From 234c12cdeaf9a3e5d668c7c3ade90d5a92ee0fe2 Mon Sep 17 00:00:00 2001 From: jycouet Date: Mon, 28 Jul 2025 19:33:47 +0200 Subject: [PATCH 3/4] better naming (internal) --- packages/core/tooling/js/vite.ts | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/packages/core/tooling/js/vite.ts b/packages/core/tooling/js/vite.ts index 27e4cb66..14d9b77b 100644 --- a/packages/core/tooling/js/vite.ts +++ b/packages/core/tooling/js/vite.ts @@ -17,17 +17,14 @@ 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; - // Handle TypeScript satisfies expressions - let rootObject = _rootObject; - if (_rootObject.type === 'TSSatisfiesExpression') { - rootObject = _rootObject.expression; - } - // Early bail-out: if no wrapper to ignore or not a call expression if (!ignoreWrapper || !('arguments' in rootObject) || !Array.isArray(rootObject.arguments)) { configObject = rootObject as unknown as AstTypes.ObjectExpression; From 435eed73035e73ebfc907e73768672951c3c6a76 Mon Sep 17 00:00:00 2001 From: jycouet Date: Mon, 28 Jul 2025 19:51:48 +0200 Subject: [PATCH 4/4] typo --- packages/core/tooling/js/vite.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/tooling/js/vite.ts b/packages/core/tooling/js/vite.ts index 14d9b77b..599e8d5e 100644 --- a/packages/core/tooling/js/vite.ts +++ b/packages/core/tooling/js/vite.ts @@ -19,7 +19,7 @@ function exportDefaultConfig( const { value } = exports.createDefault(ast, { fallback: fallbackExpression }); - // Handle TypeScript satisfies expressions + // Handle TypeScript `satisfies` expressions const rootObject = value.type === 'TSSatisfiesExpression' ? value.expression : value; // Handle wrapper functions (e.g., defineConfig({})) if ignoreWrapper is specified