GeoLeaf.Config – Documentation du module Config (Chargement JSON)
Product Version: GeoLeaf Platform V2
Version : 2.0.0
Fichiers (monorepo) : packages/core/src/modules/built-in/config/ (config-core, config-loaders, config-accessors, config-types, config-validation, loader, normalization, profile, taxonomy, storage)
Dernière mise à jour : mars 2026
Le module GeoLeaf.Config est responsable du chargement et de la validation de la configuration JSON externe utilisée par GeoLeaf.
Il fournit :
le chargement d'un fichier JSON externe (via URL) ou d'un objet inline ;
la validation et la normalisation du schéma (blocs
map,data,ui,basemaps,layers,poi…) ;l'exposition des données au reste des modules via des accesseurs typés ;
un événement interne indiquant que la configuration est prête ;
l'appel automatique à un callback utilisateur (
onLoaded) ;le support du mode
autoEventpour déclencher un événement DOM personnalisé ;la gestion multi-profils via
ProfileManageretTaxonomyManager.
Ce module pilote la séquence d'initialisation complète de GeoLeaf.
1. Rôle fonctionnel de GeoLeaf.Config
Charger une configuration JSON depuis :
- un fichier distant (
url), - un objet JS inline (
config).
- un fichier distant (
Valider et normaliser les blocs essentiels :
map(cible DOM, centre, zoom, bounds, options MapLibre),data(profil actif, chemin des profils),ui(thème, langue, contrôles),basemaps(couches de fond raster ou vectorielles),layers(couches GeoJSON/vecteur référencées),poi,poiConfig,categories.
Exposer la configuration aux autres modules via :
Config.getAll()— config complète,Config.get(path, default)— lecture par chemin pointé,Config.getSection(name)— lecture d'un bloc entier,Config.getActiveProfile()— profil actif (viaProfileManager),Config.getActiveProfilePoi()— POI du profil actif,Config.getActiveProfileRoutes()— routes du profil actif,Config.getActiveProfileMapping()— mapping du profil actif,Config.getIconsConfig()— configuration des icônes,Config.isProfilePoiMappingEnabled()— mapping POI activé,Config.getCategories()— taxonomie (viaTaxonomyManager),Config.getSubcategory(categoryId, subCategoryId)— sous-catégorie par identifiants.
Déclencher un callback
onLoaded(config)lorsque tout est prêt.Émettre un événement DOM
"geoleaf:config:loaded"siautoEventest activé.
Ce module constitue le point d'entrée de toute la logique GeoLeaf.
2. API publique du module Config
GeoLeaf.Config.init(options)— charge la config et initialise les sous-modulesGeoLeaf.Config.loadUrl(url, options?)— charge un fichier JSON externeGeoLeaf.Config.loadTaxonomy(url, options?)— charge un mapping de catégoriesGeoLeaf.Config.loadActiveProfileResources(options?)— charge les ressources du profil actifGeoLeaf.Config.getAll()— retourne la configuration complèteGeoLeaf.Config.get(path, default?)— lit un champ par chemin pointéGeoLeaf.Config.set(path, value)— modifie un champGeoLeaf.Config.getSection(name, default?)— lit un bloc de configurationGeoLeaf.Config.getActiveProfile()— profil actif (objet complet)GeoLeaf.Config.getActiveProfileId()— identifiant du profil actifGeoLeaf.Config.getActiveProfilePoi()— tableau des POI du profil actifGeoLeaf.Config.getActiveProfileRoutes()— tableau des routes du profil actifGeoLeaf.Config.getActiveProfileMapping()— mapping de taxonomie du profil actifGeoLeaf.Config.getIconsConfig()— configuration des icônes du profil actifGeoLeaf.Config.isProfilePoiMappingEnabled()— vrai si le mapping POI est activéGeoLeaf.Config.getCategories()— taxonomie complèteGeoLeaf.Config.getCategory(id)— catégorie par identifiantGeoLeaf.Config.getSubcategory(categoryId, subCategoryId)— sous-catégorie par identifiantsGeoLeaf.Config.isLoaded()— vrai si la config est prêteGeoLeaf.Config.getSource()— source ayant produit la config ("url"ou"inline")
3. GeoLeaf.Config.init(options)
Initialise le module en précisant la source de la configuration.
GeoLeaf.Config.init({
url: "../data/geoleaf.config.json",
autoEvent: true,
onLoaded: (config) => {
console.log("Config loaded:", config);
},
});3.1 Paramètres (ConfigInitOptions)
| Paramètre | Type | Description |
|---|---|---|
config | GeoLeafConfig | Configuration inline (prioritaire sur url) |
url | string | URL du fichier JSON à charger via fetch |
headers | Record<string, string> | En-têtes HTTP personnalisés pour le fetch |
strictContentType | boolean | Rejette les réponses non-application/json (défaut: true) |
autoEvent | boolean | Émet "geoleaf:config:loaded" après chargement (défaut: true) |
onLoaded | (config: GeoLeafConfig) => void | Callback appelé après chargement réussi |
onError | (err: Error) => void | Callback appelé en cas d'erreur de chargement |
profileId | string | Identifiant du profil actif à activer |
mappingUrl | string | URL du fichier de mapping de catégories (taxonomie) |
mappingHeaders | Record<string, string> | En-têtes HTTP pour le fetch de la taxonomie |
mappingStrictContentType | boolean | Validation content-type pour la taxonomie |
3.2 Comportement
- Si
configest fourni → la configuration est utilisée immédiatement (chemin synchrone). - Si
urlest fourni → appelfetchasynchrone. - Si
mappingUrlest fourni → chargement de la taxonomie en parallèle. - Après chargement :
- normalisation et stockage interne de la configuration,
- initialisation de
StorageHelper,TaxonomyManager,ProfileManager, - appel du callback
onLoaded, - émission de l'événement DOM (si
autoEvent = true).
- Retourne une
Promise<GeoLeafConfig>.
4. GeoLeaf.Config.loadUrl(url, options?)
Charge la configuration JSON depuis une URL.
await GeoLeaf.Config.loadUrl("../data/config.json", {
headers: { Authorization: "Bearer token" },
});4.1 Comportement
- effectue un
fetch(url)en mode asynchrone ; - valide le content-type si
strictContentTypeest activé ; - parse le JSON et applique la configuration via
_applyConfig; - déclenche automatiquement la suite (
_maybeFireLoadedEvent).
4.2 Gestion d'erreurs
- JSON invalide → log contrôlé, retourne la config existante
- URL inaccessible → log d'erreur + retour propre (pas d'exception non gérée)
5. Accesseurs principaux
GeoLeaf.Config.getAll()
Retourne la configuration complète actuellement chargée.
const config = GeoLeaf.Config.getAll();
console.log(config.map.zoom);GeoLeaf.Config.get(path, defaultValue?)
Lit un champ par chemin pointé.
const theme = GeoLeaf.Config.get("ui.theme", "light");
const zoom = GeoLeaf.Config.get("map.zoom", 10);GeoLeaf.Config.getActiveProfile()
Retourne l'objet profil actif (chargé par ProfileManager).
const profile = GeoLeaf.Config.getActiveProfile();
if (profile?.panels?.detail?.layout) {
// Utiliser le layout du panneau de détail
}GeoLeaf.Config.getCategories()
Retourne la taxonomie complète (arbre de catégories/sous-catégories).
const cats = GeoLeaf.Config.getCategories();
// { restaurant: { label: "Restaurant", subcategories: {...} }, ... }6. Structure JSON officielle supportée
Voici la structure complète (tous les blocs sont optionnels sauf map) :
{
"map": {
"target": "geoleaf-map",
"bounds": [
[43.0, -0.5],
[46.0, 3.5]
],
"zoom": 10,
"maxZoom": 19,
"minZoom": 6
},
"data": {
"activeProfile": "mon-profil",
"profilesBasePath": "profiles"
},
"ui": {
"theme": "auto",
"language": "fr",
"showLayerManager": true,
"showFilterPanel": true,
"permalink": {
"enabled": true,
"mode": "hash"
}
},
"basemaps": {
"osm": {
"type": "tile",
"label": "OpenStreetMap",
"url": "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",
"defaultBasemap": true
}
},
"layers": [],
"logging": {
"level": "info"
},
"security": {
"httpsOnly": false
}
}7. Séquence complète d'initialisation
GeoLeaf.Config.init({ url })fetch()du fichier JSON- Validation et normalisation du JSON
StorageHelper.init(config)— accès lecture/écriture à la configTaxonomyManager.init(config)— chargement de la taxonomieProfileManager.init(config)— chargement du profil actif- Appel du callback
onLoaded(config) - Émission de
geoleaf:config:loaded(siautoEvent = true) - La façade
geoleaf.boot.tsenchaîne :GeoLeaf.Core.init(config.map)→ crée la carte MapLibre GL- initialisation de l'UI, des couches, des POI, des plugins
8. Résumé rapide de l'API Config
| Méthode | Rôle |
|---|---|
init(options) | Démarre le chargement du JSON ou data inline |
loadUrl(url, options?) | Charge un fichier JSON externe |
loadTaxonomy(url, options?) | Charge un mapping de catégories |
loadActiveProfileResources() | Charge les ressources du profil actif |
getAll() | Retourne la configuration complète |
get(path, default?) | Lit un champ par chemin pointé |
set(path, value) | Modifie un champ |
getSection(name, default?) | Lit un bloc de configuration |
getActiveProfile() | Profil actif (via ProfileManager) |
getActiveProfileId() | Identifiant du profil actif |
getActiveProfilePoi() | Tableau des POI du profil actif |
getActiveProfileRoutes() | Tableau des routes du profil actif |
getActiveProfileMapping() | Mapping de taxonomie du profil actif |
getIconsConfig() | Configuration des icônes du profil actif |
isProfilePoiMappingEnabled() | true si le mapping POI est activé |
getCategories() | Taxonomie complète (via TaxonomyManager) |
getCategory(id) | Catégorie par identifiant |
getSubcategory(categoryId, subCategoryId) | Sous-catégorie par identifiants |
isLoaded() | Vrai si la config est initialisée |
getSource() | Source de la config ("url" ou "inline") |
9. Types TypeScript
Les types sont définis dans config-types.ts :
GeoLeafConfig— objet racine (map, data, ui, basemaps, layers…)MapConfig— sectionmap(target, bounds, center, zoom, mapOptions…)DataConfig— sectiondata(activeProfile, profilesBasePath)UIConfig— sectionui(theme, language, contrôles, permalink)ConfigInitOptions— options deConfig.init()BasemapConfig— définition d'un fond de carteLayerConfig— référence à une couche GeoJSONLayerFileConfig— structure d'un fichier de config de coucheCategoryItem— catégorie/sous-catégorie de la taxonomiePermalinkConfig— deep-linking URL
10. Bonnes pratiques
- Toujours initialiser Config avant tous les autres modules.
- Préférer une configuration JSON unique et centralisée par déploiement.
- Utiliser
autoEvent: true(défaut) pour intégrer GeoLeaf dans des frameworks externes. - Toujours valider vos fichiers JSON avant utilisation (pas de commentaires JSON5).
- Utiliser les accesseurs typés (
get,getSection,getActiveProfile) plutôt que d'accéder directement à_config. - Le bloc
map.targetest obligatoire (identifiant HTML de l'élément conteneur).
