@@ -3,6 +3,7 @@ import { mkdirp } from '../../../utils/filesystem.js';
3
3
import { find_deps , resolve_symlinks } from './utils.js' ;
4
4
import { s } from '../../../utils/misc.js' ;
5
5
import { normalizePath } from 'vite' ;
6
+ import { basename } from 'node:path' ;
6
7
7
8
/**
8
9
* @param {string } out
@@ -17,18 +18,47 @@ export function build_server_nodes(out, kit, manifest_data, server_manifest, cli
17
18
mkdirp ( `${ out } /server/nodes` ) ;
18
19
mkdirp ( `${ out } /server/stylesheets` ) ;
19
20
21
+ /** @type {Map<string, string> } */
20
22
const stylesheet_lookup = new Map ( ) ;
21
23
22
24
if ( css ) {
23
- css . forEach ( ( asset ) => {
24
- if ( asset . source . length < kit . inlineStyleThreshold ) {
25
- const index = stylesheet_lookup . size ;
26
- const file = `${ out } /server/stylesheets/${ index } .js` ;
25
+ /** @type {Set<string> } */
26
+ const client_stylesheets = new Set ( ) ;
27
+ for ( const key in client_manifest ) {
28
+ const file = client_manifest [ key ] ;
29
+ if ( file . css ?. [ 0 ] ) {
30
+ client_stylesheets . add ( file . css [ 0 ] ) ;
31
+ }
32
+ }
33
+
34
+ /** @type {Map<number, string> } */
35
+ const server_stylesheets = new Map ( ) ;
27
36
28
- fs . writeFileSync ( file , `// ${ asset . fileName } \nexport default ${ s ( asset . source ) } ;` ) ;
29
- stylesheet_lookup . set ( asset . fileName , index ) ;
37
+ const component_stylesheet_map = new Map ( Object . values ( server_manifest ) . map ( ( file ) => [ file . src , file . css ?. [ 0 ] ] ) ) ;
38
+
39
+ manifest_data . nodes . forEach ( ( node , i ) => {
40
+ const server_stylesheet = component_stylesheet_map . get ( node . component ) ;
41
+ if ( node . component && server_stylesheet ) {
42
+ server_stylesheets . set ( i , server_stylesheet ) ;
30
43
}
31
44
} ) ;
45
+
46
+ // ignore dynamically imported stylesheets since we can't inline those
47
+ css . filter ( asset => client_stylesheets . has ( asset . fileName ) )
48
+ . forEach ( ( asset ) => {
49
+ if ( asset . source . length < kit . inlineStyleThreshold ) {
50
+ const [ index ] = basename ( asset . fileName ) . split ( '.' ) ;
51
+ const server_stylesheet = server_stylesheets . get ( + index ) ;
52
+ const file = `${ out } /server/stylesheets/${ index } .js` ;
53
+
54
+ // we need to inline the server stylesheet instead of the client one
55
+ // so that asset paths are correct on document load
56
+ const source = fs . readFileSync ( `${ out } /server/${ server_stylesheet } ` , 'utf-8' ) ;
57
+
58
+ fs . writeFileSync ( file , `// ${ server_stylesheet } \nexport default ${ s ( source ) } ;` ) ;
59
+ stylesheet_lookup . set ( asset . fileName , index ) ;
60
+ }
61
+ } ) ;
32
62
}
33
63
34
64
manifest_data . nodes . forEach ( ( node , i ) => {
0 commit comments