Le dépôt n'avait aucun test, aucun linter, aucune vérification de types. Outillage - ESLint 9 (flat config) sur api + les deux frontends, Ruff sur le Python - tsc --checkJs sur l'API (pas de TypeScript, juste la vérification) - Vitest : 401 tests JS ; pytest : 43 tests Python - Tests de mutation (Stryker), deux profils : logique pure et API complète - Hook pre-push `npm run check` (~17 s) — le déploiement Coolify est sur webhook, c'est donc la seule porte de qualité avant la mise en ligne - Workflow Forgejo Actions prêt (inerte tant qu'aucun runner n'est enregistré) Sécurité - Injection SQL authentifiée dans resolve-conflict : `field` était interpolé dans le SET sans allowlist - timingSafeEqual levait sur un jeton multi-octets (500 au lieu de 401) - setErrorHandler écrasait tous les 4xx en 500 - .env.example : ADMIN_JWT_SECRET et ADMIN_SEED_* n'étaient documentés nulle part alors que leur absence casse toute connexion admin Annulation réelle des crawl_run (migration 014) - L'API posait status='error' sans que le crawler en sache rien : le process continuait, et son UPDATE final ne matchait plus (run réussi affiché en erreur) - Protocole coopératif : drapeau cancel_requested lu à chaque lot, le crawler écrit lui-même status='cancelled' Cohérence géographique (migration 014) - Le trigger 013 supprimait les band_locations sans purger le point dénormalisé - L'édition admin de lat/lon n'atteignait jamais band_locations : la carte ignorait la correction. Override step_order = -1, dans une transaction Corrections - limit/offset NaN → 500 au lieu de 400 - OPTIONS sans `return reply` (Fastify poursuivait le cycle de vie) - listen() sans catch, cast ::text en dur sur les colonnes numériques - /admin/api/logs ne renvoyait pas sa pagination - a11y : sélecteur de langue annoncé comme liste vide (role=option manquant) Nettoyage - apps/web/quizz-site supprimé (sans rapport avec le projet) - Code mort : openModal(), LANG_NAMES, double import, variables inutilisées - .dockerignore ajoutés ; node_modules racine n'était pas gitignoré Co-Authored-By: Claude <noreply@anthropic.com>
32 lines
905 B
Bash
32 lines
905 B
Bash
#!/bin/sh
|
|
#
|
|
# Porte de qualité locale — c'est ICI que la CI de ce projet se joue.
|
|
#
|
|
# Le déploiement Coolify se déclenche sur webhook à chaque push : rien ne
|
|
# s'interpose entre `git push` et la mise en ligne. Ce hook est donc le dernier
|
|
# filet avant que du code cassé parte en dev.
|
|
#
|
|
# Installation (une fois par clone) : npm run hooks:install
|
|
# Contournement ponctuel : git push --no-verify
|
|
#
|
|
set -e
|
|
|
|
echo "▶ pre-push : porte de qualité (lint, types, tests)…"
|
|
|
|
start=$(date +%s)
|
|
|
|
if ! npm run --silent check; then
|
|
cat >&2 <<'MSG'
|
|
|
|
✗ La porte de qualité a échoué — push interrompu.
|
|
|
|
Corriger, ou pousser quand même en connaissance de cause :
|
|
git push --no-verify
|
|
|
|
Correction automatique de la plupart des problèmes de style :
|
|
npm run lint:fix && npm run lint:py:fix
|
|
MSG
|
|
exit 1
|
|
fi
|
|
|
|
echo "✓ pre-push : tout est vert ($(( $(date +%s) - start ))s)"
|