Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
1641 commits
Select commit Hold shift + click to select a range
8bfa63b
fix filter operator alignment
bnquon Aug 2, 2026
4507216
Merge pull request #4559 from bnquon/fix/reposition-filter-operators
not-night-but Aug 2, 2026
5183f5b
Merge branch 'master' into fix/table-row-delete-key-macos
ylyra Aug 2, 2026
7bf9bed
Merge branch 'master' into fix/favorite-delete-confirmation-title
ylyra Aug 2, 2026
cd31a41
use a custom builder for columns and values to pass raw sql to knex
bnquon Aug 2, 2026
fd82c6d
clean up test format
bnquon Aug 2, 2026
38b42c4
add dialectType to getConnectionInfo
azmy60 Aug 3, 2026
1e68777
add disabledFeatures instead
azmy60 Aug 3, 2026
a5b4d11
Merge pull request #4554 from beekeeper-studio/dependabot/npm_and_yar…
azmy60 Aug 3, 2026
14b1ffc
Merge branch 'master' into fix/sql-export-column-order
bnquon Aug 3, 2026
ff91430
missing drag-pending, filter, and hide rename if cannot write
azmy60 Aug 3, 2026
238149a
fix css
azmy60 Aug 3, 2026
d6ef508
add lines beside folder tree
azmy60 Aug 3, 2026
27934b9
better empty state, loading state uses skeleton
azmy60 Aug 3, 2026
0898925
fix move modal does not show all folders
azmy60 Aug 3, 2026
4196602
fix fetchedIds are not set when refreshing
azmy60 Aug 3, 2026
733b3c0
highlight newly created folder in the sidebar trees
azmy60 Aug 3, 2026
b16b172
Merge branch 'master' into fix/favorite-delete-confirmation-title
ylyra Aug 3, 2026
85b7228
Merge branch 'master' into fix/table-row-delete-key-macos
ylyra Aug 3, 2026
8ba9336
refactor: split AppImage and AppImageLauncher detection
cynicalmindset Aug 3, 2026
22260d7
refactor: split AppImage and AppImageLauncher detection
cynicalmindset Aug 3, 2026
c23497c
Merge pull request #4547 from ylyra/fix/favorite-delete-confirmation-…
not-night-but Aug 3, 2026
1f5b281
Merge pull request #4562 from cynicalmindset/fix/appimage-launcher-de…
not-night-but Aug 3, 2026
96823e3
fix: use Control for context-menu ctrl/cmd modifiers on macOS
ylyra Aug 3, 2026
0d19dd2
fix: route table row delete through v-hotkey again
ylyra Aug 3, 2026
a802791
fix: map delete keybinding to backspace on macOS for v-hotkey
ylyra Aug 3, 2026
ba8030e
Merge branch 'master' into fix/table-row-delete-key-macos
ylyra Aug 3, 2026
22855bc
fix: map mac delete keybinding to backspace and update tests
ylyra Aug 3, 2026
70e7f2c
Merge pull request #4561 from beekeeper-studio/feat/plugin-conn-info
not-night-but Aug 3, 2026
8e76f19
add helper to return tooltip friendly keybind displays + tests
bnquon Aug 4, 2026
055fcf0
use configured shortcuts in structure view tooltips
bnquon Aug 4, 2026
a1a88f0
Merge branch 'master' into fix/display-tooltip-shortcuts-nicely
bnquon Aug 4, 2026
71f917a
Merge branch 'master' into fix/sql-export-column-order
bnquon Aug 4, 2026
02478ce
fix(postgres): use pg_proc OID for overloaded routines
AdityaBhosale22 Aug 4, 2026
2c75f22
fix deleting connections
azmy60 Aug 4, 2026
4390c70
fix invalid parameters on refreshing queries & connections
azmy60 Aug 4, 2026
30d5fd1
fix missing @duplicate and pinned icon in connection list
azmy60 Aug 4, 2026
f073240
remove dead code
azmy60 Aug 4, 2026
644db9b
fix expanded folders stuck empty when their children fail to load
azmy60 Aug 4, 2026
9e8ecc5
cleanup
azmy60 Aug 4, 2026
3a10d78
chore(deps): bump undici from 6.27.0 to 6.28.0
dependabot[bot] Aug 4, 2026
c0e54a3
extract folderableActions, share tree actions across all data modules
azmy60 Aug 4, 2026
151c86c
fix all folders are expanded initially for local folders
azmy60 Aug 4, 2026
015b89e
fix pin state, search delete target, and carried-over tree expansion
azmy60 Aug 4, 2026
f74f4c9
data leak when switching accounts
azmy60 Aug 4, 2026
1040c62
hide dividers
azmy60 Aug 4, 2026
50e40b7
personal folder should be first in the list
azmy60 Aug 4, 2026
b5e5232
Merge branch 'master' into fix/table-row-delete-key-macos
ylyra Aug 4, 2026
bbe5165
Merge pull request #4555 from cleven12/add-swahili-readme
not-night-but Aug 4, 2026
22dd21b
Merge pull request #4566 from beekeeper-studio/dependabot/npm_and_yar…
not-night-but Aug 4, 2026
f9f8e2d
chore(deps): bump postcss in /apps/ui-kit/examples/html
dependabot[bot] Aug 4, 2026
2a50336
chore(deps): bump fast-uri from 3.1.4 to 3.1.5
dependabot[bot] Aug 4, 2026
59fccc5
Merge pull request #4564 from bnquon/fix/display-tooltip-shortcuts-ni…
not-night-but Aug 4, 2026
d0459bf
Merge pull request #4569 from beekeeper-studio/dependabot/npm_and_yar…
not-night-but Aug 4, 2026
7ae3f22
Merge pull request #4568 from beekeeper-studio/dependabot/npm_and_yar…
not-night-but Aug 4, 2026
9a29d1f
Merge branch 'master' into fix/table-row-delete-key-macos
ylyra Aug 4, 2026
7414348
move "Preserve Column Order" into advanced options form
bnquon Aug 4, 2026
5165881
Merge branch 'master' into fix/sql-export-column-order
bnquon Aug 4, 2026
cf069ed
initial iteration of directory import
not-night-but Jul 27, 2026
eb83deb
move to workspace handlers, ux
not-night-but Aug 4, 2026
66c60b1
fix redaction destroying errors
not-night-but Aug 4, 2026
6feb2c5
use <x-progressbar /> for modals
azmy60 Aug 4, 2026
614af9b
fix not being able to create subfolders
azmy60 Aug 5, 2026
748a9d8
fix missing license check when creating a subfolder
azmy60 Aug 5, 2026
d681f6a
folderableStore
azmy60 Aug 5, 2026
4e0d8f6
always place draft folder at the top
azmy60 Aug 5, 2026
d6e7616
Merge pull request #4551 from AdityaBhosale22/fix/postgres-overloaded…
not-night-but Aug 5, 2026
2a5b05b
Merge pull request #4560 from bnquon/fix/sql-export-column-order
not-night-but Aug 5, 2026
7402260
local import
not-night-but Aug 5, 2026
d19fc50
disable sorting for cloud workspaces
azmy60 Aug 5, 2026
f529574
expand ancestors after all folders are loaded
azmy60 Aug 5, 2026
1031a28
drop a folder on an item to move it into that item's folder
azmy60 Aug 5, 2026
e3e4a0e
remove duplicate loadDefaultFolders on tree init
azmy60 Aug 5, 2026
87b5de9
drop a folder beside another folder to join its parent
azmy60 Aug 5, 2026
a315869
confirm before moving a shared item to the personal folder
azmy60 Aug 5, 2026
3096310
fix non default folders are expanded initially
azmy60 Aug 5, 2026
9de053d
Update prerequisites for creating a plugin
Lucas-Tolle Aug 5, 2026
274f828
fix null draft, local workspace searching should match cloud workspace
azmy60 Aug 5, 2026
7144aab
ngrok for testing
rathboma Aug 5, 2026
c8c98b9
initial iteration of directory import
not-night-but Jul 27, 2026
93db1a8
move to workspace handlers, ux
not-night-but Aug 4, 2026
a66c9b0
fix redaction destroying errors
not-night-but Aug 4, 2026
a28e3d0
local import
not-night-but Aug 5, 2026
c44f86d
Merge branch 'feat/directory-import' of github.com:beekeeper-studio/b…
not-night-but Aug 5, 2026
542df9f
tree item list v-tooltip
azmy60 Aug 5, 2026
3c56e87
fix broken lastUsedWorkspace setting
azmy60 Aug 5, 2026
bd7f37d
Merge pull request #4556 from ylyra/fix/table-row-delete-key-macos
not-night-but Aug 6, 2026
e171178
add an in app folder-picker form component
not-night-but Aug 6, 2026
6f1ceb4
add modal detection and slideover for when in modal
not-night-but Aug 6, 2026
92ff849
allow importing to root locally
not-night-but Aug 6, 2026
e3d27af
add preserve root checkbox
not-night-but Aug 6, 2026
f40aaad
Merge pull request #4574 from Lucas-Tolle/patch-1
not-night-but Aug 6, 2026
f8de1df
fix stale test
azmy60 Aug 6, 2026
5a23478
Revert "ngrok for testing"
azmy60 Aug 6, 2026
ef4d170
Merge branch 'master' into feat/sidebar-tree-list
azmy60 Aug 6, 2026
18aa135
Merge branch 'feat/sidebar-tree-list' into feat/directory-import
azmy60 Aug 6, 2026
cfdf5de
fix test
azmy60 Aug 6, 2026
5d46495
Merge pull request #4578 from beekeeper-studio/feat/tree-item-title
azmy60 Aug 6, 2026
0b2f0b9
make recursive import ult only
not-night-but Aug 6, 2026
5beab33
Merge branch 'master' into feat/sidebar-tree-list
azmy60 Aug 6, 2026
c52978e
fix hidden <tree> in MoveFolderModal
azmy60 Aug 6, 2026
6bd8d03
Merge pull request #4502 from beekeeper-studio/feat/sidebar-tree-list
rathboma Aug 6, 2026
5476750
Merge pull request #4579 from beekeeper-studio/rc-60
rathboma Aug 6, 2026
848fb4d
docs: mark Snowflake fully supported, add SAP HANA as coming soon
claude Aug 6, 2026
55938d3
Merge pull request #4581 from beekeeper-studio/claude/update-includes…
rathboma Aug 6, 2026
136f679
fix: re-fetch table columns on manual table refresh to reflect renames
YuriNachos Aug 7, 2026
67ac971
fix(deps): bump sql-query-identifier to ^3.2.0 for Postgres dollar-qu…
YuriNachos Aug 8, 2026
3fa5cbd
Enhance setDebugComms documentation
Lucas-Tolle Aug 8, 2026
7ff512f
Enhance plugin views documentation with view types reference
Lucas-Tolle Aug 8, 2026
619a094
fix(table): use filtered count when jumping to last page
ylyra Aug 9, 2026
a61c61c
chore(deps): bump dompurify from 3.4.12 to 3.4.13
dependabot[bot] Aug 9, 2026
b5029d8
Merge pull request #4597 from Lucas-Tolle/patch-2
rathboma Aug 10, 2026
f5373ea
Merge pull request #4596 from Lucas-Tolle/patch-1
rathboma Aug 10, 2026
4dfe2c5
Merge pull request #4590 from YuriNachos/YuriNachos/r3-beekeeper-studio
rathboma Aug 10, 2026
ff88c6b
Merge branch 'master' into fix/jump-to-last-page-with-filters
ylyra Aug 10, 2026
3802e11
poll() should call refresh()
azmy60 Aug 7, 2026
c239d1d
simplify
azmy60 Aug 7, 2026
bdd6139
unload when collapsing
azmy60 Aug 7, 2026
b9944b7
fix removals
azmy60 Aug 7, 2026
9cf5625
Merge pull request #4599 from ylyra/fix/jump-to-last-page-with-filters
not-night-but Aug 11, 2026
37057e5
Merge pull request #4584 from beekeeper-studio/fix/poll
azmy60 Aug 11, 2026
521d4a6
fix quick search connections and queries
azmy60 Aug 7, 2026
7c6a26b
only poll cloud modules on the screen that shows them
azmy60 Aug 7, 2026
c0801c5
wrap poll bodies in a positive condition
azmy60 Aug 7, 2026
f50bcd5
only poll queries when query sidebar is active and not closed
azmy60 Aug 11, 2026
fcfc39f
fix saving query payload
not-night-but Aug 7, 2026
ee40b41
Polling, remote deleted, merging
not-night-but Aug 8, 2026
59aea19
check if pollInterval is defined before polling again
not-night-but Aug 11, 2026
2e027b1
fix tooltip display
not-night-but Aug 8, 2026
283fa83
fix recursive import to local workspace
not-night-but Aug 8, 2026
6d08cee
add "no items" state to the folder
azmy60 Aug 7, 2026
a3c5e08
skeleton padding
azmy60 Aug 7, 2026
e4dc9a7
fix new folder cleared by poll
azmy60 Aug 10, 2026
3f33a65
filtering break when using global state
azmy60 Aug 10, 2026
3175cef
Prevent users from restoring a version when there are pending remote
azmy60 Aug 10, 2026
c884927
fix save query title and folder
not-night-but Aug 10, 2026
9eafc56
use _.omit instead of _.pick
not-night-but Aug 10, 2026
a34f483
Fix for being unable to close tabs
rathboma Aug 10, 2026
857d681
fix import from local modals
not-night-but Aug 11, 2026
ea7f2c0
Merge pull request #4609 from beekeeper-studio/fix/import-conn-modal
not-night-but Aug 11, 2026
382d1c5
add folder-header slot
azmy60 Aug 11, 2026
17ca684
show error alert instead of "no items"
azmy60 Aug 11, 2026
969b73d
bump apps studio version to 6.0.0
azmy60 Aug 11, 2026
69954e4
fix(editor): show hours field at exactly one hour in query elapsed timer
YuriNachos Aug 11, 2026
e9f6ad2
fix(json-viewer): escape regex metacharacters when locating keys by path
YuriNachos Aug 11, 2026
2097451
chore(deps): bump js-yaml from 3.15.0 to 3.15.1
dependabot[bot] Aug 11, 2026
0b9331f
fix console.log test
azmy60 Aug 11, 2026
60f3607
fix unit test error
azmy60 Aug 11, 2026
c2ebe1d
skip .git folder in import
not-night-but Aug 11, 2026
afcb387
update allowed console logs
not-night-but Aug 11, 2026
32404be
fix poll error
azmy60 Aug 11, 2026
045cdbc
fix query polling on mount if not active
not-night-but Aug 11, 2026
b954d0c
fix lint
azmy60 Aug 11, 2026
21ae34e
Merge pull request #4615 from beekeeper-studio/fix/import-git
not-night-but Aug 11, 2026
775f43b
Merge pull request #4617 from beekeeper-studio/fix/mounted-query-polling
rathboma Aug 11, 2026
8c683d1
Merge pull request #4592 from YuriNachos/YuriNachos/w6-beekeeper-studio
not-night-but Aug 11, 2026
1d401a8
Merge pull request #4614 from beekeeper-studio/dependabot/npm_and_yar…
not-night-but Aug 11, 2026
98dca0d
Merge pull request #4612 from YuriNachos/fix/format-seconds-hour-boun…
not-night-but Aug 11, 2026
ee4104c
Merge pull request #4601 from beekeeper-studio/dependabot/npm_and_yar…
not-night-but Aug 11, 2026
4922869
chore(deps): bump nanoid from 3.3.12 to 3.3.18
dependabot[bot] Aug 11, 2026
f137c0a
Merge pull request #4618 from beekeeper-studio/dependabot/npm_and_yar…
not-night-but Aug 11, 2026
cddcd33
chore(deps-dev): bump electron from 39.8.5 to 39.8.10
dependabot[bot] Aug 11, 2026
1874b17
remove close icon and add isPollError to connection sidebar too
azmy60 Aug 11, 2026
53e093d
Merge pull request #4610 from beekeeper-studio/fix/show-folder-error
azmy60 Aug 11, 2026
fe3c587
Merge branch 'master' into rc-60
azmy60 Aug 11, 2026
298f71f
Merge pull request #4613 from YuriNachos/fix/findkeyposition-regex-es…
not-night-but Aug 11, 2026
15de749
move default to 10s sync
rathboma Aug 11, 2026
0b737c3
use title instead of v-tooltip to fix tree sidebar causing overflowing
azmy60 Aug 11, 2026
508c355
Merge pull request #4619 from beekeeper-studio/fix/massive-overflow
not-night-but Aug 11, 2026
130a829
Merge pull request #4580 from beekeeper-studio/dependabot/npm_and_yar…
not-night-but Aug 11, 2026
d83d861
Merge branch 'master' into rc-60
not-night-but Aug 11, 2026
af6b272
chore: bump version to 6.0.0-beta.0
not-night-but Aug 11, 2026
548cbdb
chore: bump version to 6.0.0
not-night-but Aug 11, 2026
a7e1bc0
fix ssh attempting to parse encrypted default keys
not-night-but Aug 12, 2026
e7b7a42
fix unit test and add integration test
not-night-but Aug 12, 2026
8ba53a9
force folders to be alphabetically sorted
azmy60 Aug 13, 2026
6f90633
hide share buttons on personal files
azmy60 Aug 12, 2026
ddef8ba
show errors using <alert-error>
azmy60 Aug 12, 2026
11305d6
use ui kit context menu
azmy60 Jun 26, 2026
f1f7c59
remove dead code
azmy60 Aug 10, 2026
1dbc81c
ts check
azmy60 Aug 12, 2026
5879604
simplify
azmy60 Aug 12, 2026
127d945
Mirror release downloads to R2 and gate all channels on release publish
claude Aug 13, 2026
64e1256
add ask ai button
azmy60 Aug 13, 2026
70ba332
Rewrite mirror_release_downloads in Node
claude Aug 13, 2026
71bdcaa
Address review: drop arm32, free disk per asset, resolve latest early
claude Aug 13, 2026
a8c4d8f
Post release-publishing status to Slack
claude Aug 13, 2026
f84d93f
Merge pull request #4436 from beekeeper-studio/fix/use-ui-kit-context…
not-night-but Aug 13, 2026
fc5f3e0
remove duplicate import for config in utility.ts
not-night-but Aug 13, 2026
3af8460
Merge pull request #4626 from beekeeper-studio/fix/no-sharing-persona…
not-night-but Aug 13, 2026
3a4ffe5
Merge pull request #4625 from beekeeper-studio/fix/force-tree-order-a…
not-night-but Aug 13, 2026
be284fc
Merge pull request #4628 from beekeeper-studio/feat/ask-ai
not-night-but Aug 13, 2026
696e424
Merge pull request #4622 from beekeeper-studio/fix/ssh-encrypted-key
not-night-but Aug 13, 2026
3f0f95e
ugrade identifier
not-night-but Aug 13, 2026
2069323
Merge pull request #4629 from beekeeper-studio/claude/beekeeper-downl…
rathboma Aug 13, 2026
e2c8d14
Add per-path checkboxes to release publishing dispatch
claude Aug 13, 2026
4708b56
Merge pull request #4635 from beekeeper-studio/claude/beekeeper-downl…
rathboma Aug 13, 2026
1fc3ff1
fix save connection form showing up on new connection screen
not-night-but Aug 13, 2026
fe9087d
Merge branch 'rc-60'
not-night-but Aug 13, 2026
db2f0e1
ci: never restore node_modules cache in release builds; key caches by…
claude Aug 13, 2026
fd8e981
ci: derive cache-key OS segment from the runner image instead of hard…
claude Aug 14, 2026
e82ccf0
Merge pull request #4638 from beekeeper-studio/claude/v6-ubuntu-22-la…
rathboma Aug 14, 2026
5d8fd95
ci: never restore node_modules cache in release builds; key caches by…
claude Aug 13, 2026
7d53091
ci: derive cache-key OS segment from the runner image instead of hard…
claude Aug 14, 2026
8430144
ci: port release-published pipeline to rc-60
claude Aug 14, 2026
9d6f54d
Merge branch 'master' into rc-60
rathboma Aug 14, 2026
e8f7b77
fix pageant on windows
not-night-but Aug 14, 2026
7b6dda5
Merge pull request #4634 from beekeeper-studio/fix/ident-upgrade
azmy60 Aug 14, 2026
b25fbd4
Merge pull request #4640 from beekeeper-studio/fix/windows-pageant
not-night-but Aug 14, 2026
e9c76d2
Merge pull request #4636 from beekeeper-studio/fix/save-connection-form
not-night-but Aug 14, 2026
5e32027
Merge pull request #4633 from beekeeper-studio/fix/duplicate-util-config
not-night-but Aug 14, 2026
8b91b69
use config values instead of old globals
not-night-but Aug 14, 2026
6b92be1
chore: bump version to 6.0.1
not-night-but Aug 14, 2026
433abb4
fix persistence guard
azmy60 Aug 14, 2026
48e3e09
Merge pull request #4645 from beekeeper-studio/fix/persistence-not-tr…
rathboma Aug 14, 2026
30ae378
Merge pull request #4642 from beekeeper-studio/fix/column-width-config
rathboma Aug 14, 2026
7f2fa29
fix(sidebar): render connections and queries by position again
andreasarf Aug 14, 2026
3393d84
test(sidebar): cover render order for connections and queries
andreasarf Aug 14, 2026
f9c0cb7
Autocomplete defaults overhaul - restoring upper case
claude Aug 12, 2026
21d5f9f
Merge branch 'master' into autocomplete-revamp
rathboma Aug 14, 2026
2366fd7
Merge pull request #4647 from andreasarf/fix/sidebar-drag-reorder-ove…
not-night-but Aug 14, 2026
84c3508
wrong findOneBy parameter
azmy60 Aug 15, 2026
b7f880a
regression test
azmy60 Aug 15, 2026
8a89863
updates to address feedback
rathboma Aug 17, 2026
9eeef3e
autocomplete docs
rathboma Aug 17, 2026
4916746
Merge pull request #4648 from beekeeper-studio/autocomplete-revamp
rathboma Aug 17, 2026
334694d
Merge pull request #4651 from beekeeper-studio/fix/tabulator-persistence
not-night-but Aug 17, 2026
16443ee
chore: bump version to 6.0.2
rathboma Aug 17, 2026
9589813
only save persistence data if data has changed
not-night-but Aug 17, 2026
b4105db
whoops, missed a ?
not-night-but Aug 17, 2026
bf37036
Merge pull request #4656 from beekeeper-studio/fix/persistence-writing
not-night-but Aug 17, 2026
5caa7e8
chore: bump version to 6.0.3
rathboma Aug 17, 2026
1dde140
Update bundled plugins when the app ships a newer version
azmy60 Aug 17, 2026
a9dea9e
refactor
azmy60 Aug 18, 2026
7f018eb
refactor
azmy60 Aug 18, 2026
9156672
Merge pull request #4658 from beekeeper-studio/fix/update-bundled-plu…
rathboma Aug 18, 2026
fde7c09
chore: bump version to 6.0.4
not-night-but Aug 18, 2026
228bc68
fix for commit always rolling back and for sql server autodetection
not-night-but Aug 18, 2026
8709d33
whoops, didn't mean to remove that
not-night-but Aug 19, 2026
c941f89
remove insane test
not-night-but Aug 19, 2026
cc2de82
Merge pull request #4664 from beekeeper-studio/fix/manual-commit-typing
rathboma Aug 19, 2026
8a0a3f6
fix(ssh): treat agent errors as non-fatal so publickey auth can proceed
stephaneminisini-fps Aug 22, 2026
8daba1f
chore: bump version to 6.0.5
not-night-but Aug 24, 2026
de942f0
Merge upstream Beekeeper Studio v6.0.5
AustralianRaven Aug 26, 2026
73f685b
feat: 🔐 multi-vault secret hierarchy
AustralianRaven Aug 26, 2026
de6047b
fix: 🪟 stop the dev launcher killing itself on Windows
AustralianRaven Aug 26, 2026
67c9e65
fix(#16): 🗄️ populate the SQL Server database dropdown from any context
AustralianRaven Aug 26, 2026
b997b45
fix(#17): 📊 virtualise large result sets in the stacked layout
AustralianRaven Aug 26, 2026
9658581
fix: 🔁 stop splitting SQL Server scripts into separate batches
AustralianRaven Aug 26, 2026
a65e40b
fix(#16): 🗄️ read the SQL Server database list from master
AustralianRaven Aug 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
91 changes: 90 additions & 1 deletion .eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,63 @@ module.exports = {
"vue/require-prop-types": "off",
"vue/require-default-prop": "off",
"@typescript-eslint/no-non-null-assertion": "off",
"vue/max-attributes-per-line": "off"
"vue/max-attributes-per-line": "off",
"vue/multi-word-component-names": "off",
"vue/no-mutating-props": "warn",
"vue/no-unused-components": "warn",
"@typescript-eslint/ban-types": "warn",
"@typescript-eslint/no-var-requires": "warn",
"prefer-rest-params": "warn",
// Bug-catching rules: errors so the build fails when real bugs land.
"no-async-promise-executor": "error",
"no-case-declarations": "error",
// checkLoops off: intentional `while (true)` loops are allowed; constant
// conditions in `if`/ternaries are still caught.
"no-constant-condition": ["error", { "checkLoops": false }],
// allowEmptyCase: empty `case` grouping is intentional, not a fallthrough
// bug; a case with statements falling through is still caught.
"no-fallthrough": ["error", { "allowEmptyCase": true }],
"no-inner-declarations": "error",
"no-prototype-builtins": "error",
"no-unsafe-optional-chaining": "error",
"no-self-compare": "error",
"no-constructor-return": "error",
"no-template-curly-in-string": "error",
"array-callback-return": "error",
"vue/no-parsing-error": "error",
"vue/valid-next-tick": "error",
"vue/valid-template-root": "error",
// Likely-bug rules kept as warn: real signal, but too many existing hits
// (or occasional intentional uses) to fail CI on.
"eqeqeq": ["warn", "smart"],
"no-unused-expressions": ["warn", { "allowShortCircuit": true, "allowTernary": true, "allowTaggedTemplates": true }],
"no-return-assign": "warn",
"no-sequences": "warn",
// Style/code-smell rules: kept as warn so they don't block CI.
"no-empty": "warn",
"no-useless-catch": "warn",
"no-useless-escape": "warn",
"@typescript-eslint/no-namespace": "warn",
// Block plugin RCE via file:// URLs (CVE — see safeOpenExternal.ts).
// shell.openExternal must only be reached via safeOpenExternal so the
// http(s)-only protocol allowlist is enforced.
"no-restricted-syntax": [
"error",
{
"selector": "MemberExpression[property.name='openExternal']",
"message": "Do not call shell.openExternal directly. Use safeOpenExternal() from @/background/lib/electron/safeOpenExternal so the URL protocol allowlist is enforced."
},
{
// ssh2's generateKeyPairSync('ed25519') intermittently emits keys its
// own parseKey can't read (mscdex/ssh2#1390), causing flaky tests.
"selector": "CallExpression[callee.property.name='generateKeyPairSync'][arguments.0.value='ed25519']",
"message": "Do not use ssh2's generateKeyPairSync('ed25519') — it intermittently produces unparseable keys (mscdex/ssh2#1390). Use a static ed25519 fixture or ssh-keygen instead."
},
{
"selector": "CallExpression[callee.name='generateKeyPairSync'][arguments.0.value='ed25519']",
"message": "Do not use ssh2's generateKeyPairSync('ed25519') — it intermittently produces unparseable keys (mscdex/ssh2#1390). Use a static ed25519 fixture or ssh-keygen instead."
}
]
},
"parser": "vue-eslint-parser",
"parserOptions": {
Expand All @@ -35,12 +91,45 @@ module.exports = {
}
},
"overrides": [
{
// TypeScript handles undefined-identifier checking; eslint's no-undef
// produces false positives on type-only imports and contextBridge
// globals (platformInfo, etc.). Also off for .js since those interop
// with the same TS modules and globals.
"files": ["*.ts", "*.tsx", "*.vue", "*.js"],
"rules": {
"no-undef": "off"
}
},
{
"files": [
"apps/**/tests/**/*.{j,t}s?(x)"
],
"env": {
"jest": true
},
"rules": {
// Test fixtures embed shell scripts and config templates that
// legitimately contain `${...}` substitution syntax.
"no-template-curly-in-string": "off"
}
},
{
// The single trusted entry point that wraps shell.openExternal.
"files": [
"apps/studio/src/background/lib/electron/safeOpenExternal.ts"
],
"rules": {
"no-restricted-syntax": "off"
}
},
{
// Renders nothing by design; the empty template root is intentional.
"files": [
"apps/studio/src/components/EmptyComponent.vue"
],
"rules": {
"vue/valid-template-root": "off"
}
}
]
Expand Down
5 changes: 5 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -1,2 +1,7 @@
dev/**/*.sql linguist-language=SQL
*.surql linguist-generated

# SSH test fixtures must not be CRLF-converted on Windows checkout -
# Pageant's OpenSSH key parser is strict and rejects CRLF-munged files.
apps/studio/tests/resources/ssh/pageant_test -text
apps/studio/tests/resources/ssh/pageant_test.pub -text
46 changes: 0 additions & 46 deletions .github/scripts/create_draft_release.js

This file was deleted.

5 changes: 3 additions & 2 deletions .github/scripts/extract_channel.sh
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,9 @@ then
exit 1
fi

# Extract version from package.json
VERSION=$(jq -r '.version' apps/studio/package.json)
# Version comes from $1 when given (release-published.yml passes the release
# tag minus the "v" prefix), otherwise from package.json (build-time usage).
VERSION="${1:-$(jq -r '.version' apps/studio/package.json)}"

# Determine the release channel based on the version
if [[ "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
Expand Down
159 changes: 159 additions & 0 deletions .github/scripts/mirror_release_downloads.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,159 @@
#!/usr/bin/env node
/*
* Mirror a published GitHub release into the downloads R2 bucket, and refresh
* the latest.json manifest the website resolves downloads from.
*
* Usage: node mirror_release_downloads.js <tag>
*
* Ordering matters: binaries upload first, the manifest last, so latest.json
* never references an object that isn't in the bucket yet. Uploads overwrite,
* so re-running (via workflow_dispatch) is safe and heals partial runs.
*
* Shells out to `gh` for release reads/downloads and `aws` for R2 uploads;
* both are preinstalled on GitHub runners.
*
* Required env:
* GH_TOKEN - GitHub token for release reads
* R2_BUCKET - target bucket name
* R2_ENDPOINT - S3-compatible endpoint URL
* PUBLIC_BASE_URL - public origin serving the bucket (custom domain)
* LATEST_TAG - tag GitHub reports as the latest release (resolved by
* the workflow before this script runs); latest.json is
* only written when it matches the mirrored tag
* AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY - R2 credentials
*/

const { execFileSync } = require('node:child_process')
const fs = require('node:fs')
const os = require('node:os')
const path = require('node:path')

const REPO = 'beekeeper-studio/beekeeper-studio'

// Run a command, streaming its output to the log.
function run(cmd, args) {
execFileSync(cmd, args, { stdio: 'inherit' })
}

// Run a command and return its stdout as a string.
function capture(cmd, args) {
return execFileSync(cmd, args, { encoding: 'utf8' }).trim()
}

// extension/arch/type must stay in lockstep with the website's matching logic
// (web repo: _assets/js/lib/github.js GithubAsset + controllers/download.js).
function assetEntry(asset, urlBase) {
const name = asset.name
const extension = name.split('.').pop()

const arch = name.includes('arm64') || name.includes('aarch64') ? 'arm64' : 'x86_64'

const type = extension === 'exe' && name.includes('portable') ? 'portable' : 'installer'

return {
name,
size: asset.size,
content_type: asset.contentType,
extension,
arch,
type,
url: `${urlBase}/${encodeURIComponent(name)}`,
}
}

function upload(file, dest, contentType, cacheControl) {
run('aws', [
's3', 'cp', file, dest,
'--endpoint-url', process.env.R2_ENDPOINT,
'--content-type', contentType,
'--cache-control', cacheControl,
])
}

function main() {
const tag = process.argv[2]
if (!tag) {
console.error('usage: mirror_release_downloads.js <tag>')
process.exit(1)
}
for (const name of ['GH_TOKEN', 'R2_BUCKET', 'R2_ENDPOINT', 'PUBLIC_BASE_URL', 'LATEST_TAG']) {
if (!process.env[name]) {
console.error(`missing required env: ${name}`)
process.exit(1)
}
}

const { R2_BUCKET, PUBLIC_BASE_URL } = process.env
const prefix = `releases/${tag}`

const release = JSON.parse(capture('gh', [
'release', 'view', tag, '--repo', REPO,
'--json', 'tagName,publishedAt,isDraft,isPrerelease,assets',
]))

if (release.isDraft) {
console.log(`${tag} is a draft; nothing to mirror.`)
return
}

const workdir = fs.mkdtempSync(path.join(os.tmpdir(), 'mirror-release-'))
try {
console.log(`Found ${release.assets.length} assets on ${tag}:`)
for (const asset of release.assets) {
console.log(` - ${asset.name} (${asset.size} bytes)`)
}

// Binaries never change once released - cache them hard. Each asset is
// downloaded, uploaded, and deleted individually: the log shows exactly
// how far a run got, and disk usage stays at one asset instead of the
// whole release.
release.assets.forEach((asset, i) => {
const progress = `[${i + 1}/${release.assets.length}] ${asset.name}`
const file = path.join(workdir, asset.name)
console.log(`${progress}: downloading`)
run('gh', ['release', 'download', tag, '--repo', REPO, '--dir', workdir, '--pattern', asset.name])
console.log(`${progress}: uploading`)
upload(
file,
`s3://${R2_BUCKET}/${prefix}/${asset.name}`,
asset.contentType,
'public, max-age=31536000, immutable'
)
fs.rmSync(file)
console.log(`${progress}: done`)
})

// Only the release GitHub reports as latest may write the manifest. This
// one rule covers prereleases, re-published old versions, and
// near-simultaneous publishes: drafts and prereleases are never "latest",
// and whatever order concurrent runs finish in, the manifest converges on
// the canonical latest. The lookup itself happens in an earlier workflow
// step (so a bad API response fails the run before any downloads); this
// script only compares.
if (process.env.LATEST_TAG !== tag) {
console.log(`${tag} is not the latest release (${process.env.LATEST_TAG} is): assets mirrored, latest.json untouched.`)
return
}

// electron-updater metadata (*.yml, *.blockmap) is mirrored above but
// excluded from the manifest - it is not a user-facing download.
const manifest = {
tag_name: release.tagName,
version: release.tagName.replace(/^v/, ''),
published_at: release.publishedAt,
assets: release.assets
.filter((asset) => !/\.(yml|blockmap)$/.test(asset.name))
.map((asset) => assetEntry(asset, `${PUBLIC_BASE_URL}/${prefix}`)),
}

const manifestFile = path.join(workdir, 'latest.json')
fs.writeFileSync(manifestFile, JSON.stringify(manifest, null, 2) + '\n')
upload(manifestFile, `s3://${R2_BUCKET}/latest.json`, 'application/json', 'public, max-age=60')

console.log(`Mirrored ${tag} to ${prefix} and updated latest.json`)
} finally {
fs.rmSync(workdir, { recursive: true, force: true })
}
}

main()
12 changes: 12 additions & 0 deletions .github/scripts/notify_slack.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#!/bin/bash
set -euo pipefail

# usage: notify_slack.sh <message>
# env: SLACK_WEBHOOK - incoming webhook URL for the target channel
#
# Message is passed through jq so quoting/newlines can't break the payload.

MESSAGE="${1:?usage: notify_slack.sh <message>}"

jq -n --arg text "$MESSAGE" '{text: $text}' \
| curl -sf -X POST -H 'Content-Type: application/json' -d @- "$SLACK_WEBHOOK"
Loading
Loading