Repository navigation
refactor(admin-frontend): tipo das props de cada campo fica no arquivo do campo - #217
evertonschuster wants to merge 1 commit into
Conversation
…o do campo fields.types.ts deixa de importar de shared/ui e de conhecer os campos: guarda só BaseFieldProps, RegisterOwnedProps, FormFieldOwnedProps, WithOptionalLabel e FieldLabelPlacement. O tipo das props de cada campo e a lista das props omitidas passam para o arquivo do próprio campo em components/, e o barril reexporta os mesmos nomes a partir deles. A skill de formulário e o guia de arquitetura dizem onde nasce o tipo de um campo novo. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
No actionable comments were generated in the recent review. Walkthrough
Merge Risk:
|
O que muda
O
shared/form/fields/fields.types.tspassa a ser genérico. Ele não importa mais nada deshared/uie não conhece nenhum campo. O tipo das props de cada campo e a lista das props omitidas ficam no arquivo do próprio campo, emcomponents/, ao lado do primitivo que o campo renderiza. É o modelo que o #207 adotou para oSearchSelectFieldno commit 2ae5e6c.A mudança é só de estrutura de tipos. Nenhum comportamento muda, e o barril
fields/index.tsxcontinua exportando os mesmos 14 nomes de tipo, agora a partir do arquivo de cada campo. Nenhum consumidor fora defields/foi tocado.Inventário
O que o
fields.types.tsimportava deshared/uinamain:shared/uiInputTextFieldProps,MaskedFieldProps,DateFieldPropsTextField,MaskedField,DateFieldtext-fields.tsx,masked-field.tsx,date-field.tsxTextareaTextareaFieldPropsTextareaFieldtext-fields.tsxInputGroupInputSearchFieldPropsSearchFieldsearch-field.tsxColorSwatchPickerOptionColorFieldPropsColorFieldcolor-field.tsxFormFieldControlPropsControlledFieldPropsControlledFieldcontrolled-field.tsxTipos que pertencem a um campo só, sem import de
shared/ui:CpfFieldProps(deriva deMaskedFieldProps)CpfFieldcpf-field.tsxPhoneFieldProps(deriva deTextFieldProps)PhoneFieldphone-field.tsxEmailFieldProps(deriva deTextFieldProps)EmailFieldemail-field.tsxBirthDateFieldProps(deriva deDateFieldProps)BirthDateFieldbirth-date-field.tsxSelectFieldOption,SelectFieldBaseProps(interno),SelectFieldPropsSelectFieldselect-field.tsxFieldErrorPropsFieldErrorfield-error.tsxUm campo construído sobre outro importa o tipo base do arquivo do campo que ele já renderiza:
PhoneFieldeEmailFieldusamtext-fields,CpfFieldusamasked-fieldeBirthDateFieldusadate-field. O teste doSelectFieldpassou a importarSelectFieldOptionde./select-field.O que ficou em
fields.types.ts, exportado porque vários campos usam:BaseFieldProps:TextField,TextareaField,MaskedFieldeDateField;RegisterOwnedPropseFormFieldOwnedProps: os mesmos quatro, mais oSearchField;WithOptionalLabel:CpfField,PhoneField,EmailFieldeBirthDateField;FieldLabelPlacement:SelectFieldeSearchField, a união tipada uma vez só, como registra a ADR 0076.Nenhum tipo exigiu escolha. Os tipos compartilhados são genéricos e ficam em
fields.types.ts. Os derivados seguem a dependência que o componente já tem, e a API pública do barril não muda.Orientação para os próximos campos
.claude/skills/agenza-form-field/SKILL.md: o tipo das props de um campo novo nasce no arquivo do campo e é reexportado de lá pelo barril. Ofields.types.tssó guarda as peças compartilhadas e não importa deshared/ui.apps/admin-frontend/docs/ARCHITECTURE.md: a mesma regra, na seção de componentes e formulários.Não abri ADR nova. É uma convenção de organização local, reversível e sem efeito em fronteira, contrato, persistência ou operação, então se encaixa no guia de arquitetura e na skill (ADR 0088). Nenhuma ADR na
maindizia onde ficam os tipos dos campos. A ADR 0091, que vem no #207, já registra o caso doSearchSelectField.Relação com o #207
O #207 (
claude/multi-select-component-d9018b) também mexe nofields.types.tse noindex.tsx. Por isso, o PR que entrar por último resolve um conflito pequeno nesses dois arquivos. Os dois exportam as mesmas peças genéricas,BaseFieldPropseFormFieldOwnedProps, e este PR não toca noSearchSelectField. Resolver o conflito é manter ofields.types.tsdeste PR e a linhaexport { SearchSelectField, type SearchSelectFieldProps } ...do #207 no barril.Este PR substitui a tentativa do #216, que foi fechado por escopo. Ele reaproveita a mesma divisão e vai além em dois pontos: também tira
ControlledFieldPropseFieldErrorPropsdefields.types.ts, e com isso o arquivo deixa de importarFormFieldControlPropsdeshared/ui/form-field.Verificação
Rodado em
apps/admin-frontend:npm run format:check: ok;npm run lint: 0 erros. Os 6 avisosreact-refresh/only-export-componentsjá existiam e estão fora deshared/form/fields;npx eslint src/shared/form/fieldssai limpo;npm run build: ok (tsc+vite build);npx vitest run --coverage --exclude ".claude/**": 100 arquivos, 1092 testes passando, limiares de cobertura atendidos (linhas 98,08%, ramos 94,65%);npm run check:docs(raiz): ok.O
fields.types.tsnão tem nenhum import de@/shared/ui. Confirmei comgrep.🤖 Generated with Claude Code
Summary by CodeRabbit
Refactor
Documentation