@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,250 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useRef, useEffect, useMemo } from "react";
|
|
3
|
+
import { Button } from "../../components/button.js";
|
|
4
|
+
import { cn } from "../../lib/utils.js";
|
|
5
|
+
import { GraphDiagram } from "../GraphDiagram.js";
|
|
6
|
+
import { matchesExclude } from "./call-graph-exclude.js";
|
|
7
|
+
import { CALL_GRAPH_MAX_DEPTH, CALL_GRAPH_DEFAULT_DEPTH, visibleGraph, DEFAULT_EDGE_LABELS, toDiagram, requireNode, columnGap, expansionDirection, mergeGraph } from "./call-graph-model.js";
|
|
8
|
+
import { UIR_CALL_GRAPH_VOCABULARY } from "./call-graph-vocabulary.js";
|
|
9
|
+
import { GroupCaption, EdgeTypeGlyph, NodeGlyphIcon } from "./CallGraphGlyphs.js";
|
|
10
|
+
import { EdgeSites, NodeDetails, Legend } from "./CallGraphParts.js";
|
|
11
|
+
import { CallGraphToolbar } from "./CallGraphToolbar.js";
|
|
12
|
+
import { CALL_GRAPH_ACCESS } from "./types.js";
|
|
13
|
+
import { useHeld, useGraphLoad, useSiteGuards, errorMessage } from "./use-call-graph.js";
|
|
14
|
+
const NODE_WIDTH = 188;
|
|
15
|
+
const NODE_HEIGHT = 32;
|
|
16
|
+
const COMPACT_NODE_HEIGHT = 22;
|
|
17
|
+
const ROW_GAP = 14;
|
|
18
|
+
const READABLE_SCALE = 0.6;
|
|
19
|
+
const OPTIONS = { truncateAt: 32, grouped: true };
|
|
20
|
+
function Notice({ children }) {
|
|
21
|
+
return /* @__PURE__ */ jsx("div", { className: "flex h-full items-center justify-center p-6 text-center", children: /* @__PURE__ */ jsx("span", { className: "text-sm text-muted-foreground", children }) });
|
|
22
|
+
}
|
|
23
|
+
function Alert({ message }) {
|
|
24
|
+
if (!message) return null;
|
|
25
|
+
return /* @__PURE__ */ jsx("div", { role: "alert", className: "whitespace-pre-wrap rounded-md border border-destructive p-3 text-sm text-destructive", children: message });
|
|
26
|
+
}
|
|
27
|
+
const ACCESS_WORDS = { call: "Calls", read: "Reads", write: "Writes" };
|
|
28
|
+
function accessWords(access) {
|
|
29
|
+
return access.map((type) => ACCESS_WORDS[type]).join(" and ");
|
|
30
|
+
}
|
|
31
|
+
function action(href, onSelect) {
|
|
32
|
+
if (href === void 0 && onSelect === void 0) return void 0;
|
|
33
|
+
return { ...href !== void 0 ? { href } : {}, ...onSelect ? { onSelect } : {} };
|
|
34
|
+
}
|
|
35
|
+
function CallGraph(props) {
|
|
36
|
+
var _a, _b;
|
|
37
|
+
const { root, fetchGraph, vocabulary = UIR_CALL_GRAPH_VOCABULARY, maxDepth = CALL_GRAPH_MAX_DEPTH } = props;
|
|
38
|
+
const labels = { ...DEFAULT_EDGE_LABELS, ...props.edgeLabels };
|
|
39
|
+
const [direction, setDirection] = useHeld(props.direction ?? "both", props.onDirectionChange);
|
|
40
|
+
const [depth, setDepth] = useHeld(props.depth ?? CALL_GRAPH_DEFAULT_DEPTH, props.onDepthChange);
|
|
41
|
+
const [exclude, setExclude] = useHeld(props.exclude, props.onExcludeChange);
|
|
42
|
+
const [access, setAccess] = useHeld(props.access ?? [...CALL_GRAPH_ACCESS], props.onAccessChange);
|
|
43
|
+
const [columns, setColumns] = useHeld(props.columns ?? false, props.onColumnsChange);
|
|
44
|
+
if (access.length === 0) throw new Error("call graph: access must name at least one of call, read and write");
|
|
45
|
+
const [ownSelection, setOwnSelection] = useState();
|
|
46
|
+
const request = root === void 0 ? void 0 : { root, direction, depth, exclude, access, columns, purpose: "load" };
|
|
47
|
+
const key = `call-graph:${JSON.stringify([request ?? null, props.fetchKey ?? null])}`;
|
|
48
|
+
const load = useGraphLoad(fetchGraph, request, key);
|
|
49
|
+
const [expanded, setExpanded] = useState();
|
|
50
|
+
const [expanding, setExpanding] = useState();
|
|
51
|
+
const pendingExpansion = useRef(void 0);
|
|
52
|
+
const activeKey = useRef(key);
|
|
53
|
+
activeKey.current = key;
|
|
54
|
+
useEffect(() => {
|
|
55
|
+
setExpanding((current) => (current == null ? void 0 : current.request.key) === key && !current.request.controller.signal.aborted ? current : void 0);
|
|
56
|
+
return () => {
|
|
57
|
+
var _a2;
|
|
58
|
+
if (((_a2 = pendingExpansion.current) == null ? void 0 : _a2.key) === key) {
|
|
59
|
+
pendingExpansion.current.controller.abort();
|
|
60
|
+
pendingExpansion.current = void 0;
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
}, [key]);
|
|
64
|
+
const [opening, setOpening] = useState({ nonce: 0, fit: false });
|
|
65
|
+
const fresh = useMemo(
|
|
66
|
+
() => load.fresh && ((expanded == null ? void 0 : expanded.key) === key ? expanded : { key, graph: load.fresh, revealed: [] }),
|
|
67
|
+
[load.fresh, expanded, key]
|
|
68
|
+
);
|
|
69
|
+
const [last, setLast] = useState();
|
|
70
|
+
if (fresh && fresh !== last) setLast(fresh);
|
|
71
|
+
const shown = root === void 0 ? void 0 : fresh ?? last;
|
|
72
|
+
const graph = shown == null ? void 0 : shown.graph;
|
|
73
|
+
const visible = useMemo(() => shown && visibleGraph(shown.graph, { direction, depth, revealed: shown.revealed }), [shown, direction, depth]);
|
|
74
|
+
const glyphs = useMemo(() => ({
|
|
75
|
+
node: (glyph, words) => /* @__PURE__ */ jsx(NodeGlyphIcon, { vocabulary, glyph, title: words }),
|
|
76
|
+
edge: (type) => type === "call" ? void 0 : /* @__PURE__ */ jsx(EdgeTypeGlyph, { type, title: labels[type] }),
|
|
77
|
+
group: (caption) => /* @__PURE__ */ jsx(GroupCaption, { icon: vocabulary.group.icon, caption })
|
|
78
|
+
}), [vocabulary, labels.dispatch, labels.read, labels.write]);
|
|
79
|
+
const guardLabel = props.guardLabel ?? "innermost";
|
|
80
|
+
const diagram = useMemo(
|
|
81
|
+
() => graph && visible && toDiagram({ graph, visible, direction, options: { ...OPTIONS, guardLabel }, glyphs, vocabulary, edgeLabels: labels }),
|
|
82
|
+
[graph, visible, direction, guardLabel, glyphs, vocabulary, labels.call, labels.dispatch, labels.read, labels.write]
|
|
83
|
+
);
|
|
84
|
+
const rootId = graph == null ? void 0 : graph.roots[0];
|
|
85
|
+
const selection = props.onSelectedChange ? props.selected : (ownSelection == null ? void 0 : ownSelection.key) === (shown == null ? void 0 : shown.key) ? ownSelection == null ? void 0 : ownSelection.selected : void 0;
|
|
86
|
+
const select = (next) => {
|
|
87
|
+
if (props.onSelectedChange) props.onSelectedChange(next);
|
|
88
|
+
else setOwnSelection(next && shown ? { key: shown.key, selected: next } : void 0);
|
|
89
|
+
};
|
|
90
|
+
const openAction = (node, drawn) => {
|
|
91
|
+
var _a2;
|
|
92
|
+
const { onOpenNode, canOpenNode } = props;
|
|
93
|
+
const accepted = onOpenNode && ((canOpenNode == null ? void 0 : canOpenNode(node, drawn)) ?? true) ? () => onOpenNode(node, drawn) : void 0;
|
|
94
|
+
return action((_a2 = props.nodeHref) == null ? void 0 : _a2.call(props, node, drawn), accepted);
|
|
95
|
+
};
|
|
96
|
+
const selectedNode = (selection == null ? void 0 : selection.kind) === "node" ? visible == null ? void 0 : visible.nodes.find((node) => node.id === selection.id) : void 0;
|
|
97
|
+
const selectedEdge = (selection == null ? void 0 : selection.kind) === "edge" ? visible == null ? void 0 : visible.edges.find((edge) => edge.id === selection.id) : void 0;
|
|
98
|
+
const guards = useSiteGuards(props.loadSiteGuards, shown == null ? void 0 : shown.key, selectedEdge, graph);
|
|
99
|
+
const expansion = (expanding == null ? void 0 : expanding.request.key) === key ? expanding : void 0;
|
|
100
|
+
const expand = async (drawn, id) => {
|
|
101
|
+
var _a2, _b2;
|
|
102
|
+
if (drawn.key !== activeKey.current) return;
|
|
103
|
+
if (((_a2 = pendingExpansion.current) == null ? void 0 : _a2.key) === drawn.key && pendingExpansion.current.nodeId === id) return;
|
|
104
|
+
(_b2 = pendingExpansion.current) == null ? void 0 : _b2.controller.abort();
|
|
105
|
+
const node = requireNode(drawn.graph, id);
|
|
106
|
+
const request2 = { key: drawn.key, nodeId: id, label: node.label, controller: new AbortController() };
|
|
107
|
+
pendingExpansion.current = request2;
|
|
108
|
+
setExpanding({ request: request2 });
|
|
109
|
+
try {
|
|
110
|
+
const data = await fetchGraph({
|
|
111
|
+
root: id,
|
|
112
|
+
direction: expansionDirection(node),
|
|
113
|
+
depth: 1,
|
|
114
|
+
exclude,
|
|
115
|
+
access,
|
|
116
|
+
columns,
|
|
117
|
+
purpose: "expand",
|
|
118
|
+
signal: request2.controller.signal
|
|
119
|
+
});
|
|
120
|
+
if (request2.controller.signal.aborted || activeKey.current !== drawn.key || pendingExpansion.current !== request2) return;
|
|
121
|
+
setExpanded((held) => {
|
|
122
|
+
if (request2.controller.signal.aborted || activeKey.current !== drawn.key) return held;
|
|
123
|
+
const base = (held == null ? void 0 : held.key) === drawn.key ? held : drawn;
|
|
124
|
+
return { key: drawn.key, graph: mergeGraph(base.graph, data), revealed: [...base.revealed, ...data.nodes.map((entry) => entry.id)] };
|
|
125
|
+
});
|
|
126
|
+
setExpanding((current) => (current == null ? void 0 : current.request) === request2 ? void 0 : current);
|
|
127
|
+
} catch (error) {
|
|
128
|
+
if (request2.controller.signal.aborted || activeKey.current !== drawn.key || pendingExpansion.current !== request2) return;
|
|
129
|
+
setExpanding((current) => (current == null ? void 0 : current.request) === request2 ? { request: request2, error: `Cannot expand ${node.label}: ${errorMessage(error)}` } : current);
|
|
130
|
+
} finally {
|
|
131
|
+
if (pendingExpansion.current === request2) pendingExpansion.current = void 0;
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
const groups = graph && ((_a = props.groupFacts) == null ? void 0 : _a.call(props, graph));
|
|
135
|
+
const effectiveExclude = exclude ?? (graph && props.defaultExclude ? props.defaultExclude(graph) : []);
|
|
136
|
+
const { onPinnedChange } = props;
|
|
137
|
+
const toolbar = /* @__PURE__ */ jsx(
|
|
138
|
+
CallGraphToolbar,
|
|
139
|
+
{
|
|
140
|
+
direction,
|
|
141
|
+
depth,
|
|
142
|
+
maxDepth,
|
|
143
|
+
omitted: graph == null ? void 0 : graph.omitted,
|
|
144
|
+
end: props.toolbarEnd,
|
|
145
|
+
vocabulary,
|
|
146
|
+
...onPinnedChange ? { pin: { pinned: props.pinned ?? false, canPin: rootId !== void 0, onPin: (pinned) => onPinnedChange(pinned, rootId) } } : {},
|
|
147
|
+
...groups ? { exclusions: {
|
|
148
|
+
exclude: effectiveExclude,
|
|
149
|
+
groups,
|
|
150
|
+
matches: props.excludeMatcher ?? matchesExclude,
|
|
151
|
+
busy: load.loading,
|
|
152
|
+
vocabulary,
|
|
153
|
+
onExclude: (patterns) => setExclude(patterns),
|
|
154
|
+
onDefaults: () => setExclude(void 0)
|
|
155
|
+
} } : {},
|
|
156
|
+
...props.dataAccess ? { data: { access, onAccess: setAccess, columns, onColumns: setColumns } } : {},
|
|
157
|
+
onDirection: setDirection,
|
|
158
|
+
onDepth: setDepth,
|
|
159
|
+
onFit: () => setOpening({ nonce: opening.nonce + 1, fit: true }),
|
|
160
|
+
onReset: () => setOpening({ nonce: opening.nonce + 1, fit: false })
|
|
161
|
+
}
|
|
162
|
+
);
|
|
163
|
+
const frame = cn("flex h-full min-h-0 flex-col gap-2 p-2", props.className);
|
|
164
|
+
if (root === void 0) {
|
|
165
|
+
return /* @__PURE__ */ jsxs("div", { className: frame, children: [
|
|
166
|
+
toolbar,
|
|
167
|
+
/* @__PURE__ */ jsx(Notice, { children: props.emptyMessage ?? "Select a node to draw its call graph." })
|
|
168
|
+
] });
|
|
169
|
+
}
|
|
170
|
+
const loadError = load.error && `Cannot draw the call graph: ${load.error}`;
|
|
171
|
+
return /* @__PURE__ */ jsxs("div", { className: frame, "aria-busy": load.loading, children: [
|
|
172
|
+
toolbar,
|
|
173
|
+
/* @__PURE__ */ jsx(Alert, { message: loadError }),
|
|
174
|
+
graph && ((_b = props.renderHeader) == null ? void 0 : _b.call(props, graph)),
|
|
175
|
+
!shown && load.loading && /* @__PURE__ */ jsx(Notice, { children: "Loading call graph…" }),
|
|
176
|
+
graph && !rootId && /* @__PURE__ */ jsx(Notice, { children: "The root resolved to no node in this scope." }),
|
|
177
|
+
graph && rootId && graph.edges.length === 0 && access.length < CALL_GRAPH_ACCESS.length && /* @__PURE__ */ jsx(Notice, { children: `Nothing is reachable with ${accessWords(access)} only.` }),
|
|
178
|
+
graph && rootId && graph.edges.length > 0 && !selectedEdge && !selectedNode && /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: "Select an edge to list its sites, or a node to see its details." }),
|
|
179
|
+
shown && graph && rootId && diagram && /* @__PURE__ */ jsxs("div", { className: "flex min-h-0 flex-1 gap-3", children: [
|
|
180
|
+
/* @__PURE__ */ jsx("div", { className: cn("relative min-h-64 min-w-0 flex-1 rounded-lg border border-border bg-background", load.loading && "opacity-60"), children: /* @__PURE__ */ jsx(
|
|
181
|
+
GraphDiagram,
|
|
182
|
+
{
|
|
183
|
+
nodes: diagram.nodes,
|
|
184
|
+
edges: diagram.edges,
|
|
185
|
+
groups: diagram.groups,
|
|
186
|
+
layout: "columns",
|
|
187
|
+
zoomable: true,
|
|
188
|
+
wheelZoom: "zoom",
|
|
189
|
+
edgeFocus: "auto",
|
|
190
|
+
focusId: rootId,
|
|
191
|
+
...opening.fit ? {} : { fitMinScale: READABLE_SCALE },
|
|
192
|
+
nodeWidth: NODE_WIDTH,
|
|
193
|
+
nodeHeight: NODE_HEIGHT,
|
|
194
|
+
compactNodeHeight: COMPACT_NODE_HEIGHT,
|
|
195
|
+
columnGap: columnGap(diagram),
|
|
196
|
+
rowGap: ROW_GAP,
|
|
197
|
+
className: "h-full",
|
|
198
|
+
ariaLabel: `Call graph of ${requireNode(graph, rootId).label}`,
|
|
199
|
+
onNodeSelect: (id) => select({ kind: "node", id }),
|
|
200
|
+
onEdgeSelect: (id) => select({ kind: "edge", id }),
|
|
201
|
+
...fresh ? { onNodeExpand: (id) => void expand(fresh, id) } : {},
|
|
202
|
+
...selectedNode ? { selectedId: selectedNode.id } : {},
|
|
203
|
+
...selectedEdge ? { selectedEdgeId: selectedEdge.id } : {}
|
|
204
|
+
},
|
|
205
|
+
`${shown.key}:${opening.nonce}`
|
|
206
|
+
) }),
|
|
207
|
+
(selectedEdge || selectedNode || expansion) && /* @__PURE__ */ jsxs("aside", { className: "w-80 max-w-[45%] shrink-0 overflow-y-auto rounded-lg border border-border bg-card p-3", "aria-label": "Selection", children: [
|
|
208
|
+
expansion && /* @__PURE__ */ jsx("p", { role: "status", className: "mb-2 text-xs text-muted-foreground", children: expansion.error ?? `Loading more around ${expansion.request.label}…` }),
|
|
209
|
+
(selectedEdge || selectedNode) && /* @__PURE__ */ jsx("div", { className: "mb-1 flex justify-end", children: /* @__PURE__ */ jsx(Button, { type: "button", size: "sm", variant: "ghost", "aria-label": "Close selection", onClick: () => select(void 0), children: "×" }) }),
|
|
210
|
+
selectedEdge ? /* @__PURE__ */ jsx(
|
|
211
|
+
EdgeSites,
|
|
212
|
+
{
|
|
213
|
+
edge: selectedEdge,
|
|
214
|
+
graph,
|
|
215
|
+
labels,
|
|
216
|
+
guards,
|
|
217
|
+
lazyGuards: props.loadSiteGuards !== void 0,
|
|
218
|
+
siteAction: (props.siteHref || props.onRevealSite) && vocabulary.hasSource(requireNode(graph, selectedEdge.from)) ? (site) => {
|
|
219
|
+
var _a2;
|
|
220
|
+
return action((_a2 = props.siteHref) == null ? void 0 : _a2.call(props, site, selectedEdge, graph), props.onRevealSite && (() => {
|
|
221
|
+
var _a3;
|
|
222
|
+
return (_a3 = props.onRevealSite) == null ? void 0 : _a3.call(props, site, selectedEdge, graph);
|
|
223
|
+
})) ?? {};
|
|
224
|
+
} : void 0
|
|
225
|
+
}
|
|
226
|
+
) : selectedNode && /* @__PURE__ */ jsx(
|
|
227
|
+
NodeDetails,
|
|
228
|
+
{
|
|
229
|
+
node: selectedNode,
|
|
230
|
+
graph,
|
|
231
|
+
vocabulary,
|
|
232
|
+
isRoot: selectedNode.id === rootId,
|
|
233
|
+
openLabel: props.openLabel ?? "Open",
|
|
234
|
+
opens: props.nodeHref !== void 0 || props.onOpenNode !== void 0,
|
|
235
|
+
open: openAction(selectedNode, graph),
|
|
236
|
+
onFocus: props.onFocusNode && ((id) => {
|
|
237
|
+
var _a2;
|
|
238
|
+
return (_a2 = props.onFocusNode) == null ? void 0 : _a2.call(props, id, graph);
|
|
239
|
+
})
|
|
240
|
+
}
|
|
241
|
+
)
|
|
242
|
+
] })
|
|
243
|
+
] }),
|
|
244
|
+
graph && rootId && /* @__PURE__ */ jsx("div", { className: "shrink-0", children: /* @__PURE__ */ jsx(Legend, { graph, vocabulary, labels }) })
|
|
245
|
+
] });
|
|
246
|
+
}
|
|
247
|
+
export {
|
|
248
|
+
CallGraph
|
|
249
|
+
};
|
|
250
|
+
//# sourceMappingURL=CallGraph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CallGraph.js","sources":["../../../src/data/call-graph/CallGraph.tsx"],"sourcesContent":["// A call graph around one root: fetched through the host, with `+N` expansions merged in, the call\n// sites of a selected edge (guards fetched on selection when the host's graph leaves them out) and the\n// details of a selected node. It knows no language: the host's vocabulary names and draws node kinds,\n// and the host's callbacks open nodes and sites.\nimport { useEffect, useMemo, useRef, useState, type ReactNode } from \"react\";\nimport { Button } from \"../../components/button\";\nimport { cn } from \"../../lib/utils\";\nimport { GraphDiagram } from \"../GraphDiagram\";\nimport { matchesExclude, type ExcludeMatcher } from \"./call-graph-exclude\";\nimport type { GuardLabel } from \"./call-graph-labels\";\nimport {\n CALL_GRAPH_DEFAULT_DEPTH,\n CALL_GRAPH_MAX_DEPTH,\n columnGap,\n DEFAULT_EDGE_LABELS,\n expansionDirection,\n mergeGraph,\n requireNode,\n toDiagram,\n visibleGraph,\n type DiagramGlyphs,\n type DiagramOptions,\n} from \"./call-graph-model\";\nimport { UIR_CALL_GRAPH_VOCABULARY, type CallGraphVocabulary } from \"./call-graph-vocabulary\";\nimport { EdgeTypeGlyph, GroupCaption, NodeGlyphIcon } from \"./CallGraphGlyphs\";\nimport { EdgeSites, Legend, NodeDetails, type CallGraphAction } from \"./CallGraphParts\";\nimport { CallGraphToolbar } from \"./CallGraphToolbar\";\nimport {\n CALL_GRAPH_ACCESS,\n type CallGraph as Graph,\n type CallGraphAccess,\n type CallGraphDirection,\n type CallGraphEdge,\n type CallGraphEdgeLabels,\n type CallGraphFetchParams,\n type CallGraphGroupFact,\n type CallGraphNode,\n type CallGraphSelection,\n type CallGraphSite,\n} from \"./types\";\nimport { errorMessage, useGraphLoad, useHeld, useSiteGuards, type GraphRequest } from \"./use-call-graph\";\n\nexport interface CallGraphProps<G extends Graph = Graph> {\n /** What the graph is drawn around, in the host's terms. Undefined shows `emptyMessage`. */\n root: string | undefined;\n /** Loads the graph around `params.root`, and one hop around a node for its `+N`. */\n fetchGraph: (params: CallGraphFetchParams) => Promise<G>;\n /** What else `fetchGraph` reads, such as the host's scope: part of the request's key, so a change refetches. */\n fetchKey?: string;\n /** Pass `onDirectionChange` to control it; without one the component holds it, starting here. */\n direction?: CallGraphDirection;\n onDirectionChange?: (direction: CallGraphDirection) => void;\n depth?: number;\n onDepthChange?: (depth: number) => void;\n /** The exclusion patterns; undefined takes the host's defaults. Controlled with `onExcludeChange`. */\n exclude?: string[] | undefined;\n onExcludeChange?: (exclude: string[] | undefined) => void;\n selected?: CallGraphSelection | undefined;\n onSelectedChange?: (selected: CallGraphSelection | undefined) => void;\n /** The source reports reads and writes of data: shows the Access toggles and the Columns switch. */\n dataAccess?: boolean;\n /** The edge types the host follows, never empty; all three by default. Controlled with `onAccessChange`. */\n access?: CallGraphAccess[];\n onAccessChange?: (access: CallGraphAccess[]) => void;\n /** Columns and fields as nodes of their own; collapsed into tables and entities by default. */\n columns?: boolean;\n onColumnsChange?: (columns: boolean) => void;\n /** The groups the graph reached, drawn or excluded. Without it the graph offers no exclusions. */\n groupFacts?: (graph: G) => CallGraphGroupFact[];\n /** The patterns in force when `exclude` is undefined: the host's defaults, as its response reports them. */\n defaultExclude?: (graph: G) => string[];\n /** How a pattern matches a group, for a host with keywords of its own. */\n excludeMatcher?: ExcludeMatcher;\n /**\n * Where a node opens. A node the vocabulary gives no source is never opened, and Open is disabled on\n * a node with no href that `onOpenNode` does not accept.\n */\n nodeHref?: (node: CallGraphNode, graph: G) => string | undefined;\n /** Opens a node; with `nodeHref` it handles a plain click on the link. */\n onOpenNode?: (node: CallGraphNode, graph: G) => void;\n /** Whether `onOpenNode` opens a node; every node by default. */\n canOpenNode?: (node: CallGraphNode, graph: G) => boolean;\n openLabel?: string;\n /** Re-roots the graph on a node, by id: a drawn node the vocabulary can root, or the column behind a field. */\n onFocusNode?: (nodeId: string, graph: G) => void;\n /** Where a call site opens; a site opens only when its caller has a source. */\n siteHref?: (site: CallGraphSite, edge: CallGraphEdge, graph: G) => string | undefined;\n onRevealSite?: (site: CallGraphSite, edge: CallGraphEdge, graph: G) => void;\n /** Fetches the guards of a selected edge's sites, for a host whose graph leaves them out. */\n loadSiteGuards?: (edge: CallGraphEdge, graph: G, signal: AbortSignal) => Promise<CallGraphSite[]>;\n edgeLabels?: Partial<CallGraphEdgeLabels>;\n /** What a conditional edge's pill says of its guards; \"innermost\" by default. The edge's tooltip always lists them. */\n guardLabel?: GuardLabel;\n vocabulary?: CallGraphVocabulary;\n /** Shows a Pin root toggle; the host keeps `root` while pinned. */\n pinned?: boolean;\n onPinnedChange?: (pinned: boolean, rootId: string | undefined) => void;\n /** Host facts above the diagram, such as how the root was resolved. */\n renderHeader?: (graph: G) => ReactNode;\n toolbarEnd?: ReactNode;\n emptyMessage?: ReactNode;\n maxDepth?: number;\n className?: string;\n}\n\ntype Held<G> = { key: string; graph: G; revealed: string[] };\ntype PendingExpansion = { key: string; nodeId: string; label: string; controller: AbortController };\n\nconst NODE_WIDTH = 188;\nconst NODE_HEIGHT = 32;\nconst COMPACT_NODE_HEIGHT = 22;\nconst ROW_GAP = 14;\n/** Node labels are 12px: at this scale they are 7.2px, the smallest that still reads. */\nconst READABLE_SCALE = 0.6;\nconst OPTIONS: Omit<DiagramOptions, \"guardLabel\"> = { truncateAt: 32, grouped: true };\n\nfunction Notice({ children }: { children: ReactNode }) {\n return (\n <div className=\"flex h-full items-center justify-center p-6 text-center\">\n <span className=\"text-sm text-muted-foreground\">{children}</span>\n </div>\n );\n}\n\nfunction Alert({ message }: { message: string | undefined }) {\n if (!message) return null;\n return <div role=\"alert\" className=\"whitespace-pre-wrap rounded-md border border-destructive p-3 text-sm text-destructive\">{message}</div>;\n}\n\nconst ACCESS_WORDS: Record<CallGraphAccess, string> = { call: \"Calls\", read: \"Reads\", write: \"Writes\" };\n\nfunction accessWords(access: readonly CallGraphAccess[]): string {\n return access.map((type) => ACCESS_WORDS[type]).join(\" and \");\n}\n\nfunction action(href: string | undefined, onSelect: (() => void) | undefined): CallGraphAction | undefined {\n if (href === undefined && onSelect === undefined) return undefined;\n return { ...(href !== undefined ? { href } : {}), ...(onSelect ? { onSelect } : {}) };\n}\n\nexport function CallGraph<G extends Graph = Graph>(props: CallGraphProps<G>) {\n const { root, fetchGraph, vocabulary = UIR_CALL_GRAPH_VOCABULARY, maxDepth = CALL_GRAPH_MAX_DEPTH } = props;\n const labels: CallGraphEdgeLabels = { ...DEFAULT_EDGE_LABELS, ...props.edgeLabels };\n const [direction, setDirection] = useHeld(props.direction ?? \"both\", props.onDirectionChange);\n const [depth, setDepth] = useHeld(props.depth ?? CALL_GRAPH_DEFAULT_DEPTH, props.onDepthChange);\n const [exclude, setExclude] = useHeld(props.exclude, props.onExcludeChange);\n const [access, setAccess] = useHeld(props.access ?? [...CALL_GRAPH_ACCESS], props.onAccessChange);\n const [columns, setColumns] = useHeld(props.columns ?? false, props.onColumnsChange);\n if (access.length === 0) throw new Error(\"call graph: access must name at least one of call, read and write\");\n const [ownSelection, setOwnSelection] = useState<{ key: string; selected: CallGraphSelection }>();\n\n const request: GraphRequest | undefined = root === undefined ? undefined : { root, direction, depth, exclude, access, columns, purpose: \"load\" };\n const key = `call-graph:${JSON.stringify([request ?? null, props.fetchKey ?? null])}`;\n const load = useGraphLoad(fetchGraph, request, key);\n\n const [expanded, setExpanded] = useState<Held<G>>();\n const [expanding, setExpanding] = useState<{ request: PendingExpansion; error?: string }>();\n const pendingExpansion = useRef<PendingExpansion | undefined>(undefined);\n const activeKey = useRef(key);\n activeKey.current = key;\n useEffect(() => {\n setExpanding((current) => current?.request.key === key && !current.request.controller.signal.aborted ? current : undefined);\n return () => {\n if (pendingExpansion.current?.key === key) {\n pendingExpansion.current.controller.abort();\n pendingExpansion.current = undefined;\n }\n };\n }, [key]);\n const [opening, setOpening] = useState({ nonce: 0, fit: false });\n const fresh = useMemo<Held<G> | undefined>(\n () => load.fresh && (expanded?.key === key ? expanded : { key, graph: load.fresh, revealed: [] }),\n [load.fresh, expanded, key],\n );\n const [last, setLast] = useState<Held<G>>();\n if (fresh && fresh !== last) setLast(fresh);\n const shown = root === undefined ? undefined : (fresh ?? last);\n const graph = shown?.graph;\n\n const visible = useMemo(() => shown && visibleGraph(shown.graph, { direction, depth, revealed: shown.revealed }), [shown, direction, depth]);\n const glyphs = useMemo<DiagramGlyphs>(() => ({\n node: (glyph, words) => <NodeGlyphIcon vocabulary={vocabulary} glyph={glyph} title={words} />,\n edge: (type) => (type === \"call\" ? undefined : <EdgeTypeGlyph type={type} title={labels[type]} />),\n group: (caption) => <GroupCaption icon={vocabulary.group.icon} caption={caption} />,\n }), [vocabulary, labels.dispatch, labels.read, labels.write]);\n const guardLabel = props.guardLabel ?? \"innermost\";\n const diagram = useMemo(\n () => graph && visible && toDiagram({ graph, visible, direction, options: { ...OPTIONS, guardLabel }, glyphs, vocabulary, edgeLabels: labels }),\n [graph, visible, direction, guardLabel, glyphs, vocabulary, labels.call, labels.dispatch, labels.read, labels.write],\n );\n\n const rootId = graph?.roots[0];\n const selection = props.onSelectedChange ? props.selected : ownSelection?.key === shown?.key ? ownSelection?.selected : undefined;\n const select = (next: CallGraphSelection | undefined) => {\n if (props.onSelectedChange) props.onSelectedChange(next);\n else setOwnSelection(next && shown ? { key: shown.key, selected: next } : undefined);\n };\n const openAction = (node: CallGraphNode, drawn: G) => {\n const { onOpenNode, canOpenNode } = props;\n const accepted = onOpenNode && (canOpenNode?.(node, drawn) ?? true) ? () => onOpenNode(node, drawn) : undefined;\n return action(props.nodeHref?.(node, drawn), accepted);\n };\n const selectedNode = selection?.kind === \"node\" ? visible?.nodes.find((node) => node.id === selection.id) : undefined;\n const selectedEdge = selection?.kind === \"edge\" ? visible?.edges.find((edge) => edge.id === selection.id) : undefined;\n const guards = useSiteGuards(props.loadSiteGuards, shown?.key, selectedEdge, graph);\n const expansion = expanding?.request.key === key ? expanding : undefined;\n\n // A `+N` loads one more hop on the node's outer side and merges it into the graph this request drew.\n const expand = async (drawn: Held<G>, id: string) => {\n if (drawn.key !== activeKey.current) return;\n if (pendingExpansion.current?.key === drawn.key && pendingExpansion.current.nodeId === id) return;\n pendingExpansion.current?.controller.abort();\n const node = requireNode(drawn.graph, id);\n const request: PendingExpansion = { key: drawn.key, nodeId: id, label: node.label, controller: new AbortController() };\n pendingExpansion.current = request;\n setExpanding({ request });\n try {\n const data = await fetchGraph({\n root: id, direction: expansionDirection(node), depth: 1, exclude, access, columns, purpose: \"expand\", signal: request.controller.signal,\n });\n if (request.controller.signal.aborted || activeKey.current !== drawn.key || pendingExpansion.current !== request) return;\n setExpanded((held) => {\n if (request.controller.signal.aborted || activeKey.current !== drawn.key) return held;\n const base = held?.key === drawn.key ? held : drawn;\n return { key: drawn.key, graph: mergeGraph(base.graph, data), revealed: [...base.revealed, ...data.nodes.map((entry) => entry.id)] };\n });\n setExpanding((current) => current?.request === request ? undefined : current);\n } catch (error) {\n if (request.controller.signal.aborted || activeKey.current !== drawn.key || pendingExpansion.current !== request) return;\n setExpanding((current) => current?.request === request\n ? { request, error: `Cannot expand ${node.label}: ${errorMessage(error)}` } : current);\n } finally {\n if (pendingExpansion.current === request) pendingExpansion.current = undefined;\n }\n };\n\n const groups = graph && props.groupFacts?.(graph);\n const effectiveExclude = exclude ?? (graph && props.defaultExclude ? props.defaultExclude(graph) : []);\n const { onPinnedChange } = props;\n const toolbar = (\n <CallGraphToolbar direction={direction} depth={depth} maxDepth={maxDepth} omitted={graph?.omitted} end={props.toolbarEnd} vocabulary={vocabulary}\n {...(onPinnedChange ? { pin: { pinned: props.pinned ?? false, canPin: rootId !== undefined, onPin: (pinned: boolean) => onPinnedChange(pinned, rootId) } } : {})}\n {...(groups ? { exclusions: { exclude: effectiveExclude, groups, matches: props.excludeMatcher ?? matchesExclude, busy: load.loading, vocabulary,\n onExclude: (patterns: string[]) => setExclude(patterns), onDefaults: () => setExclude(undefined) } } : {})}\n {...(props.dataAccess ? { data: { access, onAccess: setAccess, columns, onColumns: setColumns } } : {})}\n onDirection={setDirection} onDepth={setDepth}\n onFit={() => setOpening({ nonce: opening.nonce + 1, fit: true })} onReset={() => setOpening({ nonce: opening.nonce + 1, fit: false })} />\n );\n\n const frame = cn(\"flex h-full min-h-0 flex-col gap-2 p-2\", props.className);\n if (root === undefined) {\n return <div className={frame}>{toolbar}<Notice>{props.emptyMessage ?? \"Select a node to draw its call graph.\"}</Notice></div>;\n }\n const loadError = load.error && `Cannot draw the call graph: ${load.error}`;\n return (\n <div className={frame} aria-busy={load.loading}>\n {toolbar}\n <Alert message={loadError} />\n {graph && props.renderHeader?.(graph)}\n {!shown && load.loading && <Notice>Loading call graph…</Notice>}\n {graph && !rootId && <Notice>The root resolved to no node in this scope.</Notice>}\n {graph && rootId && graph.edges.length === 0 && access.length < CALL_GRAPH_ACCESS.length && (\n <Notice>{`Nothing is reachable with ${accessWords(access)} only.`}</Notice>\n )}\n {graph && rootId && graph.edges.length > 0 && !selectedEdge && !selectedNode && (\n <p className=\"text-xs text-muted-foreground\">Select an edge to list its sites, or a node to see its details.</p>\n )}\n {shown && graph && rootId && diagram && (\n <div className=\"flex min-h-0 flex-1 gap-3\">\n <div className={cn(\"relative min-h-64 min-w-0 flex-1 rounded-lg border border-border bg-background\", load.loading && \"opacity-60\")}>\n <GraphDiagram key={`${shown.key}:${opening.nonce}`} nodes={diagram.nodes} edges={diagram.edges} groups={diagram.groups} layout=\"columns\" zoomable wheelZoom=\"zoom\" edgeFocus=\"auto\"\n focusId={rootId} {...(opening.fit ? {} : { fitMinScale: READABLE_SCALE })} nodeWidth={NODE_WIDTH} nodeHeight={NODE_HEIGHT} compactNodeHeight={COMPACT_NODE_HEIGHT} columnGap={columnGap(diagram)} rowGap={ROW_GAP}\n className=\"h-full\" ariaLabel={`Call graph of ${requireNode(graph, rootId).label}`}\n onNodeSelect={(id: string) => select({ kind: \"node\", id })} onEdgeSelect={(id: string) => select({ kind: \"edge\", id })}\n {...(fresh ? { onNodeExpand: (id: string) => void expand(fresh, id) } : {})}\n {...(selectedNode ? { selectedId: selectedNode.id } : {})} {...(selectedEdge ? { selectedEdgeId: selectedEdge.id } : {})} />\n </div>\n {(selectedEdge || selectedNode || expansion) && (\n <aside className=\"w-80 max-w-[45%] shrink-0 overflow-y-auto rounded-lg border border-border bg-card p-3\" aria-label=\"Selection\">\n {expansion && <p role=\"status\" className=\"mb-2 text-xs text-muted-foreground\">{expansion.error ?? `Loading more around ${expansion.request.label}…`}</p>}\n {(selectedEdge || selectedNode) && (\n <div className=\"mb-1 flex justify-end\">\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" aria-label=\"Close selection\" onClick={() => select(undefined)}>×</Button>\n </div>\n )}\n {selectedEdge ? (\n <EdgeSites edge={selectedEdge} graph={graph} labels={labels} guards={guards} lazyGuards={props.loadSiteGuards !== undefined}\n siteAction={(props.siteHref || props.onRevealSite) && vocabulary.hasSource(requireNode(graph, selectedEdge.from))\n ? (site) => action(props.siteHref?.(site, selectedEdge, graph), props.onRevealSite && (() => props.onRevealSite?.(site, selectedEdge, graph))) ?? {}\n : undefined} />\n ) : selectedNode && (\n <NodeDetails node={selectedNode} graph={graph} vocabulary={vocabulary} isRoot={selectedNode.id === rootId} openLabel={props.openLabel ?? \"Open\"}\n opens={props.nodeHref !== undefined || props.onOpenNode !== undefined} open={openAction(selectedNode, graph)}\n onFocus={props.onFocusNode && ((id: string) => props.onFocusNode?.(id, graph))} />\n )}\n </aside>\n )}\n </div>\n )}\n {graph && rootId && <div className=\"shrink-0\"><Legend graph={graph} vocabulary={vocabulary} labels={labels} /></div>}\n </div>\n );\n}\n"],"names":["_a","_b","request"],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const jsxRuntime = require("react/jsx-runtime");
|
|
4
|
+
const useTheme = require("../../hooks/use-theme.cjs");
|
|
5
|
+
const callGraphVocabulary = require("./call-graph-vocabulary.cjs");
|
|
6
|
+
const UiWriteAccess = require("../../icons/components/UiWriteAccess.cjs");
|
|
7
|
+
const UiReadAccess = require("../../icons/components/UiReadAccess.cjs");
|
|
8
|
+
const UiShowToImplement = require("../../icons/components/UiShowToImplement.cjs");
|
|
9
|
+
const UiArrowRight = require("../../icons/components/UiArrowRight.cjs");
|
|
10
|
+
function Themed({ glyph, ...props }) {
|
|
11
|
+
const Icon = useTheme.useResolvedTheme() === "dark" && glyph.darkIcon ? glyph.darkIcon : glyph.icon;
|
|
12
|
+
return /* @__PURE__ */ jsxRuntime.jsx(Icon, { ...props });
|
|
13
|
+
}
|
|
14
|
+
function GlyphIcon({ glyph, ...props }) {
|
|
15
|
+
return /* @__PURE__ */ jsxRuntime.jsx(Themed, { glyph, ...props });
|
|
16
|
+
}
|
|
17
|
+
function NodeGlyphIcon({ vocabulary, glyph, ...props }) {
|
|
18
|
+
return /* @__PURE__ */ jsxRuntime.jsx(Themed, { glyph: callGraphVocabulary.requireGlyph(vocabulary, glyph), ...props });
|
|
19
|
+
}
|
|
20
|
+
const EDGE_GLYPHS = {
|
|
21
|
+
call: { icon: UiArrowRight.UiArrowRight },
|
|
22
|
+
dispatch: { icon: UiShowToImplement.UiShowToImplement, darkIcon: UiShowToImplement.UiShowToImplementDark },
|
|
23
|
+
read: { icon: UiReadAccess.UiReadAccess, darkIcon: UiReadAccess.UiReadAccessDark },
|
|
24
|
+
write: { icon: UiWriteAccess.UiWriteAccess, darkIcon: UiWriteAccess.UiWriteAccessDark }
|
|
25
|
+
};
|
|
26
|
+
function EdgeTypeGlyph({ type, ...props }) {
|
|
27
|
+
return /* @__PURE__ */ jsxRuntime.jsx(Themed, { glyph: EDGE_GLYPHS[type], ...props });
|
|
28
|
+
}
|
|
29
|
+
function GroupCaption({ icon: Icon, caption }) {
|
|
30
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
31
|
+
/* @__PURE__ */ jsxRuntime.jsx(Icon, { className: "mr-1 inline-block align-[-0.15em]" }),
|
|
32
|
+
caption
|
|
33
|
+
] });
|
|
34
|
+
}
|
|
35
|
+
exports.EdgeTypeGlyph = EdgeTypeGlyph;
|
|
36
|
+
exports.GlyphIcon = GlyphIcon;
|
|
37
|
+
exports.GroupCaption = GroupCaption;
|
|
38
|
+
exports.NodeGlyphIcon = NodeGlyphIcon;
|
|
39
|
+
//# sourceMappingURL=CallGraphGlyphs.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CallGraphGlyphs.cjs","sources":["../../../src/data/call-graph/CallGraphGlyphs.tsx"],"sourcesContent":["// The icons the call graph uses in place of words. The vocabulary decides which glyph a node gets;\n// this file only draws it, picking a glyph's dark drawing in the dark theme.\nimport { useResolvedTheme } from \"../../hooks/use-theme\";\nimport {\n UiArrowRight,\n UiReadAccess,\n UiReadAccessDark,\n UiShowToImplement,\n UiShowToImplementDark,\n UiWriteAccess,\n UiWriteAccessDark,\n type IconComponent,\n type IconProps,\n} from \"../../icons\";\nimport { requireGlyph, type CallGraphGlyph, type CallGraphVocabulary } from \"./call-graph-vocabulary\";\nimport type { CallGraphEdgeType } from \"./types\";\n\nfunction Themed({ glyph, ...props }: IconProps & { glyph: Pick<CallGraphGlyph, \"icon\" | \"darkIcon\"> }) {\n const Icon = useResolvedTheme() === \"dark\" && glyph.darkIcon ? glyph.darkIcon : glyph.icon;\n return <Icon {...props} />;\n}\n\nexport function GlyphIcon({ glyph, ...props }: IconProps & { glyph: CallGraphGlyph }) {\n return <Themed glyph={glyph} {...props} />;\n}\n\nexport function NodeGlyphIcon({ vocabulary, glyph, ...props }: IconProps & { vocabulary: CallGraphVocabulary; glyph: string }) {\n return <Themed glyph={requireGlyph(vocabulary, glyph)} {...props} />;\n}\n\n// Each edge type's icon: a plain call is the arrow the graph draws; dispatch reaches one of several\n// targets chosen at run time; a read and a write touch data.\nconst EDGE_GLYPHS: Record<CallGraphEdgeType, Pick<CallGraphGlyph, \"icon\" | \"darkIcon\">> = {\n call: { icon: UiArrowRight },\n dispatch: { icon: UiShowToImplement, darkIcon: UiShowToImplementDark },\n read: { icon: UiReadAccess, darkIcon: UiReadAccessDark },\n write: { icon: UiWriteAccess, darkIcon: UiWriteAccessDark },\n};\n\nexport function EdgeTypeGlyph({ type, ...props }: IconProps & { type: CallGraphEdgeType }) {\n return <Themed glyph={EDGE_GLYPHS[type]} {...props} />;\n}\n\n/** A group box caption: the group icon, then the shortened label, kept inline so the caption still truncates. */\nexport function GroupCaption({ icon: Icon, caption }: { icon: IconComponent; caption: string }) {\n return (\n <>\n <Icon className=\"mr-1 inline-block align-[-0.15em]\" />\n {caption}\n </>\n );\n}\n"],"names":["useResolvedTheme","jsx","requireGlyph","UiArrowRight","UiShowToImplement","UiShowToImplementDark","UiReadAccess","UiReadAccessDark","UiWriteAccess","UiWriteAccessDark","jsxs","Fragment"],"mappings":";;;;;;;;;AAiBA,SAAS,OAAO,EAAE,OAAO,GAAG,SAA2E;AACrG,QAAM,OAAOA,gCAAuB,UAAU,MAAM,WAAW,MAAM,WAAW,MAAM;AACtF,SAAOC,+BAAC,MAAA,EAAM,GAAG,MAAA,CAAO;AAC1B;AAEO,SAAS,UAAU,EAAE,OAAO,GAAG,SAAgD;AACpF,SAAOA,2BAAAA,IAAC,QAAA,EAAO,OAAe,GAAG,MAAA,CAAO;AAC1C;AAEO,SAAS,cAAc,EAAE,YAAY,OAAO,GAAG,SAAyE;AAC7H,SAAOA,2BAAAA,IAAC,UAAO,OAAOC,oBAAAA,aAAa,YAAY,KAAK,GAAI,GAAG,OAAO;AACpE;AAIA,MAAM,cAAoF;AAAA,EACxF,MAAM,EAAE,MAAMC,0BAAA;AAAA,EACd,UAAU,EAAE,MAAMC,qCAAmB,UAAUC,kBAAAA,sBAAA;AAAA,EAC/C,MAAM,EAAE,MAAMC,2BAAc,UAAUC,aAAAA,iBAAA;AAAA,EACtC,OAAO,EAAE,MAAMC,cAAAA,eAAe,UAAUC,cAAAA,kBAAA;AAC1C;AAEO,SAAS,cAAc,EAAE,MAAM,GAAG,SAAkD;AACzF,wCAAQ,QAAA,EAAO,OAAO,YAAY,IAAI,GAAI,GAAG,OAAO;AACtD;AAGO,SAAS,aAAa,EAAE,MAAM,MAAM,WAAqD;AAC9F,SACEC,2BAAAA,KAAAC,qBAAA,EACE,UAAA;AAAA,IAAAV,2BAAAA,IAAC,MAAA,EAAK,WAAU,oCAAA,CAAoC;AAAA,IACnD;AAAA,EAAA,GACH;AAEJ;;;;;"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { IconComponent, IconProps } from '../../icons.js';
|
|
2
|
+
import { CallGraphGlyph, CallGraphVocabulary } from './call-graph-vocabulary.js';
|
|
3
|
+
import { CallGraphEdgeType } from './types.js';
|
|
4
|
+
export declare function GlyphIcon({ glyph, ...props }: IconProps & {
|
|
5
|
+
glyph: CallGraphGlyph;
|
|
6
|
+
}): import("react").JSX.Element;
|
|
7
|
+
export declare function NodeGlyphIcon({ vocabulary, glyph, ...props }: IconProps & {
|
|
8
|
+
vocabulary: CallGraphVocabulary;
|
|
9
|
+
glyph: string;
|
|
10
|
+
}): import("react").JSX.Element;
|
|
11
|
+
export declare function EdgeTypeGlyph({ type, ...props }: IconProps & {
|
|
12
|
+
type: CallGraphEdgeType;
|
|
13
|
+
}): import("react").JSX.Element;
|
|
14
|
+
/** A group box caption: the group icon, then the shortened label, kept inline so the caption still truncates. */
|
|
15
|
+
export declare function GroupCaption({ icon: Icon, caption }: {
|
|
16
|
+
icon: IconComponent;
|
|
17
|
+
caption: string;
|
|
18
|
+
}): import("react").JSX.Element;
|
|
19
|
+
//# sourceMappingURL=CallGraphGlyphs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CallGraphGlyphs.d.ts","sourceRoot":"","sources":["../../../src/data/call-graph/CallGraphGlyphs.tsx"],"names":[],"mappings":"AAGA,OAAO,EAQL,KAAK,aAAa,EAClB,KAAK,SAAS,EACf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAgB,KAAK,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACtG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAOjD,wBAAgB,SAAS,CAAC,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,EAAE,SAAS,GAAG;IAAE,KAAK,EAAE,cAAc,CAAA;CAAE,+BAEnF;AAED,wBAAgB,aAAa,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,EAAE,SAAS,GAAG;IAAE,UAAU,EAAE,mBAAmB,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,+BAE5H;AAWD,wBAAgB,aAAa,CAAC,EAAE,IAAI,EAAE,GAAG,KAAK,EAAE,EAAE,SAAS,GAAG;IAAE,IAAI,EAAE,iBAAiB,CAAA;CAAE,+BAExF;AAED,iHAAiH;AACjH,wBAAgB,YAAY,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,+BAO7F"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { jsxs, Fragment, jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useResolvedTheme } from "../../hooks/use-theme.js";
|
|
3
|
+
import { requireGlyph } from "./call-graph-vocabulary.js";
|
|
4
|
+
import { UiWriteAccessDark, UiWriteAccess } from "../../icons/components/UiWriteAccess.js";
|
|
5
|
+
import { UiReadAccessDark, UiReadAccess } from "../../icons/components/UiReadAccess.js";
|
|
6
|
+
import { UiShowToImplementDark, UiShowToImplement } from "../../icons/components/UiShowToImplement.js";
|
|
7
|
+
import { UiArrowRight } from "../../icons/components/UiArrowRight.js";
|
|
8
|
+
function Themed({ glyph, ...props }) {
|
|
9
|
+
const Icon = useResolvedTheme() === "dark" && glyph.darkIcon ? glyph.darkIcon : glyph.icon;
|
|
10
|
+
return /* @__PURE__ */ jsx(Icon, { ...props });
|
|
11
|
+
}
|
|
12
|
+
function GlyphIcon({ glyph, ...props }) {
|
|
13
|
+
return /* @__PURE__ */ jsx(Themed, { glyph, ...props });
|
|
14
|
+
}
|
|
15
|
+
function NodeGlyphIcon({ vocabulary, glyph, ...props }) {
|
|
16
|
+
return /* @__PURE__ */ jsx(Themed, { glyph: requireGlyph(vocabulary, glyph), ...props });
|
|
17
|
+
}
|
|
18
|
+
const EDGE_GLYPHS = {
|
|
19
|
+
call: { icon: UiArrowRight },
|
|
20
|
+
dispatch: { icon: UiShowToImplement, darkIcon: UiShowToImplementDark },
|
|
21
|
+
read: { icon: UiReadAccess, darkIcon: UiReadAccessDark },
|
|
22
|
+
write: { icon: UiWriteAccess, darkIcon: UiWriteAccessDark }
|
|
23
|
+
};
|
|
24
|
+
function EdgeTypeGlyph({ type, ...props }) {
|
|
25
|
+
return /* @__PURE__ */ jsx(Themed, { glyph: EDGE_GLYPHS[type], ...props });
|
|
26
|
+
}
|
|
27
|
+
function GroupCaption({ icon: Icon, caption }) {
|
|
28
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
29
|
+
/* @__PURE__ */ jsx(Icon, { className: "mr-1 inline-block align-[-0.15em]" }),
|
|
30
|
+
caption
|
|
31
|
+
] });
|
|
32
|
+
}
|
|
33
|
+
export {
|
|
34
|
+
EdgeTypeGlyph,
|
|
35
|
+
GlyphIcon,
|
|
36
|
+
GroupCaption,
|
|
37
|
+
NodeGlyphIcon
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=CallGraphGlyphs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CallGraphGlyphs.js","sources":["../../../src/data/call-graph/CallGraphGlyphs.tsx"],"sourcesContent":["// The icons the call graph uses in place of words. The vocabulary decides which glyph a node gets;\n// this file only draws it, picking a glyph's dark drawing in the dark theme.\nimport { useResolvedTheme } from \"../../hooks/use-theme\";\nimport {\n UiArrowRight,\n UiReadAccess,\n UiReadAccessDark,\n UiShowToImplement,\n UiShowToImplementDark,\n UiWriteAccess,\n UiWriteAccessDark,\n type IconComponent,\n type IconProps,\n} from \"../../icons\";\nimport { requireGlyph, type CallGraphGlyph, type CallGraphVocabulary } from \"./call-graph-vocabulary\";\nimport type { CallGraphEdgeType } from \"./types\";\n\nfunction Themed({ glyph, ...props }: IconProps & { glyph: Pick<CallGraphGlyph, \"icon\" | \"darkIcon\"> }) {\n const Icon = useResolvedTheme() === \"dark\" && glyph.darkIcon ? glyph.darkIcon : glyph.icon;\n return <Icon {...props} />;\n}\n\nexport function GlyphIcon({ glyph, ...props }: IconProps & { glyph: CallGraphGlyph }) {\n return <Themed glyph={glyph} {...props} />;\n}\n\nexport function NodeGlyphIcon({ vocabulary, glyph, ...props }: IconProps & { vocabulary: CallGraphVocabulary; glyph: string }) {\n return <Themed glyph={requireGlyph(vocabulary, glyph)} {...props} />;\n}\n\n// Each edge type's icon: a plain call is the arrow the graph draws; dispatch reaches one of several\n// targets chosen at run time; a read and a write touch data.\nconst EDGE_GLYPHS: Record<CallGraphEdgeType, Pick<CallGraphGlyph, \"icon\" | \"darkIcon\">> = {\n call: { icon: UiArrowRight },\n dispatch: { icon: UiShowToImplement, darkIcon: UiShowToImplementDark },\n read: { icon: UiReadAccess, darkIcon: UiReadAccessDark },\n write: { icon: UiWriteAccess, darkIcon: UiWriteAccessDark },\n};\n\nexport function EdgeTypeGlyph({ type, ...props }: IconProps & { type: CallGraphEdgeType }) {\n return <Themed glyph={EDGE_GLYPHS[type]} {...props} />;\n}\n\n/** A group box caption: the group icon, then the shortened label, kept inline so the caption still truncates. */\nexport function GroupCaption({ icon: Icon, caption }: { icon: IconComponent; caption: string }) {\n return (\n <>\n <Icon className=\"mr-1 inline-block align-[-0.15em]\" />\n {caption}\n </>\n );\n}\n"],"names":[],"mappings":";;;;;;;AAiBA,SAAS,OAAO,EAAE,OAAO,GAAG,SAA2E;AACrG,QAAM,OAAO,uBAAuB,UAAU,MAAM,WAAW,MAAM,WAAW,MAAM;AACtF,SAAO,oBAAC,MAAA,EAAM,GAAG,MAAA,CAAO;AAC1B;AAEO,SAAS,UAAU,EAAE,OAAO,GAAG,SAAgD;AACpF,SAAO,oBAAC,QAAA,EAAO,OAAe,GAAG,MAAA,CAAO;AAC1C;AAEO,SAAS,cAAc,EAAE,YAAY,OAAO,GAAG,SAAyE;AAC7H,SAAO,oBAAC,UAAO,OAAO,aAAa,YAAY,KAAK,GAAI,GAAG,OAAO;AACpE;AAIA,MAAM,cAAoF;AAAA,EACxF,MAAM,EAAE,MAAM,aAAA;AAAA,EACd,UAAU,EAAE,MAAM,mBAAmB,UAAU,sBAAA;AAAA,EAC/C,MAAM,EAAE,MAAM,cAAc,UAAU,iBAAA;AAAA,EACtC,OAAO,EAAE,MAAM,eAAe,UAAU,kBAAA;AAC1C;AAEO,SAAS,cAAc,EAAE,MAAM,GAAG,SAAkD;AACzF,6BAAQ,QAAA,EAAO,OAAO,YAAY,IAAI,GAAI,GAAG,OAAO;AACtD;AAGO,SAAS,aAAa,EAAE,MAAM,MAAM,WAAqD;AAC9F,SACE,qBAAA,UAAA,EACE,UAAA;AAAA,IAAA,oBAAC,MAAA,EAAK,WAAU,oCAAA,CAAoC;AAAA,IACnD;AAAA,EAAA,GACH;AAEJ;"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const jsxRuntime = require("react/jsx-runtime");
|
|
4
|
+
const react = require("react");
|
|
5
|
+
const utils = require("../../lib/utils.cjs");
|
|
6
|
+
const Badge = require("../Badge.cjs");
|
|
7
|
+
const MEMBER_LIMIT = 8;
|
|
8
|
+
const ACCESS_MARK = {
|
|
9
|
+
read: { text: "R", words: "read", className: "text-emerald-600 dark:text-emerald-400" },
|
|
10
|
+
write: { text: "W", words: "written", className: "text-amber-600 dark:text-amber-400" },
|
|
11
|
+
both: { text: "RW", words: "read and written", className: "text-sky-600 dark:text-sky-400" }
|
|
12
|
+
};
|
|
13
|
+
function Overflowing({ label, items, limit, className }) {
|
|
14
|
+
const [expanded, setExpanded] = react.useState(false);
|
|
15
|
+
const hidden = expanded ? 0 : Math.max(0, items.length - limit);
|
|
16
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 flex-wrap items-center gap-1", children: [
|
|
17
|
+
/* @__PURE__ */ jsxRuntime.jsx("ul", { className: utils.cn("flex min-w-0 flex-wrap items-center gap-1", className), "aria-label": label, children: hidden > 0 ? items.slice(0, limit) : items }),
|
|
18
|
+
hidden > 0 && /* @__PURE__ */ jsxRuntime.jsxs("button", { type: "button", className: "rounded px-1 text-xs font-medium text-primary hover:underline", onClick: () => setExpanded(true), children: [
|
|
19
|
+
"+",
|
|
20
|
+
hidden,
|
|
21
|
+
" more"
|
|
22
|
+
] })
|
|
23
|
+
] });
|
|
24
|
+
}
|
|
25
|
+
function MemberChipList({ label, members, limit = MEMBER_LIMIT }) {
|
|
26
|
+
const marked = new Set(members.map((member) => member.access)).size > 1;
|
|
27
|
+
const chips = members.map((member) => {
|
|
28
|
+
const mark = ACCESS_MARK[member.access];
|
|
29
|
+
return /* @__PURE__ */ jsxRuntime.jsx("li", { "data-member": member.name, ...marked ? { "data-access": member.access, title: `${member.name}: ${mark.words}` } : {}, children: /* @__PURE__ */ jsxRuntime.jsxs(Badge.Badge, { variant: "outline", size: "sm", clickToCopy: false, className: "gap-1 font-mono", children: [
|
|
30
|
+
member.name,
|
|
31
|
+
marked && /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": true, className: utils.cn("text-[9px] font-semibold", mark.className), children: mark.text })
|
|
32
|
+
] }) }, member.name);
|
|
33
|
+
});
|
|
34
|
+
return /* @__PURE__ */ jsxRuntime.jsx(Overflowing, { label, items: chips, limit });
|
|
35
|
+
}
|
|
36
|
+
function MemberChips({ label, members }) {
|
|
37
|
+
if (members.length === 0) return null;
|
|
38
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-1.5 text-xs", children: [
|
|
39
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "shrink-0 leading-5 text-muted-foreground", children: label }),
|
|
40
|
+
/* @__PURE__ */ jsxRuntime.jsx(MemberChipList, { label, members })
|
|
41
|
+
] });
|
|
42
|
+
}
|
|
43
|
+
function NameList({ label, names, limit = MEMBER_LIMIT }) {
|
|
44
|
+
const items = names.map((name, index) => /* @__PURE__ */ jsxRuntime.jsx("li", { className: "break-words text-xs", children: name }, `${index}:${name}`));
|
|
45
|
+
return /* @__PURE__ */ jsxRuntime.jsx(Overflowing, { label, items, limit, className: "gap-x-2" });
|
|
46
|
+
}
|
|
47
|
+
exports.MemberChipList = MemberChipList;
|
|
48
|
+
exports.MemberChips = MemberChips;
|
|
49
|
+
exports.NameList = NameList;
|
|
50
|
+
//# sourceMappingURL=CallGraphMembers.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CallGraphMembers.cjs","sources":["../../../src/data/call-graph/CallGraphMembers.tsx"],"sourcesContent":["import { useState, type ReactNode } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { Badge } from \"../Badge\";\nimport type { MemberAccess, MemberAccessKind } from \"./call-graph-labels\";\n\n/** How many chips or names a list shows before a \"+N more\" button reveals the rest. */\nconst MEMBER_LIMIT = 8;\n\nconst ACCESS_MARK: Record<MemberAccessKind, { text: string; words: string; className: string }> = {\n read: { text: \"R\", words: \"read\", className: \"text-emerald-600 dark:text-emerald-400\" },\n write: { text: \"W\", words: \"written\", className: \"text-amber-600 dark:text-amber-400\" },\n both: { text: \"RW\", words: \"read and written\", className: \"text-sky-600 dark:text-sky-400\" },\n};\n\n/** The first `limit` items on one wrapping line, then a button that shows the rest. */\nfunction Overflowing({ label, items, limit, className }: { label: string; items: ReactNode[]; limit: number; className?: string }) {\n const [expanded, setExpanded] = useState(false);\n const hidden = expanded ? 0 : Math.max(0, items.length - limit);\n return (\n <div className=\"flex min-w-0 flex-wrap items-center gap-1\">\n <ul className={cn(\"flex min-w-0 flex-wrap items-center gap-1\", className)} aria-label={label}>\n {hidden > 0 ? items.slice(0, limit) : items}\n </ul>\n {hidden > 0 && (\n <button type=\"button\" className=\"rounded px-1 text-xs font-medium text-primary hover:underline\" onClick={() => setExpanded(true)}>\n +{hidden} more\n </button>\n )}\n </div>\n );\n}\n\n/**\n * The columns or fields a read or write touches, as chips on one wrapping line. When they are not all\n * touched the same way, each chip is marked R, W or RW.\n */\nexport function MemberChipList({ label, members, limit = MEMBER_LIMIT }: { label: string; members: readonly MemberAccess[]; limit?: number }) {\n const marked = new Set(members.map((member) => member.access)).size > 1;\n const chips = members.map((member) => {\n const mark = ACCESS_MARK[member.access];\n return (\n <li key={member.name} data-member={member.name} {...(marked ? { \"data-access\": member.access, title: `${member.name}: ${mark.words}` } : {})}>\n <Badge variant=\"outline\" size=\"sm\" clickToCopy={false} className=\"gap-1 font-mono\">\n {member.name}\n {marked && <span aria-hidden className={cn(\"text-[9px] font-semibold\", mark.className)}>{mark.text}</span>}\n </Badge>\n </li>\n );\n });\n return <Overflowing label={label} items={chips} limit={limit} />;\n}\n\n/** `MemberChipList` after its label, or nothing when there are no members. */\nexport function MemberChips({ label, members }: { label: string; members: readonly MemberAccess[] }) {\n if (members.length === 0) return null;\n return (\n <div className=\"flex items-start gap-1.5 text-xs\">\n <span className=\"shrink-0 leading-5 text-muted-foreground\">{label}</span>\n <MemberChipList label={label} members={members} />\n </div>\n );\n}\n\n/** Node names on one wrapping line, such as who reads or writes a column. */\nexport function NameList({ label, names, limit = MEMBER_LIMIT }: { label: string; names: readonly string[]; limit?: number }) {\n // Two rules in different tiers can share a name.\n const items = names.map((name, index) => <li key={`${index}:${name}`} className=\"break-words text-xs\">{name}</li>);\n return <Overflowing label={label} items={items} limit={limit} className=\"gap-x-2\" />;\n}\n"],"names":["useState","jsxs","jsx","cn","Badge"],"mappings":";;;;;;AAMA,MAAM,eAAe;AAErB,MAAM,cAA4F;AAAA,EAChG,MAAM,EAAE,MAAM,KAAK,OAAO,QAAQ,WAAW,yCAAA;AAAA,EAC7C,OAAO,EAAE,MAAM,KAAK,OAAO,WAAW,WAAW,qCAAA;AAAA,EACjD,MAAM,EAAE,MAAM,MAAM,OAAO,oBAAoB,WAAW,iCAAA;AAC5D;AAGA,SAAS,YAAY,EAAE,OAAO,OAAO,OAAO,aAAuF;AACjI,QAAM,CAAC,UAAU,WAAW,IAAIA,MAAAA,SAAS,KAAK;AAC9C,QAAM,SAAS,WAAW,IAAI,KAAK,IAAI,GAAG,MAAM,SAAS,KAAK;AAC9D,SACEC,2BAAAA,KAAC,OAAA,EAAI,WAAU,6CACb,UAAA;AAAA,IAAAC,2BAAAA,IAAC,MAAA,EAAG,WAAWC,MAAAA,GAAG,6CAA6C,SAAS,GAAG,cAAY,OACpF,UAAA,SAAS,IAAI,MAAM,MAAM,GAAG,KAAK,IAAI,OACxC;AAAA,IACC,SAAS,KACRF,2BAAAA,KAAC,UAAA,EAAO,MAAK,UAAS,WAAU,iEAAgE,SAAS,MAAM,YAAY,IAAI,GAAG,UAAA;AAAA,MAAA;AAAA,MAC9H;AAAA,MAAO;AAAA,IAAA,EAAA,CACX;AAAA,EAAA,GAEJ;AAEJ;AAMO,SAAS,eAAe,EAAE,OAAO,SAAS,QAAQ,gBAAqF;AAC5I,QAAM,SAAS,IAAI,IAAI,QAAQ,IAAI,CAAC,WAAW,OAAO,MAAM,CAAC,EAAE,OAAO;AACtE,QAAM,QAAQ,QAAQ,IAAI,CAAC,WAAW;AACpC,UAAM,OAAO,YAAY,OAAO,MAAM;AACtC,WACEC,2BAAAA,IAAC,MAAA,EAAqB,eAAa,OAAO,MAAO,GAAI,SAAS,EAAE,eAAe,OAAO,QAAQ,OAAO,GAAG,OAAO,IAAI,KAAK,KAAK,KAAK,GAAA,IAAO,CAAA,GACvI,UAAAD,2BAAAA,KAACG,MAAAA,OAAA,EAAM,SAAQ,WAAU,MAAK,MAAK,aAAa,OAAO,WAAU,mBAC9D,UAAA;AAAA,MAAA,OAAO;AAAA,MACP,UAAUF,2BAAAA,IAAC,QAAA,EAAK,eAAW,MAAC,WAAWC,MAAAA,GAAG,4BAA4B,KAAK,SAAS,GAAI,UAAA,KAAK,KAAA,CAAK;AAAA,IAAA,GACrG,EAAA,GAJO,OAAO,IAKhB;AAAA,EAEJ,CAAC;AACD,SAAOD,2BAAAA,IAAC,aAAA,EAAY,OAAc,OAAO,OAAO,OAAc;AAChE;AAGO,SAAS,YAAY,EAAE,OAAO,WAAgE;AACnG,MAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,SACED,2BAAAA,KAAC,OAAA,EAAI,WAAU,oCACb,UAAA;AAAA,IAAAC,2BAAAA,IAAC,QAAA,EAAK,WAAU,4CAA4C,UAAA,OAAM;AAAA,IAClEA,2BAAAA,IAAC,gBAAA,EAAe,OAAc,QAAA,CAAkB;AAAA,EAAA,GAClD;AAEJ;AAGO,SAAS,SAAS,EAAE,OAAO,OAAO,QAAQ,gBAA6E;AAE5H,QAAM,QAAQ,MAAM,IAAI,CAAC,MAAM,UAAUA,2BAAAA,IAAC,MAAA,EAA4B,WAAU,uBAAuB,kBAArD,GAAG,KAAK,IAAI,IAAI,EAA0C,CAAK;AACjH,wCAAQ,aAAA,EAAY,OAAc,OAAc,OAAc,WAAU,WAAU;AACpF;;;;"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { MemberAccess } from './call-graph-labels.js';
|
|
2
|
+
/**
|
|
3
|
+
* The columns or fields a read or write touches, as chips on one wrapping line. When they are not all
|
|
4
|
+
* touched the same way, each chip is marked R, W or RW.
|
|
5
|
+
*/
|
|
6
|
+
export declare function MemberChipList({ label, members, limit }: {
|
|
7
|
+
label: string;
|
|
8
|
+
members: readonly MemberAccess[];
|
|
9
|
+
limit?: number;
|
|
10
|
+
}): import("react").JSX.Element;
|
|
11
|
+
/** `MemberChipList` after its label, or nothing when there are no members. */
|
|
12
|
+
export declare function MemberChips({ label, members }: {
|
|
13
|
+
label: string;
|
|
14
|
+
members: readonly MemberAccess[];
|
|
15
|
+
}): import("react").JSX.Element | null;
|
|
16
|
+
/** Node names on one wrapping line, such as who reads or writes a column. */
|
|
17
|
+
export declare function NameList({ label, names, limit }: {
|
|
18
|
+
label: string;
|
|
19
|
+
names: readonly string[];
|
|
20
|
+
limit?: number;
|
|
21
|
+
}): import("react").JSX.Element;
|
|
22
|
+
//# sourceMappingURL=CallGraphMembers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CallGraphMembers.d.ts","sourceRoot":"","sources":["../../../src/data/call-graph/CallGraphMembers.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,qBAAqB,CAAC;AA6B1E;;;GAGG;AACH,wBAAgB,cAAc,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAoB,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,SAAS,YAAY,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,+BAc3I;AAED,8EAA8E;AAC9E,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,SAAS,YAAY,EAAE,CAAA;CAAE,sCAQlG;AAED,6EAA6E;AAC7E,wBAAgB,QAAQ,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAoB,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,+BAI3H"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
import { cn } from "../../lib/utils.js";
|
|
4
|
+
import { Badge } from "../Badge.js";
|
|
5
|
+
const MEMBER_LIMIT = 8;
|
|
6
|
+
const ACCESS_MARK = {
|
|
7
|
+
read: { text: "R", words: "read", className: "text-emerald-600 dark:text-emerald-400" },
|
|
8
|
+
write: { text: "W", words: "written", className: "text-amber-600 dark:text-amber-400" },
|
|
9
|
+
both: { text: "RW", words: "read and written", className: "text-sky-600 dark:text-sky-400" }
|
|
10
|
+
};
|
|
11
|
+
function Overflowing({ label, items, limit, className }) {
|
|
12
|
+
const [expanded, setExpanded] = useState(false);
|
|
13
|
+
const hidden = expanded ? 0 : Math.max(0, items.length - limit);
|
|
14
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-wrap items-center gap-1", children: [
|
|
15
|
+
/* @__PURE__ */ jsx("ul", { className: cn("flex min-w-0 flex-wrap items-center gap-1", className), "aria-label": label, children: hidden > 0 ? items.slice(0, limit) : items }),
|
|
16
|
+
hidden > 0 && /* @__PURE__ */ jsxs("button", { type: "button", className: "rounded px-1 text-xs font-medium text-primary hover:underline", onClick: () => setExpanded(true), children: [
|
|
17
|
+
"+",
|
|
18
|
+
hidden,
|
|
19
|
+
" more"
|
|
20
|
+
] })
|
|
21
|
+
] });
|
|
22
|
+
}
|
|
23
|
+
function MemberChipList({ label, members, limit = MEMBER_LIMIT }) {
|
|
24
|
+
const marked = new Set(members.map((member) => member.access)).size > 1;
|
|
25
|
+
const chips = members.map((member) => {
|
|
26
|
+
const mark = ACCESS_MARK[member.access];
|
|
27
|
+
return /* @__PURE__ */ jsx("li", { "data-member": member.name, ...marked ? { "data-access": member.access, title: `${member.name}: ${mark.words}` } : {}, children: /* @__PURE__ */ jsxs(Badge, { variant: "outline", size: "sm", clickToCopy: false, className: "gap-1 font-mono", children: [
|
|
28
|
+
member.name,
|
|
29
|
+
marked && /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: cn("text-[9px] font-semibold", mark.className), children: mark.text })
|
|
30
|
+
] }) }, member.name);
|
|
31
|
+
});
|
|
32
|
+
return /* @__PURE__ */ jsx(Overflowing, { label, items: chips, limit });
|
|
33
|
+
}
|
|
34
|
+
function MemberChips({ label, members }) {
|
|
35
|
+
if (members.length === 0) return null;
|
|
36
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-1.5 text-xs", children: [
|
|
37
|
+
/* @__PURE__ */ jsx("span", { className: "shrink-0 leading-5 text-muted-foreground", children: label }),
|
|
38
|
+
/* @__PURE__ */ jsx(MemberChipList, { label, members })
|
|
39
|
+
] });
|
|
40
|
+
}
|
|
41
|
+
function NameList({ label, names, limit = MEMBER_LIMIT }) {
|
|
42
|
+
const items = names.map((name, index) => /* @__PURE__ */ jsx("li", { className: "break-words text-xs", children: name }, `${index}:${name}`));
|
|
43
|
+
return /* @__PURE__ */ jsx(Overflowing, { label, items, limit, className: "gap-x-2" });
|
|
44
|
+
}
|
|
45
|
+
export {
|
|
46
|
+
MemberChipList,
|
|
47
|
+
MemberChips,
|
|
48
|
+
NameList
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=CallGraphMembers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CallGraphMembers.js","sources":["../../../src/data/call-graph/CallGraphMembers.tsx"],"sourcesContent":["import { useState, type ReactNode } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { Badge } from \"../Badge\";\nimport type { MemberAccess, MemberAccessKind } from \"./call-graph-labels\";\n\n/** How many chips or names a list shows before a \"+N more\" button reveals the rest. */\nconst MEMBER_LIMIT = 8;\n\nconst ACCESS_MARK: Record<MemberAccessKind, { text: string; words: string; className: string }> = {\n read: { text: \"R\", words: \"read\", className: \"text-emerald-600 dark:text-emerald-400\" },\n write: { text: \"W\", words: \"written\", className: \"text-amber-600 dark:text-amber-400\" },\n both: { text: \"RW\", words: \"read and written\", className: \"text-sky-600 dark:text-sky-400\" },\n};\n\n/** The first `limit` items on one wrapping line, then a button that shows the rest. */\nfunction Overflowing({ label, items, limit, className }: { label: string; items: ReactNode[]; limit: number; className?: string }) {\n const [expanded, setExpanded] = useState(false);\n const hidden = expanded ? 0 : Math.max(0, items.length - limit);\n return (\n <div className=\"flex min-w-0 flex-wrap items-center gap-1\">\n <ul className={cn(\"flex min-w-0 flex-wrap items-center gap-1\", className)} aria-label={label}>\n {hidden > 0 ? items.slice(0, limit) : items}\n </ul>\n {hidden > 0 && (\n <button type=\"button\" className=\"rounded px-1 text-xs font-medium text-primary hover:underline\" onClick={() => setExpanded(true)}>\n +{hidden} more\n </button>\n )}\n </div>\n );\n}\n\n/**\n * The columns or fields a read or write touches, as chips on one wrapping line. When they are not all\n * touched the same way, each chip is marked R, W or RW.\n */\nexport function MemberChipList({ label, members, limit = MEMBER_LIMIT }: { label: string; members: readonly MemberAccess[]; limit?: number }) {\n const marked = new Set(members.map((member) => member.access)).size > 1;\n const chips = members.map((member) => {\n const mark = ACCESS_MARK[member.access];\n return (\n <li key={member.name} data-member={member.name} {...(marked ? { \"data-access\": member.access, title: `${member.name}: ${mark.words}` } : {})}>\n <Badge variant=\"outline\" size=\"sm\" clickToCopy={false} className=\"gap-1 font-mono\">\n {member.name}\n {marked && <span aria-hidden className={cn(\"text-[9px] font-semibold\", mark.className)}>{mark.text}</span>}\n </Badge>\n </li>\n );\n });\n return <Overflowing label={label} items={chips} limit={limit} />;\n}\n\n/** `MemberChipList` after its label, or nothing when there are no members. */\nexport function MemberChips({ label, members }: { label: string; members: readonly MemberAccess[] }) {\n if (members.length === 0) return null;\n return (\n <div className=\"flex items-start gap-1.5 text-xs\">\n <span className=\"shrink-0 leading-5 text-muted-foreground\">{label}</span>\n <MemberChipList label={label} members={members} />\n </div>\n );\n}\n\n/** Node names on one wrapping line, such as who reads or writes a column. */\nexport function NameList({ label, names, limit = MEMBER_LIMIT }: { label: string; names: readonly string[]; limit?: number }) {\n // Two rules in different tiers can share a name.\n const items = names.map((name, index) => <li key={`${index}:${name}`} className=\"break-words text-xs\">{name}</li>);\n return <Overflowing label={label} items={items} limit={limit} className=\"gap-x-2\" />;\n}\n"],"names":[],"mappings":";;;;AAMA,MAAM,eAAe;AAErB,MAAM,cAA4F;AAAA,EAChG,MAAM,EAAE,MAAM,KAAK,OAAO,QAAQ,WAAW,yCAAA;AAAA,EAC7C,OAAO,EAAE,MAAM,KAAK,OAAO,WAAW,WAAW,qCAAA;AAAA,EACjD,MAAM,EAAE,MAAM,MAAM,OAAO,oBAAoB,WAAW,iCAAA;AAC5D;AAGA,SAAS,YAAY,EAAE,OAAO,OAAO,OAAO,aAAuF;AACjI,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK;AAC9C,QAAM,SAAS,WAAW,IAAI,KAAK,IAAI,GAAG,MAAM,SAAS,KAAK;AAC9D,SACE,qBAAC,OAAA,EAAI,WAAU,6CACb,UAAA;AAAA,IAAA,oBAAC,MAAA,EAAG,WAAW,GAAG,6CAA6C,SAAS,GAAG,cAAY,OACpF,UAAA,SAAS,IAAI,MAAM,MAAM,GAAG,KAAK,IAAI,OACxC;AAAA,IACC,SAAS,KACR,qBAAC,UAAA,EAAO,MAAK,UAAS,WAAU,iEAAgE,SAAS,MAAM,YAAY,IAAI,GAAG,UAAA;AAAA,MAAA;AAAA,MAC9H;AAAA,MAAO;AAAA,IAAA,EAAA,CACX;AAAA,EAAA,GAEJ;AAEJ;AAMO,SAAS,eAAe,EAAE,OAAO,SAAS,QAAQ,gBAAqF;AAC5I,QAAM,SAAS,IAAI,IAAI,QAAQ,IAAI,CAAC,WAAW,OAAO,MAAM,CAAC,EAAE,OAAO;AACtE,QAAM,QAAQ,QAAQ,IAAI,CAAC,WAAW;AACpC,UAAM,OAAO,YAAY,OAAO,MAAM;AACtC,WACE,oBAAC,MAAA,EAAqB,eAAa,OAAO,MAAO,GAAI,SAAS,EAAE,eAAe,OAAO,QAAQ,OAAO,GAAG,OAAO,IAAI,KAAK,KAAK,KAAK,GAAA,IAAO,CAAA,GACvI,UAAA,qBAAC,OAAA,EAAM,SAAQ,WAAU,MAAK,MAAK,aAAa,OAAO,WAAU,mBAC9D,UAAA;AAAA,MAAA,OAAO;AAAA,MACP,UAAU,oBAAC,QAAA,EAAK,eAAW,MAAC,WAAW,GAAG,4BAA4B,KAAK,SAAS,GAAI,UAAA,KAAK,KAAA,CAAK;AAAA,IAAA,GACrG,EAAA,GAJO,OAAO,IAKhB;AAAA,EAEJ,CAAC;AACD,SAAO,oBAAC,aAAA,EAAY,OAAc,OAAO,OAAO,OAAc;AAChE;AAGO,SAAS,YAAY,EAAE,OAAO,WAAgE;AACnG,MAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,SACE,qBAAC,OAAA,EAAI,WAAU,oCACb,UAAA;AAAA,IAAA,oBAAC,QAAA,EAAK,WAAU,4CAA4C,UAAA,OAAM;AAAA,IAClE,oBAAC,gBAAA,EAAe,OAAc,QAAA,CAAkB;AAAA,EAAA,GAClD;AAEJ;AAGO,SAAS,SAAS,EAAE,OAAO,OAAO,QAAQ,gBAA6E;AAE5H,QAAM,QAAQ,MAAM,IAAI,CAAC,MAAM,UAAU,oBAAC,MAAA,EAA4B,WAAU,uBAAuB,kBAArD,GAAG,KAAK,IAAI,IAAI,EAA0C,CAAK;AACjH,6BAAQ,aAAA,EAAY,OAAc,OAAc,OAAc,WAAU,WAAU;AACpF;"}
|