feat: introduce a shared config with an optional local override

The mairie form needs an organiser, an email and the café defaults. Ship the
defaults in the repo and let each volunteer override the personal bits in
config.local.json (gitignored, optional: a fresh clone still works).

config.js carries neither import nor export on purpose, so that it loads both
as a classic script (content script, background) and as an ESM module. That is
what lets presentation.js drop its duplicated café address.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Pierre Martin
2026-07-17 13:07:17 +02:00
co-authored by Claude Opus 4.8
parent 342fda9a0b
commit b103ab78ec
4 changed files with 113 additions and 2 deletions
+39
View File
@@ -0,0 +1,39 @@
// Défauts committés de l'extension + fusion avec la surcharge locale.
//
// ⚠️ Ce fichier n'a NI `import` NI `export`, DÉLIBÉRÉMENT (ne pas « corriger ») :
// c'est ce qui le rend chargeable à la fois comme content script / script de
// background (scripts classiques : un `export` y lève une SyntaxError) et comme
// module ESM (`import "./config.js"` depuis presentation.js et bun test).
// Il communique donc par `globalThis`. Cf. DECISIONS.md 2026-07-17.
globalThis.EchoConfig = {
// Clé de storage : le background écrit, le content script lit.
CLE_CONFIG_LOCALE: "config-locale",
DEFAUTS: {
// Vides par défaut : sans config.local.json, on préfère un champ vide
// signalé dans le bandeau à un organisateur inventé.
organisateur: "",
email: "",
// RECHERCHE.md §3 : valeur exacte du dropdown #input_6_20.
themeDefaut: "Culture",
tarifs: "Gratuit",
// RECHERCHE.md §2. `input_18` se compose `${coords}|${adresse}`.
cafe: {
adresse: "8 Rue du Pré Vicinal 31270 Cugnaux",
coords: "43.53753132806989|1.342981890597508",
},
},
// Fusion de surface : la locale ne porte que des champs plats
// (organisateur, email…). Tolérante par nécessité — `config.local.json` est
// optionnel et éditable à la main : absent, `null` ou invalide → défauts nus,
// jamais d'exception.
fusionner(defauts, locale) {
const surcharge =
locale && typeof locale === "object" && !Array.isArray(locale) ? locale : {};
return { ...defauts, ...surcharge };
},
};