fix(renderJson): strip framework-injected keys from serialized props

Merged
JO
2mo ago
+51-1

Contexto

Validando o ?renderJson do site TanStack (colombo) contra o site Fresh de produção (oficina.com), a comparação revelou que o output divergia em toda seção por chaves injetadas pelo framework que vazavam nos props:

  • __pageUrl / __pagePath — injetadas por runSectionLoaders (universal).
  • device / isMobile / currentSearchParam — mixins withDevice/withMobile/withSearchParam.

Prod (Fresh) não injeta essas chaves, então os payloads divergiam. Pior: são request-derived — quebrariam o ETag por request/device e vazam internals que o app mobile não deveria cachear.

Fix

serializeRenderJson agora remove, após a projeção da seção (pra um projection rest-spread não conseguir vazá-las):

  • qualquer chave top-level com prefixo __ (framework-internal por convenção, igual __section);
  • device, isMobile, currentSearchParam.

Evidência (paridade end-to-end)

Rodando o colombo com o fix contra prod, mesma página:

  • 0 vazamentos de chaves injetadas (antes: 4+ por seção).
  • home-hero → key-set idêntico a prod (altText, gradientOverlay, heroText, promotionInfo, responsiveMedia).

Os diffs restantes entre colombo e prod são conteúdo (banners/categorias diferentes = snapshots de decofile diferentes) e deferral (config de Lazy diferente nos decofiles) — nenhum é do renderJson.

+2 testes no serializer; blocks tsc limpo.

🤖 Generated with Claude Code


Summary by cubic

Strips framework-injected request keys from serialized section props to prevent ETag churn and leaking internals. Previously serializeRenderJson emitted __pageUrl, __pagePath, device, isMobile, and currentSearchParam; now it removes any __-prefixed key plus those device/search keys after the section projection.

  • Runs after the section renderJson projection so rest-spread cannot reintroduce these keys.
  • Only the JSON output changes; section code can still consume these props server-side.
  • Adds two tests; no public API changes.
  • Migration: If any client code reads these keys from render JSON, move that logic server-side or derive from URL/device at runtime.