@walkthru-earth/objex 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +396 -0
- package/README.md +114 -0
- package/dist/assets/favicon.svg +17 -0
- package/dist/components/CLAUDE.md +44 -0
- package/dist/components/browser/Breadcrumb.svelte +50 -0
- package/dist/components/browser/Breadcrumb.svelte.d.ts +7 -0
- package/dist/components/browser/CreateFolderDialog.svelte +98 -0
- package/dist/components/browser/CreateFolderDialog.svelte.d.ts +6 -0
- package/dist/components/browser/DeleteConfirmDialog.svelte +90 -0
- package/dist/components/browser/DeleteConfirmDialog.svelte.d.ts +8 -0
- package/dist/components/browser/DropZone.svelte +83 -0
- package/dist/components/browser/DropZone.svelte.d.ts +7 -0
- package/dist/components/browser/FileBrowser.svelte +229 -0
- package/dist/components/browser/FileBrowser.svelte.d.ts +3 -0
- package/dist/components/browser/FileRow.svelte +112 -0
- package/dist/components/browser/FileRow.svelte.d.ts +9 -0
- package/dist/components/browser/FileTreeSidebar.svelte +559 -0
- package/dist/components/browser/FileTreeSidebar.svelte.d.ts +8 -0
- package/dist/components/browser/RenameDialog.svelte +101 -0
- package/dist/components/browser/RenameDialog.svelte.d.ts +8 -0
- package/dist/components/browser/SearchBar.svelte +40 -0
- package/dist/components/browser/SearchBar.svelte.d.ts +6 -0
- package/dist/components/browser/UploadButton.svelte +65 -0
- package/dist/components/browser/UploadButton.svelte.d.ts +3 -0
- package/dist/components/editor/CodeMirrorEditor.svelte +404 -0
- package/dist/components/editor/CodeMirrorEditor.svelte.d.ts +12 -0
- package/dist/components/editor/MilkdownEditor.svelte +98 -0
- package/dist/components/editor/MilkdownEditor.svelte.d.ts +9 -0
- package/dist/components/editor/SqlEditor.svelte +173 -0
- package/dist/components/editor/SqlEditor.svelte.d.ts +7 -0
- package/dist/components/editor/SqlResultBlock.svelte +199 -0
- package/dist/components/editor/SqlResultBlock.svelte.d.ts +9 -0
- package/dist/components/layout/ConnectionDialog.svelte +439 -0
- package/dist/components/layout/ConnectionDialog.svelte.d.ts +9 -0
- package/dist/components/layout/LocaleToggle.svelte +32 -0
- package/dist/components/layout/LocaleToggle.svelte.d.ts +3 -0
- package/dist/components/layout/SafeLockToggle.svelte +37 -0
- package/dist/components/layout/SafeLockToggle.svelte.d.ts +18 -0
- package/dist/components/layout/Sidebar.svelte +314 -0
- package/dist/components/layout/Sidebar.svelte.d.ts +3 -0
- package/dist/components/layout/StatusBar.svelte +73 -0
- package/dist/components/layout/StatusBar.svelte.d.ts +3 -0
- package/dist/components/layout/TabBar.svelte +102 -0
- package/dist/components/layout/TabBar.svelte.d.ts +7 -0
- package/dist/components/layout/ThemeToggle.svelte +52 -0
- package/dist/components/layout/ThemeToggle.svelte.d.ts +3 -0
- package/dist/components/ui/badge/badge.svelte +49 -0
- package/dist/components/ui/badge/badge.svelte.d.ts +32 -0
- package/dist/components/ui/badge/index.d.ts +1 -0
- package/dist/components/ui/badge/index.js +1 -0
- package/dist/components/ui/button/button.svelte +82 -0
- package/dist/components/ui/button/button.svelte.d.ts +64 -0
- package/dist/components/ui/button/index.d.ts +2 -0
- package/dist/components/ui/button/index.js +4 -0
- package/dist/components/ui/context-menu/context-menu-checkbox-item.svelte +40 -0
- package/dist/components/ui/context-menu/context-menu-checkbox-item.svelte.d.ts +9 -0
- package/dist/components/ui/context-menu/context-menu-content.svelte +28 -0
- package/dist/components/ui/context-menu/context-menu-content.svelte.d.ts +10 -0
- package/dist/components/ui/context-menu/context-menu-group-heading.svelte +21 -0
- package/dist/components/ui/context-menu/context-menu-group-heading.svelte.d.ts +7 -0
- package/dist/components/ui/context-menu/context-menu-group.svelte +7 -0
- package/dist/components/ui/context-menu/context-menu-group.svelte.d.ts +4 -0
- package/dist/components/ui/context-menu/context-menu-item.svelte +27 -0
- package/dist/components/ui/context-menu/context-menu-item.svelte.d.ts +8 -0
- package/dist/components/ui/context-menu/context-menu-label.svelte +24 -0
- package/dist/components/ui/context-menu/context-menu-label.svelte.d.ts +8 -0
- package/dist/components/ui/context-menu/context-menu-portal.svelte +7 -0
- package/dist/components/ui/context-menu/context-menu-portal.svelte.d.ts +3 -0
- package/dist/components/ui/context-menu/context-menu-radio-group.svelte +16 -0
- package/dist/components/ui/context-menu/context-menu-radio-group.svelte.d.ts +4 -0
- package/dist/components/ui/context-menu/context-menu-radio-item.svelte +33 -0
- package/dist/components/ui/context-menu/context-menu-radio-item.svelte.d.ts +4 -0
- package/dist/components/ui/context-menu/context-menu-separator.svelte +17 -0
- package/dist/components/ui/context-menu/context-menu-separator.svelte.d.ts +4 -0
- package/dist/components/ui/context-menu/context-menu-shortcut.svelte +20 -0
- package/dist/components/ui/context-menu/context-menu-shortcut.svelte.d.ts +5 -0
- package/dist/components/ui/context-menu/context-menu-sub-content.svelte +20 -0
- package/dist/components/ui/context-menu/context-menu-sub-content.svelte.d.ts +4 -0
- package/dist/components/ui/context-menu/context-menu-sub-trigger.svelte +29 -0
- package/dist/components/ui/context-menu/context-menu-sub-trigger.svelte.d.ts +8 -0
- package/dist/components/ui/context-menu/context-menu-sub.svelte +7 -0
- package/dist/components/ui/context-menu/context-menu-sub.svelte.d.ts +3 -0
- package/dist/components/ui/context-menu/context-menu-trigger.svelte +7 -0
- package/dist/components/ui/context-menu/context-menu-trigger.svelte.d.ts +4 -0
- package/dist/components/ui/context-menu/context-menu.svelte +7 -0
- package/dist/components/ui/context-menu/context-menu.svelte.d.ts +3 -0
- package/dist/components/ui/context-menu/index.d.ts +17 -0
- package/dist/components/ui/context-menu/index.js +19 -0
- package/dist/components/ui/dropdown-menu/dropdown-menu-checkbox-group.svelte +16 -0
- package/dist/components/ui/dropdown-menu/dropdown-menu-checkbox-group.svelte.d.ts +4 -0
- package/dist/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte +43 -0
- package/dist/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte.d.ts +9 -0
- package/dist/components/ui/dropdown-menu/dropdown-menu-content.svelte +29 -0
- package/dist/components/ui/dropdown-menu/dropdown-menu-content.svelte.d.ts +10 -0
- package/dist/components/ui/dropdown-menu/dropdown-menu-group-heading.svelte +22 -0
- package/dist/components/ui/dropdown-menu/dropdown-menu-group-heading.svelte.d.ts +8 -0
- package/dist/components/ui/dropdown-menu/dropdown-menu-group.svelte +7 -0
- package/dist/components/ui/dropdown-menu/dropdown-menu-group.svelte.d.ts +4 -0
- package/dist/components/ui/dropdown-menu/dropdown-menu-item.svelte +27 -0
- package/dist/components/ui/dropdown-menu/dropdown-menu-item.svelte.d.ts +8 -0
- package/dist/components/ui/dropdown-menu/dropdown-menu-label.svelte +24 -0
- package/dist/components/ui/dropdown-menu/dropdown-menu-label.svelte.d.ts +8 -0
- package/dist/components/ui/dropdown-menu/dropdown-menu-portal.svelte +7 -0
- package/dist/components/ui/dropdown-menu/dropdown-menu-portal.svelte.d.ts +3 -0
- package/dist/components/ui/dropdown-menu/dropdown-menu-radio-group.svelte +16 -0
- package/dist/components/ui/dropdown-menu/dropdown-menu-radio-group.svelte.d.ts +4 -0
- package/dist/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte +33 -0
- package/dist/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte.d.ts +4 -0
- package/dist/components/ui/dropdown-menu/dropdown-menu-separator.svelte +17 -0
- package/dist/components/ui/dropdown-menu/dropdown-menu-separator.svelte.d.ts +4 -0
- package/dist/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte +20 -0
- package/dist/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte.d.ts +5 -0
- package/dist/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte +20 -0
- package/dist/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte.d.ts +4 -0
- package/dist/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte +29 -0
- package/dist/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte.d.ts +7 -0
- package/dist/components/ui/dropdown-menu/dropdown-menu-sub.svelte +7 -0
- package/dist/components/ui/dropdown-menu/dropdown-menu-sub.svelte.d.ts +3 -0
- package/dist/components/ui/dropdown-menu/dropdown-menu-trigger.svelte +7 -0
- package/dist/components/ui/dropdown-menu/dropdown-menu-trigger.svelte.d.ts +4 -0
- package/dist/components/ui/dropdown-menu/dropdown-menu.svelte +7 -0
- package/dist/components/ui/dropdown-menu/dropdown-menu.svelte.d.ts +3 -0
- package/dist/components/ui/dropdown-menu/index.d.ts +18 -0
- package/dist/components/ui/dropdown-menu/index.js +18 -0
- package/dist/components/ui/input/index.d.ts +2 -0
- package/dist/components/ui/input/index.js +4 -0
- package/dist/components/ui/input/input.svelte +52 -0
- package/dist/components/ui/input/input.svelte.d.ts +13 -0
- package/dist/components/ui/resizable/index.d.ts +4 -0
- package/dist/components/ui/resizable/index.js +6 -0
- package/dist/components/ui/resizable/resizable-handle.svelte +30 -0
- package/dist/components/ui/resizable/resizable-handle.svelte.d.ts +8 -0
- package/dist/components/ui/resizable/resizable-pane-group.svelte +20 -0
- package/dist/components/ui/resizable/resizable-pane-group.svelte.d.ts +7 -0
- package/dist/components/ui/scroll-area/index.d.ts +3 -0
- package/dist/components/ui/scroll-area/index.js +5 -0
- package/dist/components/ui/scroll-area/scroll-area-scrollbar.svelte +31 -0
- package/dist/components/ui/scroll-area/scroll-area-scrollbar.svelte.d.ts +4 -0
- package/dist/components/ui/scroll-area/scroll-area.svelte +47 -0
- package/dist/components/ui/scroll-area/scroll-area.svelte.d.ts +11 -0
- package/dist/components/ui/separator/index.d.ts +2 -0
- package/dist/components/ui/separator/index.js +4 -0
- package/dist/components/ui/separator/separator.svelte +21 -0
- package/dist/components/ui/separator/separator.svelte.d.ts +4 -0
- package/dist/components/ui/sheet/index.d.ts +11 -0
- package/dist/components/ui/sheet/index.js +13 -0
- package/dist/components/ui/sheet/sheet-close.svelte +7 -0
- package/dist/components/ui/sheet/sheet-close.svelte.d.ts +4 -0
- package/dist/components/ui/sheet/sheet-content.svelte +62 -0
- package/dist/components/ui/sheet/sheet-content.svelte.d.ts +37 -0
- package/dist/components/ui/sheet/sheet-description.svelte +17 -0
- package/dist/components/ui/sheet/sheet-description.svelte.d.ts +4 -0
- package/dist/components/ui/sheet/sheet-footer.svelte +20 -0
- package/dist/components/ui/sheet/sheet-footer.svelte.d.ts +5 -0
- package/dist/components/ui/sheet/sheet-header.svelte +20 -0
- package/dist/components/ui/sheet/sheet-header.svelte.d.ts +5 -0
- package/dist/components/ui/sheet/sheet-overlay.svelte +20 -0
- package/dist/components/ui/sheet/sheet-overlay.svelte.d.ts +4 -0
- package/dist/components/ui/sheet/sheet-portal.svelte +7 -0
- package/dist/components/ui/sheet/sheet-portal.svelte.d.ts +3 -0
- package/dist/components/ui/sheet/sheet-title.svelte +13 -0
- package/dist/components/ui/sheet/sheet-title.svelte.d.ts +4 -0
- package/dist/components/ui/sheet/sheet-trigger.svelte +7 -0
- package/dist/components/ui/sheet/sheet-trigger.svelte.d.ts +4 -0
- package/dist/components/ui/sheet/sheet.svelte +7 -0
- package/dist/components/ui/sheet/sheet.svelte.d.ts +3 -0
- package/dist/components/ui/switch/index.d.ts +2 -0
- package/dist/components/ui/switch/index.js +4 -0
- package/dist/components/ui/switch/switch.svelte +28 -0
- package/dist/components/ui/switch/switch.svelte.d.ts +8 -0
- package/dist/components/ui/tabs/index.d.ts +5 -0
- package/dist/components/ui/tabs/index.js +7 -0
- package/dist/components/ui/tabs/tabs-content.svelte +17 -0
- package/dist/components/ui/tabs/tabs-content.svelte.d.ts +4 -0
- package/dist/components/ui/tabs/tabs-list.svelte +16 -0
- package/dist/components/ui/tabs/tabs-list.svelte.d.ts +4 -0
- package/dist/components/ui/tabs/tabs-trigger.svelte +20 -0
- package/dist/components/ui/tabs/tabs-trigger.svelte.d.ts +4 -0
- package/dist/components/ui/tabs/tabs.svelte +19 -0
- package/dist/components/ui/tabs/tabs.svelte.d.ts +4 -0
- package/dist/components/ui/tooltip/index.d.ts +6 -0
- package/dist/components/ui/tooltip/index.js +8 -0
- package/dist/components/ui/tooltip/tooltip-content.svelte +52 -0
- package/dist/components/ui/tooltip/tooltip-content.svelte.d.ts +11 -0
- package/dist/components/ui/tooltip/tooltip-portal.svelte +7 -0
- package/dist/components/ui/tooltip/tooltip-portal.svelte.d.ts +4 -0
- package/dist/components/ui/tooltip/tooltip-provider.svelte +7 -0
- package/dist/components/ui/tooltip/tooltip-provider.svelte.d.ts +4 -0
- package/dist/components/ui/tooltip/tooltip-trigger.svelte +7 -0
- package/dist/components/ui/tooltip/tooltip-trigger.svelte.d.ts +4 -0
- package/dist/components/ui/tooltip/tooltip.svelte +7 -0
- package/dist/components/ui/tooltip/tooltip.svelte.d.ts +4 -0
- package/dist/components/viewers/ArchiveViewer.svelte +586 -0
- package/dist/components/viewers/ArchiveViewer.svelte.d.ts +7 -0
- package/dist/components/viewers/CLAUDE.md +60 -0
- package/dist/components/viewers/CodeViewer.svelte +553 -0
- package/dist/components/viewers/CodeViewer.svelte.d.ts +7 -0
- package/dist/components/viewers/CogViewer.svelte +1345 -0
- package/dist/components/viewers/CogViewer.svelte.d.ts +7 -0
- package/dist/components/viewers/CopcViewer.svelte +25 -0
- package/dist/components/viewers/CopcViewer.svelte.d.ts +7 -0
- package/dist/components/viewers/DatabaseViewer.svelte +169 -0
- package/dist/components/viewers/DatabaseViewer.svelte.d.ts +7 -0
- package/dist/components/viewers/FileInfo.svelte +174 -0
- package/dist/components/viewers/FileInfo.svelte.d.ts +10 -0
- package/dist/components/viewers/FlatGeobufViewer.svelte +755 -0
- package/dist/components/viewers/FlatGeobufViewer.svelte.d.ts +7 -0
- package/dist/components/viewers/GeoParquetMapViewer.svelte +278 -0
- package/dist/components/viewers/GeoParquetMapViewer.svelte.d.ts +17 -0
- package/dist/components/viewers/ImageViewer.svelte +233 -0
- package/dist/components/viewers/ImageViewer.svelte.d.ts +7 -0
- package/dist/components/viewers/LoadProgress.svelte +93 -0
- package/dist/components/viewers/LoadProgress.svelte.d.ts +15 -0
- package/dist/components/viewers/MapViewer.svelte +234 -0
- package/dist/components/viewers/MapViewer.svelte.d.ts +7 -0
- package/dist/components/viewers/MarkdownViewer.svelte +478 -0
- package/dist/components/viewers/MarkdownViewer.svelte.d.ts +7 -0
- package/dist/components/viewers/MediaViewer.svelte +121 -0
- package/dist/components/viewers/MediaViewer.svelte.d.ts +7 -0
- package/dist/components/viewers/ModelViewer.svelte +164 -0
- package/dist/components/viewers/ModelViewer.svelte.d.ts +7 -0
- package/dist/components/viewers/NotebookViewer.svelte +389 -0
- package/dist/components/viewers/NotebookViewer.svelte.d.ts +7 -0
- package/dist/components/viewers/PdfViewer.svelte +278 -0
- package/dist/components/viewers/PdfViewer.svelte.d.ts +7 -0
- package/dist/components/viewers/PmtilesViewer.svelte +191 -0
- package/dist/components/viewers/PmtilesViewer.svelte.d.ts +7 -0
- package/dist/components/viewers/QueryHistoryPanel.svelte +159 -0
- package/dist/components/viewers/QueryHistoryPanel.svelte.d.ts +8 -0
- package/dist/components/viewers/RawViewer.svelte +117 -0
- package/dist/components/viewers/RawViewer.svelte.d.ts +7 -0
- package/dist/components/viewers/StacMapViewer.svelte +20 -0
- package/dist/components/viewers/StacMapViewer.svelte.d.ts +7 -0
- package/dist/components/viewers/StyleEditorOverlay.svelte +27 -0
- package/dist/components/viewers/StyleEditorOverlay.svelte.d.ts +7 -0
- package/dist/components/viewers/TableGrid.svelte +355 -0
- package/dist/components/viewers/TableGrid.svelte.d.ts +12 -0
- package/dist/components/viewers/TableStatusBar.svelte +92 -0
- package/dist/components/viewers/TableStatusBar.svelte.d.ts +11 -0
- package/dist/components/viewers/TableToolbar.svelte +382 -0
- package/dist/components/viewers/TableToolbar.svelte.d.ts +25 -0
- package/dist/components/viewers/TableViewer.svelte +923 -0
- package/dist/components/viewers/TableViewer.svelte.d.ts +7 -0
- package/dist/components/viewers/ViewerRouter.svelte +70 -0
- package/dist/components/viewers/ViewerRouter.svelte.d.ts +7 -0
- package/dist/components/viewers/ZarrMapViewer.svelte +288 -0
- package/dist/components/viewers/ZarrMapViewer.svelte.d.ts +17 -0
- package/dist/components/viewers/ZarrViewer.svelte +256 -0
- package/dist/components/viewers/ZarrViewer.svelte.d.ts +7 -0
- package/dist/components/viewers/map/AttributeTable.svelte +52 -0
- package/dist/components/viewers/map/AttributeTable.svelte.d.ts +8 -0
- package/dist/components/viewers/map/MapContainer.svelte +158 -0
- package/dist/components/viewers/map/MapContainer.svelte.d.ts +12 -0
- package/dist/components/viewers/pmtiles/PmtilesArchiveView.svelte +389 -0
- package/dist/components/viewers/pmtiles/PmtilesArchiveView.svelte.d.ts +10 -0
- package/dist/components/viewers/pmtiles/PmtilesMapView.svelte +332 -0
- package/dist/components/viewers/pmtiles/PmtilesMapView.svelte.d.ts +11 -0
- package/dist/components/viewers/pmtiles/PmtilesTileInspector.svelte +373 -0
- package/dist/components/viewers/pmtiles/PmtilesTileInspector.svelte.d.ts +12 -0
- package/dist/components/viewers/pmtiles/SvgTileRenderer.svelte +112 -0
- package/dist/components/viewers/pmtiles/SvgTileRenderer.svelte.d.ts +10 -0
- package/dist/file-icons/CLAUDE.md +21 -0
- package/dist/file-icons/FileTypeIcon.svelte +74 -0
- package/dist/file-icons/FileTypeIcon.svelte.d.ts +9 -0
- package/dist/file-icons/index.d.ts +56 -0
- package/dist/file-icons/index.js +1070 -0
- package/dist/i18n/CLAUDE.md +19 -0
- package/dist/i18n/ar.d.ts +1 -0
- package/dist/i18n/ar.js +404 -0
- package/dist/i18n/en.d.ts +1 -0
- package/dist/i18n/en.js +404 -0
- package/dist/i18n/index.svelte.d.ts +9 -0
- package/dist/i18n/index.svelte.js +27 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.js +13 -0
- package/dist/query/CLAUDE.md +22 -0
- package/dist/query/engine.d.ts +56 -0
- package/dist/query/engine.js +6 -0
- package/dist/query/index.d.ts +4 -0
- package/dist/query/index.js +19 -0
- package/dist/query/wasm.d.ts +20 -0
- package/dist/query/wasm.js +890 -0
- package/dist/storage/CLAUDE.md +23 -0
- package/dist/storage/adapter.d.ts +21 -0
- package/dist/storage/adapter.js +1 -0
- package/dist/storage/browser-azure.d.ts +25 -0
- package/dist/storage/browser-azure.js +271 -0
- package/dist/storage/browser-cloud.d.ts +32 -0
- package/dist/storage/browser-cloud.js +293 -0
- package/dist/storage/index.d.ts +11 -0
- package/dist/storage/index.js +37 -0
- package/dist/storage/url-adapter.d.ts +19 -0
- package/dist/storage/url-adapter.js +51 -0
- package/dist/stores/CLAUDE.md +29 -0
- package/dist/stores/browser.svelte.d.ts +28 -0
- package/dist/stores/browser.svelte.js +160 -0
- package/dist/stores/connections.svelte.d.ts +56 -0
- package/dist/stores/connections.svelte.js +272 -0
- package/dist/stores/credentials.svelte.d.ts +56 -0
- package/dist/stores/credentials.svelte.js +79 -0
- package/dist/stores/files.svelte.d.ts +20 -0
- package/dist/stores/files.svelte.js +76 -0
- package/dist/stores/query-history.svelte.d.ts +16 -0
- package/dist/stores/query-history.svelte.js +57 -0
- package/dist/stores/safelock.svelte.d.ts +8 -0
- package/dist/stores/safelock.svelte.js +52 -0
- package/dist/stores/settings.svelte.d.ts +11 -0
- package/dist/stores/settings.svelte.js +101 -0
- package/dist/stores/tab-resources.svelte.d.ts +25 -0
- package/dist/stores/tab-resources.svelte.js +61 -0
- package/dist/stores/tabs.svelte.d.ts +17 -0
- package/dist/stores/tabs.svelte.js +110 -0
- package/dist/types/notebookjs.d.ts +14 -0
- package/dist/types.d.ts +47 -0
- package/dist/types.js +1 -0
- package/dist/utils/CLAUDE.md +54 -0
- package/dist/utils/analytics.d.ts +10 -0
- package/dist/utils/analytics.js +38 -0
- package/dist/utils/archive.d.ts +70 -0
- package/dist/utils/archive.js +333 -0
- package/dist/utils/column-types.d.ts +5 -0
- package/dist/utils/column-types.js +137 -0
- package/dist/utils/deck.d.ts +98 -0
- package/dist/utils/deck.js +208 -0
- package/dist/utils/evidence-context.d.ts +22 -0
- package/dist/utils/evidence-context.js +56 -0
- package/dist/utils/export.d.ts +2 -0
- package/dist/utils/export.js +51 -0
- package/dist/utils/format.d.ts +14 -0
- package/dist/utils/format.js +56 -0
- package/dist/utils/geoarrow.d.ts +32 -0
- package/dist/utils/geoarrow.js +672 -0
- package/dist/utils/hex.d.ts +10 -0
- package/dist/utils/hex.js +27 -0
- package/dist/utils/host-detection.d.ts +23 -0
- package/dist/utils/host-detection.js +289 -0
- package/dist/utils/map-selection.d.ts +12 -0
- package/dist/utils/map-selection.js +45 -0
- package/dist/utils/markdown-sql.d.ts +30 -0
- package/dist/utils/markdown-sql.js +73 -0
- package/dist/utils/markdown.d.ts +18 -0
- package/dist/utils/markdown.js +146 -0
- package/dist/utils/model3d.d.ts +13 -0
- package/dist/utils/model3d.js +62 -0
- package/dist/utils/parquet-metadata.d.ts +58 -0
- package/dist/utils/parquet-metadata.js +228 -0
- package/dist/utils/pdf.d.ts +8 -0
- package/dist/utils/pdf.js +28 -0
- package/dist/utils/pmtiles-tile.d.ts +38 -0
- package/dist/utils/pmtiles-tile.js +64 -0
- package/dist/utils/pmtiles.d.ts +46 -0
- package/dist/utils/pmtiles.js +135 -0
- package/dist/utils/shiki.d.ts +8 -0
- package/dist/utils/shiki.js +98 -0
- package/dist/utils/storage-url.d.ts +64 -0
- package/dist/utils/storage-url.js +374 -0
- package/dist/utils/url-state.d.ts +40 -0
- package/dist/utils/url-state.js +113 -0
- package/dist/utils/url.d.ts +27 -0
- package/dist/utils/url.js +115 -0
- package/dist/utils/wkb.d.ts +43 -0
- package/dist/utils/wkb.js +345 -0
- package/dist/utils/zarr.d.ts +39 -0
- package/dist/utils/zarr.js +204 -0
- package/dist/utils.d.ts +12 -0
- package/dist/utils.js +5 -0
- package/package.json +203 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory credential store.
|
|
3
|
+
*
|
|
4
|
+
* Credentials are held only in memory — they are never persisted to
|
|
5
|
+
* localStorage or any other durable storage — so a page refresh clears them.
|
|
6
|
+
*
|
|
7
|
+
* The Credential Management API helpers (`storeToNative` / `loadFromNative`)
|
|
8
|
+
* allow the browser's built-in password manager to save and restore
|
|
9
|
+
* credentials across page refreshes (Chrome/Edge; silent no-op elsewhere).
|
|
10
|
+
*/
|
|
11
|
+
export interface SigV4Credentials {
|
|
12
|
+
type: 'sigv4';
|
|
13
|
+
accessKey: string;
|
|
14
|
+
secretKey: string;
|
|
15
|
+
}
|
|
16
|
+
export interface AzureCredentials {
|
|
17
|
+
type: 'sas-token';
|
|
18
|
+
sasToken: string;
|
|
19
|
+
}
|
|
20
|
+
export type Credentials = SigV4Credentials | AzureCredentials;
|
|
21
|
+
export declare const credentialStore: {
|
|
22
|
+
/** Store credentials for a connection. */
|
|
23
|
+
set(connectionId: string, creds: Credentials): void;
|
|
24
|
+
/** Retrieve credentials for a connection (or undefined). */
|
|
25
|
+
get(connectionId: string): Credentials | undefined;
|
|
26
|
+
/** Remove credentials for a connection. */
|
|
27
|
+
remove(connectionId: string): void;
|
|
28
|
+
/** Check whether credentials exist for a connection. */
|
|
29
|
+
has(connectionId: string): boolean;
|
|
30
|
+
/** Remove all stored credentials. */
|
|
31
|
+
clear(): void;
|
|
32
|
+
};
|
|
33
|
+
declare global {
|
|
34
|
+
interface PasswordCredentialData {
|
|
35
|
+
id: string;
|
|
36
|
+
name?: string;
|
|
37
|
+
password: string;
|
|
38
|
+
}
|
|
39
|
+
interface PasswordCredential extends Credential {
|
|
40
|
+
readonly password: string;
|
|
41
|
+
}
|
|
42
|
+
var PasswordCredential: {
|
|
43
|
+
prototype: PasswordCredential;
|
|
44
|
+
new (data: PasswordCredentialData): PasswordCredential;
|
|
45
|
+
} | undefined;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Persist credentials to the browser's native password manager.
|
|
49
|
+
* Uses PasswordCredential (Chrome/Edge). Silently no-ops on unsupported browsers.
|
|
50
|
+
*/
|
|
51
|
+
export declare function storeToNative(connectionId: string, creds: Credentials): Promise<void>;
|
|
52
|
+
/**
|
|
53
|
+
* Attempt to load credentials from the browser's native password manager.
|
|
54
|
+
* Returns the deserialized Credentials, or undefined if unavailable.
|
|
55
|
+
*/
|
|
56
|
+
export declare function loadFromNative(connectionId: string): Promise<Credentials | undefined>;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory credential store.
|
|
3
|
+
*
|
|
4
|
+
* Credentials are held only in memory — they are never persisted to
|
|
5
|
+
* localStorage or any other durable storage — so a page refresh clears them.
|
|
6
|
+
*
|
|
7
|
+
* The Credential Management API helpers (`storeToNative` / `loadFromNative`)
|
|
8
|
+
* allow the browser's built-in password manager to save and restore
|
|
9
|
+
* credentials across page refreshes (Chrome/Edge; silent no-op elsewhere).
|
|
10
|
+
*/
|
|
11
|
+
const store = new Map();
|
|
12
|
+
export const credentialStore = {
|
|
13
|
+
/** Store credentials for a connection. */
|
|
14
|
+
set(connectionId, creds) {
|
|
15
|
+
store.set(connectionId, creds);
|
|
16
|
+
},
|
|
17
|
+
/** Retrieve credentials for a connection (or undefined). */
|
|
18
|
+
get(connectionId) {
|
|
19
|
+
return store.get(connectionId);
|
|
20
|
+
},
|
|
21
|
+
/** Remove credentials for a connection. */
|
|
22
|
+
remove(connectionId) {
|
|
23
|
+
store.delete(connectionId);
|
|
24
|
+
},
|
|
25
|
+
/** Check whether credentials exist for a connection. */
|
|
26
|
+
has(connectionId) {
|
|
27
|
+
return store.has(connectionId);
|
|
28
|
+
},
|
|
29
|
+
/** Remove all stored credentials. */
|
|
30
|
+
clear() {
|
|
31
|
+
store.clear();
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Persist credentials to the browser's native password manager.
|
|
36
|
+
* Uses PasswordCredential (Chrome/Edge). Silently no-ops on unsupported browsers.
|
|
37
|
+
*/
|
|
38
|
+
export async function storeToNative(connectionId, creds) {
|
|
39
|
+
try {
|
|
40
|
+
if (typeof PasswordCredential === 'undefined' || !navigator.credentials?.store)
|
|
41
|
+
return;
|
|
42
|
+
const password = JSON.stringify(creds);
|
|
43
|
+
const pc = new PasswordCredential({
|
|
44
|
+
id: connectionId,
|
|
45
|
+
password,
|
|
46
|
+
name: `obstore:${connectionId}`
|
|
47
|
+
});
|
|
48
|
+
await navigator.credentials.store(pc);
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// Silent fallback — Credential Management API is best-effort
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Attempt to load credentials from the browser's native password manager.
|
|
56
|
+
* Returns the deserialized Credentials, or undefined if unavailable.
|
|
57
|
+
*/
|
|
58
|
+
export async function loadFromNative(connectionId) {
|
|
59
|
+
try {
|
|
60
|
+
if (typeof PasswordCredential === 'undefined' || !navigator.credentials?.get)
|
|
61
|
+
return undefined;
|
|
62
|
+
const credential = await navigator.credentials.get({
|
|
63
|
+
password: true,
|
|
64
|
+
mediation: 'silent'
|
|
65
|
+
});
|
|
66
|
+
if (!credential || credential.type !== 'password')
|
|
67
|
+
return undefined;
|
|
68
|
+
const pc = credential;
|
|
69
|
+
if (pc.id !== connectionId || !pc.password)
|
|
70
|
+
return undefined;
|
|
71
|
+
const parsed = JSON.parse(pc.password);
|
|
72
|
+
if (parsed.type === 'sigv4' || parsed.type === 'sas-token')
|
|
73
|
+
return parsed;
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
// Silent fallback
|
|
77
|
+
}
|
|
78
|
+
return undefined;
|
|
79
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { FileEntry } from '../types.js';
|
|
2
|
+
export type SortField = 'name' | 'size' | 'modified' | 'extension';
|
|
3
|
+
export type SortDirection = 'asc' | 'desc';
|
|
4
|
+
export interface SortConfig {
|
|
5
|
+
field: SortField;
|
|
6
|
+
direction: SortDirection;
|
|
7
|
+
}
|
|
8
|
+
export declare const fileStore: {
|
|
9
|
+
readonly entries: FileEntry[];
|
|
10
|
+
readonly currentPath: string;
|
|
11
|
+
readonly loading: boolean;
|
|
12
|
+
readonly error: string | null;
|
|
13
|
+
readonly sortConfig: SortConfig;
|
|
14
|
+
setFiles(entries: FileEntry[]): void;
|
|
15
|
+
setPath(path: string): void;
|
|
16
|
+
setLoading(state: boolean): void;
|
|
17
|
+
setError(message: string | null): void;
|
|
18
|
+
sort(field: SortField): void;
|
|
19
|
+
};
|
|
20
|
+
export { fileStore as files };
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
function sortEntries(entries, config) {
|
|
2
|
+
const sorted = [...entries];
|
|
3
|
+
const dir = config.direction === 'asc' ? 1 : -1;
|
|
4
|
+
sorted.sort((a, b) => {
|
|
5
|
+
// Directories always come first
|
|
6
|
+
if (a.is_dir && !b.is_dir)
|
|
7
|
+
return -1;
|
|
8
|
+
if (!a.is_dir && b.is_dir)
|
|
9
|
+
return 1;
|
|
10
|
+
switch (config.field) {
|
|
11
|
+
case 'name':
|
|
12
|
+
return dir * a.name.localeCompare(b.name, undefined, { sensitivity: 'base' });
|
|
13
|
+
case 'size':
|
|
14
|
+
return dir * (a.size - b.size);
|
|
15
|
+
case 'modified':
|
|
16
|
+
return dir * (a.modified - b.modified);
|
|
17
|
+
case 'extension':
|
|
18
|
+
return dir * a.extension.localeCompare(b.extension, undefined, { sensitivity: 'base' });
|
|
19
|
+
default:
|
|
20
|
+
return 0;
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
return sorted;
|
|
24
|
+
}
|
|
25
|
+
function createFilesStore() {
|
|
26
|
+
let files = $state([]);
|
|
27
|
+
let currentPath = $state('');
|
|
28
|
+
let loading = $state(false);
|
|
29
|
+
let error = $state(null);
|
|
30
|
+
let sortConfig = $state({ field: 'name', direction: 'asc' });
|
|
31
|
+
return {
|
|
32
|
+
get entries() {
|
|
33
|
+
return files;
|
|
34
|
+
},
|
|
35
|
+
get currentPath() {
|
|
36
|
+
return currentPath;
|
|
37
|
+
},
|
|
38
|
+
get loading() {
|
|
39
|
+
return loading;
|
|
40
|
+
},
|
|
41
|
+
get error() {
|
|
42
|
+
return error;
|
|
43
|
+
},
|
|
44
|
+
get sortConfig() {
|
|
45
|
+
return sortConfig;
|
|
46
|
+
},
|
|
47
|
+
setFiles(entries) {
|
|
48
|
+
files = sortEntries(entries, sortConfig);
|
|
49
|
+
error = null;
|
|
50
|
+
},
|
|
51
|
+
setPath(path) {
|
|
52
|
+
currentPath = path;
|
|
53
|
+
},
|
|
54
|
+
setLoading(state) {
|
|
55
|
+
loading = state;
|
|
56
|
+
},
|
|
57
|
+
setError(message) {
|
|
58
|
+
error = message;
|
|
59
|
+
},
|
|
60
|
+
sort(field) {
|
|
61
|
+
if (sortConfig.field === field) {
|
|
62
|
+
// Toggle direction if clicking the same field
|
|
63
|
+
sortConfig = {
|
|
64
|
+
field,
|
|
65
|
+
direction: sortConfig.direction === 'asc' ? 'desc' : 'asc'
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
sortConfig = { field, direction: 'asc' };
|
|
70
|
+
}
|
|
71
|
+
files = sortEntries(files, sortConfig);
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
export const fileStore = createFilesStore();
|
|
76
|
+
export { fileStore as files };
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface QueryHistoryEntry {
|
|
2
|
+
id: string;
|
|
3
|
+
sql: string;
|
|
4
|
+
timestamp: number;
|
|
5
|
+
durationMs: number;
|
|
6
|
+
rowCount: number;
|
|
7
|
+
error?: string;
|
|
8
|
+
connectionId?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare const queryHistory: {
|
|
11
|
+
readonly entries: QueryHistoryEntry[];
|
|
12
|
+
add(entry: Omit<QueryHistoryEntry, "id">): void;
|
|
13
|
+
remove(id: string): void;
|
|
14
|
+
clear(): void;
|
|
15
|
+
search(query: string): QueryHistoryEntry[];
|
|
16
|
+
};
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
const STORAGE_KEY = 'obstore-explore-query-history';
|
|
2
|
+
const MAX_ENTRIES = 200;
|
|
3
|
+
function loadEntries() {
|
|
4
|
+
if (typeof window === 'undefined')
|
|
5
|
+
return [];
|
|
6
|
+
try {
|
|
7
|
+
const raw = localStorage.getItem(STORAGE_KEY);
|
|
8
|
+
if (raw)
|
|
9
|
+
return JSON.parse(raw);
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
// ignore parse errors
|
|
13
|
+
}
|
|
14
|
+
return [];
|
|
15
|
+
}
|
|
16
|
+
function persistEntries(entries) {
|
|
17
|
+
if (typeof window === 'undefined')
|
|
18
|
+
return;
|
|
19
|
+
try {
|
|
20
|
+
localStorage.setItem(STORAGE_KEY, JSON.stringify(entries));
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
// ignore storage errors
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function createQueryHistoryStore() {
|
|
27
|
+
let entries = $state(loadEntries());
|
|
28
|
+
function save() {
|
|
29
|
+
persistEntries(entries);
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
get entries() {
|
|
33
|
+
return entries;
|
|
34
|
+
},
|
|
35
|
+
add(entry) {
|
|
36
|
+
const newEntry = {
|
|
37
|
+
...entry,
|
|
38
|
+
id: crypto.randomUUID()
|
|
39
|
+
};
|
|
40
|
+
entries = [newEntry, ...entries].slice(0, MAX_ENTRIES);
|
|
41
|
+
save();
|
|
42
|
+
},
|
|
43
|
+
remove(id) {
|
|
44
|
+
entries = entries.filter((e) => e.id !== id);
|
|
45
|
+
save();
|
|
46
|
+
},
|
|
47
|
+
clear() {
|
|
48
|
+
entries = [];
|
|
49
|
+
save();
|
|
50
|
+
},
|
|
51
|
+
search(query) {
|
|
52
|
+
const q = query.toLowerCase();
|
|
53
|
+
return entries.filter((e) => e.sql.toLowerCase().includes(q));
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
export const queryHistory = createQueryHistoryStore();
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
const SAFELOCK_KEY = 'obstore-explore-safelock';
|
|
2
|
+
function createSafeLockStore() {
|
|
3
|
+
let locked = $state(true);
|
|
4
|
+
let initialized = $state(false);
|
|
5
|
+
async function init() {
|
|
6
|
+
if (initialized)
|
|
7
|
+
return;
|
|
8
|
+
try {
|
|
9
|
+
const raw = localStorage.getItem(SAFELOCK_KEY);
|
|
10
|
+
if (raw !== null) {
|
|
11
|
+
locked = JSON.parse(raw);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
// ignore
|
|
16
|
+
}
|
|
17
|
+
initialized = true;
|
|
18
|
+
}
|
|
19
|
+
function persist() {
|
|
20
|
+
try {
|
|
21
|
+
localStorage.setItem(SAFELOCK_KEY, JSON.stringify(locked));
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
// ignore
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function lock() {
|
|
28
|
+
locked = true;
|
|
29
|
+
persist();
|
|
30
|
+
}
|
|
31
|
+
function unlock() {
|
|
32
|
+
locked = false;
|
|
33
|
+
persist();
|
|
34
|
+
}
|
|
35
|
+
function toggle() {
|
|
36
|
+
locked = !locked;
|
|
37
|
+
persist();
|
|
38
|
+
}
|
|
39
|
+
return {
|
|
40
|
+
get locked() {
|
|
41
|
+
return locked;
|
|
42
|
+
},
|
|
43
|
+
get initialized() {
|
|
44
|
+
return initialized;
|
|
45
|
+
},
|
|
46
|
+
init,
|
|
47
|
+
lock,
|
|
48
|
+
unlock,
|
|
49
|
+
toggle
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
export const safeLock = createSafeLockStore();
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type Locale } from '../i18n/index.svelte.js';
|
|
2
|
+
import type { Theme } from '../types.js';
|
|
3
|
+
export declare const settings: {
|
|
4
|
+
readonly theme: Theme;
|
|
5
|
+
readonly resolved: "light" | "dark";
|
|
6
|
+
readonly locale: Locale;
|
|
7
|
+
readonly featureLimit: number;
|
|
8
|
+
setTheme(t: Theme): void;
|
|
9
|
+
setLocale(l: Locale): void;
|
|
10
|
+
setFeatureLimit(n: number): void;
|
|
11
|
+
};
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { setLocale } from '../i18n/index.svelte.js';
|
|
2
|
+
const SETTINGS_KEY = 'obstore-explore-settings';
|
|
3
|
+
function loadSettings() {
|
|
4
|
+
if (typeof window === 'undefined') {
|
|
5
|
+
return { theme: 'system', locale: 'en', featureLimit: 1000 };
|
|
6
|
+
}
|
|
7
|
+
try {
|
|
8
|
+
const raw = localStorage.getItem(SETTINGS_KEY);
|
|
9
|
+
if (raw) {
|
|
10
|
+
const parsed = JSON.parse(raw);
|
|
11
|
+
return {
|
|
12
|
+
theme: parsed.theme ?? 'system',
|
|
13
|
+
locale: parsed.locale ?? 'en',
|
|
14
|
+
featureLimit: parsed.featureLimit ?? 100
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
// ignore parse errors
|
|
20
|
+
}
|
|
21
|
+
return { theme: 'system', locale: 'en', featureLimit: 1000 };
|
|
22
|
+
}
|
|
23
|
+
function persistSettings(settings) {
|
|
24
|
+
if (typeof window === 'undefined')
|
|
25
|
+
return;
|
|
26
|
+
try {
|
|
27
|
+
localStorage.setItem(SETTINGS_KEY, JSON.stringify(settings));
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
// ignore storage errors
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function resolveTheme(theme) {
|
|
34
|
+
if (theme !== 'system')
|
|
35
|
+
return theme;
|
|
36
|
+
if (typeof window === 'undefined')
|
|
37
|
+
return 'light';
|
|
38
|
+
return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
|
|
39
|
+
}
|
|
40
|
+
function createSettingsStore() {
|
|
41
|
+
const initial = loadSettings();
|
|
42
|
+
let theme = $state(initial.theme);
|
|
43
|
+
let locale = $state(initial.locale);
|
|
44
|
+
let featureLimit = $state(initial.featureLimit);
|
|
45
|
+
let resolved = $state(resolveTheme(initial.theme));
|
|
46
|
+
// Sync i18n module and document dir with persisted locale
|
|
47
|
+
setLocale(initial.locale);
|
|
48
|
+
if (typeof document !== 'undefined') {
|
|
49
|
+
const dir = initial.locale === 'ar' ? 'rtl' : 'ltr';
|
|
50
|
+
document.documentElement.dir = dir;
|
|
51
|
+
document.documentElement.lang = initial.locale;
|
|
52
|
+
}
|
|
53
|
+
function persist() {
|
|
54
|
+
persistSettings({ theme, locale, featureLimit });
|
|
55
|
+
}
|
|
56
|
+
function applyTheme(t) {
|
|
57
|
+
theme = t;
|
|
58
|
+
resolved = resolveTheme(t);
|
|
59
|
+
persist();
|
|
60
|
+
if (typeof document !== 'undefined') {
|
|
61
|
+
document.documentElement.classList.toggle('dark', resolved === 'dark');
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
function applyLocale(l) {
|
|
65
|
+
locale = l;
|
|
66
|
+
setLocale(l);
|
|
67
|
+
persist();
|
|
68
|
+
if (typeof document !== 'undefined') {
|
|
69
|
+
const dir = l === 'ar' ? 'rtl' : 'ltr';
|
|
70
|
+
document.documentElement.dir = dir;
|
|
71
|
+
document.documentElement.lang = l;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// System theme changes are handled by the $effect in +layout.svelte
|
|
75
|
+
// which properly cleans up the listener. No module-level listener needed.
|
|
76
|
+
return {
|
|
77
|
+
get theme() {
|
|
78
|
+
return theme;
|
|
79
|
+
},
|
|
80
|
+
get resolved() {
|
|
81
|
+
return resolved;
|
|
82
|
+
},
|
|
83
|
+
get locale() {
|
|
84
|
+
return locale;
|
|
85
|
+
},
|
|
86
|
+
get featureLimit() {
|
|
87
|
+
return featureLimit;
|
|
88
|
+
},
|
|
89
|
+
setTheme(t) {
|
|
90
|
+
applyTheme(t);
|
|
91
|
+
},
|
|
92
|
+
setLocale(l) {
|
|
93
|
+
applyLocale(l);
|
|
94
|
+
},
|
|
95
|
+
setFeatureLimit(n) {
|
|
96
|
+
featureLimit = n;
|
|
97
|
+
persist();
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
export const settings = createSettingsStore();
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tab resource registry — deterministic cleanup for viewer resources.
|
|
3
|
+
*
|
|
4
|
+
* Viewers register cleanup callbacks (abort controllers, map instances,
|
|
5
|
+
* cached data) when they mount. The tab store calls `dispose(tabId)`
|
|
6
|
+
* on close so resources are freed immediately instead of relying on
|
|
7
|
+
* garbage collection.
|
|
8
|
+
*/
|
|
9
|
+
type CleanupFn = () => void | Promise<void>;
|
|
10
|
+
export declare const tabResources: {
|
|
11
|
+
/**
|
|
12
|
+
* Register a cleanup callback for a tab.
|
|
13
|
+
* Returns an unregister function (useful in $effect cleanup).
|
|
14
|
+
*/
|
|
15
|
+
register(tabId: string, cleanup: CleanupFn): () => void;
|
|
16
|
+
/** Dispose all resources for a single tab. */
|
|
17
|
+
dispose(tabId: string): Promise<void>;
|
|
18
|
+
/** Dispose all resources except for the given tab. */
|
|
19
|
+
disposeAllExcept(keepTabId: string): Promise<void>;
|
|
20
|
+
/** Dispose every registered tab. */
|
|
21
|
+
disposeAll(): Promise<void>;
|
|
22
|
+
/** Check if a tab has any registered resources. */
|
|
23
|
+
has(tabId: string): boolean;
|
|
24
|
+
};
|
|
25
|
+
export {};
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tab resource registry — deterministic cleanup for viewer resources.
|
|
3
|
+
*
|
|
4
|
+
* Viewers register cleanup callbacks (abort controllers, map instances,
|
|
5
|
+
* cached data) when they mount. The tab store calls `dispose(tabId)`
|
|
6
|
+
* on close so resources are freed immediately instead of relying on
|
|
7
|
+
* garbage collection.
|
|
8
|
+
*/
|
|
9
|
+
function createTabResourceRegistry() {
|
|
10
|
+
const registry = new Map();
|
|
11
|
+
return {
|
|
12
|
+
/**
|
|
13
|
+
* Register a cleanup callback for a tab.
|
|
14
|
+
* Returns an unregister function (useful in $effect cleanup).
|
|
15
|
+
*/
|
|
16
|
+
register(tabId, cleanup) {
|
|
17
|
+
if (!registry.has(tabId)) {
|
|
18
|
+
registry.set(tabId, []);
|
|
19
|
+
}
|
|
20
|
+
registry.get(tabId).push(cleanup);
|
|
21
|
+
return () => {
|
|
22
|
+
const fns = registry.get(tabId);
|
|
23
|
+
if (fns) {
|
|
24
|
+
const idx = fns.indexOf(cleanup);
|
|
25
|
+
if (idx !== -1)
|
|
26
|
+
fns.splice(idx, 1);
|
|
27
|
+
if (fns.length === 0)
|
|
28
|
+
registry.delete(tabId);
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
},
|
|
32
|
+
/** Dispose all resources for a single tab. */
|
|
33
|
+
async dispose(tabId) {
|
|
34
|
+
const fns = registry.get(tabId);
|
|
35
|
+
if (!fns)
|
|
36
|
+
return;
|
|
37
|
+
registry.delete(tabId);
|
|
38
|
+
const results = await Promise.allSettled(fns.map((fn) => fn()));
|
|
39
|
+
for (const r of results) {
|
|
40
|
+
if (r.status === 'rejected') {
|
|
41
|
+
console.warn('[tab-resources] cleanup error for tab', tabId, r.reason);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
/** Dispose all resources except for the given tab. */
|
|
46
|
+
async disposeAllExcept(keepTabId) {
|
|
47
|
+
const entries = [...registry.entries()].filter(([id]) => id !== keepTabId);
|
|
48
|
+
await Promise.allSettled(entries.map(([id]) => this.dispose(id)));
|
|
49
|
+
},
|
|
50
|
+
/** Dispose every registered tab. */
|
|
51
|
+
async disposeAll() {
|
|
52
|
+
const ids = [...registry.keys()];
|
|
53
|
+
await Promise.allSettled(ids.map((id) => this.dispose(id)));
|
|
54
|
+
},
|
|
55
|
+
/** Check if a tab has any registered resources. */
|
|
56
|
+
has(tabId) {
|
|
57
|
+
return registry.has(tabId);
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
export const tabResources = createTabResourceRegistry();
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Tab } from '../types.js';
|
|
2
|
+
export declare const tabStore: {
|
|
3
|
+
readonly items: Tab[];
|
|
4
|
+
readonly activeTabId: string | null;
|
|
5
|
+
readonly active: Tab | undefined;
|
|
6
|
+
/**
|
|
7
|
+
* Tabs that should be kept alive in the DOM (mounted but hidden if inactive).
|
|
8
|
+
* Returns up to MAX_ALIVE tabs in MRU order. The active tab is always included.
|
|
9
|
+
*/
|
|
10
|
+
readonly aliveTabs: Tab[];
|
|
11
|
+
open(tab: Tab): void;
|
|
12
|
+
close(id: string): Promise<void>;
|
|
13
|
+
closeOthers(id: string): Promise<void>;
|
|
14
|
+
setActive(id: string): void;
|
|
15
|
+
update(id: string, partial: Partial<Omit<Tab, "id">>): void;
|
|
16
|
+
};
|
|
17
|
+
export { tabStore as tabs };
|