Skip to content

Commit a6ee7e7

Browse files
committed
fix(calm-visualizer): resolve React hooks and ReactFlow rendering errors
Fix multiple runtime errors preventing the visualizer from rendering: - Add Vite resolve aliases to force single React instance across all dependencies - Add dedupe configuration for React and d3 packages to prevent version conflicts - Fix controlResolver to handle missing control requirement properties - Remove invalid defaultSize prop from graph visualization panel - Install d3-selection, d3-drag, and d3-zoom as direct dependencies This resolves "Invalid hook call" and "selection5.interrupt is not a function" errors.
1 parent 8d5e9b5 commit a6ee7e7

File tree

5 files changed

+39
-7
lines changed

5 files changed

+39
-7
lines changed

calm-visualizer/package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,9 @@
5151
"class-variance-authority": "^0.7.1",
5252
"clsx": "^2.1.1",
5353
"cmdk": "^1.1.1",
54+
"d3-drag": "^3.0.0",
55+
"d3-selection": "^3.0.0",
56+
"d3-zoom": "^3.0.0",
5457
"dagre": "^0.8.5",
5558
"date-fns": "^3.6.0",
5659
"embla-carousel-react": "^8.6.0",

calm-visualizer/src/pages/Index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -532,7 +532,7 @@ const Index = () => {
532532
{!isEditorCollapsed && <ResizableHandle withHandle />}
533533

534534
{/* Graph Visualization - Always visible, takes remaining space */}
535-
<ResizablePanel defaultSize={100}>
535+
<ResizablePanel>
536536
<div className="h-full p-6">
537537
<ArchitectureGraph
538538
jsonData={parsedData}

calm-visualizer/src/utils/controlResolver.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,9 @@ export class ControlResolver {
6363
architecture.nodes?.forEach(node => {
6464
if (node.controls) {
6565
Object.values(node.controls).forEach(control => {
66-
control.requirements.forEach(req => {
67-
allUrls.add(req['config-url']);
68-
allUrls.add(req['requirement-url']);
66+
control.requirements?.forEach(req => {
67+
if (req['config-url']) allUrls.add(req['config-url']);
68+
if (req['requirement-url']) allUrls.add(req['requirement-url']);
6969
});
7070
});
7171
}
@@ -75,9 +75,9 @@ export class ControlResolver {
7575
architecture.relationships?.forEach(rel => {
7676
if (rel.controls) {
7777
Object.values(rel.controls).forEach(control => {
78-
control.requirements.forEach(req => {
79-
allUrls.add(req['config-url']);
80-
allUrls.add(req['requirement-url']);
78+
control.requirements?.forEach(req => {
79+
if (req['config-url']) allUrls.add(req['config-url']);
80+
if (req['requirement-url']) allUrls.add(req['requirement-url']);
8181
});
8282
});
8383
}

calm-visualizer/vite.config.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@ export default defineConfig(({ mode }) => ({
4040
resolve: {
4141
alias: {
4242
"@": path.resolve(__dirname, "./src"),
43+
// Force all dependencies to use the same React instance
44+
"react": path.resolve(__dirname, "./node_modules/react"),
45+
"react-dom": path.resolve(__dirname, "./node_modules/react-dom"),
4346
},
47+
dedupe: ["react", "react-dom", "d3-selection", "d3-drag", "d3-zoom"],
4448
},
4549
}));

package-lock.json

Lines changed: 25 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)