Skip to content

Implement AST-based dependency extraction in FormulaVisitor.calculateDependencies (markdown-template) #679

Description

@skypank-coder

Summary

FormulaVisitor.calculateDependencies(tsCode) in packages/markdown-template/src/FormulaVisitor.ts is a stub (// TODO!!) that always returns []. It's invoked during TemplateMark typing (templatemarkutil.tstemplateMarkTypingGen), which sets dependencies on every FormulaDefinition / ConditionalDefinition, and the value is serialized through markdown-html (ToHtmlStringVisitor.ts writes the dependencies attribute, rules.ts reads it back). Today that attribute is always an empty array.

Continuing the working discussion with @mttrbrts

Current state / safety

Traced consumers of the field across the org:

  • markdown-transform: only written (HTML attr), read back (rules.ts), or stripped (markdown-cicero/ToCommonMarkVisitor.ts deletes it).
  • template-engine: only TemplateMarkInterpreter.ts does delete context.dependencies.

No code branches on the values, so implementing real extraction is self-contained with no regression surface — it only populates a field that is currently always empty.

Proposed approach

Extract root identifiers from the formula's TypeScript source (the param is named tsCode) via the AST rather than regex:

  • Collect root identifiers that reference template variables / model, excluding locally-bound names, function params, and built-ins.
  • Handle optional chaining (a?.b?.c → root a).
  • Return [] on parse failure or unrecognized constructs (note: this changes the current catch, which throws — flagging so it's an explicit decision).

Open questions to scope before implementation

  1. Runtime parser: typescript is currently a devDependency of markdown-template. Preference for promoting the TS compiler API to a runtime dep vs. a lighter parser (e.g. @typescript-eslint/typescript-estree)?
  2. Dependency definition: which identifier classes count — model/variable refs only, and are locally-declared bindings and function params always excluded?
  3. Cross-formula references: Devanshi noted formulas lack stable user-facing names, so these look out-of-scope for v1 — agreed to defer?

I can't make the Wednesday call, so opening this for async discussion per your
suggestion. Once (1) the runtime parser and (2) the dependency-definition
question are settled here, I'll scope the PR to those decisions.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions