Releases: issadicko/krom-lang
Release list
KromScript 1.0.4 — les noms pointés
Prépare les imports scopés du bundler (@use "…" as ns) : un module compilé en fermeture expose ses déclarations dans un objet, et il faut pouvoir les atteindre depuis l'hôte.
Une fonction appelée par son nom peut vivre dans un espace de noms
invoke, invokeSync et invokeSynchronized cherchaient le nom reçu à plat dans l'environnement. Un hôte qui passe une fonction par chaîne de caractères — builder: "homeTab", onTap: "valider" — ne pouvait donc atteindre qu'une déclaration de premier niveau.
Le nom accepte désormais des points : "homeView.homeTab" récupère homeView, descend dans la map, et appelle ce qu'il y trouve. Chaque segment intermédiaire doit être une map ; sinon la résolution échoue proprement sur le not found habituel, ce qui laisse intact le moyen qu'a l'hôte de distinguer un hook absent d'une vraie erreur.
Un nom sans point suit exactement le chemin d'avant.
L'état réactif d'un module reste visible
reactiveState() ne voyait que les Obs de premier niveau, et ceux d'un module scopé auraient disparu derrière leur map. Les objets sont maintenant ouverts d'un niveau et leurs entrées réactives rapportées sous la forme module.nom. setReactiveValue() accepte le même chemin, pour qu'un inspecteur d'état puisse toujours écrire ce qu'il affiche.
Un alias qui ne vit que dans une chaîne n'est plus supprimé
L'élimination de code mort ne comptait comme usage qu'un identifiant. Une variable dont la seule référence est une chaîne pointée — builder: "homeView.homeTab", que l'hôte résout à l'appel — passait donc pour morte et disparaissait, emportant le module entier.
Une chaîne de la forme nom.nom compte désormais comme un usage de son premier segment. Le motif est strict : une phrase ou un nom de fichier ne garde rien en vie.
Aucun changement de comportement pour un nom sans point. 372 tests verts.
dart pub add krom_script:^1.0.4
KromScript 1.0.3 — les erreurs d'exécution disent où
Changes
- Les erreurs d'exécution portent une position.
undefined variable,cannot access property,not a function, division par zéro, opérateurs inconnus et arguments des helpers de liste sortent avec le numéro de ligne. - Quand l'interprète détecte l'erreur lui-même, il connaît l'expression fautive et donne aussi la colonne.
- Pour les erreurs levées ailleurs, une fonction native par exemple, il donne la ligne de l'instruction en cours.
Technical
StatementetExpressiondéclarentToken get token. Les sous-classes le stockaient déjà.- Un
KromResourceError(budget, délai) garde son type. - Une erreur qui a déjà une position n'est pas réécrite.
À noter
- Les erreurs qui étaient des
Exceptionnues deviennent desKromRuntimeError. Le message ne change pas, la position s'ajoute en suffixe.
KromScript 1.0.2 — correctifs de justesse et de sûreté
Six correctifs de justesse et de sûreté (#10 à #15). Le numéro est un correctif, mais plusieurs changements sont visibles depuis un script ou depuis l'hôte — lire la section Migration du CHANGELOG avant de monter de version.
Correctifs
- Résolution de propriété (#10, #11) — lire une propriété nulle ou absente rend
nullau lieu de lever.?.résout comme.et ne court-circuite plus que sur un receveur nul :l?.lengthrendaitnulllà oùl.lengthrendait3. Une propriété nulle sur un objet lié ne rend plus un wrapper appelable, qui pouvait entrer silencieusement dans les données de l'hôte. - Garde d'exécution (#13) —
ExecutionLimitss'applique désormais par défaut àeval,runetbuilder().execute(), comme sa documentation l'annonçait depuis 1.0.0.while (true) {}ne bloque plus indéfiniment. NouveauwithLimits(...);ExecutionLimits.unlimitedpour désarmer explicitement. - Analyse (#12) — une chaîne non terminée et un bloc non fermé produisent une erreur de syntaxe positionnée, comme
(et[le faisaient déjà. Ces sources tronquées étaient acceptées puis exécutées. - Opérateurs d'ordre (#15) —
<,>,<=,>=ne coercent plus les opérandes non numériques vers0.0.null < 5répondaittrue: dans un moteur de règles,age < 18sur un champ vide déclenchait une validation qui devait rester dormante. - Représentation numérique (#14) — une seule règle à toutes les frontières : un entier reste
int, un décimal restedouble. Un même champ se sérialisait3ou3.0selon qu'un script l'avait touché.jsonStringifysuit la même règle, ce qui révoque la décision de 1.0.0 de préserver2.0en format réseau.
Migration
Le point le plus susceptible de casser à l'exécution : result.value as double lève désormais sur un entier. Utiliser as num.
Les autres changements visibles — comparaisons d'ordre qui passent de true à false, sources tronquées rejetées, scripts non bornés qui atteignent le budget, sortie jsonStringify sans .0 — sont détaillés un par un dans la section Migration du changelog.
Qualité
379 tests (contre 267 en 1.0.1), dart analyze et dart format propres. Les 8 cas de conformité encore rouges sont des fonctionnalités du canon non implémentées, suivies dans #24 — inchangés par cette version.
KromScript 1.0.1 — qualité du paquet
Patch de qualité, sans changement d'API ni de comportement.
- Code entièrement conforme à
dart format. - Suppression du code mort signalé par l'analyseur (imports, champs et variables inutilisés) dans
lib/,bin/ettest/. pathdéclaré endev_dependency.
Objectif : score Pass static analysis 50/50 sur pub.dev. Aucune migration nécessaire depuis 1.0.0.
KromScript 1.0.0 — Stable, sûr, prêt pour la production
Première version stable de KromScript. Après la série 0.x, le langage embarqué qui fait vivre les mini-apps Krom entre en 1.0 : API figée, sûreté par défaut et un langage nettement plus expressif — sur Dart, Kotlin, Go et TypeScript.
✨ Un langage plus complet et plus ergonomique
- Chaînes
else if— fini lesifimbriqués. - Affectations composées :
+=,-=,*=,/=. - Opérateur ternaire :
cond ? a : b. for-insur les maps — itère directement sur les clés.- Natif
range()pour les boucles numériques. - Commentaires bloc
/* ... */. - Affichage des nombres entiers sans
.0:4, plus4.0— untoStringenfin naturel dans les vues (interpolation,+,print,join, clés de map).jsonStringifyreste inchangé (format réseau préservé).
🛡️ Sûr par défaut
- Garde d'exécution activée d'office : budget d'opérations + deadline. Un script tiers ne peut plus figer l'hôte.
ExecutionLimits.unlimitedreste disponible pour du code de confiance. print()est désormais aussi routé vers la sortie standard, en plus dedeveloper.log, pour un débogage sans friction.
🔎 Optimiseur durci et introspectable
- Correction de plusieurs bugs de fausse suppression / transformation de l'optimiseur (propagation de constantes dans boucles et closures, inlining capturant un paramètre, round-trip du
elseaprès optimisation…). - Les hooks de cycle de vie (
onInit/onShow/onHide/onDispose) sont préservés au tree-shaking. - Introspection réactive pour l'hôte :
reactiveState()/setReactiveValue()pour lire et piloter l'état,lastOpsUsed/maxOperationspour instrumenter le budget.
🌍 Multi-plateforme
Même langage, quatre implémentations : Dart/Flutter, Kotlin (Maven Central), Go (pkg.go.dev), TypeScript (npm).
📖 Documentation
Guide complet : https://docs-kodiscript.dickode.net/
Rien à migrer depuis 0.2.0 : ces ajouts sont rétrocompatibles.