Per-field model-side wrapper for a type: object resolution. The
dispatcher lands this on model[fieldName] after running MQL,
bundling everything a controller might need:
stuff: the resolved Stuff, or null when MQL produced no
match. (Inherited from MqlOne.) Distinguished
from the field being absent on the model (player typed
nothing) — controllers can tell the two apart.
via: sub-feature attribution (exit for direction matches,
detailPath for detail drills, etc.). (Inherited from
MqlOne.)
raw: the player-typed text post-desugar, before MQL replaced
it with the resolved Stuff. Always present when this wrapper
exists.
prep: lowercased preposition the matcher consumed for this
field per the YAML's prepositions: declaration. Absent when
no preposition was declared or none typed.
Per-field model-side wrapper for a
type: objectresolution. The dispatcher lands this onmodel[fieldName]after running MQL, bundling everything a controller might need:stuff: the resolved Stuff, ornullwhen MQL produced no match. (Inherited from MqlOne.) Distinguished from the field being absent on the model (player typed nothing) — controllers can tell the two apart.via: sub-feature attribution (exitfor direction matches,detailPathfor detail drills, etc.). (Inherited from MqlOne.)raw: the player-typed text post-desugar, before MQL replaced it with the resolved Stuff. Always present when this wrapper exists.prep: lowercased preposition the matcher consumed for this field per the YAML'sprepositions:declaration. Absent when no preposition was declared or none typed.Controllers destructure directly:
const { stuff, via, raw, prep } = model.target;