fix(compare): corrige regress\u00e3o de runtime do PR #174 (CompareTableView camelCase) + remove casts Record/as-any#177
Conversation
…roduct Substitui `product: Record<string,unknown>` pelo tipo can\u00f4nico `@/types/product-catalog`.Product \u2014 que \u00e9 o shape real em runtime (mapPromobrindToProduct produz camelCase). Sem mudan\u00e7a de runtime; o componente j\u00e1 lia minQuantity/stockStatus corretamente.
Substitui `product: Record<string,unknown>` + `useSupplierComparison(product as any)` pelo tipo can\u00f4nico `@/types/product-catalog`.Product, que \u00e9 exatamente o que o hook espera. Remove o `as any`. Sem mudan\u00e7a de runtime.
Corrige a regress\u00e3o de runtime do PR #174: o componente lia is_kit/min_quantity/stock_status (snake_case) de objetos que em runtime s\u00e3o camelCase (mapPromobrindToProduct -> @/types/product-catalog), logo retornavam undefined (\u00c9 Kit?, Qtd m\u00ednima, TCO, Lead time, status e diff-detection quebrados). Re-aponta para @/types/product-catalog e reverte os acessos a camelCase (isKit/minQuantity/stockStatus). Remove os dois casts `as unknown as Record<string,unknown>` (StockRiskBadge e OtherSuppliersRow agora compartilham o mesmo tipo). Exporta CompareEntry. TSC inalterado (1273->1273); build OK; ESLint limpo.
Importa o tipo CompareEntry e adiciona UMA asser\u00e7\u00e3o honesta e documentada no \u00fanico call-site do CompareTableView. Os produtos v\u00eam de getProductsByIds -> mapPromobrindToProduct (shape de runtime = @/types/product-catalog, camelCase), mas a p\u00e1gina os declara como @/types/product. A asser\u00e7\u00e3o confina essa mentira de tipo pr\u00e9-existente a um ponto documentado, em vez de espalh\u00e1-la. Zero erro TSC novo (baseline rastreia c\u00f3digo->contagem).
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
This pull request has been ignored for the connected project Preview Branches by Supabase. |
|
Caution Review failedPull request was closed or merged during review WalkthroughRefatoração de tipo e segurança: ChangesTipagem Product e simplificação de casts em CompareTableView
Estimated code review effort🎯 2 (Simple) | ⏱️ ~12 minutes Justificativa: Refatoração consistente de tipos com padrão repetido entre componentes (import + type update). Campos camelCase são mecânicos. Type assertions em ComparePage isolam o problema de tipagem. Sem lógica de negócio nova nem risco de regressão em runtime (tipos já são validados na tipagem). Possibly related PRs
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
Pull request overview
Corrige uma regressão de runtime na comparação de produtos ao realinhar o CompareTableView (e componentes auxiliares) com o tipo de runtime do catálogo (@/types/product-catalog, camelCase), removendo casts genéricos (Record<string, unknown> / as any) na cadeia-folha.
Changes:
CompareTableViewvolta a acessar campos camelCase compatíveis com o runtime (ex.:isKit,minQuantity,stockStatus) e exportaCompareEntry.StockRiskBadgeeOtherSuppliersRowpassam a receberProducttipado do catálogo, eliminando casts genéricos eas any.ComparePagepassa a importarCompareEntrye adiciona uma asserção localizada ao integrar comCompareTableView.
Reviewed changes
Copilot reviewed 4 out of 4 changed files in this pull request and generated 1 comment.
| File | Description |
|---|---|
| src/components/compare/CompareTableView.tsx | Troca o Product para @/types/product-catalog, restaura acessos camelCase e remove casts genéricos em StockRiskBadge/OtherSuppliersRow. |
| src/components/compare/StockRiskBadge.tsx | Tipagem do product como Product (catálogo) e remoção de coerções desnecessárias via Number(...). |
| src/components/compare/OtherSuppliersRow.tsx | Tipagem do product como Product (catálogo) e remoção do as any ao chamar useSupplierComparison. |
| src/pages/products/ComparePage.tsx | Importa CompareEntry e adiciona casts localizados para compatibilizar tipagem da página com o CompareTableView. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| {/* Os produtos vêm de getProductsByIds → mapPromobrindToProduct, | ||
| cujo shape de runtime é o de @/types/product-catalog (camelCase). | ||
| A tipagem local desta página os declara como @/types/product; | ||
| a asserção abaixo reconcilia esse descompasso pré-existente no | ||
| único ponto de contato com o CompareTableView (já migrado ao | ||
| tipo correto). Ver follow-up de unificação dos tipos de Product. */} | ||
| <CompareTableView | ||
| entries={compareEntries} | ||
| products={products} | ||
| entries={compareEntries as unknown as CompareEntry[]} | ||
| products={products as unknown as CompareEntry['product'][]} |
Gate check:toast-leaks estava VERMELHO no main (78 "novas" ocorrências).
Causa: keyOf = ${file}::${line}; baseline de 2026-05-18 ficou desalinhado
após a faxina #160 (2026-05-23, -21.877 linhas) deslocar os números de
linha. Das 78: 13 drift puro de linha + restantes de 27 arquivos de
features pós-18/05 (kit-builder, intelligence, permissions, CRM, etc.).
Nenhuma introduzida pelas Etapas 9-13.
Regenera via UPDATE_BASELINE=1 (procedimento documentado no script).
176->173 entries: a #160 removeu mais toasts técnicos (código morto)
do que features novas adicionaram. check:toast-leaks volta a VERDE.
Validado contra main 80da684 (pós #176/#177): gate VERDE, 0 novas.
Divida registrada: os 173 toasts usam error.message cru — limpeza
retroativa fica como backlog dedicado.
Gate check:toast-leaks estava VERMELHO no main (78 "novas" ocorrências).
Causa: keyOf = ${file}::${line}; baseline de 2026-05-18 ficou desalinhado
após a faxina #160 (2026-05-23, -21.877 linhas) deslocar os números de
linha. Das 78: 13 drift puro de linha + restantes de 27 arquivos de
features pós-18/05 (kit-builder, intelligence, permissions, CRM, etc.).
Nenhuma introduzida pelas Etapas 9-13.
Regenera via UPDATE_BASELINE=1 (procedimento documentado no script).
176->173 entries: a #160 removeu mais toasts técnicos (código morto)
do que features novas adicionaram. check:toast-leaks volta a VERDE.
Validado contra main 80da684 (pós #176/#177): gate VERDE, 0 novas.
Divida registrada: os 173 toasts usam error.message cru — limpeza
retroativa fica como backlog dedicado.
…alog\n\nMigra ComparePage de @/types/product (snake_case) para\n@/types/product-catalog (camelCase), que casa com o shape de runtime vindo\nde getProductsByIds -> mapPromobrindToProduct. Remove a asser\u00e7\u00e3o\n'as unknown as CompareEntry[]' e o coment\u00e1rio de d\u00e9bito t\u00e9cnico do PR #177,\nagora desnecess\u00e1rios. Elimina 7 erros TSC reais.
…e product-catalog (-24 erros baseline) (#197) * refactor(compare): unifica ComparePage ao tipo Product de product-catalog\n\nMigra ComparePage de @/types/product (snake_case) para\n@/types/product-catalog (camelCase), que casa com o shape de runtime vindo\nde getProductsByIds -> mapPromobrindToProduct. Remove a asser\u00e7\u00e3o\n'as unknown as CompareEntry[]' e o coment\u00e1rio de d\u00e9bito t\u00e9cnico do PR #177,\nagora desnecess\u00e1rios. Elimina 7 erros TSC reais. * refactor(compare): unifica 6 componentes-irm\u00e3os ao tipo Product de product-catalog\n\nMigra AIComparisonAdvisor, ComparisonDuelView, ComparisonMobileView,\nComparisonPresentationLauncher, ComparisonRadarChart e FloatingCompareBar\nde @/types/product (snake_case) para @/types/product-catalog (camelCase).\nTodos j\u00e1 liam campos camelCase em runtime (minQuantity/stockStatus/colors/\nimages/supplier) \u2014 eram runtime-corretos mas type-inv\u00e1lidos. Swap puro de\nimport, sem mudan\u00e7a de l\u00f3gica. Elimina 17 erros TSC (TS2551/TS2339) reais.\nValidado same-env: 1273 -> 1249 (-24 com a ComparePage), zero regress\u00e3o.
Resumo
Corrige uma regress\u00e3o de runtime introduzida pelo PR #174 no m\u00f3dulo de compara\u00e7\u00e3o e, de quebra, remove os casts
Record<string,unknown>/as anyda cadeia-folha (follow-up registrado).\ud83d\udc1b Causa-raiz (regress\u00e3o de runtime, n\u00e3o vis\u00edvel ao TSC)
Existem 3 tipos
Productno c\u00f3digo. Os produtos que chegam \u00e0 ComparePage v\u00eam degetProductsByIds\u2192mapPromobrindToProduct, cujo shape de runtime \u00e9 camelCase (@/types/product-catalog):minQuantity,stockStatus,isKit,category/supplieraninhados.No PR #174, o
CompareTableViewfoi tipado como@/types/product(snake_case) e seus acessos trocados parais_kit/min_quantity/stock_status. Contra objetos camelCase reais, esses campos retornamundefinedem runtime. O TSC ficou verde (o tipo batia), mas a UI quebrou:undefinedN\u00e3o h\u00e1 teste unit\u00e1rio cobrindo o
CompareTableView, por isso passou no merge.\u2705 Corre\u00e7\u00e3o
Re-aponta a cadeia-folha do compare para o tipo correto
@/types/product-catalog(camelCase), que casa com o runtime + ComparePage + o hookuseSupplierComparison:compare/CompareTableView.tsxcategory.icon/supplier.verifiedremovidos (n\u00e3o existem no tipo);tagArray\u2192 acesso tipado; 2 casts removidos;CompareEntryexportado9dda877compare/StockRiskBadge.tsxRecord<string,unknown>\u2192Product4b0a438compare/OtherSuppliersRow.tsxRecord<string,unknown>+as any\u2192Product6c35f79pages/products/ComparePage.tsxCompareEntry; uma asser\u00e7\u00e3o honesta e documentada no \u00fanico call-site (confina a mentira de tipo pr\u00e9-existente da p\u00e1gina)991f731Valida\u00e7\u00e3o (same-env, container)
1273 \u2192 1273(zero mudan\u00e7a l\u00edquida).CompareTableView,StockRiskBadge,OtherSuppliersRow= 0 erros.comm -13\u00e9 o mesmo erro pr\u00e9-existente doSimilarProductsRailna ComparePage deslocado 6 linhas (388\u2192394) pelo coment\u00e1rio que adicionei. O baseline rastreia c\u00f3digo\u2192contagem por arquivo (n\u00e3o linha), ent\u00e3oComparePagesegue com 10 erros e os mesmos c\u00f3digos \u2014 gatetypecheckverde, sem update de baseline.vite buildexit 0 \u2705git hash-objectlocal == \u00e1rvore remota).Follow-up (fora de escopo)
O subsistema de compara\u00e7\u00e3o ainda carrega a dualidade
@/types/product(snake_case) vs@/types/product-catalog(camelCase) \u2014 ComparePage e v\u00e1rios irm\u00e3os (ComparisonScoreCard,SimilarProductsRail, etc.) ainda tipam@/types/productcom casts no boundary. Unifica\u00e7\u00e3o dos tipos de Product fica como follow-up dedicado (documentado no coment\u00e1rio do call-site da ComparePage).Summary by cubic
Fixes a runtime regression in the compare table from PR #174 by aligning it to camelCase product data, restoring correct values and comparisons. Also removes unsafe casts and standardizes compare components on
@/types/product-catalog’sProduct.CompareTableViewto@/types/product-catalogand switched field reads to camelCase (isKit,minQuantity,stockStatus); removed non-existent props (category.icon,supplier.verified).StockRiskBadgeandOtherSuppliersRowwith the sameProduct; removedRecord<string, unknown>/as anycasts and pass product directly.CompareEntryand added a single, documented assertion inComparePageto bridge its local@/types/productto the table’s type.Written for commit 38e2516. Summary will update on new commits. Review in cubic
Summary by CodeRabbit
Release Notes
Bug Fixes
Refactor