From edba8214b54272efa0acc9648544624eec6379a4 Mon Sep 17 00:00:00 2001 From: t8y2 <1156263951@qq.com> Date: Wed, 10 Jun 2026 04:56:40 +0800 Subject: [PATCH] feat: show username/password fields for Access database connections --- .github/scripts/check-jdbc-plugin-version.mjs | 5 +- .github/scripts/sync-changelog.mjs | 110 +- .github/workflows/ci.yml | 4 +- .github/workflows/docs.yml | 4 +- .github/workflows/publish-packages.yml | 2 +- .github/workflows/release.yml | 9 +- .github/workflows/sync-changelog.yml | 2 +- .oxfmtrc.json | 2 +- README.zh-CN.md | 14 +- apps/desktop/src/App.vue | 210 +- .../components/admin/DatabaseUserAdmin.vue | 119 +- .../desktop/src/components/auth/LoginPage.vue | 27 +- .../src/components/chart/QueryChart.vue | 22 +- .../config/ConfigPassphraseDialog.vue | 14 +- .../config/DriverInstallProgressCircle.vue | 21 +- .../components/config/DriverStoreDialog.vue | 452 +--- .../connection/ConnectionDialog.vue | 918 ++----- .../connection/ConnectionErrorIndicator.vue | 15 +- .../diagram/SchemaDiagramDialog.vue | 286 +-- .../src/components/diff/DataCompareDialog.vue | 374 +-- .../src/components/diff/SchemaDiffDialog.vue | 113 +- .../src/components/editor/AiAssistant.vue | 226 +- .../src/components/editor/ColumnInfoPanel.vue | 8 +- .../components/editor/DangerConfirmDialog.vue | 15 +- .../components/editor/EditorSearchPanel.vue | 82 +- .../editor/EditorSettingsDialog.vue | 708 +----- .../src/components/editor/QueryEditor.vue | 502 +--- .../src/components/editor/QueryHistory.vue | 63 +- .../editor/SqlFormatterSettingsPanel.vue | 72 +- .../editor/ThemeCustomizerDialog.vue | 77 +- .../src/components/etcd/EtcdKeyBrowser.vue | 72 +- .../explain/ExplainPlanNodeTree.vue | 25 +- .../components/explain/ExplainPlanViewer.vue | 42 +- .../export/DatabaseExportDialog.vue | 50 +- .../export/ExportProgressDialog.vue | 7 +- .../export/ExportProgressPopover.vue | 55 +- apps/desktop/src/components/grid/DataGrid.vue | 2138 +++-------------- .../components/grid/ImagePreviewDialog.vue | 67 +- .../components/grid/LayerPreviewDialog.vue | 85 +- .../components/grid/TemporalCellEditor.vue | 150 +- .../src/components/icons/AiProviderLogo.vue | 17 +- .../src/components/icons/DatabaseIcon.vue | 14 +- .../components/import/TableImportDialog.vue | 69 +- .../src/components/layout/AppDialogs.vue | 40 +- .../src/components/layout/AppSidebar.vue | 15 +- .../src/components/layout/AppTabBar.vue | 118 +- .../src/components/layout/AppToolbar.vue | 136 +- .../src/components/layout/ContentArea.vue | 460 +--- .../src/components/layout/EditorToolbar.vue | 104 +- .../src/components/layout/SqlLibraryPanel.vue | 116 +- .../src/components/layout/UpdateDialog.vue | 13 +- .../src/components/layout/WelcomeScreen.vue | 63 +- .../src/components/layout/WindowControls.vue | 15 +- .../components/lineage/FieldLineageDialog.vue | 145 +- .../src/components/mongo/JsonEditNode.vue | 50 +- .../src/components/mongo/MongoDocBrowser.vue | 420 +--- .../src/components/objects/ObjectBrowser.vue | 378 +-- .../objects/ProcedureExecutionDialog.vue | 69 +- .../src/components/redis/RedisJsonTree.vue | 12 +- .../src/components/redis/RedisKeyBrowser.vue | 363 +-- .../src/components/redis/RedisValueViewer.vue | 504 +--- .../search/DatabaseSearchDialog.vue | 70 +- .../src/components/sidebar/ConnectionTree.vue | 56 +- .../src/components/sidebar/TreeItem.vue | 656 +---- .../sidebar/VisibleDatabasesDialog.vue | 48 +- .../sql-file/SqlFileExecutionDialog.vue | 100 +- .../structure/TableStructureEditor.vue | 565 +---- .../transfer/DataTransferDialog.vue | 122 +- .../src/components/ui/CustomContextMenu.vue | 44 +- .../src/components/ui/LightDropdown.vue | 45 +- .../src/components/ui/LightTooltip.vue | 20 +- .../components/ui/TruncatedTextTooltip.vue | 9 +- .../desktop/src/components/ui/badge/Badge.vue | 7 +- apps/desktop/src/components/ui/badge/index.ts | 3 +- .../src/components/ui/button/Button.vue | 9 +- .../desktop/src/components/ui/button/index.ts | 15 +- .../ui/context-menu/ContextMenuLabel.vue | 7 +- .../ui/context-menu/ContextMenuSeparator.vue | 6 +- .../ui/context-menu/ContextMenuShortcut.vue | 10 +- .../components/ui/dialog/DialogContent.vue | 18 +- .../ui/dialog/DialogDescription.vue | 11 +- .../src/components/ui/dialog/DialogFooter.vue | 10 +- .../components/ui/dialog/DialogOverlay.vue | 11 +- .../ui/dialog/DialogScrollContent.vue | 11 +- .../src/components/ui/dialog/DialogTitle.vue | 6 +- .../DropdownMenuCheckboxItem.vue | 5 +- .../ui/dropdown-menu/DropdownMenuLabel.vue | 7 +- .../dropdown-menu/DropdownMenuRadioItem.vue | 5 +- .../dropdown-menu/DropdownMenuSeparator.vue | 6 +- .../ui/dropdown-menu/DropdownMenuShortcut.vue | 10 +- .../desktop/src/components/ui/label/Label.vue | 11 +- .../components/ui/scroll-area/ScrollArea.vue | 5 +- .../components/ui/scroll-area/ScrollBar.vue | 7 +- .../ui/searchable-select/SearchableSelect.vue | 38 +- .../components/ui/select/SelectContent.vue | 8 +- .../ui/select/SelectScrollDownButton.vue | 11 +- .../ui/select/SelectScrollUpButton.vue | 11 +- .../components/ui/select/SelectSeparator.vue | 6 +- .../components/ui/select/SelectTrigger.vue | 5 +- .../src/components/ui/separator/Separator.vue | 11 +- .../components/ui/sheet/SheetDescription.vue | 6 +- .../src/components/ui/sheet/SheetOverlay.vue | 8 +- .../src/components/ui/sheet/SheetTitle.vue | 6 +- apps/desktop/src/components/ui/tabs/Tabs.vue | 8 +- .../src/components/ui/tabs/TabsList.vue | 7 +- apps/desktop/src/components/ui/tabs/index.ts | 21 +- .../components/ui/tooltip/TooltipContent.vue | 4 +- .../src/composables/useCellDetailEditor.ts | 56 +- .../src/composables/useDataGridActions.ts | 32 +- .../composables/useDataGridColumnResize.ts | 6 +- .../src/composables/useDataGridEditor.ts | 95 +- .../src/composables/useDataGridExport.ts | 55 +- .../src/composables/useDataGridSelection.ts | 27 +- .../src/composables/useDatabaseOptions.ts | 10 +- .../src/composables/useDialogSources.ts | 10 +- .../src/composables/useExportTracker.ts | 4 +- apps/desktop/src/composables/useFlatTree.ts | 8 +- .../src/composables/useNavigationTargets.ts | 40 +- .../src/composables/useSqlExecution.ts | 8 +- apps/desktop/src/composables/useTabScroll.ts | 5 +- .../desktop/src/composables/useTauriEvents.ts | 48 +- apps/desktop/src/composables/useTheme.ts | 8 +- apps/desktop/src/i18n/backend-errors.ts | 10 +- apps/desktop/src/i18n/index.ts | 7 +- apps/desktop/src/i18n/locales/en.ts | 174 +- apps/desktop/src/i18n/locales/es.ts | 201 +- apps/desktop/src/i18n/locales/it.ts | 285 +-- apps/desktop/src/i18n/locales/pt-BR.ts | 252 +- apps/desktop/src/i18n/locales/zh-CN.ts | 33 +- apps/desktop/src/i18n/locales/zh-TW.ts | 30 +- .../__tests__/sqlCompletion.snippet.spec.ts | 8 +- apps/desktop/src/lib/actionActivation.ts | 6 +- .../desktop/src/lib/agentDriverInstallHint.ts | 6 +- .../desktop/src/lib/agentDriverUpdateBadge.ts | 5 +- apps/desktop/src/lib/ai.ts | 154 +- apps/desktop/src/lib/aiAgentPlan.ts | 15 +- apps/desktop/src/lib/aiCodeHighlighter.ts | 67 +- apps/desktop/src/lib/aiSkills.ts | 41 +- apps/desktop/src/lib/aiSqlExecutionPolicy.ts | 6 +- apps/desktop/src/lib/binaryCellDownload.ts | 21 +- .../desktop/src/lib/canvasDataGridRenderer.ts | 87 +- apps/desktop/src/lib/clipboard.ts | 9 +- .../src/lib/codemirrorSelectionMatches.ts | 8 +- .../lib/codemirrorTrimmedSelectionLayer.ts | 43 +- apps/desktop/src/lib/columnFormatter.ts | 41 +- apps/desktop/src/lib/configCrypto.ts | 16 +- .../src/lib/connectionAttemptTimeout.ts | 5 +- apps/desktop/src/lib/connectionHealth.ts | 10 +- .../desktop/src/lib/connectionPresentation.ts | 20 +- apps/desktop/src/lib/connectionUrl.ts | 32 +- .../src/lib/connectionVisibleDatabases.ts | 30 +- apps/desktop/src/lib/createDatabaseSql.ts | 15 +- apps/desktop/src/lib/dataGridCellCoercion.ts | 23 +- apps/desktop/src/lib/dataGridColumnFilter.ts | 29 +- apps/desktop/src/lib/dataGridColumnType.ts | 6 +- .../src/lib/dataGridColumnVisibility.ts | 39 +- apps/desktop/src/lib/dataGridColumnWidth.ts | 5 +- apps/desktop/src/lib/dataGridDetail.ts | 11 +- apps/desktop/src/lib/dataGridPagination.ts | 5 +- apps/desktop/src/lib/dataGridPaintTheme.ts | 22 +- apps/desktop/src/lib/dataGridSaveUi.ts | 12 +- apps/desktop/src/lib/dataGridSearchSplit.ts | 8 +- apps/desktop/src/lib/dataGridSort.ts | 6 +- apps/desktop/src/lib/dataGridSql.ts | 22 +- .../desktop/src/lib/dataGridTemporalEditor.ts | 10 +- apps/desktop/src/lib/dataGridTranspose.ts | 28 +- .../desktop/src/lib/databaseCapabilitySets.ts | 98 +- .../desktop/src/lib/databaseFeatureSupport.ts | 12 +- .../src/lib/databaseObjectCapabilities.ts | 19 +- apps/desktop/src/lib/databaseOptionSearch.ts | 6 +- apps/desktop/src/lib/databaseSearch.ts | 7 +- apps/desktop/src/lib/databaseTree.ts | 17 +- apps/desktop/src/lib/databaseUserAdmin.ts | 53 +- apps/desktop/src/lib/datagripImport.ts | 20 +- apps/desktop/src/lib/dbeaverImport.ts | 25 +- apps/desktop/src/lib/debugLog.ts | 49 +- apps/desktop/src/lib/defaultDatabase.ts | 11 +- apps/desktop/src/lib/diagramSvgExport.ts | 76 +- .../src/lib/driverInstallProgressUi.ts | 5 +- apps/desktop/src/lib/editorThemes.ts | 92 +- .../src/lib/elasticsearchCompletion.ts | 66 +- apps/desktop/src/lib/engineeringDiagram.ts | 36 +- apps/desktop/src/lib/erDiagram.ts | 20 +- apps/desktop/src/lib/etcdKeyTree.ts | 6 +- apps/desktop/src/lib/explainPlan.ts | 45 +- apps/desktop/src/lib/fieldLineage.ts | 28 +- apps/desktop/src/lib/geometryPreview.ts | 15 +- apps/desktop/src/lib/gridSelection.ts | 36 +- apps/desktop/src/lib/historyAiAnalysis.ts | 4 +- apps/desktop/src/lib/http.ts | 447 +--- apps/desktop/src/lib/httpSqlFileProgress.ts | 5 +- apps/desktop/src/lib/imagePreviewViewer.ts | 15 +- apps/desktop/src/lib/jdbcDialect.ts | 36 +- apps/desktop/src/lib/keyboardShortcuts.ts | 11 +- apps/desktop/src/lib/mongoShellCommand.ts | 36 +- apps/desktop/src/lib/navicatImport.ts | 21 +- apps/desktop/src/lib/newQueryContext.ts | 9 +- apps/desktop/src/lib/objectBrowserRows.ts | 38 +- apps/desktop/src/lib/objectRenameSql.ts | 15 +- apps/desktop/src/lib/objectSourceEditor.ts | 25 +- apps/desktop/src/lib/openTabsPersistence.ts | 18 +- apps/desktop/src/lib/paginationPageSize.ts | 5 +- apps/desktop/src/lib/queryEditorTableDrop.ts | 22 +- apps/desktop/src/lib/queryExecutionState.ts | 4 +- apps/desktop/src/lib/queryTimeout.ts | 4 +- apps/desktop/src/lib/redisCommandSafety.ts | 16 +- apps/desktop/src/lib/redisJsonHighlighter.ts | 14 +- apps/desktop/src/lib/redisKeyTree.ts | 19 +- .../desktop/src/lib/redisValuePresentation.ts | 26 +- apps/desktop/src/lib/routineExecutionSql.ts | 50 +- apps/desktop/src/lib/routineParameters.ts | 28 +- apps/desktop/src/lib/schemaTreeCache.ts | 6 +- apps/desktop/src/lib/shortcutRegistry.ts | 23 +- .../desktop/src/lib/sidebarActiveTabTarget.ts | 57 +- .../src/lib/sidebarConnectionSelection.ts | 5 +- apps/desktop/src/lib/sidebarLayout.ts | 54 +- apps/desktop/src/lib/sidebarNodeOrdering.ts | 14 +- apps/desktop/src/lib/sidebarRenameFocus.ts | 5 +- apps/desktop/src/lib/sidebarSearch.ts | 9 +- apps/desktop/src/lib/sidebarSearchTree.ts | 29 +- .../src/lib/sidebarTableNameDisplay.ts | 11 +- apps/desktop/src/lib/sidebarTreeItemLayout.ts | 16 +- apps/desktop/src/lib/sidebarTreeSelection.ts | 14 +- apps/desktop/src/lib/sqlAnalysis.ts | 59 +- apps/desktop/src/lib/sqlCompletion.ts | 416 +--- apps/desktop/src/lib/sqlDiagnostics.ts | 4 +- apps/desktop/src/lib/sqlExecutionTarget.ts | 12 +- apps/desktop/src/lib/sqlFormatter.ts | 12 +- apps/desktop/src/lib/sqlFormatterConfig.ts | 49 +- .../src/lib/sqlFormatterConfigEditor.ts | 9 +- apps/desktop/src/lib/sqlHighlighter.ts | 8 +- apps/desktop/src/lib/sqlMetadataRefresh.ts | 17 +- apps/desktop/src/lib/sqlNavigation.ts | 5 +- .../desktop/src/lib/sqlSemanticDiagnostics.ts | 45 +- apps/desktop/src/lib/sqlServerTree.ts | 15 +- apps/desktop/src/lib/tabCloseActions.ts | 11 +- apps/desktop/src/lib/tabPresentation.ts | 9 +- apps/desktop/src/lib/tabResultCache.ts | 21 +- apps/desktop/src/lib/tableDataExport.ts | 9 +- apps/desktop/src/lib/tableEditing.ts | 27 +- apps/desktop/src/lib/tableImport.ts | 7 +- apps/desktop/src/lib/tableSelectSql.ts | 13 +- .../src/lib/tableStructureCapabilities.ts | 11 +- .../src/lib/tableStructureEditorState.ts | 26 +- apps/desktop/src/lib/tableTree.ts | 100 +- apps/desktop/src/lib/tauri.ts | 453 +--- apps/desktop/src/lib/transferProgressState.ts | 5 +- apps/desktop/src/lib/treeNodeClick.ts | 39 +- apps/desktop/src/lib/treeNodeContext.ts | 5 +- apps/desktop/src/lib/visibleDatabases.ts | 15 +- apps/desktop/src/lib/xlsxExport.ts | 55 +- apps/desktop/src/main.ts | 38 +- apps/desktop/src/stores/connectionStore.ts | 375 +-- apps/desktop/src/stores/queryStore.ts | 306 +-- apps/desktop/src/stores/savedSqlStore.ts | 59 +- apps/desktop/src/stores/settingsStore.ts | 193 +- apps/desktop/src/styles/globals.css | 19 +- apps/desktop/src/types/database.ts | 18 +- apps/desktop/vite.config.ts | 10 +- crates/dbx-core/assets/agent-protocol-v1.json | 33 +- .../assets/database-drivers.manifest.json | 4 +- docs/app/[lang]/api/search/route.ts | 8 +- docs/app/[lang]/changelog/page.tsx | 28 +- docs/app/[lang]/community/page.tsx | 89 +- docs/app/[lang]/docs/[[...slug]]/page.tsx | 87 +- docs/app/[lang]/docs/layout.tsx | 16 +- docs/app/[lang]/drivers/DriversClient.tsx | 135 +- docs/app/[lang]/drivers/page.tsx | 12 +- docs/app/[lang]/layout.tsx | 44 +- docs/app/[lang]/page.tsx | 493 ++-- docs/app/global.css | 167 +- docs/app/layout.tsx | 26 +- docs/app/page.tsx | 4 +- docs/components/DocsSidebarFooter.tsx | 48 +- docs/components/StaticSearchDialog.tsx | 47 +- .../aceternity/HeroProductStage.tsx | 49 +- .../aceternity/InfiniteMovingCards.tsx | 15 +- docs/components/aceternity/Spotlight.tsx | 16 +- docs/components/landing/ChangelogList.tsx | 61 +- docs/components/landing/ChangelogRuntime.tsx | 18 +- docs/components/landing/InstallTabs.tsx | 58 +- .../landing/LandingLatestUpdates.tsx | 18 +- docs/components/landing/LandingNav.tsx | 74 +- docs/components/landing/RevealSection.tsx | 16 +- docs/content/docs/ai-assistant.cn.mdx | 33 +- docs/content/docs/ai-assistant.mdx | 37 +- docs/content/docs/cli.cn.mdx | 52 +- docs/content/docs/cli.mdx | 52 +- docs/content/docs/config-export.cn.mdx | 46 +- docs/content/docs/config-export.mdx | 46 +- docs/content/docs/connection-import.cn.mdx | 62 +- docs/content/docs/connection-import.mdx | 62 +- docs/content/docs/data-grid.cn.mdx | 46 +- docs/content/docs/data-grid.mdx | 46 +- docs/content/docs/data-transfer.cn.mdx | 37 +- docs/content/docs/data-transfer.mdx | 35 +- docs/content/docs/database-export.cn.mdx | 22 +- docs/content/docs/database-export.mdx | 22 +- docs/content/docs/databases.cn.mdx | 115 +- docs/content/docs/databases.mdx | 115 +- docs/content/docs/driver-management.cn.mdx | 42 +- docs/content/docs/driver-management.mdx | 42 +- docs/content/docs/field-lineage.cn.mdx | 20 +- docs/content/docs/field-lineage.mdx | 20 +- docs/content/docs/getting-started.cn.mdx | 56 +- docs/content/docs/getting-started.mdx | 58 +- docs/content/docs/keyboard-shortcuts.cn.mdx | 46 +- docs/content/docs/keyboard-shortcuts.mdx | 46 +- docs/content/docs/mcp.cn.mdx | 162 +- docs/content/docs/mcp.mdx | 162 +- docs/content/docs/mongodb.cn.mdx | 22 +- docs/content/docs/mongodb.mdx | 22 +- docs/content/docs/object-browser.cn.mdx | 22 +- docs/content/docs/object-browser.mdx | 22 +- docs/content/docs/plugins.cn.mdx | 115 +- docs/content/docs/plugins.mdx | 113 +- docs/content/docs/query-editor.cn.mdx | 34 +- docs/content/docs/query-editor.mdx | 34 +- docs/content/docs/redis.cn.mdx | 24 +- docs/content/docs/redis.mdx | 24 +- docs/content/docs/schema-browser.cn.mdx | 52 +- docs/content/docs/schema-browser.mdx | 52 +- docs/content/docs/schema-diff.cn.mdx | 23 +- docs/content/docs/schema-diff.mdx | 25 +- docs/content/docs/sql-file.cn.mdx | 13 +- docs/content/docs/sql-file.mdx | 13 +- docs/content/docs/sql-snippets.cn.mdx | 21 +- docs/content/docs/sql-snippets.mdx | 21 +- docs/content/docs/ssh-tunnel.cn.mdx | 21 +- docs/content/docs/ssh-tunnel.mdx | 19 +- docs/content/docs/table-import.cn.mdx | 37 +- docs/content/docs/table-import.mdx | 39 +- docs/content/docs/table-structure.cn.mdx | 40 +- docs/content/docs/table-structure.mdx | 40 +- docs/content/docs/what-is-dbx.cn.mdx | 18 +- docs/content/docs/what-is-dbx.mdx | 20 +- docs/lib/agentRegistry.ts | 3 +- docs/lib/appVersion.ts | 2 +- docs/lib/changelog.ts | 51 +- docs/lib/cjkSearchTokenizer.ts | 4 +- docs/lib/downloadLinks.ts | 34 +- docs/lib/httpJson.ts | 14 +- docs/lib/i18n.ts | 32 +- docs/lib/landingLatest.ts | 43 +- docs/lib/latestRelease.ts | 20 +- docs/lib/metadata.ts | 42 +- docs/lib/releaseMetadataRequest.test.ts | 24 +- docs/lib/releaseMetadataRequest.ts | 8 +- docs/lib/source.ts | 74 +- docs/next.config.mjs | 4 +- docs/performance/dom-density-audit.md | 28 +- docs/postcss.config.mjs | 2 +- docs/scripts/generate-sitemap.mjs | 34 +- docs/source.config.ts | 4 +- docs/tsconfig.json | 27 +- .../app-tests/agentDriverUpdateBadge.test.ts | 19 +- packages/app-tests/aiAgentPlan.test.ts | 13 +- .../app-tests/aiAgentStepPresentation.test.ts | 14 +- packages/app-tests/aiPromptEval.test.ts | 14 +- packages/app-tests/aiPromptKeyboard.test.ts | 5 +- .../app-tests/aiSqlExecutionPolicy.test.ts | 21 +- packages/app-tests/aiTableMentions.test.ts | 4 +- packages/app-tests/appTheme.test.ts | 6 +- packages/app-tests/binaryCellDownload.test.ts | 19 +- packages/app-tests/cellImageUrl.test.ts | 5 +- packages/app-tests/cellValue.test.ts | 2 +- packages/app-tests/columnFormatter.test.ts | 31 +- packages/app-tests/configCrypto.test.ts | 12 +- .../connectionAttemptTimeout.test.ts | 12 +- packages/app-tests/connectionDeepLink.test.ts | 12 +- .../app-tests/connectionPresentation.test.ts | 10 +- .../connectionStoreGroupedConnect.test.ts | 5 +- .../connectionStorePinnedCleanup.test.ts | 1 - packages/app-tests/connectionUrl.test.ts | 35 +- .../connectionVisibleDatabases.test.ts | 11 +- packages/app-tests/createDatabaseSql.test.ts | 6 +- .../app-tests/dataGridCellCoercion.test.ts | 6 +- .../app-tests/dataGridColumnFilter.test.ts | 16 +- packages/app-tests/dataGridColumnType.test.ts | 5 +- .../dataGridColumnVisibility.test.ts | 10 +- packages/app-tests/dataGridDetail.test.ts | 17 +- packages/app-tests/dataGridEditor.test.ts | 22 +- .../app-tests/dataGridSearchSplit.test.ts | 6 +- .../app-tests/dataGridTemporalEditor.test.ts | 6 +- .../app-tests/databaseCapabilities.test.ts | 21 +- packages/app-tests/databaseSearch.test.ts | 7 +- packages/app-tests/databaseTree.test.ts | 21 +- packages/app-tests/databaseUserAdmin.test.ts | 56 +- packages/app-tests/defaultDatabase.test.ts | 19 +- packages/app-tests/diagramSvgExport.test.ts | 20 +- packages/app-tests/diagramZoom.test.ts | 6 +- .../app-tests/driverInstallProgressUi.test.ts | 18 +- .../driverRuntimePresentation.test.ts | 9 +- packages/app-tests/editorZoom.test.ts | 7 +- .../app-tests/elasticsearchCompletion.test.ts | 28 +- packages/app-tests/engineeringDiagram.test.ts | 45 +- packages/app-tests/erDiagram.test.ts | 21 +- packages/app-tests/gridSelection.test.ts | 5 +- packages/app-tests/h2Connection.test.ts | 12 +- packages/app-tests/historyActions.test.ts | 25 +- packages/app-tests/historyAiAnalysis.test.ts | 6 +- packages/app-tests/historyVirtualList.test.ts | 6 +- packages/app-tests/i18nLocale.test.ts | 6 +- packages/app-tests/imagePreviewViewer.test.ts | 12 +- packages/app-tests/jdbcDialect.test.ts | 24 +- packages/app-tests/keyboardShortcuts.test.ts | 22 +- .../app-tests/mongoConnectionOptions.test.ts | 12 +- packages/app-tests/mongoShellCommand.test.ts | 56 +- packages/app-tests/objectBrowserRows.test.ts | 7 +- .../app-tests/openTabsPersistence.test.ts | 5 +- packages/app-tests/pinnedItems.test.ts | 18 +- packages/app-tests/pinnedTreeNodeIds.test.ts | 1 - packages/app-tests/queryStore.test.ts | 46 +- .../app-tests/redisCommandSession.test.ts | 6 +- packages/app-tests/redisKeyTree.test.ts | 27 +- .../app-tests/redisValuePresentation.test.ts | 11 +- .../app-tests/routineExecutionSql.test.ts | 50 +- packages/app-tests/schemaTreeCache.test.ts | 6 +- packages/app-tests/settingsStore.test.ts | 24 +- .../app-tests/sidebarActiveTabTarget.test.ts | 7 +- packages/app-tests/sidebarLayout.test.ts | 24 +- packages/app-tests/sidebarRenameFocus.test.ts | 5 +- packages/app-tests/sidebarSearchTree.test.ts | 5 +- .../app-tests/sidebarTableNameDisplay.test.ts | 5 +- .../app-tests/sidebarTreeItemLayout.test.ts | 7 +- .../app-tests/sidebarTreeSelection.test.ts | 6 +- packages/app-tests/sqlAnalysis.test.ts | 23 +- packages/app-tests/sqlCompletion.test.ts | 52 +- .../sqlCompletionPerformance.test.ts | 9 +- packages/app-tests/sqlFormatter.test.ts | 15 +- packages/app-tests/sqlFormatterConfig.test.ts | 26 +- .../sqlFormatterConfigEditor.test.ts | 18 +- packages/app-tests/sqlMetadataRefresh.test.ts | 10 +- .../app-tests/sqlSemanticDiagnostics.test.ts | 32 +- packages/app-tests/sqlServerTree.test.ts | 14 +- packages/app-tests/syncChangelog.test.ts | 4 +- packages/app-tests/tabCloseActions.test.ts | 15 +- packages/app-tests/tabPresentation.test.ts | 6 +- packages/app-tests/tabResultCache.test.ts | 6 +- packages/app-tests/tableDataExport.test.ts | 13 +- packages/app-tests/tableEditing.test.ts | 12 +- packages/app-tests/tableImport.test.ts | 10 +- packages/app-tests/tableSelectSql.test.ts | 15 +- .../tableStructureCapabilities.test.ts | 5 +- .../tableStructureEditorState.test.ts | 21 +- packages/app-tests/tableTree.test.ts | 8 +- .../app-tests/transferProgressState.test.ts | 20 +- packages/app-tests/treeNodeClick.test.ts | 8 +- packages/app-tests/treeNodeContext.test.ts | 6 +- packages/app-tests/useFlatTree.test.ts | 10 +- packages/app-tests/visibleDatabases.test.ts | 28 +- packages/cli/README.md | 40 +- packages/cli/package.json | 42 +- packages/cli/src/cli.ts | 98 +- packages/cli/tests/bin.test.ts | 4 +- packages/cli/tests/cli-format.test.ts | 2 +- packages/mcp-server/README.md | 36 +- packages/mcp-server/package.json | 50 +- packages/mcp-server/src/index.ts | 22 +- packages/mcp-server/tests/bin.test.ts | 9 +- packages/mcp-server/tests/server.test.ts | 4 +- packages/node-core/README.md | 8 +- packages/node-core/package.json | 10 +- packages/node-core/src/backend.ts | 14 +- packages/node-core/src/bridge.ts | 5 +- packages/node-core/src/connections.ts | 52 +- packages/node-core/src/database.ts | 109 +- packages/node-core/src/diagnostics.ts | 17 +- packages/node-core/src/schema-context.ts | 24 +- packages/node-core/src/web-backend.ts | 17 +- packages/node-core/tests/format.test.ts | 2 +- packages/node-core/tests/mongo-query.test.ts | 84 +- .../node-core/tests/rqlite-direct.test.ts | 24 +- .../node-core/tests/schema-context.test.ts | 1 - src-tauri/capabilities/default.json | 4 +- src-tauri/tauri.conf.json | 13 +- vitest.config.ts | 7 +- 477 files changed, 5720 insertions(+), 19773 deletions(-) diff --git a/.github/scripts/check-jdbc-plugin-version.mjs b/.github/scripts/check-jdbc-plugin-version.mjs index 266930d5e..538b2015b 100644 --- a/.github/scripts/check-jdbc-plugin-version.mjs +++ b/.github/scripts/check-jdbc-plugin-version.mjs @@ -13,10 +13,7 @@ function manifestVersion(manifestJson) { return JSON.parse(manifestJson).version ?? ""; } -export function evaluateJdbcPluginVersionChange({ - headPomVersion, - headManifestVersion, -}) { +export function evaluateJdbcPluginVersionChange({ headPomVersion, headManifestVersion }) { const errors = []; if (headPomVersion !== headManifestVersion) { errors.push(`JDBC plugin version mismatch: pom.xml is ${headPomVersion} but manifest.json is ${headManifestVersion}.`); diff --git a/.github/scripts/sync-changelog.mjs b/.github/scripts/sync-changelog.mjs index b42bbea43..801164172 100644 --- a/.github/scripts/sync-changelog.mjs +++ b/.github/scripts/sync-changelog.mjs @@ -1,38 +1,35 @@ #!/usr/bin/env node -import { createHash } from 'node:crypto'; -import { writeFileSync } from 'node:fs'; -import { resolve } from 'node:path'; -import { fileURLToPath } from 'node:url'; +import { createHash } from "node:crypto"; +import { writeFileSync } from "node:fs"; +import { resolve } from "node:path"; +import { fileURLToPath } from "node:url"; -const REPO = 't8y2/dbx'; -const GITHUB_TOKEN = process.env.GITHUB_TOKEN || ''; -const DEEPSEEK_API_KEY = process.env.DEEPSEEK_API_KEY || ''; -const OUT_CN = 'releases-cn.json'; -const OUT_EN = 'releases-en.json'; -const EN_CACHE_URL = process.env.CHANGELOG_EN_CACHE_URL || 'https://dl.dbxio.com/changelog/releases-en.json'; +const REPO = "t8y2/dbx"; +const GITHUB_TOKEN = process.env.GITHUB_TOKEN || ""; +const DEEPSEEK_API_KEY = process.env.DEEPSEEK_API_KEY || ""; +const OUT_CN = "releases-cn.json"; +const OUT_EN = "releases-en.json"; +const EN_CACHE_URL = process.env.CHANGELOG_EN_CACHE_URL || "https://dl.dbxio.com/changelog/releases-en.json"; const SECTION_MAP = { - '新功能': 'added', - 'Added': 'added', - '改进': 'improved', - 'Improved': 'improved', - '修复': 'fixed', - 'Fixed': 'fixed', - '变更': 'changed', - 'Changed': 'changed', - '移除': 'removed', - 'Removed': 'removed', + 新功能: "added", + Added: "added", + 改进: "improved", + Improved: "improved", + 修复: "fixed", + Fixed: "fixed", + 变更: "changed", + Changed: "changed", + 移除: "removed", + Removed: "removed", }; export async function fetchAllReleases() { const releases = []; let page = 1; while (true) { - const res = await fetch( - `https://api.github.com/repos/${REPO}/releases?per_page=100&page=${page}`, - { headers: { Authorization: `token ${GITHUB_TOKEN}`, Accept: 'application/vnd.github+json' } }, - ); + const res = await fetch(`https://api.github.com/repos/${REPO}/releases?per_page=100&page=${page}`, { headers: { Authorization: `token ${GITHUB_TOKEN}`, Accept: "application/vnd.github+json" } }); if (!res.ok) throw new Error(`GitHub API ${res.status}: ${await res.text()}`); const data = await res.json(); if (data.length === 0) break; @@ -43,7 +40,7 @@ export async function fetchAllReleases() { } export function stripDownloadSection(body) { - const markers = ['### 下载安装', '### Download', '### 系统要求', '### System Requirements']; + const markers = ["### 下载安装", "### Download", "### 系统要求", "### System Requirements"]; let idx = body.length; for (const m of markers) { const i = body.indexOf(m); @@ -57,11 +54,11 @@ export function parseBody(body) { const sections = []; let current = null; - for (const line of cleaned.split('\n')) { + for (const line of cleaned.split("\n")) { const headerMatch = line.match(/^###\s+(.+)/); if (headerMatch) { const title = headerMatch[1].trim(); - const type = SECTION_MAP[title] || 'other'; + const type = SECTION_MAP[title] || "other"; current = { type, title, items: [] }; sections.push(current); continue; @@ -77,7 +74,7 @@ export function parseBody(body) { const plainMatch = line.match(/^-\s+(.+)/); if (plainMatch) { - current.items.push({ title: plainMatch[1].trim(), desc: '' }); + current.items.push({ title: plainMatch[1].trim(), desc: "" }); } } @@ -85,16 +82,16 @@ export function parseBody(body) { } export function buildReleaseSourceHash(release) { - return createHash('sha256') + return createHash("sha256") .update( JSON.stringify({ tag: release.tag_name, name: release.name || release.tag_name, - publishedAt: release.published_at || '', - body: release.body || '', + publishedAt: release.published_at || "", + body: release.body || "", }), ) - .digest('hex'); + .digest("hex"); } export function buildReleasesJson(releases, now = new Date()) { @@ -108,7 +105,7 @@ export function buildReleasesJson(releases, now = new Date()) { name: r.name || r.tag_name, date: r.published_at.slice(0, 10), _sourceHash: buildReleaseSourceHash(r), - sections: parseBody(r.body || ''), + sections: parseBody(r.body || ""), })), }; } @@ -116,18 +113,15 @@ export function buildReleasesJson(releases, now = new Date()) { function releaseToMarkdown(release) { return release.sections .map((s) => { - const items = s.items.map((i) => (i.desc ? `- **${i.title}** — ${i.desc}` : `- ${i.title}`)).join('\n'); + const items = s.items.map((i) => (i.desc ? `- **${i.title}** — ${i.desc}` : `- ${i.title}`)).join("\n"); return `### ${s.title}\n${items}`; }) - .join('\n\n'); + .join("\n\n"); } -export async function fetchCachedEnglish({ - cacheUrl = EN_CACHE_URL, - fetchImpl = fetch, -} = {}) { +export async function fetchCachedEnglish({ cacheUrl = EN_CACHE_URL, fetchImpl = fetch } = {}) { try { - const res = await fetchImpl(cacheUrl, { headers: { Accept: 'application/json' } }); + const res = await fetchImpl(cacheUrl, { headers: { Accept: "application/json" } }); if (!res.ok) { console.warn(`English changelog cache unavailable: ${res.status}`); return null; @@ -139,17 +133,9 @@ export async function fetchCachedEnglish({ } } -export async function translateToEnglish( - cnJson, - { - cachedEnJson = null, - deepseekApiKey = DEEPSEEK_API_KEY, - fetchImpl = fetch, - sleep = (ms) => new Promise((r) => setTimeout(r, ms)), - } = {}, -) { +export async function translateToEnglish(cnJson, { cachedEnJson = null, deepseekApiKey = DEEPSEEK_API_KEY, fetchImpl = fetch, sleep = (ms) => new Promise((r) => setTimeout(r, ms)) } = {}) { if (!deepseekApiKey) { - console.warn('DEEPSEEK_API_KEY not set, skipping translation'); + console.warn("DEEPSEEK_API_KEY not set, skipping translation"); return null; } @@ -178,18 +164,18 @@ export async function translateToEnglish( continue; } - const res = await fetchImpl('https://api.deepseek.com/chat/completions', { - method: 'POST', - headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${deepseekApiKey}` }, + const res = await fetchImpl("https://api.deepseek.com/chat/completions", { + method: "POST", + headers: { "Content-Type": "application/json", Authorization: `Bearer ${deepseekApiKey}` }, body: JSON.stringify({ - model: 'deepseek-chat', + model: "deepseek-chat", messages: [ { - role: 'system', + role: "system", content: - 'You are a technical translator. Translate the following Chinese software changelog to English. Keep the exact markdown format (### headers, - bullet points, **bold** titles, — dashes). Only translate, do not add or remove content. Keep technical terms, product names, and contributor names unchanged.', + "You are a technical translator. Translate the following Chinese software changelog to English. Keep the exact markdown format (### headers, - bullet points, **bold** titles, — dashes). Only translate, do not add or remove content. Keep technical terms, product names, and contributor names unchanged.", }, - { role: 'user', content: sectionsText }, + { role: "user", content: sectionsText }, ], temperature: 0.1, }), @@ -202,7 +188,7 @@ export async function translateToEnglish( } const data = await res.json(); - const translated = data.choices?.[0]?.message?.content || ''; + const translated = data.choices?.[0]?.message?.content || ""; const enSections = parseBody(translated); enReleases.push({ ...release, sections: enSections.length > 0 ? enSections : release.sections }); translatedCount++; @@ -215,7 +201,7 @@ export async function translateToEnglish( } async function main() { - console.log('Fetching releases from GitHub...'); + console.log("Fetching releases from GitHub..."); const releases = await fetchAllReleases(); console.log(`Found ${releases.length} releases`); @@ -225,17 +211,17 @@ async function main() { writeFileSync(OUT_CN, JSON.stringify(cnJson, null, 2)); console.log(`Wrote ${OUT_CN}`); - console.log('Fetching cached English changelog...'); + console.log("Fetching cached English changelog..."); const cachedEnJson = await fetchCachedEnglish(); - console.log('Translating to English...'); + console.log("Translating to English..."); const enJson = await translateToEnglish(cnJson, { cachedEnJson }); if (enJson) { writeFileSync(OUT_EN, JSON.stringify(enJson, null, 2)); console.log(`Wrote ${OUT_EN}`); } - console.log('Done!'); + console.log("Done!"); } if (process.argv[1] && fileURLToPath(import.meta.url) === resolve(process.argv[1])) { diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 969a06083..74eb283b4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -66,7 +66,7 @@ jobs: - name: Rust cache uses: swatinem/rust-cache@v2 with: - workspaces: './ -> target' + workspaces: "./ -> target" shared-key: ci-x86_64-unknown-linux-gnu - name: Cargo fmt check @@ -89,7 +89,7 @@ jobs: uses: actions/setup-java@v4 with: distribution: temurin - java-version: '17' + java-version: "17" cache: maven - name: JDBC plugin version guard diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 45dfa9df9..c23e88cef 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -3,9 +3,9 @@ name: Deploy Docs on: push: branches: [main] - paths: ['docs/**'] + paths: ["docs/**"] workflow_run: - workflows: ['Publish Packages'] + workflows: ["Publish Packages"] types: [completed] workflow_dispatch: diff --git a/.github/workflows/publish-packages.yml b/.github/workflows/publish-packages.yml index 3dcb32893..522fc3423 100644 --- a/.github/workflows/publish-packages.yml +++ b/.github/workflows/publish-packages.yml @@ -4,7 +4,7 @@ on: workflow_dispatch: inputs: tag: - description: 'Release tag (e.g. v0.3.10)' + description: "Release tag (e.g. v0.3.10)" required: true permissions: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d3c98f87d..f89ce602f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -3,7 +3,7 @@ name: Release on: push: tags: - - 'v*' + - "v*" permissions: contents: write @@ -107,7 +107,7 @@ jobs: - name: Rust cache uses: swatinem/rust-cache@v2 with: - workspaces: './ -> target' + workspaces: "./ -> target" shared-key: release-${{ matrix.target }}-${{ steps.deps-hash.outputs.hash }} add-rust-environment-hash-key: false cache-on-failure: true @@ -173,7 +173,7 @@ jobs: APPLE_TEAM_ID: ${{ startsWith(matrix.platform, 'macos') && secrets.APPLE_TEAM_ID || '' }} with: tagName: ${{ github.ref_name }} - releaseName: 'DBX ${{ github.ref_name }}' + releaseName: "DBX ${{ github.ref_name }}" releaseBody: ${{ steps.release-notes.outputs.body }} releaseDraft: true prerelease: false @@ -246,7 +246,7 @@ jobs: uses: actions/setup-java@v4 with: distribution: temurin - java-version: '17' + java-version: "17" cache: maven - name: Apply automatic JDBC plugin version bump @@ -302,7 +302,6 @@ jobs: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: gh release edit ${{ github.ref_name }} --repo ${{ github.repository }} --draft=false --prerelease - docker: runs-on: ubuntu-latest strategy: diff --git a/.github/workflows/sync-changelog.yml b/.github/workflows/sync-changelog.yml index 833e554f2..8f7f17334 100644 --- a/.github/workflows/sync-changelog.yml +++ b/.github/workflows/sync-changelog.yml @@ -2,7 +2,7 @@ name: Sync Changelog to R2 on: workflow_run: - workflows: ['Publish Packages'] + workflows: ["Publish Packages"] types: [completed] workflow_dispatch: diff --git a/.oxfmtrc.json b/.oxfmtrc.json index 98e1cc043..660b096c3 100644 --- a/.oxfmtrc.json +++ b/.oxfmtrc.json @@ -1,6 +1,6 @@ { "$schema": "./node_modules/oxfmt/configuration_schema.json", - "printWidth": 120, + "printWidth": 300, "tabWidth": 2, "singleQuote": false, "trailingComma": "all", diff --git a/README.zh-CN.md b/README.zh-CN.md index 04d03284c..2018a9a4a 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -258,13 +258,13 @@ pnpm tauri build ## 技术栈 -| 层级 | 技术 | -|------|------| -| 框架 | [Tauri 2](https://tauri.app/) | -| 前端 | [Vue 3](https://vuejs.org/) + TypeScript | -| UI | [shadcn-vue](https://www.shadcn-vue.com/) + Tailwind CSS | -| 编辑器 | [CodeMirror 6](https://codemirror.net/) | -| 后端 | Rust + [sqlx](https://github.com/launchbadge/sqlx) / [tiberius](https://github.com/prisma/tiberius) / [redis-rs](https://github.com/redis-rs/redis-rs) / [mongodb](https://github.com/mongodb/mongo-rust-driver) | +| 层级 | 技术 | +| ------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 框架 | [Tauri 2](https://tauri.app/) | +| 前端 | [Vue 3](https://vuejs.org/) + TypeScript | +| UI | [shadcn-vue](https://www.shadcn-vue.com/) + Tailwind CSS | +| 编辑器 | [CodeMirror 6](https://codemirror.net/) | +| 后端 | Rust + [sqlx](https://github.com/launchbadge/sqlx) / [tiberius](https://github.com/prisma/tiberius) / [redis-rs](https://github.com/redis-rs/redis-rs) / [mongodb](https://github.com/mongodb/mongo-rust-driver) | ## 社区 diff --git a/apps/desktop/src/App.vue b/apps/desktop/src/App.vue index b56c3aae6..30540d9db 100644 --- a/apps/desktop/src/App.vue +++ b/apps/desktop/src/App.vue @@ -86,21 +86,7 @@ const settingsStore = useSettingsStore(); const savedSqlStore = useSavedSqlStore(); const { message: toastMessage, visible: toastVisible, toast } = useToast(); const { isDark, themeMode, applyTheme, setThemeMode } = useTheme(); -const { - checkingUpdates, - updateInfo, - updateCheckMessage, - showUpdateDialog, - isDownloadingUpdate, - downloadProgress, - updateReady, - hasUpdateAvailable, - openUrl, - checkUpdates, - openLatestRelease, - downloadAndInstallUpdate, - restartApp, -} = useAppUpdater(); +const { checkingUpdates, updateInfo, updateCheckMessage, showUpdateDialog, isDownloadingUpdate, downloadProgress, updateReady, hasUpdateAvailable, openUrl, checkUpdates, openLatestRelease, downloadAndInstallUpdate, restartApp } = useAppUpdater(); const { setupFileDrop } = useFileDrop(); const isDesktop = isTauriRuntime(); @@ -120,16 +106,7 @@ const showAiPanel = ref(safeLocalStorageGet("dbx-ai-panel-open") === "true"); const showSqlLibraryPanel = ref(safeLocalStorageGet("dbx-sql-library-open") === "true"); const sidebarOpen = ref(safeLocalStorageGet("dbx-sidebar-open") !== "false"); const aiPanelReady = ref(false); -const { - sidebarWidth, - aiPanelWidth, - historyWidth, - sqlLibraryWidth, - startSidebarResize, - startAiPanelResize, - startHistoryResize, - startSqlLibraryResize, -} = usePanelResize(); +const { sidebarWidth, aiPanelWidth, historyWidth, sqlLibraryWidth, startSidebarResize, startAiPanelResize, startHistoryResize, startSqlLibraryResize } = usePanelResize(); const aiAssistantRef = ref(null); const appSidebarRef = ref | null>(null); const contentAreaRef = ref | null>(null); @@ -206,18 +183,7 @@ async function resolveActiveExecutableSql() { : ""; } -const { - dangerSql, - pendingDangerSql, - showDangerDialog, - suppressDangerConfirm, - tryExecute, - doExecute, - cancelActiveExecution, - tryExplain, - onDangerConfirm, - explainMode, -} = useSqlExecution({ +const { dangerSql, pendingDangerSql, showDangerDialog, suppressDangerConfirm, tryExecute, doExecute, cancelActiveExecution, tryExplain, onDangerConfirm, explainMode } = useSqlExecution({ activeTab, activeConnection, executableSql, @@ -227,8 +193,7 @@ const { const dialogs = useDialogSources(); const { getDatabaseOptions } = useDatabaseOptions(); -const { openLineageTarget, openDatabaseSearchTarget, onStructureEditorSaved, openTableTarget } = - useNavigationTargets(dialogs); +const { openLineageTarget, openDatabaseSearchTarget, onStructureEditorSaved, openTableTarget } = useNavigationTargets(dialogs); const { onExecuteSql, onReloadData, onPaginate, onSort } = useDataGridActions(activeTab); const { setupTauriListeners, cleanupTauriListeners } = useTauriEvents({ openTableTarget, @@ -241,13 +206,9 @@ useVisibilityChange(); const appVersion = ref(""); const isClassicLayout = computed(() => settingsStore.editorSettings.appLayout === "classic"); const updateNotificationsEnabled = computed(() => settingsStore.editorSettings.updateNotificationsEnabled); -const toolbarAgentDriverUpdateCount = computed(() => - updateNotificationsEnabled.value ? agentDriverUpdateCount.value : 0, -); +const toolbarAgentDriverUpdateCount = computed(() => (updateNotificationsEnabled.value ? agentDriverUpdateCount.value : 0)); const toolbarHasUpdateAvailable = computed(() => updateNotificationsEnabled.value && hasUpdateAvailable.value); -const hasSqlFileConnections = computed(() => - connectionStore.connections.some((c) => supportsSqlFileExecution(c.db_type)), -); +const hasSqlFileConnections = computed(() => connectionStore.connections.some((c) => supportsSqlFileExecution(c.db_type))); const connectionStats = computed(() => ({ total: connectionStore.connections.length, connected: connectionStore.connectedIds.size, @@ -290,11 +251,7 @@ function isGlobalUiZoomTarget(target: EventTarget | null): target is Element { if (target.closest("[data-query-editor-root], [data-cell-detail-editor-root], [data-object-source-editor]")) { return true; } - if ( - target instanceof HTMLInputElement || - target instanceof HTMLTextAreaElement || - (target instanceof HTMLElement && target.isContentEditable) - ) { + if (target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement || (target instanceof HTMLElement && target.isContentEditable)) { return false; } return !target.closest("[contenteditable='true']"); @@ -503,8 +460,7 @@ async function openSqlFilePath(path: string) { if (!isTauriRuntime()) return; try { const content = await api.readExternalSqlFile(path); - const connectionId = - connectionStore.activeConnectionId || activeTab.value?.connectionId || connectionStore.connections[0]?.id || ""; + const connectionId = connectionStore.activeConnectionId || activeTab.value?.connectionId || connectionStore.connections[0]?.id || ""; const connection = connectionId ? connectionStore.getConfig(connectionId) : undefined; const database = activeTab.value?.database || (connection ? resolveDefaultDatabase(connection, []) : ""); const tabId = queryStore.createTab(connectionId, database, sqlFileTitleFromPath(path), "query"); @@ -828,12 +784,7 @@ function handleKeydown(e: KeyboardEvent) { void openSaveSqlDialog(); return; } - if ( - activeTab.value?.mode === "query" && - isExecuteSqlShortcut(e, shortcuts) && - e.target instanceof Element && - e.target.closest("[data-query-editor-root]") - ) { + if (activeTab.value?.mode === "query" && isExecuteSqlShortcut(e, shortcuts) && e.target instanceof Element && e.target.closest("[data-query-editor-root]")) { e.preventDefault(); e.stopPropagation(); tryExecute(); @@ -1009,16 +960,10 @@ onUnmounted(() => {