@@ -2,7 +2,7 @@ import fs from 'fs';
22import path from 'path' ;
33import { rimraf } from '../filesystem/index.js' ;
44import create_manifest_data from '../../core/create_manifest_data/index.js' ;
5- import { copy_assets , get_no_external , posixify , resolve_entry } from '../utils.js' ;
5+ import { copy_assets , get_svelte_packages , posixify , resolve_entry } from '../utils.js' ;
66import { deep_merge , print_config_conflicts } from '../config/index.js' ;
77import { create_app } from '../../core/create_app/index.js' ;
88import vite from 'vite' ;
@@ -33,6 +33,7 @@ export async function build(config, { cwd = process.cwd(), runtime = '@sveltejs/
3333 rimraf ( build_dir ) ;
3434
3535 const output_dir = path . resolve ( cwd , `${ SVELTE_KIT } /output` ) ;
36+ const svelte_packages = get_svelte_packages ( cwd ) ;
3637
3738 const options = {
3839 cwd,
@@ -49,7 +50,8 @@ export async function build(config, { cwd = process.cwd(), runtime = '@sveltejs/
4950 } ) ,
5051 output_dir,
5152 client_entry_file : `${ SVELTE_KIT } /build/runtime/internal/start.js` ,
52- service_worker_entry_file : resolve_entry ( config . kit . files . serviceWorker )
53+ service_worker_entry_file : resolve_entry ( config . kit . files . serviceWorker ) ,
54+ svelte_packages
5355 } ;
5456
5557 const client_manifest = await build_client ( options ) ;
@@ -132,7 +134,7 @@ async function build_client({
132134 } ) ;
133135
134136 /** @type {any } */
135- const user_config = config . kit . vite ( ) ;
137+ const vite_config = config . kit . vite ( ) ;
136138
137139 const default_config = {
138140 server : {
@@ -143,10 +145,10 @@ async function build_client({
143145 } ;
144146
145147 // don't warn on overriding defaults
146- const [ modified_user_config ] = deep_merge ( default_config , user_config ) ;
148+ const [ modified_vite_config ] = deep_merge ( default_config , vite_config ) ;
147149
148150 /** @type {[any, string[]] } */
149- const [ merged_config , conflicts ] = deep_merge ( modified_user_config , {
151+ const [ merged_config , conflicts ] = deep_merge ( modified_vite_config , {
150152 configFile : false ,
151153 root : cwd ,
152154 base,
@@ -203,6 +205,7 @@ async function build_client({
203205 * output_dir: string;
204206 * client_entry_file: string;
205207 * service_worker_entry_file: string | null;
208+ * svelte_packages: string[];
206209 * }} options
207210 * @param {ClientManifest } client_manifest
208211 * @param {string } runtime
@@ -216,7 +219,8 @@ async function build_server(
216219 build_dir,
217220 output_dir,
218221 client_entry_file,
219- service_worker_entry_file
222+ service_worker_entry_file,
223+ svelte_packages
220224 } ,
221225 client_manifest ,
222226 runtime
@@ -420,8 +424,8 @@ async function build_server(
420424 . trim ( )
421425 ) ;
422426
423- /** @type {any } */
424- const user_config = config . kit . vite ( ) ;
427+ /** @type {import('vite').UserConfig } */
428+ const vite_config = config . kit . vite ( ) ;
425429
426430 const default_config = {
427431 server : {
@@ -432,10 +436,10 @@ async function build_server(
432436 } ;
433437
434438 // don't warn on overriding defaults
435- const [ modified_user_config ] = deep_merge ( default_config , user_config ) ;
439+ const [ modified_vite_config ] = deep_merge ( default_config , vite_config ) ;
436440
437441 /** @type {[any, string[]] } */
438- const [ merged_config , conflicts ] = deep_merge ( modified_user_config , {
442+ const [ merged_config , conflicts ] = deep_merge ( modified_vite_config , {
439443 configFile : false ,
440444 root : cwd ,
441445 base,
@@ -458,11 +462,13 @@ async function build_server(
458462 preserveEntrySignatures : 'strict'
459463 }
460464 } ,
461- resolve : {
462- alias : {
463- $app : path . resolve ( `${ build_dir } /runtime/app` ) ,
464- $lib : config . kit . files . lib
465- }
465+ optimizeDeps : {
466+ // exclude Svelte packages because optimizer skips .svelte files leading to half-bundled
467+ // broken packages https://github.com/vitejs/vite/issues/3910
468+ exclude : [
469+ ...( ( vite_config . optimizeDeps && vite_config . optimizeDeps . exclude ) || [ ] ) ,
470+ ...svelte_packages
471+ ]
466472 } ,
467473 plugins : [
468474 svelte ( {
@@ -472,16 +478,17 @@ async function build_server(
472478 }
473479 } )
474480 ] ,
475- // this API is marked as @alpha https://github.com/vitejs/vite/blob/27785f7fcc5b45987b5f0bf308137ddbdd9f79ea/packages/vite/src/node/config.ts#L129
476- // it's not exposed in the typescript definitions as a result
477- // so we need to ignore the fact that it's missing
481+ resolve : {
482+ alias : {
483+ $app : path . resolve ( `${ build_dir } /runtime/app` ) ,
484+ $lib : config . kit . files . lib
485+ }
486+ } ,
478487 ssr : {
479488 // note to self: this _might_ need to be ['svelte', '@sveltejs/kit', ...get_no_external()]
480489 // but I'm honestly not sure. roll with this for now and see if it's ok
481- noExternal : get_no_external ( cwd , user_config . ssr && user_config . ssr . noExternal )
482- } ,
483- optimizeDeps : {
484- entries : [ ]
490+ // @ts -expect-error ssr is considered in alpha, so not yet exposed by Vite
491+ noExternal : [ ...( ( vite_config . ssr && vite_config . ssr . noExternal ) || [ ] ) , ...svelte_packages ]
485492 }
486493 } ) ;
487494
@@ -500,11 +507,21 @@ async function build_server(
500507 * output_dir: string;
501508 * client_entry_file: string;
502509 * service_worker_entry_file: string | null;
510+ * svelte_packages: string[];
503511 * }} options
504512 * @param {ClientManifest } client_manifest
505513 */
506514async function build_service_worker (
507- { cwd, base, config, manifest, build_dir, output_dir, service_worker_entry_file } ,
515+ {
516+ cwd,
517+ base,
518+ config,
519+ manifest,
520+ build_dir,
521+ output_dir,
522+ service_worker_entry_file,
523+ svelte_packages
524+ } ,
508525 client_manifest
509526) {
510527 // TODO add any assets referenced in template .html file, e.g. favicon?
@@ -541,7 +558,7 @@ async function build_service_worker(
541558 ) ;
542559
543560 /** @type {any } */
544- const user_config = config . kit . vite ( ) ;
561+ const vite_config = config . kit . vite ( ) ;
545562
546563 const default_config = {
547564 server : {
@@ -552,10 +569,10 @@ async function build_service_worker(
552569 } ;
553570
554571 // don't warn on overriding defaults
555- const [ modified_user_config ] = deep_merge ( default_config , user_config ) ;
572+ const [ modified_vite_config ] = deep_merge ( default_config , vite_config ) ;
556573
557574 /** @type {[any, string[]] } */
558- const [ merged_config , conflicts ] = deep_merge ( modified_user_config , {
575+ const [ merged_config , conflicts ] = deep_merge ( modified_vite_config , {
559576 configFile : false ,
560577 root : cwd ,
561578 base,
@@ -573,13 +590,18 @@ async function build_service_worker(
573590 outDir : `${ output_dir } /client` ,
574591 emptyOutDir : false
575592 } ,
593+ optimizeDeps : {
594+ // exclude Svelte packages because optimizer skips .svelte files leading to half-bundled
595+ // broken packages https://github.com/vitejs/vite/issues/3910
596+ exclude : [
597+ ...( ( vite_config . optimizeDeps && vite_config . optimizeDeps . exclude ) || [ ] ) ,
598+ ...svelte_packages
599+ ]
600+ } ,
576601 resolve : {
577602 alias : {
578603 '$service-worker' : path . resolve ( `${ build_dir } /runtime/service-worker` )
579604 }
580- } ,
581- optimizeDeps : {
582- entries : [ ]
583605 }
584606 } ) ;
585607
0 commit comments