From d872e429e4d71153e95b6e254e35642d17e1820a Mon Sep 17 00:00:00 2001 From: "Adrian Alfred C. Bonpin" Date: Tue, 28 Jul 2026 19:01:00 +0800 Subject: [PATCH] feat: initial Gridline implementation (#1) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: configure Tailwind, Vitest, Rust deps, dialog plugin (Task 1) * feat: shared types and validation/filter utilities (Task 2) * feat: Rust models, SQLite store, and migrations (Task 3) * feat: Tauri commands for connections and folders (Task 4) * feat: tag, settings, import/export Tauri commands (Task 5) * feat: frontend command wrappers and Zustand stores (Task 6) * feat: useSearch debounce and useFilteredConnections hooks (Task 7) * feat: App view router with load-on-mount (Task 8) * feat: UI primitives Button, Input, Badge, Card (Task 9) * feat: SearchBar, ActionRow, ImportExportMenu (Task 10) * feat: ConnectionCard, ConnectionGrid, TagBadge (Task 11) * fix: resolve TypeScript errors across utils, Input, and test files * feat: FolderTree, CreateFolderDialog, NewConnectionForm, SettingsPage, HomeScreen (Task 12) * feat: Tauri file dialog integration for import/export (Task 13) * feat: error/loading states and full App router integration (Task 14) * chore: final integration gate — full test + build green (Task 15) * fix: move folders inline, rearrange ActionRow layout, add borders to buttons * feat: upgrade to Tailwind v4, apply new color palette * Landing page restyle, folder explorer, selection/delete, and icon update - Black-and-white color scheme with blue accent - Glassmorphic New Folder modal with auto-parent - Nested folder explorer with breadcrumb navigation - Folder/connection selection with hover checkboxes - Select All / Clear Selection / Delete dropdown - Delete reparents children to parent folder - Fixed Rust serde camelCase mismatch (models now use snake_case) - Updated app icons from Apple Icon Composer exports - Search bar with ⌘K badge - Button styling: rounded pills, borders, cursor-pointer - Prevent drag selection across app * Tag system, folder edit/delete, searchable tag picker, delete confirmation, tag reordering - Added folder_tags table for folder-tag associations - Tags now show configured colors on folder and connection cards - Searchable tag picker with text filtering in New/Edit Folder dialogs - Edit Folder dialog with name and tag management - Edit/Delete buttons next to breadcrumb with icons - Delete confirmation dialog with reparenting notice - Tag reordering in Settings with up/down buttons, persisted via tag_order setting - useSortedTags hook for consistent tag ordering - Cmd+K focuses search input - Selection dropdown simplified to Select All/Clear/Delete - Click-outside closes all dropdowns - cursor-pointer on all interactables * deps: install motion for animations * feat(types): add system theme option * feat(settings): default stored theme to system * feat(ui): add Toggle primitive * feat(ui): add Select primitive * feat(ui): add SettingsRow and SettingsSection primitives * fix(ui): improve SettingsRow and SettingsSection quality * feat(ui): add ThemePicker primitive * feat(ui): add AnimatedModal primitive with motion * refactor(dialogs): use AnimatedModal for enter/exit animations * fix(dialogs): ensure exit animations and Escape handling work with AnimatedModal * feat(settings): redesign page with multi-section layout * refactor(settings): split tabs, improve accessibility and animation * fix(tauri): set window background color to dark canvas * fix(settings): remove fake traffic lights, add header background, transparent title bar * fix(settings): move Back into sidebar, add Settings heading, dynamic window title * fix(tauri): show native window title so Home/Settings labels are visible * fix(ui): disable overscroll on both axes * test(dialogs): verify CreateFolderDialog shows and saves tags * chore: ignore .worktrees directory * refactor: centralize db type icons and labels * feat: add connection string parser and detection * test: add edge cases for connection string parser * fix: preserve absolute paths in SQLite connection strings * types: add new connection form fields * feat: add folder path label helper * test: cover missing folder in path label helper * feat: add stub connection string parse and test commands * feat: add stub test connection command * feat: add new connection form primitives * feat: add connection form shell * feat: add shared form type and simple connection form * fix: keep SimpleConnectionForm fully controlled * style: format and tighten types for simple connection form * feat: add detailed connection form * fix: export DetailedConnectionFormProps and assert port update * feat: add new connection screen container * fix: clean up useEffect dependencies in new connection screen * fix: address quality feedback on new connection screen * feat: wire new connection screen into app and remove old form * feat: open new connection screen from pasted db url in search * test: add home search URL shortcut integration test * refactor: replace FolderSelect and EnvironmentSelect with shared SelectDropdown Add a reusable SelectDropdown component that keeps the select-styled trigger while using the ActionRow-style popover menu. Update both FolderSelect and EnvironmentSelect to use it. * refactor: remove db type icon and label from connection form shell Drop DbTypeHeader and the db_type prop from ConnectionFormShell so the form header no longer displays the database icon/type. Update NewConnectionScreen and its test accordingly. * feat: home screen redesign and connection form updates - Redesign HomeScreen layout and settings page - Update connection card, grid, and simple form - Replace selects with SelectDropdown component - Remove DbTypeHeader from connection form - Fix tests to match updated components * fix: hide folders during search, update placeholder, and set window titles - ConnectionGrid now hides folders when hasSearch is true so only matching connections are shown. - SearchBar placeholder now mentions typing a database URL to create a new connection. - App window titles set to Gridline (home), Settings, and New Connection. * fix: shorter placeholder, dynamic window title, and startup flash - Shorten SearchBar placeholder to mention DB URL creation concisely. - Add core:window:allow-set-title permission and set document.title so the window title updates per view (Gridline, Settings, New Connection). - Add inline dark background style to index.html to prevent white flash before CSS loads. * feat: extend connection models with SSH/SSL/database fields, add db_viewer models (Task 1a) * feat: extend frontend types with SSH/SSL fields and DB viewer types (Task 1b) * feat: migrate connections table with SSH/SSL columns (Task 1c) * chore: add new Rust dependencies (tokio, sqlx, redis, ssh2, indexmap, etc.) for Phase 2 * feat: connection pool manager with LRU eviction (Task 2a) * feat: schema introspection query builders for PG, MySQL, SQLite (Task 2b) * feat: test connection command (all 4 DB types) and SSH tunnel manager (Task 2c) * feat: db viewer Rust commands and AppState refactor (Task 2d) * feat: frontend command wrappers for DB viewer and updated validation (Task 3a) * feat: dbViewer store with tabs, changes queue, pagination; uiStore activeConnectionId (Task 3b) * feat: ConnectionCard navigates to DB Viewer, App routes to DbViewerScreen (Task 3c) * feat: tooltip UI primitive (Task 4a) * feat: SSH/SSL form tabs in DetailedConnectionForm (Task 4b) * feat: DbViewerScreen shell with sidebar navigation (Task 4c) * feat: toolbar, table tree, and overflow menu (Task 4d) * fix: align TableInfo interface between frontend types and test files * feat: tab bar, data grid, and pagination controls (Task 4e) * feat: changes queue panel with cancel per change (Task 4f) * feat: wire real IPC connect/disconnect/load in DbViewerScreen (Task 5a) * feat: error banner, guard dialogs for destructive actions (Task 5b) * feat: changes queue commit all with per-change IPC and error handling (Task 5c) * chore: suppress expected dead-code warnings during multi-phase development * fix: wire ConnectionCard click through to DB Viewer (HomeScreen -> ConnectionGrid -> ConnectionCard -> App route) * fix: click connection opens DB viewer when nothing selected, toggles selection when items already selected; fix delete connections + generic confirm message * fix: align ConnectionTestResult field name (ok vs success) and fix testConnection invoke param name (input vs config) to match Rust backend * feat: implement DB Viewer Tauri commands (db_connect, get_databases, etc.) * fix: align DB viewer IPC param names (snake_case), implement execute_change + refresh_connection, snake_case Change enum tags * fix: use camelCase IPC keys for multi-word Tauri command params (Tauri v2 converts snake_case Rust -> camelCase) * fix: surface full postgres error detail and redact credentials instead of opaque 'db error'; URL-encode pg connection strings * fix: cache passwords per-session so saved connections can auto-connect; surface full postgres error detail * fix: auto-fetch table data, full-row click, fill viewport, load columns on expand, database switching * fix: align ColumnInfo/QueryResult types with Rust backend (columns=ColumnInfo[], rows=unknown[][], field names match) * feat: truncate cell text, resizable columns with drag handles, tab bar no-wrap horizontal scroll * fix: QueryResult uses total_rows/page/page_size (match Rust), brighter table borders, pagination NaN fix * fix: table horizontal scrolling, viewport fills screen height (h-screen), remove clipping overflow-hidden * fix: constrain layout to viewport with overflow-hidden on content column; flex-1 fills height; sidebar+grid scroll independently * fix: move overflow-hidden down to grid wrapper so DataGrid scrollbars surface properly * fix: add min-w-0 to DataGrid wrapper so flexbox allows shrinking for horizontal scroll * fix: add overflow-hidden to flex row and right column to clip at viewport, DataGrid scrolls inside * fix: use w-0 on right column to force width:0 flex-basis, preventing any content-based expansion * fix: overscroll-contain on DataGrid and TableTree scroll areas to prevent bounce * fix: inline overscroll-behavior:none + WebkitOverflowScrolling:auto for reliable macOS bounce prevention * feat: page-size selector (50/100/200) in pagination bar, setPageSize resets to page 1 and triggers re-fetch * fix: column resize with refs, FK cell click opens table with filter, vertical borders, tooltip positioning (right/bottom), sidebar transparent bg * fix: sidebar bg-canvas, remove overflow-hidden from toolbar parent so dropdown tooltips aren't clipped * chore: rename sidebar label from DB Viewer to Explorer * feat: resizable table panel (180-600px) with drag handle on right edge * feat: double-click panel resize handle resets to default 280px * feat: column visibility dropdown in filter bar, max column width 800px, double-click resets column width * fix: enforce column width on th cells, remove min-width:100% so columns stay at set width instead of stretching * fix: removable resize handle always clickable (remove opacity-0), maxWidth+overflow on th/td to prevent column blowout * feat: add environment label to connections (production/staging/development) with badge on cards * feat: OS keychain integration for connection passwords via tauri-plugin-keyring-store * style: monospace font for table data cells * style: use Space Mono (font-heading) for table data cells * feat: unified table controls bar (insert, refresh, auto-refresh, filter modal, sort modal, export, columns, pagination); fix pagination setPage not clearing data * fix: auto-refresh defaults to off, click opens dropdown to pick interval * fix: pagination/refresh keeps existing data visible, shows subtle loading bar instead of blank * fix: new tabs start with loading:true so auto-fetch triggers instead of stuck on 'loading table data' * feat: checkbox column for row selection (header=all, row=individual, selected state tracks indices) * feat: selected row count in toolbar with clear button * feat: bulk actions dropdown on selection (Copy JSON, Copy CSV, Copy SQL INSERT, Delete rows) * docs: add changes-queue-before-execution rule to AGENTS.md guardrails * docs: broaden CRUD guardrail to cover all destructive operations (DB data via queue, app entities via confirm dialog) * feat: auto-create demo SQLite DB on first launch with sample e-commerce schema (users, products, orders, order_items) * fix: demo DB startup panic (state before manage), add settings: re-add demo, table refresh rate, table page size * feat: Cmd+W closes tab or navigates home, edit connection modal with update_connection backend, action queue button with count badge and dropdown * fix: columns button icon-only, wire settings.table_page_size and table_refresh_rate to actual table behavior * feat: shortcuts settings tab showing all keyboard shortcuts (Cmd+K, Cmd+W, Esc, Enter, Space, click, header checkbox) * feat: editable keyboard shortcuts - click pencil to record new keybinding, persisted to settings, useShortcut hook for dynamic binding * feat: add Tags & Env tab to edit connection modal (environment, folder, tag picker) * feat(db-viewer): UX polish - cursor pointers, icon-only toolbar, top border - Add cursor-pointer to all interactive elements across db-viewer components - Simplify TableControls: Filter/Sort/Export show icons only with tooltips - Add border-t to DbViewerScreen for visual separation from window frame * fix(db-viewer): style EditConnectionModal, fix test connection, working refresh button - Match EditConnectionModal styling to home screen modals (AnimatedModal, Button, no dividers) - Fix test connection sending null password by fetching from keychain first - Make refresh database button functional with success/error visual feedback and spin animation * feat(db-viewer): compact ghost-style DB/schema dropdowns in single row - Add variant prop to SelectDropdown (pill | ghost) for minimal text-only style - Place DB and schema dropdowns side-by-side on one row with | separator * fix(db-viewer): proper FK/enum detection and improved schema tree display Rust backend: - PostgreSQL: fix column query to detect FKs (was hardcoded false) and map USER-DEFINED types to udt_name for enum display - SQLite: use PRAGMA table_info for types/PK/NOT NULL/defaults and PRAGMA foreign_key_list for FK detection Frontend: - FK columns show orange key icon in TableTree - Data type abbreviations (varchar, int, bool, timestamptz, etc.) with full type name on hover tooltip - Column icons use shrink-0 to maintain size * feat(db-viewer): PK/FK icons and shorthand types in DataGrid headers * fix(db-viewer): fix NULL values for UUID and timestamp columns, FK underline style - Add uuid::Uuid, chrono types to pg_value_to_json chain so UUID PKs/FKs and timestamp columns display correctly instead of NULL - Enable with-serde_json-1 feature on tokio-postgres - Change FK cell styling from blue text to dotted underline * feat(db-viewer): FK preview popover with inline filter - Replace direct FK navigation with popover showing the referenced row - New get_fk_preview Rust command fetches single row by column value - FkPreviewPopover component displays columns with PK/FK icons - 'Open' button creates filtered tab, visible in existing Filter UI - Consolidate columnFilter into filterRules (no duplicate filter logic) * feat(db-viewer): selectable cell text, JSON/JSONB popover with formatted/raw views - Add select-text to cell contents for copy support - New JsonCellPopover component with Formatted/Raw tabs and copy button - JSON/JSONB columns show brief preview ({ N keys } / [ N items ]) - Click JSON cells to open popover with pretty-printed or raw output * feat(db-viewer): smart default sort adds newest-first sorting automatically - 12-tier priority system detects recency/ordering columns - Prefers updated_at, created_at, *_at suffixes, last_* prefixes - Falls back to timestamp types, numeric IDs, sequence/position cols - Also covers rank, version, count/quantity columns - Applied once per tab, visible in Sort dropdown for manual override * feat(db-viewer): search tables input with slide animation and tree filtering - Search icon in toolbar toggles animated input with slide-down effect - Filters TableTree by table name as user types - Clean border-bottom styling, search icon on left, X clear on right - Auto-hides on blur when empty, stays when content present - Search icon highlights when active * docs: add comprehensive implementation status to AGENTS.md - Status matrix across 6 areas: connections, home, db viewer, object explorer, query editor, backup/restore, settings, onboarding - Covers 60+ features with ✅/🟡/❌ markers and details - Identifies remaining work: query editor, object explorer, virtualized grid, MySQL browsing, SSH tunnels, backup/restore --- .gitignore | 2 + AGENTS.md | 127 + bun.lock | 580 ++ index.html | 6 +- package.json | 67 +- src-tauri/Cargo.lock | 6718 +++++++++++++++++ src-tauri/Cargo.toml | 16 + src-tauri/capabilities/default.json | 6 +- src-tauri/icons/128x128.png | Bin 3512 -> 12453 bytes src-tauri/icons/128x128@2x.png | Bin 7012 -> 33921 bytes src-tauri/icons/32x32.png | Bin 974 -> 2089 bytes src-tauri/icons/64x64.png | Bin 0 -> 4991 bytes src-tauri/icons/Square107x107Logo.png | Bin 2863 -> 10022 bytes src-tauri/icons/Square142x142Logo.png | Bin 3858 -> 15203 bytes src-tauri/icons/Square150x150Logo.png | Bin 3966 -> 16363 bytes src-tauri/icons/Square284x284Logo.png | Bin 7737 -> 42084 bytes src-tauri/icons/Square30x30Logo.png | Bin 903 -> 1934 bytes src-tauri/icons/Square310x310Logo.png | Bin 8591 -> 50268 bytes src-tauri/icons/Square44x44Logo.png | Bin 1299 -> 3064 bytes src-tauri/icons/Square71x71Logo.png | Bin 2011 -> 5852 bytes src-tauri/icons/Square89x89Logo.png | Bin 2468 -> 7650 bytes src-tauri/icons/StoreLogo.png | Bin 1523 -> 3563 bytes src-tauri/icons/icon.icns | Bin 98451 -> 652354 bytes src-tauri/icons/icon.ico | Bin 86642 -> 48638 bytes src-tauri/icons/icon.png | Bin 14183 -> 102661 bytes src-tauri/icons/icon.svg | 32 + src-tauri/src/commands/connections.rs | 219 + src-tauri/src/commands/db_viewer.rs | 1250 +++ src-tauri/src/commands/demo.rs | 220 + src-tauri/src/commands/folders.rs | 136 + src-tauri/src/commands/import_export.rs | 184 + src-tauri/src/commands/keychain.rs | 40 + src-tauri/src/commands/mod.rs | 10 + src-tauri/src/commands/settings.rs | 50 + src-tauri/src/commands/ssh.rs | 179 + src-tauri/src/commands/tags.rs | 88 + src-tauri/src/commands/test_connection.rs | 439 ++ src-tauri/src/db/introspection.rs | 385 + src-tauri/src/db/mod.rs | 5 + src-tauri/src/db/pool.rs | 264 + src-tauri/src/lib.rs | 78 +- src-tauri/src/models/connection.rs | 136 + src-tauri/src/models/db_viewer.rs | 194 + src-tauri/src/models/folder.rs | 18 + src-tauri/src/models/mod.rs | 12 + src-tauri/src/models/settings.rs | 15 + src-tauri/src/models/tag.rs | 15 + src-tauri/src/store/migrations.rs | 188 + src-tauri/src/store/mod.rs | 742 ++ src-tauri/tauri.conf.json | 7 +- src/App.css | 116 - src/App.test.tsx | 71 + src/App.tsx | 132 +- src/assets/react.svg | 1 - .../connections/ConnectionCard.test.tsx | 68 + src/components/connections/ConnectionCard.tsx | 100 + .../connections/ConnectionFormShell.tsx | 70 + .../connections/ConnectionGrid.test.tsx | 69 + src/components/connections/ConnectionGrid.tsx | 202 + .../connections/ConnectionStringInput.tsx | 24 + .../DetailedConnectionForm.test.tsx | 54 + .../connections/DetailedConnectionForm.tsx | 56 + .../connections/EnvironmentSelect.tsx | 31 + src/components/connections/FolderSelect.tsx | 28 + .../connections/GeneralTab.test.tsx | 39 + src/components/connections/GeneralTab.tsx | 95 + .../connections/NewConnectionScreen.test.tsx | 140 + .../connections/NewConnectionScreen.tsx | 193 + src/components/connections/PasswordInput.tsx | 37 + .../connections/SimpleConnectionForm.test.tsx | 81 + .../connections/SimpleConnectionForm.tsx | 84 + src/components/connections/SshFields.test.tsx | 46 + src/components/connections/SshFields.tsx | 119 + src/components/connections/SshSslTab.test.tsx | 41 + src/components/connections/SshSslTab.tsx | 39 + src/components/connections/SslFields.test.tsx | 38 + src/components/connections/SslFields.tsx | 114 + src/components/connections/TagsEnvTab.tsx | 51 + .../connections/connectionFormData.ts | 17 + .../db-viewer/ChangesQueuePanel.test.tsx | 46 + .../db-viewer/ChangesQueuePanel.tsx | 199 + .../db-viewer/ConnectionDropBanner.test.tsx | 56 + .../db-viewer/ConnectionDropBanner.tsx | 35 + src/components/db-viewer/DataGrid.test.tsx | 79 + src/components/db-viewer/DataGrid.tsx | 339 + .../db-viewer/DbViewerScreen.test.tsx | 20 + src/components/db-viewer/DbViewerScreen.tsx | 408 + .../db-viewer/DbViewerSidebar.test.tsx | 41 + src/components/db-viewer/DbViewerSidebar.tsx | 57 + .../db-viewer/DbViewerToolbar.test.tsx | 54 + src/components/db-viewer/DbViewerToolbar.tsx | 195 + .../db-viewer/EditConnectionModal.tsx | 123 + src/components/db-viewer/FkPreviewPopover.tsx | 211 + src/components/db-viewer/JsonCellPopover.tsx | 163 + src/components/db-viewer/TabBar.test.tsx | 55 + src/components/db-viewer/TabBar.tsx | 60 + src/components/db-viewer/TableControls.tsx | 875 +++ .../db-viewer/TableOverflowMenu.test.tsx | 37 + .../db-viewer/TableOverflowMenu.tsx | 140 + src/components/db-viewer/TableTree.test.tsx | 39 + src/components/db-viewer/TableTree.tsx | 114 + .../folders/CreateFolderDialog.test.tsx | 85 + src/components/folders/CreateFolderDialog.tsx | 90 + .../folders/EditFolderDialog.test.tsx | 60 + src/components/folders/EditFolderDialog.tsx | 81 + .../folders/FolderBreadcrumb.test.tsx | 37 + src/components/folders/FolderBreadcrumb.tsx | 40 + src/components/folders/FolderTree.test.tsx | 34 + src/components/folders/FolderTree.tsx | 41 + src/components/layout/ActionRow.test.tsx | 29 + src/components/layout/ActionRow.tsx | 95 + src/components/layout/HomeScreen.test.tsx | 48 + src/components/layout/HomeScreen.tsx | 215 + src/components/layout/ImportExportMenu.tsx | 42 + src/components/search/SearchBar.test.tsx | 31 + src/components/search/SearchBar.tsx | 50 + .../settings/AdvancedSettingsTab.tsx | 69 + .../settings/GeneralSettingsTab.tsx | 129 + src/components/settings/SettingsPage.test.tsx | 246 + src/components/settings/SettingsPage.tsx | 137 + .../settings/ShortcutsSettingsTab.tsx | 172 + src/components/settings/TagsSettingsTab.tsx | 223 + src/components/tags/SearchableTagPicker.tsx | 56 + src/components/tags/TagBadge.test.tsx | 24 + src/components/tags/TagBadge.tsx | 20 + src/components/ui/AnimatedModal.test.tsx | 41 + src/components/ui/AnimatedModal.tsx | 53 + src/components/ui/Badge.test.tsx | 19 + src/components/ui/Badge.tsx | 18 + src/components/ui/Button.test.tsx | 23 + src/components/ui/Button.tsx | 20 + src/components/ui/Card.tsx | 13 + src/components/ui/ConfirmDialog.test.tsx | 57 + src/components/ui/ConfirmDialog.tsx | 27 + src/components/ui/ErrorBanner.test.tsx | 23 + src/components/ui/ErrorBanner.tsx | 14 + src/components/ui/Input.test.tsx | 17 + src/components/ui/Input.tsx | 27 + src/components/ui/Select.test.tsx | 26 + src/components/ui/Select.tsx | 40 + src/components/ui/SelectDropdown.test.tsx | 33 + src/components/ui/SelectDropdown.tsx | 90 + src/components/ui/SettingsRow.test.tsx | 42 + src/components/ui/SettingsRow.tsx | 21 + src/components/ui/SettingsSection.test.tsx | 25 + src/components/ui/SettingsSection.tsx | 17 + src/components/ui/ThemePicker.test.tsx | 13 + src/components/ui/ThemePicker.tsx | 41 + src/components/ui/Toast.tsx | 41 + src/components/ui/Toggle.test.tsx | 23 + src/components/ui/Toggle.tsx | 32 + src/components/ui/Tooltip.test.tsx | 45 + src/components/ui/Tooltip.tsx | 112 + src/hooks/useConnections.ts | 29 + src/hooks/useDbConnection.ts | 117 + src/hooks/useSearch.test.ts | 37 + src/hooks/useSearch.ts | 12 + src/hooks/useShortcut.ts | 45 + src/hooks/useSortedTags.ts | 22 + src/index.css | 48 + src/lib/commands.test.ts | 50 + src/lib/commands.ts | 99 + src/lib/connectionString.test.ts | 126 + src/lib/connectionString.ts | 71 + src/lib/dbIcons.ts | 15 + src/lib/environment.ts | 13 + src/lib/importExport.test.ts | 55 + src/lib/importExport.ts | 24 + src/lib/types.test.ts | 361 + src/lib/types.ts | 188 + src/lib/utils.test.ts | 305 + src/lib/utils.ts | 132 + src/main.tsx | 1 + src/stores/connectionStore.test.ts | 61 + src/stores/connectionStore.ts | 119 + src/stores/dbViewerStore.test.ts | 182 + src/stores/dbViewerStore.ts | 256 + src/stores/notificationStore.ts | 27 + src/stores/settingsStore.test.ts | 26 + src/stores/settingsStore.ts | 26 + src/stores/uiStore.test.ts | 50 + src/stores/uiStore.ts | 45 + src/test/setup.ts | 1 + src/test/smoke.test.tsx | 10 + vite.config.ts | 3 +- vitest.config.ts | 12 + 186 files changed, 23311 insertions(+), 194 deletions(-) create mode 100644 bun.lock create mode 100644 src-tauri/Cargo.lock create mode 100644 src-tauri/icons/64x64.png create mode 100644 src-tauri/icons/icon.svg create mode 100644 src-tauri/src/commands/connections.rs create mode 100644 src-tauri/src/commands/db_viewer.rs create mode 100644 src-tauri/src/commands/demo.rs create mode 100644 src-tauri/src/commands/folders.rs create mode 100644 src-tauri/src/commands/import_export.rs create mode 100644 src-tauri/src/commands/keychain.rs create mode 100644 src-tauri/src/commands/mod.rs create mode 100644 src-tauri/src/commands/settings.rs create mode 100644 src-tauri/src/commands/ssh.rs create mode 100644 src-tauri/src/commands/tags.rs create mode 100644 src-tauri/src/commands/test_connection.rs create mode 100644 src-tauri/src/db/introspection.rs create mode 100644 src-tauri/src/db/mod.rs create mode 100644 src-tauri/src/db/pool.rs create mode 100644 src-tauri/src/models/connection.rs create mode 100644 src-tauri/src/models/db_viewer.rs create mode 100644 src-tauri/src/models/folder.rs create mode 100644 src-tauri/src/models/mod.rs create mode 100644 src-tauri/src/models/settings.rs create mode 100644 src-tauri/src/models/tag.rs create mode 100644 src-tauri/src/store/migrations.rs create mode 100644 src-tauri/src/store/mod.rs delete mode 100644 src/App.css create mode 100644 src/App.test.tsx delete mode 100644 src/assets/react.svg create mode 100644 src/components/connections/ConnectionCard.test.tsx create mode 100644 src/components/connections/ConnectionCard.tsx create mode 100644 src/components/connections/ConnectionFormShell.tsx create mode 100644 src/components/connections/ConnectionGrid.test.tsx create mode 100644 src/components/connections/ConnectionGrid.tsx create mode 100644 src/components/connections/ConnectionStringInput.tsx create mode 100644 src/components/connections/DetailedConnectionForm.test.tsx create mode 100644 src/components/connections/DetailedConnectionForm.tsx create mode 100644 src/components/connections/EnvironmentSelect.tsx create mode 100644 src/components/connections/FolderSelect.tsx create mode 100644 src/components/connections/GeneralTab.test.tsx create mode 100644 src/components/connections/GeneralTab.tsx create mode 100644 src/components/connections/NewConnectionScreen.test.tsx create mode 100644 src/components/connections/NewConnectionScreen.tsx create mode 100644 src/components/connections/PasswordInput.tsx create mode 100644 src/components/connections/SimpleConnectionForm.test.tsx create mode 100644 src/components/connections/SimpleConnectionForm.tsx create mode 100644 src/components/connections/SshFields.test.tsx create mode 100644 src/components/connections/SshFields.tsx create mode 100644 src/components/connections/SshSslTab.test.tsx create mode 100644 src/components/connections/SshSslTab.tsx create mode 100644 src/components/connections/SslFields.test.tsx create mode 100644 src/components/connections/SslFields.tsx create mode 100644 src/components/connections/TagsEnvTab.tsx create mode 100644 src/components/connections/connectionFormData.ts create mode 100644 src/components/db-viewer/ChangesQueuePanel.test.tsx create mode 100644 src/components/db-viewer/ChangesQueuePanel.tsx create mode 100644 src/components/db-viewer/ConnectionDropBanner.test.tsx create mode 100644 src/components/db-viewer/ConnectionDropBanner.tsx create mode 100644 src/components/db-viewer/DataGrid.test.tsx create mode 100644 src/components/db-viewer/DataGrid.tsx create mode 100644 src/components/db-viewer/DbViewerScreen.test.tsx create mode 100644 src/components/db-viewer/DbViewerScreen.tsx create mode 100644 src/components/db-viewer/DbViewerSidebar.test.tsx create mode 100644 src/components/db-viewer/DbViewerSidebar.tsx create mode 100644 src/components/db-viewer/DbViewerToolbar.test.tsx create mode 100644 src/components/db-viewer/DbViewerToolbar.tsx create mode 100644 src/components/db-viewer/EditConnectionModal.tsx create mode 100644 src/components/db-viewer/FkPreviewPopover.tsx create mode 100644 src/components/db-viewer/JsonCellPopover.tsx create mode 100644 src/components/db-viewer/TabBar.test.tsx create mode 100644 src/components/db-viewer/TabBar.tsx create mode 100644 src/components/db-viewer/TableControls.tsx create mode 100644 src/components/db-viewer/TableOverflowMenu.test.tsx create mode 100644 src/components/db-viewer/TableOverflowMenu.tsx create mode 100644 src/components/db-viewer/TableTree.test.tsx create mode 100644 src/components/db-viewer/TableTree.tsx create mode 100644 src/components/folders/CreateFolderDialog.test.tsx create mode 100644 src/components/folders/CreateFolderDialog.tsx create mode 100644 src/components/folders/EditFolderDialog.test.tsx create mode 100644 src/components/folders/EditFolderDialog.tsx create mode 100644 src/components/folders/FolderBreadcrumb.test.tsx create mode 100644 src/components/folders/FolderBreadcrumb.tsx create mode 100644 src/components/folders/FolderTree.test.tsx create mode 100644 src/components/folders/FolderTree.tsx create mode 100644 src/components/layout/ActionRow.test.tsx create mode 100644 src/components/layout/ActionRow.tsx create mode 100644 src/components/layout/HomeScreen.test.tsx create mode 100644 src/components/layout/HomeScreen.tsx create mode 100644 src/components/layout/ImportExportMenu.tsx create mode 100644 src/components/search/SearchBar.test.tsx create mode 100644 src/components/search/SearchBar.tsx create mode 100644 src/components/settings/AdvancedSettingsTab.tsx create mode 100644 src/components/settings/GeneralSettingsTab.tsx create mode 100644 src/components/settings/SettingsPage.test.tsx create mode 100644 src/components/settings/SettingsPage.tsx create mode 100644 src/components/settings/ShortcutsSettingsTab.tsx create mode 100644 src/components/settings/TagsSettingsTab.tsx create mode 100644 src/components/tags/SearchableTagPicker.tsx create mode 100644 src/components/tags/TagBadge.test.tsx create mode 100644 src/components/tags/TagBadge.tsx create mode 100644 src/components/ui/AnimatedModal.test.tsx create mode 100644 src/components/ui/AnimatedModal.tsx create mode 100644 src/components/ui/Badge.test.tsx create mode 100644 src/components/ui/Badge.tsx create mode 100644 src/components/ui/Button.test.tsx create mode 100644 src/components/ui/Button.tsx create mode 100644 src/components/ui/Card.tsx create mode 100644 src/components/ui/ConfirmDialog.test.tsx create mode 100644 src/components/ui/ConfirmDialog.tsx create mode 100644 src/components/ui/ErrorBanner.test.tsx create mode 100644 src/components/ui/ErrorBanner.tsx create mode 100644 src/components/ui/Input.test.tsx create mode 100644 src/components/ui/Input.tsx create mode 100644 src/components/ui/Select.test.tsx create mode 100644 src/components/ui/Select.tsx create mode 100644 src/components/ui/SelectDropdown.test.tsx create mode 100644 src/components/ui/SelectDropdown.tsx create mode 100644 src/components/ui/SettingsRow.test.tsx create mode 100644 src/components/ui/SettingsRow.tsx create mode 100644 src/components/ui/SettingsSection.test.tsx create mode 100644 src/components/ui/SettingsSection.tsx create mode 100644 src/components/ui/ThemePicker.test.tsx create mode 100644 src/components/ui/ThemePicker.tsx create mode 100644 src/components/ui/Toast.tsx create mode 100644 src/components/ui/Toggle.test.tsx create mode 100644 src/components/ui/Toggle.tsx create mode 100644 src/components/ui/Tooltip.test.tsx create mode 100644 src/components/ui/Tooltip.tsx create mode 100644 src/hooks/useConnections.ts create mode 100644 src/hooks/useDbConnection.ts create mode 100644 src/hooks/useSearch.test.ts create mode 100644 src/hooks/useSearch.ts create mode 100644 src/hooks/useShortcut.ts create mode 100644 src/hooks/useSortedTags.ts create mode 100644 src/index.css create mode 100644 src/lib/commands.test.ts create mode 100644 src/lib/commands.ts create mode 100644 src/lib/connectionString.test.ts create mode 100644 src/lib/connectionString.ts create mode 100644 src/lib/dbIcons.ts create mode 100644 src/lib/environment.ts create mode 100644 src/lib/importExport.test.ts create mode 100644 src/lib/importExport.ts create mode 100644 src/lib/types.test.ts create mode 100644 src/lib/types.ts create mode 100644 src/lib/utils.test.ts create mode 100644 src/lib/utils.ts create mode 100644 src/stores/connectionStore.test.ts create mode 100644 src/stores/connectionStore.ts create mode 100644 src/stores/dbViewerStore.test.ts create mode 100644 src/stores/dbViewerStore.ts create mode 100644 src/stores/notificationStore.ts create mode 100644 src/stores/settingsStore.test.ts create mode 100644 src/stores/settingsStore.ts create mode 100644 src/stores/uiStore.test.ts create mode 100644 src/stores/uiStore.ts create mode 100644 src/test/setup.ts create mode 100644 src/test/smoke.test.tsx create mode 100644 vitest.config.ts diff --git a/.gitignore b/.gitignore index 036fd6d..3234e8f 100644 --- a/.gitignore +++ b/.gitignore @@ -26,8 +26,10 @@ dist-ssr # AI .pi/ .superpowers/ +docs/superpowers/ # Env .env.* .env !.env.example +.worktrees/ diff --git a/AGENTS.md b/AGENTS.md index af7027f..8bb1ee1 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -169,12 +169,139 @@ cargo test # Rust tests - **Do NOT** render large query results in raw DOM — always use the virtualized grid component - **Do NOT** log credentials, connection strings, or query data - **Do NOT** introduce Electron, Node.js server processes, or Docker dependencies +- **Do NOT** execute data-modifying SQL (INSERT, UPDATE, DELETE, DROP, ALTER) or any destructive CRUD operation (deleting connections, folders, tags) directly without explicit user confirmation. For database data, always push to the changes queue first and require "Commit All". For app entities (connections, folders, tags), show a confirmation dialog before executing. - **DO** keep Tauri commands thin — business logic lives in `db/` and `store/` modules - **DO** type all IPC boundaries explicitly - **DO** validate and sanitize all user-provided SQL and connection parameters before execution --- +## Implementation Status + +✅ = Complete   🟡 = Partial/Stub   ❌ = Not Started + +### Connection Management +| Feature | Status | Details | +| :--- | :---: | :--- | +| Connections CRUD (PostgreSQL, MySQL, SQLite, Redis) | ✅ | Full create/read/update/delete with form validation | +| Connection testing (all DB types) | ✅ | PostgreSQL, MySQL, SQLite, Redis all testable | +| DB Viewer: PostgreSQL browse + query | ✅ | Schemas, tables, paginated data, FK preview, JSON viewer | +| DB Viewer: SQLite browse + query | ✅ | Full support via rusqlite | +| DB Viewer: MySQL browse | ❌ | Test connection works; browsing not wired | +| DB Viewer: Redis browse | ❌ | Test connection works; browsing not wired | +| Password storage in OS keychain | ✅ | macOS Keychain, Linux Secret Service, Windows Credential Manager | +| SSH tunnel config UI | ✅ | Host, port, user, auth method, key path, passphrase fields | +| SSH tunnel runtime | 🟡 | UI exists; backend is a **placeholder** (TODO: ssh2 crate integration) | +| SSL/TLS config UI | ✅ | Mode (disable/require/verify-ca/verify-full), cert paths | +| SSL/TLS runtime | 🟡 | Config persisted; **not yet passed to sqlx/tokio-postgres** | + +### Home Screen & Organization +| Feature | Status | Details | +| :--- | :---: | :--- | +| Connection cards grid (by folder) | ✅ | Grouped display, single-click to open DB viewer | +| Folders CRUD | ✅ | Nested folders, reparent on delete, breadcrumb nav | +| Tags CRUD | ✅ | Colors, drag reorder, filter connections by tag | +| DB type filter (Postgres/MySQL/SQLite/Redis) | ✅ | Toggle chips to filter connection grid | +| Global search (Cmd+K) | ✅ | Connection URL detection auto-fills new-connection form | +| Import/Export connections (JSON) | ✅ | Bulk import with validation, skipped-record reporting | +| Bulk select + delete connections/folders | ✅ | Checkbox selection with confirmation dialog | +| Drag-and-drop connections to folders | ❌ | Currently only via edit form | +| Move-to-folder bulk action | ❌ | | +| Favorites / Recent connections | ❌ | | +| Connection status indicator on cards | ❌ | | + +### Database Viewer +| Feature | Status | Details | +| :--- | :---: | :--- | +| Multi-tab table browser | ✅ | Open tables in tabs, close with Cmd/Ctrl+W | +| Schema/database selector | ✅ | Ghost-style dropdowns, single-row layout | +| Refresh database (spin + success/error feedback) | ✅ | Re-fetches databases, schemas, and tables | +| Search tables filter | ✅ | Animated input, real-time filter by name, auto-hide on blur | +| Column metadata (PK, FK, type, nullable, default) | ✅ | Expand table row to see columns with icons | +| FK detection | ✅ | `information_schema.constraint_column_usage` + `PRAGMA foreign_key_list` | +| FK preview popover | ✅ | Click FK cell → popover with referenced row → "Open" button creates filtered tab | +| JSON/JSONB cell popover | ✅ | Formatted/Raw tabs with copy button | +| Smart default sort | ✅ | 12-tier priority: updated_at → created_at → *_at → *_id → seq/rank/version | +| Data grid pagination | ✅ | Page nav, page size selector persisted in settings | +| Column filtering (client-side) | ✅ | eq, neq, contains, starts, ends, gt, lt, null, notnull | +| Column sorting (client-side) | ✅ | Multi-column asc/desc | +| Column show/hide | ✅ | Toggle visibility per column | +| Column resize (drag handle) | ✅ | Double-click to auto-fit | +| Row selection (checkboxes + select all) | ✅ | Bulk copy (JSON/CSV/SQL) and delete | +| Export toolbar (JSON, CSV, SQL, Markdown) | ✅ | Client-side Blob download of visible rows | +| Auto-refresh timer | ✅ | Configurable interval in settings | +| Changes queue (INSERT, UPDATE, DELETE) | ✅ | Queue changes → Commit All; cancel individual changes | +| Edit connection modal (from DB viewer) | ✅ | AnimatedModal with keychain password fetch on test | +| Connection drop banner | ✅ | Auto-detects broken connections with reconnect prompt | +| Inline cell editing | ❌ | Cells are read-only; changes via queue Insert button only | +| Virtualized data grid | ❌ | Plain HTML ``; TODO: @tanstack/react-virtual for 100k+ rows | +| Row detail / expandable row view | ❌ | | +| Keyboard cell navigation (arrow keys, Tab) | ❌ | | +| Cell-level copy (right-click or Ctrl+C) | ❌ | Only bulk copy via toolbar | + +### Object Explorer (non-table objects) +| Feature | Status | Details | +| :--- | :---: | :--- | +| Functions | ❌ | Stub button in sidebar; not queried from `pg_proc` | +| Triggers | ❌ | Stub button in sidebar | +| Sequences | ❌ | Not listed anywhere | +| Enums / user-defined types | ❌ | `udt_name` returned in column metadata but no enum viewer | +| Extensions | ❌ | Not queried from `pg_extension` | +| Indexes (per table) | ❌ | | +| Constraints (CHECK, UNIQUE beyond PK/FK) | ❌ | | +| Materialized views | ❌ | Not distinguished from regular views | +| Stored procedures | ❌ | | +| Schema visualizer (ER diagram) | ❌ | Stub button in sidebar | + +### Query Editor +| Feature | Status | Details | +| :--- | :---: | :--- | +| SQL text editor (Monaco) | ❌ | `src/components/editor/` does not exist yet | +| SQL autocomplete (keywords, tables, columns) | ❌ | | +| Custom query execution (arbitrary SQL) | ❌ | Only `SELECT * FROM table` via tab open | +| Multiple result sets | ❌ | | +| Query history / recent queries | ❌ | No persistence or UI | +| Saved queries (named, organized) | ❌ | No `queries` table in local SQLite | +| Query favorites / pinning | ❌ | | +| Editor settings (font, tab size, word wrap, minimap) | ❌ | Settings page has "Editor" tab with "coming soon" placeholder | + +### Backup & Restore +| Feature | Status | Details | +| :--- | :---: | :--- | +| pg_dump wrapper | ❌ | No Rust command; shell out to system binary per design decision #3 | +| pg_restore wrapper | ❌ | | +| Backup UI | ❌ | | +| DB-to-DB sync | ❌ | | +| SQLite .dump | ❌ | | +| Table structure export (DDL) | ❌ | | + +### Settings +| Feature | Status | Details | +| :--- | :---: | :--- | +| Theme (dark/light/system) | ✅ | Tailwind dark-first with ThemePicker | +| Font size | ✅ | | +| Default folder for new connections | ✅ | | +| Table page size default | ✅ | | +| Auto-refresh rate | ✅ | | +| Tags management | ✅ | Full CRUD with color picker, drag reorder | +| Shortcuts (2 configurable) | ✅ | Open command palette, Close tab | +| Confirm-before-delete toggle | ✅ | | +| Default ports per DB type | ✅ | | +| More keyboard shortcuts | ❌ | Only 2 configurable actions | +| Editor settings | ❌ | Placeholder tab | +| SSH key management | ❌ | Only path inputs, no key file reading | +| Settings export/import | ❌ | | + +### Demo & Onboarding +| Feature | Status | Details | +| :--- | :---: | :--- | +| Demo SQLite database (auto-seeded) | ✅ | users, products, orders, order_items tables | +| Re-add demo DB button | ✅ | Settings → Advanced | +| Getting started / onboarding flow | ❌ | | +| Welcome tooltips / tour | ❌ | | + +--- + ## Related Documents - [Tauri 2.0 Documentation](https://tauri.app/develop/) diff --git a/bun.lock b/bun.lock new file mode 100644 index 0000000..1a80624 --- /dev/null +++ b/bun.lock @@ -0,0 +1,580 @@ +{ + "lockfileVersion": 1, + "configVersion": 1, + "workspaces": { + "": { + "name": "gridline", + "dependencies": { + "@fontsource/outfit": "^5.3.0", + "@fontsource/space-mono": "^5.3.0", + "@tailwindcss/vite": "^4.3.3", + "@tauri-apps/api": "^2", + "@tauri-apps/plugin-dialog": "^2.7.2", + "@tauri-apps/plugin-fs": "^2.5.1", + "@tauri-apps/plugin-opener": "^2", + "lucide-react": "^1.26.0", + "motion": "^12.42.2", + "react": "^19.1.0", + "react-dom": "^19.1.0", + "tauri-plugin-keyring-store-api": "^0.2.0", + "zustand": "^5.0.14", + }, + "devDependencies": { + "@tauri-apps/cli": "^2", + "@testing-library/jest-dom": "^7.0.0", + "@testing-library/react": "^16.3.2", + "@testing-library/user-event": "^14.6.1", + "@types/react": "^19.1.8", + "@types/react-dom": "^19.1.6", + "@vitejs/plugin-react": "^4.6.0", + "jsdom": "^29.1.1", + "typescript": "~5.8.3", + "vite": "^7.0.4", + "vitest": "^4.1.10", + }, + }, + }, + "packages": { + "@adobe/css-tools": ["@adobe/css-tools@4.5.0", "", {}, "sha512-6OzddxPio9UiWTCemp4N8cYLV2ZN1ncRnV1cVGtve7dhPOtRkleRyx32GQCYSwDYgaHU3USMm84tNsvKzRCa1Q=="], + + "@asamuzakjp/css-color": ["@asamuzakjp/css-color@5.1.11", "", { "dependencies": { "@asamuzakjp/generational-cache": "^1.0.1", "@csstools/css-calc": "^3.2.0", "@csstools/css-color-parser": "^4.1.0", "@csstools/css-parser-algorithms": "^4.0.0", "@csstools/css-tokenizer": "^4.0.0" } }, "sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg=="], + + "@asamuzakjp/dom-selector": ["@asamuzakjp/dom-selector@7.1.1", "", { "dependencies": { "@asamuzakjp/generational-cache": "^1.0.1", "@asamuzakjp/nwsapi": "^2.3.9", "bidi-js": "^1.0.3", "css-tree": "^3.2.1", "is-potential-custom-element-name": "^1.0.1" } }, "sha512-67RZDnYRc8H/8MLDgQCDE//zoqVFwajkepHZgmXrbwybzXOEwOWGPYGmALYl9J2DOLfFPPs6kKCqmbzV895hTQ=="], + + "@asamuzakjp/generational-cache": ["@asamuzakjp/generational-cache@1.0.1", "", {}, "sha512-wajfB8KqzMCN2KGNFdLkReeHncd0AslUSrvHVvvYWuU8ghncRJoA50kT3zP9MVL0+9g4/67H+cdvBskj9THPzg=="], + + "@asamuzakjp/nwsapi": ["@asamuzakjp/nwsapi@2.3.9", "", {}, "sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q=="], + + "@babel/code-frame": ["@babel/code-frame@7.29.7", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw=="], + + "@babel/compat-data": ["@babel/compat-data@7.29.7", "", {}, "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg=="], + + "@babel/core": ["@babel/core@7.29.7", "", { "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.7", "@babel/helper-compilation-targets": "^7.29.7", "@babel/helper-module-transforms": "^7.29.7", "@babel/helpers": "^7.29.7", "@babel/parser": "^7.29.7", "@babel/template": "^7.29.7", "@babel/traverse": "^7.29.7", "@babel/types": "^7.29.7", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA=="], + + "@babel/generator": ["@babel/generator@7.29.7", "", { "dependencies": { "@babel/parser": "^7.29.7", "@babel/types": "^7.29.7", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ=="], + + "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.29.7", "", { "dependencies": { "@babel/compat-data": "^7.29.7", "@babel/helper-validator-option": "^7.29.7", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g=="], + + "@babel/helper-globals": ["@babel/helper-globals@7.29.7", "", {}, "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA=="], + + "@babel/helper-module-imports": ["@babel/helper-module-imports@7.29.7", "", { "dependencies": { "@babel/traverse": "^7.29.7", "@babel/types": "^7.29.7" } }, "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g=="], + + "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.29.7", "", { "dependencies": { "@babel/helper-module-imports": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7", "@babel/traverse": "^7.29.7" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg=="], + + "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.29.7", "", {}, "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw=="], + + "@babel/helper-string-parser": ["@babel/helper-string-parser@7.29.7", "", {}, "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw=="], + + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="], + + "@babel/helper-validator-option": ["@babel/helper-validator-option@7.29.7", "", {}, "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw=="], + + "@babel/helpers": ["@babel/helpers@7.29.7", "", { "dependencies": { "@babel/template": "^7.29.7", "@babel/types": "^7.29.7" } }, "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg=="], + + "@babel/parser": ["@babel/parser@7.29.7", "", { "dependencies": { "@babel/types": "^7.29.7" }, "bin": "./bin/babel-parser.js" }, "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg=="], + + "@babel/plugin-transform-react-jsx-self": ["@babel/plugin-transform-react-jsx-self@7.29.7", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw=="], + + "@babel/plugin-transform-react-jsx-source": ["@babel/plugin-transform-react-jsx-source@7.29.7", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q=="], + + "@babel/runtime": ["@babel/runtime@7.29.7", "", {}, "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw=="], + + "@babel/template": ["@babel/template@7.29.7", "", { "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/parser": "^7.29.7", "@babel/types": "^7.29.7" } }, "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg=="], + + "@babel/traverse": ["@babel/traverse@7.29.7", "", { "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.7", "@babel/helper-globals": "^7.29.7", "@babel/parser": "^7.29.7", "@babel/template": "^7.29.7", "@babel/types": "^7.29.7", "debug": "^4.3.1" } }, "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw=="], + + "@babel/types": ["@babel/types@7.29.7", "", { "dependencies": { "@babel/helper-string-parser": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7" } }, "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA=="], + + "@bramus/specificity": ["@bramus/specificity@2.4.2", "", { "dependencies": { "css-tree": "^3.0.0" }, "bin": { "specificity": "bin/cli.js" } }, "sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw=="], + + "@csstools/color-helpers": ["@csstools/color-helpers@6.1.0", "", {}, "sha512-064IFJdjTfUqnjpCVpMOdbr8FLQBhinbZj6yRv2An2E41O/pLEXqfFRWqGq/SxlE5PEUYTlvWsG2r8MswAVvkg=="], + + "@csstools/css-calc": ["@csstools/css-calc@3.3.0", "", { "peerDependencies": { "@csstools/css-parser-algorithms": "^4.0.0", "@csstools/css-tokenizer": "^4.0.0" } }, "sha512-c5ihYsPkdG6JCkU2zTMm4+k6r7RXuGxtWYhu5DHMIiF1FHzrfmHL5so11AoFpUv/tu61xfcmT4AmKoFfMPoqdQ=="], + + "@csstools/css-color-parser": ["@csstools/css-color-parser@4.1.10", "", { "dependencies": { "@csstools/color-helpers": "^6.1.0", "@csstools/css-calc": "^3.3.0" }, "peerDependencies": { "@csstools/css-parser-algorithms": "^4.0.0", "@csstools/css-tokenizer": "^4.0.0" } }, "sha512-UZhQLIUyJaaMepqehrCODwCg2KW25vFvLWBmqYFaPclYvvxzj/sG8LBOhBFCp11i9uE7t1EyS+RAoV9tztPFyw=="], + + "@csstools/css-parser-algorithms": ["@csstools/css-parser-algorithms@4.0.0", "", { "peerDependencies": { "@csstools/css-tokenizer": "^4.0.0" } }, "sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w=="], + + "@csstools/css-syntax-patches-for-csstree": ["@csstools/css-syntax-patches-for-csstree@1.1.7", "", { "peerDependencies": { "css-tree": "^3.2.1" }, "optionalPeers": ["css-tree"] }, "sha512-fQ+05118eQS1cofO3aJpB5efgpBZMvIzwr/sbC8kDLVA5XLG8q1kJV5yzrUAI1f7lvhPnm8fgIjzFB8/O/5Dig=="], + + "@csstools/css-tokenizer": ["@csstools/css-tokenizer@4.0.0", "", {}, "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA=="], + + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.28.1", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ=="], + + "@esbuild/android-arm": ["@esbuild/android-arm@0.28.1", "", { "os": "android", "cpu": "arm" }, "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ=="], + + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.28.1", "", { "os": "android", "cpu": "arm64" }, "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg=="], + + "@esbuild/android-x64": ["@esbuild/android-x64@0.28.1", "", { "os": "android", "cpu": "x64" }, "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng=="], + + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.28.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q=="], + + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.28.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ=="], + + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.28.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw=="], + + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.28.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ=="], + + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.28.1", "", { "os": "linux", "cpu": "arm" }, "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ=="], + + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.28.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g=="], + + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.28.1", "", { "os": "linux", "cpu": "ia32" }, "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w=="], + + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.28.1", "", { "os": "linux", "cpu": "none" }, "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg=="], + + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.28.1", "", { "os": "linux", "cpu": "none" }, "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ=="], + + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.28.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ=="], + + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.28.1", "", { "os": "linux", "cpu": "none" }, "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ=="], + + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.28.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag=="], + + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.28.1", "", { "os": "linux", "cpu": "x64" }, "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA=="], + + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.28.1", "", { "os": "none", "cpu": "arm64" }, "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw=="], + + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.28.1", "", { "os": "none", "cpu": "x64" }, "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg=="], + + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.28.1", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q=="], + + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.28.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw=="], + + "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.28.1", "", { "os": "none", "cpu": "arm64" }, "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg=="], + + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.28.1", "", { "os": "sunos", "cpu": "x64" }, "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ=="], + + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.28.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA=="], + + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.28.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg=="], + + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.28.1", "", { "os": "win32", "cpu": "x64" }, "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A=="], + + "@exodus/bytes": ["@exodus/bytes@1.15.1", "", { "peerDependencies": { "@noble/hashes": "^1.8.0 || ^2.0.0" }, "optionalPeers": ["@noble/hashes"] }, "sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q=="], + + "@fontsource/outfit": ["@fontsource/outfit@5.3.0", "", {}, "sha512-0AVHzTTVJSxWDOxPKSfMeHhZeBFDU3cmgrcOb76ZEyhGo0+xgyG3GsLF3h9+X8w0IX7G4jzjJgFQEBiWdX6VgA=="], + + "@fontsource/space-mono": ["@fontsource/space-mono@5.3.0", "", {}, "sha512-FrpBMOVWn3PRdRHlrZWC55X3kZG/2BTH7SM5ZyS/bky3iKya2BturI5lk+t0RoDQL2JyHzURsVq/EisCsxpI5A=="], + + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], + + "@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="], + + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], + + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], + + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], + + "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.27", "", {}, "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA=="], + + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.62.2", "", { "os": "android", "cpu": "arm" }, "sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg=="], + + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.62.2", "", { "os": "android", "cpu": "arm64" }, "sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw=="], + + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.62.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A=="], + + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.62.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA=="], + + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.62.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw=="], + + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.62.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg=="], + + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.62.2", "", { "os": "linux", "cpu": "arm" }, "sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg=="], + + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.62.2", "", { "os": "linux", "cpu": "arm" }, "sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA=="], + + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.62.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA=="], + + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.62.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ=="], + + "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.62.2", "", { "os": "linux", "cpu": "none" }, "sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg=="], + + "@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.62.2", "", { "os": "linux", "cpu": "none" }, "sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ=="], + + "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.62.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A=="], + + "@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.62.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w=="], + + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.62.2", "", { "os": "linux", "cpu": "none" }, "sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg=="], + + "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.62.2", "", { "os": "linux", "cpu": "none" }, "sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q=="], + + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.62.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg=="], + + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.62.2", "", { "os": "linux", "cpu": "x64" }, "sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A=="], + + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.62.2", "", { "os": "linux", "cpu": "x64" }, "sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg=="], + + "@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.62.2", "", { "os": "openbsd", "cpu": "x64" }, "sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg=="], + + "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.62.2", "", { "os": "none", "cpu": "arm64" }, "sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA=="], + + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.62.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg=="], + + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.62.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q=="], + + "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.62.2", "", { "os": "win32", "cpu": "x64" }, "sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg=="], + + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.62.2", "", { "os": "win32", "cpu": "x64" }, "sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA=="], + + "@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], + + "@tailwindcss/node": ["@tailwindcss/node@4.3.3", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "enhanced-resolve": "^5.24.1", "jiti": "^2.7.0", "lightningcss": "1.32.0", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.3.3" } }, "sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg=="], + + "@tailwindcss/oxide": ["@tailwindcss/oxide@4.3.3", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.3.3", "@tailwindcss/oxide-darwin-arm64": "4.3.3", "@tailwindcss/oxide-darwin-x64": "4.3.3", "@tailwindcss/oxide-freebsd-x64": "4.3.3", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.3", "@tailwindcss/oxide-linux-arm64-gnu": "4.3.3", "@tailwindcss/oxide-linux-arm64-musl": "4.3.3", "@tailwindcss/oxide-linux-x64-gnu": "4.3.3", "@tailwindcss/oxide-linux-x64-musl": "4.3.3", "@tailwindcss/oxide-wasm32-wasi": "4.3.3", "@tailwindcss/oxide-win32-arm64-msvc": "4.3.3", "@tailwindcss/oxide-win32-x64-msvc": "4.3.3" } }, "sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA=="], + + "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.3.3", "", { "os": "android", "cpu": "arm64" }, "sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw=="], + + "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.3.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw=="], + + "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.3.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw=="], + + "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.3.3", "", { "os": "freebsd", "cpu": "x64" }, "sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw=="], + + "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3", "", { "os": "linux", "cpu": "arm" }, "sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ=="], + + "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.3.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w=="], + + "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.3.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA=="], + + "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.3.3", "", { "os": "linux", "cpu": "x64" }, "sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w=="], + + "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.3.3", "", { "os": "linux", "cpu": "x64" }, "sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img=="], + + "@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.3.3", "", { "dependencies": { "@emnapi/core": "^1.11.1", "@emnapi/runtime": "^1.11.1", "@emnapi/wasi-threads": "^1.2.2", "@napi-rs/wasm-runtime": "^1.1.4", "@tybys/wasm-util": "^0.10.2", "tslib": "^2.8.1" }, "cpu": "none" }, "sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ=="], + + "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.3.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ=="], + + "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.3.3", "", { "os": "win32", "cpu": "x64" }, "sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw=="], + + "@tailwindcss/vite": ["@tailwindcss/vite@4.3.3", "", { "dependencies": { "@tailwindcss/node": "4.3.3", "@tailwindcss/oxide": "4.3.3", "tailwindcss": "4.3.3" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7 || ^8" } }, "sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw=="], + + "@tauri-apps/api": ["@tauri-apps/api@2.11.1", "", {}, "sha512-M2FPuYND2m+wh5hfW9ZpSdxMPdEJovPBWwoHJmwUpysTYNHaOkVFN419m/K0LIgjb/7KU2vBgsUepJWugQCvAA=="], + + "@tauri-apps/cli": ["@tauri-apps/cli@2.11.4", "", { "optionalDependencies": { "@tauri-apps/cli-darwin-arm64": "2.11.4", "@tauri-apps/cli-darwin-x64": "2.11.4", "@tauri-apps/cli-linux-arm-gnueabihf": "2.11.4", "@tauri-apps/cli-linux-arm64-gnu": "2.11.4", "@tauri-apps/cli-linux-arm64-musl": "2.11.4", "@tauri-apps/cli-linux-riscv64-gnu": "2.11.4", "@tauri-apps/cli-linux-x64-gnu": "2.11.4", "@tauri-apps/cli-linux-x64-musl": "2.11.4", "@tauri-apps/cli-win32-arm64-msvc": "2.11.4", "@tauri-apps/cli-win32-ia32-msvc": "2.11.4", "@tauri-apps/cli-win32-x64-msvc": "2.11.4" }, "bin": { "tauri": "tauri.js" } }, "sha512-R8xGtMpwyetawSqm9kYOuMmEqkhUbvcUy8n0aNXIxollKBLESUu5f4Fx+64hgASYm1H+jSWq6jCW6zqTnH6hqQ=="], + + "@tauri-apps/cli-darwin-arm64": ["@tauri-apps/cli-darwin-arm64@2.11.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-1ryOF3ZhpZ/nemHV5zVwBQBz9jDGKmKPvWPADOhc83ig0P4bMc2iER4NbC6r9sjeIZ6RVQ4g3RZIYvezhcl4TQ=="], + + "@tauri-apps/cli-darwin-x64": ["@tauri-apps/cli-darwin-x64@2.11.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-uFsGQAAfuyz1k/yGLmkWfkBlgKAqZfxqlHmLWx81QU27RJWfmbNHCIq8T8w1e+VClleIuZUjpHWfoE4E3DLo3A=="], + + "@tauri-apps/cli-linux-arm-gnueabihf": ["@tauri-apps/cli-linux-arm-gnueabihf@2.11.4", "", { "os": "linux", "cpu": "arm" }, "sha512-IaHZn5CdBL21oUmjiVOS1ctw6Ip1O0pjp70FwOWmYz1myWe0SY96ZIj2FYf7pT0m8bI2h/hrs5ZbEXXh44/MkQ=="], + + "@tauri-apps/cli-linux-arm64-gnu": ["@tauri-apps/cli-linux-arm64-gnu@2.11.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-N41/ukTRVe6XSuUTESuFdGeOW2i7k62tK+6gHK5Kd5/q5RPvvi19GaWAVPPb9u95HSGmTChSolBfzynUsssFaA=="], + + "@tauri-apps/cli-linux-arm64-musl": ["@tauri-apps/cli-linux-arm64-musl@2.11.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-v277UnT/fB64xAfSroL5N3Km3tLmvATWqJJw/wRI+g6o+HkeD0slyE7gOhNs1MbjE41R7bQOTxMVoL3aomUJmw=="], + + "@tauri-apps/cli-linux-riscv64-gnu": ["@tauri-apps/cli-linux-riscv64-gnu@2.11.4", "", { "os": "linux", "cpu": "none" }, "sha512-qqgNkQ2u1yZHxjhxsZaxUtRDW8dIqIYm33rx/mzwQv0SfY9x1B+iraj8vWeFiXjjSVVhEMepXSOts1TqPzvXNQ=="], + + "@tauri-apps/cli-linux-x64-gnu": ["@tauri-apps/cli-linux-x64-gnu@2.11.4", "", { "os": "linux", "cpu": "x64" }, "sha512-2VRNWl84FOH0m2giiDkO2h0QXlcMJeX+zJDpI5kDIQAx6s+geF3v48F4DXfJez4GS/FdoDGnPnw1C2iYGbQ7bQ=="], + + "@tauri-apps/cli-linux-x64-musl": ["@tauri-apps/cli-linux-x64-musl@2.11.4", "", { "os": "linux", "cpu": "x64" }, "sha512-o9GyhYor/nc7xarmwDE3ka2szuW3uuZzXjHWh64Q8YX5AtSgxdQkFWzrY4O8KiGtVNvFBI14H3Q49Qj5TOIP/A=="], + + "@tauri-apps/cli-win32-arm64-msvc": ["@tauri-apps/cli-win32-arm64-msvc@2.11.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-ld5Ehb598m0VkYyylRPNeCFsBe/km0jxis6KgMpl3IGY6I/i1RwQXO05I1AsXUXO2WC6AvB/Lw4qTf/asiuEiQ=="], + + "@tauri-apps/cli-win32-ia32-msvc": ["@tauri-apps/cli-win32-ia32-msvc@2.11.4", "", { "os": "win32", "cpu": "ia32" }, "sha512-12Hxi0XX/H5VFxO/bGgHkFWhml9VMgEOu9CidjeCeTNQ1l6fpUlbiGgSP7CLI3PFtW9/FfbeHieZ+kyWK5H7CA=="], + + "@tauri-apps/cli-win32-x64-msvc": ["@tauri-apps/cli-win32-x64-msvc@2.11.4", "", { "os": "win32", "cpu": "x64" }, "sha512-+vDiqBIU5dMISg/wNvX3sF+ZHfgJGJ5T0AcO+EHNXV9GGAG+P5fzodlDXD3QdKCRgZxMoCm5PPvj3BqLNjBthw=="], + + "@tauri-apps/plugin-dialog": ["@tauri-apps/plugin-dialog@2.7.2", "", { "dependencies": { "@tauri-apps/api": "^2.11.0" } }, "sha512-pX0IGm1I3I6wc+zeKYcq1GSqogK6okCNX5fOdaNU5ab1AjGS6l1E5wFNjEb7meg7ZFSp0JUs+0jQGQNyOvLrsg=="], + + "@tauri-apps/plugin-fs": ["@tauri-apps/plugin-fs@2.5.1", "", { "dependencies": { "@tauri-apps/api": "^2.11.0" } }, "sha512-9Lz+Jopp6QyeEWhlpkMx4R/+P9HgR+AVAI4vOZhlT8Xaymtz8iVI/Ov984/XTqgJz/5gz5NretqPB/XEMS3NhQ=="], + + "@tauri-apps/plugin-opener": ["@tauri-apps/plugin-opener@2.5.4", "", { "dependencies": { "@tauri-apps/api": "^2.11.0" } }, "sha512-1HnPkb+AmgO29HBazm4uPLKB+r7zzcTBW1d0fyYp1uP+jwtpoiNDGKMMzz58SFp49nOIrxdE3aUJtT57lfO9CQ=="], + + "@testing-library/dom": ["@testing-library/dom@10.4.1", "", { "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", "@types/aria-query": "^5.0.1", "aria-query": "5.3.0", "dom-accessibility-api": "^0.5.9", "lz-string": "^1.5.0", "picocolors": "1.1.1", "pretty-format": "^27.0.2" } }, "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg=="], + + "@testing-library/jest-dom": ["@testing-library/jest-dom@7.0.0", "", { "dependencies": { "@adobe/css-tools": "^4.4.0", "aria-query": "^5.0.0", "css.escape": "^1.5.1", "dom-accessibility-api": "^0.6.3", "picocolors": "^1.1.1", "redent": "^3.0.0" }, "peerDependencies": { "@testing-library/dom": ">=10 <11" } }, "sha512-HKAH9C6mBo5yBG6yRO5i43L2iisencAo5z+o5P/saHUoY+miC5ivXRxHBJcFyB5ypPNxHJdK3BoF/3O4DIptMg=="], + + "@testing-library/react": ["@testing-library/react@16.3.2", "", { "dependencies": { "@babel/runtime": "^7.12.5" }, "peerDependencies": { "@testing-library/dom": "^10.0.0", "@types/react": "^18.0.0 || ^19.0.0", "@types/react-dom": "^18.0.0 || ^19.0.0", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g=="], + + "@testing-library/user-event": ["@testing-library/user-event@14.6.1", "", { "peerDependencies": { "@testing-library/dom": ">=7.21.4" } }, "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw=="], + + "@types/aria-query": ["@types/aria-query@5.0.4", "", {}, "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw=="], + + "@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="], + + "@types/babel__generator": ["@types/babel__generator@7.27.0", "", { "dependencies": { "@babel/types": "^7.0.0" } }, "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg=="], + + "@types/babel__template": ["@types/babel__template@7.4.4", "", { "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A=="], + + "@types/babel__traverse": ["@types/babel__traverse@7.28.0", "", { "dependencies": { "@babel/types": "^7.28.2" } }, "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q=="], + + "@types/chai": ["@types/chai@5.2.3", "", { "dependencies": { "@types/deep-eql": "*", "assertion-error": "^2.0.1" } }, "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA=="], + + "@types/deep-eql": ["@types/deep-eql@4.0.2", "", {}, "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw=="], + + "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], + + "@types/react": ["@types/react@19.2.17", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw=="], + + "@types/react-dom": ["@types/react-dom@19.2.3", "", { "peerDependencies": { "@types/react": "^19.2.0" } }, "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ=="], + + "@vitejs/plugin-react": ["@vitejs/plugin-react@4.7.0", "", { "dependencies": { "@babel/core": "^7.28.0", "@babel/plugin-transform-react-jsx-self": "^7.27.1", "@babel/plugin-transform-react-jsx-source": "^7.27.1", "@rolldown/pluginutils": "1.0.0-beta.27", "@types/babel__core": "^7.20.5", "react-refresh": "^0.17.0" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA=="], + + "@vitest/expect": ["@vitest/expect@4.1.10", "", { "dependencies": { "@standard-schema/spec": "^1.1.0", "@types/chai": "^5.2.2", "@vitest/spy": "4.1.10", "@vitest/utils": "4.1.10", "chai": "^6.2.2", "tinyrainbow": "^3.1.0" } }, "sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA=="], + + "@vitest/mocker": ["@vitest/mocker@4.1.10", "", { "dependencies": { "@vitest/spy": "4.1.10", "estree-walker": "^3.0.3", "magic-string": "^0.30.21" }, "peerDependencies": { "msw": "^2.4.9", "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "optionalPeers": ["msw", "vite"] }, "sha512-v0xaezt+DKEmKfaxg133ldzADrwLGd7Ze1MfQQTYfvs8OqZIwbxyxaYURivwV7sWy5fqn3rH5uOrSp07bp44Ow=="], + + "@vitest/pretty-format": ["@vitest/pretty-format@4.1.10", "", { "dependencies": { "tinyrainbow": "^3.1.0" } }, "sha512-W1HsjSH4MXQ9YfmmhLAoIYf1HRfekQCGngeIgcei6MP5QQGWUe0gkopdZQaVCFO+JDJMrAJGwa5pRpNpvy4P8Q=="], + + "@vitest/runner": ["@vitest/runner@4.1.10", "", { "dependencies": { "@vitest/utils": "4.1.10", "pathe": "^2.0.3" } }, "sha512-IKI6kpIH+LmpROplyLwBBaCfMgOZOMsygVa6BARD6ahA04VRuJSa6OaVG7kRvSEMD870Vd91rSSw0eegtWyLGg=="], + + "@vitest/snapshot": ["@vitest/snapshot@4.1.10", "", { "dependencies": { "@vitest/pretty-format": "4.1.10", "@vitest/utils": "4.1.10", "magic-string": "^0.30.21", "pathe": "^2.0.3" } }, "sha512-xRkfOT1qpTAi/Ti4Y1LtfRc3kEuqxGw59eN2jN9pRWMtS/XDevekhcFSqvQqjUNGksfjMJu3Y+oJ+4Ypn2OaJw=="], + + "@vitest/spy": ["@vitest/spy@4.1.10", "", {}, "sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw=="], + + "@vitest/utils": ["@vitest/utils@4.1.10", "", { "dependencies": { "@vitest/pretty-format": "4.1.10", "convert-source-map": "^2.0.0", "tinyrainbow": "^3.1.0" } }, "sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA=="], + + "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], + + "aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="], + + "assertion-error": ["assertion-error@2.0.1", "", {}, "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA=="], + + "baseline-browser-mapping": ["baseline-browser-mapping@2.11.3", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-sbT0Ui/CZwyAyy7icT1Gw5P1LKRlFaHwaF6tDCW5YHq2X5SeeZFphBuIagopSfwSSZq3sQcbmEL072yphxm7ew=="], + + "bidi-js": ["bidi-js@1.0.3", "", { "dependencies": { "require-from-string": "^2.0.2" } }, "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw=="], + + "browserslist": ["browserslist@4.28.7", "", { "dependencies": { "baseline-browser-mapping": "^2.10.44", "caniuse-lite": "^1.0.30001806", "electron-to-chromium": "^1.5.393", "node-releases": "^2.0.51", "update-browserslist-db": "^1.2.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-JxV13hNrFxqjOc8alRbq9dK1MM79NEXYpma2B2J4wAtpWS5zIEIKqWPGCl7N4o7Uc7B7itylh7SuDujATRyyTw=="], + + "caniuse-lite": ["caniuse-lite@1.0.30001806", "", {}, "sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw=="], + + "chai": ["chai@6.2.2", "", {}, "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg=="], + + "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], + + "css-tree": ["css-tree@3.2.1", "", { "dependencies": { "mdn-data": "2.27.1", "source-map-js": "^1.2.1" } }, "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA=="], + + "css.escape": ["css.escape@1.5.1", "", {}, "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg=="], + + "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], + + "data-urls": ["data-urls@7.0.0", "", { "dependencies": { "whatwg-mimetype": "^5.0.0", "whatwg-url": "^16.0.0" } }, "sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA=="], + + "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" }, "peerDependencies": { "supports-color": "*" }, "optionalPeers": ["supports-color"] }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + + "decimal.js": ["decimal.js@10.6.0", "", {}, "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg=="], + + "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], + + "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], + + "dom-accessibility-api": ["dom-accessibility-api@0.6.3", "", {}, "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w=="], + + "electron-to-chromium": ["electron-to-chromium@1.5.396", "", {}, "sha512-yHiw2Y3C3H9U6TMbOfoWK/BPreiOPXRfTWPBwQBoZG6/8TB6eOPnsy5oaRYuatR7Fw2SJ4kKforgufeo7fq0EQ=="], + + "enhanced-resolve": ["enhanced-resolve@5.24.3", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.3" } }, "sha512-PwKooW9JUzh5chmYfHM3IQl5OkK2u2Nm011MgeZrss3JmFraUx/fqrf78kk8GUMYoibx/14MdwTl/1WKkG7TpQ=="], + + "entities": ["entities@8.0.0", "", {}, "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA=="], + + "es-module-lexer": ["es-module-lexer@2.3.1", "", {}, "sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA=="], + + "esbuild": ["esbuild@0.28.1", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.28.1", "@esbuild/android-arm": "0.28.1", "@esbuild/android-arm64": "0.28.1", "@esbuild/android-x64": "0.28.1", "@esbuild/darwin-arm64": "0.28.1", "@esbuild/darwin-x64": "0.28.1", "@esbuild/freebsd-arm64": "0.28.1", "@esbuild/freebsd-x64": "0.28.1", "@esbuild/linux-arm": "0.28.1", "@esbuild/linux-arm64": "0.28.1", "@esbuild/linux-ia32": "0.28.1", "@esbuild/linux-loong64": "0.28.1", "@esbuild/linux-mips64el": "0.28.1", "@esbuild/linux-ppc64": "0.28.1", "@esbuild/linux-riscv64": "0.28.1", "@esbuild/linux-s390x": "0.28.1", "@esbuild/linux-x64": "0.28.1", "@esbuild/netbsd-arm64": "0.28.1", "@esbuild/netbsd-x64": "0.28.1", "@esbuild/openbsd-arm64": "0.28.1", "@esbuild/openbsd-x64": "0.28.1", "@esbuild/openharmony-arm64": "0.28.1", "@esbuild/sunos-x64": "0.28.1", "@esbuild/win32-arm64": "0.28.1", "@esbuild/win32-ia32": "0.28.1", "@esbuild/win32-x64": "0.28.1" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw=="], + + "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], + + "estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], + + "expect-type": ["expect-type@1.4.0", "", {}, "sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA=="], + + "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], + + "framer-motion": ["framer-motion@12.42.2", "", { "dependencies": { "motion-dom": "^12.42.2", "motion-utils": "^12.39.0", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-5XY9luDiu0oHfHBjpDthFMh0ES+122w6p/papSJBweMkO8Sn+PW2QaEgRblQBpWFnuvZS5qvarpt/hO2pjGmnw=="], + + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + + "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], + + "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], + + "html-encoding-sniffer": ["html-encoding-sniffer@6.0.0", "", { "dependencies": { "@exodus/bytes": "^1.6.0" } }, "sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg=="], + + "indent-string": ["indent-string@4.0.0", "", {}, "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="], + + "is-potential-custom-element-name": ["is-potential-custom-element-name@1.0.1", "", {}, "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ=="], + + "jiti": ["jiti@1.21.7", "", { "bin": { "jiti": "bin/jiti.js" } }, "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A=="], + + "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + + "jsdom": ["jsdom@29.1.1", "", { "dependencies": { "@asamuzakjp/css-color": "^5.1.11", "@asamuzakjp/dom-selector": "^7.1.1", "@bramus/specificity": "^2.4.2", "@csstools/css-syntax-patches-for-csstree": "^1.1.3", "@exodus/bytes": "^1.15.0", "css-tree": "^3.2.1", "data-urls": "^7.0.0", "decimal.js": "^10.6.0", "html-encoding-sniffer": "^6.0.0", "is-potential-custom-element-name": "^1.0.1", "lru-cache": "^11.3.5", "parse5": "^8.0.1", "saxes": "^6.0.0", "symbol-tree": "^3.2.4", "tough-cookie": "^6.0.1", "undici": "^7.25.0", "w3c-xmlserializer": "^5.0.0", "webidl-conversions": "^8.0.1", "whatwg-mimetype": "^5.0.0", "whatwg-url": "^16.0.1", "xml-name-validator": "^5.0.0" }, "peerDependencies": { "canvas": "^3.0.0" }, "optionalPeers": ["canvas"] }, "sha512-ECi4Fi2f7BdJtUKTflYRTiaMxIB0O6zfR1fX0GXpUrf6flp8QIYn1UT20YQqdSOfk2dfkCwS8LAFoJDEppNK5Q=="], + + "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], + + "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], + + "lightningcss": ["lightningcss@1.32.0", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.32.0", "lightningcss-darwin-arm64": "1.32.0", "lightningcss-darwin-x64": "1.32.0", "lightningcss-freebsd-x64": "1.32.0", "lightningcss-linux-arm-gnueabihf": "1.32.0", "lightningcss-linux-arm64-gnu": "1.32.0", "lightningcss-linux-arm64-musl": "1.32.0", "lightningcss-linux-x64-gnu": "1.32.0", "lightningcss-linux-x64-musl": "1.32.0", "lightningcss-win32-arm64-msvc": "1.32.0", "lightningcss-win32-x64-msvc": "1.32.0" } }, "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ=="], + + "lightningcss-android-arm64": ["lightningcss-android-arm64@1.32.0", "", { "os": "android", "cpu": "arm64" }, "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg=="], + + "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.32.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ=="], + + "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.32.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w=="], + + "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.32.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig=="], + + "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.32.0", "", { "os": "linux", "cpu": "arm" }, "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw=="], + + "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ=="], + + "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg=="], + + "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA=="], + + "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg=="], + + "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.32.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw=="], + + "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.32.0", "", { "os": "win32", "cpu": "x64" }, "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q=="], + + "lru-cache": ["lru-cache@11.5.2", "", {}, "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g=="], + + "lucide-react": ["lucide-react@1.26.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-raglYVR2+VkMfJL158krjVmE+rV5ST2lzA/KQm1FRSjMHT4MnWaegHxoVEpmc2So3nOEhp9oGejJwAPX8MoAjg=="], + + "lz-string": ["lz-string@1.5.0", "", { "bin": { "lz-string": "bin/bin.js" } }, "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ=="], + + "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], + + "mdn-data": ["mdn-data@2.27.1", "", {}, "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ=="], + + "min-indent": ["min-indent@1.0.1", "", {}, "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg=="], + + "motion": ["motion@12.42.2", "", { "dependencies": { "framer-motion": "^12.42.2", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-Atvv11yUKIid41cVrRBDVX5m8tF8kNpExRSlbpt6APClhDjtwQssgFHhQzejxw7/7YYbjHSPKBVbHo05BuJT5Q=="], + + "motion-dom": ["motion-dom@12.42.2", "", { "dependencies": { "motion-utils": "^12.39.0" } }, "sha512-5gIMWLp/PycBtJRJWRgjxke5n8dlvkSn2DrYW+tr3XcqAZY1xZh6BJyooJXCM8wdfM7wfMjkBJNLge1CKPUIRA=="], + + "motion-utils": ["motion-utils@12.39.0", "", {}, "sha512-8nadJAJjTtqRkmRF36FoJTrywK9nnFmnPwnSMyxaOCU7GDjN9RTMJIxx9De8ErM+vpPhMccr/6fo5WciyQLnMQ=="], + + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "nanoid": ["nanoid@3.3.16", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q=="], + + "node-releases": ["node-releases@2.0.51", "", {}, "sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ=="], + + "obug": ["obug@2.1.4", "", {}, "sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA=="], + + "parse5": ["parse5@8.0.1", "", { "dependencies": { "entities": "^8.0.0" } }, "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw=="], + + "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], + + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "picomatch": ["picomatch@4.0.5", "", {}, "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A=="], + + "postcss": ["postcss@8.5.23", "", { "dependencies": { "nanoid": "^3.3.16", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg=="], + + "pretty-format": ["pretty-format@27.5.1", "", { "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", "react-is": "^17.0.1" } }, "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ=="], + + "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], + + "react": ["react@19.2.8", "", {}, "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw=="], + + "react-dom": ["react-dom@19.2.8", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.8" } }, "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ=="], + + "react-is": ["react-is@17.0.2", "", {}, "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="], + + "react-refresh": ["react-refresh@0.17.0", "", {}, "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ=="], + + "redent": ["redent@3.0.0", "", { "dependencies": { "indent-string": "^4.0.0", "strip-indent": "^3.0.0" } }, "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg=="], + + "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], + + "rollup": ["rollup@4.62.2", "", { "dependencies": { "@types/estree": "1.0.9" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.62.2", "@rollup/rollup-android-arm64": "4.62.2", "@rollup/rollup-darwin-arm64": "4.62.2", "@rollup/rollup-darwin-x64": "4.62.2", "@rollup/rollup-freebsd-arm64": "4.62.2", "@rollup/rollup-freebsd-x64": "4.62.2", "@rollup/rollup-linux-arm-gnueabihf": "4.62.2", "@rollup/rollup-linux-arm-musleabihf": "4.62.2", "@rollup/rollup-linux-arm64-gnu": "4.62.2", "@rollup/rollup-linux-arm64-musl": "4.62.2", "@rollup/rollup-linux-loong64-gnu": "4.62.2", "@rollup/rollup-linux-loong64-musl": "4.62.2", "@rollup/rollup-linux-ppc64-gnu": "4.62.2", "@rollup/rollup-linux-ppc64-musl": "4.62.2", "@rollup/rollup-linux-riscv64-gnu": "4.62.2", "@rollup/rollup-linux-riscv64-musl": "4.62.2", "@rollup/rollup-linux-s390x-gnu": "4.62.2", "@rollup/rollup-linux-x64-gnu": "4.62.2", "@rollup/rollup-linux-x64-musl": "4.62.2", "@rollup/rollup-openbsd-x64": "4.62.2", "@rollup/rollup-openharmony-arm64": "4.62.2", "@rollup/rollup-win32-arm64-msvc": "4.62.2", "@rollup/rollup-win32-ia32-msvc": "4.62.2", "@rollup/rollup-win32-x64-gnu": "4.62.2", "@rollup/rollup-win32-x64-msvc": "4.62.2", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA=="], + + "saxes": ["saxes@6.0.0", "", { "dependencies": { "xmlchars": "^2.2.0" } }, "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA=="], + + "scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + + "semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "siginfo": ["siginfo@2.0.0", "", {}, "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g=="], + + "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], + + "stackback": ["stackback@0.0.2", "", {}, "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw=="], + + "std-env": ["std-env@4.2.0", "", {}, "sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw=="], + + "strip-indent": ["strip-indent@3.0.0", "", { "dependencies": { "min-indent": "^1.0.0" } }, "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ=="], + + "symbol-tree": ["symbol-tree@3.2.4", "", {}, "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw=="], + + "tailwindcss": ["tailwindcss@4.3.3", "", {}, "sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ=="], + + "tapable": ["tapable@2.3.3", "", {}, "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A=="], + + "tauri-plugin-keyring-store-api": ["tauri-plugin-keyring-store-api@0.2.0", "", { "dependencies": { "@tauri-apps/api": "2.11.0" } }, "sha512-ZQYb6Xj75AD+YFBNDr4Zjc751TlVCQqvcB3GXx9Q85dRkss2FKrfU1Bu3kATQAzMQcvPYT3Ww+Fi+3I+OlMVZA=="], + + "tinybench": ["tinybench@2.9.0", "", {}, "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg=="], + + "tinyexec": ["tinyexec@1.2.4", "", {}, "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg=="], + + "tinyglobby": ["tinyglobby@0.2.17", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g=="], + + "tinyrainbow": ["tinyrainbow@3.1.0", "", {}, "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw=="], + + "tldts": ["tldts@7.4.9", "", { "dependencies": { "tldts-core": "^7.4.9" }, "bin": { "tldts": "bin/cli.js" } }, "sha512-3kZ8wQQ/k5DrChD4X4FVvr2D7E5uoRgAqkPyLpSCGUvqOvqu+JEdr3mwMUaVWb+vMHZaKhF5fp2PBigKsui7hA=="], + + "tldts-core": ["tldts-core@7.4.9", "", {}, "sha512-DxKfPBI52p2msTEu7MPhdpdDTBhhVQg1a/8PjQckeyAvO13eMYElX545grIp6nnTGIMZlRvFZPvFhvI/WIz2Vg=="], + + "tough-cookie": ["tough-cookie@6.0.2", "", { "dependencies": { "tldts": "^7.0.5" } }, "sha512-exgYmnmL/sJpR3upZfXG5PoatXQii55xAiXGXzY+sROLZ/Y+SLcp9PgJNI9Vz37HpQ74WvDcLT8eqm+kV3FzrA=="], + + "tr46": ["tr46@6.0.0", "", { "dependencies": { "punycode": "^2.3.1" } }, "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw=="], + + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="], + + "undici": ["undici@7.29.0", "", {}, "sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw=="], + + "update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="], + + "vite": ["vite@7.3.6", "", { "dependencies": { "esbuild": "^0.27.0 || ^0.28.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg=="], + + "vitest": ["vitest@4.1.10", "", { "dependencies": { "@vitest/expect": "4.1.10", "@vitest/mocker": "4.1.10", "@vitest/pretty-format": "4.1.10", "@vitest/runner": "4.1.10", "@vitest/snapshot": "4.1.10", "@vitest/spy": "4.1.10", "@vitest/utils": "4.1.10", "es-module-lexer": "^2.0.0", "expect-type": "^1.3.0", "magic-string": "^0.30.21", "obug": "^2.1.1", "pathe": "^2.0.3", "picomatch": "^4.0.3", "std-env": "^4.0.0-rc.1", "tinybench": "^2.9.0", "tinyexec": "^1.0.2", "tinyglobby": "^0.2.15", "tinyrainbow": "^3.1.0", "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", "why-is-node-running": "^2.3.0" }, "peerDependencies": { "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", "@vitest/browser-playwright": "4.1.10", "@vitest/browser-preview": "4.1.10", "@vitest/browser-webdriverio": "4.1.10", "@vitest/coverage-istanbul": "4.1.10", "@vitest/coverage-v8": "4.1.10", "@vitest/ui": "4.1.10", "happy-dom": "*", "jsdom": "*" }, "optionalPeers": ["@edge-runtime/vm", "@opentelemetry/api", "@types/node", "@vitest/browser-playwright", "@vitest/browser-preview", "@vitest/browser-webdriverio", "@vitest/coverage-istanbul", "@vitest/coverage-v8", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "./vitest.mjs" } }, "sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw=="], + + "w3c-xmlserializer": ["w3c-xmlserializer@5.0.0", "", { "dependencies": { "xml-name-validator": "^5.0.0" } }, "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA=="], + + "webidl-conversions": ["webidl-conversions@8.0.1", "", {}, "sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ=="], + + "whatwg-mimetype": ["whatwg-mimetype@5.0.0", "", {}, "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw=="], + + "whatwg-url": ["whatwg-url@16.0.1", "", { "dependencies": { "@exodus/bytes": "^1.11.0", "tr46": "^6.0.0", "webidl-conversions": "^8.0.1" } }, "sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw=="], + + "why-is-node-running": ["why-is-node-running@2.3.0", "", { "dependencies": { "siginfo": "^2.0.0", "stackback": "0.0.2" }, "bin": { "why-is-node-running": "cli.js" } }, "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w=="], + + "xml-name-validator": ["xml-name-validator@5.0.0", "", {}, "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg=="], + + "xmlchars": ["xmlchars@2.2.0", "", {}, "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw=="], + + "yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], + + "zustand": ["zustand@5.0.14", "", { "peerDependencies": { "@types/react": ">=18.0.0", "immer": ">=9.0.6", "react": ">=18.0.0", "use-sync-external-store": ">=1.2.0" }, "optionalPeers": ["@types/react", "immer", "react", "use-sync-external-store"] }, "sha512-/8tAspM5LMPr28b3fwLYrtdj77ECpfZviaP75CMTnwO8ISyaE4GDIG/9rDDYq/cH9D2Xw2A2RXglLInmVBQB/g=="], + + "@babel/helper-compilation-targets/lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], + + "@tailwindcss/node/jiti": ["jiti@2.7.0", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ=="], + + "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.11.3", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.3", "tslib": "^2.4.0" }, "bundled": true }, "sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg=="], + + "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.11.3", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA=="], + + "@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.3", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g=="], + + "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.6", "", { "dependencies": { "@tybys/wasm-util": "^0.10.3" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" }, "bundled": true }, "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg=="], + + "@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.10.3", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg=="], + + "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@testing-library/dom/aria-query": ["aria-query@5.3.0", "", { "dependencies": { "dequal": "^2.0.3" } }, "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A=="], + + "@testing-library/dom/dom-accessibility-api": ["dom-accessibility-api@0.5.16", "", {}, "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg=="], + + "tauri-plugin-keyring-store-api/@tauri-apps/api": ["@tauri-apps/api@2.11.0", "", {}, "sha512-7CinYODhky9lmO23xHnUFv0Xt43fbtWMyxZcLcRBlFkcgXKuEirBvHpmtJ89YMhyeGcq20Wuc47Fa4XjyniywA=="], + } +} diff --git a/index.html b/index.html index ff93803..979e31b 100644 --- a/index.html +++ b/index.html @@ -2,9 +2,11 @@ - - Tauri + React + Typescript + Gridline + diff --git a/package.json b/package.json index b089c37..f58dc04 100644 --- a/package.json +++ b/package.json @@ -1,27 +1,44 @@ { - "name": "gridline", - "private": true, - "version": "0.1.0", - "description": "An open-source, high-performance database GUI client for PostgreSQL and beyond", - "type": "module", - "scripts": { - "dev": "vite", - "build": "tsc && vite build", - "preview": "vite preview", - "tauri": "tauri" - }, - "dependencies": { - "react": "^19.1.0", - "react-dom": "^19.1.0", - "@tauri-apps/api": "^2", - "@tauri-apps/plugin-opener": "^2" - }, - "devDependencies": { - "@types/react": "^19.1.8", - "@types/react-dom": "^19.1.6", - "@vitejs/plugin-react": "^4.6.0", - "typescript": "~5.8.3", - "vite": "^7.0.4", - "@tauri-apps/cli": "^2" - } + "name": "gridline", + "private": true, + "version": "0.1.0", + "description": "An open-source, high-performance database GUI client for PostgreSQL and beyond", + "type": "module", + "scripts": { + "test": "vitest run", + "test:watch": "vitest", + "dev": "vite", + "tauri:dev": "tauri dev", + "build": "tsc && vite build", + "preview": "vite preview", + "tauri": "tauri" + }, + "dependencies": { + "@fontsource/outfit": "^5.3.0", + "@fontsource/space-mono": "^5.3.0", + "@tailwindcss/vite": "^4.3.3", + "@tauri-apps/api": "^2", + "@tauri-apps/plugin-dialog": "^2.7.2", + "@tauri-apps/plugin-fs": "^2.5.1", + "@tauri-apps/plugin-opener": "^2", + "lucide-react": "^1.26.0", + "motion": "^12.42.2", + "react": "^19.1.0", + "react-dom": "^19.1.0", + "tauri-plugin-keyring-store-api": "^0.2.0", + "zustand": "^5.0.14" + }, + "devDependencies": { + "@tauri-apps/cli": "^2", + "@testing-library/jest-dom": "^7.0.0", + "@testing-library/react": "^16.3.2", + "@testing-library/user-event": "^14.6.1", + "@types/react": "^19.1.8", + "@types/react-dom": "^19.1.6", + "@vitejs/plugin-react": "^4.6.0", + "jsdom": "^29.1.1", + "typescript": "~5.8.3", + "vite": "^7.0.4", + "vitest": "^4.1.10" + } } diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock new file mode 100644 index 0000000..f48e261 --- /dev/null +++ b/src-tauri/Cargo.lock @@ -0,0 +1,6718 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "aead" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" +dependencies = [ + "crypto-common 0.1.6", + "generic-array", +] + +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures 0.2.17", +] + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e76a019e91224d279006ff972f1e984179a6e9feb050adba6ce8274aef23195" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "android-native-keyring-store" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c6349ddff23194f8fdce2ea8849380f5a4868c1648965b70e801e104cba9b3" +dependencies = [ + "base64 0.22.1", + "jni", + "keyring-core", + "log", + "ndk-context", + "regex", + "serde", + "serde_json", + "thiserror 2.0.19", + "tracing", +] + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anyhow" +version = "1.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" + +[[package]] +name = "apple-native-keyring-store" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "797f94b6a53d7d10b56dc18290e0d40a2158352f108bb4ff32350825081a9f29" +dependencies = [ + "keyring-core", + "log", + "security-framework", +] + +[[package]] +name = "arc-swap" +version = "1.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c049c0be4daef0b145cb3555416b3b8ef5b7888a38aea1a3a155801fe7b0810b" +dependencies = [ + "rustversion", +] + +[[package]] +name = "argon2" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c3610892ee6e0cbce8ae2700349fcf8f98adb0dbfbee85aec3c9179d29cc072" +dependencies = [ + "base64ct", + "blake2", + "cpufeatures 0.2.17", + "password-hash", +] + +[[package]] +name = "async-broadcast" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" +dependencies = [ + "event-listener", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-channel" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "pin-project-lite", + "slab", +] + +[[package]] +name = "async-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" +dependencies = [ + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-lock" +version = "3.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" +dependencies = [ + "event-listener", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-process" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" +dependencies = [ + "async-channel", + "async-io", + "async-lock", + "async-signal", + "async-task", + "blocking", + "cfg-if", + "event-listener", + "futures-lite", + "rustix", +] + +[[package]] +name = "async-recursion" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "async-signal" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52b5aaafa020cf5053a01f2a60e8ff5dccf550f0f77ec54a4e47285ac2bab485" +dependencies = [ + "async-io", + "async-lock", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix", + "signal-hook-registry", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + +[[package]] +name = "async-trait" +version = "0.1.91" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae36dc4177970ef04fde5178d3e2429882def40e57a451f919c098f72baa6cec" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "atk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241b621213072e993be4f6f3a9e4b45f65b7e6faad43001be957184b7bb1824b" +dependencies = [ + "atk-sys", + "glib", + "libc", +] + +[[package]] +name = "atk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e48b684b0ca77d2bbadeef17424c2ea3c897d44d566a1617e7e8f30614d086" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "atoi" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" +dependencies = [ + "num-traits", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64ct" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" +dependencies = [ + "serde_core", +] + +[[package]] +name = "blake2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-buffer" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2f6c7dbe95a6ed67ad9f18e57daf93a2f034c524b99fd2b76d18fdfeb6660aa" +dependencies = [ + "hybrid-array", +] + +[[package]] +name = "block-padding" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" +dependencies = [ + "objc2", +] + +[[package]] +name = "blocking" +version = "1.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" +dependencies = [ + "async-channel", + "async-task", + "futures-io", + "futures-lite", + "piper", +] + +[[package]] +name = "brotli" +version = "8.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc91aac060a7a1e25823bdccbfb6af1875b88f17c6daac97894eed8207166b3" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "5.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a32acac15fe1967bc3986b2a6347dffc965602354ea6f450ad07e8bfd253583" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + +[[package]] +name = "bytemuck" +version = "1.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95832e849adfb21180ccb6826a99da14e5d266ae5c2e668e1602cf234f153797" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" +dependencies = [ + "serde", +] + +[[package]] +name = "cairo-rs" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" +dependencies = [ + "bitflags 2.13.1", + "cairo-sys-rs", + "glib", + "libc", + "once_cell", + "thiserror 1.0.69", +] + +[[package]] +name = "cairo-sys-rs" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "camino" +version = "1.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f2d30e4173c4026932d51d31d6b0613b1fd3014bf3f9f8943d4ba139c437ba0" +dependencies = [ + "serde_core", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror 2.0.19", +] + +[[package]] +name = "cargo_toml" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77" +dependencies = [ + "serde", + "toml 0.9.12+spec-1.1.0", +] + +[[package]] +name = "cbc" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6" +dependencies = [ + "cipher", +] + +[[package]] +name = "cc" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5add81bb678e6cb321aff7fa0dc7689ad82b112dbc032cea19f91d6b8e3582b9" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cfb" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f" +dependencies = [ + "byteorder", + "fnv", + "uuid", +] + +[[package]] +name = "cfg-expr" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +dependencies = [ + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "chacha20" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures 0.2.17", +] + +[[package]] +name = "chacha20" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "rand_core 0.10.1", +] + +[[package]] +name = "chacha20poly1305" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35" +dependencies = [ + "aead", + "chacha20 0.9.1", + "cipher", + "poly1305", + "zeroize", +] + +[[package]] +name = "chrono" +version = "0.4.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" +dependencies = [ + "iana-time-zone", + "js-sys", + "num-traits", + "serde", + "wasm-bindgen", + "windows-link 0.2.1", +] + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common 0.1.6", + "inout", + "zeroize", +] + +[[package]] +name = "cmov" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c9ea0ac24bc397ab3c98583a3c9ba74fa56b09a4449bbe172b9b1ddb016027a" + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "futures-core", + "memchr", + "pin-project-lite", + "tokio", + "tokio-util", +] + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "const-oid" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" + +[[package]] +name = "cookie" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" +dependencies = [ + "time", + "version_check", +] + +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core-graphics" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "064badf302c3194842cf2c5d61f56cc88e54a759313879cdf03abdd27d0c3b97" +dependencies = [ + "bitflags 2.13.1", + "core-foundation", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" +dependencies = [ + "bitflags 2.13.1", + "core-foundation", + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" +dependencies = [ + "libc", +] + +[[package]] +name = "crc" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "217698eaf96b4a3f0bc4f3662aaa55bdf913cd54d7204591faa790070c6d0853" + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d85363c37faeca707aef026efa9f3b34d077bce547e48f770770625c6013679e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-queue" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "803d13fb3b09d88be9f4dbc29062c66b19bf7170867ceb746d2a8689bf6c7a26" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "typenum", +] + +[[package]] +name = "crypto-common" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453" +dependencies = [ + "hybrid-array", +] + +[[package]] +name = "cssparser" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dae61cf9c0abb83bd659dab65b7e4e38d8236824c85f0f804f173567bda257d2" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa", + "phf", + "smallvec", +] + +[[package]] +name = "cssparser-macros" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" +dependencies = [ + "quote", + "syn 2.0.119", +] + +[[package]] +name = "ctor" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "352d39c2f7bef1d6ad73db6f5160efcaed66d94ef8c6c573a8410c00bf909a98" +dependencies = [ + "ctor-proc-macro", + "dtor", +] + +[[package]] +name = "ctor-proc-macro" +version = "0.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52560adf09603e58c9a7ee1fe1dcb95a16927b17c127f0ac02d6e768a0e25bc1" + +[[package]] +name = "ctutils" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d5515a3834141de9eafb9717ad39eea8247b5674e6066c404e8c4b365d2a29e" +dependencies = [ + "cmov", +] + +[[package]] +name = "darling" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" +dependencies = [ + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.119", +] + +[[package]] +name = "darling_macro" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "dbus" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ab69f03cc8c4340c9c8e315114e1658e6775a9b16a04357973aa21cec22b32e" +dependencies = [ + "libc", + "libdbus-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "dbus-secret-service" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "708b509edf7889e53d7efb0ffadd994cc6c2345ccb62f55cfd6b0682165e4fa6" +dependencies = [ + "aes", + "block-padding", + "cbc", + "dbus", + "fastrand", + "hkdf", + "num", + "once_cell", + "sha2 0.10.9", + "zeroize", +] + +[[package]] +name = "dbus-secret-service-keyring-store" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21d8f54da401bb5eb2a4d873ac4b359f4a599df2ca8634bb5b8c045e5ee78757" +dependencies = [ + "dbus-secret-service", + "keyring-core", +] + +[[package]] +name = "deadpool" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0be2b1d1d6ec8d846f05e137292d0b89133caf95ef33695424c09568bdd39b1b" +dependencies = [ + "deadpool-runtime", + "lazy_static", + "num_cpus", + "tokio", +] + +[[package]] +name = "deadpool-postgres" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d697d376cbfa018c23eb4caab1fd1883dd9c906a8c034e8d9a3cb06a7e0bef9" +dependencies = [ + "async-trait", + "deadpool", + "getrandom 0.2.17", + "tokio", + "tokio-postgres", + "tracing", +] + +[[package]] +name = "deadpool-runtime" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "092966b41edc516079bdf31ec78a2e0588d1d0c08f78b91d8307215928642b2b" +dependencies = [ + "tokio", +] + +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid 0.9.6", + "pem-rfc7468", + "zeroize", +] + +[[package]] +name = "deranged" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" +dependencies = [ + "serde_core", +] + +[[package]] +name = "derive_more" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.119", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer 0.10.4", + "const-oid 0.9.6", + "crypto-common 0.1.6", + "subtle", +] + +[[package]] +name = "digest" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" +dependencies = [ + "block-buffer 0.12.1", + "const-oid 0.10.2", + "crypto-common 0.2.2", + "ctutils", +] + +[[package]] +name = "dirs" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.61.2", +] + +[[package]] +name = "dispatch2" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" +dependencies = [ + "bitflags 2.13.1", + "block2", + "libc", + "objc2", +] + +[[package]] +name = "displaydoc" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "dlopen2" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e2c5bd4158e66d1e215c49b837e11d62f3267b30c92f1d171c4d3105e3dc4d4" +dependencies = [ + "dlopen2_derive", + "libc", + "once_cell", + "winapi", +] + +[[package]] +name = "dlopen2_derive" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fbbb781877580993a8707ec48672673ec7b81eeba04cfd2310bd28c08e47c8f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "dom_query" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521e380c0c8afb8d9a1e83a1822ee03556fc3e3e7dbc1fd30be14e37f9cb3f89" +dependencies = [ + "bit-set", + "cssparser", + "foldhash", + "html5ever", + "precomputed-hash", + "selectors", + "tendril", +] + +[[package]] +name = "dotenvy" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" + +[[package]] +name = "dpi" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" +dependencies = [ + "serde", +] + +[[package]] +name = "dtoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c3cf4824e2d5f025c7b531afcb2325364084a16806f6d47fbc1f5fbd9960590" + +[[package]] +name = "dtoa-short" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" +dependencies = [ + "dtoa", +] + +[[package]] +name = "dtor" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1057d6c64987086ff8ed0fd3fbf377a6b7d205cc7715868cd401705f715cbe4" +dependencies = [ + "dtor-proc-macro", +] + +[[package]] +name = "dtor-proc-macro" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f678cf4a922c215c63e0de95eb1ff08a958a81d47e485cf9da1e27bf6305cfa5" + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "either" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5e8f6c15a24b9a3ee5efec809ccd006d3b30e8b3bb63c39af737c7f87daa1d" +dependencies = [ + "serde", +] + +[[package]] +name = "embed-resource" +version = "3.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbfdaacccebec3b28e4866b8973543c7647797db5ada1bdab552e48fe665fbbd" +dependencies = [ + "cc", + "memchr", + "rustc_version", + "toml 1.1.3+spec-1.1.0", + "vswhom", + "winreg", +] + +[[package]] +name = "embed_plist" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" + +[[package]] +name = "endi" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099" + +[[package]] +name = "enumflags2" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" +dependencies = [ + "enumflags2_derive", + "serde", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "erased-serde" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2add8a07dd6a8d93ff627029c51de145e12686fbc36ecb298ac22e74cf02dec" +dependencies = [ + "serde", + "serde_core", + "typeid", +] + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "etcetera" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" +dependencies = [ + "cfg-if", + "home", + "windows-sys 0.48.0", +] + +[[package]] +name = "event-listener" +version = "5.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener", + "pin-project-lite", +] + +[[package]] +name = "fallible-iterator" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" + +[[package]] +name = "fallible-iterator" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" + +[[package]] +name = "fallible-streaming-iterator" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" + +[[package]] +name = "fastrand" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" + +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "field-offset" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" +dependencies = [ + "memoffset", + "rustc_version", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[package]] +name = "flate2" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "flume" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" +dependencies = [ + "futures-core", + "futures-sink", + "spin", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea5190182e6915eb873ddbc16e23b711b6eb1f9c00a0d0a3a91b5f6228475225" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures-channel" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "262590f4fe6afeb0bc83be1daa64e52657fe185690a958af7f3ad0e92085c5ae" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cd50c473c80f6d7c3670a752354b8e569b1a7cbfdc0419ec88e5edad85e0dc7" + +[[package]] +name = "futures-executor" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6754879cc9f2c66f88c6e5c35344bb0bdb0708b0352b1201815667c7eabc7458" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-intrusive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" +dependencies = [ + "futures-core", + "lock_api", + "parking_lot", +] + +[[package]] +name = "futures-io" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4577ecaa3c4f96589d473f679a71b596316f6641bc350038b962a5daf0085d7a" + +[[package]] +name = "futures-lite" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[package]] +name = "futures-macro" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d6d3cde68c518367be28956066ddfef33813991b77a55005a69dae04bf3b10b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "futures-sink" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e34418ac499d6305c2fb5ad0ed2f6ac998c5f8ca209b4510f7f94242c647e307" + +[[package]] +name = "futures-task" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b231ed28831efb4a61a08580c4bc233ec56bc009f4cd8f52da2c3cb97df0c109" + +[[package]] +name = "futures-util" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a77a90a256fce34da66415271e30f94ee91c57b04b8a2c042d9cf3220179deaa" +dependencies = [ + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "slab", +] + +[[package]] +name = "gdk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9f245958c627ac99d8e529166f9823fb3b838d1d41fd2b297af3075093c2691" +dependencies = [ + "cairo-rs", + "gdk-pixbuf", + "gdk-sys", + "gio", + "glib", + "libc", + "pango", +] + +[[package]] +name = "gdk-pixbuf" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50e1f5f1b0bfb830d6ccc8066d18db35c487b1b2b1e8589b5dfe9f07e8defaec" +dependencies = [ + "gdk-pixbuf-sys", + "gio", + "glib", + "libc", + "once_cell", +] + +[[package]] +name = "gdk-pixbuf-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gdk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c2d13f38594ac1e66619e188c6d5a1adb98d11b2fcf7894fc416ad76aa2f3f7" +dependencies = [ + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gdkwayland-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "140071d506d223f7572b9f09b5e155afbd77428cd5cc7af8f2694c41d98dfe69" +dependencies = [ + "gdk-sys", + "glib-sys", + "gobject-sys", + "libc", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gdkx11" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3caa00e14351bebbc8183b3c36690327eb77c49abc2268dd4bd36b856db3fbfe" +dependencies = [ + "gdk", + "gdkx11-sys", + "gio", + "glib", + "libc", + "x11", +] + +[[package]] +name = "gdkx11-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e7445fe01ac26f11601db260dd8608fe172514eb63b3b5e261ea6b0f4428d" +dependencies = [ + "gdk-sys", + "glib-sys", + "libc", + "system-deps", + "x11", +] + +[[package]] +name = "generic-array" +version = "0.14.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi 5.3.0", + "wasip2", +] + +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "libc", + "r-efi 6.0.0", + "rand_core 0.10.1", +] + +[[package]] +name = "gio" +version = "0.18.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fc8f532f87b79cbc51a79748f16a6828fb784be93145a322fa14d06d354c73" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "gio-sys", + "glib", + "libc", + "once_cell", + "pin-project-lite", + "smallvec", + "thiserror 1.0.69", +] + +[[package]] +name = "gio-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", + "winapi", +] + +[[package]] +name = "glib" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" +dependencies = [ + "bitflags 2.13.1", + "futures-channel", + "futures-core", + "futures-executor", + "futures-task", + "futures-util", + "gio-sys", + "glib-macros", + "glib-sys", + "gobject-sys", + "libc", + "memchr", + "once_cell", + "smallvec", + "thiserror 1.0.69", +] + +[[package]] +name = "glib-macros" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" +dependencies = [ + "heck 0.4.1", + "proc-macro-crate 2.0.2", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "glib-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898" +dependencies = [ + "libc", + "system-deps", +] + +[[package]] +name = "glob" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4eba85ea1d0a966a983acd07deee566e67395d2d96b6fb39e62b5a833f1eb0b" + +[[package]] +name = "gobject-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gridline" +version = "0.1.0" +dependencies = [ + "chrono", + "deadpool-postgres", + "indexmap 2.14.0", + "redis", + "rusqlite", + "serde", + "serde_json", + "sqlx", + "ssh2", + "tauri", + "tauri-build", + "tauri-plugin-dialog", + "tauri-plugin-fs", + "tauri-plugin-keyring-store", + "tauri-plugin-opener", + "tokio", + "tokio-postgres", + "urlencoding", + "uuid", +] + +[[package]] +name = "gtk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd56fb197bfc42bd5d2751f4f017d44ff59fbb58140c6b49f9b3b2bdab08506a" +dependencies = [ + "atk", + "cairo-rs", + "field-offset", + "futures-channel", + "gdk", + "gdk-pixbuf", + "gio", + "glib", + "gtk-sys", + "gtk3-macros", + "libc", + "pango", + "pkg-config", +] + +[[package]] +name = "gtk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f29a1c21c59553eb7dd40e918be54dccd60c52b049b75119d5d96ce6b624414" +dependencies = [ + "atk-sys", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "system-deps", +] + +[[package]] +name = "gtk3-macros" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ff3c5b21f14f0736fed6dcfc0bfb4225ebf5725f3c0209edeec181e4d73e9d" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", + "allocator-api2", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[package]] +name = "hashlink" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af" +dependencies = [ + "hashbrown 0.14.5", +] + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hkdf" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac 0.12.1", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "hmac" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6303bc9732ae41b04cb554b844a762b4115a61bfaa81e3e83050991eeb56863f" +dependencies = [ + "digest 0.11.3", +] + +[[package]] +name = "home" +version = "0.5.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "html5ever" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1054432bae2f14e0061e33d23402fbaa67a921d319d56adc6bcf887ddad1cbc2" +dependencies = [ + "log", + "markup5ever", +] + +[[package]] +name = "http" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2a8f2913ee65f60facd6a5905613afaa448497a0230cc41ce022d93290bc2c" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9f41fd6a08e4d4ec69df65976da761afd5ad5e58a9d4acb46bd1c953a9e3ff2" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "hybrid-array" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "818356c5132c1fede50f837ca96afbe78ff42413047f4abb886217845e1b6c8c" +dependencies = [ + "typenum", +] + +[[package]] +name = "hyper" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d22053281f852e11534f5198498373cbb59295120a20771d90f7ed1897490a72" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-util" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2 0.6.5", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core 0.62.2", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "ico" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e795dff5605e0f04bff85ca41b51a96b83e80b281e96231bcaaf1ac35103371" +dependencies = [ + "byteorder", + "png 0.17.16", +] + +[[package]] +name = "icu_collections" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" +dependencies = [ + "displaydoc", + "potential_utf", + "utf8_iter", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" + +[[package]] +name = "icu_properties" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" + +[[package]] +name = "icu_provider" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +dependencies = [ + "equivalent", + "hashbrown 0.17.1", + "serde", + "serde_core", +] + +[[package]] +name = "infer" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a588916bfdfd92e71cacef98a63d9b1f0d74d6599980d11894290e7ddefffcf7" +dependencies = [ + "cfb", +] + +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "block-padding", + "generic-array", +] + +[[package]] +name = "ipnet" +version = "2.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" + +[[package]] +name = "is-docker" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3" +dependencies = [ + "once_cell", +] + +[[package]] +name = "is-wsl" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5" +dependencies = [ + "is-docker", + "once_cell", +] + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "javascriptcore-rs" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca5671e9ffce8ffba57afc24070e906da7fc4b1ba66f2cabebf61bf2ea257fcc" +dependencies = [ + "bitflags 1.3.2", + "glib", + "javascriptcore-rs-sys", +] + +[[package]] +name = "javascriptcore-rs-sys" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1be78d14ffa4b75b66df31840478fef72b51f8c2465d4ca7c194da9f7a5124" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys 0.3.1", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" +dependencies = [ + "jni-sys 0.4.1", +] + +[[package]] +name = "jni-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn 2.0.119", +] + +[[package]] +name = "js-sys" +version = "0.3.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102" +dependencies = [ + "cfg-if", + "futures-util", + "wasm-bindgen", +] + +[[package]] +name = "json-patch" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "863726d7afb6bc2590eeff7135d923545e5e964f004c2ccf8716c25e70a86f08" +dependencies = [ + "jsonptr", + "serde", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "jsonptr" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dea2b27dd239b2556ed7a25ba842fe47fd602e7fc7433c2a8d6106d4d9edd70" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "keyboard-types" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" +dependencies = [ + "bitflags 2.13.1", + "serde", + "unicode-segmentation", +] + +[[package]] +name = "keyring-core" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb1e621458ca9c51aa110bd0339d4751a056b9576bf1253aee1aa560dda0fc9d" +dependencies = [ + "log", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +dependencies = [ + "spin", +] + +[[package]] +name = "libappindicator" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03589b9607c868cc7ae54c0b2a22c8dc03dd41692d48f2d7df73615c6a95dc0a" +dependencies = [ + "glib", + "gtk", + "gtk-sys", + "libappindicator-sys", + "log", +] + +[[package]] +name = "libappindicator-sys" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf" +dependencies = [ + "gtk-sys", + "libloading", + "once_cell", +] + +[[package]] +name = "libc" +version = "0.2.189" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" + +[[package]] +name = "libdbus-sys" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "328c4789d42200f1eeec05bd86c9c13c7f091d2ba9a6ea35acdf51f31bc0f043" +dependencies = [ + "pkg-config", +] + +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "libm" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" + +[[package]] +name = "libredox" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c943259e342f1e06ff2da7a83eabdfe7f92ce10262688dbf1895ff0b3e6e4652" +dependencies = [ + "bitflags 2.13.1", + "libc", + "plain", + "redox_syscall 0.9.0", +] + +[[package]] +name = "libsqlite3-sys" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c10584274047cb335c23d3e61bcef8e323adae7c5c8c760540f73610177fc3f" +dependencies = [ + "cc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "libssh2-sys" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c04141a07bb0c0bc461cb657808764de571702a59bc5c726c400ac9a7625e3ab" +dependencies = [ + "cc", + "libc", + "libz-sys", + "openssl-sys", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "libz-sys" +version = "1.1.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85bc9657773828b90eeb625adff10eeac83cc21bbfd8e23a03eaa8a33c9e28d9" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "litemap" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" + +[[package]] +name = "markup5ever" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8983d30f2915feeaaab2d6babdd6bc7e9ed1a00b66b5e6d74df19aa9c0e91862" +dependencies = [ + "log", + "tendril", + "web_atoms", +] + +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest 0.10.7", +] + +[[package]] +name = "md-5" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69b6441f590336821bb897fb28fc622898ccceb1d6cea3fde5ea86b090c4de98" +dependencies = [ + "cfg-if", + "digest 0.11.3", +] + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427" +dependencies = [ + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.61.2", +] + +[[package]] +name = "muda" +version = "0.19.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dd04e60bc0b07438a6771710ee1698f98f6ebbc7f89b61264af1563b8aeb878" +dependencies = [ + "crossbeam-channel", + "dpi", + "gtk", + "keyboard-types", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "once_cell", + "png 0.18.1", + "serde", + "thiserror 2.0.19", + "windows-sys 0.61.2", +] + +[[package]] +name = "ndk" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" +dependencies = [ + "bitflags 2.13.1", + "jni-sys 0.3.1", + "log", + "ndk-sys", + "num_enum", + "raw-window-handle", + "thiserror 1.0.69", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.6.0+11769913" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" +dependencies = [ + "jni-sys 0.3.1", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "num" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" +dependencies = [ + "num-bigint", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-bigint-dig" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7" +dependencies = [ + "lazy_static", + "libm", + "num-integer", + "num-iter", + "num-traits", + "rand 0.8.7", + "smallvec", + "zeroize", +] + +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-conv" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c92800bd69a1eac91786bcfe9da64a897eb72911b8dc3095decbd07429e8048b" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_cpus" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "objc2" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" +dependencies = [ + "objc2-encode", + "objc2-exception-helper", +] + +[[package]] +name = "objc2-app-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" +dependencies = [ + "bitflags 2.13.1", + "block2", + "objc2", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "objc2-cloud-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" +dependencies = [ + "bitflags 2.13.1", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-data" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +dependencies = [ + "bitflags 2.13.1", + "dispatch2", + "objc2", +] + +[[package]] +name = "objc2-core-graphics" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" +dependencies = [ + "bitflags 2.13.1", + "dispatch2", + "objc2", + "objc2-core-foundation", + "objc2-io-surface", +] + +[[package]] +name = "objc2-core-image" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-location" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca347214e24bc973fc025fd0d36ebb179ff30536ed1f80252706db19ee452009" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-text" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" +dependencies = [ + "bitflags 2.13.1", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc2-exception-helper" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7a1c5fbb72d7735b076bb47b578523aedc40f3c439bea6dfd595c089d79d98a" +dependencies = [ + "cc", +] + +[[package]] +name = "objc2-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" +dependencies = [ + "bitflags 2.13.1", + "block2", + "libc", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-io-surface" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" +dependencies = [ + "bitflags 2.13.1", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" +dependencies = [ + "bitflags 2.13.1", + "objc2", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "objc2-system-configuration" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7216bd11cbda54ccabcab84d523dc93b858ec75ecfb3a7d89513fa22464da396" +dependencies = [ + "objc2-core-foundation", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" +dependencies = [ + "bitflags 2.13.1", + "block2", + "objc2", + "objc2-cloud-kit", + "objc2-core-data", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-core-image", + "objc2-core-location", + "objc2-core-text", + "objc2-foundation", + "objc2-quartz-core", + "objc2-user-notifications", +] + +[[package]] +name = "objc2-user-notifications" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9df9128cbbfef73cda168416ccf7f837b62737d748333bfe9ab71c245d76613e" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-web-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2e5aaab980c433cf470df9d7af96a7b46a9d892d521a2cbbb2f8a4c16751e7f" +dependencies = [ + "bitflags 2.13.1", + "block2", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + +[[package]] +name = "open" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0b3d059e795d52b8a72fef45658620edd4d9c359b338564aa14391ffa511ed5" +dependencies = [ + "dunce", + "is-wsl", + "libc", +] + +[[package]] +name = "openssl-sys" +version = "0.9.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b47e7e6bb2c38cd930d25a23b40fa52e068c10e85f3e03a7f5ba5aaca5713695" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "ordered-stream" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" +dependencies = [ + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "pango" +version = "0.18.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4" +dependencies = [ + "gio", + "glib", + "libc", + "once_cell", + "pango-sys", +] + +[[package]] +name = "pango-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.5.18", + "smallvec", + "windows-link 0.2.1", +] + +[[package]] +name = "password-hash" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "346f04948ba92c43e8469c1ee6736c7563d71012b17d40745260fe106aac2166" +dependencies = [ + "base64ct", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "phf" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" +dependencies = [ + "phf_macros", + "phf_shared", + "serde", +] + +[[package]] +name = "phf_codegen" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49aa7f9d80421bca176ca8dbfebe668cc7a2684708594ec9f3c0db0805d5d6e1" +dependencies = [ + "phf_generator", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" +dependencies = [ + "fastrand", + "phf_shared", +] + +[[package]] +name = "phf_macros" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "phf_shared" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "piper" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c835479a4443ded371d6c535cbfd8d31ad92c5d23ae9770a61bc155e4992a3c1" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] + +[[package]] +name = "pkcs1" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" +dependencies = [ + "der", + "pkcs8", + "spki", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "pkg-config" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" + +[[package]] +name = "plain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" + +[[package]] +name = "plist" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da1d65da6dd5d1e44199ac0f58712d241c0f439f80adea8924d832384087f85" +dependencies = [ + "base64 0.22.1", + "indexmap 2.14.0", + "quick-xml", + "serde", + "time", +] + +[[package]] +name = "png" +version = "0.17.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "png" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" +dependencies = [ + "bitflags 2.13.1", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "polling" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix", + "windows-sys 0.61.2", +] + +[[package]] +name = "poly1305" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" +dependencies = [ + "cpufeatures 0.2.17", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "postgres-protocol" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08808e3c483c46e999108051c78334f473d5adb59d78bb80a1268c7e6aa6c514" +dependencies = [ + "base64 0.22.1", + "byteorder", + "bytes", + "fallible-iterator 0.2.0", + "hmac 0.13.0", + "md-5 0.11.0", + "memchr", + "rand 0.10.2", + "sha2 0.11.0", + "stringprep", +] + +[[package]] +name = "postgres-types" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "851ca9db4932932d69f3ea811b1abe63087a0f740a47692619dd40d4899b68be" +dependencies = [ + "bytes", + "chrono", + "fallible-iterator 0.2.0", + "postgres-protocol", + "serde_core", + "serde_json", + "uuid", +] + +[[package]] +name = "potential_utf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" +dependencies = [ + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit 0.19.15", +] + +[[package]] +name = "proc-macro-crate" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" +dependencies = [ + "toml_datetime 0.6.3", + "toml_edit 0.20.2", +] + +[[package]] +name = "proc-macro-crate" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +dependencies = [ + "toml_edit 0.25.13+spec-1.1.0", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quick-xml" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e660451e55124f798a69a5af3f49ccfbefbd41910eefd25caf2393e1f3473ec1" +dependencies = [ + "memchr", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "rand" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22f6172bdec972074665ed81ed53b71da00bfc44b65a753cfde883ec4c702a1a" +dependencies = [ + "libc", + "rand_chacha", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80" +dependencies = [ + "chacha20 0.10.1", + "getrandom 0.4.3", + "rand_core 0.10.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.17", +] + +[[package]] +name = "rand_core" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" + +[[package]] +name = "raw-window-handle" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" + +[[package]] +name = "redis" +version = "0.27.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09d8f99a4090c89cc489a94833c901ead69bfbf3877b4867d5482e321ee875bc" +dependencies = [ + "arc-swap", + "async-trait", + "bytes", + "combine", + "futures-util", + "itertools", + "itoa", + "num-bigint", + "percent-encoding", + "pin-project-lite", + "ryu", + "sha1_smol", + "socket2 0.5.10", + "tokio", + "tokio-util", + "url", +] + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags 2.13.1", +] + +[[package]] +name = "redox_syscall" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5102a6aaa05aa011a238e178e6bca86d2cb56fc9f586d37cb80f5bca6e07759" +dependencies = [ + "bitflags 2.13.1", +] + +[[package]] +name = "redox_users" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" +dependencies = [ + "getrandom 0.2.17", + "libredox", + "thiserror 2.0.19", +] + +[[package]] +name = "ref-cast" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "216e8f773d7923bcba9ceb86a86c93cabb3903a11872fc3f138c49630e50b96d" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9283685feec7d69af75fb0e858d5e7378f33fe4fc699383b2916ab9273e03c" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "regex" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fcfdb36bda0c880c5931cdc7a2bcdc8ba4556847b9d912bca70bc94708711ad" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + +[[package]] +name = "reqwest" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "219c5811de6525e5416c7d5d53bb656d3afdbc6c5af816e0802bcfa42dbdc1c3" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "sync_wrapper", + "tokio", + "tokio-util", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", +] + +[[package]] +name = "rfd" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a15ad77d9e70a92437d8f74c35d99b4e4691128df018833e99f90bcd36152672" +dependencies = [ + "block2", + "dispatch2", + "glib-sys", + "gobject-sys", + "gtk-sys", + "js-sys", + "log", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "raw-window-handle", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows-sys 0.60.2", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.17", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rsa" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8573f03f5883dcaebdfcf4725caa1ecb9c15b2ef50c43a07b816e06799bb12d" +dependencies = [ + "const-oid 0.9.6", + "digest 0.10.7", + "num-bigint-dig", + "num-integer", + "num-traits", + "pkcs1", + "pkcs8", + "rand_core 0.6.4", + "signature", + "spki", + "subtle", + "zeroize", +] + +[[package]] +name = "rusqlite" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b838eba278d213a8beaf485bd313fd580ca4505a00d5871caeb1457c55322cae" +dependencies = [ + "bitflags 2.13.1", + "fallible-iterator 0.3.0", + "fallible-streaming-iterator", + "hashlink", + "libsqlite3-sys", + "smallvec", +] + +[[package]] +name = "rustc-hash" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +dependencies = [ + "bitflags 2.13.1", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls" +version = "0.21.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" +dependencies = [ + "ring", + "rustls-webpki", + "sct", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64 0.21.7", +] + +[[package]] +name = "rustls-webpki" +version = "0.101.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" + +[[package]] +name = "ryu" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schemars" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" +dependencies = [ + "dyn-clone", + "indexmap 1.9.3", + "schemars_derive", + "serde", + "serde_json", + "url", + "uuid", +] + +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 2.0.119", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sct" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "security-framework" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" +dependencies = [ + "bitflags 2.13.1", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "selectors" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5d9c0c92a92d33f08817311cf3f2c29a3538a8240e94a6a3c622ce652d7e00c" +dependencies = [ + "bitflags 2.13.1", + "cssparser", + "derive_more", + "log", + "new_debug_unreachable", + "phf", + "phf_codegen", + "precomputed-hash", + "rustc-hash", + "servo_arc", + "smallvec", +] + +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" +dependencies = [ + "serde", + "serde_core", +] + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde-untagged" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058" +dependencies = [ + "erased-serde", + "serde", + "serde_core", + "typeid", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "serde_derive_internals" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "serde_json" +version = "1.0.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_repr" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d3b1629de253c70a0508c3899572da79ca359fdab27c7920ff00406df418906" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_spanned" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_with" +version = "3.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a5c54c7310e7b8b9577c286d7e399ddd876c3e12b3ed917a8aabc4b96e9e8c" +dependencies = [ + "base64 0.22.1", + "bs58", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.14.0", + "schemars 0.9.0", + "schemars 1.2.1", + "serde_core", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84d57bc0c8b9a17920c178daa6bb924850d54a9c97ab45194bb8c17ad66bb660" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "serialize-to-javascript" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04f3666a07a197cdb77cdf306c32be9b7f598d7060d50cfd4d5aa04bfd92f6c5" +dependencies = [ + "serde", + "serde_json", + "serialize-to-javascript-impl", +] + +[[package]] +name = "serialize-to-javascript-impl" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "servo_arc" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "170fb83ab34de17dc69aa7c67482b22218ddb85da56546f9bd6b929e32a05930" +dependencies = [ + "stable_deref_trait", +] + +[[package]] +name = "sha1" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a978451301f4db1d02937a4ab3ccce137717b81826e79b7d49ffe3244a13c3b8" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "digest 0.10.7", +] + +[[package]] +name = "sha1_smol" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbfa15b3dddfee50a0fff136974b3e1bde555604ba463834a7eb7deb6417705d" + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "digest 0.10.7", +] + +[[package]] +name = "sha2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "digest 0.11.3", +] + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "signal-hook-registry" +version = "1.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +dependencies = [ + "errno", + "libc", +] + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest 0.10.7", + "rand_core 0.6.4", +] + +[[package]] +name = "simd-adler32" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea" + +[[package]] +name = "siphasher" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "smallvec" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" +dependencies = [ + "serde", +] + +[[package]] +name = "socket2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "socket2" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "softbuffer" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac18da81ebbf05109ab275b157c22a653bb3c12cf884450179942f81bcbf6c3" +dependencies = [ + "bytemuck", + "js-sys", + "ndk", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation", + "objc2-quartz-core", + "raw-window-handle", + "redox_syscall 0.5.18", + "tracing", + "wasm-bindgen", + "web-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "soup3" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "471f924a40f31251afc77450e781cb26d55c0b650842efafc9c6cbd2f7cc4f9f" +dependencies = [ + "futures-channel", + "gio", + "glib", + "libc", + "soup3-sys", +] + +[[package]] +name = "soup3-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ebe8950a680a12f24f15ebe1bf70db7af98ad242d9db43596ad3108aab86c27" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "spin" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3763264f6b73151db08c50ff20d7d8a0b8796e021cdea7ceedad07b80155fa0e" +dependencies = [ + "lock_api", +] + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "sqlformat" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bba3a93db0cc4f7bdece8bb09e77e2e785c20bfebf79eb8340ed80708048790" +dependencies = [ + "nom", + "unicode_categories", +] + +[[package]] +name = "sqlx" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27144619c6e5802f1380337a209d2ac1c431002dd74c6e60aebff3c506dc4f0c" +dependencies = [ + "sqlx-core", + "sqlx-macros", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", +] + +[[package]] +name = "sqlx-core" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a999083c1af5b5d6c071d34a708a19ba3e02106ad82ef7bbd69f5e48266b613b" +dependencies = [ + "atoi", + "byteorder", + "bytes", + "crc", + "crossbeam-queue", + "either", + "event-listener", + "futures-channel", + "futures-core", + "futures-intrusive", + "futures-io", + "futures-util", + "hashbrown 0.14.5", + "hashlink", + "hex", + "indexmap 2.14.0", + "log", + "memchr", + "once_cell", + "paste", + "percent-encoding", + "rustls", + "rustls-pemfile", + "serde", + "serde_json", + "sha2 0.10.9", + "smallvec", + "sqlformat", + "thiserror 1.0.69", + "tokio", + "tokio-stream", + "tracing", + "url", + "webpki-roots", +] + +[[package]] +name = "sqlx-macros" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a23217eb7d86c584b8cbe0337b9eacf12ab76fe7673c513141ec42565698bb88" +dependencies = [ + "proc-macro2", + "quote", + "sqlx-core", + "sqlx-macros-core", + "syn 2.0.119", +] + +[[package]] +name = "sqlx-macros-core" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a099220ae541c5db479c6424bdf1b200987934033c2584f79a0e1693601e776" +dependencies = [ + "dotenvy", + "either", + "heck 0.5.0", + "hex", + "once_cell", + "proc-macro2", + "quote", + "serde", + "serde_json", + "sha2 0.10.9", + "sqlx-core", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", + "syn 2.0.119", + "tempfile", + "tokio", + "url", +] + +[[package]] +name = "sqlx-mysql" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5afe4c38a9b417b6a9a5eeffe7235d0a106716495536e7727d1c7f4b1ff3eba6" +dependencies = [ + "atoi", + "base64 0.22.1", + "bitflags 2.13.1", + "byteorder", + "bytes", + "crc", + "digest 0.10.7", + "dotenvy", + "either", + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "generic-array", + "hex", + "hkdf", + "hmac 0.12.1", + "itoa", + "log", + "md-5 0.10.6", + "memchr", + "once_cell", + "percent-encoding", + "rand 0.8.7", + "rsa", + "serde", + "sha1", + "sha2 0.10.9", + "smallvec", + "sqlx-core", + "stringprep", + "thiserror 1.0.69", + "tracing", + "whoami 1.6.1", +] + +[[package]] +name = "sqlx-postgres" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1dbb157e65f10dbe01f729339c06d239120221c9ad9fa0ba8408c4cc18ecf21" +dependencies = [ + "atoi", + "base64 0.22.1", + "bitflags 2.13.1", + "byteorder", + "crc", + "dotenvy", + "etcetera", + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "hex", + "hkdf", + "hmac 0.12.1", + "home", + "itoa", + "log", + "md-5 0.10.6", + "memchr", + "once_cell", + "rand 0.8.7", + "serde", + "serde_json", + "sha2 0.10.9", + "smallvec", + "sqlx-core", + "stringprep", + "thiserror 1.0.69", + "tracing", + "whoami 1.6.1", +] + +[[package]] +name = "sqlx-sqlite" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b2cdd83c008a622d94499c0006d8ee5f821f36c89b7d625c900e5dc30b5c5ee" +dependencies = [ + "atoi", + "flume", + "futures-channel", + "futures-core", + "futures-executor", + "futures-intrusive", + "futures-util", + "libsqlite3-sys", + "log", + "percent-encoding", + "serde", + "serde_urlencoded", + "sqlx-core", + "tracing", + "url", +] + +[[package]] +name = "ssh2" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c95eb3c09e378543395a3fa9796f897861862466ee331d59140ade4ea0dcfdfc" +dependencies = [ + "bitflags 2.13.1", + "libc", + "libssh2-sys", + "parking_lot", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "string_cache" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a18596f8c785a729f2819c0f6a7eae6ebeebdfffbfe4214ae6b087f690e31901" +dependencies = [ + "new_debug_unreachable", + "parking_lot", + "phf_shared", + "precomputed-hash", +] + +[[package]] +name = "string_cache_codegen" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "585635e46db231059f76c5849798146164652513eb9e8ab2685939dd90f29b69" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", +] + +[[package]] +name = "stringprep" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" +dependencies = [ + "unicode-bidi", + "unicode-normalization", + "unicode-properties", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "swift-rs" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4057c98e2e852d51fdcfca832aac7b571f6b351ad159f9eda5db1655f8d0c4d7" +dependencies = [ + "base64 0.21.7", + "serde", + "serde_json", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr", + "heck 0.5.0", + "pkg-config", + "toml 0.8.2", + "version-compare", +] + +[[package]] +name = "tao" +version = "0.35.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1c93047acf68669466a34690ac58cca7010bd1b201e1ec86f1fd0a75d3dd4a9" +dependencies = [ + "bitflags 2.13.1", + "block2", + "core-foundation", + "core-graphics", + "crossbeam-channel", + "dbus", + "dispatch2", + "dlopen2", + "dpi", + "gdkwayland-sys", + "gdkx11-sys", + "gtk", + "jni", + "libc", + "log", + "ndk", + "ndk-sys", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "objc2-ui-kit", + "once_cell", + "parking_lot", + "percent-encoding", + "raw-window-handle", + "tao-macros", + "unicode-segmentation", + "url", + "windows", + "windows-core 0.61.2", + "windows-version", + "x11-dl", +] + +[[package]] +name = "tao-macros" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + +[[package]] +name = "tauri" +version = "2.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "667b20e2726d572dea2de7370da16e188eb06008faf9a92fab7cdc46791190b5" +dependencies = [ + "anyhow", + "bytes", + "cookie", + "dirs", + "dunce", + "embed_plist", + "getrandom 0.3.4", + "glob", + "gtk", + "heck 0.5.0", + "http", + "jni", + "libc", + "log", + "mime", + "muda", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "objc2-ui-kit", + "objc2-web-kit", + "percent-encoding", + "plist", + "raw-window-handle", + "reqwest", + "serde", + "serde_json", + "serde_repr", + "serialize-to-javascript", + "swift-rs", + "tauri-build", + "tauri-macros", + "tauri-runtime", + "tauri-runtime-wry", + "tauri-utils", + "thiserror 2.0.19", + "tokio", + "tray-icon", + "url", + "webkit2gtk", + "webview2-com", + "window-vibrancy", + "windows", +] + +[[package]] +name = "tauri-build" +version = "2.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc9ce40b16101cb6ea63d3e221567affd1c3a9205f95d7bc574941a10636b632" +dependencies = [ + "anyhow", + "cargo_toml", + "dirs", + "glob", + "heck 0.5.0", + "json-patch", + "schemars 0.8.22", + "semver", + "serde", + "serde_json", + "tauri-utils", + "tauri-winres", + "walkdir", +] + +[[package]] +name = "tauri-codegen" +version = "2.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08279169ff42f8fc45a1dbc9dcae888893ba95288142e5880c59b93a26d2cfc5" +dependencies = [ + "base64 0.22.1", + "brotli", + "ico", + "json-patch", + "plist", + "png 0.17.16", + "proc-macro2", + "quote", + "semver", + "serde", + "serde_json", + "sha2 0.10.9", + "syn 2.0.119", + "tauri-utils", + "thiserror 2.0.19", + "time", + "url", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-macros" +version = "2.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8b394794f399a421811d06966343e7933fcae92d59f5180b9388d1174497a45" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.119", + "tauri-codegen", + "tauri-utils", +] + +[[package]] +name = "tauri-plugin" +version = "2.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74be5dd4bed9afbd145e5716b5fa2ec28cbc29c34ffa61c258c9273d896c8020" +dependencies = [ + "anyhow", + "glob", + "plist", + "schemars 0.8.22", + "serde", + "serde_json", + "tauri-utils", + "walkdir", +] + +[[package]] +name = "tauri-plugin-dialog" +version = "2.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2d3c1dbe38037e7f590cdf2492594d5ceebe031e7bc7e827509b22a999d2940" +dependencies = [ + "log", + "raw-window-handle", + "rfd", + "serde", + "serde_json", + "tauri", + "tauri-plugin", + "tauri-plugin-fs", + "thiserror 2.0.19", + "url", +] + +[[package]] +name = "tauri-plugin-fs" +version = "2.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7ecc274121aca0c036a2b42d1cbe83d368d348f54e0bb8a735c2b1548e8f371" +dependencies = [ + "anyhow", + "dunce", + "glob", + "log", + "objc2-foundation", + "percent-encoding", + "schemars 0.8.22", + "serde", + "serde_json", + "serde_repr", + "tauri", + "tauri-plugin", + "tauri-utils", + "thiserror 2.0.19", + "toml 1.1.3+spec-1.1.0", + "url", +] + +[[package]] +name = "tauri-plugin-keyring-store" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31bcea08aef26f1378f8b82004b434698c203f757e86b21346f7a38f8ae558dc" +dependencies = [ + "android-native-keyring-store", + "apple-native-keyring-store", + "argon2", + "base64 0.22.1", + "chacha20poly1305", + "dbus-secret-service-keyring-store", + "generic-array", + "getrandom 0.4.3", + "hex", + "keyring-core", + "log", + "serde", + "serde_json", + "sha2 0.11.0", + "tauri", + "tauri-plugin", + "thiserror 2.0.19", + "windows-native-keyring-store", + "zeroize", +] + +[[package]] +name = "tauri-plugin-opener" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17e1bea14edce6b793a04e2417e3fd924b9bc4faae83cdee7d714156cceeed29" +dependencies = [ + "dunce", + "glob", + "objc2-app-kit", + "objc2-foundation", + "open", + "schemars 0.8.22", + "serde", + "serde_json", + "tauri", + "tauri-plugin", + "thiserror 2.0.19", + "url", + "windows", + "zbus", +] + +[[package]] +name = "tauri-runtime" +version = "2.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0b4bc95aed361b0019067d189a1174a603d460d0f6c72606512d59fc9c12ec8" +dependencies = [ + "cookie", + "dpi", + "gtk", + "http", + "jni", + "objc2", + "objc2-ui-kit", + "objc2-web-kit", + "raw-window-handle", + "serde", + "serde_json", + "tauri-utils", + "thiserror 2.0.19", + "url", + "webkit2gtk", + "webview2-com", + "windows", +] + +[[package]] +name = "tauri-runtime-wry" +version = "2.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e6fac707727b7a2f48e4ded90976324267371073edbb415ffb73bb0458d203f" +dependencies = [ + "gtk", + "http", + "jni", + "log", + "objc2", + "objc2-app-kit", + "once_cell", + "percent-encoding", + "raw-window-handle", + "softbuffer", + "tao", + "tauri-runtime", + "tauri-utils", + "url", + "webkit2gtk", + "webview2-com", + "windows", + "wry", +] + +[[package]] +name = "tauri-utils" +version = "2.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e176a18e67764923c4f1ce66f25ae4abe5f688384d5eb1a0fa6c77f3d90f887" +dependencies = [ + "anyhow", + "brotli", + "cargo_metadata", + "ctor", + "dom_query", + "dunce", + "glob", + "http", + "infer", + "json-patch", + "log", + "memchr", + "phf", + "plist", + "proc-macro2", + "quote", + "regex", + "schemars 0.8.22", + "semver", + "serde", + "serde-untagged", + "serde_json", + "serde_with", + "swift-rs", + "thiserror 2.0.19", + "toml 1.1.3+spec-1.1.0", + "url", + "urlpattern", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-winres" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc65d45c68858bfe420dd29e834b5d15dbecf8a07a8a16cf4d532c7b1f69d4b6" +dependencies = [ + "dunce", + "embed-resource", + "toml 1.1.3+spec-1.1.0", +] + +[[package]] +name = "tempfile" +version = "3.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" +dependencies = [ + "fastrand", + "getrandom 0.4.3", + "once_cell", + "rustix", + "windows-sys 0.61.2", +] + +[[package]] +name = "tendril" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fed54709c5b3a53d09bb1c113ea4f5ceafd1e772ddcb0030a82e1d56c087b08" +dependencies = [ + "new_debug_unreachable", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09a43598840e33d5b0331f38c5e30d13bb11c11210a4b58f0d9b18a5a5eefcd9" +dependencies = [ + "thiserror-impl 2.0.19", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43cbfe0cf76104d42a574802844187e84a305e531ed54455f11fbde0f10541cd" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "time" +version = "0.3.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e1d5e639ff6bab73cb6885cc7e7b1de96c3f32c68ec55f3952614bec1092244" +dependencies = [ + "deranged", + "num-conv", + "powerfmt", + "serde_core", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" + +[[package]] +name = "time-macros" +version = "0.2.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e689342a48d2ea927c87ea50cabf8594854bf940e9310208848d680d668ed85" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinystr" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed" +dependencies = [ + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2 0.6.5", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-macros" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6328af13490e73a9b4694030fafd93f8c8c6a9dede33e821c3fc63eddf8042ba" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "tokio-postgres" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a528f7d280f6d5b9cd149635c8705b0dd049754bc67d81d31fa25169a93809d3" +dependencies = [ + "async-trait", + "byteorder", + "bytes", + "fallible-iterator 0.2.0", + "futures-channel", + "futures-util", + "log", + "parking_lot", + "percent-encoding", + "phf", + "pin-project-lite", + "postgres-protocol", + "postgres-types", + "rand 0.10.2", + "socket2 0.6.5", + "tokio", + "tokio-util", + "whoami 2.1.2", +] + +[[package]] +name = "tokio-stream" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3d06f0b082ba57c26b79407372e57cf2a1e28124f78e9479fe80322cf53420b" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "494815d09bf52b5548659851081238f0ca39ff638363907596da739561c62c52" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "libc", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" +dependencies = [ + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.3", + "toml_edit 0.20.2", +] + +[[package]] +name = "toml" +version = "0.9.12+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" +dependencies = [ + "indexmap 2.14.0", + "serde_core", + "serde_spanned 1.1.1", + "toml_datetime 0.7.5+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 0.7.15", +] + +[[package]] +name = "toml" +version = "1.1.3+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53c96ecdfa941c8fc4fcaed14f99ada8ebed502eef533015095a07e3301d4c3c" +dependencies = [ + "indexmap 2.14.0", + "serde_core", + "serde_spanned 1.1.1", + "toml_datetime 1.1.1+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 1.0.4", +] + +[[package]] +name = "toml_datetime" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_datetime" +version = "0.7.5+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_datetime" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap 2.14.0", + "toml_datetime 0.6.3", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" +dependencies = [ + "indexmap 2.14.0", + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.3", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.25.13+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6975367e4d2ef766d86af01ffad14b622fecc8d4357a998fbc4deb6e9bacaf9b" +dependencies = [ + "indexmap 2.14.0", + "toml_datetime 1.1.1+spec-1.1.0", + "toml_parser", + "winnow 1.0.4", +] + +[[package]] +name = "toml_parser" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" +dependencies = [ + "winnow 1.0.4", +] + +[[package]] +name = "toml_writer" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2" + +[[package]] +name = "tower" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" +dependencies = [ + "bitflags 2.13.1", + "bytes", + "futures-util", + "http", + "http-body", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", + "url", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", +] + +[[package]] +name = "tray-icon" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65ba1e5f6b9ef9fd87e21b9c6f351554dbd717960089168fcfdef854686961dc" +dependencies = [ + "crossbeam-channel", + "dirs", + "libappindicator", + "muda", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation", + "once_cell", + "png 0.18.1", + "serde", + "thiserror 2.0.19", + "windows-sys 0.61.2", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "typeid" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" + +[[package]] +name = "typenum" +version = "1.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" + +[[package]] +name = "uds_windows" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f6fb2847f6742cd76af783a2a2c49e9375d0a111c7bef6f71cd9e738c72d6e" +dependencies = [ + "memoffset", + "tempfile", + "windows-sys 0.61.2", +] + +[[package]] +name = "unic-char-property" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221" +dependencies = [ + "unic-char-range", +] + +[[package]] +name = "unic-char-range" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc" + +[[package]] +name = "unic-common" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc" + +[[package]] +name = "unic-ucd-ident" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e230a37c0381caa9219d67cf063aa3a375ffed5bf541a452db16e744bdab6987" +dependencies = [ + "unic-char-property", + "unic-char-range", + "unic-ucd-version", +] + +[[package]] +name = "unic-ucd-version" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4" +dependencies = [ + "unic-common", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-normalization" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-properties" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d" + +[[package]] +name = "unicode-segmentation" +version = "1.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" + +[[package]] +name = "unicode_categories" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" + +[[package]] +name = "universal-hash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" +dependencies = [ + "crypto-common 0.1.6", + "subtle", +] + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", + "serde_derive", +] + +[[package]] +name = "urlencoding" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" + +[[package]] +name = "urlpattern" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70acd30e3aa1450bc2eece896ce2ad0d178e9c079493819301573dae3c37ba6d" +dependencies = [ + "regex", + "serde", + "unic-ucd-ident", + "url", +] + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "uuid" +version = "1.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf3923a6f5c4c6382e0b653c4117f48d631ea17f38ed86e2a828e6f7412f5239" +dependencies = [ + "getrandom 0.4.3", + "js-sys", + "serde_core", + "wasm-bindgen", +] + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version-compare" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "vswhom" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" +dependencies = [ + "libc", + "vswhom-sys", +] + +[[package]] +name = "vswhom-sys" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb067e4cbd1ff067d1df46c9194b5de0e98efd2810bbc95c5d5e5f25a3231150" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasi" +version = "0.14.7+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" +dependencies = [ + "wasip2", +] + +[[package]] +name = "wasip2" +version = "1.0.4+wasi-0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" + +[[package]] +name = "wasite" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66fe902b4a6b8028a753d5424909b764ccf79b7a209eac9bf97e59cda9f71a42" +dependencies = [ + "wasi 0.14.7+wasi-0.2.4", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c62df1340f32221cb9c54d6a27b030e3dba64361d4a95bed55f9aacb44da291d" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.119", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-streams" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1ec4f6517c9e11ae630e200b2b65d193279042e28edd4a2cda233e46670bbb" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "web-sys" +version = "0.3.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8622dcb61c0bcc9fffa6938bed81210af2da9a7e4a1a834b2e37a59b6dfb6141" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web_atoms" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "075474b12bcb3d2e3d4546580e9de478eeeead668a1761e2a8860c836b7ef297" +dependencies = [ + "phf", + "phf_codegen", + "string_cache", + "string_cache_codegen", +] + +[[package]] +name = "webkit2gtk" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1027150013530fb2eaf806408df88461ae4815a45c541c8975e61d6f2fc4793" +dependencies = [ + "bitflags 1.3.2", + "cairo-rs", + "gdk", + "gdk-sys", + "gio", + "gio-sys", + "glib", + "glib-sys", + "gobject-sys", + "gtk", + "gtk-sys", + "javascriptcore-rs", + "libc", + "once_cell", + "soup3", + "webkit2gtk-sys", +] + +[[package]] +name = "webkit2gtk-sys" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "916a5f65c2ef0dfe12fff695960a2ec3d4565359fdbb2e9943c974e06c734ea5" +dependencies = [ + "bitflags 1.3.2", + "cairo-sys-rs", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "gtk-sys", + "javascriptcore-rs-sys", + "libc", + "pkg-config", + "soup3-sys", + "system-deps", +] + +[[package]] +name = "webpki-roots" +version = "0.25.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" + +[[package]] +name = "webview2-com" +version = "0.38.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7130243a7a5b33c54a444e54842e6a9e133de08b5ad7b5861cd8ed9a6a5bc96a" +dependencies = [ + "webview2-com-macros", + "webview2-com-sys", + "windows", + "windows-core 0.61.2", + "windows-implement", + "windows-interface", +] + +[[package]] +name = "webview2-com-macros" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a921c1b6914c367b2b823cd4cde6f96beec77d30a939c8199bb377cf9b9b54" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "webview2-com-sys" +version = "0.38.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "381336cfffd772377d291702245447a5251a2ffa5bad679c99e61bc48bacbf9c" +dependencies = [ + "thiserror 2.0.19", + "windows", + "windows-core 0.61.2", +] + +[[package]] +name = "whoami" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d4a4db5077702ca3015d3d02d74974948aba2ad9e12ab7df718ee64ccd7e97d" +dependencies = [ + "libredox", + "wasite 0.1.0", +] + +[[package]] +name = "whoami" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "998767ef88740d1f5b0682a9c53c24431453923962269c2db68ee43788c5a40d" +dependencies = [ + "libc", + "libredox", + "objc2-system-configuration", + "wasite 1.0.2", + "web-sys", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "window-vibrancy" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9bec5a31f3f9362f2258fd0e9c9dd61a9ca432e7306cc78c444258f0dce9a9c" +dependencies = [ + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "raw-window-handle", + "windows-sys 0.59.0", + "windows-version", +] + +[[package]] +name = "windows" +version = "0.61.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" +dependencies = [ + "windows-collections", + "windows-core 0.61.2", + "windows-future", + "windows-link 0.1.3", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" +dependencies = [ + "windows-core 0.61.2", +] + +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.1.3", + "windows-result 0.3.4", + "windows-strings 0.4.2", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", +] + +[[package]] +name = "windows-future" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", + "windows-threading", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-native-keyring-store" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "063426e76fdec7438d56bb777f67e318a84a25c707b07e575cb8b78e10c028f8" +dependencies = [ + "byteorder", + "keyring-core", + "regex", + "windows-sys 0.61.2", + "zeroize", +] + +[[package]] +name = "windows-numerics" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link 0.2.1", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + +[[package]] +name = "windows-threading" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-version" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4060a1da109b9d0326b7262c8e12c84df67cc0dbc9e33cf49e01ccc2eb63631" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" + +[[package]] +name = "winnow" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.55.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb5a765337c50e9ec252c2069be9bf91c7df47afb103b642ba3a53bf8101be97" +dependencies = [ + "cfg-if", + "windows-sys 0.59.0", +] + +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + +[[package]] +name = "writeable" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" + +[[package]] +name = "wry" +version = "0.55.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "186f9871daa55fd9c016578b810d149de58367113db7fb72b462d2323ce19514" +dependencies = [ + "base64 0.22.1", + "block2", + "cookie", + "crossbeam-channel", + "dirs", + "dom_query", + "dpi", + "dunce", + "gdkx11", + "gtk", + "http", + "javascriptcore-rs", + "jni", + "libc", + "ndk", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "objc2-ui-kit", + "objc2-web-kit", + "once_cell", + "percent-encoding", + "raw-window-handle", + "sha2 0.10.9", + "soup3", + "tao-macros", + "thiserror 2.0.19", + "url", + "webkit2gtk", + "webkit2gtk-sys", + "webview2-com", + "windows", + "windows-core 0.61.2", + "windows-version", + "x11-dl", +] + +[[package]] +name = "x11" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "yoke" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", + "synstructure", +] + +[[package]] +name = "zbus" +version = "5.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe18fb60dc696039e738717b76eaea21e7a4489bbb1885020b43c94236d7e98a" +dependencies = [ + "async-broadcast", + "async-executor", + "async-io", + "async-lock", + "async-process", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "enumflags2", + "event-listener", + "futures-core", + "futures-lite", + "hex", + "libc", + "ordered-stream", + "rustix", + "serde", + "serde_repr", + "tracing", + "uds_windows", + "uuid", + "windows-sys 0.61.2", + "winnow 1.0.4", + "zbus_macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zbus_macros" +version = "5.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe96480bed92df2b442a1a30df364e12d08eed03aeb061f2b8dc6afb2be91119" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 2.0.119", + "zbus_names", + "zvariant", + "zvariant_utils", +] + +[[package]] +name = "zbus_names" +version = "4.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8bf88b4a3ff53e883001e0e0115b297a9d53c31b9c1edd2bfdd853e3428624e" +dependencies = [ + "serde", + "winnow 1.0.4", + "zvariant", +] + +[[package]] +name = "zerocopy" +version = "0.8.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5a105cd7b140f6eeec8acff2ea38135d3cab283ada58540f629fe51e46696eb" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fe976fb70c78cd64cccfe3a6fc142244e8a77b70959b30faf9d0ac37ee228eb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "zerofrom" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "zerotrie" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" + +[[package]] +name = "zvariant" +version = "5.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bee2a0bcd2a907786a456fff45aaaaf54c9ba5f50b71ae9ec1a4edd200c94911" +dependencies = [ + "endi", + "enumflags2", + "serde", + "winnow 1.0.4", + "zvariant_derive", + "zvariant_utils", +] + +[[package]] +name = "zvariant_derive" +version = "5.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38a708216a18780796770bfe3f4739c7c83a3e8f789b755534bbbc06e4e23e12" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 2.0.119", + "zvariant_utils", +] + +[[package]] +name = "zvariant_utils" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90cb9383f9b45290407a1258b202d3f8f01db719eb60b4e4055c6375af4fc7c7" +dependencies = [ + "proc-macro2", + "quote", + "serde", + "syn 2.0.119", + "winnow 1.0.4", +] diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 5a67b2f..e35e1ed 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -22,4 +22,20 @@ tauri = { version = "2", features = [] } tauri-plugin-opener = "2" serde = { version = "1", features = ["derive"] } serde_json = "1" +rusqlite = { version = "0.31", features = ["bundled"] } +# URL percent-encoding for tokio-postgres connection strings (user/password may contain special chars) +urlencoding = "2" +chrono = { version = "0.4", features = ["serde"] } +uuid = { version = "1", features = ["v4", "serde"] } +tauri-plugin-dialog = "2" +tauri-plugin-fs = "2" +tokio = { version = "1", features = ["full"] } +tokio-postgres = { version = "0.7", features = ["with-chrono-0_4", "with-uuid-1", "with-serde_json-1"] } +sqlx = { version = "0.8", features = ["runtime-tokio", "mysql", "tls-rustls"] } +redis = { version = "0.27", features = ["tokio-comp"] } +# async-ssh2 is not available at v0.4; using synchronous ssh2 via tokio::task::spawn_blocking per plan's fallback +ssh2 = { version = "0.9" } +deadpool-postgres = { version = "0.14" } +indexmap = { version = "2", features = ["serde"] } +tauri-plugin-keyring-store = { version = "0.2.0", default-features = false } diff --git a/src-tauri/capabilities/default.json b/src-tauri/capabilities/default.json index 4cdbf49..bdd679b 100644 --- a/src-tauri/capabilities/default.json +++ b/src-tauri/capabilities/default.json @@ -5,6 +5,10 @@ "windows": ["main"], "permissions": [ "core:default", - "opener:default" + "core:window:allow-set-title", + "opener:default", + "dialog:default", + "fs:default", + "keyring-store:default" ] } diff --git a/src-tauri/icons/128x128.png b/src-tauri/icons/128x128.png index 6be5e50e9b9ae84d9e2ee433f32ef446495eaf3b..5fd9c3b4c61d91e6e3b194a4f8d52b6857b09557 100644 GIT binary patch literal 12453 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 literal 3512 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 diff --git a/src-tauri/icons/128x128@2x.png b/src-tauri/icons/128x128@2x.png index e81becee571e96f76aa5667f9324c05e5e7a4479..535bc6d13afe81e7027639a34aba1c843c631cb5 100644 GIT binary patch literal 33921 zcmV*aKvlnqP)Ei?SNh$5!w)-liu4!f4&33YXgJ=y`J;`0{Z`={}|(!{O7@A#N>O! zk7N8I-C6g+n0c>%w|yUfR)0SRe<-?7e5d>S^!G>KJ?ZZ=&n@-4tnUck>(M_IdOks~ z6lq|TjxidZplej6Yd22UWEd3mg9n53o>6+eOwWhtlf3}mM&&^f3%TJ+8G2jWy@8HO zx%jiIe>Rr2Zr=C4_vJTi*qzqe4RF|Dhj}YjtU&$BPD$aJiYHA1&w`fQV~;)XxZ{$- ze*N{=7oNDkZ&3kCOR5M(cyJ4Gv05r$+VW&dSm5r`cGyyaeLHsvjp^LRo zLYNcZJ9%Y;==gqHsnz&y{kKF{OodlY#S>~T?dTlhqv}=p`$lMJTp{rNIy(B5htJc% z3-le&Ku$ed%9WpAUfg=!ij^xWZl$n69k!Ab0<7?w3g9Ib`onUkt~j)sgIu%*NCjBVPLy$P53BppbzM%vx^vaTtqS=)hd0KUtEdc)RFk`gC8(4tG+e8*~-lR4YuIcr`TM-C+)oJy`g;?_N<_G5*Vlm#R`KI1KsjK|A>;{HB_#Y*z$am zj@#(%*XJvE<7Kz};%QqMtXz4jv38pZppM%mmt2y6=%I&5_+yjnmp{35d8t%Bn#{JN zsugeFwwAV*N~Hp0#UhN;Q7V_Kl``+-RYl{9-ls_V`4CgR>MMZAd=E`|-<{M1+rwai zTEcGnpxW*fS_{dAo}vR>CPCJ+O$cF)W$ySOy5EQCf32SHNk0|L_!}7tCMmC*A?>;| zV7US+`*X@68T@K!`>{=-d}mRSR>EiN9k!Wek0PLdjYsBcVVyQ3&N~nb*ecyJHoH3{7Z7TY`D*Qi=66i`myH5llm1rg}#~Lc9 z3N3{eQ3j<-X@uT!8LhYfy7J~<+$M?uND;j6)u9N~D;?OQNWKaq`RD!T#cw7-{t|7@ zZz9(m1_uXWe5_b0l}f5quH?(5GRRTpqe71>63{DGLPg*Uy&>!_TU8~0x_U92(#tgN zdT%3)>o(BKF>aqz-9n-gLLc7;k0os2zgT5ukjv*t8MKk5S>b@k>iSc!&mX?xaPjfa`>#t6u8fyfD3w2){CpVb@5hOWQnfTu%F}a2 z_rR}{A`k^oiWGsr^Yad$NW&>L=^uzGMtQBp(j1?93qgfSAUHy$ zAXWiAY;9@Fv299g_!19tU%u+5bDjw;f|uJZcv%&|*=L{K^6`&L$BQ^IUdoS?&`-!wl62nqxUUG<><@Q(@xN5|?%iCx&GA=qJQVz#r37+; zBH)sPww8`uxk|eldBa!U^o!H^v-|D$v6j2;`dPW56hKh92kh&d`=g8Yq9UC0D5Agb zrj46mbY!eTyMAH3I8Nz27Wi=yc>nQ)zuQw#z<1nKO&_mbldd`59Dk|Coi2iP1d5Te49mZN)ndui7nt&+g!i(}(3Cc@A6;~ep)f}V;L z?C65usL}7{`1Bdq6@jS$sJbv0#0MyE*v8gCW#Y=#T*n75UHM-lFSSdcUTWb#=f5s` zO?A9-RSpVEscE7@yF3YgQH_ljMd*3==f~{tvyX4@_^ydgoBZZ@bNtmluEz-Ekn&>9 z8c?d**49y=QsZayIrYvztUT|*mr@C+m#95A&u0I5XI=EpQl)%ZrQ{X*`uobXsFb`X} zd564ys^LGPdhU-e`2_j!7mN&#deme)#NeRHKQUUm#dn;J@Dbj!O zDOC6HeU9=E4Gw#wqhonr_(x%6WKwCw!{XWfAJQC`21e5^Z(mg7XFd3934u`e%kei>7Ijq+@O;s{3@f! zqB-6ipAO?LgaQ@T5mNyTr3v4#(~{-wXFqr5U$#U{Aphcvd??`equ-uV$hV%d&JunJ z_6?6vet$eHJwA-{B( zo_hpAmZJ|*y@1+>D+V{GcOW;}u09riuI=aYUas&P9vrSvK~K(4_3_R>nh<`hktc1A zH^-af+2cNTWxzw>1JM!|X0<|S#RY=Ezv_L5ezKc|KkOuYNz;IXmGW=6w!g2huRJA|HXulSpnGzJg^{i^4j z_1lxEJn=K@*RGGsdq+md^dA}(C4e}knUb2f=IvE|L$onWRi0V~Ds8RpyY0BmUc*0o z{>)n^6Aw_6f$?H655nWSmy3GnK=S$3F!}pKL&L!Lc9BnJTV!**Io=%K>~SV3k(hvA zF-YK}c`n8y6l~c08Uhum7hbF$7a&6IC3K$ih;&2x`NNi8D)*HJAL-~*D)MJA)K($W zj>Ut~9B+;{$2WgGbOi!VJFX94$~-dZz4Q1zf$*yrtpFIkm+yam=5N1D#XkG8-(Ms! zkFcGWYy3+BYZftT#)t8Xg6GZg=6G}bMUNxK1hst73we$Q6bfzo9{u`%{4)4x!}%BG z0t8WikI{RF$HyNff4`Mden{rNVmDxLU`Wb*`D9d$-shKqFQ+-)9G~{%f+&=a(u0^M zSAbqDsa$o}t8TjB8O{o1VGCwj08HA!_r-GgbRslp9bo`Z!ti4lukaA~F3nttNZm|Q zT1$&H$D8BL@hvg#GZ;r%0d@r{E%}yKtmXw}m>GyRD+>??{?7Z+Zx5!x!uL1zZt}?F z&r46gfO?EbPk)mUt9fhQUiq7f3x;w8F6vQZ-fJi;@PC(Icj2=f5F}1Qr!i4T`$FdG zHOHIdugrL8etTN%K(Q$x%AmS}?vB{~(%o@V zF@SLQ|M{60zS*ndpVzPJ^~mSXvCq#3#Q}t=$0x?jXlGEN9n&0djyK0&nsNWRz>SA# zK_Vq35E1GcY|D{raO73D{PKU&(t^3H-Jgj%nVO5pI*9c&G9We9#q{1R)Ak7EabT8zvg|3$J4BUgavTP`)K#Sl!|_Sc;NxW#{IXAy_;}w za99oY2fKgYprrj&kn?Zenz!cd)e{Gxf*{QjP)M-=<>jge{_*AuZgW`yi5S2`yFVmK zVWL|7ByaG<%~vI=t^(6_vH#B;eP&5w(?e^HH^*NM^=oD_|E&W&wN(?;KLj@X& zuw1bFA5D=%-u2o1mwZ2408HT(7X8>Nz;!goo8!&#S7;pl5@C#*hOkn|wUDrTNAu@y zxZ#GR0ys4=|I5|tQIhK~mz5|0O8K!8@GFf#>qg4_>&@}zcys&}9SElRsA$3!oga_nM|gmTqc}H^-afujF{R`v-17 zu2PZo{l0JC{{!2L8xUXz7BofRm5SaWt%cT>iE$$JE>{ZWzyhE=V$FUl=z;M0Gs~;^@T35 zFU+7kY>qd_o8zz4IO<9O0=L0~!|C5&E?BSt!<}CszbM6*qsE^Dip3&Bf06lL5#g^? zsxcCYGYpYtk~GJgG!oDY>I&3gjrUGwd{TeE zdHr7QaSV2CUkMOQfQQxA)udUH zj=vJ)SkF<1rPhq{q@&hU%2db9rmOho_$0&s1Uh?&VZ$&GoZc;~2#OI1uQu70^y~K}#Y9;8iM1d6AIdqX<7$ z{`u)Yw4I5RtAaJIT64UXNse{w`lyMiip1RCp>yJAqXzC$^)cgtuO+2(y^7x@R);ab zBop~uK@L$KB*;)jDuq~5*`hxEZ zKX(tgy^UtlrRF%A8&j=Mq3sihz~myPr!rqaw7`St`sYTBHTqu0V?(bpZ z`k-N)VG4hFbKD)~k1tBN_Cr&fFGv+jBX3m@` zf?gn#oUai#YmJi-4h|2%y7fLwbE)h@w)1sl%b>HP6WZF_Bn{No)-DR7rG?CQx^E>5 zfzN|KBb}deUxM+8arrz8HVe4lN}7|`T3h(@EzsWHPKu`s7A{%AUjmD?1-syXK+M;jyI~HuQRfeM7lEt^ptvU{6qhRFn2MYdrP64u3lcs`^oR zGNVc8M<)hhxY!S42(AtFfacpc1hR6&b9vY&ZwCr>6(D*=8G+7e_4vOW#%A|voL3jHs=xmum%AhrdvXVur4D((kO@NG=0+n9M zFiqDlUuO*|*rSsF9NGHMcIM{nQFyM@-$8z2H(z*h0RpzsI0fX4&@>$^>oK}YXbdx7 zNuZ1aa%1H|7#!UQqvL~Y@WZUxvtYX&c7b{G=8@3Pl=qK}4#S4tbudUm!vfje-35yl zErPxF-V=7+bywJV=bd2jR$IZsg$qRJH|vJ+0x1;oa_BccuO-_pN&WaRDT8(E*Tb6C ztKqT79tR?zgr}Z-3f8PyE6Rhdn{GNcwp_N~VX6GRk&#gt7#xJYO`BlD&~u~;3eed$ z17>v0p%_B9WE(u+M2+GVs96I}OTaJ)u(>{Mapg=v919Q`rzz_$<~DSwv%dSw9ma>p z?j_cr?oAu}kam96w`l-~3oup!O+{K?0v+u*K1wi;1)+jvGVl9gV0427@@CAO0gK7B z-)ifvU?vGY`|O+gHpxy~950g4%z$OvFN3}IS`Pc}yRQiS!i5XPKX=`{82%{=9?HFf zWDS7hHFU)-5EJ)doPc)|=TwmExNiMAQU;H}op;;`_uO+2JV{ESZ&M$%wUR}`uFQ;? zVjYZsPwd`Bf(!R?`8p5yKXHNW0k~|--m?#kVD=e_X`%xPy9ux&(KI9!s8W2oQYmz z*TTN7U%x?=0fAA%9k<^BFTAiy2rR|onK?_QixmX9pptFKt5%rRH6MD~=8*DiiQ)wD z?@SSXXHuZaV#7BMAcwSJd768U50OInJ9Xx_fBxpuMCH#L*7wrxKST^b1JJjT0yx7X z%~`A8iZ;xB-_)QX3;zW^z-~|{YQ+UC``SAMJ9|UiC z%UfWdefE|hpDtiwHij>pnj(};S?A61g1hd#8?L$f8n|KQN^&38LKkH*7A{;Q76Q8n zy}cVnF_KdPGf5G2x6Y9af|#yhDpS>G2{=j!rsXZR07MBO#e+DwcVvOef;xh{Ao|#0 z0lTQfr*$=UOsD6ys`Pw6Ux|<3JG6?T>SJQY@3PA-6o~5~6MrMz|KR;%?(e(bKJe~$ zzYE@Q@EZ&tKHT9$!Ex=VQ-PjJKW|+jaO(062ftnpb~D*3xcK5r;I_ZrChu9aa4}g( zOT_wFw{ATtg4Hlw=z}?3iz%HrBd|8S(6II60;tCW%=!V;g4n2PH!3yS^Js0N1`-mM z_$lZpP&LWC$cN-KppPT&=MAk40M=~uXzb@%CclzhzYKk&YsuVSFXru@d%l*^WD6+* zz7g)a`%cQ?x4_%p{#JPJ``$xiuQ7x^H07tFz)waY=*nQm%pN%Un0Lx??>+ayg%@53 zS6_7vtXjPawx$5*c1xE?CS)CD8`cg!O@YF>FuP-sxCMS7D_KVnDT7EKV4{dU!v$z%Z{+{k5?#aKlnV9s4RCs^51vdX$J}B z-Fx3X^1h>wISM{}!iQnWl5LHko%m!8DD;z22K?II`|KshCqD5B_~}o73V*ol4-y;M zW}9tc2b#-`asEkShOauooB~H-b>lc;Yts%w`(S**= zzxmL&znz5sV9M2Eu{e<%Cm)R?vJ402mvJ_4&eTfq0tfnrN*iHK-&4>tvl|XR_+Z$2 zo5k?#bI-z4Pd^C5aa% zMb&V*yqZ?K{p6z5xyUl&W9MCVf^&ay4*c<&YvHsN--IWgc$}=K?O;2qOIWv-Vgoei z)vhwkY+Gn_K^ps^5y4DFUuol#+Cs zySKmNZSd#+`4b%du6M#yPdy2v#SvJvc%fKR+;=cAzSb}Q@pSxqj2F9B3v1&UPOG(y zVUt&k??C@`QM(q*)Qd>sysm`>sOmzJXuNSu8vbnd500;g4FfO0zWeM8yX~&0FwLUWy2pdEj9V0I~!Ps~DWnYQJX zXhi!t$3If)6SIHkopym;ciV;h{bwkrKL9^CIJxZP$#_(LxL($1gOj)Vcl9_s;_UO&0C4A z)3!gGThV$v^lUOgEy_KeO@GupA-}A*>`hP&`wLXYy9oAw?Y^?>_fZM&nP>e_grCV& zd~?59fwo062Q;TlSI248^MCy->R2pNpTvOlE3{LW;{aJ?WpCV%c8BX3Vn}S%%wNqS zo(#bH6kpGJ`*dK*BJ|{FqS}4`2@);(f!Dt7bL{e)5waOUrR_d`#*IsKo^a zitDuVGgxu7`}k_Q;sOn~zO_&uqRAOZYOW^mO;9Wk%Qcb+Kq&AK2LfY)4BY}i$lU3s`uawLDim~JCYrW< zfhMZWi4=oQ*w$%T-!JJY`mcXg1EZ0{{D$|CP?eIkV;pPzuLq+Nek< zfmM!S96(7`To?>QrI!m~L+1gLnGa~A7yxwo2(qZq(cLxey#Ive^viu1c#|QzcGzJ@ z%JrAT??3UQ9|5VSKyUK}UfaiZanOjSfrXy|Gq_TXOHy~*c}F<>@WTavFJH({a)-x^ogC}l#1XbsJM)VS(q%A& zB>Se6vD>0i#j5JI5TsUs=KdY;csqfl>;+Fe{v`Bt&xA2GMxd#qWF@pm3Nrl8klO@R zkS2^E$jtO$V;TTxSZBeli-LgA5r9T2dtaH>(SI~e@?v>JptU-vU3Vj;pbj|jfckfT z4U-LY9~7-pqpY3Z%1vP1#UEMYHHy7zecpLim`XaDumk`TWBT0J(r~zM1O}C0{|mx8bMoU0?0Suc)|kkvFfS> z!QDpCRUvcoKKtyWVfNRtNjdw6WM>^nu*9qVScd~NdJG%#7pqP~r%JJg>7<{i!S)et%*>LWSu)ZS{c2ffc zdB8SS00lD(pf6hW((=o{8pka(RUbB;V7e<4Qhr(?;7o3t?r85wR{&1Ix0OJ8Bo8-( zCj6BOlwz7gfN8D*I!JviVzDr27b*gDy9Obw*-UB~&Ijeg>>5lIOQHn0XbW{00JQIg z5bxG>Ns|0pjj_HF!LsXR1_}jwkTU}~7@0`Ztrrl%4dNfgaK53?ha_QxOI}Mt;B9B;QBXi}K>(MRxmbw&boTtOxx@ri9I4v=fJ)~}`5(Xzf0 zm4S`5zA?i+%bD%J=I(D_U!$%V8gJYv077@9t4g~Lv-jLi@YdH|_h;YiWKtEE@LRZn zm=U+BYoFDNzh4GhVDf(iU-A$}_&w!PMGApd-mntxAjomQGq5agXvuX%9j%7tfJqY= zt;o2cKO1Cy>kUA*+nECgthJL3XqsdIbO#_U)*Z%?Pe1+isCOM*!k?lLU~`2l<6B0)L9yU)2V6CPI-zsA_tXf7m>#VcnGfYN0L7avK;uIjRVjnNi5)Q-G)1%^98lpkg zH=@JIQg#f$Fnu9W>;V}CC{ukL5(Ow`A&EYt90cSY=jK~(gfq_gq2!>MnA5N>6RyA{ zeSb_B{LL2fEx7&H@1|tL2wZM}ZMGsN+=L?W3wCt23wY>X{^u_+Z|*$eAe^97ZG~{I zXG+_4T5v|+;LuV6>2AQ(Uf*b#wdO6SS3((!HLab{cvFp_Jt==_KR7i3pIUrn4I+26HBP~9P9k8m{uO4y@!cKI=edH zrj@r4R^VyWoHb9iLvuZ;fCh^ZYu|bFJK@0x9uig`X2Z4JDa=A_$667yI)uKi@S7_vmLBq|Bb--L z8Kg_N^JivvJJN%(F<I z8&g(O4%2$z6R~l34SJ)D8+GZ4T)vf?rZ=(4&+ly~rW*#P;Cl2s@4QP)Qw9d{$yIb~ zpw6bBTEbt`45+ORa1y3{-HE=mELx`I*H>4-=|0}!ySh8!j@#~n_Z<5k7#tWB(h!EQ zXWzfGFbi6sBf%ArWmzQp0RS3ueWR7}FkJxaO=uy_xOzeo(Z>cDhdNyV&Np{aIfXy7xey)a(17b3 z^wwuYxoN;ra9A*=O zkbkm?&nz`pUwsuEaX2f1VW|gbX>BEd$_`3Roe2jXcp&`s*1yvGIw@b>DxX2bx+{R| zC1y!4w0UVwfV%4zYUnT9)?o{4e0)ND`tI&7s<*fk-gV5o;QQbI0nDB`o0x=&9cXye z7ycXz|2$3NRqB4PYUon4<+}0Kw=-m;q9C9nP+SKuNJEYT7&vk+P0F-XMe<2GAa&h! z*TDym{}3(65ufCfEQHREF1Y*dyWk+A{r>pJ{+XC;)`|bhP*%KyAz~(_V{IcWnHqc9 zU;$IpFQ=BVT?(=8)&AcYQB>;iNCYQSUek?jR+w&DPrr2O~2Ivt`hcpFzSu z-%t60S@W+P6kv(QR#$Mgk=M7gZ&Ud$fb9&|u36jMiuG6bxE(NYl>&!afHMFS%%|Xs4aOr44@e^RtQca&P$dxBeY^H*OTA(MA?Qh2X=bf)H(O zT}zNLiCp|j-4e+ntoc6sJvs_+{g8j+5_JXQGh{rj_klx9yi1cYoxD2vJl3XBeQ>WWK6gLZu{G9@byzpg;t6OFlIfQwwx+t z-?g{57f$=;X|VU+drKbsfB*7-qDVSBI|$L%hr4FMsETEPN$ccA3ckxvbbFBS;y_Lv z$}$vsJ~(K~u@Od7zTx_ngsl8268yKoX{UXY7=QZ6+~0kgU=fi&c?oWB`_rjZqNOad- zcP0O~ODqDvmZ0jh;^gu^t@CEE4dG@0^cw=K)T9A2*cGY@a7s0>l=8xv&_)bCqa&km z@4ffK%9ShOPuE@xcinZ5{8mO=+Ip*Pq??cDk>dgE7I2`iJwKBKzr}aQ6ly-cF6=JB zS72iisQ~E01OQRfVR1XvU?Hw`cW9F7#tY!I0#Z^acAIbz7Z9+J!4cSHmtEj@zrU2a z)oz3{&pZ>Zyz)w+v*Ne_x30ER(F!lThp2+^zI*P2A5u@jp3C=yBaS!%4n6b`VH}=A zxo-YWP9;`EAp~YG?V#*_9h@B(F| z41rg+5^!ezb#xI&fN~nFb7jLLMG8QJP{QnTu4x7bZXzo>i+L>~l@Pd!VZym`jbA_X zutVgy^_IWEkN@*O;hH~Q14F}u(9zZ8yz98qt zznyC#*ld61nP&y4>+@MV~g||b^rd_|21iuiwpqiPlOp#4dZZ>vU zi0K$YV#NXx~bgA5k{Z4{Q27E=}&UZZT@^2mP&Fr3Q0;IMeI4Q!Rv_6on0K>>1XuJkgw(6#zM~) zfYd<*Lf@7n6F=V}{rgI4(tcLGL8lM-qB&QRdIGpFMNt z40^o~#SQp9tpshxw^C4m6Z-RfK7*8VA0YN)Rz94k=kwWG^nDNf}Jz3PD$68c;q^zn>)T8u$y@jc~G2xg+6=a#A42FEvud z5y67#K|>q&A02_hMqlra%ohFjg2C0Mo3Uw=WHSyl$aokbPGtWOo!Dv-G&qJ)W!nmX zNceSp`&^b zLF58R+Rfv%TUlxp`uhd~0r!MFLkGkJE11ULA?HZSA}@a@M*`advuDlm$8x#I{o%jC zemn>8SV^$p%is6>@8!sSL3K)>em>Vq;$DcsI+QQ;v5?0Wi7xQQxjDw=H)9pnjXX_^ zKx6XN%nY=+XQ#;44|jK^l>}k}n>_r^##`T*RtT*^7a)O@Y6ec7Au!CsfSy9*8VfRJ zW&tqB`{%@*w~p`YKDegoR6NgXl>{x53_}`9tNL5E-E^ z)P-NG828hhBv^{hh5uvdZ8MSJq`gD}7iGZsZgnw|1X`PEx5O*(4KSD#HY6gz+@s2oqJ3Er2rlw;b(0;*E#H z1Q)tk!mqcc3KK2*!f#@b)km?Rlo@i2{9f>tg81V~=h%yPSx-!UZcqx`7CA3ZUbjh2 z`FF`7F@juxs~-l}@&U<4E)W)#vZ_4e9Gzvk)(&n6b=sIpiPEG09=445_v}S!Q@$>v zBO4%?8g158ta!t}gZ9pE|DDEJ->KYC(p1%Sl`U#OA#amKjpWotQ4Jp9^>Uvm_f|V9Pk_(9u`-~tZPwPb^)T8jms6VQFEvK z`qqsd$J)z9H~^U30ugJpn>N~bS}%Y`cIyc*Ko{Ifz5ZO$)=B9#zmdnb0?Yy$K$C$P zYqM;Exh*L}c*A0!FbJUk2ho@x1rM&ic6fln0or}?aI}zyK?g_{9mQi{6(hyndeM1n z=c%l5vzS+9alQhMDk#pT#-g@@gXG3dyOAuiP$AZ(?h4j*4OaZKMX>Tjy9Seje z_{u!=#u(*%PhjpFpGh9NqKOVrnSyPM*{_33@MDX>5O$Sa!5F4!iFUTibetGvj~fKw;y#`nAR}*+gT<>^M(8n+k1y^{ZdO z-~avlsCWHH>0;yboKaL0*l6N^DzHkf)0#AtV+S;gUO?HQE7PKI0%Ew5L8xlu<~dAx zv;$`uu8aNC5}!+XE$fW@DplJ3bA%C4+yp!Aypyz7Z`!mes8p;5F$;gbLn0SH45Q+J zAX*iNdT&63t#9S-4hR52v|Y+1638$s8g<-=(qn2M)vv7b;M1S}jFiH1rCkUDY6e!V zegSQs-6W6b%-0$_YC>dOJH4q(lx;OQEQeZ${&`(jrMUs1r6}zkU;iyhg^(`(k%dO_ zkD-YT&_RN~$7}Y0b?ep(R-<3Oj9RwEB)*BE-_RrlakYLo)cQuJE1+=$+7v>yxQ7}q zFKFQZL+rb|qNx%KpdSAxo_Y+9JMK8~KbbVtugF8Qfd+KpuLsb>%ulPdxPX1sp%nDP z_?&VWA<7nVhdbc<rK-Cf58P82!s{a#dA%+LIo~xjI=rcv^v+_MjJTVUu_{qvzZYyRY}bbx|;m+bvDz~ z)s%?V>0)wrMynfPWMV*oSGT4nspqIKp`Xf@l@-8NfjO_DsJ{wagRntJ?-8)lf{n7i zQ(XZ64Y>qk4Avk>oCXE~TAh6n`Va5?bkFtgi~t-W{jw6c?tiX@qmDWXHWKb1#|OfC ze`EL8(yf^cE?Da{RSggeZRfYresu}Day&PHcjNY4RVz|&SQ@G33ST_az!Go*5Lx#$4YBneJ@t0-!!Ikiw9g#WORt z$89q+&1ZrjsPxs7PZnmHuuzrp!{j`D9KKGP`c+b#UzHOV2GW~qT)k0wK|%}L%!2&7_;u zHmjXI>F~REbT#>}#UwSgon}s86B^gVKbH~=LGRdeK=`0U!FD+8xa0Oz@%N}uf_?K_ zr@`(N1S}G7AXhD#F&rzPi?&CMPS~_~tu(;;wyapgxL0CVIkaLuj&UQ7Lww;AE`T=9 z4L5y61$M;YN5D1LTtnzKTf+zeT(H1*QXhPKYX^Mq2j79i4?kSULm0`26@{({(sBMV z9haaM*w?Emg>55nCm4%C>!t*aO&KHa)Ke2MK)e3N(bcfscH6;Q-f|>aR`cM22Oki! zl{0>L2JE%>Uep#nAjm{EK7;87Xlopk`PW2+W~0QwF|!pQOar1R{0-w(&V|Gn_R4}MUzMc`Hf z8Ws!M?noow^xvuibH4(k-X`cBeID96^YDh(zXAU4paW&czvte&VYl6P6P(3m%a#(h z;E-S&*w+nBisy7|!1MtenSe%E-;Vr7)C`m`yR>#zm4pe;ijz{ zmfEeh+6u0?;tKfA>ED6xeD6EbsmBVSlUxGsuKU9kzb8xKk8m{6h@W`kM=5o+zW{wC z)32CBwK7(RR2@GpN0nA;(rzT!j?@2mAKfcOMuW8WcpLmezvIpWd^AR@@;f@|_?27|h@V?PBW1K>coO~PWKg|*%&;|Olo95Z4CF+&iN>CeO;ha7S! z{OM1Bg7eNh4}SQ=A42b@^@OO?E=58;Ei*+CT=mDRU{=p8fze`e47&&`svb~rxo#x< zs4v>MbXBFG#2CL1Qp!eQ%VmC3sm=9_ghDa%%SiBNWg`BlP6#>5?mO)!n1(%s8q9R- zci(+CrBr9Zr#|&5c>6ovCVoDr{CF-I@1W{ct*T1XYEw!_XHtni0$0hbjY&Aw*SE=c zfo?z$)HMnxM-?UqFVm7&`;fb zbLP&W2CL)XZEt@YY`yhXgd{u)!zBEz#3AT|oajCNVAWWF5zsX(0INYNt_Tb*U9BRp zk=)-*-JpD8kVJkOP3;(iTAAOXpmD~Xb}MF}1sRCIn7{)N_Fy8(D3T&rL~z|JPCE@g za^i__)sN{BE>sH?{7*qzixsDM zK~h9DK3)`Sia|cO@{&*9(|g;MDg0?z_zvPEN8AK8)L;`Nbn35fHyEf=8ZUru|C?P> zlQfg3@OT!Hg0qeat<<4Lu%f@8(Ss%kF_!~{b7s$hkAM8*w8Q;9eBk}Z3-JfD1Ep}2 zS$F}a3joTr6w-@}QeY!JAL1))3syBE`Qo<+Xub@%$-8^GS_PU9uq^O% z=gy^Lo?!LyYg`A>Py7O_R=*%oe72C@_yDp%O~0liq+VjT-FB1rj8kNPWMoLF#W>e5 zf*&#`Yh>Wy!db9N+CvKbly4C*Z5F4p_yykCP-kQgze}M5FBlRofRo~?&fh1dAH^%mI4(jfh{Oyk zDp-NlD6q+Udbu(Y1Rxm^xa>=i@|6b*C=2{t>V@bb5)g*vnoZ@=%!b_B>I0>)`M!G1 zYQpIo5xhYrGCA_dH^XaR_gabcb2)XDS%xUbUoMvDdOd*M1DKKpFn!nL?{obwX6qe?0T?Ow1wy98HxKE*_*M;a=(Fea z_!$3m-b^sU-w<*XGCPsa{97R9P$f%eTohdI#tlS`J}!dAjZrMlhGYG2IYGg5sdz4wwqcaIRc14{70CjU2b+q6{TL13UZNZFYV=@Mu zaS^bFK|Qs`A%ja94T_~Q?^v|JAt)j-Oi`<*B0vwZz$eo4??r4nuw zy0GvdX&Im+0N9Z0+gdvXvl}q3iN*$|N~?z!3?SLL7a{@i?!^l~(RpU<{(3II4m<#~ zdef~%oJd`vnXj%tyAgnelJGEx;9QEjZ``zz0&;!wn?iq^zh7v{Bf;`_W=1|@-oH8I z-!ECZ1h!&s!UgkT>2^!SyyvuD2j%qH(&2V#K7>R?#k6Iy&|5U?nC_0b3YEfnZLQt0`Tj_oIV>de({TBViXpbNFc3- zD&;CPaY2IVD#qTmRI(_=ShO14H726;j^d_3z4JR*IJuUdbMMQREfZ6oe-HcNT#Um3 zJbrBknfwbVGS81^Qy`Q5b}qqX>p<%81t+m8h`d~!GdemFxeY4M)M5p*MqhI=UFYX= zTa*LL#Gm^dtS2}yc0p7^z%7o31iEoR9j5I0Y_Rq1E-v+X0l?8x=yn0piVzxf+}QTf zm^6-t-*Lws@J_1jPqzTHfD2lb+%6DO!0d3I9;$YjtXM}GPgL5h#d}x@uzCJ(U;a0k zOS?Be51Dq@MEBW(LQX;S2||U12&EQ31laWH#C_7yD1EF2H(fCmw6XZnRfvfW_#%wl zFMiC|BCO}f6m!>wv1A4ZjR;}mt#5QI3Ih@hG*@7{rURVqx7s}LuES>V-~RSDDqdM9 zsV;U2>~vhbxK!**S=kn+-U%VBlvb*P5H+hLcmHgoH7Q)CTjTTnRbh+@ZaOGmU-i7$ zFOKN6O#FWk@=#^yv}A>3%_xg=hrui|dkdD0Q-$k@s{C)a-6q!rJ z1#p-ECL)kgMu}GYcG`apFb>J05=EKX3sqH3^n##E=4WEd7mh#La+m@rm{_m z%qGx;tq#Qmf-P#-%JJ*0-(;gb8B}J%Je(I7fH4g@GA|6lw5zj45M%BKn1}(Lczk%# zA(4FR_s8$|L|BdY7_Z0gPXwuhIblnsr@IF(r!LHAUwB$5$~{d1*oe%@?{Nnjb+X(> zSlSLXY)X<+V818p6LRZqk;%bef>ZG`8ja(F~>;co9VIH1Ww=iLUv#` z_H4NGr2%I~`RcUY4Y5wk#`Xt6;^7 zZ%|IW&EK)S^c}~v0@6rGE$DDZ)&S9TC!i*bwPkUn`s49V9PPkf@<8;GN3d(x^?rTK z7`Hy>ndcI={f5-!ZB&G`;v3(9b-ksefYnn|0sjhd!8IRn%Nx+Uuc$xroBVRg@xD__Q)MbzBf`D*7q6RmA2vxY7w}d znoFvA&ab)dO6cjB?Gv(CW=BmIKqqlcP!Xi9{VBS>ok-M5?*>GR(h5`S%WJa+PQ~$b z96k$cIu0Ol3Xm%Ly4z>MkA8Bd1Oq?*v5!$seNzA)suKAZ1?deeh>7z4R2Lw27nHMG z2{U)Ru-q6@+nb#`q=SO2X6vwPJFXjp04=x6U!Qa5&4d5`=}%?OyV_@nB5rAEt=D^V z*Tlr20d)i-r|9}mamCC^z$6jQv?K^k2#uAuAKFD^VwkQTbE%MGmy~@ zY{daw?Som+&y6yU8Kx7P_G6=CaKZ^E5LDHtiKt>I0+r|@ci^%sFM;>G=RI)8op*}4 zDkZU0Qj4C$2dx)=+CdkDh?^PMOtH{Kz-uTI^b3MKJDy<>qGk!biCb@HAoNX#{d%4| zu137`jyvH!?|m=);mS*)t8HeKw`UB&Pt!Fx;ln2gH-k?MS|6kVLLKwj2znYQ4}Fm4^a+_;2-ud!h#2%sC!GvmpliU_!X`68S3m%4Zh*bWDC=9f1AJB`AQ&Ve01Zl*IEi2hW<;xb(QMkd z364GXSh(ooi(s!k_9i7TC`Bo}nAu!iwPqFk>z6-Ia91CI%P+q|0*KsC502K=taG$m zWwXkOv(b&*$V2FiC%9?T+*EXy#b8?+j)R4sl_8@h@s7`cA(vlqIUN6i2LQf*&fAMCW_PH_JD=fhcNodv%-|5q>pV`K^RKu22#y}JYMec)cW_h0XV z*X+8tPi#>x$Lcy!5Tp_na&ZbUu2_pQ1}PWHPG_O!huc!^N(0ua%Xc@SsR(k=HFIGh z5BuxfHq2n3jQ!8VDi>dTF+A|dJ@l?T&E1UXJjTid8Uk%_!asZrKKt3vO2og9pv4%B zBn=Z#hx%|aW`{Y~IHh_vkyJ`Ae{X5lVR?RxzbbMQ-~)>+LNuF zT5}Fs=_(t6sLodKB%QYH4jLwqN+%UiUJ^(||9eoyrvZe5 z)++4Y^&KuiS{l%aR^&q51xL4|k9Ww}0$eA-f?6(>#ZQ0w>8Ig=2Of~V{U@Gyf*`?0 zq}#BI^7~!bCDuTdEQDg2cYF_a-+4K?Ngp8a(6MkU4Tq>xCR@~$O52CU_9_y*5gjPFi*|2)!bhD zUdmxJAK>-Z|DOZ`@45RPscCO(Qx0xGaL+lq{nljUTGg~_TpB=ci3bqB4x{&#X~ zF9!qPaNr?u%+W`~;YS=n#Xnu7D26G@@B8{3>&q&DN-y=t<97W7M5@H;3K$h+Eu4?YOrJnfs3 zL1<}hb#S?*y8toNbz0dfW=6aXzc_3FVoGy{?jozCDj0w{zo;ex0m;ev2pSMas*#8=05GaSqnjpG#aL8GvFrQb6O!W=xHweTRS2^V zhgcW6Q1C75#)@}kSpY^Bz|k;epfyEk%a$5wko6tA^J#z}DYe7S3X@bzb*hiohS|1z zTcXAu&#bz`6qv@46M#)+b^*d*RvrCn24t1(0>m`t*)&-e?7avs_bo76&%gfbm&BbB zaL-CLLJ0OPgsKnn$%wu=-%?;Wu8#IjGU>Y|f6sH_f3_0*zKT5eu>$yP83~v`L_Om8 zBSOzobx^*$v!g@KWxP1<$1(!JkBg7oeGAIP3xF;X6ihXf4Uko|T!02!-)T*Lg=Cp0 zHmGS|f1yVL3lJ?_eG=kwxg0@+r;5R`&sQJPkWq%7=Ctw@QjjHnR^YeM0J7CSXufO^msr?hM9NNW|+ zy2qlx$h1NOvdjL^AdC$2@IEofguf^`<&}eE>nv)8G2%wVh{8EYf&&{F7-OH0)q*Q^ z1)1D_jx0d%e)g|9x<1C{d8zCyc;a|~FIXxH5XO{U;f~9Ko|7EDB4PI*`>(m{8&=kW_>QWR}M%O%oHM(VDr*qDqup?qd}G& z)1!Il`(E4$DA|jU?g#7f^Hiz}(1xUnH7;dMMRt}a)54)%1*n7$67TBg$R%eN7GWux0 zj_7hCT))W!)s7r?|uO#7WKYryG~D`Tg(AE%r2;7|m~&zK^wQX8w1%F|1@ z1U%QX2vgz03ooQ=aEFu^hpfi6y0{G3Y-{(AgW!#~zFqdDa-jn2pLFjODm6kr)yG{G zbZNUKFSz!6H=J|M&taEcc7X#9c%2l~}4tU2n>Q?dYdblZ9ESUYE| z%$6i)AE2%-(BU??Ce`4pb>!=9j!M*9do^-Z7XI0@XTi-k-y+OR?fD+iDZyNpfXlVP zI_9&H*0ekuJm4v~zEe_wNop_~#1W_00SOl%ooZPs0qIR#|2{G{ zBH)zw-g_@WTQO5jIR>lnFhLvUTxAw;roCh_btiYb0f?qTL$}6Bu>n*KkxmZ{x(8lZ_pq-ww5{R`FYy*tjE`Yn|LP?{{ zr#}5D*mwE9Ff!3E%`j~(ZBioqjeq|-{NM*akh$dGRMZp`nYVsU+trhgwMae_QFBOf z100m&3Bku2r8=t4iWoJ?_oo1@TGjy!`o;`o+gy^d#$t9c31yOnGYvHES{_D9FaZ1DMc6^~)ZhO0 zw_(3M5A>A)!sZou*M%)HXnDF^=;#)?5bSqZ%9 z(6`Zo?Dsp{=)aEqOnB^>N8$5d{5*X3yWfRPeVZh0#h9#vJ(WcfSXp`{L(hE_qJFrlc_v{x=@-R`}Mpzb)5b zf&fMsd?h`(icX6l-5zSR_3c883YvjTnCP^KvU1b9HrzPYArSsT!=~YN(58q7Fz17&j915~9jO&Q{!gEQ_r34E z0!G4xST-ftWM-(o`J2k?TZd^+UhIO+@0Lw7f*F5os*k(MBrsKnhW+^L-*Y|s2R`rt z*loAn;LJ16glASi#u&h2#&)P#6d)XeUtDlDTy^D@qy*kd&|vQnEWK3Z@yw-cDgvB@ zF}@{ifwXYn>@uhSmaM;j1>{up5L6F8L)zv;QRNLq0Ho&(^!@(1@9% z^*jl9>B7BHbtsm}jw56vWo6afIh&s8DQ8qxt$IO-R@ZKNp7wV_8ETy+g919@jga}@ z1IHbEf`F@bQec%yK?;Hp3~^mWo%UP(m+iFhxsgaR z1maQzeeQBZs;NUYuY)Nv=`h)^Aux4w+!eXM<&#eNq+JT%;3&y59E5R`$0c9xl zZWesDswfsvtd4S66%Ib&a3Tl&5bUtS4gnacPYPmov2LyvWX_;U-TkNX`bK9Jrynpy zk7EE8dQ0o%JVE8qI8%K*Tbm-Jl&*RqnWnE%S)jQjn1L?8dh%D{e#!(~amAHz`<=JL zI5FL{5eY_XYl}p)84I7=SXpV5%OkSjbGcRl-cS~d7FZD1@foUAC6)cVR9*0huo)F- zXcr9g{N$>HGf<*Fig75F$6+RAN9N6+2ZMuyqC6QseXLl539l%A{_9_RFdTjKF|d5E z<)RS!3A&8m7qSK^rI%IX7ItpX5f_@O>szOniveVP1)wTy0T8woZA@Fxc$%8yIH~Uu zgVxiz^x~Fk-r0&pzetGDZkI3LO8`W!zWQpo^UgbAcwzuLD&0a7+SSz!bLY+#2leh;C&w%%{c}pJY7S=wY`x0fK#*W|%nxS=sKo z>#nq@_kb5(cmZy?C|1l~hFIMrE^U7fKLX3yCQ=FFZ8 z3l}aFrXTh?S?Gs`hGl1GW%>X9{vYAcLl1>*w%JyG@306yYBXS;0g4KB5Q8X4t4L5a zGAxa`zE!yM(=_J%2gL%->u3}rM4jn-5apwn7>IwyeESs50mFjO|*SO|_k z{)6z&cODIoKKdvDi#!BR5_=A_>F_Q$lTu+!n6b?^+xQs<`W#2RN2t`8vHHiU2fkDq zBOltoz@iLDNb;&6&vGiD91HOLnQ<-1^9a{3sIBGwoKo$;Vva~Cz$D}Z zCFI}J7{i6PQe2~lf^^+v)o@P)TQ)54oZ>5$Cdk4W5+>lVAc}o@{@q(|wKaU`gCCL# zOa860<0~I`D6E+~B zWfnrYz$?rcfYw21qbq9_Y7An*<~|F>KKtwguYK+QA_&ht_q=quJ^uLPLcYP|92_C< z>FE}wvF*0oLfBuxpJ(fUtpx@r^-+q8q%cY_PE^`*wY}I(_AQ41{7IpPGpLgGLBKP} z0?)g6^xJd({IoJB0PXBEI=Ur((cRrcZcL{%>aaV*uZ479yvwu2!{=5YsPWmeXUi_n zO6}LbK3~3htW=cp=mBznSOJDm=N_VyuhGEsui*lq6N#u+7_^>h$f>lxm7xRz2zI1R zgRk@$HLptyAZ5pI)&XQy#)Y;0e)JwKC7|(DSln|VK?n;m1o-$&kF`6c5t%lNDYu>{ zx~(ULZtHniw{D%(#dGZdSH5xffUN}1fs4?vVhCurSi$f`9vmF-5qv3dHpo<6j)ECM z)eX+aIA2m~yqk0NqPQRQeY0oJkzqFJSuycBi=Od(fDTqlT*Slo{23l+f#=ld_S8cv@aI4Onc^VB} zF#rfy8W5Uw0JVO7Ak4hLLt+qgfLBC7of_P<4n3`#;Sg}{aj=Wu!zr$L^X9=;TWtjg zz5ewgP^=JoNx0UK`MhS$8i^fjAQDa%_|RNtf#sAMD+vCMMT-`T5c1BQwVKz6~Sj#{~j}AfMD!K>}}dv-1HBRtFG~(F9H2{#;dA0gM|ql!9g* zfMa4gRmY}l2uR5bS{7{J0+^8CT3}Fvo5rB{U3(UMHpa_i%YcJo{I`Tqi_Go$^X7|C z?X&N`^7o@aAqCO;`uim9*hfOiKK2j=4@b%L761)8M{Yt2{5^{|Fi9>NK95`jskCbm z#lo*~0~B)_a`u9So6Y_?w9EHUN{?S_r70N=%rMk>Dh=Gy{2}RI?PmeMx%3%Sx zR$}lE27v*dk4mKyRAzcUUxAT6O)HE^3j(SJTi;+PfzSdVuWp>UnQ#~<9RQgQbpVF= z%Z@cdMJVBJ#k(?_?H&e8%`#bIOu=A*1=?5Xet7UaRt74ORAbugu?i(>#xSnl%KHs7 z^XATj9d_J78fd(rB2I*%T#?7D4A_F;^DPDpKrEOgLe^n{fzT3BekWrK)h95>2H&%( z&lUsUbB(@qJ5m~tEex?;a=xIm!U`2)k$nAVqgH0h%}4n0kBIyO;zqP^2iGksXDOmG znSr<`gJUM)=c~eFn5*giXYc=wRtKOz)GPpiVX^?Q9}3Z8pgmX>}LfqxOsIUjg}|Pp5Q#y@)ySj zg-o-D{N2YMdrX2}UESS6b!`@>=)Lb|Kflt0R-l{ZXeu5}A)td#D^cqoBIszX#t7-? zxHT7)0w+FT8l^fSrp6IKYxzZuV^IGNv82!e;+Y1nN(Yxyb4-MJ0T_J6ryysd)7C8@ zR1LPi1A``X2Xm6uQG-;1u0|7)Qw23T)UiRwGf1qwg81sa8+&Epaq8~+8?KiW7zfG_ zAc13#8rMRMZ-+5xDEb0{fms~Cj)t)4AfukAo6?SP4MbCCdYYVKk5MIbkWSrWE}tuwwx!bUuaI6q`#KsChrHo@AX zbnj?^E^fItD8_WC1AtUGYu_xUlABxyMZh=0!UYQ@2zJwrH^IL9>?=8XZt%%PsVo2! zg4ssGiA{II=vQEXWF#7FRHC}uece=Y4?}oySsrJ&6zk{-(7}&FCE(yj^LhRp^(QI` zpT^(8^%3lb-EjR4FoTeSCALwT5SC)}lZ%OfUlvrU0%+(u0HyRGV9;Yi!$-<1A>f?~fB%AZvCCa>d&1y++@kE|~{`s=_I8yE-|62I=wiRIQYT-_fXjuZ< zuBnfw?W*za>aq~*-P-;euE+LkuJ26S@wNA2@*Kh-pj9jpld$M>B-Z#ACg!7~Hu1VZI(Sw%#PowqD(*CS3*% zHTQqzuwv@yMF`CH*aa{bC>o$NDaF_V!`>nVQ9u64Po#`^_MF*4aF&{{sMQ)%+kGYz z55NXl-^!}+44Z%=C%>1Qfi{ANmRYH$VI6=<6MJ)tt5j%HC{uObTG@FPELZ^d-gh6d z)chPyJn=-S%jeS9u!$vE&gy`mPJ!vh41&UhE1=RU!?yGd)5zy*s}X1Ojx3 zSG%E_8>S+Zb+CY%br#HD0FONK2z>W@--UlV;RLFG-$DBOr9#c_uC#?6Yp?@&<`b;5 zh*8ynG`Kmyq-jy+T3IUF0?u5%N2$TUas7WRW(9y>vq&y)q$GQxOD*OOPv>8o@xVo z$OIh{Uvxex0Iq-U3*f97`18mkkCabvS6tZ0f|ld#QUvJM44H^~kY-VAakS86=0w@Q zL%A$aWdYBcdo)@Uw)|>0)mZS;E3UW#uDa?$wwQD1&1N z?b1`dSqcpdKV=00A?P^dzJf;|eN2#oAAR%@={4~21IGwDY}7aVdFMwv<>#^iOv-aL z=_a75zP^>Ds6#hEsza3;Z*6ZKD0E>*aTJRTzcMepbm1Ej(*g{QiU&{+IEc~`gS==- z2~-K?CO=9II(;JO%my@{@a~>|`e~uGI^ci<1P+`#`~(kRtQhnVBuPh8aR{+?RUc+q zF12EVnd4X|fLgku&FD%Zjn`0`_1bH%g}?pnHd%+<9my4b+}2zwjZ46f zeSWlr+GX}DXOmBwgVdPoTYUeV-@g%A0H8)XD)WkkyVhPkw#&kU*3rOHqZqv=SYo5$ z0n{?9;@#hb?)JImq0&X^seDQfEe3tw?wF{ zSP_(^DJQ7>O-c7<*W09H7iA{1u!ie{^+ia`a#Kt^L<2=hhf8Tu?RP+w(G7xK33u4Xsc&vMt!(t|-nKXniB;ASUop&y! z_U@5*FINx96p2YK=LJ+iozVep$Vew9!K;57ZG$NG%}fPO=m-xS6Q zfLs7+0xSf<*5~c3X?nZUr4FE$k?VE{Vmc3$I&?*dzbZ$)_++jQR{Eih_yCx|GE80F zapxVh%iSR*#B3EXaxlYwF_RE03da58Heizy1nV^bY6gqY8QIUOi+7}(G<^__dYUB@ zh6V%cCSS@SCcunfM;7kqO~yj08PL1|WiZVl*heZM4? zrKO}|R`{b|BqzZz)7^&LFR1r|Wi8ZH(;1%2+V!=^wUpCw3}aJ zQjulLmi_NJ2BLuRx6%P{v#IK{4;E}D5D6Po?fx$O8X22R!fquk#>sM+E z%*y~!q=7v%KZB3F|H1p>?RS46{s-Uf(xpo(UCL#K<)M!b8aoj0Yeq%te`r z2Z-Fg49!>`@*yo|ULf*d63}g=vl@<`5!mf^mG8?;z_ao=gYepGuc=&kFi3;52oJ$J zU|24N!0R|Zrl1Dx;O7P?J-X*U)tr>*9iWtjpPD)p1daSKvK7-F8f#D=tKppxNL&TU z77c6ptJkgq)bxtDhH`1Hflz3|K3?G%+NaehaMiu{iSFT7!96aWMm3*w3N*eb(E4Q> zzbFGR%ygi&zJ85tI0KCY=s!Qdd|CYLXYZ(&X@HTq)Ohn| zJ!pf`dKEq&^5m0KlgOcusor?D7y`i1K+`6eJT4S`n3#AiIEARk`Wkja7MRfiUi!fY zA1c)0U;T>l2;WnXTnv%M%&ve+@nnV;V@*FjJrx3!EQ4HWS?{%)fJAL~qF5Vv20wkh4 zVuRoTl+nwAe+UZRs);Ztf?m^CRK`!HFjvKgE<-BpG|hn+!`k^a4oon zml>8P_k4tj#(YlAA^?NmMaDuwe=|%NWAfRS@6t3BTsgnD{+w`C!02~xY12M{71Jhu zLu-0})R`*7@<0QT8^aeS~{ zKKTxo(e|)%gNkC$8=($hn2Gm!Hh@gU2Z|S;*2a#0_`(1!hiaDIV88$ux5LzpemLsE z4DMHSg(kk5B!uZfHxX4=Q-=ejogh{~2{f1p`YAruC^pQ*_BBWH{VhPE^&(ISAK8et zI{Wd=`260%`-kJpL`x&}NGs7#KqYKndd7nih8tC})gk`9wk)3Ih#krGYJY{1&?l z1LZgKIIac#4*oz8Rn$S2Kd3|REt^EkYAFT|n3*ED9g%G{rVI>RAXEaRU5+d88?shs zD`nv7AY`D~HM5h??0z6G!SM0?imcGtRm@#>ZWztKp4YG6^2^%a(t;aSqGXE_r1MO> zabpKL5nL0UBZ{zS1N`vfa^Uq|2T+6;Pz1=87ab5e6ZncoP{y@lRCB1A$d18=sfl@N zJ|ADBi-(Xdyt@$2@eA5NIj#_DbK4#&x*urpVERvd9cbup%l}@EhTu|+Zsm?Nr-B%K zT>((V__^SvL;3u2-PQp_mYWg+#B0K~A_U#aAFL*8bm13!>Q!t`g&Lkl!1!CQ>sL=!<{1(^Tn5Z90cUT+ zVsqQg&Rcxd-o3(ef@fa3`G*&OZDRf+p7fiL|1vg4JcOAtcmd_6Bo$f%X?DvK1jPa( zY1qlUSZ~Oo1`> zShL}1A>eU}83DkvV0@1QfFiOZZv=|x3=aN0n(ag}3!qNL*+#7sC>|#+OKgL;!k@dPO2aAXoI(mFix}Y*I1tCj@F>fS#mHx>BRZ@Kxd@0`ySx4a zhflfgBH{(oc2yqPO@TRH5B73+uX z@H|_Mh<5eZsd|AGGV~FQZn*?xpW)7mWktxX6Me7yY^sIVTnD&iBd#xf_jq&~Pq1dR zsowaQi*|Cm)o#9V?8pD`RN72U4N})`0HVf6lpEmB5sykmslxoC0-0jyb@drlSO)d4 zE7Hqi#FXD~uU!0%slpMeW9E}tKLzd&^Q+SS>Y>g57TT~;2y`TE{^tmQzMc>w?PH#F zZ$St+etU2TDO_tJg`wA|*{&DPs>A5RA5&^)kI^$gV(*zH;>XV=IPZ zw9&83duBatKCBoRCg&i{`YEMr?cWTwf0MPpJ2u8>)%JKC<>lSPE70}%JBj$rs1Hbu-@Pkb!(QSTjw|0Z?sk6Ax)Iv4sd7z_&mB?wv# zoACe<3_PGXd&`!LFI^lA zlLI01`;JVfnD%e_0zkO{Zm-+p?!VJ7pFD7Oc6Qb}e*CywLjdr$kNlqSZwAvuvsOSE ze3q#bSYG<*Y_=4(T>e)r({ASXUkY9M{urkg69UBGA4ukZlj#>OT%ciFjZ`1$*52-a z1#I{i1}Y^eRZ1{;RL+Ao^cAGblC;?BuG;g#4+@HPaoEwtg;2_Jm1{^ z`%Bjwe0_mvzsmo!_6Ha%HB;n{Ot^K>*&S3h12LSy+$BzE!(4TVKZ=Ua8!vatNLCxN_ zyC3YnfL>yb2ugp*pdccXhc$FVUm-g4Uz;_5yQRjd!wQgqln0N>1>0%v=c{(?*irgI zRX}la26X}F@4oTgWb>hcO^q+2K!}kk?Rs5sb^TI9H*`ZEmd=dNgI30X5X~sj?M{0z zH8lmJ!1|jbrw*K&otbs!UYc{o67Yr+Ek;{=yUqdp@d*wHN)8ChC?F`M`JoKm(C-(W zeS9|iy9oaARH;t4?M_ckbKvhy1pfBaZBMo8b%H4PAYpsrE8HavSAYu)VkN>>49&*m zX${@b?_C{;R8U_$Jqj9Mjay^WA46emIR2txHNT>wcRu7-6?50bioPKCh&_$B7k_ef zqVe!e6bJo2Is>^l$jSmq%8K$7LpO9oAC0c(L9n^6&3-*=vC~o7A8Oh9+L0d~`2JV- ze6{i2)88EkF)YAK^`>eAw)J-X0C=O%EV>Jea0MC)H$JEjkkaI74c*X}l^#|5vDQ~+ zKgO_e?jJ&65jp<`3ieOF^3N~+Nm-W8LWQUv781z)PV8FR93(rBW3cm zhHmJ~MUM~?RM3w#Kb!tzZ2q?fm?+&4w!Hj6*Z#74%B)xd#9OUx1}(z2k!s+X>8m4}c$5r_&lVJI?NxUp@F!^!hvf z{@g$eY0?k5^#>de_{GQn`BSL-XZ^Y3maY#7=8#v_2$(#sp&PoWi4nyWe$4!xDBUMv z30NHcN96BWW`6ejhh_dDf`G~Gnz-h%5cuzfH{YIUe(DD51OA9-#0Is)#msNgH->KL z)%3X8-{jhUW%~2@b@==eLO@PUO(P5^pFeu);9+L|L+1`Hj>5|$34lNdusiV4!r3<_ zn_D~xfu|t^ybwp2hUqmULpO9o&-nb!M4=D%T&R4?yn!6Klm*M`8e_KCkCVP z@yG%|Z$IZxYJIqHy+7IdR2xFz^I8aq0wEwPAS?{s&^IzYR^r=fX`kQM{Bhy>AwD)Tq^MMa$!G&-(cJL?!N`7=>CDXfJ$LW$Oe!q751d= z9`t0vj2n{&HuQ~57k-6bTNU_p)LsYt5b2lGQ=2T-{72?r{A(WK=g04toN8Mx3n2K0 z$`S}-0t_fD_|uXmu6E0YB~Y!|aFV?~A9G zZREppqdx^44J4sme*uwofVIBsy1)?-j+8;;kc`y|$om3yWj3>kRoKt3u>6qbQ^h^1 zw!ft{KZ<89gK0ii#%jIHzagR8U^nj86VC(qqFM-QXphCbIc!Ndo zdqXA!fIilOfQFhzW9WvycIiIM22gz4t(Io|PD?fR@G+wQi{riVMx$vDIM09d)C=<* z?eF*1+zz?i8vCAXTqkf&oLhXPyAu_I_B^bCN6|*ih(flG3q%4SX$_b>u%WMSIv30} z0pq1XJT#a`(A9@ycXD#d;qu;Q%l=YOqgAfFZIxdj32BJs0GHN5ucQ^F)K@T)ODRaNoZ2HWu0X$g% zG@ikU`!EOM zzHNa^;KPdnw26p3r@qCMNR)V_}TZ`GgURUuW6km~A!p zzdZk)O96~m8HD#b5divqfi`USgV;dtiQmNyWozII%-}A21yZU&p_*2nwgh6rAc7)G zqZ6Cj0<(!_%h#vbhKt%*(=*evneR08LkR%?Z(k5dW_%pmJgbid0=6?ewBzs(4*nbe zq0oE#bIYFMTg?I>78~FRL|W=??e6+L_)UL>kM%`vB7h*^^5FpoP_d#k z1^>sA={qS$xCJJUy}Iek#ne=}J_2TEpB}h-n(1v@1@@TvgFQbQz97J)UYD64{=TC} zbSsRE(>$y1d-E^;OQ7)?xBq_l`m0p{#N7h^71WJ*bbQZKVEpI7)6ZID_h1Y_7`V*z z1K%RBKqDcdAYo(;$OJ%XCaoxoer|(cw6V7MsQa*qJ$hK=gWFiXrsut__RR3M6$pS( z5J=EGgz}}+bevARgJ549t7>oyLgNI^AK)py8ntWI;&EN~+uUEp0w7-yY#ZD2FxrWp zBO(6`pY(J1NrZM0T#lL!e64S33n3{G(kR6VL68svWx_$$whF68qa^ehtwnEzmf$ZB zuiZ26=AX#JnTYqDhsV16B;4y!mK2>!&AALvtU^uiGd>Ffn~&oHz*c){**2Ko_LRvF zrf-Aco6QzJrpwQL1J@j}nw?{ZU;Xwq#rP=Y+V0Ei2M8x+(J@b;PR?wzor zo`C@PV|?l-@G~@&7a;u^g+fUM76~L|)NoxW1QJl@1c;ix++ z5(YlB0VM<4{GBfdq<)ak^cHc_UPbl6@N5OZU0sBbcoV|n6r{t+@6Eq(KKRsJ#=B+9 z7P*=jf0YY>OkY7FK(ck>$?Yg1{5-fDK|}Er*!(e;%Yh4^GX|=rKxGwT5dsQoGvX~- zkz6Qea4GYcE~Ace*KPVNQI-QK=MT#LTO?E=RsBsV1}gl!NH9_Ech36`{B&?XK~_; z)uz{vo;diwi9q+vtbL|Gi?SC>u4cP#t!xMw&RA(-z~?_bzVk8Lb9M>K+XHUi3F>d) zf=}b;Yg54MLFPc&`Mx;t&jtO-GKebX-X|H#4odJDQK0~!%3;>n zduL4HqT@8vj`%s#f~A;NBv5j!p*+hc!k7s@zfA4p0zl@N{1ojiO8WV}i4RjBn%*~V z6pqCm$bzf5<{iA&d0cX?(QLi7{qfBgQvp21^n3RTZzThJ>s0{c2!ky$$RNZw9%y>8 z^WH-U&TJ#kepHb6Sr`Ia@r!Q5ei~oF;*6AHB1$kP z0;7AFKT+1ZS`cRxZz~No&Z{syT#&bS_Gj|tz z7mR!d7v03q@jmt+;u#;~cU;7EAK~v`BD3^=VE)?>3^#H8FHw*GL1(b}_MuaApOi+X l6tnM8AH&!3a;>M2{vSXP!$6OkYQ6vf002ovPDHLkV1fv1H3|R# literal 7012 zcmbVRhd10$wEyl}tP&+^)YVI(cM?|boe*`EAflJ(td=N=)q)^ML`czsM6^|+Bsw9{ zRxcr}zQo#ne((JUZ_b&yGjs0DnR90D=ibkqR5KIZYm{u1003Om*VD290MJzz1VG8I zghNo3$CaQ6(7P8508|YBRS-~E%=({7u!XJ$P&2~u=V}1)R5w-!fO-@a-h~tZ*v|E} z)UConyDt}l7;UoqkF36Q(znu2&;PA10!d*~p4ENpMbz?r+@PQ{MTUb1|7*T6z)FB~ zil2(zBtyMbF>;>;YG>)$qf`!S?sVx|uX~h;#^2)qS-lr5`eB=xj`VYjS8X{eYvqSCp!MVQ+Zp)ah!BOx=<<)3_%H{42A-g}l-uWe_bd zKmuE<1$6Cm4{Ur*DPRCoVkX)`R-k#@gC0(4##3?N&+rs2dc29|tL>p|VuZrAb9JK& zu{fyJ_ck5GVdO`1s(8Q(hzs^@I>vkbt=CxD`%fZW@OrB7f}n7S zw;MjWo)({rDJ~hK-aI$VGS)_z6L!~E>Sw6VryiT=rA^<5<)LCh@l9Q9guNI_1-`wRLpA_?^qeI@{^Zz{+lxCXjoOEdxXE6j- z-}9&QGt)!@Lv$n&M0F*?Hb^el0wLG3ZEh`FC7fc?dC$UOXV;wR?D<@Fx%}@lCaE@K zIe00?Dp@Oh{qg!N38;Yn{)LzJuvpv1zn$1R(Led#p|BoLjY%v((9Ybm z*H%8*p0=q|^Sip^4d*N28NWotn@mYF!A9x=%ax4iXabcaAT^36kx<~Xx_9Z zmX)Zbg@R;9>VW8w!AtFGN20whdPb6jV6zmUw`CA5Y~Jtt{stZLXe@PlM@=iR@?l%lMcTv-0ZzU_U#FCgjGl9SWhR#KYD8+^q?uLyD zO|^I%UB9q-$qloS&)ueZ-L=kPvH{M2=gZgt5NnQWGVW{GIcM9AZ-3@9r3p02?cOQ! z6<-Ax;vK=O(lb6SU&z$FE|NJ7tIQ2V>$uunOUI1U9{mf5g#oJ*fnO^A5o2jQ|85>b zxiFGScj!nQE6RN5JEjpG8HtPtYK%QTar{@da0B~8Gioh}Bu(t?6YSVbRMB;ezkU$dH2D9WD2x=-fhMo+Xrmz_NhjTC>f*Kw4P zCFIf?MYz_(N*>U}tV$}LObr)ZQ6gOh3yM*;Xowm7?{w(iu=5vV?>{(BC8}Eqv&Hmve6M6KY z(yc~_FL9R9AiV<_N~x_e=q`H=P6=SraZcXHy__lEyWKbCwW+zLmR*g;T+5bQuWmnW z>&^mpczmZLymWbQ(`LBo>Awvj&S+_>^0BGOi>j^1<;88Z|(NUz;t&t6tm)8}ZfC3K(_uHgh_ih($^E!prj$VF1Wn zVsVh@d4g6UzEwgH7f?&fm`a=c0VoElycf8Xs>}BwC!_lmvR~NSTP+M8Va5J&-uUw3 zkm&#$BSn~0`#mE<-F`2qy9>v0Hp*8zS_0kb6QKOb&}l7}5u>I^R!nbGvUgg0doF4| zCTlnSV5i=KID}qvz{fliGV6L=u1UX@B@pzlP-D4R9|WhA6reJVbGX0RIQK#A`yvA> zpbj^aklJmQE21PMBO2@`BNvY}Ru`m-*8`2jKR#bzdB^x;KL77ov_G?_n{5&!etI4E zzRj|hqdqqMW7&fn7t0b29wlhUe*?3>72W_0LF*E&57{;b+1JHi{yJkKIgg`H2yUA5 z?ft#B19b`5)ZA1_;&lst06-8%vi;8CpT9_`)n8cNAn-6#A`h60+e*JJNT^)lNbGnpq7O4IT;4OqFpvVOBgHJrdIiISpB_%g}P3%LTXGy{Gxy zU|>bk;iKN2+Vq2m!Fr`0sf>WGq2UyBhw`4Gbn>%gw)JuMf?tn$fF^j)<=6a~jL{=a zvp`UtgTIFmR@_!L=oauo^I!8r3>;?4soM7*aeWL-Do7lWKxD5!%U{UrMaY&Q8LQ&&oMA z(IdMY8o%{Pz4&ljBVA{Q6iyYBk<%}uG|SE)sPNibY9{Z!R|B=RsW50OOUkYYeCF4Y z|AGS>h<7dU18Shbm$?4#ZCMC?Z+^QQAg_+anCE^ruJ{DQSq4`VYI3oT3|$Nt$lDQ8 z)>rz~XD)z?8ZK+c1iBU7imvM8K1-oBO8n5K`ugqxPgByg7T}F9c4s>+Qb|jto;_wMBmB28Ycg=bmpXr_eU%4kv44A0ILV-n;&gI0GBDD1y&W}Uzxl2vlg<_T(41u zfKt8}C6r37nkv?w?odQ*#;_F_Q|rI_MrzNX)93XO;9x`dCUC3RR0C`7GD9X_={|HD zC-3TrtFml2f!SaFV`t=t3|OqAbF(hfio(fnLlT|6beHB=#W{2}0`tXy>>*?4;+7lV zYQC-0agzK56iVxN%#*KT`o zzx!1g@-DB>be(RfI8;iPl%A^g-Yl&xGoVRlsyh`#c6|!`OyLHl3Blgj`*zn0ap0h~!NXz?Zt*&Kj%LpRR zOa6H?3%(Ca8I})0W4*Vq<1w<5&*`d`{d1j&B^7c@*fD)SOGTggpxg1Vo>5K9 zy`8yA+mwS!me^MFCk>Zo`wHm_BDlFEW`W{6?G{dqt!b@fN-@5(Tc}RcyyMHC<*@z7 z(6aB5=3*DXkNYpp_g&%!pE-+2Y`1;=$j5WU8#+HXevdQty3>I~sMJ~c0Pd3kPfuLy z5zDp^(DDVv%S6De;l&gPIdz4DrRf>1oFSGLI;I1{O&>stES{Ay?3A%f!>@m;CMQH7 zltkY@2e#^+8@o$aYY}*{GKMq$@8g0u-rfawjwFBl+0i>5$uN4}g%xR2tF_PzYF$QK zu!B+xF8rPFwj+l%*tNmF)TV~4RqC6n1 ziCF|kZuIFU5e`v%M<@I5!R{Ui<^%wfa~uFo{_G z!vE%i*D)va{)^vY*@l}HioB-jMC@_uB#ZR(ss~s&0ns_)d!I$w8I>pA6qKp|0N=7J zJlz~_zcVb@`3Bf3Dsg%nLz%<|y-}$bzg0t2;xO?G@l4Xv{?WKnVACRD>6p{;B5>2G zh&Pe)Y3X*zUK~e`9B>fM)2?=(g)sV8soE*J<tI3{xUUc z>QMEw1i&RTcGrkghC&&M)k-;DWkR6|F9%2Cs=QOZCBL01@ZP;Z#cs@UUU2rm0ThGo zP-^9&<-_!Qo@^CjpY)Blt*#xcZ$<^`d?3}Ci#ji=*j2o|#G1`@FPaZgz-NeyS2i?e zccNB!z^$H^R7AB%U~L?^&L%}*qBswG9eT!D`TLb^)RpQ07{)#~zL#I5BTvw@JzQ6w zhJ4%Kj2Un)KIk9DEygl6(O%L@2?6433vv0>15oQ*3YVPOG$DL`wuPkkU-_e7XQJ`E z;SCh8h&&q*`0Ytu#uWY-7Z1&c$Lnu}CTlhCz)`p#4$f3DOc61odffv$!x@slp>NWK zdX52XEP-3l0zl8_PFQ~eCR^}+ha7XIJ7M#VrJGM27UaaUaS8&*YTqy-z>^l>o5vxM zRnw$j+fw|Yc_%xncJrS#(>W&oSD^Q!UupJz9^K>x*3Ubb6qA;V04fG)Q;}%nOh@a@ce8QZlcy zc3|xfJb^L1Twfc#`r8ncFbveugS6)S6?qnH9!zm2oX$3cHvKxR8!vioMA6xAO2m}I z_3Wg0skWXwC9dUKU4$yVtDAEb_Aj*m8Q|T-87^9I6DLU(x8O{zwC<&RsA`>F0Y%u} z#j~rKzLEnkWp6JciYs)Usr|i7uOIlpvXwo}igq;sEVfUpx|+Ay<1mK)p8X%;+OMtq zY8!<}0ne4Q9@=-+lK!8E&z`s3A}58xf`0z;f7C>jHPQwg4Rj%* z(SosTOk|YLYta%go>U}>4?2;e-~5j#df00hKObENO4&lFLmu=SK;TYm^55xhcv?G$ zy$p?fwDc>qYo|1|oe}mkFtQZ^4`+epWEBebld7J0)6fqMXa6()kKT zKnkxSiT@+j!gV`SU5{t~$K-Pf+TKbTo$NW=M9CXY{vtwSI}VO94ilNBYzt zoa8keqkQ02N$w71ibs_aE_F7P=ZtD}UuD)UW^PI#_Dc6Fy^o7JRHRn1i2Y?r5kPzs zyY{hIqtoc-A)ierVHVhx|h zri`g_ZIJ!Esm!Sux)4K2I(cn(fUkTDCo$gXm`Zl{0b64w@2h9W-LQM6=C<7y-doKFLUA%~4>`rc(HkX`vk@3T%C4^qVP3`SEB z{mJ_@#WNSWL~F%YgAWaxS^w^8(zf*^-9UX(YV@L&;jd1%!n5lu%R67cs;dZHAde8X zK%N>tivdF56Zo@^D=&7eJ+;DB)El)beYC=r1^DANlF09cPcNW9V;^#g}@|W z!3eiwiUr1U=P52IQH`VY)P@Yw*X_gIX)gPPk1{%6ZM0+dVieVL!ih{Bn;j}1^p{@0 zX;JN1{N|?Y`f+xux{zEM7r3lHG~=@fzY)1eX#W2?*p!j(FKXfzl?@+XW>BnOiuh^M zoT@s)jXjOL>)FkYj*>mqGP<3fSDcH#g0Zrl{C&AL<=VY~inebUWDzlqRL!rPkK!-s zmbh2c?DNu23oyuh_(>?<3bC;@6J7WQrD^JZ*o!u;b>fwjZ@NeGzPA%m-kq_c95&7_ zX)m3>@Ju>mSYQVt`1&eXvQK27!M+e++G_S;_kGi#zOAs+w+ETE6k}5F(%sh5UYgm9Ii_HAh$ZwG7|fXXto|C`Yu=Z+)AWE;^_rB<@G#cW zyx}6GuPp`8EKF8_@Ro*6$3EH-RTx8<1H(x@{OoMmlCC?WC*I(K+VNShFvA_ z#44N8Y+P!qKw&QTx>wlZ{GiVhQR&zuLPNzB%LqC@$E2~k<&HGucty&Z4J{7t^>6K{ zG4=Pf@7Ux+ho0(OAr31hj}>wMS2%5X{NU&*m;A2$@^kdxnowu=3u`v?#^r;O1zt%@ zHUrJRqvp1#C`kyHbpmo*QaV+q5mhOHJ{% zzs}7>*N=v3gfyfj(9G408bY8x?)F6nS8y z>t+|<->ZS)K*nn>{o9k(RTpHlNvqHP zuJ{{D#@b&cKXmS~G~W!3w+365J1q)aKO{yhQ-FfufQh<4!}iN?Mrb9xt;6aZ`z$Xn zVAhop+8K3~yjNX1*&%@-r~@1n1ud5I-%pT<;!i+eNst~DhNSz_4h&Kxr%U*v*Nhg? zjl!8N)C$odMZBu%a$m(3R-zDRCuCqrk}F`g>3>+AdjF$Yj*=|?imJn_7O7!?j8=N` zgNbtsav%9yqO2*)wdL;@Z^MB2v8vAX*c=n|Th}G>ypE1DG-_$LhzbG&t7;>RX&n~3 zr(ZLOi2v~kb&wAaT`qO**_s1EVA6$xZF`T@vbM^c-@&|8vBlvL3QPRlylwtMbN~tC zAB|4~;ydT{3mF@p0@RUT^>1H*8rTKb9!CgqufH4#AkK2f364d=fX9D!{|=2_9yv$e z-c)s`Pd2G>L$@9&6E4pB1#?lyQijJk6&w2 Sh@|PRdL|X_cDM}D^3#tTC3sFc_6dY)r2Te-V6dFH5 z?Iv~|KVp0B-Ss~1V>oB-uGjl8|CrV6o%@)XGvE2ncV-MwaerM`XqqOt`N|((?fl2! zrM`vv8Wcb9MZ&lVp^nd-}#JT65EPW`7*0|sQ=1-4~jZ8c=IXMXe!`2uQAw+4s$|+>sW}PCX z_s2RCct&KM6SBkE&H7ODwKcK4VWd0kgi(0B#}ThYJU_Ba4ZMmCLO>2{m-%OL)~6?^0lJ| zE~|sCdz|3%#vA{{gAaTSh7*BqXjso1hGAG5t==Ruz;RsVyS0^-Et6S6*ZbSm`YuDL%+1Z=@|$nr4==og z(=T5@G}x^CEFG~>`pkQwW%0G;V02AWOrsBdffq*2hvZGdKbm0R>4_7;u(jXos#0DOfjeN+9lU zh0OXfJ-!6nSx`}8=mzOP7#qo`bUF>;E1;nvfTj0xq<}osMGt!x~2X)oB9_gJT z0+y{v!AMnmfGuY~rAY_A{FOcg{UHn-e+>bnK{1)M6Cb^MCpzBOj<$|gY`=9IdUozW zTYEd6{PEMOzhe8U7L;9}7RUxz%6|oH5o$QV9oYrL>Q@2r!h7*jq~#S8x?qhg)`vVT$x%LrJd zq$2C8HUUWDlE;Hz?1SG7;PhW!gDFCgwyXH?#7_<>Ex0i?i`n^EJoU35;d2js7AKFN zQhk-*W$gmJ=gI(kl@K)_u?t{gWMl--^*^t)Ky7X4Tjrv4G`xNJU5<82EG8O!jfl6z z(f@2eMn*^JiC<;SdU5C$m48;>;A{OMXG2QUHMyI8wIWw23VINZ1aa!rUscx2$^tBx z5~{RNN}@Ijq!T_YEX|ScO_J~&CT3<35dLDwmB&?!qhB}_g2B62vdFBLvC6wKiBEm< zer(yi6?^yW#kFe_GfIDPtWqzw@ao;icz;dcb!z)3SPl(fTm4I$C@tD)*D@YYjQdf|oA6PAi<}9WxO~k_wWbP&9B9<+3>?SfisO zICuU$PM#c~uyo)j_8ly9!-QV-~e7Tm53uD;v#b`W;e`A^gy zbg<@(P^w~0Eq@*tR^v(ShjgC2YfHzmf!AMrv~)C6C1uZ^i2B>o)Z=3sv;d=3o=sM* zuY5ME{JCq|>aFTehY%4AhO~IgEg4>UaqNpfR8>*`)U8^dIjEZwZPf|u5XTt63+1~$D|KkYe~|0>}wMPLT8jm@Y!H33Sz}5aFI6M9Lzqz|;A*0sGs=27i|Alfd@({CV%spP6rf ze;o)bf|~g>UnV~jkGjJ}<}W3{CRG%T?@stpm0p{GXu#O2vKTYY*TMqm>uwo{YT&Fm z&V3b&clullScJT_tMh-wKS(D38?GRgSD*JYU>y(dKEtX4IP7Im@Z3Xe@UxDGot9+B zBA~*=We-hcB!3bKu$?N{gz0{hj>T>@W{$>lYSRIWjyNX_*-n8ZNGT%hXYPw)L40tc2P@0*DCA%V@V0K`ue3T5tf9gtcfxwn-ELLB4t0Ki<6Qp9jcAVk-C` zeq13nX&#e_sJTc%QJxLYLFOMkwqAkwInKk+%R;M?qdpl8e% zz~nk_Qj=U_0yHHPHDsDRW_s?^i3Mb@dzxKNGZ@O)I+M(<0uvFs62p$?X_!dBc6%Ti z%8VST-rvt1_1W$wQ< zz3)YCphBMrVaP(O_j_+b9dmisnY8Ran!K25A^{weA{)CvpL5X*#7Rg(A&LFNOSRM4 zFbjoga@nP6w_x%dO5D058rj@3M8%)A+y{1Kn}5`w*B|@?cJg}3HE!J(5P`V@h*0$j zu;`a;gJ>VeVc-uFC^7jN%t1hamjuD`o$bAYtp*P|2Mi}D-|PK%xt655>kxM`@=+az zKpBcESo=MCn2?NKK4rXn?AUbdjwX-$d~h=N4{`>?AP@nwkP%J|S00ObRSDV@hGFEn z_J7ZE_NI5a_Bna=mt~%Xsgg&%zn4qgJ!8L! zAnng055-;a4PGaye5Fc?W9gqV_bU5zHG2uZD#1PmLLF($;dYBgB3sqAKVSv0I$ zwXP_d)#$n+y5cJe6>t+xcqxcP9&YIhGa`W*80P(+`|LjZ|EEv)y?3~bb1zVd-a9>g zZ{P0I=RfCveE;{KHZjU;<;s=js#UA9?)R5B{CY}zTi4}@q2#<&Dpj9NXC`H{cC}?$ zQQNjdmSqQQ+X@H)P0&BkCgesRZ5y`x-FEi2`b^h4-@UzX&gb8RojZpvpuZHIl%n4g zbm|}-?S_pLbVj4lu+MM$_dNIN!_97=ue$0gbH|Py*)z$g6+1|`)?R%6MSbz&#TIwy zvHLeH>FMrm=QT(o=*hevj-!<7` zP1E?F-0PZ7dmXy&h+^5+fT8Pe8m7K(?*}0~ttH1t4b1OPKyO2sIX%bjO*#Yi@COhLaCqHO7@2~tJ7ILS?hlJOCW&l2) z$%D~onC6O2J0E{V$_A1Rj%-B-VC71igxBQ>58kuxfsVGW+Yi0hg!Zv9j3= zOw%;vnZ>pAPwJIFqvSd){vM6Q3|m-Rezj}e*GFoC=Gr`2k(6o8-H&ZPcI4#3g9rXM zP3q*=bRBs{{jqxq=U+M!j{3<_dV`>37dn4phv%yO$>Z%L{5xsGF#N3T(rW`B+f9k; z9~>S?>zc9f8&@VflT2gT!lmWzT=l;$u<`Cd6he zIdQyg`JwllvgGf~kGtBBVh(ziUVdM&cIMPe8=G3*dDrBl-CaEm&Bs~@X<3Be^iQ1X z7np$%S~{JEVQLNZb%Vz6cGvd3@4da}ome)L5gg~mA2Ec9^WVN;Fyr_82O^R1Y_qkw z{qmuKL@bd=*gn(L8GoNQ;HJTYv&GI3F0LCLsh@Q(vIN?F0x^Q}mz#qF1M>z4h6u}B z!ZwU^AM+JvC)Dn$pp!FjaswwRVk}RX1B^K&&WD>s*$UyFb7v@cqBGg-JTsX}*AER2 ztBg%3P<{3LM$ zAr$BMB~3e5en9q%I#F+?Q|U>`WReeSq9BtiQ^`0(qu`QECo!1lh8D0eacV7QUOX4| z^)oST+Emom)gm5`ArJ`4tCFcC`uh6NcB&13IQj=1dcP5e{;vtGEltp^AgW_^@cRO) z(`PcGlJJ0LSy{>;G09A)Gu1Q*EV$;_zbMmJLJ>W-8#YAZqS}yS{I}$i%D5}kD){15*;mNnT@+Mvb zCr*P_2d-W?A9wudZ*a*amlUWS-!$hMwA0kmGas6onwlCcSg=5D2M-*?s#SMm&-MeD zST#Mz2b7z8D-$qGBdSxn7otHZU}8$%=*@%(3%~UH-^MQWU_F=rT)% zKFRahxlm{qIWEu5yOy;glg`Ki{qk48jNXARIk5bDP6JBY6y6D#^g(lYJk~3{bSKCi z;ebbipE%K?csXi|sR&VI&d(TTgohhO(123qT_4eUvQ=t^oHTiJHZM_z+j8_wS8S_d zY#rvd)Qz2JydsWgp4oucUi~eFH$T#;6dd2;!aR}V7KFRyvBoaB=dsDocNUaQz)x-N z*uE2+H~kN)qIJ^Y=4)U{o6-X5aBY{aw#zpG?ky)6b1uCUi*Hzr^-n&9a3qXiC?J2& zQq0XNhb9#DT_CtempkT=RYLO!u;4tPn>PLmH!ZyxMmh#l_o;}bB3BuG7HVenf==10 z!BRH5mZ5BKZ!f<2&2LdhH{tf%Z^zYFeF@vPZI|{N3I*jB2n3}1=HRfUHs}8Q8=oW3 z4+mv5*!{+vBzOaETJk+)djp6DDkU;>Yy+O=ma=&!PcPH5l-k?Mql(f~ERDPX(Jbih z?ncA+Zo-idj^Lhuy$9c2vJ^9C)Z;5(y%v{Ub{S^OoPpY!TB#kT&nRdno3SuFG>neU z4t&t`0p21Iw0-Li9NhOVvcrT6;?w9Jrost^moJ=_KaDXZw4KxhrsqkeTP>e;a|%ge{IcO5%- zq_wq`(3MVAqhZ9NF)3IC6_`+Y5!p3Wk@_-d?&`sZRvSf%tfz)Dd!Si04L@Q25UK+e zFhZv44Gk_VS^449gE5K#86iWhOsIsc%aq(--66qA12~-6g(e_IaQ~z3=@Oe97AH3^ zzW7U0_pjiZYp$jWQW|n_sq>bVk!N#}A}A9e?X>!iH~eZM_&QZ|a!Ow$ZOR%(RaFq( zt;5oHIHfU0joR4z>kWc4_`2oQ^9nuWm^bA(S=cF4reN`+#d!X?7ZC`N_a+tRArN`S z=j9xv(k!I2*>av`boOd~nw)hOoRT;64RvAC%qmLp<_{Wt$#cQvNm)7#UF z8*ltB-g;{+C5tM>3fp9-$9|Y2p&X!}#=NQ*g(R zm*au8YjEYCUx{QQ>6nO}i(aKdV3FtZOiTHIvYB87X80e+{I*k_7)QDPv(G()yH>5n zzua{nYD00Q_F4fV)=VNL{1%njQy{t?VFFGSRh5`Hc>-o#T#wIxel9-yxzC}lwid(W zSQ%@`Oi=+Kwi=;}vKS#5JTw&rgz^E7jh0OLLDpjF)z#G{V|0K2fE)jGT>C+(codD_&AaQ$Ci zFK3rWhRuaxa1WW2J0bji{P;TT-+us`w`?Ia7?pVjhg`SKk~Eg>Urn0sq{4RT-akJI zsKg=~jbhod2JG6ko7A=rI+=uB;Q4dcxa<(~fn8nQG|N455C#VZ<-qXDlZ;HO4b;`u zVb>eGsqJO*9&Q9Ut3Hp^fPBYLstK^>aOZDb(IA)3-0+AYW9fk)^>Z;3WQd%ZI zI_ALapTJQx5`|04v9oJ#Zb4(? zVeH=ZCTY_fm_B1VHc+a4<&}TI3prGn6kZ!;IYG6ih$yj~28_yAjOqj#TRN6~>eMNs zzNg{or=G@rYwp9(fBv7S(8J0PXiUD#f##Vv0|s{OegnskAD0fan@r(U>nUoZ9X-7R zq%T?g-B11&x7>0IIyyRJ+Yam%5=5+#(wcsXx6#sDT+wqaq%sB&k!jIez?j z^!E)YsI20z4X>IsR*fyl1za59cCMTeU^pELg|ThxHvHNAD+m%#1{YhH$5TsiWTd~dAmAaf{$YDZ3iO(SUk^jJ>k3WiKH#SJN`LT6RBBs}=Q$#K;9b4jJ}?J!U-u^1?B|E%K+(*QC%otA`*=db5wzg zKRt`CJBkY~n26hMyG`N@ZhK@-Szf=L{t}g+;`KmOvqrFxG#R@FxMFZv;~35ddU|_E zRZUzt?LthSK7(*P)eK3M`FLMnF9rq%q?44)FTEJ_ghC-opJS*bdyf*EG5N2RjxxqWrJs@0Ya{XA-*AHlDAFJh*lKZK?xe5oR)3r`2F7BQ)L#%u93H%kY!JN4b4at=!P9>L1@MB%UL4&|> z*ivK-YX>vVPdxEBj-P0QUyFN=PXmguerMjZs1mpF02un9$?NSEkjPttQK}DcVz*&M zuxHnPoIH6F3$9y;*_V7q;sc&ho=G=sj*irvF0cuihEJLRuM>Fc>Gfzi*+vXgT!u=$ zVE#+)uON-2mE~r)$qyT-ro`Dq0ZA|MnpEoGv7;S$Qu%%=8;4$OqVs zazXT2MgdR7=ukk5N*=$dsRf6dKBR;wh}zn563X(zhd9C8P%tFx2ToBWBZX$W@9gSC zTU#4>{7$MlvR_~_k*Z2WDmudJMT9TCzdSRcZ zN#~YHW^uf^3rCwzF@54`iz|ffp+)JQ=uPTRxWQR%q{$-;rQK`Foq0EEvAzYvTz(7f zGbt48p^+J&#$&?s1ETDa&ABGl1}Ew9@tfFT;gveXY5a4(JIe!!c_M2g))I|&)dzE8^6g;Cs!QP&O#Hk{2@^D$4?_@ax>&cGb^YPM0sB{Q<0my($LVX14JfHLbcVfl+K}kE;ZSd* z$mYHam3<^^F1J7YrM9jHk&5`bf>tMmEKq zCR~MORmLlgS+i$0{(AR@SrQJ@vlFuBOkr__%fpS#p2{Eb(PrYKz|~mW`>4I}@)U#S zb=pN!iGHtG!N>T437Y9+WcQ1VzVz0{O8zRE4^fuSJhQ=RK^G_jPvk(Z1HM@OK=IdqRI2lAcx~T zhq{XDcq2Q!4O@QkN-^OvI=95n)j3aHlV4au)L8>%X7lN;F_%Toaf$h;P81DkXVx1n zZ?P3VGE?*xP`GQ1iD&RrPQiRZFig)G5W-`S!*TxkEstz)y*)WRYfKMM7rr<|<{mwt zUiF13RIj_7REuujsPJ`O+GNePj>6hY7b3!p773fUL8}v zX=+7?CuIKT+$NaDVkU>l49@3eN=sQCCpL`j8QwC&8|&lq{|_h{GPIGq3IhND002ov JPDHLkV1l92yu|C)wDEP)$D+_Q%4a&H2R1!Mu_^Nh)TC#w@JiS9Kuvg#UxPFeCrP9?ETi-XTJB`p^AG;o{w7` z?ohkVId`wU*Iw&i|5{svQ+O;}woI9DWP*D8s@pT(&!2z(&6>^w2dC;8W4dk_Q@FvK z4MQI1)z=AmaVNhJpt>8Z^8bVi?@NoU667gSMDkjdzv zVM+*0Nr5A&sr( z7Pc*vLi+jYXD9b{C6*+Usjui6-jYsbptq+Ndb)d|zkdLd$t2IDbzusIgu$6Tnz0X< z+i})?*gbrDK7{YJ({oHn@zFngDELqn6*N@?d_~_GXR5vnKwYne;IZdkU$fs7+A?j+ z7IUzdU05`m+S-=k4J+d5)z44p>gu^CF)+ATPx0`_M~}hrV<&ijUq4SK(+pLfg6e?@ z?^k4bF2)#q3Lo^Xxx!G8D7>&1RzjgL&bmw*<+&C(TfXr>)*Pm9kNwK*SyvWeEyLN= zX3eIDS3J42zd!MhsYE7rV1EY*NgwD>D5&NXni!_0V8A{lJ+RQY z{juc33VvCUbwN?!_37NM*g04M0pjm)rZGLFg+kFtoMzfs^P3;)Bm-pY)>WBd z3(FSN+6SMxpu4;GmHwW@n4Q~qXHFdN)Y7T6wa&7Fqw35fa6kxERrOdj9x}LoT+u>T zZP>E<-P=%Ls|pB=6&2J2|9e4KSKsDiM?01FUHdZKUELwF@PdRCG)nWm{(re$p;=kV z47HzeIm<-C(Gc1wT+!f)4O`Z|QAl8{n4r45`(HnF;3({A->3I<_h}HI63X!jfkzGCB$h%QVjy>SRpN8bzvaFV3jGo<7x9d%|-;5%8X6eGV0D z$A-}kPLp=N{u5kHr_(x_A6(D8a>Eth97Wcl1wP~($efWM^}s)^-Q0De_wx7O`!I9z zL|5pHi7+w`^rkcMXf?ua`fD5CTz5sbB2&D`1PO}#sPv$I`3|)Dx;nc`d={LNW`5 zLO8oZh$ZqFFa77!`)PJ*6px}=)iuz&1fitx@sCgFi1TTv|ExIDna3vqdY}ySNH`Wo z#C{3BzvqQ{M^t9VqgJ%7+P<&7qveku?BE!GLY$GE?jeg$`-4ZLF^ahCy5ySavq<~V ztb(Tc8J`{KO?!H-K$9G{EVDFX-$Z+Kh8s1cy!0E?w8vSZ#yUrj8r1ID3#1W zUr#@$S*DN*JkwjBILv{jJjS`0A{bwUpZup3Ryv)T-_zX#$-zNpho{d7>-4Y;ktRS6 z)_i)e5xM2Vx3Sb`S_&XKULGy z>FG!XQwI}C;#{F|p=3$xlMOgHt+7)TFxOH+j3^?aa73yF9g>s+2ENaZ2@rWjVMt!V z@1-zR9^{rVi+VtW7Dw&pr6Zhb%y>BM%=a7@E+x!VgNx}Js=g`6@1u1~&`mQT@@PR( z!s~LiGds`hU`8_@(ncD&3n>&*8j#$E?mU6ihHQ!QFsWs7J!UTYDd8Ihg^FKV$AGC& zNPM8Ousk$6ln5TgL{cm!lJLw}D1l{Bp?%eZ98PY@fE zN{xCS`#qITLYgPQU@44)>!3yeBC#;k*49E}VNkfT>fb!0dBp!|d7Tz?3OdVEp*;P+M0!1yCk3P*s%lNc>N7{<>gKA;fEhVPr47nMm5BgdK6kju8(q!6YdOS z6ATZ`#1))v*TCmLe+{f%yAD?V%YAV2#1XVIGf)+7#QQZ&OA-mw z!kJwamY!Tc(TGx56{l6)A5uuHxDFLVIEoEInsFp3>I+)O z&z&vq!#j~4OO(SoRp+EB@l!#kwE$=ZiYwY4%;=L5v(f- zXdGP!x7@lIRbaF1Af$umtP4T;SJHPf^QTHaxG?`NCx1)i3JrsQ=zFH&>?xCB+27v- z$#en|dbf3LF4qy?`d8sTqdYb=FnG)`XBIPalGq67L54F3eVmX1)22^DV*a1WPpN~v zhJXwCi7fa}oH}47JSz?}zc+IrL~}u+HH;qDec?J(({o_^`@5m4rqNV`Bs9e$YF4zz z7&EKP^^x{5qQL zWDUNvbt}Z9HF8$@)+-od{|&2eEvwZ*ot=E!G72WJ9at8Qkj6xJcQ@R5=bg^NZVJrp z_}obuAjANxFF=L?0?*A|c6=|#L^{Z&f846)C^qhS=z{T7W7 zP@Qc*YJMqJe$6tk!=&2l$AITm*IWtJ zHE~$+(-p9P{{eXDp@(4XxG^%rUz+lY8GmxK^C2+aRnYEW_7}D##hfQ*-H+)87}6po zK^;DL6n^miJF!f}^H39QfH1Ff$mYxzEOWEhMMVt^^P;92i z@%-UPNQPJX`Uc>UpRI;PS6(G&RBd!LM0le#F5C#UcO(?5&r!xc%T|Md3uYw_tLHFl z0tN;UER9ED<8L;?eJk&mD)1YB^9?xfyz}6ne|#_O+_4+N7@vy8q7aQmB(foEXXtJn zjhsVRN7m=E!~^-1WRBx`=zMfu%%+DOf7}Ht?p+C2U3oQp_uJovqlb?}V{{@!5Xf}| z#T>`XHL5EtD6fH`WmjpbxJ&GeMst|cB91jQAeBnO-`?>pxZ#Ey;K2tUgoht~7=Cc) z_u;;Oc>pfG^ipVD&GUT&A0=~+OsKZgT8Eo9MXAg9A97MI( zhf9$L@kkAfiZ^35pD>2dEy#PV%ZI#LZq8GR4Fx}L^Vm6VL~+x z1tQRJI}=+txS$){G=)GuSF{SRuhv6mFfF6U+&8Q%xp;_NH3)fGO%=E}Gc7S%+=&Bm z@Zcesgz60$!Qf`Ecoc+G(cIw(5-E*lf&yW84RjFIfHg$0EDD9NApxf(kvu139)W>1 zs}xA42BCgj4Wu(j!0AJ$T?towtqRH*SKQDD1bfk+gZ@d~d0w zh~0hHT@Xh^gAfeY6!%lKyuJ=|;fW$8vhoQn*G{9EmO+kr8v0<|*|l)a>{)0z9*~Z@ zpimZY$mZ^{GS{;azGtwVVh%nqH|H6$R2UR_U8J2QFj6^Kj}WF#n@>Ch~nq>9$qBS^U#tir^LQczWz@+u|^B(gc`4 ze?Hv&l|P3`lO{~w-}WIymAIo8n8=znS?8CO0Rnt& z9wf6eMdWKP52oQDi7>U-3Q@;vu4eLKm2|x&M;et zGym*ouF+>>bvkC5DDjjGY?8w)XRk&CQ3RDx08vEotE#F{Kn>6|VFFA;=xQcXsaslF zWRe3tlF30#im)7V3!Tp~r?WXLEZ2=YwLW7`ILW?@=H{O?ZNib_baZB$1^6gfyuMU+lsV{4I-@z=DOX(t;y_Q50I%^s^XC zx-40)LvLT7$2Vg+rO8PJ(*14UzC)geC%Kt#=-i9t;)zPH^DNtRABn?7FzCzg+qVy% ze(Gr{EE?T%@X$JHaG%P|4ah-GfX@4#5DEf#ssAZgi_mv6WN5|`5<#<8w_;l|lhWW4 zqa*}{J|{eoz~9>1I(Q22Z~y*%rm#5AC5TosrUkCn(`<&SV-1eTC;?|@f@m}fKf#bb zR;uGzi~O_J`ki4H|HqD37z@ZVb{9L5bq-q~ zil3}NRa)()7kSAxLX1p>U1mAOJbT1en7eJqveKxcrcIp&@mL%dFIfyvJn@8_VUoIx zqgoCkZ}N7~Ru%#Hn*BH42(fPM&>$nsa_0tXHd!;vj6Um>t}8Pq>u^S`!~0o`)b4my z9Hyc3PBR}EgS=(^%J}2`-hKpw`@dvf!d@8;;mIaU;G#We&K$|PsESs>-`({c_|~`n z77iTffcpA+wBpqK9V0|eFw@KVqwi#IpqftLECm>8wJcHs5tKE99l zQx&O}_c!OxHZEUd>o;yEXxEZV}K&HmtA%lJoC$6!t%D| zu;ImD!Amc_1X!n6<^kKB3k8^`V{&!1d;h{oK(hs8hvR(%5+k;ABl;iWhYuAA+L7 zs~&w6Hg4Dmk3F^;9(;HuR7V=n0h-V~WN^=V=S+WGa@P+H;nTg_U^6+y>GIrsRil@!n z2!?OOjiA81{?-7Z1vK1myzxd@v}lp+yeFS{5)K_ajQ6SKtXC|cXq!D_=qZHo6&WvN zx|3x$fSLO}XbpCDo&egGW6z#;={D@&zh7qaV+Aspea^Y?7hnAgSh#SZIH!-Xq4IRi{lh~&C!uC2U(U%qQ&3r3od;c8u?$o`O643eE_?VffQG&K^Vfp zsqzjgE3=&h`HS_xfEQnQ5!Gz390;Ut$!w?BZ~+DKEV74 zhR@da6ezLc9Sql%6URE?z`hQt2AQ+xl_G`15WUw#E!Mt3wMGOP1H&R<*1M-#Ahb^E z*5An`f`X*FEb8JyKp=9%HlEm8Ir_})DdCw}&PHRFTJoUN-m{2&uZP&q9-)LbgwaGN zHAJJH)E2h{mOXO>_*Ia7lTLuxlXRyTX!c_kk%l}8)s8)7HHA+uD>7gY!Ib{}Olu!)j-Nx4@;T+}_>} zuWsH9HDpNO`XYTF%iMN%pc6jYvpDXC9(dpZd7pAH5LM25 zM-^Y^U1rwEV}sx(%26%7apT58Z?YGbE?o+Lz(OH)b@dWakZC{MC4~ADc=9Atc=U#k zT$A$yo@c)`X{H--s7EA)?q})JZ$odQS3*zZJVVyK08}ce19E&hg?ngU6;3+$sSI** z$Le}onpnbBXq z`DTg5t-Nm~toixF$jA6CEV*Tg#15Tg0On1cD=j06<#{KvE6!M}I{9Q9Fdu8}cWI8SaIIN`@onn~na<4?|)I}G~ zgZuA$0G@sJS=g}QdHB(fe~8(JVOCPr?MB7f^!am{0CpBJ3H&ECyg| z!#H^Bt>3}BAN>v@tOjnr;cLhT`H}>d>HbRFkbsqm|KK;`Edr{bY<+Sd!Yr_iJ1gP! zP}>Q=cW&9S|rP_jXG;3%DtLx zy4$s>xXDgJgE16Ukb@C|DWfLK=rNh+U;g4>!qw;;6DK2)7?fH1by!8syLPaW=W{vw z49pM@V;RaK86;t4k;^N*37`LAJH)iO6W_hDaTNU3*B8U}*WUp9_U?r}d(HG5f{OYF z`eo5a=}c$16(|%|ewN6w{Zz&DmDG@eei8w<5t+P4S(Ox69E%1HA?@qeuZN2+ya>Me zKmQjJcaEcT+$EF!ft%^e=KkXU{$t&c*P=Ad*JmyCz}?Cv*^`@bE?IHM zCeC2Hq`c1)W*QM6Zodqt&zy}sN#!R{SbQLNm83y)Qg^T+W=38IP(}tmL<>g2pzgLB1OaQbwQ!ckYTP+J?n3lth}0xwX9H zGU9-!!+N|QeE1>k#d}m0+QmE9At<;r@vyfXbs4cLsX>Jepn(Ac!`WIs|E-qRj>bv` zH)tTh_J!a4M#hf_ej;DSj5p=R*t}Mtw6<-uzJ$HI{T8I_bY_??!};Kpi!(_yX;}d$ zjzv{^5W!zB2MX@H6JX2~F7;i!TzLL=_6n?+tgHcILUvmTP9AgcRBM$N9!a*9M#*sf zU4zgrc45HrG5G4&z9tuYiX+*x$DyI+G5brd3N3P3ktPeuOh%B2T*MK~7!s`~1cQ>q zAH{%ZN5_6_LrhcEhkoQ&^X04WPTGQ&0H(5T4e^VU4j`Vpi*DBILcbeIJIBPpI8_7& zdXuny#~;zpx=%)D&p-cslUSJ;G*za;Tt2zTlXxIXFHFWfr4ejihF$23*0(B*Z*6_& z9r)F+p2gVK$N2k@6qf2Z3qf#Ix%p)|9*tiH%WmGdqP@rDMn_ z*}HEqyzs(r;QjZvnV_ygp&QNP(J9^lO9_1@O6)Tc*iSU`HKHXb>?m1-9WG@U@|fL) zOmY}TJ3n9~H=M*7mPw$w9MR$Jt-ps4KG=r*^BHg<`aaX9O-J=uF9k<4&MIwgCEFF- z;@bavyD&0YhpNTL=s(yGHQ^dbIQ{8Qe}c(Xi_SW0 zGE6yp3MPs-%eoiDU)Qv#kGbTfqcJB3nfclf(%(N|?xN7q(SZWmE7`VD+=*cz(T{Eb z%{a`w)D<5-q7+0+Seg1I_chj$Vya2~-iviw#BTI0Xg5x^bkh^c;HhT^=FMVSG75`p z1gDK&SxA=W?(FQA=|J!N*H(0HBN7>>ERg#82FWk1Mz$GJIz9}Fv)?Y za(Uf7T@vf-$Js;vlj%Uy^%QxKOTi?U3bGVmc7O#c)Gz)s;~Glvg%MVi-I~I+Js|X> z_{l^!G+22ABWS_T+1>%mCvcrYeOOe4@~RXr>s_Q$B)m=w=d-f!Ex*gIU*UuqJd9)W z#OCHPW_CeL@-PgmE`#5A2#$jV-|bM5iDK=Toj@m$p+$QZA8i^}yGPs6`5%3gYcBc- zqq7t7mxRHql|?Y})XmL_?FwHoMCN80Bsk6f#4R>L{t=VZru>ms`OLuF*2A40N>;=; zH)sg~vnikID_@_{Eu&$o6g%#S^LqKWi z@8_sq&&%i~osB^<#u zIIM2+4Y=m`-0c`{Xh~<%qzaY7fwYm>p$_tI30UNPDXNI&T`}`*yi~}aDkrnje2*3& zKl|*nl%`4Jc0K>vx>@LQaAh9M3(1w5DeG007IMamPxoTh3@bxB7Esk9_{Zx9u>yzp zUABXp-*+lyOGQ?q>MPAsr2nz56|YB&7fVa5Cqd1dcUwr=3R@+PjBDub>WAxi=uWd3^ zvsJ6soqVgSA>1?xDaIG$ZU(w(6|y`dBA`ionaXiTez8k#+Kvk8bqfu#8~$13Ziu7`=W(@ zSFU!fjK^@kWBI=?*|cc+2@JA^qE+F+y2jXY`h3Bb1>9@N@>ZN(9fSXM7=g{ZLz=9J zsTX$Of-JvMes`u_zIH@)t81v!n)ZM$+tbgcmYwI$t4cd5K`cZTIg3ajoU!F=2 zW-!zpDs8LD^70BlUG0i($!Q9!w!StqZQ7JjT|@0_&%L_litNTp(5h;vp__4+lH=h} zB!tks9$Z|nm^vCxJN7AU2YHGUx`L{zsnRD-YzkG^#g8{NjlG#ZUAAl)E5eFtMQd=2 zJ~=-30yGo1BB4aV+It4=5?(n3+1Cw{F9~zDw$F%a%6X zPld>NY|+X0+MjsuU6sKV6!Sqkmuk+i;czuhhj!vLYv8(g1QZT zs%$|OL=;J2=!0b@SIu339Lmi|q*Sn=uV)QoBjnM4TH5)O1Id`EsjJSA>T4X+z)4U~ zZFuMn64a`#t1>V|a-b_PQzgEFru~?-p3ER`K{K}r7Is0P=l`kLyi>=~6$P$lhsXA5jX&7X`?jm$HsIWN!XDGKb-EYsY?N>(Cw zu9Cq_cAB&c77`&7@px1xKZ?xrNHqK!850jZ`A?n21T}<>3QePfUNu);v=r<3{UfHy z#AK;b+=`WeUlaTt%BjmSJ5JY!o4hTf&IrnySYN$1cI;RnhnM`QXMVeCrR?1RW8xHq ze zoZ?Xw=0FajB0*Wi`fz8VwS-KN!%I!cJa21j<3lL9HI#=t%g(O9a5Bni3F1^=K^e8k zO~bfh9WtCQGxa>oTIQ+d$xiJ);8g33dA3|HO*WpyKH+SGfxJG+m?Fv;l3R!~LB&#t z&?5tf6psq2y9hlePN1bKCFX>GpGD@+M1-vUg7ZFmID{^n$%;|=p5622oIjgd?K!`f-(hBQn48j&V2IKz zx0APuPRinwM8-sN3vnhW6i*Re3LHMQ@!{Voa<5zxQmaN-pA8|6gs>c;p#h?j0pk5| z=BP_+QiF-9Tw&8uDNaGdu^GiP9*Gi-SWvj0+zY&N6+XwYGbo4_!wwFX-`q0W$-mvJ(`ycmMzZ07*qoM6N<$g0+V}Z~y=R delta 2857 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 Hu0mjfP)v1m diff --git a/src-tauri/icons/Square142x142Logo.png b/src-tauri/icons/Square142x142Logo.png index b81f820394d1504ff4b4091473a8263542c9edc4..42f85b307c378b596199f35c3702ada818fe22d9 100644 GIT binary patch literal 15203 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 literal 3858 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 literal 3966 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 Y2S8W#vM)6=T>t<807*qoM6N<$f*y@n<^TWy diff --git a/src-tauri/icons/Square284x284Logo.png b/src-tauri/icons/Square284x284Logo.png index c021d2ba76619c08969ab688db3b27f29257aa6f..14c6e96d8c3b385aa941a91f79a14b403b5c2a25 100644 GIT binary patch literal 42084 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%0A_MS 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

?JEvU!|#9hd-&D5U&)2ebv>&nuCX@> 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 diff --git a/src-tauri/icons/Square30x30Logo.png b/src-tauri/icons/Square30x30Logo.png index 621970023096ed9f494ba18ace15421a45cd65fa..3331f16ab432163257fa5ddbe90ff78ab1163853 100644 GIT binary patch delta 1920 zcmV-`2Y>j72aXSrBYy`~Nkl75?r#_Bmd^VtZ}uq!uw%QlN-bDKw9k zQj=DVMB3u~0Bofq2r7P+A|dzz5vWq4Knn^#5J=?_sf`^8r?e^x4YX++ls2i-BtUF8 zjh%Ju5R%m1U9V>!Gj}-W&OW^xI-}#+xpVJ1_nhxL=N=oNYkzEPOy9Y4r^~+&JpJ6@ z^z`iTQaZDtP$+acjvMu)40;}fM}Nv9C8Tm@yg$vx)fzVXlfAz@J#%sH6UpSFYZwNEMz^ncg=(+i&jy#;GCU#q z8484T33sZetLH8@uJa6;vqmpYBsQhfshk-wO&ZeJq{qT*t3%B168^JVP$!}o7S^Q| zoI=jf%&zouYTd=T^P}PyPycrCt=CTdb^gk{8wdt<#((Z3FHs$M@1r~~LqNLSKp?1_ zruik~()*W(7j7oi2gh-4sYKzV6JDNxbeT;41~vMi>6+q!bbU^&WJ3iR4^F{h0uCFC z3#kpZz08A}>$(k*(#c>U?;^dl00{@dunEIdDA9NUIlDmdG!ct6!!R_suH)~tUYAy& zed(UI!GExAyNefV#51pci_AtWE+)~`9>9)A?#JDm?!ube`q0#5sVS*c8q=3%@Q*j% z!Le7~M0!EcwqE-aw&Y#1>o4<5> zfR)pPs@MDW?!!~x`z|_KyD>X?1M?qzNPiwVihOhcAP@+kDYyz*&qk;P$Ymt_OwsCD z?fD0aRx(^CWH6V{BNB~bU|;}0+y8ScCKnK~!icrR(B9sLU@$;=P4gTZ(y;O1W1H}U zJx?NQ=iwA})ai9x<+Z_VZ0NCi7f2?P`26SY!S?Oj@#3LZeNTuFQaIT9&}XrFO@AMH zdb_dij@z+$^Jct#@+6j)(u8xU2;a&)mg@L4m;@@{+y;gvC6p=f%rnnoWaR4zhr(F8 zk%nm+$jdBteRCLhZ`_DnE~j8Q_0DM=IPj}t`6a^Y^*T%Cw&F2Rth1%sOp6OHtY{Eh zw`|4u_=^*K|I1E0Kd|$m<;Z?*zE^iooU=R}* zCeayhM~p(x_-4Hfg`0`yqJwf;7!vQDIjf2c)nfYQcMCOoQEsC=gS^U75JG6sRq1q7 z)2Em`^p&01LRc>>EGVHw~7 zF{ATIB1@!LW<>Qd!p)jPp_-VyKou#1mgZK(tQc0U>Oj1!8(m#-g})WC@cz^k=C96S zbaWg`sXPKAP}dj=;WuG)Y$iod=#&4-X7lU)db#od^^Ipe;sAwp;D7ep@bR_%WVl`7 z#20&h*fun3 z=5IMq)HR9@=?)o@Af0SSPENe?h>BOU)jXmb+LSJgAoq%-z^!!5m42imHEoJg?29N$ znMhm>s4s9_Hrl%;KDGPtM@RgO!H|B_KAP=q9r#1R&95V}uX(4XT1BO|!sklMUVBT_ zWGb2+CUKPMqaqGiH;zb!R4$B-WXS^YPmyx`A%2~!(9 zlH^ygDKV3p{Mk(=Xu`Wk{D@#IGk_gPQV&dinMYoVnA6*V3f_c6n`cZswXQR5@9G>J znhN<@*4bB}41X%vU2>E|D#2?#wmFX{G-a=92L)iYZ4U2%FU9H$9f`ktCuA&iizSf&?&-uZ+;0$pk>ntSJ}O^`}5`KJhipib(HjhGn0 zN^@i@#!6RG1|rZaEb*cJccER=BB?KFZhV$c^nL*l8x*UYZv4WK|j?~Jt6~~F%{pk~z z5A*>^M`?r5m9@RJ_x|uEtX(6Vk@Y()MVto*93wr)%3m%|#OZ~srm>zF(JvDuTq*@; zd&^>_BJm5hOU`3FjG70L#Vzv9I?`<7$T@Ry00000NkvXX Hu0mjfSr(Di diff --git a/src-tauri/icons/Square310x310Logo.png b/src-tauri/icons/Square310x310Logo.png index f9bc04839491e66c07b16ab03743c0c53b4109cc..ef47b52561a32706b0d36f8d31b635e999ebb91f 100644 GIT binary patch literal 50268 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%0AWRHTDT6sH< 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%0A(|pm`?KoyE7TMoJ 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 JPDHLkV1ml`X0QMN literal 8591 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 CYCL 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 Z9~7@qMtVKz_LBer002ovPDHLkV1it{tfBw_ diff --git a/src-tauri/icons/StoreLogo.png b/src-tauri/icons/StoreLogo.png index 455638826192851ad1ae604d66f2ca352979442c..86dd4e30c5bc9e70bc92a00f569edc3e096539a1 100644 GIT binary patch delta 3562 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ͦG@$`#{2GLQHY@FLEYL@Px&!3S&07D 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

q?+eX-HiM1;o1!kkn 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⁡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 O0000p>sMuNwv2% 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∓t$dRJGIadE?vc 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 Kx8Vjl{{H|h@<;Lj diff --git a/src-tauri/icons/icon.ico b/src-tauri/icons/icon.ico index b3636e4b22ba65db9061cd60a77b02c92022dfd6..7dbc9af355641c5ff7bdd0a25a32b4d3c06c8bed 100644 GIT binary patch literal 48638 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 literal 86642 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 AKmY&$ diff --git a/src-tauri/icons/icon.png b/src-tauri/icons/icon.png index e1cd2619e0b5ec089cbba5ec7b03ddf2b1dfceb6..f6b09f4e24af1c74fe1f1c361f26ba6dc05d7a65 100644 GIT binary patch literal 102661 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

Oh7fOfkLqr+qHzJK_C@N~lqxaF2xVAG~e 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 Ap#T5? literal 14183 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

5l#v3A#xI3*z~1~fvo9Q(N^(==!|_FZ z*duZ=+M1~)8E|otX8KNZlr?qels#x_1Xq@9IIw~@9uAREJVH)Xw^}UclF6327}E42 zT)E&?U%TK?(+K7%R!`H5oX0i)4Qn5??Iw3p5J~6_u+aWehY{DSn}3V2p$bgjnAu?o)v@iC254fXeMv50$9YrpU`N?u@QIWs)T?SP|fa}(|9 zqAX+!7`cx=4)cCBg5h~pu(?@9`)aCr#oyz$ld=#RFxYCNZCZls@4v2~*e-t6PEVvV z&bbK3b3wt(Coc!ufAbXXC<**#HQ%J9k`New6iG<5RjtO4XVO?dCvwxD{kJ#tfQr(X zg^NTwF-FwAeS_{V4bfel8l`~NbfrTR2s!G>WduFWxH(t~aK4q=6rEE^$+Uox>gJO2 z{L<;6Q6nHa5#ZEM>H58not!)z(6*_=^~8}jWf*IG$AUKVWOZ4?)GfF z+BM#*wKKmLFD7E~W3U!$IVm$k_k1f&Kz6WV8@55P?r~bcg-Za-!rvW?ns&)KOGT2~ zlkAyqhQj=P$Eg3w#K~}zH@J5bo-BfHjInKSz$@?+Z)NPD4pHj^_Qxmi`UqoTy=`sV zLVxrXGuBr=QRm|}wg75yetQQK4fY3#P_~J}zEfPnb2C4Wo!E(d*(cA;b?7$g2in<( zPn)ghX}nzJPmb6(3Dpeg_GW~Hc}Lt=lgsSZz z!5QXyz7KaR;D`3Ee}d`af{H>WWZ|Io1QI3~4Ll_`g1(cRnhLK73Ro)7zPCd={1W2x zRp%Xlvv4>!<2@}$hz|!V{T}_eHx2xkLl^hQoZTCnsjCl|W_@5Fx2(+j0ogy&Y+;L- z<)G$*CiN7hOm^s!{U>1F7U=iNk{+u~dAC!eDz%=|glFW0jEZU1&o(G_c#wTxUjnG} z#cg3>jEpUi#Mlq@t?Msg_#geK^Lx@DyHWf7=AS5vVyM7YOjvUVCfcpVR<(+5!H?9- zySI6s>o3m&*zr||=wcPGyBkQV`EWJl@bH8qobjOp+sXL*)=&yX)8aAbf~tGv?a2SN zu^Ddo-z?DWk9h9Yz#5p^NU#x~wYSd?H@w@!2Gb4G)6-utEMV~~M85Br5ff(v5O1|T z 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src-tauri/src/commands/connections.rs b/src-tauri/src/commands/connections.rs new file mode 100644 index 0000000..bc05bd4 --- /dev/null +++ b/src-tauri/src/commands/connections.rs @@ -0,0 +1,219 @@ +use crate::models::{Connection, ConnectionInput}; +use crate::store::Store; +use std::sync::Mutex; + +const VALID_DB_TYPES: [&str; 4] = ["postgresql", "mysql", "sqlite", "redis"]; + +fn validate(input: &ConnectionInput) -> Result<(), String> { + if input.name.is_empty() || input.name.chars().count() > 100 { + return Err("name is required and must be 100 chars or fewer".into()); + } + if !VALID_DB_TYPES.contains(&input.db_type.as_str()) { + return Err(format!( + "db_type must be one of: {}", + VALID_DB_TYPES.join(", ") + )); + } + if input.host.is_empty() || input.host.chars().count() > 255 { + return Err("host is required and must be 255 chars or fewer".into()); + } + if input.db_type != "sqlite" { + match input.port { + Some(p) if (1..=65535).contains(&p) => {} + _ => { + return Err( + "port must be an integer between 1 and 65535 for this db_type".into(), + ) + } + } + } + if let Some(u) = &input.username { + if u.chars().count() > 100 { + return Err("username must be 100 chars or fewer".into()); + } + } + Ok(()) +} + +pub fn get_connections_inner(state: &Mutex) -> Result, String> { + let store = state.lock().map_err(|e| e.to_string())?; + store.get_connections() +} + +pub fn create_connection_inner( + state: &Mutex, + input: ConnectionInput, +) -> Result { + validate(&input)?; + let store = state.lock().map_err(|e| e.to_string())?; + store.create_connection(input) +} + +pub fn update_connection_inner( + state: &Mutex, + id: String, + input: ConnectionInput, +) -> Result { + validate(&input)?; + let store = state.lock().map_err(|e| e.to_string())?; + store.update_connection(&id, input) +} + +pub fn delete_connection_inner(state: &Mutex, id: &str) -> Result<(), String> { + let store = state.lock().map_err(|e| e.to_string())?; + store.delete_connection(id) +} + +pub fn add_connection_tags_inner( + state: &Mutex, + connection_id: String, + tag_ids: Vec, +) -> Result<(), String> { + let store = state.lock().map_err(|e| e.to_string())?; + store.add_connection_tags(&connection_id, &tag_ids) +} + +#[tauri::command] +pub fn get_connections(state: tauri::State) -> Result, String> { + get_connections_inner(&state.db_store) +} + +#[tauri::command] +pub fn create_connection( + state: tauri::State, + input: ConnectionInput, +) -> Result { + create_connection_inner(&state.db_store, input) +} + +#[tauri::command] +pub fn update_connection( + state: tauri::State, + id: String, + input: ConnectionInput, +) -> Result { + update_connection_inner(&state.db_store, id, input) +} + +#[tauri::command] +pub fn delete_connection(state: tauri::State, id: String) -> Result<(), String> { + delete_connection_inner(&state.db_store, &id) +} + +#[tauri::command] +pub fn add_connection_tags( + state: tauri::State, + connection_id: String, + tag_ids: Vec, +) -> Result<(), String> { + add_connection_tags_inner(&state.db_store, connection_id, tag_ids) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::models::ConnectionInput; + use crate::store::Store; + + fn state() -> std::sync::Mutex { + let conn = rusqlite::Connection::open_in_memory().unwrap(); + crate::store::migrations::run_migrations(&conn).unwrap(); + std::sync::Mutex::new(Store::from_connection(conn)) + } + + #[test] + fn get_connections_returns_list() { + let st = state(); + let result = get_connections_inner(&st); + assert!(result.is_ok()); + assert_eq!(result.unwrap().len(), 0); + } + + #[test] + fn create_connection_command_returns_connection() { + let st = state(); + let input = ConnectionInput { + name: "Prod".into(), + db_type: "postgresql".into(), + host: "h".into(), + port: Some(5432), + username: None, + folder_id: None, + password: None, + database: None, + environment: None, + ssh_host: None, + ssh_port: None, + ssh_user: None, + ssh_auth_method: None, + ssh_private_key_path: None, + ssh_passphrase: None, + ssl_mode: None, + ssl_ca_path: None, + ssl_cert_path: None, + ssl_key_path: None, + tag_ids: vec![], + }; + let result = create_connection_inner(&st, input.clone()).unwrap(); + assert_eq!(result.name, "Prod"); + assert_eq!(get_connections_inner(&st).unwrap().len(), 1); + } + + #[test] + fn create_connection_rejects_invalid_db_type() { + let st = state(); + let input = ConnectionInput { + name: "X".into(), + db_type: "mongodb".into(), + host: "h".into(), + port: Some(5432), + username: None, + folder_id: None, + password: None, + database: None, + environment: None, + ssh_host: None, + ssh_port: None, + ssh_user: None, + ssh_auth_method: None, + ssh_private_key_path: None, + ssh_passphrase: None, + ssl_mode: None, + ssl_ca_path: None, + ssl_cert_path: None, + ssl_key_path: None, + tag_ids: vec![], + }; + assert!(create_connection_inner(&st, input).is_err()); + } + + #[test] + fn delete_connection_command_removes_it() { + let st = state(); + let input = ConnectionInput { + name: "X".into(), + db_type: "postgresql".into(), + host: "h".into(), + port: Some(5432), + username: None, + folder_id: None, + password: None, + database: None, + environment: None, + ssh_host: None, + ssh_port: None, + ssh_user: None, + ssh_auth_method: None, + ssh_private_key_path: None, + ssh_passphrase: None, + ssl_mode: None, + ssl_ca_path: None, + ssl_cert_path: None, + ssl_key_path: None, + tag_ids: vec![], + }; + let conn = create_connection_inner(&st, input).unwrap(); + delete_connection_inner(&st, &conn.id).unwrap(); + assert_eq!(get_connections_inner(&st).unwrap().len(), 0); + } +} \ No newline at end of file diff --git a/src-tauri/src/commands/db_viewer.rs b/src-tauri/src/commands/db_viewer.rs new file mode 100644 index 0000000..4ad7b3c --- /dev/null +++ b/src-tauri/src/commands/db_viewer.rs @@ -0,0 +1,1250 @@ +//! DB Viewer helper functions and Tauri commands. +//! +//! This module provides pure SQL builder functions, pagination helpers, +//! and Tauri commands for the database viewer. + +use crate::db::pool::DbConfig; +use crate::models::db_viewer::{Change, ColumnInfo, QueryResult, TableInfo}; +use std::collections::HashMap; +use tauri::State; +use tokio_postgres::types::ToSql; + +// --------------------------------------------------------------------------- +// Helper functions +// --------------------------------------------------------------------------- + +/// Format a tokio-postgres connection error with full detail (severity, +/// message, SQLSTATE code) while redacting any embedded connection URL or +/// credentials so nothing sensitive reaches the frontend. +/// +/// tokio-postgres's `Display` only prints "db error", so we walk the +/// `std::error::Error::source()` chain and also use `Debug` to surface the +/// real message (e.g. "password authentication failed for user \"x\""). +fn pg_error_message(err: &tokio_postgres::Error) -> String { + // Prefer the Debug representation, which includes severity + message + code. + let raw = format!("{:?}", err); + // Redact postgres URL fragments and password=... sequences. + let redacted = redact_secrets(&raw); + truncate(&redacted, 400) +} + +/// Redact credential-bearing substrings from an error/debug string so we +/// never leak usernames/passwords/connection strings to the frontend. +fn redact_secrets(s: &str) -> String { + let mut out = String::with_capacity(s.len()); + // Replace `postgresql://user:password@host` style URLs with safely redacted text. + let bytes = s.as_bytes(); + let mut i = 0; + while i < bytes.len() { + if s[i..].to_lowercase().starts_with("postgres://") + || s[i..].to_lowercase().starts_with("postgresql://") + { + // Skip the scheme. + let scheme_end = i + + s[i..] + .find("://") + .unwrap_or(0) + + 3; + out.push_str("[redacted-url://"); + // Find end of authority (next '/'. '/', or end). + let rest = &s[scheme_end..]; + let end = match rest.find(['/', '?']) { + Some(pos) => scheme_end + pos, + None => s.len(), + }; + i = end; + } else if s[i..].to_lowercase().starts_with("password=") { + out.push_str("[redacted]"); + // Skip to next whitespace or end. + let rest = &s[i + "password=".len()..]; + let skip = rest.find(char::is_whitespace).unwrap_or(rest.len()); + i += "password=".len() + skip; + } else { + // Copy one char. + let ch = s[i..].chars().next().unwrap(); + out.push(ch); + i += ch.len_utf8(); + } + } + out +} + +fn truncate(s: &str, max: usize) -> String { + if s.len() <= max { + s.to_string() + } else { + format!("{}...", &s[..max.saturating_sub(3)]) + } +} + +/// Calculate the database offset for a given page and page size. +/// +/// Uses 1-based page indexing: +/// - page 1, page_size 50 => offset 0 +/// - page 2, page_size 50 => offset 50 +/// - page 5, page_size 25 => offset 100 +pub fn offset(page: i64, page_size: i64) -> i64 { + (page - 1) * page_size +} + +/// Build a parameterized UPDATE SQL statement. +/// +/// The returned SQL uses `?` placeholders for both the SET values and the +/// WHERE primary-key conditions. +/// +/// Example output: +/// ```sql +/// UPDATE "public"."users" SET "name" = ?, "email" = ? WHERE "id" = ? +/// ``` +pub fn build_update_sql( + schema: &str, + table: &str, + primary_key: &[(String, serde_json::Value)], + new_data: &[(String, serde_json::Value)], +) -> String { + let set_clause: Vec = new_data + .iter() + .map(|(col, _)| format!("\"{}\" = ?", col)) + .collect(); + let where_clause: Vec = primary_key + .iter() + .map(|(col, _)| format!("\"{}\" = ?", col)) + .collect(); + format!( + "UPDATE \"{}\".\"{}\" SET {} WHERE {}", + schema, + table, + set_clause.join(", "), + where_clause.join(" AND ") + ) +} + +/// Build a parameterized DELETE SQL statement. +/// +/// Example output: +/// ```sql +/// DELETE FROM "public"."users" WHERE "id" = ? +/// ``` +pub fn build_delete_sql( + schema: &str, + table: &str, + primary_key: &[(String, serde_json::Value)], +) -> String { + let where_clause: Vec = primary_key + .iter() + .map(|(col, _)| format!("\"{}\" = ?", col)) + .collect(); + format!( + "DELETE FROM \"{}\".\"{}\" WHERE {}", + schema, + table, + where_clause.join(" AND ") + ) +} + +/// Build a parameterized INSERT SQL statement. +/// +/// Example output: +/// ```sql +/// INSERT INTO "public"."users" ("id", "name") VALUES (?, ?) +/// ``` +pub fn build_insert_sql(schema: &str, table: &str, columns: &[String]) -> String { + let cols: Vec = columns.iter().map(|c| format!("\"{}\"", c)).collect(); + let placeholders: Vec<&str> = vec!["?"; columns.len()]; + format!( + "INSERT INTO \"{}\".\"{}\" ({}) VALUES ({})", + schema, + table, + cols.join(", "), + placeholders.join(", ") + ) +} + +// --------------------------------------------------------------------------- +// Change SQL builders (PostgreSQL `$N` placeholders) +// --------------------------------------------------------------------------- +// +// tokio-postgres uses `$1, $2, ...` positional placeholders (not `?`), so the +// `?`-based builders above cannot be used directly for PG execution. These +// helpers emit `$N` placeholders and return the bound values in the order they +// appear in the statement, so callers can bind them positionally. + +/// Build a PostgreSQL UPDATE statement. +/// +/// Returns `(sql, params)` where `params` is ordered SET values first, then +/// primary-key (WHERE) values. Placeholders are `$1, $2, ...` in the same +/// order. +pub fn build_pg_update_sql( + schema: &str, + table: &str, + primary_key: &[(String, serde_json::Value)], + new_data: &[(String, serde_json::Value)], +) -> (String, Vec) { + let mut params: Vec = Vec::new(); + let set_clause: Vec = new_data + .iter() + .map(|(col, val)| { + params.push(val.clone()); + format!("\"{}\" = ${}", col, params.len()) + }) + .collect(); + let where_clause: Vec = primary_key + .iter() + .map(|(col, val)| { + params.push(val.clone()); + format!("\"{}\" = ${}", col, params.len()) + }) + .collect(); + ( + format!( + "UPDATE \"{}\".\"{}\" SET {} WHERE {}", + schema, + table, + set_clause.join(", "), + where_clause.join(" AND ") + ), + params, + ) +} + +/// Build a PostgreSQL DELETE statement. +pub fn build_pg_delete_sql( + schema: &str, + table: &str, + primary_key: &[(String, serde_json::Value)], +) -> (String, Vec) { + let mut params: Vec = Vec::new(); + let where_clause: Vec = primary_key + .iter() + .map(|(col, val)| { + params.push(val.clone()); + format!("\"{}\" = ${}", col, params.len()) + }) + .collect(); + ( + format!( + "DELETE FROM \"{}\".\"{}\" WHERE {}", + schema, + table, + where_clause.join(" AND ") + ), + params, + ) +} + +/// Build a PostgreSQL INSERT statement. +pub fn build_pg_insert_sql( + schema: &str, + table: &str, + columns: &[(String, serde_json::Value)], +) -> (String, Vec) { + let cols: Vec = columns.iter().map(|(c, _)| format!("\"{}\"", c)).collect(); + let mut params: Vec = Vec::new(); + let placeholders: Vec = columns + .iter() + .map(|(_, val)| { + params.push(val.clone()); + format!("${}", params.len()) + }) + .collect(); + ( + format!( + "INSERT INTO \"{}\".\"{}\" ({}) VALUES ({})", + schema, + table, + cols.join(", "), + placeholders.join(", ") + ), + params, + ) +} + +/// Convert a JSON value into a boxed PostgreSQL-bindable value. +/// +/// Maps common JSON types to `tokio_postgres::types::ToSql` implementors. +/// Unknown/complex types are stringified as a fallback. +fn pg_box_value(v: &serde_json::Value) -> Box { + match v { + serde_json::Value::Null => Box::new(Option::::None), + serde_json::Value::Bool(b) => Box::new(*b), + serde_json::Value::Number(n) => { + if let Some(i) = n.as_i64() { + Box::new(i) + } else if let Some(f) = n.as_f64() { + Box::new(f) + } else { + Box::new(n.to_string()) + } + } + serde_json::Value::String(s) => Box::new(s.clone()), + other => Box::new(other.to_string()), + } +} + +/// Convert a JSON value into a `rusqlite::types::Value` for SQLite binding. +fn json_to_sqlite_value(v: &serde_json::Value) -> rusqlite::types::Value { + use rusqlite::types::Value; + match v { + serde_json::Value::Null => Value::Null, + serde_json::Value::Bool(b) => Value::Integer(*b as i64), + serde_json::Value::Number(n) => { + if let Some(i) = n.as_i64() { + Value::Integer(i) + } else if let Some(f) = n.as_f64() { + Value::Real(f) + } else { + Value::Text(n.to_string()) + } + } + serde_json::Value::String(s) => Value::Text(s.clone()), + other => Value::Text(other.to_string()), + } +} + +/// Parse a JSON object string (e.g. `{"id": 1}`) into ordered (column, value) +/// pairs. Insertion order of the JSON object is preserved by `serde_json`. +fn parse_json_pairs(json: &str) -> Result, String> { + let v: serde_json::Value = + serde_json::from_str(json).map_err(|e| format!("invalid change JSON: {}", e))?; + let obj = v + .as_object() + .ok_or_else(|| "change JSON must be an object".to_string())?; + Ok(obj.iter().map(|(k, val)| (k.clone(), val.clone())).collect()) +} +/// +/// Each inner `Vec` represents one row, where the values +/// are expected in the order: `[name, schema, table_type]`. +pub fn parse_table_info_rows(rows: &[Vec]) -> Vec { + rows.iter() + .map(|row| { + let name = row + .first() + .and_then(|v| v.as_str()) + .unwrap_or_default() + .to_string(); + let schema = row + .get(1) + .and_then(|v| v.as_str()) + .unwrap_or("public") + .to_string(); + let table_type = row + .get(2) + .and_then(|v| v.as_str()) + .unwrap_or("TABLE") + .to_string(); + TableInfo { + name, + schema, + table_type, + } + }) + .collect() +} + +// --------------------------------------------------------------------------- +// Tauri commands +// --------------------------------------------------------------------------- + +/// Convert a PostgreSQL row value at column index `i` to a JSON value. +/// +/// Tries numeric/boolean types first (which need exact Rust type matching), +/// then UUID (with-uuid-1 feature), then chrono types (with-chrono-0_4), +/// then JSON/JSONB, then falls back to String. +fn pg_value_to_json(row: &tokio_postgres::Row, i: usize) -> serde_json::Value { + // Integer types + if let Ok(Some(v)) = row.try_get::<_, Option>(i) { + return serde_json::json!(v); + } + if let Ok(Some(v)) = row.try_get::<_, Option>(i) { + return serde_json::json!(v); + } + if let Ok(Some(v)) = row.try_get::<_, Option>(i) { + return serde_json::json!(v); + } + // Float types + if let Ok(Some(v)) = row.try_get::<_, Option>(i) { + return serde_json::json!(v); + } + if let Ok(Some(v)) = row.try_get::<_, Option>(i) { + return serde_json::json!(v); + } + // Boolean + if let Ok(Some(v)) = row.try_get::<_, Option>(i) { + return serde_json::json!(v); + } + // UUID + if let Ok(Some(v)) = row.try_get::<_, Option>(i) { + return serde_json::Value::String(v.to_string()); + } + // Timestamp / date types + if let Ok(Some(v)) = row.try_get::<_, Option>(i) { + return serde_json::Value::String(v.to_string()); + } + if let Ok(Some(v)) = row.try_get::<_, Option>>(i) { + return serde_json::Value::String(v.to_rfc3339()); + } + if let Ok(Some(v)) = row.try_get::<_, Option>(i) { + return serde_json::Value::String(v.to_string()); + } + if let Ok(Some(v)) = row.try_get::<_, Option>(i) { + return serde_json::Value::String(v.to_string()); + } + // JSON/JSONB + if let Ok(Some(v)) = row.try_get::<_, Option>(i) { + return v; + } + // Text fallback + if let Ok(Some(v)) = row.try_get::<_, Option>(i) { + return serde_json::Value::String(v); + } + serde_json::Value::Null +} + +#[tauri::command] +pub async fn db_connect( + connection_id: String, + config: DbConfig, + state: State<'_, crate::AppState>, +) -> Result<(), String> { + if config.db_type == "postgresql" { + use tokio_postgres::NoTls; + + let host = &config.host; + let port = config.port.unwrap_or(5432) as u16; + let user = config.username.as_deref().unwrap_or("postgres"); + let dbname = config.database.as_deref().unwrap_or("postgres"); + let password = config.password.as_deref().unwrap_or(""); + + // Build a postgres URL connection string rather than the fragile + // libpq key=value format. tokio-postgres parses URLs reliably and + // urlencoding handles special characters in user/password/dbname. + use urlencoding::encode as enc; + let conn_str = format!( + "postgresql://{}:{}@{}:{}/{}?connect_timeout=10", + enc(user), + enc(password), + host, + port, + enc(dbname), + ); + + match tokio_postgres::connect(&conn_str, NoTls).await { + Ok((client, connection)) => { + let handle = tokio::spawn(async move { + if let Err(e) = connection.await { + eprintln!("PostgreSQL connection error: {}", e); + } + }); + + let mut pm = state.pool_manager.lock().await; + pm.register( + &connection_id, + crate::db::pool::DbHandle::Postgresql(client, handle), + ); + Ok(()) + } + Err(e) => Err(format!("Connection failed: {}", pg_error_message(&e))), + } + } else if config.db_type == "sqlite" { + match rusqlite::Connection::open(&config.host) { + Ok(conn) => { + let mut pm = state.pool_manager.lock().await; + pm.register(&connection_id, crate::db::pool::DbHandle::Sqlite(conn)); + Ok(()) + } + Err(e) => Err(format!("Connection failed: {}", e)), + } + } else { + Err(format!( + "Database type '{}' not yet supported for DB viewer", + config.db_type + )) + } +} + +#[tauri::command] +pub async fn db_disconnect( + connection_id: String, + state: State<'_, crate::AppState>, +) -> Result<(), String> { + let mut pm = state.pool_manager.lock().await; + pm.remove(&connection_id); + Ok(()) +} + +#[tauri::command] +pub async fn get_databases( + connection_id: String, + state: State<'_, crate::AppState>, +) -> Result, String> { + let mut pm = state.pool_manager.lock().await; + match pm.get(&connection_id) { + Some(crate::db::pool::DbHandle::Postgresql(client, _)) => { + let rows = client + .query( + "SELECT datname FROM pg_database WHERE datistemplate = false ORDER BY datname", + &[], + ) + .await + .map_err(|e| e.to_string())?; + Ok(rows.iter().map(|r| r.get::<_, String>(0)).collect()) + } + Some(crate::db::pool::DbHandle::Sqlite(_)) => { + // SQLite has a single database per file; expose the catalog name. + Ok(vec!["main".to_string()]) + } + None => Err("Connection not found".to_string()), + } +} + +#[tauri::command] +pub async fn get_schemas( + connection_id: String, + state: State<'_, crate::AppState>, +) -> Result, String> { + let mut pm = state.pool_manager.lock().await; + match pm.get(&connection_id) { + Some(crate::db::pool::DbHandle::Postgresql(client, _)) => { + let rows = client + .query( + "SELECT nspname FROM pg_namespace WHERE nspname NOT IN ('information_schema', 'pg_catalog') AND nspname NOT LIKE 'pg_toast%' AND nspname NOT LIKE 'pg_temp%' ORDER BY nspname", + &[], + ) + .await + .map_err(|e| e.to_string())?; + Ok(rows.iter().map(|r| r.get::<_, String>(0)).collect()) + } + Some(crate::db::pool::DbHandle::Sqlite(conn)) => { + let mut stmt = conn + .prepare("SELECT DISTINCT 'main' AS schema") + .map_err(|e| e.to_string())?; + let rows = stmt + .query_map([], |row| row.get::<_, String>(0)) + .map_err(|e| e.to_string())?; + Ok(rows.filter_map(|r| r.ok()).collect()) + } + None => Err("Connection not found".to_string()), + } +} + +#[tauri::command] +pub async fn get_tables( + connection_id: String, + schema: Option, + state: State<'_, crate::AppState>, +) -> Result, String> { + let mut pm = state.pool_manager.lock().await; + match pm.get(&connection_id) { + Some(crate::db::pool::DbHandle::Postgresql(client, _)) => { + let schema_filter = schema.unwrap_or_else(|| "public".to_string()); + let rows = client + .query( + "SELECT table_name, table_schema, table_type FROM information_schema.tables WHERE table_schema = $1 AND table_type IN ('BASE TABLE', 'VIEW') ORDER BY table_name", + &[&schema_filter], + ) + .await + .map_err(|e| e.to_string())?; + Ok(rows + .iter() + .map(|r| TableInfo { + name: r.get(0), + schema: r.get(1), + table_type: r.get(2), + }) + .collect()) + } + Some(crate::db::pool::DbHandle::Sqlite(conn)) => { + let mut stmt = conn + .prepare( + "SELECT name, 'main', type FROM sqlite_master WHERE type IN ('table', 'view') AND name NOT LIKE 'sqlite_%' ORDER BY name", + ) + .map_err(|e| e.to_string())?; + let rows = stmt + .query_map([], |row| { + Ok(TableInfo { + name: row.get::<_, String>(0)?, + schema: row.get::<_, String>(1)?, + table_type: row.get::<_, String>(2)?.to_uppercase(), + }) + }) + .map_err(|e| e.to_string())?; + rows.collect::, _>>().map_err(|e| e.to_string()) + } + None => Err("Connection not found".to_string()), + } +} + +#[tauri::command] +pub async fn get_table_data( + connection_id: String, + schema: String, + table: String, + page: Option, + page_size: Option, + state: State<'_, crate::AppState>, +) -> Result { + let p = page.unwrap_or(1); + let ps = page_size.unwrap_or(50); + let off = (p - 1) * ps; + + let mut pm = state.pool_manager.lock().await; + match pm.get(&connection_id) { + Some(crate::db::pool::DbHandle::Postgresql(client, _)) => { + // Get total count + let count_query = + format!("SELECT COUNT(*) FROM \"{}\".\"{}\"", schema, table); + let count_row = client + .query_one(&count_query, &[]) + .await + .map_err(|e| e.to_string())?; + let total_rows: i64 = count_row.get(0); + + // Get column info with FK detection and enum type names + let col_query = r#"SELECT + c.column_name, + CASE WHEN c.data_type = 'USER-DEFINED' THEN c.udt_name ELSE c.data_type END AS data_type, + c.is_nullable, + COALESCE(pk.is_pk, false) AS is_pk, + COALESCE(fk.is_fk, false) AS is_fk, + fk.foreign_table_name, + fk.foreign_column_name, + c.column_default +FROM information_schema.columns c +LEFT JOIN ( + SELECT ku.column_name, true AS is_pk + FROM information_schema.table_constraints tc + JOIN information_schema.key_column_usage ku + ON tc.constraint_catalog = ku.constraint_catalog + AND tc.constraint_schema = ku.constraint_schema + AND tc.constraint_name = ku.constraint_name + WHERE tc.constraint_type = 'PRIMARY KEY' + AND tc.table_schema = $1 + AND tc.table_name = $2 +) pk ON c.column_name = pk.column_name +LEFT JOIN ( + SELECT + ku.column_name, + true AS is_fk, + ccu.table_name AS foreign_table_name, + ccu.column_name AS foreign_column_name + FROM information_schema.table_constraints tc + JOIN information_schema.key_column_usage ku + ON tc.constraint_catalog = ku.constraint_catalog + AND tc.constraint_schema = ku.constraint_schema + AND tc.constraint_name = ku.constraint_name + JOIN information_schema.constraint_column_usage ccu + ON tc.constraint_catalog = ccu.constraint_catalog + AND tc.constraint_schema = ccu.constraint_schema + AND tc.constraint_name = ccu.constraint_name + WHERE tc.constraint_type = 'FOREIGN KEY' + AND tc.table_schema = $1 + AND tc.table_name = $2 +) fk ON c.column_name = fk.column_name +WHERE c.table_schema = $1 AND c.table_name = $2 +ORDER BY c.ordinal_position"#; + let col_rows = client + .query(col_query, &[&schema, &table]) + .await + .map_err(|e| e.to_string())?; + let columns: Vec = col_rows + .iter() + .map(|r| { + let is_fk: bool = r.get(4); + let fk_table: Option = r.get(5); + let fk_column: Option = r.get(6); + ColumnInfo { + name: r.get(0), + data_type: r.get(1), + is_nullable: r.get::<_, String>(2) == "YES", + is_pk: r.get(3), + is_fk, + fk_ref: if is_fk { + Some((fk_table.unwrap_or_default(), fk_column.unwrap_or_default())) + } else { + None + }, + default_value: r.get::<_, Option>(7), + } + }) + .collect(); + + // Get data + let data_query = format!( + "SELECT * FROM \"{}\".\"{}\" LIMIT {} OFFSET {}", + schema, table, ps, off + ); + let data_rows = client + .query(&data_query, &[]) + .await + .map_err(|e| e.to_string())?; + let rows: Vec> = data_rows + .iter() + .map(|row| (0..row.len()).map(|i| pg_value_to_json(row, i)).collect()) + .collect(); + + Ok(QueryResult { + columns, + rows, + total_rows, + page: p, + page_size: ps, + }) + } + Some(crate::db::pool::DbHandle::Sqlite(conn)) => { + let count_query = + format!("SELECT COUNT(*) FROM \"{}\".\"{}\"", schema, table); + let total_rows: i64 = conn + .query_row(&count_query, [], |r| r.get(0)) + .map_err(|e| e.to_string())?; + + // Get column metadata via PRAGMA table_info + let pragma_query = format!("PRAGMA table_info('{}')", table); + let mut pragma_stmt = conn.prepare(&pragma_query).map_err(|e| e.to_string())?; + let col_meta: Vec<(String, String, bool, bool, Option)> = pragma_stmt + .query_map([], |row| { + Ok(( + row.get::<_, String>(1)?, // name + row.get::<_, String>(2)?, // type + row.get::<_, bool>(3)?, // notnull + row.get::<_, bool>(5)?, // pk + row.get::<_, Option>(4)?, // dflt_value + )) + }) + .map_err(|e| e.to_string())? + .filter_map(|r| r.ok()) + .collect(); + + // Get FK metadata via PRAGMA foreign_key_list + let fk_query = format!("PRAGMA foreign_key_list('{}')", table); + let fk_map: HashMap = + if let Ok(mut fk_stmt) = conn.prepare(&fk_query) { + fk_stmt + .query_map([], |row| { + Ok(( + row.get::<_, String>(3)?, // from (column) + row.get::<_, String>(2)?, // table + row.get::<_, String>(4)?, // to (column) + )) + }) + .map_err(|e| e.to_string())? + .filter_map(|r| r.ok()) + .map(|(from, ref_table, ref_col)| (from, (ref_table, ref_col))) + .collect() + } else { + HashMap::new() + }; + + let columns: Vec = col_meta + .iter() + .map(|(name, dtype, notnull, is_pk, default_val)| { + let fk = fk_map.get(name); + ColumnInfo { + name: name.clone(), + data_type: if dtype.is_empty() { "TEXT".to_string() } else { dtype.clone() }, + is_nullable: !notnull, + is_pk: *is_pk, + is_fk: fk.is_some(), + fk_ref: fk.map(|(t, c)| (t.clone(), c.clone())), + default_value: default_val.clone(), + } + }) + .collect(); + + // Get data + let data_query = format!( + "SELECT * FROM \"{}\".\"{}\" LIMIT {} OFFSET {}", + schema, table, ps, off + ); + let mut stmt = conn.prepare(&data_query).map_err(|e| e.to_string())?; + let col_count = stmt.column_count(); + + let rows: Vec> = stmt + .query_map([], |row| { + let mut vals = Vec::new(); + for i in 0..col_count { + let val: Option = row.get(i).unwrap_or(None); + vals.push( + val.map(serde_json::Value::String) + .unwrap_or(serde_json::Value::Null), + ); + } + Ok(vals) + }) + .map_err(|e| e.to_string())? + .filter_map(|r| r.ok()) + .collect(); + + Ok(QueryResult { + columns, + rows, + total_rows, + page: p, + page_size: ps, + }) + } + None => Err("Connection not found".to_string()), + } +} + +#[tauri::command] +pub async fn get_fk_preview( + connection_id: String, + schema: String, + table: String, + column: String, + value: String, + state: State<'_, crate::AppState>, +) -> Result { + let mut pm = state.pool_manager.lock().await; + match pm.get(&connection_id) { + Some(crate::db::pool::DbHandle::Postgresql(client, _)) => { + // Get column info with FK detection + let col_query = r#"SELECT + c.column_name, + CASE WHEN c.data_type = 'USER-DEFINED' THEN c.udt_name ELSE c.data_type END AS data_type, + c.is_nullable, + COALESCE(pk.is_pk, false) AS is_pk, + COALESCE(fk.is_fk, false) AS is_fk, + fk.foreign_table_name, + fk.foreign_column_name, + c.column_default +FROM information_schema.columns c +LEFT JOIN ( + SELECT ku.column_name, true AS is_pk + FROM information_schema.table_constraints tc + JOIN information_schema.key_column_usage ku + ON tc.constraint_catalog = ku.constraint_catalog + AND tc.constraint_schema = ku.constraint_schema + AND tc.constraint_name = ku.constraint_name + WHERE tc.constraint_type = 'PRIMARY KEY' + AND tc.table_schema = $1 + AND tc.table_name = $2 +) pk ON c.column_name = pk.column_name +LEFT JOIN ( + SELECT + ku.column_name, + true AS is_fk, + ccu.table_name AS foreign_table_name, + ccu.column_name AS foreign_column_name + FROM information_schema.table_constraints tc + JOIN information_schema.key_column_usage ku + ON tc.constraint_catalog = ku.constraint_catalog + AND tc.constraint_schema = ku.constraint_schema + AND tc.constraint_name = ku.constraint_name + JOIN information_schema.constraint_column_usage ccu + ON tc.constraint_catalog = ccu.constraint_catalog + AND tc.constraint_schema = ccu.constraint_schema + AND tc.constraint_name = ccu.constraint_name + WHERE tc.constraint_type = 'FOREIGN KEY' + AND tc.table_schema = $1 + AND tc.table_name = $2 +) fk ON c.column_name = fk.column_name +WHERE c.table_schema = $1 AND c.table_name = $2 +ORDER BY c.ordinal_position"#; + let col_rows = client + .query(col_query, &[&schema, &table]) + .await + .map_err(|e| e.to_string())?; + let columns: Vec = col_rows + .iter() + .map(|r| { + let is_fk: bool = r.get(4); + let fk_table: Option = r.get(5); + let fk_column: Option = r.get(6); + ColumnInfo { + name: r.get(0), + data_type: r.get(1), + is_nullable: r.get::<_, String>(2) == "YES", + is_pk: r.get(3), + is_fk, + fk_ref: if is_fk { + Some((fk_table.unwrap_or_default(), fk_column.unwrap_or_default())) + } else { + None + }, + default_value: r.get::<_, Option>(7), + } + }) + .collect(); + + // Fetch the referenced row + let data_query = format!( + "SELECT * FROM \"{}\".\"{}\" WHERE \"{}\"::text = $1 LIMIT 1", + schema, table, column + ); + let data_rows = client + .query(&data_query, &[&value]) + .await + .map_err(|e| e.to_string())?; + let rows: Vec> = data_rows + .iter() + .map(|row| (0..row.len()).map(|i| pg_value_to_json(row, i)).collect()) + .collect(); + + Ok(QueryResult { + columns, + rows, + total_rows: 1, + page: 1, + page_size: 1, + }) + } + Some(crate::db::pool::DbHandle::Sqlite(conn)) => { + // Get column metadata via PRAGMA table_info + let pragma_query = format!("PRAGMA table_info('{}')", table); + let mut pragma_stmt = conn.prepare(&pragma_query).map_err(|e| e.to_string())?; + let col_meta: Vec<(String, String, bool, bool, Option)> = pragma_stmt + .query_map([], |row| { + Ok(( + row.get::<_, String>(1)?, + row.get::<_, String>(2)?, + row.get::<_, bool>(3)?, + row.get::<_, bool>(5)?, + row.get::<_, Option>(4)?, + )) + }) + .map_err(|e| e.to_string())? + .filter_map(|r| r.ok()) + .collect(); + + // Get FK metadata + let fk_query = format!("PRAGMA foreign_key_list('{}')", table); + let fk_map: HashMap = + if let Ok(mut fk_stmt) = conn.prepare(&fk_query) { + fk_stmt + .query_map([], |row| { + Ok(( + row.get::<_, String>(3)?, + row.get::<_, String>(2)?, + row.get::<_, String>(4)?, + )) + }) + .map_err(|e| e.to_string())? + .filter_map(|r| r.ok()) + .map(|(from, ref_table, ref_col)| (from, (ref_table, ref_col))) + .collect() + } else { + HashMap::new() + }; + + let columns: Vec = col_meta + .iter() + .map(|(name, dtype, notnull, is_pk, default_val)| { + let fk = fk_map.get(name); + ColumnInfo { + name: name.clone(), + data_type: if dtype.is_empty() { "TEXT".to_string() } else { dtype.clone() }, + is_nullable: !notnull, + is_pk: *is_pk, + is_fk: fk.is_some(), + fk_ref: fk.map(|(t, c)| (t.clone(), c.clone())), + default_value: default_val.clone(), + } + }) + .collect(); + + // Fetch the referenced row + let data_query = format!( + "SELECT * FROM \"{}\".\"{}\" WHERE \"{}\" = ?1 LIMIT 1", + schema, table, column + ); + let mut stmt = conn.prepare(&data_query).map_err(|e| e.to_string())?; + let col_count = stmt.column_count(); + let rows: Vec> = stmt + .query_map([&value], |row| { + let mut vals = Vec::new(); + for i in 0..col_count { + let val: Option = row.get(i).unwrap_or(None); + vals.push( + val.map(serde_json::Value::String) + .unwrap_or(serde_json::Value::Null), + ); + } + Ok(vals) + }) + .map_err(|e| e.to_string())? + .filter_map(|r| r.ok()) + .collect(); + + Ok(QueryResult { + columns, + rows, + total_rows: 1, + page: 1, + page_size: 1, + }) + } + None => Err("Connection not found".to_string()), + } +} + +#[tauri::command] +pub async fn execute_change( + connection_id: String, + change: Change, + state: State<'_, crate::AppState>, +) -> Result<(), String> { + let mut pm = state.pool_manager.lock().await; + match pm.get(&connection_id) { + Some(crate::db::pool::DbHandle::Postgresql(client, _)) => { + // Build the parameterized SQL + bound values from the change. + let (sql, params): (String, Vec) = match &change { + Change::Update { + schema, + table, + primary_key, + new_data, + .. + } => { + let pk = parse_json_pairs(primary_key)?; + let data = parse_json_pairs(new_data)?; + build_pg_update_sql(schema, table, &pk, &data) + } + Change::Insert { + schema, + table, + data, + .. + } => { + let pairs = parse_json_pairs(data)?; + build_pg_insert_sql(schema, table, &pairs) + } + Change::Delete { + schema, + table, + primary_key, + .. + } => { + let pk = parse_json_pairs(primary_key)?; + build_pg_delete_sql(schema, table, &pk) + } + Change::AlterTable { sql, .. } => { + // Execute the raw DDL directly; no bound parameters. + client.execute(sql, &[]).await.map_err(|e| e.to_string())?; + return Ok(()); + } + }; + + // Box each value for trait-object binding (`$N` placeholders). The + // boxed values must be `Send` so the async command future stays + // `Send` across the `.await`. + let boxed: Vec> = + params.iter().map(pg_box_value).collect(); + // Coerce each `&(dyn ToSql + Send + Sync)` reference down to + // `&(dyn ToSql + Sync)` (dropping the `Send` auto-trait) to match + // `tokio_postgres::Client::execute`'s expected slice type. + let refs: Vec<&(dyn ToSql + Sync)> = boxed + .iter() + .map(|b| { + let r: &(dyn ToSql + Sync) = &**b; + r + }) + .collect(); + client.execute(&sql, &refs).await.map_err(|e| e.to_string())?; + Ok(()) + } + Some(crate::db::pool::DbHandle::Sqlite(conn)) => { + let (sql, params): (String, Vec) = match &change { + Change::Update { + schema, + table, + primary_key, + new_data, + .. + } => { + let pk = parse_json_pairs(primary_key)?; + let data = parse_json_pairs(new_data)?; + ( + build_update_sql(schema, table, &pk, &data), + pk.iter() + .chain(data.iter()) + .map(|(_, v)| v.clone()) + .collect(), + ) + } + Change::Insert { + schema, + table, + data, + .. + } => { + let pairs = parse_json_pairs(data)?; + let columns: Vec = + pairs.iter().map(|(c, _)| c.clone()).collect(); + ( + build_insert_sql(schema, table, &columns), + pairs.iter().map(|(_, v)| v.clone()).collect(), + ) + } + Change::Delete { + schema, + table, + primary_key, + .. + } => { + let pk = parse_json_pairs(primary_key)?; + ( + build_delete_sql(schema, table, &pk), + pk.iter().map(|(_, v)| v.clone()).collect(), + ) + } + Change::AlterTable { sql, .. } => { + conn.execute(sql, []).map_err(|e| e.to_string())?; + return Ok(()); + } + }; + + let sqlite_params: Vec = + params.iter().map(json_to_sqlite_value).collect(); + conn.execute(&sql, rusqlite::params_from_iter(sqlite_params)) + .map_err(|e| e.to_string())?; + Ok(()) + } + None => Err("Connection not found".to_string()), + } +} + +#[tauri::command] +pub async fn refresh_connection( + connection_id: String, + state: State<'_, crate::AppState>, +) -> Result<(), String> { + // Verify the connection is still alive by running a trivial query. The + // frontend re-issues getDatabases/getSchemas/getTables separately after + // this returns, so we only need to confirm reachability here. + let mut pm = state.pool_manager.lock().await; + match pm.get(&connection_id) { + Some(crate::db::pool::DbHandle::Postgresql(client, _)) => { + client.query_one("SELECT 1", &[]).await.map_err(|e| e.to_string())?; + Ok(()) + } + Some(crate::db::pool::DbHandle::Sqlite(conn)) => { + conn.query_row("SELECT 1", [], |row| row.get::<_, i64>(0)) + .map_err(|e| e.to_string())?; + Ok(()) + } + None => Err("Connection not found".to_string()), + } +} + +// --------------------------------------------------------------------------- +// Tests +// --------------------------------------------------------------------------- + +#[cfg(test)] +mod tests { + use super::*; + use crate::models::db_viewer::Change; + + /// Verify the `offset` helper produces correct pagination offsets. + #[test] + fn pagination_offset_is_correct() { + assert_eq!(offset(1, 50), 0, "page 1, size 50 => offset 0"); + assert_eq!(offset(2, 50), 50, "page 2, size 50 => offset 50"); + assert_eq!(offset(5, 25), 100, "page 5, size 25 => offset 100"); + } + + /// Verify that a `Change::Update` serializes with the correct `type` tag. + #[test] + fn execute_change_serialization() { + let change = Change::Update { + id: "chg-1".to_string(), + schema: "public".to_string(), + table: "users".to_string(), + primary_key: r#"{"id": 1}"#.to_string(), + old_data: r#"{"name": "alice"}"#.to_string(), + new_data: r#"{"name": "bob"}"#.to_string(), + }; + let json = serde_json::to_string(&change).unwrap(); + assert!( + json.contains(r#""type":"update""#), + "serialized Change::Update should use snake_case tag 'update'; got: {}", + json + ); + } + + /// Verify that `Change::id()` returns the correct identifier. + #[test] + fn change_id_is_accessible() { + let change = Change::Insert { + id: "chg-42".to_string(), + schema: "public".to_string(), + table: "logs".to_string(), + data: r#"{"event": "login"}"#.to_string(), + }; + assert_eq!( + change.id(), + "chg-42", + "id() should return the 'id' field of the Insert variant" + ); + } + + /// Verify that `build_update_sql` produces valid SQL with all required + /// clauses. + #[test] + fn build_change_update_sql_is_valid() { + let pk = vec![("id".to_string(), serde_json::json!(1))]; + let data = vec![ + ("name".to_string(), serde_json::json!("bob")), + ("email".to_string(), serde_json::json!("bob@example.com")), + ]; + + let sql = build_update_sql("public", "users", &pk, &data); + + assert!( + sql.to_uppercase().contains("UPDATE"), + "UPDATE SQL must contain 'UPDATE'; got: {}", + sql + ); + assert!( + sql.to_uppercase().contains("SET"), + "UPDATE SQL must contain 'SET'; got: {}", + sql + ); + assert!( + sql.to_uppercase().contains("WHERE"), + "UPDATE SQL must contain 'WHERE'; got: {}", + sql + ); + } + + /// Verify that `build_delete_sql` produces valid SQL with all required + /// clauses. + #[test] + fn build_change_delete_sql_is_valid() { + let pk = vec![("id".to_string(), serde_json::json!(1))]; + + let sql = build_delete_sql("public", "users", &pk); + + assert!( + sql.to_uppercase().contains("DELETE FROM"), + "DELETE SQL must contain 'DELETE FROM'; got: {}", + sql + ); + assert!( + sql.to_uppercase().contains("WHERE"), + "DELETE SQL must contain 'WHERE'; got: {}", + sql + ); + } + + /// Verify that `build_insert_sql` produces valid SQL with all required + /// clauses. + #[test] + fn build_change_insert_sql_is_valid() { + let columns = vec!["id".to_string(), "name".to_string(), "email".to_string()]; + + let sql = build_insert_sql("public", "users", &columns); + + assert!( + sql.to_uppercase().contains("INSERT INTO"), + "INSERT SQL must contain 'INSERT INTO'; got: {}", + sql + ); + assert!( + sql.to_uppercase().contains("VALUES"), + "INSERT SQL must contain 'VALUES'; got: {}", + sql + ); + } +} \ No newline at end of file diff --git a/src-tauri/src/commands/demo.rs b/src-tauri/src/commands/demo.rs new file mode 100644 index 0000000..1cc2256 --- /dev/null +++ b/src-tauri/src/commands/demo.rs @@ -0,0 +1,220 @@ +use crate::models::ConnectionInput; +use crate::store::Store; +use crate::AppState; +use rusqlite::Connection; +use std::sync::Mutex; +use tauri::Manager; + +const DEMO_DB_FILENAME: &str = "demo.db"; +const DEMO_CONNECTION_NAME: &str = "Demo (SQLite)"; + +/// Ensure the demo SQLite database exists and a corresponding connection is +/// registered. Safe to call on every app start — it's idempotent. +pub fn ensure_demo_db(app_handle: &tauri::AppHandle, store: &Mutex) -> Result<(), String> { + // Check if the demo connection already exists + { + let s = store.lock().map_err(|e| e.to_string())?; + let existing = s.get_connections()?; + if existing.iter().any(|c| c.name == DEMO_CONNECTION_NAME) { + return Ok(()); // already set up + } + } + + // Resolve app data directory + let data_dir = app_handle + .path() + .app_data_dir() + .map_err(|e| e.to_string())?; + std::fs::create_dir_all(&data_dir).map_err(|e| e.to_string())?; + + let db_path = data_dir.join(DEMO_DB_FILENAME); + + // Create the demo SQLite file if it doesn't exist + if !db_path.exists() { + let conn = + Connection::open(&db_path).map_err(|e| format!("Failed to create demo DB: {e}"))?; + + conn.execute_batch(&get_demo_schema()) + .map_err(|e| format!("Failed to seed demo DB: {e}"))?; + } + + // Create the demo connection + let input = ConnectionInput { + name: DEMO_CONNECTION_NAME.to_string(), + db_type: "sqlite".to_string(), + host: db_path.to_string_lossy().to_string(), + port: None, + username: None, + password: None, + database: None, + folder_id: None, + tag_ids: vec![], + environment: Some("development".to_string()), + ssh_host: None, + ssh_port: None, + ssh_user: None, + ssh_auth_method: None, + ssh_private_key_path: None, + ssh_passphrase: None, + ssl_mode: None, + ssl_ca_path: None, + ssl_cert_path: None, + ssl_key_path: None, + }; + + let s = store.lock().map_err(|e| e.to_string())?; + s.create_connection(input)?; + + Ok(()) +} + +/// Tauri command to re-add the demo connection from the settings screen. +#[tauri::command] +pub fn recreate_demo_db(state: tauri::State) -> Result { + let store = &state.db_store; + ensure_demo_db_inner(store) + .map(|()| "Demo database connection re-created.".to_string()) + .map_err(|e| e.to_string()) +} + +/// Internal helper that does not need an AppHandle (for settings usage). +fn ensure_demo_db_inner(store: &Mutex) -> Result<(), String> { + // Use a temp dir since we don't have the app handle + let data_dir = std::env::temp_dir().join("gridline-demo"); + std::fs::create_dir_all(&data_dir).map_err(|e| e.to_string())?; + + let db_path = data_dir.join(DEMO_DB_FILENAME); + + // Check if file already exists + if db_path.exists() { + // Just re-create the connection if it was deleted + let s = store.lock().map_err(|e| e.to_string())?; + let existing = s.get_connections()?; + if !existing.iter().any(|c| c.name == DEMO_CONNECTION_NAME) { + drop(s); + let input = ConnectionInput { + name: DEMO_CONNECTION_NAME.to_string(), + db_type: "sqlite".to_string(), + host: db_path.to_string_lossy().to_string(), + port: None, + username: None, + password: None, + database: None, + folder_id: None, + tag_ids: vec![], + environment: Some("development".to_string()), + ssh_host: None, + ssh_port: None, + ssh_user: None, + ssh_auth_method: None, + ssh_private_key_path: None, + ssh_passphrase: None, + ssl_mode: None, + ssl_ca_path: None, + ssl_cert_path: None, + ssl_key_path: None, + }; + let s = store.lock().map_err(|e| e.to_string())?; + s.create_connection(input)?; + } + return Ok(()); + } + + // Create demo DB file and seed it + let conn = Connection::open(&db_path) + .map_err(|e| format!("Failed to create demo DB: {e}"))?; + + conn.execute_batch(&get_demo_schema()) + .map_err(|e| format!("Failed to seed demo DB: {e}"))?; + + let input = ConnectionInput { + name: DEMO_CONNECTION_NAME.to_string(), + db_type: "sqlite".to_string(), + host: db_path.to_string_lossy().to_string(), + port: None, + username: None, + password: None, + database: None, + folder_id: None, + tag_ids: vec![], + environment: Some("development".to_string()), + ssh_host: None, + ssh_port: None, + ssh_user: None, + ssh_auth_method: None, + ssh_private_key_path: None, + ssh_passphrase: None, + ssl_mode: None, + ssl_ca_path: None, + ssl_cert_path: None, + ssl_key_path: None, + }; + + let s = store.lock().map_err(|e| e.to_string())?; + s.create_connection(input)?; + Ok(()) +} + +fn get_demo_schema() -> String { + " + CREATE TABLE IF NOT EXISTS users ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL, + email TEXT NOT NULL UNIQUE, + role TEXT NOT NULL DEFAULT 'user', + created_at TEXT NOT NULL DEFAULT (datetime('now')) + ); + CREATE TABLE IF NOT EXISTS products ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL, + price REAL NOT NULL, + category TEXT NOT NULL, + stock INTEGER NOT NULL DEFAULT 0, + created_at TEXT NOT NULL DEFAULT (datetime('now')) + ); + CREATE TABLE IF NOT EXISTS orders ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + user_id INTEGER NOT NULL REFERENCES users(id), + total REAL NOT NULL, + status TEXT NOT NULL DEFAULT 'pending', + created_at TEXT NOT NULL DEFAULT (datetime('now')) + ); + CREATE TABLE IF NOT EXISTS order_items ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + order_id INTEGER NOT NULL REFERENCES orders(id), + product_id INTEGER NOT NULL REFERENCES products(id), + quantity INTEGER NOT NULL DEFAULT 1, + unit_price REAL NOT NULL + ); + INSERT OR IGNORE INTO users (id, name, email, role) VALUES + (1, 'Alice Johnson', 'alice@example.com', 'admin'), + (2, 'Bob Smith', 'bob@example.com', 'user'), + (3, 'Carol Davis', 'carol@example.com', 'user'), + (4, 'Dan Wilson', 'dan@example.com', 'user'), + (5, 'Eve Martinez', 'eve@example.com', 'moderator'); + INSERT OR IGNORE INTO products (id, name, price, category, stock) VALUES + (1, 'Wireless Mouse', 29.99, 'Electronics', 150), + (2, 'Mechanical Keyboard', 89.99, 'Electronics', 75), + (3, 'USB-C Hub', 34.99, 'Accessories', 200), + (4, '27\" 4K Monitor', 449.99, 'Electronics', 30), + (5, 'Laptop Stand', 49.99, 'Accessories', 100), + (6, 'Webcam 1080p', 59.99, 'Electronics', 60), + (7, 'Desk Lamp LED', 39.99, 'Office', 120), + (8, 'Ergonomic Chair', 599.99, 'Office', 15); + INSERT OR IGNORE INTO orders (id, user_id, total, status) VALUES + (1, 1, 119.98, 'completed'), + (2, 2, 484.98, 'pending'), + (3, 3, 59.99, 'completed'), + (4, 1, 89.99, 'shipped'), + (5, 4, 689.98, 'pending'); + INSERT OR IGNORE INTO order_items (order_id, product_id, quantity, unit_price) VALUES + (1, 1, 2, 29.99), + (1, 3, 1, 34.99), + (2, 4, 1, 449.99), + (2, 5, 1, 49.99), + (3, 6, 1, 59.99), + (4, 2, 1, 89.99), + (5, 8, 1, 599.99), + (5, 1, 3, 29.99); + ".to_string() +} \ No newline at end of file diff --git a/src-tauri/src/commands/folders.rs b/src-tauri/src/commands/folders.rs new file mode 100644 index 0000000..53bb934 --- /dev/null +++ b/src-tauri/src/commands/folders.rs @@ -0,0 +1,136 @@ +use crate::models::{Folder, FolderInput}; +use crate::store::Store; +use std::sync::Mutex; + +fn validate(input: &FolderInput) -> Result<(), String> { + if input.name.is_empty() || input.name.chars().count() > 100 { + return Err("name is required and must be 100 chars or fewer".into()); + } + Ok(()) +} + +pub fn get_folders_inner(state: &Mutex) -> Result, String> { + let store = state.lock().map_err(|e| e.to_string())?; + store.get_folders() +} + +pub fn create_folder_inner( + state: &Mutex, + input: FolderInput, +) -> Result { + validate(&input)?; + let store = state.lock().map_err(|e| e.to_string())?; + store.create_folder(input) +} + +pub fn delete_folder_inner(state: &Mutex, id: &str) -> Result<(), String> { + let store = state.lock().map_err(|e| e.to_string())?; + store.delete_folder(id) +} + +pub fn add_folder_tags_inner( + state: &Mutex, + folder_id: String, + tag_ids: Vec, +) -> Result<(), String> { + let store = state.lock().map_err(|e| e.to_string())?; + store.add_folder_tags(&folder_id, &tag_ids) +} + +pub fn update_folder_inner( + state: &Mutex, + id: String, + input: FolderInput, +) -> Result { + validate(&input)?; + let store = state.lock().map_err(|e| e.to_string())?; + store.update_folder(&id, input) +} + +#[tauri::command] +pub fn get_folders(state: tauri::State) -> Result, String> { + get_folders_inner(&state.db_store) +} + +#[tauri::command] +pub fn create_folder( + state: tauri::State, + input: FolderInput, +) -> Result { + create_folder_inner(&state.db_store, input) +} + +#[tauri::command] +pub fn delete_folder(state: tauri::State, id: String) -> Result<(), String> { + delete_folder_inner(&state.db_store, &id) +} + +#[tauri::command] +pub fn add_folder_tags( + state: tauri::State, + folder_id: String, + tag_ids: Vec, +) -> Result<(), String> { + add_folder_tags_inner(&state.db_store, folder_id, tag_ids) +} + +#[tauri::command] +pub fn update_folder( + state: tauri::State, + id: String, + input: FolderInput, +) -> Result { + update_folder_inner(&state.db_store, id, input) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::models::FolderInput; + use crate::store::Store; + + fn state() -> std::sync::Mutex { + let conn = rusqlite::Connection::open_in_memory().unwrap(); + crate::store::migrations::run_migrations(&conn).unwrap(); + std::sync::Mutex::new(Store::from_connection(conn)) + } + + #[test] + fn create_folder_command_works() { + let st = state(); + let folder = + create_folder_inner(&st, FolderInput { tag_ids: None, + name: "Work".into(), + parent_id: None, + }) + .unwrap(); + assert_eq!(get_folders_inner(&st).unwrap().len(), 1); + assert_eq!(folder.name, "Work"); + } + + #[test] + fn create_folder_rejects_empty_name() { + let st = state(); + let result = create_folder_inner( + &st, + FolderInput { tag_ids: None, + name: "".into(), + parent_id: None, + }, + ); + assert!(result.is_err()); + } + + #[test] + fn delete_folder_command_works() { + let st = state(); + let folder = + create_folder_inner(&st, FolderInput { tag_ids: None, + name: "Work".into(), + parent_id: None, + }) + .unwrap(); + delete_folder_inner(&st, &folder.id).unwrap(); + assert_eq!(get_folders_inner(&st).unwrap().len(), 0); + } +} \ No newline at end of file diff --git a/src-tauri/src/commands/import_export.rs b/src-tauri/src/commands/import_export.rs new file mode 100644 index 0000000..1e28246 --- /dev/null +++ b/src-tauri/src/commands/import_export.rs @@ -0,0 +1,184 @@ +use crate::models::ConnectionInput; +use crate::store::Store; +use serde::{Deserialize, Serialize}; +use std::sync::Mutex; + +const VALID_DB_TYPES: [&str; 4] = ["postgresql", "mysql", "sqlite", "redis"]; + +#[derive(Debug, Deserialize)] +pub(crate) struct ImportRecord { + name: Option, + db_type: String, + host: String, + port: Option, + username: Option, + folder_id: Option, + tag_ids: Option>, +} + +#[derive(Debug, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct SkippedRecord { + pub index: usize, + pub reason: String, +} + +#[derive(Debug, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct ImportResult { + pub imported: usize, + pub skipped: usize, + pub skipped_records: Vec, +} + +#[allow(dead_code)] +pub fn parse_import(json: &str) -> Result, String> { + let records: Vec = serde_json::from_str(json).map_err(|e| format!("invalid JSON: {}", e))?; + for (i, rec) in records.iter().enumerate() { + if rec.name.as_deref().unwrap_or("").is_empty() { + return Err(format!("record {}: name is required", i)); + } + if !VALID_DB_TYPES.contains(&rec.db_type.as_str()) { + return Err(format!("record {}: invalid db_type: {}", i, rec.db_type)); + } + } + Ok(records) +} + +pub fn import_connections_inner(state: &Mutex, json: String) -> Result { + let records: Vec = serde_json::from_str(&json).map_err(|e| format!("invalid JSON: {}", e))?; + let store = state.lock().map_err(|e| e.to_string())?; + let mut imported = 0usize; + let mut skipped_records = Vec::new(); + for (i, rec) in records.iter().enumerate() { + let name = match &rec.name { + Some(n) if !n.is_empty() => n.clone(), + _ => { + skipped_records.push(SkippedRecord { index: i, reason: "missing or empty name".into() }); + continue; + } + }; + if !VALID_DB_TYPES.contains(&rec.db_type.as_str()) { + skipped_records.push(SkippedRecord { index: i, reason: format!("invalid db_type: {}", rec.db_type) }); + continue; + } + if rec.host.is_empty() { + skipped_records.push(SkippedRecord { index: i, reason: "missing or empty host".into() }); + continue; + } + let input = ConnectionInput { + name, + db_type: rec.db_type.clone(), + host: rec.host.clone(), + port: rec.port, + username: rec.username.clone(), + folder_id: rec.folder_id.clone(), + password: None, + database: None, + ssh_host: None, + ssh_port: None, + ssh_user: None, + ssh_auth_method: None, + ssh_private_key_path: None, + ssh_passphrase: None, + ssl_mode: None, + ssl_ca_path: None, + ssl_cert_path: None, + ssl_key_path: None, + environment: None, + tag_ids: rec.tag_ids.clone().unwrap_or_default(), + }; + match store.create_connection(input) { + Ok(_) => imported += 1, + Err(e) => skipped_records.push(SkippedRecord { index: i, reason: e }), + } + } + Ok(ImportResult { imported, skipped: skipped_records.len(), skipped_records }) +} + +pub fn export_connections_inner(state: &Mutex) -> Result { + let store = state.lock().map_err(|e| e.to_string())?; + let conns = store.get_connections()?; + let export = serde_json::json!({ "version": 1, "connections": conns }); + serde_json::to_string_pretty(&export).map_err(|e| e.to_string()) +} + +#[tauri::command] +pub fn import_connections(state: tauri::State, json: String) -> Result { + import_connections_inner(&state.db_store, json) +} + +#[tauri::command] +pub fn export_connections(state: tauri::State) -> Result { + export_connections_inner(&state.db_store) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::store::Store; + use crate::models::ConnectionInput; + + fn state() -> std::sync::Mutex { + let conn = rusqlite::Connection::open_in_memory().unwrap(); + crate::store::migrations::run_migrations(&conn).unwrap(); + std::sync::Mutex::new(Store::from_connection(conn)) + } + + #[test] + fn parse_import_validates_required_fields() { + let json = r#"[{ "name": "X", "db_type": "postgresql", "host": "h", "port": 5432 }]"#; + let parsed = parse_import(json).unwrap(); + assert_eq!(parsed.len(), 1); + assert_eq!(parsed[0].name.as_deref(), Some("X")); + } + + #[test] + fn parse_import_rejects_missing_name() { + let json = r#"[{ "db_type": "postgresql", "host": "h", "port": 5432 }]"#; + assert!(parse_import(json).is_err()); + } + + #[test] + fn parse_import_rejects_invalid_db_type() { + let json = r#"[{ "name": "X", "db_type": "mongodb", "host": "h", "port": 5432 }]"#; + assert!(parse_import(json).is_err()); + } + + #[test] + fn import_connections_inserts_all() { + let st = state(); + let json = r#"[{ "name": "A", "db_type": "postgresql", "host": "h", "port": 5432 }, { "name": "B", "db_type": "redis", "host": "r", "port": 6379 }]"#; + let result = import_connections_inner(&st, json.to_string()).unwrap(); + assert_eq!(result.imported, 2); + assert_eq!(result.skipped, 0); + } + + #[test] + fn import_connections_skips_invalid_keeps_valid() { + let st = state(); + let json = r#"[{ "name": "A", "db_type": "postgresql", "host": "h", "port": 5432 }, { "db_type": "postgresql", "host": "h", "port": 5432 }, { "name": "B", "db_type": "redis", "host": "r", "port": 6379 }]"#; + let result = import_connections_inner(&st, json.to_string()).unwrap(); + assert_eq!(result.imported, 2); + assert_eq!(result.skipped, 1); + assert_eq!(result.skipped_records[0].reason, "missing or empty name"); + } + + #[test] + fn export_connections_returns_json() { + let st = state(); + let _ = st.lock().unwrap().create_connection(ConnectionInput { + name: "A".into(), db_type: "postgresql".into(), host: "h".into(), + port: Some(5432), username: None, folder_id: None, + password: None, database: None, + ssh_host: None, ssh_port: None, ssh_user: None, ssh_auth_method: None, + ssh_private_key_path: None, ssh_passphrase: None, + ssl_mode: None, ssl_ca_path: None, ssl_cert_path: None, ssl_key_path: None, + environment: None, + tag_ids: vec![], + }); + let json = export_connections_inner(&st).unwrap(); + assert!(json.contains("\"name\"")); + assert!(json.contains("\"version\"")); + } +} \ No newline at end of file diff --git a/src-tauri/src/commands/keychain.rs b/src-tauri/src/commands/keychain.rs new file mode 100644 index 0000000..cf2d110 --- /dev/null +++ b/src-tauri/src/commands/keychain.rs @@ -0,0 +1,40 @@ +use tauri_plugin_keyring_store::KeyringExt; + +/// Store a connection password in the OS keychain. +/// The connection ID is used as the keyring account name. +#[tauri::command] +pub fn save_connection_password( + app: tauri::AppHandle, + connection_id: String, + password: String, +) -> Result<(), String> { + app.keyring() + .store + .set_password(&connection_id, &password) + .map_err(|e| e.to_string()) +} + +/// Retrieve a connection password from the OS keychain. +/// Returns None if no password was stored for this connection. +#[tauri::command] +pub fn get_connection_password( + app: tauri::AppHandle, + connection_id: String, +) -> Result, String> { + app.keyring() + .store + .get_password(&connection_id) + .map_err(|e| e.to_string()) +} + +/// Delete a connection password from the OS keychain. +#[tauri::command] +pub fn delete_connection_password( + app: tauri::AppHandle, + connection_id: String, +) -> Result<(), String> { + app.keyring() + .store + .delete(&connection_id) + .map_err(|e| e.to_string()) +} \ No newline at end of file diff --git a/src-tauri/src/commands/mod.rs b/src-tauri/src/commands/mod.rs new file mode 100644 index 0000000..b8b8dca --- /dev/null +++ b/src-tauri/src/commands/mod.rs @@ -0,0 +1,10 @@ +pub mod connections; +pub mod db_viewer; +pub mod folders; +pub mod tags; +pub mod settings; +pub mod import_export; +pub mod test_connection; +pub mod ssh; +pub mod keychain; +pub mod demo; \ No newline at end of file diff --git a/src-tauri/src/commands/settings.rs b/src-tauri/src/commands/settings.rs new file mode 100644 index 0000000..d3d109e --- /dev/null +++ b/src-tauri/src/commands/settings.rs @@ -0,0 +1,50 @@ +use crate::models::Settings; +use crate::store::Store; +use std::sync::Mutex; + +pub fn get_settings_inner(state: &Mutex) -> Result { + let store = state.lock().map_err(|e| e.to_string())?; + store.get_settings() +} + +pub fn update_setting_inner(state: &Mutex, key: &str, value: &str) -> Result<(), String> { + let store = state.lock().map_err(|e| e.to_string())?; + store.update_setting(key, value) +} + +#[tauri::command] +pub fn get_settings(state: tauri::State) -> Result { + get_settings_inner(&state.db_store) +} + +#[tauri::command] +pub fn update_setting(state: tauri::State, key: String, value: String) -> Result<(), String> { + update_setting_inner(&state.db_store, &key, &value) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::store::Store; + + fn state() -> std::sync::Mutex { + let conn = rusqlite::Connection::open_in_memory().unwrap(); + crate::store::migrations::run_migrations(&conn).unwrap(); + std::sync::Mutex::new(Store::from_connection(conn)) + } + + #[test] + fn get_settings_returns_defaults() { + let st = state(); + let s = get_settings_inner(&st).unwrap(); + assert_eq!(s.theme, "system"); + assert_eq!(s.font_size, "medium"); + } + + #[test] + fn update_setting_persists() { + let st = state(); + update_setting_inner(&st, "theme", "light").unwrap(); + assert_eq!(get_settings_inner(&st).unwrap().theme, "light"); + } +} \ No newline at end of file diff --git a/src-tauri/src/commands/ssh.rs b/src-tauri/src/commands/ssh.rs new file mode 100644 index 0000000..484ad9b --- /dev/null +++ b/src-tauri/src/commands/ssh.rs @@ -0,0 +1,179 @@ +use serde::{Deserialize, Serialize}; +use std::collections::HashMap; + +/// SSH tunnel configuration. +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct SshConfig { + pub host: String, + pub port: u16, + pub user: String, + /// "password" or "key" + pub auth_method: String, + pub password: Option, + pub private_key_path: Option, + pub passphrase: Option, +} + +impl SshConfig { + /// Create a new `SshConfig` with the required fields. + pub fn new( + host: String, + port: u16, + user: String, + auth_method: String, + ) -> Self { + SshConfig { + host, + port, + user, + auth_method, + password: None, + private_key_path: None, + passphrase: None, + } + } + + /// Validate SSH configuration. + /// + /// Returns `true` if: + /// - `host` is not empty + /// - `port` is in range 1..=65535 (u16 guarantees <= 65535) + /// - `user` is not empty + pub fn is_valid(&self) -> bool { + !self.host.is_empty() && self.port >= 1 && !self.user.is_empty() + } +} + +/// Represents an active SSH tunnel connection. +#[derive(Debug)] +struct SshTunnel { + local_port: u16, + remote_host: String, + remote_port: u16, +} + +/// Manages SSH tunnels, mapping connection keys to active tunnels. +/// +/// This is a placeholder implementation. Real SSH connectivity (via `ssh2` +/// or `async-ssh2`) will be added in a later task. Currently the manager +/// stores mock entries when validation passes. +#[derive(Debug)] +pub struct SshTunnelManager { + tunnels: HashMap, +} + +impl SshTunnelManager { + /// Create a new empty tunnel manager. + pub fn new() -> Self { + SshTunnelManager { + tunnels: HashMap::new(), + } + } + + /// Open an SSH tunnel for the given config. + /// + /// Returns the local port on success. + /// + /// TODO: Replace placeholder with a real SSH connection via `ssh2` or + /// `async-ssh2`. Currently stores a mock entry (`local_port = 15432`) + /// when `config.is_valid()` passes. + pub fn open_tunnel(&mut self, key: &str, config: &SshConfig) -> Result { + if !config.is_valid() { + return Err("invalid SSH configuration".to_string()); + } + // TODO: Replace with real SSH tunnel via ssh2::Session + port forwarding. + // For now, store a mock entry with local_port = 15432. + self.tunnels.insert( + key.to_string(), + SshTunnel { + local_port: 15432, + remote_host: config.host.clone(), + remote_port: config.port, + }, + ); + Ok(15432) + } + + /// Close and remove the SSH tunnel for the given key. + /// + /// TODO: When real SSH is implemented, this should disconnect the + /// session and free the local port. + pub fn close_tunnel(&mut self, key: &str) { + self.tunnels.remove(key); + } + + /// Close all active SSH tunnels. + pub fn close_all(&mut self) { + self.tunnels.clear(); + } + + /// Get the local port for an active tunnel, if any. + pub fn get_local_port(&self, key: &str) -> Option { + self.tunnels.get(key).map(|t| t.local_port) + } + + /// Return the number of active tunnels. + pub fn active_count(&self) -> usize { + self.tunnels.len() + } +} + +#[cfg(test)] +mod tests { + use super::*; + + // ------------------------------------------------------------------ + // SshConfig validation + // ------------------------------------------------------------------ + + #[test] + fn ssh_config_validation() { + // Invalid: empty host + let config = SshConfig::new( + "".to_string(), + 22, + "user".to_string(), + "password".to_string(), + ); + assert!(!config.is_valid(), "empty host should be invalid"); + + // Invalid: empty user + let config = SshConfig::new( + "host.example.com".to_string(), + 22, + "".to_string(), + "password".to_string(), + ); + assert!(!config.is_valid(), "empty user should be invalid"); + + // Valid: all required fields present + let config = SshConfig::new( + "host.example.com".to_string(), + 2222, + "tunnel".to_string(), + "key".to_string(), + ); + assert!(config.is_valid(), "valid config should be accepted"); + } + + #[test] + fn ssh_config_rejects_non_standard_ports() { + // Port 0 is invalid + let config = SshConfig::new( + "host.example.com".to_string(), + 0, + "user".to_string(), + "password".to_string(), + ); + assert!(!config.is_valid(), "port 0 should be invalid"); + + // Port 1 is valid (boundary) + let config = SshConfig::new( + "host.example.com".to_string(), + 1, + "user".to_string(), + "password".to_string(), + ); + assert!(config.is_valid(), "port 1 should be valid"); + } +} \ No newline at end of file diff --git a/src-tauri/src/commands/tags.rs b/src-tauri/src/commands/tags.rs new file mode 100644 index 0000000..18bae4b --- /dev/null +++ b/src-tauri/src/commands/tags.rs @@ -0,0 +1,88 @@ +use crate::models::{Tag, TagInput}; +use crate::store::Store; +use std::sync::Mutex; + +fn validate(input: &TagInput) -> Result<(), String> { + if input.name.is_empty() || input.name.chars().count() > 50 { + return Err("name is required and must be 50 chars or fewer".into()); + } + Ok(()) +} + +pub fn get_tags_inner(state: &Mutex) -> Result, String> { + let store = state.lock().map_err(|e| e.to_string())?; + store.get_tags() +} + +pub fn create_tag_inner(state: &Mutex, input: TagInput) -> Result { + validate(&input)?; + let store = state.lock().map_err(|e| e.to_string())?; + store.create_tag(input) +} + +pub fn delete_tag_inner(state: &Mutex, id: &str) -> Result<(), String> { + let store = state.lock().map_err(|e| e.to_string())?; + store.delete_tag(id) +} + +pub fn update_tag_inner( + state: &Mutex, + id: String, + input: TagInput, +) -> Result { + validate(&input)?; + let store = state.lock().map_err(|e| e.to_string())?; + store.update_tag(&id, input) +} + +#[tauri::command] +pub fn get_tags(state: tauri::State) -> Result, String> { + get_tags_inner(&state.db_store) +} + +#[tauri::command] +pub fn create_tag(state: tauri::State, input: TagInput) -> Result { + create_tag_inner(&state.db_store, input) +} + +#[tauri::command] +pub fn delete_tag(state: tauri::State, id: String) -> Result<(), String> { + delete_tag_inner(&state.db_store, &id) +} + +#[tauri::command] +pub fn update_tag( + state: tauri::State, + id: String, + input: TagInput, +) -> Result { + update_tag_inner(&state.db_store, id, input) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::store::Store; + use crate::models::TagInput; + + fn state() -> std::sync::Mutex { + let conn = rusqlite::Connection::open_in_memory().unwrap(); + crate::store::migrations::run_migrations(&conn).unwrap(); + std::sync::Mutex::new(Store::from_connection(conn)) + } + + #[test] + fn create_tag_command_works() { + let st = state(); + let tag = create_tag_inner(&st, TagInput { name: "prod".into(), color: "#ef4444".into() }).unwrap(); + assert_eq!(get_tags_inner(&st).unwrap().len(), 1); + assert_eq!(tag.name, "prod"); + } + + #[test] + fn create_tag_rejects_long_name() { + let st = state(); + let result = create_tag_inner(&st, TagInput { name: "x".repeat(51), color: "#fff".into() }); + assert!(result.is_err()); + } +} \ No newline at end of file diff --git a/src-tauri/src/commands/test_connection.rs b/src-tauri/src/commands/test_connection.rs new file mode 100644 index 0000000..5894de5 --- /dev/null +++ b/src-tauri/src/commands/test_connection.rs @@ -0,0 +1,439 @@ +use serde::{Deserialize, Serialize}; + +use crate::db::pool::DbConfig; + +/// Result of a test database connection attempt. +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct TestConnectionResult { + pub ok: bool, + #[serde(skip_serializing_if = "Option::is_none")] + pub error: Option, +} + +/// Strip credentials and sensitive information from error messages while +/// preserving the useful diagnostic detail (severity, message, SQLSTATE). +/// +/// Redacts `password=...`, `user=...`, `postgresql://user:pwd@host` URLs, +/// and `@host` credential fragments rather than discarding the whole +/// message — so the user can still see e.g. "password authentication +/// failed for user 'foo'" without leaking the password itself. +pub fn sanitize_error(msg: &str) -> String { + let mut out = String::with_capacity(msg.len()); + let bytes = msg.as_bytes(); + let mut i = 0; + while i < bytes.len() { + let lower = msg[i..].to_lowercase(); + if lower.starts_with("postgres://") || lower.starts_with("postgresql://") { + out.push_str("[redacted-url://"); + let scheme_end = i + msg[i..].find("://").unwrap_or(0) + 3; + let rest = &msg[scheme_end..]; + let end = match rest.find(['/', '?']) { + Some(pos) => scheme_end + pos, + None => msg.len(), + }; + i = end; + } else if lower.starts_with("password=") { + out.push_str("[redacted]"); + let rest = &msg[i + "password=".len()..]; + let skip = rest.find(char::is_whitespace).unwrap_or(rest.len()); + i += "password=".len() + skip; + } else if lower.starts_with("user=") { + out.push_str("[redacted]"); + let rest = &msg[i + "user=".len()..]; + let skip = rest.find(char::is_whitespace).unwrap_or(rest.len()); + i += "user=".len() + skip; + } else if lower.starts_with("secret") { + out.push_str("secret=[redacted]"); + let rest = &msg[i + "secret".len()..]; + let skip = rest.find(char::is_whitespace).unwrap_or(rest.len()); + i += "secret".len() + skip; + } else { + let ch = msg[i..].chars().next().unwrap(); + out.push(ch); + i += ch.len_utf8(); + } + } + // Truncate at 300 characters for safety. + if out.len() > 300 { + format!("{}...", &out[..297]) + } else { + out + } +} + +/// Validate `DbConfig` before attempting a connection test. +/// +/// Returns `Some(error_message)` if the config is invalid, or `None` if valid. +/// +/// Validation rules: +/// - `db_type` must be one of: `postgresql`, `mysql`, `sqlite`, `redis` +/// - For `postgresql`, `mysql`, `redis`: `host` must not be empty, `port` must +/// be `Some(1..=65535)` +/// - For `sqlite`: `host` (file path) must not be empty +pub fn validate_test_input(config: &DbConfig) -> Option { + let db_type = config.db_type.to_lowercase(); + + let valid_types = ["postgresql", "mysql", "sqlite", "redis"]; + if !valid_types.contains(&db_type.as_str()) { + return Some(format!( + "unsupported database type: {}. Supported types: {}", + config.db_type, + valid_types.join(", ") + )); + } + + if config.host.is_empty() { + return Some("host must not be empty".to_string()); + } + + // SQLite does not require a port (host is the file path) + if db_type != "sqlite" { + match config.port { + Some(p) if (1..=65535).contains(&p) => {} + _ => { + return Some( + "port must be an integer between 1 and 65535 for this db_type" + .to_string(), + ); + } + } + } + + None +} + +/// Test a database connection for the given configuration. +/// +/// Dispatches to the appropriate type-specific connection test based on +/// `config.db_type`. Returns a `TestConnectionResult` indicating success +/// or failure with a sanitized error message. +pub async fn test_database_connection(config: &DbConfig) -> TestConnectionResult { + // Validate input first + if let Some(err) = validate_test_input(config) { + return TestConnectionResult { + ok: false, + error: Some(err), + }; + } + + let result = match config.db_type.to_lowercase().as_str() { + "postgresql" => test_pg_connection(config).await, + "mysql" => test_mysql_connection(config).await, + "sqlite" => test_sqlite_connection(config), + "redis" => test_redis_connection(config).await, + other => TestConnectionResult { + ok: false, + error: Some(format!("unsupported database type: {other}")), + }, + }; + + TestConnectionResult { + ok: result.ok, + error: result.error.map(|e| sanitize_error(&e)), + } +} + +/// Test a PostgreSQL connection using `tokio-postgres`. +/// +/// Connects without TLS. The connection handler is spawned and immediately +/// dropped after confirming the connection is alive. +async fn test_pg_connection(config: &DbConfig) -> TestConnectionResult { + use tokio_postgres::NoTls; + + let host = &config.host; + let port = config.port.unwrap_or(5432) as u16; + let user = config.username.as_deref().unwrap_or("postgres"); + let dbname = config.database.as_deref().unwrap_or("postgres"); + let password = config.password.as_deref().unwrap_or(""); + + // Use a postgres URL rather than libpq key=value format: tokio-postgres + // parses URLs reliably and urlencoding handles special chars safely. + use urlencoding::encode as enc; + let conn_str = format!( + "postgresql://{}:{}@{}:{}/{}?connect_timeout=10", + enc(user), + enc(password), + host, + port, + enc(dbname), + ); + + match tokio_postgres::connect(&conn_str, NoTls).await { + Ok((_client, connection)) => { + // Spawn the connection handler so it keeps running while we test + tokio::spawn(async move { + if let Err(e) = connection.await { + eprintln!("connection error: {}", e); + } + }); + TestConnectionResult { ok: true, error: None } + } + Err(e) => TestConnectionResult { + ok: false, + error: Some(e.to_string()), + }, + } +} + +/// Test a MySQL connection using `sqlx`. +/// +/// Uses `MySqlPoolOptions` with a pool size of 1 and a 10-second +/// `acquire_timeout`. +async fn test_mysql_connection(config: &DbConfig) -> TestConnectionResult { + use sqlx::mysql::MySqlPoolOptions; + + let host = &config.host; + let port = config.port.unwrap_or(3306); + let user = config.username.as_deref().unwrap_or("root"); + let password = config.password.as_deref().unwrap_or(""); + let dbname = config.database.as_deref().unwrap_or("mysql"); + + let conn_str = format!( + "mysql://{}:{}@{}:{}/{}", + user, password, host, port, dbname + ); + + match MySqlPoolOptions::new() + .max_connections(1) + .acquire_timeout(std::time::Duration::from_secs(10)) + .connect(&conn_str) + .await + { + Ok(pool) => { + pool.close().await; + TestConnectionResult { ok: true, error: None } + } + Err(e) => TestConnectionResult { + ok: false, + error: Some(e.to_string()), + }, + } +} + +/// Test a SQLite connection using `rusqlite`. +/// +/// Opens the database file at `config.host`. Returns success if the file +/// can be opened as a valid SQLite database. +fn test_sqlite_connection(config: &DbConfig) -> TestConnectionResult { + match rusqlite::Connection::open(&config.host) { + Ok(_conn) => TestConnectionResult { ok: true, error: None }, + Err(e) => TestConnectionResult { + ok: false, + error: Some(e.to_string()), + }, + } +} + +/// Test a Redis connection using the `redis` crate. +/// +/// Uses `redis::Client::open` followed by `get_async_connection` with a +/// 10-second timeout via `tokio::time::timeout`. +async fn test_redis_connection(config: &DbConfig) -> TestConnectionResult { + use tokio::time::timeout; + + let host = &config.host; + let port = config.port.unwrap_or(6379); + let password = config.password.as_deref(); + + let conn_str = if let Some(pwd) = password { + format!("redis://:{}@{}:{}/", pwd, host, port) + } else { + format!("redis://{}:{}/", host, port) + }; + + match redis::Client::open(conn_str.as_str()) { + Ok(client) => { + match timeout( + std::time::Duration::from_secs(10), + client.get_multiplexed_async_connection(), + ) + .await + { + Ok(Ok(_conn)) => TestConnectionResult { ok: true, error: None }, + Ok(Err(e)) => TestConnectionResult { + ok: false, + error: Some(e.to_string()), + }, + Err(_) => TestConnectionResult { + ok: false, + error: Some("connection timed out after 10 seconds".to_string()), + }, + } + } + Err(e) => TestConnectionResult { + ok: false, + error: Some(e.to_string()), + }, + } +} + +/// Tauri command to test a database connection. +/// +/// Calls `test_database_connection` and returns the result. +#[tauri::command] +pub async fn test_connection(config: DbConfig) -> Result { + Ok(test_database_connection(&config).await) +} + +#[cfg(test)] +mod tests { + use super::*; + + // ------------------------------------------------------------------ + // TestConnectionResult serialization + // ------------------------------------------------------------------ + + #[test] + fn test_connection_result_serialization() { + // ok=true result serializes correctly + let result = TestConnectionResult { ok: true, error: None }; + let json = serde_json::to_string(&result).unwrap(); + assert!(json.contains("\"ok\":true"), "ok=true should appear in JSON"); + + // error result includes the error message + let result = TestConnectionResult { + ok: false, + error: Some("connection refused".to_string()), + }; + let json = serde_json::to_string(&result).unwrap(); + assert!(json.contains("\"connection refused\""), "error message should appear in JSON"); + } + + // ------------------------------------------------------------------ + // sanitize_error + // ------------------------------------------------------------------ + + #[test] + fn test_connection_sanitizes_error() { + let msg = "connection failed: password=secret123 user=admin"; + let sanitized = sanitize_error(msg); + assert!(!sanitized.contains("secret123"), "should not leak password value"); + assert!(!sanitized.contains("admin"), "should not leak username value"); + assert!(!sanitized.contains("password="), "should remove password= pattern"); + assert!(!sanitized.contains("user="), "should remove user= pattern"); + } + + // ------------------------------------------------------------------ + // validate_test_input rejection + // ------------------------------------------------------------------ + + #[test] + fn validate_test_input_rejects_invalid() { + // Unsupported db type + let config = DbConfig { + db_type: "mongodb".to_string(), + host: "localhost".to_string(), + port: Some(27017), + username: None, + password: None, + database: None, + ssl_mode: None, + ssl_ca_path: None, + ssl_cert_path: None, + ssl_key_path: None, + }; + assert!( + validate_test_input(&config).is_some(), + "mongodb should be rejected" + ); + + // Empty host + let config = DbConfig { + db_type: "postgresql".to_string(), + host: "".to_string(), + port: Some(5432), + username: None, + password: None, + database: None, + ssl_mode: None, + ssl_ca_path: None, + ssl_cert_path: None, + ssl_key_path: None, + }; + assert!( + validate_test_input(&config).is_some(), + "empty host should be rejected" + ); + + // Port 0 + let config = DbConfig { + db_type: "postgresql".to_string(), + host: "localhost".to_string(), + port: Some(0), + username: None, + password: None, + database: None, + ssl_mode: None, + ssl_ca_path: None, + ssl_cert_path: None, + ssl_key_path: None, + }; + assert!( + validate_test_input(&config).is_some(), + "port 0 should be rejected" + ); + } + + // ------------------------------------------------------------------ + // validate_test_input acceptance + // ------------------------------------------------------------------ + + #[test] + fn validate_test_input_accepts_valid() { + let config = DbConfig { + db_type: "postgresql".to_string(), + host: "localhost".to_string(), + port: Some(5432), + username: Some("user".to_string()), + password: None, + database: Some("mydb".to_string()), + ssl_mode: None, + ssl_ca_path: None, + ssl_cert_path: None, + ssl_key_path: None, + }; + assert!( + validate_test_input(&config).is_none(), + "valid postgresql config should be accepted" + ); + } + + #[test] + fn sqlite_accepts_no_port() { + // SQLite does not require a port + let config = DbConfig { + db_type: "sqlite".to_string(), + host: "/tmp/test.db".to_string(), + port: None, + username: None, + password: None, + database: None, + ssl_mode: None, + ssl_ca_path: None, + ssl_cert_path: None, + ssl_key_path: None, + }; + assert!( + validate_test_input(&config).is_none(), + "sqlite without port should be accepted" + ); + + // SQLite should also accept a config with any port (port is ignored) + let config = DbConfig { + db_type: "sqlite".to_string(), + host: "/tmp/test.db".to_string(), + port: Some(9999), + username: None, + password: None, + database: None, + ssl_mode: None, + ssl_ca_path: None, + ssl_cert_path: None, + ssl_key_path: None, + }; + assert!( + validate_test_input(&config).is_none(), + "sqlite with any port should be accepted" + ); + } +} \ No newline at end of file diff --git a/src-tauri/src/db/introspection.rs b/src-tauri/src/db/introspection.rs new file mode 100644 index 0000000..19f5f69 --- /dev/null +++ b/src-tauri/src/db/introspection.rs @@ -0,0 +1,385 @@ +//! Schema introspection query builders. +//! +//! This module provides pure functions that generate SQL query strings +//! for database schema introspection. No actual DB connections are needed +//! for testing — all functions are deterministic string builders. + +// --------------------------------------------------------------------------- +// PostgreSQL +// --------------------------------------------------------------------------- + +/// Approximate row count for a table via `pg_class.reltuples`. +pub fn pg_reltuples_query(schema: &str, table: &str) -> String { + format!( + "SELECT reltuples::bigint AS count FROM pg_class \ + WHERE relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = '{}') \ + AND relname = '{}'", + schema, table + ) +} + +/// List tables and views in a schema (or all non-system schemata). +/// +/// When `schema` is `None` all schemata except the built-in system schemata +/// (`pg_catalog`, `information_schema`) are included. +pub fn pg_tables_query(schema: Option<&str>) -> String { + match schema { + Some(s) => format!( + "SELECT table_name, table_type FROM information_schema.tables \ + WHERE table_schema = '{}' ORDER BY table_name", + s + ), + None => { + "SELECT table_name, table_type, table_schema FROM information_schema.tables \ + WHERE table_schema NOT IN ('pg_catalog', 'information_schema') \ + ORDER BY table_schema, table_name" + .to_string() + } + } +} + +/// List all non-system schemata. +pub fn pg_schemas_query() -> String { + "SELECT schema_name FROM information_schema.schemata \ + WHERE schema_name NOT IN ('pg_catalog', 'information_schema', 'pg_toast') \ + ORDER BY schema_name" + .to_string() +} + +/// List non-template databases. +pub fn pg_databases_query() -> String { + "SELECT datname FROM pg_database WHERE datistemplate = false ORDER BY datname".to_string() +} + +/// Column details with primary-key and foreign-key annotations. +/// +/// Joins `information_schema.columns` with constraint metadata so that +/// each row includes PK / FK information when applicable. +pub fn pg_columns_query(schema: &str, table: &str) -> String { + format!( + r#"SELECT + c.column_name, + c.data_type, + c.is_nullable, + c.character_maximum_length, + c.numeric_precision, + c.numeric_scale, + c.column_default, + c.ordinal_position, + pk.constraint_type, + fk.foreign_table_schema, + fk.foreign_table_name, + fk.foreign_column_name +FROM information_schema.columns c +LEFT JOIN ( + SELECT kcu.column_name, kcu.table_schema, kcu.table_name, 'PRIMARY KEY' AS constraint_type + FROM information_schema.table_constraints tc + JOIN information_schema.key_column_usage kcu + ON tc.constraint_catalog = kcu.constraint_catalog + AND tc.constraint_schema = kcu.constraint_schema + AND tc.constraint_name = kcu.constraint_name + WHERE tc.constraint_type = 'PRIMARY KEY' +) pk ON c.table_schema = pk.table_schema AND c.table_name = pk.table_name AND c.column_name = pk.column_name +LEFT JOIN ( + SELECT + kcu.column_name, + kcu.table_schema, + kcu.table_name, + ccu.table_schema AS foreign_table_schema, + ccu.table_name AS foreign_table_name, + ccu.column_name AS foreign_column_name + FROM information_schema.table_constraints tc + JOIN information_schema.key_column_usage kcu + ON tc.constraint_catalog = kcu.constraint_catalog + AND tc.constraint_schema = kcu.constraint_schema + AND tc.constraint_name = kcu.constraint_name + JOIN information_schema.constraint_column_usage ccu + ON tc.constraint_catalog = ccu.constraint_catalog + AND tc.constraint_schema = ccu.constraint_schema + AND tc.constraint_name = ccu.constraint_name + WHERE tc.constraint_type = 'FOREIGN KEY' +) fk ON c.table_schema = fk.table_schema AND c.table_name = fk.table_name AND c.column_name = fk.column_name +WHERE c.table_schema = '{}' AND c.table_name = '{}' +ORDER BY c.ordinal_position"#, + schema, table + ) +} + +// --------------------------------------------------------------------------- +// MySQL +// --------------------------------------------------------------------------- + +/// List tables (and views) in the given schema. +/// +/// When `schema` is `None` all non-system schemata are included (excluding +/// `information_schema`, `performance_schema`, `mysql`, and `sys`). +pub fn mysql_tables_query(schema: Option<&str>) -> String { + match schema { + Some(s) => format!( + "SELECT table_name, table_type FROM information_schema.tables \ + WHERE table_schema = '{}' ORDER BY table_name", + s + ), + None => { + "SELECT table_name, table_type, table_schema FROM information_schema.tables \ + WHERE table_schema NOT IN ('information_schema', 'performance_schema', 'mysql', 'sys') \ + ORDER BY table_schema, table_name" + .to_string() + } + } +} + +// --------------------------------------------------------------------------- +// SQLite +// --------------------------------------------------------------------------- + +/// List tables and views from `sqlite_master`. +pub fn sqlite_tables_query() -> String { + "SELECT name AS table_name, type AS table_type FROM sqlite_master \ + WHERE type IN ('table', 'view') ORDER BY name" + .to_string() +} + +/// Column metadata via `PRAGMA table_info`. +pub fn sqlite_columns_query(table: &str) -> String { + format!("PRAGMA table_info('{}')", table) +} + +/// Foreign-key metadata via `PRAGMA foreign_key_list`. +pub fn sqlite_foreign_keys_query(table: &str) -> String { + format!("PRAGMA foreign_key_list('{}')", table) +} + +// --------------------------------------------------------------------------- +// Generic helpers +// --------------------------------------------------------------------------- + +/// Build a paginated `SELECT` query. +/// +/// Returns the SQL string (with `$1` / `$2` placeholders for `LIMIT` and +/// `OFFSET`) together with a vector of the corresponding `i64` parameter +/// values `[page_size, page * page_size]`. +/// +/// When `columns` is empty the query uses `*`. +pub fn build_select_query( + schema: &str, + table: &str, + columns: &[String], + page: i64, + page_size: i64, +) -> (String, Vec) { + let cols = if columns.is_empty() { + "*".to_string() + } else { + let mut buf = String::new(); + for (i, col) in columns.iter().enumerate() { + if i > 0 { + buf.push_str(", "); + } + buf.push('"'); + buf.push_str(col); + buf.push('"'); + } + buf + }; + + let sql = format!( + "SELECT {} FROM \"{}\".\"{}\" LIMIT $1 OFFSET $2", + cols, schema, table + ); + + let params = vec![page_size, page * page_size]; + + (sql, params) +} + +/// Build a `COUNT(*)` query. +pub fn build_count_query(schema: &str, table: &str) -> String { + format!("SELECT COUNT(*) FROM \"{}\".\"{}\"", schema, table) +} + +// --------------------------------------------------------------------------- +// Tests +// --------------------------------------------------------------------------- + +#[cfg(test)] +mod tests { + use super::*; + + // --------------------------------------------------------------- + // PostgreSQL + // --------------------------------------------------------------- + + #[test] + fn pg_count_approximation_query_is_valid() { + let sql = pg_reltuples_query("public", "users"); + assert!( + sql.contains("pg_class"), + "should query pg_class for row estimates; got: {}", + sql + ); + assert!(sql.contains("public"), "should contain schema name"); + assert!(sql.contains("users"), "should contain table name"); + } + + #[test] + fn pg_table_list_query_is_valid() { + let sql = pg_tables_query(Some("public")); + assert!( + sql.contains("information_schema.tables"), + "should query information_schema.tables; got: {}", + sql + ); + assert!(sql.contains("public"), "should contain the given schema"); + + // Without schema filter — should exclude system schemata + let all_sql = pg_tables_query(None); + assert!( + all_sql.contains("information_schema.tables"), + "should query information_schema.tables" + ); + assert!( + all_sql.contains("pg_catalog"), + "should exclude pg_catalog via NOT IN" + ); + } + + #[test] + fn pg_column_query_is_valid() { + let sql = pg_columns_query("public", "orders"); + assert!( + sql.contains("information_schema.columns"), + "should query information_schema.columns; got: {}", + sql + ); + assert!(sql.contains("public"), "should contain schema name"); + assert!(sql.contains("orders"), "should contain table name"); + assert!( + sql.contains("FOREIGN KEY"), + "should include FK constraint metadata" + ); + assert!( + sql.contains("PRIMARY KEY"), + "should include PK constraint metadata" + ); + } + + #[test] + fn pg_schemas_query_is_valid() { + let sql = pg_schemas_query(); + assert!(sql.contains("information_schema.schemata")); + assert!(sql.contains("pg_catalog")); + } + + #[test] + fn pg_databases_query_is_valid() { + let sql = pg_databases_query(); + assert!(sql.contains("pg_database")); + assert!(sql.contains("datistemplate")); + } + + // --------------------------------------------------------------- + // MySQL + // --------------------------------------------------------------- + + #[test] + fn mysql_table_list_query_is_valid() { + let sql = mysql_tables_query(Some("mydb")); + assert!( + sql.contains("information_schema.tables"), + "should query information_schema.tables; got: {}", + sql + ); + assert!(sql.contains("mydb"), "should contain the given schema"); + + let all_sql = mysql_tables_query(None); + assert!(all_sql.contains("information_schema.tables")); + assert!(all_sql.contains("performance_schema")); + } + + // --------------------------------------------------------------- + // SQLite + // --------------------------------------------------------------- + + #[test] + fn sqlite_table_list_query_is_valid() { + let sql = sqlite_tables_query(); + assert!( + sql.contains("sqlite_master"), + "should query sqlite_master; got: {}", + sql + ); + } + + #[test] + fn sqlite_columns_query_is_valid() { + let sql = sqlite_columns_query("users"); + assert!( + sql.contains("PRAGMA table_info"), + "should use PRAGMA table_info; got: {}", + sql + ); + assert!(sql.contains("users"), "should contain table name"); + } + + #[test] + fn sqlite_foreign_keys_query_is_valid() { + let sql = sqlite_foreign_keys_query("orders"); + assert!( + sql.contains("PRAGMA foreign_key_list"), + "should use PRAGMA foreign_key_list; got: {}", + sql + ); + assert!(sql.contains("orders"), "should contain table name"); + } + + // --------------------------------------------------------------- + // Generic helpers + // --------------------------------------------------------------- + + #[test] + fn build_paginated_query_with_limits() { + let columns = vec!["id".to_string(), "name".to_string()]; + let (sql, params) = build_select_query("public", "users", &columns, 2, 25); + + assert!( + sql.contains("LIMIT"), + "should contain LIMIT clause; got: {}", + sql + ); + assert!( + sql.contains("OFFSET"), + "should contain OFFSET clause; got: {}", + sql + ); + assert!(sql.contains("public"), "should contain schema name"); + assert!(sql.contains("users"), "should contain table name"); + assert!(sql.contains("\"id\""), "should quote column names"); + assert!(sql.contains("\"name\""), "should quote column names"); + + // page=2, page_size=25 => offset = 50 + assert_eq!(params, vec![25, 50], "params should be [page_size, offset]"); + } + + #[test] + fn build_paginated_query_empty_columns_uses_star() { + let (sql, _) = build_select_query("public", "users", &[], 0, 10); + assert!( + sql.contains('*'), + "empty columns should produce SELECT *; got: {}", + sql + ); + } + + #[test] + fn build_count_query_is_valid() { + let sql = build_count_query("public", "orders"); + assert!( + sql.contains("COUNT(*)"), + "should contain COUNT(*); got: {}", + sql + ); + assert!(sql.contains("public"), "should contain schema name"); + assert!(sql.contains("orders"), "should contain table name"); + } +} \ No newline at end of file diff --git a/src-tauri/src/db/mod.rs b/src-tauri/src/db/mod.rs new file mode 100644 index 0000000..d067c15 --- /dev/null +++ b/src-tauri/src/db/mod.rs @@ -0,0 +1,5 @@ +pub mod pool; +pub mod introspection; + +#[allow(unused_imports)] +pub use pool::{ConnectionPoolManager, DbConfig, DbHandle}; \ No newline at end of file diff --git a/src-tauri/src/db/pool.rs b/src-tauri/src/db/pool.rs new file mode 100644 index 0000000..1bf535d --- /dev/null +++ b/src-tauri/src/db/pool.rs @@ -0,0 +1,264 @@ +use serde::{Deserialize, Serialize}; +use std::time::Instant; + +/// Configuration for establishing a database connection. +/// +/// Fields map to connection parameters. For SQLite, `host` stores the +/// file path and `port` is always `None`. +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct DbConfig { + pub db_type: String, + pub host: String, + pub port: Option, + pub username: Option, + pub password: Option, + pub database: Option, + pub ssl_mode: Option, + pub ssl_ca_path: Option, + pub ssl_cert_path: Option, + pub ssl_key_path: Option, +} + +impl DbConfig { + /// Create a `DbConfig` for a SQLite database at `path`. + /// + /// `host` is set to the file path; all other optional fields are `None`. + pub fn sqlite(path: &str) -> Self { + Self { + db_type: "SQLite".into(), + host: path.into(), + port: None, + username: None, + password: None, + database: None, + ssl_mode: None, + ssl_ca_path: None, + ssl_cert_path: None, + ssl_key_path: None, + } + } +} + +/// A handle to an active database connection. +/// +/// Supports `Sqlite` (synchronous via `rusqlite`) and +/// `Postgresql` (async via `tokio-postgres`). MySQL and Redis +/// variants will be added in later tasks. +#[derive(Debug)] +pub enum DbHandle { + /// A synchronous SQLite connection via `rusqlite`. + Sqlite(rusqlite::Connection), + /// An asynchronous PostgreSQL connection via `tokio-postgres`. + /// Stores the client handle and the background connection task. + Postgresql(tokio_postgres::Client, tokio::task::JoinHandle<()>), +} + +/// Internal entry stored in the pool manager. +/// +/// Tracks the database handle and the last time it was accessed for LRU +/// eviction. +#[derive(Debug)] +pub(crate) struct DbPoolEntry { + pub(crate) handle: DbHandle, + pub(crate) last_accessed: Instant, +} + +/// A connection pool manager with LRU eviction. +/// +/// Manages a set of active database handles keyed by a user-defined +/// identifier. When the number of registered pools exceeds `max_pools`, +/// the least-recently-used entry (i.e. the pool whose handle was accessed +/// furthest in the past) is evicted. +/// +/// Default `max_pools` is 5. +pub struct ConnectionPoolManager { + pools: indexmap::IndexMap, + max_pools: usize, +} + +impl ConnectionPoolManager { + /// Create a new manager with a maximum of 5 pools. + pub fn new() -> Self { + Self { + pools: indexmap::IndexMap::new(), + max_pools: 5, + } + } + + /// Set the maximum number of pools before LRU eviction kicks in. + /// + /// If the current pool count exceeds the new maximum, the oldest + /// entries are evicted immediately. + pub fn set_max_pools(&mut self, max: usize) { + self.max_pools = max; + while self.pools.len() > self.max_pools { + self.pools.shift_remove_index(0); + } + } + + /// Register a new database handle under `id`. + /// + /// * If `id` already exists the old entry is removed first. + /// * The new entry is inserted as the most-recently-used. + /// * If the total pool count exceeds `max_pools` the least-recently-used + /// (oldest) entry is evicted. + pub fn register(&mut self, id: &str, handle: DbHandle) { + // Remove existing entry if present + self.pools.shift_remove(id); + + let entry = DbPoolEntry { + handle, + last_accessed: Instant::now(), + }; + self.pools.insert(id.to_string(), entry); + + // LRU eviction: remove oldest (front) entries until within capacity + while self.pools.len() > self.max_pools { + self.pools.shift_remove_index(0); + } + } + + /// Get a mutable reference to the handle for `id`, or `None`. + /// + /// Updates the last-accessed timestamp and re-orders the entry to + /// mark it as most-recently-used. + pub fn get(&mut self, id: &str) -> Option<&mut DbHandle> { + if let Some((key, mut entry)) = self.pools.shift_remove_entry(id) { + entry.last_accessed = Instant::now(); + self.pools.insert(key, entry); + // The newly inserted entry is at the end (MRU position) + self.pools.last_mut().map(|(_, e)| &mut e.handle) + } else { + None + } + } + + /// Remove the pool with `id` from the manager. + pub fn remove(&mut self, id: &str) { + self.pools.shift_remove(id); + } + + /// Return a reference to the underlying pool map. + pub(crate) fn pools(&self) -> &indexmap::IndexMap { + &self.pools + } + + /// Return `true` if a pool with `id` is registered. + pub fn contains(&self, id: &str) -> bool { + self.pools.contains_key(id) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + // ------------------------------------------------------------------ + // DbConfig tests + // ------------------------------------------------------------------ + + #[test] + fn create_pg_pool_with_minimal_config() { + let cfg = DbConfig { + db_type: "PostgreSQL".into(), + host: "pg.example.com".into(), + port: Some(5432), + username: Some("admin".into()), + password: Some("secret".into()), + database: Some("mydb".into()), + ssl_mode: None, + ssl_ca_path: None, + ssl_cert_path: None, + ssl_key_path: None, + }; + + assert_eq!(cfg.db_type, "PostgreSQL"); + assert_eq!(cfg.host, "pg.example.com"); + assert_eq!(cfg.port, Some(5432)); + assert_eq!(cfg.username.as_deref(), Some("admin")); + assert_eq!(cfg.password.as_deref(), Some("secret")); + assert_eq!(cfg.database.as_deref(), Some("mydb")); + assert!(cfg.ssl_mode.is_none()); + } + + #[test] + fn db_config_for_sqlite_has_no_port() { + let cfg = DbConfig::sqlite("/tmp/test.db"); + + assert_eq!(cfg.db_type, "SQLite"); + assert_eq!(cfg.host, "/tmp/test.db"); + assert!(cfg.port.is_none()); + assert!(cfg.username.is_none()); + assert!(cfg.database.is_none()); + } + + // ------------------------------------------------------------------ + // ConnectionPoolManager tests + // ------------------------------------------------------------------ + + #[test] + fn pool_manager_starts_empty() { + let manager = ConnectionPoolManager::new(); + assert_eq!(manager.pools().len(), 0); + } + + #[test] + fn pool_manager_register_and_evict() { + let mut manager = ConnectionPoolManager::new(); + manager.set_max_pools(2); + + let conn_a = rusqlite::Connection::open_in_memory().unwrap(); + let conn_b = rusqlite::Connection::open_in_memory().unwrap(); + let conn_c = rusqlite::Connection::open_in_memory().unwrap(); + + // Register A, B, then C with max=2 -- A should be evicted (LRU) + manager.register("a", DbHandle::Sqlite(conn_a)); + manager.register("b", DbHandle::Sqlite(conn_b)); + manager.register("c", DbHandle::Sqlite(conn_c)); + + assert_eq!(manager.pools().len(), 2); + assert!(!manager.contains("a"), "'a' should have been evicted (LRU)"); + assert!(manager.contains("b")); + assert!(manager.contains("c")); + } + + #[test] + fn pool_manager_remove_closes_pool() { + let mut manager = ConnectionPoolManager::new(); + + let conn = rusqlite::Connection::open_in_memory().unwrap(); + manager.register("tmp", DbHandle::Sqlite(conn)); + assert!(manager.contains("tmp")); + + manager.remove("tmp"); + assert!(!manager.contains("tmp")); + assert_eq!(manager.pools().len(), 0); + } + + #[test] + fn pool_manager_get_updates_access_time() { + let mut manager = ConnectionPoolManager::new(); + manager.set_max_pools(3); + + let conn_a = rusqlite::Connection::open_in_memory().unwrap(); + let conn_b = rusqlite::Connection::open_in_memory().unwrap(); + let conn_c = rusqlite::Connection::open_in_memory().unwrap(); + + manager.register("a", DbHandle::Sqlite(conn_a)); + manager.register("b", DbHandle::Sqlite(conn_b)); + manager.register("c", DbHandle::Sqlite(conn_c)); + + // Access "a" -- makes it MRU + let _handle = manager.get("a").unwrap(); + + // Register "d" with max=3 -- "b" (now LRU) should be evicted, not "a" + let conn_d = rusqlite::Connection::open_in_memory().unwrap(); + manager.register("d", DbHandle::Sqlite(conn_d)); + + assert_eq!(manager.pools().len(), 3); + assert!(manager.contains("a"), "'a' was recently accessed, should survive"); + assert!(!manager.contains("b"), "'b' is LRU and should be evicted"); + assert!(manager.contains("c")); + assert!(manager.contains("d")); + } +} \ No newline at end of file diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 4a277ef..611e339 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -1,3 +1,26 @@ +// Infrastructure modules: types, introspection, and DB viewer commands are built ahead +// of runtime usage, producing expected dead_code/unused warnings during development. +#![allow(dead_code)] + +mod db; +mod models; +mod store; +mod commands; + +use std::sync::Mutex as StdMutex; +use tauri::Manager; +use store::Store; +use commands::ssh::SshTunnelManager; +use db::pool::ConnectionPoolManager; + +pub struct AppState { + pub db_store: StdMutex, + pub pool_manager: tokio::sync::Mutex, + pub ssh_manager: StdMutex, +} + +use commands::{connections, db_viewer, folders, tags, settings, import_export, keychain, demo}; + // Learn more about Tauri commands at https://tauri.app/develop/calling-rust/ #[tauri::command] fn greet(name: &str) -> String { @@ -6,9 +29,62 @@ fn greet(name: &str) -> String { #[cfg_attr(mobile, tauri::mobile_entry_point)] pub fn run() { + let store = Store::open("gridline.db").expect("failed to open db"); + let store_ref = StdMutex::new(store); + tauri::Builder::default() .plugin(tauri_plugin_opener::init()) - .invoke_handler(tauri::generate_handler![greet]) + .plugin(tauri_plugin_fs::init()) + .plugin(tauri_plugin_keyring_store::init()) + .manage(AppState { + db_store: store_ref, + pool_manager: tokio::sync::Mutex::new(ConnectionPoolManager::new()), + ssh_manager: StdMutex::new(SshTunnelManager::new()), + }) + .setup(move |app| { + let state = app.state::(); + demo::ensure_demo_db(app.handle(), &state.db_store) + .map_err(|e| { + eprintln!("Failed to set up demo DB: {e}"); + }) + .ok(); + Ok(()) + }) + .invoke_handler(tauri::generate_handler![ + greet, + connections::get_connections, + connections::create_connection, + connections::update_connection, + connections::delete_connection, + connections::add_connection_tags, + folders::get_folders, + folders::create_folder, + folders::delete_folder, + folders::update_folder, + folders::add_folder_tags, + tags::get_tags, + tags::create_tag, + tags::delete_tag, + tags::update_tag, + settings::get_settings, + settings::update_setting, + import_export::import_connections, + import_export::export_connections, + commands::test_connection::test_connection, + db_viewer::db_connect, + db_viewer::db_disconnect, + db_viewer::get_databases, + db_viewer::get_schemas, + db_viewer::get_tables, + db_viewer::get_table_data, + db_viewer::get_fk_preview, + db_viewer::execute_change, + db_viewer::refresh_connection, + keychain::save_connection_password, + keychain::get_connection_password, + keychain::delete_connection_password, + demo::recreate_demo_db, + ]) .run(tauri::generate_context!()) .expect("error while running tauri application"); } diff --git a/src-tauri/src/models/connection.rs b/src-tauri/src/models/connection.rs new file mode 100644 index 0000000..79c0920 --- /dev/null +++ b/src-tauri/src/models/connection.rs @@ -0,0 +1,136 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Connection { + pub id: String, + pub name: String, + pub db_type: String, + pub host: String, + pub port: Option, + pub username: Option, + pub database: Option, + pub folder_id: Option, + pub keychain_ref: Option, + pub environment: Option, + pub ssh_host: Option, + pub ssh_port: Option, + pub ssh_user: Option, + pub ssh_auth_method: Option, + pub ssh_private_key_path: Option, + pub ssl_mode: Option, + pub ssl_ca_path: Option, + pub ssl_cert_path: Option, + pub ssl_key_path: Option, + pub tag_ids: Vec, + pub created_at: String, + pub updated_at: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ConnectionInput { + pub name: String, + pub db_type: String, + pub host: String, + pub port: Option, + pub username: Option, + pub folder_id: Option, + pub tag_ids: Vec, + pub password: Option, + pub database: Option, + pub environment: Option, + pub ssh_host: Option, + pub ssh_port: Option, + pub ssh_user: Option, + pub ssh_auth_method: Option, + pub ssh_private_key_path: Option, + pub ssh_passphrase: Option, + pub ssl_mode: Option, + pub ssl_ca_path: Option, + pub ssl_cert_path: Option, + pub ssl_key_path: Option, +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn connection_input_roundtrip_with_all_fields() { + let input = ConnectionInput { + name: "Test DB".to_string(), + db_type: "PostgreSQL".to_string(), + host: "db.example.com".to_string(), + port: Some(5432), + username: Some("admin".to_string()), + folder_id: Some("folder1".to_string()), + tag_ids: vec!["tag1".to_string(), "tag2".to_string()], + password: Some("secret123".to_string()), + database: Some("mydb".to_string()), + ssh_host: Some("jumphost.example.com".to_string()), + ssh_port: Some(2222), + ssh_user: Some("tunnel".to_string()), + ssh_auth_method: Some("Key".to_string()), + ssh_private_key_path: Some("/path/to/key".to_string()), + ssh_passphrase: Some("passphrase".to_string()), + ssl_mode: Some("require".to_string()), + ssl_ca_path: Some("/path/to/ca".to_string()), + ssl_cert_path: Some("/path/to/cert".to_string()), + ssl_key_path: Some("/path/to/key".to_string()), + environment: Some("production".to_string()), + }; + + let json = serde_json::to_string(&input).unwrap(); + let deserialized: ConnectionInput = serde_json::from_str(&json).unwrap(); + + assert_eq!(deserialized.name, "Test DB"); + assert_eq!(deserialized.db_type, "PostgreSQL"); + assert_eq!(deserialized.host, "db.example.com"); + assert_eq!(deserialized.port, Some(5432)); + assert_eq!(deserialized.username, Some("admin".to_string())); + assert_eq!(deserialized.folder_id, Some("folder1".to_string())); + assert_eq!(deserialized.tag_ids, vec!["tag1".to_string(), "tag2".to_string()]); + assert_eq!(deserialized.password, Some("secret123".to_string())); + assert_eq!(deserialized.database, Some("mydb".to_string())); + assert_eq!(deserialized.ssh_host, Some("jumphost.example.com".to_string())); + assert_eq!(deserialized.ssh_port, Some(2222)); + assert_eq!(deserialized.ssh_user, Some("tunnel".to_string())); + assert_eq!(deserialized.ssh_auth_method, Some("Key".to_string())); + assert_eq!(deserialized.ssh_private_key_path, Some("/path/to/key".to_string())); + assert_eq!(deserialized.ssh_passphrase, Some("passphrase".to_string())); + assert_eq!(deserialized.ssl_mode, Some("require".to_string())); + assert_eq!(deserialized.ssl_ca_path, Some("/path/to/ca".to_string())); + assert_eq!(deserialized.ssl_cert_path, Some("/path/to/cert".to_string())); + assert_eq!(deserialized.ssl_key_path, Some("/path/to/key".to_string())); + } + + #[test] + fn connection_persisted_does_not_include_password() { + let conn = Connection { + id: "test-id".to_string(), + name: "Test".to_string(), + db_type: "PostgreSQL".to_string(), + host: "localhost".to_string(), + port: Some(5432), + username: Some("user".to_string()), + folder_id: Some("folder".to_string()), + keychain_ref: Some("keychain-ref".to_string()), + environment: None, + tag_ids: vec![], + created_at: "2024-01-01T00:00:00Z".to_string(), + updated_at: "2024-01-01T00:00:00Z".to_string(), + database: Some("mydb".to_string()), + ssh_host: Some("ssh-host".to_string()), + ssh_port: Some(2222), + ssh_user: Some("ssh-user".to_string()), + ssh_auth_method: Some("Key".to_string()), + ssh_private_key_path: Some("/path/to/key".to_string()), + ssl_mode: Some("require".to_string()), + ssl_ca_path: Some("/path/to/ca".to_string()), + ssl_cert_path: Some("/path/to/cert".to_string()), + ssl_key_path: Some("/path/to/key".to_string()), + }; + + let json = serde_json::to_string(&conn).unwrap(); + assert!(!json.contains("password"), "Connection JSON should not contain password field"); + } +} \ No newline at end of file diff --git a/src-tauri/src/models/db_viewer.rs b/src-tauri/src/models/db_viewer.rs new file mode 100644 index 0000000..771cd66 --- /dev/null +++ b/src-tauri/src/models/db_viewer.rs @@ -0,0 +1,194 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct TableInfo { + pub name: String, + pub schema: String, + pub table_type: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ColumnInfo { + pub name: String, + pub data_type: String, + pub is_nullable: bool, + pub is_pk: bool, + pub is_fk: bool, + pub fk_ref: Option<(String, String)>, + pub default_value: Option, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct QueryResult { + pub columns: Vec, + pub rows: Vec>, + pub total_rows: i64, + pub page: i64, + pub page_size: i64, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Pagination { + pub page: i64, + pub page_size: i64, + pub total_rows: i64, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(tag = "type", rename_all = "snake_case")] +pub enum Change { + Update { + id: String, + schema: String, + table: String, + primary_key: String, + old_data: String, + new_data: String, + }, + Insert { + id: String, + schema: String, + table: String, + data: String, + }, + Delete { + id: String, + schema: String, + table: String, + primary_key: String, + }, + AlterTable { + id: String, + schema: String, + table: String, + sql: String, + rollback_sql: String, + }, +} + +impl Change { + pub fn id(&self) -> &str { + match self { + Change::Update { id, .. } + | Change::Insert { id, .. } + | Change::Delete { id, .. } + | Change::AlterTable { id, .. } => id, + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn table_info_serialization() { + let info = TableInfo { + name: "users".to_string(), + schema: "public".to_string(), + table_type: "TABLE".to_string(), + }; + let json = serde_json::to_string(&info).unwrap(); + assert!(json.contains("users")); + assert!(json.contains("public")); + assert!(json.contains("TABLE")); + } + + #[test] + fn query_result_can_be_empty() { + let result = QueryResult { + columns: vec![], + rows: vec![], + total_rows: 0, + page: 1, + page_size: 100, + }; + let json = serde_json::to_string(&result).unwrap(); + assert!(json.contains(r#""rows":[]"#)); + } + + #[test] + fn change_id_method() { + let update = Change::Update { + id: "chg-1".to_string(), + schema: "public".to_string(), + table: "users".to_string(), + primary_key: "{\"id\": 1}".to_string(), + old_data: "{\"name\": \"old\"}".to_string(), + new_data: "{\"name\": \"new\"}".to_string(), + }; + assert_eq!(update.id(), "chg-1"); + + let inserted = Change::Insert { + id: "chg-2".to_string(), + schema: "public".to_string(), + table: "users".to_string(), + data: "{\"name\": \"alice\"}".to_string(), + }; + assert_eq!(inserted.id(), "chg-2"); + + let deleted = Change::Delete { + id: "chg-3".to_string(), + schema: "public".to_string(), + table: "users".to_string(), + primary_key: "{\"id\": 2}".to_string(), + }; + assert_eq!(deleted.id(), "chg-3"); + + let alter = Change::AlterTable { + id: "chg-4".to_string(), + schema: "public".to_string(), + table: "users".to_string(), + sql: "ALTER TABLE users ADD COLUMN age INT".to_string(), + rollback_sql: "ALTER TABLE users DROP COLUMN age".to_string(), + }; + assert_eq!(alter.id(), "chg-4"); + } + + #[test] + fn change_serde_tag() { + let update = Change::Update { + id: "chg-1".to_string(), + schema: "public".to_string(), + table: "users".to_string(), + primary_key: "{\"id\": 1}".to_string(), + old_data: "{\"name\": \"old\"}".to_string(), + new_data: "{\"name\": \"new\"}".to_string(), + }; + let json = serde_json::to_string(&update).unwrap(); + assert!( + json.contains(r#""type":"update""#), + "serialized Change::Update should use snake_case tag 'update'; got: {}", + json + ); + } + + #[test] + fn column_info_fk_ref() { + let col = ColumnInfo { + name: "user_id".to_string(), + data_type: "integer".to_string(), + is_nullable: true, + is_pk: false, + is_fk: true, + fk_ref: Some(("users".to_string(), "id".to_string())), + default_value: None, + }; + let json = serde_json::to_string(&col).unwrap(); + assert!(json.contains("user_id")); + assert!(json.contains("users")); + } + + #[test] + fn pagination_serialization() { + let pagination = Pagination { + page: 2, + page_size: 50, + total_rows: 250, + }; + let json = serde_json::to_string(&pagination).unwrap(); + assert!(json.contains(r#""page":2"#)); + assert!(json.contains(r#""page_size":50"#)); + assert!(json.contains(r#""total_rows":250"#)); + } +} \ No newline at end of file diff --git a/src-tauri/src/models/folder.rs b/src-tauri/src/models/folder.rs new file mode 100644 index 0000000..aa4cf73 --- /dev/null +++ b/src-tauri/src/models/folder.rs @@ -0,0 +1,18 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Folder { + pub id: String, + pub name: String, + pub parent_id: Option, + pub tag_ids: Vec, + pub created_at: String, + pub updated_at: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct FolderInput { + pub name: String, + pub parent_id: Option, + pub tag_ids: Option>, +} \ No newline at end of file diff --git a/src-tauri/src/models/mod.rs b/src-tauri/src/models/mod.rs new file mode 100644 index 0000000..9b71c55 --- /dev/null +++ b/src-tauri/src/models/mod.rs @@ -0,0 +1,12 @@ +pub mod connection; +pub mod db_viewer; +pub mod folder; +pub mod tag; +pub mod settings; + +pub use connection::{Connection, ConnectionInput}; +#[allow(unused_imports)] +pub use db_viewer::{Change, ColumnInfo, Pagination, QueryResult, TableInfo}; +pub use folder::{Folder, FolderInput}; +pub use settings::Settings; +pub use tag::{Tag, TagInput}; \ No newline at end of file diff --git a/src-tauri/src/models/settings.rs b/src-tauri/src/models/settings.rs new file mode 100644 index 0000000..394007b --- /dev/null +++ b/src-tauri/src/models/settings.rs @@ -0,0 +1,15 @@ +use serde::{Deserialize, Serialize}; +use std::collections::HashMap; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Settings { + pub confirm_before_delete: bool, + pub default_folder_id: Option, + pub theme: String, + pub font_size: String, + pub default_ports: HashMap>, + pub tag_order: Option, + pub table_refresh_rate: i64, + pub table_page_size: i64, + pub shortcuts: HashMap, +} \ No newline at end of file diff --git a/src-tauri/src/models/tag.rs b/src-tauri/src/models/tag.rs new file mode 100644 index 0000000..35654d6 --- /dev/null +++ b/src-tauri/src/models/tag.rs @@ -0,0 +1,15 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Tag { + pub id: String, + pub name: String, + pub color: String, + pub created_at: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct TagInput { + pub name: String, + pub color: String, +} \ No newline at end of file diff --git a/src-tauri/src/store/migrations.rs b/src-tauri/src/store/migrations.rs new file mode 100644 index 0000000..f3d837e --- /dev/null +++ b/src-tauri/src/store/migrations.rs @@ -0,0 +1,188 @@ +use rusqlite::Connection; + +/// All new-column additions for the connections table since version 1. +const CONNECTION_COLUMNS_V2: &[(&str, &str)] = &[ + ("database", "TEXT"), + ("ssh_host", "TEXT"), + ("ssh_port", "INTEGER"), + ("ssh_user", "TEXT"), + ("ssh_auth_method", "TEXT"), + ("ssh_private_key_path", "TEXT"), + ("ssl_mode", "TEXT"), + ("ssl_ca_path", "TEXT"), + ("ssl_cert_path", "TEXT"), + ("ssl_key_path", "TEXT"), +]; + +/// New columns added since version 2. +const CONNECTION_COLUMNS_V3: &[(&str, &str)] = &[ + ("environment", "TEXT"), +]; + +pub fn run_migrations(conn: &Connection) -> Result<(), String> { + conn.execute_batch( + "CREATE TABLE IF NOT EXISTS schema_version (version INTEGER PRIMARY KEY); + CREATE TABLE IF NOT EXISTS folders ( + id TEXT PRIMARY KEY, + name TEXT NOT NULL, + parent_id TEXT REFERENCES folders(id) ON DELETE SET NULL, + created_at TEXT NOT NULL, + updated_at TEXT NOT NULL + ); + CREATE TABLE IF NOT EXISTS connections ( + id TEXT PRIMARY KEY, + name TEXT NOT NULL, + db_type TEXT NOT NULL, + host TEXT NOT NULL, + port INTEGER, + username TEXT, + database TEXT, + folder_id TEXT REFERENCES folders(id) ON DELETE SET NULL, + keychain_ref TEXT, + ssh_host TEXT, + ssh_port INTEGER, + ssh_user TEXT, + ssh_auth_method TEXT, + ssh_private_key_path TEXT, + ssl_mode TEXT, + ssl_ca_path TEXT, + ssl_cert_path TEXT, + ssl_key_path TEXT, + environment TEXT, + created_at TEXT NOT NULL, + updated_at TEXT NOT NULL + ); + CREATE TABLE IF NOT EXISTS tags ( + id TEXT PRIMARY KEY, + name TEXT NOT NULL UNIQUE, + color TEXT NOT NULL DEFAULT '#8b5cf6', + created_at TEXT NOT NULL + ); + CREATE TABLE IF NOT EXISTS connection_tags ( + connection_id TEXT NOT NULL REFERENCES connections(id) ON DELETE CASCADE, + tag_id TEXT NOT NULL REFERENCES tags(id) ON DELETE CASCADE, + PRIMARY KEY (connection_id, tag_id) + ); + CREATE TABLE IF NOT EXISTS folder_tags ( + folder_id TEXT NOT NULL REFERENCES folders(id) ON DELETE CASCADE, + tag_id TEXT NOT NULL REFERENCES tags(id) ON DELETE CASCADE, + PRIMARY KEY (folder_id, tag_id) + ); + CREATE TABLE IF NOT EXISTS settings ( + key TEXT PRIMARY KEY, + value TEXT NOT NULL + );", + ) + .map_err(|e| e.to_string())?; + + // --- Version-specific migrations ---------------------------------------- + + let current_ver: i64 = conn + .query_row( + "SELECT COALESCE(MAX(version), 0) FROM schema_version", + [], + |row| row.get(0), + ) + .unwrap_or(0); + + if current_ver < 2 { + // Discover which columns the connections table already has. + let existing: Vec = { + let mut stmt = conn + .prepare("PRAGMA table_info(connections)") + .map_err(|e| e.to_string())?; + let rows = stmt + .query_map([], |row| row.get::<_, String>(1)) + .map_err(|e| e.to_string())?; + rows.filter_map(|r| r.ok()).collect() + }; + + for (col_name, col_type) in CONNECTION_COLUMNS_V2 { + if !existing.contains(&col_name.to_string()) { + let sql = format!( + "ALTER TABLE connections ADD COLUMN {} {}", + col_name, col_type + ); + conn.execute(&sql, []).map_err(|e| e.to_string())?; + } + } + + // Record the migration. + conn.execute( + "INSERT INTO schema_version (version) VALUES (2)", + [], + ) + .map_err(|e| e.to_string())?; + } + + if current_ver < 3 { + let existing: Vec = { + let mut stmt = conn + .prepare("PRAGMA table_info(connections)") + .map_err(|e| e.to_string())?; + let rows = stmt + .query_map([], |row| row.get::<_, String>(1)) + .map_err(|e| e.to_string())?; + rows.filter_map(|r| r.ok()).collect() + }; + + for (col_name, col_type) in CONNECTION_COLUMNS_V3 { + if !existing.contains(&col_name.to_string()) { + let sql = format!( + "ALTER TABLE connections ADD COLUMN {} {}", + col_name, col_type + ); + conn.execute(&sql, []).map_err(|e| e.to_string())?; + } + } + + conn.execute( + "INSERT INTO schema_version (version) VALUES (3)", + [], + ) + .map_err(|e| e.to_string())?; + } + + Ok(()) +} + +#[cfg(test)] +mod tests { + use super::*; + use rusqlite::Connection; + + fn fresh_db() -> Connection { + let conn = Connection::open_in_memory().unwrap(); + run_migrations(&conn).unwrap(); + conn + } + + #[test] + fn migrations_create_all_tables() { + let conn = fresh_db(); + let tables: Vec = conn + .prepare("SELECT name FROM sqlite_master WHERE type='table' ORDER BY name") + .unwrap() + .query_map([], |row| row.get(0)) + .unwrap() + .filter_map(|r| r.ok()) + .collect(); + assert!(tables.contains(&"folders".to_string())); + assert!(tables.contains(&"connections".to_string())); + assert!(tables.contains(&"tags".to_string())); + assert!(tables.contains(&"connection_tags".to_string())); + assert!(tables.contains(&"settings".to_string())); + assert!(tables.contains(&"schema_version".to_string())); + } + + #[test] + fn migrations_are_idempotent() { + let conn = fresh_db(); + // Running again must not error + run_migrations(&conn).unwrap(); + let count: i64 = conn + .query_row("SELECT COUNT(*) FROM schema_version", [], |row| row.get(0)) + .unwrap(); + assert_eq!(count, 2); + } +} \ No newline at end of file diff --git a/src-tauri/src/store/mod.rs b/src-tauri/src/store/mod.rs new file mode 100644 index 0000000..4daf19f --- /dev/null +++ b/src-tauri/src/store/mod.rs @@ -0,0 +1,742 @@ +pub mod migrations; + +use rusqlite::params; +use rusqlite::Connection as SqliteConnection; +use std::collections::HashMap; +use std::sync::Mutex; + +use crate::models::{Connection, ConnectionInput, Folder, FolderInput, Settings, Tag, TagInput}; + +pub struct Store { + conn: Mutex, +} + +impl Store { + pub fn from_connection(conn: SqliteConnection) -> Self { + Self { + conn: Mutex::new(conn), + } + } + + pub fn open(path: &str) -> Result { + let conn = SqliteConnection::open(path).map_err(|e| e.to_string())?; + migrations::run_migrations(&conn).map_err(|e| e.to_string())?; + Ok(Self::from_connection(conn)) + } + + fn now() -> String { + chrono::Utc::now().to_rfc3339() + } + + pub fn get_folders(&self) -> Result, String> { + let conn = self.conn.lock().map_err(|e| e.to_string())?; + let mut stmt = conn + .prepare("SELECT id, name, parent_id, created_at, updated_at FROM folders ORDER BY name") + .map_err(|e| e.to_string())?; + let rows = stmt + .query_map([], |row| { + Ok(Folder { + id: row.get(0)?, + name: row.get(1)?, + parent_id: row.get(2)?, + tag_ids: vec![], + created_at: row.get(3)?, + updated_at: row.get(4)?, + }) + }) + .map_err(|e| e.to_string())?; + let mut folders: Vec = rows.filter_map(|r| r.ok()).collect(); + // Load tags for each folder + for f in folders.iter_mut() { + let mut tag_stmt = conn + .prepare("SELECT tag_id FROM folder_tags WHERE folder_id = ?1") + .map_err(|e| e.to_string())?; + let tag_rows = tag_stmt + .query_map(params![f.id], |row| row.get::<_, String>(0)) + .map_err(|e| e.to_string())?; + f.tag_ids = tag_rows.filter_map(|r| r.ok()).collect(); + } + Ok(folders) + } + + pub fn create_folder(&self, input: FolderInput) -> Result { + let conn = self.conn.lock().map_err(|e| e.to_string())?; + let id = uuid::Uuid::new_v4().to_string(); + let now = Self::now(); + conn.execute( + "INSERT INTO folders (id, name, parent_id, created_at, updated_at) VALUES (?1, ?2, ?3, ?4, ?5)", + params![id, input.name, input.parent_id, now, now], + ) + .map_err(|e| e.to_string())?; + let tag_ids = input.tag_ids.unwrap_or_default(); + for tag_id in &tag_ids { + conn.execute( + "INSERT OR IGNORE INTO folder_tags (folder_id, tag_id) VALUES (?1, ?2)", + params![id, tag_id], + ) + .map_err(|e| e.to_string())?; + } + Ok(Folder { + id, + name: input.name, + parent_id: input.parent_id, + tag_ids, + created_at: now.clone(), + updated_at: now, + }) + } + + pub fn update_folder(&self, id: &str, input: FolderInput) -> Result { + let conn = self.conn.lock().map_err(|e| e.to_string())?; + let now = Self::now(); + conn.execute( + "UPDATE folders SET name = ?1, parent_id = ?2, updated_at = ?3 WHERE id = ?4", + params![input.name, input.parent_id, now, id], + ) + .map_err(|e| e.to_string())?; + // Replace all tags: clear existing, insert new + conn.execute("DELETE FROM folder_tags WHERE folder_id = ?1", params![id]) + .map_err(|e| e.to_string())?; + let tag_ids = input.tag_ids.unwrap_or_default(); + for tag_id in &tag_ids { + conn.execute( + "INSERT OR IGNORE INTO folder_tags (folder_id, tag_id) VALUES (?1, ?2)", + params![id, tag_id], + ) + .map_err(|e| e.to_string())?; + } + Ok(Folder { + id: id.to_string(), + name: input.name, + parent_id: input.parent_id, + tag_ids, + created_at: now.clone(), + updated_at: now, + }) + } + + pub fn delete_folder(&self, id: &str) -> Result<(), String> { + let conn = self.conn.lock().map_err(|e| e.to_string())?; + // Get the folder's parent_id to reparent children + let parent_id: Option = conn + .query_row( + "SELECT parent_id FROM folders WHERE id = ?1", + params![id], + |row| row.get(0), + ) + .map_err(|e| e.to_string())?; + // Move child folders to the parent + conn.execute( + "UPDATE folders SET parent_id = ?1 WHERE parent_id = ?2", + params![parent_id, id], + ) + .map_err(|e| e.to_string())?; + // Move child connections to the parent + conn.execute( + "UPDATE connections SET folder_id = ?1 WHERE folder_id = ?2", + params![parent_id, id], + ) + .map_err(|e| e.to_string())?; + // Delete the folder + conn.execute("DELETE FROM folders WHERE id = ?1", params![id]) + .map_err(|e| e.to_string())?; + Ok(()) + } + + pub fn add_folder_tags(&self, folder_id: &str, tag_ids: &[String]) -> Result<(), String> { + let conn = self.conn.lock().map_err(|e| e.to_string())?; + for tag_id in tag_ids { + conn.execute( + "INSERT OR IGNORE INTO folder_tags (folder_id, tag_id) VALUES (?1, ?2)", + params![folder_id, tag_id], + ) + .map_err(|e| e.to_string())?; + } + Ok(()) + } + + pub fn add_connection_tags(&self, conn_id: &str, tag_ids: &[String]) -> Result<(), String> { + let conn = self.conn.lock().map_err(|e| e.to_string())?; + for tag_id in tag_ids { + conn.execute( + "INSERT OR IGNORE INTO connection_tags (connection_id, tag_id) VALUES (?1, ?2)", + params![conn_id, tag_id], + ) + .map_err(|e| e.to_string())?; + } + Ok(()) + } + + pub fn get_tags(&self) -> Result, String> { + let conn = self.conn.lock().map_err(|e| e.to_string())?; + let mut stmt = conn + .prepare("SELECT id, name, color, created_at FROM tags ORDER BY name") + .map_err(|e| e.to_string())?; + let rows = stmt + .query_map([], |row| { + Ok(Tag { + id: row.get(0)?, + name: row.get(1)?, + color: row.get(2)?, + created_at: row.get(3)?, + }) + }) + .map_err(|e| e.to_string())?; + Ok(rows.filter_map(|r| r.ok()).collect()) + } + + pub fn create_tag(&self, input: TagInput) -> Result { + let conn = self.conn.lock().map_err(|e| e.to_string())?; + let id = uuid::Uuid::new_v4().to_string(); + let now = Self::now(); + conn.execute( + "INSERT INTO tags (id, name, color, created_at) VALUES (?1, ?2, ?3, ?4)", + params![id, input.name, input.color, now], + ) + .map_err(|e| e.to_string())?; + Ok(Tag { + id, + name: input.name, + color: input.color, + created_at: now, + }) + } + + pub fn delete_tag(&self, id: &str) -> Result<(), String> { + let conn = self.conn.lock().map_err(|e| e.to_string())?; + conn.execute("DELETE FROM tags WHERE id = ?1", params![id]) + .map_err(|e| e.to_string())?; + Ok(()) + } + + pub fn update_tag(&self, id: &str, input: TagInput) -> Result { + let conn = self.conn.lock().map_err(|e| e.to_string())?; + let now = Self::now(); + conn.execute( + "UPDATE tags SET name = ?1, color = ?2 WHERE id = ?3", + params![input.name, input.color, id], + ) + .map_err(|e| e.to_string())?; + Ok(Tag { + id: id.to_string(), + name: input.name, + color: input.color, + created_at: now, + }) + } + + pub fn get_connections(&self) -> Result, String> { + let conn = self.conn.lock().map_err(|e| e.to_string())?; + let mut stmt = conn + .prepare( + "SELECT id, name, db_type, host, port, username, database, folder_id, keychain_ref, ssh_host, ssh_port, ssh_user, ssh_auth_method, ssh_private_key_path, ssl_mode, ssl_ca_path, ssl_cert_path, ssl_key_path, environment, created_at, updated_at FROM connections ORDER BY name", + ) + .map_err(|e| e.to_string())?; + let rows = stmt + .query_map([], |row| { + Ok(Connection { + id: row.get(0)?, + name: row.get(1)?, + db_type: row.get(2)?, + host: row.get(3)?, + port: row.get(4)?, + username: row.get(5)?, + database: row.get(6)?, + folder_id: row.get(7)?, + keychain_ref: row.get(8)?, + ssh_host: row.get(9)?, + ssh_port: row.get(10)?, + ssh_user: row.get(11)?, + ssh_auth_method: row.get(12)?, + ssh_private_key_path: row.get(13)?, + ssl_mode: row.get(14)?, + ssl_ca_path: row.get(15)?, + ssl_cert_path: row.get(16)?, + ssl_key_path: row.get(17)?, + environment: row.get(18)?, + tag_ids: vec![], + created_at: row.get(19)?, + updated_at: row.get(20)?, + }) + }) + .map_err(|e| e.to_string())?; + let mut conns: Vec = rows.filter_map(|r| r.ok()).collect(); + // Load tags for each connection + for c in conns.iter_mut() { + let mut tag_stmt = conn + .prepare("SELECT tag_id FROM connection_tags WHERE connection_id = ?1") + .map_err(|e| e.to_string())?; + let tag_rows = tag_stmt + .query_map(params![c.id], |row| row.get::<_, String>(0)) + .map_err(|e| e.to_string())?; + c.tag_ids = tag_rows.filter_map(|r| r.ok()).collect(); + } + Ok(conns) + } + + pub fn create_connection(&self, input: ConnectionInput) -> Result { + let conn = self.conn.lock().map_err(|e| e.to_string())?; + let id = uuid::Uuid::new_v4().to_string(); + let now = Self::now(); + conn.execute( + "INSERT INTO connections (id, name, db_type, host, port, username, database, folder_id, keychain_ref, ssh_host, ssh_port, ssh_user, ssh_auth_method, ssh_private_key_path, ssl_mode, ssl_ca_path, ssl_cert_path, ssl_key_path, environment, created_at, updated_at) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, NULL, ?9, ?10, ?11, ?12, ?13, ?14, ?15, ?16, ?17, ?18, ?19, ?20)", + params![id, input.name, input.db_type, input.host, input.port, input.username, input.database, input.folder_id, input.ssh_host, input.ssh_port, input.ssh_user, input.ssh_auth_method, input.ssh_private_key_path, input.ssl_mode, input.ssl_ca_path, input.ssl_cert_path, input.ssl_key_path, input.environment, now, now], + ) + .map_err(|e| e.to_string())?; + for tag_id in &input.tag_ids { + conn.execute( + "INSERT OR IGNORE INTO connection_tags (connection_id, tag_id) VALUES (?1, ?2)", + params![id, tag_id], + ) + .map_err(|e| e.to_string())?; + } + Ok(Connection { + id, + name: input.name, + db_type: input.db_type, + host: input.host, + port: input.port, + username: input.username, + folder_id: input.folder_id, + database: input.database, + keychain_ref: None, + environment: input.environment, + ssh_host: input.ssh_host, + ssh_port: input.ssh_port, + ssh_user: input.ssh_user, + ssh_auth_method: input.ssh_auth_method, + ssh_private_key_path: input.ssh_private_key_path, + ssl_mode: input.ssl_mode, + ssl_ca_path: input.ssl_ca_path, + ssl_cert_path: input.ssl_cert_path, + ssl_key_path: input.ssl_key_path, + tag_ids: input.tag_ids, + created_at: now.clone(), + updated_at: now, + }) + } + + pub fn delete_connection(&self, id: &str) -> Result<(), String> { + let conn = self.conn.lock().map_err(|e| e.to_string())?; + conn.execute("DELETE FROM connections WHERE id = ?1", params![id]) + .map_err(|e| e.to_string())?; + Ok(()) + } + + pub fn update_connection(&self, id: &str, input: ConnectionInput) -> Result { + let conn = self.conn.lock().map_err(|e| e.to_string())?; + let now = Self::now(); + conn.execute( + "UPDATE connections SET name=?1, db_type=?2, host=?3, port=?4, username=?5, database=?6, folder_id=?7, ssh_host=?8, ssh_port=?9, ssh_user=?10, ssh_auth_method=?11, ssh_private_key_path=?12, ssl_mode=?13, ssl_ca_path=?14, ssl_cert_path=?15, ssl_key_path=?16, environment=?17, updated_at=?18 WHERE id=?19", + params![ + input.name, input.db_type, input.host, input.port, input.username, + input.database, input.folder_id, input.ssh_host, input.ssh_port, + input.ssh_user, input.ssh_auth_method, input.ssh_private_key_path, + input.ssl_mode, input.ssl_ca_path, input.ssl_cert_path, input.ssl_key_path, + input.environment, now, id + ], + ).map_err(|e| e.to_string())?; + // Update tags + conn.execute("DELETE FROM connection_tags WHERE connection_id = ?1", params![id]) + .map_err(|e| e.to_string())?; + for tag_id in &input.tag_ids { + conn.execute( + "INSERT OR IGNORE INTO connection_tags (connection_id, tag_id) VALUES (?1, ?2)", + params![id, tag_id], + ).map_err(|e| e.to_string())?; + } + Ok(Connection { + id: id.to_string(), + name: input.name, + db_type: input.db_type, + host: input.host, + port: input.port, + username: input.username, + database: input.database, + folder_id: input.folder_id, + keychain_ref: None, + environment: input.environment, + ssh_host: input.ssh_host, + ssh_port: input.ssh_port, + ssh_user: input.ssh_user, + ssh_auth_method: input.ssh_auth_method, + ssh_private_key_path: input.ssh_private_key_path, + ssl_mode: input.ssl_mode, + ssl_ca_path: input.ssl_ca_path, + ssl_cert_path: input.ssl_cert_path, + ssl_key_path: input.ssl_key_path, + tag_ids: input.tag_ids.clone(), + created_at: String::new(), // not updated + updated_at: now, + }) + } + + pub fn get_settings(&self) -> Result { + let conn = self.conn.lock().map_err(|e| e.to_string())?; + let mut map: HashMap = HashMap::new(); + let mut stmt = conn + .prepare("SELECT key, value FROM settings") + .map_err(|e| e.to_string())?; + let rows = stmt + .query_map([], |row| { + Ok(( + row.get::<_, String>(0)?, + row.get::<_, String>(1)?, + )) + }) + .map_err(|e| e.to_string())?; + for r in rows.filter_map(|r| r.ok()) { + map.insert(r.0, r.1); + } + let theme = map + .get("theme") + .cloned() + .unwrap_or_else(|| "system".to_string()); + let font_size = map + .get("font_size") + .cloned() + .unwrap_or_else(|| "medium".to_string()); + let confirm = map + .get("confirm_before_delete") + .map(|v| v == "true") + .unwrap_or(true); + let default_folder_id = map + .get("default_folder_id") + .filter(|v| v.as_str() != "null") + .cloned(); + let mut default_ports = HashMap::new(); + default_ports.insert("postgresql".to_string(), Some(5432i64)); + default_ports.insert("mysql".to_string(), Some(3306i64)); + default_ports.insert("redis".to_string(), Some(6379i64)); + default_ports.insert("sqlite".to_string(), None); + if let Some(ports_json) = map.get("default_ports") { + if let Ok(parsed) = + serde_json::from_str::>>(ports_json) + { + default_ports = parsed; + } + } + Ok(Settings { + confirm_before_delete: confirm, + default_folder_id, + theme, + font_size, + default_ports, + tag_order: map.get("tag_order").cloned(), + table_refresh_rate: map + .get("table_refresh_rate") + .and_then(|v| v.parse().ok()) + .unwrap_or(0), + table_page_size: map + .get("table_page_size") + .and_then(|v| v.parse().ok()) + .unwrap_or(50), + shortcuts: map + .get("shortcuts") + .and_then(|v| serde_json::from_str(v).ok()) + .unwrap_or_default(), + }) + } + + pub fn update_setting(&self, key: &str, value: &str) -> Result<(), String> { + let conn = self.conn.lock().map_err(|e| e.to_string())?; + conn.execute( + "INSERT INTO settings (key, value) VALUES (?1, ?2) ON CONFLICT(key) DO UPDATE SET value = excluded.value", + params![key, value], + ) + .map_err(|e| e.to_string())?; + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::models::{ConnectionInput, FolderInput, TagInput}; + + fn fresh_store() -> Store { + let conn = rusqlite::Connection::open_in_memory().unwrap(); + crate::store::migrations::run_migrations(&conn).unwrap(); + Store::from_connection(conn) + } + + #[test] + fn create_and_get_folder() { + let store = fresh_store(); + let folder = store + .create_folder(FolderInput { tag_ids: None, + name: "Work".into(), + parent_id: None, + }) + .unwrap(); + let got = store.get_folders().unwrap(); + assert_eq!(got.len(), 1); + assert_eq!(got[0].name, "Work"); + assert_eq!(got[0].id, folder.id); + assert!(got[0].parent_id.is_none()); + } + + #[test] + fn create_nested_folders() { + let store = fresh_store(); + let parent = store + .create_folder(FolderInput { tag_ids: None, + name: "root".into(), + parent_id: None, + }) + .unwrap(); + let child = store + .create_folder(FolderInput { tag_ids: None, + name: "child".into(), + parent_id: Some(parent.id.clone()), + }) + .unwrap(); + assert_eq!(child.parent_id, Some(parent.id)); + } + + #[test] + fn create_and_get_tag() { + let store = fresh_store(); + let tag = store + .create_tag(TagInput { + name: "production".into(), + color: "#ef4444".into(), + }) + .unwrap(); + let got = store.get_tags().unwrap(); + assert_eq!(got.len(), 1); + assert_eq!(got[0].name, "production"); + assert_eq!(got[0].color, "#ef4444"); + assert_eq!(got[0].id, tag.id); + } + + #[test] + fn create_and_get_connection() { + let store = fresh_store(); + let conn = store + .create_connection(ConnectionInput { + name: "Prod".into(), + db_type: "postgresql".into(), + host: "prod.example.com".into(), + port: Some(5432), + username: Some("admin".into()), + folder_id: None, + password: None, + database: None, + ssh_host: None, + ssh_port: None, + ssh_user: None, + ssh_auth_method: None, + ssh_private_key_path: None, + ssh_passphrase: None, + ssl_mode: None, + ssl_ca_path: None, + ssl_cert_path: None, + ssl_key_path: None, + environment: None, + tag_ids: vec![], + }) + .unwrap(); + let got = store.get_connections().unwrap(); + assert_eq!(got.len(), 1); + assert_eq!(got[0].name, "Prod"); + assert_eq!(got[0].port, Some(5432)); + assert!(got[0].tag_ids.is_empty()); + assert_eq!(got[0].id, conn.id); + } + + #[test] + fn connection_with_tags_persists_join() { + let store = fresh_store(); + let t1 = store + .create_tag(TagInput { + name: "prod".into(), + color: "#ef4444".into(), + }) + .unwrap(); + let t2 = store + .create_tag(TagInput { + name: "primary".into(), + color: "#3b82f6".into(), + }) + .unwrap(); + store + .create_connection(ConnectionInput { + name: "Prod".into(), + db_type: "postgresql".into(), + host: "h".into(), + port: Some(5432), + username: None, + folder_id: None, + password: None, + database: None, + ssh_host: None, + ssh_port: None, + ssh_user: None, + ssh_auth_method: None, + ssh_private_key_path: None, + ssh_passphrase: None, + ssl_mode: None, + ssl_ca_path: None, + ssl_cert_path: None, + ssl_key_path: None, + environment: None, + tag_ids: vec![t1.id.clone(), t2.id.clone()], + }) + .unwrap(); + let got = store.get_connections().unwrap(); + assert_eq!(got[0].tag_ids.len(), 2); + assert!(got[0].tag_ids.contains(&t1.id)); + assert!(got[0].tag_ids.contains(&t2.id)); + } + + #[test] + fn delete_folder_sets_connection_folder_null() { + let store = fresh_store(); + let folder = store + .create_folder(FolderInput { tag_ids: None, + name: "f".into(), + parent_id: None, + }) + .unwrap(); + store + .create_connection(ConnectionInput { + name: "C".into(), + db_type: "postgresql".into(), + host: "h".into(), + port: Some(5432), + username: None, + folder_id: Some(folder.id.clone()), + password: None, + database: None, + ssh_host: None, + ssh_port: None, + ssh_user: None, + ssh_auth_method: None, + ssh_private_key_path: None, + ssh_passphrase: None, + ssl_mode: None, + ssl_ca_path: None, + ssl_cert_path: None, + ssl_key_path: None, + environment: None, + tag_ids: vec![], + }) + .unwrap(); + store.delete_folder(&folder.id).unwrap(); + let conns = store.get_connections().unwrap(); + assert!(conns[0].folder_id.is_none()); + } + + #[test] + fn delete_tag_removes_from_connection() { + let store = fresh_store(); + let tag = store + .create_tag(TagInput { + name: "prod".into(), + color: "#ef4444".into(), + }) + .unwrap(); + store + .create_connection(ConnectionInput { + name: "C".into(), + db_type: "postgresql".into(), + host: "h".into(), + port: Some(5432), + username: None, + folder_id: None, + password: None, + database: None, + ssh_host: None, + ssh_port: None, + ssh_user: None, + ssh_auth_method: None, + ssh_private_key_path: None, + ssh_passphrase: None, + ssl_mode: None, + ssl_ca_path: None, + ssl_cert_path: None, + ssl_key_path: None, + environment: None, + tag_ids: vec![tag.id.clone()], + }) + .unwrap(); + store.delete_tag(&tag.id).unwrap(); + let conns = store.get_connections().unwrap(); + assert!(conns[0].tag_ids.is_empty()); + } + + #[test] + fn settings_get_returns_defaults_when_empty() { + let store = fresh_store(); + let settings = store.get_settings().unwrap(); + assert_eq!(settings.theme, "system"); + assert_eq!(settings.font_size, "medium"); + assert!(settings.confirm_before_delete); + assert_eq!( + settings.default_ports.get("postgresql"), + Some(&Some(5432)) + ); + } + + #[test] + fn settings_update_persists() { + let store = fresh_store(); + store.update_setting("theme", "light").unwrap(); + let settings = store.get_settings().unwrap(); + assert_eq!(settings.theme, "light"); + } + + #[test] + fn ssh_ssl_fields_persist_and_retrieve() { + let store = fresh_store(); + let conn = store + .create_connection(ConnectionInput { + name: "SSH-Tunnel-DB".into(), + db_type: "postgresql".into(), + host: "localhost".into(), + port: Some(5432), + username: Some("dbuser".into()), + folder_id: None, + password: None, + database: Some("analytics".into()), + ssh_host: Some("jumphost.example.com".into()), + ssh_port: Some(2222), + ssh_user: Some("tunneluser".into()), + ssh_auth_method: Some("Key".into()), + ssh_private_key_path: Some("/home/user/.ssh/id_rsa".into()), + ssh_passphrase: None, + ssl_mode: Some("verify-full".into()), + ssl_ca_path: Some("/etc/ssl/certs/ca.pem".into()), + ssl_cert_path: Some("/etc/ssl/certs/client-cert.pem".into()), + ssl_key_path: Some("/etc/ssl/private/client-key.pem".into()), + environment: None, + tag_ids: vec![], + }) + .unwrap(); + let got = store.get_connections().unwrap(); + assert_eq!(got.len(), 1); + assert_eq!(got[0].database.as_deref(), Some("analytics")); + assert_eq!(got[0].ssh_host.as_deref(), Some("jumphost.example.com")); + assert_eq!(got[0].ssh_port, Some(2222)); + assert_eq!(got[0].ssh_user.as_deref(), Some("tunneluser")); + assert_eq!(got[0].ssh_auth_method.as_deref(), Some("Key")); + assert_eq!( + got[0].ssh_private_key_path.as_deref(), + Some("/home/user/.ssh/id_rsa") + ); + assert_eq!(got[0].ssl_mode.as_deref(), Some("verify-full")); + assert_eq!( + got[0].ssl_ca_path.as_deref(), + Some("/etc/ssl/certs/ca.pem") + ); + assert_eq!( + got[0].ssl_cert_path.as_deref(), + Some("/etc/ssl/certs/client-cert.pem") + ); + assert_eq!( + got[0].ssl_key_path.as_deref(), + Some("/etc/ssl/private/client-key.pem") + ); + } +} \ No newline at end of file diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 7aaa188..a0fae33 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -14,7 +14,9 @@ { "title": "Gridline", "width": 1200, - "height": 800 + "height": 800, + "backgroundColor": "#0A0A0B", + "titleBarStyle": "Transparent" } ], "security": { @@ -31,5 +33,6 @@ "icons/icon.icns", "icons/icon.ico" ] - } + }, + "plugins": {} } diff --git a/src/App.css b/src/App.css deleted file mode 100644 index 85f7a4a..0000000 --- a/src/App.css +++ /dev/null @@ -1,116 +0,0 @@ -.logo.vite:hover { - filter: drop-shadow(0 0 2em #747bff); -} - -.logo.react:hover { - filter: drop-shadow(0 0 2em #61dafb); -} -:root { - font-family: Inter, Avenir, Helvetica, Arial, sans-serif; - font-size: 16px; - line-height: 24px; - font-weight: 400; - - color: #0f0f0f; - background-color: #f6f6f6; - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -webkit-text-size-adjust: 100%; -} - -.container { - margin: 0; - padding-top: 10vh; - display: flex; - flex-direction: column; - justify-content: center; - text-align: center; -} - -.logo { - height: 6em; - padding: 1.5em; - will-change: filter; - transition: 0.75s; -} - -.logo.tauri:hover { - filter: drop-shadow(0 0 2em #24c8db); -} - -.row { - display: flex; - justify-content: center; -} - -a { - font-weight: 500; - color: #646cff; - text-decoration: inherit; -} - -a:hover { - color: #535bf2; -} - -h1 { - text-align: center; -} - -input, -button { - border-radius: 8px; - border: 1px solid transparent; - padding: 0.6em 1.2em; - font-size: 1em; - font-weight: 500; - font-family: inherit; - color: #0f0f0f; - background-color: #ffffff; - transition: border-color 0.25s; - box-shadow: 0 2px 2px rgba(0, 0, 0, 0.2); -} - -button { - cursor: pointer; -} - -button:hover { - border-color: #396cd8; -} -button:active { - border-color: #396cd8; - background-color: #e8e8e8; -} - -input, -button { - outline: none; -} - -#greet-input { - margin-right: 5px; -} - -@media (prefers-color-scheme: dark) { - :root { - color: #f6f6f6; - background-color: #2f2f2f; - } - - a:hover { - color: #24c8db; - } - - input, - button { - color: #ffffff; - background-color: #0f0f0f98; - } - button:active { - background-color: #0f0f0f69; - } -} diff --git a/src/App.test.tsx b/src/App.test.tsx new file mode 100644 index 0000000..2257c2a --- /dev/null +++ b/src/App.test.tsx @@ -0,0 +1,71 @@ +import { describe, it, expect, vi, beforeEach } from "vitest"; +import { render, screen } from "@testing-library/react"; +import App from "./App"; +import { useConnectionStore } from "./stores/connectionStore"; +import { useSettingsStore } from "./stores/settingsStore"; +import { useUiStore } from "./stores/uiStore"; + +vi.mock("./lib/commands", () => ({ + getConnections: vi.fn().mockResolvedValue([]), + getFolders: vi.fn().mockResolvedValue([]), + getTags: vi.fn().mockResolvedValue([]), + getSettings: vi.fn().mockResolvedValue({ + confirm_before_delete: true, + default_folder_id: null, + theme: "dark", + font_size: "medium", + default_ports: { postgresql: 5432, mysql: 3306, redis: 6379, sqlite: null }, + }), + testConnection: vi.fn().mockResolvedValue({ ok: true }), +})); + +beforeEach(() => { + useConnectionStore.setState({ + connections: [], + folders: [], + tags: [], + loading: false, + error: null, + }); + useSettingsStore.setState({ settings: null, loading: false, error: null }); + useUiStore.setState({ activeView: "home" }); + vi.clearAllMocks(); +}); + +describe("App", () => { + it("renders home view on mount", async () => { + render(); + expect(await screen.findByPlaceholderText(/search connections/i)).toBeInTheDocument(); + }); + + it("shows empty state when no connections", async () => { + render(); + expect(await screen.findByText(/no connections/i)).toBeInTheDocument(); + }); + + it("loads data on mount", async () => { + render(); + await screen.findByPlaceholderText(/search connections/i); + expect(useConnectionStore.getState().loading).toBe(false); + }); + + it("renders settings page when activeView is settings", async () => { + useUiStore.setState({ activeView: "settings" }); + render(); + expect(screen.getByText("Settings")).toBeInTheDocument(); + }); + + it("renders new connection form when activeView is new-connection", async () => { + useUiStore.setState({ activeView: "new-connection" }); + render(); + expect(await screen.findByText("Save Connection")).toBeInTheDocument(); + }); + + it("shows error banner when connectionStore has error", async () => { + const { getConnections } = await import("./lib/commands"); + vi.mocked(getConnections).mockRejectedValueOnce(new Error("Storage error")); + useConnectionStore.setState({ connections: [], loading: false, error: null }); + render(); + expect(await screen.findByText(/storage error/i)).toBeInTheDocument(); + }); +}); \ No newline at end of file diff --git a/src/App.tsx b/src/App.tsx index 8286a76..5caa66a 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,51 +1,93 @@ -import { useState } from "react"; -import reactLogo from "./assets/react.svg"; -import { invoke } from "@tauri-apps/api/core"; -import "./App.css"; +import { useEffect } from "react"; +import { useConnectionStore } from "./stores/connectionStore"; +import { useSettingsStore } from "./stores/settingsStore"; +import { useUiStore } from "./stores/uiStore"; +import { HomeScreen } from "./components/layout/HomeScreen"; +import { SettingsPage } from "./components/settings/SettingsPage"; +import { NewConnectionScreen } from "./components/connections/NewConnectionScreen"; +import { ErrorBanner } from "./components/ui/ErrorBanner"; +import { ToastContainer } from "./components/ui/Toast"; +import { DbViewerScreen } from "./components/db-viewer/DbViewerScreen"; +import { getCurrentWindow } from "@tauri-apps/api/window"; -function App() { - const [greetMsg, setGreetMsg] = useState(""); - const [name, setName] = useState(""); +const VIEW_TITLES: Record = { + home: "Gridline", + settings: "Settings", + "new-connection": "New Connection", + "db-viewer": "", +}; - async function greet() { - // Learn more about Tauri commands at https://tauri.app/develop/calling-rust/ - setGreetMsg(await invoke("greet", { name })); - } +export default function App() { + const activeView = useUiStore((s) => s.activeView); + const setActiveView = useUiStore((s) => s.setActiveView); + const loadConnections = useConnectionStore((s) => s.loadAll); + const loadSettings = useSettingsStore((s) => s.load); + const connectionError = useConnectionStore((s) => s.error); + const activeFolderId = useUiStore((s) => s.activeFolderId); + const folders = useConnectionStore((s) => s.folders); + const tags = useConnectionStore((s) => s.tags); + const prefilledConnectionString = useUiStore((s) => s.prefilledConnectionString); + const clearPrefilledConnectionString = useUiStore((s) => s.clearPrefilledConnectionString); - return ( -

-

Welcome to Tauri + React

+ useEffect(() => { + loadConnections(); + loadSettings(); + }, [loadConnections, loadSettings]); -
-

Click on the Tauri, Vite, and React logos to learn more.

+ useEffect(() => { + let title = VIEW_TITLES[activeView] ?? "Gridline"; + if (activeView === "db-viewer") { + const conn = useConnectionStore.getState().connections.find( + (c) => c.id === useUiStore.getState().activeConnectionId + ); + if (conn) title = conn.name; + } + document.title = title; + try { + getCurrentWindow().setTitle(title).catch(() => { + // Ignore environments where the Tauri API is unavailable (tests, browser) + }); + } catch { + // getCurrentWindow can throw outside of a Tauri runtime + } + }, [activeView]); -
{ - e.preventDefault(); - greet(); - }} - > - setName(e.currentTarget.value)} - placeholder="Enter a name..." - /> - - -

{greetMsg}

-
- ); + return ( +
+ {connectionError && ( +
+ +
+ )} + {activeView === "settings" && } + {activeView === "new-connection" && ( + { + clearPrefilledConnectionString(); + setActiveView("home"); + }} + onCancel={() => { + clearPrefilledConnectionString(); + setActiveView("home"); + }} + /> + )} + {activeView === "home" && } + {activeView === "db-viewer" && ( + setActiveView("home")} + onSettings={() => setActiveView("settings")} + /> + )} + +
+ ); } - -export default App; diff --git a/src/assets/react.svg b/src/assets/react.svg deleted file mode 100644 index 6c87de9..0000000 --- a/src/assets/react.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/components/connections/ConnectionCard.test.tsx b/src/components/connections/ConnectionCard.test.tsx new file mode 100644 index 0000000..7f2d533 --- /dev/null +++ b/src/components/connections/ConnectionCard.test.tsx @@ -0,0 +1,68 @@ +import { describe, it, expect, vi, beforeEach } from "vitest"; +import { render, screen } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import { ConnectionCard } from "./ConnectionCard"; +import type { Connection, Tag } from "../../lib/types"; +import { useUiStore } from "../../stores/uiStore"; + +const tags: Tag[] = [ + { id: "t1", name: "production", color: "#ef4444", created_at: "" }, + { id: "t2", name: "primary", color: "#3b82f6", created_at: "" }, +]; +const conn: Connection = { + id: "c1", name: "Prod DB", db_type: "postgresql", host: "prod.example.com", + port: 5432, username: null, folder_id: null, keychain_ref: null, + tag_ids: ["t1", "t2"], created_at: "", updated_at: "", +}; + +describe("ConnectionCard", () => { + beforeEach(() => { + useUiStore.setState({ selectedItemIds: [] }); + }); + + it("renders name and host", () => { + render(); + expect(screen.getByText("Prod DB")).toBeInTheDocument(); + expect(screen.getByText("prod.example.com:5432")).toBeInTheDocument(); + }); + it("renders db type label", () => { + render(); + expect(screen.getByText(/postgresql/i)).toBeInTheDocument(); + }); + it("renders tag badges", () => { + render(); + expect(screen.getByText("production")).toBeInTheDocument(); + expect(screen.getByText("primary")).toBeInTheDocument(); + }); + it("omits port for sqlite", () => { + const sqlite = { ...conn, db_type: "sqlite" as const, host: "/data/x.db", port: null }; + render(); + expect(screen.getByText("/data/x.db")).toBeInTheDocument(); + expect(screen.queryByText(/:5432/)).not.toBeInTheDocument(); + }); + it("fires onTagToggle when a tag badge is clicked", async () => { + const user = userEvent.setup(); + const fn = vi.fn(); + render(); + await user.click(screen.getByText("production")); + expect(fn).toHaveBeenCalledWith("t1"); + }); + it("opens DbViewer on single click when nothing is selected", async () => { + const user = userEvent.setup(); + const fn = vi.fn(); + render(); + await user.click(screen.getByText("Prod DB")); + expect(fn).toHaveBeenCalledWith(conn.id); + }); + + it("toggles selection on single click when something is already selected", async () => { + const user = userEvent.setup(); + useUiStore.setState({ selectedItemIds: ["other-id"] }); + const fn = vi.fn(); + render(); + await user.click(screen.getByText("Prod DB")); + // Should NOT open — should toggle selection instead + expect(fn).not.toHaveBeenCalled(); + expect(useUiStore.getState().selectedItemIds).toContain(conn.id); + }); +}); \ No newline at end of file diff --git a/src/components/connections/ConnectionCard.tsx b/src/components/connections/ConnectionCard.tsx new file mode 100644 index 0000000..d309ca0 --- /dev/null +++ b/src/components/connections/ConnectionCard.tsx @@ -0,0 +1,100 @@ +import { memo } from "react"; +import type { Connection, Tag } from "../../lib/types"; +import { DB_ICONS, DB_LABELS } from "../../lib/dbIcons"; +import { ENV_LABELS, ENV_COLORS } from "../../lib/environment"; +import { TagBadge } from "../tags/TagBadge"; +import { Check } from "lucide-react"; +import { useUiStore } from "../../stores/uiStore"; + +interface ConnectionCardProps { + connection: Connection; + tags: Tag[]; + onTagToggle?: (id: string) => void; + onOpenDbViewer?: (connectionId: string) => void; +} + +function ConnectionCardBase({ + connection, + tags, + onTagToggle, + onOpenDbViewer, +}: ConnectionCardProps) { + const selectedItemIds = useUiStore((s) => s.selectedItemIds); + const toggleItemSelection = useUiStore((s) => s.toggleItemSelection); + const tagMap = new Map(tags.map((t) => [t.id, t])); + const cardTags = connection.tag_ids + .map((id) => tagMap.get(id)) + .filter(Boolean) as Tag[]; + const hostLabel = connection.port + ? `${connection.host}:${connection.port}` + : connection.host; + const isSelected = selectedItemIds.includes(connection.id); + + const handleClick = () => { + if (selectedItemIds.length > 0) { + // Something already selected — toggle this item in the selection + toggleItemSelection(connection.id); + } else { + // Nothing selected — open the connection + onOpenDbViewer?.(connection.id); + } + }; + + return ( +
+
+
+
+ {DB_ICONS[connection.db_type] ?? "❓"} +
+
+
+ {connection.name} +
+
+ {DB_LABELS[connection.db_type] ?? + connection.db_type} +
+
+ {connection.environment && ( + + {ENV_LABELS[connection.environment] ?? connection.environment} + + )} +
+
+ {hostLabel} +
+
+ {cardTags.map((t) => ( + + ))} +
+
+ +
+ ); +} + +export const ConnectionCard = memo(ConnectionCardBase); diff --git a/src/components/connections/ConnectionFormShell.tsx b/src/components/connections/ConnectionFormShell.tsx new file mode 100644 index 0000000..44e8d03 --- /dev/null +++ b/src/components/connections/ConnectionFormShell.tsx @@ -0,0 +1,70 @@ +import { ChevronLeft } from "lucide-react"; +import { Button } from "../ui/Button"; +import type { NewConnectionMode } from "../../lib/types"; +import type { ReactNode } from "react"; + +interface ConnectionFormShellProps { + mode: NewConnectionMode; + onBack: () => void; + onTest: () => void; + onSave: () => void; + onToggleMode: () => void; + testLoading?: boolean; + saveLoading?: boolean; + children: ReactNode; +} + +export function ConnectionFormShell({ + mode, + onBack, + onTest, + onSave, + onToggleMode, + testLoading, + saveLoading, + children, +}: ConnectionFormShellProps) { + return ( +
+
+ + +
{children}
+ +
+ + +
+ + +
+
+ ); +} diff --git a/src/components/connections/ConnectionGrid.test.tsx b/src/components/connections/ConnectionGrid.test.tsx new file mode 100644 index 0000000..7d039e7 --- /dev/null +++ b/src/components/connections/ConnectionGrid.test.tsx @@ -0,0 +1,69 @@ +import { describe, it, expect, vi } from "vitest"; +import { render, screen } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import { ConnectionGrid } from "./ConnectionGrid"; +import type { Connection, Folder } from "../../lib/types"; + +const makeConn = (id: string, folder_id: string | null = null): Connection => ({ + id, name: `Conn ${id}`, db_type: "postgresql", host: "h", port: 5432, + username: null, folder_id, keychain_ref: null, tag_ids: [], + created_at: "", updated_at: "", +}); + +const folders: Folder[] = [ + { id: "f1", name: "Work", parent_id: null, tag_ids: [], created_at: "", updated_at: "" }, + { id: "f2", name: "Personal", parent_id: null, tag_ids: [], created_at: "", updated_at: "" }, + { id: "f3", name: "Client A", parent_id: "f1", tag_ids: [], created_at: "", updated_at: "" }, +]; + +describe("ConnectionGrid", () => { + it("renders empty state when no connections and no folders", () => { + render(); + expect(screen.getByText(/no connections yet/i)).toBeInTheDocument(); + }); + + it("renders cards for each connection", () => { + const conns = [makeConn("1"), makeConn("2")]; + render(); + expect(screen.getByText("Conn 1")).toBeInTheDocument(); + expect(screen.getByText("Conn 2")).toBeInTheDocument(); + }); + + it("renders no-results state when filtered empty", () => { + render(); + expect(screen.getByText(/no connections match/i)).toBeInTheDocument(); + }); + + it("renders only top-level folders at root", () => { + render(); + expect(screen.getByText("Work")).toBeInTheDocument(); + expect(screen.getByText("Personal")).toBeInTheDocument(); + expect(screen.queryByText("Client A")).not.toBeInTheDocument(); + }); + + it("renders only children of active folder", () => { + render(); + expect(screen.getByText("Client A")).toBeInTheDocument(); + expect(screen.queryByText("Personal")).not.toBeInTheDocument(); + }); + + it("calls onFolderSelect with folder id on click", async () => { + const fn = vi.fn(); + render(); + await userEvent.click(screen.getByText("Work")); + expect(fn).toHaveBeenCalledWith("f1"); + }); + + it("breadcrumb navigates to root", async () => { + const fn = vi.fn(); + render(); + await userEvent.click(screen.getByText(/all connections/i)); + expect(fn).toHaveBeenCalledWith(null); + }); + + it("shows folder cards", () => { + render(); + expect(screen.getByText("Work")).toBeInTheDocument(); + expect(screen.getByText("Personal")).toBeInTheDocument(); + }); +}); \ No newline at end of file diff --git a/src/components/connections/ConnectionGrid.tsx b/src/components/connections/ConnectionGrid.tsx new file mode 100644 index 0000000..48b586f --- /dev/null +++ b/src/components/connections/ConnectionGrid.tsx @@ -0,0 +1,202 @@ +import type { Connection, Folder, Tag } from "../../lib/types"; +import { Folder as FolderIcon, Check, Pencil, Trash2 } from "lucide-react"; +import { ConnectionCard } from "./ConnectionCard"; +import { FolderBreadcrumb } from "../folders/FolderBreadcrumb"; +import { getChildFolders } from "../../lib/utils"; +import { useUiStore } from "../../stores/uiStore"; +import { TagBadge } from "../tags/TagBadge"; + +interface ConnectionGridProps { + connections: Connection[]; + tags: Tag[]; + folders?: Folder[]; + activeFolderId?: string | null; + onFolderSelect?: (id: string | null) => void; + hasSearch?: boolean; + onTagToggle?: (id: string) => void; + onEditFolder?: (folder: Folder) => void; + onDeleteFolder?: (folder: Folder) => void; + onOpenDbViewer?: (connectionId: string) => void; +} + +export function ConnectionGrid({ + connections, + tags, + folders = [], + activeFolderId = null, + onFolderSelect, + hasSearch = false, + onTagToggle, + onEditFolder, + onDeleteFolder, + onOpenDbViewer, +}: ConnectionGridProps) { + const selectedItemIds = useUiStore((s) => s.selectedItemIds); + const toggleItemSelection = useUiStore((s) => s.toggleItemSelection); + const clearSelection = useUiStore((s) => s.clearSelection); + + const currentFolderId = + activeFolderId !== null && folders.some((f) => f.id === activeFolderId) + ? activeFolderId + : null; + const visibleFolders = hasSearch + ? [] + : getChildFolders(folders, currentFolderId); + const directConnections = connections.filter( + (c) => c.folder_id === currentFolderId, + ); + const hasItems = visibleFolders.length > 0 || directConnections.length > 0; + const isSelecting = selectedItemIds.length > 0; + const activeFolder = currentFolderId + ? (folders.find((f) => f.id === currentFolderId) ?? null) + : null; + + const handleFolderClick = (folderId: string) => { + if (isSelecting) { + toggleItemSelection(folderId); + } else { + onFolderSelect?.(folderId); + } + }; + + const handleBreadcrumbNavigate = (folderId: string | null) => { + clearSelection(); + onFolderSelect?.(folderId); + }; + + return ( +
+
+ + {activeFolder && ( +
+ + +
+ )} +
+ + {!hasItems ? ( +
+ {hasSearch + ? "No connections match your search." + : activeFolderId + ? "This folder is empty. Add a connection or subfolder." + : "No connections yet. Create one to get started."} +
+ ) : ( +
+ {visibleFolders.map((f) => { + const isSelected = selectedItemIds.includes(f.id); + const count = directConnections.filter( + (c) => c.folder_id === f.id, + ).length; + const subfolderCount = getChildFolders( + folders, + f.id, + ).length; + const tagMap = new Map(tags.map((t) => [t.id, t])); + const folderTags = f.tag_ids + .map((id) => tagMap.get(id)) + .filter(Boolean) as import("../../lib/types").Tag[]; + return ( +
+ + +
+ ); + })} + {directConnections.map((c) => ( + + ))} +
+ )} +
+ ); +} diff --git a/src/components/connections/ConnectionStringInput.tsx b/src/components/connections/ConnectionStringInput.tsx new file mode 100644 index 0000000..29a09c5 --- /dev/null +++ b/src/components/connections/ConnectionStringInput.tsx @@ -0,0 +1,24 @@ +import { forwardRef } from "react"; +import type { KeyboardEvent } from "react"; + +interface ConnectionStringInputProps { + value?: string; + placeholder?: string; + className?: string; + onChange?: (value: string) => void; + onKeyDown?: (e: KeyboardEvent) => void; +} + +export const ConnectionStringInput = forwardRef( + function ConnectionStringInput({ onChange, onKeyDown, className = "", ...rest }, ref) { + return ( + onChange?.(e.target.value)} + onKeyDown={(e) => onKeyDown?.(e)} + {...rest} + /> + ); + } +); \ No newline at end of file diff --git a/src/components/connections/DetailedConnectionForm.test.tsx b/src/components/connections/DetailedConnectionForm.test.tsx new file mode 100644 index 0000000..54ad892 --- /dev/null +++ b/src/components/connections/DetailedConnectionForm.test.tsx @@ -0,0 +1,54 @@ +import { describe, it, expect, vi } from "vitest"; +import { render, screen } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import { useState } from "react"; +import { DetailedConnectionForm } from "./DetailedConnectionForm"; + +import type { ConnectionFormData } from "./connectionFormData"; +import type { DetailedConnectionFormProps } from "./DetailedConnectionForm"; + +const BASE_FORM: ConnectionFormData = { + name: "", + environment: null, + folder_id: null, + tag_ids: [], + connection_string: "", + db_type: "postgresql", + host: "", + port: 5432, + username: null, + password: null, + database: null, + use_keychain: false, +}; + +function StatefulForm( + props: Omit & { + onChange?: (updates: Partial) => void; + }, +) { + const [form, setForm] = useState(BASE_FORM); + return ( + { + setForm((prev) => ({ ...prev, ...updates })); + props.onChange?.(updates); + }} + /> + ); +} + +describe("DetailedConnectionForm", () => { + it("updates host and port", async () => { + const user = userEvent.setup(); + const onChange = vi.fn(); + render(); + await user.type(screen.getByLabelText(/host/i), "localhost"); + await user.clear(screen.getByLabelText(/port/i)); + await user.type(screen.getByLabelText(/port/i), "5432"); + expect(onChange).toHaveBeenCalledWith(expect.objectContaining({ host: "localhost" })); + expect(onChange).toHaveBeenCalledWith(expect.objectContaining({ port: 5432 })); + }); +}); \ No newline at end of file diff --git a/src/components/connections/DetailedConnectionForm.tsx b/src/components/connections/DetailedConnectionForm.tsx new file mode 100644 index 0000000..6232e4a --- /dev/null +++ b/src/components/connections/DetailedConnectionForm.tsx @@ -0,0 +1,56 @@ +import { useState } from "react"; +import { GeneralTab } from "./GeneralTab"; +import { SshSslTab } from "./SshSslTab"; +import { TagsEnvTab } from "./TagsEnvTab"; +import type { ConnectionFormData } from "./connectionFormData"; + +export interface DetailedConnectionFormProps { + form: ConnectionFormData; + onChange: (updates: Partial) => void; +} + +export function DetailedConnectionForm({ form, onChange }: DetailedConnectionFormProps) { + const [activeTab, setActiveTab] = useState<"general" | "ssh" | "tags">("general"); + + return ( +
+
+ + + +
+ + {activeTab === "general" ? ( + + ) : activeTab === "ssh" ? ( + } onChange={onChange as (updates: Record) => void} /> + ) : ( + + )} +
+ ); +} \ No newline at end of file diff --git a/src/components/connections/EnvironmentSelect.tsx b/src/components/connections/EnvironmentSelect.tsx new file mode 100644 index 0000000..c7784b4 --- /dev/null +++ b/src/components/connections/EnvironmentSelect.tsx @@ -0,0 +1,31 @@ +import { SelectDropdown } from "../ui/SelectDropdown"; + +export type Environment = "production" | "staging" | "development" | null; + +interface EnvironmentSelectProps { + value: Environment; + onChange: (value: Environment) => void; +} + +const OPTIONS: { value: Environment; label: string }[] = [ + { value: null, label: "None" }, + { value: "production", label: "Production" }, + { value: "staging", label: "Staging" }, + { value: "development", label: "Development" }, +]; + +export function EnvironmentSelect({ value, onChange }: EnvironmentSelectProps) { + return ( + + onChange(next === "" ? null : (next as Environment)) + } + options={OPTIONS.map((opt) => ({ + value: opt.value ?? "", + label: opt.label, + }))} + placeholder="None" + /> + ); +} \ No newline at end of file diff --git a/src/components/connections/FolderSelect.tsx b/src/components/connections/FolderSelect.tsx new file mode 100644 index 0000000..1613db0 --- /dev/null +++ b/src/components/connections/FolderSelect.tsx @@ -0,0 +1,28 @@ +import { SelectDropdown } from "../ui/SelectDropdown"; +import type { Folder } from "../../lib/types"; +import { getFolderPathLabel } from "../../lib/utils"; + +interface FolderSelectProps { + folders: Folder[]; + value: string | null; + onChange: (value: string | null) => void; +} + +export function FolderSelect({ folders, value, onChange }: FolderSelectProps) { + const options = [ + { value: "", label: "None" }, + ...folders.map((folder) => ({ + value: folder.id, + label: getFolderPathLabel(folders, folder.id), + })), + ]; + + return ( + onChange(next === "" ? null : next)} + options={options} + placeholder="None" + /> + ); +} diff --git a/src/components/connections/GeneralTab.test.tsx b/src/components/connections/GeneralTab.test.tsx new file mode 100644 index 0000000..c6a7a2e --- /dev/null +++ b/src/components/connections/GeneralTab.test.tsx @@ -0,0 +1,39 @@ +import { describe, it, expect } from "vitest"; +import { render, screen } from "@testing-library/react"; +import { GeneralTab } from "./GeneralTab"; +import type { ConnectionFormData } from "./connectionFormData"; + +const BASE_FORM: ConnectionFormData = { + name: "", + environment: null, + folder_id: null, + tag_ids: [], + connection_string: "", + db_type: "postgresql", + host: "localhost", + port: 5432, + username: "postgres", + password: "secret", + database: "mydb", + use_keychain: true, +}; + +describe("GeneralTab", () => { + it("renders host, port, user, password, and database fields", () => { + render( {}} />); + + expect(screen.getByLabelText("Host")).toBeInTheDocument(); + expect(screen.getByLabelText("Port")).toBeInTheDocument(); + expect(screen.getByLabelText("User")).toBeInTheDocument(); + expect(screen.getByLabelText("Password")).toBeInTheDocument(); + expect(screen.getByLabelText("Database")).toBeInTheDocument(); + }); + + it("hides host and port for sqlite but shows database", () => { + render( {}} />); + + expect(screen.queryByLabelText("Host")).not.toBeInTheDocument(); + expect(screen.queryByLabelText("Port")).not.toBeInTheDocument(); + expect(screen.getByLabelText("Database")).toBeInTheDocument(); + }); +}); \ No newline at end of file diff --git a/src/components/connections/GeneralTab.tsx b/src/components/connections/GeneralTab.tsx new file mode 100644 index 0000000..21f4806 --- /dev/null +++ b/src/components/connections/GeneralTab.tsx @@ -0,0 +1,95 @@ +import { Input } from "../ui/Input"; +import { PasswordInput } from "./PasswordInput"; +import type { ConnectionFormData } from "./connectionFormData"; + +export interface GeneralTabProps { + form: ConnectionFormData; + onChange: (updates: Partial) => void; +} + +const AUTH_OPTIONS = ["User & Password"]; + +export function GeneralTab({ form, onChange }: GeneralTabProps) { + const isSqlite = form.db_type === "sqlite"; + + return ( +
+ {!isSqlite && ( +
+
+ + onChange({ host: value })} + placeholder="localhost" + aria-label="Host" + /> +
+
+ + onChange({ port: value === "" ? null : Number(value) })} + placeholder="5432" + aria-label="Port" + /> +
+
+ )} + +
+ + +
+ +
+ + onChange({ username: value || null })} + placeholder="postgres" + aria-label="User" + /> +
+ +
+ + onChange({ password: value || null })} + placeholder="••••••••" + aria-label="Password" + /> +
+ +
+ + onChange({ database: value || null })} + placeholder="database" + aria-label="Database" + /> +
+ + +
+ ); +} \ No newline at end of file diff --git a/src/components/connections/NewConnectionScreen.test.tsx b/src/components/connections/NewConnectionScreen.test.tsx new file mode 100644 index 0000000..bb7eaf5 --- /dev/null +++ b/src/components/connections/NewConnectionScreen.test.tsx @@ -0,0 +1,140 @@ +import { describe, it, expect, vi, beforeEach } from "vitest"; +import { render, screen, waitFor } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import { NewConnectionScreen } from "./NewConnectionScreen"; + +const { createConnection, notify, testConnection } = vi.hoisted(() => ({ + createConnection: vi.fn().mockResolvedValue({}), + notify: vi.fn(), + testConnection: vi.fn().mockResolvedValue({ ok: true }), +})); + +vi.mock("../../stores/connectionStore", () => ({ + createConnection, + useConnectionStore: (selector: (s: { createConnection: typeof createConnection }) => unknown) => + selector({ createConnection }), +})); + +vi.mock("../../stores/notificationStore", () => ({ + notify, + useNotificationStore: (selector: (s: { notify: typeof notify }) => unknown) => + selector({ notify }), +})); + +vi.mock("../../lib/commands", () => ({ + testConnection, +})); + +describe("NewConnectionScreen", () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + it("switches to detailed mode and back", async () => { + const user = userEvent.setup(); + render(); + await user.click(screen.getByText(/configure manually instead/i)); + expect(screen.getByText(/general/i)).toBeInTheDocument(); + await user.click(screen.getByText(/back to connection string/i)); + expect(screen.getByLabelText(/connection string/i)).toBeInTheDocument(); + }); + + it("parses prefilled connection string and populates fields", async () => { + const user = userEvent.setup(); + render( + , + ); + + expect(screen.getByLabelText(/connection string/i)).toHaveValue( + "postgresql://u:p@localhost:5432/db", + ); + + await user.click(screen.getByText(/configure manually instead/i)); + + expect(screen.getByLabelText("Host")).toHaveValue("localhost"); + expect(screen.getByLabelText("Port")).toHaveValue(5432); + expect(screen.getByLabelText("User")).toHaveValue("u"); + expect(screen.getByLabelText("Database")).toHaveValue("db"); + }); + + it("shows validation error and does not call createConnection when saving empty form", async () => { + const user = userEvent.setup(); + render(); + await user.click(screen.getByText("Save Connection")); + + expect(notify).toHaveBeenCalledWith("name is required", "error"); + expect(createConnection).not.toHaveBeenCalled(); + }); + + it("saves a connection and invokes onSaved when required fields are filled", async () => { + const user = userEvent.setup(); + const onSaved = vi.fn(); + render(); + + await user.type(screen.getByLabelText("Connection Label"), "Local DB"); + await user.type( + screen.getByLabelText("Connection String"), + "postgresql://u:p@localhost:5432/db", + ); + await user.click(screen.getByText("Save Connection")); + + await waitFor(() => expect(createConnection).toHaveBeenCalledTimes(1)); + expect(createConnection).toHaveBeenCalledWith( + expect.objectContaining({ + name: "Local DB", + db_type: "postgresql", + host: "localhost", + port: 5432, + username: "u", + password: "p", + database: "db", + connection_string: "postgresql://u:p@localhost:5432/db", + folder_id: null, + tag_ids: [], + environment: null, + use_keychain: false, + }), + ); + expect(notify).toHaveBeenCalledWith("Connection saved", "success"); + expect(onSaved).toHaveBeenCalled(); + }); + + it("calls testConnection when Test Connection is clicked", async () => { + const user = userEvent.setup(); + render(); + + await user.type(screen.getByLabelText("Connection Label"), "Local DB"); + await user.type( + screen.getByLabelText("Connection String"), + "postgresql://u:p@localhost:5432/db", + ); + await user.click(screen.getByText("Test Connection")); + + await waitFor(() => expect(testConnection).toHaveBeenCalledTimes(1)); + expect(testConnection).toHaveBeenCalledWith( + expect.objectContaining({ + name: "Local DB", + db_type: "postgresql", + host: "localhost", + port: 5432, + username: "u", + password: "p", + database: "db", + }), + ); + expect(notify).toHaveBeenCalledWith("Connection successful", "success"); + }); + + it("invokes onCancel when Back is clicked", async () => { + const user = userEvent.setup(); + const onCancel = vi.fn(); + render(); + + await user.click(screen.getByRole("button", { name: "Back" })); + expect(onCancel).toHaveBeenCalled(); + }); +}); \ No newline at end of file diff --git a/src/components/connections/NewConnectionScreen.tsx b/src/components/connections/NewConnectionScreen.tsx new file mode 100644 index 0000000..45527ac --- /dev/null +++ b/src/components/connections/NewConnectionScreen.tsx @@ -0,0 +1,193 @@ +import { useState, useEffect, useCallback } from "react"; +import { useConnectionStore } from "../../stores/connectionStore"; +import { useNotificationStore } from "../../stores/notificationStore"; +import { ConnectionFormShell } from "./ConnectionFormShell"; +import { SimpleConnectionForm } from "./SimpleConnectionForm"; +import { DetailedConnectionForm } from "./DetailedConnectionForm"; +import { parseConnectionString } from "../../lib/connectionString"; +import { validateConnectionInput } from "../../lib/utils"; +import { testConnection } from "../../lib/commands"; +import type { + Folder, + Tag, + NewConnectionMode, + ConnectionInput, +} from "../../lib/types"; +import type { ConnectionFormData } from "./connectionFormData"; + +interface NewConnectionScreenProps { + defaultFolderId?: string | null; + prefilledConnectionString?: string; + folders: Folder[]; + tags: Tag[]; + onSaved?: () => void; + onCancel?: () => void; +} + +function createEmptyForm( + defaultFolderId: string | null = null, +): ConnectionFormData { + return { + name: "", + environment: null, + folder_id: defaultFolderId, + tag_ids: [], + connection_string: "", + db_type: "postgresql", + host: "", + port: 5432, + username: null, + password: null, + database: null, + use_keychain: false, + }; +} + +export function NewConnectionScreen({ + defaultFolderId = null, + prefilledConnectionString = "", + folders, + tags, + onSaved, + onCancel, +}: NewConnectionScreenProps) { + const [mode, setMode] = useState("simple"); + const [form, setForm] = useState(() => + createEmptyForm(defaultFolderId), + ); + const [testLoading, setTestLoading] = useState(false); + const [saveLoading, setSaveLoading] = useState(false); + const createConnection = useConnectionStore((s) => s.createConnection); + const notify = useNotificationStore((s) => s.notify); + + const handleConnectionStringChange = useCallback((value: string) => { + setForm((prev) => { + const parsed = parseConnectionString(value); + if (!parsed) return { ...prev, connection_string: value }; + return { + ...prev, + connection_string: value, + db_type: parsed.db_type, + host: parsed.host, + port: parsed.port, + username: parsed.username, + password: parsed.password, + database: parsed.database, + }; + }); + }, []); + + useEffect(() => { + if (prefilledConnectionString) { + handleConnectionStringChange(prefilledConnectionString); + } + }, [prefilledConnectionString, handleConnectionStringChange]); + + const updateForm = useCallback((updates: Partial) => { + setForm((prev) => ({ ...prev, ...updates })); + }, []); + + const buildPayload = useCallback((): ConnectionInput => { + return { + name: form.name, + db_type: form.db_type, + host: form.host, + port: form.port, + username: form.username, + folder_id: form.folder_id, + tag_ids: form.tag_ids, + connection_string: form.connection_string, + environment: form.environment, + password: form.password, + database: form.database, + use_keychain: form.use_keychain, + }; + }, [form]); + + const validate = useCallback((): string | null => { + const result = validateConnectionInput(buildPayload()); + return result.ok ? null : result.error; + }, [buildPayload]); + + const handleSave = useCallback(async () => { + const error = validate(); + if (error) { + notify(error, "error"); + return; + } + setSaveLoading(true); + try { + await createConnection(buildPayload()); + notify("Connection saved", "success"); + onSaved?.(); + } catch (e) { + const message = e instanceof Error ? e.message : String(e); + notify(`Failed to save connection: ${message}`, "error"); + } finally { + setSaveLoading(false); + } + }, [validate, notify, createConnection, buildPayload, onSaved]); + + const handleTest = useCallback(async () => { + const error = validate(); + if (error) { + notify(error, "error"); + return; + } + setTestLoading(true); + try { + const result = await testConnection(buildPayload()); + if (result.ok) { + notify("Connection successful", "success"); + } else { + notify(result.error ?? "Connection failed", "error"); + } + } catch (e) { + const message = e instanceof Error ? e.message : String(e); + notify(`Connection test failed: ${message}`, "error"); + } finally { + setTestLoading(false); + } + }, [validate, notify, testConnection, buildPayload]); + + const onSimpleChange = useCallback( + (updates: Partial) => { + if ( + "connection_string" in updates && + updates.connection_string !== undefined + ) { + handleConnectionStringChange(updates.connection_string); + } else { + updateForm(updates); + } + }, + [handleConnectionStringChange, updateForm], + ); + + const onToggleMode = useCallback(() => { + setMode((m) => (m === "simple" ? "detailed" : "simple")); + }, []); + + return ( + onCancel?.()} + onTest={handleTest} + onSave={handleSave} + onToggleMode={onToggleMode} + testLoading={testLoading} + saveLoading={saveLoading} + > + {mode === "simple" ? ( + + ) : ( + + )} + + ); +} diff --git a/src/components/connections/PasswordInput.tsx b/src/components/connections/PasswordInput.tsx new file mode 100644 index 0000000..3d5294c --- /dev/null +++ b/src/components/connections/PasswordInput.tsx @@ -0,0 +1,37 @@ +import { useState, forwardRef } from "react"; +import { Eye, EyeOff } from "lucide-react"; +import type { KeyboardEvent } from "react"; + +interface PasswordInputProps { + value?: string; + placeholder?: string; + className?: string; + onChange?: (value: string) => void; + onKeyDown?: (e: KeyboardEvent) => void; +} + +export const PasswordInput = forwardRef( + function PasswordInput({ onChange, onKeyDown, className = "", ...rest }, ref) { + const [visible, setVisible] = useState(false); + return ( +
+ onChange?.(e.target.value)} + onKeyDown={(e) => onKeyDown?.(e)} + {...rest} + /> + +
+ ); + } +); \ No newline at end of file diff --git a/src/components/connections/SimpleConnectionForm.test.tsx b/src/components/connections/SimpleConnectionForm.test.tsx new file mode 100644 index 0000000..591a707 --- /dev/null +++ b/src/components/connections/SimpleConnectionForm.test.tsx @@ -0,0 +1,81 @@ +import { describe, it, expect, vi } from "vitest"; +import { render, screen } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import { useState } from "react"; +import { SimpleConnectionForm } from "./SimpleConnectionForm"; +import type { ConnectionFormData } from "./connectionFormData"; +import type { SimpleConnectionFormProps } from "./SimpleConnectionForm"; + +const BASE_FORM: ConnectionFormData = { + name: "", + environment: null, + folder_id: null, + tag_ids: [], + connection_string: "", + db_type: "postgresql", + host: "", + port: 5432, + username: null, + password: null, + database: null, + use_keychain: false, +}; + +function StatefulForm( + props: Omit & { + onChange?: (updates: Partial) => void; + }, +) { + const [form, setForm] = useState(BASE_FORM); + return ( + { + setForm((prev) => ({ ...prev, ...updates })); + props.onChange?.(updates); + }} + /> + ); +} + +describe("SimpleConnectionForm", () => { + it("updates the connection string", async () => { + const user = userEvent.setup(); + const onChange = vi.fn(); + render(); + const input = screen.getByLabelText(/connection string/i); + await user.type(input, "postgresql://a@b/c"); + expect(onChange).toHaveBeenLastCalledWith({ + connection_string: "postgresql://a@b/c", + }); + expect(input).toHaveValue("postgresql://a@b/c"); + }); + + it("toggles a tag via the SearchableTagPicker", async () => { + const user = userEvent.setup(); + const onChange = vi.fn(); + const tags = [ + { + id: "tag-1", + name: "Work", + color: "#ff0000", + created_at: "2024-01-01T00:00:00Z", + }, + { + id: "tag-2", + name: "Personal", + color: "#00ff00", + created_at: "2024-01-01T00:00:00Z", + }, + ]; + render(); + + const workTag = screen.getByText("Work"); + await user.click(workTag); + expect(onChange).toHaveBeenLastCalledWith({ tag_ids: ["tag-1"] }); + + await user.click(workTag); + expect(onChange).toHaveBeenLastCalledWith({ tag_ids: [] }); + }); +}); diff --git a/src/components/connections/SimpleConnectionForm.tsx b/src/components/connections/SimpleConnectionForm.tsx new file mode 100644 index 0000000..4a74ce7 --- /dev/null +++ b/src/components/connections/SimpleConnectionForm.tsx @@ -0,0 +1,84 @@ +import { Input } from "../ui/Input"; +import { EnvironmentSelect } from "./EnvironmentSelect"; +import { FolderSelect } from "./FolderSelect"; +import { ConnectionStringInput } from "./ConnectionStringInput"; +import { SearchableTagPicker } from "../tags/SearchableTagPicker"; +import type { ConnectionFormData } from "./connectionFormData"; +import type { Folder, Tag } from "../../lib/types"; + +export interface SimpleConnectionFormProps { + form: ConnectionFormData; + folders: Folder[]; + tags: Tag[]; + onChange: (updates: Partial) => void; +} + +export function SimpleConnectionForm({ + form, + folders, + tags, + onChange, +}: SimpleConnectionFormProps) { + return ( +
+
+ + onChange({ name: value })} + placeholder="My Production Database" + aria-label="Connection Label" + /> +

+ A friendly name to identify this connection. +

+
+ +
+ + onChange({ environment: value })} + /> +
+ +
+ + onChange({ folder_id: value })} + /> +
+ + { + const current = form.tag_ids ?? []; + const next = current.includes(tagId) + ? current.filter((id) => id !== tagId) + : [...current, tagId]; + onChange({ tag_ids: next }); + }} + /> + +
+ + onChange({ connection_string: value })} + placeholder="postgresql://user:password@host:5432/database" + aria-label="Connection String" + /> +

+ Paste your connection string to auto-detect database type. +

+
+
+ ); +} diff --git a/src/components/connections/SshFields.test.tsx b/src/components/connections/SshFields.test.tsx new file mode 100644 index 0000000..a475040 --- /dev/null +++ b/src/components/connections/SshFields.test.tsx @@ -0,0 +1,46 @@ +import { describe, it, expect, vi } from "vitest"; +import { render, screen } from "@testing-library/react"; +import { SshFields } from "./SshFields"; + +const notify = vi.fn(); + +vi.mock("../../stores/notificationStore", () => ({ + useNotificationStore: (selector: (s: { notify: typeof notify }) => unknown) => + selector({ notify }), +})); + +vi.mock("@tauri-apps/plugin-dialog", () => ({ + open: vi.fn(), +})); + +describe("SshFields", () => { + it("renders SSH host, port, and user fields", () => { + render( {}} />); + + expect(screen.getByLabelText("SSH Host")).toBeInTheDocument(); + expect(screen.getByLabelText("SSH Port")).toBeInTheDocument(); + expect(screen.getByLabelText("SSH User")).toBeInTheDocument(); + }); + + it("renders auth method dropdown", () => { + render( {}} />); + + expect(screen.getByRole("button", { name: "Auth Method" })).toBeInTheDocument(); + }); + + it("shows private key and passphrase fields when auth method is key", () => { + render( {}} />); + + expect(screen.getByLabelText("Private Key")).toBeInTheDocument(); + expect(screen.getByLabelText("Passphrase")).toBeInTheDocument(); + expect(screen.queryByLabelText("SSH Password")).not.toBeInTheDocument(); + }); + + it("shows password field when auth method is password", () => { + render( {}} />); + + expect(screen.getByLabelText("SSH Password")).toBeInTheDocument(); + expect(screen.queryByLabelText("Private Key")).not.toBeInTheDocument(); + expect(screen.queryByLabelText("Passphrase")).not.toBeInTheDocument(); + }); +}); \ No newline at end of file diff --git a/src/components/connections/SshFields.tsx b/src/components/connections/SshFields.tsx new file mode 100644 index 0000000..3acf246 --- /dev/null +++ b/src/components/connections/SshFields.tsx @@ -0,0 +1,119 @@ +import { open } from "@tauri-apps/plugin-dialog"; +import { Input } from "../ui/Input"; +import { PasswordInput } from "./PasswordInput"; +import { SelectDropdown } from "../ui/SelectDropdown"; +import { useNotificationStore } from "../../stores/notificationStore"; + +export interface SshFieldsProps { + values: Record; + onChange: (updates: Record) => void; +} + +const AUTH_METHOD_OPTIONS = [ + { value: "password", label: "Password" }, + { value: "key", label: "Private Key" }, +]; + +export function SshFields({ values, onChange }: SshFieldsProps) { + const notify = useNotificationStore((s) => s.notify); + const authMethod = (values.ssh_auth_method as string) ?? "password"; + + const handlePickFile = async (field: string) => { + try { + const path = await open({ multiple: false, directory: false }); + if (path) { + onChange({ [field]: path }); + } + } catch { + notify("File picker not available", "error"); + } + }; + + return ( +
+
+ + onChange({ ssh_host: value })} + placeholder="bastion.example.com" + aria-label="SSH Host" + /> +
+ +
+ + onChange({ ssh_port: value === "" ? null : Number(value) })} + placeholder="22" + aria-label="SSH Port" + /> +
+ +
+ + onChange({ ssh_user: value })} + placeholder="ssh-user" + aria-label="SSH User" + /> +
+ +
+ + onChange({ ssh_auth_method: value })} + options={AUTH_METHOD_OPTIONS} + aria-label="Auth Method" + /> +
+ + {authMethod === "key" ? ( + <> +
+ +
+ onChange({ ssh_private_key: value })} + placeholder="/path/to/key" + aria-label="Private Key" + /> + +
+
+ +
+ + onChange({ ssh_passphrase: value })} + placeholder="••••••••" + aria-label="Passphrase" + /> +
+ + ) : ( +
+ + onChange({ ssh_password: value })} + placeholder="••••••••" + aria-label="SSH Password" + /> +
+ )} +
+ ); +} \ No newline at end of file diff --git a/src/components/connections/SshSslTab.test.tsx b/src/components/connections/SshSslTab.test.tsx new file mode 100644 index 0000000..e8d4597 --- /dev/null +++ b/src/components/connections/SshSslTab.test.tsx @@ -0,0 +1,41 @@ +import { describe, it, expect, vi } from "vitest"; +import { render, screen } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import { SshSslTab } from "./SshSslTab"; + +vi.mock("../../stores/notificationStore", () => ({ + useNotificationStore: () => ({ + notify: vi.fn(), + }), +})); + +vi.mock("@tauri-apps/plugin-dialog", () => ({ + open: vi.fn(), +})); + +describe("SshSslTab", () => { + it("renders SSH and SSL sub-tab buttons", () => { + render( {}} />); + + expect(screen.getByRole("button", { name: "SSH" })).toBeInTheDocument(); + expect(screen.getByRole("button", { name: "SSL" })).toBeInTheDocument(); + }); + + it("toggles between SSH and SSL content", async () => { + const user = userEvent.setup(); + render( {}} />); + + expect(screen.getByLabelText("SSH Host")).toBeInTheDocument(); + expect(screen.queryByRole("button", { name: "SSL Mode" })).not.toBeInTheDocument(); + + await user.click(screen.getByRole("button", { name: "SSL" })); + + expect(screen.queryByLabelText("SSH Host")).not.toBeInTheDocument(); + expect(screen.getByRole("button", { name: "SSL Mode" })).toBeInTheDocument(); + + await user.click(screen.getByRole("button", { name: "SSH" })); + + expect(screen.getByLabelText("SSH Host")).toBeInTheDocument(); + expect(screen.queryByRole("button", { name: "SSL Mode" })).not.toBeInTheDocument(); + }); +}); \ No newline at end of file diff --git a/src/components/connections/SshSslTab.tsx b/src/components/connections/SshSslTab.tsx new file mode 100644 index 0000000..7d50724 --- /dev/null +++ b/src/components/connections/SshSslTab.tsx @@ -0,0 +1,39 @@ +import { useState } from "react"; +import { SshFields } from "./SshFields"; +import { SslFields } from "./SslFields"; + +export interface SshSslTabProps { + form: Record; + onChange: (updates: Record) => void; +} + +export function SshSslTab({ form, onChange }: SshSslTabProps) { + const [activeSubTab, setActiveSubTab] = useState<"ssh" | "ssl">("ssh"); + + return ( +
+
+ + +
+ + {activeSubTab === "ssh" ? : } +
+ ); +} \ No newline at end of file diff --git a/src/components/connections/SslFields.test.tsx b/src/components/connections/SslFields.test.tsx new file mode 100644 index 0000000..5183846 --- /dev/null +++ b/src/components/connections/SslFields.test.tsx @@ -0,0 +1,38 @@ +import { describe, it, expect, vi } from "vitest"; +import { render, screen } from "@testing-library/react"; +import { SslFields } from "./SslFields"; + +const notify = vi.fn(); + +vi.mock("../../stores/notificationStore", () => ({ + useNotificationStore: (selector: (s: { notify: typeof notify }) => unknown) => + selector({ notify }), +})); + +vi.mock("@tauri-apps/plugin-dialog", () => ({ + open: vi.fn(), +})); + +describe("SslFields", () => { + it("renders SSL mode dropdown", () => { + render( {}} />); + + expect(screen.getByRole("button", { name: "SSL Mode" })).toBeInTheDocument(); + }); + + it("shows file pickers for verify-full mode", () => { + render( {}} />); + + expect(screen.getByLabelText("CA Certificate")).toBeInTheDocument(); + expect(screen.getByLabelText("Client Certificate")).toBeInTheDocument(); + expect(screen.getByLabelText("Client Key")).toBeInTheDocument(); + }); + + it("hides file pickers for disable mode", () => { + render( {}} />); + + expect(screen.queryByLabelText("CA Certificate")).not.toBeInTheDocument(); + expect(screen.queryByLabelText("Client Certificate")).not.toBeInTheDocument(); + expect(screen.queryByLabelText("Client Key")).not.toBeInTheDocument(); + }); +}); \ No newline at end of file diff --git a/src/components/connections/SslFields.tsx b/src/components/connections/SslFields.tsx new file mode 100644 index 0000000..08ab3b0 --- /dev/null +++ b/src/components/connections/SslFields.tsx @@ -0,0 +1,114 @@ +import { open } from "@tauri-apps/plugin-dialog"; +import { Input } from "../ui/Input"; +import { SelectDropdown } from "../ui/SelectDropdown"; +import { useNotificationStore } from "../../stores/notificationStore"; + +export interface SslFieldsProps { + values: Record; + onChange: (updates: Record) => void; +} + +const SSL_MODE_OPTIONS = [ + { value: "disable", label: "Disable" }, + { value: "require", label: "Require" }, + { value: "verify-ca", label: "Verify CA" }, + { value: "verify-full", label: "Verify Full" }, +]; + +export function SslFields({ values, onChange }: SslFieldsProps) { + const notify = useNotificationStore((s) => s.notify); + const mode = (values.ssl_mode as string) ?? "disable"; + const showCertFields = mode === "verify-ca" || mode === "verify-full"; + + const handlePickFile = async (field: string) => { + try { + const path = await open({ multiple: false, directory: false }); + if (path) { + onChange({ [field]: path }); + } + } catch { + notify("File picker not available", "error"); + } + }; + + return ( +
+
+ + onChange({ ssl_mode: value })} + options={SSL_MODE_OPTIONS} + aria-label="SSL Mode" + /> +
+ + {mode === "require" && ( +

+ Require mode is vulnerable to man-in-the-middle attacks because it does not verify the server certificate. +

+ )} + + {showCertFields && ( + <> +
+ +
+ onChange({ ssl_ca_cert: value })} + placeholder="/path/to/ca-cert.pem" + aria-label="CA Certificate" + /> + +
+
+ +
+ +
+ onChange({ ssl_client_cert: value })} + placeholder="/path/to/client-cert.pem" + aria-label="Client Certificate" + /> + +
+
+ +
+ +
+ onChange({ ssl_client_key: value })} + placeholder="/path/to/client-key.pem" + aria-label="Client Key" + /> + +
+
+ + )} +
+ ); +} \ No newline at end of file diff --git a/src/components/connections/TagsEnvTab.tsx b/src/components/connections/TagsEnvTab.tsx new file mode 100644 index 0000000..a3d04cb --- /dev/null +++ b/src/components/connections/TagsEnvTab.tsx @@ -0,0 +1,51 @@ +import { EnvironmentSelect } from "../connections/EnvironmentSelect"; +import { FolderSelect } from "../connections/FolderSelect"; +import { SearchableTagPicker } from "../tags/SearchableTagPicker"; +import { useConnectionStore } from "../../stores/connectionStore"; +import type { ConnectionFormData } from "../connections/connectionFormData"; + +interface TagsEnvTabProps { + form: ConnectionFormData; + onChange: (updates: Partial) => void; +} + +export function TagsEnvTab({ form, onChange }: TagsEnvTabProps) { + const folders = useConnectionStore((s) => s.folders); + const tags = useConnectionStore((s) => s.tags); + + return ( +
+
+ + onChange({ environment: value })} + /> +
+ +
+ + onChange({ folder_id: value })} + /> +
+ +
+ + { + const current = form.tag_ids ?? []; + const next = current.includes(tagId) + ? current.filter((id) => id !== tagId) + : [...current, tagId]; + onChange({ tag_ids: next }); + }} + /> +
+
+ ); +} \ No newline at end of file diff --git a/src/components/connections/connectionFormData.ts b/src/components/connections/connectionFormData.ts new file mode 100644 index 0000000..79719d5 --- /dev/null +++ b/src/components/connections/connectionFormData.ts @@ -0,0 +1,17 @@ +import type { DbType } from "../../lib/types"; +import type { Environment } from "./EnvironmentSelect"; + +export interface ConnectionFormData { + name: string; + environment: Environment; + folder_id: string | null; + tag_ids: string[]; + connection_string: string; + db_type: DbType; + host: string; + port: number | null; + username: string | null; + password: string | null; + database: string | null; + use_keychain: boolean; +} diff --git a/src/components/db-viewer/ChangesQueuePanel.test.tsx b/src/components/db-viewer/ChangesQueuePanel.test.tsx new file mode 100644 index 0000000..d9d4ba6 --- /dev/null +++ b/src/components/db-viewer/ChangesQueuePanel.test.tsx @@ -0,0 +1,46 @@ +import { describe, it, expect, beforeEach } from "vitest"; +import { render, screen } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import { ChangesQueuePanel } from "./ChangesQueuePanel"; +import { useDbViewerStore } from "../../stores/dbViewerStore"; + +describe("ChangesQueuePanel", () => { + beforeEach(() => { + useDbViewerStore.setState({ changesQueue: [] }); + }); + + it("shows nothing when queue is empty", () => { + const { container } = render(); + expect(container.textContent).toBe(""); + }); + + it("shows pending changes", () => { + useDbViewerStore.getState().addChange({ + type: "update", + schema: "public", + table: "users", + primaryKey: { id: 1 }, + oldData: { name: "Bob" }, + newData: { name: "Alice" }, + }); + render(); + expect(screen.getByText(/1 pending change/i)).toBeInTheDocument(); + expect(screen.getByText(/users/i)).toBeInTheDocument(); + }); + + it("cancel button changes status", async () => { + const user = userEvent.setup(); + useDbViewerStore.getState().addChange({ + type: "update", + schema: "public", + table: "users", + primaryKey: { id: 1 }, + oldData: { name: "Bob" }, + newData: { name: "Alice" }, + }); + render(); + const cancelBtn = screen.getByRole("button", { name: /cancel/i }); + await user.click(cancelBtn); + expect(screen.getByText(/cancelled/i)).toBeInTheDocument(); + }); +}); \ No newline at end of file diff --git a/src/components/db-viewer/ChangesQueuePanel.tsx b/src/components/db-viewer/ChangesQueuePanel.tsx new file mode 100644 index 0000000..ddb0df9 --- /dev/null +++ b/src/components/db-viewer/ChangesQueuePanel.tsx @@ -0,0 +1,199 @@ +import { useState, useCallback } from "react"; +import { X, Check, ChevronUp, ChevronDown } from "lucide-react"; +import { useDbViewerStore } from "../../stores/dbViewerStore"; +import { useUiStore } from "../../stores/uiStore"; +import { useNotificationStore } from "../../stores/notificationStore"; +import * as cmd from "../../lib/commands"; +import type { QueueItem, QueueStatus } from "../../stores/dbViewerStore"; +import type { ChangeItem } from "../../lib/types"; + +const statusBg: Record = { + pending: "bg-accent/5", + committed: "bg-green-500/5", + failed: "bg-red-500/5", + cancelled: "bg-surface-raised/50", +}; + +function capitalizeType(type: string) { + return type.charAt(0).toUpperCase() + type.slice(1); +} + +function StatusIndicator({ status }: { status: QueueStatus }) { + switch (status) { + case "pending": + return ( +
+ + Pending +
+ ); + case "committed": + return ( +
+ + Committed +
+ ); + case "failed": + return ( +
+ + Failed +
+ ); + case "cancelled": + return ( +
+ Cancelled +
+ ); + default: + return null; + } +} + +export function ChangesQueuePanel() { + const changesQueue = useDbViewerStore((state) => state.changesQueue); + const cancelChange = useDbViewerStore((state) => state.cancelChange); + const markChangeCommitted = useDbViewerStore((state) => state.markChangeCommitted); + const markChangeFailed = useDbViewerStore((state) => state.markChangeFailed); + const notify = useNotificationStore((state) => state.notify); + const [expanded, setExpanded] = useState(true); + + const handleCommitAll = useCallback(async () => { + const connectionId = useUiStore.getState().activeConnectionId; + if (!connectionId) { + notify("No active connection", "error"); + return; + } + + const pending = useDbViewerStore.getState().changesQueue.filter( + (c) => c.status === "pending", + ); + if (pending.length === 0) return; + + let committedCount = 0; + + for (const change of pending) { + try { + const payload = { + id: change.id, + type: change.type, + sql: change.sql, + status: "pending" as const, + description: change.description ?? null, + } satisfies ChangeItem; + await cmd.executeChange(connectionId, payload); + markChangeCommitted(change.id); + committedCount++; + } catch (e) { + const msg = e instanceof Error ? e.message : String(e); + markChangeFailed(change.id, msg); + notify(`Change failed: ${msg}`, "error"); + break; + } + } + + if (committedCount > 0) { + notify(`${committedCount} change(s) committed`, "success"); + } + }, [markChangeCommitted, markChangeFailed, notify]); + + if (changesQueue.length === 0) { + return null; + } + + const pendingCount = changesQueue.filter((c) => c.status === "pending").length; + const processedCount = changesQueue.filter( + (c) => c.status === "committed" || c.status === "failed", + ).length; + + const changeWord = pendingCount === 1 ? "change" : "changes"; + + return ( +
+ + + + {expanded && ( +
+ {changesQueue.map((change) => ( + cancelChange(change.id)} + /> + ))} +
+ )} +
+ ); +} + +function ChangeRow({ + change, + onCancel, +}: { + change: QueueItem; + onCancel: () => void; +}) { + return ( +
+
+ + {capitalizeType(change.type)} + + + {change.table ? change.table : "-"} + +
+ +
+ + {change.status === "pending" && ( + + )} +
+
+ ); +} \ No newline at end of file diff --git a/src/components/db-viewer/ConnectionDropBanner.test.tsx b/src/components/db-viewer/ConnectionDropBanner.test.tsx new file mode 100644 index 0000000..bea4a1d --- /dev/null +++ b/src/components/db-viewer/ConnectionDropBanner.test.tsx @@ -0,0 +1,56 @@ +import { describe, it, expect, vi } from "vitest"; +import { render, screen } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import { ConnectionDropBanner } from "./ConnectionDropBanner"; + +describe("ConnectionDropBanner", () => { + it("shows error message", () => { + render( + {}} + onDismiss={() => {}} + />, + ); + expect(screen.getByText("Connection lost")).toBeInTheDocument(); + }); + + it("shows reconnect button", () => { + render( + {}} + onDismiss={() => {}} + />, + ); + expect(screen.getByRole("button", { name: /reconnect/i })).toBeInTheDocument(); + }); + + it("calls onRetry when reconnect clicked", async () => { + const onRetry = vi.fn(); + const user = userEvent.setup(); + render( + {}} + />, + ); + await user.click(screen.getByRole("button", { name: /reconnect/i })); + expect(onRetry).toHaveBeenCalledOnce(); + }); + + it("calls onDismiss when close button clicked", async () => { + const onDismiss = vi.fn(); + const user = userEvent.setup(); + render( + {}} + onDismiss={onDismiss} + />, + ); + await user.click(screen.getByRole("button", { name: /dismiss/i })); + expect(onDismiss).toHaveBeenCalledOnce(); + }); +}); \ No newline at end of file diff --git a/src/components/db-viewer/ConnectionDropBanner.tsx b/src/components/db-viewer/ConnectionDropBanner.tsx new file mode 100644 index 0000000..ac5152b --- /dev/null +++ b/src/components/db-viewer/ConnectionDropBanner.tsx @@ -0,0 +1,35 @@ +import { AlertTriangle, X } from "lucide-react"; + +interface ConnectionDropBannerProps { + error: string; + onRetry: () => void; + onDismiss?: () => void; +} + +export function ConnectionDropBanner({ error, onRetry, onDismiss }: ConnectionDropBannerProps) { + return ( +
+
+ + {error} +
+
+ + +
+
+ ); +} \ No newline at end of file diff --git a/src/components/db-viewer/DataGrid.test.tsx b/src/components/db-viewer/DataGrid.test.tsx new file mode 100644 index 0000000..6488f65 --- /dev/null +++ b/src/components/db-viewer/DataGrid.test.tsx @@ -0,0 +1,79 @@ +import { describe, it, expect, beforeEach } from "vitest"; +import { render, screen } from "@testing-library/react"; +import { DataGrid } from "./DataGrid"; +import { useDbViewerStore } from "../../stores/dbViewerStore"; +import type { QueryResult } from "../../lib/types"; + +const mockData: QueryResult = { + columns: [{name:"id",data_type:"text",is_pk:false,is_fk:false,is_nullable:false,default_value:null,fk_ref:null},{name:"name",data_type:"text",is_pk:false,is_fk:false,is_nullable:false,default_value:null,fk_ref:null},{name:"email",data_type:"text",is_pk:false,is_fk:false,is_nullable:false,default_value:null,fk_ref:null}], + rows: [ + [1, "Alice", "alice@example.com"], + [2, "Bob", null], + ], + total_rows: 2, page: 1, page_size: 50, +}; + +describe("DataGrid", () => { + beforeEach(() => { + useDbViewerStore.getState().reset(); + }); + + it("shows empty state when no active tab", () => { + render( {}} />); + expect(screen.getByText(/Select a table to view data/i)).toBeInTheDocument(); + }); + + it("shows loading state", () => { + useDbViewerStore.getState().openTab("public", "users"); + const tabId = useDbViewerStore.getState().tabs[0].id; + useDbViewerStore.getState().setTabLoading(tabId, true); + + render( {}} />); + expect(screen.getByText(/Loading/i)).toBeInTheDocument(); + }); + + it("shows error message in red", () => { + useDbViewerStore.getState().openTab("public", "users"); + const tabId = useDbViewerStore.getState().tabs[0].id; + useDbViewerStore.getState().setTabError(tabId, "Connection failed"); + + render( {}} />); + const error = screen.getByText(/Connection failed/i); + expect(error).toBeInTheDocument(); + expect(error).toHaveClass("text-red-500"); + }); + + it("shows loading state when first opening a tab", () => { + useDbViewerStore.getState().openTab("public", "users"); + + render( {}} />); + expect(screen.getByText(/Loading/i)).toBeInTheDocument(); + }); + + it("renders column headers and row data when loaded", () => { + useDbViewerStore.getState().openTab("public", "users"); + const tabId = useDbViewerStore.getState().tabs[0].id; + useDbViewerStore.getState().setTabData(tabId, mockData); + + render( {}} />); + expect(screen.getByRole("columnheader", { name: /id/ })).toBeInTheDocument(); + expect(screen.getByRole("columnheader", { name: /name/ })).toBeInTheDocument(); + expect(screen.getByRole("columnheader", { name: /email/ })).toBeInTheDocument(); + expect(screen.getByText("1")).toBeInTheDocument(); + expect(screen.getByText("Alice")).toBeInTheDocument(); + expect(screen.getByText("alice@example.com")).toBeInTheDocument(); + expect(screen.getByText("Bob")).toBeInTheDocument(); + expect(screen.getByText("NULL")).toBeInTheDocument(); + }); + + it("renders NULL values as italic muted text", () => { + useDbViewerStore.getState().openTab("public", "users"); + const tabId = useDbViewerStore.getState().tabs[0].id; + useDbViewerStore.getState().setTabData(tabId, mockData); + + render( {}} />); + const nullCell = screen.getByText("NULL"); + expect(nullCell).toHaveClass("italic"); + expect(nullCell).toHaveClass("text-text-muted"); + }); +}); \ No newline at end of file diff --git a/src/components/db-viewer/DataGrid.tsx b/src/components/db-viewer/DataGrid.tsx new file mode 100644 index 0000000..636763c --- /dev/null +++ b/src/components/db-viewer/DataGrid.tsx @@ -0,0 +1,339 @@ +import { useCallback, useEffect, useRef, useState } from "react"; +import { Key, Braces } from "lucide-react"; +import { useDbViewerStore } from "../../stores/dbViewerStore"; +import { abbreviateType } from "../../lib/utils"; +import { FkPreviewPopover } from "./FkPreviewPopover"; +import { JsonCellPopover, jsonPreview } from "./JsonCellPopover"; + +// TODO: Replace this plain HTML table with @tanstack/react-virtual for large +// result sets so we can render millions of rows without DOM overhead. + +type ColumnWidths = Record; +type TabColumnWidths = Record; + +const DEFAULT_COL_WIDTH = 200; +const MIN_COL_WIDTH = 60; +const MAX_COL_WIDTH = 800; +const CHECKBOX_COL_WIDTH = 40; + +interface DataGridProps { + connectionId: string; + rows: unknown[][]; + hiddenColumns?: Set; + selectedRows: Set; + onSelectionChange: (selected: Set) => void; +} + +export function DataGrid({ connectionId, rows, hiddenColumns, selectedRows, onSelectionChange }: DataGridProps) { + const tabs = useDbViewerStore((state) => state.tabs); + const activeTabId = useDbViewerStore((state) => state.activeTabId); + const [colWidths, setColWidths] = useState({}); + + // FK preview popover state + const [fkPreview, setFkPreview] = useState<{ + connectionId: string; + schema: string; + table: string; + column: string; + value: string; + anchorRect: DOMRect | null; + } | null>(null); + + // JSON cell popover state + const [jsonPopover, setJsonPopover] = useState<{ + value: unknown; + anchorRect: DOMRect | null; + } | null>(null); + + // ── helpers ──────────────────────────────────────────── + + const activeTab = activeTabId ? tabs.find((t) => t.id === activeTabId) : null; + const widths = activeTabId ? (colWidths[activeTabId] ?? {}) : {}; + + const getWidth = useCallback( + (colName: string) => widths[colName] ?? DEFAULT_COL_WIDTH, + [widths], + ); + + // ── selection logic ──────────────────────────────────── + + const allSelected = rows.length > 0 && selectedRows.size === rows.length; + const someSelected = selectedRows.size > 0 && selectedRows.size < rows.length; + const checkboxRef = useRef(null); + + useEffect(() => { + if (checkboxRef.current) { + checkboxRef.current.indeterminate = someSelected; + } + }, [someSelected]); + + const toggleAll = () => { + if (allSelected) { + onSelectionChange(new Set()); + } else { + onSelectionChange(new Set(rows.map((_, i) => i))); + } + }; + + const toggleRow = (rowIndex: number) => { + const next = new Set(selectedRows); + if (next.has(rowIndex)) next.delete(rowIndex); + else next.add(rowIndex); + onSelectionChange(next); + }; + + // ── resize handler (ref-based to avoid stale closures) ─ + + const resizeRef = useRef<{ col: string; startX: number; startWidth: number } | null>(null); + + const startResize = useCallback( + (colName: string, e: React.MouseEvent) => { + e.preventDefault(); + e.stopPropagation(); + resizeRef.current = { col: colName, startX: e.clientX, startWidth: getWidth(colName) }; + + const onMove = (ev: MouseEvent) => { + if (!resizeRef.current) return; + const delta = ev.clientX - resizeRef.current.startX; + const next = Math.max(MIN_COL_WIDTH, Math.min(MAX_COL_WIDTH, resizeRef.current.startWidth + delta)); + setColWidths((prev) => ({ + ...prev, + [activeTabId!]: { ...(prev[activeTabId!] ?? {}), [resizeRef.current!.col]: next }, + })); + }; + + const onUp = () => { + resizeRef.current = null; + document.removeEventListener("mousemove", onMove); + document.removeEventListener("mouseup", onUp); + }; + + document.addEventListener("mousemove", onMove); + document.addEventListener("mouseup", onUp); + }, + [activeTabId, getWidth], + ); + + // ── FK row-click handler ─────────────────────────────── + + const handleFkClick = useCallback( + (col: { name: string; is_fk: boolean; fk_ref: [string, string] | null }, cellValue: unknown, e: React.MouseEvent) => { + if (!col.is_fk || !col.fk_ref || cellValue === null || cellValue === undefined) return; + const [refTable] = col.fk_ref; + const schema = activeTab?.schema ?? "public"; + const rect = (e.currentTarget as HTMLElement).getBoundingClientRect(); + setFkPreview({ + connectionId, + schema, + table: refTable, + column: col.fk_ref[1], + value: String(cellValue), + anchorRect: rect, + }); + }, + [activeTab], + ); + + // ── empty / loading / error states ───────────────────── + + if (!activeTabId) { + return ( +
+ Select a table to view data +
+ ); + } + + if (!activeTab) { + return ( +
+ Select a table to view data +
+ ); + } + + if (activeTab.loading && !activeTab.data) { + return ( +
+ Loading... +
+ ); + } + + if (activeTab.error) { + return ( +
+ {activeTab.error} +
+ ); + } + + if (!activeTab.data) { + return ( +
+ Loading table data... +
+ ); + } + + const { columns } = activeTab.data; + + // Filter visible columns + const visibleColumns = hiddenColumns + ? columns.filter((c) => !hiddenColumns.has(c.name)) + : columns; + + return ( +
+ {/* Loading indicator bar when refreshing with existing data */} + {activeTab.loading && ( +
+ )} +
+ + {/* Checkbox column */} + + {visibleColumns.map((col) => ( + + ))} + + + + {/* Header checkbox */} + + {visibleColumns.map((col) => ( + + ))} + + + + {rows.map((row, rowIndex) => { + const isSelected = selectedRows.has(rowIndex); + return ( + + {/* Row checkbox */} + + {visibleColumns.map((col) => { + const ci = columns.findIndex((c) => c.name === col.name); + const cell = ci >= 0 ? row[ci] : undefined; + const isNull = cell === null || cell === undefined; + const isFk = col.is_fk && col.fk_ref && !isNull; + const isJson = !isNull && (col.data_type === "jsonb" || col.data_type === "json"); + const jp = isJson ? jsonPreview(cell) : { label: "", isJson: false }; + + const handleJsonClick = (e: React.MouseEvent) => { + if (isJson) { + const rect = (e.currentTarget as HTMLElement).getBoundingClientRect(); + setJsonPopover({ value: cell, anchorRect: rect }); + } + }; + + return ( + + ); + })} + + ); + })} + +
+
+ +
+
+
+ {col.is_pk && } + {col.is_fk && } + {col.name} + + {abbreviateType(col.data_type)} + +
+ {/* resize handle */} +
startResize(col.name, e)} + onDoubleClick={() => { + setColWidths((prev) => ({ + ...prev, + [activeTabId!]: { ...(prev[activeTabId!] ?? {}), [col.name]: DEFAULT_COL_WIDTH }, + })); + }} + /> +
+
+ toggleRow(rowIndex)} + className="w-3.5 h-3.5 rounded border-border cursor-pointer accent-accent" + /> +
+
+
handleFkClick(col!, cell, e) : isJson ? handleJsonClick : undefined} + role={isFk || isJson ? "button" : undefined} + tabIndex={isFk || isJson ? 0 : undefined} + onKeyDown={isFk ? (e) => { if (e.key === "Enter" || e.key === " ") { e.preventDefault(); handleFkClick(col!, cell, e as any); } } : isJson ? (e) => { if (e.key === "Enter" || e.key === " ") { e.preventDefault(); handleJsonClick(e as any); } } : undefined} + > + {isNull ? ( + NULL + ) : isJson ? ( + + + {jp.label} + + ) : ( + String(cell) + )} +
+
+ {/* FK preview popover */} + {fkPreview && ( + setFkPreview(null)} + /> + )} + {/* JSON cell popover */} + {jsonPopover && ( + setJsonPopover(null)} + /> + )} + + ); +} \ No newline at end of file diff --git a/src/components/db-viewer/DbViewerScreen.test.tsx b/src/components/db-viewer/DbViewerScreen.test.tsx new file mode 100644 index 0000000..1d3d1b0 --- /dev/null +++ b/src/components/db-viewer/DbViewerScreen.test.tsx @@ -0,0 +1,20 @@ +import { describe, it, expect, beforeEach } from "vitest"; +import { render, screen } from "@testing-library/react"; +import { DbViewerScreen } from "./DbViewerScreen"; +import { useDbViewerStore } from "../../stores/dbViewerStore"; + +describe("DbViewerScreen", () => { + beforeEach(() => { + useDbViewerStore.setState({ + tabs: [], activeTabId: null, changesQueue: [], + databases: ["mydb"], schemas: ["public"], + tables: [{ name: "users", schema: "public", table_type: "TABLE" }], + currentDatabase: "mydb", currentSchema: "public", + }); + }); + + it("renders the sidebar", () => { + render( {}} onSettings={() => {}} />); + expect(screen.getByLabelText(/home/i)).toBeInTheDocument(); + }); +}); \ No newline at end of file diff --git a/src/components/db-viewer/DbViewerScreen.tsx b/src/components/db-viewer/DbViewerScreen.tsx new file mode 100644 index 0000000..37fc2fa --- /dev/null +++ b/src/components/db-viewer/DbViewerScreen.tsx @@ -0,0 +1,408 @@ +import { useCallback, useEffect, useMemo, useRef, useState } from "react"; +import { TooltipProvider } from "../ui/Tooltip"; +import { DbViewerSidebar } from "./DbViewerSidebar"; +import { DbViewerToolbar } from "./DbViewerToolbar"; +import { TableTree } from "./TableTree"; +import { TabBar } from "./TabBar"; +import { DataGrid } from "./DataGrid"; +import { ChangesQueuePanel } from "./ChangesQueuePanel"; +import { TableControls } from "./TableControls"; +import { EditConnectionModal } from "./EditConnectionModal"; +import { useDbConnection } from "../../hooks/useDbConnection"; +import { useDbViewerStore } from "../../stores/dbViewerStore"; +import { useConnectionStore } from "../../stores/connectionStore"; +import { useSettingsStore } from "../../stores/settingsStore"; +import { useShortcut } from "../../hooks/useShortcut"; +import { ConnectionDropBanner } from "./ConnectionDropBanner"; +import * as cmd from "../../lib/commands"; +import type { ColumnInfo } from "../../lib/types"; + +export interface DbViewerScreenProps { + connectionId: string; + onHome: () => void; + onSettings: () => void; +} + +// ─── client-side filter/sort helpers ───────────────────── + +type FilterRule = { + id: string; + column: string; + operator: "eq" | "neq" | "contains" | "starts" | "ends" | "gt" | "lt" | "null" | "notnull"; + value: string; +}; + +type SortRule = { id: string; column: string; order: "asc" | "desc" }; + +function applyFilters(rows: unknown[][], columns: ColumnInfo[], rules: FilterRule[]): unknown[][] { + if (rules.length === 0) return rows; + return rows.filter((row) => + rules.every((rule) => { + const ci = columns.findIndex((c) => c.name === rule.column); + if (ci < 0) return true; + const cell = row[ci]; + const str = cell === null || cell === undefined ? "" : String(cell); + switch (rule.operator) { + case "null": return cell === null; + case "notnull": return cell !== null; + case "eq": return str === rule.value; + case "neq": return str !== rule.value; + case "contains": return str.toLowerCase().includes(rule.value.toLowerCase()); + case "starts": return str.toLowerCase().startsWith(rule.value.toLowerCase()); + case "ends": return str.toLowerCase().endsWith(rule.value.toLowerCase()); + case "gt": return Number(str) > Number(rule.value); + case "lt": return Number(str) < Number(rule.value); + default: return true; + } + }), + ); +} + +function applySorts(rows: unknown[][], columns: ColumnInfo[], rules: SortRule[]): unknown[][] { + if (rules.length === 0) return rows; + return [...rows].sort((a, b) => { + for (const rule of rules) { + const ci = columns.findIndex((c) => c.name === rule.column); + if (ci < 0) continue; + const va = a[ci]; + const vb = b[ci]; + const cmp = + va === null && vb === null ? 0 + : va === null ? -1 + : vb === null ? 1 + : String(va).localeCompare(String(vb), undefined, { numeric: true }); + if (cmp !== 0) return rule.order === "asc" ? cmp : -cmp; + } + return 0; + }); +} + +export function DbViewerScreen({ connectionId, onHome, onSettings }: DbViewerScreenProps) { + const { connectionError, connect } = useDbConnection(connectionId); + const [dismissedError, setDismissedError] = useState(null); + const [tablePanelWidth, setTablePanelWidth] = useState(280); + const [hiddenColumns, setHiddenColumns] = useState>(new Set()); + const [filterRules, setFilterRules] = useState([]); + const [sortRules, setSortRules] = useState([]); + const [searchQuery, setSearchQuery] = useState(""); + const smartSortApplied = useRef>(new Set()); + const [selectedRows, setSelectedRows] = useState>(new Set()); + const [editModalOpen, setEditModalOpen] = useState(false); + const connections = useConnectionStore((s) => s.connections); + const currentConnection = connections.find((c) => c.id === connectionId) ?? null; + const settings = useSettingsStore((s) => s.settings); + const setDefaultPageSize = useDbViewerStore((s) => s.setDefaultPageSize); + const clearColumnFilter = useDbViewerStore((s) => s.clearColumnFilter); + + // Sync settings defaults to store + useEffect(() => { + if (settings?.table_page_size) { + setDefaultPageSize(settings.table_page_size); + } + }, [settings?.table_page_size, setDefaultPageSize]); + const panelResizeRef = useRef<{ startX: number; startW: number } | null>(null); + + const activeTab = useDbViewerStore((s) => { + if (!s.activeTabId) return null; + return s.tabs.find((t) => t.id === s.activeTabId) ?? null; + }); + const setTabData = useDbViewerStore((s) => s.setTabData); + const setTabError = useDbViewerStore((s) => s.setTabError); + const databases = useDbViewerStore((s) => s.databases); + const currentDatabase = useDbViewerStore((s) => s.currentDatabase); + const setCurrentDatabase = useDbViewerStore((s) => s.setCurrentDatabase); + const schemas = useDbViewerStore((s) => s.schemas); + const currentSchema = useDbViewerStore((s) => s.currentSchema); + const setCurrentSchema = useDbViewerStore((s) => s.setCurrentSchema); + const fetchingRef = useRef>(new Set()); + + const fetchData = useCallback(async (tab: NonNullable) => { + if (fetchingRef.current.has(tab.id)) return; + fetchingRef.current.add(tab.id); + try { + const result = await cmd.getTableData( + connectionId, + tab.schema, + tab.table, + tab.page, + tab.pageSize, + ); + setTabData(tab.id, result); + } catch (e) { + const msg = e instanceof Error ? e.message : String(e); + setTabError(tab.id, msg); + } finally { + fetchingRef.current.delete(tab.id); + } + }, [connectionId, setTabData, setTabError]); + + // Cmd+W / Ctrl+W: close current tab, or navigate home if no tabs (configurable in Settings → Shortcuts) + useShortcut("close_tab", () => { + const state = useDbViewerStore.getState(); + if (state.activeTabId) { + state.closeTab(state.activeTabId); + } else { + onHome(); + } + }); + useEffect(() => { + if (!activeTab) return; + if (!activeTab.loading) return; + if (activeTab.error) return; + fetchData(activeTab); + }, [activeTab, fetchData]); + + // Smart default sort: apply once when data first loads for a tab + useEffect(() => { + if (!activeTab) return; + if (activeTab.loading) return; + if (!activeTab.data) return; + if (smartSortApplied.current.has(activeTab.id)) return; + + const cols = activeTab.data.columns; + + const getColType = (name: string) => { + const col = cols.find((c) => c.name.toLowerCase() === name.toLowerCase()); + return col?.data_type.toLowerCase() ?? ""; + }; + const isNumeric = (name: string) => { + const t = getColType(name); + return ["integer", "int", "int2", "int4", "int8", "smallint", "bigint", + "serial", "bigserial", "smallserial", "tinyint", "mediumint", + "numeric", "decimal", "real", "float", "float4", "float8", + "double precision", "double", "number"].includes(t); + }; + const isTimestamp = (name: string) => { + const t = getColType(name); + return ["timestamp", "timestamptz", "timestamp without time zone", + "timestamp with time zone", "date", "datetime", "datetime2", + "smalldatetime"].some((pt) => t.includes(pt)); + }; + + // Find the first column name that exists and passes type checks + const findCol = (candidates: string[], numericOnly = false): string | undefined => { + for (const cand of candidates) { + const match = cols.find((c) => c.name.toLowerCase() === cand.toLowerCase()); + if (!match) continue; + if (numericOnly && !isNumeric(match.name)) continue; + return match.name; + } + return undefined; + }; + const findBySuffix = (suffixes: string[], numericOnly = false): string | undefined => { + for (const c of cols) { + const name = c.name.toLowerCase(); + if (suffixes.some((s) => name.endsWith(s))) { + if (numericOnly && !isNumeric(c.name)) continue; + return c.name; + } + } + return undefined; + }; + const findByPrefix = (prefixes: string[], numericOnly = false): string | undefined => { + for (const c of cols) { + const name = c.name.toLowerCase(); + if (prefixes.some((p) => name.startsWith(p))) { + if (numericOnly && !isNumeric(c.name)) continue; + return c.name; + } + } + return undefined; + }; + + // Priority-ordered rules: each returns [columnName | undefined, order] + const rules: Array<() => [string | undefined, "asc" | "desc"]> = [ + // Tier 1: Explicit recency columns + () => [findCol(["updated_at", "modified_at", "changed_at", "altered_at", "revised_at"]), "desc"], + () => [findCol(["created_at", "inserted_at", "added_at", "published_at", "posted_at", "registered_at"]), "desc"], + () => [findCol(["deleted_at", "removed_at", "expired_at", "archived_at"]), "desc"], + // Tier 2: Generic date/timestamp columns (DESC = newest) + () => { + const col = cols.find((c) => isTimestamp(c.name)); + return col ? [col.name, "desc"] : [undefined, "desc"]; + }, + // Tier 3: Any *_at suffix (covers updated_at, created_at, etc. in any casing) + () => [findBySuffix(["_at"]), "desc"], + // Tier 4: Any *_on suffix (e.g. action_on, performed_on) + () => [findBySuffix(["_on"]), "desc"], + // Tier 5: last_* prefix (e.g. last_login, last_seen, last_modified) + () => [findByPrefix(["last_"]), "desc"], + // Tier 6: Numeric ID (DESC = highest/newest) + () => [findCol(["id", "uid", "pk"], true), "desc"], + // Tier 7: Any *_id suffix (numeric FKs usually increment) + () => [findBySuffix(["_id"], true), "desc"], + // Tier 8: Sequence/order columns (ASC = natural order) + () => [findCol(["seq", "sequence", "ordinal", "sort", "sort_order", "sortorder", "position", "pos", "display_order"], true), "asc"], + // Tier 9: Rank/priority (ASC if lower = higher priority, DESC if higher = more) + () => [findCol(["rank", "ranking", "priority", "weight", "score", "rating"], true), "desc"], + // Tier 10: Version/revision tracking (DESC = latest) + () => [findCol(["version", "revision", "rev", "build", "release"], true), "desc"], + // Tier 11: Count/quantity (DESC = most) + () => [findCol(["count", "total", "amount", "quantity", "qty", "num", "number", "no"], true), "desc"], + ]; + + for (const rule of rules) { + const [colName, order] = rule(); + if (colName) { + smartSortApplied.current.add(activeTab.id); + setSortRules([{ id: crypto.randomUUID(), column: colName, order }]); + return; + } + } + }, [activeTab]); + + // Sync tab columnFilter (set by FK popover) into the toolbar filterRules + useEffect(() => { + if (!activeTab?.columnFilter) return; + const { column, value } = activeTab.columnFilter; + setFilterRules((prev) => { + const exists = prev.some((r) => r.column === column && r.value === value); + if (exists) return prev; + return [...prev, { id: crypto.randomUUID(), column, operator: "contains" as const, value }]; + }); + }, [activeTab?.columnFilter]); + + // When the FK filter rule is removed from the toolbar, clear the tab's columnFilter + useEffect(() => { + if (!activeTab?.columnFilter) return; + const { column, value } = activeTab.columnFilter; + const stillExists = filterRules.some((r) => r.column === column && r.value === value); + if (!stillExists) { + clearColumnFilter(activeTab.id); + } + }, [filterRules, activeTab, clearColumnFilter]); + + // Refresh: clear data so auto-fetch effect re-fetches + const handleRefresh = useCallback(() => { + const tabId = useDbViewerStore.getState().activeTabId; + if (!tabId) return; + useDbViewerStore.setState((s) => ({ + tabs: s.tabs.map((t) => + t.id === tabId ? { ...t, loading: true, error: null } : t, + ), + })); + }, []); + + const rawRows = activeTab?.data?.rows ?? []; + const columns = activeTab?.data?.columns ?? []; + const processedRows = useMemo(() => { + let result = rawRows; + result = applyFilters(result, columns, filterRules); + result = applySorts(result, columns, sortRules); + return result; + }, [rawRows, columns, filterRules, sortRules]); + + const onPanelResizeStart = useCallback((e: React.MouseEvent) => { + e.preventDefault(); + panelResizeRef.current = { startX: e.clientX, startW: tablePanelWidth }; + const onMove = (ev: MouseEvent) => { + if (!panelResizeRef.current) return; + const w = Math.max(180, Math.min(600, panelResizeRef.current.startW + (ev.clientX - panelResizeRef.current.startX))); + setTablePanelWidth(w); + }; + const onUp = () => { + panelResizeRef.current = null; + document.removeEventListener("mousemove", onMove); + document.removeEventListener("mouseup", onUp); + }; + document.addEventListener("mousemove", onMove); + document.addEventListener("mouseup", onUp); + }, [tablePanelWidth]); + + const handleNavigate = useCallback( + (view: string) => { + if (view === "home") onHome(); + else if (view === "settings") onSettings(); + }, + [onHome, onSettings], + ); + + const activeSchema = activeTab?.schema ?? ""; + const activeTable = activeTab?.table ?? ""; + + return ( + +
+ +
+ {connectionError && connectionError !== dismissedError && ( + { + setDismissedError(null); + connect(); + }} + onDismiss={() => setDismissedError(connectionError)} + /> + )} +
+
+ setEditModalOpen(true)} + connectionId={connectionId} + searchQuery={searchQuery} + onSearchChange={setSearchQuery} + /> +
+ +
+
+ {/* panel resize handle */} +
setTablePanelWidth(280)} + /> +
+ + {activeTab?.data && ( + + setHiddenColumns((prev) => { + const next = new Set(prev); + if (next.has(col)) next.delete(col); else next.add(col); + return next; + }) + } + onRefresh={handleRefresh} + filterRules={filterRules} + onFilterChange={setFilterRules} + sortRules={sortRules} + onSortChange={setSortRules} + defaultRefreshRate={settings?.table_refresh_rate ?? 0} + selectedCount={selectedRows.size} + selectedRows={processedRows.filter((_, i) => selectedRows.has(i))} + onClearSelection={() => setSelectedRows(new Set())} + /> + )} +
+ +
+
+
+ +
+ {currentConnection && ( + setEditModalOpen(false)} + onSaved={() => {}} + /> + )} +
+ + ); +} \ No newline at end of file diff --git a/src/components/db-viewer/DbViewerSidebar.test.tsx b/src/components/db-viewer/DbViewerSidebar.test.tsx new file mode 100644 index 0000000..3c2af31 --- /dev/null +++ b/src/components/db-viewer/DbViewerSidebar.test.tsx @@ -0,0 +1,41 @@ +import { describe, it, expect, vi } from "vitest"; +import { render, screen } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import { DbViewerSidebar } from "./DbViewerSidebar"; +import { TooltipProvider } from "../ui/Tooltip"; + +describe("DbViewerSidebar", () => { + it("renders all navigation icons", () => { + render( + + {}} /> + + ); + expect(screen.getByLabelText(/home/i)).toBeInTheDocument(); + expect(screen.getByLabelText(/settings/i)).toBeInTheDocument(); + }); + + it("calls onNavigate when home is clicked", async () => { + const user = userEvent.setup(); + const onNavigate = vi.fn(); + render( + + + + ); + await user.click(screen.getByLabelText(/home/i)); + expect(onNavigate).toHaveBeenCalledWith("home"); + }); + + it("calls onNavigate when settings is clicked", async () => { + const user = userEvent.setup(); + const onNavigate = vi.fn(); + render( + + + + ); + await user.click(screen.getByLabelText(/settings/i)); + expect(onNavigate).toHaveBeenCalledWith("settings"); + }); +}); \ No newline at end of file diff --git a/src/components/db-viewer/DbViewerSidebar.tsx b/src/components/db-viewer/DbViewerSidebar.tsx new file mode 100644 index 0000000..ecfbfcc --- /dev/null +++ b/src/components/db-viewer/DbViewerSidebar.tsx @@ -0,0 +1,57 @@ +import { Database, Grid2x2, FunctionSquare, GitBranch, Home, Settings } from "lucide-react"; +import { Tooltip } from "../ui/Tooltip"; + +export interface DbViewerSidebarProps { + currentView: string; + onNavigate: (view: string) => void; +} + +interface NavItem { + id: string; + label: string; + icon: React.ReactNode; + stub?: boolean; +} + +export function DbViewerSidebar({ currentView, onNavigate }: DbViewerSidebarProps) { + const topItems: NavItem[] = [ + { id: "db-viewer", label: "Explorer", icon: }, + { id: "schema-visualizer", label: "Schema Visualizer coming soon", icon: , stub: true }, + { id: "functions", label: "Functions coming soon", icon: , stub: true }, + { id: "triggers", label: "Triggers coming soon", icon: , stub: true }, + ]; + + const bottomItems: NavItem[] = [ + { id: "home", label: "Home", icon: }, + { id: "settings", label: "Settings", icon: }, + ]; + + function renderItem(item: NavItem) { + const isActive = currentView === item.id; + const baseClass = "w-10 h-10 flex items-center justify-center rounded-lg transition-colors focus:outline-none focus:ring-2 focus:ring-accent/50"; + const activeClass = "text-accent"; + const inactiveClass = "text-text-muted hover:text-text hover:bg-surface-raised"; + const stubClass = "opacity-40 cursor-not-allowed"; + + return ( + + + + ); + } + + return ( +
+
{topItems.map(renderItem)}
+
{bottomItems.map(renderItem)}
+
+ ); +} \ No newline at end of file diff --git a/src/components/db-viewer/DbViewerToolbar.test.tsx b/src/components/db-viewer/DbViewerToolbar.test.tsx new file mode 100644 index 0000000..8c24814 --- /dev/null +++ b/src/components/db-viewer/DbViewerToolbar.test.tsx @@ -0,0 +1,54 @@ +import { describe, it, expect, beforeEach } from "vitest"; +import { render, screen } from "@testing-library/react"; +import { DbViewerToolbar } from "./DbViewerToolbar"; +import { useDbViewerStore } from "../../stores/dbViewerStore"; +import { TooltipProvider } from "../ui/Tooltip"; + +const defaultProps = { + databases: [] as string[], + currentDatabase: null as string | null, + setCurrentDatabase: () => {}, + schemas: [] as string[], + currentSchema: null as string | null, + setCurrentSchema: () => {}, + searchQuery: "", + onSearchChange: () => {}, +}; + +describe("DbViewerToolbar", () => { + beforeEach(() => { + useDbViewerStore.getState().reset(); + }); + + it("renders Tables label", () => { + render( + + + , + ); + expect(screen.getByText("Tables")).toBeInTheDocument(); + }); + + it("renders database dropdown when multiple databases", () => { + render( + + + , + ); + expect(screen.getByText("mydb")).toBeInTheDocument(); + }); + + it("renders refresh and create table buttons", () => { + render( + + + , + ); + expect(screen.getByLabelText(/refresh/i)).toBeInTheDocument(); + expect(screen.getByLabelText(/create table/i)).toBeInTheDocument(); + }); +}); \ No newline at end of file diff --git a/src/components/db-viewer/DbViewerToolbar.tsx b/src/components/db-viewer/DbViewerToolbar.tsx new file mode 100644 index 0000000..14454a2 --- /dev/null +++ b/src/components/db-viewer/DbViewerToolbar.tsx @@ -0,0 +1,195 @@ +import { RefreshCw, Plus, Search, Pencil, Check, AlertCircle, X } from "lucide-react"; +import { useState, useCallback, useRef, useEffect } from "react"; +import { SelectDropdown } from "../ui/SelectDropdown"; +import { Tooltip } from "../ui/Tooltip"; +import { useDbViewerStore } from "../../stores/dbViewerStore"; +import * as cmd from "../../lib/commands"; + +export function DbViewerToolbar({ + databases, + currentDatabase, + setCurrentDatabase, + schemas, + currentSchema, + setCurrentSchema, + onEdit, + connectionId, + searchQuery, + onSearchChange, +}: { + databases: string[]; + currentDatabase: string | null; + setCurrentDatabase: (db: string | null) => void; + schemas: string[]; + currentSchema: string | null; + setCurrentSchema: (schema: string | null) => void; + onEdit?: () => void; + connectionId?: string; + searchQuery: string; + onSearchChange: (q: string) => void; +}) { + const [searchOpen, setSearchOpen] = useState(false); + const [refreshing, setRefreshing] = useState(false); + const [result, setResult] = useState<'idle' | 'success' | 'error'>('idle'); + const resultTimer = useRef | null>(null); + const searchInputRef = useRef(null); + const searchContainerRef = useRef(null); + const populate = useDbViewerStore((s) => s.populate); + + // Focus input when search opens + useEffect(() => { + if (searchOpen && searchInputRef.current) { + searchInputRef.current.focus(); + } + }, [searchOpen]); + + // Auto-hide on blur when empty + const handleSearchBlur = useCallback(() => { + // Small delay to allow clicks on clear button / search icon + setTimeout(() => { + if (!searchQuery.trim()) { + setSearchOpen(false); + } + }, 150); + }, [searchQuery]); + + const toggleSearch = useCallback(() => { + setSearchOpen((prev) => { + const next = !prev; + if (!next) onSearchChange(""); // clear when closing + return next; + }); + }, [onSearchChange]); + + // Cleanup result timer on unmount + useEffect(() => { + return () => { if (resultTimer.current) clearTimeout(resultTimer.current); }; + }, []); + + const handleRefresh = useCallback(async () => { + if (!connectionId || refreshing) return; + setRefreshing(true); + setResult('idle'); + try { + const dbs = await cmd.getDatabases(connectionId); + const scs = await cmd.getSchemas(connectionId); + const tbls = await cmd.getTables(connectionId); + populate(dbs, scs, tbls); + setResult('success'); + } catch { + setResult('error'); + } finally { + setRefreshing(false); + resultTimer.current = setTimeout(() => setResult('idle'), 1500); + } + }, [connectionId, refreshing, populate]); + + return ( +
+
+ Tables +
+ {onEdit && ( + + + + )} + + + + + + + + + +
+
+ {/* Search input */} +
+
+ + onSearchChange(e.target.value)} + onBlur={handleSearchBlur} + placeholder="Filter tables…" + className="w-full bg-transparent border-0 border-b border-border pl-8 pr-7 py-1.5 text-xs text-text placeholder:text-text-muted/60 outline-none focus:border-accent/50 transition-colors" + /> + {searchQuery && ( + + )} +
+
+ {(databases.length > 1 || schemas.length > 1) && ( +
+ {databases.length > 1 && ( + ({ value: d, label: d }))} + placeholder="Select database" + aria-label="Select database" + variant="ghost" + /> + )} + {databases.length > 1 && schemas.length > 1 && ( + | + )} + {schemas.length > 1 && ( + ({ value: s, label: s }))} + placeholder="Select schema" + aria-label="Select schema" + variant="ghost" + /> + )} +
+ )} +
+ ); +} \ No newline at end of file diff --git a/src/components/db-viewer/EditConnectionModal.tsx b/src/components/db-viewer/EditConnectionModal.tsx new file mode 100644 index 0000000..c991e35 --- /dev/null +++ b/src/components/db-viewer/EditConnectionModal.tsx @@ -0,0 +1,123 @@ +import { useState, useCallback } from "react"; +import { AnimatedModal } from "../ui/AnimatedModal"; +import { Button } from "../ui/Button"; +import { DetailedConnectionForm } from "../connections/DetailedConnectionForm"; +import { useConnectionStore } from "../../stores/connectionStore"; +import { useNotificationStore } from "../../stores/notificationStore"; +import { updateConnection, testConnection, saveConnectionPassword } from "../../lib/commands"; +import type { Connection, ConnectionInput } from "../../lib/types"; +import type { ConnectionFormData } from "../connections/connectionFormData"; + +interface EditConnectionModalProps { + connection: Connection; + open: boolean; + onClose: () => void; + onSaved: (updated: Connection) => void; +} + +export function EditConnectionModal({ + connection, + open, + onClose, + onSaved, +}: EditConnectionModalProps) { + const [form, setForm] = useState(() => ({ + name: connection.name, + environment: (connection.environment as ConnectionFormData["environment"]) ?? null, + folder_id: connection.folder_id, + tag_ids: [...connection.tag_ids], + connection_string: "", + db_type: connection.db_type, + host: connection.host, + port: connection.port, + username: connection.username, + password: null, + database: connection.database ?? null, + use_keychain: false, + })); + const [saving, setSaving] = useState(false); + const [testing, setTesting] = useState(false); + const loadAll = useConnectionStore((s) => s.loadAll); + const notify = useNotificationStore((s) => s.notify); + + const handleSave = useCallback(async () => { + if (!form.name.trim()) return; + setSaving(true); + try { + const input: ConnectionInput = { + name: form.name, + db_type: form.db_type, + host: form.host, + port: form.port, + username: form.username, + password: form.password, + database: form.database, + folder_id: form.folder_id, + environment: form.environment, + tag_ids: form.tag_ids, + }; + const updated = await updateConnection(connection.id, input); + if (form.password) { + await saveConnectionPassword(connection.id, form.password).catch(() => {}); + } + notify("Connection updated", "success"); + onSaved(updated); + onClose(); + loadAll(); + } catch (e) { + notify(`Failed to update: ${e instanceof Error ? e.message : e}`, "error"); + } finally { + setSaving(false); + } + }, [form, connection.id, notify, onSaved, onClose, loadAll]); + + const handleTest = useCallback(async () => { + setTesting(true); + try { + // Fetch password from keychain if not provided in form + let password = form.password; + if (!password) { + password = await useConnectionStore.getState().getConnectionPassword(connection.id).catch(() => null); + } + + const result = await testConnection({ + name: form.name, + db_type: form.db_type, + host: form.host, + port: form.port, + username: form.username, + password, + database: form.database, + folder_id: form.folder_id, + environment: form.environment, + tag_ids: form.tag_ids, + }); + if (result.ok) { + notify("Connection successful", "success"); + } else { + notify(result.error ?? "Connection failed", "error"); + } + } catch (e) { + notify(`Test failed: ${e instanceof Error ? e.message : e}`, "error"); + } finally { + setTesting(false); + } + }, [form, notify, connection.id]); + + return ( + +
+

Edit Connection

+ setForm((prev) => ({ ...prev, ...updates }))} /> +
+ + +
+
+
+ ); +} \ No newline at end of file diff --git a/src/components/db-viewer/FkPreviewPopover.tsx b/src/components/db-viewer/FkPreviewPopover.tsx new file mode 100644 index 0000000..37df6a1 --- /dev/null +++ b/src/components/db-viewer/FkPreviewPopover.tsx @@ -0,0 +1,211 @@ +import { useEffect, useRef, useState } from "react"; +import { createPortal } from "react-dom"; +import { Key, X, ExternalLink, Loader2 } from "lucide-react"; +import * as cmd from "../../lib/commands"; +import type { QueryResult } from "../../lib/types"; +import { abbreviateType } from "../../lib/utils"; +import { useDbViewerStore } from "../../stores/dbViewerStore"; + +interface FkPreviewPopoverProps { + connectionId: string; + schema: string; + table: string; + column: string; + value: string; + anchorRect: DOMRect | null; + onClose: () => void; +} + +export function FkPreviewPopover({ + connectionId, + schema, + table, + column, + value, + anchorRect, + onClose, +}: FkPreviewPopoverProps) { + const [data, setData] = useState(null); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + const popoverRef = useRef(null); + + const openTab = useDbViewerStore((s) => s.openTab); + const setColumnFilter = useDbViewerStore((s) => s.setColumnFilter); + + const handleOpen = () => { + openTab(schema, table); + // Find the newly created tab and apply the column filter + const newTab = useDbViewerStore.getState().tabs.find( + (t) => t.schema === schema && t.table === table, + ); + if (newTab) { + setColumnFilter(newTab.id, column, value); + } + onClose(); + }; + + // Fetch the referenced row + useEffect(() => { + let cancelled = false; + setLoading(true); + setError(null); + cmd + .getFkPreview(connectionId, schema, table, column, value) + .then((result) => { + if (!cancelled) { + setData(result); + setLoading(false); + } + }) + .catch((e: any) => { + if (!cancelled) { + setError(String(e)); + setLoading(false); + } + }); + return () => { + cancelled = true; + }; + }, [connectionId, schema, table, column, value]); + + // Close on Escape + useEffect(() => { + const onKey = (e: KeyboardEvent) => { + if (e.key === "Escape") onClose(); + }; + document.addEventListener("keydown", onKey); + return () => document.removeEventListener("keydown", onKey); + }, [onClose]); + + // Close on outside click + useEffect(() => { + const onClick = (e: MouseEvent) => { + if (popoverRef.current && !popoverRef.current.contains(e.target as Node)) { + onClose(); + } + }; + // Delay to avoid closing immediately from the same click that opened it + const id = setTimeout(() => document.addEventListener("mousedown", onClick), 0); + return () => { + clearTimeout(id); + document.removeEventListener("mousedown", onClick); + }; + }, [onClose]); + + if (!anchorRect) return null; + + // Compute position to keep popover within viewport + const popoverWidth = 360; + const popoverMaxHeight = 320; + const gap = 8; + let left = anchorRect.left; + let top = anchorRect.bottom + gap; + + // Flip horizontally if off-screen + if (left + popoverWidth > window.innerWidth - 16) { + left = Math.max(16, window.innerWidth - popoverWidth - 16); + } + // Flip vertically if not enough space below + if (top + popoverMaxHeight > window.innerHeight - 16) { + top = anchorRect.top - popoverMaxHeight - gap; + if (top < 16) top = 16; + } + + return createPortal( +
+ {/* Header */} +
+
+ + + {schema}.{table} + +
+
+ + +
+
+ + {/* Body */} +
+ {loading && ( +
+ + Loading... +
+ )} + {error && ( +
+ {error} +
+ )} + {data && data.rows.length === 0 && !loading && ( +
+ No matching row found +
+ )} + {data && data.rows.length > 0 && ( + + + {data.columns.map((col, ci) => { + const cell = data.rows[0][ci]; + const isNull = cell === null || cell === undefined; + return ( + + + + + ); + })} + +
+
+ {col.is_pk && } + {col.is_fk && } + {col.name} + + {abbreviateType(col.data_type)} + +
+
+ {isNull ? ( + NULL + ) : ( + {String(cell)} + )} +
+ )} +
+
, + document.body, + ); +} \ No newline at end of file diff --git a/src/components/db-viewer/JsonCellPopover.tsx b/src/components/db-viewer/JsonCellPopover.tsx new file mode 100644 index 0000000..2e6de40 --- /dev/null +++ b/src/components/db-viewer/JsonCellPopover.tsx @@ -0,0 +1,163 @@ +import { useState, useRef, useEffect } from "react"; +import { createPortal } from "react-dom"; +import { Braces, Copy, Check, X } from "lucide-react"; + +interface JsonCellPopoverProps { + value: unknown; + anchorRect: DOMRect | null; + onClose: () => void; +} + +function safeJsonParse(value: unknown): object | null { + if (typeof value === "object" && value !== null) return value as object; + if (typeof value !== "string") return null; + try { + const parsed = JSON.parse(value); + return typeof parsed === "object" && parsed !== null ? parsed : null; + } catch { + return null; + } +} + +function formatJson(obj: object): string { + try { + return JSON.stringify(obj, null, 2); + } catch { + return String(obj); + } +} + +export function JsonCellPopover({ value, anchorRect, onClose }: JsonCellPopoverProps) { + const [tab, setTab] = useState<"formatted" | "raw">("formatted"); + const [copied, setCopied] = useState(false); + const popoverRef = useRef(null); + + const parsed = safeJsonParse(value); + const rawText = typeof value === "string" ? value : JSON.stringify(value); + const formattedText = parsed ? formatJson(parsed) : rawText; + + // Close on Escape + useEffect(() => { + const onKey = (e: KeyboardEvent) => { + if (e.key === "Escape") onClose(); + }; + document.addEventListener("keydown", onKey); + return () => document.removeEventListener("keydown", onKey); + }, [onClose]); + + // Close on outside click + useEffect(() => { + const onClick = (e: MouseEvent) => { + if (popoverRef.current && !popoverRef.current.contains(e.target as Node)) { + onClose(); + } + }; + const id = setTimeout(() => document.addEventListener("mousedown", onClick), 0); + return () => { + clearTimeout(id); + document.removeEventListener("mousedown", onClick); + }; + }, [onClose]); + + if (!anchorRect) return null; + + const popoverWidth = 420; + const popoverMaxHeight = 360; + const gap = 8; + let left = anchorRect.left; + let top = anchorRect.bottom + gap; + + if (left + popoverWidth > window.innerWidth - 16) { + left = Math.max(16, window.innerWidth - popoverWidth - 16); + } + if (top + popoverMaxHeight > window.innerHeight - 16) { + top = anchorRect.top - popoverMaxHeight - gap; + if (top < 16) top = 16; + } + + const handleCopy = async () => { + const text = tab === "formatted" ? formattedText : rawText; + await navigator.clipboard.writeText(text); + setCopied(true); + setTimeout(() => setCopied(false), 2000); + }; + + return createPortal( +
+ {/* Header */} +
+
+ + JSON +
+
+ {/* Tabs */} +
+ + +
+ {/* Copy */} + + {/* Close */} + +
+
+ + {/* Body */} +
+
+          {tab === "formatted" ? formattedText : rawText}
+        
+
+
, + document.body, + ); +} + +/** Extract a brief label for the collapsed JSON preview shown in the cell. */ +export function jsonPreview(value: unknown): { label: string; isJson: boolean } { + const parsed = safeJsonParse(value); + if (!parsed) return { label: "", isJson: false }; + if (Array.isArray(parsed)) { + return { label: `[ ${parsed.length} item${parsed.length !== 1 ? "s" : ""} ]`, isJson: true }; + } + const keys = Object.keys(parsed); + return { label: `{ ${keys.length} key${keys.length !== 1 ? "s" : ""} }`, isJson: true }; +} \ No newline at end of file diff --git a/src/components/db-viewer/TabBar.test.tsx b/src/components/db-viewer/TabBar.test.tsx new file mode 100644 index 0000000..4dab48a --- /dev/null +++ b/src/components/db-viewer/TabBar.test.tsx @@ -0,0 +1,55 @@ +import { describe, it, expect, beforeEach } from "vitest"; +import { render, screen } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import { TabBar } from "./TabBar"; +import { useDbViewerStore } from "../../stores/dbViewerStore"; + +const user = userEvent.setup(); + +describe("TabBar", () => { + beforeEach(() => { + useDbViewerStore.getState().reset(); + }); + + it("shows empty state when no tabs", () => { + render(); + expect(screen.getByText(/No tables open/i)).toBeInTheDocument(); + }); + + it("renders open tab names", () => { + useDbViewerStore.getState().openTab("public", "users"); + useDbViewerStore.getState().openTab("public", "posts", true); + + render(); + expect(screen.getByText("users")).toBeInTheDocument(); + expect(screen.getByText("posts")).toBeInTheDocument(); + }); + + it("sets active tab when clicked", async () => { + const store = useDbViewerStore.getState(); + store.openTab("public", "users"); + store.openTab("public", "posts", true); + const firstTabId = useDbViewerStore.getState().tabs[0].id; + + render(); + await user.click(screen.getByText("users")); + expect(useDbViewerStore.getState().activeTabId).toBe(firstTabId); + }); + + it("closes tab when close button clicked", async () => { + useDbViewerStore.getState().openTab("public", "users"); + useDbViewerStore.getState().openTab("public", "posts", true); + const firstTabId = useDbViewerStore.getState().tabs[0].id; + + render(); + const closeButton = screen.getByRole("button", { + name: /close users/i, + }); + await user.click(closeButton); + + expect(useDbViewerStore.getState().tabs).toHaveLength(1); + expect( + useDbViewerStore.getState().tabs.find((t) => t.id === firstTabId), + ).toBeUndefined(); + }); +}); \ No newline at end of file diff --git a/src/components/db-viewer/TabBar.tsx b/src/components/db-viewer/TabBar.tsx new file mode 100644 index 0000000..d1a7902 --- /dev/null +++ b/src/components/db-viewer/TabBar.tsx @@ -0,0 +1,60 @@ +import { X } from "lucide-react"; +import { useDbViewerStore } from "../../stores/dbViewerStore"; + +export function TabBar() { + const tabs = useDbViewerStore((state) => state.tabs); + const activeTabId = useDbViewerStore((state) => state.activeTabId); + const closeTab = useDbViewerStore((state) => state.closeTab); + const setActiveTab = useDbViewerStore((state) => state.setActiveTab); + + if (tabs.length === 0) { + return ( +
+ No tables open +
+ ); + } + + return ( +
+ {tabs.map((tab) => { + const isActive = tab.id === activeTabId; + return ( +
+ + +
+ ); + })} +
+ ); +} \ No newline at end of file diff --git a/src/components/db-viewer/TableControls.tsx b/src/components/db-viewer/TableControls.tsx new file mode 100644 index 0000000..db27223 --- /dev/null +++ b/src/components/db-viewer/TableControls.tsx @@ -0,0 +1,875 @@ +import { useState, useRef, useEffect } from "react"; +import { + Plus, RefreshCw, Clock, Filter, ArrowUpDown, Download, + Columns, Check, ChevronLeft, ChevronRight, X, Trash2, + ChevronDown, FileJson, FileText, Terminal, +} from "lucide-react"; +import { useDbViewerStore } from "../../stores/dbViewerStore"; +import { Tooltip } from "../ui/Tooltip"; +import type { ColumnInfo } from "../../lib/types"; + +const AUTO_REFRESH_OPTIONS = [ + { label: "Off", value: 0 }, + { label: "5s", value: 5000 }, + { label: "10s", value: 10_000 }, + { label: "30s", value: 30_000 }, + { label: "1m", value: 60_000 }, + { label: "5m", value: 300_000 }, +] as const; + +const PAGE_SIZES = [50, 100, 200] as const; + +const EXPORT_FORMATS = [ + { label: "JSON", ext: "json" }, + { label: "CSV", ext: "csv" }, + { label: "SQL", ext: "sql" }, + { label: "Markdown", ext: "md" }, +] as const; + +type FilterRule = { + id: string; + column: string; + operator: "eq" | "neq" | "contains" | "starts" | "ends" | "gt" | "lt" | "null" | "notnull"; + value: string; +}; + +type SortRule = { + id: string; + column: string; + order: "asc" | "desc"; +}; + +// ─── helpers ──────────────────────────────────────────── + +function exportData( + rows: unknown[][], + columns: ColumnInfo[], + format: string, + tableName: string, +) { + const headers = columns.map((c) => c.name); + let content: string; + let mime: string; + + switch (format) { + case "json": { + const jsonRows = rows.map((row) => { + const obj: Record = {}; + columns.forEach((c, i) => { obj[c.name] = row[i] ?? null; }); + return obj; + }); + content = JSON.stringify(jsonRows, null, 2); + mime = "application/json"; + break; + } + case "csv": { + const csvRows = [headers.map((h) => `"${h.replace(/"/g, '""')}"`).join(",")]; + for (const row of rows) { + csvRows.push( + row.map((cell) => { + const s = cell === null || cell === undefined ? "" : String(cell); + return `"${s.replace(/"/g, '""')}"`; + }).join(","), + ); + } + content = csvRows.join("\n"); + mime = "text/csv"; + break; + } + case "sql": { + const lines = [`-- ${tableName}`]; + for (const row of rows) { + const vals = row.map((cell) => + cell === null ? "NULL" + : typeof cell === "number" ? String(cell) + : `'${String(cell).replace(/'/g, "''")}'`, + ); + lines.push(`INSERT INTO ${tableName} (${headers.join(", ")}) VALUES (${vals.join(", ")});`); + } + content = lines.join("\n"); + mime = "application/sql"; + break; + } + case "md": { + const mdRows = [`| ${headers.join(" | ")} |`, `| ${headers.map(() => "---").join(" | ")} |`]; + for (const row of rows) { + mdRows.push(`| ${row.map((cell) => cell === null ? "*NULL*" : String(cell)).join(" | ")} |`); + } + content = mdRows.join("\n"); + mime = "text/markdown"; + break; + } + default: + return; + } + + const blob = new Blob([content], { type: mime }); + const url = URL.createObjectURL(blob); + const a = document.createElement("a"); + a.href = url; + a.download = `${tableName}.${format === "md" ? "md" : format}`; + a.click(); + URL.revokeObjectURL(url); +} + +// ─── sub-components ───────────────────────────────────── + +function DropdownMenu({ + open, + setOpen, + align, + children, +}: { + open: boolean; + setOpen: (v: boolean) => void; + align?: "left" | "right"; + children: React.ReactNode; +}) { + const ref = useRef(null); + useEffect(() => { + if (!open) return; + const close = (e: MouseEvent) => { + if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false); + }; + document.addEventListener("mousedown", close); + return () => document.removeEventListener("mousedown", close); + }, [open, setOpen]); + + if (!open) return null; + return ( +
+ {children} +
+ ); +} + +function FilterModal({ + columns, + rules, + onChange, + open, + setOpen, +}: { + columns: ColumnInfo[]; + rules: FilterRule[]; + onChange: (rules: FilterRule[]) => void; + open: boolean; + setOpen: (v: boolean) => void; +}) { + const ref = useRef(null); + useEffect(() => { + if (!open) return; + const close = (e: MouseEvent) => { + if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false); + }; + document.addEventListener("mousedown", close); + return () => document.removeEventListener("mousedown", close); + }, [open, setOpen]); + + if (!open) return null; + + const addRule = () => { + onChange([ + ...rules, + { id: crypto.randomUUID(), column: columns[0]?.name ?? "", operator: "contains", value: "" }, + ]); + }; + + const removeRule = (id: string) => onChange(rules.filter((r) => r.id !== id)); + const updateRule = (id: string, patch: Partial) => + onChange(rules.map((r) => (r.id === id ? { ...r, ...patch } : r))); + + return ( +
+
+ Column Filters + +
+ {rules.map((rule) => ( +
+ + + {rule.operator !== "null" && rule.operator !== "notnull" && ( + updateRule(rule.id, { value: e.target.value })} + placeholder="value" + className="flex-1 rounded border border-border bg-surface text-xs px-1.5 py-1 text-text min-w-0" + /> + )} + +
+ ))} + +
+ ); +} + +function SortModal({ + columns, + rules, + onChange, + open, + setOpen, +}: { + columns: ColumnInfo[]; + rules: SortRule[]; + onChange: (rules: SortRule[]) => void; + open: boolean; + setOpen: (v: boolean) => void; +}) { + const ref = useRef(null); + useEffect(() => { + if (!open) return; + const close = (e: MouseEvent) => { + if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false); + }; + document.addEventListener("mousedown", close); + return () => document.removeEventListener("mousedown", close); + }, [open, setOpen]); + + if (!open) return null; + + const addRule = () => { + onChange([ + ...rules, + { id: crypto.randomUUID(), column: columns[0]?.name ?? "", order: "asc" }, + ]); + }; + + const removeRule = (id: string) => onChange(rules.filter((r) => r.id !== id)); + const updateRule = (id: string, patch: Partial) => + onChange(rules.map((r) => (r.id === id ? { ...r, ...patch } : r))); + + return ( +
+
+ Sort Rules + +
+ {rules.map((rule) => ( +
+ + + +
+ ))} + +
+ ); +} + +// ─── bulk actions dropdown ────────────────────────────── + +function BulkActionsDropdown({ + columns, + selectedRows, + schema, + table, + onClearSelection, +}: { + columns: ColumnInfo[]; + selectedRows: unknown[][]; + schema: string; + table: string; + onClearSelection: () => void; +}) { + const [open, setOpen] = useState(false); + const addChange = useDbViewerStore((s) => s.addChange); + + const copyToClipboard = (text: string) => { + navigator.clipboard.writeText(text).catch(() => {}); + setOpen(false); + }; + + const handleCopyJSON = () => { + const json = selectedRows.map((row) => { + const obj: Record = {}; + columns.forEach((c, i) => { obj[c.name] = row[i] ?? null; }); + return obj; + }); + copyToClipboard(JSON.stringify(json, null, 2)); + }; + + const handleCopyCSV = () => { + const headers = columns.map((c) => c.name); + const csvRows = [headers.map((h) => `"${h.replace(/"/g, '""')}"`).join(",")]; + for (const row of selectedRows) { + csvRows.push( + row.map((cell) => { + const s = cell === null || cell === undefined ? "" : String(cell); + return `"${s.replace(/"/g, '""')}"`; + }).join(","), + ); + } + copyToClipboard(csvRows.join("\n")); + }; + + const handleCopySQL = () => { + const headers = columns.map((c) => c.name); + const lines: string[] = []; + for (const row of selectedRows) { + const vals = row.map((cell) => + cell === null ? "NULL" + : typeof cell === "number" ? String(cell) + : `'${String(cell).replace(/'/g, "''")}'`, + ); + lines.push(`INSERT INTO ${schema}.${table} (${headers.join(", ")}) VALUES (${vals.join(", ")});`); + } + copyToClipboard(lines.join("\n")); + }; + + const handleDeleteSelected = () => { + const pkCol = columns.find((c) => c.is_pk); + for (const row of selectedRows) { + const pk: Record = {}; + if (pkCol) { + const ci = columns.findIndex((c) => c.name === pkCol.name); + if (ci >= 0) pk[pkCol.name] = row[ci] ?? null; + } + addChange({ + type: "delete", + schema, + table, + primaryKey: pk, + oldData: Object.fromEntries(columns.map((c, i) => [c.name, row[i] ?? null])), + description: `Delete row from ${table}`, + }); + } + setOpen(false); + onClearSelection(); + }; + + return ( +
+ + + + + +
+ + +
+ ); +} + +// ─── main component ───────────────────────────────────── + +interface TableControlsProps { + connectionId: string; + schema: string; + table: string; + columns: ColumnInfo[]; + rows: unknown[][]; + hiddenColumns: Set; + onToggleColumn: (col: string) => void; + onRefresh: () => void; + filterRules: FilterRule[]; + onFilterChange: (rules: FilterRule[]) => void; + sortRules: SortRule[]; + onSortChange: (rules: SortRule[]) => void; + selectedCount: number; + selectedRows: unknown[][]; + onClearSelection: () => void; + defaultRefreshRate?: number; +} + +export function TableControls({ + connectionId: _connectionId, + schema, + table, + columns, + rows, + hiddenColumns, + onToggleColumn, + onRefresh, + filterRules, + onFilterChange, + sortRules, + onSortChange, + selectedCount, + selectedRows, + onClearSelection, + defaultRefreshRate = 0, +}: TableControlsProps) { + const tabs = useDbViewerStore((s) => s.tabs); + const activeTabId = useDbViewerStore((s) => s.activeTabId); + const setPage = useDbViewerStore((s) => s.setPage); + const setPageSize = useDbViewerStore((s) => s.setPageSize); + const openTab = useDbViewerStore((s) => s.openTab); + const addChange = useDbViewerStore((s) => s.addChange); + const changesQueue = useDbViewerStore((s) => s.changesQueue); + const cancelChange = useDbViewerStore((s) => s.cancelChange); + + const activeTab = tabs.find((t) => t.id === activeTabId); + + // local state + const [filterOpen, setFilterOpen] = useState(false); + const [sortOpen, setSortOpen] = useState(false); + const [columnMenuOpen, setColumnMenuOpen] = useState(false); + const [exportOpen, setExportOpen] = useState(false); + const [queueOpen, setQueueOpen] = useState(false); + const [autoRefresh, setAutoRefresh] = useState(defaultRefreshRate); + const [autoRefreshOpen, setAutoRefreshOpen] = useState(false); + + // auto-refresh timer + useEffect(() => { + if (autoRefresh === 0) return; + const id = setInterval(onRefresh, autoRefresh); + return () => clearInterval(id); + }, [autoRefresh, onRefresh]); + + // pagination + const totalRows = activeTab?.data?.total_rows ?? rows.length; + const pageSize = activeTab?.pageSize ?? 50; + const currentPage = activeTab?.page ?? 1; + const totalPages = Math.max(1, Math.ceil(totalRows / pageSize)); + const clampedPage = Math.max(1, Math.min(currentPage, totalPages)); + const startRow = (clampedPage - 1) * pageSize + 1; + const endRow = Math.min(clampedPage * pageSize, totalRows); + + const handlePrev = () => { + if (clampedPage > 1 && activeTabId) setPage(activeTabId, clampedPage - 1); + }; + const handleNext = () => { + if (clampedPage < totalPages && activeTabId) setPage(activeTabId, clampedPage + 1); + }; + + const handlePageSizeChange = (e: React.ChangeEvent) => { + if (activeTabId) setPageSize(activeTabId, Number(e.target.value)); + }; + + const handleInsertRow = () => { + const newData: Record = {}; + columns.forEach((c) => { newData[c.name] = null; }); + addChange({ + type: "insert", + schema, + table, + primaryKey: {}, + newData, + description: `Insert row into ${table}`, + }); + openTab(schema, table); + }; + + const handleExport = (format: string) => { + exportData(rows, columns, format, table); + setExportOpen(false); + }; + + return ( +
+ {/* ── left side ──────────────────────────────── */} +
+ {/* Insert Row */} + + + + + {/* Refresh */} + + + + + {/* Auto-refresh */} +
+ 0 ? `${autoRefresh / 1000}s` : "Off"}`} side="bottom"> + + + + {AUTO_REFRESH_OPTIONS.map((opt) => ( + + ))} + +
+ +
+ + {/* Filter */} +
+ + + + +
+ + {/* Sort */} +
+ + + + +
+ + {/* Export */} +
+ + + + + {EXPORT_FORMATS.map((fmt) => ( + + ))} + +
+
+ + {/* ── spacer ──────────────────────────────────── */} +
+ + {/* ── right side ─────────────────────────────── */} +
+ {/* Action queue button */} +
+ + +
+ Changes Queue ({changesQueue.filter((c) => c.status === "pending").length} pending) +
+
+ {changesQueue.length === 0 && ( +
No changes queued
+ )} + {changesQueue.map((item) => ( +
+ + + {item.type.toUpperCase()} {item.table} + {item.description && — {item.description}} + + {item.status === "pending" && ( + + )} +
+ ))} +
+
+
+ {/* Selected count + bulk actions */} + {selectedCount > 0 && ( + <> + + {selectedCount} selected + + + +
+ + )} + + {/* Columns toggle */} +
+ + + + +
Visible columns
+
+ {columns.map((col) => ( + + ))} +
+
+
+ +
+ + {/* Row count */} + + {startRow}-{endRow} of {totalRows} + + + {/* Page size */} + + + {/* Pagination */} +
+ + + {clampedPage}/{totalPages} + + +
+
+
+ ); +} \ No newline at end of file diff --git a/src/components/db-viewer/TableOverflowMenu.test.tsx b/src/components/db-viewer/TableOverflowMenu.test.tsx new file mode 100644 index 0000000..94ab6b2 --- /dev/null +++ b/src/components/db-viewer/TableOverflowMenu.test.tsx @@ -0,0 +1,37 @@ +import { describe, it, expect, vi, beforeEach } from "vitest"; +import { render, screen } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import { TableOverflowMenu } from "./TableOverflowMenu"; + +describe("TableOverflowMenu", () => { + beforeEach(() => { + Object.defineProperty(navigator, "clipboard", { + value: { writeText: vi.fn() }, + configurable: true, + writable: true, + }); + }); + + it("renders menu trigger button", () => { + render( "tab-1"} />); + expect(screen.getByLabelText(/table options/i)).toBeInTheDocument(); + }); + + it("shows menu options on click", async () => { + const user = userEvent.setup(); + render( "tab-1"} />); + await user.click(screen.getByLabelText(/table options/i)); + expect(screen.getByText("Open in new tab")).toBeInTheDocument(); + expect(screen.getByText("Copy table schema")).toBeInTheDocument(); + expect(screen.getByText("Export data (CSV)")).toBeInTheDocument(); + }); + + it("fires onOpenTab when menu item clicked", async () => { + const user = userEvent.setup(); + const onOpenTab = vi.fn().mockReturnValue("tab-1"); + render(); + await user.click(screen.getByLabelText(/table options/i)); + await user.click(screen.getByText("Open in new tab")); + expect(onOpenTab).toHaveBeenCalledWith("public", "users", true); + }); +}); \ No newline at end of file diff --git a/src/components/db-viewer/TableOverflowMenu.tsx b/src/components/db-viewer/TableOverflowMenu.tsx new file mode 100644 index 0000000..087fe21 --- /dev/null +++ b/src/components/db-viewer/TableOverflowMenu.tsx @@ -0,0 +1,140 @@ +import { useEffect, useRef, useState } from "react"; +import { MoreVertical } from "lucide-react"; +import { ConfirmDialog } from "../ui/ConfirmDialog"; + +interface TableOverflowMenuProps { + schema: string; + table: string; + onOpenTab: (schema: string, table: string, forceNew?: boolean) => string; +} + +interface MenuItem { + id: string; + label: string; + stub?: boolean; + danger?: boolean; +} + +export function TableOverflowMenu({ schema, table, onOpenTab }: TableOverflowMenuProps) { + const [open, setOpen] = useState(false); + const [confirmAction, setConfirmAction] = useState<"empty" | "delete" | null>(null); + const menuRef = useRef(null); + + useEffect(() => { + if (!open) return; + const handleMouseDown = (e: MouseEvent) => { + if (menuRef.current && !menuRef.current.contains(e.target as Node)) { + setOpen(false); + } + }; + const handleKeyDown = (e: KeyboardEvent) => { + if (e.key === "Escape") { + setOpen(false); + } + }; + document.addEventListener("mousedown", handleMouseDown); + document.addEventListener("keydown", handleKeyDown); + return () => { + document.removeEventListener("mousedown", handleMouseDown); + document.removeEventListener("keydown", handleKeyDown); + }; + }, [open]); + + const handleAction = (id: string) => { + switch (id) { + case "open": + onOpenTab(schema, table, true); + setOpen(false); + break; + case "copy-schema": { + const sql = `-- Schema for ${schema}.${table}\n-- TODO: fetch schema DDL`; + if (navigator.clipboard) { + void navigator.clipboard.writeText(sql); + } + setOpen(false); + break; + } + case "empty": + setConfirmAction("empty"); + setOpen(false); + break; + case "delete": + setConfirmAction("delete"); + setOpen(false); + break; + default: + break; + } + }; + + const items: MenuItem[] = [ + { id: "open", label: "Open in new tab" }, + { id: "copy-schema", label: "Copy table schema" }, + { id: "export-csv", label: "Export data (CSV)", stub: true }, + { id: "export-json", label: "Export data (JSON)", stub: true }, + { id: "export-sql", label: "Export data (SQL)", stub: true }, + { id: "empty", label: "Empty Table", danger: true }, + { id: "delete", label: "Delete Table", danger: true }, + ]; + + return ( +
+ + {open && ( +
+ {items.map((item) => ( + + ))} +
+ )} + + {confirmAction === "empty" && ( + { + setConfirmAction(null); + }} + onCancel={() => setConfirmAction(null)} + /> + )} + {confirmAction === "delete" && ( + { + setConfirmAction(null); + }} + onCancel={() => setConfirmAction(null)} + /> + )} +
+ ); +} \ No newline at end of file diff --git a/src/components/db-viewer/TableTree.test.tsx b/src/components/db-viewer/TableTree.test.tsx new file mode 100644 index 0000000..7e99e03 --- /dev/null +++ b/src/components/db-viewer/TableTree.test.tsx @@ -0,0 +1,39 @@ +import { describe, it, expect, beforeEach } from "vitest"; +import { render, screen } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import { TableTree } from "./TableTree"; +import { useDbViewerStore } from "../../stores/dbViewerStore"; + +describe("TableTree", () => { + beforeEach(() => { + useDbViewerStore.getState().reset(); + }); + + it("renders table names from store", () => { + useDbViewerStore.setState({ + schemas: ["public"], + currentSchema: "public", + tables: [ + { name: "users", schema: "public", table_type: "TABLE" }, + { name: "orders", schema: "public", table_type: "TABLE" }, + ], + }); + render(); + expect(screen.getByText("users")).toBeInTheDocument(); + expect(screen.getByText("orders")).toBeInTheDocument(); + }); + + it("opens a tab when table is clicked", async () => { + const user = userEvent.setup(); + useDbViewerStore.setState({ + schemas: ["public"], + currentSchema: "public", + tables: [{ name: "users", schema: "public", table_type: "TABLE" }], + }); + render(); + await user.click(screen.getByText("users")); + const state = useDbViewerStore.getState(); + expect(state.tabs).toHaveLength(1); + expect(state.tabs[0]).toMatchObject({ schema: "public", table: "users" }); + }); +}); \ No newline at end of file diff --git a/src/components/db-viewer/TableTree.tsx b/src/components/db-viewer/TableTree.tsx new file mode 100644 index 0000000..70c76b1 --- /dev/null +++ b/src/components/db-viewer/TableTree.tsx @@ -0,0 +1,114 @@ +import { useState } from "react"; +import { ChevronRight, ChevronDown, Table2, Key, Type } from "lucide-react"; +import { useDbViewerStore } from "../../stores/dbViewerStore"; +import { useUiStore } from "../../stores/uiStore"; +import { TableOverflowMenu } from "./TableOverflowMenu"; +import { abbreviateType } from "../../lib/utils"; +import type { ColumnInfo } from "../../lib/types"; +import * as cmd from "../../lib/commands"; + +export function TableTree({ searchQuery }: { searchQuery?: string }) { + const tables = useDbViewerStore((s) => s.tables); + const currentSchema = useDbViewerStore((s) => s.currentSchema); + const openTab = useDbViewerStore((s) => s.openTab); + const connectionId = useUiStore((s) => s.activeConnectionId); + const [expanded, setExpanded] = useState>(new Set()); + const [columnCache, setColumnCache] = useState>({}); + + const q = (searchQuery ?? "").toLowerCase().trim(); + + const filteredTables = (currentSchema + ? tables.filter((t) => t.schema === currentSchema) + : tables).filter((t) => !q || t.name.toLowerCase().includes(q)); + + const toggle = async (key: string, schema: string, tableName: string) => { + const isExpanded = expanded.has(key); + setExpanded((prev) => { + const next = new Set(prev); + if (isExpanded) next.delete(key); + else next.add(key); + return next; + }); + // Fetch columns if not cached + if (!isExpanded && !columnCache[key] && connectionId) { + try { + const result = await cmd.getTableData(connectionId, schema, tableName, 1, 0); + setColumnCache((prev) => ({ ...prev, [key]: result.columns })); + } catch { /* ignore, columns will remain unknowns */ } + } + }; + + const handleOpenTab = (schema: string, table: string, forceNew?: boolean) => { + openTab(schema, table, forceNew); + return "tab"; + }; + + return ( +
+ {filteredTables.length === 0 && ( +
No tables
+ )} + {filteredTables.map((table) => { + const key = `${table.schema}.${table.name}`; + const isExpanded = expanded.has(key); + const cols = columnCache[key] ?? table.columns ?? []; + return ( +
+
openTab(table.schema, table.name)} + > + + + + {table.name} + +
e.stopPropagation()}> + +
+
+ {isExpanded && ( +
+ {cols.length === 0 && ( +
No columns
+ )} + {cols.map((col) => ( +
+ {col.is_pk ? ( + + ) : col.is_fk ? ( + + ) : ( + + )} + {col.name} + {abbreviateType(col.data_type)} +
+ ))} +
+ )} +
+ ); + })} +
+ ); +} \ No newline at end of file diff --git a/src/components/folders/CreateFolderDialog.test.tsx b/src/components/folders/CreateFolderDialog.test.tsx new file mode 100644 index 0000000..ed9c743 --- /dev/null +++ b/src/components/folders/CreateFolderDialog.test.tsx @@ -0,0 +1,85 @@ +import { describe, it, expect, vi } from "vitest"; +import { render, screen, waitFor, waitForElementToBeRemoved } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import "@testing-library/jest-dom"; +import { CreateFolderDialog } from "./CreateFolderDialog"; + +const folders = [ + { id: "f1", name: "Work", parent_id: null, tag_ids: [], created_at: "", updated_at: "" }, + { id: "f2", name: "Personal", parent_id: null, tag_ids: [], created_at: "", updated_at: "" }, +]; + +const sampleTags = [ + { id: "t1", name: "Production", color: "#ef4444", created_at: "", updated_at: "" }, + { id: "t2", name: "Staging", color: "#3b82f6", created_at: "", updated_at: "" }, +]; + +describe("CreateFolderDialog", () => { + it("calls onCreate with name, parent, and tags", async () => { + const user = userEvent.setup(); + const fn = vi.fn(); + render( {}} />); + await user.type(screen.getByPlaceholderText(/folder name/i), "New Folder"); + await user.click(screen.getByText(/create/i)); + expect(fn).toHaveBeenCalledWith(expect.objectContaining({ name: "New Folder", parent_id: null, tag_ids: [] })); + }); + + it("auto-sets parent to current folder", async () => { + const user = userEvent.setup(); + const fn = vi.fn(); + render( {}} />); + expect(screen.getByText("Work")).toBeInTheDocument(); + await user.type(screen.getByPlaceholderText(/folder name/i), "Sub Folder"); + await user.click(screen.getByText(/create/i)); + expect(fn).toHaveBeenCalledWith(expect.objectContaining({ name: "Sub Folder", parent_id: "f1", tag_ids: [] })); + }); + + it("does not call onCreate when name empty", async () => { + const user = userEvent.setup(); + const fn = vi.fn(); + render( {}} />); + await user.click(screen.getByText(/create/i)); + expect(fn).not.toHaveBeenCalled(); + }); + + it("removes content from DOM after exit animation", async () => { + const { rerender } = render( + {}} />, + ); + expect(screen.getByText("New Folder")).toBeInTheDocument(); + rerender( + {}} />, + ); + await waitForElementToBeRemoved(() => screen.queryByText("New Folder")); + expect(screen.queryByText("New Folder")).not.toBeInTheDocument(); + }); + + it("calls onCreate when Escape is pressed", async () => { + const user = userEvent.setup(); + const onClose = vi.fn(); + render(); + await user.keyboard("{Escape}"); + await waitFor(() => expect(onClose).toHaveBeenCalled()); + }); + + it("shows tags and includes selected tags in onCreate", async () => { + const user = userEvent.setup(); + const fn = vi.fn(); + render( {}} />); + expect(screen.getByPlaceholderText(/search tags/i)).toBeInTheDocument(); + expect(screen.getByText("Production")).toBeInTheDocument(); + expect(screen.getByText("Staging")).toBeInTheDocument(); + + await user.click(screen.getByText("Production")); + await user.type(screen.getByPlaceholderText(/folder name/i), "Tagged Folder"); + await user.click(screen.getByText(/create/i)); + + expect(fn).toHaveBeenCalledWith( + expect.objectContaining({ + name: "Tagged Folder", + parent_id: null, + tag_ids: ["t1"], + }), + ); + }); +}); \ No newline at end of file diff --git a/src/components/folders/CreateFolderDialog.tsx b/src/components/folders/CreateFolderDialog.tsx new file mode 100644 index 0000000..06cd316 --- /dev/null +++ b/src/components/folders/CreateFolderDialog.tsx @@ -0,0 +1,90 @@ +import { useEffect, useRef, useState } from "react"; +import type { Folder, Tag } from "../../lib/types"; +import { Button } from "../ui/Button"; +import { Input } from "../ui/Input"; +import { AnimatedModal } from "../ui/AnimatedModal"; +import { Folder as FolderIcon } from "lucide-react"; +import { useNotificationStore } from "../../stores/notificationStore"; +import { SearchableTagPicker } from "../tags/SearchableTagPicker"; + +interface CreateFolderDialogProps { + open: boolean; + parentOptions: Folder[]; + currentFolderId?: string | null; + tags: Tag[]; + onCreate: (input: { name: string; parent_id: string | null; tag_ids: string[] }) => void; + onClose: () => void; +} + +export function CreateFolderDialog({ open, parentOptions, currentFolderId = null, tags, onCreate, onClose }: CreateFolderDialogProps) { + const [name, setName] = useState(""); + const [selectedTagIds, setSelectedTagIds] = useState([]); + const inputRef = useRef(null); + const notify = useNotificationStore((s) => s.notify); + + const parentName = currentFolderId + ? parentOptions.find((f) => f.id === currentFolderId)?.name ?? null + : null; + + useEffect(() => { + if (open) { + setName(""); + setSelectedTagIds([]); + setTimeout(() => inputRef.current?.focus(), 50); + } + }, [open]); + + const handleCreate = () => { + const trimmed = name.trim(); + if (!trimmed) { + notify("Name must not be empty", "error"); + return; + } + onCreate({ name: trimmed, parent_id: currentFolderId ?? null, tag_ids: selectedTagIds }); + }; + + const handleKeyDown = (e: React.KeyboardEvent) => { + if (e.key === "Enter") { + e.preventDefault(); + handleCreate(); + } + }; + + const toggleTag = (tagId: string) => { + setSelectedTagIds((prev) => + prev.includes(tagId) ? prev.filter((id) => id !== tagId) : [...prev, tagId], + ); + }; + + return ( + +
+

New Folder

+ {parentName && ( +
+ + {parentName} +
+ )} + + {tags.length > 0 && ( + + )} +
+ + +
+
+
+ ); +} \ No newline at end of file diff --git a/src/components/folders/EditFolderDialog.test.tsx b/src/components/folders/EditFolderDialog.test.tsx new file mode 100644 index 0000000..abd8091 --- /dev/null +++ b/src/components/folders/EditFolderDialog.test.tsx @@ -0,0 +1,60 @@ +import { describe, it, expect, vi } from "vitest"; +import { render, screen, waitForElementToBeRemoved } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import "@testing-library/jest-dom"; +import { EditFolderDialog } from "./EditFolderDialog"; + +const folder = { + id: "f1", + name: "Work", + parent_id: null, + tag_ids: ["t1"], + created_at: "", + updated_at: "", +}; + +const tags = [{ id: "t1", name: "red", color: "#ff0000", created_at: "", updated_at: "" }]; + +describe("EditFolderDialog", () => { + it("calls onSave with updated name and tags", async () => { + const user = userEvent.setup(); + const fn = vi.fn(); + render( {}} />); + await user.clear(screen.getByPlaceholderText(/folder name/i)); + await user.type(screen.getByPlaceholderText(/folder name/i), "Work Updated"); + await user.click(screen.getByText(/save/i)); + expect(fn).toHaveBeenCalledWith("f1", expect.objectContaining({ name: "Work Updated", tag_ids: ["t1"] })); + }); + + it("does not call onSave when name is empty", async () => { + const user = userEvent.setup(); + const fn = vi.fn(); + render( {}} />); + await user.clear(screen.getByPlaceholderText(/folder name/i)); + await user.click(screen.getByText(/save/i)); + expect(fn).not.toHaveBeenCalled(); + }); + + it("removes content from DOM after exit animation", async () => { + const { rerender } = render( + {}} />, + ); + expect(screen.getByText("Edit Folder")).toBeInTheDocument(); + rerender( {}} />); + await waitForElementToBeRemoved(() => screen.queryByText("Edit Folder")); + expect(screen.queryByText("Edit Folder")).not.toBeInTheDocument(); + }); + + it("renders nothing when folder is null", () => { + render( {}} />); + expect(screen.queryByText("Edit Folder")).not.toBeInTheDocument(); + }); + + it("calls onClose when Escape is pressed", async () => { + const user = userEvent.setup(); + const onClose = vi.fn(); + render(); + await user.keyboard("{Escape}"); + expect(onClose).toHaveBeenCalled(); + }); +}); \ No newline at end of file diff --git a/src/components/folders/EditFolderDialog.tsx b/src/components/folders/EditFolderDialog.tsx new file mode 100644 index 0000000..655e99c --- /dev/null +++ b/src/components/folders/EditFolderDialog.tsx @@ -0,0 +1,81 @@ +import { useEffect, useRef, useState } from "react"; +import type { Folder, Tag } from "../../lib/types"; +import { Button } from "../ui/Button"; +import { Input } from "../ui/Input"; +import { AnimatedModal } from "../ui/AnimatedModal"; +import { useNotificationStore } from "../../stores/notificationStore"; +import { SearchableTagPicker } from "../tags/SearchableTagPicker"; + +interface EditFolderDialogProps { + open: boolean; + folder: Folder | null; + tags: Tag[]; + onSave: (id: string, input: { name: string; tag_ids: string[] }) => void; + onClose: () => void; +} + +export function EditFolderDialog({ open, folder, tags, onSave, onClose }: EditFolderDialogProps) { + const [name, setName] = useState(""); + const [selectedTagIds, setSelectedTagIds] = useState([]); + const inputRef = useRef(null); + const notify = useNotificationStore((s) => s.notify); + + useEffect(() => { + if (open && folder) { + setName(folder.name); + setSelectedTagIds(folder.tag_ids); + setTimeout(() => inputRef.current?.focus(), 50); + } + }, [open, folder]); + + const handleSave = () => { + if (!folder) return; + const trimmed = name.trim(); + if (!trimmed) { + notify("Name must not be empty", "error"); + return; + } + onSave(folder.id, { name: trimmed, tag_ids: selectedTagIds }); + }; + + const handleKeyDown = (e: React.KeyboardEvent) => { + if (e.key === "Enter") { + e.preventDefault(); + handleSave(); + } + }; + + const toggleTag = (tagId: string) => { + setSelectedTagIds((prev) => + prev.includes(tagId) ? prev.filter((id) => id !== tagId) : [...prev, tagId], + ); + }; + + return ( + + {folder ? ( +
+

Edit Folder

+ + {tags.length > 0 && ( + + )} +
+ + +
+
+ ) : null} +
+ ); +} \ No newline at end of file diff --git a/src/components/folders/FolderBreadcrumb.test.tsx b/src/components/folders/FolderBreadcrumb.test.tsx new file mode 100644 index 0000000..e44d75d --- /dev/null +++ b/src/components/folders/FolderBreadcrumb.test.tsx @@ -0,0 +1,37 @@ +import { describe, it, expect, vi } from "vitest"; +import { render, screen } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import { FolderBreadcrumb } from "./FolderBreadcrumb"; +import type { Folder } from "../../lib/types"; + +const folders: Folder[] = [ + { id: "f1", name: "Work", parent_id: null, tag_ids: [], created_at: "", updated_at: "" }, + { id: "f2", name: "Client A", parent_id: "f1", tag_ids: [], created_at: "", updated_at: "" }, +]; + +describe("FolderBreadcrumb", () => { + it("shows root when no folder active", () => { + render( {}} />); + expect(screen.getByText("All Connections")).toBeInTheDocument(); + }); + + it("shows path to active folder", () => { + render( {}} />); + expect(screen.getByText("Work")).toBeInTheDocument(); + expect(screen.getByText("Client A")).toBeInTheDocument(); + }); + + it("navigates when clicking a breadcrumb item", async () => { + const fn = vi.fn(); + render(); + await userEvent.click(screen.getByText("Work")); + expect(fn).toHaveBeenCalledWith("f1"); + }); + + it("navigates to root", async () => { + const fn = vi.fn(); + render(); + await userEvent.click(screen.getByText("All Connections")); + expect(fn).toHaveBeenCalledWith(null); + }); +}); \ No newline at end of file diff --git a/src/components/folders/FolderBreadcrumb.tsx b/src/components/folders/FolderBreadcrumb.tsx new file mode 100644 index 0000000..0048cac --- /dev/null +++ b/src/components/folders/FolderBreadcrumb.tsx @@ -0,0 +1,40 @@ +import type { Folder } from "../../lib/types"; +import { ChevronRight, Home } from "lucide-react"; +import { getFolderPath } from "../../lib/utils"; + +interface FolderBreadcrumbProps { + folders: Folder[]; + activeFolderId: string | null; + onNavigate: (folderId: string | null) => void; +} + +export function FolderBreadcrumb({ folders, activeFolderId, onNavigate }: FolderBreadcrumbProps) { + const path = getFolderPath(folders, activeFolderId); + + return ( + + ); +} \ No newline at end of file diff --git a/src/components/folders/FolderTree.test.tsx b/src/components/folders/FolderTree.test.tsx new file mode 100644 index 0000000..3f0b46e --- /dev/null +++ b/src/components/folders/FolderTree.test.tsx @@ -0,0 +1,34 @@ +import { describe, it, expect, vi } from "vitest"; +import { render, screen } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import { FolderTree } from "./FolderTree"; +import type { Folder } from "../../lib/types"; + +const folders: Folder[] = [ + { id: "f1", name: "Work", parent_id: null, tag_ids: [], created_at: "", updated_at: "" }, + { id: "f2", name: "ClientA", parent_id: "f1", tag_ids: [], created_at: "", updated_at: "" }, +]; + +describe("FolderTree", () => { + it("renders all folders", () => { + render( {}} />); + expect(screen.getByText("Work")).toBeInTheDocument(); + expect(screen.getByText("ClientA")).toBeInTheDocument(); + }); + + it("renders All Connections option that clears filter", async () => { + const user = userEvent.setup(); + const fn = vi.fn(); + render(); + await user.click(screen.getByText(/all connections/i)); + expect(fn).toHaveBeenCalledWith(null); + }); + + it("selecting a folder calls onSelect with id", async () => { + const user = userEvent.setup(); + const fn = vi.fn(); + render(); + await user.click(screen.getByText("Work")); + expect(fn).toHaveBeenCalledWith("f1"); + }); +}); \ No newline at end of file diff --git a/src/components/folders/FolderTree.tsx b/src/components/folders/FolderTree.tsx new file mode 100644 index 0000000..dad8c63 --- /dev/null +++ b/src/components/folders/FolderTree.tsx @@ -0,0 +1,41 @@ +import type { Folder } from "../../lib/types"; +import { ChevronRight, Folder as FolderIcon } from "lucide-react"; + +interface FolderTreeProps { + folders: Folder[]; + activeFolderId: string | null; + onSelect: (id: string | null) => void; +} + +export function FolderTree({ folders, activeFolderId, onSelect }: FolderTreeProps) { + const roots = folders.filter((f) => f.parent_id === null); + const childrenOf = (id: string) => folders.filter((f) => f.parent_id === id); + + const renderFolder = (folder: Folder, depth: number) => { + const isActive = activeFolderId === folder.id; + return ( +
+ + {childrenOf(folder.id).map((c) => renderFolder(c, depth + 1))} +
+ ); + }; + + return ( +
+ + {roots.map((r) => renderFolder(r, 0))} +
+ ); +} \ No newline at end of file diff --git a/src/components/layout/ActionRow.test.tsx b/src/components/layout/ActionRow.test.tsx new file mode 100644 index 0000000..cda3d46 --- /dev/null +++ b/src/components/layout/ActionRow.test.tsx @@ -0,0 +1,29 @@ +import { describe, it, expect, beforeEach } from "vitest"; +import { render, screen } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import { ActionRow } from "./ActionRow"; +import { useUiStore } from "../../stores/uiStore"; + +beforeEach(() => useUiStore.setState({ activeView: "home" })); + +describe("ActionRow", () => { + it("renders Saved Connections title", () => { + render(); + expect(screen.getByText("Saved Connections")).toBeInTheDocument(); + }); + it("New Connection button switches view", async () => { + render(); + await userEvent.click(screen.getByText(/new connection/i)); + expect(useUiStore.getState().activeView).toBe("new-connection"); + }); + it("Settings button switches view", async () => { + render(); + await userEvent.click(screen.getByText(/settings/i)); + expect(useUiStore.getState().activeView).toBe("settings"); + }); + it("Tags button switches to settings view", async () => { + render(); + await userEvent.click(screen.getByText(/^tags$/i)); + expect(useUiStore.getState().activeView).toBe("settings"); + }); +}); \ No newline at end of file diff --git a/src/components/layout/ActionRow.tsx b/src/components/layout/ActionRow.tsx new file mode 100644 index 0000000..351737f --- /dev/null +++ b/src/components/layout/ActionRow.tsx @@ -0,0 +1,95 @@ +import { useEffect, useRef, useState } from "react"; +import { Plus, Settings as SettingsIcon, Tag, Filter, FolderPlus, Trash2, Check, X, ChevronDown } from "lucide-react"; +import { Button } from "../ui/Button"; +import { useUiStore } from "../../stores/uiStore"; +import { ImportExportMenu } from "./ImportExportMenu"; + +interface ActionRowProps { + onImport?: () => void; + onExport?: () => void; + onNewFolder?: () => void; + onFilters?: () => void; + onDeleteSelected?: () => void; + visibleItemIds?: string[]; +} + +export function ActionRow({ onImport, onExport, onNewFolder, onFilters, onDeleteSelected, visibleItemIds = [] }: ActionRowProps) { + const setActiveView = useUiStore((s) => s.setActiveView); + const selectedItemIds = useUiStore((s) => s.selectedItemIds); + const selectAllItems = useUiStore((s) => s.selectAllItems); + const clearSelection = useUiStore((s) => s.clearSelection); + const hasSelection = selectedItemIds.length > 0; + const [menuOpen, setMenuOpen] = useState(false); + const menuRef = useRef(null); + + useEffect(() => { + if (!menuOpen) return; + const handler = (e: MouseEvent) => { + if (menuRef.current && !menuRef.current.contains(e.target as Node)) { + setMenuOpen(false); + } + }; + document.addEventListener("mousedown", handler); + return () => document.removeEventListener("mousedown", handler); + }, [menuOpen]); + + return ( +
+
+

Saved Connections

+
+ +
+
+
+ + + + {hasSelection && ( +
+ + {menuOpen && ( +
+ + +
+ +
+ )} +
+ )} +
+
+ {})} onExport={onExport ?? (() => {})} /> + +
+
+ ); +} \ No newline at end of file diff --git a/src/components/layout/HomeScreen.test.tsx b/src/components/layout/HomeScreen.test.tsx new file mode 100644 index 0000000..ef44c5e --- /dev/null +++ b/src/components/layout/HomeScreen.test.tsx @@ -0,0 +1,48 @@ +import { describe, it, expect, vi, beforeEach } from "vitest"; +import { render, screen } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import { HomeScreen } from "./HomeScreen"; +import { useConnectionStore } from "../../stores/connectionStore"; +import { useUiStore } from "../../stores/uiStore"; + +vi.mock("../../lib/commands", () => ({ + getConnections: vi.fn().mockResolvedValue([]), + getFolders: vi.fn().mockResolvedValue([]), + getTags: vi.fn().mockResolvedValue([]), + getSettings: vi.fn().mockResolvedValue({}), +})); + +vi.mock("@tauri-apps/plugin-dialog", () => ({ open: vi.fn(), save: vi.fn() })); +vi.mock("@tauri-apps/plugin-fs", () => ({ + readTextFile: vi.fn(), + writeTextFile: vi.fn(), +})); + +describe("HomeScreen", () => { + beforeEach(() => { + useConnectionStore.setState({ connections: [], folders: [], tags: [], loading: false, error: null }); + useUiStore.setState({ searchQuery: "", activeFolderId: null, activeTagIds: [], activeDbTypes: [], activeView: "home" }); + }); + + it("renders SearchBar and ActionRow", () => { + render(); + expect(screen.getByPlaceholderText(/search connections/i)).toBeInTheDocument(); + expect(screen.getByText("New Connection")).toBeInTheDocument(); + }); + + it("renders empty state when no connections", () => { + useConnectionStore.setState({ connections: [] }); + render(); + expect(screen.getByText(/no connections yet/i)).toBeInTheDocument(); + }); + + it("opens new connection screen when a connection string is typed in search", async () => { + const user = userEvent.setup(); + render(); + const input = screen.getByPlaceholderText(/search connections/i); + await user.type(input, "postgresql://user:pass@localhost:5432/mydb"); + expect(useUiStore.getState().activeView).toBe("new-connection"); + expect(useUiStore.getState().prefilledConnectionString).toBe("postgresql://user:pass@localhost:5432/mydb"); + expect(useUiStore.getState().searchQuery).toBe(""); + }); +}); \ No newline at end of file diff --git a/src/components/layout/HomeScreen.tsx b/src/components/layout/HomeScreen.tsx new file mode 100644 index 0000000..d641d64 --- /dev/null +++ b/src/components/layout/HomeScreen.tsx @@ -0,0 +1,215 @@ +import { useEffect, useMemo, useRef, useState } from "react"; +import { useConnectionStore } from "../../stores/connectionStore"; +import { useUiStore } from "../../stores/uiStore"; +import { useFilteredConnections } from "../../hooks/useConnections"; +import { useSortedTags } from "../../hooks/useSortedTags"; +import { SearchBar } from "../search/SearchBar"; +import type { SearchBarHandle } from "../search/SearchBar"; +import { ActionRow } from "./ActionRow"; +import { ConnectionGrid } from "../connections/ConnectionGrid"; +import { CreateFolderDialog } from "../folders/CreateFolderDialog"; +import { EditFolderDialog } from "../folders/EditFolderDialog"; +import { ConfirmDialog } from "../ui/ConfirmDialog"; +import { handleImport, handleExport } from "../../lib/importExport"; +import { getChildFolders } from "../../lib/utils"; +import { useShortcut } from "../../hooks/useShortcut"; +import type { Folder } from "../../lib/types"; + +export function HomeScreen() { + const connections = useFilteredConnections(); + const tags = useSortedTags(); + const folders = useConnectionStore((s) => s.folders); + const activeFolderId = useUiStore((s) => s.activeFolderId); + const setActiveFolderId = useUiStore((s) => s.setActiveFolderId); + const searchQuery = useUiStore((s) => s.searchQuery); + const toggleTag = useUiStore((s) => s.toggleTag); + const createFolder = useConnectionStore((s) => s.createFolder); + const updateFolder = useConnectionStore((s) => s.updateFolder); + const deleteFolder = useConnectionStore((s) => s.deleteFolder); + const deleteConnection = useConnectionStore((s) => s.deleteConnection); + const loadAll = useConnectionStore((s) => s.loadAll); + const selectedItemIds = useUiStore((s) => s.selectedItemIds); + const clearSelection = useUiStore((s) => s.clearSelection); + const [folderDialogOpen, setFolderDialogOpen] = useState(false); + const [editFolder, setEditFolder] = useState(null); + const [confirmDelete, setConfirmDelete] = useState<{ + type: "folder" | "selected"; + folder?: Folder; + } | null>(null); + const searchRef = useRef(null); + const setSearchQuery = useUiStore((s) => s.setSearchQuery); + const setPrefilledConnectionString = useUiStore( + (s) => s.setPrefilledConnectionString, + ); + const setActiveView = useUiStore((s) => s.setActiveView); + const setActiveConnectionId = useUiStore((s) => s.setActiveConnectionId); + + const handleOpenDbViewer = (connectionId: string) => { + setActiveConnectionId(connectionId); + setActiveView("db-viewer"); + }; + + const handleSearchUrl = (url: string) => { + setSearchQuery(""); + setPrefilledConnectionString(url); + setActiveView("new-connection"); + }; + + // Cmd+K to focus search (configurable in Settings → Shortcuts) + useShortcut("command_palette", () => { + searchRef.current?.focus(); + }); + + const currentFolderId = + activeFolderId !== null && folders.some((f) => f.id === activeFolderId) + ? activeFolderId + : null; + const visibleFolderIds = useMemo( + () => getChildFolders(folders, currentFolderId).map((f) => f.id), + [folders, currentFolderId], + ); + const visibleConnectionIds = useMemo( + () => + connections + .filter((c) => c.folder_id === currentFolderId) + .map((c) => c.id), + [connections, currentFolderId], + ); + const visibleItemIds = useMemo( + () => [...visibleFolderIds, ...visibleConnectionIds], + [visibleFolderIds, visibleConnectionIds], + ); + + // Reset to root if the active folder no longer exists + useEffect(() => { + if ( + activeFolderId !== null && + !folders.some((f) => f.id === activeFolderId) + ) { + setActiveFolderId(null); + } + }, [folders, activeFolderId, setActiveFolderId]); + + const executeDeleteSelected = async () => { + const folderIds = new Set(folders.map((f) => f.id)); + for (const id of selectedItemIds) { + try { + if (folderIds.has(id)) { + await deleteFolder(id); + } else { + await deleteConnection(id); + } + } catch (e) { + console.error("Failed to delete item:", e); + } + } + clearSelection(); + setConfirmDelete(null); + }; + + const executeDeleteFolder = async (folder: Folder) => { + try { + await deleteFolder(folder.id); + if (activeFolderId === folder.id) { + setActiveFolderId(null); + } + } catch (e) { + console.error("Failed to delete folder:", e); + } + setConfirmDelete(null); + }; + + return ( +
+
+ +
+
+ setFolderDialogOpen(true)} + onImport={async () => { + const r = await handleImport(); + if (r) await loadAll(); + }} + onExport={async () => { + await handleExport(); + }} + onDeleteSelected={() => + setConfirmDelete({ type: "selected" }) + } + visibleItemIds={visibleItemIds} + /> +
+ 0} + onTagToggle={toggleTag} + onOpenDbViewer={handleOpenDbViewer} + onEditFolder={(f) => setEditFolder(f)} + onDeleteFolder={(f) => + setConfirmDelete({ type: "folder", folder: f }) + } + /> + { + try { + await createFolder(input); + } catch (e) { + console.error("Failed to create folder:", e); + } + setFolderDialogOpen(false); + }} + onClose={() => setFolderDialogOpen(false)} + /> + { + try { + const folder = folders.find((f) => f.id === id); + await updateFolder(id, { + name: input.name, + parent_id: folder?.parent_id ?? null, + tag_ids: input.tag_ids, + }); + } catch (e) { + console.error("Failed to update folder:", e); + } + setEditFolder(null); + }} + onClose={() => setEditFolder(null)} + /> + {confirmDelete?.type === "selected" && ( + setConfirmDelete(null)} + /> + )} + {confirmDelete?.type === "folder" && confirmDelete.folder && ( + executeDeleteFolder(confirmDelete.folder!)} + onCancel={() => setConfirmDelete(null)} + /> + )} +
+ ); +} diff --git a/src/components/layout/ImportExportMenu.tsx b/src/components/layout/ImportExportMenu.tsx new file mode 100644 index 0000000..a6241f1 --- /dev/null +++ b/src/components/layout/ImportExportMenu.tsx @@ -0,0 +1,42 @@ +import { useEffect, useRef, useState } from "react"; +import { Download, Upload, ChevronDown } from "lucide-react"; +import { Button } from "../ui/Button"; + +interface ImportExportMenuProps { + onImport: () => void; + onExport: () => void; +} + +export function ImportExportMenu({ onImport, onExport }: ImportExportMenuProps) { + const [open, setOpen] = useState(false); + const ref = useRef(null); + + useEffect(() => { + if (!open) return; + const handler = (e: MouseEvent) => { + if (ref.current && !ref.current.contains(e.target as Node)) { + setOpen(false); + } + }; + document.addEventListener("mousedown", handler); + return () => document.removeEventListener("mousedown", handler); + }, [open]); + + return ( +
+ + {open && ( +
+ + +
+ )} +
+ ); +} \ No newline at end of file diff --git a/src/components/search/SearchBar.test.tsx b/src/components/search/SearchBar.test.tsx new file mode 100644 index 0000000..bfd3c5b --- /dev/null +++ b/src/components/search/SearchBar.test.tsx @@ -0,0 +1,31 @@ +import { describe, it, expect, vi, beforeEach, afterEach } from "vitest"; +import { render, screen, act, fireEvent } from "@testing-library/react"; +import { SearchBar } from "./SearchBar"; +import { useUiStore } from "../../stores/uiStore"; + +beforeEach(() => { useUiStore.setState({ searchQuery: "" }); vi.useFakeTimers(); }); +afterEach(() => vi.useRealTimers()); + +describe("SearchBar", () => { + it("renders a search input", () => { + render(); + expect(screen.getByPlaceholderText(/search/i)).toBeInTheDocument(); + }); + it("updates store after 150ms debounce", () => { + render(); + const input = screen.getByPlaceholderText(/search/i); + fireEvent.change(input, { target: { value: "prod" } }); + act(() => vi.advanceTimersByTime(149)); + expect(useUiStore.getState().searchQuery).toBe(""); + act(() => vi.advanceTimersByTime(1)); + expect(useUiStore.getState().searchQuery).toBe("prod"); + }); + + it("calls onDetectUrl when a connection string is typed", () => { + const onDetectUrl = vi.fn(); + render(); + const input = screen.getByPlaceholderText(/search/i); + fireEvent.change(input, { target: { value: "postgresql://user@host/db" } }); + expect(onDetectUrl).toHaveBeenCalledWith("postgresql://user@host/db"); + }); +}); \ No newline at end of file diff --git a/src/components/search/SearchBar.tsx b/src/components/search/SearchBar.tsx new file mode 100644 index 0000000..cb59bd3 --- /dev/null +++ b/src/components/search/SearchBar.tsx @@ -0,0 +1,50 @@ +import { forwardRef, useImperativeHandle, useRef, useState } from "react"; +import { Search, Command } from "lucide-react"; +import { Input } from "../ui/Input"; +import { useUiStore } from "../../stores/uiStore"; +import { looksLikeConnectionString } from "../../lib/connectionString"; + +export interface SearchBarHandle { + focus: () => void; +} + +interface SearchBarProps { + onDetectUrl?: (url: string) => void; +} + +export const SearchBar = forwardRef(function SearchBar({ onDetectUrl }, ref) { + const [value, setValue] = useState(""); + const setSearchQuery = useUiStore((s) => s.setSearchQuery); + const inputRef = useRef(null); + + useImperativeHandle(ref, () => ({ + focus: () => inputRef.current?.focus(), + })); + + return ( +
+
+ + { + setValue(v); + if (looksLikeConnectionString(v)) { + onDetectUrl?.(v); + return; + } + window.clearTimeout((window as any).__sb); + (window as any).__sb = window.setTimeout(() => setSearchQuery(v), 150); + }} + className="pl-10 pr-14" + /> +
+ + K +
+
+
+ ); +}); \ No newline at end of file diff --git a/src/components/settings/AdvancedSettingsTab.tsx b/src/components/settings/AdvancedSettingsTab.tsx new file mode 100644 index 0000000..34724ed --- /dev/null +++ b/src/components/settings/AdvancedSettingsTab.tsx @@ -0,0 +1,69 @@ +import { useSettingsStore } from "../../stores/settingsStore"; +import { Input } from "../ui/Input"; +import { Toggle } from "../ui/Toggle"; +import { SettingsRow } from "../ui/SettingsRow"; +import { SettingsSection } from "../ui/SettingsSection"; +import type { DbType } from "../../lib/types"; + +const DB_TYPES: { id: DbType; label: string }[] = [ + { id: "postgresql", label: "PostgreSQL" }, + { id: "mysql", label: "MySQL" }, + { id: "sqlite", label: "SQLite" }, + { id: "redis", label: "Redis" }, +]; + +export function AdvancedSettingsTab() { + const { settings, updateSetting } = useSettingsStore(); + + if (!settings) return null; + + const defaultPorts = settings.default_ports ?? { + postgresql: 5432, + mysql: 3306, + sqlite: null, + redis: 6379, + }; + + const updatePort = (key: string, value: string) => { + const port = value === "" ? null : Number(value); + const next = { ...defaultPorts, [key]: port }; + updateSetting("default_ports", JSON.stringify(next)); + }; + + return ( + <> + + + + updateSetting("confirm_before_delete", checked ? "true" : "false") + } + label="Confirm before delete" + /> + + + + + {DB_TYPES.map((db) => ( + + updatePort(db.id, value)} + className="w-24" + aria-label={`Default port for ${db.label}`} + /> + + ))} + + + ); +} \ No newline at end of file diff --git a/src/components/settings/GeneralSettingsTab.tsx b/src/components/settings/GeneralSettingsTab.tsx new file mode 100644 index 0000000..cc8ba79 --- /dev/null +++ b/src/components/settings/GeneralSettingsTab.tsx @@ -0,0 +1,129 @@ +import { useSettingsStore } from "../../stores/settingsStore"; +import { useConnectionStore } from "../../stores/connectionStore"; +import { Select } from "../ui/Select"; +import { ThemePicker } from "../ui/ThemePicker"; +import { SettingsRow } from "../ui/SettingsRow"; +import { SettingsSection } from "../ui/SettingsSection"; +import * as cmd from "../../lib/commands"; +import type { FontSize } from "../../lib/types"; + +const FONT_SIZE_OPTIONS: { value: FontSize; label: string }[] = [ + { value: "small", label: "Small" }, + { value: "medium", label: "Medium" }, + { value: "large", label: "Large" }, +]; + +const REFRESH_RATE_OPTIONS = [ + { value: "0", label: "Off" }, + { value: "5000", label: "5 seconds" }, + { value: "10000", label: "10 seconds" }, + { value: "30000", label: "30 seconds" }, + { value: "60000", label: "1 minute" }, + { value: "300000", label: "5 minutes" }, +]; + +const PAGE_SIZE_OPTIONS = [ + { value: "50", label: "50 rows" }, + { value: "100", label: "100 rows" }, + { value: "200", label: "200 rows" }, + { value: "500", label: "500 rows" }, +]; + +export function GeneralSettingsTab() { + const { settings, updateSetting, load } = useSettingsStore(); + const folders = useConnectionStore((s) => s.folders); + + if (!settings) return null; + + const folderOptions = [ + { value: "", label: "None" }, + ...folders.map((f) => ({ value: f.id, label: f.name })), + ]; + + const handleReAddDemo = async () => { + try { + await cmd.recreateDemoDb(); + await load(); + } catch (e) { + // ignore + } + }; + + return ( + <> + + + updateSetting("theme", theme)} + /> + + + + + + updateSetting("default_folder_id", value)} + options={folderOptions} + label="Default folder" + /> + + + + + + updateSetting("table_page_size", value)} + options={PAGE_SIZE_OPTIONS} + label="Rows per page" + /> + + + + + + + + + + ); +} \ No newline at end of file diff --git a/src/components/settings/SettingsPage.test.tsx b/src/components/settings/SettingsPage.test.tsx new file mode 100644 index 0000000..46ff80f --- /dev/null +++ b/src/components/settings/SettingsPage.test.tsx @@ -0,0 +1,246 @@ +import { describe, it, expect, vi, beforeEach } from "vitest"; +import * as React from "react"; +import { render, screen, waitFor } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import { SettingsPage } from "./SettingsPage"; +import { GeneralSettingsTab } from "./GeneralSettingsTab"; +import { TagsSettingsTab } from "./TagsSettingsTab"; +import { AdvancedSettingsTab } from "./AdvancedSettingsTab"; +import { useSettingsStore } from "../../stores/settingsStore"; +import { useConnectionStore } from "../../stores/connectionStore"; +import * as commands from "../../lib/commands"; + +vi.mock("motion/react", () => ({ + motion: { + div: React.forwardRef((props: any, ref: any) => ( +
+ )), + }, + AnimatePresence: ({ children }: { children: React.ReactNode }) => ( + <>{children} + ), +})); + +vi.mock("../../lib/commands", () => ({ + getSettings: vi.fn().mockResolvedValue({ + theme: "system", + font_size: "medium", + default_folder_id: null, + confirm_before_delete: true, + default_ports: { postgresql: 5432, mysql: 3306, sqlite: null, redis: 6379 }, + tag_order: null, + }), + updateSetting: vi.fn().mockResolvedValue(undefined), + getConnections: vi.fn().mockResolvedValue([]), + getFolders: vi.fn().mockResolvedValue([]), + getTags: vi.fn().mockResolvedValue([]), + createConnection: vi.fn().mockResolvedValue({}), + deleteConnection: vi.fn().mockResolvedValue(undefined), + addConnectionTags: vi.fn().mockResolvedValue(undefined), + createFolder: vi.fn().mockResolvedValue({}), + updateFolder: vi.fn().mockResolvedValue({}), + deleteFolder: vi.fn().mockResolvedValue(undefined), + addFolderTags: vi.fn().mockResolvedValue(undefined), + createTag: vi.fn().mockResolvedValue({}), + updateTag: vi.fn().mockResolvedValue({}), + deleteTag: vi.fn().mockResolvedValue(undefined), + importConnections: vi.fn().mockResolvedValue({ imported: 0, skipped: 0, skippedRecords: [] }), + exportConnections: vi.fn().mockResolvedValue(""), +})); + +const mockFolders = [ + { id: "folder-1", name: "Work", parent_id: null, tag_ids: [], created_at: "", updated_at: "" }, + { id: "folder-2", name: "Personal", parent_id: null, tag_ids: [], created_at: "", updated_at: "" }, +]; + +const baseSettings = { + theme: "system" as const, + font_size: "medium" as const, + default_folder_id: null, + confirm_before_delete: true, + default_ports: { postgresql: 5432, mysql: 3306, sqlite: null as number | null, redis: 6379 }, + tag_order: null, + table_refresh_rate: 0, + table_page_size: 50, + shortcuts: {} as Record, +}; + +describe("SettingsPage", () => { + beforeEach(() => { + vi.clearAllMocks(); + useSettingsStore.setState({ + settings: baseSettings, + loading: false, + error: null, + }); + useConnectionStore.setState({ + connections: [], + folders: mockFolders, + tags: [], + tagOrder: [], + loading: false, + error: null, + }); + }); + + it("renders settings header with back button and title", async () => { + render(); + await waitFor(() => { + expect(screen.getByRole("heading", { name: /settings/i })).toBeInTheDocument(); + }); + expect(screen.getByText(/back/i)).toBeInTheDocument(); + }); + + it("renders all five sidebar tabs with proper ARIA roles", async () => { + render(); + await waitFor(() => { + expect(screen.getByRole("tab", { name: /general/i })).toBeInTheDocument(); + }); + expect(screen.getByRole("tab", { name: /editor/i })).toBeInTheDocument(); + expect(screen.getByRole("tab", { name: /tags/i })).toBeInTheDocument(); + expect(screen.getByRole("tab", { name: /shortcuts/i })).toBeInTheDocument(); + expect(screen.getByRole("tab", { name: /advanced/i })).toBeInTheDocument(); + expect(screen.getByRole("tablist")).toBeInTheDocument(); + }); + + it("shows the General tab by default and marks it selected", async () => { + render(); + await waitFor(() => { + expect(screen.getByRole("radiogroup", { name: /theme/i })).toBeInTheDocument(); + }); + expect(screen.getByRole("radio", { name: /dark/i })).toBeInTheDocument(); + expect(screen.getByRole("tab", { name: /general/i })).toHaveAttribute("aria-selected", "true"); + expect(screen.getByRole("tabpanel")).toHaveAttribute("aria-labelledby", "settings-tab-general"); + }); + + it("switches to the Editor tab and shows placeholder", async () => { + const user = userEvent.setup(); + render(); + await waitFor(() => { + expect(screen.getByRole("tab", { name: /editor/i })).toBeInTheDocument(); + }); + await user.click(screen.getByRole("tab", { name: /editor/i })); + expect(screen.getByText(/editor settings are coming soon/i)).toBeInTheDocument(); + expect(screen.getByRole("tab", { name: /editor/i })).toHaveAttribute("aria-selected", "true"); + }); + + it("switches to the Tags tab and shows accessible tag management", async () => { + const user = userEvent.setup(); + render(); + await waitFor(() => { + expect(screen.getByRole("tab", { name: /tags/i })).toBeInTheDocument(); + }); + await user.click(screen.getByRole("tab", { name: /tags/i })); + expect(screen.getByText(/create tag/i)).toBeInTheDocument(); + expect(screen.getByText(/manage tags/i)).toBeInTheDocument(); + expect(screen.getByRole("tab", { name: /tags/i })).toHaveAttribute("aria-selected", "true"); + expect(screen.getByRole("tabpanel")).toHaveAttribute("aria-labelledby", "settings-tab-tags"); + }); + + it("switches to the Shortcuts tab and shows keyboard shortcuts", async () => { + const user = userEvent.setup(); + render(); + await waitFor(() => { + expect(screen.getByRole("tab", { name: /shortcuts/i })).toBeInTheDocument(); + }); + await user.click(screen.getByRole("tab", { name: /shortcuts/i })); + expect(screen.getByText(/command palette/i)).toBeInTheDocument(); + }); + + it("switches to the Advanced tab and shows safety and ports settings", async () => { + const user = userEvent.setup(); + render(); + await waitFor(() => { + expect(screen.getByRole("tab", { name: /advanced/i })).toBeInTheDocument(); + }); + await user.click(screen.getByRole("tab", { name: /advanced/i })); + expect(screen.getByRole("switch", { name: /confirm before delete/i })).toBeInTheDocument(); + expect(screen.getByText(/default ports/i)).toBeInTheDocument(); + expect(screen.getByRole("tab", { name: /advanced/i })).toHaveAttribute("aria-selected", "true"); + expect(screen.getByRole("tabpanel")).toHaveAttribute("aria-labelledby", "settings-tab-advanced"); + }); + + it("calls updateSetting with the correct key and value when a setting changes", async () => { + const user = userEvent.setup(); + render(); + await waitFor(() => { + expect(screen.getByRole("radio", { name: /dark/i })).toBeInTheDocument(); + }); + await user.click(screen.getByRole("radio", { name: /dark/i })); + await waitFor(() => { + expect(commands.updateSetting).toHaveBeenCalledWith("theme", "dark"); + }); + }); +}); + +describe("GeneralSettingsTab", () => { + beforeEach(() => { + useSettingsStore.setState({ + settings: baseSettings, + loading: false, + error: null, + }); + useConnectionStore.setState({ + connections: [], + folders: mockFolders, + tags: [], + tagOrder: [], + loading: false, + error: null, + }); + }); + + it("renders appearance, interface, and workspace sections", () => { + render(); + expect(screen.getByRole("radiogroup", { name: /theme/i })).toBeInTheDocument(); + expect(screen.getByLabelText(/font size/i)).toBeInTheDocument(); + expect(screen.getByLabelText(/default folder/i)).toBeInTheDocument(); + }); +}); + +describe("TagsSettingsTab", () => { + beforeEach(() => { + useConnectionStore.setState({ + connections: [], + folders: [], + tags: [ + { id: "tag-1", name: "Production", color: "#ef4444", created_at: "" }, + { id: "tag-2", name: "Staging", color: "#3b82f6", created_at: "" }, + ], + tagOrder: ["tag-1", "tag-2"], + loading: false, + error: null, + }); + }); + + it("renders tag creation and management controls with accessible labels", () => { + render(); + expect(screen.getByLabelText(/new tag name/i)).toBeInTheDocument(); + expect(screen.getByRole("button", { name: /add/i })).toBeInTheDocument(); + expect(screen.getByText(/production/i)).toBeInTheDocument(); + expect(screen.getByRole("button", { name: /delete tag production/i })).toBeInTheDocument(); + const moveUpButtons = screen.getAllByRole("button", { name: /move tag up/i }); + expect(moveUpButtons.length).toBeGreaterThanOrEqual(2); + const moveDownButtons = screen.getAllByRole("button", { name: /move tag down/i }); + expect(moveDownButtons.length).toBeGreaterThanOrEqual(2); + }); +}); + +describe("AdvancedSettingsTab", () => { + beforeEach(() => { + useSettingsStore.setState({ + settings: baseSettings, + loading: false, + error: null, + }); + }); + + it("renders safety toggle and labeled default port inputs", () => { + render(); + expect(screen.getByRole("switch", { name: /confirm before delete/i })).toBeInTheDocument(); + expect(screen.getByLabelText(/default port for postgresql/i)).toBeInTheDocument(); + expect(screen.getByLabelText(/default port for mysql/i)).toBeInTheDocument(); + expect(screen.getByLabelText(/default port for sqlite/i)).toBeInTheDocument(); + expect(screen.getByLabelText(/default port for redis/i)).toBeInTheDocument(); + }); +}); \ No newline at end of file diff --git a/src/components/settings/SettingsPage.tsx b/src/components/settings/SettingsPage.tsx new file mode 100644 index 0000000..c568536 --- /dev/null +++ b/src/components/settings/SettingsPage.tsx @@ -0,0 +1,137 @@ +import { useEffect, useState } from "react"; +import { motion, AnimatePresence } from "motion/react"; +import { useSettingsStore } from "../../stores/settingsStore"; +import { useUiStore } from "../../stores/uiStore"; +import { Button } from "../ui/Button"; +import { SettingsSection } from "../ui/SettingsSection"; +import { GeneralSettingsTab } from "./GeneralSettingsTab"; +import { TagsSettingsTab } from "./TagsSettingsTab"; +import { ShortcutsSettingsTab } from "./ShortcutsSettingsTab"; +import { AdvancedSettingsTab } from "./AdvancedSettingsTab"; +import { + ChevronLeft, + Cog, + Keyboard, + Paintbrush, + Settings, + Tag as TagIcon, +} from "lucide-react"; +import type { ComponentType } from "react"; + +type SettingsTab = "general" | "editor" | "tags" | "shortcuts" | "advanced"; + +interface TabDefinition { + id: SettingsTab; + label: string; + icon: ComponentType<{ size?: number }>; +} + +const TABS: TabDefinition[] = [ + { id: "general", label: "General", icon: Settings }, + { id: "editor", label: "Editor", icon: Paintbrush }, + { id: "tags", label: "Tags", icon: TagIcon }, + { id: "shortcuts", label: "Shortcuts", icon: Keyboard }, + { id: "advanced", label: "Advanced", icon: Cog }, +]; + +export function SettingsPage() { + const setActiveView = useUiStore((s) => s.setActiveView); + const { load } = useSettingsStore(); + + const [activeTab, setActiveTab] = useState("general"); + + useEffect(() => { + load(); + }, [load]); + + const renderEditor = () => ( + +
+ Editor settings are coming soon. +
+
+ ); + + const renderTabContent = () => { + switch (activeTab) { + case "general": + return ; + case "editor": + return renderEditor(); + case "tags": + return ; + case "shortcuts": + return ; + case "advanced": + return ; + } + }; + + return ( +
+
+ {/* Sidebar */} + + + {/* Main content */} +
+

+ Settings +

+ + + {renderTabContent()} + + +
+
+
+ ); +} diff --git a/src/components/settings/ShortcutsSettingsTab.tsx b/src/components/settings/ShortcutsSettingsTab.tsx new file mode 100644 index 0000000..6c9d88c --- /dev/null +++ b/src/components/settings/ShortcutsSettingsTab.tsx @@ -0,0 +1,172 @@ +import { useState, useEffect, useRef } from "react"; +import { Pencil } from "lucide-react"; +import { SettingsSection } from "../ui/SettingsSection"; +import { useSettingsStore } from "../../stores/settingsStore"; + +type ShortcutDef = { + id: string; + description: string; + defaultKeys: string; + defaultWin: string; +}; + +const SHORTCUTS: ShortcutDef[] = [ + { + id: "command_palette", + description: "Open command palette / search", + defaultKeys: "⌘K", + defaultWin: "Ctrl+K", + }, + { + id: "close_tab", + description: "Close current tab (or return home if none)", + defaultKeys: "⌘W", + defaultWin: "Ctrl+W", + }, +]; + +const STATIC_SHORTCUTS = [ + { description: "Close modal, dropdown, or popover", keys: ["Esc"] }, + { description: "Submit / confirm in dialogs", keys: ["↵ Enter"] }, + { description: "Follow foreign-key link on focused cell", keys: ["↵ Enter", "Space"] }, + { description: "Toggle row selection", keys: ["Click"] }, + { description: "Select / deselect all visible rows", keys: ["Header ☐"] }, +]; + +function displayCombo(combo: string): string { + return combo + .replace(/meta/gi, "⌘") + .replace(/ctrl/gi, "⌃") + .replace(/shift/gi, "⇧") + .replace(/alt/gi, "⌥") + .replace(/\+/g, "") + .replace(/\b(\w)\b/g, (_, c) => c.toUpperCase()); +} + +function Kbd({ children }: { children: string }) { + return ( + + {children} + + ); +} + +export function ShortcutsSettingsTab() { + const settings = useSettingsStore((s) => s.settings); + const updateSetting = useSettingsStore((s) => s.updateSetting); + const customShortcuts = settings?.shortcuts ?? {}; + const [recording, setRecording] = useState(null); + const recordingRef = useRef(null); + + // Listen for keypress when recording + useEffect(() => { + if (!recording) return; + recordingRef.current = recording; + + const handler = (e: KeyboardEvent) => { + e.preventDefault(); + e.stopPropagation(); + const parts: string[] = []; + if (e.metaKey) parts.push("Meta"); + if (e.ctrlKey) parts.push("Ctrl"); + if (e.altKey) parts.push("Alt"); + if (e.shiftKey) parts.push("Shift"); + // Ignore modifier-only presses + if (["Meta", "Control", "Alt", "Shift"].includes(e.key)) return; + parts.push(e.key.length === 1 ? e.key.toUpperCase() : e.key); + const combo = parts.join("+"); + + const action = recordingRef.current; + if (!action) return; + const next = { ...customShortcuts, [action]: combo }; + const existing = { ...(settings?.shortcuts ?? {}) }; + updateSetting("shortcuts", JSON.stringify({ ...existing, ...next })); + setRecording(null); + }; + + window.addEventListener("keydown", handler, true); + return () => window.removeEventListener("keydown", handler, true); + }, [recording, customShortcuts, settings?.shortcuts, updateSetting]); + + const handleStartRecord = (action: string) => { + setRecording(action); + }; + + const handleReset = (action: string) => { + const next = { ...customShortcuts }; + delete next[action]; + const existing = { ...(settings?.shortcuts ?? {}) }; + updateSetting("shortcuts", JSON.stringify({ ...existing, ...next, [action]: undefined as any })); + }; + + return ( + <> + +

+ Click the pencil icon to record a new key combination. Click the shortcut to reset to default. +

+
+ {SHORTCUTS.map((s) => { + const custom = customShortcuts[s.id]; + const isRecording = recording === s.id; + return ( +
+ {s.description} +
+ {isRecording ? ( + Listening… + ) : custom ? ( + + ) : ( + {s.defaultKeys} + )} + +
+
+ ); + })} +
+
+ + +

+ These shortcuts are standard across all applications and cannot be changed. +

+
+ {STATIC_SHORTCUTS.map((s) => ( +
+ {s.description} +
+ {s.keys.map((key, i) => ( + {key} + ))} +
+
+ ))} +
+
+ + ); +} \ No newline at end of file diff --git a/src/components/settings/TagsSettingsTab.tsx b/src/components/settings/TagsSettingsTab.tsx new file mode 100644 index 0000000..fbcf267 --- /dev/null +++ b/src/components/settings/TagsSettingsTab.tsx @@ -0,0 +1,223 @@ +import { useState } from "react"; +import { useConnectionStore } from "../../stores/connectionStore"; +import { useNotificationStore } from "../../stores/notificationStore"; +import { useSortedTags } from "../../hooks/useSortedTags"; +import { Button } from "../ui/Button"; +import { Input } from "../ui/Input"; +import { SettingsSection } from "../ui/SettingsSection"; +import { Plus, Trash2, Check, X, ChevronUp, ChevronDown } from "lucide-react"; +import type { Tag } from "../../lib/types"; + +const TAG_COLORS = [ + "#ef4444", + "#f97316", + "#eab308", + "#22c55e", + "#06b6d4", + "#3b82f6", + "#8b5cf6", + "#d946ef", + "#ec4899", + "#78716c", +]; + +export function TagsSettingsTab() { + const tags = useSortedTags(); + const tagOrder = useConnectionStore((s) => s.tagOrder); + const setTagOrder = useConnectionStore((s) => s.setTagOrder); + const createTag = useConnectionStore((s) => s.createTag); + const updateTag = useConnectionStore((s) => s.updateTag); + const deleteTag = useConnectionStore((s) => s.deleteTag); + const notify = useNotificationStore((s) => s.notify); + + const [newName, setNewName] = useState(""); + const [newColor, setNewColor] = useState(TAG_COLORS[0]); + const [editingId, setEditingId] = useState(null); + const [editName, setEditName] = useState(""); + const [editColor, setEditColor] = useState(""); + + const handleCreateTag = async () => { + const trimmed = newName.trim(); + if (!trimmed) { + notify("Tag name must not be empty", "error"); + return; + } + try { + await createTag({ name: trimmed, color: newColor }); + setNewName(""); + setNewColor(TAG_COLORS[0]); + } catch (e) { + notify(`Failed to create tag: ${e}`, "error"); + } + }; + + const handleUpdateTag = async (id: string) => { + const trimmed = editName.trim(); + if (!trimmed) { + notify("Tag name must not be empty", "error"); + return; + } + try { + await updateTag(id, { name: trimmed, color: editColor }); + setEditingId(null); + } catch (e) { + notify(`Failed to update tag: ${e}`, "error"); + } + }; + + const handleDeleteTag = async (id: string, name: string) => { + try { + await deleteTag(id); + notify(`Deleted tag "${name}"`, "info"); + } catch (e) { + notify(`Failed to delete tag: ${e}`, "error"); + } + }; + + const handleMoveTag = async (index: number, direction: "up" | "down") => { + const currentOrder = tagOrder.length === tags.length ? tagOrder : tags.map((t) => t.id); + const newOrder = [...currentOrder]; + const swapIndex = direction === "up" ? index - 1 : index + 1; + if (swapIndex < 0 || swapIndex >= newOrder.length) return; + [newOrder[index], newOrder[swapIndex]] = [newOrder[swapIndex], newOrder[index]]; + try { + await setTagOrder(newOrder); + } catch (e) { + notify(`Failed to reorder tags: ${e}`, "error"); + } + }; + + const startEdit = (tag: Tag) => { + setEditingId(tag.id); + setEditName(tag.name); + setEditColor(tag.color); + }; + + return ( + <> + +
+ +
+ {TAG_COLORS.map((color) => ( +
+ +
+
+ + + {tags.length === 0 ? ( +
+ No tags yet. Create one above. +
+ ) : ( +
+ {tags.map((tag, index) => { + const isEditing = editingId === tag.id; + return ( +
+
+ + +
+ + {isEditing ? ( + <> + +
+ {TAG_COLORS.map((color) => ( +
+ + + + ) : ( + <> +
+ {tag.name} + + + + )} +
+ ); + })} +
+ )} + + + ); +} \ No newline at end of file diff --git a/src/components/tags/SearchableTagPicker.tsx b/src/components/tags/SearchableTagPicker.tsx new file mode 100644 index 0000000..98cdbee --- /dev/null +++ b/src/components/tags/SearchableTagPicker.tsx @@ -0,0 +1,56 @@ +import { useState } from "react"; +import type { Tag } from "../../lib/types"; +import { Search } from "lucide-react"; + +interface SearchableTagPickerProps { + tags: Tag[]; + selectedTagIds: string[]; + onToggle: (tagId: string) => void; +} + +export function SearchableTagPicker({ tags, selectedTagIds, onToggle }: SearchableTagPickerProps) { + const [search, setSearch] = useState(""); + const filtered = search.trim() + ? tags.filter((t) => t.name.toLowerCase().includes(search.trim().toLowerCase())) + : tags; + + return ( +
+
Tags
+
+ + setSearch(e.target.value)} + placeholder="Search tags..." + className="w-full rounded-full bg-surface border border-border pl-7 pr-3 py-1.5 text-xs text-text placeholder-text-muted/60 focus:outline-none focus:border-accent transition-colors" + /> +
+
+ {filtered.length === 0 && ( +
No tags found
+ )} + {filtered.map((tag) => { + const active = selectedTagIds.includes(tag.id); + return ( + + ); + })} +
+
+ ); +} \ No newline at end of file diff --git a/src/components/tags/TagBadge.test.tsx b/src/components/tags/TagBadge.test.tsx new file mode 100644 index 0000000..ab6342e --- /dev/null +++ b/src/components/tags/TagBadge.test.tsx @@ -0,0 +1,24 @@ +import { describe, it, expect, vi } from "vitest"; +import { render, screen } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import { TagBadge } from "./TagBadge"; +import type { Tag } from "../../lib/types"; + +const tag: Tag = { id: "t1", name: "production", color: "#ef4444", created_at: "" }; + +describe("TagBadge", () => { + it("renders tag name", () => { + render(); + expect(screen.getByText("production")).toBeInTheDocument(); + }); + it("toggles active state on click", async () => { + const fn = vi.fn(); + render(); + await userEvent.click(screen.getByText("production")); + expect(fn).toHaveBeenCalledWith("t1"); + }); + it("shows active styling when active", () => { + render( {}} />); + expect(screen.getByText("production").className).toContain("brightness"); + }); +}); \ No newline at end of file diff --git a/src/components/tags/TagBadge.tsx b/src/components/tags/TagBadge.tsx new file mode 100644 index 0000000..b12a39b --- /dev/null +++ b/src/components/tags/TagBadge.tsx @@ -0,0 +1,20 @@ +import type { Tag } from "../../lib/types"; + +interface TagBadgeProps { + tag: Tag; + active?: boolean; + onToggle?: (id: string) => void; +} + +export function TagBadge({ tag, active = false, onToggle }: TagBadgeProps) { + const Comp = onToggle ? "button" : "span"; + return ( + onToggle(tag.id) : undefined} + className={`text-xs px-2 py-0.5 rounded-full border transition-colors ${onToggle ? "cursor-pointer hover:brightness-125" : ""} ${active ? "brightness-150" : ""}`} + style={{ borderColor: tag.color, color: tag.color, backgroundColor: `${tag.color}15` }} + > + {tag.name} + + ); +} \ No newline at end of file diff --git a/src/components/ui/AnimatedModal.test.tsx b/src/components/ui/AnimatedModal.test.tsx new file mode 100644 index 0000000..64895b1 --- /dev/null +++ b/src/components/ui/AnimatedModal.test.tsx @@ -0,0 +1,41 @@ +import { describe, it, expect, vi } from "vitest"; +import { render, screen, waitForElementToBeRemoved } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import { AnimatedModal } from "./AnimatedModal"; + +describe("AnimatedModal", () => { + it("renders content when open", () => { + render( + +

Modal body

+
+ ); + expect(screen.getByText("Modal body")).toBeInTheDocument(); + }); + + it("calls onClose when backdrop is clicked", async () => { + const onClose = vi.fn(); + render( + +
Panel
+
+ ); + await userEvent.click(screen.getByTestId("animated-backdrop")); + expect(onClose).toHaveBeenCalled(); + }); + + it("removes content from DOM after exit animation", async () => { + const { rerender } = render( + +

Modal body

+
+ ); + rerender( + +

Modal body

+
+ ); + await waitForElementToBeRemoved(() => screen.queryByText("Modal body")); + expect(screen.queryByText("Modal body")).not.toBeInTheDocument(); + }); +}); \ No newline at end of file diff --git a/src/components/ui/AnimatedModal.tsx b/src/components/ui/AnimatedModal.tsx new file mode 100644 index 0000000..aa3e5e9 --- /dev/null +++ b/src/components/ui/AnimatedModal.tsx @@ -0,0 +1,53 @@ +import { AnimatePresence, motion } from "motion/react"; +import { useEffect } from "react"; +import type { ReactNode } from "react"; + +interface AnimatedModalProps { + open: boolean; + onClose: () => void; + children: ReactNode; +} + +export function AnimatedModal({ open, onClose, children }: AnimatedModalProps) { + useEffect(() => { + if (!open) return; + + const handleKeyDown = (e: KeyboardEvent) => { + if (e.key === "Escape") { + onClose(); + } + }; + + document.addEventListener("keydown", handleKeyDown); + return () => document.removeEventListener("keydown", handleKeyDown); + }, [open, onClose]); + + return ( + + {open && ( + + e.stopPropagation()} + > + {children} + + + )} + + ); +} \ No newline at end of file diff --git a/src/components/ui/Badge.test.tsx b/src/components/ui/Badge.test.tsx new file mode 100644 index 0000000..e785a99 --- /dev/null +++ b/src/components/ui/Badge.test.tsx @@ -0,0 +1,19 @@ +import { describe, it, expect, vi } from "vitest"; +import { render, screen } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import { Badge } from "./Badge"; + +describe("Badge", () => { + it("renders label and color", () => { + render(); + const el = screen.getByText("production"); + expect(el).toBeInTheDocument(); + expect(el).toHaveStyle({ color: "#ef4444", backgroundColor: "#ef444433" }); + }); + it("fires onClick when provided", async () => { + const fn = vi.fn(); + render(); + await userEvent.click(screen.getByText("x")); + expect(fn).toHaveBeenCalledOnce(); + }); +}); \ No newline at end of file diff --git a/src/components/ui/Badge.tsx b/src/components/ui/Badge.tsx new file mode 100644 index 0000000..60553ef --- /dev/null +++ b/src/components/ui/Badge.tsx @@ -0,0 +1,18 @@ +interface BadgeProps { + label: string; + color: string; + onClick?: () => void; +} + +export function Badge({ label, color, onClick }: BadgeProps) { + const Comp = onClick ? "button" : "span"; + return ( + + {label} + + ); +} \ No newline at end of file diff --git a/src/components/ui/Button.test.tsx b/src/components/ui/Button.test.tsx new file mode 100644 index 0000000..8bd5a95 --- /dev/null +++ b/src/components/ui/Button.test.tsx @@ -0,0 +1,23 @@ +import { describe, it, expect, vi } from "vitest"; +import { render, screen } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import { Button } from "./Button"; + +describe("Button", () => { + it("renders children", () => { + render(); + expect(screen.getByText("Save")).toBeInTheDocument(); + }); + it("fires onClick", async () => { + const fn = vi.fn(); + render(); + await userEvent.click(screen.getByText("Click")); + expect(fn).toHaveBeenCalledOnce(); + }); + it("does not fire onClick when disabled", async () => { + const fn = vi.fn(); + render(); + await userEvent.click(screen.getByText("Click")); + expect(fn).not.toHaveBeenCalled(); + }); +}); \ No newline at end of file diff --git a/src/components/ui/Button.tsx b/src/components/ui/Button.tsx new file mode 100644 index 0000000..85c72de --- /dev/null +++ b/src/components/ui/Button.tsx @@ -0,0 +1,20 @@ +import type { ButtonHTMLAttributes, ReactNode } from "react"; + +interface ButtonProps extends ButtonHTMLAttributes { + variant?: "primary" | "secondary" | "ghost"; + children: ReactNode; +} + +export function Button({ variant = "primary", className = "", children, ...rest }: ButtonProps) { + const base = "inline-flex items-center justify-center gap-1.5 px-3 py-1.5 rounded-full text-sm font-medium transition-all cursor-pointer disabled:opacity-50 disabled:cursor-not-allowed border border-border hover:border-border-hover"; + const styles = { + primary: "bg-accent text-white hover:bg-accent-hover shadow-none", + secondary: "bg-surface-raised text-text-muted hover:text-text", + ghost: "bg-transparent text-text-muted hover:text-text", + }[variant]; + return ( + + ); +} \ No newline at end of file diff --git a/src/components/ui/Card.tsx b/src/components/ui/Card.tsx new file mode 100644 index 0000000..bb9e609 --- /dev/null +++ b/src/components/ui/Card.tsx @@ -0,0 +1,13 @@ +import type { HTMLAttributes, ReactNode } from "react"; + +interface CardProps extends HTMLAttributes { + children: ReactNode; +} + +export function Card({ children, className = "", ...rest }: CardProps) { + return ( +
+ {children} +
+ ); +} \ No newline at end of file diff --git a/src/components/ui/ConfirmDialog.test.tsx b/src/components/ui/ConfirmDialog.test.tsx new file mode 100644 index 0000000..ffb3040 --- /dev/null +++ b/src/components/ui/ConfirmDialog.test.tsx @@ -0,0 +1,57 @@ +import { describe, it, expect, vi } from "vitest"; +import { render, screen, waitForElementToBeRemoved } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import "@testing-library/jest-dom"; +import { ConfirmDialog } from "./ConfirmDialog"; + +describe("ConfirmDialog", () => { + it("renders title and message", () => { + render( + , + ); + expect(screen.getByText("Delete?")).toBeInTheDocument(); + expect(screen.getByText("Are you sure?")).toBeInTheDocument(); + }); + + it("calls onConfirm when confirm button is clicked", async () => { + const user = userEvent.setup(); + const onConfirm = vi.fn(); + render( + , + ); + await user.click(screen.getByText(/confirm/i)); + expect(onConfirm).toHaveBeenCalled(); + }); + + it("calls onCancel when cancel button is clicked", async () => { + const user = userEvent.setup(); + const onCancel = vi.fn(); + render( + , + ); + await user.click(screen.getByText(/cancel/i)); + expect(onCancel).toHaveBeenCalled(); + }); + + it("removes content from DOM after exit animation", async () => { + const { rerender } = render( + , + ); + expect(screen.getByText("Delete?")).toBeInTheDocument(); + rerender( + , + ); + await waitForElementToBeRemoved(() => screen.queryByText("Delete?")); + expect(screen.queryByText("Delete?")).not.toBeInTheDocument(); + }); + + it("calls onCancel when Escape is pressed", async () => { + const user = userEvent.setup(); + const onCancel = vi.fn(); + render( + , + ); + await user.keyboard("{Escape}"); + expect(onCancel).toHaveBeenCalled(); + }); +}); \ No newline at end of file diff --git a/src/components/ui/ConfirmDialog.tsx b/src/components/ui/ConfirmDialog.tsx new file mode 100644 index 0000000..db6511b --- /dev/null +++ b/src/components/ui/ConfirmDialog.tsx @@ -0,0 +1,27 @@ +import { Button } from "../ui/Button"; +import { AnimatedModal } from "../ui/AnimatedModal"; + +interface ConfirmDialogProps { + open: boolean; + title: string; + message: string; + confirmLabel?: string; + confirmVariant?: "primary" | "ghost"; + onConfirm: () => void; + onCancel: () => void; +} + +export function ConfirmDialog({ open, title, message, confirmLabel = "Confirm", confirmVariant = "primary", onConfirm, onCancel }: ConfirmDialogProps) { + return ( + +
+

{title}

+

{message}

+
+ + +
+
+
+ ); +} \ No newline at end of file diff --git a/src/components/ui/ErrorBanner.test.tsx b/src/components/ui/ErrorBanner.test.tsx new file mode 100644 index 0000000..584481e --- /dev/null +++ b/src/components/ui/ErrorBanner.test.tsx @@ -0,0 +1,23 @@ +import { describe, it, expect, vi } from "vitest"; +import { render, screen } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import { ErrorBanner } from "./ErrorBanner"; + +describe("ErrorBanner", () => { + it("renders nothing when no error", () => { + const { container } = render( {}} />); + expect(container.firstChild).toBeNull(); + }); + it("renders message and retry button when error", () => { + const fn = vi.fn(); + render(); + expect(screen.getByText(/storage error/i)).toBeInTheDocument(); + expect(screen.getByText(/retry/i)).toBeInTheDocument(); + }); + it("fires onRetry", async () => { + const fn = vi.fn(); + render(); + await userEvent.click(screen.getByText(/retry/i)); + expect(fn).toHaveBeenCalledOnce(); + }); +}); \ No newline at end of file diff --git a/src/components/ui/ErrorBanner.tsx b/src/components/ui/ErrorBanner.tsx new file mode 100644 index 0000000..87cf1b9 --- /dev/null +++ b/src/components/ui/ErrorBanner.tsx @@ -0,0 +1,14 @@ +interface ErrorBannerProps { + error: string | null; + onRetry: () => void; +} + +export function ErrorBanner({ error, onRetry }: ErrorBannerProps) { + if (!error) return null; + return ( +
+ {error} + +
+ ); +} \ No newline at end of file diff --git a/src/components/ui/Input.test.tsx b/src/components/ui/Input.test.tsx new file mode 100644 index 0000000..3532711 --- /dev/null +++ b/src/components/ui/Input.test.tsx @@ -0,0 +1,17 @@ +import { describe, it, expect, vi } from "vitest"; +import { render, screen } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import { Input } from "./Input"; + +describe("Input", () => { + it("renders placeholder", () => { + render(); + expect(screen.getByPlaceholderText("Search...")).toBeInTheDocument(); + }); + it("fires onChange with value", async () => { + const fn = vi.fn(); + render(); + await userEvent.type(screen.getByPlaceholderText("x"), "hi"); + expect(fn).toHaveBeenLastCalledWith("hi"); + }); +}); \ No newline at end of file diff --git a/src/components/ui/Input.tsx b/src/components/ui/Input.tsx new file mode 100644 index 0000000..e43ef0f --- /dev/null +++ b/src/components/ui/Input.tsx @@ -0,0 +1,27 @@ +import { forwardRef } from "react"; +import type { KeyboardEvent } from "react"; + +interface InputProps { + value?: string; + placeholder?: string; + className?: string; + type?: string; + disabled?: boolean; + "aria-label"?: string; + onChange?: (value: string) => void; + onKeyDown?: (e: KeyboardEvent) => void; +} + +export const Input = forwardRef( + function Input({ onChange, onKeyDown, className = "", ...rest }, ref) { + return ( + onChange?.(e.target.value)} + onKeyDown={(e) => onKeyDown?.(e)} + {...rest} + /> + ); + }, +); \ No newline at end of file diff --git a/src/components/ui/Select.test.tsx b/src/components/ui/Select.test.tsx new file mode 100644 index 0000000..8df8665 --- /dev/null +++ b/src/components/ui/Select.test.tsx @@ -0,0 +1,26 @@ +import { describe, it, expect, vi } from "vitest"; +import { render, screen } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import { Select } from "./Select"; + +describe("Select", () => { + it("renders options and calls onChange", async () => { + const onChange = vi.fn(); + render( + onChange(e.target.value)} + className="rounded-lg bg-surface border border-border px-3 py-2 text-sm text-text focus:outline-none focus:border-accent focus:ring-1 focus:ring-accent/50 transition-colors cursor-pointer disabled:opacity-50" + > + {options.map((opt) => ( + + ))} + +
+ ); +} \ No newline at end of file diff --git a/src/components/ui/SelectDropdown.test.tsx b/src/components/ui/SelectDropdown.test.tsx new file mode 100644 index 0000000..0aaa93f --- /dev/null +++ b/src/components/ui/SelectDropdown.test.tsx @@ -0,0 +1,33 @@ +import { describe, it, expect, vi } from "vitest"; +import { render, screen } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import { SelectDropdown } from "./SelectDropdown"; + +describe("SelectDropdown", () => { + it("renders the selected label and opens a popover menu", async () => { + const onChange = vi.fn(); + const user = userEvent.setup(); + render( + , + ); + + const trigger = screen.getByRole("button", { name: /Staging/i }); + expect(trigger).toBeInTheDocument(); + + await user.click(trigger); + expect(screen.getByRole("button", { name: /Production/i })).toBeInTheDocument(); + + await user.click(screen.getByRole("button", { name: /Development/i })); + expect(onChange).toHaveBeenCalledWith("development"); + }); +}); \ No newline at end of file diff --git a/src/components/ui/SelectDropdown.tsx b/src/components/ui/SelectDropdown.tsx new file mode 100644 index 0000000..4ad1f4a --- /dev/null +++ b/src/components/ui/SelectDropdown.tsx @@ -0,0 +1,90 @@ +import { useEffect, useRef, useState } from "react"; +import { ChevronDown } from "lucide-react"; + +export interface SelectDropdownOption { + value: string; + label: string; +} + +interface SelectDropdownProps { + value: string; + onChange: (value: string) => void; + options: SelectDropdownOption[]; + placeholder?: string; + variant?: "pill" | "ghost"; + "aria-label"?: string; +} + +export function SelectDropdown({ + value, + onChange, + options, + placeholder = "Select…", + variant = "pill", + "aria-label": ariaLabel, +}: SelectDropdownProps) { + const [open, setOpen] = useState(false); + const menuRef = useRef(null); + const selectedLabel = + options.find((opt) => opt.value === value)?.label ?? placeholder; + + useEffect(() => { + if (!open) return; + const handleMouseDown = (e: MouseEvent) => { + if (menuRef.current && !menuRef.current.contains(e.target as Node)) { + setOpen(false); + } + }; + const handleKeyDown = (e: KeyboardEvent) => { + if (e.key === "Escape") { + setOpen(false); + } + }; + document.addEventListener("mousedown", handleMouseDown); + document.addEventListener("keydown", handleKeyDown); + return () => { + document.removeEventListener("mousedown", handleMouseDown); + document.removeEventListener("keydown", handleKeyDown); + }; + }, [open]); + + const handleSelect = (nextValue: string) => { + onChange(nextValue); + setOpen(false); + }; + + const buttonClass = variant === "ghost" + ? "flex items-center gap-1 text-sm text-text-muted hover:text-text transition-colors cursor-pointer" + : "w-full flex items-center justify-between rounded-full bg-surface border border-border px-4 py-2 pr-10 text-sm text-text focus:outline-none focus:border-accent focus:ring-1 focus:ring-accent/50 transition-colors cursor-pointer"; + + return ( +
+ + {open && ( +
+ {options.map((opt) => ( + + ))} +
+ )} +
+ ); +} \ No newline at end of file diff --git a/src/components/ui/SettingsRow.test.tsx b/src/components/ui/SettingsRow.test.tsx new file mode 100644 index 0000000..d492a05 --- /dev/null +++ b/src/components/ui/SettingsRow.test.tsx @@ -0,0 +1,42 @@ +import { describe, it, expect } from "vitest"; +import { render, screen } from "@testing-library/react"; +import { SettingsRow } from "./SettingsRow"; + +describe("SettingsRow", () => { + it("renders title, description, and control", () => { + render( + + + + ); + expect(screen.getByText("Font size")).toBeInTheDocument(); + expect(screen.getByText("Adjust text size.")).toBeInTheDocument(); + expect(screen.getByText("Control")).toBeInTheDocument(); + }); + + it("has a bottom border by default", () => { + const { container } = render( + + + + ); + expect(container.firstChild).toHaveClass("border-b"); + }); + + it("removes the bottom border on the last row", () => { + const { container } = render( + <> + + + + + + + + ); + const rows = container.querySelectorAll(".border-b"); + expect(rows).toHaveLength(2); + const lastRow = rows[rows.length - 1]; + expect(lastRow).toHaveClass("last:border-b-0"); + }); +}); \ No newline at end of file diff --git a/src/components/ui/SettingsRow.tsx b/src/components/ui/SettingsRow.tsx new file mode 100644 index 0000000..65410bc --- /dev/null +++ b/src/components/ui/SettingsRow.tsx @@ -0,0 +1,21 @@ +import type { ReactNode } from "react"; + +interface SettingsRowProps { + title: string; + description?: string; + children: ReactNode; +} + +export function SettingsRow({ title, description, children }: SettingsRowProps) { + return ( +
+
+
{title}
+ {description && ( +
{description}
+ )} +
+
{children}
+
+ ); +} \ No newline at end of file diff --git a/src/components/ui/SettingsSection.test.tsx b/src/components/ui/SettingsSection.test.tsx new file mode 100644 index 0000000..3eb716f --- /dev/null +++ b/src/components/ui/SettingsSection.test.tsx @@ -0,0 +1,25 @@ +import { describe, it, expect } from "vitest"; +import { render, screen } from "@testing-library/react"; +import { SettingsSection } from "./SettingsSection"; + +describe("SettingsSection", () => { + it("renders the title and children", () => { + render( + +
Content
+
+ ); + expect(screen.getByText("Appearance")).toBeInTheDocument(); + expect(screen.getByText("Content")).toBeInTheDocument(); + }); + + it("uses the surface background on the inner card", () => { + const { container } = render( + +
+ + ); + const card = container.querySelector(".bg-surface"); + expect(card).toBeInTheDocument(); + }); +}); \ No newline at end of file diff --git a/src/components/ui/SettingsSection.tsx b/src/components/ui/SettingsSection.tsx new file mode 100644 index 0000000..2ce68ec --- /dev/null +++ b/src/components/ui/SettingsSection.tsx @@ -0,0 +1,17 @@ +import type { ReactNode } from "react"; + +interface SettingsSectionProps { + title: string; + children: ReactNode; +} + +export function SettingsSection({ title, children }: SettingsSectionProps) { + return ( +
+

{title}

+
+ {children} +
+
+ ); +} \ No newline at end of file diff --git a/src/components/ui/ThemePicker.test.tsx b/src/components/ui/ThemePicker.test.tsx new file mode 100644 index 0000000..113c45f --- /dev/null +++ b/src/components/ui/ThemePicker.test.tsx @@ -0,0 +1,13 @@ +import { describe, it, expect, vi } from "vitest"; +import { render, screen } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import { ThemePicker } from "./ThemePicker"; + +describe("ThemePicker", () => { + it("renders three options and emits selected theme", async () => { + const onChange = vi.fn(); + render(); + await userEvent.click(screen.getByRole("radio", { name: "System" })); + expect(onChange).toHaveBeenCalledWith("system"); + }); +}); \ No newline at end of file diff --git a/src/components/ui/ThemePicker.tsx b/src/components/ui/ThemePicker.tsx new file mode 100644 index 0000000..fc2904d --- /dev/null +++ b/src/components/ui/ThemePicker.tsx @@ -0,0 +1,41 @@ +import type { Theme } from "../../lib/types"; + +interface ThemePickerProps { + value: Theme; + onChange: (theme: Theme) => void; +} + +const THEMES: { value: Theme; label: string; previewClass: string }[] = [ + { value: "light", label: "Light", previewClass: "bg-zinc-100" }, + { value: "dark", label: "Dark", previewClass: "bg-surface" }, + { value: "system", label: "System", previewClass: "bg-gradient-to-br from-zinc-100 to-surface" }, +]; + +export function ThemePicker({ value, onChange }: ThemePickerProps) { + return ( +
+ {THEMES.map((theme) => ( + + ))} +
+ ); +} \ No newline at end of file diff --git a/src/components/ui/Toast.tsx b/src/components/ui/Toast.tsx new file mode 100644 index 0000000..62f26b9 --- /dev/null +++ b/src/components/ui/Toast.tsx @@ -0,0 +1,41 @@ +import { useNotificationStore } from "../../stores/notificationStore"; +import { X, CheckCircle, AlertCircle, Info } from "lucide-react"; + +const ICONS = { + success: CheckCircle, + error: AlertCircle, + info: Info, +}; + +const STYLES = { + success: "border-green-500/40 bg-green-500/10 text-green-300", + error: "border-red-500/40 bg-red-500/10 text-red-300", + info: "border-accent/40 bg-accent/10 text-accent-muted", +}; + +export function ToastContainer() { + const notifications = useNotificationStore((s) => s.notifications); + const dismiss = useNotificationStore((s) => s.dismiss); + + if (notifications.length === 0) return null; + + return ( +
+ {notifications.map((n) => { + const Icon = ICONS[n.type]; + return ( +
+ + {n.message} + +
+ ); + })} +
+ ); +} \ No newline at end of file diff --git a/src/components/ui/Toggle.test.tsx b/src/components/ui/Toggle.test.tsx new file mode 100644 index 0000000..61cc638 --- /dev/null +++ b/src/components/ui/Toggle.test.tsx @@ -0,0 +1,23 @@ +import { describe, it, expect, vi } from "vitest"; +import { render, screen } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import { Toggle } from "./Toggle"; + +describe("Toggle", () => { + it("renders checked state", () => { + render(); + expect(screen.getByRole("switch", { name: "Enable" })).toHaveAttribute("aria-checked", "true"); + }); + + it("renders unchecked state", () => { + render(); + expect(screen.getByRole("switch", { name: "Enable" })).toHaveAttribute("aria-checked", "false"); + }); + + it("calls onChange when clicked", async () => { + const onChange = vi.fn(); + render(); + await userEvent.click(screen.getByRole("switch", { name: "Enable" })); + expect(onChange).toHaveBeenCalledWith(true); + }); +}); \ No newline at end of file diff --git a/src/components/ui/Toggle.tsx b/src/components/ui/Toggle.tsx new file mode 100644 index 0000000..c2424c8 --- /dev/null +++ b/src/components/ui/Toggle.tsx @@ -0,0 +1,32 @@ +import { useId } from "react"; + +interface ToggleProps { + checked: boolean; + onChange: (checked: boolean) => void; + label?: string; + disabled?: boolean; +} + +export function Toggle({ checked, onChange, label, disabled }: ToggleProps) { + const id = useId(); + return ( + + ); +} \ No newline at end of file diff --git a/src/components/ui/Tooltip.test.tsx b/src/components/ui/Tooltip.test.tsx new file mode 100644 index 0000000..d4a35cb --- /dev/null +++ b/src/components/ui/Tooltip.test.tsx @@ -0,0 +1,45 @@ +import { describe, it, expect } from "vitest"; +import { render, screen } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import { Tooltip, TooltipProvider } from "./Tooltip"; + +describe("Tooltip", () => { + it("renders children", () => { + render( + + + + + + ); + expect(screen.getByText("Hover me")).toBeInTheDocument(); + }); + + it("shows tooltip on hover", async () => { + const user = userEvent.setup(); + render( + + + + + + ); + await user.hover(screen.getByText("Hover me")); + expect(await screen.findByText("Help text")).toBeInTheDocument(); + }); + + it("hides tooltip on unhover", async () => { + const user = userEvent.setup(); + render( + + + + + + ); + await user.hover(screen.getByText("Hover me")); + expect(await screen.findByText("Help text")).toBeInTheDocument(); + await user.unhover(screen.getByText("Hover me")); + expect(screen.queryByText("Help text")).not.toBeInTheDocument(); + }); +}); \ No newline at end of file diff --git a/src/components/ui/Tooltip.tsx b/src/components/ui/Tooltip.tsx new file mode 100644 index 0000000..4ea3c26 --- /dev/null +++ b/src/components/ui/Tooltip.tsx @@ -0,0 +1,112 @@ +import { createContext, useContext, useId, useRef, useState, useCallback, type Dispatch, type ReactElement, type ReactNode, type SetStateAction } from "react"; + +interface TooltipContextValue { + activeId: string | null; + setActiveId: Dispatch>; +} + +const TooltipContext = createContext(null); + +function useTooltipContext() { + const ctx = useContext(TooltipContext); + if (!ctx) { + throw new Error("Tooltip must be used inside a TooltipProvider"); + } + return ctx; +} + +interface TooltipProviderProps { + children: ReactNode; +} + +export function TooltipProvider({ children }: TooltipProviderProps) { + const [activeId, setActiveId] = useState(null); + return ( + + {children} + + ); +} + +interface TooltipProps { + content: ReactNode; + children: ReactElement; + side?: "top" | "right" | "bottom" | "left"; +} + +function tooltipClasses(side: "top" | "right" | "bottom" | "left") { + switch (side) { + case "right": + return { + wrapper: "left-full ml-2 top-1/2 -translate-y-1/2", + arrow: "right-full top-1/2 -translate-y-1/2 border-r-surface-raised", + }; + case "bottom": + return { + wrapper: "top-full left-1/2 -translate-x-1/2 mt-2", + arrow: "bottom-full left-1/2 -translate-x-1/2 border-b-surface-raised", + }; + case "left": + return { + wrapper: "right-full mr-2 top-1/2 -translate-y-1/2", + arrow: "left-full top-1/2 -translate-y-1/2 border-l-surface-raised", + }; + case "top": + default: + return { + wrapper: "bottom-full left-1/2 -translate-x-1/2 mb-2", + arrow: "top-full left-1/2 -translate-x-1/2 border-t-surface-raised", + }; + } +} + +export function Tooltip({ content, children, side = "top" }: TooltipProps) { + const id = useId(); + const { activeId, setActiveId } = useTooltipContext(); + const showTimer = useRef | null>(null); + const isActive = activeId === id; + const tc = tooltipClasses(side); + + const clearTimer = useCallback(() => { + if (showTimer.current) { + clearTimeout(showTimer.current); + showTimer.current = null; + } + }, []); + + const show = useCallback(() => { + clearTimer(); + showTimer.current = setTimeout(() => { + setActiveId(id); + }, 300); + }, [clearTimer, id, setActiveId]); + + const hide = useCallback(() => { + clearTimer(); + setActiveId((prev) => (prev === id ? null : prev)); + }, [clearTimer, id, setActiveId]); + + return ( + + {children} + {isActive && ( + + {content} + + )} + + ); +} \ No newline at end of file diff --git a/src/hooks/useConnections.ts b/src/hooks/useConnections.ts new file mode 100644 index 0000000..03b7678 --- /dev/null +++ b/src/hooks/useConnections.ts @@ -0,0 +1,29 @@ +import { useConnectionStore } from "../stores/connectionStore"; +import { useUiStore } from "../stores/uiStore"; +import { filterConnections, getDescendantFolderIds } from "../lib/utils"; +import type { Connection } from "../lib/types"; + +export function useFilteredConnections(): Connection[] { + const connections = useConnectionStore((s) => s.connections); + const tags = useConnectionStore((s) => s.tags); + const folders = useConnectionStore((s) => s.folders); + const searchQuery = useUiStore((s) => s.searchQuery); + const activeFolderId = useUiStore((s) => s.activeFolderId); + const activeTagIds = useUiStore((s) => s.activeTagIds); + const activeDbTypes = useUiStore((s) => s.activeDbTypes); + + let filtered = filterConnections(connections, tags, { + query: searchQuery, + activeTagIds, + activeDbTypes, + }); + + if (activeFolderId) { + const allowed = new Set(getDescendantFolderIds(folders, activeFolderId)); + filtered = filtered.filter( + (c) => c.folder_id !== null && allowed.has(c.folder_id), + ); + } + + return filtered; +} \ No newline at end of file diff --git a/src/hooks/useDbConnection.ts b/src/hooks/useDbConnection.ts new file mode 100644 index 0000000..72bc2e3 --- /dev/null +++ b/src/hooks/useDbConnection.ts @@ -0,0 +1,117 @@ +import { useEffect, useCallback, useRef, useState } from "react"; +import { useConnectionStore } from "../stores/connectionStore"; +import { useDbViewerStore } from "../stores/dbViewerStore"; +import { useNotificationStore } from "../stores/notificationStore"; +import * as cmd from "../lib/commands"; +import type { ConnectionInput } from "../lib/types"; + +export function useDbConnection(connectionId: string) { + const reset = useDbViewerStore((s) => s.reset); + const populate = useDbViewerStore((s) => s.populate); + const currentDatabase = useDbViewerStore((s) => s.currentDatabase); + const setCurrentDatabase = useDbViewerStore((s) => s.setCurrentDatabase); + const setCurrentSchema = useDbViewerStore((s) => s.setCurrentSchema); + const notify = useNotificationStore((s) => s.notify); + const [connectionError, setConnectionError] = useState(null); + const inputRef = useRef(null); + const initialDbRef = useRef(null); + + const connect = useCallback(async () => { + const conn = useConnectionStore + .getState() + .connections.find((c) => c.id === connectionId); + if (!conn) { + setConnectionError("Connection not found"); + return; + } + try { + const password = await useConnectionStore.getState().getConnectionPassword(conn.id).catch(() => null); + const input: ConnectionInput = { + name: conn.name, + db_type: conn.db_type, + host: conn.host, + port: conn.port, + username: conn.username, + password, + database: conn.database, + folder_id: conn.folder_id, + ssh_host: conn.ssh_host, + ssh_port: conn.ssh_port, + ssh_user: conn.ssh_user, + ssh_auth_method: + conn.ssh_auth_method as "password" | "key" | null | undefined, + ssh_private_key_path: conn.ssh_private_key_path, + ssl_mode: + conn.ssl_mode as + | "disable" + | "require" + | "verify-ca" + | "verify-full" + | null + | undefined, + ssl_ca_path: conn.ssl_ca_path, + ssl_cert_path: conn.ssl_cert_path, + ssl_key_path: conn.ssl_key_path, + }; + await cmd.dbConnect(connectionId, input); + setConnectionError(null); + inputRef.current = input; + + // Load initial data + const databases = await cmd + .getDatabases(connectionId) + .catch(() => [] as string[]); + const schemas = await cmd + .getSchemas(connectionId) + .catch(() => [] as string[]); + const tables = await cmd.getTables(connectionId); + populate(databases, schemas, tables); + if (databases.length > 0) { + setCurrentDatabase(databases[0]); + initialDbRef.current = databases[0]; + } + if (schemas.length > 0) setCurrentSchema(schemas[0]); + } catch (e) { + const msg = e instanceof Error ? e.message : String(e); + setConnectionError(msg); + notify(`Failed to connect: ${msg}`, "error"); + } + }, [connectionId, populate, setCurrentDatabase, setCurrentSchema, notify]); + + useEffect(() => { + connect(); + return () => { + cmd.dbDisconnect(connectionId).catch(() => {}); + const hasPending = useDbViewerStore + .getState() + .changesQueue.some((c) => c.status === "pending"); + if (!hasPending) reset(); + }; + }, [connectionId, connect, reset]); + + // Database switch effect: reconnect when user changes database from dropdown + useEffect(() => { + if (!currentDatabase || !inputRef.current) return; + if (currentDatabase === initialDbRef.current) return; + + const reconnect = async () => { + const input = { ...inputRef.current!, database: currentDatabase }; + try { + await cmd.dbConnect(connectionId, input); + const schemas = await cmd.getSchemas(connectionId); + const tables = await cmd.getTables(connectionId); + populate( + useDbViewerStore.getState().databases, + schemas, + tables, + ); + if (schemas.length > 0) setCurrentSchema(schemas[0]); + } catch { + /* silent */ + } + }; + reconnect(); + }, [currentDatabase, connectionId, populate, setCurrentSchema]); + + return { connectionError, connect }; +} \ No newline at end of file diff --git a/src/hooks/useSearch.test.ts b/src/hooks/useSearch.test.ts new file mode 100644 index 0000000..2f8a0f6 --- /dev/null +++ b/src/hooks/useSearch.test.ts @@ -0,0 +1,37 @@ +import { describe, it, expect, vi, beforeEach, afterEach } from "vitest"; +import { renderHook, act } from "@testing-library/react"; +import { useSearch } from "./useSearch"; + +beforeEach(() => vi.useFakeTimers()); +afterEach(() => vi.useRealTimers()); + +describe("useSearch", () => { + it("returns initial empty value", () => { + const { result } = renderHook(() => useSearch("")); + expect(result.current.debounced).toBe(""); + }); + + it("debounces value updates by 150ms", () => { + const { result, rerender } = renderHook(({ q }) => useSearch(q), { + initialProps: { q: "" }, + }); + rerender({ q: "prod" }); + expect(result.current.debounced).toBe(""); + + act(() => vi.advanceTimersByTime(149)); + expect(result.current.debounced).toBe(""); + + act(() => vi.advanceTimersByTime(1)); + expect(result.current.debounced).toBe("prod"); + }); + + it("resets debounce when value returns to empty", () => { + const { result, rerender } = renderHook(({ q }) => useSearch(q), { + initialProps: { q: "" }, + }); + rerender({ q: "x" }); + rerender({ q: "" }); + act(() => vi.advanceTimersByTime(200)); + expect(result.current.debounced).toBe(""); + }); +}); \ No newline at end of file diff --git a/src/hooks/useSearch.ts b/src/hooks/useSearch.ts new file mode 100644 index 0000000..60f012b --- /dev/null +++ b/src/hooks/useSearch.ts @@ -0,0 +1,12 @@ +import { useEffect, useState } from "react"; + +export function useSearch(query: string): { debounced: string } { + const [debounced, setDebounced] = useState(query); + + useEffect(() => { + const t = setTimeout(() => setDebounced(query), 150); + return () => clearTimeout(t); + }, [query]); + + return { debounced }; +} \ No newline at end of file diff --git a/src/hooks/useShortcut.ts b/src/hooks/useShortcut.ts new file mode 100644 index 0000000..f79430f --- /dev/null +++ b/src/hooks/useShortcut.ts @@ -0,0 +1,45 @@ +import { useEffect } from "react"; +import { useSettingsStore } from "../stores/settingsStore"; + +// Default macOS shortcuts (used when no custom binding is set) +const DEFAULTS: Record = { + command_palette: "Meta+k", + close_tab: "Meta+w", +}; + +// Normalize key combo from settings (e.g. "Meta+K" → { metaKey: true, key: "k" }) +function parseCombo(combo: string): { metaKey: boolean; ctrlKey: boolean; key: string } | null { + if (!combo) return null; + const parts = combo.toLowerCase().split("+"); + const metaKey = parts.includes("meta") || parts.includes("cmd"); + const ctrlKey = parts.includes("ctrl"); + // The last part is the key + const key = parts.filter((p) => !["meta", "cmd", "ctrl", "shift", "alt"].includes(p)).join("+"); + if (!key) return null; + return { metaKey, ctrlKey, key }; +} + +export function useShortcut( + action: string, + callback: () => void, +) { + const settings = useSettingsStore((s) => s.settings); + + useEffect(() => { + // Get the combo from settings or use default + const raw = settings?.shortcuts?.[action] ?? DEFAULTS[action]; + const combo = parseCombo(raw); + if (!combo) return; + + const handler = (e: KeyboardEvent) => { + const metaMatch = combo.metaKey ? (e.metaKey || e.ctrlKey) : e.metaKey === combo.metaKey && e.ctrlKey === combo.ctrlKey; + if (metaMatch && e.key.toLowerCase() === combo.key) { + e.preventDefault(); + callback(); + } + }; + + window.addEventListener("keydown", handler); + return () => window.removeEventListener("keydown", handler); + }, [action, callback, settings?.shortcuts]); +} \ No newline at end of file diff --git a/src/hooks/useSortedTags.ts b/src/hooks/useSortedTags.ts new file mode 100644 index 0000000..07c932f --- /dev/null +++ b/src/hooks/useSortedTags.ts @@ -0,0 +1,22 @@ +import { useMemo } from "react"; +import type { Tag } from "../lib/types"; +import { useConnectionStore } from "../stores/connectionStore"; + +export function useSortedTags(): Tag[] { + const tags = useConnectionStore((s) => s.tags); + const tagOrder = useConnectionStore((s) => s.tagOrder); + + return useMemo(() => { + if (tagOrder.length === 0) return tags; + const orderMap = new Map(tagOrder.map((id, i) => [id, i])); + const sorted = [...tags].sort((a, b) => { + const ai = orderMap.get(a.id); + const bi = orderMap.get(b.id); + if (ai !== undefined && bi !== undefined) return ai - bi; + if (ai !== undefined) return -1; + if (bi !== undefined) return 1; + return a.name.localeCompare(b.name); + }); + return sorted; + }, [tags, tagOrder]); +} \ No newline at end of file diff --git a/src/index.css b/src/index.css new file mode 100644 index 0000000..9c309da --- /dev/null +++ b/src/index.css @@ -0,0 +1,48 @@ +@import "tailwindcss"; +@import "@fontsource/space-mono"; +@import "@fontsource/outfit"; + +@custom-variant dark (&:where(.dark, .dark *)); + +@theme { + --color-canvas: #0A0A0B; + --color-surface: #18181B; + --color-surface-raised: #27272A; + --color-border: #27272A; + --color-border-hover: #3F3F46; + --color-text: #FAFAFA; + --color-text-muted: #A1A1AA; + --color-accent: #2563EB; + --color-accent-hover: #1D4ED8; + --color-accent-muted: #60A5FA; + --font-family-heading: "Space Mono", monospace; + --font-family-sans: "Outfit", sans-serif; +} + +:root { + color-scheme: dark; +} + +html, body { + background-color: var(--color-canvas); + color: white; + font-family: var(--font-family-sans); + -webkit-font-smoothing: antialiased; + overscroll-behavior: none; + overflow: hidden; +} + +html { + height: 100%; +} + +body { + min-height: 100%; +} + +@utility glass { + background-color: color-mix(in srgb, var(--color-surface) 90%, transparent); + backdrop-filter: blur(12px); + border: 1px solid var(--color-border); + border-radius: 0.75rem; +} \ No newline at end of file diff --git a/src/lib/commands.test.ts b/src/lib/commands.test.ts new file mode 100644 index 0000000..b934018 --- /dev/null +++ b/src/lib/commands.test.ts @@ -0,0 +1,50 @@ +import { describe, it, expect } from "vitest"; +import { + testConnection, + dbConnect, + dbDisconnect, + getDatabases, + getSchemas, + getTables, + getTableData, + executeChange, + refreshConnection, +} from "./commands"; + +describe("commands", () => { + it("testConnection has correct signature", () => { + expect(typeof testConnection).toBe("function"); + }); + + it("dbConnect returns void promise", () => { + expect(typeof dbConnect).toBe("function"); + }); + + it("dbDisconnect returns void promise", () => { + expect(typeof dbDisconnect).toBe("function"); + }); + + it("getDatabases returns string array promise", () => { + expect(typeof getDatabases).toBe("function"); + }); + + it("getSchemas returns string array promise", () => { + expect(typeof getSchemas).toBe("function"); + }); + + it("getTables returns TableInfo array promise", () => { + expect(typeof getTables).toBe("function"); + }); + + it("getTableData returns QueryResult-shaped promise", () => { + expect(typeof getTableData).toBe("function"); + }); + + it("executeChange returns void promise", () => { + expect(typeof executeChange).toBe("function"); + }); + + it("refreshConnection returns full tree promise", () => { + expect(typeof refreshConnection).toBe("function"); + }); +}); \ No newline at end of file diff --git a/src/lib/commands.ts b/src/lib/commands.ts new file mode 100644 index 0000000..c56cb1e --- /dev/null +++ b/src/lib/commands.ts @@ -0,0 +1,99 @@ +import { invoke } from "@tauri-apps/api/core"; +import type { Connection, ConnectionInput, ConnectionTestResult, Folder, FolderInput, Tag, TagInput, Settings, ImportResult, TableInfo, QueryResult, ChangeItem } from "./types"; + +// NOTE on argument key naming: +// Tauri v2's #[tauri::command] macro converts Rust snake_case parameter names +// to camelCase keys on the IPC boundary. So a Rust param `connection_id` must be +// sent as `connectionId` here, `page_size` as `pageSize`, `tag_ids` as `tagIds`, +// `folder_id` as `folderId`. Single-word params (id, input, config, json, schema, +// table, page, key, value, change) are unchanged. + +export async function getConnections(): Promise { return invoke("get_connections"); } +export async function createConnection(input: ConnectionInput): Promise { return invoke("create_connection", { input }); } +export async function updateConnection(id: string, input: ConnectionInput): Promise { return invoke("update_connection", { id, input }); } +export async function deleteConnection(id: string): Promise { return invoke("delete_connection", { id }); } +export async function addConnectionTags(connectionId: string, tagIds: string[]): Promise { return invoke("add_connection_tags", { connectionId, tagIds }); } +export async function getFolders(): Promise { return invoke("get_folders"); } +export async function createFolder(input: FolderInput): Promise { return invoke("create_folder", { input }); } +export async function updateFolder(id: string, input: FolderInput): Promise { return invoke("update_folder", { id, input }); } +export async function deleteFolder(id: string): Promise { return invoke("delete_folder", { id }); } +export async function addFolderTags(folderId: string, tagIds: string[]): Promise { return invoke("add_folder_tags", { folderId, tagIds }); } +export async function getTags(): Promise { return invoke("get_tags"); } +export async function createTag(input: TagInput): Promise { return invoke("create_tag", { input }); } +export async function deleteTag(id: string): Promise { return invoke("delete_tag", { id }); } +export async function updateTag(id: string, input: TagInput): Promise { return invoke("update_tag", { id, input }); } +export async function getSettings(): Promise { return invoke("get_settings"); } +export async function updateSetting(key: string, value: string): Promise { return invoke("update_setting", { key, value }); } +export async function importConnections(json: string): Promise { return invoke("import_connections", { json }); } +export async function exportConnections(): Promise { return invoke("export_connections"); } +export async function testConnection(input: ConnectionInput): Promise { + return invoke("test_connection", { config: input }); +} + +// ─── Keychain ────────────────────────────────────────────────── + +export async function saveConnectionPassword(connectionId: string, password: string): Promise { + return invoke("save_connection_password", { connectionId, password }); +} + +export async function getConnectionPassword(connectionId: string): Promise { + return invoke("get_connection_password", { connectionId }); +} + +export async function deleteConnectionPassword(connectionId: string): Promise { + return invoke("delete_connection_password", { connectionId }); +} + +export async function recreateDemoDb(): Promise { + return invoke("recreate_demo_db"); +} + +// ─── DB Viewer Lifecycle ──────────────────────────────────────── + +export async function dbConnect(connectionId: string, input: ConnectionInput): Promise { + return invoke("db_connect", { connectionId, config: input }); +} + +export async function dbDisconnect(connectionId: string): Promise { + return invoke("db_disconnect", { connectionId }); +} + +export async function getDatabases(connectionId: string): Promise { + return invoke("get_databases", { connectionId }); +} + +export async function getSchemas(connectionId: string): Promise { + return invoke("get_schemas", { connectionId }); +} + +export async function getTables(connectionId: string, schema?: string): Promise { + return invoke("get_tables", { connectionId, schema }); +} + +export async function getTableData( + connectionId: string, + schema: string, + table: string, + page?: number, + pageSize?: number, +): Promise { + return invoke("get_table_data", { connectionId, schema, table, page, pageSize }); +} + +export async function executeChange(connectionId: string, change: ChangeItem): Promise { + return invoke("execute_change", { connectionId, change }); +} + +export async function getFkPreview( + connectionId: string, + schema: string, + table: string, + column: string, + value: string, +): Promise { + return invoke("get_fk_preview", { connectionId, schema, table, column, value }); +} + +export async function refreshConnection(connectionId: string): Promise { + return invoke("refresh_connection", { connectionId }); +} \ No newline at end of file diff --git a/src/lib/connectionString.test.ts b/src/lib/connectionString.test.ts new file mode 100644 index 0000000..4531d60 --- /dev/null +++ b/src/lib/connectionString.test.ts @@ -0,0 +1,126 @@ +import { describe, it, expect } from "vitest"; +import { parseConnectionString, looksLikeConnectionString } from "./connectionString"; + +describe("parseConnectionString", () => { + it("parses a PostgreSQL URL", () => { + const result = parseConnectionString("postgresql://user:pass@localhost:5432/mydb"); + expect(result).toEqual({ + db_type: "postgresql", + host: "localhost", + port: 5432, + username: "user", + password: "pass", + database: "mydb", + }); + }); + + it("parses a MySQL URL without password", () => { + const result = parseConnectionString("mysql://root@127.0.0.1:3306/app"); + expect(result).toEqual({ + db_type: "mysql", + host: "127.0.0.1", + port: 3306, + username: "root", + password: null, + database: "app", + }); + }); + + it("parses a Redis URL", () => { + const result = parseConnectionString("redis://user:pass@localhost:6379/0"); + expect(result).toEqual({ + db_type: "redis", + host: "localhost", + port: 6379, + username: "user", + password: "pass", + database: "0", + }); + }); + + it("parses a SQLite file URL", () => { + const result = parseConnectionString("sqlite:///path/to/db.sqlite"); + expect(result).toEqual({ + db_type: "sqlite", + host: "localhost", + port: null, + username: null, + password: null, + database: "/path/to/db.sqlite", + }); + }); + + it("defaults PostgreSQL port to 5432 when omitted", () => { + const result = parseConnectionString("postgresql://user@host/db"); + expect(result).toEqual({ + db_type: "postgresql", + host: "host", + port: 5432, + username: "user", + password: null, + database: "db", + }); + }); + + it("preserves database name when query parameters are present", () => { + const result = parseConnectionString("postgresql://user@host/db?sslmode=require"); + expect(result).toEqual({ + db_type: "postgresql", + host: "host", + port: 5432, + username: "user", + password: null, + database: "db", + }); + }); + + it("returns null for an empty string", () => { + expect(parseConnectionString("")).toBeNull(); + }); + + it("returns null for a non-URL string", () => { + expect(parseConnectionString("hello world")).toBeNull(); + }); + + it("defaults MySQL port to 3306 when omitted", () => { + const result = parseConnectionString("mysql://user@host/db"); + expect(result).toEqual({ + db_type: "mysql", + host: "host", + port: 3306, + username: "user", + password: null, + database: "db", + }); + }); + + it("defaults Redis port to 6379 when omitted", () => { + const result = parseConnectionString("redis://localhost"); + expect(result).toEqual({ + db_type: "redis", + host: "localhost", + port: 6379, + username: null, + password: null, + database: null, + }); + }); +}); + +describe("looksLikeConnectionString", () => { + it("returns true for postgres URL", () => { + expect(looksLikeConnectionString("postgresql://a@b/c")).toBe(true); + }); + + it("returns true for Redis URL", () => { + expect(looksLikeConnectionString("redis://localhost")).toBe(true); + }); + + it("returns true for SQLite URL", () => { + expect(looksLikeConnectionString("sqlite:///path/to/db.sqlite")).toBe(true); + }); + + it("returns false for normal search text", () => { + expect(looksLikeConnectionString("production database")).toBe(false); + }); +}); diff --git a/src/lib/connectionString.ts b/src/lib/connectionString.ts new file mode 100644 index 0000000..6774bd8 --- /dev/null +++ b/src/lib/connectionString.ts @@ -0,0 +1,71 @@ +import type { DbType } from "./types"; + +export interface ParsedConnectionString { + db_type: DbType; + host: string; + port: number | null; + username: string | null; + password: string | null; + database: string | null; +} + +const DB_PROTOCOLS: Record = { + "postgresql:": "postgresql", + "postgres:": "postgresql", + "mysql:": "mysql", + "sqlite:": "sqlite", + "file:": "sqlite", + "redis:": "redis", + "rediss:": "redis", +}; + +const DEFAULT_PORTS: Record = { + postgresql: 5432, + mysql: 3306, + sqlite: null, + redis: 6379, +}; + +export function parseConnectionString(input: string): ParsedConnectionString | null { + const trimmed = input.trim(); + if (!trimmed) return null; + + let url: URL; + try { + url = new URL(trimmed); + } catch { + return null; + } + + const db_type = DB_PROTOCOLS[url.protocol]; + if (!db_type) return null; + + const host = url.hostname || "localhost"; + const port = url.port ? Number(url.port) : (DEFAULT_PORTS[db_type] ?? null); + const username = url.username || null; + const password = url.password || null; + const pathname = url.pathname; + const database = db_type === "sqlite" + ? (pathname || null) + : (pathname.replace(/^\//, "") || null); + + return { + db_type, + host, + port, + username, + password, + database, + }; +} + +export function looksLikeConnectionString(input: string): boolean { + const trimmed = input.trim(); + if (!trimmed) return false; + try { + const url = new URL(trimmed); + return !!DB_PROTOCOLS[url.protocol]; + } catch { + return false; + } +} diff --git a/src/lib/dbIcons.ts b/src/lib/dbIcons.ts new file mode 100644 index 0000000..adbc224 --- /dev/null +++ b/src/lib/dbIcons.ts @@ -0,0 +1,15 @@ +import type { DbType } from "./types"; + +export const DB_ICONS: Record = { + postgresql: "🐘", + mysql: "🐬", + redis: "⚡", + sqlite: "🗄️", +}; + +export const DB_LABELS: Record = { + postgresql: "PostgreSQL", + mysql: "MySQL", + redis: "Redis", + sqlite: "SQLite", +}; \ No newline at end of file diff --git a/src/lib/environment.ts b/src/lib/environment.ts new file mode 100644 index 0000000..27e79b2 --- /dev/null +++ b/src/lib/environment.ts @@ -0,0 +1,13 @@ +export type Environment = "production" | "staging" | "development" | null; + +export const ENV_LABELS: Record = { + production: "Production", + staging: "Staging", + development: "Development", +}; + +export const ENV_COLORS: Record = { + production: "bg-red-500/20 text-red-400 border-red-500/30", + staging: "bg-amber-500/20 text-amber-400 border-amber-500/30", + development: "bg-emerald-500/20 text-emerald-400 border-emerald-500/30", +}; \ No newline at end of file diff --git a/src/lib/importExport.test.ts b/src/lib/importExport.test.ts new file mode 100644 index 0000000..5d5ead3 --- /dev/null +++ b/src/lib/importExport.test.ts @@ -0,0 +1,55 @@ +import { describe, it, expect, vi } from "vitest"; +import { handleImport, handleExport } from "./importExport"; +import * as commands from "./commands"; + +vi.mock("@tauri-apps/plugin-dialog", () => ({ + open: vi.fn(), + save: vi.fn(), +})); +vi.mock("@tauri-apps/plugin-fs", () => ({ + readTextFile: vi.fn(), + writeTextFile: vi.fn(), +})); + +describe("handleImport", () => { + it("returns null when user cancels (no file selected)", async () => { + const { open } = await import("@tauri-apps/plugin-dialog"); + (open as any).mockResolvedValue(null); + const result = await handleImport(); + expect(result).toBeNull(); + }); + it("imports and reloads when a file is selected", async () => { + const { open } = await import("@tauri-apps/plugin-dialog"); + const { readTextFile } = await import("@tauri-apps/plugin-fs"); + (open as any).mockResolvedValue("/path/to/connections.json"); + (readTextFile as any).mockResolvedValue( + '[{"name":"A","db_type":"postgresql","host":"h","port":5432}]', + ); + const spy = vi + .spyOn(commands, "importConnections") + .mockResolvedValue({ imported: 1, skipped: 0, skippedRecords: [] }); + const result = await handleImport(); + expect(spy).toHaveBeenCalled(); + expect(result?.imported).toBe(1); + }); +}); + +describe("handleExport", () => { + it("returns null when user cancels", async () => { + const { save } = await import("@tauri-apps/plugin-dialog"); + (save as any).mockResolvedValue(null); + const result = await handleExport(); + expect(result).toBeNull(); + }); + it("exports to selected path", async () => { + const { save } = await import("@tauri-apps/plugin-dialog"); + const { writeTextFile } = await import("@tauri-apps/plugin-fs"); + (save as any).mockResolvedValue("/path/out.json"); + (writeTextFile as any).mockResolvedValue(undefined); + vi.spyOn(commands, "exportConnections").mockResolvedValue( + '{"version":1,"connections":[]}', + ); + const result = await handleExport(); + expect(result).toBe("/path/out.json"); + }); +}); \ No newline at end of file diff --git a/src/lib/importExport.ts b/src/lib/importExport.ts new file mode 100644 index 0000000..d01cab4 --- /dev/null +++ b/src/lib/importExport.ts @@ -0,0 +1,24 @@ +import { open, save } from "@tauri-apps/plugin-dialog"; +import { readTextFile, writeTextFile } from "@tauri-apps/plugin-fs"; +import { importConnections, exportConnections } from "./commands"; +import type { ImportResult } from "./types"; + +export async function handleImport(): Promise { + const filePath = await open({ + filters: [{ name: "JSON", extensions: ["json"] }], + }); + if (!filePath) return null; + const json = await readTextFile(filePath); + return importConnections(json); +} + +export async function handleExport(): Promise { + const filePath = await save({ + defaultPath: "connections.json", + filters: [{ name: "JSON", extensions: ["json"] }], + }); + if (!filePath) return null; + const json = await exportConnections(); + await writeTextFile(filePath, json); + return filePath; +} \ No newline at end of file diff --git a/src/lib/types.test.ts b/src/lib/types.test.ts new file mode 100644 index 0000000..be7e9d2 --- /dev/null +++ b/src/lib/types.test.ts @@ -0,0 +1,361 @@ +import { describe, it, expect } from "vitest"; +import type { + Connection, + ConnectionInput, + ActiveView, + TableInfo, + ColumnInfo, + QueryResult, + ChangeItem, + ChangeItemType, + ChangeStatus, + DbViewerTab, + ConnectionTestResult, +} from "./types"; + +describe("ActiveView", () => { + it("includes db-viewer", () => { + const view: ActiveView = "db-viewer"; + expect(view).toBe("db-viewer"); + }); +}); + +describe("Connection", () => { + it("accepts new SSH/SSL fields", () => { + const conn: Connection = { + id: "c1", + name: "Test", + db_type: "postgresql", + host: "localhost", + port: 5432, + username: "admin", + folder_id: null, + keychain_ref: null, + tag_ids: [], + created_at: "2024-01-01T00:00:00Z", + updated_at: "2024-01-01T00:00:00Z", + // new SSH/SSL fields + database: "mydb", + ssh_host: "bastion.example.com", + ssh_port: 22, + ssh_user: "tunnel", + ssh_auth_method: "key", + ssh_private_key_path: "/home/user/.ssh/id_rsa", + ssl_mode: "require", + ssl_ca_path: "/etc/ssl/certs/ca.pem", + ssl_cert_path: "/etc/ssl/certs/client.crt", + ssl_key_path: "/etc/ssl/certs/client.key", + }; + expect(conn.ssh_host).toBe("bastion.example.com"); + expect(conn.database).toBe("mydb"); + expect(conn.ssl_mode).toBe("require"); + }); + + it("does not include sensitive SSH/SSL fields (password/ssh_passphrase)", () => { + // TypeScript compile check: these should not be assignable + const conn: Connection = { + id: "c2", + name: "Minimal", + db_type: "postgresql", + host: "localhost", + port: null, + username: null, + folder_id: null, + keychain_ref: null, + tag_ids: [], + created_at: "2024-01-01T00:00:00Z", + updated_at: "2024-01-01T00:00:00Z", + }; + // @ts-expect-error - password must NOT exist on Connection + conn.password; + // @ts-expect-error - ssh_passphrase must NOT exist on Connection + conn.ssh_passphrase; + expect(conn.host).toBe("localhost"); + }); + + it("accepts SSH fields as optional (minimal connection)", () => { + const conn: Connection = { + id: "c3", + name: "Minimal", + db_type: "postgresql", + host: "localhost", + port: null, + username: null, + folder_id: null, + keychain_ref: null, + tag_ids: [], + created_at: "2024-01-01T00:00:00Z", + updated_at: "2024-01-01T00:00:00Z", + }; + expect(conn.ssh_host).toBeUndefined(); + expect(conn.database).toBeUndefined(); + }); +}); + +describe("ConnectionInput", () => { + it("accepts all SSH/SSL fields", () => { + const input: ConnectionInput = { + name: "Test", + db_type: "postgresql", + host: "localhost", + port: 5432, + ssh_host: "bastion.example.com", + ssh_port: 22, + ssh_user: "tunnel", + ssh_auth_method: "key", + ssh_private_key_path: "/home/user/.ssh/id_rsa", + ssh_passphrase: "s3cret", + ssl_mode: "verify-full", + ssl_ca_path: "/etc/ssl/certs/ca.pem", + ssl_cert_path: "/etc/ssl/certs/client.crt", + ssl_key_path: "/etc/ssl/certs/client.key", + password: "dbpass", + database: "mydb", + }; + expect(input.ssh_auth_method).toBe("key"); + expect(input.ssl_mode).toBe("verify-full"); + expect(input.ssh_passphrase).toBe("s3cret"); + expect(input.database).toBe("mydb"); + }); + + it("accepts password auth method", () => { + const input: ConnectionInput = { + name: "PW SSH", + db_type: "postgresql", + host: "db.example.com", + port: 5432, + ssh_host: "gateway.example.com", + ssh_port: 2222, + ssh_user: "proxy", + ssh_auth_method: "password", + }; + expect(input.ssh_auth_method).toBe("password"); + }); + + it("allows all SSH/SSL fields to be omitted", () => { + const input: ConnectionInput = { + name: "Simple", + db_type: "sqlite", + host: "localhost", + port: null, + }; + expect(input.ssh_host).toBeUndefined(); + expect(input.ssl_mode).toBeUndefined(); + }); +}); + +describe("TableInfo", () => { + it("has the correct shape", () => { + const table: TableInfo = { + name: "users", + schema: "public", + table_type: "TABLE", + }; + expect(table.name).toBe("users"); + expect(table.schema).toBe("public"); + expect(table.table_type).toBe("TABLE"); + }); + + it("accepts view type", () => { + const table: TableInfo = { name: "v1", schema: "public", table_type: "VIEW" }; + expect(table.table_type).toBe("VIEW"); + }); +}); + +describe("ColumnInfo", () => { + it("has the correct shape", () => { + const col: ColumnInfo = { + name: "id", + data_type: "integer", + is_nullable: false, + is_pk: true, + is_fk: false, + fk_ref: null, + default_value: null, + }; + expect(col.name).toBe("id"); + expect(col.is_pk).toBe(true); + }); + + it("supports foreign key references", () => { + const col: ColumnInfo = { + name: "user_id", + data_type: "integer", + is_nullable: true, + is_pk: false, + is_fk: true, + fk_ref: ["users", "id"], + default_value: null, + }; + expect(col.fk_ref?.[0]).toBe("users"); + }); +}); + +describe("QueryResult", () => { + it("is well-typed with columns and rows", () => { + const result: QueryResult = { + columns: [{name:"id",data_type:"text",is_pk:false,is_fk:false,is_nullable:false,default_value:null,fk_ref:null},{name:"name",data_type:"text",is_pk:false,is_fk:false,is_nullable:false,default_value:null,fk_ref:null},{name:"email",data_type:"text",is_pk:false,is_fk:false,is_nullable:false,default_value:null,fk_ref:null}], + rows: [ + [1, "Alice"], + [2, "Bob"], + ], + total_rows: 2, page: 1, page_size: 50, + execution_time_ms: 12.5, + }; + expect(result.columns.length).toBe(3); + expect(result.total_rows).toBe(2); + expect(result.execution_time_ms).toBe(12.5); + }); + + it("allows error state", () => { + const result: QueryResult = { + columns: [], + rows: [], + total_rows: 0, page: 1, page_size: 50, + error: "Syntax error near FROM", + }; + expect(result.error).toBe("Syntax error near FROM"); + }); + + it("can have null execution_time", () => { + const result: QueryResult = { + columns: [{name:"id",data_type:"text",is_pk:false,is_fk:false,is_nullable:false,default_value:null,fk_ref:null}], + rows: [], + total_rows: 0, page: 1, page_size: 50, + execution_time_ms: null, + }; + expect(result.execution_time_ms).toBeNull(); + }); +}); + +describe("ChangeItem", () => { + it("has a discriminated type", () => { + const createItem: ChangeItem = { + type: "create_table", + sql: "CREATE TABLE users (id INT)", + status: "pending", + id: "ch1", + description: "Create users table", + }; + expect(createItem.type).toBe("create_table"); + expect(createItem.status).toBe("pending"); + + const dropItem: ChangeItem = { + type: "drop_table", + sql: "DROP TABLE users", + status: "applied", + id: "ch2", + }; + expect(dropItem.type).toBe("drop_table"); + expect(dropItem.status).toBe("applied"); + }); + + it("accepts error status with error message", () => { + const item: ChangeItem = { + type: "alter_table", + sql: "ALTER TABLE users ADD COLUMN age INT", + status: "error", + error: "Column already exists", + id: "ch3", + }; + expect(item.status).toBe("error"); + expect(item.error).toBe("Column already exists"); + }); + + it("accepts all ChangeItemType values", () => { + const types: ChangeItemType[] = [ + "create_table", + "alter_table", + "drop_table", + "insert", + "update", + "delete", + "create_index", + "drop_index", + ]; + const item: ChangeItem = { + type: types[0], + sql: "test", + status: "pending", + id: "ch4", + }; + expect(types).toContain(item.type); + }); +}); + +describe("ChangeStatus", () => { + it("accepts all status values", () => { + const statuses: ChangeStatus[] = ["pending", "applied", "error"]; + expect(statuses).toHaveLength(3); + }); +}); + +describe("DbViewerTab", () => { + it("can be created with required fields", () => { + const tab: DbViewerTab = { + id: "tab1", + connection_id: "c1", + title: "Query 1", + created_at: "2024-01-01T00:00:00Z", + updated_at: "2024-01-01T00:00:00Z", + }; + expect(tab.title).toBe("Query 1"); + expect(tab.query).toBeUndefined(); + expect(tab.result).toBeUndefined(); + expect(tab.changes).toBeUndefined(); + }); + + it("can include query and result", () => { + const tab: DbViewerTab = { + id: "tab2", + connection_id: "c1", + title: "SELECT * FROM users", + query: "SELECT * FROM users", + result: { + columns: [{name:"id",data_type:"text",is_pk:false,is_fk:false,is_nullable:false,default_value:null,fk_ref:null},{name:"name",data_type:"text",is_pk:false,is_fk:false,is_nullable:false,default_value:null,fk_ref:null}], + rows: [], + total_rows: 0, page: 1, page_size: 50, + }, + created_at: "2024-01-01T00:00:00Z", + updated_at: "2024-01-01T00:00:00Z", + }; + expect(tab.query).toBe("SELECT * FROM users"); + expect(tab.result?.total_rows).toBe(0); + }); + + it("can include changes array", () => { + const tab: DbViewerTab = { + id: "tab3", + connection_id: "c1", + title: "Migration", + changes: [ + { type: "create_table", sql: "CREATE TABLE t (id INT)", status: "pending", id: "ch1" }, + ], + created_at: "2024-01-01T00:00:00Z", + updated_at: "2024-01-01T00:00:00Z", + }; + expect(tab.changes).toHaveLength(1); + expect(tab.changes![0].type).toBe("create_table"); + }); +}); + +describe("ConnectionTestResult", () => { + it("can represent a successful test", () => { + const result: ConnectionTestResult = { + ok: true, + server_version: "16.2", + latency_ms: 5, + }; + expect(result.ok).toBe(true); + expect(result.server_version).toBe("16.2"); + }); + + it("can represent a failed test with error", () => { + const result: ConnectionTestResult = { + ok: false, + error: "Connection refused", + }; + expect(result.ok).toBe(false); + expect(result.error).toBe("Connection refused"); + }); +}); \ No newline at end of file diff --git a/src/lib/types.ts b/src/lib/types.ts new file mode 100644 index 0000000..3bb6b60 --- /dev/null +++ b/src/lib/types.ts @@ -0,0 +1,188 @@ +export type DbType = "postgresql" | "mysql" | "sqlite" | "redis"; + +export type Theme = "dark" | "light" | "system"; +export type FontSize = "small" | "medium" | "large"; + +export interface Folder { + id: string; + name: string; + parent_id: string | null; + tag_ids: string[]; + created_at: string; + updated_at: string; +} + +export interface Tag { + id: string; + name: string; + color: string; + created_at: string; +} + +export interface Connection { + id: string; + name: string; + db_type: DbType; + host: string; + port: number | null; + username: string | null; + database?: string | null; + folder_id: string | null; + keychain_ref: string | null; + tag_ids: string[]; + created_at: string; + updated_at: string; + // SSH/SSL fields (persisted, excluding secrets) + ssh_host?: string | null; + ssh_port?: number | null; + ssh_user?: string | null; + ssh_auth_method?: string | null; + ssh_private_key_path?: string | null; + ssl_mode?: string | null; + ssl_ca_path?: string | null; + ssl_cert_path?: string | null; + ssl_key_path?: string | null; + // Environment label (production, staging, development, etc.) + environment?: string | null; +} + +export type NewConnectionMode = "simple" | "detailed"; + +export interface ConnectionInput { + name: string; + db_type: DbType; + host: string; + port: number | null; + username?: string | null; + folder_id?: string | null; + tag_ids?: string[]; + // Form-only fields; backend may ignore them until persisted. + connection_string?: string | null; + environment?: string | null; + password?: string | null; + database?: string | null; + use_keychain?: boolean; + // SSH tunnel fields + ssh_host?: string | null; + ssh_port?: number | null; + ssh_user?: string | null; + ssh_auth_method?: "password" | "key" | null; + ssh_private_key_path?: string | null; + ssh_passphrase?: string | null; + // SSL/TLS fields + ssl_mode?: "disable" | "require" | "verify-ca" | "verify-full" | null; + ssl_ca_path?: string | null; + ssl_cert_path?: string | null; + ssl_key_path?: string | null; +} + +export interface FolderInput { + name: string; + parent_id: string | null; + tag_ids?: string[]; +} + +export interface TagInput { + name: string; + color: string; +} + +export interface Settings { + confirm_before_delete: boolean; + default_folder_id: string | null; + theme: Theme; + font_size: FontSize; + default_ports: Record; + tag_order: string | null; + table_refresh_rate: number; + table_page_size: number; + shortcuts: Record; +} + +export type ActiveView = "home" | "settings" | "new-connection" | "db-viewer"; + +export interface FilterState { + query: string; + activeFolderId: string | null; + activeTagIds: string[]; + activeDbTypes: DbType[]; +} + +export interface ValidationResult { + ok: boolean; + error: string; +} + +export interface ImportResult { + imported: number; + skipped: number; + skippedRecords: { index: number; reason: string }[]; +} + +// ─── DB Viewer Types ──────────────────────────────────────────── + +export interface TableInfo { + name: string; + schema: string; + table_type: "TABLE" | "VIEW"; + columns?: ColumnInfo[]; +} + +export interface ColumnInfo { + name: string; + data_type: string; + is_nullable: boolean; + is_pk: boolean; + is_fk: boolean; + fk_ref: [string, string] | null; + default_value: string | null; +} + +export interface QueryResult { + columns: ColumnInfo[]; + rows: unknown[][]; + total_rows: number; + page: number; + page_size: number; + execution_time_ms?: number | null; + error?: string | null; +} + +export type ChangeStatus = "pending" | "applied" | "error"; + +export type ChangeItemType = + | "create_table" + | "alter_table" + | "drop_table" + | "insert" + | "update" + | "delete" + | "create_index" + | "drop_index"; + +export interface ChangeItem { + type: ChangeItemType; + sql: string; + status: ChangeStatus; + error?: string | null; + id: string; + description?: string | null; +} + +export interface DbViewerTab { + id: string; + connection_id: string; + title: string; + query?: string | null; + result?: QueryResult | null; + changes?: ChangeItem[]; + created_at: string; + updated_at: string; +} + +export interface ConnectionTestResult { + ok: boolean; + error?: string | null; + server_version?: string | null; + latency_ms?: number | null; +} \ No newline at end of file diff --git a/src/lib/utils.test.ts b/src/lib/utils.test.ts new file mode 100644 index 0000000..7b7c88b --- /dev/null +++ b/src/lib/utils.test.ts @@ -0,0 +1,305 @@ +import { describe, it, expect } from "vitest"; +import { + validateConnectionInput, + validateFolderInput, + validateTagInput, + filterConnections, + getDescendantFolderIds, + getFolderPathLabel, +} from "./utils"; +import type { Connection, Folder, Tag } from "./types"; + +const makeConnection = (over: Partial = {}): Connection => ({ + id: "c1", + name: "Prod DB", + db_type: "postgresql", + host: "prod.example.com", + port: 5432, + username: "admin", + folder_id: null, + keychain_ref: null, + tag_ids: [], + created_at: "2026-07-26T00:00:00Z", + updated_at: "2026-07-26T00:00:00Z", + ...over, +}); + +describe("validateConnectionInput", () => { + it("accepts a valid postgresql connection", () => { + const result = validateConnectionInput({ + name: "Prod DB", + db_type: "postgresql", + host: "prod.example.com", + port: 5432, + username: "admin", + folder_id: null, + tag_ids: [], + }); + expect(result.ok).toBe(true); + }); + + it("rejects empty name", () => { + const result = validateConnectionInput({ + name: "", + db_type: "postgresql", + host: "h", + port: 5432, + }); + expect(result.ok).toBe(false); + expect(result.error).toContain("name"); + }); + + it("rejects name longer than 100 chars", () => { + const result = validateConnectionInput({ + name: "x".repeat(101), + db_type: "postgresql", + host: "h", + port: 5432, + }); + expect(result.ok).toBe(false); + }); + + it("rejects invalid db_type", () => { + const result = validateConnectionInput({ + name: "X", + db_type: "mongodb" as any, + host: "h", + port: 5432, + }); + expect(result.ok).toBe(false); + expect(result.error).toContain("db_type"); + }); + + it("rejects port out of range", () => { + const result = validateConnectionInput({ + name: "X", + db_type: "postgresql", + host: "h", + port: 99999, + }); + expect(result.ok).toBe(false); + }); + + it("allows null port for sqlite", () => { + const result = validateConnectionInput({ + name: "Local", + db_type: "sqlite", + host: "/data/analytics.db", + port: null, + }); + expect(result.ok).toBe(true); + }); + + it("rejects host longer than 255 chars", () => { + const result = validateConnectionInput({ + name: "X", + db_type: "postgresql", + host: "h".repeat(256), + port: 5432, + }); + expect(result.ok).toBe(false); + }); + + describe("SSH/SSL validation", () => { + it("rejects SSH host longer than 255 chars", () => { + const result = validateConnectionInput({ + name: "Test", + db_type: "postgresql", + host: "localhost", + port: 5432, + ssh_host: "x".repeat(256), + }); + expect(result.ok).toBe(false); + expect(result.error).toContain("SSH host"); + }); + + it("rejects SSH port below 1", () => { + const result = validateConnectionInput({ + name: "Test", + db_type: "postgresql", + host: "localhost", + port: 5432, + ssh_host: "bastion.example.com", + ssh_port: 0, + }); + expect(result.ok).toBe(false); + expect(result.error).toContain("SSH port"); + }); + + it("rejects SSH port above 65535", () => { + const result = validateConnectionInput({ + name: "Test", + db_type: "postgresql", + host: "localhost", + port: 5432, + ssh_host: "bastion.example.com", + ssh_port: 70000, + }); + expect(result.ok).toBe(false); + expect(result.error).toContain("SSH port"); + }); + + it("accepts valid SSH port", () => { + const result = validateConnectionInput({ + name: "Test", + db_type: "postgresql", + host: "localhost", + port: 5432, + ssh_host: "bastion.example.com", + ssh_port: 2222, + }); + expect(result.ok).toBe(true); + }); + + it("accepts null SSH port", () => { + const result = validateConnectionInput({ + name: "Test", + db_type: "postgresql", + host: "localhost", + port: 5432, + ssh_host: "bastion.example.com", + ssh_port: null, + }); + expect(result.ok).toBe(true); + }); + + it("rejects SSH user longer than 100 chars", () => { + const result = validateConnectionInput({ + name: "Test", + db_type: "postgresql", + host: "localhost", + port: 5432, + ssh_host: "bastion.example.com", + ssh_user: "u".repeat(101), + }); + expect(result.ok).toBe(false); + expect(result.error).toContain("SSH user"); + }); + + it("rejects invalid ssl_mode", () => { + const result = validateConnectionInput({ + name: "Test", + db_type: "postgresql", + host: "localhost", + port: 5432, + ssl_mode: "invalid" as any, + }); + expect(result.ok).toBe(false); + expect(result.error).toContain("SSL mode"); + }); + + it("accepts valid ssl_mode values", () => { + const validModes = ["disable", "require", "verify-ca", "verify-full"]; + for (const mode of validModes) { + const result = validateConnectionInput({ + name: "Test", + db_type: "postgresql", + host: "localhost", + port: 5432, + ssl_mode: mode as any, + }); + expect(result.ok).toBe(true); + } + }); + + it("accepts input without SSH fields", () => { + const result = validateConnectionInput({ + name: "Test", + db_type: "postgresql", + host: "localhost", + port: 5432, + }); + expect(result.ok).toBe(true); + }); + }); +}); + +describe("validateFolderInput", () => { + it("accepts valid folder", () => { + expect(validateFolderInput({ name: "Work", parent_id: null }).ok).toBe(true); + }); + it("rejects empty name", () => { + expect(validateFolderInput({ name: "", parent_id: null }).ok).toBe(false); + }); + it("rejects name longer than 100 chars", () => { + expect(validateFolderInput({ name: "x".repeat(101), parent_id: null }).ok).toBe(false); + }); +}); + +describe("validateTagInput", () => { + it("accepts valid tag", () => { + expect(validateTagInput({ name: "production", color: "#ef4444" }).ok).toBe(true); + }); + it("rejects empty name", () => { + expect(validateTagInput({ name: "", color: "#ef4444" }).ok).toBe(false); + }); + it("rejects name longer than 50 chars", () => { + expect(validateTagInput({ name: "x".repeat(51), color: "#ef4444" }).ok).toBe(false); + }); +}); + +describe("getDescendantFolderIds", () => { + const folders: Folder[] = [ + { id: "f1", name: "root", parent_id: null, tag_ids: [], created_at: "", updated_at: "" }, + { id: "f2", name: "child", parent_id: "f1", tag_ids: [], created_at: "", updated_at: "" }, + { id: "f3", name: "grandchild", parent_id: "f2", tag_ids: [], created_at: "", updated_at: "" }, + { id: "f4", name: "other", parent_id: null, tag_ids: [], created_at: "", updated_at: "" }, + ]; + it("returns all descendant ids including self", () => { + expect(getDescendantFolderIds(folders, "f1").sort()).toEqual(["f1", "f2", "f3"]); + }); + it("returns only self for leaf folder", () => { + expect(getDescendantFolderIds(folders, "f3")).toEqual(["f3"]); + }); +}); + +describe("filterConnections", () => { + const tags: Tag[] = [ + { id: "t1", name: "production", color: "#ef4444", created_at: "" }, + { id: "t2", name: "cache", color: "#3b82f6", created_at: "" }, + ]; + const conns: Connection[] = [ + makeConnection({ id: "c1", name: "Prod", host: "prod.example.com", db_type: "postgresql", tag_ids: ["t1"], folder_id: "f1" }), + makeConnection({ id: "c2", name: "Redis", host: "redis.internal", db_type: "redis", tag_ids: ["t2"], folder_id: "f2" }), + ]; + it("filters by search query on name", () => { + expect(filterConnections(conns, tags, { query: "prod" })).toEqual([conns[0]]); + }); + it("filters by search query on host", () => { + expect(filterConnections(conns, tags, { query: "redis.internal" })).toEqual([conns[1]]); + }); + it("search is case-insensitive", () => { + expect(filterConnections(conns, tags, { query: "PROD" })).toEqual([conns[0]]); + }); + it("filters by tag id", () => { + expect(filterConnections(conns, tags, { query: "", activeTagIds: ["t1"] })).toEqual([conns[0]]); + }); + it("filters by db_type", () => { + expect(filterConnections(conns, tags, { query: "", activeDbTypes: ["redis"] })).toEqual([conns[1]]); + }); + it("returns all when no filters", () => { + expect(filterConnections(conns, tags, { query: "" })).toEqual(conns); + }); + it("search matches tag name", () => { + expect(filterConnections(conns, tags, { query: "cache" })).toEqual([conns[1]]); + }); +}); + +describe("getFolderPathLabel", () => { + const folders: Folder[] = [ + { id: "a", name: "FolderA", parent_id: null, tag_ids: [], created_at: "", updated_at: "" }, + { id: "b", name: "Folder1", parent_id: "a", tag_ids: [], created_at: "", updated_at: "" }, + ]; + + it("returns root label for null", () => { + expect(getFolderPathLabel(folders, null)).toBe("Root"); + }); + + it("returns nested path", () => { + expect(getFolderPathLabel(folders, "b")).toBe("FolderA → Folder1"); + }); + + it("returns root label for non-existent folder", () => { + expect(getFolderPathLabel(folders, "missing")).toBe("Root"); + }); +}); \ No newline at end of file diff --git a/src/lib/utils.ts b/src/lib/utils.ts new file mode 100644 index 0000000..e7f469d --- /dev/null +++ b/src/lib/utils.ts @@ -0,0 +1,132 @@ +import type { + Connection, + DbType, + Folder, + Tag, + ConnectionInput, + FolderInput, + TagInput, + ValidationResult, +} from "./types"; + +// ─── Data type abbreviations ───────────────────────────── + +const TYPE_ABBREV: Record = { + "integer": "int", + "bigint": "int8", + "smallint": "int2", + "character varying": "varchar", + "character": "char", + "timestamp with time zone": "timestamptz", + "timestamp without time zone": "timestamp", + "time with time zone": "timetz", + "time without time zone": "time", + "boolean": "bool", + "double precision": "float8", + "real": "float4", +}; + +export function abbreviateType(dataType: string): string { + const lower = dataType.toLowerCase(); + return TYPE_ABBREV[lower] ?? dataType; +} + +const VALID_DB_TYPES: DbType[] = ["postgresql", "mysql", "sqlite", "redis"]; + +export function validateConnectionInput(input: ConnectionInput): ValidationResult { + if (!input.name || input.name.length === 0) return { ok: false, error: "name is required" }; + if (input.name.length > 100) return { ok: false, error: "name must be 100 chars or fewer" }; + if (!VALID_DB_TYPES.includes(input.db_type)) + return { ok: false, error: `db_type must be one of: ${VALID_DB_TYPES.join(", ")}` }; + if (!input.host || input.host.length === 0) return { ok: false, error: "host is required" }; + if (input.host.length > 255) return { ok: false, error: "host must be 255 chars or fewer" }; + if (input.db_type !== "sqlite") { + if (input.port === null || input.port === undefined) + return { ok: false, error: "port is required for this db_type" }; + if (!Number.isInteger(input.port) || input.port < 1 || input.port > 65535) + return { ok: false, error: "port must be an integer between 1 and 65535" }; + } + if (input.username && input.username.length > 100) + return { ok: false, error: "username must be 100 chars or fewer" }; + + // SSH tunnel validation + if (input.ssh_host && input.ssh_host.length > 255) + return { ok: false, error: "SSH host must be 255 chars or fewer" }; + if (input.ssh_port !== undefined && input.ssh_port !== null) { + if (!Number.isInteger(input.ssh_port) || input.ssh_port < 1 || input.ssh_port > 65535) + return { ok: false, error: "SSH port must be between 1 and 65535" }; + } + if (input.ssh_user && input.ssh_user.length > 100) + return { ok: false, error: "SSH user must be 100 chars or fewer" }; + + // SSL/TLS validation + if (input.ssl_mode && !["disable", "require", "verify-ca", "verify-full"].includes(input.ssl_mode)) + return { ok: false, error: "SSL mode must be one of: disable, require, verify-ca, verify-full" }; + + return { ok: true, error: "" }; +} + +export function validateFolderInput(input: FolderInput): ValidationResult { + if (!input.name || input.name.length === 0) return { ok: false, error: "name is required" }; + if (input.name.length > 100) return { ok: false, error: "name must be 100 chars or fewer" }; + return { ok: true, error: "" }; +} + +export function validateTagInput(input: TagInput): ValidationResult { + if (!input.name || input.name.length === 0) return { ok: false, error: "name is required" }; + if (input.name.length > 50) return { ok: false, error: "name must be 50 chars or fewer" }; + return { ok: true, error: "" }; +} + +export function getDescendantFolderIds(folders: Folder[], rootId: string): string[] { + const result = [rootId]; + const children = folders.filter((f) => f.parent_id === rootId); + for (const child of children) { + result.push(...getDescendantFolderIds(folders, child.id)); + } + return result; +} + +export function getFolderPath(folders: Folder[], folderId: string | null): Folder[] { + const folderMap = new Map(folders.map((f) => [f.id, f])); + const path: Folder[] = []; + let current: Folder | undefined = folderId ? folderMap.get(folderId) : undefined; + while (current) { + path.unshift(current); + current = current.parent_id ? folderMap.get(current.parent_id) : undefined; + } + return path; +} + +export function getFolderPathLabel(folders: Folder[], folderId: string | null): string { + if (folderId === null) return "Root"; + const path = getFolderPath(folders, folderId); + if (path.length === 0) return "Root"; + return path.map((f) => f.name).join(" → "); +} + +export function getChildFolders(folders: Folder[], parentId: string | null): Folder[] { + return folders.filter((f) => f.parent_id === parentId); +} + +export function filterConnections( + connections: Connection[], + tags: Tag[], + filter: { query: string; activeTagIds?: string[]; activeDbTypes?: DbType[] }, +): Connection[] { + const q = filter.query.trim().toLowerCase(); + const tagIds = filter.activeTagIds ?? []; + const dbTypes = filter.activeDbTypes ?? []; + const tagNameById = new Map(tags.map((t) => [t.id, t.name.toLowerCase()])); + + return connections.filter((c) => { + if (dbTypes.length > 0 && !dbTypes.includes(c.db_type)) return false; + if (tagIds.length > 0 && !tagIds.every((id) => c.tag_ids.includes(id))) return false; + if (q.length > 0) { + const tagNames = c.tag_ids.map((id) => tagNameById.get(id) ?? "").join(" "); + const haystack = `${c.name} ${c.host} ${c.db_type} ${tagNames}`.toLowerCase(); + if (!haystack.includes(q)) return false; + } + return true; + }); +} \ No newline at end of file diff --git a/src/main.tsx b/src/main.tsx index 2be325e..8b1ddb9 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,6 +1,7 @@ import React from "react"; import ReactDOM from "react-dom/client"; import App from "./App"; +import "./index.css"; ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render( diff --git a/src/stores/connectionStore.test.ts b/src/stores/connectionStore.test.ts new file mode 100644 index 0000000..2284509 --- /dev/null +++ b/src/stores/connectionStore.test.ts @@ -0,0 +1,61 @@ +import { describe, it, expect, beforeEach, vi } from "vitest"; +import { useConnectionStore } from "./connectionStore"; +import * as commands from "../lib/commands"; +import type { Connection, Folder, Tag } from "../lib/types"; + +vi.mock("@tauri-apps/api/core", () => ({ invoke: vi.fn() })); + +const makeConn = (over: Partial = {}): Connection => ({ + id: "c1", name: "P", db_type: "postgresql", host: "h", port: 5432, + username: null, folder_id: null, keychain_ref: null, tag_ids: [], + created_at: "", updated_at: "", ...over, +}); + +beforeEach(() => { + useConnectionStore.setState({ connections: [], folders: [], tags: [], loading: false, error: null }); + vi.restoreAllMocks(); +}); + +describe("connectionStore", () => { + it("loadAll fetches connections, folders, tags", async () => { + const folders: Folder[] = [{ id: "f1", name: "root", parent_id: null, tag_ids: [], created_at: "", updated_at: "" }]; + const tags: Tag[] = [{ id: "t1", name: "prod", color: "#f00", created_at: "" }]; + const conns: Connection[] = [makeConn()]; + vi.spyOn(commands, "getConnections").mockResolvedValue(conns); + vi.spyOn(commands, "getFolders").mockResolvedValue(folders); + vi.spyOn(commands, "getTags").mockResolvedValue(tags); + await useConnectionStore.getState().loadAll(); + expect(useConnectionStore.getState().connections).toEqual(conns); + expect(useConnectionStore.getState().folders).toEqual(folders); + expect(useConnectionStore.getState().tags).toEqual(tags); + }); + + it("loadAll sets error on failure", async () => { + vi.spyOn(commands, "getConnections").mockRejectedValue(new Error("fail")); + vi.spyOn(commands, "getFolders").mockResolvedValue([]); + vi.spyOn(commands, "getTags").mockResolvedValue([]); + await useConnectionStore.getState().loadAll(); + expect(useConnectionStore.getState().error).toContain("fail"); + }); + + it("createConnection adds to list on success", async () => { + const created = makeConn({ id: "c2", name: "New" }); + vi.spyOn(commands, "createConnection").mockResolvedValue(created); + await useConnectionStore.getState().createConnection({ name: "New", db_type: "postgresql", host: "h", port: 5432 }); + expect(useConnectionStore.getState().connections).toContainEqual(created); + }); + + it("deleteConnection removes from list", async () => { + useConnectionStore.setState({ connections: [makeConn({ id: "c1" })] }); + vi.spyOn(commands, "deleteConnection").mockResolvedValue(undefined); + await useConnectionStore.getState().deleteConnection("c1"); + expect(useConnectionStore.getState().connections).toEqual([]); + }); + + it("createFolder adds to folders", async () => { + const folder: Folder = { id: "f1", name: "Work", parent_id: null, tag_ids: [], created_at: "", updated_at: "" }; + vi.spyOn(commands, "createFolder").mockResolvedValue(folder); + await useConnectionStore.getState().createFolder({ name: "Work", parent_id: null }); + expect(useConnectionStore.getState().folders).toContainEqual(folder); + }); +}); \ No newline at end of file diff --git a/src/stores/connectionStore.ts b/src/stores/connectionStore.ts new file mode 100644 index 0000000..a4da8fe --- /dev/null +++ b/src/stores/connectionStore.ts @@ -0,0 +1,119 @@ +import { create } from "zustand"; +import type { Connection, ConnectionInput, Folder, FolderInput, Tag, TagInput } from "../lib/types"; +import * as cmd from "../lib/commands"; + +interface ConnectionState { + connections: Connection[]; folders: Folder[]; tags: Tag[]; + tagOrder: string[]; + loading: boolean; error: string | null; + loadAll: () => Promise; + loadTagOrder: () => Promise; + setTagOrder: (order: string[]) => Promise; + createConnection: (input: ConnectionInput) => Promise; + deleteConnection: (id: string) => Promise; + createFolder: (input: FolderInput) => Promise; + updateFolder: (id: string, input: FolderInput) => Promise; + deleteFolder: (id: string) => Promise; + createTag: (input: TagInput) => Promise; + updateTag: (id: string, input: TagInput) => Promise; + deleteTag: (id: string) => Promise; + addTagToItems: (tagId: string, folderIds: string[], connectionIds: string[]) => Promise; + cachePassword: (connectionId: string, password: string) => Promise; + getConnectionPassword: (connectionId: string) => Promise; +} + +export const useConnectionStore = create((set, get) => ({ + connections: [], folders: [], tags: [], tagOrder: [], loading: false, error: null, + loadAll: async () => { + set({ loading: true, error: null }); + try { + const [connections, folders, tags] = await Promise.all([cmd.getConnections(), cmd.getFolders(), cmd.getTags()]); + set({ connections, folders, tags, loading: false }); + // Also load tag order + get().loadTagOrder(); + } catch (e) { + set({ loading: false, error: e instanceof Error ? e.message : String(e) }); + } + }, + loadTagOrder: async () => { + try { + const settings = await cmd.getSettings(); + if (settings.tag_order) { + try { + const order = JSON.parse(settings.tag_order); + if (Array.isArray(order)) set({ tagOrder: order }); + } catch {} + } + } catch {} + }, + setTagOrder: async (order) => { + await cmd.updateSetting("tag_order", JSON.stringify(order)); + set({ tagOrder: order }); + }, + createConnection: async (input) => { + const conn = await cmd.createConnection(input); + // Persist password to OS keychain (not SQLite) + if (input.password) { + await cmd.saveConnectionPassword(conn.id, input.password); + } + set((s) => ({ connections: [...s.connections, conn] })); + }, + deleteConnection: async (id) => { + await cmd.deleteConnection(id); + // Remove password from keychain + try { await cmd.deleteConnectionPassword(id); } catch { /* ignore */ } + set((s) => ({ connections: s.connections.filter((c) => c.id !== id) })); + }, + createFolder: async (input) => { + const folder = await cmd.createFolder(input); + set((s) => ({ folders: [...s.folders, folder] })); + }, + updateFolder: async (id, input) => { + const folder = await cmd.updateFolder(id, input); + set((s) => ({ folders: s.folders.map((f) => f.id === id ? folder : f) })); + }, + deleteFolder: async (id) => { + await cmd.deleteFolder(id); + set((s) => ({ folders: s.folders.filter((f) => f.id !== id), connections: s.connections.map((c) => c.folder_id === id ? { ...c, folder_id: null } : c) })); + }, + createTag: async (input) => { + const tag = await cmd.createTag(input); + set((s) => ({ tags: [...s.tags, tag] })); + }, + updateTag: async (id, input) => { + const tag = await cmd.updateTag(id, input); + set((s) => ({ tags: s.tags.map((t) => t.id === id ? tag : t) })); + }, + deleteTag: async (id) => { + await cmd.deleteTag(id); + set((s) => ({ + tags: s.tags.filter((t) => t.id !== id), + connections: s.connections.map((c) => c.tag_ids.includes(id) ? { ...c, tag_ids: c.tag_ids.filter((t) => t !== id) } : c), + folders: s.folders.map((f) => f.tag_ids.includes(id) ? { ...f, tag_ids: f.tag_ids.filter((t) => t !== id) } : f), + })); + }, + cachePassword: async (connectionId, password) => { + await cmd.saveConnectionPassword(connectionId, password); + }, + getConnectionPassword: async (connectionId) => { + return cmd.getConnectionPassword(connectionId); + }, + addTagToItems: async (tagId, folderIds, connectionIds) => { + await Promise.all([ + ...folderIds.map((fid) => cmd.addFolderTags(fid, [tagId])), + ...connectionIds.map((cid) => cmd.addConnectionTags(cid, [tagId])), + ]); + set((s) => ({ + folders: s.folders.map((f) => + folderIds.includes(f.id) && !f.tag_ids.includes(tagId) + ? { ...f, tag_ids: [...f.tag_ids, tagId] } + : f, + ), + connections: s.connections.map((c) => + connectionIds.includes(c.id) && !c.tag_ids.includes(tagId) + ? { ...c, tag_ids: [...c.tag_ids, tagId] } + : c, + ), + })); + }, +})); \ No newline at end of file diff --git a/src/stores/dbViewerStore.test.ts b/src/stores/dbViewerStore.test.ts new file mode 100644 index 0000000..910396e --- /dev/null +++ b/src/stores/dbViewerStore.test.ts @@ -0,0 +1,182 @@ +import { describe, it, expect, beforeEach } from "vitest"; +import { useDbViewerStore } from "./dbViewerStore"; +import type { QueryResult, TableInfo } from "../lib/types"; + +beforeEach(() => { + useDbViewerStore.getState().reset(); +}); + +describe("dbViewerStore", () => { + it("starts empty", () => { + const state = useDbViewerStore.getState(); + expect(state.tabs).toEqual([]); + expect(state.activeTabId).toBeNull(); + expect(state.changesQueue).toEqual([]); + expect(state.databases).toEqual([]); + expect(state.schemas).toEqual([]); + expect(state.tables).toEqual([]); + expect(state.currentDatabase).toBeNull(); + expect(state.currentSchema).toBeNull(); + }); + + it("openTab adds a new tab", () => { + const store = useDbViewerStore.getState(); + store.openTab("public", "users"); + const state = useDbViewerStore.getState(); + expect(state.tabs).toHaveLength(1); + const tab = state.tabs[0]; + expect(tab.schema).toBe("public"); + expect(tab.table).toBe("users"); + expect(tab.page).toBe(1); + expect(state.activeTabId).toBe(tab.id); + }); + + it("openTab does not duplicate", () => { + const store = useDbViewerStore.getState(); + store.openTab("public", "users"); + store.openTab("public", "users"); + const state = useDbViewerStore.getState(); + expect(state.tabs).toHaveLength(1); + }); + + it("openTab forceNew creates duplicate", () => { + const store = useDbViewerStore.getState(); + store.openTab("public", "users"); + store.openTab("public", "users"); + const tabsAfterTwo = useDbViewerStore.getState().tabs; + expect(tabsAfterTwo).toHaveLength(1); + + store.openTab("public", "users", true); + const state = useDbViewerStore.getState(); + expect(state.tabs).toHaveLength(2); + }); + + it("closeTab removes tab and switches activeTabId", () => { + const store = useDbViewerStore.getState(); + store.openTab("public", "users"); + const tab1Id = useDbViewerStore.getState().tabs[0].id; + store.openTab("public", "posts", true); + + store.closeTab(tab1Id); + const state = useDbViewerStore.getState(); + expect(state.tabs).toHaveLength(1); + expect(state.activeTabId).toBe(state.tabs[0].id); + }); + + it("setPage updates pagination", () => { + const store = useDbViewerStore.getState(); + store.openTab("public", "users"); + const tabId = useDbViewerStore.getState().tabs[0].id; + + store.setPage(tabId, 3); + const tab = useDbViewerStore.getState().tabs[0]; + expect(tab.page).toBe(3); + }); + + it("setTabData updates tab data", () => { + const store = useDbViewerStore.getState(); + store.openTab("public", "users"); + const tabId = useDbViewerStore.getState().tabs[0].id; + + // First set loading to true to verify it gets cleared + store.setTabLoading(tabId, true); + + const mockData: QueryResult = { + columns: [{name:"id",data_type:"text",is_pk:false,is_fk:false,is_nullable:false,default_value:null,fk_ref:null},{name:"name",data_type:"text",is_pk:false,is_fk:false,is_nullable:false,default_value:null,fk_ref:null}], + rows: [[1, "Alice"]], + total_rows: 1, page: 1, page_size: 50, + }; + store.setTabData(tabId, mockData); + + const tab = useDbViewerStore.getState().tabs[0]; + expect(tab.data).toEqual(mockData); + expect(tab.loading).toBe(false); + expect(tab.error).toBeNull(); + }); + + it("setTabError sets error", () => { + const store = useDbViewerStore.getState(); + store.openTab("public", "users"); + const tabId = useDbViewerStore.getState().tabs[0].id; + + store.setTabError(tabId, "Something went wrong"); + const tab = useDbViewerStore.getState().tabs[0]; + expect(tab.error).toBe("Something went wrong"); + expect(tab.loading).toBe(false); + }); + + it("addChange appends to queue", () => { + const store = useDbViewerStore.getState(); + store.addChange({ type: "insert", sql: "INSERT INTO users (id) VALUES (1)" }); + + const queue = useDbViewerStore.getState().changesQueue; + expect(queue).toHaveLength(1); + expect(queue[0].status).toBe("pending"); + expect(queue[0].id).toBeTruthy(); + expect(queue[0].createdAt).toBeGreaterThan(0); + }); + + it("cancelChange marks change as cancelled", () => { + const store = useDbViewerStore.getState(); + store.addChange({ type: "insert", sql: "INSERT INTO users (id) VALUES (1)" }); + const changeId = useDbViewerStore.getState().changesQueue[0].id; + + store.cancelChange(changeId); + const change = useDbViewerStore.getState().changesQueue[0]; + expect(change.status).toBe("cancelled"); + }); + + it("markChangeCommitted updates status", () => { + const store = useDbViewerStore.getState(); + store.addChange({ type: "insert", sql: "INSERT INTO users (id) VALUES (1)" }); + const changeId = useDbViewerStore.getState().changesQueue[0].id; + + store.markChangeCommitted(changeId); + const change = useDbViewerStore.getState().changesQueue[0]; + expect(change.status).toBe("committed"); + }); + + it("markChangeFailed updates status and records error", () => { + const store = useDbViewerStore.getState(); + store.addChange({ type: "insert", sql: "INSERT INTO users (id) VALUES (1)" }); + const changeId = useDbViewerStore.getState().changesQueue[0].id; + + store.markChangeFailed(changeId, "Constraint violation"); + const change = useDbViewerStore.getState().changesQueue[0]; + expect(change.status).toBe("failed"); + expect(change.error).toBe("Constraint violation"); + }); + + it("reset clears all state", () => { + const store = useDbViewerStore.getState(); + store.openTab("public", "users"); + store.addChange({ type: "insert", sql: "INSERT INTO users (id) VALUES (1)" }); + store.populate(["mydb"], ["public"], [{ name: "users", schema: "public", table_type: "TABLE" }]); + + store.reset(); + + const state = useDbViewerStore.getState(); + expect(state.tabs).toEqual([]); + expect(state.activeTabId).toBeNull(); + expect(state.changesQueue).toEqual([]); + expect(state.databases).toEqual([]); + expect(state.schemas).toEqual([]); + expect(state.tables).toEqual([]); + expect(state.currentDatabase).toBeNull(); + expect(state.currentSchema).toBeNull(); + }); + + it("populate sets databases, schemas, tables", () => { + const tables: TableInfo[] = [ + { name: "users", schema: "public", table_type: "TABLE" }, + { name: "posts", schema: "public", table_type: "TABLE" }, + ]; + const store = useDbViewerStore.getState(); + store.populate(["mydb", "testdb"], ["public", "private"], tables); + + const state = useDbViewerStore.getState(); + expect(state.databases).toEqual(["mydb", "testdb"]); + expect(state.schemas).toEqual(["public", "private"]); + expect(state.tables).toEqual(tables); + }); +}); \ No newline at end of file diff --git a/src/stores/dbViewerStore.ts b/src/stores/dbViewerStore.ts new file mode 100644 index 0000000..e3d40d0 --- /dev/null +++ b/src/stores/dbViewerStore.ts @@ -0,0 +1,256 @@ +import { create } from "zustand"; +import type { QueryResult, TableInfo, ChangeItemType } from "../lib/types"; + +// ─── Local types ──────────────────────────────────────────────── + +export type QueueStatus = "pending" | "cancelled" | "committed" | "failed"; + +export interface QueueItem { + id: string; + type: ChangeItemType; + sql: string; + schema?: string; + table?: string; + primaryKey?: Record; + oldData?: Record | null; + newData?: Record | null; + status: QueueStatus; + error?: string | null; + description?: string | null; + createdAt: number; +} + +export interface ViewerTab { + id: string; + schema: string; + table: string; + page: number; + pageSize: number; + loading: boolean; + error: string | null; + data: QueryResult | null; + columnFilter?: { column: string; value: string }; +} + +// ─── Auto-increment counters ─────────────────────────────────── + +let tabCounter = 0; +let changeCounter = 0; + +const initialTab = (schema: string, table: string, defaultPageSize?: number): ViewerTab => ({ + id: `tab-${++tabCounter}`, + schema, + table, + page: 1, + pageSize: defaultPageSize ?? 50, + loading: true, + error: null, + data: null, +}); + +// ─── State interface ──────────────────────────────────────────── + +interface DbViewerState { + tabs: ViewerTab[]; + activeTabId: string | null; + defaultPageSize: number; + changesQueue: QueueItem[]; + databases: string[]; + schemas: string[]; + tables: TableInfo[]; + currentDatabase: string | null; + currentSchema: string | null; + + // Actions + openTab: (schema: string, table: string, forceNew?: boolean) => void; + setDefaultPageSize: (size: number) => void; + closeTab: (tabId: string) => void; + setActiveTab: (tabId: string) => void; + setPage: (tabId: string, page: number) => void; + setPageSize: (tabId: string, pageSize: number) => void; + setTabData: (tabId: string, data: QueryResult) => void; + setTabLoading: (tabId: string, loading: boolean) => void; + setTabError: (tabId: string, error: string) => void; + setColumnFilter: (tabId: string, column: string, value: string) => void; + clearColumnFilter: (tabId: string) => void; + addChange: (input: { + type: ChangeItemType; + sql?: string; + schema?: string; + table?: string; + primaryKey?: Record; + oldData?: Record | null; + newData?: Record | null; + description?: string | null; + }) => void; + cancelChange: (changeId: string) => void; + markChangeCommitted: (changeId: string) => void; + markChangeFailed: (changeId: string, error: string) => void; + setCurrentDatabase: (db: string | null) => void; + setCurrentSchema: (schema: string | null) => void; + populate: ( + databases: string[], + schemas: string[], + tables: TableInfo[], + ) => void; + reset: () => void; +} + +// ─── Initial state ────────────────────────────────────────────── + +const initialState = { + tabs: [] as ViewerTab[], + activeTabId: null as string | null, + defaultPageSize: 50, + changesQueue: [] as QueueItem[], + databases: [] as string[], + schemas: [] as string[], + tables: [] as TableInfo[], + currentDatabase: null as string | null, + currentSchema: null as string | null, +}; + +// ─── Store ────────────────────────────────────────────────────── + +export const useDbViewerStore = create((set, get) => ({ + ...initialState, + + openTab: (schema, table, forceNew = false) => { + const { tabs } = get(); + + // Dedup: if not forceNew and an identical tab exists, just activate it + if (!forceNew) { + const existing = tabs.find( + (t) => t.schema === schema && t.table === table, + ); + if (existing) { + set({ activeTabId: existing.id }); + return; + } + } + + const tab = initialTab(schema, table, get().defaultPageSize); + set({ tabs: [...tabs, tab], activeTabId: tab.id }); + }, + + setDefaultPageSize: (size) => set({ defaultPageSize: size }), + + closeTab: (tabId) => { + const { tabs, activeTabId } = get(); + const remaining = tabs.filter((t) => t.id !== tabId); + const newActiveId = + activeTabId === tabId + ? remaining.length > 0 + ? remaining[remaining.length - 1].id + : null + : activeTabId; + set({ tabs: remaining, activeTabId: newActiveId }); + }, + + setActiveTab: (tabId) => set({ activeTabId: tabId }), + + setPage: (tabId, page) => + set((state) => ({ + tabs: state.tabs.map((t) => + t.id === tabId + ? { ...t, page, loading: true, error: null } + : t, + ), + })), + + setPageSize: (tabId, pageSize) => + set((state) => ({ + tabs: state.tabs.map((t) => + t.id === tabId + ? { ...t, pageSize, page: 1, loading: true, error: null } + : t, + ), + })), + + setTabData: (tabId, data) => + set((state) => ({ + tabs: state.tabs.map((t) => + t.id === tabId ? { ...t, data, loading: false, error: null } : t, + ), + })), + + setTabLoading: (tabId, loading) => + set((state) => ({ + tabs: state.tabs.map((t) => + t.id === tabId ? { ...t, loading } : t, + ), + })), + + setTabError: (tabId, error) => + set((state) => ({ + tabs: state.tabs.map((t) => + t.id === tabId ? { ...t, error, loading: false } : t, + ), + })), + + setColumnFilter: (tabId, column, value) => + set((state) => ({ + tabs: state.tabs.map((t) => + t.id === tabId ? { ...t, columnFilter: { column, value } } : t, + ), + })), + + clearColumnFilter: (tabId) => + set((state) => ({ + tabs: state.tabs.map((t) => + t.id === tabId ? { ...t, columnFilter: undefined } : t, + ), + })), + + addChange: (input) => { + const item: QueueItem = { + id: `ch-${++changeCounter}`, + type: input.type, + sql: input.sql ?? "", + schema: input.schema, + table: input.table, + primaryKey: input.primaryKey, + oldData: input.oldData ?? null, + newData: input.newData ?? null, + status: "pending", + description: input.description ?? null, + createdAt: Date.now(), + }; + set((state) => ({ changesQueue: [...state.changesQueue, item] })); + }, + + cancelChange: (changeId) => + set((state) => ({ + changesQueue: state.changesQueue.map((c) => + c.id === changeId ? { ...c, status: "cancelled" as const } : c, + ), + })), + + markChangeCommitted: (changeId) => + set((state) => ({ + changesQueue: state.changesQueue.map((c) => + c.id === changeId ? { ...c, status: "committed" as const } : c, + ), + })), + + markChangeFailed: (changeId, error) => + set((state) => ({ + changesQueue: state.changesQueue.map((c) => + c.id === changeId + ? { ...c, status: "failed" as const, error } + : c, + ), + })), + + setCurrentDatabase: (db) => set({ currentDatabase: db }), + setCurrentSchema: (schema) => set({ currentSchema: schema }), + + populate: (databases, schemas, tables) => + set({ databases, schemas, tables }), + + reset: () => { + tabCounter = 0; + changeCounter = 0; + set({ ...initialState, tabs: [], changesQueue: [] }); + }, +})); \ No newline at end of file diff --git a/src/stores/notificationStore.ts b/src/stores/notificationStore.ts new file mode 100644 index 0000000..66291eb --- /dev/null +++ b/src/stores/notificationStore.ts @@ -0,0 +1,27 @@ +import { create } from "zustand"; + +export interface Notification { + id: string; + message: string; + type: "success" | "error" | "info"; +} + +interface NotificationState { + notifications: Notification[]; + notify: (message: string, type?: Notification["type"]) => void; + dismiss: (id: string) => void; +} + +let counter = 0; + +export const useNotificationStore = create((set) => ({ + notifications: [], + notify: (message, type = "info") => { + const id = `notif-${++counter}`; + set((s) => ({ notifications: [...s.notifications, { id, message, type }] })); + setTimeout(() => { + set((s) => ({ notifications: s.notifications.filter((n) => n.id !== id) })); + }, 4000); + }, + dismiss: (id) => set((s) => ({ notifications: s.notifications.filter((n) => n.id !== id) })), +})); \ No newline at end of file diff --git a/src/stores/settingsStore.test.ts b/src/stores/settingsStore.test.ts new file mode 100644 index 0000000..7b9f74e --- /dev/null +++ b/src/stores/settingsStore.test.ts @@ -0,0 +1,26 @@ +import { describe, it, expect, beforeEach, vi } from "vitest"; +import { useSettingsStore } from "./settingsStore"; +import * as commands from "../lib/commands"; + +beforeEach(() => { + useSettingsStore.setState({ settings: null, loading: false, error: null }); + vi.restoreAllMocks(); +}); + +describe("settingsStore", () => { + it("load fetches settings", async () => { + const settings = { confirm_before_delete: true, default_folder_id: null, theme: "dark" as const, font_size: "medium" as const, default_ports: { postgresql: 5432, mysql: 3306, redis: 6379, sqlite: null }, tag_order: null, table_refresh_rate: 0, table_page_size: 50, shortcuts: {} }; + vi.spyOn(commands, "getSettings").mockResolvedValue(settings); + await useSettingsStore.getState().load(); + expect(useSettingsStore.getState().settings).toEqual(settings); + }); + + it("updateSetting persists then reloads", async () => { + vi.spyOn(commands, "updateSetting").mockResolvedValue(undefined); + const settings = { confirm_before_delete: true, default_folder_id: null, theme: "light" as const, font_size: "medium" as const, default_ports: { postgresql: 5432, mysql: 3306, redis: 6379, sqlite: null }, tag_order: null, table_refresh_rate: 0, table_page_size: 50, shortcuts: {} }; + vi.spyOn(commands, "getSettings").mockResolvedValue(settings); + await useSettingsStore.getState().updateSetting("theme", "light"); + expect(commands.updateSetting).toHaveBeenCalledWith("theme", "light"); + expect(useSettingsStore.getState().settings?.theme).toBe("light"); + }); +}); \ No newline at end of file diff --git a/src/stores/settingsStore.ts b/src/stores/settingsStore.ts new file mode 100644 index 0000000..74178ec --- /dev/null +++ b/src/stores/settingsStore.ts @@ -0,0 +1,26 @@ +import { create } from "zustand"; +import type { Settings } from "../lib/types"; +import * as cmd from "../lib/commands"; + +interface SettingsState { + settings: Settings | null; loading: boolean; error: string | null; + load: () => Promise; + updateSetting: (key: string, value: string) => Promise; +} + +export const useSettingsStore = create((set, get) => ({ + settings: null, loading: false, error: null, + load: async () => { + set({ loading: true, error: null }); + try { + const settings = await cmd.getSettings(); + set({ settings, loading: false }); + } catch (e) { + set({ loading: false, error: e instanceof Error ? e.message : String(e) }); + } + }, + updateSetting: async (key, value) => { + await cmd.updateSetting(key, value); + await get().load(); + }, +})); \ No newline at end of file diff --git a/src/stores/uiStore.test.ts b/src/stores/uiStore.test.ts new file mode 100644 index 0000000..0ffb94e --- /dev/null +++ b/src/stores/uiStore.test.ts @@ -0,0 +1,50 @@ +import { describe, it, expect, beforeEach } from "vitest"; +import { useUiStore } from "./uiStore"; + +beforeEach(() => useUiStore.setState({ searchQuery: "", activeFolderId: null, activeTagIds: [], activeDbTypes: [], activeView: "home", prefilledConnectionString: null, activeConnectionId: null })); + +describe("uiStore", () => { + it("starts on home view", () => expect(useUiStore.getState().activeView).toBe("home")); + it("setActiveView changes view", () => { + useUiStore.getState().setActiveView("settings"); + expect(useUiStore.getState().activeView).toBe("settings"); + }); + it("setSearchQuery updates query", () => { + useUiStore.getState().setSearchQuery("prod"); + expect(useUiStore.getState().searchQuery).toBe("prod"); + }); + it("toggleTag adds and removes tag", () => { + useUiStore.getState().toggleTag("t1"); + expect(useUiStore.getState().activeTagIds).toEqual(["t1"]); + useUiStore.getState().toggleTag("t1"); + expect(useUiStore.getState().activeTagIds).toEqual([]); + }); + it("toggleDbType adds and removes type", () => { + useUiStore.getState().toggleDbType("redis"); + expect(useUiStore.getState().activeDbTypes).toEqual(["redis"]); + useUiStore.getState().toggleDbType("redis"); + expect(useUiStore.getState().activeDbTypes).toEqual([]); + }); + it("clearFilters resets search and filters but not view", () => { + useUiStore.getState().setSearchQuery("x"); + useUiStore.getState().toggleTag("t1"); + useUiStore.getState().setActiveView("settings"); + useUiStore.getState().clearFilters(); + expect(useUiStore.getState().searchQuery).toBe(""); + expect(useUiStore.getState().activeTagIds).toEqual([]); + expect(useUiStore.getState().activeView).toBe("settings"); + }); + it("sets and clears prefilled connection string", () => { + useUiStore.getState().setPrefilledConnectionString("postgresql://a@b/c"); + expect(useUiStore.getState().prefilledConnectionString).toBe("postgresql://a@b/c"); + useUiStore.getState().clearPrefilledConnectionString(); + expect(useUiStore.getState().prefilledConnectionString).toBeNull(); + }); + + it("sets and clears activeConnectionId", () => { + useUiStore.getState().setActiveConnectionId("c1"); + expect(useUiStore.getState().activeConnectionId).toBe("c1"); + useUiStore.getState().setActiveConnectionId(null); + expect(useUiStore.getState().activeConnectionId).toBeNull(); + }); +}); \ No newline at end of file diff --git a/src/stores/uiStore.ts b/src/stores/uiStore.ts new file mode 100644 index 0000000..04e91f2 --- /dev/null +++ b/src/stores/uiStore.ts @@ -0,0 +1,45 @@ +import { create } from "zustand"; +import type { ActiveView, DbType } from "../lib/types"; + +interface UiState { + searchQuery: string; + activeFolderId: string | null; + activeTagIds: string[]; + activeDbTypes: DbType[]; + activeView: ActiveView; + selectedItemIds: string[]; + prefilledConnectionString: string | null; + activeConnectionId: string | null; + setActiveView: (view: ActiveView) => void; + setSearchQuery: (q: string) => void; + setActiveFolderId: (id: string | null) => void; + toggleTag: (id: string) => void; + toggleDbType: (type: DbType) => void; + clearFilters: () => void; + toggleItemSelection: (id: string) => void; + selectAllItems: (ids: string[]) => void; + clearSelection: () => void; + setPrefilledConnectionString: (value: string) => void; + clearPrefilledConnectionString: () => void; + setActiveConnectionId: (id: string | null) => void; +} + +export const useUiStore = create((set) => ({ + searchQuery: "", activeFolderId: null, activeTagIds: [], activeDbTypes: [], activeView: "home", selectedItemIds: [], prefilledConnectionString: null, activeConnectionId: null, + setActiveView: (view) => set({ activeView: view }), + setSearchQuery: (q) => set({ searchQuery: q }), + setActiveFolderId: (id) => set({ activeFolderId: id, selectedItemIds: [] }), + toggleTag: (id) => set((s) => ({ activeTagIds: s.activeTagIds.includes(id) ? s.activeTagIds.filter((t) => t !== id) : [...s.activeTagIds, id] })), + toggleDbType: (type) => set((s) => ({ activeDbTypes: s.activeDbTypes.includes(type) ? s.activeDbTypes.filter((t) => t !== type) : [...s.activeDbTypes, type] })), + clearFilters: () => set({ searchQuery: "", activeTagIds: [], activeDbTypes: [], activeFolderId: null }), + toggleItemSelection: (id) => set((s) => ({ + selectedItemIds: s.selectedItemIds.includes(id) + ? s.selectedItemIds.filter((i) => i !== id) + : [...s.selectedItemIds, id], + })), + selectAllItems: (ids) => set({ selectedItemIds: ids }), + clearSelection: () => set({ selectedItemIds: [] }), + setPrefilledConnectionString: (value) => set({ prefilledConnectionString: value }), + clearPrefilledConnectionString: () => set({ prefilledConnectionString: null }), + setActiveConnectionId: (id) => set({ activeConnectionId: id }), +})); \ No newline at end of file diff --git a/src/test/setup.ts b/src/test/setup.ts new file mode 100644 index 0000000..02c423f --- /dev/null +++ b/src/test/setup.ts @@ -0,0 +1 @@ +import "@testing-library/jest-dom"; \ No newline at end of file diff --git a/src/test/smoke.test.tsx b/src/test/smoke.test.tsx new file mode 100644 index 0000000..bb58e1d --- /dev/null +++ b/src/test/smoke.test.tsx @@ -0,0 +1,10 @@ +import { describe, it, expect } from "vitest"; + +describe("test infrastructure", () => { + it("vitest is configured with jsdom", () => { + const div = document.createElement("div"); + div.textContent = "hello"; + document.body.appendChild(div); + expect(div).toHaveTextContent("hello"); + }); +}); \ No newline at end of file diff --git a/vite.config.ts b/vite.config.ts index ddad22a..e0cc2e9 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,12 +1,13 @@ import { defineConfig } from "vite"; import react from "@vitejs/plugin-react"; +import tailwindcss from "@tailwindcss/vite"; // @ts-expect-error process is a nodejs global const host = process.env.TAURI_DEV_HOST; // https://vite.dev/config/ export default defineConfig(async () => ({ - plugins: [react()], + plugins: [tailwindcss(), react()], // Vite options tailored for Tauri development and only applied in `tauri dev` or `tauri build` // diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 0000000..a850efd --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,12 @@ +import { defineConfig } from "vitest/config"; +import react from "@vitejs/plugin-react"; + +export default defineConfig({ + plugins: [react()], + test: { + environment: "jsdom", + globals: true, + setupFiles: ["./src/test/setup.ts"], + css: false, + }, +}); \ No newline at end of file