Audit de bout en bout du service mail (docs/audit-mail-2026-07-30.md) : quatorze défauts relevés, dix corrigés ici. Trois changent le dessin de D-013 plutôt que de réparer un écart, d'où D-039. Le plus coûteux : la boucle d'envoi marquait « envoyé » dès qu'un membre avait été servi. Sur un foyer à deux, la première adresse passe, la seconde rebondit, la porte d'idempotence se referme — et le second membre ne reçoit jamais ce rappel, ni le lendemain ni jamais. La clé de l'outbox porte désormais le destinataire, et c'est le user_id qui est stocké, jamais l'adresse. Le plus discret : `metadata` de /sign-in/magic-link est un champ public du corps de la requête. Sans compte ni session, un appel forgé faisait partir depuis un domaine aligné SPF/DKIM/DMARC un « ton foyer est activé, le paiement est passé ». Un sceau dérivé de BETTER_AUTH_SECRET distingue l'appel interne ; tout écart retombe sur « connexion », le seul contexte qui n'affirme rien. Et une avance de rappel de 21 jours sur une fenêtre CatNat de 30 jours consommait 30 % du délai légal tous les jours sans que rien ne le signale. Aucun gabarit mail n'avait jamais pu être testé : vitest n'a pas le relais JSX de Next, tout rendu échouait sur « React is not defined ». Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
11 lines
509 B
TypeScript
11 lines
509 B
TypeScript
import { defineConfig } from "vitest/config";
|
|
import path from "node:path";
|
|
|
|
export default defineConfig({
|
|
test: { environment: "node" },
|
|
// `tsconfig.json` laisse `jsx: "preserve"` — c'est Next.js qui transforme en production. Vitest
|
|
// n'a pas ce relais : sans cette ligne, esbuild retombe sur la transformation classique et tout
|
|
// rendu de gabarit mail échoue sur « React is not defined ».
|
|
esbuild: { jsx: "automatic" },
|
|
resolve: { alias: { "@": path.resolve(__dirname, "./src") } },
|
|
});
|