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