1
1
import { readFileSync } from 'node:fs' ;
2
- import { compile , preprocess } from 'svelte/compiler' ;
2
+ import * as svelte from 'svelte/compiler' ;
3
3
import { log } from './log.js' ;
4
4
import { toESBuildError } from './error.js' ;
5
- import { isSvelte3 } from './svelte-version.js' ;
5
+ import { isSvelte3 , isSvelte5 } from './svelte-version.js' ;
6
6
7
7
/**
8
8
* @typedef {NonNullable<import('vite').DepOptimizationOptions['esbuildOptions']> } EsbuildOptions
@@ -11,6 +11,8 @@ import { isSvelte3 } from './svelte-version.js';
11
11
12
12
export const facadeEsbuildSveltePluginName = 'vite-plugin-svelte:facade' ;
13
13
14
+ const svelteModuleExtension = '.svelte.js' ;
15
+
14
16
/**
15
17
* @param {import('../types/options.d.ts').ResolvedOptions } options
16
18
* @returns {EsbuildPlugin }
@@ -24,6 +26,9 @@ export function esbuildSveltePlugin(options) {
24
26
if ( build . initialOptions . plugins ?. some ( ( v ) => v . name === 'vite:dep-scan' ) ) return ;
25
27
26
28
const svelteExtensions = ( options . extensions ?? [ '.svelte' ] ) . map ( ( ext ) => ext . slice ( 1 ) ) ;
29
+ if ( isSvelte5 ) {
30
+ svelteExtensions . push ( svelteModuleExtension . slice ( 1 ) ) ;
31
+ }
27
32
const svelteFilter = new RegExp ( '\\.(' + svelteExtensions . join ( '|' ) + ')(\\?.*)?$' ) ;
28
33
/** @type {import('../types/vite-plugin-svelte-stats.d.ts').StatCollection | undefined } */
29
34
let statsCollection ;
@@ -55,6 +60,21 @@ export function esbuildSveltePlugin(options) {
55
60
* @returns {Promise<string> }
56
61
*/
57
62
async 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
+
58
78
let css = options . compilerOptions . css ;
59
79
if ( css !== 'none' ) {
60
80
// 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) {
75
95
76
96
if ( options . preprocess ) {
77
97
try {
78
- preprocessed = await preprocess ( code , options . preprocess , { filename } ) ;
98
+ preprocessed = await svelte . preprocess ( code , options . preprocess , { filename } ) ;
79
99
} catch ( e ) {
80
100
e . message = `Error while preprocessing ${ filename } ${ e . message ? ` - ${ e . message } ` : '' } ` ;
81
101
throw e ;
@@ -102,7 +122,7 @@ async function compileSvelte(options, { filename, code }, statsCollection) {
102
122
}
103
123
: compileOptions ;
104
124
const endStat = statsCollection ?. start ( filename ) ;
105
- const compiled = compile ( finalCode , finalCompileOptions ) ;
125
+ const compiled = svelte . compile ( finalCode , finalCompileOptions ) ;
106
126
if ( endStat ) {
107
127
endStat ( ) ;
108
128
}
0 commit comments