Formats de données
Voici les structures JSON qui transitent entre les étapes du pipeline, ainsi que le schéma YAML de la base de données d’ingrédients. Cette page vient en renfort des références de packages : c’est le pendant « à quoi ressemblent concrètement les données » de la documentation orientée fonctions.
1. L’AST (@gram-lang/parser)
Section intitulée « 1. L’AST (@gram-lang/parser) »Pour le code source suivant :
getAST() retourne l’objet suivant (annoté, avec les offsets loc omis pour la lisibilité — notez que chaque nœud, hormis RecipeAST lui-même, en possède un) :
Consultez parser.md pour l’ensemble exhaustif des interfaces de nœuds et l’énumération ASTNodeType.
2. Recettes compilées & analysées (@gram-lang/kitchen, @gram-lang/analyzer)
Section intitulée « 2. Recettes compilées & analysées (@gram-lang/kitchen, @gram-lang/analyzer) »compile() produit un CompilationResult ; analyze() renvoie cette même structure enrichie des champs de masse/nutrition (AnalyzedCompilationResult). Voici le diff (les champs injectés par l’Analyseur sont commentés) :
Remarquez le vocabulaire StepToken généré par le compilateur au sein de content : le texte narratif pur est une simple string ; les ingrédients, le matériel et les références partagent la forme Usage (ils n’ont pas de champ type et sont identifiés par la présence d’un id) ; les minuteurs, températures, commentaires et déclarations portent chacun un type explicite en minuscules. Cette distinction avec le ASTNodeType (en PascalCase) du parser est volontaire : on décrit ici la sortie compilée, non l’entrée. Consultez Créer une UI personnalisée pour un tutoriel d’intégration de ces données dans un framework front-end.
3. Recettes composées (@gram-lang/modules)
Section intitulée « 3. Recettes composées (@gram-lang/modules) »Lorsqu’une recette importe des sous-modules via @use, finalizeComposed() enrichit le CompilationResult standard en un ComposedCompilationResult. Il ajoute des métadonnées modulaires à la racine de la charge utile et sur chaque section injectée :
modules: Tableau des modules importés contributeurs (ModuleInfo), précisant le nom de liaison local, l’URI source, le facteur d’échelle résolu et le mode d’exécution ("inline"ou"stocked").section.module: Présent sur toute section issue d’un import (ComposedSection), garantissant la traçabilité de provenance pour les interfaces et moteurs de rendu.
4. Base de données d’ingrédients (YAML)
Section intitulée « 4. Base de données d’ingrédients (YAML) »La base de données passée à validateIngredientDatabase() ou analyze() est un dictionnaire plat Record<string, IngredientData>, indexé par slug d’ingrédient. Le CLI gram tolère également (et aplatit) une clé racine optionnelle ingredients:. Les deux formats suivants pour .gram/ingredients.yaml sont donc valides :
Les blocs physical et nutrition sont tous deux optionnels. Une entrée dépourvue des deux reste valide (elle ne remontera juste aucune donnée de masse/nutrition, ce qui déclenchera un missingMassIngredients ou un warning MISSING_MACROS). Seul le champ name est strictement requis. Les sous-champs nutrition.calories/protein/carbs/fat deviennent obligatoires dès l’instant où la clé nutrition est déclarée. Les autres (sugar, fiber, sodium, sat_fat, mono_fat, poly_fat, alcohol) sont optionnels.