11import { readFileSync } from 'node:fs' ;
2- import { compile , preprocess } from 'svelte/compiler' ;
2+ import * as svelte from 'svelte/compiler' ;
33import { log } from './log.js' ;
44import { toESBuildError } from './error.js' ;
5- import { isSvelte3 } from './svelte-version.js' ;
5+ import { isSvelte3 , isSvelte5 } from './svelte-version.js' ;
66
77/**
88 * @typedef {NonNullable<import('vite').DepOptimizationOptions['esbuildOptions']> } EsbuildOptions
@@ -11,6 +11,8 @@ import { isSvelte3 } from './svelte-version.js';
1111
1212export const facadeEsbuildSveltePluginName = 'vite-plugin-svelte:facade' ;
1313
14+ const svelteModuleExtension = '.svelte.js' ;
15+
1416/**
1517 * @param {import('../types/options.d.ts').ResolvedOptions } options
1618 * @returns {EsbuildPlugin }
@@ -24,6 +26,9 @@ export function esbuildSveltePlugin(options) {
2426 if ( build . initialOptions . plugins ?. some ( ( v ) => v . name === 'vite:dep-scan' ) ) return ;
2527
2628 const svelteExtensions = ( options . extensions ?? [ '.svelte' ] ) . map ( ( ext ) => ext . slice ( 1 ) ) ;
29+ if ( isSvelte5 ) {
30+ svelteExtensions . push ( svelteModuleExtension . slice ( 1 ) ) ;
31+ }
2732 const svelteFilter = new RegExp ( '\\.(' + svelteExtensions . join ( '|' ) + ')(\\?.*)?$' ) ;
2833 /** @type {import('../types/vite-plugin-svelte-stats.d.ts').StatCollection | undefined } */
2934 let statsCollection ;
@@ -55,6 +60,21 @@ export function esbuildSveltePlugin(options) {
5560 * @returns {Promise<string> }
5661 */
5762async function compileSvelte ( options , { filename, code } , statsCollection ) {
63+ if ( isSvelte5 && filename . endsWith ( svelteModuleExtension ) ) {
64+ const endStat = statsCollection ?. start ( filename ) ;
65+ const compiled = svelte . compileModule ( code , {
66+ filename,
67+ generate : 'dom' ,
68+ runes : true
69+ } ) ;
70+ if ( endStat ) {
71+ endStat ( ) ;
72+ }
73+ return compiled . js . map
74+ ? compiled . js . code + '//# sourceMappingURL=' + compiled . js . map . toUrl ( )
75+ : compiled . js . code ;
76+ }
77+
5878 let css = options . compilerOptions . css ;
5979 if ( css !== 'none' ) {
6080 // TODO ideally we'd be able to externalize prebundled styles too, but for now always put them in the js
@@ -75,7 +95,7 @@ async function compileSvelte(options, { filename, code }, statsCollection) {
7595
7696 if ( options . preprocess ) {
7797 try {
78- preprocessed = await preprocess ( code , options . preprocess , { filename } ) ;
98+ preprocessed = await svelte . preprocess ( code , options . preprocess , { filename } ) ;
7999 } catch ( e ) {
80100 e . message = `Error while preprocessing ${ filename } ${ e . message ? ` - ${ e . message } ` : '' } ` ;
81101 throw e ;
@@ -102,7 +122,7 @@ async function compileSvelte(options, { filename, code }, statsCollection) {
102122 }
103123 : compileOptions ;
104124 const endStat = statsCollection ?. start ( filename ) ;
105- const compiled = compile ( finalCode , finalCompileOptions ) ;
125+ const compiled = svelte . compile ( finalCode , finalCompileOptions ) ;
106126 if ( endStat ) {
107127 endStat ( ) ;
108128 }
0 commit comments