diff --git a/.github/workflows/build-app-beta.yaml b/.github/workflows/build-app-beta.yaml index 223b5f649..0bd99714f 100644 --- a/.github/workflows/build-app-beta.yaml +++ b/.github/workflows/build-app-beta.yaml @@ -51,8 +51,10 @@ jobs: env: GH_TOKEN: ${{ secrets.GH_TOKEN }} # token for electron publish - WIN_CSC_LINK: ${{ secrets.WINCERT_CERTIFICATE }} - WIN_CSC_KEY_PASSWORD: ${{ secrets.WINCERT_PASSWORD }} + WIN_CSC_LINK: ${{ secrets.WINCERT_2025 }} + WIN_CSC_KEY_PASSWORD: ${{ secrets.WINCERT_2025_PASSWORD }} + # WIN_CSC_LINK: ${{ secrets.WINCERT_CERTIFICATE }} + # WIN_CSC_KEY_PASSWORD: ${{ secrets.WINCERT_PASSWORD }} CSC_LINK: ${{ secrets.APPLECERT_CERTIFICATE }} CSC_KEY_PASSWORD: ${{ secrets.APPLECERT_PASSWORD }} diff --git a/.github/workflows/build-app.yaml b/.github/workflows/build-app.yaml index b37334d0e..ee9a7dede 100644 --- a/.github/workflows/build-app.yaml +++ b/.github/workflows/build-app.yaml @@ -57,8 +57,10 @@ jobs: env: GH_TOKEN: ${{ secrets.GH_TOKEN }} # token for electron publish - WIN_CSC_LINK: ${{ secrets.WINCERT_CERTIFICATE }} - WIN_CSC_KEY_PASSWORD: ${{ secrets.WINCERT_PASSWORD }} + WIN_CSC_LINK: ${{ secrets.WINCERT_2025 }} + WIN_CSC_KEY_PASSWORD: ${{ secrets.WINCERT_2025_PASSWORD }} + # WIN_CSC_LINK: ${{ secrets.WINCERT_CERTIFICATE }} + # WIN_CSC_KEY_PASSWORD: ${{ secrets.WINCERT_PASSWORD }} CSC_LINK: ${{ secrets.APPLECERT_CERTIFICATE }} CSC_KEY_PASSWORD: ${{ secrets.APPLECERT_PASSWORD }} diff --git a/.node-version b/.node-version new file mode 100644 index 000000000..d9f880069 --- /dev/null +++ b/.node-version @@ -0,0 +1 @@ +16.14.2 diff --git a/CHANGELOG.md b/CHANGELOG.md index da78e8708..b20d79009 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,17 @@ Builds: - linux - application for linux - win - application for Windows +### 5.1.6 +- ADDED: Connection folders support #274 +- ADDED: Keyboard shortcut to hide result window and show/hide the side toolbar #406 +- ADDED: Ability to show/hide query results #406 +- FIXED: Double click does not maximize window on MacOS #416 +- FIXED: Some perspective rendering errors +- FIXED: Connection to MongoDB via database URL info SSH tunnel is used +- CHANGED: Updated windows code signing certificate +- ADDED: Query session cleanup (kill query sessions, if browser tab is closed) +- CHANGED: More strict timeouts to kill database and server connections (reduces resource consumption) + ### 5.1.5 - ADDED: Support perspectives for MongoDB - MongoDB query designer - ADDED: Show JSON content directly in the overview #395 diff --git a/adjustPackageJson.js b/adjustPackageJson.js index d805f266e..8581fb30c 100644 --- a/adjustPackageJson.js +++ b/adjustPackageJson.js @@ -5,6 +5,9 @@ function adjustFile(file) { if (process.platform != 'win32') { delete json.optionalDependencies.msnodesqlv8; } + if (process.arch == 'arm64') { + delete json.optionalDependencies.oracledb; + } fs.writeFileSync(file, JSON.stringify(json, null, 2), 'utf-8'); } diff --git a/app/package.json b/app/package.json index 06bc10157..3b3e266c9 100644 --- a/app/package.json +++ b/app/package.json @@ -113,6 +113,7 @@ }, "optionalDependencies": { "better-sqlite3": "7.6.2", + "oracledb": "^5.5.0", "msnodesqlv8": "^2.6.0" } } diff --git a/app/src/mainMenuDefinition.js b/app/src/mainMenuDefinition.js index 8d5e8c02e..8ce7056e0 100644 --- a/app/src/mainMenuDefinition.js +++ b/app/src/mainMenuDefinition.js @@ -69,6 +69,7 @@ module.exports = ({ editMenu }) => [ { command: 'app.toggleDevTools', hideDisabled: true }, { command: 'app.toggleFullScreen', hideDisabled: true }, { command: 'app.minimize', hideDisabled: true }, + { command: 'toggle.sidebar' }, { divider: true }, { command: 'theme.changeTheme', hideDisabled: true }, { command: 'settings.show' }, diff --git a/app/yarn.lock b/app/yarn.lock index 7827ccdb2..2d262e719 100644 --- a/app/yarn.lock +++ b/app/yarn.lock @@ -1833,6 +1833,11 @@ open@^7.4.2: is-docker "^2.0.0" is-wsl "^2.1.1" +oracledb@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/oracledb/-/oracledb-5.5.0.tgz#0cf9af5d0c0815f74849ae9ed56aee823514d71b" + integrity sha512-i5cPvMENpZP8nnqptB6l0pjiOyySj1IISkbM4Hr3yZEDdANo2eezarwZb9NQ8fTh5pRjmgpZdSyIbnn9N3AENw== + os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" diff --git a/fillNativeModules.js b/fillNativeModules.js index 61dea66eb..cc390b394 100644 --- a/fillNativeModules.js +++ b/fillNativeModules.js @@ -5,9 +5,12 @@ let fillContent = ''; if (process.platform == 'win32') { fillContent += `content.msnodesqlv8 = () => require('msnodesqlv8');`; } +if (process.arch != 'arm64') { + fillContent += `content.oracledb = () => require('oracledb');`; +} fillContent += `content['better-sqlite3'] = () => require('better-sqlite3');`; -const getContent = (empty) => ` +const getContent = empty => ` // this file is generated automatically by script fillNativeModules.js, do not edit it manually const content = {}; diff --git a/package.json b/package.json index eeff09400..07f0f8f00 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "5.1.5", + "version": "5.1.7-beta.1", "name": "dbgate-all", "workspaces": [ "packages/*", diff --git a/packages/api/package.json b/packages/api/package.json index 8190e5805..a3005862b 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -75,6 +75,7 @@ }, "optionalDependencies": { "better-sqlite3": "7.6.2", + "oracledb": "^5.5.0", "msnodesqlv8": "^2.6.0" } } diff --git a/packages/api/src/controllers/connections.js b/packages/api/src/controllers/connections.js index 63b3c872c..5447a6f4d 100644 --- a/packages/api/src/controllers/connections.js +++ b/packages/api/src/controllers/connections.js @@ -62,6 +62,7 @@ function getPortalCollections() { displayName: process.env[`LABEL_${id}`], isReadOnly: process.env[`READONLY_${id}`], databases: process.env[`DBCONFIG_${id}`] ? safeJsonParse(process.env[`DBCONFIG_${id}`]) : null, + parent: process.env[`PARENT_${id}`] || undefined, // SSH tunnel useSshTunnel: process.env[`USE_SSH_${id}`], diff --git a/packages/api/src/controllers/sessions.js b/packages/api/src/controllers/sessions.js index e42844214..71e04bf84 100644 --- a/packages/api/src/controllers/sessions.js +++ b/packages/api/src/controllers/sessions.js @@ -103,6 +103,12 @@ module.exports = { if (handleProcessCommunication(message, subprocess)) return; this[`handle_${msgtype}`](sesid, message); }); + subprocess.on('exit', () => { + this.opened = this.opened.filter(x => x.sesid != sesid); + this.dispatchMessage(sesid, 'Query session closed'); + socket.emit(`session-closed-${sesid}`); + }); + subprocess.send({ msgtype: 'connect', ...connection, database }); return _.pick(newOpened, ['conid', 'database', 'sesid']); }, @@ -165,6 +171,17 @@ module.exports = { return { state: 'ok' }; }, + ping_meta: true, + async ping({ sesid }) { + const session = this.opened.find(x => x.sesid == sesid); + if (!session) { + throw new Error('Invalid session'); + } + session.subprocess.send({ msgtype: 'ping' }); + + return { state: 'ok' }; + }, + // runCommand_meta: true, // async runCommand({ conid, database, sql }) { // console.log(`Running SQL command , conid=${conid}, database=${database}, sql=${sql}`); diff --git a/packages/api/src/proc/databaseConnectionProcess.js b/packages/api/src/proc/databaseConnectionProcess.js index 88f5ef8d9..96de90996 100644 --- a/packages/api/src/proc/databaseConnectionProcess.js +++ b/packages/api/src/proc/databaseConnectionProcess.js @@ -335,11 +335,11 @@ function start() { setInterval(() => { const time = new Date().getTime(); - if (time - lastPing > 120 * 1000) { + if (time - lastPing > 40 * 1000) { console.log('Database connection not alive, exiting'); process.exit(0); } - }, 60 * 1000); + }, 10 * 1000); process.on('message', async message => { if (handleProcessCommunication(message)) return; diff --git a/packages/api/src/proc/serverConnectionProcess.js b/packages/api/src/proc/serverConnectionProcess.js index 592071040..a700b026b 100644 --- a/packages/api/src/proc/serverConnectionProcess.js +++ b/packages/api/src/proc/serverConnectionProcess.js @@ -111,11 +111,11 @@ function start() { setInterval(() => { const time = new Date().getTime(); - if (time - lastPing > 120 * 1000) { + if (time - lastPing > 40 * 1000) { console.log('Server connection not alive, exiting'); process.exit(0); } - }, 60 * 1000); + }, 10 * 1000); process.on('message', async message => { if (handleProcessCommunication(message)) return; diff --git a/packages/api/src/proc/sessionProcess.js b/packages/api/src/proc/sessionProcess.js index 459e934f5..4b7d140fe 100644 --- a/packages/api/src/proc/sessionProcess.js +++ b/packages/api/src/proc/sessionProcess.js @@ -15,6 +15,7 @@ let systemConnection; let storedConnection; let afterConnectCallbacks = []; // let currentHandlers = []; +let lastPing = null; class TableWriter { constructor() { @@ -271,10 +272,15 @@ async function handleExecuteReader({ jslid, sql, fileName }) { }); } +function handlePing() { + lastPing = new Date().getTime(); +} + const messageHandlers = { connect: handleConnect, executeQuery: handleExecuteQuery, executeReader: handleExecuteReader, + ping: handlePing, // cancel: handleCancel, }; @@ -285,6 +291,17 @@ async function handleMessage({ msgtype, ...other }) { function start() { childProcessChecker(); + + lastPing = new Date().getTime(); + + setInterval(() => { + const time = new Date().getTime(); + if (time - lastPing > 25 * 1000) { + console.log('Session not alive, exiting'); + process.exit(0); + } + }, 10 * 1000); + process.on('message', async message => { if (handleProcessCommunication(message)) return; try { diff --git a/packages/datalib/src/ChangeSet.ts b/packages/datalib/src/ChangeSet.ts index ebf95b38d..2e38d62b7 100644 --- a/packages/datalib/src/ChangeSet.ts +++ b/packages/datalib/src/ChangeSet.ts @@ -9,7 +9,7 @@ import { AllowIdentityInsert, Expression, } from 'dbgate-sqltree'; -import { NamedObjectInfo, DatabaseInfo } from 'dbgate-types'; +import type { NamedObjectInfo, DatabaseInfo } from 'dbgate-types'; export interface ChangeSetItem { pureName: string; diff --git a/packages/datalib/src/CollectionGridDisplay.ts b/packages/datalib/src/CollectionGridDisplay.ts index a70c20968..6af931bb5 100644 --- a/packages/datalib/src/CollectionGridDisplay.ts +++ b/packages/datalib/src/CollectionGridDisplay.ts @@ -1,6 +1,6 @@ import _ from 'lodash'; import { GridDisplay, ChangeCacheFunc, ChangeConfigFunc, DisplayColumn } from './GridDisplay'; -import { EngineDriver, ViewInfo, ColumnInfo, CollectionInfo } from 'dbgate-types'; +import type { EngineDriver, ViewInfo, ColumnInfo, CollectionInfo } from 'dbgate-types'; import { GridConfig, GridCache } from './GridConfig'; function getObjectKeys(obj) { diff --git a/packages/datalib/src/FormViewDisplay.ts b/packages/datalib/src/FormViewDisplay.ts index 20a372a10..4bba3c55c 100644 --- a/packages/datalib/src/FormViewDisplay.ts +++ b/packages/datalib/src/FormViewDisplay.ts @@ -1,6 +1,6 @@ import _ from 'lodash'; import { GridConfig, GridCache, GridConfigColumns, createGridCache, GroupFunc } from './GridConfig'; -import { TableInfo, EngineDriver, DatabaseInfo, SqlDialect } from 'dbgate-types'; +import type { TableInfo, EngineDriver, DatabaseInfo, SqlDialect } from 'dbgate-types'; import { getFilterValueExpression } from 'dbgate-filterparser'; import { ChangeCacheFunc, ChangeConfigFunc, DisplayColumn } from './GridDisplay'; diff --git a/packages/datalib/src/FreeTableGridDisplay.ts b/packages/datalib/src/FreeTableGridDisplay.ts index f636fcf82..607abf4e9 100644 --- a/packages/datalib/src/FreeTableGridDisplay.ts +++ b/packages/datalib/src/FreeTableGridDisplay.ts @@ -1,5 +1,5 @@ import _ from 'lodash'; -import { EngineDriver, ViewInfo, ColumnInfo } from 'dbgate-types'; +import type { EngineDriver, ViewInfo, ColumnInfo } from 'dbgate-types'; import { GridDisplay, ChangeCacheFunc, ChangeConfigFunc } from './GridDisplay'; import { GridConfig, GridCache } from './GridConfig'; import { FreeTableModel } from './FreeTableModel'; diff --git a/packages/datalib/src/FreeTableModel.ts b/packages/datalib/src/FreeTableModel.ts index e5cce2f76..616e0c8e2 100644 --- a/packages/datalib/src/FreeTableModel.ts +++ b/packages/datalib/src/FreeTableModel.ts @@ -1,4 +1,4 @@ -import { TableInfo } from 'dbgate-types'; +import type { TableInfo } from 'dbgate-types'; export interface FreeTableModel { structure: TableInfo; diff --git a/packages/datalib/src/GridConfig.ts b/packages/datalib/src/GridConfig.ts index d38a468cf..c6c7fd5eb 100644 --- a/packages/datalib/src/GridConfig.ts +++ b/packages/datalib/src/GridConfig.ts @@ -1,6 +1,3 @@ -import { DisplayColumn } from './GridDisplay'; -import { TableInfo } from 'dbgate-types'; - export interface GridConfigColumns { hiddenColumns: string[]; expandedColumns: string[]; diff --git a/packages/datalib/src/GridDisplay.ts b/packages/datalib/src/GridDisplay.ts index b04f1783c..7ac527d68 100644 --- a/packages/datalib/src/GridDisplay.ts +++ b/packages/datalib/src/GridDisplay.ts @@ -1,6 +1,6 @@ import _ from 'lodash'; import { GridConfig, GridCache, GridConfigColumns, createGridCache, GroupFunc, createGridConfig } from './GridConfig'; -import { +import type { ForeignKeyInfo, TableInfo, ColumnInfo, diff --git a/packages/datalib/src/JslGridDisplay.ts b/packages/datalib/src/JslGridDisplay.ts index 323f01751..698520b93 100644 --- a/packages/datalib/src/JslGridDisplay.ts +++ b/packages/datalib/src/JslGridDisplay.ts @@ -1,6 +1,5 @@ import _ from 'lodash'; import { GridDisplay, ChangeCacheFunc, ChangeConfigFunc } from './GridDisplay'; -import { QueryResultColumn } from 'dbgate-types'; import { GridConfig, GridCache } from './GridConfig'; import { analyseCollectionDisplayColumns } from './CollectionGridDisplay'; diff --git a/packages/datalib/src/PerspectiveCache.ts b/packages/datalib/src/PerspectiveCache.ts index e706b8ae4..00ef68cd9 100644 --- a/packages/datalib/src/PerspectiveCache.ts +++ b/packages/datalib/src/PerspectiveCache.ts @@ -1,4 +1,3 @@ -import { RangeDefinition } from 'dbgate-types'; import { PerspectiveDataLoadProps } from './PerspectiveDataProvider'; import _pick from 'lodash/pick'; import _zip from 'lodash/zip'; diff --git a/packages/datalib/src/PerspectiveConfig.ts b/packages/datalib/src/PerspectiveConfig.ts index d7af928f6..fd80d83bc 100644 --- a/packages/datalib/src/PerspectiveConfig.ts +++ b/packages/datalib/src/PerspectiveConfig.ts @@ -1,4 +1,4 @@ -import { DatabaseInfo, ForeignKeyInfo, NamedObjectInfo, TableInfo } from 'dbgate-types'; +import type { DatabaseInfo, ForeignKeyInfo, NamedObjectInfo, TableInfo } from 'dbgate-types'; import uuidv1 from 'uuid/v1'; // export interface PerspectiveConfigColumns { diff --git a/packages/datalib/src/PerspectiveDataProvider.ts b/packages/datalib/src/PerspectiveDataProvider.ts index 5c471c55e..130f12d69 100644 --- a/packages/datalib/src/PerspectiveDataProvider.ts +++ b/packages/datalib/src/PerspectiveDataProvider.ts @@ -1,6 +1,6 @@ import debug from 'debug'; import { Condition } from 'dbgate-sqltree'; -import { RangeDefinition } from 'dbgate-types'; +import type { RangeDefinition } from 'dbgate-types'; import { PerspectiveBindingGroup, PerspectiveCache } from './PerspectiveCache'; import { PerspectiveDataLoader } from './PerspectiveDataLoader'; import { PerspectiveDataPatternDict } from './PerspectiveDataPattern'; diff --git a/packages/datalib/src/PerspectiveTreeNode.ts b/packages/datalib/src/PerspectiveTreeNode.ts index 4518c149f..7774d73d3 100644 --- a/packages/datalib/src/PerspectiveTreeNode.ts +++ b/packages/datalib/src/PerspectiveTreeNode.ts @@ -1,4 +1,4 @@ -import { +import type { CollectionInfo, ColumnInfo, DatabaseInfo, diff --git a/packages/datalib/src/TableFormViewDisplay.ts b/packages/datalib/src/TableFormViewDisplay.ts index ca1cfd3b7..9502b85b0 100644 --- a/packages/datalib/src/TableFormViewDisplay.ts +++ b/packages/datalib/src/TableFormViewDisplay.ts @@ -1,7 +1,7 @@ import { FormViewDisplay } from './FormViewDisplay'; import _ from 'lodash'; import { ChangeCacheFunc, DisplayColumn, ChangeConfigFunc } from './GridDisplay'; -import { EngineDriver, NamedObjectInfo, DatabaseInfo } from 'dbgate-types'; +import type { EngineDriver, NamedObjectInfo, DatabaseInfo } from 'dbgate-types'; import { GridConfig, GridCache } from './GridConfig'; import { mergeConditions, Condition, OrderByExpression } from 'dbgate-sqltree'; import { TableGridDisplay } from './TableGridDisplay'; diff --git a/packages/datalib/src/TableGridDisplay.ts b/packages/datalib/src/TableGridDisplay.ts index 9252c5ab2..9896380e0 100644 --- a/packages/datalib/src/TableGridDisplay.ts +++ b/packages/datalib/src/TableGridDisplay.ts @@ -1,7 +1,7 @@ import _ from 'lodash'; import { filterName, isTableColumnUnique } from 'dbgate-tools'; import { GridDisplay, ChangeCacheFunc, DisplayColumn, DisplayedColumnInfo, ChangeConfigFunc } from './GridDisplay'; -import { +import type { TableInfo, EngineDriver, ViewInfo, diff --git a/packages/datalib/src/ViewGridDisplay.ts b/packages/datalib/src/ViewGridDisplay.ts index 82d73505b..40515db02 100644 --- a/packages/datalib/src/ViewGridDisplay.ts +++ b/packages/datalib/src/ViewGridDisplay.ts @@ -1,6 +1,6 @@ import _ from 'lodash'; import { GridDisplay, ChangeCacheFunc, ChangeConfigFunc } from './GridDisplay'; -import { EngineDriver, ViewInfo, ColumnInfo } from 'dbgate-types'; +import type { EngineDriver, ViewInfo, ColumnInfo } from 'dbgate-types'; import { GridConfig, GridCache } from './GridConfig'; export class ViewGridDisplay extends GridDisplay { diff --git a/packages/datalib/src/deleteCascade.ts b/packages/datalib/src/deleteCascade.ts index 77415f3ae..973d5772a 100644 --- a/packages/datalib/src/deleteCascade.ts +++ b/packages/datalib/src/deleteCascade.ts @@ -1,6 +1,6 @@ import _ from 'lodash'; import { Command, Insert, Update, Delete, UpdateField, Condition, AllowIdentityInsert } from 'dbgate-sqltree'; -import { NamedObjectInfo, DatabaseInfo, ForeignKeyInfo, TableInfo } from 'dbgate-types'; +import type { NamedObjectInfo, DatabaseInfo, ForeignKeyInfo, TableInfo } from 'dbgate-types'; import { ChangeSet, ChangeSetItem, extractChangeSetCondition } from './ChangeSet'; export interface ChangeSetDeleteCascade { diff --git a/packages/datalib/src/index.ts b/packages/datalib/src/index.ts index d4626bb57..2c782139f 100644 --- a/packages/datalib/src/index.ts +++ b/packages/datalib/src/index.ts @@ -20,3 +20,4 @@ export * from './PerspectiveCache'; export * from './PerspectiveConfig'; export * from './processPerspectiveDefaultColunns'; export * from './PerspectiveDataPattern'; +export * from './PerspectiveDataLoader'; diff --git a/packages/datalib/src/processPerspectiveDefaultColunns.ts b/packages/datalib/src/processPerspectiveDefaultColunns.ts index 2e106acf7..564d2da09 100644 --- a/packages/datalib/src/processPerspectiveDefaultColunns.ts +++ b/packages/datalib/src/processPerspectiveDefaultColunns.ts @@ -1,5 +1,5 @@ import { findForeignKeyForColumn } from 'dbgate-tools'; -import { DatabaseInfo, TableInfo, ViewInfo } from 'dbgate-types'; +import type { DatabaseInfo, TableInfo, ViewInfo } from 'dbgate-types'; import { createPerspectiveNodeConfig, MultipleDatabaseInfo, PerspectiveConfig } from './PerspectiveConfig'; import { PerspectiveDataPattern, PerspectiveDataPatternDict } from './PerspectiveDataPattern'; import { PerspectiveTableNode } from './PerspectiveTreeNode'; diff --git a/packages/datalib/src/tests/chinookDbInfo.ts b/packages/datalib/src/tests/chinookDbInfo.ts index 20fbbb784..b36a8cda3 100644 --- a/packages/datalib/src/tests/chinookDbInfo.ts +++ b/packages/datalib/src/tests/chinookDbInfo.ts @@ -1,4 +1,4 @@ -import { DatabaseInfo } from 'dbgate-types'; +import type { DatabaseInfo } from 'dbgate-types'; export const chinookDbInfo: DatabaseInfo = { tables: [ diff --git a/packages/filterparser/src/datetimeParser.ts b/packages/filterparser/src/datetimeParser.ts index 22d0dd682..d4355122c 100644 --- a/packages/filterparser/src/datetimeParser.ts +++ b/packages/filterparser/src/datetimeParser.ts @@ -2,7 +2,7 @@ import P from 'parsimmon'; import moment from 'moment'; import { FilterType } from './types'; import { Condition } from 'dbgate-sqltree'; -import { TransformType } from 'dbgate-types'; +import type { TransformType } from 'dbgate-types'; import { interpretEscapes, token, word, whitespace } from './common'; const compoudCondition = conditionType => conditions => { diff --git a/packages/filterparser/src/parseFilter.ts b/packages/filterparser/src/parseFilter.ts index 35cb8fa4c..65c2b988f 100644 --- a/packages/filterparser/src/parseFilter.ts +++ b/packages/filterparser/src/parseFilter.ts @@ -2,7 +2,6 @@ import P from 'parsimmon'; import moment from 'moment'; import { FilterType } from './types'; import { Condition } from 'dbgate-sqltree'; -import { TransformType } from 'dbgate-types'; import { interpretEscapes, token, word, whitespace } from './common'; import { mongoParser } from './mongoParser'; import { datetimeParser } from './datetimeParser'; diff --git a/packages/sqltree/src/dumpSqlCommand.ts b/packages/sqltree/src/dumpSqlCommand.ts index ea7fa3aba..9a7ea6fe5 100644 --- a/packages/sqltree/src/dumpSqlCommand.ts +++ b/packages/sqltree/src/dumpSqlCommand.ts @@ -1,4 +1,4 @@ -import { SqlDumper } from 'dbgate-types'; +import type { SqlDumper } from 'dbgate-types'; import { Command, Select, Update, Delete, Insert } from './types'; import { dumpSqlExpression } from './dumpSqlExpression'; import { dumpSqlFromDefinition, dumpSqlSourceRef } from './dumpSqlSource'; diff --git a/packages/sqltree/src/dumpSqlCondition.ts b/packages/sqltree/src/dumpSqlCondition.ts index ea2abc446..a95fa86f4 100644 --- a/packages/sqltree/src/dumpSqlCondition.ts +++ b/packages/sqltree/src/dumpSqlCondition.ts @@ -1,4 +1,4 @@ -import { SqlDumper } from 'dbgate-types'; +import type { SqlDumper } from 'dbgate-types'; import { Condition, BinaryCondition } from './types'; import { dumpSqlExpression } from './dumpSqlExpression'; import { dumpSqlSelect } from './dumpSqlCommand'; diff --git a/packages/sqltree/src/dumpSqlExpression.ts b/packages/sqltree/src/dumpSqlExpression.ts index 7cd279a2f..4772a4bde 100644 --- a/packages/sqltree/src/dumpSqlExpression.ts +++ b/packages/sqltree/src/dumpSqlExpression.ts @@ -1,5 +1,5 @@ import _ from 'lodash'; -import { SqlDumper } from 'dbgate-types'; +import type { SqlDumper } from 'dbgate-types'; import { Expression, ColumnRefExpression } from './types'; import { dumpSqlSourceRef } from './dumpSqlSource'; diff --git a/packages/sqltree/src/dumpSqlSource.ts b/packages/sqltree/src/dumpSqlSource.ts index e13dc1f2f..0c5d46635 100644 --- a/packages/sqltree/src/dumpSqlSource.ts +++ b/packages/sqltree/src/dumpSqlSource.ts @@ -1,5 +1,5 @@ import { Source, FromDefinition, Relation } from './types'; -import { SqlDumper } from 'dbgate-types'; +import type { SqlDumper } from 'dbgate-types'; import { dumpSqlSelect } from './dumpSqlCommand'; import { dumpSqlCondition } from './dumpSqlCondition'; diff --git a/packages/sqltree/src/evaluateCondition.ts b/packages/sqltree/src/evaluateCondition.ts index 944c3ef89..f615af4eb 100644 --- a/packages/sqltree/src/evaluateCondition.ts +++ b/packages/sqltree/src/evaluateCondition.ts @@ -1,10 +1,6 @@ -import { SqlDumper } from 'dbgate-types'; import _ from 'lodash'; import { Condition, BinaryCondition } from './types'; -import { dumpSqlExpression } from './dumpSqlExpression'; -import { link } from 'fs'; import { evaluateExpression } from './evaluateExpression'; -import { cond } from 'lodash'; function isEmpty(value) { if (value == null) return true; diff --git a/packages/sqltree/src/types.ts b/packages/sqltree/src/types.ts index 07e9e4b03..3e3e45a1e 100644 --- a/packages/sqltree/src/types.ts +++ b/packages/sqltree/src/types.ts @@ -1,4 +1,4 @@ -import { NamedObjectInfo, RangeDefinition, TransformType } from 'dbgate-types'; +import type { NamedObjectInfo, RangeDefinition, TransformType } from 'dbgate-types'; // export interface Command { // } diff --git a/packages/sqltree/src/utility.ts b/packages/sqltree/src/utility.ts index 39301a9ee..ccab90e87 100644 --- a/packages/sqltree/src/utility.ts +++ b/packages/sqltree/src/utility.ts @@ -1,4 +1,4 @@ -import { EngineDriver, SqlDumper } from 'dbgate-types'; +import type { EngineDriver, SqlDumper } from 'dbgate-types'; import { Command, Condition } from './types'; import { dumpSqlCommand } from './dumpSqlCommand'; diff --git a/packages/tools/src/SqlDumper.ts b/packages/tools/src/SqlDumper.ts index c8bb5c6af..82af25c6c 100644 --- a/packages/tools/src/SqlDumper.ts +++ b/packages/tools/src/SqlDumper.ts @@ -1,5 +1,5 @@ import _ from 'lodash'; -import { +import type { ColumnInfo, ConstraintInfo, EngineDriver, diff --git a/packages/tools/src/SqlGenerator.ts b/packages/tools/src/SqlGenerator.ts index 48b0d103a..edcefa6b8 100644 --- a/packages/tools/src/SqlGenerator.ts +++ b/packages/tools/src/SqlGenerator.ts @@ -1,4 +1,4 @@ -import { +import type { DatabaseInfo, EngineDriver, FunctionInfo, diff --git a/packages/tools/src/computeDiffRows.ts b/packages/tools/src/computeDiffRows.ts index a5c64b48c..a1fa836ac 100644 --- a/packages/tools/src/computeDiffRows.ts +++ b/packages/tools/src/computeDiffRows.ts @@ -1,5 +1,5 @@ import { DbDiffOptions, testEqualColumns, testEqualTables, testEqualSqlObjects } from './diffTools'; -import { DatabaseInfo, EngineDriver, SqlObjectInfo, TableInfo } from 'dbgate-types'; +import type { DatabaseInfo, EngineDriver, SqlObjectInfo, TableInfo } from 'dbgate-types'; import _ from 'lodash'; export function computeDiffRowsCore(sourceList, targetList, testEqual) { diff --git a/packages/tools/src/createBulkInsertStreamBase.ts b/packages/tools/src/createBulkInsertStreamBase.ts index 01f8b1b2a..9a8812226 100644 --- a/packages/tools/src/createBulkInsertStreamBase.ts +++ b/packages/tools/src/createBulkInsertStreamBase.ts @@ -1,4 +1,3 @@ -import { EngineDriver } from 'dbgate-types'; import _intersection from 'lodash/intersection'; import { prepareTableForImport } from './tableTransforms'; diff --git a/packages/tools/src/diffTools.ts b/packages/tools/src/diffTools.ts index c7f19d3fc..f3b7fb33d 100644 --- a/packages/tools/src/diffTools.ts +++ b/packages/tools/src/diffTools.ts @@ -1,4 +1,4 @@ -import { +import type { ColumnInfo, ConstraintInfo, DatabaseInfo, diff --git a/packages/tools/src/nameTools.ts b/packages/tools/src/nameTools.ts index 14e2b8961..617481a3e 100644 --- a/packages/tools/src/nameTools.ts +++ b/packages/tools/src/nameTools.ts @@ -1,6 +1,6 @@ import _cloneDeep from 'lodash/cloneDeep'; import _isString from 'lodash/isString'; -import { +import type { ColumnInfo, ColumnReference, DatabaseInfo, diff --git a/packages/tools/src/packageTools.ts b/packages/tools/src/packageTools.ts index 5e2047129..76c3897a9 100644 --- a/packages/tools/src/packageTools.ts +++ b/packages/tools/src/packageTools.ts @@ -1,4 +1,4 @@ -import { EngineDriver, ExtensionsDirectory } from 'dbgate-types'; +import type { EngineDriver, ExtensionsDirectory } from 'dbgate-types'; import _camelCase from 'lodash/camelCase'; import _isString from 'lodash/isString'; import _isPlainObject from 'lodash/isPlainObject'; diff --git a/packages/tools/src/preloadedRowsTools.ts b/packages/tools/src/preloadedRowsTools.ts index d0be38064..09c2e083e 100644 --- a/packages/tools/src/preloadedRowsTools.ts +++ b/packages/tools/src/preloadedRowsTools.ts @@ -1,5 +1,5 @@ import _ from 'lodash'; -import { DatabaseInfo, EngineDriver } from 'dbgate-types'; +import type { DatabaseInfo, EngineDriver } from 'dbgate-types'; export async function enrichWithPreloadedRows( dbModel: DatabaseInfo, diff --git a/packages/tools/src/schemaEditorTools.ts b/packages/tools/src/schemaEditorTools.ts index c67c3d2d6..5c5c92657 100644 --- a/packages/tools/src/schemaEditorTools.ts +++ b/packages/tools/src/schemaEditorTools.ts @@ -1,6 +1,6 @@ import uuidv1 from 'uuid/v1'; import _omit from 'lodash/omit'; -import { +import type { ColumnInfo, ConstraintInfo, ForeignKeyInfo, diff --git a/packages/tools/src/structureTools.ts b/packages/tools/src/structureTools.ts index 660c5779c..42b0ffbca 100644 --- a/packages/tools/src/structureTools.ts +++ b/packages/tools/src/structureTools.ts @@ -1,4 +1,4 @@ -import { DatabaseInfo, TableInfo, ApplicationDefinition, ViewInfo, CollectionInfo } from 'dbgate-types'; +import type { DatabaseInfo, TableInfo, ApplicationDefinition, ViewInfo, CollectionInfo } from 'dbgate-types'; import _flatten from 'lodash/flatten'; export function addTableDependencies(db: DatabaseInfo): DatabaseInfo { diff --git a/packages/tools/src/tableTransforms.ts b/packages/tools/src/tableTransforms.ts index 54f46ed03..d53c38570 100644 --- a/packages/tools/src/tableTransforms.ts +++ b/packages/tools/src/tableTransforms.ts @@ -1,4 +1,4 @@ -import { TableInfo } from 'dbgate-types'; +import type { TableInfo } from 'dbgate-types'; import _cloneDeep from 'lodash/cloneDeep'; import _fromPairs from 'lodash/fromPairs'; import _get from 'lodash/get'; diff --git a/packages/web/rollup.config.js b/packages/web/rollup.config.js index f12e6b6d9..599ee5632 100644 --- a/packages/web/rollup.config.js +++ b/packages/web/rollup.config.js @@ -45,7 +45,7 @@ export default [ resolve({ browser: true, }), - + // If we're building for production (npm run build // instead of npm run dev), minify production && terser(), @@ -88,6 +88,20 @@ export default [ // enable run-time checks when not in production dev: !production, }, + onwarn: (warning, handler) => { + const ignoreWarnings = [ + 'a11y-click-events-have-key-events', + 'a11y-missing-attribute', + 'a11y-invalid-attribute', + 'a11y-no-noninteractive-tabindex', + 'a11y-label-has-associated-control', + 'vite-plugin-svelte-css-no-scopable-elements', + 'unused-export-let', + ]; + if (ignoreWarnings.includes(warning.code)) return; + // console.log('***************************', warning.code); + handler(warning); + }, }), // we'll extract any component CSS out into // a separate file - better for performance diff --git a/packages/web/src/Screen.svelte b/packages/web/src/Screen.svelte index 7db86775b..5ba23f30f 100644 --- a/packages/web/src/Screen.svelte +++ b/packages/web/src/Screen.svelte @@ -8,6 +8,7 @@ leftPanelWidth, openedSnackbars, selectedWidget, + visibleWidgetSideBar, visibleCommandPalette, visibleTitleBar, visibleToolbar, @@ -29,7 +30,7 @@ $: currentThemeType = $currentThemeDefinition?.themeType == 'dark' ? 'theme-type-dark' : 'theme-type-light'; - $: themeStyle = ``; + $: themeStyle = `${$currentThemeDefinition?.themeCss}`; const isElectron = !!getElectron(); @@ -63,7 +64,7 @@
- {#if $selectedWidget} + {#if $selectedWidget && $visibleWidgetSideBar}
@@ -74,7 +75,7 @@
- {#if $selectedWidget} + {#if $selectedWidget && $visibleWidgetSideBar}
data.fileName; - export const createMatcher = ({ fileName }) => filter => filterName(filter, fileName); + export const createMatcher = + ({ fileName }) => + filter => + filterName(filter, fileName); const APP_ICONS = { 'config.json': 'img json', 'command.sql': 'img app-command', @@ -50,7 +53,6 @@ import InputTextModal from '../modals/InputTextModal.svelte'; import ConfirmModal from '../modals/ConfirmModal.svelte'; import { apiCall } from '../utility/api'; - import { currentDatabase, currentDatabase } from '../stores'; export let data; diff --git a/packages/web/src/appobj/AppObjectGroup.svelte b/packages/web/src/appobj/AppObjectGroup.svelte index 09d4ca740..bf52001ca 100644 --- a/packages/web/src/appobj/AppObjectGroup.svelte +++ b/packages/web/src/appobj/AppObjectGroup.svelte @@ -10,10 +10,12 @@ export let group; export let groupFunc; export let items; + export let groupIconFunc = plusExpandIcon; export let module; export let checkedObjectsStore = null; export let disableContextMenu = false; export let passProps; + export let onDropOnGroup = undefined; let isExpanded = true; @@ -33,11 +35,19 @@ return res; }); } + + function handleDrop(e) { + var data = e.dataTransfer.getData('app_object_drag_data'); + if (data && onDropOnGroup) { + e.stopPropagation(); + onDropOnGroup(data, group); + } + } -
(isExpanded = !isExpanded)}> +
(isExpanded = !isExpanded)} on:drop={handleDrop}> - + {group} @@ -53,18 +63,20 @@
{/if} - {#each items as item} - - {/each} +
+ {#each items as item} + + {/each} +
{/if} diff --git a/packages/web/src/perspectives/PerspectiveTable.svelte b/packages/web/src/perspectives/PerspectiveTable.svelte index 09277e76d..4a1c3c18c 100644 --- a/packages/web/src/perspectives/PerspectiveTable.svelte +++ b/packages/web/src/perspectives/PerspectiveTable.svelte @@ -13,15 +13,14 @@ @@ -123,7 +130,6 @@ ORDER BY { value: 'lowerCase', label: 'lower case' }, ]} /> -
Application theme
diff --git a/packages/web/src/settings/ThemeSkeleton.svelte b/packages/web/src/settings/ThemeSkeleton.svelte index 43008dc85..a3c1208e0 100644 --- a/packages/web/src/settings/ThemeSkeleton.svelte +++ b/packages/web/src/settings/ThemeSkeleton.svelte @@ -1,5 +1,5 @@ @@ -56,14 +76,46 @@ runCommand('new.connection')} title="Add new connection"> + runCommand('new.connection.folder')} title="Add new connection folder"> + + {/if} - + { + var data = e.dataTransfer.getData('app_object_drag_data'); + if (data) { + handleDropOnGroup(data, ''); + } + }} +> (getConnectionLabel(connection) || '').toUpperCase())} + list={_.sortBy(connectionsWithParent, connection => (getConnectionLabel(connection) || '').toUpperCase())} + module={connectionAppObject} + subItemsComponent={SubDatabaseList} + expandOnClick + isExpandable={data => $openedConnections.includes(data._id) && !data.singleDatabase} + {filter} + passProps={{ connectionColorFactory: $connectionColorFactory, showPinnedInsteadOfUnpin: true }} + getIsExpanded={data => $expandedConnections.includes(data._id) && !data.singleDatabase} + setIsExpanded={(data, value) => { + expandedConnections.update(old => (value ? [...old, data._id] : old.filter(x => x != data._id))); + }} + groupIconFunc={chevronExpandIcon} + groupFunc={data => data.parent} + expandIconFunc={plusExpandIcon} + onDropOnGroup={handleDropOnGroup} + emptyGroupNames={$emptyConnectionGroupNames} + sortGroups + /> + {#if (connectionsWithParent?.length > 0 && connectionsWithoutParent?.length > 0) || ($emptyConnectionGroupNames.length > 0 && connectionsWithoutParent?.length > 0)} +
+ {/if} + (getConnectionLabel(connection) || '').toUpperCase())} module={connectionAppObject} subItemsComponent={SubDatabaseList} expandOnClick @@ -84,3 +136,11 @@ --> {/if} + + diff --git a/packages/web/src/widgets/TitleBar.svelte b/packages/web/src/widgets/TitleBar.svelte index 38b2f7994..93efc686c 100644 --- a/packages/web/src/widgets/TitleBar.svelte +++ b/packages/web/src/widgets/TitleBar.svelte @@ -12,7 +12,7 @@ const electron = getElectron(); -
+
electron.send('window-action', 'maximize')}> {#if !isMac()}