fix: preserve parent data context for primitive optional blocks#91
Conversation
When an optional block guards a primitive value (string, number,
boolean), the runtime incorrectly navigated into the property scope,
causing named variables like {{age}} inside {{#optional age}} to
resolve as $['age']['age'] instead of $['age']. This also affected
the pre-processing step which tried to treat primitive values as
objects.
Changes:
- getJsonPath: skip path navigation for primitive OptionalDefinition
nodes so variables resolve from the parent data context
- generateOptionalBlocks: skip pre-processing for primitive optional
values and let the normal traverse handle them
- Update test templates to use named variables instead of {{this}}
for primitive optionals
- Add conditional-variables test template
Closes accordproject/template-playground#2
Signed-off-by: Yash Goel <162511050+yashhzd@users.noreply.github.com>
|
Hi @yashhzd, I see a very deep root cause analysis done by @Shubh-Raj and this two PRs you raised just implements those changes. I'm closing this and the other PR for now. I'm not sure you'd had an offline conversation with him about this. it'll be better to ask him first if he's okay with this. I'd suggest please start a conversation on the issue and ask @Shubh-Raj for this. Let us give him a week to respond, if he doesn't if we can look into reviewing and merging the PRs. |
Thanks @sanketshevkar for handling this fairly! Happy to review @yashhzd's PRs and collaborate on getting the best fix merged. |
Description
Fixes a bug where named variables inside
{{#optional}}blocks with primitive types (string, number, boolean) would fail at runtime because the JSON path resolver incorrectly navigated into the property scope.Root cause:
OptionalDefinitionis classified as aNAVIGATION_NODE, sogetJsonPathwould append the property name to the path. For{{age}}inside{{#optional age}}, this produced$['age']['age']instead of the correct$['age']. Additionally,generateOptionalBlockstried to treat primitive values as objects during pre-processing.Closes accordproject/template-playground#2
Changes
TemplateMarkInterpreter.ts
getJsonPath— Skip path navigation forOptionalDefinitionnodes that guard primitive types (detected viaModelUtil.isPrimitiveType). This ensures variables inside primitive optional blocks resolve from the parent data context.generateOptionalBlocks— Skip pre-processing for primitive optional values (typeof value !== 'object'). Primitive values don't need recursive agreement generation — the normal traverse handles them correctly with the full parent data context.Test Updates
optional_comprehensive/template.mdandoptional-nested/template.mdto use named variables (e.g.,{{age}}) instead of{{this}}for primitive optional blocksconditional-variablestest template with model, template, and data filesAll 28 tests pass (27 existing + 1 new). The 3 pre-existing failures in
TemplateArchiveProcessor.test.tsare unrelated (missing--experimental-vm-modulesflag).Related
This fix works in conjunction with a companion PR on markdown-transform that addresses the type-checking (parsing) side of the same issue.
Author Checklist