{"version":3,"sources":["../src/components/FormDevTools.tsx","../src/helpers/RuleTracer.ts"],"sourcesContent":["import React from \"react\";\nimport { IRuntimeFormState, IRuntimeFieldState } from \"../types/IRuntimeFieldState\";\nimport { getRenderCounts, getLastRenderedFields, getTotalFormRenders, resetRenderTracker, enableRenderTracker, disableRenderTracker } from \"../helpers/RenderTracker\";\nimport { getTimeline, clearTimeline, ITimelineEvent, enableEventTimeline, disableEventTimeline } from \"../helpers/EventTimeline\";\nimport { ITemplateMeta } from \"../types/IResolvedFormConfig\";\n\nexport interface IFormDevToolsProps {\n  configName: string;\n  formState?: IRuntimeFormState;\n  formValues?: Record<string, unknown>;\n  formErrors?: Record<string, unknown>;\n  dirtyFields?: Record<string, boolean>;\n  enabled?: boolean;\n  /** Template provenance metadata from IResolvedFormConfig._templateMeta */\n  templateMeta?: ITemplateMeta;\n}\n\ntype TabKey = \"rules\" | \"values\" | \"errors\" | \"graph\" | \"performance\" | \"depgraph\" | \"timeline\";\n\nexport const FormDevTools: React.FC<IFormDevToolsProps> = (props) => {\n  const { configName, formState, formValues, formErrors, dirtyFields, enabled = true, templateMeta } = props;\n\n  const [isOpen, setIsOpen] = React.useState(false);\n  const [activeTab, setActiveTab] = React.useState<TabKey>(\"rules\");\n  const [timelineFilter, setTimelineFilter] = React.useState(\"\");\n  const [depGraphSort, setDepGraphSort] = React.useState<\"name\" | \"depCount\">(\"name\");\n  const [, forceUpdate] = React.useReducer((x: number) => x + 1, 0);\n\n  // When mounted, opt into render tracking and event timeline logging.\n  // Both are no-ops until enabled. See audit P1-22.\n  React.useEffect(() => {\n    if (!enabled) return;\n    enableRenderTracker();\n    enableEventTimeline();\n    return () => {\n      disableRenderTracker();\n      disableEventTimeline();\n    };\n  }, [enabled]);\n\n  if (!enabled) return null;\n\n  const fieldStates = formState?.fieldStates ?? {};\n  const fieldNames = Object.keys(fieldStates);\n\n  const dependencyGraph = React.useMemo(() => {\n    const lines: string[] = [];\n    for (const [name, state] of Object.entries(fieldStates)) {\n      if (state.dependentFields?.length) {\n        lines.push(`${name} -> ${state.dependentFields.join(\", \")}`);\n      }\n      if (state.dependsOnFields?.length) {\n        lines.push(`${name} (depends on) ${state.dependsOnFields.join(\", \")}`);\n      }\n    }\n    return lines;\n  }, [fieldStates]);\n\n  const containerStyle: React.CSSProperties = {\n    position: \"fixed\", bottom: 0, right: 0,\n    width: isOpen ? \"520px\" : \"auto\", maxHeight: isOpen ? \"50vh\" : \"auto\",\n    background: \"#1e1e1e\", color: \"#d4d4d4\", fontFamily: \"monospace\", fontSize: \"12px\",\n    zIndex: 9999, borderTopLeftRadius: \"8px\", overflow: \"hidden\", boxShadow: \"0 -2px 10px rgba(0,0,0,0.3)\",\n  };\n\n  const tabStyle = (active: boolean): React.CSSProperties => ({\n    padding: \"4px 8px\", cursor: \"pointer\",\n    background: active ? \"#333\" : \"transparent\", color: active ? \"#fff\" : \"#888\",\n    border: \"none\", borderBottom: active ? \"2px solid #007acc\" : \"2px solid transparent\",\n    fontFamily: \"monospace\", fontSize: \"11px\",\n  });\n\n  const thStyle: React.CSSProperties = {\n    textAlign: \"left\", padding: \"3px 6px\", borderBottom: \"1px solid #555\",\n    fontWeight: \"bold\", color: \"#fff\", fontSize: \"11px\",\n  };\n\n  const tdStyle: React.CSSProperties = {\n    padding: \"3px 6px\", borderBottom: \"1px solid #333\", fontSize: \"11px\",\n  };\n\n  const btnStyle: React.CSSProperties = {\n    padding: \"2px 8px\", margin: \"0 4px\", cursor: \"pointer\",\n    background: \"#333\", color: \"#d4d4d4\", border: \"1px solid #555\",\n    fontFamily: \"monospace\", fontSize: \"10px\", borderRadius: \"3px\",\n  };\n\n  // --- Performance Tab ---\n  const renderPerformanceTab = () => {\n    const counts = getRenderCounts();\n    const lastRendered = getLastRenderedFields();\n    const totalRenders = getTotalFormRenders();\n    const entries = Array.from(counts.entries()).sort((a, b) => a[0].localeCompare(b[0]));\n    const avgCount = entries.length > 0\n      ? entries.reduce((sum, [, c]) => sum + c, 0) / entries.length\n      : 0;\n\n    return (\n      <div>\n        <div style={{ marginBottom: \"6px\", display: \"flex\", alignItems: \"center\", gap: \"8px\" }}>\n          <span>Total form renders: <strong style={{ color: \"#4ec9b0\" }}>{totalRenders}</strong></span>\n          <button style={btnStyle} onClick={() => { resetRenderTracker(); forceUpdate(); }}>Reset</button>\n          <button style={btnStyle} onClick={() => forceUpdate()}>Refresh</button>\n        </div>\n        {entries.length === 0 ? (\n          <div>No render data yet.</div>\n        ) : (\n          <table style={{ width: \"100%\", borderCollapse: \"collapse\" }}>\n            <thead>\n              <tr>\n                <th style={thStyle}>Field</th>\n                <th style={thStyle}>Renders</th>\n                <th style={thStyle}>Last Cycle</th>\n                <th style={thStyle}>Hot</th>\n              </tr>\n            </thead>\n            <tbody>\n              {entries.map(([fieldName, count]) => {\n                const isHot = count > avgCount * 1.5;\n                const wasLastRendered = lastRendered.has(fieldName);\n                return (\n                  <tr key={fieldName} style={isHot ? { background: \"#3e2a00\" } : undefined}>\n                    <td style={tdStyle}>{fieldName}</td>\n                    <td style={{ ...tdStyle, color: isHot ? \"#ff9900\" : \"#d4d4d4\" }}>{count}</td>\n                    <td style={tdStyle}>{wasLastRendered ? \"\\u2713\" : \"\"}</td>\n                    <td style={tdStyle}>{isHot ? \"\\u26a0\" : \"\"}</td>\n                  </tr>\n                );\n              })}\n            </tbody>\n          </table>\n        )}\n      </div>\n    );\n  };\n\n  // --- Dependency Graph Tab ---\n  const renderDepGraphTab = () => {\n    // Build adjacency data from fieldStates\n    const rows: Array<{\n      name: string;\n      dependsOn: string[];\n      dependedBy: string[];\n      effects: string[];\n    }> = [];\n\n    let hasCycles = false;\n\n    for (const [name, state] of Object.entries(fieldStates)) {\n      const dependsOn = state.dependsOnFields ?? [];\n      const dependedBy = state.dependentFields ?? [];\n\n      // Determine primary effect types from this field's state\n      const effects: string[] = [];\n      if (state.hidden) effects.push(\"hidden\");\n      if (state.required) effects.push(\"required\");\n      if (state.readOnly) effects.push(\"readOnly\");\n      if (state.options && state.options.length > 0 && dependsOn.length > 0) effects.push(\"options\");\n      if (state.computedValue) effects.push(\"computed\");\n\n      rows.push({ name, dependsOn, dependedBy, effects });\n    }\n\n    // Check for cycles: a field that both depends on and is depended by the same field\n    for (const row of rows) {\n      for (const dep of row.dependsOn) {\n        const depRow = rows.find(r => r.name === dep);\n        if (depRow?.dependsOn.includes(row.name)) {\n          hasCycles = true;\n          break;\n        }\n      }\n      if (hasCycles) break;\n    }\n\n    // Filter to only fields with dependencies\n    const depRows = rows.filter(r => r.dependsOn.length > 0 || r.dependedBy.length > 0);\n\n    // Sort\n    if (depGraphSort === \"name\") {\n      depRows.sort((a, b) => a.name.localeCompare(b.name));\n    } else {\n      depRows.sort((a, b) => (b.dependsOn.length + b.dependedBy.length) - (a.dependsOn.length + a.dependedBy.length));\n    }\n\n    const effectColor = (effects: string[]): React.CSSProperties => {\n      if (effects.includes(\"hidden\")) return { background: \"#3e3a20\" };     // light yellow\n      if (effects.includes(\"required\")) return { background: \"#1e2a3e\" };   // light blue\n      if (effects.includes(\"readOnly\")) return { background: \"#2a2a2a\" };   // light gray\n      if (effects.includes(\"options\")) return { background: \"#1e3a2a\" };    // light green\n      return {};\n    };\n\n    return (\n      <div>\n        <div style={{ marginBottom: \"6px\", display: \"flex\", alignItems: \"center\", gap: \"8px\" }}>\n          <span>Sort by:</span>\n          <button style={{ ...btnStyle, borderColor: depGraphSort === \"name\" ? \"#007acc\" : \"#555\" }} onClick={() => setDepGraphSort(\"name\")}>Name</button>\n          <button style={{ ...btnStyle, borderColor: depGraphSort === \"depCount\" ? \"#007acc\" : \"#555\" }} onClick={() => setDepGraphSort(\"depCount\")}>Dep Count</button>\n          {hasCycles && <span style={{ color: \"#f44747\", fontWeight: \"bold\" }}>Cycles detected!</span>}\n        </div>\n        {depRows.length === 0 ? (\n          <div>No dependencies defined.</div>\n        ) : (\n          <table style={{ width: \"100%\", borderCollapse: \"collapse\" }}>\n            <thead>\n              <tr>\n                <th style={thStyle}>Field</th>\n                <th style={thStyle}>Depends On</th>\n                <th style={thStyle}>Depended By</th>\n                <th style={thStyle}>Effects</th>\n                <th style={thStyle}>Source</th>\n              </tr>\n            </thead>\n            <tbody>\n              {depRows.map(row => {\n                const meta = templateMeta?.[row.name];\n                const source = meta ? `${meta.template} (${meta.fragment})` : \"direct\";\n                const sourceColor: React.CSSProperties = meta\n                  ? { color: \"#9cdcfe\" }\n                  : { color: \"#888\" };\n                return (\n                  <tr key={row.name} style={effectColor(row.effects)}>\n                    <td style={tdStyle}>{row.name}</td>\n                    <td style={tdStyle}>{row.dependsOn.join(\", \") || \"\\u2014\"}</td>\n                    <td style={tdStyle}>{row.dependedBy.join(\", \") || \"\\u2014\"}</td>\n                    <td style={tdStyle}>{row.effects.join(\", \") || \"\\u2014\"}</td>\n                    <td style={{ ...tdStyle, ...sourceColor }}>{source}</td>\n                  </tr>\n                );\n              })}\n            </tbody>\n          </table>\n        )}\n      </div>\n    );\n  };\n\n  // --- Timeline Tab ---\n  const renderTimelineTab = () => {\n    const timeline = getTimeline();\n    const filterLower = timelineFilter.toLowerCase();\n    const filtered = filterLower\n      ? timeline.filter(e => e.fieldName.toLowerCase().includes(filterLower) || e.type.toLowerCase().includes(filterLower))\n      : timeline;\n    // Show newest first\n    const reversed = [...filtered].reverse();\n\n    const typeColor = (type: string): string => {\n      switch (type) {\n        case \"field_change\": return \"#4ec9b0\";\n        case \"rule_evaluated\": return \"#ce9178\";\n        case \"validation_run\": return \"#dcdcaa\";\n        case \"form_submit\": return \"#569cd6\";\n        default: return \"#d4d4d4\";\n      }\n    };\n\n    const formatTime = (ts: number): string => {\n      const d = new Date(ts);\n      return `${String(d.getHours()).padStart(2, \"0\")}:${String(d.getMinutes()).padStart(2, \"0\")}:${String(d.getSeconds()).padStart(2, \"0\")}.${String(d.getMilliseconds()).padStart(3, \"0\")}`;\n    };\n\n    return (\n      <div>\n        <div style={{ marginBottom: \"6px\", display: \"flex\", alignItems: \"center\", gap: \"8px\" }}>\n          <input\n            type=\"text\"\n            placeholder=\"Filter by field or type...\"\n            value={timelineFilter}\n            onChange={e => setTimelineFilter(e.target.value)}\n            style={{\n              padding: \"2px 6px\", background: \"#2d2d2d\", color: \"#d4d4d4\",\n              border: \"1px solid #555\", fontFamily: \"monospace\", fontSize: \"11px\",\n              borderRadius: \"3px\", flex: 1,\n            }}\n          />\n          <button style={btnStyle} onClick={() => { clearTimeline(); forceUpdate(); }}>Clear</button>\n          <button style={btnStyle} onClick={() => forceUpdate()}>Refresh</button>\n        </div>\n        <div style={{ fontSize: \"10px\", color: \"#888\", marginBottom: \"4px\" }}>\n          {filtered.length} event{filtered.length !== 1 ? \"s\" : \"\"}\n        </div>\n        {reversed.length === 0 ? (\n          <div>No events recorded yet.</div>\n        ) : (\n          <table style={{ width: \"100%\", borderCollapse: \"collapse\" }}>\n            <thead>\n              <tr>\n                <th style={thStyle}>Time</th>\n                <th style={thStyle}>Type</th>\n                <th style={thStyle}>Field</th>\n                <th style={thStyle}>Details</th>\n              </tr>\n            </thead>\n            <tbody>\n              {reversed.slice(0, 200).map((event, i) => (\n                <tr key={i}>\n                  <td style={{ ...tdStyle, whiteSpace: \"nowrap\", color: \"#888\" }}>{formatTime(event.timestamp)}</td>\n                  <td style={{ ...tdStyle, color: typeColor(event.type), whiteSpace: \"nowrap\" }}>{event.type}</td>\n                  <td style={tdStyle}>{event.fieldName}</td>\n                  <td style={{ ...tdStyle, maxWidth: \"200px\", overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\" }}>{event.details}</td>\n                </tr>\n              ))}\n            </tbody>\n          </table>\n        )}\n      </div>\n    );\n  };\n\n  return (\n    <div style={containerStyle} data-testid=\"form-devtools\">\n      <button type=\"button\" aria-expanded={isOpen} aria-controls=\"devtools-content\" style={{ width: \"100%\", padding: \"4px 8px\", cursor: \"pointer\", background: \"#333\", display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\", border: \"none\", color: \"inherit\", font: \"inherit\" }} onClick={() => setIsOpen(!isOpen)}>\n        <span style={{ color: \"#007acc\", fontWeight: \"bold\" }}>DevTools: {configName}</span>\n        <span aria-hidden=\"true\">{isOpen ? \"\\u25BC\" : \"\\u25B2\"}</span>\n      </button>\n      {isOpen && (\n        <>\n          <div role=\"tablist\" aria-label=\"DevTools panels\" style={{ display: \"flex\", borderBottom: \"1px solid #333\", flexWrap: \"wrap\" }}>\n            <button role=\"tab\" aria-selected={activeTab === \"rules\"} aria-controls=\"devtools-panel-rules\" style={tabStyle(activeTab === \"rules\")} onClick={() => setActiveTab(\"rules\")}>Rules ({fieldNames.length})</button>\n            <button role=\"tab\" aria-selected={activeTab === \"values\"} aria-controls=\"devtools-panel-values\" style={tabStyle(activeTab === \"values\")} onClick={() => setActiveTab(\"values\")}>Values</button>\n            <button role=\"tab\" aria-selected={activeTab === \"errors\"} aria-controls=\"devtools-panel-errors\" style={tabStyle(activeTab === \"errors\")} onClick={() => setActiveTab(\"errors\")}>Errors</button>\n            <button role=\"tab\" aria-selected={activeTab === \"graph\"} aria-controls=\"devtools-panel-graph\" style={tabStyle(activeTab === \"graph\")} onClick={() => setActiveTab(\"graph\")}>Graph</button>\n            <button role=\"tab\" aria-selected={activeTab === \"performance\"} aria-controls=\"devtools-panel-performance\" style={tabStyle(activeTab === \"performance\")} onClick={() => { setActiveTab(\"performance\"); forceUpdate(); }}>Perf</button>\n            <button role=\"tab\" aria-selected={activeTab === \"depgraph\"} aria-controls=\"devtools-panel-depgraph\" style={tabStyle(activeTab === \"depgraph\")} onClick={() => setActiveTab(\"depgraph\")}>Deps</button>\n            <button role=\"tab\" aria-selected={activeTab === \"timeline\"} aria-controls=\"devtools-panel-timeline\" style={tabStyle(activeTab === \"timeline\")} onClick={() => { setActiveTab(\"timeline\"); forceUpdate(); }}>Timeline</button>\n          </div>\n          <div role=\"tabpanel\" id={`devtools-panel-${activeTab}`} aria-label={activeTab} style={{ overflow: \"auto\", maxHeight: \"calc(50vh - 60px)\", padding: \"8px\" }}>\n            {activeTab === \"rules\" && fieldNames.map(name => {\n              const state = fieldStates[name];\n              return (\n                <div key={name} style={{ marginBottom: \"8px\", borderBottom: \"1px solid #333\", paddingBottom: \"4px\" }}>\n                  <div style={{ color: \"#4ec9b0\" }}>{name}</div>\n                  <div>type: {state.type ?? \"\\u2014\"} | required: {String(state.required ?? false)} | hidden: {String(state.hidden ?? false)} | readOnly: {String(state.readOnly ?? false)}</div>\n                  {state.validate?.length ? <div>validate: {state.validate.map(v => v.name).join(\", \")}</div> : null}\n                  {state.computedValue ? <div>computedValue: {state.computedValue}</div> : null}\n                  {state.activeRuleIds?.length ? <div>activeRules: {state.activeRuleIds.join(\", \")}</div> : null}\n                </div>\n              );\n            })}\n            {activeTab === \"values\" && <pre style={{ margin: 0, whiteSpace: \"pre-wrap\" }}>{JSON.stringify(formValues, null, 2)}</pre>}\n            {activeTab === \"errors\" && (\n              <pre style={{ margin: 0, whiteSpace: \"pre-wrap\", color: formErrors && Object.keys(formErrors).length > 0 ? \"#f44747\" : \"#4ec9b0\" }}>\n                {formErrors && Object.keys(formErrors).length > 0 ? JSON.stringify(formErrors, null, 2) : \"No errors\"}\n              </pre>\n            )}\n            {activeTab === \"graph\" && (dependencyGraph.length > 0\n              ? dependencyGraph.map((line, i) => <div key={i} style={{ color: \"#ce9178\" }}>{line}</div>)\n              : <div>No dependencies defined</div>\n            )}\n            {activeTab === \"performance\" && renderPerformanceTab()}\n            {activeTab === \"depgraph\" && renderDepGraphTab()}\n            {activeTab === \"timeline\" && renderTimelineTab()}\n          </div>\n        </>\n      )}\n    </div>\n  );\n};\n","import { IRuntimeFieldState } from \"../types/IRuntimeFieldState\";\n\nexport interface IRuleTraceEvent {\n  timestamp: number;\n  type: \"evaluate\" | \"apply\" | \"revert\" | \"init\";\n  triggerField: string;\n  triggerValue: unknown;\n  affectedField: string;\n  ruleId?: string;\n  previousState?: Partial<IRuntimeFieldState>;\n  newState?: Partial<IRuntimeFieldState>;\n}\n\nlet traceEnabled = false;\nlet traceLog: IRuleTraceEvent[] = [];\nlet traceCallback: ((event: IRuleTraceEvent) => void) | null = null;\n\nexport function enableRuleTracing(callback?: (event: IRuleTraceEvent) => void): void {\n  traceEnabled = true;\n  traceLog = [];\n  traceCallback = callback ?? null;\n}\n\nexport function disableRuleTracing(): void {\n  traceEnabled = false;\n  traceCallback = null;\n}\n\nexport function traceRuleEvent(event: Omit<IRuleTraceEvent, \"timestamp\">): void {\n  if (!traceEnabled) return;\n  const fullEvent = { ...event, timestamp: Date.now() };\n  traceLog.push(fullEvent);\n  traceCallback?.(fullEvent);\n}\n\nexport function getRuleTraceLog(): IRuleTraceEvent[] {\n  return [...traceLog];\n}\n\nexport function clearRuleTraceLog(): void {\n  traceLog = [];\n}\n\nexport function isRuleTracingEnabled(): boolean {\n  return traceEnabled;\n}\n"],"mappings":"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","names":[]}