Aller au contenu

ADR 0043 – Bibliothèque CEL des expressions

Statut : Décidée. Date : 02/10/2026. Lot 0 bis, séquence L0-1 ; répond à la question Q2 de la note d’amendement.

Les conditions composées des tables de décision sont écrites en CEL (AM-09). Le téléphone et le serveur doivent les évaluer avec la même bibliothèque (P8, AM-10). La note fixe deux critères : un comportement identique dans le navigateur et dans Node, et une taille de paquet acceptable sur le téléphone. Les calculs restent en entiers.

@marcbachmann/cel-js 8.0.0 (MIT, aucune dépendance), version épinglée, dans packages/domain seulement. Elle est encapsulée par le module expressions : verifierExpression (publication : variables toutes déclarées, types, aucun nombre décimal) et evaluerExpression (entiers passés en int 64 bits, variable absente → variable_manquante, PC-07).

Mesures du 02/10/2026, sur un jeu de 30 expressions du sous-ensemble BioTrace (comparaisons, in, has(), macros exists et all, tables, entiers 64 bits, dépassement, division par zéro, court-circuit, syntaxe invalide) :

Critère @marcbachmann/cel-js @bufbuild/cel 0.6.1
Paquet minifié (esbuild) 82 Ko 278 Ko
Paquet compressé (gzip -9) 24 Ko 68 Ko
Dépendances aucune @bufbuild/re2, @bufbuild/cel-spec, @bufbuild/protobuf
Jeu de 30 expressions 30 résultats mêmes 30 résultats
Node 22 contre navigateur (Chromium) identiques identiques
Vérification de types avant évaluation oui (check) non exposée simplement
  • @bufbuild/cel : la plus fidèle à la spécification, mais trois fois plus lourde sur le téléphone, en version 0.x, et liée à Protobuf, que BioTrace n’utilise pas.
  • cel-js : dépend de ramda, bibliothèque de la famille de Lodash (interdite), et n’est plus mise à jour depuis 07/2025.
  • CEL autorise la comparaison entre int et double : c’est verifierExpression qui refuse tout littéral décimal, et evaluerExpression qui refuse toute variable non entière (RangeError).
  • La détection d’une variable absente lit le message d’erreur de la bibliothèque (« Unknown variable », « No such key »). La version est épinglée et les vecteurs VT-EXPR le vérifient à chaque montée de version.
  • Le jeu de mesure est devenu les vecteurs testdata/domain/expressions (VT-EXPR-001 à 028). Le rejeu dans Chromium a été fait une fois, à la main : l’exécution automatique des vecteurs du domaine dans un navigateur reste à faire (réserve du journal).

Seul packages/domain/src/expressions/index.ts importe la bibliothèque. La remplacer revient à réécrire ce fichier, sous les mêmes vecteurs. Les expressions stockées dans les packs sont du CEL standard, indépendant de l’implémentation.