decocms / decocms/apps-start

createVtexCommerceLoaders() não registra vtex/loaders/legacy/suggestions — causa sugestões silenciosas em migrações

Open
#87 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

bug
Dominant language
TypeScript
Stars
1
Forks
0
PR merge metrics
No merged PRs in 30d

Description

Problema

Durante a migração Fresh → TanStack Start da Miess, a barra de busca não exibia sugestões/autocomplete. Não havia nenhum erro visível — o invoke simplesmente resolvia null.

Causa raiz

useAutocomplete.ts (padrão gerado nas migrações) chama:

const suggestions = invoke.vtex.loaders.legacy.suggestions

Isso resolve a chave vtex/loaders/legacy/suggestions no runtime. Porém createVtexCommerceLoaders() não registra essa chave — ela só registra vtex/loaders/intelligentSearch/suggestions.ts.

A função legacySuggestions existe e está corretamente exportada em @decocms/apps/vtex/loaders/legacy.ts:

export {
  legacySuggestions as suggestions,
  // ...
}

Mas não é incluída no objeto retornado por createVtexCommerceLoaders().

Workaround aplicado na Miess

Registrar manualmente em commerce-loaders.ts:

import { legacySuggestions } from '@decocms/apps/vtex/loaders/legacy'

export const COMMERCE_LOADERS = {
  // ...
  'vtex/loaders/legacy/suggestions.ts': (props: any) =>
    legacySuggestions({ query: props?.query, count: props?.count }),
  'vtex/loaders/legacy/suggestions': (props: any) =>
    legacySuggestions({ query: props?.query, count: props?.count }),
}

Como evitar em futuras migrações

Existem algumas opções:

Opção A — Incluir todos os loaders legacy em createVtexCommerceLoaders()

Registrar vtex/loaders/legacy/suggestions (e demais loaders legacy que possam estar faltando) dentro de createVtexCommerceLoaders(), da mesma forma que os loaders IS já estão incluídos.

Prós: zero configuração para quem migra
Contras: aumenta levemente o bundle, pode conflitar com overrides customizados

Opção B — Checagem em build/dev de loaders invocados mas não registrados

Quando o compilador gera o runtime.ts / invoke, checar se toda chave de loader que aparece em invoke.X.Y.Z está de fato registrada em COMMERCE_LOADERS. Emitir aviso (ou erro) em build time.

Prós: detecta o problema sem precisar rodar a app
Contras: requer análise estática do código do site

Opção C — Fallback runtime com log de aviso

Se uma chave de loader não for encontrada em COMMERCE_LOADERS, emitir um console.warn descritivo ao invés de retornar null silenciosamente:

[deco] invoke: loader key 'vtex/loaders/legacy/suggestions' not registered in COMMERCE_LOADERS.
  → Did you forget to add it? See https://...

Prós: fácil de implementar, não quebra nada
Contras: só aparece em runtime, não em build


Contexto

  • Projeto afetado: Miess (TanStack Start)
  • @decocms/apps versão: ver package.json do projeto
  • O mesmo padrão provavelmente afeta qualquer site migrado do Fresh que use o legacy autocomplete ao invés do IS autocomplete

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with createVtexCommerceLoaders() and compare its registrations with the exports in @decocms/apps/vtex/loaders/legacy.ts. Trace the vtex/loaders/legacy/suggestions lookup from useAutocomplete.ts and inspect the workaround in commerce-loaders.ts. Decide which proposed behavior the issue should implement, then verify that legacy suggestions resolve without silently returning null.

Written by the indexing model from the issue text.

Assessment

Tech stack
typescript
Domain
api, backend
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Needs clarification
Newbie friendliness
45/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.