Skip to content

Commit 3591f12

Browse files
committed
refactor(rsc): use transform handler object form
1 parent 51f8e91 commit 3591f12

File tree

1 file changed

+88
-85
lines changed

1 file changed

+88
-85
lines changed

packages/plugin-rsc/src/plugins/import-environment.ts

Lines changed: 88 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -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-
/import\.meta\.viteRsc\.import\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+
/import\.meta\.viteRsc\.import\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

Comments
 (0)