@@ -24,95 +24,98 @@ export function vitePluginImportEnvironment(manager: PluginManager): Plugin[] {
2424 return [
2525 {
2626 name : 'rsc:import-environment' ,
27- async transform ( code , id ) {
28- if ( ! code . includes ( 'import.meta.viteRsc.import' ) ) return
29-
30- const { server } = manager
31- const s = new MagicString ( code )
32-
33- for ( const match of stripLiteral ( code ) . matchAll (
34- / i m p o r t \. m e t a \. v i t e R s c \. i m p o r t \s * ( < [ \s \S ] * ?> ) ? \s * \( ( [ \s \S ] * ?) \) / dg,
35- ) ) {
36- // match[2] is the arguments (after optional type parameter)
37- const [ argStart , argEnd ] = match . indices ! [ 2 ] !
38- const argCode = code . slice ( argStart , argEnd ) . trim ( )
39-
40- // Parse: ('./entry.ssr', { environment: 'ssr' })
41- const [ specifier , options ] : [ string , { environment : string } ] =
42- evalValue ( `[${ argCode } ]` )
43- const environmentName = options . environment
44-
45- // Resolve specifier relative to importer
46- let resolvedId : string
47- if ( this . environment . mode === 'dev' ) {
48- const targetEnv = server . environments [ environmentName ]
49- assert (
50- targetEnv ,
51- `[vite-rsc] unknown environment '${ environmentName } '` ,
52- )
53- const resolved = await targetEnv . pluginContainer . resolveId (
27+ transform : {
28+ async handler ( code , id ) {
29+ if ( ! code . includes ( 'import.meta.viteRsc.import' ) ) return
30+
31+ const { server } = manager
32+ const s = new MagicString ( code )
33+
34+ for ( const match of stripLiteral ( code ) . matchAll (
35+ / i m p o r t \. m e t a \. v i t e R s c \. i m p o r t \s * ( < [ \s \S ] * ?> ) ? \s * \( ( [ \s \S ] * ?) \) / dg,
36+ ) ) {
37+ // match[2] is the arguments (after optional type parameter)
38+ const [ argStart , argEnd ] = match . indices ! [ 2 ] !
39+ const argCode = code . slice ( argStart , argEnd ) . trim ( )
40+
41+ // Parse: ('./entry.ssr', { environment: 'ssr' })
42+ const [ specifier , options ] : [ string , { environment : string } ] =
43+ evalValue ( `[${ argCode } ]` )
44+ const environmentName = options . environment
45+
46+ // Resolve specifier relative to importer
47+ let resolvedId : string
48+ if ( this . environment . mode === 'dev' ) {
49+ const targetEnv = server . environments [ environmentName ]
50+ assert (
51+ targetEnv ,
52+ `[vite-rsc] unknown environment '${ environmentName } '` ,
53+ )
54+ const resolved = await targetEnv . pluginContainer . resolveId (
55+ specifier ,
56+ id ,
57+ )
58+ assert (
59+ resolved ,
60+ `[vite-rsc] failed to resolve '${ specifier } ' in environment '${ environmentName } '` ,
61+ )
62+ resolvedId = resolved . id
63+ } else {
64+ // Build mode: resolve in target environment config
65+ const targetEnvConfig =
66+ manager . config . environments [ environmentName ]
67+ assert (
68+ targetEnvConfig ,
69+ `[vite-rsc] unknown environment '${ environmentName } '` ,
70+ )
71+ // Use this environment's resolver for now
72+ const resolved = await this . resolve ( specifier , id )
73+ assert (
74+ resolved ,
75+ `[vite-rsc] failed to resolve '${ specifier } ' in environment '${ environmentName } '` ,
76+ )
77+ resolvedId = resolved . id
78+ }
79+
80+ // Derive entry name from specifier (e.g., './entry.ssr.tsx' -> 'entry.ssr')
81+ const entryName = deriveEntryName ( specifier )
82+
83+ // Track discovered entry
84+ manager . environmentImportMetaMap [ resolvedId ] = {
85+ resolvedId,
86+ targetEnv : environmentName ,
87+ sourceEnv : this . environment . name ,
5488 specifier,
55- id ,
56- )
57- assert (
58- resolved ,
59- `[vite-rsc] failed to resolve '${ specifier } ' in environment '${ environmentName } '` ,
60- )
61- resolvedId = resolved . id
62- } else {
63- // Build mode: resolve in target environment config
64- const targetEnvConfig = manager . config . environments [ environmentName ]
65- assert (
66- targetEnvConfig ,
67- `[vite-rsc] unknown environment '${ environmentName } '` ,
68- )
69- // Use this environment's resolver for now
70- const resolved = await this . resolve ( specifier , id )
71- assert (
72- resolved ,
73- `[vite-rsc] failed to resolve '${ specifier } ' in environment '${ environmentName } '` ,
74- )
75- resolvedId = resolved . id
76- }
77-
78- // Derive entry name from specifier (e.g., './entry.ssr.tsx' -> 'entry.ssr')
79- const entryName = deriveEntryName ( specifier )
80-
81- // Track discovered entry
82- manager . environmentImportMetaMap [ resolvedId ] = {
83- resolvedId,
84- targetEnv : environmentName ,
85- sourceEnv : this . environment . name ,
86- specifier,
87- entryName,
88- }
89-
90- let replacement : string
91- if ( this . environment . mode === 'dev' ) {
92- replacement = `globalThis.__VITE_ENVIRONMENT_RUNNER_IMPORT__(${ JSON . stringify ( environmentName ) } , ${ JSON . stringify ( resolvedId ) } )`
93- } else {
94- // Build: emit marker that will be resolved in renderChunk
95- replacement = JSON . stringify (
96- `__vite_rsc_import_env_start__:` +
97- JSON . stringify ( {
98- fromEnv : this . environment . name ,
99- toEnv : environmentName ,
100- entryName,
101- } ) +
102- `:__vite_rsc_import_env_end__` ,
103- )
89+ entryName,
90+ }
91+
92+ let replacement : string
93+ if ( this . environment . mode === 'dev' ) {
94+ replacement = `globalThis.__VITE_ENVIRONMENT_RUNNER_IMPORT__(${ JSON . stringify ( environmentName ) } , ${ JSON . stringify ( resolvedId ) } )`
95+ } else {
96+ // Build: emit marker that will be resolved in renderChunk
97+ replacement = JSON . stringify (
98+ `__vite_rsc_import_env_start__:` +
99+ JSON . stringify ( {
100+ fromEnv : this . environment . name ,
101+ toEnv : environmentName ,
102+ entryName,
103+ } ) +
104+ `:__vite_rsc_import_env_end__` ,
105+ )
106+ }
107+
108+ const [ start , end ] = match . indices ! [ 0 ] !
109+ s . overwrite ( start , end , replacement )
104110 }
105111
106- const [ start , end ] = match . indices ! [ 0 ] !
107- s . overwrite ( start , end , replacement )
108- }
109-
110- if ( s . hasChanged ( ) ) {
111- return {
112- code : s . toString ( ) ,
113- map : s . generateMap ( { hires : 'boundary' } ) ,
112+ if ( s . hasChanged ( ) ) {
113+ return {
114+ code : s . toString ( ) ,
115+ map : s . generateMap ( { hires : 'boundary' } ) ,
116+ }
114117 }
115- }
118+ } ,
116119 } ,
117120
118121 renderChunk ( code , chunk ) {
0 commit comments