fix: resolve MISSING_EXPORT warnings for optional hooks exports #15273
+8
−20
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.
Summary
Fixes #13508
When a
hooks.jsorhooks.client.jsfile exists but doesn't export all possible hooks (e.g., onlyreroutewithouttransport), Vite/Rollup emitsMISSING_EXPORTwarnings during build:Root cause
The generated
app.jsuses namespace imports (import * as universal_hooks from '...') and then accesses individual properties likeuniversal_hooks.rerouteoruniversal_hooks.transport. When a property isn't exported, Rollup detects this statically and warns.A previous workaround (#13687) suppressed these warnings via
onwarn, but the root cause remained.Fix
Spread namespace imports into plain objects:
Rollup only checks property access on namespace imports (
import * as ns). By spreading into a plain object, subsequent property access is no longer analyzed for missing exports.This also removes the
onwarnsuppression workaround and the now-unusedisRolldownvariable.Note: the server-side already handles this correctly via
await import()destructuring (supported in the node18.13 target). The client-side targets chrome87/safari14 which don't support top-level await, making the spread approach the appropriate solution.Test plan
pnpm -F @sveltejs/kit test:unit)pnpm run lint— cleanpnpm run check— 0 errorsbasics— reroute + transport): 17 passedhash-based-routing— reroute only, no transport): 10 passedoptions-2— transport only, no reroute): 1 passeddedentfor all edge cases (no hooks, client-only, universal-only, both)