fix: prevent island names from shadowing JavaScript globals #3522
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
fix #3521
Generated PR message below
Problem
Island files named after JavaScript global objects (e.g., Map.tsx,
Set.tsx
,Promise.tsx
) cause runtime errors. WhenUniqueNamer
generates identifiers from these filenames, the resulting variable names shadow global constructors, breaking instantiation:This results in
TypeError: Map is not a constructor
when the framework attempts to usenew Map()
internally.Solution
Added JavaScript global objects to the
JS_RESERVED
set inUniqueNamer
. Names matching reserved keywords or globals are now automatically prefixed with underscore:Changes
utils.ts: Extended
JS_RESERVED
with:Integration tests: Added test cases for both Builder and Vite build systems verifying islands named after globals work correctly
Impact
Single-location fix in
UniqueNamer
applies to all code generation (islands, routes, etc.). Island names are prefixed when needed, preserving debuggability while preventing shadowing bugs.