@@ -323,49 +323,47 @@ export async function buildExtraViteConfig(
323
323
// knownJsSrcExtensions: options.extensions
324
324
} ;
325
325
326
- const optimizeDepsConfig = buildOptimizeDepsForSvelte ( config ) ;
327
- const ssrConfig = buildSSROptionsForSvelte ( config ) ;
328
- const crawlConfig = await getCrawlPkgsConfig ( options , config ) ;
329
-
326
+ const extraSvelteConfig = buildExtraConfigForSvelte ( config ) ;
327
+ const extraDepsConfig = await buildExtraConfigForDependencies ( options , config ) ;
328
+ // merge extra svelte and deps config, but make sure dep values are not contradicting svelte
330
329
extraViteConfig . optimizeDeps = {
331
330
include : [
332
- ...optimizeDepsConfig . include ,
333
- ...crawlConfig . optimizeDeps . include . filter (
334
- ( dep ) => ! isDepExcluded ( dep , optimizeDepsConfig . exclude )
331
+ ...extraSvelteConfig . optimizeDeps . include ,
332
+ ...extraDepsConfig . optimizeDeps . include . filter (
333
+ ( dep ) => ! isDepExcluded ( dep , extraSvelteConfig . optimizeDeps . exclude )
335
334
)
336
335
] ,
337
336
exclude : [
338
- ...optimizeDepsConfig . exclude ,
339
- ...crawlConfig . optimizeDeps . exclude . filter (
340
- ( dep ) => ! isDepIncluded ( dep , optimizeDepsConfig . include )
337
+ ...extraSvelteConfig . optimizeDeps . exclude ,
338
+ ...extraDepsConfig . optimizeDeps . exclude . filter (
339
+ ( dep ) => ! isDepIncluded ( dep , extraSvelteConfig . optimizeDeps . include )
341
340
)
342
341
]
343
342
} ;
344
343
345
344
extraViteConfig . ssr = {
346
- noExternal : [
347
- ...ssrConfig . noExternal ,
348
- ...crawlConfig . ssr . noExternal . filter ( ( dep ) => ! isDepExternaled ( dep , ssrConfig . external ) )
349
- ] ,
350
345
external : [
351
- ...ssrConfig . external ,
352
- ...crawlConfig . ssr . external . filter ( ( dep ) => ! isDepNoExternaled ( dep , ssrConfig . noExternal ) )
346
+ ...extraSvelteConfig . ssr . external ,
347
+ ...extraDepsConfig . ssr . external . filter (
348
+ ( dep ) => ! isDepNoExternaled ( dep , extraSvelteConfig . ssr . noExternal )
349
+ )
350
+ ] ,
351
+ noExternal : [
352
+ ...extraSvelteConfig . ssr . noExternal ,
353
+ ...extraDepsConfig . ssr . noExternal . filter (
354
+ ( dep ) => ! isDepExternaled ( dep , extraSvelteConfig . ssr . external )
355
+ )
353
356
]
354
357
} ;
355
358
356
359
// handle prebundling for svelte files
357
360
if ( options . prebundleSvelteLibraries ) {
358
- extraViteConfig . optimizeDeps = {
359
- ...extraViteConfig . optimizeDeps ,
360
- // Experimental Vite API to allow these extensions to be scanned and prebundled
361
- // @ts -ignore
362
- extensions : options . extensions ?? [ '.svelte' ] ,
363
- // Add esbuild plugin to prebundle Svelte files.
364
- // Currently a placeholder as more information is needed after Vite config is resolved,
365
- // the real Svelte plugin is added in `patchResolvedViteConfig()`
366
- esbuildOptions : {
367
- plugins : [ { name : facadeEsbuildSveltePluginName , setup : ( ) => { } } ]
368
- }
361
+ extraViteConfig . optimizeDeps . extensions = options . extensions ?? [ '.svelte' ] ;
362
+ // Add esbuild plugin to prebundle Svelte files.
363
+ // Currently a placeholder as more information is needed after Vite config is resolved,
364
+ // the real Svelte plugin is added in `patchResolvedViteConfig()`
365
+ extraViteConfig . optimizeDeps . esbuildOptions = {
366
+ plugins : [ { name : facadeEsbuildSveltePluginName , setup : ( ) => { } } ]
369
367
} ;
370
368
}
371
369
@@ -382,7 +380,7 @@ export async function buildExtraViteConfig(
382
380
return extraViteConfig ;
383
381
}
384
382
385
- async function getCrawlPkgsConfig ( options : PreResolvedOptions , config : UserConfig ) {
383
+ async function buildExtraConfigForDependencies ( options : PreResolvedOptions , config : UserConfig ) {
386
384
// extra handling for svelte dependencies in the project
387
385
const depsConfig = await crawlFrameworkPkgs ( {
388
386
root : options . root ,
@@ -404,11 +402,28 @@ async function getCrawlPkgsConfig(options: PreResolvedOptions, config: UserConfi
404
402
}
405
403
} ) ;
406
404
407
- log . debug ( 'crawl svelte packages result ' , depsConfig ) ;
405
+ log . debug ( 'extra config for dependencies generated by vitefu ' , depsConfig ) ;
408
406
409
407
if ( options . prebundleSvelteLibraries ) {
410
- depsConfig . optimizeDeps = { include : [ ] , exclude : [ ] } ;
411
- } else if ( options . disableDependencyReinclusion === true ) {
408
+ // prebundling enabled, so we don't need extra dependency excludes
409
+ depsConfig . optimizeDeps . exclude = [ ] ;
410
+ // but keep dependency reinclusions of explicit user excludes
411
+ const userExclude = config . optimizeDeps ?. exclude ;
412
+ depsConfig . optimizeDeps . include = ! userExclude
413
+ ? [ ]
414
+ : depsConfig . optimizeDeps . include . filter ( ( dep : string ) => {
415
+ // reincludes look like this: foo > bar > baz
416
+ // in case foo or bar are excluded, we have to retain the reinclude even with prebundling
417
+ return (
418
+ dep . includes ( '>' ) &&
419
+ dep
420
+ . split ( '>' )
421
+ . slice ( 0 , - 1 )
422
+ . some ( ( d ) => isDepExcluded ( d . trim ( ) , userExclude ) )
423
+ ) ;
424
+ } ) ;
425
+ }
426
+ if ( options . disableDependencyReinclusion === true ) {
412
427
depsConfig . optimizeDeps . include = depsConfig . optimizeDeps . include . filter (
413
428
( dep ) => ! dep . includes ( '>' )
414
429
) ;
@@ -421,12 +436,12 @@ async function getCrawlPkgsConfig(options: PreResolvedOptions, config: UserConfi
421
436
} ) ;
422
437
}
423
438
424
- log . debug ( 'processed crawl svelte packages result ' , depsConfig ) ;
439
+ log . debug ( 'post- processed extra config for dependencies ' , depsConfig ) ;
425
440
426
441
return depsConfig ;
427
442
}
428
443
429
- function buildOptimizeDepsForSvelte ( config : UserConfig ) {
444
+ function buildExtraConfigForSvelte ( config : UserConfig ) {
430
445
// include svelte imports for optimization unless explicitly excluded
431
446
const include : string [ ] = [ ] ;
432
447
const exclude : string [ ] = [ 'svelte-hmr' ] ;
@@ -439,18 +454,14 @@ function buildOptimizeDepsForSvelte(config: UserConfig) {
439
454
} else {
440
455
log . debug ( '"svelte" is excluded in optimizeDeps.exclude, skipped adding it to include.' ) ;
441
456
}
442
- return { include, exclude } ;
443
- }
444
-
445
- function buildSSROptionsForSvelte ( config : UserConfig ) {
446
457
const noExternal : ( string | RegExp ) [ ] = [ ] ;
447
458
const external : string [ ] = [ ] ;
448
459
// add svelte to ssr.noExternal unless it is present in ssr.external
449
460
// so we can resolve it with svelte/ssr
450
461
if ( ! isDepExternaled ( 'svelte' , config . ssr ?. external ?? [ ] ) ) {
451
462
noExternal . push ( 'svelte' , / ^ s v e l t e \/ / ) ;
452
463
}
453
- return { noExternal, external } ;
464
+ return { optimizeDeps : { include , exclude } , ssr : { noExternal, external } } ;
454
465
}
455
466
456
467
export function patchResolvedViteConfig ( viteConfig : ResolvedConfig , options : ResolvedOptions ) {
0 commit comments