Skip to content

Commit 6431f8f

Browse files
hi-ogawaclaude
andcommitted
refactor: restructure environmentImportMetaMap to [sourceEnv][targetEnv][resolvedId]
- Update type definition to add targetEnv as middle key - Update write logic in transform to use new structure - Update buildStart to lookup by targetEnv directly (more efficient) - Update writeEnvironmentImportsManifest to iterate by targetEnv Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent 04debfb commit 6431f8f

File tree

2 files changed

+43
-29
lines changed

2 files changed

+43
-29
lines changed

packages/plugin-rsc/src/plugin.ts

Lines changed: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -128,8 +128,11 @@ class RscPluginManager {
128128
environmentImportMetaMap: Record<
129129
string, // sourceEnv
130130
Record<
131-
string, // resolvedId
132-
EnvironmentImportMeta
131+
string, // targetEnv
132+
Record<
133+
string, // resolvedId
134+
EnvironmentImportMeta
135+
>
133136
>
134137
> = {}
135138

@@ -164,33 +167,40 @@ class RscPluginManager {
164167
}
165168

166169
// Write manifest to each source environment's output
167-
for (const [sourceEnv, imports] of Object.entries(
170+
for (const [sourceEnv, byTargetEnv] of Object.entries(
168171
this.environmentImportMetaMap,
169172
)) {
170173
const sourceOutDir = this.config.environments[sourceEnv]!.build.outDir
171174
const manifestPath = path.join(sourceOutDir, ENV_IMPORTS_MANIFEST_NAME)
172175

173176
let code = 'export default {\n'
174-
for (const [resolvedId, meta] of Object.entries(imports)) {
177+
for (const [targetEnv, imports] of Object.entries(byTargetEnv)) {
175178
// 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) {
182-
throw new Error(
183-
`[vite-rsc] missing output for environment import: ${resolvedId}`,
179+
const bundle = this.bundles[targetEnv]
180+
for (const [resolvedId, meta] of Object.entries(imports)) {
181+
const chunk = Object.values(bundle ?? {}).find(
182+
(c) =>
183+
c.type === 'chunk' &&
184+
c.isEntry &&
185+
c.facadeModuleId === resolvedId,
186+
)
187+
if (!chunk) {
188+
throw new Error(
189+
`[vite-rsc] missing output for environment import: ${resolvedId}`,
190+
)
191+
}
192+
const targetOutDir =
193+
this.config.environments[meta.targetEnv]!.build.outDir
194+
const relativePath = normalizeRelativePath(
195+
path.relative(
196+
sourceOutDir,
197+
path.join(targetOutDir, chunk.fileName),
198+
),
184199
)
200+
// Use relative ID for stable builds across different machines
201+
const relativeId = this.toRelativeId(resolvedId)
202+
code += ` ${JSON.stringify(relativeId)}: () => import(${JSON.stringify(relativePath)}),\n`
185203
}
186-
const targetOutDir =
187-
this.config.environments[meta.targetEnv]!.build.outDir
188-
const relativePath = normalizeRelativePath(
189-
path.relative(sourceOutDir, path.join(targetOutDir, chunk.fileName)),
190-
)
191-
// Use relative ID for stable builds across different machines
192-
const relativeId = this.toRelativeId(resolvedId)
193-
code += ` ${JSON.stringify(relativeId)}: () => import(${JSON.stringify(relativePath)}),\n`
194204
}
195205
code += '}\n'
196206

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

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -63,12 +63,13 @@ export function vitePluginImportEnvironment(
6363

6464
// Collect unique entries targeting this environment (may be imported from multiple sources)
6565
const emitted = new Set<string>()
66-
for (const imports of Object.values(manager.environmentImportMetaMap)) {
66+
for (const byTargetEnv of Object.values(
67+
manager.environmentImportMetaMap,
68+
)) {
69+
const imports = byTargetEnv[this.environment.name]
70+
if (!imports) continue
6771
for (const meta of Object.values(imports)) {
68-
if (
69-
meta.targetEnv === this.environment.name &&
70-
!emitted.has(meta.resolvedId)
71-
) {
72+
if (!emitted.has(meta.resolvedId)) {
7273
emitted.add(meta.resolvedId)
7374
this.emitFile({
7475
type: 'chunk',
@@ -131,13 +132,16 @@ export function vitePluginImportEnvironment(
131132
resolvedId = resolved.id
132133
}
133134

134-
// TODO: environmentImportMetaMap structure should be [sourceEnv][targetEnv][resolvedId]
135-
// Track discovered entry, keyed by [sourceEnv][resolvedId]
135+
// Track discovered entry, keyed by [sourceEnv][targetEnv][resolvedId]
136136
const sourceEnv = this.environment.name
137+
const targetEnv = environmentName
137138
manager.environmentImportMetaMap[sourceEnv] ??= {}
138-
manager.environmentImportMetaMap[sourceEnv]![resolvedId] = {
139+
manager.environmentImportMetaMap[sourceEnv]![targetEnv] ??= {}
140+
manager.environmentImportMetaMap[sourceEnv]![targetEnv]![
141+
resolvedId
142+
] = {
139143
resolvedId,
140-
targetEnv: environmentName,
144+
targetEnv,
141145
sourceEnv,
142146
specifier,
143147
}

0 commit comments

Comments
 (0)