feat: consume @platform/shell-contract from Nexus (drop the local copy)#7
Conversation
There was a problem hiding this comment.
Pull request overview
Este PR troca o contrato local do Shell por uma dependência publicada (@platform/shell-contract), removendo a cópia em src/lib/shell-contract.ts, e ajusta imports para consumir o pacote oficial. Em paralelo, adiciona estrutura de múltiplas páginas (Overview/Items/Settings), novos componentes UI (shadcn/Radix) e guardrails de lint para evitar tags nativas proibidas e cores hardcoded.
Changes:
- Adiciona
@platform/shell-contractcomo dependência e migra imports; removesrc/lib/shell-contract.ts. - Implementa roteamento interno por sub-rota via
useModuleRoutee cria páginas (Overview/Items/Settings) + testes. - Adiciona um baseline de componentes UI e reforça ESLint com
no-restricted-syntaxpara tags nativas/cores.
Reviewed changes
Copilot reviewed 35 out of 36 changed files in this pull request and generated 5 comments.
Show a summary per file
| File | Description |
|---|---|
| src/test-utils.ts | Atualiza import de ShellContext para o pacote publicado. |
| src/lib/shell-contract.ts | Remove a cópia local do contrato do Shell. |
| src/index.ts | Atualiza imports de tipos do contrato para @platform/shell-contract. |
| src/hooks/useShellTheme.ts | Atualiza imports do contrato para @platform/shell-contract. |
| src/hooks/useModuleRoute.ts | Adiciona hook de sub-rota baseado em popstate/pathname. |
| src/hooks/useBackendApi.ts | Atualiza import de ShellContext para o pacote publicado. |
| src/hooks/useApi.ts | Atualiza import de ShellContext para o pacote publicado. |
| src/components/ui/tooltip.tsx | Adiciona primitiva Tooltip (Radix/shadcn). |
| src/components/ui/textarea.tsx | Adiciona primitiva Textarea (shadcn). |
| src/components/ui/tabs.tsx | Adiciona primitiva Tabs (Radix/shadcn). |
| src/components/ui/table.tsx | Adiciona primitiva Table (shadcn). |
| src/components/ui/switch.tsx | Adiciona primitiva Switch (Radix/shadcn). |
| src/components/ui/skeleton.tsx | Adiciona primitiva Skeleton (shadcn). |
| src/components/ui/sheet.tsx | Adiciona primitiva Sheet (Radix/shadcn). |
| src/components/ui/separator.tsx | Adiciona primitiva Separator (Radix/shadcn). |
| src/components/ui/select.tsx | Adiciona primitiva Select (Radix/shadcn). |
| src/components/ui/label.tsx | Adiciona primitiva Label (Radix/shadcn). |
| src/components/ui/input.tsx | Adiciona primitiva Input (shadcn). |
| src/components/ui/dropdown-menu.tsx | Adiciona primitiva DropdownMenu (Radix/shadcn). |
| src/components/ui/dialog.tsx | Adiciona primitiva Dialog (Radix/shadcn). |
| src/components/ui/checkbox.tsx | Adiciona primitiva Checkbox (Radix/shadcn). |
| src/components/ui/badge.tsx | Adiciona primitiva Badge (shadcn). |
| src/components/ui/alert-dialog.tsx | Adiciona primitiva AlertDialog (Radix/shadcn). |
| src/components/pages/SettingsPage.tsx | Nova página Settings (usa ShellContext/auditLog/notify). |
| src/components/pages/OverviewPage.tsx | Nova página Overview (saudação, tema, ação). |
| src/components/pages/ItemsPage.tsx | Nova página Items (exemplo com Table/Badge). |
| src/components/ExampleBackendCall.tsx | Atualiza import do contrato e mantém exemplo de chamada ao backend. |
| src/components/App.tsx | Refatora App para selecionar página por sub-rota; usa module.json. |
| src/components/App.test.tsx | Expande testes para navegação por sub-rota + mocks necessários. |
| package.json | Adiciona @platform/shell-contract e radix-ui como dependências. |
| package-lock.json | Atualiza lockfile com novas dependências/transitivas. |
| module.json | Expande navigation para Overview/Items/Settings com permissões distintas. |
| eslint.config.js | Impõe restrições de tags nativas e cores hardcoded (com exceção em ui/*). |
| CLAUDE.md | Documenta padrão de múltiplas páginas via navigation + useModuleRoute. |
| .npmrc | Configura registry do escopo @platform no Nexus. |
| .claude/skills/sync-template/SKILL.md | Atualiza skill para incluir o novo guardrail do ESLint. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
|
|
||
| function Skeleton({ className, ...props }: React.ComponentProps<"div">) { |
There was a problem hiding this comment.
Skeleton referencia React.ComponentProps mas o namespace React não é importado neste arquivo, o que quebra a compilação TypeScript. Importe * as React de "react" (como nos demais componentes UI) ou troque para ComponentProps importado via type.
| function Skeleton({ className, ...props }: React.ComponentProps<"div">) { | |
| import type { ComponentProps } from "react" | |
| function Skeleton({ className, ...props }: ComponentProps<"div">) { |
| import * as React from "react" | ||
| import { cva, type VariantProps } from "class-variance-authority" | ||
| import { Slot } from "radix-ui" | ||
|
|
There was a problem hiding this comment.
O Badge está importando Slot de radix-ui, enquanto button.tsx usa Slot de @radix-ui/react-slot. Essa mistura tende a gerar inconsistência de API/tipagem e duplicação de dependências. Padronize os componentes para usar a mesma fonte (preferencialmente @radix-ui/react-slot, como o Button).
| "class-variance-authority": "^0.7.1", | ||
| "clsx": "^2.1.1", | ||
| "lucide-react": "^1.8.0", | ||
| "radix-ui": "^1.4.3", |
There was a problem hiding this comment.
A adição de radix-ui aqui pode causar duplicação/inconsistência porque o projeto já usa @radix-ui/react-slot diretamente (src/components/ui/button.tsx). Isso tende a puxar versões diferentes das libs Radix (via dependência direta + transitiva) e aumentar o bundle. Sugestão: padronizar em @radix-ui/react-* (shadcn default) e remover radix-ui, ou migrar todos os imports para uma única estratégia.
| "radix-ui": "^1.4.3", |
| const subPath = pathname.startsWith(basePath) | ||
| ? pathname.slice(basePath.length).replace(/^\/+/, "") | ||
| : ""; |
There was a problem hiding this comment.
subPath é calculado com pathname.startsWith(basePath), o que também casa caminhos como /my-module-foo quando basePath é /my-module. Isso pode fazer o módulo interpretar sub-rotas incorretamente em casos de rotas com prefixo semelhante. Recomendo garantir boundary (pathname === basePath || pathname.startsWith(basePath + "/")) antes de fazer o slice.
| ...props | ||
| }: React.ComponentProps<"span"> & | ||
| VariantProps<typeof badgeVariants> & { asChild?: boolean }) { | ||
| const Comp = asChild ? Slot.Root : "span" |
There was a problem hiding this comment.
No padrão do @radix-ui/react-slot, Slot é o componente (não existe Slot.Root). Do jeito atual, asChild ? Slot.Root : "span" provavelmente não compila/funciona. Troque para usar Slot diretamente (ou ajuste para a API correta do pacote Radix escolhido).
| const Comp = asChild ? Slot.Root : "span" | |
| const Comp = asChild ? Slot : "span" |
c58de3b to
1973de6
Compare
Replaces the hand-rolled src/lib/shell-contract.ts — a duplicate of the real package — with a dependency on @platform/shell-contract from the dedicated npm-backoffice-shell Nexus repo (anonymous read scoped to that repo only). Single source of truth. - .npmrc at repo root: @platform:registry → npm-backoffice-shell repo (no auth tokens; anonymous read) - package.json: declares @platform/shell-contract@^0.1.0 - src/lib/shell-contract.ts: removed - 7 imports updated from @/lib/shell-contract → @platform/shell-contract Prerequisites for `npm install` to succeed: 1. platform-backoffice-shell PR #6 merged — its publish pipeline lands @platform/shell-contract@0.1.0 in npm-backoffice-shell Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1973de6 to
32bd0f9
Compare
|
Rebased onto current Mudanças em cima do commit original:
Resultado final: zero ocorrências de Pré-requisitos do corpo original (shell#6 merged + Nexus anonymous read) continuam aplicáveis — se já foram resolvidos conforme o fix do contrato anterior sugeria, |
Summary
Replaces the hand-rolled
src/lib/shell-contract.ts(a line-by-line copy of@platform/shell-contract) with a real dependency on the published package from the new dedicated Nexus repo.Changes
.npmrc(new, repo root):@platform:registry=https://repos.cora.tools/repository/npm-backoffice-shell/— anonymous read, no auth tokens in the filepackage.json: declares@platform/shell-contract@^0.1.0src/lib/shell-contract.tsdeletedimport ... from "@/lib/shell-contract"→@platform/shell-contractWhy
The local copy had two problems: drift risk (somebody changes types in the shell, the copy goes stale) and a confusing DX (docstring literally said "Install: npm install @platform/shell-contract" but the code didn't). With the dedicated Nexus repo set up with anonymous read for the
@platformscope, modules can consume the real package without every developer configuring~/.npmrc.Prerequisites
This PR cannot install until two things are true:
@platform/shell-contract@0.1.0in the newnpm-backoffice-shellrepo.npm installcurrently returns401 Unable to authenticate, need: BASIC realm="Sonatype Nexus", which means theanonymousrole doesn't yet have the rightnx-repository-view-npm-npm-backoffice-shell-*privilege granted. Ask Infra/DevOps to verify the role in Nexus Admin → Security → Roles → anonymous.Once both are resolved,
npm installin this branch should succeed and CI can run green.Test plan
After prerequisites:
rm -rf node_modules package-lock.json && npm install— resolves@platform/shell-contractfrom the new repo without authnpm run build— green (imports type-check against the real package)npm run test:run— greennpm run lint— green🤖 Generated with Claude Code