Summary
scanMetadataFiles() currently recurses into every directory except route groups, so metadata files under parallel-route slots and private folders become public metadata URLs.
Reproduction
Given an app dir with:
app/
@slot/icon.png
_private/icon.png
scanMetadataFiles(appDir) currently returns routes with:
servedUrl: "/@slot/icon"
servedUrl: "/_private/icon"
Expected
@slot directories should not produce public metadata URL segments. They are parallel-route internals, not part of the URL space.
_private directories should be skipped entirely, matching Next.js private-folder behavior.
Why this looks wrong
Likely fix
Teach scanMetadataFiles() to:
- Skip
_private directories entirely
- Recurse into
@slot directories without adding them to urlPrefix
- Add coverage in
tests/metadata-routes.test.ts for both cases
Summary
scanMetadataFiles()currently recurses into every directory except route groups, so metadata files under parallel-route slots and private folders become public metadata URLs.Reproduction
Given an app dir with:
scanMetadataFiles(appDir)currently returns routes with:servedUrl: "/@slot/icon"servedUrl: "/_private/icon"Expected
@slotdirectories should not produce public metadata URL segments. They are parallel-route internals, not part of the URL space._privatedirectories should be skipped entirely, matching Next.js private-folder behavior.Why this looks wrong
@slotand_privatedirectories when discovering routes.isInvisibleSegment()already treats@slotsegments as invisible in URLs.Likely fix
Teach
scanMetadataFiles()to:_privatedirectories entirely@slotdirectories without adding them tourlPrefixtests/metadata-routes.test.tsfor both cases