Módulos
Um módulo de cadastro (lojas, itens, colaboradores...) segue sempre a
mesma forma:
src/features/(cadastros)/<modulo>/
feature.tsx # composição da página (título + tabela + modal)
components/
table.tsx # DataTable + botão "Adicionar"
table-columns.tsx # definição das colunas
form-<modulo>.tsx # Sheet + formulário (zod + react-hook-form)
editar-<modulo>-modal.tsx
excluir-<modulo>-modal.tsx
utils/
constants.ts # chaves de modal/query/mutation
module-utils.ts # MODULE_ROUTE, PERMISSIONS, MODULE_CONFIG
A fonte única de verdade: src/modules/registry.ts
Sidebar, feature flag e permissão de cada módulo saem todos de uma única entrada:
{
key: "lojas",
label: "Lojas",
route: "/lojas",
icon: IconBuildingStore,
category: "organizacao",
permissionBase: "lojas",
featureFlag: "modules.organizacao.lojas.visualizar",
defaultEnabled: true,
}Para desligar um módulo por cliente/projeto sem tocar código, liste a
key em NEXT_PUBLIC_DISABLED_MODULES (.env), separada por vírgula.
Criando um módulo novo
npm run generate:moduleO gerador cria o esqueleto de pastas acima. Depois:
- Ajuste
types/<modulo>/types.tscom o shape real da entidade. - Registre a entrada em
src/modules/registry.ts(o gerador não faz isso automaticamente). - Se o módulo precisa aparecer no modo demo, adicione uma
factory em
src/lib/mock/factories/e a rota emROUTE_TO_COLLECTION(src/lib/mock/db.ts).
O que não entra aqui
Regra de negócio de domínio específico (reservas de quarto, prontuário médico, comandas de bar) não deve virar módulo do template — nasce no projeto derivado, seguindo o mesmo padrão acima.