Skip to content

Commit 04debfb

Browse files
hi-ogawaclaude
andcommitted
refactor: consolidate rscBundle into bundles map and delay fileName resolution
- Replace `rscBundle` with `bundles: Record<string, OutputBundle>` in RscPluginManager - Lookup fileName from bundles in writeEnvironmentImportsManifest instead of mutating meta - Remove generateBundle hook from import-environment plugin (no longer needed) - Remove unused fileName field from EnvironmentImportMeta type Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent 705c821 commit 04debfb

File tree

2 files changed

+14
-36
lines changed

2 files changed

+14
-36
lines changed

packages/plugin-rsc/src/plugin.ts

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ export type { RscPluginManager }
117117
class RscPluginManager {
118118
server!: ViteDevServer
119119
config!: ResolvedConfig
120-
rscBundle!: Rollup.OutputBundle
120+
bundles: Record<string, Rollup.OutputBundle> = {}
121121
buildAssetsManifest: AssetsManifest | undefined
122122
isScanBuild: boolean = false
123123
clientReferenceMetaMap: Record<string, ClientReferenceMeta> = {}
@@ -172,15 +172,21 @@ class RscPluginManager {
172172

173173
let code = 'export default {\n'
174174
for (const [resolvedId, meta] of Object.entries(imports)) {
175-
if (!meta.fileName) {
175+
// Lookup fileName from bundle
176+
const bundle = this.bundles[meta.targetEnv]
177+
const chunk = Object.values(bundle ?? {}).find(
178+
(c) =>
179+
c.type === 'chunk' && c.isEntry && c.facadeModuleId === resolvedId,
180+
)
181+
if (!chunk) {
176182
throw new Error(
177183
`[vite-rsc] missing output for environment import: ${resolvedId}`,
178184
)
179185
}
180186
const targetOutDir =
181187
this.config.environments[meta.targetEnv]!.build.outDir
182188
const relativePath = normalizeRelativePath(
183-
path.relative(sourceOutDir, path.join(targetOutDir, meta.fileName)),
189+
path.relative(sourceOutDir, path.join(targetOutDir, chunk.fileName)),
184190
)
185191
// Use relative ID for stable builds across different machines
186192
const relativeId = this.toRelativeId(resolvedId)
@@ -1069,9 +1075,7 @@ export function createRpcClient(params) {
10691075
// client build
10701076
generateBundle(_options, bundle) {
10711077
// copy assets from rsc build to client build
1072-
if (this.environment.name === 'rsc') {
1073-
manager.rscBundle = bundle
1074-
}
1078+
manager.bundles[this.environment.name] = bundle
10751079

10761080
if (this.environment.name === 'client') {
10771081
const filterAssets =
@@ -1081,7 +1085,7 @@ export function createRpcClient(params) {
10811085
typeof rscBuildOptions.manifest === 'string'
10821086
? rscBuildOptions.manifest
10831087
: rscBuildOptions.manifest && '.vite/manifest.json'
1084-
for (const asset of Object.values(manager.rscBundle)) {
1088+
for (const asset of Object.values(manager.bundles['rsc']!)) {
10851089
if (asset.fileName === rscViteManifest) continue
10861090
if (asset.type === 'asset' && filterAssets(asset.fileName)) {
10871091
this.emitFile({
@@ -1093,7 +1097,7 @@ export function createRpcClient(params) {
10931097
}
10941098

10951099
const serverResources: Record<string, AssetDeps> = {}
1096-
const rscAssetDeps = collectAssetDeps(manager.rscBundle)
1100+
const rscAssetDeps = collectAssetDeps(manager.bundles['rsc']!)
10971101
for (const [id, meta] of Object.entries(
10981102
manager.serverResourcesMetaMap,
10991103
)) {

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

Lines changed: 2 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ export type EnvironmentImportMeta = {
2121
targetEnv: string
2222
sourceEnv: string
2323
specifier: string
24-
fileName?: string
2524
}
2625

2726
export function vitePluginImportEnvironment(
@@ -132,13 +131,11 @@ export function vitePluginImportEnvironment(
132131
resolvedId = resolved.id
133132
}
134133

135-
// TODO: environmentImportMetaMap structure seems still awkward
136-
// should be [sourceEnv][targetEnv][resolvedId]
137-
134+
// TODO: environmentImportMetaMap structure should be [sourceEnv][targetEnv][resolvedId]
138135
// Track discovered entry, keyed by [sourceEnv][resolvedId]
139136
const sourceEnv = this.environment.name
140137
manager.environmentImportMetaMap[sourceEnv] ??= {}
141-
manager.environmentImportMetaMap[sourceEnv]![resolvedId] ??= {
138+
manager.environmentImportMetaMap[sourceEnv]![resolvedId] = {
142139
resolvedId,
143140
targetEnv: environmentName,
144141
sourceEnv,
@@ -186,29 +183,6 @@ export function vitePluginImportEnvironment(
186183
}
187184
return
188185
},
189-
190-
generateBundle(_options, bundle) {
191-
if (this.environment.name === 'client') return
192-
193-
// TODO: delay `fileName` assigment to right before writeEnvironmentImportsManifest
194-
// TODO: we can just hold old `bundles: Record<string, ..>` in manager
195-
196-
// Track output filenames for discovered environment imports
197-
// Only set fileName when this bundle's environment matches the target
198-
for (const [fileName, chunk] of Object.entries(bundle)) {
199-
if (chunk.type === 'chunk' && chunk.isEntry && chunk.facadeModuleId) {
200-
const resolvedId = chunk.facadeModuleId
201-
for (const imports of Object.values(
202-
manager.environmentImportMetaMap,
203-
)) {
204-
const meta = imports[resolvedId]
205-
if (meta && meta.targetEnv === this.environment.name) {
206-
meta.fileName = fileName
207-
}
208-
}
209-
}
210-
}
211-
},
212186
},
213187
createVirtualPlugin(
214188
ENV_IMPORTS_ENTRY_FALLBACK.slice('virtual:'.length),

0 commit comments

Comments
 (0)