Skip to content

Performance Debugging & DevTools

This guide covers the FormDevTools component and the underlying performance and event-tracing APIs for diagnosing render performance issues and inspecting rule evaluation behavior.


FormDevTools Overview

FormDevTools is a collapsible developer panel with seven tabs:

TabWhat it shows
RulesPer-field runtime state: type, required, hidden, readOnly, active rules
ValuesCurrent form values as formatted JSON
ErrorsCurrent form errors
GraphText-based dependency graph
PerfPer-field render counts via RenderTracker
DepsTabular dependency graph with cycle detection
TimelineChronological event log

Performance Tab (Perf)

Shows per-field render counts. Hot fields (render count exceeds 1.5x the average) are highlighted in orange.

How Tracking Works

RenderField calls trackRender(fieldName) on every render. Call flushRenderCycle() in a useEffect to get accurate "Last Cycle" data:

tsx
import { flushRenderCycle } from "@formosaic/core/devtools";

function MyFormWrapper(props) {
  React.useEffect(() => { flushRenderCycle(); });
  return <Formosaic {...props} />;
}

Dependency Graph Tab (Deps)

Shows field dependency relationships with color coding by effect type:

EffectColor
hiddenYellow
requiredBlue
readOnlyGray
optionsGreen

Includes pairwise cycle detection and sorting by name or dependency count.


Timeline Tab

Chronological event log with filtering:

Event TypeWhen It Fires
field_changeAfter a field value changes
rule_evaluatedDuring evaluateAllRules()
validation_runDuring sync validation
form_submitAvailable for custom logging

Programmatic Access

RenderTracker API

tsx
import {
  trackRender,
  flushRenderCycle,
  getRenderCounts,
  getLastRenderedFields,
  getTotalFormRenders,
  resetRenderTracker,
} from "@formosaic/core/devtools";

EventTimeline API

tsx
import { logEvent, getTimeline, clearTimeline } from "@formosaic/core/devtools";

// Log a custom event
logEvent("form_submit", "form", `submitted with ${Object.keys(values).length} fields`);

RuleTracer API

tsx
import {
  enableRuleTracing,
  disableRuleTracing,
  getRuleTraceLog,
  clearRuleTraceLog,
} from "@formosaic/core/devtools";

enableRuleTracing((event) => {
  console.log(`[Rule Trace] ${event.type}: ${event.triggerField} -> ${event.affectedField}`);
});

Production Considerations

  • Set enabled={false} to ensure FormDevTools renders nothing in production.
  • The 500-event cap on EventTimeline prevents unbounded memory growth.
  • RenderTracker has no cap on tracked fields but memory impact is negligible.

Released under the MIT License.