#!/usr/bin/env bash # ───────────────────────────────────────────────────────────────────────────── # Contrôles de conformité au cahier des charges (§3bis et §8). # # Ces vérifications sont mécaniques : elles constatent, elles n'interprètent # pas. Un seul contrôle en échec fait échouer la commande. # ───────────────────────────────────────────────────────────────────────────── set -uo pipefail cd "$(dirname "$0")/.." echecs=0 ok() { printf ' \033[32m✓\033[0m %s\n' "$1"; } ko() { printf ' \033[31m✗\033[0m %s\n' "$1" echecs=$((echecs + 1)) } titre() { printf '\n\033[1m%s\033[0m\n' "$1"; } titre "§3bis — architecture de rendu" # Seule une déclaration exportée est lue par SvelteKit : chercher la chaîne # brute ferait échouer le contrôle sur les commentaires qui la mentionnent, # y compris ceux qui expliquent pourquoi on ne la pose pas. MOTIF_SSR='^[[:space:]]*export[[:space:]]+const[[:space:]]+ssr[[:space:]]*=[[:space:]]*false' MOTIF_CSR='^[[:space:]]*export[[:space:]]+const[[:space:]]+csr[[:space:]]*=[[:space:]]*false' if grep -rnE "$MOTIF_SSR" web/src --include='*.ts' --include='*.js' --include='*.svelte' -q; then ko "un fichier déclare export const ssr = false (le mode SPA est écarté)" grep -rnE "$MOTIF_SSR" web/src --include='*.ts' --include='*.js' --include='*.svelte' else ok "aucun export const ssr = false : le rendu serveur est le défaut partout" fi if grep -rnE "$MOTIF_CSR" web/src/routes/+layout.ts web/src/routes/+layout.server.ts 2>/dev/null -q; then ko "csr = false déclaré au layout racine" else ok "aucun csr = false global" fi for page in a-propos methode; do if grep -q "prerender = true" "web/src/routes/$page/+page.ts" 2>/dev/null; then ok "prerender = true sur /$page" else ko "prerender = true absent de /$page" fi done grep -q "adapter-node" web/svelte.config.js && ok "adapter-node en place" || ko "adapter-node absent de svelte.config.js" grep -q "precompress: true" web/svelte.config.js && ok "precompress activé" || ko "precompress non activé" titre "§3 — souveraineté des ressources" tiers=$(grep -rnE "https?://(fonts\.googleapis|fonts\.gstatic|cdn\.|unpkg|jsdelivr|googletagmanager|google-analytics)" \ web/src web/static 2>/dev/null | grep -v Binary || true) if [ -z "$tiers" ]; then ok "aucune ressource tierce référencée (polices, CDN, traceurs)" else ko "ressources tierces trouvées :" echo "$tiers" fi nb_polices=$(find web/static/polices -name '*.woff2' 2>/dev/null | wc -l) [ "$nb_polices" -gt 0 ] && ok "polices auto-hébergées ($nb_polices fichiers woff2)" || ko "polices non auto-hébergées — lancer npm run polices" titre "§8 — livrables" for chemin in pipeline web data systemd tests README.md README-pipeline.md .env.example Makefile; do [ -e "$chemin" ] && ok "présent : $chemin" || ko "manquant : $chemin" done [ -f web/build/index.js ] && ok "build de production présent" || ko "build absent — lancer make build" titre "§8.2 — intégrité des données" if [ -f data/veille.db ]; then total=$(sqlite3 data/veille.db "SELECT COUNT(*) FROM textes") orphelins=$(sqlite3 data/veille.db \ "SELECT COUNT(*) FROM textes t WHERE NOT EXISTS (SELECT 1 FROM sources s WHERE s.texte_id = t.id)") cc=$(sqlite3 data/veille.db "SELECT COUNT(*) FROM v_textes WHERE devant_cc = 1") sans_url=$(sqlite3 data/veille.db \ "SELECT COUNT(*) FROM sources WHERE url NOT LIKE 'http%'") [ "$total" -ge 49 ] && ok "$total textes (≥ 49 exigés)" || ko "$total textes, 49 exigés" [ "$orphelins" -eq 0 ] && ok "aucun texte sans source URL" || ko "$orphelins textes sans source" [ "$sans_url" -eq 0 ] && ok "toutes les sources ont une URL absolue" || ko "$sans_url sources sans URL" [ "$cc" -ge 7 ] && ok "$cc textes devant le Conseil constitutionnel (≥ 7)" || ko "$cc textes, 7 attendus" else ko "base absente — lancer make seed" fi titre "Résultat" if [ "$echecs" -eq 0 ]; then printf ' \033[32mTous les contrôles passent.\033[0m\n\n' else printf ' \033[31m%d contrôle(s) en échec.\033[0m\n\n' "$echecs" exit 1 fi