Présentation du framework
Liberty Next repose sur six fichiers de configuration placés sous config/. Chacun décrit une couche de la plateforme ; ensemble, ils définissent une application complète.
| Couche | Fichier | Contenu |
|---|---|---|
| Pools | connectors.toml ([pools.*]) | Connexions aux bases de données — URL, dialecte, password / schemas / max_rows optionnels. |
| Connecteurs | connectors.toml ([connectors.*]) | Connecteurs SQL (requêtes nommées) et connecteurs API (endpoints nommés). |
| Dictionnaire | dictionary.toml | Métadonnées par colonne : libellés, formats, règles BOOLEAN / ENUM / LOOKUP. |
| Écrans | screens.toml | Un écran par objet métier : la requête de lecture, les requêtes optionnelles d'écriture, les onglets et les champs du dialogue. |
| Tableaux de bord | dashboards.toml | Graphiques, indicateurs et mises en page groupées au-dessus des mêmes requêtes nommées. |
| Menus | menus.toml | L'arborescence latérale — dossiers, items, permissions. |
Tous sont rechargeables à chaud. POST /admin/reload reconstruit le registre ; les requêtes en cours conservent la version qu'elles utilisent au moment de leur exécution.
Vue d'ensemble
ENC:licensed = true (Nomasx-1 · Nomajde). Le framework fonctionne sans clé — les connecteurs concernés ne sont simplement pas chargés.Les couches
Pools
Un pool correspond à un moteur SQLAlchemy asynchrone — postgresql+asyncpg://…, oracle+oracledb://…, sqlite+aiosqlite://…. Déclaré sous [pools.<nom>] dans connectors.toml :
[pools.myapp]
url = "postgresql+asyncpg://myapp@db:5432/myapp"
password = "ENC:…" # valeur chiffrée, référence ${ENV} ou texte clair
pool_size = 10
max_rows = 5000 # plafond SELECT par défaut sur ce pool
[pools.myapp.schemas]
PROD = "myapp_prod" # `#SCHEMA.PROD#` dans une requête → `myapp_prod` à l'exécution
Le pool default est particulier : c'est le pool du framework lui-même, qui porte les tables d'authentification ly2_* quand [auth] backend = "db". Sur un checkout vierge, il pointe vers un fichier SQLite local pour que l'instance démarre sans base à configurer.
Connecteurs
Un connecteur définit comment Liberty Next atteint une source de données. Deux types existent :
- Le connecteur SQL rassemble un ensemble de requêtes nommées qui s'exécutent sur un pool de base de données. Le schéma de chaque résultat est lu à l'exécution sur le curseur de la requête ; le dictionnaire ajoute les libellés et les règles d'affichage.
- Le connecteur API rassemble un ensemble d'endpoints HTTP nommés. L'authentification, l'URL de base et la substitution de variables sont définies sur le connecteur.
Voir Connecteurs.
Dictionnaire
Le dictionnaire définit les métadonnées d'affichage par colonne : libellé (avec traductions par langue), format et règle. Chaque entrée fixe ces informations une seule fois ; tous les écrans qui retournent cette colonne en bénéficient automatiquement :
[entries.USER_STATUS]
label = "Status"
[entries.USER_STATUS.l]
fr = "Statut"
[enums.USER_STATUS]
values = [
{ value = "Y", label = "Active", l = { fr = "Actif" } },
{ value = "N", label = "Inactive", l = { fr = "Inactif" } },
]
Une indication column.dd = "USER_STATUS" sur la requête applique le libellé et la règle ENUM à la grille — la cellule affiche le libellé localisé, le filtre de colonne propose le picker multi-sélection, sans code supplémentaire. Voir Dictionnaire.
Écrans
Un écran est la définition d'un objet métier : la requête de lecture qui alimente la grille, les requêtes d'écriture optionnelles, et le formulaire modal intégré. Déclaré sous [screens.<app>.<id>] dans screens.toml :
[screens.myapp.users]
label = "Users"
read_query = "users_get"
update_query = "users_put"
audit = true
auto_load = true
[[screens.myapp.users.dialog.tabs]]
id = "main"
label = "General"
cols = 2
fields = [
{ column = "ID", hidden = true },
{ column = "NAME", required = true },
{ column = "STATUS", colspan = 2 },
]
Un clic sur une ligne ouvre un formulaire modal typé construit à partir de cette définition. Le widget de chaque champ est choisi selon la règle de la colonne (BOOLEAN → case à cocher, ENUM → liste déroulante recherchable, LOOKUP → liste déroulante restreinte par lookup_param_binds, plus les types date / nombre / texte selon format et type). Voir Écrans.
Tableaux de bord
Un tableau de bord est un agencement d'indicateurs et de graphiques au-dessus des mêmes requêtes nommées. Chaque panneau se rattache à une requête, choisit une agrégation et se présente sous un des types de graphiques standards. Voir Tableaux de bord.
Menus
L'arborescence latérale. Les dossiers se composent ; les feuilles renvoient vers une requête (grille de table), un tableau de bord, un endpoint HTTP ou un slug statique. L'arborescence est filtrée selon les droits de l'utilisateur — une feuille à laquelle l'utilisateur ne peut pas accéder (sql:{conn}:{name} / api:{conn}:{name}) est masquée, et un dossier devenu vide disparaît à son tour. Voir Menus.
Authentification
Deux backends, sélectionnés dans [auth] :
| Backend | Stockage des utilisateurs | Quand l'utiliser |
|---|---|---|
toml (défaut) | config/auth.toml | Pas de base de données requise au démarrage. Relu à chaque appel. Adapté aux petits déploiements et aux tests. |
db | Tables ly2_* du pool du framework | Gestion des utilisateurs via l'éditeur Settings → Users de l'interface React. Mots de passe hachés avec argon2. |
Les jetons sont des JWT signés avec LIBERTY_JWT_SECRET (clé éphémère si la variable n'est pas définie). L'OIDC est branché via authlib et fonctionne avec n'importe quel fournisseur.
La liste permissions d'un rôle contrôle ce que l'utilisateur peut exécuter : sql:<connecteur>:<requête>, api:<connecteur>:<endpoint>, admin:*. Le même filtre s'applique à l'arborescence du menu — l'utilisateur ne voit jamais une feuille qu'il n'a pas le droit d'ouvrir.
Licence
Le framework est gratuit. Les connecteurs marqués licensed = true dans connectors.toml sont déverrouillés par la variable LIBERTY_LICENSE_KEY — un JWT signé RS256 produit par l'éditeur. Une clé configurée mais invalide (expirée ou signature incorrecte) fait apparaître un bandeau dans l'interface React ; l'absence totale de clé masque simplement les connecteurs concernés.
C'est ce mécanisme qui active Nomasx-1 et Nomajde, regroupés sous une clé unique.
Frontend en une phrase
React 19 + Vite + TypeScript, buildé une seule fois dans frontend/dist puis servi en statique par le backend. Thème sombre par défaut avec bascule en mode clair, internationalisation EN / FR via react-i18next, icônes lucide-react, police DM Sans, @tanstack/react-table pour la grille, react-markdown + remark-gfm pour les réponses de l'assistant, @monaco-editor/react pour l'éditeur TOML brut. Apparence « liquid-glass » identique à NomaUBL via les composants @emotion/styled thématisés.