Obrigado por considerar contribuir com o Wedding Finance Planner! Este projeto é open-source (MIT) e qualquer ajuda é bem-vinda — código, documentação, tradução, testes, sugestões.
| Tipo | Onde |
|---|---|
| Reportar bug | GitHub Issues — template “Bug” |
| Sugerir feature | GitHub Issues — template “Feature” |
| Corrigir bug | Pull Request |
| Adicionar feature | Pull Request (depois de discutir em issue) |
| Melhorar doc | Pull Request direto (encorajado!) |
| Tradução | Ainda não há i18n — abra issue se quiser puxar |
git clone https://github.com/guiloklex-hub/wedding-management-system.git
cd wedding-management-system
./setup.sh # ou .\setup.ps1 no Windows
npm run dev
git checkout -b feature/minha-melhoria.npm run test em watch enquanto desenvolve).npm run lint — precisa passar sem warnings.npx tsc --noEmit — sem erros.npm run build — sem erros.feat(payments): adicionar suporte a pagamento parcialfix(rsvp): corrigir contagem de +1s quando guest canceladocs(notificacoes): atualizar instruções de App Password do Gmailrefactor(cashflow): extrair cálculo de heatmaptsconfig.json já está com "strict": true.any em tipos de contrato (Server Actions, payloads,
retornos pĂşblicos). Use unknown + narrow se realmente precisa.import type { Vendor } from "@prisma/client";
"use client" apenas para componentes com:
useState, useReducer, etc.)onClick, onChange)usePathname, useRouter)"use server";
import { auth } from "@/auth";
import { z } from "zod";
const Schema = z.object({ ... });
export async function minhaAction(
_state: ActionResult | undefined,
formData: FormData,
): Promise<ActionResult> {
const session = await auth();
if (!session?.user) return { success: false, error: "NĂŁo autorizado" };
const parsed = Schema.safeParse(Object.fromEntries(formData.entries()));
if (!parsed.success) {
return { success: false, error: parsed.error.issues[0]?.message ?? "Dados inválidos" };
}
try {
// ... lĂłgica
await audit("Entidade", id, "ACTION", payload);
revalidatePath("/dashboard/algo");
return { success: true };
} catch (err) {
console.error("[minhaAction]", err);
return { success: false, error: "Erro ao processar" };
}
}
new Date() ou ISO string).formatDateBR() /
formatDateTimeBR() de src/lib/format.ts.America/Sao_Paulo.@/ (mapeia para src/).npm run lint # ESLint
npm run lint -- --fix # corrige automaticamente o que dá
Não deixe warnings novos. Se um warning for legitimamente inevitável,
adicione um // eslint-disable-next-line <regra> — motivo aqui.
npm run test # watch mode
npm run test:run # single run (CI)
npm run test:coverage # cobertura
Quando escrever teste:
Estilo:
*.test.ts ao lado do código.vitest + @testing-library/react para componentes.📚 Documentação desatualizada é bug grave neste projeto.
Toda mudança que afete o usuário final deve atualizar:
docs/ — o arquivo da área tocada./dashboard/help (src/lib/help-content.ts) — adicione passo-a-passo
ou FAQ se for relevante.README.md — apenas se for marco de produto (novo módulo, mudança em
variáveis de ambiente, etc.).AGENTS.md — se afetar convenções de desenvolvimento.Use o template padrão. Inclua:
PR pequenos sĂŁo muito preferĂveis a PRs gigantes. Se sua mudança ultrapassar ~500 linhas, considere quebrar.
Ao contribuir, vocĂŞ concorda que seu cĂłdigo será distribuĂdo sob a mesma licença MIT do projeto.