@principal-ai/subsystems-react 0.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +93 -0
- package/dist/components/ConfigurationSelector.d.ts +35 -0
- package/dist/components/ConfigurationSelector.d.ts.map +1 -0
- package/dist/components/ConfigurationSelector.js +63 -0
- package/dist/components/ConfigurationSelector.js.map +1 -0
- package/dist/components/GraphRenderer.d.ts +295 -0
- package/dist/components/GraphRenderer.d.ts.map +1 -0
- package/dist/components/GraphRenderer.js +2008 -0
- package/dist/components/GraphRenderer.js.map +1 -0
- package/dist/components/MultiCanvasRenderer.d.ts +75 -0
- package/dist/components/MultiCanvasRenderer.d.ts.map +1 -0
- package/dist/components/MultiCanvasRenderer.js +203 -0
- package/dist/components/MultiCanvasRenderer.js.map +1 -0
- package/dist/components/NodeTooltip.d.ts +24 -0
- package/dist/components/NodeTooltip.d.ts.map +1 -0
- package/dist/components/NodeTooltip.js +160 -0
- package/dist/components/NodeTooltip.js.map +1 -0
- package/dist/components/SelectionSidebar.d.ts +18 -0
- package/dist/components/SelectionSidebar.d.ts.map +1 -0
- package/dist/components/SelectionSidebar.js +190 -0
- package/dist/components/SelectionSidebar.js.map +1 -0
- package/dist/components/SequenceDiagramRenderer.d.ts +77 -0
- package/dist/components/SequenceDiagramRenderer.d.ts.map +1 -0
- package/dist/components/SequenceDiagramRenderer.js +604 -0
- package/dist/components/SequenceDiagramRenderer.js.map +1 -0
- package/dist/components/WorkflowSequenceDiagram.d.ts +63 -0
- package/dist/components/WorkflowSequenceDiagram.d.ts.map +1 -0
- package/dist/components/WorkflowSequenceDiagram.js +147 -0
- package/dist/components/WorkflowSequenceDiagram.js.map +1 -0
- package/dist/components/dashboard/DashboardRenderer.d.ts +10 -0
- package/dist/components/dashboard/DashboardRenderer.d.ts.map +1 -0
- package/dist/components/dashboard/DashboardRenderer.js +179 -0
- package/dist/components/dashboard/DashboardRenderer.js.map +1 -0
- package/dist/components/dashboard/MetricPanel.d.ts +10 -0
- package/dist/components/dashboard/MetricPanel.d.ts.map +1 -0
- package/dist/components/dashboard/MetricPanel.js +103 -0
- package/dist/components/dashboard/MetricPanel.js.map +1 -0
- package/dist/components/dashboard/MockDataProvider.d.ts +30 -0
- package/dist/components/dashboard/MockDataProvider.d.ts.map +1 -0
- package/dist/components/dashboard/MockDataProvider.js +270 -0
- package/dist/components/dashboard/MockDataProvider.js.map +1 -0
- package/dist/components/dashboard/components/BarChart.d.ts +10 -0
- package/dist/components/dashboard/components/BarChart.d.ts.map +1 -0
- package/dist/components/dashboard/components/BarChart.js +167 -0
- package/dist/components/dashboard/components/BarChart.js.map +1 -0
- package/dist/components/dashboard/components/LineChart.d.ts +10 -0
- package/dist/components/dashboard/components/LineChart.d.ts.map +1 -0
- package/dist/components/dashboard/components/LineChart.js +141 -0
- package/dist/components/dashboard/components/LineChart.js.map +1 -0
- package/dist/components/dashboard/components/MetricCard.d.ts +9 -0
- package/dist/components/dashboard/components/MetricCard.d.ts.map +1 -0
- package/dist/components/dashboard/components/MetricCard.js +163 -0
- package/dist/components/dashboard/components/MetricCard.js.map +1 -0
- package/dist/components/dashboard/components/SourceLink.d.ts +9 -0
- package/dist/components/dashboard/components/SourceLink.d.ts.map +1 -0
- package/dist/components/dashboard/components/SourceLink.js +39 -0
- package/dist/components/dashboard/components/SourceLink.js.map +1 -0
- package/dist/components/dashboard/components/TimeRangeSelector.d.ts +9 -0
- package/dist/components/dashboard/components/TimeRangeSelector.d.ts.map +1 -0
- package/dist/components/dashboard/components/TimeRangeSelector.js +167 -0
- package/dist/components/dashboard/components/TimeRangeSelector.js.map +1 -0
- package/dist/components/dashboard/components/index.d.ts +6 -0
- package/dist/components/dashboard/components/index.d.ts.map +1 -0
- package/dist/components/dashboard/components/index.js +6 -0
- package/dist/components/dashboard/components/index.js.map +1 -0
- package/dist/components/dashboard/index.d.ts +6 -0
- package/dist/components/dashboard/index.d.ts.map +1 -0
- package/dist/components/dashboard/index.js +8 -0
- package/dist/components/dashboard/index.js.map +1 -0
- package/dist/components/dashboard/types.d.ts +74 -0
- package/dist/components/dashboard/types.d.ts.map +1 -0
- package/dist/components/dashboard/types.js +8 -0
- package/dist/components/dashboard/types.js.map +1 -0
- package/dist/components/session-events/SessionEventFeed.d.ts +34 -0
- package/dist/components/session-events/SessionEventFeed.d.ts.map +1 -0
- package/dist/components/session-events/SessionEventFeed.js +1196 -0
- package/dist/components/session-events/SessionEventFeed.js.map +1 -0
- package/dist/components/session-events/index.d.ts +7 -0
- package/dist/components/session-events/index.d.ts.map +1 -0
- package/dist/components/session-events/index.js +6 -0
- package/dist/components/session-events/index.js.map +1 -0
- package/dist/components/state-view/PipelineView.d.ts +14 -0
- package/dist/components/state-view/PipelineView.d.ts.map +1 -0
- package/dist/components/state-view/PipelineView.js +195 -0
- package/dist/components/state-view/PipelineView.js.map +1 -0
- package/dist/components/state-view/index.d.ts +14 -0
- package/dist/components/state-view/index.d.ts.map +1 -0
- package/dist/components/state-view/index.js +12 -0
- package/dist/components/state-view/index.js.map +1 -0
- package/dist/components/state-view/types.d.ts +188 -0
- package/dist/components/state-view/types.d.ts.map +1 -0
- package/dist/components/state-view/types.js +10 -0
- package/dist/components/state-view/types.js.map +1 -0
- package/dist/components/state-view/useStateView.d.ts +32 -0
- package/dist/components/state-view/useStateView.d.ts.map +1 -0
- package/dist/components/state-view/useStateView.js +129 -0
- package/dist/components/state-view/useStateView.js.map +1 -0
- package/dist/contexts/GraphEditContext.d.ts +20 -0
- package/dist/contexts/GraphEditContext.d.ts.map +1 -0
- package/dist/contexts/GraphEditContext.js +8 -0
- package/dist/contexts/GraphEditContext.js.map +1 -0
- package/dist/contexts/TooltipPortalContext.d.ts +8 -0
- package/dist/contexts/TooltipPortalContext.d.ts.map +1 -0
- package/dist/contexts/TooltipPortalContext.js +8 -0
- package/dist/contexts/TooltipPortalContext.js.map +1 -0
- package/dist/edges/CustomEdge.d.ts +24 -0
- package/dist/edges/CustomEdge.d.ts.map +1 -0
- package/dist/edges/CustomEdge.js +222 -0
- package/dist/edges/CustomEdge.js.map +1 -0
- package/dist/edges/GenericEdge.d.ts +18 -0
- package/dist/edges/GenericEdge.d.ts.map +1 -0
- package/dist/edges/GenericEdge.js +10 -0
- package/dist/edges/GenericEdge.js.map +1 -0
- package/dist/graphify/anchor.d.ts +28 -0
- package/dist/graphify/anchor.d.ts.map +1 -0
- package/dist/graphify/anchor.js +132 -0
- package/dist/graphify/anchor.js.map +1 -0
- package/dist/graphify/consolidated.d.ts +210 -0
- package/dist/graphify/consolidated.d.ts.map +1 -0
- package/dist/graphify/consolidated.js +11 -0
- package/dist/graphify/consolidated.js.map +1 -0
- package/dist/graphify/ids.d.ts +19 -0
- package/dist/graphify/ids.d.ts.map +1 -0
- package/dist/graphify/ids.js +46 -0
- package/dist/graphify/ids.js.map +1 -0
- package/dist/graphify/index.d.ts +18 -0
- package/dist/graphify/index.d.ts.map +1 -0
- package/dist/graphify/index.js +12 -0
- package/dist/graphify/index.js.map +1 -0
- package/dist/graphify/kind.d.ts +23 -0
- package/dist/graphify/kind.d.ts.map +1 -0
- package/dist/graphify/kind.js +77 -0
- package/dist/graphify/kind.js.map +1 -0
- package/dist/graphify/resolve.d.ts +48 -0
- package/dist/graphify/resolve.d.ts.map +1 -0
- package/dist/graphify/resolve.js +83 -0
- package/dist/graphify/resolve.js.map +1 -0
- package/dist/graphify/signature.d.ts +87 -0
- package/dist/graphify/signature.d.ts.map +1 -0
- package/dist/graphify/signature.js +276 -0
- package/dist/graphify/signature.js.map +1 -0
- package/dist/graphify/types.d.ts +141 -0
- package/dist/graphify/types.d.ts.map +1 -0
- package/dist/graphify/types.js +8 -0
- package/dist/graphify/types.js.map +1 -0
- package/dist/hooks/useElkLayout.d.ts +66 -0
- package/dist/hooks/useElkLayout.d.ts.map +1 -0
- package/dist/hooks/useElkLayout.js +136 -0
- package/dist/hooks/useElkLayout.js.map +1 -0
- package/dist/hooks/usePathBasedEvents.d.ts +42 -0
- package/dist/hooks/usePathBasedEvents.d.ts.map +1 -0
- package/dist/hooks/usePathBasedEvents.js +119 -0
- package/dist/hooks/usePathBasedEvents.js.map +1 -0
- package/dist/hooks/useSequenceLayout.d.ts +186 -0
- package/dist/hooks/useSequenceLayout.d.ts.map +1 -0
- package/dist/hooks/useSequenceLayout.js +327 -0
- package/dist/hooks/useSequenceLayout.js.map +1 -0
- package/dist/hooks/useUndoRedo.d.ts +80 -0
- package/dist/hooks/useUndoRedo.d.ts.map +1 -0
- package/dist/hooks/useUndoRedo.js +70 -0
- package/dist/hooks/useUndoRedo.js.map +1 -0
- package/dist/index.d.ts +73 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +51 -0
- package/dist/index.js.map +1 -0
- package/dist/nodes/CustomNode.d.ts +28 -0
- package/dist/nodes/CustomNode.d.ts.map +1 -0
- package/dist/nodes/CustomNode.js +820 -0
- package/dist/nodes/CustomNode.js.map +1 -0
- package/dist/nodes/GenericNode.d.ts +20 -0
- package/dist/nodes/GenericNode.d.ts.map +1 -0
- package/dist/nodes/GenericNode.js +20 -0
- package/dist/nodes/GenericNode.js.map +1 -0
- package/dist/nodes/otel/OtelBoundaryNode.d.ts +55 -0
- package/dist/nodes/otel/OtelBoundaryNode.d.ts.map +1 -0
- package/dist/nodes/otel/OtelBoundaryNode.js +81 -0
- package/dist/nodes/otel/OtelBoundaryNode.js.map +1 -0
- package/dist/nodes/otel/OtelEventNode.d.ts +59 -0
- package/dist/nodes/otel/OtelEventNode.d.ts.map +1 -0
- package/dist/nodes/otel/OtelEventNode.js +82 -0
- package/dist/nodes/otel/OtelEventNode.js.map +1 -0
- package/dist/nodes/otel/OtelResourceNode.d.ts +53 -0
- package/dist/nodes/otel/OtelResourceNode.d.ts.map +1 -0
- package/dist/nodes/otel/OtelResourceNode.js +105 -0
- package/dist/nodes/otel/OtelResourceNode.js.map +1 -0
- package/dist/nodes/otel/OtelScopeNode.d.ts +53 -0
- package/dist/nodes/otel/OtelScopeNode.d.ts.map +1 -0
- package/dist/nodes/otel/OtelScopeNode.js +81 -0
- package/dist/nodes/otel/OtelScopeNode.js.map +1 -0
- package/dist/nodes/otel/OtelSpanConventionNode.d.ts +61 -0
- package/dist/nodes/otel/OtelSpanConventionNode.d.ts.map +1 -0
- package/dist/nodes/otel/OtelSpanConventionNode.js +131 -0
- package/dist/nodes/otel/OtelSpanConventionNode.js.map +1 -0
- package/dist/nodes/otel/index.d.ts +17 -0
- package/dist/nodes/otel/index.d.ts.map +1 -0
- package/dist/nodes/otel/index.js +13 -0
- package/dist/nodes/otel/index.js.map +1 -0
- package/dist/nodes/otel/shared/NodeBadges.d.ts +10 -0
- package/dist/nodes/otel/shared/NodeBadges.d.ts.map +1 -0
- package/dist/nodes/otel/shared/NodeBadges.js +178 -0
- package/dist/nodes/otel/shared/NodeBadges.js.map +1 -0
- package/dist/nodes/otel/shared/NodeContent.d.ts +10 -0
- package/dist/nodes/otel/shared/NodeContent.d.ts.map +1 -0
- package/dist/nodes/otel/shared/NodeContent.js +96 -0
- package/dist/nodes/otel/shared/NodeContent.js.map +1 -0
- package/dist/nodes/otel/shared/index.d.ts +8 -0
- package/dist/nodes/otel/shared/index.d.ts.map +1 -0
- package/dist/nodes/otel/shared/index.js +8 -0
- package/dist/nodes/otel/shared/index.js.map +1 -0
- package/dist/nodes/otel/shared/types.d.ts +129 -0
- package/dist/nodes/otel/shared/types.d.ts.map +1 -0
- package/dist/nodes/otel/shared/types.js +5 -0
- package/dist/nodes/otel/shared/types.js.map +1 -0
- package/dist/nodes/otel/shared/useNodeBehavior.d.ts +42 -0
- package/dist/nodes/otel/shared/useNodeBehavior.d.ts.map +1 -0
- package/dist/nodes/otel/shared/useNodeBehavior.js +61 -0
- package/dist/nodes/otel/shared/useNodeBehavior.js.map +1 -0
- package/dist/pierre/PierreFileView.d.ts +17 -0
- package/dist/pierre/PierreFileView.d.ts.map +1 -0
- package/dist/pierre/PierreFileView.js +46 -0
- package/dist/pierre/PierreFileView.js.map +1 -0
- package/dist/pierre/PierreSnippetView.d.ts +28 -0
- package/dist/pierre/PierreSnippetView.d.ts.map +1 -0
- package/dist/pierre/PierreSnippetView.js +105 -0
- package/dist/pierre/PierreSnippetView.js.map +1 -0
- package/dist/pierre/PierreThroughlineCodeView.d.ts +22 -0
- package/dist/pierre/PierreThroughlineCodeView.d.ts.map +1 -0
- package/dist/pierre/PierreThroughlineCodeView.js +206 -0
- package/dist/pierre/PierreThroughlineCodeView.js.map +1 -0
- package/dist/pierre/constructColors.d.ts +24 -0
- package/dist/pierre/constructColors.d.ts.map +1 -0
- package/dist/pierre/constructColors.js +91 -0
- package/dist/pierre/constructColors.js.map +1 -0
- package/dist/pierre/index.d.ts +12 -0
- package/dist/pierre/index.d.ts.map +1 -0
- package/dist/pierre/index.js +7 -0
- package/dist/pierre/index.js.map +1 -0
- package/dist/pierre/pierreBackground.d.ts +15 -0
- package/dist/pierre/pierreBackground.d.ts.map +1 -0
- package/dist/pierre/pierreBackground.js +31 -0
- package/dist/pierre/pierreBackground.js.map +1 -0
- package/dist/pierre/pierreFileLang.d.ts +27 -0
- package/dist/pierre/pierreFileLang.d.ts.map +1 -0
- package/dist/pierre/pierreFileLang.js +52 -0
- package/dist/pierre/pierreFileLang.js.map +1 -0
- package/dist/pierre/pierreSyntaxTheme.d.ts +11 -0
- package/dist/pierre/pierreSyntaxTheme.d.ts.map +1 -0
- package/dist/pierre/pierreSyntaxTheme.js +20 -0
- package/dist/pierre/pierreSyntaxTheme.js.map +1 -0
- package/dist/pierre/scrollAnchor.d.ts +5 -0
- package/dist/pierre/scrollAnchor.d.ts.map +1 -0
- package/dist/pierre/scrollAnchor.js +9 -0
- package/dist/pierre/scrollAnchor.js.map +1 -0
- package/dist/pierre/sliceSnippet.d.ts +10 -0
- package/dist/pierre/sliceSnippet.d.ts.map +1 -0
- package/dist/pierre/sliceSnippet.js +16 -0
- package/dist/pierre/sliceSnippet.js.map +1 -0
- package/dist/pierre/syntaxTokens.d.ts +11 -0
- package/dist/pierre/syntaxTokens.d.ts.map +1 -0
- package/dist/pierre/syntaxTokens.js +51 -0
- package/dist/pierre/syntaxTokens.js.map +1 -0
- package/dist/stories/Subsystem/ComponentGraph/fixtures.d.ts +8 -0
- package/dist/stories/Subsystem/ComponentGraph/fixtures.d.ts.map +1 -0
- package/dist/stories/Subsystem/ComponentGraph/fixtures.js +116 -0
- package/dist/stories/Subsystem/ComponentGraph/fixtures.js.map +1 -0
- package/dist/subsystem/ComponentDeclaration.d.ts +87 -0
- package/dist/subsystem/ComponentDeclaration.d.ts.map +1 -0
- package/dist/subsystem/ComponentDeclaration.js +374 -0
- package/dist/subsystem/ComponentDeclaration.js.map +1 -0
- package/dist/subsystem/FileDrawer.d.ts +17 -0
- package/dist/subsystem/FileDrawer.d.ts.map +1 -0
- package/dist/subsystem/FileDrawer.js +72 -0
- package/dist/subsystem/FileDrawer.js.map +1 -0
- package/dist/subsystem/GraphLayoutCover.d.ts +20 -0
- package/dist/subsystem/GraphLayoutCover.d.ts.map +1 -0
- package/dist/subsystem/GraphLayoutCover.js +42 -0
- package/dist/subsystem/GraphLayoutCover.js.map +1 -0
- package/dist/subsystem/SubsystemComponentGraph.d.ts +96 -0
- package/dist/subsystem/SubsystemComponentGraph.d.ts.map +1 -0
- package/dist/subsystem/SubsystemComponentGraph.js +1059 -0
- package/dist/subsystem/SubsystemComponentGraph.js.map +1 -0
- package/dist/subsystem/SubsystemFileTree.d.ts +24 -0
- package/dist/subsystem/SubsystemFileTree.d.ts.map +1 -0
- package/dist/subsystem/SubsystemFileTree.js +150 -0
- package/dist/subsystem/SubsystemFileTree.js.map +1 -0
- package/dist/subsystem/declarationRef.d.ts +39 -0
- package/dist/subsystem/declarationRef.d.ts.map +1 -0
- package/dist/subsystem/declarationRef.js +32 -0
- package/dist/subsystem/declarationRef.js.map +1 -0
- package/dist/subsystem/formatDeclaration.d.ts +11 -0
- package/dist/subsystem/formatDeclaration.d.ts.map +1 -0
- package/dist/subsystem/formatDeclaration.js +146 -0
- package/dist/subsystem/formatDeclaration.js.map +1 -0
- package/dist/subsystem/model.d.ts +353 -0
- package/dist/subsystem/model.d.ts.map +1 -0
- package/dist/subsystem/model.js +503 -0
- package/dist/subsystem/model.js.map +1 -0
- package/dist/subsystem/nodes.d.ts +69 -0
- package/dist/subsystem/nodes.d.ts.map +1 -0
- package/dist/subsystem/nodes.js +289 -0
- package/dist/subsystem/nodes.js.map +1 -0
- package/dist/subsystem/paths.d.ts +63 -0
- package/dist/subsystem/paths.d.ts.map +1 -0
- package/dist/subsystem/paths.js +86 -0
- package/dist/subsystem/paths.js.map +1 -0
- package/dist/subsystem/tokenizeComponent.d.ts +20 -0
- package/dist/subsystem/tokenizeComponent.d.ts.map +1 -0
- package/dist/subsystem/tokenizeComponent.js +56 -0
- package/dist/subsystem/tokenizeComponent.js.map +1 -0
- package/dist/subsystem/tokenizeFormatted.d.ts +12 -0
- package/dist/subsystem/tokenizeFormatted.d.ts.map +1 -0
- package/dist/subsystem/tokenizeFormatted.js +13 -0
- package/dist/subsystem/tokenizeFormatted.js.map +1 -0
- package/dist/utils/animationMapping.d.ts +53 -0
- package/dist/utils/animationMapping.d.ts.map +1 -0
- package/dist/utils/animationMapping.js +126 -0
- package/dist/utils/animationMapping.js.map +1 -0
- package/dist/utils/canvasBounds.d.ts +50 -0
- package/dist/utils/canvasBounds.d.ts.map +1 -0
- package/dist/utils/canvasBounds.js +88 -0
- package/dist/utils/canvasBounds.js.map +1 -0
- package/dist/utils/elkLayout.d.ts +137 -0
- package/dist/utils/elkLayout.d.ts.map +1 -0
- package/dist/utils/elkLayout.js +596 -0
- package/dist/utils/elkLayout.js.map +1 -0
- package/dist/utils/graphConverter.d.ts +18 -0
- package/dist/utils/graphConverter.d.ts.map +1 -0
- package/dist/utils/graphConverter.js +114 -0
- package/dist/utils/graphConverter.js.map +1 -0
- package/dist/utils/iconResolver.d.ts +29 -0
- package/dist/utils/iconResolver.d.ts.map +1 -0
- package/dist/utils/iconResolver.js +30 -0
- package/dist/utils/iconResolver.js.map +1 -0
- package/dist/utils/orientationUtils.d.ts +19 -0
- package/dist/utils/orientationUtils.d.ts.map +1 -0
- package/dist/utils/orientationUtils.js +62 -0
- package/dist/utils/orientationUtils.js.map +1 -0
- package/package.json +80 -0
- package/src/components/ConfigurationSelector.tsx +133 -0
- package/src/components/GraphRenderer.tsx +3195 -0
- package/src/components/MultiCanvasRenderer.tsx +295 -0
- package/src/components/NodeTooltip.tsx +279 -0
- package/src/components/PendingChanges.test.tsx +375 -0
- package/src/components/SelectionSidebar.tsx +352 -0
- package/src/components/SequenceDiagramRenderer.tsx +1156 -0
- package/src/components/WorkflowSequenceDiagram.tsx +270 -0
- package/src/components/dashboard/DashboardRenderer.tsx +317 -0
- package/src/components/dashboard/MetricPanel.tsx +254 -0
- package/src/components/dashboard/MockDataProvider.ts +330 -0
- package/src/components/dashboard/components/BarChart.tsx +299 -0
- package/src/components/dashboard/components/LineChart.tsx +279 -0
- package/src/components/dashboard/components/MetricCard.tsx +270 -0
- package/src/components/dashboard/components/SourceLink.tsx +63 -0
- package/src/components/dashboard/components/TimeRangeSelector.tsx +280 -0
- package/src/components/dashboard/components/index.ts +5 -0
- package/src/components/dashboard/index.ts +47 -0
- package/src/components/dashboard/types.ts +126 -0
- package/src/components/session-events/SessionEventFeed.tsx +1797 -0
- package/src/components/session-events/index.ts +13 -0
- package/src/components/state-view/PipelineView.tsx +347 -0
- package/src/components/state-view/index.ts +14 -0
- package/src/components/state-view/types.ts +261 -0
- package/src/components/state-view/useStateView.ts +205 -0
- package/src/contexts/GraphEditContext.tsx +27 -0
- package/src/contexts/TooltipPortalContext.ts +8 -0
- package/src/edges/CustomEdge.tsx +402 -0
- package/src/edges/GenericEdge.tsx +36 -0
- package/src/graphify/anchor.test.ts +124 -0
- package/src/graphify/anchor.ts +160 -0
- package/src/graphify/consolidated.ts +246 -0
- package/src/graphify/ids.ts +48 -0
- package/src/graphify/index.ts +72 -0
- package/src/graphify/kind.test.ts +108 -0
- package/src/graphify/kind.ts +120 -0
- package/src/graphify/resolve.test.ts +89 -0
- package/src/graphify/resolve.ts +115 -0
- package/src/graphify/signature.test.ts +278 -0
- package/src/graphify/signature.ts +354 -0
- package/src/graphify/types.ts +164 -0
- package/src/hooks/useElkLayout.test.ts +134 -0
- package/src/hooks/useElkLayout.ts +191 -0
- package/src/hooks/usePathBasedEvents.ts +192 -0
- package/src/hooks/useSequenceLayout.ts +543 -0
- package/src/hooks/useUndoRedo.ts +144 -0
- package/src/index.ts +341 -0
- package/src/nodes/CustomNode.tsx +1231 -0
- package/src/nodes/GenericNode.tsx +55 -0
- package/src/nodes/otel/OtelBoundaryNode.tsx +224 -0
- package/src/nodes/otel/OtelEventNode.tsx +225 -0
- package/src/nodes/otel/OtelResourceNode.tsx +251 -0
- package/src/nodes/otel/OtelScopeNode.tsx +221 -0
- package/src/nodes/otel/OtelSpanConventionNode.tsx +295 -0
- package/src/nodes/otel/index.ts +23 -0
- package/src/nodes/otel/shared/NodeBadges.tsx +295 -0
- package/src/nodes/otel/shared/NodeContent.tsx +204 -0
- package/src/nodes/otel/shared/index.ts +8 -0
- package/src/nodes/otel/shared/types.ts +138 -0
- package/src/nodes/otel/shared/useNodeBehavior.ts +114 -0
- package/src/pierre/PierreFileView.tsx +81 -0
- package/src/pierre/PierreSnippetView.tsx +184 -0
- package/src/pierre/PierreThroughlineCodeView.tsx +304 -0
- package/src/pierre/constructColors.test.ts +52 -0
- package/src/pierre/constructColors.ts +112 -0
- package/src/pierre/index.ts +18 -0
- package/src/pierre/pierreBackground.ts +33 -0
- package/src/pierre/pierreFileLang.test.ts +26 -0
- package/src/pierre/pierreFileLang.ts +55 -0
- package/src/pierre/pierreSyntaxTheme.ts +23 -0
- package/src/pierre/scrollAnchor.test.ts +13 -0
- package/src/pierre/scrollAnchor.ts +11 -0
- package/src/pierre/sliceSnippet.test.ts +21 -0
- package/src/pierre/sliceSnippet.ts +31 -0
- package/src/pierre/syntaxTokens.test.ts +35 -0
- package/src/pierre/syntaxTokens.ts +60 -0
- package/src/stories/Audit/BoundaryNodes.stories.tsx +385 -0
- package/src/stories/Audit/CanvasEdgeTypes.stories.tsx +1448 -0
- package/src/stories/Audit/CanvasNodeTypes.stories.tsx +1049 -0
- package/src/stories/Audit/ColorPriority.stories.tsx +895 -0
- package/src/stories/Audit/DiamondBadges.stories.tsx +629 -0
- package/src/stories/Audit/NodeDimensionsTesting.stories.tsx +724 -0
- package/src/stories/Audit/NodeFieldsAudit.stories.tsx +996 -0
- package/src/stories/Audit/NodeFontSizeTesting.stories.tsx +715 -0
- package/src/stories/Audit/NodeShapes.stories.tsx +1208 -0
- package/src/stories/Audit/WideNodesTesting.stories.tsx +1045 -0
- package/src/stories/Components/DashboardRenderer.stories.tsx +263 -0
- package/src/stories/Components/GraphRenderer.stories.tsx +3236 -0
- package/src/stories/Components/MultiCanvasRenderer.stories.tsx +370 -0
- package/src/stories/Components/SequenceDiagram.stories.tsx +255 -0
- package/src/stories/Components/StateView.stories.tsx +417 -0
- package/src/stories/Components/TraceViewer.stories.tsx +442 -0
- package/src/stories/Components/WorkflowSequenceDiagram.stories.tsx +802 -0
- package/src/stories/Features/AnimationWorkshop.stories.tsx +727 -0
- package/src/stories/Features/ChangeTypeVisual.stories.tsx +67 -0
- package/src/stories/Features/EventDrivenAnimations.stories.tsx +513 -0
- package/src/stories/Features/MultiConfig.stories.tsx +539 -0
- package/src/stories/Introduction.mdx +34 -0
- package/src/stories/Layout/ElkEdgeRouting.stories.tsx +539 -0
- package/src/stories/Layout/GraphOrientation.stories.tsx +500 -0
- package/src/stories/Layout/MultiDirectionalConnections.stories.tsx +352 -0
- package/src/stories/Nodes/NodeDefinitionComparison.stories.tsx +560 -0
- package/src/stories/Nodes/NodeNameFallbacks.stories.tsx +491 -0
- package/src/stories/Nodes/NumericColors.stories.tsx +440 -0
- package/src/stories/OTEL/EventNameDisplay.stories.tsx +694 -0
- package/src/stories/OTEL/EventNameFallback.stories.tsx +578 -0
- package/src/stories/OTEL/OtelComponents.stories.tsx +422 -0
- package/src/stories/OTEL/OtelNodeTypesPrototype.stories.tsx +806 -0
- package/src/stories/OTEL/RawEventCards.stories.tsx +57 -0
- package/src/stories/OTEL/SpanBadges.stories.tsx +840 -0
- package/src/stories/OTEL/ValidationEventsCanvas.stories.tsx +209 -0
- package/src/stories/Pierre/CodeView.stories.tsx +219 -0
- package/src/stories/RealWorld/BacklogMdCanvases.stories.tsx +721 -0
- package/src/stories/RealWorld/FileCitySequence.stories.tsx +516 -0
- package/src/stories/RealWorld/RealCanvasFiles.stories.tsx +336 -0
- package/src/stories/Subsystem/ComponentDeclarationAudit.stories.tsx +321 -0
- package/src/stories/Subsystem/ComponentGraph/Appearance.stories.tsx +365 -0
- package/src/stories/Subsystem/ComponentGraph/Basics.stories.tsx +137 -0
- package/src/stories/Subsystem/ComponentGraph/Captures.stories.tsx +238 -0
- package/src/stories/Subsystem/ComponentGraph/DetailPanel.stories.tsx +315 -0
- package/src/stories/Subsystem/ComponentGraph/Flows.stories.tsx +239 -0
- package/src/stories/Subsystem/ComponentGraph/FrameworkStereotype.stories.tsx +216 -0
- package/src/stories/Subsystem/ComponentGraph/GraphTitle.stories.tsx +70 -0
- package/src/stories/Subsystem/ComponentGraph/Processes.stories.tsx +68 -0
- package/src/stories/Subsystem/ComponentGraph/Scenarios.stories.tsx +959 -0
- package/src/stories/Subsystem/ComponentGraph/Spotlights.stories.tsx +681 -0
- package/src/stories/Subsystem/ComponentGraph/fixtures.ts +129 -0
- package/src/stories/__traces__/test-run.canvas.json +241 -0
- package/src/stories/data/activity-feed-analytics.dashboard.json +300 -0
- package/src/stories/data/file-city-images-transformed.otel.canvas.json +295 -0
- package/src/stories/data/file-city-workflows.json +269 -0
- package/src/stories/data/graph-converter-test-execution.json +443 -0
- package/src/stories/data/graph-converter-test.workflow.json +105 -0
- package/src/stories/data/graph-converter-validated-execution.json +58 -0
- package/src/stories/data/opencode-session-raw-events.json +273396 -0
- package/src/subsystem/ComponentDeclaration.tsx +643 -0
- package/src/subsystem/FileDrawer.tsx +106 -0
- package/src/subsystem/GraphLayoutCover.tsx +69 -0
- package/src/subsystem/SubsystemComponentGraph.tsx +1644 -0
- package/src/subsystem/SubsystemFileTree.tsx +190 -0
- package/src/subsystem/declarationRef.test.ts +33 -0
- package/src/subsystem/declarationRef.ts +63 -0
- package/src/subsystem/formatDeclaration.ts +174 -0
- package/src/subsystem/model.test.ts +244 -0
- package/src/subsystem/model.ts +850 -0
- package/src/subsystem/nodes.test.ts +56 -0
- package/src/subsystem/nodes.tsx +443 -0
- package/src/subsystem/paths.test.ts +123 -0
- package/src/subsystem/paths.ts +127 -0
- package/src/subsystem/tokenizeComponent.ts +70 -0
- package/src/subsystem/tokenizeFormatted.ts +19 -0
- package/src/utils/animationMapping.ts +166 -0
- package/src/utils/canvasBounds.ts +146 -0
- package/src/utils/elkLayout.test.ts +240 -0
- package/src/utils/elkLayout.ts +779 -0
- package/src/utils/graphConverter.ts +148 -0
- package/src/utils/iconResolver.tsx +53 -0
- package/src/utils/orientationUtils.ts +73 -0
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { describe, expect, test } from 'bun:test';
|
|
2
|
+
import type { GraphifyEdge, GraphifyNode } from './types';
|
|
3
|
+
import { inferGraphifyKind, kindsMatch } from './kind';
|
|
4
|
+
|
|
5
|
+
function node(
|
|
6
|
+
id: string,
|
|
7
|
+
label: string,
|
|
8
|
+
sourceFile = 'src/Foo.ts',
|
|
9
|
+
extra?: Partial<GraphifyNode>,
|
|
10
|
+
): GraphifyNode {
|
|
11
|
+
return {
|
|
12
|
+
id,
|
|
13
|
+
label,
|
|
14
|
+
file_type: 'code',
|
|
15
|
+
source_file: sourceFile,
|
|
16
|
+
source_location: 'L1',
|
|
17
|
+
...extra,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function edge(
|
|
22
|
+
source: string,
|
|
23
|
+
target: string,
|
|
24
|
+
relation: string,
|
|
25
|
+
): GraphifyEdge {
|
|
26
|
+
return {
|
|
27
|
+
source,
|
|
28
|
+
target,
|
|
29
|
+
relation,
|
|
30
|
+
confidence: 'EXTRACTED',
|
|
31
|
+
source_file: 'src/Foo.ts',
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
describe('inferGraphifyKind', () => {
|
|
36
|
+
test('outgoing method edges → class', () => {
|
|
37
|
+
const n = node('cls', 'SessionReader');
|
|
38
|
+
const edges = [edge('cls', 'cls_get', 'method')];
|
|
39
|
+
const r = inferGraphifyKind(n, edges);
|
|
40
|
+
expect(r.kind).toBe('class');
|
|
41
|
+
expect(r.evidence[0]).toContain('outgoing method');
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
test('call-style label + no methods → function', () => {
|
|
45
|
+
const n = node('fn', 'SubsystemModelView()');
|
|
46
|
+
const r = inferGraphifyKind(n, []);
|
|
47
|
+
expect(r.kind).toBe('function');
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
test('method-style label + incoming method → method', () => {
|
|
51
|
+
const n = node('m', '.validate()');
|
|
52
|
+
const edges = [edge('cls', 'm', 'method')];
|
|
53
|
+
const r = inferGraphifyKind(n, edges);
|
|
54
|
+
expect(r.kind).toBe('method');
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
test('method takes priority over call-style function', () => {
|
|
58
|
+
const n = node('m', '.generate()');
|
|
59
|
+
const edges = [edge('CodeGenerator', 'm', 'method')];
|
|
60
|
+
expect(inferGraphifyKind(n, edges).kind).toBe('method');
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
test('incoming implements → type', () => {
|
|
64
|
+
const n = node('iface', 'StoryboardRegistryInterface');
|
|
65
|
+
const edges = [edge('MockRegistry', 'iface', 'implements')];
|
|
66
|
+
expect(inferGraphifyKind(n, edges).kind).toBe('type');
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
test('filename label → module', () => {
|
|
70
|
+
const n = node(
|
|
71
|
+
'mod',
|
|
72
|
+
'SubsystemModelView.tsx',
|
|
73
|
+
'packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx',
|
|
74
|
+
);
|
|
75
|
+
expect(inferGraphifyKind(n, []).kind).toBe('module');
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
test('bare symbol with no edges → unknown', () => {
|
|
79
|
+
const n = node('x', 'INSPECTOR_KEYS');
|
|
80
|
+
expect(inferGraphifyKind(n, []).kind).toBe('unknown');
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
test('class wins over implements on same node', () => {
|
|
84
|
+
const n = node('cls', 'TypeScriptGenerator');
|
|
85
|
+
const edges = [
|
|
86
|
+
edge('cls', 'cls_gen', 'method'),
|
|
87
|
+
edge('Other', 'cls', 'implements'),
|
|
88
|
+
];
|
|
89
|
+
expect(inferGraphifyKind(n, edges).kind).toBe('class');
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
describe('kindsMatch', () => {
|
|
94
|
+
test('exact string equality', () => {
|
|
95
|
+
expect(kindsMatch('function', 'function')).toBe(true);
|
|
96
|
+
expect(kindsMatch('class', 'function')).toBe(false);
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
test('external / missing claimed skips', () => {
|
|
100
|
+
expect(kindsMatch('external', 'function')).toBe(true);
|
|
101
|
+
expect(kindsMatch(undefined, 'unknown')).toBe(true);
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
test('no class≈function alias', () => {
|
|
105
|
+
expect(kindsMatch('class', 'function')).toBe(false);
|
|
106
|
+
expect(kindsMatch('function', 'class')).toBe(false);
|
|
107
|
+
});
|
|
108
|
+
});
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Infer a subsystem-style kind from a graphify node + edges.
|
|
3
|
+
*
|
|
4
|
+
* Graphify does not store `kind` on nodes (everything is `file_type: "code"`).
|
|
5
|
+
* Class vs function vs type is derived from structure — same rules as
|
|
6
|
+
* `GraphifyComponentDetail` in consolidated.ts.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { GraphifyEdge, GraphifyNode } from './types';
|
|
10
|
+
|
|
11
|
+
/** Kind inferred from graph structure (never read off the node). */
|
|
12
|
+
export type InferredGraphifyKind =
|
|
13
|
+
| 'class'
|
|
14
|
+
| 'function'
|
|
15
|
+
| 'method'
|
|
16
|
+
| 'type'
|
|
17
|
+
| 'module'
|
|
18
|
+
| 'unknown';
|
|
19
|
+
|
|
20
|
+
export interface InferGraphifyKindResult {
|
|
21
|
+
kind: InferredGraphifyKind;
|
|
22
|
+
evidence: string[];
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const FILE_LABEL_RE =
|
|
26
|
+
/\.(py|js|jsx|ts|tsx|mjs|cjs|java|go|rs|rb|php|cs|cpp|cc|c|h|hpp|pas|pp|dpr|swift|kt|scala|dart|lua|pl|pm|ex|exs|zig|vue|svelte)$/i;
|
|
27
|
+
|
|
28
|
+
function isMethodStyleLabel(label: string): boolean {
|
|
29
|
+
return label.trim().startsWith('.');
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function isCallStyleLabel(label: string): boolean {
|
|
33
|
+
return label.trim().endsWith('()');
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function isFilenameLabel(label: string, sourceFile: string): boolean {
|
|
37
|
+
const trimmed = label.trim();
|
|
38
|
+
if (FILE_LABEL_RE.test(trimmed)) return true;
|
|
39
|
+
if (!sourceFile) return false;
|
|
40
|
+
const base = sourceFile.replace(/\\/g, '/').split('/').pop() ?? '';
|
|
41
|
+
return !!base && trimmed === base;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Infer kind for a definition node from its label and incident edges.
|
|
46
|
+
*
|
|
47
|
+
* Priority: class → method → function → type → module → unknown.
|
|
48
|
+
*/
|
|
49
|
+
export function inferGraphifyKind(
|
|
50
|
+
node: GraphifyNode,
|
|
51
|
+
edges: readonly GraphifyEdge[],
|
|
52
|
+
): InferGraphifyKindResult {
|
|
53
|
+
const id = String(node.id);
|
|
54
|
+
const label = String(node.label ?? '').trim();
|
|
55
|
+
const sourceFile =
|
|
56
|
+
typeof node.source_file === 'string' ? node.source_file : '';
|
|
57
|
+
const evidence: string[] = [];
|
|
58
|
+
|
|
59
|
+
const outgoingMethod = edges.filter(
|
|
60
|
+
(e) => String(e.source) === id && e.relation === 'method',
|
|
61
|
+
);
|
|
62
|
+
if (outgoingMethod.length > 0) {
|
|
63
|
+
evidence.push(`${outgoingMethod.length} outgoing method edge(s)`);
|
|
64
|
+
return { kind: 'class', evidence };
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const incomingMethod = edges.filter(
|
|
68
|
+
(e) => String(e.target) === id && e.relation === 'method',
|
|
69
|
+
);
|
|
70
|
+
if (incomingMethod.length > 0 && isMethodStyleLabel(label)) {
|
|
71
|
+
evidence.push(
|
|
72
|
+
`incoming method edge from ${String(incomingMethod[0]!.source)}`,
|
|
73
|
+
`label ${label}`,
|
|
74
|
+
);
|
|
75
|
+
return { kind: 'method', evidence };
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
if (isCallStyleLabel(label)) {
|
|
79
|
+
evidence.push(`call-style label ${label}`);
|
|
80
|
+
return { kind: 'function', evidence };
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const incomingImplements = edges.filter(
|
|
84
|
+
(e) => String(e.target) === id && e.relation === 'implements',
|
|
85
|
+
);
|
|
86
|
+
if (incomingImplements.length > 0) {
|
|
87
|
+
evidence.push(
|
|
88
|
+
`${incomingImplements.length} incoming implements edge(s)`,
|
|
89
|
+
);
|
|
90
|
+
return { kind: 'type', evidence };
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (node.type === 'module' || isFilenameLabel(label, sourceFile)) {
|
|
94
|
+
evidence.push(
|
|
95
|
+
node.type === 'module'
|
|
96
|
+
? 'node.type=module'
|
|
97
|
+
: `filename label ${label}`,
|
|
98
|
+
);
|
|
99
|
+
return { kind: 'module', evidence };
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
if (label) evidence.push(`unclassified label ${label}`);
|
|
103
|
+
else evidence.push('no classifying signals');
|
|
104
|
+
return { kind: 'unknown', evidence };
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/** Type-family constructs all infer as the coarse 'type' — graph structure
|
|
108
|
+
* (implements/references edges) cannot sub-classify interface vs alias vs
|
|
109
|
+
* enum vs variable; only the source declaration can. */
|
|
110
|
+
const TYPE_FAMILY: ReadonlySet<string> = new Set(['interface', 'type_alias', 'enum']);
|
|
111
|
+
|
|
112
|
+
/** Strict claimed-vs-inferred check, with type-family compatibility. */
|
|
113
|
+
export function kindsMatch(
|
|
114
|
+
claimed: string | undefined,
|
|
115
|
+
inferred: InferredGraphifyKind,
|
|
116
|
+
): boolean {
|
|
117
|
+
if (!claimed || claimed === 'external') return true;
|
|
118
|
+
if (TYPE_FAMILY.has(claimed)) return inferred === 'type';
|
|
119
|
+
return claimed === inferred;
|
|
120
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { describe, expect, test } from 'bun:test';
|
|
2
|
+
import type { GraphifyNode } from './types';
|
|
3
|
+
import {
|
|
4
|
+
createGraphifyTypeResolver,
|
|
5
|
+
normalizeGraphifyLabel,
|
|
6
|
+
resolveGraphifyTypeRef,
|
|
7
|
+
} from './resolve';
|
|
8
|
+
|
|
9
|
+
function node(id: string, label: string, sourceFile: string, location?: string): GraphifyNode {
|
|
10
|
+
return { id, label, file_type: 'code', source_file: sourceFile, source_location: location ?? '' };
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const corpus: GraphifyNode[] = [
|
|
14
|
+
// Real definition of SessionReader in another file.
|
|
15
|
+
node('src/session_reader.ts#sessionreader', 'SessionReader', 'src/session_reader.ts', 'L12'),
|
|
16
|
+
// Same-name class in a second package → ambiguous stub target.
|
|
17
|
+
node('other/pkg/reader.ts#sessionreader', 'SessionReader', 'other/pkg/reader.ts', 'L3'),
|
|
18
|
+
// Sourceless stub left behind by an ambiguous reference.
|
|
19
|
+
node('stub-sessionreader', 'SessionReader', ''),
|
|
20
|
+
// A file node — never a resolution candidate.
|
|
21
|
+
node('src/session_reader_ts', 'session_reader.ts', 'src/session_reader.ts'),
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
describe('normalizeGraphifyLabel', () => {
|
|
25
|
+
test('mirrors graphify normalise_callable_label', () => {
|
|
26
|
+
expect(normalizeGraphifyLabel(' SessionReader() ')).toBe('sessionreader');
|
|
27
|
+
expect(normalizeGraphifyLabel('.method()')).toBe('method');
|
|
28
|
+
expect(normalizeGraphifyLabel('SessionReader')).toBe('sessionreader');
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
describe('createGraphifyTypeResolver', () => {
|
|
33
|
+
test('resolved when the target is a real definition', () => {
|
|
34
|
+
const resolver = createGraphifyTypeResolver(corpus);
|
|
35
|
+
const r = resolver.resolve('src/session_reader.ts#sessionreader');
|
|
36
|
+
expect(r.status).toBe('resolved');
|
|
37
|
+
expect(r.node?.source_file).toBe('src/session_reader.ts');
|
|
38
|
+
expect(r.node?.source_location).toBe('L12');
|
|
39
|
+
expect(r.candidates).toHaveLength(0);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
test('unique same-label definition folds onto the stub (rewire parity)', () => {
|
|
43
|
+
const single = [node('a.ts#parser', 'Parser', 'a.ts', 'L1'), node('stub-parser', 'Parser', '')];
|
|
44
|
+
const r = createGraphifyTypeResolver(single).resolve('stub-parser');
|
|
45
|
+
expect(r.status).toBe('resolved');
|
|
46
|
+
expect(r.node?.id).toBe('a.ts#parser');
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
test('ambiguous when multiple definitions share the label', () => {
|
|
50
|
+
const r = createGraphifyTypeResolver(corpus).resolve('stub-sessionreader', 'SessionReader');
|
|
51
|
+
expect(r.status).toBe('ambiguous');
|
|
52
|
+
expect(r.candidates).toHaveLength(2);
|
|
53
|
+
// The stub itself is returned as the node.
|
|
54
|
+
expect(r.node?.id).toBe('stub-sessionreader');
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
test('unresolved when nothing defines the name (primitives / externals)', () => {
|
|
58
|
+
const withStub = [...corpus, node('stub-string', 'string', '')];
|
|
59
|
+
const r = createGraphifyTypeResolver(withStub).resolve('stub-string', 'string');
|
|
60
|
+
expect(r.status).toBe('unresolved');
|
|
61
|
+
expect(r.candidates).toHaveLength(0);
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
test('missing for absent ids and missing nodeIds', () => {
|
|
65
|
+
const resolver = createGraphifyTypeResolver(corpus);
|
|
66
|
+
expect(resolver.resolve(undefined).status).toBe('missing');
|
|
67
|
+
expect(resolver.resolve('nope').status).toBe('missing');
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
test('file nodes are not candidates; folded tier matches case-insensitively', () => {
|
|
71
|
+
const corpus2 = [
|
|
72
|
+
node('f_ts', 'reader.ts', 'x/reader.ts'),
|
|
73
|
+
node('x/reader_ts', 'Reader', 'x/Reader.ts'),
|
|
74
|
+
node('stub-reader', 'Reader', ''),
|
|
75
|
+
];
|
|
76
|
+
const r = createGraphifyTypeResolver(corpus2).resolve('stub-reader');
|
|
77
|
+
expect(r.status).toBe('resolved');
|
|
78
|
+
expect(r.node?.id).toBe('x/reader_ts');
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
describe('resolveGraphifyTypeRef', () => {
|
|
83
|
+
test('one-shot wrapper reads nodeId off the ref', () => {
|
|
84
|
+
const resolved = resolveGraphifyTypeRef(corpus, { nodeId: 'src/session_reader.ts#sessionreader' });
|
|
85
|
+
expect(resolved.status).toBe('resolved');
|
|
86
|
+
const missing = resolveGraphifyTypeRef(corpus, undefined);
|
|
87
|
+
expect(missing.status).toBe('missing');
|
|
88
|
+
});
|
|
89
|
+
});
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve graphify type-name references to their defining nodes.
|
|
3
|
+
*
|
|
4
|
+
* A `references` edge (`parameter_type`, `return_type`, `field`,
|
|
5
|
+
* `generic_arg`) targets either the type's real definition node or a
|
|
6
|
+
* *sourceless stub* graphify left behind when the name could not be uniquely
|
|
7
|
+
* resolved at extraction time (mirrors `_rewire_unique_stub_nodes` there:
|
|
8
|
+
* ambiguous same-label definitions and never-defined names stay stubs).
|
|
9
|
+
*
|
|
10
|
+
* This module applies the same conservative matching from the consumer side so
|
|
11
|
+
* UI click targets can distinguish "jump to definition" from "N candidates"
|
|
12
|
+
* from "not in this corpus".
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import type { GraphifyNode } from './types';
|
|
16
|
+
import type { GraphifyReferenceInfo } from './consolidated';
|
|
17
|
+
|
|
18
|
+
/** Outcome of resolving one type reference. */
|
|
19
|
+
export type GraphifyTypeRefStatus =
|
|
20
|
+
/** Target node is a real definition — jump to its `source_file`. */
|
|
21
|
+
| 'resolved'
|
|
22
|
+
/** Target was a stub and multiple same-label definitions exist. */
|
|
23
|
+
| 'ambiguous'
|
|
24
|
+
/** Target was a stub and nothing in the corpus defines the name. */
|
|
25
|
+
| 'unresolved'
|
|
26
|
+
/** No nodeId on the ref, or the id is not in the graph. */
|
|
27
|
+
| 'missing';
|
|
28
|
+
|
|
29
|
+
export interface GraphifyTypeRefResolution {
|
|
30
|
+
status: GraphifyTypeRefStatus;
|
|
31
|
+
/** The definition node when resolved; the stub itself otherwise. */
|
|
32
|
+
node: GraphifyNode | null;
|
|
33
|
+
/** Same-label definitions when the target was an unresolved stub. */
|
|
34
|
+
candidates: GraphifyNode[];
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Mirror graphify's `normalise_callable_label`: trim, strip surrounding
|
|
39
|
+
* parens/leading dots, lowercase. `SessionReader()` and `sessionreader`
|
|
40
|
+
* collapse to the same key.
|
|
41
|
+
*/
|
|
42
|
+
export function normalizeGraphifyLabel(label: string): string {
|
|
43
|
+
return label
|
|
44
|
+
.trim()
|
|
45
|
+
.replace(/^[()]+|[()]+$/g, '')
|
|
46
|
+
.replace(/^\.+/, '')
|
|
47
|
+
.toLowerCase();
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const FILE_SUFFIX_RE =
|
|
51
|
+
/\.(py|js|jsx|ts|tsx|mjs|cjs|java|go|rs|rb|php|cs|cpp|cc|c|h|hpp|pas|pp|dpr|swift|kt|scala|dart|lua|pl|pm|ex|exs|zig|vue|svelte)$/i;
|
|
52
|
+
|
|
53
|
+
function isDefinition(node: GraphifyNode): boolean {
|
|
54
|
+
if (node.file_type !== 'code') return false;
|
|
55
|
+
const file = typeof node.source_file === 'string' ? node.source_file : '';
|
|
56
|
+
if (!file) return false;
|
|
57
|
+
const label = typeof node.label === 'string' ? node.label.trim() : '';
|
|
58
|
+
return !!label && !FILE_SUFFIX_RE.test(label);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** Prebuilt lookup state — build once per graph, resolve many refs. */
|
|
62
|
+
export interface GraphifyTypeResolver {
|
|
63
|
+
resolve(nodeId: string | undefined, fallbackLabel?: string): GraphifyTypeRefResolution;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export function createGraphifyTypeResolver(nodes: readonly GraphifyNode[]): GraphifyTypeResolver {
|
|
67
|
+
const byId = new Map<string, GraphifyNode>();
|
|
68
|
+
const defsByExactLabel = new Map<string, GraphifyNode[]>();
|
|
69
|
+
const defsByFoldedLabel = new Map<string, GraphifyNode[]>();
|
|
70
|
+
|
|
71
|
+
for (const node of nodes) {
|
|
72
|
+
byId.set(String(node.id), node);
|
|
73
|
+
if (!isDefinition(node)) continue;
|
|
74
|
+
const label = String(node.label).trim();
|
|
75
|
+
(defsByExactLabel.get(label) ?? defsByExactLabel.set(label, []).get(label)!).push(node);
|
|
76
|
+
const folded = normalizeGraphifyLabel(label);
|
|
77
|
+
if (!folded) continue;
|
|
78
|
+
(defsByFoldedLabel.get(folded) ?? defsByFoldedLabel.set(folded, []).get(folded)!).push(node);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function resolve(nodeId: string | undefined, fallbackLabel?: string): GraphifyTypeRefResolution {
|
|
82
|
+
if (!nodeId) return { status: 'missing', node: null, candidates: [] };
|
|
83
|
+
const target = byId.get(nodeId);
|
|
84
|
+
if (!target) return { status: 'missing', node: null, candidates: [] };
|
|
85
|
+
// Real definition (graphify rewired the reference onto it, or it lived in
|
|
86
|
+
// the referencing file all along).
|
|
87
|
+
if (isDefinition(target)) return { status: 'resolved', node: target, candidates: [] };
|
|
88
|
+
|
|
89
|
+
// Sourceless stub — try the rewire tiers: exact label, then folded.
|
|
90
|
+
const label = typeof target.label === 'string' && target.label.trim() ? target.label.trim() : (fallbackLabel ?? '');
|
|
91
|
+
let candidates = defsByExactLabel.get(label) ?? [];
|
|
92
|
+
if (candidates.length !== 1) {
|
|
93
|
+
const folded = normalizeGraphifyLabel(label);
|
|
94
|
+
candidates = folded ? (defsByFoldedLabel.get(folded) ?? []) : [];
|
|
95
|
+
}
|
|
96
|
+
if (candidates.length === 1) {
|
|
97
|
+
// Unique match — same fold `_rewire_unique_stub_nodes` performs at
|
|
98
|
+
// extraction time; graphs built before that pass land here instead.
|
|
99
|
+
return { status: 'resolved', node: candidates[0]!, candidates };
|
|
100
|
+
}
|
|
101
|
+
if (candidates.length > 1) return { status: 'ambiguous', node: target, candidates };
|
|
102
|
+
return { status: 'unresolved', node: target, candidates: [] };
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
return { resolve };
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/** One-shot convenience over {@link createGraphifyTypeResolver}. */
|
|
109
|
+
export function resolveGraphifyTypeRef(
|
|
110
|
+
nodes: readonly GraphifyNode[],
|
|
111
|
+
ref: Pick<GraphifyReferenceInfo, 'nodeId'> | { nodeId?: string } | undefined,
|
|
112
|
+
fallbackLabel?: string,
|
|
113
|
+
): GraphifyTypeRefResolution {
|
|
114
|
+
return createGraphifyTypeResolver(nodes).resolve(ref?.nodeId, fallbackLabel);
|
|
115
|
+
}
|