@flanksource/clicky-ui 0.2.14 → 0.2.15
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/dist/chat.cjs +20 -0
- package/dist/chat.cjs.map +1 -0
- package/dist/chat.d.ts +2 -0
- package/dist/chat.d.ts.map +1 -0
- package/dist/chat.js +20 -0
- package/dist/chat.js.map +1 -0
- package/dist/components/Combobox.cjs +5 -3
- package/dist/components/Combobox.cjs.map +1 -1
- package/dist/components/Combobox.d.ts +2 -0
- package/dist/components/Combobox.d.ts.map +1 -1
- package/dist/components/Combobox.js +5 -3
- package/dist/components/Combobox.js.map +1 -1
- package/dist/components/DateTimePicker.cjs +3 -1
- package/dist/components/DateTimePicker.cjs.map +1 -1
- package/dist/components/DateTimePicker.d.ts +5 -1
- package/dist/components/DateTimePicker.d.ts.map +1 -1
- package/dist/components/DateTimePicker.js +3 -1
- package/dist/components/DateTimePicker.js.map +1 -1
- package/dist/components/FilterBar.cjs +8 -41
- package/dist/components/FilterBar.cjs.map +1 -1
- package/dist/components/FilterBar.d.ts +0 -2
- package/dist/components/FilterBar.d.ts.map +1 -1
- package/dist/components/FilterBar.js +3 -36
- package/dist/components/FilterBar.js.map +1 -1
- package/dist/components/FormatOptionsDropdown.cjs +2 -18
- package/dist/components/FormatOptionsDropdown.cjs.map +1 -1
- package/dist/components/FormatOptionsDropdown.d.ts +1 -17
- package/dist/components/FormatOptionsDropdown.d.ts.map +1 -1
- package/dist/components/FormatOptionsDropdown.js +1 -17
- package/dist/components/FormatOptionsDropdown.js.map +1 -1
- package/dist/components/JsonSchemaForm.cjs +128 -12
- package/dist/components/JsonSchemaForm.cjs.map +1 -1
- package/dist/components/JsonSchemaForm.d.ts +1 -1
- package/dist/components/JsonSchemaForm.d.ts.map +1 -1
- package/dist/components/JsonSchemaForm.js +131 -15
- package/dist/components/JsonSchemaForm.js.map +1 -1
- package/dist/components/SecretKeySelector.cjs +0 -1
- package/dist/components/SecretKeySelector.cjs.map +1 -1
- package/dist/components/SecretKeySelector.d.ts +0 -2
- package/dist/components/SecretKeySelector.d.ts.map +1 -1
- package/dist/components/SecretKeySelector.js +1 -2
- package/dist/components/SecretKeySelector.js.map +1 -1
- package/dist/components/TreePickerField.cjs +137 -0
- package/dist/components/TreePickerField.cjs.map +1 -0
- package/dist/components/TreePickerField.d.ts +30 -0
- package/dist/components/TreePickerField.d.ts.map +1 -0
- package/dist/components/TreePickerField.js +137 -0
- package/dist/components/TreePickerField.js.map +1 -0
- package/dist/components/WorkloadPicker.cjs +6 -81
- package/dist/components/WorkloadPicker.cjs.map +1 -1
- package/dist/components/WorkloadPicker.d.ts +1 -20
- package/dist/components/WorkloadPicker.d.ts.map +1 -1
- package/dist/components/WorkloadPicker.js +3 -78
- package/dist/components/WorkloadPicker.js.map +1 -1
- package/dist/components/button-variants.cjs +30 -0
- package/dist/components/button-variants.cjs.map +1 -0
- package/dist/components/button-variants.d.ts +5 -0
- package/dist/components/button-variants.d.ts.map +1 -0
- package/dist/components/button-variants.js +30 -0
- package/dist/components/button-variants.js.map +1 -0
- package/dist/components/button.cjs +11 -82
- package/dist/components/button.cjs.map +1 -1
- package/dist/components/button.d.ts +1 -5
- package/dist/components/button.d.ts.map +1 -1
- package/dist/components/button.js +5 -76
- package/dist/components/button.js.map +1 -1
- package/dist/components/filter-bar-utils.cjs +37 -0
- package/dist/components/filter-bar-utils.cjs.map +1 -0
- package/dist/components/filter-bar-utils.d.ts +4 -0
- package/dist/components/filter-bar-utils.d.ts.map +1 -0
- package/dist/components/filter-bar-utils.js +37 -0
- package/dist/components/filter-bar-utils.js.map +1 -0
- package/dist/components/format-options.cjs +20 -0
- package/dist/components/format-options.cjs.map +1 -0
- package/dist/components/format-options.d.ts +18 -0
- package/dist/components/format-options.d.ts.map +1 -0
- package/dist/components/format-options.js +20 -0
- package/dist/components/format-options.js.map +1 -0
- package/dist/components/json-schema-form-array.cjs +13 -17
- package/dist/components/json-schema-form-array.cjs.map +1 -1
- package/dist/components/json-schema-form-array.d.ts +1 -2
- package/dist/components/json-schema-form-array.d.ts.map +1 -1
- package/dist/components/json-schema-form-array.js +3 -7
- package/dist/components/json-schema-form-array.js.map +1 -1
- package/dist/components/json-schema-form-fields.cjs +90 -232
- package/dist/components/json-schema-form-fields.cjs.map +1 -1
- package/dist/components/json-schema-form-fields.d.ts +51 -6
- package/dist/components/json-schema-form-fields.d.ts.map +1 -1
- package/dist/components/json-schema-form-fields.js +82 -224
- package/dist/components/json-schema-form-fields.js.map +1 -1
- package/dist/components/json-schema-form-object.cjs +149 -0
- package/dist/components/json-schema-form-object.cjs.map +1 -0
- package/dist/components/json-schema-form-object.d.ts +10 -0
- package/dist/components/json-schema-form-object.d.ts.map +1 -0
- package/dist/components/json-schema-form-object.js +149 -0
- package/dist/components/json-schema-form-object.js.map +1 -0
- package/dist/components/json-schema-form-preferences.cjs +41 -0
- package/dist/components/json-schema-form-preferences.cjs.map +1 -0
- package/dist/components/json-schema-form-preferences.d.ts +10 -0
- package/dist/components/json-schema-form-preferences.d.ts.map +1 -0
- package/dist/components/json-schema-form-preferences.js +41 -0
- package/dist/components/json-schema-form-preferences.js.map +1 -0
- package/dist/components/json-schema-form-render.cjs +43 -72
- package/dist/components/json-schema-form-render.cjs.map +1 -1
- package/dist/components/json-schema-form-render.d.ts +5 -33
- package/dist/components/json-schema-form-render.d.ts.map +1 -1
- package/dist/components/json-schema-form-render.js +41 -70
- package/dist/components/json-schema-form-render.js.map +1 -1
- package/dist/components/json-schema-form-resolve.cjs +9 -1
- package/dist/components/json-schema-form-resolve.cjs.map +1 -1
- package/dist/components/json-schema-form-resolve.d.ts.map +1 -1
- package/dist/components/json-schema-form-resolve.js +9 -1
- package/dist/components/json-schema-form-resolve.js.map +1 -1
- package/dist/components/json-schema-form-types.d.ts +58 -1
- package/dist/components/json-schema-form-types.d.ts.map +1 -1
- package/dist/components/json-schema-form-utils.cjs +96 -0
- package/dist/components/json-schema-form-utils.cjs.map +1 -0
- package/dist/components/json-schema-form-utils.d.ts +17 -0
- package/dist/components/json-schema-form-utils.d.ts.map +1 -0
- package/dist/components/json-schema-form-utils.js +96 -0
- package/dist/components/json-schema-form-utils.js.map +1 -0
- package/dist/components/loading.cjs +109 -0
- package/dist/components/loading.cjs.map +1 -0
- package/dist/components/loading.d.ts +27 -0
- package/dist/components/loading.d.ts.map +1 -0
- package/dist/components/loading.js +109 -0
- package/dist/components/loading.js.map +1 -0
- package/dist/components/workload-picker-utils.cjs +88 -0
- package/dist/components/workload-picker-utils.cjs.map +1 -0
- package/dist/components/workload-picker-utils.d.ts +34 -0
- package/dist/components/workload-picker-utils.d.ts.map +1 -0
- package/dist/components/workload-picker-utils.js +88 -0
- package/dist/components/workload-picker-utils.js.map +1 -0
- package/dist/components.cjs +18 -6
- package/dist/components.cjs.map +1 -1
- package/dist/components.d.ts +10 -3
- package/dist/components.d.ts.map +1 -1
- package/dist/components.js +16 -4
- package/dist/components.js.map +1 -1
- package/dist/data/Badge.cjs +11 -91
- package/dist/data/Badge.cjs.map +1 -1
- package/dist/data/Badge.d.ts +1 -5
- package/dist/data/Badge.d.ts.map +1 -1
- package/dist/data/Badge.js +11 -91
- package/dist/data/Badge.js.map +1 -1
- package/dist/data/Clicky.cjs +4 -3
- package/dist/data/Clicky.cjs.map +1 -1
- package/dist/data/Clicky.d.ts.map +1 -1
- package/dist/data/Clicky.js +4 -3
- package/dist/data/Clicky.js.map +1 -1
- package/dist/data/DataTable.cjs +161 -156
- package/dist/data/DataTable.cjs.map +1 -1
- package/dist/data/DataTable.d.ts +25 -4
- package/dist/data/DataTable.d.ts.map +1 -1
- package/dist/data/DataTable.js +140 -135
- package/dist/data/DataTable.js.map +1 -1
- package/dist/data/FilterPill.cjs +3 -0
- package/dist/data/FilterPill.cjs.map +1 -1
- package/dist/data/FilterPill.d.ts.map +1 -1
- package/dist/data/FilterPill.js +3 -0
- package/dist/data/FilterPill.js.map +1 -1
- package/dist/data/Icon.cjs +7 -7
- package/dist/data/Icon.cjs.map +1 -1
- package/dist/data/Icon.js +7 -7
- package/dist/data/Icon.js.map +1 -1
- package/dist/data/LogDetails.cjs +5 -14
- package/dist/data/LogDetails.cjs.map +1 -1
- package/dist/data/LogDetails.d.ts +8 -4
- package/dist/data/LogDetails.d.ts.map +1 -1
- package/dist/data/LogDetails.js +4 -13
- package/dist/data/LogDetails.js.map +1 -1
- package/dist/data/LogsTable.cjs +6 -165
- package/dist/data/LogsTable.cjs.map +1 -1
- package/dist/data/LogsTable.d.ts +2 -15
- package/dist/data/LogsTable.d.ts.map +1 -1
- package/dist/data/LogsTable.js +6 -165
- package/dist/data/LogsTable.js.map +1 -1
- package/dist/data/TimeseriesPanel.axes.cjs.map +1 -1
- package/dist/data/TimeseriesPanel.axes.js.map +1 -1
- package/dist/data/TreeNode.cjs +13 -7
- package/dist/data/TreeNode.cjs.map +1 -1
- package/dist/data/TreeNode.d.ts.map +1 -1
- package/dist/data/TreeNode.js +13 -7
- package/dist/data/TreeNode.js.map +1 -1
- package/dist/data/badge-variants.cjs +85 -0
- package/dist/data/badge-variants.cjs.map +1 -0
- package/dist/data/badge-variants.d.ts +6 -0
- package/dist/data/badge-variants.d.ts.map +1 -0
- package/dist/data/badge-variants.js +85 -0
- package/dist/data/badge-variants.js.map +1 -0
- package/dist/data/cache-browser/CacheBrowser.cjs +59 -0
- package/dist/data/cache-browser/CacheBrowser.cjs.map +1 -0
- package/dist/data/cache-browser/CacheBrowser.d.ts +26 -0
- package/dist/data/cache-browser/CacheBrowser.d.ts.map +1 -0
- package/dist/data/cache-browser/CacheBrowser.js +59 -0
- package/dist/data/cache-browser/CacheBrowser.js.map +1 -0
- package/dist/data/cache-browser/CacheDetailPanel.cjs +193 -0
- package/dist/data/cache-browser/CacheDetailPanel.cjs.map +1 -0
- package/dist/data/cache-browser/CacheDetailPanel.d.ts +20 -0
- package/dist/data/cache-browser/CacheDetailPanel.d.ts.map +1 -0
- package/dist/data/cache-browser/CacheDetailPanel.js +193 -0
- package/dist/data/cache-browser/CacheDetailPanel.js.map +1 -0
- package/dist/data/cache-browser/CacheStatsOverview.cjs +126 -0
- package/dist/data/cache-browser/CacheStatsOverview.cjs.map +1 -0
- package/dist/data/cache-browser/CacheStatsOverview.d.ts +17 -0
- package/dist/data/cache-browser/CacheStatsOverview.d.ts.map +1 -0
- package/dist/data/cache-browser/CacheStatsOverview.js +126 -0
- package/dist/data/cache-browser/CacheStatsOverview.js.map +1 -0
- package/dist/data/cache-browser/CacheTree.cjs +189 -0
- package/dist/data/cache-browser/CacheTree.cjs.map +1 -0
- package/dist/data/cache-browser/CacheTree.d.ts +27 -0
- package/dist/data/cache-browser/CacheTree.d.ts.map +1 -0
- package/dist/data/cache-browser/CacheTree.js +189 -0
- package/dist/data/cache-browser/CacheTree.js.map +1 -0
- package/dist/data/cache-browser/CacheValue.cjs +86 -0
- package/dist/data/cache-browser/CacheValue.cjs.map +1 -0
- package/dist/data/cache-browser/CacheValue.d.ts +11 -0
- package/dist/data/cache-browser/CacheValue.d.ts.map +1 -0
- package/dist/data/cache-browser/CacheValue.js +86 -0
- package/dist/data/cache-browser/CacheValue.js.map +1 -0
- package/dist/data/cache-browser/adapter.cjs +52 -0
- package/dist/data/cache-browser/adapter.cjs.map +1 -0
- package/dist/data/cache-browser/adapter.d.ts +48 -0
- package/dist/data/cache-browser/adapter.d.ts.map +1 -0
- package/dist/data/cache-browser/adapter.js +52 -0
- package/dist/data/cache-browser/adapter.js.map +1 -0
- package/dist/data/cache-browser/api.cjs +42 -0
- package/dist/data/cache-browser/api.cjs.map +1 -0
- package/dist/data/cache-browser/api.d.ts +33 -0
- package/dist/data/cache-browser/api.d.ts.map +1 -0
- package/dist/data/cache-browser/api.js +42 -0
- package/dist/data/cache-browser/api.js.map +1 -0
- package/dist/data/cache-browser/index.d.ts +9 -0
- package/dist/data/cache-browser/index.d.ts.map +1 -0
- package/dist/data/cache-browser/types.cjs +7 -0
- package/dist/data/cache-browser/types.cjs.map +1 -0
- package/dist/data/cache-browser/types.d.ts +78 -0
- package/dist/data/cache-browser/types.d.ts.map +1 -0
- package/dist/data/cache-browser/types.js +7 -0
- package/dist/data/cache-browser/types.js.map +1 -0
- package/dist/data/cells/TagList.cjs +4 -101
- package/dist/data/cells/TagList.cjs.map +1 -1
- package/dist/data/cells/TagList.d.ts +1 -49
- package/dist/data/cells/TagList.d.ts.map +1 -1
- package/dist/data/cells/TagList.js +3 -100
- package/dist/data/cells/TagList.js.map +1 -1
- package/dist/data/cells/Timestamp.cjs +3 -192
- package/dist/data/cells/Timestamp.cjs.map +1 -1
- package/dist/data/cells/Timestamp.d.ts +1 -50
- package/dist/data/cells/Timestamp.d.ts.map +1 -1
- package/dist/data/cells/Timestamp.js +2 -191
- package/dist/data/cells/Timestamp.js.map +1 -1
- package/dist/data/cells/tag-utils.cjs +103 -0
- package/dist/data/cells/tag-utils.cjs.map +1 -0
- package/dist/data/cells/tag-utils.d.ts +51 -0
- package/dist/data/cells/tag-utils.d.ts.map +1 -0
- package/dist/data/cells/tag-utils.js +103 -0
- package/dist/data/cells/tag-utils.js.map +1 -0
- package/dist/data/cells/timestamp-format.cjs +193 -0
- package/dist/data/cells/timestamp-format.cjs.map +1 -0
- package/dist/data/cells/timestamp-format.d.ts +51 -0
- package/dist/data/cells/timestamp-format.d.ts.map +1 -0
- package/dist/data/cells/timestamp-format.js +193 -0
- package/dist/data/cells/timestamp-format.js.map +1 -0
- package/dist/data/chat/Chat.cjs +48 -0
- package/dist/data/chat/Chat.cjs.map +1 -0
- package/dist/data/chat/Chat.d.ts +26 -0
- package/dist/data/chat/Chat.d.ts.map +1 -0
- package/dist/data/chat/Chat.fixtures.d.ts +6 -0
- package/dist/data/chat/Chat.fixtures.d.ts.map +1 -0
- package/dist/data/chat/Chat.js +48 -0
- package/dist/data/chat/Chat.js.map +1 -0
- package/dist/data/chat/Conversation.cjs +34 -0
- package/dist/data/chat/Conversation.cjs.map +1 -0
- package/dist/data/chat/Conversation.d.ts +11 -0
- package/dist/data/chat/Conversation.d.ts.map +1 -0
- package/dist/data/chat/Conversation.js +34 -0
- package/dist/data/chat/Conversation.js.map +1 -0
- package/dist/data/chat/Message.cjs +44 -0
- package/dist/data/chat/Message.cjs.map +1 -0
- package/dist/data/chat/Message.d.ts +10 -0
- package/dist/data/chat/Message.d.ts.map +1 -0
- package/dist/data/chat/Message.js +44 -0
- package/dist/data/chat/Message.js.map +1 -0
- package/dist/data/chat/PromptInput.cjs +61 -0
- package/dist/data/chat/PromptInput.cjs.map +1 -0
- package/dist/data/chat/PromptInput.d.ts +16 -0
- package/dist/data/chat/PromptInput.d.ts.map +1 -0
- package/dist/data/chat/PromptInput.js +61 -0
- package/dist/data/chat/PromptInput.js.map +1 -0
- package/dist/data/chat/ToolCall.cjs +92 -0
- package/dist/data/chat/ToolCall.cjs.map +1 -0
- package/dist/data/chat/ToolCall.d.ts +14 -0
- package/dist/data/chat/ToolCall.d.ts.map +1 -0
- package/dist/data/chat/ToolCall.js +92 -0
- package/dist/data/chat/ToolCall.js.map +1 -0
- package/dist/data/chat/clickyOperationsToTools.cjs +73 -0
- package/dist/data/chat/clickyOperationsToTools.cjs.map +1 -0
- package/dist/data/chat/clickyOperationsToTools.d.ts +10 -0
- package/dist/data/chat/clickyOperationsToTools.d.ts.map +1 -0
- package/dist/data/chat/clickyOperationsToTools.js +73 -0
- package/dist/data/chat/clickyOperationsToTools.js.map +1 -0
- package/dist/data/chat/index.d.ts +8 -0
- package/dist/data/chat/index.d.ts.map +1 -0
- package/dist/data/chat/types.cjs +18 -0
- package/dist/data/chat/types.cjs.map +1 -0
- package/dist/data/chat/types.d.ts +41 -0
- package/dist/data/chat/types.d.ts.map +1 -0
- package/dist/data/chat/types.js +18 -0
- package/dist/data/chat/types.js.map +1 -0
- package/dist/data/data-table-utils.cjs +55 -0
- package/dist/data/data-table-utils.cjs.map +1 -0
- package/dist/data/data-table-utils.d.ts +24 -0
- package/dist/data/data-table-utils.d.ts.map +1 -0
- package/dist/data/data-table-utils.js +55 -0
- package/dist/data/data-table-utils.js.map +1 -0
- package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs +2 -1
- package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs.map +1 -1
- package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts.map +1 -1
- package/dist/data/diagnostics/DiagnosticsDetailPanel.js +3 -2
- package/dist/data/diagnostics/DiagnosticsDetailPanel.js.map +1 -1
- package/dist/data/diagnostics/GoroutineCard.cjs +3 -22
- package/dist/data/diagnostics/GoroutineCard.cjs.map +1 -1
- package/dist/data/diagnostics/GoroutineCard.d.ts +0 -2
- package/dist/data/diagnostics/GoroutineCard.d.ts.map +1 -1
- package/dist/data/diagnostics/GoroutineCard.js +2 -21
- package/dist/data/diagnostics/GoroutineCard.js.map +1 -1
- package/dist/data/diagnostics/ThreadCard.cjs +3 -38
- package/dist/data/diagnostics/ThreadCard.cjs.map +1 -1
- package/dist/data/diagnostics/ThreadCard.d.ts +0 -2
- package/dist/data/diagnostics/ThreadCard.d.ts.map +1 -1
- package/dist/data/diagnostics/ThreadCard.js +2 -37
- package/dist/data/diagnostics/ThreadCard.js.map +1 -1
- package/dist/data/diagnostics/state-styles.cjs +59 -0
- package/dist/data/diagnostics/state-styles.cjs.map +1 -0
- package/dist/data/diagnostics/state-styles.d.ts +5 -0
- package/dist/data/diagnostics/state-styles.d.ts.map +1 -0
- package/dist/data/diagnostics/state-styles.js +59 -0
- package/dist/data/diagnostics/state-styles.js.map +1 -0
- package/dist/data/logs-normalize.cjs +166 -0
- package/dist/data/logs-normalize.cjs.map +1 -0
- package/dist/data/logs-normalize.d.ts +16 -0
- package/dist/data/logs-normalize.d.ts.map +1 -0
- package/dist/data/logs-normalize.js +166 -0
- package/dist/data/logs-normalize.js.map +1 -0
- package/dist/data/task-status.cjs +19 -19
- package/dist/data/task-status.cjs.map +1 -1
- package/dist/data/task-status.js +19 -19
- package/dist/data/task-status.js.map +1 -1
- package/dist/data/version-info.cjs +3 -3
- package/dist/data/version-info.js +3 -3
- package/dist/data.cjs +43 -18
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.ts +11 -5
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +30 -5
- package/dist/data.js.map +1 -1
- package/dist/hooks/density-provider.cjs +38 -0
- package/dist/hooks/density-provider.cjs.map +1 -0
- package/dist/hooks/density-provider.d.ts +20 -0
- package/dist/hooks/density-provider.d.ts.map +1 -0
- package/dist/hooks/density-provider.js +38 -0
- package/dist/hooks/density-provider.js.map +1 -0
- package/dist/hooks/theme-provider.cjs +43 -0
- package/dist/hooks/theme-provider.cjs.map +1 -0
- package/dist/hooks/theme-provider.d.ts +9 -0
- package/dist/hooks/theme-provider.d.ts.map +1 -0
- package/dist/hooks/theme-provider.js +43 -0
- package/dist/hooks/theme-provider.js.map +1 -0
- package/dist/hooks/use-density.cjs +8 -37
- package/dist/hooks/use-density.cjs.map +1 -1
- package/dist/hooks/use-density.d.ts +5 -20
- package/dist/hooks/use-density.d.ts.map +1 -1
- package/dist/hooks/use-density.js +9 -38
- package/dist/hooks/use-density.js.map +1 -1
- package/dist/hooks/use-theme.cjs +10 -43
- package/dist/hooks/use-theme.cjs.map +1 -1
- package/dist/hooks/use-theme.d.ts +6 -9
- package/dist/hooks/use-theme.d.ts.map +1 -1
- package/dist/hooks/use-theme.js +11 -44
- package/dist/hooks/use-theme.js.map +1 -1
- package/dist/hooks.cjs +5 -2
- package/dist/hooks.cjs.map +1 -1
- package/dist/hooks.d.ts +4 -2
- package/dist/hooks.d.ts.map +1 -1
- package/dist/hooks.js +5 -2
- package/dist/hooks.js.map +1 -1
- package/dist/icons/changeIconAliases.cjs +13 -13
- package/dist/icons/changeIconAliases.cjs.map +1 -1
- package/dist/icons/changeIconAliases.d.ts.map +1 -1
- package/dist/icons/changeIconAliases.js +13 -13
- package/dist/icons/changeIconAliases.js.map +1 -1
- package/dist/index.cjs +71 -30
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +53 -12
- package/dist/index.js.map +1 -1
- package/dist/overlay/DropdownMenu.cjs +2 -0
- package/dist/overlay/DropdownMenu.cjs.map +1 -1
- package/dist/overlay/DropdownMenu.d.ts +3 -1
- package/dist/overlay/DropdownMenu.d.ts.map +1 -1
- package/dist/overlay/DropdownMenu.js +2 -0
- package/dist/overlay/DropdownMenu.js.map +1 -1
- package/dist/overlay/Modal.cjs +11 -4
- package/dist/overlay/Modal.cjs.map +1 -1
- package/dist/overlay/Modal.d.ts +1 -1
- package/dist/overlay/Modal.d.ts.map +1 -1
- package/dist/overlay/Modal.js +11 -4
- package/dist/overlay/Modal.js.map +1 -1
- package/dist/overlay/modalStack.cjs +35 -0
- package/dist/overlay/modalStack.cjs.map +1 -0
- package/dist/overlay/modalStack.d.ts +13 -0
- package/dist/overlay/modalStack.d.ts.map +1 -0
- package/dist/overlay/modalStack.js +35 -0
- package/dist/overlay/modalStack.js.map +1 -0
- package/dist/rpc/AcceptPicker.cjs +2 -18
- package/dist/rpc/AcceptPicker.cjs.map +1 -1
- package/dist/rpc/AcceptPicker.d.ts +1 -41
- package/dist/rpc/AcceptPicker.d.ts.map +1 -1
- package/dist/rpc/AcceptPicker.js +2 -18
- package/dist/rpc/AcceptPicker.js.map +1 -1
- package/dist/rpc/CommandOutput.cjs +1 -1
- package/dist/rpc/CommandOutput.cjs.map +1 -1
- package/dist/rpc/CommandOutput.js +1 -1
- package/dist/rpc/CommandOutput.js.map +1 -1
- package/dist/rpc/EndpointList.cjs +1 -1
- package/dist/rpc/EndpointList.cjs.map +1 -1
- package/dist/rpc/EndpointList.js +1 -1
- package/dist/rpc/EndpointList.js.map +1 -1
- package/dist/rpc/OperationCatalog.cjs +23 -41
- package/dist/rpc/OperationCatalog.cjs.map +1 -1
- package/dist/rpc/OperationCatalog.d.ts.map +1 -1
- package/dist/rpc/OperationCatalog.js +24 -42
- package/dist/rpc/OperationCatalog.js.map +1 -1
- package/dist/rpc/OperationCommandPage.cjs.map +1 -1
- package/dist/rpc/OperationCommandPage.d.ts.map +1 -1
- package/dist/rpc/OperationCommandPage.js.map +1 -1
- package/dist/rpc/accept-options.cjs +20 -0
- package/dist/rpc/accept-options.cjs.map +1 -0
- package/dist/rpc/accept-options.d.ts +42 -0
- package/dist/rpc/accept-options.d.ts.map +1 -0
- package/dist/rpc/accept-options.js +20 -0
- package/dist/rpc/accept-options.js.map +1 -0
- package/dist/rpc/classify.cjs +15 -4
- package/dist/rpc/classify.cjs.map +1 -1
- package/dist/rpc/classify.d.ts.map +1 -1
- package/dist/rpc/classify.js +15 -4
- package/dist/rpc/classify.js.map +1 -1
- package/dist/rpc/clickyMetadata.cjs +13 -3
- package/dist/rpc/clickyMetadata.cjs.map +1 -1
- package/dist/rpc/clickyMetadata.d.ts +2 -0
- package/dist/rpc/clickyMetadata.d.ts.map +1 -1
- package/dist/rpc/clickyMetadata.js +14 -4
- package/dist/rpc/clickyMetadata.js.map +1 -1
- package/dist/rpc.cjs +3 -2
- package/dist/rpc.cjs.map +1 -1
- package/dist/rpc.d.ts +2 -1
- package/dist/rpc.d.ts.map +1 -1
- package/dist/rpc.js +2 -1
- package/dist/rpc.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +16 -1
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const jsxRuntime = require("react/jsx-runtime");
|
|
4
|
+
const CodeBlock = require("../CodeBlock.cjs");
|
|
5
|
+
const KeyValueList = require("../KeyValueList.cjs");
|
|
6
|
+
function CacheValue({ detail }) {
|
|
7
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 flex-col gap-density-2", children: [
|
|
8
|
+
detail.truncated && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-md border border-yellow-300 bg-yellow-50 px-density-3 py-density-2 text-xs text-yellow-800 dark:border-yellow-700 dark:bg-yellow-950 dark:text-yellow-200", children: [
|
|
9
|
+
"Showing a truncated value — the full ",
|
|
10
|
+
valueNoun(detail.type),
|
|
11
|
+
" has ",
|
|
12
|
+
detail.length,
|
|
13
|
+
" ",
|
|
14
|
+
unitNoun(detail.type),
|
|
15
|
+
"."
|
|
16
|
+
] }),
|
|
17
|
+
/* @__PURE__ */ jsxRuntime.jsx(CacheValueBody, { detail })
|
|
18
|
+
] });
|
|
19
|
+
}
|
|
20
|
+
function CacheValueBody({ detail }) {
|
|
21
|
+
switch (detail.type) {
|
|
22
|
+
case "string":
|
|
23
|
+
return /* @__PURE__ */ jsxRuntime.jsx(CodeBlock.CodeBlock, { language: looksLikeJson(detail.value ?? "") ? "json" : "text", source: detail.value ?? "" });
|
|
24
|
+
case "hash":
|
|
25
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
26
|
+
KeyValueList.KeyValueList,
|
|
27
|
+
{
|
|
28
|
+
items: Object.entries(detail.fields ?? {}).map(([field, value]) => ({
|
|
29
|
+
key: field,
|
|
30
|
+
label: field,
|
|
31
|
+
value: /* @__PURE__ */ jsxRuntime.jsx(ValueCell, { value })
|
|
32
|
+
})),
|
|
33
|
+
emptyMessage: "Empty hash"
|
|
34
|
+
}
|
|
35
|
+
);
|
|
36
|
+
case "list":
|
|
37
|
+
case "set":
|
|
38
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
39
|
+
KeyValueList.KeyValueList,
|
|
40
|
+
{
|
|
41
|
+
items: (detail.items ?? []).map((item, i) => ({
|
|
42
|
+
key: `${i}`,
|
|
43
|
+
label: detail.type === "list" ? `#${i}` : "•",
|
|
44
|
+
value: /* @__PURE__ */ jsxRuntime.jsx(ValueCell, { value: item })
|
|
45
|
+
})),
|
|
46
|
+
emptyMessage: detail.type === "list" ? "Empty list" : "Empty set"
|
|
47
|
+
}
|
|
48
|
+
);
|
|
49
|
+
case "zset":
|
|
50
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
51
|
+
KeyValueList.KeyValueList,
|
|
52
|
+
{
|
|
53
|
+
items: (detail.members ?? []).map((m, i) => ({
|
|
54
|
+
key: `${i}`,
|
|
55
|
+
label: String(m.score),
|
|
56
|
+
value: /* @__PURE__ */ jsxRuntime.jsx(ValueCell, { value: m.member })
|
|
57
|
+
})),
|
|
58
|
+
emptyMessage: "Empty sorted set"
|
|
59
|
+
}
|
|
60
|
+
);
|
|
61
|
+
default:
|
|
62
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-sm text-muted-foreground", children: [
|
|
63
|
+
"Values of type ",
|
|
64
|
+
/* @__PURE__ */ jsxRuntime.jsx("code", { children: detail.type }),
|
|
65
|
+
" are not rendered (",
|
|
66
|
+
detail.length,
|
|
67
|
+
" entries)."
|
|
68
|
+
] });
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function ValueCell({ value }) {
|
|
72
|
+
if (looksLikeJson(value)) return /* @__PURE__ */ jsxRuntime.jsx(CodeBlock.CodeBlock, { language: "json", source: value });
|
|
73
|
+
return /* @__PURE__ */ jsxRuntime.jsx("span", { className: "break-all font-mono text-xs", children: value });
|
|
74
|
+
}
|
|
75
|
+
function looksLikeJson(value) {
|
|
76
|
+
const trimmed = value.trim();
|
|
77
|
+
return trimmed.startsWith("{") && trimmed.endsWith("}") || trimmed.startsWith("[") && trimmed.endsWith("]");
|
|
78
|
+
}
|
|
79
|
+
function valueNoun(type) {
|
|
80
|
+
return type === "string" ? "value" : type;
|
|
81
|
+
}
|
|
82
|
+
function unitNoun(type) {
|
|
83
|
+
return type === "string" ? "bytes" : "entries";
|
|
84
|
+
}
|
|
85
|
+
exports.CacheValue = CacheValue;
|
|
86
|
+
//# sourceMappingURL=CacheValue.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CacheValue.cjs","sources":["../../../src/data/cache-browser/CacheValue.tsx"],"sourcesContent":["import { CodeBlock } from \"../CodeBlock\";\nimport { KeyValueList } from \"../KeyValueList\";\nimport type { CacheKeyDetail } from \"./types\";\n\n/**\n * Default type-aware value rendering: JSON-looking strings get the JSON tree,\n * other strings a plain code block, hashes a key/value list, lists/sets an\n * indexed list and zsets a member/score list. Hosts override per key family\n * via CacheNodeAdapter.renderDetail.\n */\nexport function CacheValue({ detail }: { detail: CacheKeyDetail }) {\n return (\n <div className=\"flex min-w-0 flex-col gap-density-2\">\n {detail.truncated && (\n <div className=\"rounded-md border border-yellow-300 bg-yellow-50 px-density-3 py-density-2 text-xs text-yellow-800 dark:border-yellow-700 dark:bg-yellow-950 dark:text-yellow-200\">\n Showing a truncated value — the full {valueNoun(detail.type)} has {detail.length}{\" \"}\n {unitNoun(detail.type)}.\n </div>\n )}\n <CacheValueBody detail={detail} />\n </div>\n );\n}\n\nfunction CacheValueBody({ detail }: { detail: CacheKeyDetail }) {\n switch (detail.type) {\n case \"string\":\n return <CodeBlock language={looksLikeJson(detail.value ?? \"\") ? \"json\" : \"text\"} source={detail.value ?? \"\"} />;\n case \"hash\":\n return (\n <KeyValueList\n items={Object.entries(detail.fields ?? {}).map(([field, value]) => ({\n key: field,\n label: field,\n value: <ValueCell value={value} />,\n }))}\n emptyMessage=\"Empty hash\"\n />\n );\n case \"list\":\n case \"set\":\n return (\n <KeyValueList\n items={(detail.items ?? []).map((item, i) => ({\n key: `${i}`,\n label: detail.type === \"list\" ? `#${i}` : \"•\",\n value: <ValueCell value={item} />,\n }))}\n emptyMessage={detail.type === \"list\" ? \"Empty list\" : \"Empty set\"}\n />\n );\n case \"zset\":\n return (\n <KeyValueList\n items={(detail.members ?? []).map((m, i) => ({\n key: `${i}`,\n label: String(m.score),\n value: <ValueCell value={m.member} />,\n }))}\n emptyMessage=\"Empty sorted set\"\n />\n );\n default:\n return (\n <div className=\"text-sm text-muted-foreground\">\n Values of type <code>{detail.type}</code> are not rendered ({detail.length} entries).\n </div>\n );\n }\n}\n\n/** Renders one collection entry, expanding embedded JSON. */\nfunction ValueCell({ value }: { value: string }) {\n if (looksLikeJson(value)) return <CodeBlock language=\"json\" source={value} />;\n return <span className=\"break-all font-mono text-xs\">{value}</span>;\n}\n\nfunction looksLikeJson(value: string): boolean {\n const trimmed = value.trim();\n return (\n (trimmed.startsWith(\"{\") && trimmed.endsWith(\"}\")) ||\n (trimmed.startsWith(\"[\") && trimmed.endsWith(\"]\"))\n );\n}\n\nfunction valueNoun(type: string): string {\n return type === \"string\" ? \"value\" : type;\n}\n\nfunction unitNoun(type: string): string {\n return type === \"string\" ? \"bytes\" : \"entries\";\n}\n"],"names":["jsxs","jsx","CodeBlock","KeyValueList"],"mappings":";;;;;AAUO,SAAS,WAAW,EAAE,UAAsC;AACjE,SACEA,2BAAAA,KAAC,OAAA,EAAI,WAAU,uCACZ,UAAA;AAAA,IAAA,OAAO,aACNA,gCAAC,OAAA,EAAI,WAAU,qKAAoK,UAAA;AAAA,MAAA;AAAA,MAC3I,UAAU,OAAO,IAAI;AAAA,MAAE;AAAA,MAAM,OAAO;AAAA,MAAQ;AAAA,MACjF,SAAS,OAAO,IAAI;AAAA,MAAE;AAAA,IAAA,GACzB;AAAA,IAEFC,+BAAC,kBAAe,OAAA,CAAgB;AAAA,EAAA,GAClC;AAEJ;AAEA,SAAS,eAAe,EAAE,UAAsC;AAC9D,UAAQ,OAAO,MAAA;AAAA,IACb,KAAK;AACH,aAAOA,2BAAAA,IAACC,UAAAA,WAAA,EAAU,UAAU,cAAc,OAAO,SAAS,EAAE,IAAI,SAAS,QAAQ,QAAQ,OAAO,SAAS,IAAI;AAAA,IAC/G,KAAK;AACH,aACED,2BAAAA;AAAAA,QAACE,aAAAA;AAAAA,QAAA;AAAA,UACC,OAAO,OAAO,QAAQ,OAAO,UAAU,EAAE,EAAE,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO;AAAA,YAClE,KAAK;AAAA,YACL,OAAO;AAAA,YACP,OAAOF,2BAAAA,IAAC,WAAA,EAAU,MAAA,CAAc;AAAA,UAAA,EAChC;AAAA,UACF,cAAa;AAAA,QAAA;AAAA,MAAA;AAAA,IAGnB,KAAK;AAAA,IACL,KAAK;AACH,aACEA,2BAAAA;AAAAA,QAACE,aAAAA;AAAAA,QAAA;AAAA,UACC,QAAQ,OAAO,SAAS,CAAA,GAAI,IAAI,CAAC,MAAM,OAAO;AAAA,YAC5C,KAAK,GAAG,CAAC;AAAA,YACT,OAAO,OAAO,SAAS,SAAS,IAAI,CAAC,KAAK;AAAA,YAC1C,OAAOF,2BAAAA,IAAC,WAAA,EAAU,OAAO,KAAA,CAAM;AAAA,UAAA,EAC/B;AAAA,UACF,cAAc,OAAO,SAAS,SAAS,eAAe;AAAA,QAAA;AAAA,MAAA;AAAA,IAG5D,KAAK;AACH,aACEA,2BAAAA;AAAAA,QAACE,aAAAA;AAAAA,QAAA;AAAA,UACC,QAAQ,OAAO,WAAW,CAAA,GAAI,IAAI,CAAC,GAAG,OAAO;AAAA,YAC3C,KAAK,GAAG,CAAC;AAAA,YACT,OAAO,OAAO,EAAE,KAAK;AAAA,YACrB,OAAOF,2BAAAA,IAAC,WAAA,EAAU,OAAO,EAAE,OAAA,CAAQ;AAAA,UAAA,EACnC;AAAA,UACF,cAAa;AAAA,QAAA;AAAA,MAAA;AAAA,IAGnB;AACE,aACED,2BAAAA,KAAC,OAAA,EAAI,WAAU,iCAAgC,UAAA;AAAA,QAAA;AAAA,QAC9BC,2BAAAA,IAAC,QAAA,EAAM,UAAA,OAAO,KAAA,CAAK;AAAA,QAAO;AAAA,QAAoB,OAAO;AAAA,QAAO;AAAA,MAAA,GAC7E;AAAA,EAAA;AAGR;AAGA,SAAS,UAAU,EAAE,SAA4B;AAC/C,MAAI,cAAc,KAAK,EAAG,uCAAQC,UAAAA,WAAA,EAAU,UAAS,QAAO,QAAQ,OAAO;AAC3E,SAAOD,2BAAAA,IAAC,QAAA,EAAK,WAAU,+BAA+B,UAAA,OAAM;AAC9D;AAEA,SAAS,cAAc,OAAwB;AAC7C,QAAM,UAAU,MAAM,KAAA;AACtB,SACG,QAAQ,WAAW,GAAG,KAAK,QAAQ,SAAS,GAAG,KAC/C,QAAQ,WAAW,GAAG,KAAK,QAAQ,SAAS,GAAG;AAEpD;AAEA,SAAS,UAAU,MAAsB;AACvC,SAAO,SAAS,WAAW,UAAU;AACvC;AAEA,SAAS,SAAS,MAAsB;AACtC,SAAO,SAAS,WAAW,UAAU;AACvC;;"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { CacheKeyDetail } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Default type-aware value rendering: JSON-looking strings get the JSON tree,
|
|
4
|
+
* other strings a plain code block, hashes a key/value list, lists/sets an
|
|
5
|
+
* indexed list and zsets a member/score list. Hosts override per key family
|
|
6
|
+
* via CacheNodeAdapter.renderDetail.
|
|
7
|
+
*/
|
|
8
|
+
export declare function CacheValue({ detail }: {
|
|
9
|
+
detail: CacheKeyDetail;
|
|
10
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
//# sourceMappingURL=CacheValue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CacheValue.d.ts","sourceRoot":"","sources":["../../../src/data/cache-browser/CacheValue.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,cAAc,CAAA;CAAE,2CAYhE"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import { CodeBlock } from "../CodeBlock.js";
|
|
3
|
+
import { KeyValueList } from "../KeyValueList.js";
|
|
4
|
+
function CacheValue({ detail }) {
|
|
5
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-col gap-density-2", children: [
|
|
6
|
+
detail.truncated && /* @__PURE__ */ jsxs("div", { className: "rounded-md border border-yellow-300 bg-yellow-50 px-density-3 py-density-2 text-xs text-yellow-800 dark:border-yellow-700 dark:bg-yellow-950 dark:text-yellow-200", children: [
|
|
7
|
+
"Showing a truncated value — the full ",
|
|
8
|
+
valueNoun(detail.type),
|
|
9
|
+
" has ",
|
|
10
|
+
detail.length,
|
|
11
|
+
" ",
|
|
12
|
+
unitNoun(detail.type),
|
|
13
|
+
"."
|
|
14
|
+
] }),
|
|
15
|
+
/* @__PURE__ */ jsx(CacheValueBody, { detail })
|
|
16
|
+
] });
|
|
17
|
+
}
|
|
18
|
+
function CacheValueBody({ detail }) {
|
|
19
|
+
switch (detail.type) {
|
|
20
|
+
case "string":
|
|
21
|
+
return /* @__PURE__ */ jsx(CodeBlock, { language: looksLikeJson(detail.value ?? "") ? "json" : "text", source: detail.value ?? "" });
|
|
22
|
+
case "hash":
|
|
23
|
+
return /* @__PURE__ */ jsx(
|
|
24
|
+
KeyValueList,
|
|
25
|
+
{
|
|
26
|
+
items: Object.entries(detail.fields ?? {}).map(([field, value]) => ({
|
|
27
|
+
key: field,
|
|
28
|
+
label: field,
|
|
29
|
+
value: /* @__PURE__ */ jsx(ValueCell, { value })
|
|
30
|
+
})),
|
|
31
|
+
emptyMessage: "Empty hash"
|
|
32
|
+
}
|
|
33
|
+
);
|
|
34
|
+
case "list":
|
|
35
|
+
case "set":
|
|
36
|
+
return /* @__PURE__ */ jsx(
|
|
37
|
+
KeyValueList,
|
|
38
|
+
{
|
|
39
|
+
items: (detail.items ?? []).map((item, i) => ({
|
|
40
|
+
key: `${i}`,
|
|
41
|
+
label: detail.type === "list" ? `#${i}` : "•",
|
|
42
|
+
value: /* @__PURE__ */ jsx(ValueCell, { value: item })
|
|
43
|
+
})),
|
|
44
|
+
emptyMessage: detail.type === "list" ? "Empty list" : "Empty set"
|
|
45
|
+
}
|
|
46
|
+
);
|
|
47
|
+
case "zset":
|
|
48
|
+
return /* @__PURE__ */ jsx(
|
|
49
|
+
KeyValueList,
|
|
50
|
+
{
|
|
51
|
+
items: (detail.members ?? []).map((m, i) => ({
|
|
52
|
+
key: `${i}`,
|
|
53
|
+
label: String(m.score),
|
|
54
|
+
value: /* @__PURE__ */ jsx(ValueCell, { value: m.member })
|
|
55
|
+
})),
|
|
56
|
+
emptyMessage: "Empty sorted set"
|
|
57
|
+
}
|
|
58
|
+
);
|
|
59
|
+
default:
|
|
60
|
+
return /* @__PURE__ */ jsxs("div", { className: "text-sm text-muted-foreground", children: [
|
|
61
|
+
"Values of type ",
|
|
62
|
+
/* @__PURE__ */ jsx("code", { children: detail.type }),
|
|
63
|
+
" are not rendered (",
|
|
64
|
+
detail.length,
|
|
65
|
+
" entries)."
|
|
66
|
+
] });
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
function ValueCell({ value }) {
|
|
70
|
+
if (looksLikeJson(value)) return /* @__PURE__ */ jsx(CodeBlock, { language: "json", source: value });
|
|
71
|
+
return /* @__PURE__ */ jsx("span", { className: "break-all font-mono text-xs", children: value });
|
|
72
|
+
}
|
|
73
|
+
function looksLikeJson(value) {
|
|
74
|
+
const trimmed = value.trim();
|
|
75
|
+
return trimmed.startsWith("{") && trimmed.endsWith("}") || trimmed.startsWith("[") && trimmed.endsWith("]");
|
|
76
|
+
}
|
|
77
|
+
function valueNoun(type) {
|
|
78
|
+
return type === "string" ? "value" : type;
|
|
79
|
+
}
|
|
80
|
+
function unitNoun(type) {
|
|
81
|
+
return type === "string" ? "bytes" : "entries";
|
|
82
|
+
}
|
|
83
|
+
export {
|
|
84
|
+
CacheValue
|
|
85
|
+
};
|
|
86
|
+
//# sourceMappingURL=CacheValue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CacheValue.js","sources":["../../../src/data/cache-browser/CacheValue.tsx"],"sourcesContent":["import { CodeBlock } from \"../CodeBlock\";\nimport { KeyValueList } from \"../KeyValueList\";\nimport type { CacheKeyDetail } from \"./types\";\n\n/**\n * Default type-aware value rendering: JSON-looking strings get the JSON tree,\n * other strings a plain code block, hashes a key/value list, lists/sets an\n * indexed list and zsets a member/score list. Hosts override per key family\n * via CacheNodeAdapter.renderDetail.\n */\nexport function CacheValue({ detail }: { detail: CacheKeyDetail }) {\n return (\n <div className=\"flex min-w-0 flex-col gap-density-2\">\n {detail.truncated && (\n <div className=\"rounded-md border border-yellow-300 bg-yellow-50 px-density-3 py-density-2 text-xs text-yellow-800 dark:border-yellow-700 dark:bg-yellow-950 dark:text-yellow-200\">\n Showing a truncated value — the full {valueNoun(detail.type)} has {detail.length}{\" \"}\n {unitNoun(detail.type)}.\n </div>\n )}\n <CacheValueBody detail={detail} />\n </div>\n );\n}\n\nfunction CacheValueBody({ detail }: { detail: CacheKeyDetail }) {\n switch (detail.type) {\n case \"string\":\n return <CodeBlock language={looksLikeJson(detail.value ?? \"\") ? \"json\" : \"text\"} source={detail.value ?? \"\"} />;\n case \"hash\":\n return (\n <KeyValueList\n items={Object.entries(detail.fields ?? {}).map(([field, value]) => ({\n key: field,\n label: field,\n value: <ValueCell value={value} />,\n }))}\n emptyMessage=\"Empty hash\"\n />\n );\n case \"list\":\n case \"set\":\n return (\n <KeyValueList\n items={(detail.items ?? []).map((item, i) => ({\n key: `${i}`,\n label: detail.type === \"list\" ? `#${i}` : \"•\",\n value: <ValueCell value={item} />,\n }))}\n emptyMessage={detail.type === \"list\" ? \"Empty list\" : \"Empty set\"}\n />\n );\n case \"zset\":\n return (\n <KeyValueList\n items={(detail.members ?? []).map((m, i) => ({\n key: `${i}`,\n label: String(m.score),\n value: <ValueCell value={m.member} />,\n }))}\n emptyMessage=\"Empty sorted set\"\n />\n );\n default:\n return (\n <div className=\"text-sm text-muted-foreground\">\n Values of type <code>{detail.type}</code> are not rendered ({detail.length} entries).\n </div>\n );\n }\n}\n\n/** Renders one collection entry, expanding embedded JSON. */\nfunction ValueCell({ value }: { value: string }) {\n if (looksLikeJson(value)) return <CodeBlock language=\"json\" source={value} />;\n return <span className=\"break-all font-mono text-xs\">{value}</span>;\n}\n\nfunction looksLikeJson(value: string): boolean {\n const trimmed = value.trim();\n return (\n (trimmed.startsWith(\"{\") && trimmed.endsWith(\"}\")) ||\n (trimmed.startsWith(\"[\") && trimmed.endsWith(\"]\"))\n );\n}\n\nfunction valueNoun(type: string): string {\n return type === \"string\" ? \"value\" : type;\n}\n\nfunction unitNoun(type: string): string {\n return type === \"string\" ? \"bytes\" : \"entries\";\n}\n"],"names":[],"mappings":";;;AAUO,SAAS,WAAW,EAAE,UAAsC;AACjE,SACE,qBAAC,OAAA,EAAI,WAAU,uCACZ,UAAA;AAAA,IAAA,OAAO,aACN,qBAAC,OAAA,EAAI,WAAU,qKAAoK,UAAA;AAAA,MAAA;AAAA,MAC3I,UAAU,OAAO,IAAI;AAAA,MAAE;AAAA,MAAM,OAAO;AAAA,MAAQ;AAAA,MACjF,SAAS,OAAO,IAAI;AAAA,MAAE;AAAA,IAAA,GACzB;AAAA,IAEF,oBAAC,kBAAe,OAAA,CAAgB;AAAA,EAAA,GAClC;AAEJ;AAEA,SAAS,eAAe,EAAE,UAAsC;AAC9D,UAAQ,OAAO,MAAA;AAAA,IACb,KAAK;AACH,aAAO,oBAAC,WAAA,EAAU,UAAU,cAAc,OAAO,SAAS,EAAE,IAAI,SAAS,QAAQ,QAAQ,OAAO,SAAS,IAAI;AAAA,IAC/G,KAAK;AACH,aACE;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,OAAO,OAAO,QAAQ,OAAO,UAAU,EAAE,EAAE,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO;AAAA,YAClE,KAAK;AAAA,YACL,OAAO;AAAA,YACP,OAAO,oBAAC,WAAA,EAAU,MAAA,CAAc;AAAA,UAAA,EAChC;AAAA,UACF,cAAa;AAAA,QAAA;AAAA,MAAA;AAAA,IAGnB,KAAK;AAAA,IACL,KAAK;AACH,aACE;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,QAAQ,OAAO,SAAS,CAAA,GAAI,IAAI,CAAC,MAAM,OAAO;AAAA,YAC5C,KAAK,GAAG,CAAC;AAAA,YACT,OAAO,OAAO,SAAS,SAAS,IAAI,CAAC,KAAK;AAAA,YAC1C,OAAO,oBAAC,WAAA,EAAU,OAAO,KAAA,CAAM;AAAA,UAAA,EAC/B;AAAA,UACF,cAAc,OAAO,SAAS,SAAS,eAAe;AAAA,QAAA;AAAA,MAAA;AAAA,IAG5D,KAAK;AACH,aACE;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,QAAQ,OAAO,WAAW,CAAA,GAAI,IAAI,CAAC,GAAG,OAAO;AAAA,YAC3C,KAAK,GAAG,CAAC;AAAA,YACT,OAAO,OAAO,EAAE,KAAK;AAAA,YACrB,OAAO,oBAAC,WAAA,EAAU,OAAO,EAAE,OAAA,CAAQ;AAAA,UAAA,EACnC;AAAA,UACF,cAAa;AAAA,QAAA;AAAA,MAAA;AAAA,IAGnB;AACE,aACE,qBAAC,OAAA,EAAI,WAAU,iCAAgC,UAAA;AAAA,QAAA;AAAA,QAC9B,oBAAC,QAAA,EAAM,UAAA,OAAO,KAAA,CAAK;AAAA,QAAO;AAAA,QAAoB,OAAO;AAAA,QAAO;AAAA,MAAA,GAC7E;AAAA,EAAA;AAGR;AAGA,SAAS,UAAU,EAAE,SAA4B;AAC/C,MAAI,cAAc,KAAK,EAAG,4BAAQ,WAAA,EAAU,UAAS,QAAO,QAAQ,OAAO;AAC3E,SAAO,oBAAC,QAAA,EAAK,WAAU,+BAA+B,UAAA,OAAM;AAC9D;AAEA,SAAS,cAAc,OAAwB;AAC7C,QAAM,UAAU,MAAM,KAAA;AACtB,SACG,QAAQ,WAAW,GAAG,KAAK,QAAQ,SAAS,GAAG,KAC/C,QAAQ,WAAW,GAAG,KAAK,QAAQ,SAAS,GAAG;AAEpD;AAEA,SAAS,UAAU,MAAsB;AACvC,SAAO,SAAS,WAAW,UAAU;AACvC;AAEA,SAAS,SAAS,MAAsB;AACtC,SAAO,SAAS,WAAW,UAAU;AACvC;"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
4
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
5
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
6
|
+
class CacheAdapterRegistry {
|
|
7
|
+
constructor(adapters = []) {
|
|
8
|
+
__publicField(this, "adapters");
|
|
9
|
+
this.adapters = adapters;
|
|
10
|
+
}
|
|
11
|
+
firstWith(node, detail, has) {
|
|
12
|
+
for (const a of this.adapters) {
|
|
13
|
+
if (has(a) && a.match(node, detail)) return a;
|
|
14
|
+
}
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
/** Adapter whose `renderDetail` should drive the value body, or null for the default. */
|
|
18
|
+
resolveDetail(node, detail) {
|
|
19
|
+
return this.firstWith(node, detail, (a) => !!a.renderDetail);
|
|
20
|
+
}
|
|
21
|
+
resolveRowIcon(node, detail) {
|
|
22
|
+
return this.firstWith(node, detail, (a) => !!a.renderRowIcon);
|
|
23
|
+
}
|
|
24
|
+
/** Merge `detailTabs` from every matching adapter, de-duplicated by tab id. */
|
|
25
|
+
resolveTabs(ctx) {
|
|
26
|
+
const seen = /* @__PURE__ */ new Set();
|
|
27
|
+
const tabs = [];
|
|
28
|
+
for (const a of this.adapters) {
|
|
29
|
+
if (!a.detailTabs || !a.match(ctx.node, ctx.detail)) continue;
|
|
30
|
+
for (const tab of a.detailTabs(ctx)) {
|
|
31
|
+
if (seen.has(tab.id)) continue;
|
|
32
|
+
seen.add(tab.id);
|
|
33
|
+
tabs.push(tab);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return tabs;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function createCacheRegistry(adapters = []) {
|
|
40
|
+
return new CacheAdapterRegistry(adapters);
|
|
41
|
+
}
|
|
42
|
+
function prefixAdapter(id, prefix, renderDetail) {
|
|
43
|
+
return {
|
|
44
|
+
id,
|
|
45
|
+
match: (node) => !!node.key && node.key.startsWith(prefix),
|
|
46
|
+
renderDetail
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
exports.CacheAdapterRegistry = CacheAdapterRegistry;
|
|
50
|
+
exports.createCacheRegistry = createCacheRegistry;
|
|
51
|
+
exports.prefixAdapter = prefixAdapter;
|
|
52
|
+
//# sourceMappingURL=adapter.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.cjs","sources":["../../../src/data/cache-browser/adapter.ts"],"sourcesContent":["// Node adapters let a host plug domain-specific value rendering into the\n// cache browser without forking it — e.g. render `schema:`-prefixed keys with\n// a schema viewer or `task-snapshot:` keys with a task panel. An adapter\n// claims nodes via `match` (typically by key prefix or value kind) and\n// contributes detail rendering. The registry resolves the first matching\n// adapter; nodes with no match fall back to the built-in type-aware value\n// rendering. Mirrors the test-runner TestNodeAdapter contract.\n\nimport type { ReactNode } from \"react\";\nimport type { CacheClient } from \"./api\";\nimport type { CacheKeyDetail, CacheTreeNode } from \"./types\";\n\nexport type CacheAdapterContext = {\n node: CacheTreeNode;\n /** Loaded key detail; null while loading or for prefix groups. */\n detail: CacheKeyDetail | null;\n client: CacheClient;\n};\n\nexport type CacheDetailTab = {\n id: string;\n label: string;\n render: () => ReactNode;\n};\n\nexport type CacheNodeAdapter = {\n /** Stable identifier, used as a React key and for debugging. */\n id: string;\n /** Claim the node. The first registered adapter to return true wins per surface. */\n match: (node: CacheTreeNode, detail: CacheKeyDetail | null) => boolean;\n /** Primary value body for the key, replacing the default type-aware rendering. */\n renderDetail?: (c: CacheAdapterContext) => ReactNode;\n /** Extra detail tabs, merged (in registration order) across all matching adapters. */\n detailTabs?: (c: CacheAdapterContext) => CacheDetailTab[];\n /** Replace the leading icon on the node's tree row. */\n renderRowIcon?: (c: CacheAdapterContext) => ReactNode;\n};\n\n/**\n * Ordered set of node adapters. First match wins per surface; `detailTabs`\n * merge across every matching adapter so independent adapters can each\n * contribute a tab.\n */\nexport class CacheAdapterRegistry {\n readonly adapters: CacheNodeAdapter[];\n\n constructor(adapters: CacheNodeAdapter[] = []) {\n this.adapters = adapters;\n }\n\n private firstWith(\n node: CacheTreeNode,\n detail: CacheKeyDetail | null,\n has: (a: CacheNodeAdapter) => boolean,\n ): CacheNodeAdapter | null {\n for (const a of this.adapters) {\n if (has(a) && a.match(node, detail)) return a;\n }\n return null;\n }\n\n /** Adapter whose `renderDetail` should drive the value body, or null for the default. */\n resolveDetail(node: CacheTreeNode, detail: CacheKeyDetail | null): CacheNodeAdapter | null {\n return this.firstWith(node, detail, (a) => !!a.renderDetail);\n }\n\n resolveRowIcon(node: CacheTreeNode, detail: CacheKeyDetail | null): CacheNodeAdapter | null {\n return this.firstWith(node, detail, (a) => !!a.renderRowIcon);\n }\n\n /** Merge `detailTabs` from every matching adapter, de-duplicated by tab id. */\n resolveTabs(ctx: CacheAdapterContext): CacheDetailTab[] {\n const seen = new Set<string>();\n const tabs: CacheDetailTab[] = [];\n for (const a of this.adapters) {\n if (!a.detailTabs || !a.match(ctx.node, ctx.detail)) continue;\n for (const tab of a.detailTabs(ctx)) {\n if (seen.has(tab.id)) continue;\n seen.add(tab.id);\n tabs.push(tab);\n }\n }\n return tabs;\n }\n}\n\nexport function createCacheRegistry(adapters: CacheNodeAdapter[] = []): CacheAdapterRegistry {\n return new CacheAdapterRegistry(adapters);\n}\n\n/**\n * Convenience adapter matching leaf keys by logical prefix, e.g.\n * `prefixAdapter(\"schemas\", \"schema:\", (c) => <SchemaView .../>)`.\n */\nexport function prefixAdapter(\n id: string,\n prefix: string,\n renderDetail: (c: CacheAdapterContext) => ReactNode,\n): CacheNodeAdapter {\n return {\n id,\n match: (node) => !!node.key && node.key.startsWith(prefix),\n renderDetail,\n };\n}\n"],"names":[],"mappings":";;;;;AA2CO,MAAM,qBAAqB;AAAA,EAGhC,YAAY,WAA+B,IAAI;AAFtC;AAGP,SAAK,WAAW;AAAA,EAClB;AAAA,EAEQ,UACN,MACA,QACA,KACyB;AACzB,eAAW,KAAK,KAAK,UAAU;AAC7B,UAAI,IAAI,CAAC,KAAK,EAAE,MAAM,MAAM,MAAM,EAAG,QAAO;AAAA,IAC9C;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,cAAc,MAAqB,QAAwD;AACzF,WAAO,KAAK,UAAU,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,YAAY;AAAA,EAC7D;AAAA,EAEA,eAAe,MAAqB,QAAwD;AAC1F,WAAO,KAAK,UAAU,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,aAAa;AAAA,EAC9D;AAAA;AAAA,EAGA,YAAY,KAA4C;AACtD,UAAM,2BAAW,IAAA;AACjB,UAAM,OAAyB,CAAA;AAC/B,eAAW,KAAK,KAAK,UAAU;AAC7B,UAAI,CAAC,EAAE,cAAc,CAAC,EAAE,MAAM,IAAI,MAAM,IAAI,MAAM,EAAG;AACrD,iBAAW,OAAO,EAAE,WAAW,GAAG,GAAG;AACnC,YAAI,KAAK,IAAI,IAAI,EAAE,EAAG;AACtB,aAAK,IAAI,IAAI,EAAE;AACf,aAAK,KAAK,GAAG;AAAA,MACf;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;AAEO,SAAS,oBAAoB,WAA+B,IAA0B;AAC3F,SAAO,IAAI,qBAAqB,QAAQ;AAC1C;AAMO,SAAS,cACd,IACA,QACA,cACkB;AAClB,SAAO;AAAA,IACL;AAAA,IACA,OAAO,CAAC,SAAS,CAAC,CAAC,KAAK,OAAO,KAAK,IAAI,WAAW,MAAM;AAAA,IACzD;AAAA,EAAA;AAEJ;;;;"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { CacheClient } from './api';
|
|
3
|
+
import { CacheKeyDetail, CacheTreeNode } from './types';
|
|
4
|
+
export type CacheAdapterContext = {
|
|
5
|
+
node: CacheTreeNode;
|
|
6
|
+
/** Loaded key detail; null while loading or for prefix groups. */
|
|
7
|
+
detail: CacheKeyDetail | null;
|
|
8
|
+
client: CacheClient;
|
|
9
|
+
};
|
|
10
|
+
export type CacheDetailTab = {
|
|
11
|
+
id: string;
|
|
12
|
+
label: string;
|
|
13
|
+
render: () => ReactNode;
|
|
14
|
+
};
|
|
15
|
+
export type CacheNodeAdapter = {
|
|
16
|
+
/** Stable identifier, used as a React key and for debugging. */
|
|
17
|
+
id: string;
|
|
18
|
+
/** Claim the node. The first registered adapter to return true wins per surface. */
|
|
19
|
+
match: (node: CacheTreeNode, detail: CacheKeyDetail | null) => boolean;
|
|
20
|
+
/** Primary value body for the key, replacing the default type-aware rendering. */
|
|
21
|
+
renderDetail?: (c: CacheAdapterContext) => ReactNode;
|
|
22
|
+
/** Extra detail tabs, merged (in registration order) across all matching adapters. */
|
|
23
|
+
detailTabs?: (c: CacheAdapterContext) => CacheDetailTab[];
|
|
24
|
+
/** Replace the leading icon on the node's tree row. */
|
|
25
|
+
renderRowIcon?: (c: CacheAdapterContext) => ReactNode;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Ordered set of node adapters. First match wins per surface; `detailTabs`
|
|
29
|
+
* merge across every matching adapter so independent adapters can each
|
|
30
|
+
* contribute a tab.
|
|
31
|
+
*/
|
|
32
|
+
export declare class CacheAdapterRegistry {
|
|
33
|
+
readonly adapters: CacheNodeAdapter[];
|
|
34
|
+
constructor(adapters?: CacheNodeAdapter[]);
|
|
35
|
+
private firstWith;
|
|
36
|
+
/** Adapter whose `renderDetail` should drive the value body, or null for the default. */
|
|
37
|
+
resolveDetail(node: CacheTreeNode, detail: CacheKeyDetail | null): CacheNodeAdapter | null;
|
|
38
|
+
resolveRowIcon(node: CacheTreeNode, detail: CacheKeyDetail | null): CacheNodeAdapter | null;
|
|
39
|
+
/** Merge `detailTabs` from every matching adapter, de-duplicated by tab id. */
|
|
40
|
+
resolveTabs(ctx: CacheAdapterContext): CacheDetailTab[];
|
|
41
|
+
}
|
|
42
|
+
export declare function createCacheRegistry(adapters?: CacheNodeAdapter[]): CacheAdapterRegistry;
|
|
43
|
+
/**
|
|
44
|
+
* Convenience adapter matching leaf keys by logical prefix, e.g.
|
|
45
|
+
* `prefixAdapter("schemas", "schema:", (c) => <SchemaView .../>)`.
|
|
46
|
+
*/
|
|
47
|
+
export declare function prefixAdapter(id: string, prefix: string, renderDetail: (c: CacheAdapterContext) => ReactNode): CacheNodeAdapter;
|
|
48
|
+
//# sourceMappingURL=adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/data/cache-browser/adapter.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACzC,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7D,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,aAAa,CAAC;IACpB,kEAAkE;IAClE,MAAM,EAAE,cAAc,GAAG,IAAI,CAAC;IAC9B,MAAM,EAAE,WAAW,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,SAAS,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,gEAAgE;IAChE,EAAE,EAAE,MAAM,CAAC;IACX,oFAAoF;IACpF,KAAK,EAAE,CAAC,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,KAAK,OAAO,CAAC;IACvE,kFAAkF;IAClF,YAAY,CAAC,EAAE,CAAC,CAAC,EAAE,mBAAmB,KAAK,SAAS,CAAC;IACrD,sFAAsF;IACtF,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,mBAAmB,KAAK,cAAc,EAAE,CAAC;IAC1D,uDAAuD;IACvD,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,mBAAmB,KAAK,SAAS,CAAC;CACvD,CAAC;AAEF;;;;GAIG;AACH,qBAAa,oBAAoB;IAC/B,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,EAAE,CAAC;gBAE1B,QAAQ,GAAE,gBAAgB,EAAO;IAI7C,OAAO,CAAC,SAAS;IAWjB,yFAAyF;IACzF,aAAa,CAAC,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,GAAG,gBAAgB,GAAG,IAAI;IAI1F,cAAc,CAAC,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,GAAG,gBAAgB,GAAG,IAAI;IAI3F,+EAA+E;IAC/E,WAAW,CAAC,GAAG,EAAE,mBAAmB,GAAG,cAAc,EAAE;CAaxD;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,GAAE,gBAAgB,EAAO,GAAG,oBAAoB,CAE3F;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,CAAC,CAAC,EAAE,mBAAmB,KAAK,SAAS,GAClD,gBAAgB,CAMlB"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
3
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
4
|
+
class CacheAdapterRegistry {
|
|
5
|
+
constructor(adapters = []) {
|
|
6
|
+
__publicField(this, "adapters");
|
|
7
|
+
this.adapters = adapters;
|
|
8
|
+
}
|
|
9
|
+
firstWith(node, detail, has) {
|
|
10
|
+
for (const a of this.adapters) {
|
|
11
|
+
if (has(a) && a.match(node, detail)) return a;
|
|
12
|
+
}
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
/** Adapter whose `renderDetail` should drive the value body, or null for the default. */
|
|
16
|
+
resolveDetail(node, detail) {
|
|
17
|
+
return this.firstWith(node, detail, (a) => !!a.renderDetail);
|
|
18
|
+
}
|
|
19
|
+
resolveRowIcon(node, detail) {
|
|
20
|
+
return this.firstWith(node, detail, (a) => !!a.renderRowIcon);
|
|
21
|
+
}
|
|
22
|
+
/** Merge `detailTabs` from every matching adapter, de-duplicated by tab id. */
|
|
23
|
+
resolveTabs(ctx) {
|
|
24
|
+
const seen = /* @__PURE__ */ new Set();
|
|
25
|
+
const tabs = [];
|
|
26
|
+
for (const a of this.adapters) {
|
|
27
|
+
if (!a.detailTabs || !a.match(ctx.node, ctx.detail)) continue;
|
|
28
|
+
for (const tab of a.detailTabs(ctx)) {
|
|
29
|
+
if (seen.has(tab.id)) continue;
|
|
30
|
+
seen.add(tab.id);
|
|
31
|
+
tabs.push(tab);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return tabs;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function createCacheRegistry(adapters = []) {
|
|
38
|
+
return new CacheAdapterRegistry(adapters);
|
|
39
|
+
}
|
|
40
|
+
function prefixAdapter(id, prefix, renderDetail) {
|
|
41
|
+
return {
|
|
42
|
+
id,
|
|
43
|
+
match: (node) => !!node.key && node.key.startsWith(prefix),
|
|
44
|
+
renderDetail
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
export {
|
|
48
|
+
CacheAdapterRegistry,
|
|
49
|
+
createCacheRegistry,
|
|
50
|
+
prefixAdapter
|
|
51
|
+
};
|
|
52
|
+
//# sourceMappingURL=adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sources":["../../../src/data/cache-browser/adapter.ts"],"sourcesContent":["// Node adapters let a host plug domain-specific value rendering into the\n// cache browser without forking it — e.g. render `schema:`-prefixed keys with\n// a schema viewer or `task-snapshot:` keys with a task panel. An adapter\n// claims nodes via `match` (typically by key prefix or value kind) and\n// contributes detail rendering. The registry resolves the first matching\n// adapter; nodes with no match fall back to the built-in type-aware value\n// rendering. Mirrors the test-runner TestNodeAdapter contract.\n\nimport type { ReactNode } from \"react\";\nimport type { CacheClient } from \"./api\";\nimport type { CacheKeyDetail, CacheTreeNode } from \"./types\";\n\nexport type CacheAdapterContext = {\n node: CacheTreeNode;\n /** Loaded key detail; null while loading or for prefix groups. */\n detail: CacheKeyDetail | null;\n client: CacheClient;\n};\n\nexport type CacheDetailTab = {\n id: string;\n label: string;\n render: () => ReactNode;\n};\n\nexport type CacheNodeAdapter = {\n /** Stable identifier, used as a React key and for debugging. */\n id: string;\n /** Claim the node. The first registered adapter to return true wins per surface. */\n match: (node: CacheTreeNode, detail: CacheKeyDetail | null) => boolean;\n /** Primary value body for the key, replacing the default type-aware rendering. */\n renderDetail?: (c: CacheAdapterContext) => ReactNode;\n /** Extra detail tabs, merged (in registration order) across all matching adapters. */\n detailTabs?: (c: CacheAdapterContext) => CacheDetailTab[];\n /** Replace the leading icon on the node's tree row. */\n renderRowIcon?: (c: CacheAdapterContext) => ReactNode;\n};\n\n/**\n * Ordered set of node adapters. First match wins per surface; `detailTabs`\n * merge across every matching adapter so independent adapters can each\n * contribute a tab.\n */\nexport class CacheAdapterRegistry {\n readonly adapters: CacheNodeAdapter[];\n\n constructor(adapters: CacheNodeAdapter[] = []) {\n this.adapters = adapters;\n }\n\n private firstWith(\n node: CacheTreeNode,\n detail: CacheKeyDetail | null,\n has: (a: CacheNodeAdapter) => boolean,\n ): CacheNodeAdapter | null {\n for (const a of this.adapters) {\n if (has(a) && a.match(node, detail)) return a;\n }\n return null;\n }\n\n /** Adapter whose `renderDetail` should drive the value body, or null for the default. */\n resolveDetail(node: CacheTreeNode, detail: CacheKeyDetail | null): CacheNodeAdapter | null {\n return this.firstWith(node, detail, (a) => !!a.renderDetail);\n }\n\n resolveRowIcon(node: CacheTreeNode, detail: CacheKeyDetail | null): CacheNodeAdapter | null {\n return this.firstWith(node, detail, (a) => !!a.renderRowIcon);\n }\n\n /** Merge `detailTabs` from every matching adapter, de-duplicated by tab id. */\n resolveTabs(ctx: CacheAdapterContext): CacheDetailTab[] {\n const seen = new Set<string>();\n const tabs: CacheDetailTab[] = [];\n for (const a of this.adapters) {\n if (!a.detailTabs || !a.match(ctx.node, ctx.detail)) continue;\n for (const tab of a.detailTabs(ctx)) {\n if (seen.has(tab.id)) continue;\n seen.add(tab.id);\n tabs.push(tab);\n }\n }\n return tabs;\n }\n}\n\nexport function createCacheRegistry(adapters: CacheNodeAdapter[] = []): CacheAdapterRegistry {\n return new CacheAdapterRegistry(adapters);\n}\n\n/**\n * Convenience adapter matching leaf keys by logical prefix, e.g.\n * `prefixAdapter(\"schemas\", \"schema:\", (c) => <SchemaView .../>)`.\n */\nexport function prefixAdapter(\n id: string,\n prefix: string,\n renderDetail: (c: CacheAdapterContext) => ReactNode,\n): CacheNodeAdapter {\n return {\n id,\n match: (node) => !!node.key && node.key.startsWith(prefix),\n renderDetail,\n };\n}\n"],"names":[],"mappings":";;;AA2CO,MAAM,qBAAqB;AAAA,EAGhC,YAAY,WAA+B,IAAI;AAFtC;AAGP,SAAK,WAAW;AAAA,EAClB;AAAA,EAEQ,UACN,MACA,QACA,KACyB;AACzB,eAAW,KAAK,KAAK,UAAU;AAC7B,UAAI,IAAI,CAAC,KAAK,EAAE,MAAM,MAAM,MAAM,EAAG,QAAO;AAAA,IAC9C;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,cAAc,MAAqB,QAAwD;AACzF,WAAO,KAAK,UAAU,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,YAAY;AAAA,EAC7D;AAAA,EAEA,eAAe,MAAqB,QAAwD;AAC1F,WAAO,KAAK,UAAU,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,aAAa;AAAA,EAC9D;AAAA;AAAA,EAGA,YAAY,KAA4C;AACtD,UAAM,2BAAW,IAAA;AACjB,UAAM,OAAyB,CAAA;AAC/B,eAAW,KAAK,KAAK,UAAU;AAC7B,UAAI,CAAC,EAAE,cAAc,CAAC,EAAE,MAAM,IAAI,MAAM,IAAI,MAAM,EAAG;AACrD,iBAAW,OAAO,EAAE,WAAW,GAAG,GAAG;AACnC,YAAI,KAAK,IAAI,IAAI,EAAE,EAAG;AACtB,aAAK,IAAI,IAAI,EAAE;AACf,aAAK,KAAK,GAAG;AAAA,MACf;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;AAEO,SAAS,oBAAoB,WAA+B,IAA0B;AAC3F,SAAO,IAAI,qBAAqB,QAAQ;AAC1C;AAMO,SAAS,cACd,IACA,QACA,cACkB;AAClB,SAAO;AAAA,IACL;AAAA,IACA,OAAO,CAAC,SAAS,CAAC,CAAC,KAAK,OAAO,KAAK,IAAI,WAAW,MAAM;AAAA,IACzD;AAAA,EAAA;AAEJ;"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const defaultFetcher = async (url, init) => {
|
|
4
|
+
const res = await fetch(url, init);
|
|
5
|
+
if (!res.ok) {
|
|
6
|
+
const body = await res.text();
|
|
7
|
+
throw new Error(`cache request failed: ${res.status} ${body.trim()}`.trim());
|
|
8
|
+
}
|
|
9
|
+
return res.json();
|
|
10
|
+
};
|
|
11
|
+
function createCacheClient({
|
|
12
|
+
baseUrl,
|
|
13
|
+
fetcher = defaultFetcher
|
|
14
|
+
}) {
|
|
15
|
+
const url = (path, params) => {
|
|
16
|
+
const search = new URLSearchParams();
|
|
17
|
+
for (const [name, value] of Object.entries(params)) {
|
|
18
|
+
if (value !== void 0 && value !== "") search.set(name, String(value));
|
|
19
|
+
}
|
|
20
|
+
const qs = search.toString();
|
|
21
|
+
return `${baseUrl}/cache/${path}${qs ? `?${qs}` : ""}`;
|
|
22
|
+
};
|
|
23
|
+
return {
|
|
24
|
+
baseUrl,
|
|
25
|
+
tree: (prefix, max) => fetcher(url("tree", { prefix, max })),
|
|
26
|
+
key: (key) => fetcher(url("key", { key })),
|
|
27
|
+
search: (q, limit) => fetcher(url("search", { q, limit })),
|
|
28
|
+
stats: () => fetcher(url("stats", {})),
|
|
29
|
+
deleteKey: (key) => fetcher(url("key", { key }), { method: "DELETE" }),
|
|
30
|
+
deletePrefix: (prefix) => fetcher(url("prefix", { prefix }), { method: "DELETE" })
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
const cacheQueryKeys = {
|
|
34
|
+
all: (baseUrl) => ["cache-browser", baseUrl],
|
|
35
|
+
tree: (baseUrl, prefix) => ["cache-browser", baseUrl, "tree", prefix],
|
|
36
|
+
key: (baseUrl, key) => ["cache-browser", baseUrl, "key", key],
|
|
37
|
+
search: (baseUrl, q) => ["cache-browser", baseUrl, "search", q],
|
|
38
|
+
stats: (baseUrl) => ["cache-browser", baseUrl, "stats"]
|
|
39
|
+
};
|
|
40
|
+
exports.cacheQueryKeys = cacheQueryKeys;
|
|
41
|
+
exports.createCacheClient = createCacheClient;
|
|
42
|
+
//# sourceMappingURL=api.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.cjs","sources":["../../../src/data/cache-browser/api.ts"],"sourcesContent":["import type {\n CacheDeleteResponse,\n CacheKeyDetail,\n CacheSearchResponse,\n CacheStats,\n CacheTreeResponse,\n} from \"./types\";\n\n/**\n * Fetches a cache-browser URL and returns the parsed JSON body. Hosts inject\n * their own to add auth headers or routing; the default uses window.fetch and\n * throws on any non-2xx response.\n */\nexport type CacheFetcher = (url: string, init?: RequestInit) => Promise<unknown>;\n\nconst defaultFetcher: CacheFetcher = async (url, init) => {\n const res = await fetch(url, init);\n if (!res.ok) {\n const body = await res.text();\n throw new Error(`cache request failed: ${res.status} ${body.trim()}`.trim());\n }\n return res.json();\n};\n\n/** Typed client over the cache-browser HTTP endpoints. */\nexport type CacheClient = {\n /** Base URL the client was created with; used to scope react-query keys. */\n baseUrl: string;\n tree(prefix?: string, max?: number): Promise<CacheTreeResponse>;\n key(key: string): Promise<CacheKeyDetail>;\n search(q: string, limit?: number): Promise<CacheSearchResponse>;\n stats(): Promise<CacheStats>;\n deleteKey(key: string): Promise<CacheDeleteResponse>;\n deletePrefix(prefix: string): Promise<CacheDeleteResponse>;\n};\n\nexport type CreateCacheClientOptions = {\n /** API base shared with the rest of the app, e.g. \"/api/v1\". */\n baseUrl: string;\n fetcher?: CacheFetcher;\n};\n\nexport function createCacheClient({\n baseUrl,\n fetcher = defaultFetcher,\n}: CreateCacheClientOptions): CacheClient {\n const url = (path: string, params: Record<string, string | number | undefined>) => {\n const search = new URLSearchParams();\n for (const [name, value] of Object.entries(params)) {\n if (value !== undefined && value !== \"\") search.set(name, String(value));\n }\n const qs = search.toString();\n return `${baseUrl}/cache/${path}${qs ? `?${qs}` : \"\"}`;\n };\n\n return {\n baseUrl,\n tree: (prefix, max) =>\n fetcher(url(\"tree\", { prefix, max })) as Promise<CacheTreeResponse>,\n key: (key) => fetcher(url(\"key\", { key })) as Promise<CacheKeyDetail>,\n search: (q, limit) =>\n fetcher(url(\"search\", { q, limit })) as Promise<CacheSearchResponse>,\n stats: () => fetcher(url(\"stats\", {})) as Promise<CacheStats>,\n deleteKey: (key) =>\n fetcher(url(\"key\", { key }), { method: \"DELETE\" }) as Promise<CacheDeleteResponse>,\n deletePrefix: (prefix) =>\n fetcher(url(\"prefix\", { prefix }), { method: \"DELETE\" }) as Promise<CacheDeleteResponse>,\n };\n}\n\n/** react-query keys, scoped by baseUrl so two browsers never share caches. */\nexport const cacheQueryKeys = {\n all: (baseUrl: string) => [\"cache-browser\", baseUrl] as const,\n tree: (baseUrl: string, prefix: string) => [\"cache-browser\", baseUrl, \"tree\", prefix] as const,\n key: (baseUrl: string, key: string) => [\"cache-browser\", baseUrl, \"key\", key] as const,\n search: (baseUrl: string, q: string) => [\"cache-browser\", baseUrl, \"search\", q] as const,\n stats: (baseUrl: string) => [\"cache-browser\", baseUrl, \"stats\"] as const,\n};\n"],"names":[],"mappings":";;AAeA,MAAM,iBAA+B,OAAO,KAAK,SAAS;AACxD,QAAM,MAAM,MAAM,MAAM,KAAK,IAAI;AACjC,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,OAAO,MAAM,IAAI,KAAA;AACvB,UAAM,IAAI,MAAM,yBAAyB,IAAI,MAAM,IAAI,KAAK,KAAA,CAAM,GAAG,KAAA,CAAM;AAAA,EAC7E;AACA,SAAO,IAAI,KAAA;AACb;AAoBO,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA,UAAU;AACZ,GAA0C;AACxC,QAAM,MAAM,CAAC,MAAc,WAAwD;AACjF,UAAM,SAAS,IAAI,gBAAA;AACnB,eAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AAClD,UAAI,UAAU,UAAa,UAAU,WAAW,IAAI,MAAM,OAAO,KAAK,CAAC;AAAA,IACzE;AACA,UAAM,KAAK,OAAO,SAAA;AAClB,WAAO,GAAG,OAAO,UAAU,IAAI,GAAG,KAAK,IAAI,EAAE,KAAK,EAAE;AAAA,EACtD;AAEA,SAAO;AAAA,IACL;AAAA,IACA,MAAM,CAAC,QAAQ,QACb,QAAQ,IAAI,QAAQ,EAAE,QAAQ,IAAA,CAAK,CAAC;AAAA,IACtC,KAAK,CAAC,QAAQ,QAAQ,IAAI,OAAO,EAAE,IAAA,CAAK,CAAC;AAAA,IACzC,QAAQ,CAAC,GAAG,UACV,QAAQ,IAAI,UAAU,EAAE,GAAG,MAAA,CAAO,CAAC;AAAA,IACrC,OAAO,MAAM,QAAQ,IAAI,SAAS,CAAA,CAAE,CAAC;AAAA,IACrC,WAAW,CAAC,QACV,QAAQ,IAAI,OAAO,EAAE,KAAK,GAAG,EAAE,QAAQ,UAAU;AAAA,IACnD,cAAc,CAAC,WACb,QAAQ,IAAI,UAAU,EAAE,QAAQ,GAAG,EAAE,QAAQ,UAAU;AAAA,EAAA;AAE7D;AAGO,MAAM,iBAAiB;AAAA,EAC5B,KAAK,CAAC,YAAoB,CAAC,iBAAiB,OAAO;AAAA,EACnD,MAAM,CAAC,SAAiB,WAAmB,CAAC,iBAAiB,SAAS,QAAQ,MAAM;AAAA,EACpF,KAAK,CAAC,SAAiB,QAAgB,CAAC,iBAAiB,SAAS,OAAO,GAAG;AAAA,EAC5E,QAAQ,CAAC,SAAiB,MAAc,CAAC,iBAAiB,SAAS,UAAU,CAAC;AAAA,EAC9E,OAAO,CAAC,YAAoB,CAAC,iBAAiB,SAAS,OAAO;AAChE;;;"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { CacheDeleteResponse, CacheKeyDetail, CacheSearchResponse, CacheStats, CacheTreeResponse } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Fetches a cache-browser URL and returns the parsed JSON body. Hosts inject
|
|
4
|
+
* their own to add auth headers or routing; the default uses window.fetch and
|
|
5
|
+
* throws on any non-2xx response.
|
|
6
|
+
*/
|
|
7
|
+
export type CacheFetcher = (url: string, init?: RequestInit) => Promise<unknown>;
|
|
8
|
+
/** Typed client over the cache-browser HTTP endpoints. */
|
|
9
|
+
export type CacheClient = {
|
|
10
|
+
/** Base URL the client was created with; used to scope react-query keys. */
|
|
11
|
+
baseUrl: string;
|
|
12
|
+
tree(prefix?: string, max?: number): Promise<CacheTreeResponse>;
|
|
13
|
+
key(key: string): Promise<CacheKeyDetail>;
|
|
14
|
+
search(q: string, limit?: number): Promise<CacheSearchResponse>;
|
|
15
|
+
stats(): Promise<CacheStats>;
|
|
16
|
+
deleteKey(key: string): Promise<CacheDeleteResponse>;
|
|
17
|
+
deletePrefix(prefix: string): Promise<CacheDeleteResponse>;
|
|
18
|
+
};
|
|
19
|
+
export type CreateCacheClientOptions = {
|
|
20
|
+
/** API base shared with the rest of the app, e.g. "/api/v1". */
|
|
21
|
+
baseUrl: string;
|
|
22
|
+
fetcher?: CacheFetcher;
|
|
23
|
+
};
|
|
24
|
+
export declare function createCacheClient({ baseUrl, fetcher, }: CreateCacheClientOptions): CacheClient;
|
|
25
|
+
/** react-query keys, scoped by baseUrl so two browsers never share caches. */
|
|
26
|
+
export declare const cacheQueryKeys: {
|
|
27
|
+
all: (baseUrl: string) => readonly ["cache-browser", string];
|
|
28
|
+
tree: (baseUrl: string, prefix: string) => readonly ["cache-browser", string, "tree", string];
|
|
29
|
+
key: (baseUrl: string, key: string) => readonly ["cache-browser", string, "key", string];
|
|
30
|
+
search: (baseUrl: string, q: string) => readonly ["cache-browser", string, "search", string];
|
|
31
|
+
stats: (baseUrl: string) => readonly ["cache-browser", string, "stats"];
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/data/cache-browser/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EACnB,cAAc,EACd,mBAAmB,EACnB,UAAU,EACV,iBAAiB,EAClB,MAAM,SAAS,CAAC;AAEjB;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAWjF,0DAA0D;AAC1D,MAAM,MAAM,WAAW,GAAG;IACxB,4EAA4E;IAC5E,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAChE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAC1C,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAChE,KAAK,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC;IAC7B,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACrD,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;CAC5D,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,gEAAgE;IAChE,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,YAAY,CAAC;CACxB,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,EAChC,OAAO,EACP,OAAwB,GACzB,EAAE,wBAAwB,GAAG,WAAW,CAuBxC;AAED,8EAA8E;AAC9E,eAAO,MAAM,cAAc;mBACV,MAAM;oBACL,MAAM,UAAU,MAAM;mBACvB,MAAM,OAAO,MAAM;sBAChB,MAAM,KAAK,MAAM;qBAClB,MAAM;CACxB,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
const defaultFetcher = async (url, init) => {
|
|
2
|
+
const res = await fetch(url, init);
|
|
3
|
+
if (!res.ok) {
|
|
4
|
+
const body = await res.text();
|
|
5
|
+
throw new Error(`cache request failed: ${res.status} ${body.trim()}`.trim());
|
|
6
|
+
}
|
|
7
|
+
return res.json();
|
|
8
|
+
};
|
|
9
|
+
function createCacheClient({
|
|
10
|
+
baseUrl,
|
|
11
|
+
fetcher = defaultFetcher
|
|
12
|
+
}) {
|
|
13
|
+
const url = (path, params) => {
|
|
14
|
+
const search = new URLSearchParams();
|
|
15
|
+
for (const [name, value] of Object.entries(params)) {
|
|
16
|
+
if (value !== void 0 && value !== "") search.set(name, String(value));
|
|
17
|
+
}
|
|
18
|
+
const qs = search.toString();
|
|
19
|
+
return `${baseUrl}/cache/${path}${qs ? `?${qs}` : ""}`;
|
|
20
|
+
};
|
|
21
|
+
return {
|
|
22
|
+
baseUrl,
|
|
23
|
+
tree: (prefix, max) => fetcher(url("tree", { prefix, max })),
|
|
24
|
+
key: (key) => fetcher(url("key", { key })),
|
|
25
|
+
search: (q, limit) => fetcher(url("search", { q, limit })),
|
|
26
|
+
stats: () => fetcher(url("stats", {})),
|
|
27
|
+
deleteKey: (key) => fetcher(url("key", { key }), { method: "DELETE" }),
|
|
28
|
+
deletePrefix: (prefix) => fetcher(url("prefix", { prefix }), { method: "DELETE" })
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
const cacheQueryKeys = {
|
|
32
|
+
all: (baseUrl) => ["cache-browser", baseUrl],
|
|
33
|
+
tree: (baseUrl, prefix) => ["cache-browser", baseUrl, "tree", prefix],
|
|
34
|
+
key: (baseUrl, key) => ["cache-browser", baseUrl, "key", key],
|
|
35
|
+
search: (baseUrl, q) => ["cache-browser", baseUrl, "search", q],
|
|
36
|
+
stats: (baseUrl) => ["cache-browser", baseUrl, "stats"]
|
|
37
|
+
};
|
|
38
|
+
export {
|
|
39
|
+
cacheQueryKeys,
|
|
40
|
+
createCacheClient
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sources":["../../../src/data/cache-browser/api.ts"],"sourcesContent":["import type {\n CacheDeleteResponse,\n CacheKeyDetail,\n CacheSearchResponse,\n CacheStats,\n CacheTreeResponse,\n} from \"./types\";\n\n/**\n * Fetches a cache-browser URL and returns the parsed JSON body. Hosts inject\n * their own to add auth headers or routing; the default uses window.fetch and\n * throws on any non-2xx response.\n */\nexport type CacheFetcher = (url: string, init?: RequestInit) => Promise<unknown>;\n\nconst defaultFetcher: CacheFetcher = async (url, init) => {\n const res = await fetch(url, init);\n if (!res.ok) {\n const body = await res.text();\n throw new Error(`cache request failed: ${res.status} ${body.trim()}`.trim());\n }\n return res.json();\n};\n\n/** Typed client over the cache-browser HTTP endpoints. */\nexport type CacheClient = {\n /** Base URL the client was created with; used to scope react-query keys. */\n baseUrl: string;\n tree(prefix?: string, max?: number): Promise<CacheTreeResponse>;\n key(key: string): Promise<CacheKeyDetail>;\n search(q: string, limit?: number): Promise<CacheSearchResponse>;\n stats(): Promise<CacheStats>;\n deleteKey(key: string): Promise<CacheDeleteResponse>;\n deletePrefix(prefix: string): Promise<CacheDeleteResponse>;\n};\n\nexport type CreateCacheClientOptions = {\n /** API base shared with the rest of the app, e.g. \"/api/v1\". */\n baseUrl: string;\n fetcher?: CacheFetcher;\n};\n\nexport function createCacheClient({\n baseUrl,\n fetcher = defaultFetcher,\n}: CreateCacheClientOptions): CacheClient {\n const url = (path: string, params: Record<string, string | number | undefined>) => {\n const search = new URLSearchParams();\n for (const [name, value] of Object.entries(params)) {\n if (value !== undefined && value !== \"\") search.set(name, String(value));\n }\n const qs = search.toString();\n return `${baseUrl}/cache/${path}${qs ? `?${qs}` : \"\"}`;\n };\n\n return {\n baseUrl,\n tree: (prefix, max) =>\n fetcher(url(\"tree\", { prefix, max })) as Promise<CacheTreeResponse>,\n key: (key) => fetcher(url(\"key\", { key })) as Promise<CacheKeyDetail>,\n search: (q, limit) =>\n fetcher(url(\"search\", { q, limit })) as Promise<CacheSearchResponse>,\n stats: () => fetcher(url(\"stats\", {})) as Promise<CacheStats>,\n deleteKey: (key) =>\n fetcher(url(\"key\", { key }), { method: \"DELETE\" }) as Promise<CacheDeleteResponse>,\n deletePrefix: (prefix) =>\n fetcher(url(\"prefix\", { prefix }), { method: \"DELETE\" }) as Promise<CacheDeleteResponse>,\n };\n}\n\n/** react-query keys, scoped by baseUrl so two browsers never share caches. */\nexport const cacheQueryKeys = {\n all: (baseUrl: string) => [\"cache-browser\", baseUrl] as const,\n tree: (baseUrl: string, prefix: string) => [\"cache-browser\", baseUrl, \"tree\", prefix] as const,\n key: (baseUrl: string, key: string) => [\"cache-browser\", baseUrl, \"key\", key] as const,\n search: (baseUrl: string, q: string) => [\"cache-browser\", baseUrl, \"search\", q] as const,\n stats: (baseUrl: string) => [\"cache-browser\", baseUrl, \"stats\"] as const,\n};\n"],"names":[],"mappings":"AAeA,MAAM,iBAA+B,OAAO,KAAK,SAAS;AACxD,QAAM,MAAM,MAAM,MAAM,KAAK,IAAI;AACjC,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,OAAO,MAAM,IAAI,KAAA;AACvB,UAAM,IAAI,MAAM,yBAAyB,IAAI,MAAM,IAAI,KAAK,KAAA,CAAM,GAAG,KAAA,CAAM;AAAA,EAC7E;AACA,SAAO,IAAI,KAAA;AACb;AAoBO,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA,UAAU;AACZ,GAA0C;AACxC,QAAM,MAAM,CAAC,MAAc,WAAwD;AACjF,UAAM,SAAS,IAAI,gBAAA;AACnB,eAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AAClD,UAAI,UAAU,UAAa,UAAU,WAAW,IAAI,MAAM,OAAO,KAAK,CAAC;AAAA,IACzE;AACA,UAAM,KAAK,OAAO,SAAA;AAClB,WAAO,GAAG,OAAO,UAAU,IAAI,GAAG,KAAK,IAAI,EAAE,KAAK,EAAE;AAAA,EACtD;AAEA,SAAO;AAAA,IACL;AAAA,IACA,MAAM,CAAC,QAAQ,QACb,QAAQ,IAAI,QAAQ,EAAE,QAAQ,IAAA,CAAK,CAAC;AAAA,IACtC,KAAK,CAAC,QAAQ,QAAQ,IAAI,OAAO,EAAE,IAAA,CAAK,CAAC;AAAA,IACzC,QAAQ,CAAC,GAAG,UACV,QAAQ,IAAI,UAAU,EAAE,GAAG,MAAA,CAAO,CAAC;AAAA,IACrC,OAAO,MAAM,QAAQ,IAAI,SAAS,CAAA,CAAE,CAAC;AAAA,IACrC,WAAW,CAAC,QACV,QAAQ,IAAI,OAAO,EAAE,KAAK,GAAG,EAAE,QAAQ,UAAU;AAAA,IACnD,cAAc,CAAC,WACb,QAAQ,IAAI,UAAU,EAAE,QAAQ,GAAG,EAAE,QAAQ,UAAU;AAAA,EAAA;AAE7D;AAGO,MAAM,iBAAiB;AAAA,EAC5B,KAAK,CAAC,YAAoB,CAAC,iBAAiB,OAAO;AAAA,EACnD,MAAM,CAAC,SAAiB,WAAmB,CAAC,iBAAiB,SAAS,QAAQ,MAAM;AAAA,EACpF,KAAK,CAAC,SAAiB,QAAgB,CAAC,iBAAiB,SAAS,OAAO,GAAG;AAAA,EAC5E,QAAQ,CAAC,SAAiB,MAAc,CAAC,iBAAiB,SAAS,UAAU,CAAC;AAAA,EAC9E,OAAO,CAAC,YAAoB,CAAC,iBAAiB,SAAS,OAAO;AAChE;"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { CacheBrowser, type CacheBrowserProps } from './CacheBrowser';
|
|
2
|
+
export { CacheTree, CacheNodeRow, type CacheTreeProps } from './CacheTree';
|
|
3
|
+
export { CacheDetailPanel, type CacheDetailPanelProps } from './CacheDetailPanel';
|
|
4
|
+
export { CacheStatsOverview, type CacheStatsOverviewProps } from './CacheStatsOverview';
|
|
5
|
+
export { CacheValue } from './CacheValue';
|
|
6
|
+
export { createCacheClient, cacheQueryKeys, type CacheClient, type CacheFetcher, type CreateCacheClientOptions, } from './api';
|
|
7
|
+
export { CacheAdapterRegistry, createCacheRegistry, prefixAdapter, type CacheNodeAdapter, type CacheAdapterContext, type CacheDetailTab, } from './adapter';
|
|
8
|
+
export { isLeaf, type CacheTreeNode, type CacheTreeResponse, type CacheKeyDetail, type CacheScoredMember, type CacheSearchResponse, type CacheStats, type CacheDeleteResponse, } from './types';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/data/cache-browser/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,KAAK,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAClF,OAAO,EAAE,kBAAkB,EAAE,KAAK,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AACxF,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,wBAAwB,GAC9B,MAAM,OAAO,CAAC;AAEf,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,aAAa,EACb,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,cAAc,GACpB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,MAAM,EACN,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,UAAU,EACf,KAAK,mBAAmB,GACzB,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.cjs","sources":["../../../src/data/cache-browser/types.ts"],"sourcesContent":["// Wire types for clicky's generic cache-browser API\n// (github.com/flanksource/clicky/cache). Field names match the Go JSON tags\n// exactly.\n\n/** One entry in a tree level: a prefix group or a leaf key. */\nexport type CacheTreeNode = {\n /** Display segment: the next path segment for groups, the key tail for leaves. */\n name: string;\n /** Group nodes only: full logical prefix including the trailing separator. */\n prefix?: string;\n /** Leaf nodes only: the full logical key. */\n key?: string;\n /** Total keys under this node (1 for a leaf). */\n keys: number;\n /** Group nodes: number of distinct child segments. */\n children?: number;\n /** Leaf value type: string | hash | list | set | zset | stream. */\n type?: string;\n /** Leaf TTL in seconds; -1 means no expiry. */\n ttlSeconds?: number;\n /**\n * MEMORY USAGE when the server supports it: a leaf's own size, or for a\n * group the aggregated size of every key beneath it.\n */\n bytes?: number;\n};\n\nexport type CacheTreeResponse = {\n prefix: string;\n nodes: CacheTreeNode[];\n /** Total keys scanned under prefix, including keys inside group nodes. */\n keys: number;\n /** Node list or scan hit a cap; counts are lower bounds. */\n truncated?: boolean;\n /** Whether per-key byte sizes were available (MEMORY USAGE). */\n bytesSupported: boolean;\n};\n\nexport type CacheScoredMember = {\n member: string;\n score: number;\n};\n\n/** Full detail for one key. Exactly one value field is set, per `type`. */\nexport type CacheKeyDetail = {\n key: string;\n type: string;\n ttlSeconds: number;\n bytes?: number;\n /** Full value length: STRLEN, HLEN, LLEN, SCARD or ZCARD. */\n length: number;\n value?: string;\n fields?: Record<string, string>;\n items?: string[];\n members?: CacheScoredMember[];\n /** The returned value was capped; `length` still reports the full size. */\n truncated?: boolean;\n};\n\nexport type CacheSearchResponse = {\n keys: CacheTreeNode[];\n truncated?: boolean;\n};\n\nexport type CacheStats = {\n keys: number;\n keysTruncated?: boolean;\n usedMemoryBytes?: number;\n maxMemoryBytes?: number;\n hits?: number;\n misses?: number;\n evictedKeys?: number;\n expiredKeys?: number;\n connectedClients?: number;\n version?: string;\n uptimeSeconds?: number;\n /** Set when the backend's INFO failed; server fields above are then absent. */\n infoError?: string;\n};\n\nexport type CacheDeleteResponse = {\n deleted: number;\n};\n\n/** True when the node is a leaf key (vs a prefix group). */\nexport function isLeaf(node: CacheTreeNode): node is CacheTreeNode & { key: string } {\n return node.key !== undefined && node.key !== \"\";\n}\n"],"names":[],"mappings":";;AAqFO,SAAS,OAAO,MAA8D;AACnF,SAAO,KAAK,QAAQ,UAAa,KAAK,QAAQ;AAChD;;"}
|