Skip to content

fix: release 0.4.2 with owned deferred fallbacks and literal-dot routes - #21

Merged
kasperrt merged 7 commits into
mainfrom
fix/streamed-boundary-ownership
Oct 17, 2026
Merged

kasperrt merged 7 commits into
mainfrom
fix/streamed-boundary-ownership

Conversation

@kasperrt

@kasperrt kasperrt commented Oct 17, 2026 •

Copy link
Copy Markdown
Owner

Smolter 0.4.2

Fix abandoned deferred content through the integrated Await fallback API and support literal dots in file routes. Preserve deployment recovery ownership across page/fetcher mutations and watcher replacement; bound initial deferred promises with a validated total deadline.

Deferred ownership and migration

Use <Await resolve={promise} fallback={pending}>…</Await> for early-hydrated deferred fields, including persistent root sections. Ordinary fallback HTML remains component-owned; streamed data settles only the current mounted owner. No renderer patch, DOM scanning/cleanup, route wrapper, polling, extra request or separate public entrypoint is introduced. Non-early SSR retains resolved HTML streaming.

This is not a repair of native Preact streamed Suspense. Consumers must replace the surrounding native Suspense on these fields. The known-failing native matrix is preserved as an explicit standalone diagnostic under tests/reproductions/playwright.config.ts. The supported thirteen-case matrix remains blocking in CI using exactly the same ownership assertion harness, including absence of stale fallback/resolved content and persistence of root state/focus. Early deferred results require JavaScript. No Vibes files or external repositories are modified.

File routes

robots[.]txt.ts or robots[.]txt/route.ts maps to /robots.txt. Unescaped dots still separate segments. Generated eager/SSR/lazy routes reject id and routePath exports rather than relying on overrides; rename files and remove those exports. Generated paths target route revalidation, while root uses root. Explicit identity remains supported in manual route arrays.

Validation and size

  • 100% line coverage: 1,830/1,830.
  • Ownership, deferred interruption/rejection, mutation, recovery, scoped transport, HMR, CDN/CORS, CSP and preserved-head browser tests.
  • Lint/typecheck, packed React/Preact SSR, JSR dry run, production SSR examples and hosted docs checks pass locally.
  • Published Preact 11.0.1 / renderer 6.8.1; no dependency patches.
  • React and routing-only byte sizes unchanged. React routing 1,245 B gzip, Preact routing 1,405 B; corresponding measured wouter subsets 2,854 B / 2,211 B.
  • Complete application including Preact: 42,548/16,046/14,602 -> 43,571/16,382/14,885 raw/gzip/Brotli versus matched 0.4.1 (+1,023/+336/+283). No TTFB/LCP/speed superiority claim.

Detailed consumer instructions, inline reproduction and per-entrypoint measurements: tests/reproductions/0.4.2-handover.md. JSR-before-npm publication ordering is unchanged. Release only after required CI passes.

@kasperrt kasperrt changed the title fix: guard page submissions and expose streaming release blockers fix: guard mutation recovery and bound interrupted deferred hydration Oct 17, 2026
@kasperrt kasperrt changed the title fix: guard mutation recovery and bound interrupted deferred hydration fix: integrate deferred fallbacks and preserve recovery ownership Oct 17, 2026
@kasperrt kasperrt changed the title fix: integrate deferred fallbacks and preserve recovery ownership fix: release 0.4.2 with owned deferred fallbacks and literal-dot routes Oct 17, 2026
@kasperrt
kasperrt merged commit 48f5148 into main Oct 17, 2026
6 checks passed
@kasperrt
kasperrt deleted the fix/streamed-boundary-ownership branch October 17, 2026 16:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant