@flanksource/clicky-ui 0.3.43 → 0.3.45
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 +2 -0
- package/dist/ai.cjs +4 -2
- package/dist/ai.cjs.map +1 -1
- package/dist/ai.js +3 -1
- package/dist/components/MdxEditorField.cjs +40 -22
- package/dist/components/MdxEditorField.cjs.map +1 -1
- package/dist/components/MdxEditorField.d.ts.map +1 -1
- package/dist/components/MdxEditorField.js +41 -23
- package/dist/components/MdxEditorField.js.map +1 -1
- package/dist/components/json-schema-form-item-summary.cjs +6 -1
- package/dist/components/json-schema-form-item-summary.cjs.map +1 -1
- package/dist/components/json-schema-form-item-summary.d.ts.map +1 -1
- package/dist/components/json-schema-form-item-summary.js +6 -1
- package/dist/components/json-schema-form-item-summary.js.map +1 -1
- package/dist/data/CodeBlock.cjs +3 -2
- package/dist/data/CodeBlock.cjs.map +1 -1
- package/dist/data/CodeBlock.d.ts +3 -1
- package/dist/data/CodeBlock.d.ts.map +1 -1
- package/dist/data/CodeBlock.js +3 -2
- package/dist/data/CodeBlock.js.map +1 -1
- package/dist/data/CodeLine.cjs +22 -0
- package/dist/data/CodeLine.cjs.map +1 -0
- package/dist/data/CodeLine.d.ts +8 -0
- package/dist/data/CodeLine.d.ts.map +1 -0
- package/dist/data/CodeLine.js +22 -0
- package/dist/data/CodeLine.js.map +1 -0
- package/dist/data/GraphDiagram.cjs +18 -6
- package/dist/data/GraphDiagram.cjs.map +1 -1
- package/dist/data/GraphDiagram.d.ts +9 -1
- package/dist/data/GraphDiagram.d.ts.map +1 -1
- package/dist/data/GraphDiagram.js +18 -6
- package/dist/data/GraphDiagram.js.map +1 -1
- package/dist/data/GraphDiagramNodes.cjs +38 -29
- package/dist/data/GraphDiagramNodes.cjs.map +1 -1
- package/dist/data/GraphDiagramNodes.d.ts +8 -2
- package/dist/data/GraphDiagramNodes.d.ts.map +1 -1
- package/dist/data/GraphDiagramNodes.js +38 -29
- package/dist/data/GraphDiagramNodes.js.map +1 -1
- package/dist/data/JsonView.cjs +118 -49
- package/dist/data/JsonView.cjs.map +1 -1
- package/dist/data/JsonView.d.ts +13 -10
- package/dist/data/JsonView.d.ts.map +1 -1
- package/dist/data/JsonView.js +118 -49
- package/dist/data/JsonView.js.map +1 -1
- package/dist/data/MarkdownEditor.cjs +2 -2
- package/dist/data/MarkdownEditor.cjs.map +1 -1
- package/dist/data/MarkdownEditor.js +2 -2
- package/dist/data/MarkdownEditor.js.map +1 -1
- package/dist/data/ai/AdvancedChatConfig.cjs +90 -249
- package/dist/data/ai/AdvancedChatConfig.cjs.map +1 -1
- package/dist/data/ai/AdvancedChatConfig.d.ts +2 -5
- package/dist/data/ai/AdvancedChatConfig.d.ts.map +1 -1
- package/dist/data/ai/AdvancedChatConfig.js +91 -250
- package/dist/data/ai/AdvancedChatConfig.js.map +1 -1
- package/dist/data/ai/ChatButton.cjs +2 -0
- package/dist/data/ai/ChatButton.cjs.map +1 -1
- package/dist/data/ai/ChatButton.d.ts +1 -1
- package/dist/data/ai/ChatButton.d.ts.map +1 -1
- package/dist/data/ai/ChatButton.js +2 -0
- package/dist/data/ai/ChatButton.js.map +1 -1
- package/dist/data/ai/ChatFab.cjs +5 -1
- package/dist/data/ai/ChatFab.cjs.map +1 -1
- package/dist/data/ai/ChatFab.d.ts +5 -1
- package/dist/data/ai/ChatFab.d.ts.map +1 -1
- package/dist/data/ai/ChatFab.js +5 -1
- package/dist/data/ai/ChatFab.js.map +1 -1
- package/dist/data/ai/ChatWindow.cjs +2 -8
- package/dist/data/ai/ChatWindow.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.js +2 -8
- package/dist/data/ai/ChatWindow.js.map +1 -1
- package/dist/data/ai/ChatWindow.runtime.cjs +0 -5
- package/dist/data/ai/ChatWindow.runtime.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.runtime.d.ts +0 -2
- package/dist/data/ai/ChatWindow.runtime.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.runtime.js +0 -5
- package/dist/data/ai/ChatWindow.runtime.js.map +1 -1
- package/dist/data/ai/PromptRunEditor/runtimeActions.cjs +2 -2
- package/dist/data/ai/PromptRunEditor/runtimeActions.cjs.map +1 -1
- package/dist/data/ai/PromptRunEditor/runtimeActions.d.ts.map +1 -1
- package/dist/data/ai/PromptRunEditor/runtimeActions.js +2 -2
- package/dist/data/ai/PromptRunEditor/runtimeActions.js.map +1 -1
- package/dist/data/ai/SessionInspector.approvals.cjs +3 -6
- package/dist/data/ai/SessionInspector.approvals.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.approvals.js +3 -6
- package/dist/data/ai/SessionInspector.approvals.js.map +1 -1
- package/dist/data/ai/SessionViewer.cjs +13 -4
- package/dist/data/ai/SessionViewer.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.d.ts +5 -1
- package/dist/data/ai/SessionViewer.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.header.cjs +1 -1
- package/dist/data/ai/SessionViewer.header.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.header.js +1 -1
- package/dist/data/ai/SessionViewer.header.js.map +1 -1
- package/dist/data/ai/SessionViewer.js +13 -4
- package/dist/data/ai/SessionViewer.js.map +1 -1
- package/dist/data/ai/SessionViewer.model.cjs +2 -0
- package/dist/data/ai/SessionViewer.model.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.model.d.ts +1 -0
- package/dist/data/ai/SessionViewer.model.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.model.js +2 -0
- package/dist/data/ai/SessionViewer.model.js.map +1 -1
- package/dist/data/ai/SessionViewer.rows.cjs +41 -27
- package/dist/data/ai/SessionViewer.rows.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.rows.d.ts +4 -2
- package/dist/data/ai/SessionViewer.rows.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.rows.js +41 -27
- package/dist/data/ai/SessionViewer.rows.js.map +1 -1
- package/dist/data/ai/SessionViewer.tokens.cjs +35 -0
- package/dist/data/ai/SessionViewer.tokens.cjs.map +1 -0
- package/dist/data/ai/SessionViewer.tokens.d.ts +5 -0
- package/dist/data/ai/SessionViewer.tokens.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.tokens.js +35 -0
- package/dist/data/ai/SessionViewer.tokens.js.map +1 -0
- package/dist/data/ai/SessionViewer.tool-cost.cjs +128 -0
- package/dist/data/ai/SessionViewer.tool-cost.cjs.map +1 -0
- package/dist/data/ai/SessionViewer.tool-cost.d.ts +6 -0
- package/dist/data/ai/SessionViewer.tool-cost.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.tool-cost.js +128 -0
- package/dist/data/ai/SessionViewer.tool-cost.js.map +1 -0
- package/dist/data/ai/SessionViewer.tool-details.cjs +3 -1
- package/dist/data/ai/SessionViewer.tool-details.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.tool-details.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.tool-details.js +3 -1
- package/dist/data/ai/SessionViewer.tool-details.js.map +1 -1
- package/dist/data/ai/SessionViewer.tool-row.cjs +55 -35
- package/dist/data/ai/SessionViewer.tool-row.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.tool-row.d.ts +2 -1
- package/dist/data/ai/SessionViewer.tool-row.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.tool-row.js +55 -35
- package/dist/data/ai/SessionViewer.tool-row.js.map +1 -1
- package/dist/data/ai/SessionViewer.unified.d.ts +4 -0
- package/dist/data/ai/SessionViewer.unified.d.ts.map +1 -1
- package/dist/data/ai/SessionViewerMenu.cjs +18 -1
- package/dist/data/ai/SessionViewerMenu.cjs.map +1 -1
- package/dist/data/ai/SessionViewerMenu.d.ts +6 -1
- package/dist/data/ai/SessionViewerMenu.d.ts.map +1 -1
- package/dist/data/ai/SessionViewerMenu.js +18 -1
- package/dist/data/ai/SessionViewerMenu.js.map +1 -1
- package/dist/data/ai/ToolPreferences.cjs +149 -143
- package/dist/data/ai/ToolPreferences.cjs.map +1 -1
- package/dist/data/ai/ToolPreferences.d.ts +20 -6
- package/dist/data/ai/ToolPreferences.d.ts.map +1 -1
- package/dist/data/ai/ToolPreferences.js +151 -146
- package/dist/data/ai/ToolPreferences.js.map +1 -1
- package/dist/data/ai/ToolPreferences.model.cjs +14 -10
- package/dist/data/ai/ToolPreferences.model.cjs.map +1 -1
- package/dist/data/ai/ToolPreferences.model.d.ts +1 -0
- package/dist/data/ai/ToolPreferences.model.d.ts.map +1 -1
- package/dist/data/ai/ToolPreferences.model.js +15 -11
- package/dist/data/ai/ToolPreferences.model.js.map +1 -1
- package/dist/data/ai/ToolPreferencesList.cjs +1 -0
- package/dist/data/ai/ToolPreferencesList.cjs.map +1 -1
- package/dist/data/ai/ToolPreferencesList.d.ts +4 -1
- package/dist/data/ai/ToolPreferencesList.d.ts.map +1 -1
- package/dist/data/ai/ToolPreferencesList.js +2 -1
- package/dist/data/ai/ToolPreferencesList.js.map +1 -1
- package/dist/data/ai/ToolSchemaBrowser.cjs +52 -53
- package/dist/data/ai/ToolSchemaBrowser.cjs.map +1 -1
- package/dist/data/ai/ToolSchemaBrowser.d.ts +6 -3
- package/dist/data/ai/ToolSchemaBrowser.d.ts.map +1 -1
- package/dist/data/ai/ToolSchemaBrowser.directory-header.cjs +9 -13
- package/dist/data/ai/ToolSchemaBrowser.directory-header.cjs.map +1 -1
- package/dist/data/ai/ToolSchemaBrowser.directory-header.d.ts +5 -2
- package/dist/data/ai/ToolSchemaBrowser.directory-header.d.ts.map +1 -1
- package/dist/data/ai/ToolSchemaBrowser.directory-header.js +9 -13
- package/dist/data/ai/ToolSchemaBrowser.directory-header.js.map +1 -1
- package/dist/data/ai/ToolSchemaBrowser.js +53 -54
- package/dist/data/ai/ToolSchemaBrowser.js.map +1 -1
- package/dist/data/ai/ToolSchemaBrowser.model.cjs +19 -27
- package/dist/data/ai/ToolSchemaBrowser.model.cjs.map +1 -1
- package/dist/data/ai/ToolSchemaBrowser.model.d.ts +9 -6
- package/dist/data/ai/ToolSchemaBrowser.model.d.ts.map +1 -1
- package/dist/data/ai/ToolSchemaBrowser.model.js +20 -28
- package/dist/data/ai/ToolSchemaBrowser.model.js.map +1 -1
- package/dist/data/ai/ToolSchemaBrowser.sidebar.cjs +12 -213
- package/dist/data/ai/ToolSchemaBrowser.sidebar.cjs.map +1 -1
- package/dist/data/ai/ToolSchemaBrowser.sidebar.d.ts +1 -3
- package/dist/data/ai/ToolSchemaBrowser.sidebar.d.ts.map +1 -1
- package/dist/data/ai/ToolSchemaBrowser.sidebar.js +13 -214
- package/dist/data/ai/ToolSchemaBrowser.sidebar.js.map +1 -1
- package/dist/data/ai/ToolSchemaBrowser.strategies.cjs +54 -0
- package/dist/data/ai/ToolSchemaBrowser.strategies.cjs.map +1 -0
- package/dist/data/ai/ToolSchemaBrowser.strategies.d.ts +9 -0
- package/dist/data/ai/ToolSchemaBrowser.strategies.d.ts.map +1 -0
- package/dist/data/ai/ToolSchemaBrowser.strategies.js +54 -0
- package/dist/data/ai/ToolSchemaBrowser.strategies.js.map +1 -0
- package/dist/data/ai/ToolSchemaBrowser.tree.cjs +179 -0
- package/dist/data/ai/ToolSchemaBrowser.tree.cjs.map +1 -0
- package/dist/data/ai/ToolSchemaBrowser.tree.d.ts +20 -0
- package/dist/data/ai/ToolSchemaBrowser.tree.d.ts.map +1 -0
- package/dist/data/ai/ToolSchemaBrowser.tree.js +179 -0
- package/dist/data/ai/ToolSchemaBrowser.tree.js.map +1 -0
- package/dist/data/ai/index.d.ts +2 -2
- package/dist/data/ai/index.d.ts.map +1 -1
- package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.cjs +8 -28
- package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.cjs.map +1 -1
- package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.d.ts.map +1 -1
- package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.js +9 -29
- package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.js.map +1 -1
- package/dist/data/ai/session-token-sizing.d.ts +32 -0
- package/dist/data/ai/session-token-sizing.d.ts.map +1 -0
- package/dist/data/ai/use-session-token-sizing.cjs +73 -0
- package/dist/data/ai/use-session-token-sizing.cjs.map +1 -0
- package/dist/data/ai/use-session-token-sizing.d.ts +21 -0
- package/dist/data/ai/use-session-token-sizing.d.ts.map +1 -0
- package/dist/data/ai/use-session-token-sizing.js +73 -0
- package/dist/data/ai/use-session-token-sizing.js.map +1 -0
- package/dist/data/call-graph/CallGraph.cjs +250 -0
- package/dist/data/call-graph/CallGraph.cjs.map +1 -0
- package/dist/data/call-graph/CallGraph.d.ts +69 -0
- package/dist/data/call-graph/CallGraph.d.ts.map +1 -0
- package/dist/data/call-graph/CallGraph.js +250 -0
- package/dist/data/call-graph/CallGraph.js.map +1 -0
- package/dist/data/call-graph/CallGraphGlyphs.cjs +39 -0
- package/dist/data/call-graph/CallGraphGlyphs.cjs.map +1 -0
- package/dist/data/call-graph/CallGraphGlyphs.d.ts +19 -0
- package/dist/data/call-graph/CallGraphGlyphs.d.ts.map +1 -0
- package/dist/data/call-graph/CallGraphGlyphs.js +39 -0
- package/dist/data/call-graph/CallGraphGlyphs.js.map +1 -0
- package/dist/data/call-graph/CallGraphMembers.cjs +50 -0
- package/dist/data/call-graph/CallGraphMembers.cjs.map +1 -0
- package/dist/data/call-graph/CallGraphMembers.d.ts +22 -0
- package/dist/data/call-graph/CallGraphMembers.d.ts.map +1 -0
- package/dist/data/call-graph/CallGraphMembers.js +50 -0
- package/dist/data/call-graph/CallGraphMembers.js.map +1 -0
- package/dist/data/call-graph/CallGraphParts.cjs +204 -0
- package/dist/data/call-graph/CallGraphParts.cjs.map +1 -0
- package/dist/data/call-graph/CallGraphParts.d.ts +44 -0
- package/dist/data/call-graph/CallGraphParts.d.ts.map +1 -0
- package/dist/data/call-graph/CallGraphParts.js +204 -0
- package/dist/data/call-graph/CallGraphParts.js.map +1 -0
- package/dist/data/call-graph/CallGraphToolbar.cjs +186 -0
- package/dist/data/call-graph/CallGraphToolbar.cjs.map +1 -0
- package/dist/data/call-graph/CallGraphToolbar.d.ts +45 -0
- package/dist/data/call-graph/CallGraphToolbar.d.ts.map +1 -0
- package/dist/data/call-graph/CallGraphToolbar.js +186 -0
- package/dist/data/call-graph/CallGraphToolbar.js.map +1 -0
- package/dist/data/call-graph/call-graph-exclude.cjs +75 -0
- package/dist/data/call-graph/call-graph-exclude.cjs.map +1 -0
- package/dist/data/call-graph/call-graph-exclude.d.ts +31 -0
- package/dist/data/call-graph/call-graph-exclude.d.ts.map +1 -0
- package/dist/data/call-graph/call-graph-exclude.js +75 -0
- package/dist/data/call-graph/call-graph-exclude.js.map +1 -0
- package/dist/data/call-graph/call-graph-labels.cjs +96 -0
- package/dist/data/call-graph/call-graph-labels.cjs.map +1 -0
- package/dist/data/call-graph/call-graph-labels.d.ts +53 -0
- package/dist/data/call-graph/call-graph-labels.d.ts.map +1 -0
- package/dist/data/call-graph/call-graph-labels.js +96 -0
- package/dist/data/call-graph/call-graph-labels.js.map +1 -0
- package/dist/data/call-graph/call-graph-model.cjs +161 -0
- package/dist/data/call-graph/call-graph-model.cjs.map +1 -0
- package/dist/data/call-graph/call-graph-model.d.ts +102 -0
- package/dist/data/call-graph/call-graph-model.d.ts.map +1 -0
- package/dist/data/call-graph/call-graph-model.js +161 -0
- package/dist/data/call-graph/call-graph-model.js.map +1 -0
- package/dist/data/call-graph/call-graph-vocabulary.cjs +177 -0
- package/dist/data/call-graph/call-graph-vocabulary.cjs.map +1 -0
- package/dist/data/call-graph/call-graph-vocabulary.d.ts +72 -0
- package/dist/data/call-graph/call-graph-vocabulary.d.ts.map +1 -0
- package/dist/data/call-graph/call-graph-vocabulary.js +177 -0
- package/dist/data/call-graph/call-graph-vocabulary.js.map +1 -0
- package/dist/data/call-graph/call-graph.fixtures.d.ts +63 -0
- package/dist/data/call-graph/call-graph.fixtures.d.ts.map +1 -0
- package/dist/data/call-graph/index.d.ts +7 -0
- package/dist/data/call-graph/index.d.ts.map +1 -0
- package/dist/data/call-graph/types.cjs +5 -0
- package/dist/data/call-graph/types.cjs.map +1 -0
- package/dist/data/call-graph/types.d.ts +135 -0
- package/dist/data/call-graph/types.d.ts.map +1 -0
- package/dist/data/call-graph/types.js +5 -0
- package/dist/data/call-graph/types.js.map +1 -0
- package/dist/data/call-graph/use-call-graph.cjs +93 -0
- package/dist/data/call-graph/use-call-graph.cjs.map +1 -0
- package/dist/data/call-graph/use-call-graph.d.ts +24 -0
- package/dist/data/call-graph/use-call-graph.d.ts.map +1 -0
- package/dist/data/call-graph/use-call-graph.js +93 -0
- package/dist/data/call-graph/use-call-graph.js.map +1 -0
- package/dist/data/chat/Chat.cjs +39 -15
- package/dist/data/chat/Chat.cjs.map +1 -1
- package/dist/data/chat/Chat.d.ts.map +1 -1
- package/dist/data/chat/Chat.fixtures.cjs +2 -2
- package/dist/data/chat/Chat.fixtures.cjs.map +1 -1
- package/dist/data/chat/Chat.fixtures.js +2 -2
- package/dist/data/chat/Chat.fixtures.js.map +1 -1
- package/dist/data/chat/Chat.js +40 -16
- package/dist/data/chat/Chat.js.map +1 -1
- package/dist/data/chat/ChatRuntimeToolbar.cjs +3 -6
- package/dist/data/chat/ChatRuntimeToolbar.cjs.map +1 -1
- package/dist/data/chat/ChatRuntimeToolbar.d.ts.map +1 -1
- package/dist/data/chat/ChatRuntimeToolbar.js +3 -6
- package/dist/data/chat/ChatRuntimeToolbar.js.map +1 -1
- package/dist/data/chat/ContextMeter.bar.cjs +5 -8
- package/dist/data/chat/ContextMeter.bar.cjs.map +1 -1
- package/dist/data/chat/ContextMeter.bar.d.ts +1 -1
- package/dist/data/chat/ContextMeter.bar.d.ts.map +1 -1
- package/dist/data/chat/ContextMeter.bar.js +5 -8
- package/dist/data/chat/ContextMeter.bar.js.map +1 -1
- package/dist/data/chat/ContextMeter.cjs +18 -19
- package/dist/data/chat/ContextMeter.cjs.map +1 -1
- package/dist/data/chat/ContextMeter.d.ts +1 -1
- package/dist/data/chat/ContextMeter.d.ts.map +1 -1
- package/dist/data/chat/ContextMeter.js +18 -19
- package/dist/data/chat/ContextMeter.js.map +1 -1
- package/dist/data/chat/Conversation.cjs +2 -1
- package/dist/data/chat/Conversation.cjs.map +1 -1
- package/dist/data/chat/Conversation.d.ts +4 -1
- package/dist/data/chat/Conversation.d.ts.map +1 -1
- package/dist/data/chat/Conversation.js +2 -1
- package/dist/data/chat/Conversation.js.map +1 -1
- package/dist/data/chat/Message.cjs +39 -12
- package/dist/data/chat/Message.cjs.map +1 -1
- package/dist/data/chat/Message.d.ts +1 -1
- package/dist/data/chat/Message.d.ts.map +1 -1
- package/dist/data/chat/Message.js +40 -13
- package/dist/data/chat/Message.js.map +1 -1
- package/dist/data/chat/ToolCall.cjs +60 -5
- package/dist/data/chat/ToolCall.cjs.map +1 -1
- package/dist/data/chat/ToolCall.d.ts +7 -2
- package/dist/data/chat/ToolCall.d.ts.map +1 -1
- package/dist/data/chat/ToolCall.js +60 -5
- package/dist/data/chat/ToolCall.js.map +1 -1
- package/dist/data/chat/approval.cjs.map +1 -1
- package/dist/data/chat/approval.d.ts +2 -2
- package/dist/data/chat/approval.d.ts.map +1 -1
- package/dist/data/chat/approval.js.map +1 -1
- package/dist/data/chat/tool-policy.cjs +59 -2
- package/dist/data/chat/tool-policy.cjs.map +1 -1
- package/dist/data/chat/tool-policy.d.ts +9 -0
- package/dist/data/chat/tool-policy.d.ts.map +1 -1
- package/dist/data/chat/tool-policy.js +59 -2
- package/dist/data/chat/tool-policy.js.map +1 -1
- package/dist/data/chat/types.cjs +6 -0
- package/dist/data/chat/types.cjs.map +1 -1
- package/dist/data/chat/types.d.ts +13 -4
- package/dist/data/chat/types.d.ts.map +1 -1
- package/dist/data/chat/types.js +7 -1
- package/dist/data/chat/types.js.map +1 -1
- package/dist/data/chat/usage-snapshot.cjs +11 -6
- package/dist/data/chat/usage-snapshot.cjs.map +1 -1
- package/dist/data/chat/usage-snapshot.d.ts +0 -1
- package/dist/data/chat/usage-snapshot.d.ts.map +1 -1
- package/dist/data/chat/usage-snapshot.js +11 -6
- package/dist/data/chat/usage-snapshot.js.map +1 -1
- package/dist/data/diagnostics/RenderedStackTrace.cjs +2 -1
- package/dist/data/diagnostics/RenderedStackTrace.cjs.map +1 -1
- package/dist/data/diagnostics/RenderedStackTrace.d.ts +3 -1
- package/dist/data/diagnostics/RenderedStackTrace.d.ts.map +1 -1
- package/dist/data/diagnostics/RenderedStackTrace.js +2 -1
- package/dist/data/diagnostics/RenderedStackTrace.js.map +1 -1
- package/dist/data/diagnostics/StackFrameRow.cjs +3 -3
- package/dist/data/diagnostics/StackFrameRow.cjs.map +1 -1
- package/dist/data/diagnostics/StackFrameRow.js +3 -3
- package/dist/data/diagnostics/StackFrameRow.js.map +1 -1
- package/dist/data/graph-columns-layout.cjs +26 -10
- package/dist/data/graph-columns-layout.cjs.map +1 -1
- package/dist/data/graph-columns-layout.d.ts +8 -0
- package/dist/data/graph-columns-layout.d.ts.map +1 -1
- package/dist/data/graph-columns-layout.js +26 -10
- package/dist/data/graph-columns-layout.js.map +1 -1
- package/dist/data/graph-diagram-model.cjs.map +1 -1
- package/dist/data/graph-diagram-model.d.ts +5 -0
- package/dist/data/graph-diagram-model.d.ts.map +1 -1
- package/dist/data/graph-diagram-model.js.map +1 -1
- package/dist/data/graph-edge-routing.cjs +9 -3
- package/dist/data/graph-edge-routing.cjs.map +1 -1
- package/dist/data/graph-edge-routing.d.ts +2 -0
- package/dist/data/graph-edge-routing.d.ts.map +1 -1
- package/dist/data/graph-edge-routing.js +9 -3
- package/dist/data/graph-edge-routing.js.map +1 -1
- package/dist/data/json-view/JsonSource.cjs +84 -0
- package/dist/data/json-view/JsonSource.cjs.map +1 -0
- package/dist/data/json-view/JsonSource.d.ts +7 -0
- package/dist/data/json-view/JsonSource.d.ts.map +1 -0
- package/dist/data/json-view/JsonSource.js +84 -0
- package/dist/data/json-view/JsonSource.js.map +1 -0
- package/dist/data/json-view/parse-prefix.cjs +132 -0
- package/dist/data/json-view/parse-prefix.cjs.map +1 -0
- package/dist/data/json-view/parse-prefix.d.ts +11 -0
- package/dist/data/json-view/parse-prefix.d.ts.map +1 -0
- package/dist/data/json-view/parse-prefix.js +132 -0
- package/dist/data/json-view/parse-prefix.js.map +1 -0
- package/dist/data/json-view/parse-source.cjs +62 -0
- package/dist/data/json-view/parse-source.cjs.map +1 -0
- package/dist/data/json-view/parse-source.d.ts +16 -0
- package/dist/data/json-view/parse-source.d.ts.map +1 -0
- package/dist/data/json-view/parse-source.js +62 -0
- package/dist/data/json-view/parse-source.js.map +1 -0
- package/dist/data/json-view/story-fixtures.d.ts +6 -0
- package/dist/data/json-view/story-fixtures.d.ts.map +1 -0
- package/dist/data/json-view/types.d.ts +14 -0
- package/dist/data/json-view/types.d.ts.map +1 -0
- package/dist/data/runtime/RuntimeBar.cjs +2 -5
- package/dist/data/runtime/RuntimeBar.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBar.d.ts +2 -4
- package/dist/data/runtime/RuntimeBar.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBar.fields.cjs +2 -2
- package/dist/data/runtime/RuntimeBar.fields.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBar.fields.js +2 -2
- package/dist/data/runtime/RuntimeBar.fields.js.map +1 -1
- package/dist/data/runtime/RuntimeBar.js +2 -5
- package/dist/data/runtime/RuntimeBar.js.map +1 -1
- package/dist/data/runtime/RuntimeBar.selection.cjs +4 -1
- package/dist/data/runtime/RuntimeBar.selection.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBar.selection.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBar.selection.js +5 -2
- package/dist/data/runtime/RuntimeBar.selection.js.map +1 -1
- package/dist/data/runtime/RuntimeBarActions.cjs +1 -5
- package/dist/data/runtime/RuntimeBarActions.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBarActions.d.ts +1 -1
- package/dist/data/runtime/RuntimeBarActions.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBarActions.js +1 -5
- package/dist/data/runtime/RuntimeBarActions.js.map +1 -1
- package/dist/data/runtime/RuntimeBarIdentity.cjs +6 -14
- package/dist/data/runtime/RuntimeBarIdentity.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBarIdentity.d.ts +0 -1
- package/dist/data/runtime/RuntimeBarIdentity.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBarIdentity.js +6 -14
- package/dist/data/runtime/RuntimeBarIdentity.js.map +1 -1
- package/dist/data/runtime/RuntimeBarLayout.cjs +8 -27
- package/dist/data/runtime/RuntimeBarLayout.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBarLayout.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBarLayout.js +8 -27
- package/dist/data/runtime/RuntimeBarLayout.js.map +1 -1
- package/dist/data/runtime/RuntimeBarSegment.cjs +1 -5
- package/dist/data/runtime/RuntimeBarSegment.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBarSegment.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBarSegment.js +1 -5
- package/dist/data/runtime/RuntimeBarSegment.js.map +1 -1
- package/dist/data/runtime/use-runtime-bar-overflow.cjs +4 -10
- package/dist/data/runtime/use-runtime-bar-overflow.cjs.map +1 -1
- package/dist/data/runtime/use-runtime-bar-overflow.d.ts +1 -2
- package/dist/data/runtime/use-runtime-bar-overflow.d.ts.map +1 -1
- package/dist/data/runtime/use-runtime-bar-overflow.js +4 -10
- package/dist/data/runtime/use-runtime-bar-overflow.js.map +1 -1
- package/dist/data/test-runner/TestRunner.fixtures.d.ts +0 -20
- package/dist/data/test-runner/TestRunner.fixtures.d.ts.map +1 -1
- package/dist/data/test-runner/TestRunner.large-fixtures.d.ts +22 -0
- package/dist/data/test-runner/TestRunner.large-fixtures.d.ts.map +1 -0
- package/dist/data/use-pan-zoom.cjs +23 -10
- package/dist/data/use-pan-zoom.cjs.map +1 -1
- package/dist/data/use-pan-zoom.d.ts +16 -2
- package/dist/data/use-pan-zoom.d.ts.map +1 -1
- package/dist/data/use-pan-zoom.js +23 -10
- package/dist/data/use-pan-zoom.js.map +1 -1
- package/dist/data/version-info.cjs +3 -3
- package/dist/data/version-info.js +3 -3
- package/dist/data.cjs +28 -2
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.ts +2 -0
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +26 -0
- package/dist/data.js.map +1 -1
- package/dist/index.cjs +30 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -1
- package/dist/layout/Workspace.cjs +13 -4
- package/dist/layout/Workspace.cjs.map +1 -1
- package/dist/layout/Workspace.d.ts +7 -2
- package/dist/layout/Workspace.d.ts.map +1 -1
- package/dist/layout/Workspace.js +13 -4
- package/dist/layout/Workspace.js.map +1 -1
- package/dist/lib/permission-strategies.cjs +71 -11
- package/dist/lib/permission-strategies.cjs.map +1 -1
- package/dist/lib/permission-strategies.d.ts +3 -0
- package/dist/lib/permission-strategies.d.ts.map +1 -1
- package/dist/lib/permission-strategies.js +71 -11
- package/dist/lib/permission-strategies.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +5 -3
- package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.cjs +0 -57
- package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.cjs.map +0 -1
- package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.d.ts +0 -7
- package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.d.ts.map +0 -1
- package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.js +0 -57
- package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.js.map +0 -1
- package/dist/data/runtime/RuntimeBar.context.cjs +0 -8
- package/dist/data/runtime/RuntimeBar.context.cjs.map +0 -1
- package/dist/data/runtime/RuntimeBar.context.d.ts +0 -2
- package/dist/data/runtime/RuntimeBar.context.d.ts.map +0 -1
- package/dist/data/runtime/RuntimeBar.context.js +0 -8
- package/dist/data/runtime/RuntimeBar.context.js.map +0 -1
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const jsxRuntime = require("react/jsx-runtime");
|
|
4
|
+
const button = require("../../components/button.cjs");
|
|
5
|
+
const Badge = require("../Badge.cjs");
|
|
6
|
+
const KeyValueList = require("../KeyValueList.cjs");
|
|
7
|
+
const utils = require("../../lib/utils.cjs");
|
|
8
|
+
const callGraphLabels = require("./call-graph-labels.cjs");
|
|
9
|
+
const callGraphModel = require("./call-graph-model.cjs");
|
|
10
|
+
const callGraphVocabulary = require("./call-graph-vocabulary.cjs");
|
|
11
|
+
const CallGraphGlyphs = require("./CallGraphGlyphs.cjs");
|
|
12
|
+
const CallGraphMembers = require("./CallGraphMembers.cjs");
|
|
13
|
+
const UiWarningTriangle = require("../../icons/components/UiWarningTriangle.cjs");
|
|
14
|
+
function plainClick(event) {
|
|
15
|
+
return event.button === 0 && !event.metaKey && !event.ctrlKey && !event.shiftKey && !event.altKey;
|
|
16
|
+
}
|
|
17
|
+
function ActionTarget({ action, className, label, children }) {
|
|
18
|
+
const { href, onSelect } = action;
|
|
19
|
+
if (href === void 0) {
|
|
20
|
+
return /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", className, "aria-label": label, onClick: onSelect, children });
|
|
21
|
+
}
|
|
22
|
+
const onClick = onSelect && ((event) => {
|
|
23
|
+
if (!plainClick(event)) return;
|
|
24
|
+
event.preventDefault();
|
|
25
|
+
onSelect();
|
|
26
|
+
});
|
|
27
|
+
return /* @__PURE__ */ jsxRuntime.jsx("a", { href, className, "aria-label": label, ...onClick ? { onClick } : {}, children });
|
|
28
|
+
}
|
|
29
|
+
function siteLocation(site) {
|
|
30
|
+
return `${site.path ?? "unknown file"}:${site.line ?? "?"}`;
|
|
31
|
+
}
|
|
32
|
+
function SiteGuards({ guards, known }) {
|
|
33
|
+
if (guards.length > 0) {
|
|
34
|
+
return guards.map((guard, index) => /* @__PURE__ */ jsxRuntime.jsx(Badge.Badge, { variant: "outline", size: "sm", wrap: true, clickToCopy: false, className: "h-auto py-0.5 font-mono", children: guard }, `${index}-${guard}`));
|
|
35
|
+
}
|
|
36
|
+
if (known === "loading") return null;
|
|
37
|
+
return /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-muted-foreground", children: known === "known" ? "Unconditional" : "Guards not loaded" });
|
|
38
|
+
}
|
|
39
|
+
function SiteBody({ site, known }) {
|
|
40
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
41
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "block font-mono text-xs text-primary", children: siteLocation(site) }),
|
|
42
|
+
site.text && /* @__PURE__ */ jsxRuntime.jsx("code", { className: "block max-h-24 overflow-hidden whitespace-pre-wrap break-words rounded bg-muted px-1.5 py-1 font-mono text-xs", title: site.text, children: site.text }),
|
|
43
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex flex-wrap items-center gap-1", children: /* @__PURE__ */ jsxRuntime.jsx(SiteGuards, { guards: site.guards ?? [], known }) })
|
|
44
|
+
] });
|
|
45
|
+
}
|
|
46
|
+
function guardsKnown(lazy, guards) {
|
|
47
|
+
if (!lazy || (guards == null ? void 0 : guards.status) === "loaded") return "known";
|
|
48
|
+
return (guards == null ? void 0 : guards.status) === "failed" ? "failed" : "loading";
|
|
49
|
+
}
|
|
50
|
+
function EdgeTypeIcon({ type, labels }) {
|
|
51
|
+
const words = labels[type];
|
|
52
|
+
return /* @__PURE__ */ jsxRuntime.jsx("span", { title: words, className: "flex text-base leading-none", children: /* @__PURE__ */ jsxRuntime.jsx(CallGraphGlyphs.EdgeTypeGlyph, { type, title: words }) });
|
|
53
|
+
}
|
|
54
|
+
function isAccess(type) {
|
|
55
|
+
return type === "read" || type === "write";
|
|
56
|
+
}
|
|
57
|
+
function edgeMembers(edge, graph) {
|
|
58
|
+
const own = new Set(callGraphLabels.memberAccess([edge]).map((member) => `${member.kind}:${member.name}`));
|
|
59
|
+
const siblings = graph.edges.filter((other) => other.id !== edge.id && other.from === edge.from && other.to === edge.to);
|
|
60
|
+
return callGraphLabels.memberAccess([edge, ...siblings]).filter((member) => own.has(`${member.kind}:${member.name}`));
|
|
61
|
+
}
|
|
62
|
+
function MemberLists({ members }) {
|
|
63
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
64
|
+
/* @__PURE__ */ jsxRuntime.jsx(CallGraphMembers.MemberChips, { label: "Columns", members: members.filter((member) => member.kind === "column") }),
|
|
65
|
+
/* @__PURE__ */ jsxRuntime.jsx(CallGraphMembers.MemberChips, { label: "Fields", members: members.filter((member) => member.kind === "field") })
|
|
66
|
+
] });
|
|
67
|
+
}
|
|
68
|
+
function GuardsStatus({ guards }) {
|
|
69
|
+
if ((guards == null ? void 0 : guards.status) === "loading") return /* @__PURE__ */ jsxRuntime.jsx("p", { role: "status", className: "text-xs text-muted-foreground", children: "Loading guards…" });
|
|
70
|
+
if ((guards == null ? void 0 : guards.status) === "failed") return /* @__PURE__ */ jsxRuntime.jsx("p", { role: "alert", className: "text-xs text-destructive", children: guards.error });
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
function EdgeSites({ edge, graph, labels, guards, lazyGuards = false, siteAction }) {
|
|
74
|
+
const sites = (guards == null ? void 0 : guards.status) === "loaded" ? guards.sites : edge.sites;
|
|
75
|
+
const known = guardsKnown(lazyGuards, guards);
|
|
76
|
+
const properties = callGraphLabels.propertyLines(callGraphLabels.memberChips(edge.properties).rest);
|
|
77
|
+
const noun = isAccess(edge.type) ? "access" : "call";
|
|
78
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("section", { className: "space-y-2", "aria-label": `${callGraphLabels.capitalize(noun)} sites`, children: [
|
|
79
|
+
/* @__PURE__ */ jsxRuntime.jsxs("header", { className: "space-y-1", children: [
|
|
80
|
+
/* @__PURE__ */ jsxRuntime.jsxs("h3", { className: "break-words text-sm font-semibold", children: [
|
|
81
|
+
callGraphModel.requireNode(graph, edge.from).label,
|
|
82
|
+
" → ",
|
|
83
|
+
callGraphModel.requireNode(graph, edge.to).label
|
|
84
|
+
] }),
|
|
85
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-1.5 text-xs text-muted-foreground", children: [
|
|
86
|
+
/* @__PURE__ */ jsxRuntime.jsx(EdgeTypeIcon, { type: edge.type, labels }),
|
|
87
|
+
edge.kind && /* @__PURE__ */ jsxRuntime.jsx(Badge.Badge, { variant: "outline", size: "sm", clickToCopy: false, children: edge.kind }),
|
|
88
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
|
|
89
|
+
sites.length,
|
|
90
|
+
" ",
|
|
91
|
+
noun,
|
|
92
|
+
" ",
|
|
93
|
+
sites.length === 1 ? "site" : "sites"
|
|
94
|
+
] })
|
|
95
|
+
] }),
|
|
96
|
+
/* @__PURE__ */ jsxRuntime.jsx(MemberLists, { members: edgeMembers(edge, graph) }),
|
|
97
|
+
properties.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "space-y-0.5 text-xs", "aria-label": "Edge properties", children: properties.map((line) => /* @__PURE__ */ jsxRuntime.jsx("li", { className: "break-words font-mono", children: line }, line)) })
|
|
98
|
+
] }),
|
|
99
|
+
/* @__PURE__ */ jsxRuntime.jsx(GuardsStatus, { guards }),
|
|
100
|
+
/* @__PURE__ */ jsxRuntime.jsx("ol", { className: "divide-y divide-border rounded-md border border-border", children: sites.map((site) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: siteAction ? /* @__PURE__ */ jsxRuntime.jsx(ActionTarget, { action: siteAction(site), className: "block w-full space-y-1.5 px-3 py-2.5 text-left hover:bg-muted", label: `Open ${siteLocation(site)}`, children: /* @__PURE__ */ jsxRuntime.jsx(SiteBody, { site, known }) }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-1.5 px-3 py-2.5", children: /* @__PURE__ */ jsxRuntime.jsx(SiteBody, { site, known }) }) }, `${siteLocation(site)}:${site.column ?? 0}`)) })
|
|
101
|
+
] });
|
|
102
|
+
}
|
|
103
|
+
function Mono({ children }) {
|
|
104
|
+
return /* @__PURE__ */ jsxRuntime.jsx("span", { className: "break-all font-mono text-xs", children });
|
|
105
|
+
}
|
|
106
|
+
function backingItem(node, vocabulary, onFocus) {
|
|
107
|
+
var _a;
|
|
108
|
+
const backing = (_a = vocabulary.backing) == null ? void 0 : _a.call(vocabulary, node);
|
|
109
|
+
if (!backing) return [];
|
|
110
|
+
const value = onFocus ? /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", className: "break-all font-mono text-xs text-primary hover:underline", "aria-label": `Focus ${backing.label}`, onClick: () => onFocus(backing.id), children: backing.label }) : /* @__PURE__ */ jsxRuntime.jsx(Mono, { children: backing.label });
|
|
111
|
+
return [{ key: "backing", label: "Column", value }];
|
|
112
|
+
}
|
|
113
|
+
function totalItems(totals) {
|
|
114
|
+
const labels = [["callers", "Callers"], ["callees", "Callees"]];
|
|
115
|
+
return labels.map(([key, label]) => ({ key, label, value: totals[key], hidden: totals[key] === void 0 }));
|
|
116
|
+
}
|
|
117
|
+
function accessItems(node, graph, vocabulary) {
|
|
118
|
+
if (!vocabulary.isData(node)) return [];
|
|
119
|
+
const into = graph.edges.filter((edge) => edge.to === node.id);
|
|
120
|
+
const members = callGraphLabels.memberAccess(into);
|
|
121
|
+
const memberItem = (kind, label) => {
|
|
122
|
+
const touched = members.filter((member) => member.kind === kind);
|
|
123
|
+
return { key: `members:${kind}`, label, value: /* @__PURE__ */ jsxRuntime.jsx(CallGraphMembers.MemberChipList, { label, members: touched }), hidden: touched.length === 0 };
|
|
124
|
+
};
|
|
125
|
+
const namesItem = (type, label) => {
|
|
126
|
+
const names = into.filter((edge) => edge.type === type).map((edge) => callGraphModel.requireNode(graph, edge.from).label);
|
|
127
|
+
return { key: type, label, value: /* @__PURE__ */ jsxRuntime.jsx(CallGraphMembers.NameList, { label, names }), hidden: names.length === 0 };
|
|
128
|
+
};
|
|
129
|
+
return [memberItem("column", "Columns"), memberItem("field", "Fields"), namesItem("read", "Readers"), namesItem("write", "Writers")];
|
|
130
|
+
}
|
|
131
|
+
function nodeItems(node, graph, vocabulary, onFocus) {
|
|
132
|
+
var _a, _b;
|
|
133
|
+
const { module: module2, package: pkg, type, method, signature } = node.identifier;
|
|
134
|
+
const kind = vocabulary.kindOf(graph, node);
|
|
135
|
+
const group = ((_b = (_a = graph.groups) == null ? void 0 : _a.find((candidate) => candidate.id === node.group)) == null ? void 0 : _b.label) ?? node.group;
|
|
136
|
+
const backing = backingItem(node, vocabulary, onFocus);
|
|
137
|
+
const properties = Object.entries(node.properties ?? {}).filter(([key]) => !(backing.length > 0 && key === "column"));
|
|
138
|
+
const location = node.location;
|
|
139
|
+
return [
|
|
140
|
+
{
|
|
141
|
+
key: "identifier",
|
|
142
|
+
label: "Identifier",
|
|
143
|
+
value: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-1.5", children: [
|
|
144
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { title: kind, className: "flex shrink-0 text-base leading-none", children: /* @__PURE__ */ jsxRuntime.jsx(CallGraphGlyphs.NodeGlyphIcon, { vocabulary, glyph: vocabulary.glyphOf(graph, node), title: kind }) }),
|
|
145
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 break-words", children: [type, method].filter(Boolean).join(".") || node.label })
|
|
146
|
+
] })
|
|
147
|
+
},
|
|
148
|
+
{ key: "signature", label: "Signature", value: /* @__PURE__ */ jsxRuntime.jsx(Mono, { children: signature }), hidden: !signature },
|
|
149
|
+
{ key: "package", label: "Package", value: /* @__PURE__ */ jsxRuntime.jsx(Mono, { children: pkg }), hidden: !pkg },
|
|
150
|
+
{ key: "module", label: "Module", value: module2, hidden: !module2 },
|
|
151
|
+
{ key: "group", label: callGraphLabels.capitalize(vocabulary.group.noun), value: /* @__PURE__ */ jsxRuntime.jsx(Mono, { children: group }), hidden: !group || group === pkg },
|
|
152
|
+
{ key: "location", label: "Location", value: /* @__PURE__ */ jsxRuntime.jsx(Mono, { children: siteLocation(location ?? {}) }), hidden: !(location == null ? void 0 : location.path) },
|
|
153
|
+
...backing,
|
|
154
|
+
...properties.map(([key, value]) => ({ key: `property:${key}`, label: key, value: /* @__PURE__ */ jsxRuntime.jsx(Mono, { children: value }) })),
|
|
155
|
+
...accessItems(node, graph, vocabulary),
|
|
156
|
+
...totalItems(callGraphModel.walkedTotals(graph, node, vocabulary)),
|
|
157
|
+
{ key: "status", label: "Status", value: vocabulary.status(node) }
|
|
158
|
+
];
|
|
159
|
+
}
|
|
160
|
+
function NodeDetails({ node, graph, vocabulary, isRoot, opens, open, openLabel, onFocus }) {
|
|
161
|
+
const sourced = vocabulary.hasSource(node);
|
|
162
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("section", { className: "space-y-2", "aria-label": "Node details", children: [
|
|
163
|
+
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "break-words text-sm font-semibold", children: node.label }),
|
|
164
|
+
/* @__PURE__ */ jsxRuntime.jsx(KeyValueList.KeyValueList, { items: nodeItems(node, graph, vocabulary, onFocus), rowClassName: "grid-cols-[5.5rem_minmax(0,1fr)] gap-density-2", valueClassName: "text-xs" }),
|
|
165
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap gap-2", children: [
|
|
166
|
+
opens && ((open == null ? void 0 : open.href) !== void 0 && sourced ? /* @__PURE__ */ jsxRuntime.jsx(button.Button, { asChild: true, size: "sm", variant: "outline", children: /* @__PURE__ */ jsxRuntime.jsx(ActionTarget, { action: open, className: "", label: `${openLabel} ${node.label}`, children: openLabel }) }) : /* @__PURE__ */ jsxRuntime.jsx(button.Button, { type: "button", size: "sm", variant: "outline", disabled: !sourced || !(open == null ? void 0 : open.onSelect), onClick: open == null ? void 0 : open.onSelect, children: openLabel })),
|
|
167
|
+
onFocus && /* @__PURE__ */ jsxRuntime.jsx(button.Button, { type: "button", size: "sm", variant: "outline", disabled: !vocabulary.canRoot(node) || isRoot, onClick: () => onFocus(node.id), children: "Focus" })
|
|
168
|
+
] })
|
|
169
|
+
] });
|
|
170
|
+
}
|
|
171
|
+
const EDGE_TYPES = ["call", "dispatch", "read", "write"];
|
|
172
|
+
const EDGE_LINE = {
|
|
173
|
+
call: void 0,
|
|
174
|
+
dispatch: "border-sky-500",
|
|
175
|
+
read: "border-emerald-500",
|
|
176
|
+
write: "border-amber-500"
|
|
177
|
+
};
|
|
178
|
+
function LegendEntry({ mark, children }) {
|
|
179
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex items-center gap-1.5", children: [
|
|
180
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex shrink-0 items-center gap-1 text-base leading-none", children: mark }),
|
|
181
|
+
children
|
|
182
|
+
] });
|
|
183
|
+
}
|
|
184
|
+
function Legend({ graph, vocabulary, labels }) {
|
|
185
|
+
const GroupIcon = vocabulary.group.icon;
|
|
186
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("ul", { className: "flex flex-wrap items-center gap-x-4 gap-y-1.5 text-xs text-muted-foreground", "aria-label": "Legend", children: [
|
|
187
|
+
callGraphVocabulary.usedGlyphs(graph, vocabulary).map((glyph) => /* @__PURE__ */ jsxRuntime.jsx(LegendEntry, { mark: /* @__PURE__ */ jsxRuntime.jsx(CallGraphGlyphs.GlyphIcon, { glyph }), children: glyph.name }, glyph.id)),
|
|
188
|
+
(graph.groups ?? []).length > 0 && /* @__PURE__ */ jsxRuntime.jsx(LegendEntry, { mark: /* @__PURE__ */ jsxRuntime.jsx(GroupIcon, {}), children: vocabulary.group.noun }),
|
|
189
|
+
/* @__PURE__ */ jsxRuntime.jsx(LegendEntry, { mark: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-block h-3 w-5 rounded border border-sky-500/60 bg-sky-500/10" }), children: "root" }),
|
|
190
|
+
/* @__PURE__ */ jsxRuntime.jsx(LegendEntry, { mark: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-block h-3 w-5 rounded border border-dashed border-border bg-muted" }), children: "no source: not expandable" }),
|
|
191
|
+
EDGE_TYPES.filter((type) => graph.edges.some((edge) => edge.type === type)).map((type) => /* @__PURE__ */ jsxRuntime.jsx(LegendEntry, { mark: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
192
|
+
EDGE_LINE[type] && /* @__PURE__ */ jsxRuntime.jsx("span", { className: utils.cn("inline-block w-6 border-t-2", EDGE_LINE[type]) }),
|
|
193
|
+
/* @__PURE__ */ jsxRuntime.jsx(CallGraphGlyphs.EdgeTypeGlyph, { type })
|
|
194
|
+
] }), children: labels[type] }, type)),
|
|
195
|
+
/* @__PURE__ */ jsxRuntime.jsx(LegendEntry, { mark: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-block w-6 border-t-2 border-dashed border-muted-foreground" }), children: "every site guarded" }),
|
|
196
|
+
/* @__PURE__ */ jsxRuntime.jsx(LegendEntry, { mark: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs font-semibold", children: "×N" }), children: "sites on one edge" }),
|
|
197
|
+
/* @__PURE__ */ jsxRuntime.jsx(LegendEntry, { mark: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs font-semibold", children: "+N" }), children: "more to load" }),
|
|
198
|
+
/* @__PURE__ */ jsxRuntime.jsx(LegendEntry, { mark: /* @__PURE__ */ jsxRuntime.jsx(UiWarningTriangle.UiWarningTriangle, {}), children: "not drawn" })
|
|
199
|
+
] });
|
|
200
|
+
}
|
|
201
|
+
exports.EdgeSites = EdgeSites;
|
|
202
|
+
exports.Legend = Legend;
|
|
203
|
+
exports.NodeDetails = NodeDetails;
|
|
204
|
+
//# sourceMappingURL=CallGraphParts.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CallGraphParts.cjs","sources":["../../../src/data/call-graph/CallGraphParts.tsx"],"sourcesContent":["import type { MouseEvent, ReactNode } from \"react\";\nimport { Button } from \"../../components/button\";\nimport { UiWarningTriangle } from \"../../icons\";\nimport { Badge } from \"../Badge\";\nimport { KeyValueList, type KeyValueListItem } from \"../KeyValueList\";\nimport { cn } from \"../../lib/utils\";\nimport { capitalize, memberAccess, memberChips, propertyLines, type MemberAccess } from \"./call-graph-labels\";\nimport { requireNode, walkedTotals, type NodeTotals } from \"./call-graph-model\";\nimport { usedGlyphs, type CallGraphVocabulary } from \"./call-graph-vocabulary\";\nimport { EdgeTypeGlyph, GlyphIcon, NodeGlyphIcon } from \"./CallGraphGlyphs\";\nimport { MemberChipList, MemberChips, NameList } from \"./CallGraphMembers\";\nimport type { CallGraph, CallGraphEdge, CallGraphEdgeLabels, CallGraphEdgeType, CallGraphNode, CallGraphSite, SiteGuardsState } from \"./types\";\n\n/** Where an action goes: a link, a handler, or a link a host router intercepts on a plain click. */\nexport interface CallGraphAction {\n href?: string;\n onSelect?: () => void;\n}\n\nfunction plainClick(event: MouseEvent): boolean {\n return event.button === 0 && !event.metaKey && !event.ctrlKey && !event.shiftKey && !event.altKey;\n}\n\nfunction ActionTarget({ action, className, label, children }: { action: CallGraphAction; className: string; label: string; children: ReactNode }) {\n const { href, onSelect } = action;\n if (href === undefined) {\n return <button type=\"button\" className={className} aria-label={label} onClick={onSelect}>{children}</button>;\n }\n const onClick = onSelect && ((event: MouseEvent) => {\n if (!plainClick(event)) return;\n event.preventDefault();\n onSelect();\n });\n return <a href={href} className={className} aria-label={label} {...(onClick ? { onClick } : {})}>{children}</a>;\n}\n\nfunction siteLocation(site: CallGraphSite): string {\n return `${site.path ?? \"unknown file\"}:${site.line ?? \"?\"}`;\n}\n\n/**\n * What a site's guards say: its guards, or \"Unconditional\" once they are known to be none. A site whose\n * guards the host has yet to load says nothing while they load, and that they are not loaded if that failed.\n */\nfunction SiteGuards({ guards, known }: { guards: string[]; known: GuardsKnown }) {\n if (guards.length > 0) {\n return guards.map((guard, index) => (\n <Badge key={`${index}-${guard}`} variant=\"outline\" size=\"sm\" wrap clickToCopy={false} className=\"h-auto py-0.5 font-mono\">{guard}</Badge>\n ));\n }\n if (known === \"loading\") return null;\n return <span className=\"text-xs text-muted-foreground\">{known === \"known\" ? \"Unconditional\" : \"Guards not loaded\"}</span>;\n}\n\ntype GuardsKnown = \"known\" | \"loading\" | \"failed\";\n\nfunction SiteBody({ site, known }: { site: CallGraphSite; known: GuardsKnown }) {\n return (\n <>\n <span className=\"block font-mono text-xs text-primary\">{siteLocation(site)}</span>\n {site.text && (\n <code className=\"block max-h-24 overflow-hidden whitespace-pre-wrap break-words rounded bg-muted px-1.5 py-1 font-mono text-xs\" title={site.text}>\n {site.text}\n </code>\n )}\n <span className=\"flex flex-wrap items-center gap-1\">\n <SiteGuards guards={site.guards ?? []} known={known} />\n </span>\n </>\n );\n}\n\n/** Whether a site without guards has none: always, unless the host loads them, and then once they loaded. */\nfunction guardsKnown(lazy: boolean, guards: SiteGuardsState | undefined): GuardsKnown {\n if (!lazy || guards?.status === \"loaded\") return \"known\";\n return guards?.status === \"failed\" ? \"failed\" : \"loading\";\n}\n\n/** The edge's type as its icon, with its words as the tooltip. */\nfunction EdgeTypeIcon({ type, labels }: { type: CallGraphEdgeType; labels: CallGraphEdgeLabels }) {\n const words = labels[type];\n return <span title={words} className=\"flex text-base leading-none\"><EdgeTypeGlyph type={type} title={words} /></span>;\n}\n\nfunction isAccess(type: CallGraphEdgeType): boolean {\n return type === \"read\" || type === \"write\";\n}\n\n/**\n * The columns and fields a collapsed read or write touches, each marked \"both\" when the edge of the\n * other access type between the same nodes touches it too.\n */\nfunction edgeMembers(edge: CallGraphEdge, graph: CallGraph): MemberAccess[] {\n const own = new Set(memberAccess([edge]).map((member) => `${member.kind}:${member.name}`));\n const siblings = graph.edges.filter((other) => other.id !== edge.id && other.from === edge.from && other.to === edge.to);\n return memberAccess([edge, ...siblings]).filter((member) => own.has(`${member.kind}:${member.name}`));\n}\n\nfunction MemberLists({ members }: { members: readonly MemberAccess[] }) {\n return (\n <>\n <MemberChips label=\"Columns\" members={members.filter((member) => member.kind === \"column\")} />\n <MemberChips label=\"Fields\" members={members.filter((member) => member.kind === \"field\")} />\n </>\n );\n}\n\nfunction GuardsStatus({ guards }: { guards: SiteGuardsState | undefined }) {\n if (guards?.status === \"loading\") return <p role=\"status\" className=\"text-xs text-muted-foreground\">Loading guards…</p>;\n if (guards?.status === \"failed\") return <p role=\"alert\" className=\"text-xs text-destructive\">{guards.error}</p>;\n return null;\n}\n\n/**\n * The call or access sites behind the selected edge: where, the construct as written, and every guard\n * outermost first, after the edge's kind, the columns or fields a collapsed read or write touches, and\n * its other properties. Lazily fetched guards replace the response's sites once they arrive. With\n * `siteAction` each site opens where it is written.\n */\nexport function EdgeSites({ edge, graph, labels, guards, lazyGuards = false, siteAction }: {\n edge: CallGraphEdge;\n graph: CallGraph;\n labels: CallGraphEdgeLabels;\n guards?: SiteGuardsState | undefined;\n /** The host loads the guards on selection: until `guards` has them, a site is not called unconditional. */\n lazyGuards?: boolean;\n siteAction?: ((site: CallGraphSite) => CallGraphAction) | undefined;\n}) {\n const sites = guards?.status === \"loaded\" ? guards.sites : edge.sites;\n const known = guardsKnown(lazyGuards, guards);\n const properties = propertyLines(memberChips(edge.properties).rest);\n const noun = isAccess(edge.type) ? \"access\" : \"call\";\n return (\n <section className=\"space-y-2\" aria-label={`${capitalize(noun)} sites`}>\n <header className=\"space-y-1\">\n <h3 className=\"break-words text-sm font-semibold\">{requireNode(graph, edge.from).label} → {requireNode(graph, edge.to).label}</h3>\n <div className=\"flex flex-wrap items-center gap-1.5 text-xs text-muted-foreground\">\n <EdgeTypeIcon type={edge.type} labels={labels} />\n {edge.kind && <Badge variant=\"outline\" size=\"sm\" clickToCopy={false}>{edge.kind}</Badge>}\n <span>{sites.length} {noun} {sites.length === 1 ? \"site\" : \"sites\"}</span>\n </div>\n <MemberLists members={edgeMembers(edge, graph)} />\n {properties.length > 0 && (\n <ul className=\"space-y-0.5 text-xs\" aria-label=\"Edge properties\">\n {properties.map((line) => <li key={line} className=\"break-words font-mono\">{line}</li>)}\n </ul>\n )}\n </header>\n <GuardsStatus guards={guards} />\n <ol className=\"divide-y divide-border rounded-md border border-border\">\n {sites.map((site) => (\n <li key={`${siteLocation(site)}:${site.column ?? 0}`}>\n {siteAction ? (\n <ActionTarget action={siteAction(site)} className=\"block w-full space-y-1.5 px-3 py-2.5 text-left hover:bg-muted\" label={`Open ${siteLocation(site)}`}>\n <SiteBody site={site} known={known} />\n </ActionTarget>\n ) : (\n <div className=\"space-y-1.5 px-3 py-2.5\"><SiteBody site={site} known={known} /></div>\n )}\n </li>\n ))}\n </ol>\n </section>\n );\n}\n\nfunction Mono({ children }: { children: ReactNode }) {\n return <span className=\"break-all font-mono text-xs\">{children}</span>;\n}\n\n/** The node behind a data node, such as a field's column: a Focus link when the host can re-root. */\nfunction backingItem(node: CallGraphNode, vocabulary: CallGraphVocabulary, onFocus: ((id: string) => void) | undefined): KeyValueListItem[] {\n const backing = vocabulary.backing?.(node);\n if (!backing) return [];\n const value = onFocus\n ? <button type=\"button\" className=\"break-all font-mono text-xs text-primary hover:underline\" aria-label={`Focus ${backing.label}`} onClick={() => onFocus(backing.id)}>{backing.label}</button>\n : <Mono>{backing.label}</Mono>;\n return [{ key: \"backing\", label: \"Column\", value }];\n}\n\nfunction totalItems(totals: NodeTotals): KeyValueListItem[] {\n const labels: [keyof NodeTotals, string][] = [[\"callers\", \"Callers\"], [\"callees\", \"Callees\"]];\n return labels.map(([key, label]) => ({ key, label, value: totals[key], hidden: totals[key] === undefined }));\n}\n\n/**\n * What a data node's readers and writers touch of it, and who they are: the columns or fields of a\n * collapsed table or entity, each marked read, written or both, then the readers' and writers' names.\n */\nfunction accessItems(node: CallGraphNode, graph: CallGraph, vocabulary: CallGraphVocabulary): KeyValueListItem[] {\n if (!vocabulary.isData(node)) return [];\n const into = graph.edges.filter((edge) => edge.to === node.id);\n const members = memberAccess(into);\n const memberItem = (kind: MemberAccess[\"kind\"], label: string): KeyValueListItem => {\n const touched = members.filter((member) => member.kind === kind);\n return { key: `members:${kind}`, label, value: <MemberChipList label={label} members={touched} />, hidden: touched.length === 0 };\n };\n const namesItem = (type: CallGraphEdgeType, label: string): KeyValueListItem => {\n const names = into.filter((edge) => edge.type === type).map((edge) => requireNode(graph, edge.from).label);\n return { key: type, label, value: <NameList label={label} names={names} />, hidden: names.length === 0 };\n };\n return [memberItem(\"column\", \"Columns\"), memberItem(\"field\", \"Fields\"), namesItem(\"read\", \"Readers\"), namesItem(\"write\", \"Writers\")];\n}\n\nfunction nodeItems(node: CallGraphNode, graph: CallGraph, vocabulary: CallGraphVocabulary, onFocus: ((id: string) => void) | undefined): KeyValueListItem[] {\n const { module, package: pkg, type, method, signature } = node.identifier;\n const kind = vocabulary.kindOf(graph, node);\n const group = graph.groups?.find((candidate) => candidate.id === node.group)?.label ?? node.group;\n const backing = backingItem(node, vocabulary, onFocus);\n const properties = Object.entries(node.properties ?? {}).filter(([key]) => !(backing.length > 0 && key === \"column\"));\n const location = node.location;\n return [\n {\n key: \"identifier\",\n label: \"Identifier\",\n value: (\n <span className=\"flex items-center gap-1.5\">\n <span title={kind} className=\"flex shrink-0 text-base leading-none\">\n <NodeGlyphIcon vocabulary={vocabulary} glyph={vocabulary.glyphOf(graph, node)} title={kind} />\n </span>\n <span className=\"min-w-0 break-words\">{[type, method].filter(Boolean).join(\".\") || node.label}</span>\n </span>\n ),\n },\n { key: \"signature\", label: \"Signature\", value: <Mono>{signature}</Mono>, hidden: !signature },\n { key: \"package\", label: \"Package\", value: <Mono>{pkg}</Mono>, hidden: !pkg },\n { key: \"module\", label: \"Module\", value: module, hidden: !module },\n { key: \"group\", label: capitalize(vocabulary.group.noun), value: <Mono>{group}</Mono>, hidden: !group || group === pkg },\n { key: \"location\", label: \"Location\", value: <Mono>{siteLocation(location ?? {})}</Mono>, hidden: !location?.path },\n ...backing,\n ...properties.map(([key, value]) => ({ key: `property:${key}`, label: key, value: <Mono>{value}</Mono> })),\n ...accessItems(node, graph, vocabulary),\n ...totalItems(walkedTotals(graph, node, vocabulary)),\n { key: \"status\", label: \"Status\", value: vocabulary.status(node) },\n ];\n}\n\n/**\n * What a node is and where it is declared, with the actions that open it or re-root the graph on it.\n * When the host `opens` nodes, Open shows on every node, disabled on one with no source or no `open`.\n */\nexport function NodeDetails({ node, graph, vocabulary, isRoot, opens, open, openLabel, onFocus }: {\n node: CallGraphNode;\n graph: CallGraph;\n vocabulary: CallGraphVocabulary;\n isRoot: boolean;\n opens: boolean;\n open?: CallGraphAction | undefined;\n openLabel: string;\n /** Re-roots the graph on a node, by id: this one, or the one behind it. */\n onFocus?: ((id: string) => void) | undefined;\n}) {\n const sourced = vocabulary.hasSource(node);\n return (\n <section className=\"space-y-2\" aria-label=\"Node details\">\n <h3 className=\"break-words text-sm font-semibold\">{node.label}</h3>\n <KeyValueList items={nodeItems(node, graph, vocabulary, onFocus)} rowClassName=\"grid-cols-[5.5rem_minmax(0,1fr)] gap-density-2\" valueClassName=\"text-xs\" />\n <div className=\"flex flex-wrap gap-2\">\n {opens && (open?.href !== undefined && sourced ? (\n <Button asChild size=\"sm\" variant=\"outline\">\n <ActionTarget action={open} className=\"\" label={`${openLabel} ${node.label}`}>{openLabel}</ActionTarget>\n </Button>\n ) : (\n <Button type=\"button\" size=\"sm\" variant=\"outline\" disabled={!sourced || !open?.onSelect} onClick={open?.onSelect}>{openLabel}</Button>\n ))}\n {onFocus && <Button type=\"button\" size=\"sm\" variant=\"outline\" disabled={!vocabulary.canRoot(node) || isRoot} onClick={() => onFocus(node.id)}>Focus</Button>}\n </div>\n </section>\n );\n}\n\nconst EDGE_TYPES: readonly CallGraphEdgeType[] = [\"call\", \"dispatch\", \"read\", \"write\"];\n\n/** The line colour each edge type but a plain call is drawn in, matching its tone in the diagram. */\nconst EDGE_LINE: Record<CallGraphEdgeType, string | undefined> = {\n call: undefined,\n dispatch: \"border-sky-500\",\n read: \"border-emerald-500\",\n write: \"border-amber-500\",\n};\n\nfunction LegendEntry({ mark, children }: { mark: ReactNode; children: ReactNode }) {\n return (\n <li className=\"flex items-center gap-1.5\">\n <span className=\"flex shrink-0 items-center gap-1 text-base leading-none\">{mark}</span>\n {children}\n </li>\n );\n}\n\n/** The key to the icons: one entry per icon this graph draws, then the box and line styles. */\nexport function Legend({ graph, vocabulary, labels }: { graph: CallGraph; vocabulary: CallGraphVocabulary; labels: CallGraphEdgeLabels }) {\n const GroupIcon = vocabulary.group.icon;\n return (\n <ul className=\"flex flex-wrap items-center gap-x-4 gap-y-1.5 text-xs text-muted-foreground\" aria-label=\"Legend\">\n {usedGlyphs(graph, vocabulary).map((glyph) => <LegendEntry key={glyph.id} mark={<GlyphIcon glyph={glyph} />}>{glyph.name}</LegendEntry>)}\n {(graph.groups ?? []).length > 0 && <LegendEntry mark={<GroupIcon />}>{vocabulary.group.noun}</LegendEntry>}\n <LegendEntry mark={<span className=\"inline-block h-3 w-5 rounded border border-sky-500/60 bg-sky-500/10\" />}>root</LegendEntry>\n <LegendEntry mark={<span className=\"inline-block h-3 w-5 rounded border border-dashed border-border bg-muted\" />}>no source: not expandable</LegendEntry>\n {EDGE_TYPES.filter((type) => graph.edges.some((edge) => edge.type === type)).map((type) => (\n <LegendEntry key={type} mark={<>{EDGE_LINE[type] && <span className={cn(\"inline-block w-6 border-t-2\", EDGE_LINE[type])} />}<EdgeTypeGlyph type={type} /></>}>\n {labels[type]}\n </LegendEntry>\n ))}\n <LegendEntry mark={<span className=\"inline-block w-6 border-t-2 border-dashed border-muted-foreground\" />}>every site guarded</LegendEntry>\n <LegendEntry mark={<span className=\"text-xs font-semibold\">×N</span>}>sites on one edge</LegendEntry>\n <LegendEntry mark={<span className=\"text-xs font-semibold\">+N</span>}>more to load</LegendEntry>\n <LegendEntry mark={<UiWarningTriangle />}>not drawn</LegendEntry>\n </ul>\n );\n}\n"],"names":["jsx","Badge","jsxs","Fragment","EdgeTypeGlyph","memberAccess","MemberChips","propertyLines","memberChips","capitalize","requireNode","MemberChipList","NameList","module","NodeGlyphIcon","walkedTotals","KeyValueList","Button","usedGlyphs","GlyphIcon","cn","UiWarningTriangle"],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { CallGraphVocabulary } from './call-graph-vocabulary.js';
|
|
2
|
+
import { CallGraph, CallGraphEdge, CallGraphEdgeLabels, CallGraphNode, CallGraphSite, SiteGuardsState } from './types.js';
|
|
3
|
+
/** Where an action goes: a link, a handler, or a link a host router intercepts on a plain click. */
|
|
4
|
+
export interface CallGraphAction {
|
|
5
|
+
href?: string;
|
|
6
|
+
onSelect?: () => void;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* The call or access sites behind the selected edge: where, the construct as written, and every guard
|
|
10
|
+
* outermost first, after the edge's kind, the columns or fields a collapsed read or write touches, and
|
|
11
|
+
* its other properties. Lazily fetched guards replace the response's sites once they arrive. With
|
|
12
|
+
* `siteAction` each site opens where it is written.
|
|
13
|
+
*/
|
|
14
|
+
export declare function EdgeSites({ edge, graph, labels, guards, lazyGuards, siteAction }: {
|
|
15
|
+
edge: CallGraphEdge;
|
|
16
|
+
graph: CallGraph;
|
|
17
|
+
labels: CallGraphEdgeLabels;
|
|
18
|
+
guards?: SiteGuardsState | undefined;
|
|
19
|
+
/** The host loads the guards on selection: until `guards` has them, a site is not called unconditional. */
|
|
20
|
+
lazyGuards?: boolean;
|
|
21
|
+
siteAction?: ((site: CallGraphSite) => CallGraphAction) | undefined;
|
|
22
|
+
}): import("react").JSX.Element;
|
|
23
|
+
/**
|
|
24
|
+
* What a node is and where it is declared, with the actions that open it or re-root the graph on it.
|
|
25
|
+
* When the host `opens` nodes, Open shows on every node, disabled on one with no source or no `open`.
|
|
26
|
+
*/
|
|
27
|
+
export declare function NodeDetails({ node, graph, vocabulary, isRoot, opens, open, openLabel, onFocus }: {
|
|
28
|
+
node: CallGraphNode;
|
|
29
|
+
graph: CallGraph;
|
|
30
|
+
vocabulary: CallGraphVocabulary;
|
|
31
|
+
isRoot: boolean;
|
|
32
|
+
opens: boolean;
|
|
33
|
+
open?: CallGraphAction | undefined;
|
|
34
|
+
openLabel: string;
|
|
35
|
+
/** Re-roots the graph on a node, by id: this one, or the one behind it. */
|
|
36
|
+
onFocus?: ((id: string) => void) | undefined;
|
|
37
|
+
}): import("react").JSX.Element;
|
|
38
|
+
/** The key to the icons: one entry per icon this graph draws, then the box and line styles. */
|
|
39
|
+
export declare function Legend({ graph, vocabulary, labels }: {
|
|
40
|
+
graph: CallGraph;
|
|
41
|
+
vocabulary: CallGraphVocabulary;
|
|
42
|
+
labels: CallGraphEdgeLabels;
|
|
43
|
+
}): import("react").JSX.Element;
|
|
44
|
+
//# sourceMappingURL=CallGraphParts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CallGraphParts.d.ts","sourceRoot":"","sources":["../../../src/data/call-graph/CallGraphParts.tsx"],"names":[],"mappings":"AAQA,OAAO,EAAc,KAAK,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAG/E,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,mBAAmB,EAAqB,aAAa,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/I,oGAAoG;AACpG,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB;AAgGD;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,UAAkB,EAAE,UAAU,EAAE,EAAE;IACzF,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,EAAE,SAAS,CAAC;IACjB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,MAAM,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC;IACrC,2GAA2G;IAC3G,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,aAAa,KAAK,eAAe,CAAC,GAAG,SAAS,CAAC;CACrE,+BAqCA;AAyED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE;IAChG,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,EAAE,SAAS,CAAC;IACjB,UAAU,EAAE,mBAAmB,CAAC;IAChC,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;CAC9C,+BAkBA;AAqBD,+FAA+F;AAC/F,wBAAgB,MAAM,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,UAAU,EAAE,mBAAmB,CAAC;IAAC,MAAM,EAAE,mBAAmB,CAAA;CAAE,+BAmBvI"}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import { jsxs, jsx, Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { Button } from "../../components/button.js";
|
|
3
|
+
import { Badge } from "../Badge.js";
|
|
4
|
+
import { KeyValueList } from "../KeyValueList.js";
|
|
5
|
+
import { cn } from "../../lib/utils.js";
|
|
6
|
+
import { propertyLines, memberChips, capitalize, memberAccess } from "./call-graph-labels.js";
|
|
7
|
+
import { requireNode, walkedTotals } from "./call-graph-model.js";
|
|
8
|
+
import { usedGlyphs } from "./call-graph-vocabulary.js";
|
|
9
|
+
import { GlyphIcon, EdgeTypeGlyph, NodeGlyphIcon } from "./CallGraphGlyphs.js";
|
|
10
|
+
import { MemberChips, MemberChipList, NameList } from "./CallGraphMembers.js";
|
|
11
|
+
import { UiWarningTriangle } from "../../icons/components/UiWarningTriangle.js";
|
|
12
|
+
function plainClick(event) {
|
|
13
|
+
return event.button === 0 && !event.metaKey && !event.ctrlKey && !event.shiftKey && !event.altKey;
|
|
14
|
+
}
|
|
15
|
+
function ActionTarget({ action, className, label, children }) {
|
|
16
|
+
const { href, onSelect } = action;
|
|
17
|
+
if (href === void 0) {
|
|
18
|
+
return /* @__PURE__ */ jsx("button", { type: "button", className, "aria-label": label, onClick: onSelect, children });
|
|
19
|
+
}
|
|
20
|
+
const onClick = onSelect && ((event) => {
|
|
21
|
+
if (!plainClick(event)) return;
|
|
22
|
+
event.preventDefault();
|
|
23
|
+
onSelect();
|
|
24
|
+
});
|
|
25
|
+
return /* @__PURE__ */ jsx("a", { href, className, "aria-label": label, ...onClick ? { onClick } : {}, children });
|
|
26
|
+
}
|
|
27
|
+
function siteLocation(site) {
|
|
28
|
+
return `${site.path ?? "unknown file"}:${site.line ?? "?"}`;
|
|
29
|
+
}
|
|
30
|
+
function SiteGuards({ guards, known }) {
|
|
31
|
+
if (guards.length > 0) {
|
|
32
|
+
return guards.map((guard, index) => /* @__PURE__ */ jsx(Badge, { variant: "outline", size: "sm", wrap: true, clickToCopy: false, className: "h-auto py-0.5 font-mono", children: guard }, `${index}-${guard}`));
|
|
33
|
+
}
|
|
34
|
+
if (known === "loading") return null;
|
|
35
|
+
return /* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground", children: known === "known" ? "Unconditional" : "Guards not loaded" });
|
|
36
|
+
}
|
|
37
|
+
function SiteBody({ site, known }) {
|
|
38
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
39
|
+
/* @__PURE__ */ jsx("span", { className: "block font-mono text-xs text-primary", children: siteLocation(site) }),
|
|
40
|
+
site.text && /* @__PURE__ */ jsx("code", { className: "block max-h-24 overflow-hidden whitespace-pre-wrap break-words rounded bg-muted px-1.5 py-1 font-mono text-xs", title: site.text, children: site.text }),
|
|
41
|
+
/* @__PURE__ */ jsx("span", { className: "flex flex-wrap items-center gap-1", children: /* @__PURE__ */ jsx(SiteGuards, { guards: site.guards ?? [], known }) })
|
|
42
|
+
] });
|
|
43
|
+
}
|
|
44
|
+
function guardsKnown(lazy, guards) {
|
|
45
|
+
if (!lazy || (guards == null ? void 0 : guards.status) === "loaded") return "known";
|
|
46
|
+
return (guards == null ? void 0 : guards.status) === "failed" ? "failed" : "loading";
|
|
47
|
+
}
|
|
48
|
+
function EdgeTypeIcon({ type, labels }) {
|
|
49
|
+
const words = labels[type];
|
|
50
|
+
return /* @__PURE__ */ jsx("span", { title: words, className: "flex text-base leading-none", children: /* @__PURE__ */ jsx(EdgeTypeGlyph, { type, title: words }) });
|
|
51
|
+
}
|
|
52
|
+
function isAccess(type) {
|
|
53
|
+
return type === "read" || type === "write";
|
|
54
|
+
}
|
|
55
|
+
function edgeMembers(edge, graph) {
|
|
56
|
+
const own = new Set(memberAccess([edge]).map((member) => `${member.kind}:${member.name}`));
|
|
57
|
+
const siblings = graph.edges.filter((other) => other.id !== edge.id && other.from === edge.from && other.to === edge.to);
|
|
58
|
+
return memberAccess([edge, ...siblings]).filter((member) => own.has(`${member.kind}:${member.name}`));
|
|
59
|
+
}
|
|
60
|
+
function MemberLists({ members }) {
|
|
61
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
62
|
+
/* @__PURE__ */ jsx(MemberChips, { label: "Columns", members: members.filter((member) => member.kind === "column") }),
|
|
63
|
+
/* @__PURE__ */ jsx(MemberChips, { label: "Fields", members: members.filter((member) => member.kind === "field") })
|
|
64
|
+
] });
|
|
65
|
+
}
|
|
66
|
+
function GuardsStatus({ guards }) {
|
|
67
|
+
if ((guards == null ? void 0 : guards.status) === "loading") return /* @__PURE__ */ jsx("p", { role: "status", className: "text-xs text-muted-foreground", children: "Loading guards…" });
|
|
68
|
+
if ((guards == null ? void 0 : guards.status) === "failed") return /* @__PURE__ */ jsx("p", { role: "alert", className: "text-xs text-destructive", children: guards.error });
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
function EdgeSites({ edge, graph, labels, guards, lazyGuards = false, siteAction }) {
|
|
72
|
+
const sites = (guards == null ? void 0 : guards.status) === "loaded" ? guards.sites : edge.sites;
|
|
73
|
+
const known = guardsKnown(lazyGuards, guards);
|
|
74
|
+
const properties = propertyLines(memberChips(edge.properties).rest);
|
|
75
|
+
const noun = isAccess(edge.type) ? "access" : "call";
|
|
76
|
+
return /* @__PURE__ */ jsxs("section", { className: "space-y-2", "aria-label": `${capitalize(noun)} sites`, children: [
|
|
77
|
+
/* @__PURE__ */ jsxs("header", { className: "space-y-1", children: [
|
|
78
|
+
/* @__PURE__ */ jsxs("h3", { className: "break-words text-sm font-semibold", children: [
|
|
79
|
+
requireNode(graph, edge.from).label,
|
|
80
|
+
" → ",
|
|
81
|
+
requireNode(graph, edge.to).label
|
|
82
|
+
] }),
|
|
83
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-1.5 text-xs text-muted-foreground", children: [
|
|
84
|
+
/* @__PURE__ */ jsx(EdgeTypeIcon, { type: edge.type, labels }),
|
|
85
|
+
edge.kind && /* @__PURE__ */ jsx(Badge, { variant: "outline", size: "sm", clickToCopy: false, children: edge.kind }),
|
|
86
|
+
/* @__PURE__ */ jsxs("span", { children: [
|
|
87
|
+
sites.length,
|
|
88
|
+
" ",
|
|
89
|
+
noun,
|
|
90
|
+
" ",
|
|
91
|
+
sites.length === 1 ? "site" : "sites"
|
|
92
|
+
] })
|
|
93
|
+
] }),
|
|
94
|
+
/* @__PURE__ */ jsx(MemberLists, { members: edgeMembers(edge, graph) }),
|
|
95
|
+
properties.length > 0 && /* @__PURE__ */ jsx("ul", { className: "space-y-0.5 text-xs", "aria-label": "Edge properties", children: properties.map((line) => /* @__PURE__ */ jsx("li", { className: "break-words font-mono", children: line }, line)) })
|
|
96
|
+
] }),
|
|
97
|
+
/* @__PURE__ */ jsx(GuardsStatus, { guards }),
|
|
98
|
+
/* @__PURE__ */ jsx("ol", { className: "divide-y divide-border rounded-md border border-border", children: sites.map((site) => /* @__PURE__ */ jsx("li", { children: siteAction ? /* @__PURE__ */ jsx(ActionTarget, { action: siteAction(site), className: "block w-full space-y-1.5 px-3 py-2.5 text-left hover:bg-muted", label: `Open ${siteLocation(site)}`, children: /* @__PURE__ */ jsx(SiteBody, { site, known }) }) : /* @__PURE__ */ jsx("div", { className: "space-y-1.5 px-3 py-2.5", children: /* @__PURE__ */ jsx(SiteBody, { site, known }) }) }, `${siteLocation(site)}:${site.column ?? 0}`)) })
|
|
99
|
+
] });
|
|
100
|
+
}
|
|
101
|
+
function Mono({ children }) {
|
|
102
|
+
return /* @__PURE__ */ jsx("span", { className: "break-all font-mono text-xs", children });
|
|
103
|
+
}
|
|
104
|
+
function backingItem(node, vocabulary, onFocus) {
|
|
105
|
+
var _a;
|
|
106
|
+
const backing = (_a = vocabulary.backing) == null ? void 0 : _a.call(vocabulary, node);
|
|
107
|
+
if (!backing) return [];
|
|
108
|
+
const value = onFocus ? /* @__PURE__ */ jsx("button", { type: "button", className: "break-all font-mono text-xs text-primary hover:underline", "aria-label": `Focus ${backing.label}`, onClick: () => onFocus(backing.id), children: backing.label }) : /* @__PURE__ */ jsx(Mono, { children: backing.label });
|
|
109
|
+
return [{ key: "backing", label: "Column", value }];
|
|
110
|
+
}
|
|
111
|
+
function totalItems(totals) {
|
|
112
|
+
const labels = [["callers", "Callers"], ["callees", "Callees"]];
|
|
113
|
+
return labels.map(([key, label]) => ({ key, label, value: totals[key], hidden: totals[key] === void 0 }));
|
|
114
|
+
}
|
|
115
|
+
function accessItems(node, graph, vocabulary) {
|
|
116
|
+
if (!vocabulary.isData(node)) return [];
|
|
117
|
+
const into = graph.edges.filter((edge) => edge.to === node.id);
|
|
118
|
+
const members = memberAccess(into);
|
|
119
|
+
const memberItem = (kind, label) => {
|
|
120
|
+
const touched = members.filter((member) => member.kind === kind);
|
|
121
|
+
return { key: `members:${kind}`, label, value: /* @__PURE__ */ jsx(MemberChipList, { label, members: touched }), hidden: touched.length === 0 };
|
|
122
|
+
};
|
|
123
|
+
const namesItem = (type, label) => {
|
|
124
|
+
const names = into.filter((edge) => edge.type === type).map((edge) => requireNode(graph, edge.from).label);
|
|
125
|
+
return { key: type, label, value: /* @__PURE__ */ jsx(NameList, { label, names }), hidden: names.length === 0 };
|
|
126
|
+
};
|
|
127
|
+
return [memberItem("column", "Columns"), memberItem("field", "Fields"), namesItem("read", "Readers"), namesItem("write", "Writers")];
|
|
128
|
+
}
|
|
129
|
+
function nodeItems(node, graph, vocabulary, onFocus) {
|
|
130
|
+
var _a, _b;
|
|
131
|
+
const { module, package: pkg, type, method, signature } = node.identifier;
|
|
132
|
+
const kind = vocabulary.kindOf(graph, node);
|
|
133
|
+
const group = ((_b = (_a = graph.groups) == null ? void 0 : _a.find((candidate) => candidate.id === node.group)) == null ? void 0 : _b.label) ?? node.group;
|
|
134
|
+
const backing = backingItem(node, vocabulary, onFocus);
|
|
135
|
+
const properties = Object.entries(node.properties ?? {}).filter(([key]) => !(backing.length > 0 && key === "column"));
|
|
136
|
+
const location = node.location;
|
|
137
|
+
return [
|
|
138
|
+
{
|
|
139
|
+
key: "identifier",
|
|
140
|
+
label: "Identifier",
|
|
141
|
+
value: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1.5", children: [
|
|
142
|
+
/* @__PURE__ */ jsx("span", { title: kind, className: "flex shrink-0 text-base leading-none", children: /* @__PURE__ */ jsx(NodeGlyphIcon, { vocabulary, glyph: vocabulary.glyphOf(graph, node), title: kind }) }),
|
|
143
|
+
/* @__PURE__ */ jsx("span", { className: "min-w-0 break-words", children: [type, method].filter(Boolean).join(".") || node.label })
|
|
144
|
+
] })
|
|
145
|
+
},
|
|
146
|
+
{ key: "signature", label: "Signature", value: /* @__PURE__ */ jsx(Mono, { children: signature }), hidden: !signature },
|
|
147
|
+
{ key: "package", label: "Package", value: /* @__PURE__ */ jsx(Mono, { children: pkg }), hidden: !pkg },
|
|
148
|
+
{ key: "module", label: "Module", value: module, hidden: !module },
|
|
149
|
+
{ key: "group", label: capitalize(vocabulary.group.noun), value: /* @__PURE__ */ jsx(Mono, { children: group }), hidden: !group || group === pkg },
|
|
150
|
+
{ key: "location", label: "Location", value: /* @__PURE__ */ jsx(Mono, { children: siteLocation(location ?? {}) }), hidden: !(location == null ? void 0 : location.path) },
|
|
151
|
+
...backing,
|
|
152
|
+
...properties.map(([key, value]) => ({ key: `property:${key}`, label: key, value: /* @__PURE__ */ jsx(Mono, { children: value }) })),
|
|
153
|
+
...accessItems(node, graph, vocabulary),
|
|
154
|
+
...totalItems(walkedTotals(graph, node, vocabulary)),
|
|
155
|
+
{ key: "status", label: "Status", value: vocabulary.status(node) }
|
|
156
|
+
];
|
|
157
|
+
}
|
|
158
|
+
function NodeDetails({ node, graph, vocabulary, isRoot, opens, open, openLabel, onFocus }) {
|
|
159
|
+
const sourced = vocabulary.hasSource(node);
|
|
160
|
+
return /* @__PURE__ */ jsxs("section", { className: "space-y-2", "aria-label": "Node details", children: [
|
|
161
|
+
/* @__PURE__ */ jsx("h3", { className: "break-words text-sm font-semibold", children: node.label }),
|
|
162
|
+
/* @__PURE__ */ jsx(KeyValueList, { items: nodeItems(node, graph, vocabulary, onFocus), rowClassName: "grid-cols-[5.5rem_minmax(0,1fr)] gap-density-2", valueClassName: "text-xs" }),
|
|
163
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-wrap gap-2", children: [
|
|
164
|
+
opens && ((open == null ? void 0 : open.href) !== void 0 && sourced ? /* @__PURE__ */ jsx(Button, { asChild: true, size: "sm", variant: "outline", children: /* @__PURE__ */ jsx(ActionTarget, { action: open, className: "", label: `${openLabel} ${node.label}`, children: openLabel }) }) : /* @__PURE__ */ jsx(Button, { type: "button", size: "sm", variant: "outline", disabled: !sourced || !(open == null ? void 0 : open.onSelect), onClick: open == null ? void 0 : open.onSelect, children: openLabel })),
|
|
165
|
+
onFocus && /* @__PURE__ */ jsx(Button, { type: "button", size: "sm", variant: "outline", disabled: !vocabulary.canRoot(node) || isRoot, onClick: () => onFocus(node.id), children: "Focus" })
|
|
166
|
+
] })
|
|
167
|
+
] });
|
|
168
|
+
}
|
|
169
|
+
const EDGE_TYPES = ["call", "dispatch", "read", "write"];
|
|
170
|
+
const EDGE_LINE = {
|
|
171
|
+
call: void 0,
|
|
172
|
+
dispatch: "border-sky-500",
|
|
173
|
+
read: "border-emerald-500",
|
|
174
|
+
write: "border-amber-500"
|
|
175
|
+
};
|
|
176
|
+
function LegendEntry({ mark, children }) {
|
|
177
|
+
return /* @__PURE__ */ jsxs("li", { className: "flex items-center gap-1.5", children: [
|
|
178
|
+
/* @__PURE__ */ jsx("span", { className: "flex shrink-0 items-center gap-1 text-base leading-none", children: mark }),
|
|
179
|
+
children
|
|
180
|
+
] });
|
|
181
|
+
}
|
|
182
|
+
function Legend({ graph, vocabulary, labels }) {
|
|
183
|
+
const GroupIcon = vocabulary.group.icon;
|
|
184
|
+
return /* @__PURE__ */ jsxs("ul", { className: "flex flex-wrap items-center gap-x-4 gap-y-1.5 text-xs text-muted-foreground", "aria-label": "Legend", children: [
|
|
185
|
+
usedGlyphs(graph, vocabulary).map((glyph) => /* @__PURE__ */ jsx(LegendEntry, { mark: /* @__PURE__ */ jsx(GlyphIcon, { glyph }), children: glyph.name }, glyph.id)),
|
|
186
|
+
(graph.groups ?? []).length > 0 && /* @__PURE__ */ jsx(LegendEntry, { mark: /* @__PURE__ */ jsx(GroupIcon, {}), children: vocabulary.group.noun }),
|
|
187
|
+
/* @__PURE__ */ jsx(LegendEntry, { mark: /* @__PURE__ */ jsx("span", { className: "inline-block h-3 w-5 rounded border border-sky-500/60 bg-sky-500/10" }), children: "root" }),
|
|
188
|
+
/* @__PURE__ */ jsx(LegendEntry, { mark: /* @__PURE__ */ jsx("span", { className: "inline-block h-3 w-5 rounded border border-dashed border-border bg-muted" }), children: "no source: not expandable" }),
|
|
189
|
+
EDGE_TYPES.filter((type) => graph.edges.some((edge) => edge.type === type)).map((type) => /* @__PURE__ */ jsx(LegendEntry, { mark: /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
190
|
+
EDGE_LINE[type] && /* @__PURE__ */ jsx("span", { className: cn("inline-block w-6 border-t-2", EDGE_LINE[type]) }),
|
|
191
|
+
/* @__PURE__ */ jsx(EdgeTypeGlyph, { type })
|
|
192
|
+
] }), children: labels[type] }, type)),
|
|
193
|
+
/* @__PURE__ */ jsx(LegendEntry, { mark: /* @__PURE__ */ jsx("span", { className: "inline-block w-6 border-t-2 border-dashed border-muted-foreground" }), children: "every site guarded" }),
|
|
194
|
+
/* @__PURE__ */ jsx(LegendEntry, { mark: /* @__PURE__ */ jsx("span", { className: "text-xs font-semibold", children: "×N" }), children: "sites on one edge" }),
|
|
195
|
+
/* @__PURE__ */ jsx(LegendEntry, { mark: /* @__PURE__ */ jsx("span", { className: "text-xs font-semibold", children: "+N" }), children: "more to load" }),
|
|
196
|
+
/* @__PURE__ */ jsx(LegendEntry, { mark: /* @__PURE__ */ jsx(UiWarningTriangle, {}), children: "not drawn" })
|
|
197
|
+
] });
|
|
198
|
+
}
|
|
199
|
+
export {
|
|
200
|
+
EdgeSites,
|
|
201
|
+
Legend,
|
|
202
|
+
NodeDetails
|
|
203
|
+
};
|
|
204
|
+
//# sourceMappingURL=CallGraphParts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CallGraphParts.js","sources":["../../../src/data/call-graph/CallGraphParts.tsx"],"sourcesContent":["import type { MouseEvent, ReactNode } from \"react\";\nimport { Button } from \"../../components/button\";\nimport { UiWarningTriangle } from \"../../icons\";\nimport { Badge } from \"../Badge\";\nimport { KeyValueList, type KeyValueListItem } from \"../KeyValueList\";\nimport { cn } from \"../../lib/utils\";\nimport { capitalize, memberAccess, memberChips, propertyLines, type MemberAccess } from \"./call-graph-labels\";\nimport { requireNode, walkedTotals, type NodeTotals } from \"./call-graph-model\";\nimport { usedGlyphs, type CallGraphVocabulary } from \"./call-graph-vocabulary\";\nimport { EdgeTypeGlyph, GlyphIcon, NodeGlyphIcon } from \"./CallGraphGlyphs\";\nimport { MemberChipList, MemberChips, NameList } from \"./CallGraphMembers\";\nimport type { CallGraph, CallGraphEdge, CallGraphEdgeLabels, CallGraphEdgeType, CallGraphNode, CallGraphSite, SiteGuardsState } from \"./types\";\n\n/** Where an action goes: a link, a handler, or a link a host router intercepts on a plain click. */\nexport interface CallGraphAction {\n href?: string;\n onSelect?: () => void;\n}\n\nfunction plainClick(event: MouseEvent): boolean {\n return event.button === 0 && !event.metaKey && !event.ctrlKey && !event.shiftKey && !event.altKey;\n}\n\nfunction ActionTarget({ action, className, label, children }: { action: CallGraphAction; className: string; label: string; children: ReactNode }) {\n const { href, onSelect } = action;\n if (href === undefined) {\n return <button type=\"button\" className={className} aria-label={label} onClick={onSelect}>{children}</button>;\n }\n const onClick = onSelect && ((event: MouseEvent) => {\n if (!plainClick(event)) return;\n event.preventDefault();\n onSelect();\n });\n return <a href={href} className={className} aria-label={label} {...(onClick ? { onClick } : {})}>{children}</a>;\n}\n\nfunction siteLocation(site: CallGraphSite): string {\n return `${site.path ?? \"unknown file\"}:${site.line ?? \"?\"}`;\n}\n\n/**\n * What a site's guards say: its guards, or \"Unconditional\" once they are known to be none. A site whose\n * guards the host has yet to load says nothing while they load, and that they are not loaded if that failed.\n */\nfunction SiteGuards({ guards, known }: { guards: string[]; known: GuardsKnown }) {\n if (guards.length > 0) {\n return guards.map((guard, index) => (\n <Badge key={`${index}-${guard}`} variant=\"outline\" size=\"sm\" wrap clickToCopy={false} className=\"h-auto py-0.5 font-mono\">{guard}</Badge>\n ));\n }\n if (known === \"loading\") return null;\n return <span className=\"text-xs text-muted-foreground\">{known === \"known\" ? \"Unconditional\" : \"Guards not loaded\"}</span>;\n}\n\ntype GuardsKnown = \"known\" | \"loading\" | \"failed\";\n\nfunction SiteBody({ site, known }: { site: CallGraphSite; known: GuardsKnown }) {\n return (\n <>\n <span className=\"block font-mono text-xs text-primary\">{siteLocation(site)}</span>\n {site.text && (\n <code className=\"block max-h-24 overflow-hidden whitespace-pre-wrap break-words rounded bg-muted px-1.5 py-1 font-mono text-xs\" title={site.text}>\n {site.text}\n </code>\n )}\n <span className=\"flex flex-wrap items-center gap-1\">\n <SiteGuards guards={site.guards ?? []} known={known} />\n </span>\n </>\n );\n}\n\n/** Whether a site without guards has none: always, unless the host loads them, and then once they loaded. */\nfunction guardsKnown(lazy: boolean, guards: SiteGuardsState | undefined): GuardsKnown {\n if (!lazy || guards?.status === \"loaded\") return \"known\";\n return guards?.status === \"failed\" ? \"failed\" : \"loading\";\n}\n\n/** The edge's type as its icon, with its words as the tooltip. */\nfunction EdgeTypeIcon({ type, labels }: { type: CallGraphEdgeType; labels: CallGraphEdgeLabels }) {\n const words = labels[type];\n return <span title={words} className=\"flex text-base leading-none\"><EdgeTypeGlyph type={type} title={words} /></span>;\n}\n\nfunction isAccess(type: CallGraphEdgeType): boolean {\n return type === \"read\" || type === \"write\";\n}\n\n/**\n * The columns and fields a collapsed read or write touches, each marked \"both\" when the edge of the\n * other access type between the same nodes touches it too.\n */\nfunction edgeMembers(edge: CallGraphEdge, graph: CallGraph): MemberAccess[] {\n const own = new Set(memberAccess([edge]).map((member) => `${member.kind}:${member.name}`));\n const siblings = graph.edges.filter((other) => other.id !== edge.id && other.from === edge.from && other.to === edge.to);\n return memberAccess([edge, ...siblings]).filter((member) => own.has(`${member.kind}:${member.name}`));\n}\n\nfunction MemberLists({ members }: { members: readonly MemberAccess[] }) {\n return (\n <>\n <MemberChips label=\"Columns\" members={members.filter((member) => member.kind === \"column\")} />\n <MemberChips label=\"Fields\" members={members.filter((member) => member.kind === \"field\")} />\n </>\n );\n}\n\nfunction GuardsStatus({ guards }: { guards: SiteGuardsState | undefined }) {\n if (guards?.status === \"loading\") return <p role=\"status\" className=\"text-xs text-muted-foreground\">Loading guards…</p>;\n if (guards?.status === \"failed\") return <p role=\"alert\" className=\"text-xs text-destructive\">{guards.error}</p>;\n return null;\n}\n\n/**\n * The call or access sites behind the selected edge: where, the construct as written, and every guard\n * outermost first, after the edge's kind, the columns or fields a collapsed read or write touches, and\n * its other properties. Lazily fetched guards replace the response's sites once they arrive. With\n * `siteAction` each site opens where it is written.\n */\nexport function EdgeSites({ edge, graph, labels, guards, lazyGuards = false, siteAction }: {\n edge: CallGraphEdge;\n graph: CallGraph;\n labels: CallGraphEdgeLabels;\n guards?: SiteGuardsState | undefined;\n /** The host loads the guards on selection: until `guards` has them, a site is not called unconditional. */\n lazyGuards?: boolean;\n siteAction?: ((site: CallGraphSite) => CallGraphAction) | undefined;\n}) {\n const sites = guards?.status === \"loaded\" ? guards.sites : edge.sites;\n const known = guardsKnown(lazyGuards, guards);\n const properties = propertyLines(memberChips(edge.properties).rest);\n const noun = isAccess(edge.type) ? \"access\" : \"call\";\n return (\n <section className=\"space-y-2\" aria-label={`${capitalize(noun)} sites`}>\n <header className=\"space-y-1\">\n <h3 className=\"break-words text-sm font-semibold\">{requireNode(graph, edge.from).label} → {requireNode(graph, edge.to).label}</h3>\n <div className=\"flex flex-wrap items-center gap-1.5 text-xs text-muted-foreground\">\n <EdgeTypeIcon type={edge.type} labels={labels} />\n {edge.kind && <Badge variant=\"outline\" size=\"sm\" clickToCopy={false}>{edge.kind}</Badge>}\n <span>{sites.length} {noun} {sites.length === 1 ? \"site\" : \"sites\"}</span>\n </div>\n <MemberLists members={edgeMembers(edge, graph)} />\n {properties.length > 0 && (\n <ul className=\"space-y-0.5 text-xs\" aria-label=\"Edge properties\">\n {properties.map((line) => <li key={line} className=\"break-words font-mono\">{line}</li>)}\n </ul>\n )}\n </header>\n <GuardsStatus guards={guards} />\n <ol className=\"divide-y divide-border rounded-md border border-border\">\n {sites.map((site) => (\n <li key={`${siteLocation(site)}:${site.column ?? 0}`}>\n {siteAction ? (\n <ActionTarget action={siteAction(site)} className=\"block w-full space-y-1.5 px-3 py-2.5 text-left hover:bg-muted\" label={`Open ${siteLocation(site)}`}>\n <SiteBody site={site} known={known} />\n </ActionTarget>\n ) : (\n <div className=\"space-y-1.5 px-3 py-2.5\"><SiteBody site={site} known={known} /></div>\n )}\n </li>\n ))}\n </ol>\n </section>\n );\n}\n\nfunction Mono({ children }: { children: ReactNode }) {\n return <span className=\"break-all font-mono text-xs\">{children}</span>;\n}\n\n/** The node behind a data node, such as a field's column: a Focus link when the host can re-root. */\nfunction backingItem(node: CallGraphNode, vocabulary: CallGraphVocabulary, onFocus: ((id: string) => void) | undefined): KeyValueListItem[] {\n const backing = vocabulary.backing?.(node);\n if (!backing) return [];\n const value = onFocus\n ? <button type=\"button\" className=\"break-all font-mono text-xs text-primary hover:underline\" aria-label={`Focus ${backing.label}`} onClick={() => onFocus(backing.id)}>{backing.label}</button>\n : <Mono>{backing.label}</Mono>;\n return [{ key: \"backing\", label: \"Column\", value }];\n}\n\nfunction totalItems(totals: NodeTotals): KeyValueListItem[] {\n const labels: [keyof NodeTotals, string][] = [[\"callers\", \"Callers\"], [\"callees\", \"Callees\"]];\n return labels.map(([key, label]) => ({ key, label, value: totals[key], hidden: totals[key] === undefined }));\n}\n\n/**\n * What a data node's readers and writers touch of it, and who they are: the columns or fields of a\n * collapsed table or entity, each marked read, written or both, then the readers' and writers' names.\n */\nfunction accessItems(node: CallGraphNode, graph: CallGraph, vocabulary: CallGraphVocabulary): KeyValueListItem[] {\n if (!vocabulary.isData(node)) return [];\n const into = graph.edges.filter((edge) => edge.to === node.id);\n const members = memberAccess(into);\n const memberItem = (kind: MemberAccess[\"kind\"], label: string): KeyValueListItem => {\n const touched = members.filter((member) => member.kind === kind);\n return { key: `members:${kind}`, label, value: <MemberChipList label={label} members={touched} />, hidden: touched.length === 0 };\n };\n const namesItem = (type: CallGraphEdgeType, label: string): KeyValueListItem => {\n const names = into.filter((edge) => edge.type === type).map((edge) => requireNode(graph, edge.from).label);\n return { key: type, label, value: <NameList label={label} names={names} />, hidden: names.length === 0 };\n };\n return [memberItem(\"column\", \"Columns\"), memberItem(\"field\", \"Fields\"), namesItem(\"read\", \"Readers\"), namesItem(\"write\", \"Writers\")];\n}\n\nfunction nodeItems(node: CallGraphNode, graph: CallGraph, vocabulary: CallGraphVocabulary, onFocus: ((id: string) => void) | undefined): KeyValueListItem[] {\n const { module, package: pkg, type, method, signature } = node.identifier;\n const kind = vocabulary.kindOf(graph, node);\n const group = graph.groups?.find((candidate) => candidate.id === node.group)?.label ?? node.group;\n const backing = backingItem(node, vocabulary, onFocus);\n const properties = Object.entries(node.properties ?? {}).filter(([key]) => !(backing.length > 0 && key === \"column\"));\n const location = node.location;\n return [\n {\n key: \"identifier\",\n label: \"Identifier\",\n value: (\n <span className=\"flex items-center gap-1.5\">\n <span title={kind} className=\"flex shrink-0 text-base leading-none\">\n <NodeGlyphIcon vocabulary={vocabulary} glyph={vocabulary.glyphOf(graph, node)} title={kind} />\n </span>\n <span className=\"min-w-0 break-words\">{[type, method].filter(Boolean).join(\".\") || node.label}</span>\n </span>\n ),\n },\n { key: \"signature\", label: \"Signature\", value: <Mono>{signature}</Mono>, hidden: !signature },\n { key: \"package\", label: \"Package\", value: <Mono>{pkg}</Mono>, hidden: !pkg },\n { key: \"module\", label: \"Module\", value: module, hidden: !module },\n { key: \"group\", label: capitalize(vocabulary.group.noun), value: <Mono>{group}</Mono>, hidden: !group || group === pkg },\n { key: \"location\", label: \"Location\", value: <Mono>{siteLocation(location ?? {})}</Mono>, hidden: !location?.path },\n ...backing,\n ...properties.map(([key, value]) => ({ key: `property:${key}`, label: key, value: <Mono>{value}</Mono> })),\n ...accessItems(node, graph, vocabulary),\n ...totalItems(walkedTotals(graph, node, vocabulary)),\n { key: \"status\", label: \"Status\", value: vocabulary.status(node) },\n ];\n}\n\n/**\n * What a node is and where it is declared, with the actions that open it or re-root the graph on it.\n * When the host `opens` nodes, Open shows on every node, disabled on one with no source or no `open`.\n */\nexport function NodeDetails({ node, graph, vocabulary, isRoot, opens, open, openLabel, onFocus }: {\n node: CallGraphNode;\n graph: CallGraph;\n vocabulary: CallGraphVocabulary;\n isRoot: boolean;\n opens: boolean;\n open?: CallGraphAction | undefined;\n openLabel: string;\n /** Re-roots the graph on a node, by id: this one, or the one behind it. */\n onFocus?: ((id: string) => void) | undefined;\n}) {\n const sourced = vocabulary.hasSource(node);\n return (\n <section className=\"space-y-2\" aria-label=\"Node details\">\n <h3 className=\"break-words text-sm font-semibold\">{node.label}</h3>\n <KeyValueList items={nodeItems(node, graph, vocabulary, onFocus)} rowClassName=\"grid-cols-[5.5rem_minmax(0,1fr)] gap-density-2\" valueClassName=\"text-xs\" />\n <div className=\"flex flex-wrap gap-2\">\n {opens && (open?.href !== undefined && sourced ? (\n <Button asChild size=\"sm\" variant=\"outline\">\n <ActionTarget action={open} className=\"\" label={`${openLabel} ${node.label}`}>{openLabel}</ActionTarget>\n </Button>\n ) : (\n <Button type=\"button\" size=\"sm\" variant=\"outline\" disabled={!sourced || !open?.onSelect} onClick={open?.onSelect}>{openLabel}</Button>\n ))}\n {onFocus && <Button type=\"button\" size=\"sm\" variant=\"outline\" disabled={!vocabulary.canRoot(node) || isRoot} onClick={() => onFocus(node.id)}>Focus</Button>}\n </div>\n </section>\n );\n}\n\nconst EDGE_TYPES: readonly CallGraphEdgeType[] = [\"call\", \"dispatch\", \"read\", \"write\"];\n\n/** The line colour each edge type but a plain call is drawn in, matching its tone in the diagram. */\nconst EDGE_LINE: Record<CallGraphEdgeType, string | undefined> = {\n call: undefined,\n dispatch: \"border-sky-500\",\n read: \"border-emerald-500\",\n write: \"border-amber-500\",\n};\n\nfunction LegendEntry({ mark, children }: { mark: ReactNode; children: ReactNode }) {\n return (\n <li className=\"flex items-center gap-1.5\">\n <span className=\"flex shrink-0 items-center gap-1 text-base leading-none\">{mark}</span>\n {children}\n </li>\n );\n}\n\n/** The key to the icons: one entry per icon this graph draws, then the box and line styles. */\nexport function Legend({ graph, vocabulary, labels }: { graph: CallGraph; vocabulary: CallGraphVocabulary; labels: CallGraphEdgeLabels }) {\n const GroupIcon = vocabulary.group.icon;\n return (\n <ul className=\"flex flex-wrap items-center gap-x-4 gap-y-1.5 text-xs text-muted-foreground\" aria-label=\"Legend\">\n {usedGlyphs(graph, vocabulary).map((glyph) => <LegendEntry key={glyph.id} mark={<GlyphIcon glyph={glyph} />}>{glyph.name}</LegendEntry>)}\n {(graph.groups ?? []).length > 0 && <LegendEntry mark={<GroupIcon />}>{vocabulary.group.noun}</LegendEntry>}\n <LegendEntry mark={<span className=\"inline-block h-3 w-5 rounded border border-sky-500/60 bg-sky-500/10\" />}>root</LegendEntry>\n <LegendEntry mark={<span className=\"inline-block h-3 w-5 rounded border border-dashed border-border bg-muted\" />}>no source: not expandable</LegendEntry>\n {EDGE_TYPES.filter((type) => graph.edges.some((edge) => edge.type === type)).map((type) => (\n <LegendEntry key={type} mark={<>{EDGE_LINE[type] && <span className={cn(\"inline-block w-6 border-t-2\", EDGE_LINE[type])} />}<EdgeTypeGlyph type={type} /></>}>\n {labels[type]}\n </LegendEntry>\n ))}\n <LegendEntry mark={<span className=\"inline-block w-6 border-t-2 border-dashed border-muted-foreground\" />}>every site guarded</LegendEntry>\n <LegendEntry mark={<span className=\"text-xs font-semibold\">×N</span>}>sites on one edge</LegendEntry>\n <LegendEntry mark={<span className=\"text-xs font-semibold\">+N</span>}>more to load</LegendEntry>\n <LegendEntry mark={<UiWarningTriangle />}>not drawn</LegendEntry>\n </ul>\n );\n}\n"],"names":[],"mappings":"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"}
|