@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,31 @@
|
|
|
1
|
+
import { CallGraph, CallGraphGroupFact } from './types.js';
|
|
2
|
+
export declare const EXCLUDE_EXTERNAL = "external";
|
|
3
|
+
/** The URL token for "exclude nothing", since an empty URL value stands for the host's defaults. */
|
|
4
|
+
export declare const EXCLUDE_NONE = "none";
|
|
5
|
+
/** Whether one pattern excludes the group. */
|
|
6
|
+
export type ExcludeMatcher = (pattern: string, group: CallGraphGroupFact) => boolean;
|
|
7
|
+
export declare const matchesExclude: ExcludeMatcher;
|
|
8
|
+
/** A URL value as patterns: empty is undefined, the host's defaults; `none` is no patterns. */
|
|
9
|
+
export declare function parseExclude(text: string): string[] | undefined;
|
|
10
|
+
/** The URL value for these patterns: undefined (the defaults) is empty, and no patterns is `none`. */
|
|
11
|
+
export declare function formatExclude(patterns: readonly string[] | undefined): string;
|
|
12
|
+
/** Excludes one group by its exact name. */
|
|
13
|
+
export declare function excludeGroup(patterns: readonly string[], name: string): string[];
|
|
14
|
+
/**
|
|
15
|
+
* Brings a group back. Every pattern that excludes it goes; a keyword or a /... pattern that also
|
|
16
|
+
* covered other reached groups is replaced by their exact names, so they stay excluded.
|
|
17
|
+
*/
|
|
18
|
+
export declare function includeGroup(patterns: readonly string[], target: CallGraphGroupFact, groups: readonly CallGraphGroupFact[], matches?: ExcludeMatcher): string[];
|
|
19
|
+
/** Adds or removes the `external` keyword behind "Hide all external". */
|
|
20
|
+
export declare function setExternalHidden(patterns: readonly string[], hidden: boolean): string[];
|
|
21
|
+
/** Why a typed pattern cannot be added, or undefined when it can. The host checks the name itself. */
|
|
22
|
+
export declare function excludePatternError(patterns: readonly string[], pattern: string): string | undefined;
|
|
23
|
+
export declare function addExcludePattern(patterns: readonly string[], pattern: string): string[];
|
|
24
|
+
export declare function removeExcludePattern(patterns: readonly string[], pattern: string): string[];
|
|
25
|
+
/**
|
|
26
|
+
* The groups a graph reached, for a host whose responses carry no group facts of their own: each
|
|
27
|
+
* drawn group with its node count, and each group `omitted.excluded` tallies, which is excluded when
|
|
28
|
+
* none of its nodes is drawn.
|
|
29
|
+
*/
|
|
30
|
+
export declare function callGraphGroupFacts(graph: CallGraph): CallGraphGroupFact[];
|
|
31
|
+
//# sourceMappingURL=call-graph-exclude.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"call-graph-exclude.d.ts","sourceRoot":"","sources":["../../../src/data/call-graph/call-graph-exclude.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAE7D,eAAO,MAAM,gBAAgB,aAAa,CAAC;AAC3C,oGAAoG;AACpG,eAAO,MAAM,YAAY,SAAS,CAAC;AAEnC,8CAA8C;AAC9C,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,KAAK,OAAO,CAAC;AAErF,eAAO,MAAM,cAAc,EAAE,cAO5B,CAAC;AAEF,+FAA+F;AAC/F,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAG/D;AAED,sGAAsG;AACtG,wBAAgB,aAAa,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,GAAG,MAAM,CAG7E;AAED,4CAA4C;AAC5C,wBAAgB,YAAY,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAEhF;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,SAAS,MAAM,EAAE,EAC3B,MAAM,EAAE,kBAAkB,EAC1B,MAAM,EAAE,SAAS,kBAAkB,EAAE,EACrC,OAAO,GAAE,cAA+B,GACvC,MAAM,EAAE,CAUV;AAED,yEAAyE;AACzE,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,EAAE,CAGxF;AAED,sGAAsG;AACtG,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAMpG;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAExF;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAE3F;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,GAAG,kBAAkB,EAAE,CAU1E"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
const EXCLUDE_EXTERNAL = "external";
|
|
2
|
+
const EXCLUDE_NONE = "none";
|
|
3
|
+
const matchesExclude = (pattern, group) => {
|
|
4
|
+
if (pattern === EXCLUDE_EXTERNAL) return group.external === true;
|
|
5
|
+
if (pattern.endsWith("/...")) {
|
|
6
|
+
const base = pattern.slice(0, -"/...".length);
|
|
7
|
+
return group.name === base || group.name.startsWith(`${base}/`);
|
|
8
|
+
}
|
|
9
|
+
return group.name === pattern;
|
|
10
|
+
};
|
|
11
|
+
function parseExclude(text) {
|
|
12
|
+
if (text === "") return void 0;
|
|
13
|
+
return text === EXCLUDE_NONE ? [] : text.split(",");
|
|
14
|
+
}
|
|
15
|
+
function formatExclude(patterns) {
|
|
16
|
+
if (patterns === void 0) return "";
|
|
17
|
+
return patterns.length === 0 ? EXCLUDE_NONE : patterns.join(",");
|
|
18
|
+
}
|
|
19
|
+
function excludeGroup(patterns, name) {
|
|
20
|
+
return [...patterns, name];
|
|
21
|
+
}
|
|
22
|
+
function includeGroup(patterns, target, groups, matches = matchesExclude) {
|
|
23
|
+
if (!target.excluded) throw new Error(`Group ${target.name} is not excluded`);
|
|
24
|
+
const covering = patterns.filter((pattern) => matches(pattern, target));
|
|
25
|
+
if (covering.length === 0) throw new Error(`Group ${target.name} is reported excluded, but none of ${patterns.join(", ")} matches it`);
|
|
26
|
+
const rest = patterns.filter((pattern) => !covering.includes(pattern));
|
|
27
|
+
const replacements = groups.filter(
|
|
28
|
+
(group) => group.name !== target.name && covering.some((pattern) => matches(pattern, group)) && !rest.some((pattern) => matches(pattern, group))
|
|
29
|
+
);
|
|
30
|
+
return [...rest, ...replacements.map((group) => group.name)];
|
|
31
|
+
}
|
|
32
|
+
function setExternalHidden(patterns, hidden) {
|
|
33
|
+
const others = patterns.filter((pattern) => pattern !== EXCLUDE_EXTERNAL);
|
|
34
|
+
return hidden ? [...others, EXCLUDE_EXTERNAL] : others;
|
|
35
|
+
}
|
|
36
|
+
function excludePatternError(patterns, pattern) {
|
|
37
|
+
if (pattern === "") return "Enter a name or a name ending in /...";
|
|
38
|
+
if (/[\s,]/.test(pattern)) return `One pattern at a time: ${pattern} has a comma or a space`;
|
|
39
|
+
if (pattern === EXCLUDE_NONE) return "Use Show all to exclude nothing";
|
|
40
|
+
if (patterns.includes(pattern)) return `${pattern} is already excluded`;
|
|
41
|
+
return void 0;
|
|
42
|
+
}
|
|
43
|
+
function addExcludePattern(patterns, pattern) {
|
|
44
|
+
return [...patterns, pattern];
|
|
45
|
+
}
|
|
46
|
+
function removeExcludePattern(patterns, pattern) {
|
|
47
|
+
return patterns.filter((candidate) => candidate !== pattern);
|
|
48
|
+
}
|
|
49
|
+
function callGraphGroupFacts(graph) {
|
|
50
|
+
const drawn = /* @__PURE__ */ new Map();
|
|
51
|
+
for (const node of graph.nodes) if (node.group !== void 0) drawn.set(node.group, (drawn.get(node.group) ?? 0) + 1);
|
|
52
|
+
const excluded = graph.omitted.excluded ?? {};
|
|
53
|
+
const names = [.../* @__PURE__ */ new Set([...drawn.keys(), ...Object.keys(excluded)])];
|
|
54
|
+
return names.map((name) => {
|
|
55
|
+
var _a, _b;
|
|
56
|
+
const label = (_b = (_a = graph.groups) == null ? void 0 : _a.find((group) => group.id === name)) == null ? void 0 : _b.label;
|
|
57
|
+
const shown = drawn.get(name) ?? 0;
|
|
58
|
+
return { name, ...label !== void 0 && label !== name ? { label } : {}, nodes: shown + (excluded[name] ?? 0), excluded: shown === 0 };
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
export {
|
|
62
|
+
EXCLUDE_EXTERNAL,
|
|
63
|
+
EXCLUDE_NONE,
|
|
64
|
+
addExcludePattern,
|
|
65
|
+
callGraphGroupFacts,
|
|
66
|
+
excludeGroup,
|
|
67
|
+
excludePatternError,
|
|
68
|
+
formatExclude,
|
|
69
|
+
includeGroup,
|
|
70
|
+
matchesExclude,
|
|
71
|
+
parseExclude,
|
|
72
|
+
removeExcludePattern,
|
|
73
|
+
setExternalHidden
|
|
74
|
+
};
|
|
75
|
+
//# sourceMappingURL=call-graph-exclude.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"call-graph-exclude.js","sources":["../../../src/data/call-graph/call-graph-exclude.ts"],"sourcesContent":["// Editing the call graph's group exclusions. A pattern is a group name, a name ending in /... (that\n// group and every group below it), or `external` (every group outside the indexed scope). A host\n// whose source knows more keywords passes a matcher that understands them and falls back to this one.\n// No patterns excludes nothing; the host's defaults are asked for with `undefined`, never with [].\nimport type { CallGraph, CallGraphGroupFact } from \"./types\";\n\nexport const EXCLUDE_EXTERNAL = \"external\";\n/** The URL token for \"exclude nothing\", since an empty URL value stands for the host's defaults. */\nexport const EXCLUDE_NONE = \"none\";\n\n/** Whether one pattern excludes the group. */\nexport type ExcludeMatcher = (pattern: string, group: CallGraphGroupFact) => boolean;\n\nexport const matchesExclude: ExcludeMatcher = (pattern, group) => {\n if (pattern === EXCLUDE_EXTERNAL) return group.external === true;\n if (pattern.endsWith(\"/...\")) {\n const base = pattern.slice(0, -\"/...\".length);\n return group.name === base || group.name.startsWith(`${base}/`);\n }\n return group.name === pattern;\n};\n\n/** A URL value as patterns: empty is undefined, the host's defaults; `none` is no patterns. */\nexport function parseExclude(text: string): string[] | undefined {\n if (text === \"\") return undefined;\n return text === EXCLUDE_NONE ? [] : text.split(\",\");\n}\n\n/** The URL value for these patterns: undefined (the defaults) is empty, and no patterns is `none`. */\nexport function formatExclude(patterns: readonly string[] | undefined): string {\n if (patterns === undefined) return \"\";\n return patterns.length === 0 ? EXCLUDE_NONE : patterns.join(\",\");\n}\n\n/** Excludes one group by its exact name. */\nexport function excludeGroup(patterns: readonly string[], name: string): string[] {\n return [...patterns, name];\n}\n\n/**\n * Brings a group back. Every pattern that excludes it goes; a keyword or a /... pattern that also\n * covered other reached groups is replaced by their exact names, so they stay excluded.\n */\nexport function includeGroup(\n patterns: readonly string[],\n target: CallGraphGroupFact,\n groups: readonly CallGraphGroupFact[],\n matches: ExcludeMatcher = matchesExclude,\n): string[] {\n if (!target.excluded) throw new Error(`Group ${target.name} is not excluded`);\n const covering = patterns.filter((pattern) => matches(pattern, target));\n if (covering.length === 0) throw new Error(`Group ${target.name} is reported excluded, but none of ${patterns.join(\", \")} matches it`);\n const rest = patterns.filter((pattern) => !covering.includes(pattern));\n const replacements = groups.filter(\n (group) =>\n group.name !== target.name && covering.some((pattern) => matches(pattern, group)) && !rest.some((pattern) => matches(pattern, group)),\n );\n return [...rest, ...replacements.map((group) => group.name)];\n}\n\n/** Adds or removes the `external` keyword behind \"Hide all external\". */\nexport function setExternalHidden(patterns: readonly string[], hidden: boolean): string[] {\n const others = patterns.filter((pattern) => pattern !== EXCLUDE_EXTERNAL);\n return hidden ? [...others, EXCLUDE_EXTERNAL] : others;\n}\n\n/** Why a typed pattern cannot be added, or undefined when it can. The host checks the name itself. */\nexport function excludePatternError(patterns: readonly string[], pattern: string): string | undefined {\n if (pattern === \"\") return \"Enter a name or a name ending in /...\";\n if (/[\\s,]/.test(pattern)) return `One pattern at a time: ${pattern} has a comma or a space`;\n if (pattern === EXCLUDE_NONE) return \"Use Show all to exclude nothing\";\n if (patterns.includes(pattern)) return `${pattern} is already excluded`;\n return undefined;\n}\n\nexport function addExcludePattern(patterns: readonly string[], pattern: string): string[] {\n return [...patterns, pattern];\n}\n\nexport function removeExcludePattern(patterns: readonly string[], pattern: string): string[] {\n return patterns.filter((candidate) => candidate !== pattern);\n}\n\n/**\n * The groups a graph reached, for a host whose responses carry no group facts of their own: each\n * drawn group with its node count, and each group `omitted.excluded` tallies, which is excluded when\n * none of its nodes is drawn.\n */\nexport function callGraphGroupFacts(graph: CallGraph): CallGraphGroupFact[] {\n const drawn = new Map<string, number>();\n for (const node of graph.nodes) if (node.group !== undefined) drawn.set(node.group, (drawn.get(node.group) ?? 0) + 1);\n const excluded = graph.omitted.excluded ?? {};\n const names = [...new Set([...drawn.keys(), ...Object.keys(excluded)])];\n return names.map((name) => {\n const label = graph.groups?.find((group) => group.id === name)?.label;\n const shown = drawn.get(name) ?? 0;\n return { name, ...(label !== undefined && label !== name ? { label } : {}), nodes: shown + (excluded[name] ?? 0), excluded: shown === 0 };\n });\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const EDGE_ICON_CHARS = 3;
|
|
4
|
+
function capitalize(text) {
|
|
5
|
+
return text.charAt(0).toUpperCase() + text.slice(1);
|
|
6
|
+
}
|
|
7
|
+
function counted(count, one, many) {
|
|
8
|
+
return `${count} ${count === 1 ? one : many}`;
|
|
9
|
+
}
|
|
10
|
+
function excludedTally(omitted) {
|
|
11
|
+
return Object.entries(omitted.excluded ?? {}).map(([group, count]) => ({ group, count })).sort((a, b) => b.count - a.count || a.group.localeCompare(b.group));
|
|
12
|
+
}
|
|
13
|
+
function omittedParts(omitted) {
|
|
14
|
+
var _a;
|
|
15
|
+
const unreadable = ((_a = omitted.unreadable_source) == null ? void 0 : _a.length) ?? 0;
|
|
16
|
+
const excluded = excludedTally(omitted).reduce((total, { count }) => total + count, 0);
|
|
17
|
+
return [
|
|
18
|
+
omitted.node_limit ? "node limit reached" : "",
|
|
19
|
+
omitted.beyond_depth ? `${omitted.beyond_depth} beyond depth` : "",
|
|
20
|
+
omitted.unresolved ? `${omitted.unresolved} unresolved` : "",
|
|
21
|
+
unreadable > 0 ? counted(unreadable, "unreadable file", "unreadable files") : "",
|
|
22
|
+
excluded > 0 ? `${excluded} excluded` : ""
|
|
23
|
+
].filter(Boolean);
|
|
24
|
+
}
|
|
25
|
+
function groupCaption(label) {
|
|
26
|
+
return label.split("/").slice(-2).join("/");
|
|
27
|
+
}
|
|
28
|
+
function guardsOf(site) {
|
|
29
|
+
return site.guards ?? [];
|
|
30
|
+
}
|
|
31
|
+
function isConditional(edge) {
|
|
32
|
+
return edge.sites.length > 0 && edge.sites.every((site) => guardsOf(site).length > 0);
|
|
33
|
+
}
|
|
34
|
+
function truncate(text, max) {
|
|
35
|
+
return text.length <= max ? text : `${text.slice(0, max - 1).trimEnd()}…`;
|
|
36
|
+
}
|
|
37
|
+
function guardCount(edge) {
|
|
38
|
+
const counts = edge.sites.map((site) => guardsOf(site).length);
|
|
39
|
+
const least = Math.min(...counts);
|
|
40
|
+
const most = Math.max(...counts);
|
|
41
|
+
if (least === most) return `${most} ${most === 1 ? "guard" : "guards"}`;
|
|
42
|
+
return `${least}–${most} guards`;
|
|
43
|
+
}
|
|
44
|
+
function guardText(edge, { guardLabel, truncateAt }) {
|
|
45
|
+
if (!isConditional(edge) || guardLabel === "none") return "";
|
|
46
|
+
if (guardLabel === "count") return guardCount(edge);
|
|
47
|
+
const chosen = new Set(edge.sites.map((site) => guardsOf(site).at(guardLabel === "innermost" ? -1 : 0)));
|
|
48
|
+
const [only] = chosen;
|
|
49
|
+
if (chosen.size > 1 || only === void 0) return `${chosen.size} conditions`;
|
|
50
|
+
return truncate(only, truncateAt - (edge.type === "call" ? 0 : EDGE_ICON_CHARS));
|
|
51
|
+
}
|
|
52
|
+
function edgeLabel(edge, options) {
|
|
53
|
+
const text = [guardText(edge, options), edge.sites.length > 1 ? `×${edge.sites.length}` : ""].filter(Boolean).join(" ");
|
|
54
|
+
return text === "" ? void 0 : text;
|
|
55
|
+
}
|
|
56
|
+
function memberChips(properties) {
|
|
57
|
+
const { columns, fields, ...rest } = properties ?? {};
|
|
58
|
+
const split = (members) => (members ?? "").split(",").map((member) => member.trim()).filter(Boolean);
|
|
59
|
+
return { columns: split(columns), fields: split(fields), rest };
|
|
60
|
+
}
|
|
61
|
+
function memberAccess(edges) {
|
|
62
|
+
const members = /* @__PURE__ */ new Map();
|
|
63
|
+
for (const edge of edges) {
|
|
64
|
+
if (edge.type !== "read" && edge.type !== "write") continue;
|
|
65
|
+
const { columns, fields } = memberChips(edge.properties);
|
|
66
|
+
const touched = [...columns.map((name) => ({ name, kind: "column" })), ...fields.map((name) => ({ name, kind: "field" }))];
|
|
67
|
+
for (const { name, kind } of touched) {
|
|
68
|
+
const key = `${kind}:${name}`;
|
|
69
|
+
const held = members.get(key);
|
|
70
|
+
members.set(key, { name, kind, access: held && held.access !== edge.type ? "both" : edge.type });
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return [...members.values()];
|
|
74
|
+
}
|
|
75
|
+
function propertyLines(properties) {
|
|
76
|
+
return Object.entries(properties ?? {}).sort(([a], [b]) => a.localeCompare(b)).map(([key, value]) => `${key}: ${value}`);
|
|
77
|
+
}
|
|
78
|
+
function edgeTitle(edge) {
|
|
79
|
+
const chains = new Set(
|
|
80
|
+
edge.sites.map(guardsOf).filter((guards) => guards.length > 0).map((guards) => guards.join(" ∧ "))
|
|
81
|
+
);
|
|
82
|
+
const lines = [...chains, ...propertyLines(edge.properties)];
|
|
83
|
+
return lines.length === 0 ? void 0 : lines.join("\n");
|
|
84
|
+
}
|
|
85
|
+
exports.capitalize = capitalize;
|
|
86
|
+
exports.edgeLabel = edgeLabel;
|
|
87
|
+
exports.edgeTitle = edgeTitle;
|
|
88
|
+
exports.excludedTally = excludedTally;
|
|
89
|
+
exports.groupCaption = groupCaption;
|
|
90
|
+
exports.isConditional = isConditional;
|
|
91
|
+
exports.memberAccess = memberAccess;
|
|
92
|
+
exports.memberChips = memberChips;
|
|
93
|
+
exports.omittedParts = omittedParts;
|
|
94
|
+
exports.propertyLines = propertyLines;
|
|
95
|
+
exports.truncate = truncate;
|
|
96
|
+
//# sourceMappingURL=call-graph-labels.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"call-graph-labels.cjs","sources":["../../../src/data/call-graph/call-graph-labels.ts"],"sourcesContent":["// What the call graph says about an edge, a group and what it left out, as text: pill labels,\n// tooltips, chips. Pure, with no React and no layout; call-graph-model.ts maps it onto the diagram.\nimport type { CallGraphEdge, CallGraphOmitted, CallGraphSite } from \"./types\";\n\n/** The room an edge type's icon (every type but a plain call has one) takes in a pill, in characters of guard text. */\nconst EDGE_ICON_CHARS = 3;\n\nexport function capitalize(text: string): string {\n return text.charAt(0).toUpperCase() + text.slice(1);\n}\n\nfunction counted(count: number, one: string, many: string): string {\n return `${count} ${count === 1 ? one : many}`;\n}\n\n/** The excluded nodes per group, most first, then by name. */\nexport function excludedTally(omitted: CallGraphOmitted): { group: string; count: number }[] {\n return Object.entries(omitted.excluded ?? {})\n .map(([group, count]) => ({ group, count }))\n .sort((a, b) => b.count - a.count || a.group.localeCompare(b.group));\n}\n\n/** The omitted chip's parts: what the response left out, with the excluded nodes as one total. */\nexport function omittedParts(omitted: CallGraphOmitted): string[] {\n const unreadable = omitted.unreadable_source?.length ?? 0;\n const excluded = excludedTally(omitted).reduce((total, { count }) => total + count, 0);\n return [\n omitted.node_limit ? \"node limit reached\" : \"\",\n omitted.beyond_depth ? `${omitted.beyond_depth} beyond depth` : \"\",\n omitted.unresolved ? `${omitted.unresolved} unresolved` : \"\",\n unreadable > 0 ? counted(unreadable, \"unreadable file\", \"unreadable files\") : \"\",\n excluded > 0 ? `${excluded} excluded` : \"\",\n ].filter(Boolean);\n}\n\n/** A group box caption: a path's last two segments. The full label is the caption's tooltip. */\nexport function groupCaption(label: string): string {\n return label.split(\"/\").slice(-2).join(\"/\");\n}\n\n/** Which of a site's nested guards the pill shows, how many there are, or none: the tooltip still names them. */\nexport type GuardLabel = \"innermost\" | \"outermost\" | \"count\" | \"none\";\n\nexport interface PillOptions {\n guardLabel: GuardLabel;\n /** Longest guard text a pill shows before it is cut with an ellipsis. */\n truncateAt: number;\n}\n\nfunction guardsOf(site: CallGraphSite): string[] {\n return site.guards ?? [];\n}\n\n/** An edge is conditional when no call site behind it can be reached unguarded. */\nexport function isConditional(edge: Pick<CallGraphEdge, \"sites\">): boolean {\n return edge.sites.length > 0 && edge.sites.every((site) => guardsOf(site).length > 0);\n}\n\nexport function truncate(text: string, max: number): string {\n return text.length <= max ? text : `${text.slice(0, max - 1).trimEnd()}…`;\n}\n\nfunction guardCount(edge: CallGraphEdge): string {\n const counts = edge.sites.map((site) => guardsOf(site).length);\n const least = Math.min(...counts);\n const most = Math.max(...counts);\n if (least === most) return `${most} ${most === 1 ? \"guard\" : \"guards\"}`;\n return `${least}–${most} guards`;\n}\n\n/** The guard a conditional edge's sites share, or how many different ones they have. */\nfunction guardText(edge: CallGraphEdge, { guardLabel, truncateAt }: PillOptions): string {\n if (!isConditional(edge) || guardLabel === \"none\") return \"\";\n if (guardLabel === \"count\") return guardCount(edge);\n const chosen = new Set(edge.sites.map((site) => guardsOf(site).at(guardLabel === \"innermost\" ? -1 : 0)));\n const [only] = chosen;\n if (chosen.size > 1 || only === undefined) return `${chosen.size} conditions`;\n return truncate(only, truncateAt - (edge.type === \"call\" ? 0 : EDGE_ICON_CHARS));\n}\n\n/**\n * The pill's text: the guard the edge's call sites share, then `×N` when there are several sites.\n * Sites with different guards show how many conditions there are instead of one of them, which would\n * read as if it covered every site. A dispatch edge's guard is cut shorter by the room its icon takes.\n */\nexport function edgeLabel(edge: CallGraphEdge, options: PillOptions): string | undefined {\n const text = [guardText(edge, options), edge.sites.length > 1 ? `×${edge.sites.length}` : \"\"].filter(Boolean).join(\" \");\n return text === \"\" ? undefined : text;\n}\n\n/** The columns and fields a collapsed read or write touches, apart from the edge's other properties. */\nexport function memberChips(properties: Record<string, string> | undefined): { columns: string[]; fields: string[]; rest: Record<string, string> } {\n const { columns, fields, ...rest } = properties ?? {};\n const split = (members: string | undefined) => (members ?? \"\").split(\",\").map((member) => member.trim()).filter(Boolean);\n return { columns: split(columns), fields: split(fields), rest };\n}\n\nexport type MemberAccessKind = \"read\" | \"write\" | \"both\";\n\n/** A column or field a collapsed read or write touches, and whether it is read, written or both. */\nexport interface MemberAccess {\n name: string;\n kind: \"column\" | \"field\";\n access: MemberAccessKind;\n}\n\n/**\n * The columns and fields the reads and writes among `edges` touch, each once in first-seen order,\n * marked \"both\" when a read and a write both touch it. Other edges are passed over.\n */\nexport function memberAccess(edges: readonly CallGraphEdge[]): MemberAccess[] {\n const members = new Map<string, MemberAccess>();\n for (const edge of edges) {\n if (edge.type !== \"read\" && edge.type !== \"write\") continue;\n const { columns, fields } = memberChips(edge.properties);\n const touched = [...columns.map((name) => ({ name, kind: \"column\" as const })), ...fields.map((name) => ({ name, kind: \"field\" as const }))];\n for (const { name, kind } of touched) {\n const key = `${kind}:${name}`;\n const held = members.get(key);\n members.set(key, { name, kind, access: held && held.access !== edge.type ? \"both\" : edge.type });\n }\n }\n return [...members.values()];\n}\n\n/** The edge's properties as `key: value` lines, in key order. */\nexport function propertyLines(properties: Record<string, string> | undefined): string[] {\n return Object.entries(properties ?? {})\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([key, value]) => `${key}: ${value}`);\n}\n\n/**\n * The edge's tooltip: one line per distinct guard chain behind it, outermost first and joined with ∧,\n * then its properties.\n */\nexport function edgeTitle(edge: CallGraphEdge): string | undefined {\n const chains = new Set(\n edge.sites\n .map(guardsOf)\n .filter((guards) => guards.length > 0)\n .map((guards) => guards.join(\" ∧ \")),\n );\n const lines = [...chains, ...propertyLines(edge.properties)];\n return lines.length === 0 ? undefined : lines.join(\"\\n\");\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { CallGraphEdge, CallGraphOmitted } from './types.js';
|
|
2
|
+
export declare function capitalize(text: string): string;
|
|
3
|
+
/** The excluded nodes per group, most first, then by name. */
|
|
4
|
+
export declare function excludedTally(omitted: CallGraphOmitted): {
|
|
5
|
+
group: string;
|
|
6
|
+
count: number;
|
|
7
|
+
}[];
|
|
8
|
+
/** The omitted chip's parts: what the response left out, with the excluded nodes as one total. */
|
|
9
|
+
export declare function omittedParts(omitted: CallGraphOmitted): string[];
|
|
10
|
+
/** A group box caption: a path's last two segments. The full label is the caption's tooltip. */
|
|
11
|
+
export declare function groupCaption(label: string): string;
|
|
12
|
+
/** Which of a site's nested guards the pill shows, how many there are, or none: the tooltip still names them. */
|
|
13
|
+
export type GuardLabel = "innermost" | "outermost" | "count" | "none";
|
|
14
|
+
export interface PillOptions {
|
|
15
|
+
guardLabel: GuardLabel;
|
|
16
|
+
/** Longest guard text a pill shows before it is cut with an ellipsis. */
|
|
17
|
+
truncateAt: number;
|
|
18
|
+
}
|
|
19
|
+
/** An edge is conditional when no call site behind it can be reached unguarded. */
|
|
20
|
+
export declare function isConditional(edge: Pick<CallGraphEdge, "sites">): boolean;
|
|
21
|
+
export declare function truncate(text: string, max: number): string;
|
|
22
|
+
/**
|
|
23
|
+
* The pill's text: the guard the edge's call sites share, then `×N` when there are several sites.
|
|
24
|
+
* Sites with different guards show how many conditions there are instead of one of them, which would
|
|
25
|
+
* read as if it covered every site. A dispatch edge's guard is cut shorter by the room its icon takes.
|
|
26
|
+
*/
|
|
27
|
+
export declare function edgeLabel(edge: CallGraphEdge, options: PillOptions): string | undefined;
|
|
28
|
+
/** The columns and fields a collapsed read or write touches, apart from the edge's other properties. */
|
|
29
|
+
export declare function memberChips(properties: Record<string, string> | undefined): {
|
|
30
|
+
columns: string[];
|
|
31
|
+
fields: string[];
|
|
32
|
+
rest: Record<string, string>;
|
|
33
|
+
};
|
|
34
|
+
export type MemberAccessKind = "read" | "write" | "both";
|
|
35
|
+
/** A column or field a collapsed read or write touches, and whether it is read, written or both. */
|
|
36
|
+
export interface MemberAccess {
|
|
37
|
+
name: string;
|
|
38
|
+
kind: "column" | "field";
|
|
39
|
+
access: MemberAccessKind;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* The columns and fields the reads and writes among `edges` touch, each once in first-seen order,
|
|
43
|
+
* marked "both" when a read and a write both touch it. Other edges are passed over.
|
|
44
|
+
*/
|
|
45
|
+
export declare function memberAccess(edges: readonly CallGraphEdge[]): MemberAccess[];
|
|
46
|
+
/** The edge's properties as `key: value` lines, in key order. */
|
|
47
|
+
export declare function propertyLines(properties: Record<string, string> | undefined): string[];
|
|
48
|
+
/**
|
|
49
|
+
* The edge's tooltip: one line per distinct guard chain behind it, outermost first and joined with ∧,
|
|
50
|
+
* then its properties.
|
|
51
|
+
*/
|
|
52
|
+
export declare function edgeTitle(edge: CallGraphEdge): string | undefined;
|
|
53
|
+
//# sourceMappingURL=call-graph-labels.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"call-graph-labels.d.ts","sourceRoot":"","sources":["../../../src/data/call-graph/call-graph-labels.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAiB,MAAM,SAAS,CAAC;AAK9E,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C;AAMD,8DAA8D;AAC9D,wBAAgB,aAAa,CAAC,OAAO,EAAE,gBAAgB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,CAI3F;AAED,kGAAkG;AAClG,wBAAgB,YAAY,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,EAAE,CAUhE;AAED,gGAAgG;AAChG,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,iHAAiH;AACjH,MAAM,MAAM,UAAU,GAAG,WAAW,GAAG,WAAW,GAAG,OAAO,GAAG,MAAM,CAAC;AAEtE,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,UAAU,CAAC;IACvB,yEAAyE;IACzE,UAAU,EAAE,MAAM,CAAC;CACpB;AAMD,mFAAmF;AACnF,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,GAAG,OAAO,CAEzE;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAE1D;AAoBD;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS,CAGvF;AAED,wGAAwG;AACxG,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,GAAG;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAIjJ;AAED,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAEzD,oGAAoG;AACpG,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC;IACzB,MAAM,EAAE,gBAAgB,CAAC;CAC1B;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,GAAG,YAAY,EAAE,CAa5E;AAED,iEAAiE;AACjE,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,GAAG,MAAM,EAAE,CAItF;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,GAAG,SAAS,CASjE"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
const EDGE_ICON_CHARS = 3;
|
|
2
|
+
function capitalize(text) {
|
|
3
|
+
return text.charAt(0).toUpperCase() + text.slice(1);
|
|
4
|
+
}
|
|
5
|
+
function counted(count, one, many) {
|
|
6
|
+
return `${count} ${count === 1 ? one : many}`;
|
|
7
|
+
}
|
|
8
|
+
function excludedTally(omitted) {
|
|
9
|
+
return Object.entries(omitted.excluded ?? {}).map(([group, count]) => ({ group, count })).sort((a, b) => b.count - a.count || a.group.localeCompare(b.group));
|
|
10
|
+
}
|
|
11
|
+
function omittedParts(omitted) {
|
|
12
|
+
var _a;
|
|
13
|
+
const unreadable = ((_a = omitted.unreadable_source) == null ? void 0 : _a.length) ?? 0;
|
|
14
|
+
const excluded = excludedTally(omitted).reduce((total, { count }) => total + count, 0);
|
|
15
|
+
return [
|
|
16
|
+
omitted.node_limit ? "node limit reached" : "",
|
|
17
|
+
omitted.beyond_depth ? `${omitted.beyond_depth} beyond depth` : "",
|
|
18
|
+
omitted.unresolved ? `${omitted.unresolved} unresolved` : "",
|
|
19
|
+
unreadable > 0 ? counted(unreadable, "unreadable file", "unreadable files") : "",
|
|
20
|
+
excluded > 0 ? `${excluded} excluded` : ""
|
|
21
|
+
].filter(Boolean);
|
|
22
|
+
}
|
|
23
|
+
function groupCaption(label) {
|
|
24
|
+
return label.split("/").slice(-2).join("/");
|
|
25
|
+
}
|
|
26
|
+
function guardsOf(site) {
|
|
27
|
+
return site.guards ?? [];
|
|
28
|
+
}
|
|
29
|
+
function isConditional(edge) {
|
|
30
|
+
return edge.sites.length > 0 && edge.sites.every((site) => guardsOf(site).length > 0);
|
|
31
|
+
}
|
|
32
|
+
function truncate(text, max) {
|
|
33
|
+
return text.length <= max ? text : `${text.slice(0, max - 1).trimEnd()}…`;
|
|
34
|
+
}
|
|
35
|
+
function guardCount(edge) {
|
|
36
|
+
const counts = edge.sites.map((site) => guardsOf(site).length);
|
|
37
|
+
const least = Math.min(...counts);
|
|
38
|
+
const most = Math.max(...counts);
|
|
39
|
+
if (least === most) return `${most} ${most === 1 ? "guard" : "guards"}`;
|
|
40
|
+
return `${least}–${most} guards`;
|
|
41
|
+
}
|
|
42
|
+
function guardText(edge, { guardLabel, truncateAt }) {
|
|
43
|
+
if (!isConditional(edge) || guardLabel === "none") return "";
|
|
44
|
+
if (guardLabel === "count") return guardCount(edge);
|
|
45
|
+
const chosen = new Set(edge.sites.map((site) => guardsOf(site).at(guardLabel === "innermost" ? -1 : 0)));
|
|
46
|
+
const [only] = chosen;
|
|
47
|
+
if (chosen.size > 1 || only === void 0) return `${chosen.size} conditions`;
|
|
48
|
+
return truncate(only, truncateAt - (edge.type === "call" ? 0 : EDGE_ICON_CHARS));
|
|
49
|
+
}
|
|
50
|
+
function edgeLabel(edge, options) {
|
|
51
|
+
const text = [guardText(edge, options), edge.sites.length > 1 ? `×${edge.sites.length}` : ""].filter(Boolean).join(" ");
|
|
52
|
+
return text === "" ? void 0 : text;
|
|
53
|
+
}
|
|
54
|
+
function memberChips(properties) {
|
|
55
|
+
const { columns, fields, ...rest } = properties ?? {};
|
|
56
|
+
const split = (members) => (members ?? "").split(",").map((member) => member.trim()).filter(Boolean);
|
|
57
|
+
return { columns: split(columns), fields: split(fields), rest };
|
|
58
|
+
}
|
|
59
|
+
function memberAccess(edges) {
|
|
60
|
+
const members = /* @__PURE__ */ new Map();
|
|
61
|
+
for (const edge of edges) {
|
|
62
|
+
if (edge.type !== "read" && edge.type !== "write") continue;
|
|
63
|
+
const { columns, fields } = memberChips(edge.properties);
|
|
64
|
+
const touched = [...columns.map((name) => ({ name, kind: "column" })), ...fields.map((name) => ({ name, kind: "field" }))];
|
|
65
|
+
for (const { name, kind } of touched) {
|
|
66
|
+
const key = `${kind}:${name}`;
|
|
67
|
+
const held = members.get(key);
|
|
68
|
+
members.set(key, { name, kind, access: held && held.access !== edge.type ? "both" : edge.type });
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return [...members.values()];
|
|
72
|
+
}
|
|
73
|
+
function propertyLines(properties) {
|
|
74
|
+
return Object.entries(properties ?? {}).sort(([a], [b]) => a.localeCompare(b)).map(([key, value]) => `${key}: ${value}`);
|
|
75
|
+
}
|
|
76
|
+
function edgeTitle(edge) {
|
|
77
|
+
const chains = new Set(
|
|
78
|
+
edge.sites.map(guardsOf).filter((guards) => guards.length > 0).map((guards) => guards.join(" ∧ "))
|
|
79
|
+
);
|
|
80
|
+
const lines = [...chains, ...propertyLines(edge.properties)];
|
|
81
|
+
return lines.length === 0 ? void 0 : lines.join("\n");
|
|
82
|
+
}
|
|
83
|
+
export {
|
|
84
|
+
capitalize,
|
|
85
|
+
edgeLabel,
|
|
86
|
+
edgeTitle,
|
|
87
|
+
excludedTally,
|
|
88
|
+
groupCaption,
|
|
89
|
+
isConditional,
|
|
90
|
+
memberAccess,
|
|
91
|
+
memberChips,
|
|
92
|
+
omittedParts,
|
|
93
|
+
propertyLines,
|
|
94
|
+
truncate
|
|
95
|
+
};
|
|
96
|
+
//# sourceMappingURL=call-graph-labels.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"call-graph-labels.js","sources":["../../../src/data/call-graph/call-graph-labels.ts"],"sourcesContent":["// What the call graph says about an edge, a group and what it left out, as text: pill labels,\n// tooltips, chips. Pure, with no React and no layout; call-graph-model.ts maps it onto the diagram.\nimport type { CallGraphEdge, CallGraphOmitted, CallGraphSite } from \"./types\";\n\n/** The room an edge type's icon (every type but a plain call has one) takes in a pill, in characters of guard text. */\nconst EDGE_ICON_CHARS = 3;\n\nexport function capitalize(text: string): string {\n return text.charAt(0).toUpperCase() + text.slice(1);\n}\n\nfunction counted(count: number, one: string, many: string): string {\n return `${count} ${count === 1 ? one : many}`;\n}\n\n/** The excluded nodes per group, most first, then by name. */\nexport function excludedTally(omitted: CallGraphOmitted): { group: string; count: number }[] {\n return Object.entries(omitted.excluded ?? {})\n .map(([group, count]) => ({ group, count }))\n .sort((a, b) => b.count - a.count || a.group.localeCompare(b.group));\n}\n\n/** The omitted chip's parts: what the response left out, with the excluded nodes as one total. */\nexport function omittedParts(omitted: CallGraphOmitted): string[] {\n const unreadable = omitted.unreadable_source?.length ?? 0;\n const excluded = excludedTally(omitted).reduce((total, { count }) => total + count, 0);\n return [\n omitted.node_limit ? \"node limit reached\" : \"\",\n omitted.beyond_depth ? `${omitted.beyond_depth} beyond depth` : \"\",\n omitted.unresolved ? `${omitted.unresolved} unresolved` : \"\",\n unreadable > 0 ? counted(unreadable, \"unreadable file\", \"unreadable files\") : \"\",\n excluded > 0 ? `${excluded} excluded` : \"\",\n ].filter(Boolean);\n}\n\n/** A group box caption: a path's last two segments. The full label is the caption's tooltip. */\nexport function groupCaption(label: string): string {\n return label.split(\"/\").slice(-2).join(\"/\");\n}\n\n/** Which of a site's nested guards the pill shows, how many there are, or none: the tooltip still names them. */\nexport type GuardLabel = \"innermost\" | \"outermost\" | \"count\" | \"none\";\n\nexport interface PillOptions {\n guardLabel: GuardLabel;\n /** Longest guard text a pill shows before it is cut with an ellipsis. */\n truncateAt: number;\n}\n\nfunction guardsOf(site: CallGraphSite): string[] {\n return site.guards ?? [];\n}\n\n/** An edge is conditional when no call site behind it can be reached unguarded. */\nexport function isConditional(edge: Pick<CallGraphEdge, \"sites\">): boolean {\n return edge.sites.length > 0 && edge.sites.every((site) => guardsOf(site).length > 0);\n}\n\nexport function truncate(text: string, max: number): string {\n return text.length <= max ? text : `${text.slice(0, max - 1).trimEnd()}…`;\n}\n\nfunction guardCount(edge: CallGraphEdge): string {\n const counts = edge.sites.map((site) => guardsOf(site).length);\n const least = Math.min(...counts);\n const most = Math.max(...counts);\n if (least === most) return `${most} ${most === 1 ? \"guard\" : \"guards\"}`;\n return `${least}–${most} guards`;\n}\n\n/** The guard a conditional edge's sites share, or how many different ones they have. */\nfunction guardText(edge: CallGraphEdge, { guardLabel, truncateAt }: PillOptions): string {\n if (!isConditional(edge) || guardLabel === \"none\") return \"\";\n if (guardLabel === \"count\") return guardCount(edge);\n const chosen = new Set(edge.sites.map((site) => guardsOf(site).at(guardLabel === \"innermost\" ? -1 : 0)));\n const [only] = chosen;\n if (chosen.size > 1 || only === undefined) return `${chosen.size} conditions`;\n return truncate(only, truncateAt - (edge.type === \"call\" ? 0 : EDGE_ICON_CHARS));\n}\n\n/**\n * The pill's text: the guard the edge's call sites share, then `×N` when there are several sites.\n * Sites with different guards show how many conditions there are instead of one of them, which would\n * read as if it covered every site. A dispatch edge's guard is cut shorter by the room its icon takes.\n */\nexport function edgeLabel(edge: CallGraphEdge, options: PillOptions): string | undefined {\n const text = [guardText(edge, options), edge.sites.length > 1 ? `×${edge.sites.length}` : \"\"].filter(Boolean).join(\" \");\n return text === \"\" ? undefined : text;\n}\n\n/** The columns and fields a collapsed read or write touches, apart from the edge's other properties. */\nexport function memberChips(properties: Record<string, string> | undefined): { columns: string[]; fields: string[]; rest: Record<string, string> } {\n const { columns, fields, ...rest } = properties ?? {};\n const split = (members: string | undefined) => (members ?? \"\").split(\",\").map((member) => member.trim()).filter(Boolean);\n return { columns: split(columns), fields: split(fields), rest };\n}\n\nexport type MemberAccessKind = \"read\" | \"write\" | \"both\";\n\n/** A column or field a collapsed read or write touches, and whether it is read, written or both. */\nexport interface MemberAccess {\n name: string;\n kind: \"column\" | \"field\";\n access: MemberAccessKind;\n}\n\n/**\n * The columns and fields the reads and writes among `edges` touch, each once in first-seen order,\n * marked \"both\" when a read and a write both touch it. Other edges are passed over.\n */\nexport function memberAccess(edges: readonly CallGraphEdge[]): MemberAccess[] {\n const members = new Map<string, MemberAccess>();\n for (const edge of edges) {\n if (edge.type !== \"read\" && edge.type !== \"write\") continue;\n const { columns, fields } = memberChips(edge.properties);\n const touched = [...columns.map((name) => ({ name, kind: \"column\" as const })), ...fields.map((name) => ({ name, kind: \"field\" as const }))];\n for (const { name, kind } of touched) {\n const key = `${kind}:${name}`;\n const held = members.get(key);\n members.set(key, { name, kind, access: held && held.access !== edge.type ? \"both\" : edge.type });\n }\n }\n return [...members.values()];\n}\n\n/** The edge's properties as `key: value` lines, in key order. */\nexport function propertyLines(properties: Record<string, string> | undefined): string[] {\n return Object.entries(properties ?? {})\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([key, value]) => `${key}: ${value}`);\n}\n\n/**\n * The edge's tooltip: one line per distinct guard chain behind it, outermost first and joined with ∧,\n * then its properties.\n */\nexport function edgeTitle(edge: CallGraphEdge): string | undefined {\n const chains = new Set(\n edge.sites\n .map(guardsOf)\n .filter((guards) => guards.length > 0)\n .map((guards) => guards.join(\" ∧ \")),\n );\n const lines = [...chains, ...propertyLines(edge.properties)];\n return lines.length === 0 ? undefined : lines.join(\"\\n\");\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const callGraphLabels = require("./call-graph-labels.cjs");
|
|
4
|
+
const callGraphVocabulary = require("./call-graph-vocabulary.cjs");
|
|
5
|
+
const types = require("./types.cjs");
|
|
6
|
+
const CALL_GRAPH_MAX_DEPTH = 8;
|
|
7
|
+
const CALL_GRAPH_DEFAULT_DEPTH = 2;
|
|
8
|
+
const DEFAULT_EDGE_LABELS = { call: "call", dispatch: "dispatch", read: "read", write: "write" };
|
|
9
|
+
const EDGE_TONE = { dispatch: "info", read: "success", write: "warning" };
|
|
10
|
+
function toggleAccess(access, type) {
|
|
11
|
+
const on = !access.includes(type);
|
|
12
|
+
if (!on && access.length === 1) throw new Error(`call graph: ${type} is the only access type on`);
|
|
13
|
+
return types.CALL_GRAPH_ACCESS.filter((entry) => entry === type ? on : access.includes(entry));
|
|
14
|
+
}
|
|
15
|
+
function requireNode(graph, id) {
|
|
16
|
+
const node = graph.nodes.find((candidate) => candidate.id === id);
|
|
17
|
+
if (!node) throw new Error(`call graph: no node "${id}"`);
|
|
18
|
+
return node;
|
|
19
|
+
}
|
|
20
|
+
function inDirection(depth, direction) {
|
|
21
|
+
if (direction === "both" || depth === 0) return true;
|
|
22
|
+
return direction === "callees" ? depth > 0 : depth < 0;
|
|
23
|
+
}
|
|
24
|
+
function visibleGraph(graph, view) {
|
|
25
|
+
const revealed = new Set(view.revealed);
|
|
26
|
+
const nodes = graph.nodes.filter(
|
|
27
|
+
(node) => inDirection(node.depth, view.direction) && (Math.abs(node.depth) <= view.depth || revealed.has(node.id))
|
|
28
|
+
);
|
|
29
|
+
const ids = new Set(nodes.map((node) => node.id));
|
|
30
|
+
return { nodes, edges: graph.edges.filter((edge) => ids.has(edge.from) && ids.has(edge.to)) };
|
|
31
|
+
}
|
|
32
|
+
function outerSide(node) {
|
|
33
|
+
return node.depth < 0 ? "in" : "out";
|
|
34
|
+
}
|
|
35
|
+
function expansionDirection(node) {
|
|
36
|
+
return outerSide(node) === "in" ? "callers" : "callees";
|
|
37
|
+
}
|
|
38
|
+
function outerNeighbours(graph, node) {
|
|
39
|
+
const side = outerSide(node);
|
|
40
|
+
return graph.edges.filter((edge) => (side === "out" ? edge.from : edge.to) === node.id).map((edge) => side === "out" ? edge.to : edge.from);
|
|
41
|
+
}
|
|
42
|
+
function expandCount(graph, visible, nodeId, direction, vocabulary) {
|
|
43
|
+
const node = requireNode(graph, nodeId);
|
|
44
|
+
const side = outerSide(node);
|
|
45
|
+
if (!vocabulary.hasSource(node) || direction === (side === "out" ? "callers" : "callees")) return 0;
|
|
46
|
+
const drawn = new Set(visible.nodes.map((entry) => entry.id));
|
|
47
|
+
const accounted = outerNeighbours(graph, node).filter((id) => drawn.has(id)).length;
|
|
48
|
+
return Math.max(0, (side === "out" ? node.out : node.in) - accounted);
|
|
49
|
+
}
|
|
50
|
+
function accessTotals(graph, node) {
|
|
51
|
+
const into = (types2) => graph.edges.filter((edge) => edge.to === node.id && types2.includes(edge.type)).length;
|
|
52
|
+
const totals = [["readers", into(["read"])], ["writers", into(["write"])], ["callers", into(["call", "dispatch"])]];
|
|
53
|
+
return Object.fromEntries(totals.filter(([, count]) => count > 0));
|
|
54
|
+
}
|
|
55
|
+
function walkedTotals(graph, node, vocabulary) {
|
|
56
|
+
if (vocabulary.isData(node)) return accessTotals(graph, node);
|
|
57
|
+
const walked = (sign) => graph.nodes.some((other) => Math.sign(other.depth) === sign);
|
|
58
|
+
return {
|
|
59
|
+
...node.depth <= 0 && walked(-1) ? { callers: node.in } : {},
|
|
60
|
+
...node.depth >= 0 && walked(1) ? { callees: node.out } : {}
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
function distinctSites(sites) {
|
|
64
|
+
return sites.filter((site, index) => sites.findIndex((other) => callGraphVocabulary.siteKey(other) === callGraphVocabulary.siteKey(site)) === index);
|
|
65
|
+
}
|
|
66
|
+
const edgeKey = (edge) => `${edge.from}|${edge.to}|${edge.type}`;
|
|
67
|
+
function mergeGraph(held, expansion) {
|
|
68
|
+
const [rootId] = expansion.roots;
|
|
69
|
+
const base = held.nodes.find((node) => node.id === rootId);
|
|
70
|
+
if (rootId === void 0 || !base) throw new Error(`call graph: expansion root "${rootId}" is not in the held graph`);
|
|
71
|
+
const heldIds = new Set(held.nodes.map((node) => node.id));
|
|
72
|
+
const added = expansion.nodes.filter((node) => !heldIds.has(node.id)).map((node) => ({ ...node, depth: base.depth + node.depth }));
|
|
73
|
+
const incoming = new Map(expansion.edges.map((edge) => [edgeKey(edge), edge]));
|
|
74
|
+
const edges = held.edges.map((edge) => {
|
|
75
|
+
const more = incoming.get(edgeKey(edge));
|
|
76
|
+
incoming.delete(edgeKey(edge));
|
|
77
|
+
if (!more) return edge;
|
|
78
|
+
const properties = edge.properties && Object.keys(edge.properties).length > 0 ? edge.properties : more.properties;
|
|
79
|
+
return { ...edge, sites: distinctSites([...edge.sites, ...more.sites]), ...properties ? { properties } : {} };
|
|
80
|
+
});
|
|
81
|
+
const groupIds = new Set((held.groups ?? []).map((group) => group.id));
|
|
82
|
+
const groups = [...held.groups ?? [], ...(expansion.groups ?? []).filter((group) => !groupIds.has(group.id))];
|
|
83
|
+
return { ...held, nodes: [...held.nodes, ...added], edges: [...edges, ...incoming.values()], groups };
|
|
84
|
+
}
|
|
85
|
+
function groupRank(graph, vocabulary) {
|
|
86
|
+
const rootGroups = new Set(graph.roots.map((id) => requireNode(graph, id).group));
|
|
87
|
+
const sourced = new Set(graph.nodes.filter((node) => vocabulary.hasSource(node)).map((node) => node.group));
|
|
88
|
+
return (node) => {
|
|
89
|
+
if (node.group === void 0) return 3;
|
|
90
|
+
if (rootGroups.has(node.group)) return 0;
|
|
91
|
+
return sourced.has(node.group) ? 1 : 2;
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
function toDiagramNode(node, { graph, visible, direction, options, glyphs, vocabulary }) {
|
|
95
|
+
const count = expandCount(graph, visible, node.id, direction, vocabulary);
|
|
96
|
+
const isRoot = graph.roots.includes(node.id);
|
|
97
|
+
const tone = isRoot ? "info" : node.unresolved ? "warning" : void 0;
|
|
98
|
+
const compact = !isRoot && vocabulary.isData(node) && !vocabulary.hasSource(node);
|
|
99
|
+
return {
|
|
100
|
+
id: node.id,
|
|
101
|
+
label: node.label,
|
|
102
|
+
icon: glyphs.node(vocabulary.glyphOf(graph, node), vocabulary.kindOf(graph, node)),
|
|
103
|
+
title: callGraphVocabulary.nodeTitle(graph, node, vocabulary),
|
|
104
|
+
level: node.depth,
|
|
105
|
+
...options.grouped && node.group !== void 0 ? { group: node.group } : {},
|
|
106
|
+
...compact ? { size: "compact" } : {},
|
|
107
|
+
...tone !== void 0 ? { tone } : {},
|
|
108
|
+
...vocabulary.muted(node) ? { muted: true } : {},
|
|
109
|
+
...count > 0 ? { expandCount: count } : {}
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
function toDiagramEdge(edge, { options, glyphs, edgeLabels }) {
|
|
113
|
+
const label = callGraphLabels.edgeLabel(edge, options);
|
|
114
|
+
const title = callGraphLabels.edgeTitle(edge);
|
|
115
|
+
return {
|
|
116
|
+
id: edge.id,
|
|
117
|
+
from: edge.from,
|
|
118
|
+
to: edge.to,
|
|
119
|
+
dashed: callGraphLabels.isConditional(edge),
|
|
120
|
+
...edge.type === "call" ? {} : { tone: EDGE_TONE[edge.type], icon: glyphs.edge(edge.type), iconLabel: edgeLabels[edge.type] },
|
|
121
|
+
...label !== void 0 ? { label } : {},
|
|
122
|
+
...title !== void 0 ? { title } : {}
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
const PILL_CHAR_WIDTH = 5.2;
|
|
126
|
+
const PILL_CHROME = 22;
|
|
127
|
+
const PILL_ICON_CHARS = 3;
|
|
128
|
+
const MIN_COLUMN_GAP = 96;
|
|
129
|
+
function columnGap({
|
|
130
|
+
nodes,
|
|
131
|
+
edges
|
|
132
|
+
}) {
|
|
133
|
+
const level = new Map(nodes.map((node) => [node.id, node.level]));
|
|
134
|
+
const chars = edges.filter((edge) => level.get(edge.from) !== level.get(edge.to)).map((edge) => {
|
|
135
|
+
var _a;
|
|
136
|
+
return (((_a = edge.label) == null ? void 0 : _a.length) ?? 0) + (edge.icon != null ? PILL_ICON_CHARS : 0);
|
|
137
|
+
});
|
|
138
|
+
return Math.max(MIN_COLUMN_GAP, Math.round(Math.max(0, ...chars) * PILL_CHAR_WIDTH) + PILL_CHROME);
|
|
139
|
+
}
|
|
140
|
+
function toDiagram(input) {
|
|
141
|
+
const { graph, visible, options, glyphs, vocabulary } = input;
|
|
142
|
+
const rank = groupRank(graph, vocabulary);
|
|
143
|
+
return {
|
|
144
|
+
nodes: [...visible.nodes].sort((a, b) => rank(a) - rank(b)).map((node) => toDiagramNode(node, input)),
|
|
145
|
+
edges: visible.edges.map((edge) => toDiagramEdge(edge, input)),
|
|
146
|
+
groups: options.grouped ? (graph.groups ?? []).map(({ id, label }) => ({ id, label: glyphs.group(callGraphLabels.groupCaption(label)), title: label })) : []
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
exports.CALL_GRAPH_DEFAULT_DEPTH = CALL_GRAPH_DEFAULT_DEPTH;
|
|
150
|
+
exports.CALL_GRAPH_MAX_DEPTH = CALL_GRAPH_MAX_DEPTH;
|
|
151
|
+
exports.DEFAULT_EDGE_LABELS = DEFAULT_EDGE_LABELS;
|
|
152
|
+
exports.columnGap = columnGap;
|
|
153
|
+
exports.expandCount = expandCount;
|
|
154
|
+
exports.expansionDirection = expansionDirection;
|
|
155
|
+
exports.mergeGraph = mergeGraph;
|
|
156
|
+
exports.requireNode = requireNode;
|
|
157
|
+
exports.toDiagram = toDiagram;
|
|
158
|
+
exports.toggleAccess = toggleAccess;
|
|
159
|
+
exports.visibleGraph = visibleGraph;
|
|
160
|
+
exports.walkedTotals = walkedTotals;
|
|
161
|
+
//# sourceMappingURL=call-graph-model.cjs.map
|