@adecore/database 0.0.1 → 0.16.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (400) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +152 -1
  3. package/dist/DatabaseProvider.d.ts +13 -0
  4. package/dist/DatabaseProvider.js +17 -0
  5. package/dist/actions.d.ts +40 -0
  6. package/dist/actions.js +1 -0
  7. package/dist/client/client.d.ts +5 -0
  8. package/dist/client/client.js +245 -0
  9. package/dist/client/index.d.ts +2 -0
  10. package/dist/client/index.js +2 -0
  11. package/dist/client/types.d.ts +97 -0
  12. package/dist/client/types.js +13 -0
  13. package/dist/client-context.d.ts +16 -0
  14. package/dist/client-context.js +17 -0
  15. package/dist/connections/ConnectionForm.d.ts +10 -0
  16. package/dist/connections/ConnectionForm.js +145 -0
  17. package/dist/connections/ConnectionManager.d.ts +12 -0
  18. package/dist/connections/ConnectionManager.js +93 -0
  19. package/dist/connections/EngineIcon.d.ts +9 -0
  20. package/dist/connections/EngineIcon.js +7 -0
  21. package/dist/connections/connection-config.d.ts +16 -0
  22. package/dist/connections/connection-config.js +107 -0
  23. package/dist/connections/docker.d.ts +9 -0
  24. package/dist/connections/docker.js +38 -0
  25. package/dist/connections/engine-icons.d.ts +3 -0
  26. package/dist/connections/engine-icons.js +3 -0
  27. package/dist/connections/use-docker-containers.d.ts +17 -0
  28. package/dist/connections/use-docker-containers.js +26 -0
  29. package/dist/console/DestructiveDialog.d.ts +9 -0
  30. package/dist/console/DestructiveDialog.js +9 -0
  31. package/dist/console/HistoryPanel.d.ts +10 -0
  32. package/dist/console/HistoryPanel.js +15 -0
  33. package/dist/console/QueryConsole.d.ts +14 -0
  34. package/dist/console/QueryConsole.js +261 -0
  35. package/dist/console/SchemaPicker.d.ts +11 -0
  36. package/dist/console/SchemaPicker.js +8 -0
  37. package/dist/console/SqlEditor.d.ts +12 -0
  38. package/dist/console/SqlEditor.js +61 -0
  39. package/dist/console/StatementResultView.d.ts +18 -0
  40. package/dist/console/StatementResultView.js +32 -0
  41. package/dist/console/TransactionControls.d.ts +13 -0
  42. package/dist/console/TransactionControls.js +12 -0
  43. package/dist/console/destructive.d.ts +7 -0
  44. package/dist/console/destructive.js +43 -0
  45. package/dist/console/editing.d.ts +12 -0
  46. package/dist/console/editing.js +60 -0
  47. package/dist/console/history.d.ts +13 -0
  48. package/dist/console/history.js +43 -0
  49. package/dist/console/labels.d.ts +1 -0
  50. package/dist/console/labels.js +6 -0
  51. package/dist/console/outcome.d.ts +6 -0
  52. package/dist/console/outcome.js +11 -0
  53. package/dist/console/schemas.d.ts +2 -0
  54. package/dist/console/schemas.js +5 -0
  55. package/dist/console/shortcuts.d.ts +2 -0
  56. package/dist/console/shortcuts.js +3 -0
  57. package/dist/console/useConsoleHistory.d.ts +7 -0
  58. package/dist/console/useConsoleHistory.js +22 -0
  59. package/dist/ddl/alter-mysql.d.ts +4 -0
  60. package/dist/ddl/alter-mysql.js +79 -0
  61. package/dist/ddl/alter-sqlite.d.ts +4 -0
  62. package/dist/ddl/alter-sqlite.js +80 -0
  63. package/dist/ddl/alter.d.ts +4 -0
  64. package/dist/ddl/alter.js +24 -0
  65. package/dist/ddl/column.d.ts +9 -0
  66. package/dist/ddl/column.js +62 -0
  67. package/dist/ddl/create.d.ts +12 -0
  68. package/dist/ddl/create.js +74 -0
  69. package/dist/ddl/dialect.d.ts +12 -0
  70. package/dist/ddl/dialect.js +34 -0
  71. package/dist/ddl/diff.d.ts +34 -0
  72. package/dist/ddl/diff.js +111 -0
  73. package/dist/ddl/draft.d.ts +46 -0
  74. package/dist/ddl/draft.js +70 -0
  75. package/dist/ddl/index.d.ts +10 -0
  76. package/dist/ddl/index.js +10 -0
  77. package/dist/ddl/parse.d.ts +17 -0
  78. package/dist/ddl/parse.js +131 -0
  79. package/dist/ddl/statements.d.ts +6 -0
  80. package/dist/ddl/statements.js +12 -0
  81. package/dist/ddl/types.d.ts +6 -0
  82. package/dist/ddl/types.js +52 -0
  83. package/dist/ddl/validate.d.ts +7 -0
  84. package/dist/ddl/validate.js +38 -0
  85. package/dist/designer/ColumnsEditor.d.ts +2 -0
  86. package/dist/designer/ColumnsEditor.js +24 -0
  87. package/dist/designer/DesignerView.d.ts +25 -0
  88. package/dist/designer/DesignerView.js +33 -0
  89. package/dist/designer/ForeignKeysEditor.d.ts +7 -0
  90. package/dist/designer/ForeignKeysEditor.js +24 -0
  91. package/dist/designer/IndexesEditor.d.ts +2 -0
  92. package/dist/designer/IndexesEditor.js +13 -0
  93. package/dist/designer/NamePicker.d.ts +11 -0
  94. package/dist/designer/NamePicker.js +13 -0
  95. package/dist/designer/OptionsEditor.d.ts +2 -0
  96. package/dist/designer/OptionsEditor.js +17 -0
  97. package/dist/designer/SqlPreview.d.ts +12 -0
  98. package/dist/designer/SqlPreview.js +17 -0
  99. package/dist/designer/TableDesigner.d.ts +10 -0
  100. package/dist/designer/TableDesigner.js +103 -0
  101. package/dist/designer/edit.d.ts +17 -0
  102. package/dist/designer/edit.js +115 -0
  103. package/dist/designer/editor-props.d.ts +10 -0
  104. package/dist/designer/editor-props.js +1 -0
  105. package/dist/designer/plan.d.ts +9 -0
  106. package/dist/designer/plan.js +13 -0
  107. package/dist/designer/recover.d.ts +2 -0
  108. package/dist/designer/recover.js +18 -0
  109. package/dist/designer/useReferenceColumns.d.ts +3 -0
  110. package/dist/designer/useReferenceColumns.js +36 -0
  111. package/dist/explorer/DatabaseExplorer.d.ts +13 -0
  112. package/dist/explorer/DatabaseExplorer.js +264 -0
  113. package/dist/explorer/RowMenu.d.ts +11 -0
  114. package/dist/explorer/RowMenu.js +89 -0
  115. package/dist/explorer/TableDialog.d.ts +15 -0
  116. package/dist/explorer/TableDialog.js +50 -0
  117. package/dist/explorer/expansion.d.ts +7 -0
  118. package/dist/explorer/expansion.js +31 -0
  119. package/dist/explorer/table-statements.d.ts +5 -0
  120. package/dist/explorer/table-statements.js +12 -0
  121. package/dist/explorer/tree.d.ts +125 -0
  122. package/dist/explorer/tree.js +295 -0
  123. package/dist/explorer/use-explorer-loads.d.ts +12 -0
  124. package/dist/explorer/use-explorer-loads.js +109 -0
  125. package/dist/explorer/use-stored-expansion.d.ts +9 -0
  126. package/dist/explorer/use-stored-expansion.js +47 -0
  127. package/dist/grid/CellEditor.d.ts +9 -0
  128. package/dist/grid/CellEditor.js +29 -0
  129. package/dist/grid/CopyAsMenu.d.ts +7 -0
  130. package/dist/grid/CopyAsMenu.js +10 -0
  131. package/dist/grid/DataGrid.d.ts +36 -0
  132. package/dist/grid/DataGrid.js +512 -0
  133. package/dist/grid/EnumPicker.d.ts +17 -0
  134. package/dist/grid/EnumPicker.js +53 -0
  135. package/dist/grid/GridHeaderCell.d.ts +36 -0
  136. package/dist/grid/GridHeaderCell.js +69 -0
  137. package/dist/grid/RecordView.d.ts +20 -0
  138. package/dist/grid/RecordView.js +126 -0
  139. package/dist/grid/ValueDock.d.ts +11 -0
  140. package/dist/grid/ValueDock.js +28 -0
  141. package/dist/grid/aggregates.d.ts +22 -0
  142. package/dist/grid/aggregates.js +62 -0
  143. package/dist/grid/cell-range.d.ts +14 -0
  144. package/dist/grid/cell-range.js +11 -0
  145. package/dist/grid/column-layout.d.ts +18 -0
  146. package/dist/grid/column-layout.js +49 -0
  147. package/dist/grid/column-selection.d.ts +11 -0
  148. package/dist/grid/column-selection.js +28 -0
  149. package/dist/grid/column-view.d.ts +10 -0
  150. package/dist/grid/column-view.js +23 -0
  151. package/dist/grid/copy-formats.d.ts +15 -0
  152. package/dist/grid/copy-formats.js +80 -0
  153. package/dist/grid/display.d.ts +20 -0
  154. package/dist/grid/display.js +81 -0
  155. package/dist/grid/edit-value.d.ts +5 -0
  156. package/dist/grid/edit-value.js +55 -0
  157. package/dist/grid/enum-type.d.ts +7 -0
  158. package/dist/grid/enum-type.js +52 -0
  159. package/dist/grid/focused-value.d.ts +4 -0
  160. package/dist/grid/focused-value.js +19 -0
  161. package/dist/grid/layout.d.ts +22 -0
  162. package/dist/grid/layout.js +74 -0
  163. package/dist/grid/navigation.d.ts +15 -0
  164. package/dist/grid/navigation.js +52 -0
  165. package/dist/grid/row-selection.d.ts +9 -0
  166. package/dist/grid/row-selection.js +24 -0
  167. package/dist/grid/sort.d.ts +7 -0
  168. package/dist/grid/sort.js +7 -0
  169. package/dist/grid/types.d.ts +30 -0
  170. package/dist/grid/types.js +9 -0
  171. package/dist/host/helper-path.d.ts +7 -0
  172. package/dist/host/helper-path.js +15 -0
  173. package/dist/host/host.d.ts +2 -0
  174. package/dist/host/host.js +343 -0
  175. package/dist/host/index.d.ts +5 -0
  176. package/dist/host/index.js +4 -0
  177. package/dist/host/spawn.d.ts +7 -0
  178. package/dist/host/spawn.js +98 -0
  179. package/dist/host/types.d.ts +19 -0
  180. package/dist/host/types.js +1 -0
  181. package/dist/host/validate.d.ts +10 -0
  182. package/dist/host/validate.js +339 -0
  183. package/dist/index.d.ts +14 -0
  184. package/dist/index.js +13 -0
  185. package/dist/locales/en.json +577 -0
  186. package/dist/locales/nl.json +577 -0
  187. package/dist/locales.d.ts +4 -0
  188. package/dist/locales.js +14 -0
  189. package/dist/protocol/connection.d.ts +56 -0
  190. package/dist/protocol/connection.js +1 -0
  191. package/dist/protocol/errors.d.ts +7 -0
  192. package/dist/protocol/errors.js +1 -0
  193. package/dist/protocol/index.d.ts +5 -0
  194. package/dist/protocol/index.js +3 -0
  195. package/dist/protocol/messages.d.ts +250 -0
  196. package/dist/protocol/messages.js +2 -0
  197. package/dist/protocol/schema.d.ts +53 -0
  198. package/dist/protocol/schema.js +1 -0
  199. package/dist/protocol/values.d.ts +21 -0
  200. package/dist/protocol/values.js +15 -0
  201. package/dist/sql-split.d.ts +15 -0
  202. package/dist/sql-split.js +201 -0
  203. package/dist/sql.d.ts +29 -0
  204. package/dist/sql.js +104 -0
  205. package/dist/structure/StructureView.d.ts +14 -0
  206. package/dist/structure/StructureView.js +99 -0
  207. package/dist/structure/structure-text.d.ts +2 -0
  208. package/dist/structure/structure-text.js +2 -0
  209. package/dist/table/CommandField.d.ts +14 -0
  210. package/dist/table/CommandField.js +157 -0
  211. package/dist/table/ImportDialog.d.ts +27 -0
  212. package/dist/table/ImportDialog.js +28 -0
  213. package/dist/table/TableStatusBar.d.ts +19 -0
  214. package/dist/table/TableStatusBar.js +22 -0
  215. package/dist/table/TableToolbar.d.ts +43 -0
  216. package/dist/table/TableToolbar.js +16 -0
  217. package/dist/table/TableView.d.ts +13 -0
  218. package/dist/table/TableView.js +508 -0
  219. package/dist/table/command-field.d.ts +57 -0
  220. package/dist/table/command-field.js +203 -0
  221. package/dist/table/grid-rows.d.ts +23 -0
  222. package/dist/table/grid-rows.js +55 -0
  223. package/dist/table/import-mapping.d.ts +7 -0
  224. package/dist/table/import-mapping.js +28 -0
  225. package/dist/table/layout-store.d.ts +13 -0
  226. package/dist/table/layout-store.js +43 -0
  227. package/dist/table/paging.d.ts +12 -0
  228. package/dist/table/paging.js +20 -0
  229. package/dist/table/pending.d.ts +32 -0
  230. package/dist/table/pending.js +94 -0
  231. package/dist/table/references.d.ts +12 -0
  232. package/dist/table/references.js +21 -0
  233. package/dist/table/useLoaded.d.ts +7 -0
  234. package/dist/table/useLoaded.js +36 -0
  235. package/dist/table/useStoredLayout.d.ts +8 -0
  236. package/dist/table/useStoredLayout.js +39 -0
  237. package/dist/table/useTableTransfer.d.ts +51 -0
  238. package/dist/table/useTableTransfer.js +125 -0
  239. package/dist/testing/fake.d.ts +21 -0
  240. package/dist/testing/fake.js +372 -0
  241. package/dist/testing/index.d.ts +1 -0
  242. package/dist/testing/index.js +1 -0
  243. package/dist/use-popup-press.d.ts +1 -0
  244. package/dist/use-popup-press.js +24 -0
  245. package/dist/use-schema-change.d.ts +1 -0
  246. package/dist/use-schema-change.js +13 -0
  247. package/dist/use-stable-callback.d.ts +1 -0
  248. package/dist/use-stable-callback.js +9 -0
  249. package/dist/value/ValuePanel.d.ts +14 -0
  250. package/dist/value/ValuePanel.js +103 -0
  251. package/dist/value/draft.d.ts +33 -0
  252. package/dist/value/draft.js +44 -0
  253. package/dist/value/hex.d.ts +14 -0
  254. package/dist/value/hex.js +46 -0
  255. package/dist/value/json.d.ts +9 -0
  256. package/dist/value/json.js +71 -0
  257. package/dist/value/views.d.ts +22 -0
  258. package/dist/value/views.js +54 -0
  259. package/dist/workbench/DatabaseWorkbench.d.ts +9 -0
  260. package/dist/workbench/DatabaseWorkbench.js +179 -0
  261. package/dist/workbench/DesignerTab.d.ts +10 -0
  262. package/dist/workbench/DesignerTab.js +22 -0
  263. package/dist/workbench/TableTab.d.ts +10 -0
  264. package/dist/workbench/TableTab.js +8 -0
  265. package/dist/workbench/tabs.d.ts +42 -0
  266. package/dist/workbench/tabs.js +139 -0
  267. package/package.json +79 -3
  268. package/src/DatabaseProvider.tsx +37 -0
  269. package/src/actions.ts +34 -0
  270. package/src/client/client.ts +324 -0
  271. package/src/client/index.ts +18 -0
  272. package/src/client/types.ts +161 -0
  273. package/src/client-context.ts +35 -0
  274. package/src/connections/ConnectionForm.tsx +474 -0
  275. package/src/connections/ConnectionManager.tsx +224 -0
  276. package/src/connections/EngineIcon.tsx +18 -0
  277. package/src/connections/connection-config.ts +143 -0
  278. package/src/connections/docker.ts +50 -0
  279. package/src/connections/engine-icons.ts +5 -0
  280. package/src/connections/use-docker-containers.ts +41 -0
  281. package/src/console/DestructiveDialog.tsx +40 -0
  282. package/src/console/HistoryPanel.tsx +67 -0
  283. package/src/console/QueryConsole.tsx +439 -0
  284. package/src/console/SchemaPicker.tsx +32 -0
  285. package/src/console/SqlEditor.tsx +95 -0
  286. package/src/console/StatementResultView.tsx +176 -0
  287. package/src/console/TransactionControls.tsx +53 -0
  288. package/src/console/destructive.ts +60 -0
  289. package/src/console/editing.ts +77 -0
  290. package/src/console/history.ts +62 -0
  291. package/src/console/labels.ts +7 -0
  292. package/src/console/outcome.ts +14 -0
  293. package/src/console/schemas.ts +7 -0
  294. package/src/console/shortcuts.ts +4 -0
  295. package/src/console/useConsoleHistory.ts +39 -0
  296. package/src/ddl/alter-mysql.ts +90 -0
  297. package/src/ddl/alter-sqlite.ts +93 -0
  298. package/src/ddl/alter.ts +29 -0
  299. package/src/ddl/column.ts +74 -0
  300. package/src/ddl/create.ts +92 -0
  301. package/src/ddl/dialect.ts +53 -0
  302. package/src/ddl/diff.ts +164 -0
  303. package/src/ddl/draft.ts +136 -0
  304. package/src/ddl/index.ts +10 -0
  305. package/src/ddl/parse.ts +161 -0
  306. package/src/ddl/statements.ts +20 -0
  307. package/src/ddl/types.ts +60 -0
  308. package/src/ddl/validate.ts +47 -0
  309. package/src/designer/ColumnsEditor.tsx +204 -0
  310. package/src/designer/DesignerView.tsx +184 -0
  311. package/src/designer/ForeignKeysEditor.tsx +132 -0
  312. package/src/designer/IndexesEditor.tsx +63 -0
  313. package/src/designer/NamePicker.tsx +44 -0
  314. package/src/designer/OptionsEditor.tsx +101 -0
  315. package/src/designer/SqlPreview.tsx +56 -0
  316. package/src/designer/TableDesigner.tsx +186 -0
  317. package/src/designer/edit.ts +137 -0
  318. package/src/designer/editor-props.ts +13 -0
  319. package/src/designer/plan.ts +25 -0
  320. package/src/designer/recover.ts +20 -0
  321. package/src/designer/useReferenceColumns.ts +54 -0
  322. package/src/explorer/DatabaseExplorer.tsx +450 -0
  323. package/src/explorer/RowMenu.tsx +134 -0
  324. package/src/explorer/TableDialog.tsx +80 -0
  325. package/src/explorer/expansion.ts +47 -0
  326. package/src/explorer/table-statements.ts +18 -0
  327. package/src/explorer/tree.ts +453 -0
  328. package/src/explorer/use-explorer-loads.ts +157 -0
  329. package/src/explorer/use-stored-expansion.ts +66 -0
  330. package/src/grid/CellEditor.tsx +53 -0
  331. package/src/grid/CopyAsMenu.tsx +33 -0
  332. package/src/grid/DataGrid.tsx +871 -0
  333. package/src/grid/EnumPicker.tsx +108 -0
  334. package/src/grid/GridHeaderCell.tsx +243 -0
  335. package/src/grid/RecordView.tsx +293 -0
  336. package/src/grid/ValueDock.tsx +52 -0
  337. package/src/grid/aggregates.ts +94 -0
  338. package/src/grid/cell-range.ts +26 -0
  339. package/src/grid/column-layout.ts +71 -0
  340. package/src/grid/column-selection.ts +42 -0
  341. package/src/grid/column-view.ts +35 -0
  342. package/src/grid/copy-formats.ts +108 -0
  343. package/src/grid/display.ts +109 -0
  344. package/src/grid/edit-value.ts +60 -0
  345. package/src/grid/enum-type.ts +62 -0
  346. package/src/grid/focused-value.ts +23 -0
  347. package/src/grid/layout.ts +91 -0
  348. package/src/grid/navigation.ts +74 -0
  349. package/src/grid/row-selection.ts +35 -0
  350. package/src/grid/sort.ts +12 -0
  351. package/src/grid/types.ts +59 -0
  352. package/src/host/helper-path.ts +41 -0
  353. package/src/host/host.ts +456 -0
  354. package/src/host/index.ts +5 -0
  355. package/src/host/spawn.ts +124 -0
  356. package/src/host/types.ts +46 -0
  357. package/src/host/validate.ts +402 -0
  358. package/src/index.ts +37 -0
  359. package/src/locales/en.json +577 -0
  360. package/src/locales/nl.json +577 -0
  361. package/src/locales.ts +18 -0
  362. package/src/protocol/connection.ts +86 -0
  363. package/src/protocol/errors.ts +38 -0
  364. package/src/protocol/index.ts +33 -0
  365. package/src/protocol/messages.ts +168 -0
  366. package/src/protocol/schema.ts +76 -0
  367. package/src/protocol/values.ts +52 -0
  368. package/src/sql-split.ts +220 -0
  369. package/src/sql.ts +152 -0
  370. package/src/structure/StructureView.tsx +269 -0
  371. package/src/structure/structure-text.ts +4 -0
  372. package/src/table/CommandField.tsx +318 -0
  373. package/src/table/ImportDialog.tsx +168 -0
  374. package/src/table/TableStatusBar.tsx +91 -0
  375. package/src/table/TableToolbar.tsx +217 -0
  376. package/src/table/TableView.tsx +880 -0
  377. package/src/table/command-field.ts +285 -0
  378. package/src/table/grid-rows.ts +80 -0
  379. package/src/table/import-mapping.ts +37 -0
  380. package/src/table/layout-store.ts +62 -0
  381. package/src/table/paging.ts +33 -0
  382. package/src/table/pending.ts +143 -0
  383. package/src/table/references.ts +38 -0
  384. package/src/table/useLoaded.ts +58 -0
  385. package/src/table/useStoredLayout.ts +53 -0
  386. package/src/table/useTableTransfer.ts +187 -0
  387. package/src/testing/fake.ts +533 -0
  388. package/src/testing/index.ts +1 -0
  389. package/src/use-popup-press.ts +27 -0
  390. package/src/use-schema-change.ts +19 -0
  391. package/src/use-stable-callback.ts +12 -0
  392. package/src/value/ValuePanel.tsx +254 -0
  393. package/src/value/draft.ts +72 -0
  394. package/src/value/hex.ts +62 -0
  395. package/src/value/json.ts +74 -0
  396. package/src/value/views.ts +68 -0
  397. package/src/workbench/DatabaseWorkbench.tsx +348 -0
  398. package/src/workbench/DesignerTab.tsx +37 -0
  399. package/src/workbench/TableTab.tsx +27 -0
  400. package/src/workbench/tabs.ts +184 -0
@@ -0,0 +1,10 @@
1
+ import type { Connection } from '../client/types.ts';
2
+ import type { WorkbenchTab } from './tabs.ts';
3
+ export interface TableTabProps {
4
+ connection: Connection;
5
+ tab: Extract<WorkbenchTab, {
6
+ kind: 'table';
7
+ }>;
8
+ onDirtyChange?(dirty: boolean): void;
9
+ }
10
+ export declare function TableTab({ connection, tab, onDirtyChange }: TableTabProps): import("react").JSX.Element;
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { StructureView } from '../structure/StructureView.js';
3
+ import { TableView } from '../table/TableView.js';
4
+ /* The data and the structure of one table, the one that `tab.view` names in front. Both stay mounted, so pending edits in the data survive a look at the structure. */
5
+ export function TableTab({ connection, tab, onDirtyChange }) {
6
+ const { schema, table } = tab.ref;
7
+ return (_jsxs("div", { className: "flex h-full min-h-0 flex-col", children: [_jsx("div", { className: "min-h-0 flex-1", hidden: tab.view !== 'data', children: _jsx(TableView, { connection: connection, schema: schema, table: table, defaultWhere: tab.where, onDirtyChange: onDirtyChange, className: "h-full" }) }), _jsx("div", { className: "min-h-0 flex-1", hidden: tab.view !== 'structure', children: _jsx(StructureView, { connection: connection, schema: schema, table: table, className: "h-full" }) })] }));
8
+ }
@@ -0,0 +1,42 @@
1
+ import type { TableRef } from '../client/types.ts';
2
+ export type TableViewMode = 'data' | 'structure';
3
+ export type WorkbenchTab = {
4
+ readonly id: string;
5
+ readonly kind: 'table';
6
+ readonly ref: TableRef;
7
+ readonly view: TableViewMode;
8
+ readonly where?: string;
9
+ } | {
10
+ readonly id: string;
11
+ readonly kind: 'console';
12
+ readonly connectionId: string;
13
+ readonly schema?: string;
14
+ readonly sql: string;
15
+ readonly number: number;
16
+ } | {
17
+ readonly id: string;
18
+ readonly kind: 'designer';
19
+ readonly connectionId: string;
20
+ readonly schema: string;
21
+ readonly table?: string;
22
+ };
23
+ export interface WorkbenchState {
24
+ readonly tabs: readonly WorkbenchTab[];
25
+ readonly activeId: string | null;
26
+ readonly serial: number;
27
+ readonly consoles: number;
28
+ }
29
+ export declare const STORAGE_KEY = "database:workbench";
30
+ export declare const emptyState: WorkbenchState;
31
+ export declare const connectionIdOf: (tab: WorkbenchTab) => string;
32
+ export declare const focusTab: (state: WorkbenchState, id: string) => WorkbenchState;
33
+ export declare const openTable: (state: WorkbenchState, ref: TableRef, view: TableViewMode, where?: string) => WorkbenchState;
34
+ export declare const openConsole: (state: WorkbenchState, connectionId: string, schema?: string, sql?: string) => WorkbenchState;
35
+ export declare const openDesigner: (state: WorkbenchState, connectionId: string, schema: string, table?: string) => WorkbenchState;
36
+ export declare const setTableView: (state: WorkbenchState, id: string, view: TableViewMode) => WorkbenchState;
37
+ export declare const setConsoleSql: (state: WorkbenchState, id: string, sql: string) => WorkbenchState;
38
+ export declare const setDesignerTable: (state: WorkbenchState, id: string, table: string) => WorkbenchState;
39
+ export declare const closeTab: (state: WorkbenchState, id: string) => WorkbenchState;
40
+ export declare const pruneTabs: (state: WorkbenchState, connectionIds: ReadonlySet<string>) => WorkbenchState;
41
+ export declare const serializeState: (state: WorkbenchState) => string;
42
+ export declare const parseState: (raw: string | null) => WorkbenchState;
@@ -0,0 +1,139 @@
1
+ export const STORAGE_KEY = 'database:workbench';
2
+ export const emptyState = { tabs: [], activeId: null, serial: 0, consoles: 0 };
3
+ export const connectionIdOf = (tab) => (tab.kind === 'table' ? tab.ref.connectionId : tab.connectionId);
4
+ const tableTabId = (ref) => `table:${ref.connectionId}\u0000${ref.schema}\u0000${ref.table}`;
5
+ const add = (state, tab) => ({ ...state, tabs: [...state.tabs, tab], activeId: tab.id });
6
+ const update = (state, id, change) => {
7
+ let changed = false;
8
+ const tabs = state.tabs.map((tab) => {
9
+ if (tab.id !== id) {
10
+ return tab;
11
+ }
12
+ const next = change(tab);
13
+ changed ||= next !== tab;
14
+ return next;
15
+ });
16
+ return changed ? { ...state, tabs } : state;
17
+ };
18
+ export const focusTab = (state, id) => state.activeId === id || !state.tabs.some((tab) => tab.id === id) ? state : { ...state, activeId: id };
19
+ /* A table opens once per table; a filtered one is always a tab of its own, since the filter is what the person asked to see. */
20
+ export const openTable = (state, ref, view, where) => {
21
+ if (where !== undefined && where.trim() !== '') {
22
+ return add({ ...state, serial: state.serial + 1 }, { id: `filtered:${state.serial + 1}`, kind: 'table', ref, view, where });
23
+ }
24
+ const id = tableTabId(ref);
25
+ const existing = state.tabs.find((tab) => tab.id === id);
26
+ if (existing === undefined) {
27
+ return add(state, { id, kind: 'table', ref, view });
28
+ }
29
+ return focusTab(setTableView(state, id, view), id);
30
+ };
31
+ export const openConsole = (state, connectionId, schema, sql = '') => {
32
+ const serial = state.serial + 1;
33
+ const consoles = state.consoles + 1;
34
+ return add({ ...state, serial, consoles }, { id: `console:${serial}`, kind: 'console', connectionId, schema, sql, number: consoles });
35
+ };
36
+ /* A table is designed in one tab; a new table gets a tab each time. */
37
+ export const openDesigner = (state, connectionId, schema, table) => {
38
+ const existing = table === undefined
39
+ ? undefined
40
+ : state.tabs.find((tab) => tab.kind === 'designer' && tab.connectionId === connectionId && tab.schema === schema && tab.table === table);
41
+ if (existing !== undefined) {
42
+ return focusTab(state, existing.id);
43
+ }
44
+ const serial = state.serial + 1;
45
+ return add({ ...state, serial }, { id: `designer:${serial}`, kind: 'designer', connectionId, schema, table });
46
+ };
47
+ export const setTableView = (state, id, view) => update(state, id, (tab) => (tab.kind === 'table' && tab.view !== view ? { ...tab, view } : tab));
48
+ export const setConsoleSql = (state, id, sql) => update(state, id, (tab) => (tab.kind === 'console' && tab.sql !== sql ? { ...tab, sql } : tab));
49
+ /* The designer of a new table became the designer of that table, in the same tab. Closes any other designer of it. */
50
+ export const setDesignerTable = (state, id, table) => {
51
+ const subject = state.tabs.find((tab) => tab.id === id);
52
+ if (subject?.kind !== 'designer' || subject.table === table) {
53
+ return state;
54
+ }
55
+ const tabs = state.tabs.filter((tab) => tab.id === id || !(tab.kind === 'designer' && tab.connectionId === subject.connectionId && tab.schema === subject.schema && tab.table === table));
56
+ return update({ ...state, tabs }, id, (tab) => (tab.kind === 'designer' ? { ...tab, table } : tab));
57
+ };
58
+ /* The tab next to the closed one comes forward when the closed one was in front. */
59
+ export const closeTab = (state, id) => {
60
+ const at = state.tabs.findIndex((tab) => tab.id === id);
61
+ if (at < 0) {
62
+ return state;
63
+ }
64
+ const tabs = state.tabs.filter((tab) => tab.id !== id);
65
+ return { ...state, tabs, activeId: state.activeId === id ? (tabs[Math.min(at, tabs.length - 1)]?.id ?? null) : state.activeId };
66
+ };
67
+ /* Drops the tabs of connections that are gone. */
68
+ export const pruneTabs = (state, connectionIds) => {
69
+ const tabs = state.tabs.filter((tab) => connectionIds.has(connectionIdOf(tab)));
70
+ if (tabs.length === state.tabs.length) {
71
+ return state;
72
+ }
73
+ return { ...state, tabs, activeId: tabs.some((tab) => tab.id === state.activeId) ? state.activeId : (tabs.at(-1)?.id ?? null) };
74
+ };
75
+ export const serializeState = (state) => JSON.stringify({ version: 1, ...state });
76
+ const isText = (value) => typeof value === 'string' && value !== '';
77
+ const isOptionalText = (value) => value === undefined || typeof value === 'string';
78
+ const refOf = (value) => {
79
+ const ref = value;
80
+ return typeof ref === 'object' && ref !== null && isText(ref.connectionId) && isText(ref.schema) && isText(ref.table)
81
+ ? { connectionId: ref.connectionId, schema: ref.schema, table: ref.table }
82
+ : null;
83
+ };
84
+ const tabOf = (value) => {
85
+ const raw = value;
86
+ if (typeof raw !== 'object' || raw === null || !isText(raw.id)) {
87
+ return null;
88
+ }
89
+ const id = raw.id;
90
+ switch (raw.kind) {
91
+ case 'table': {
92
+ const ref = refOf(raw.ref);
93
+ const view = raw.view === 'structure' ? 'structure' : 'data';
94
+ return ref === null || !isOptionalText(raw.where) ? null : { id, kind: 'table', ref, view, where: raw.where };
95
+ }
96
+ case 'console':
97
+ return isText(raw.connectionId) && isOptionalText(raw.schema) && typeof raw.sql === 'string' && typeof raw.number === 'number'
98
+ ? { id, kind: 'console', connectionId: raw.connectionId, schema: raw.schema, sql: raw.sql, number: raw.number }
99
+ : null;
100
+ case 'designer':
101
+ return isText(raw.connectionId) && isText(raw.schema) && isOptionalText(raw.table)
102
+ ? { id, kind: 'designer', connectionId: raw.connectionId, schema: raw.schema, table: raw.table }
103
+ : null;
104
+ default:
105
+ return null;
106
+ }
107
+ };
108
+ /* What a past run stored, or an empty workbench for anything that is missing or not ours. A tab that is not valid is left out, the rest stays. */
109
+ export const parseState = (raw) => {
110
+ if (raw === null) {
111
+ return emptyState;
112
+ }
113
+ let data;
114
+ try {
115
+ data = JSON.parse(raw);
116
+ }
117
+ catch {
118
+ return emptyState;
119
+ }
120
+ if (typeof data !== 'object' || data === null || data.version !== 1 || !Array.isArray(data.tabs)) {
121
+ return emptyState;
122
+ }
123
+ const seen = new Set();
124
+ const tabs = data.tabs.map(tabOf).filter((tab) => {
125
+ if (tab === null || seen.has(tab.id)) {
126
+ return false;
127
+ }
128
+ seen.add(tab.id);
129
+ return true;
130
+ });
131
+ const activeId = typeof data.activeId === 'string' && seen.has(data.activeId) ? data.activeId : (tabs.at(-1)?.id ?? null);
132
+ const counter = (value) => (typeof value === 'number' && Number.isFinite(value) && value >= 0 ? Math.floor(value) : 0);
133
+ return {
134
+ tabs,
135
+ activeId,
136
+ serial: Math.max(counter(data.serial), ...tabs.map((tab) => Number(/^(?:filtered|console|designer):(\d+)$/.exec(tab.id)?.[1] ?? 0))),
137
+ consoles: Math.max(counter(data.consoles), ...tabs.map((tab) => (tab.kind === 'console' ? tab.number : 0)))
138
+ };
139
+ };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@adecore/database",
3
- "version": "0.0.1",
4
- "description": "Placeholder that reserves the name for trusted publishing. The first real version follows from the release workflow.",
3
+ "version": "0.16.0-beta.0",
4
+ "description": "Browse, query and edit SQLite and MySQL databases: React views for the page, a host for the backend and a native helper that talks to the server.",
5
5
  "license": "MIT",
6
6
  "author": "Bas Milius",
7
7
  "repository": {
@@ -9,6 +9,82 @@
9
9
  "url": "git+https://github.com/basmilius/adecore.git",
10
10
  "directory": "packages/database"
11
11
  },
12
+ "bugs": {
13
+ "url": "https://github.com/basmilius/adecore/issues"
14
+ },
12
15
  "homepage": "https://adecore.dev/database/",
13
- "files": ["README.md"]
16
+ "type": "module",
17
+ "sideEffects": false,
18
+ "files": [
19
+ "dist",
20
+ "src",
21
+ "!src/**/*.test.ts",
22
+ "!src/**/*.test.tsx",
23
+ "!src/**/__snapshots__",
24
+ "!src/testing/stub.ts",
25
+ "!src/testing/dom"
26
+ ],
27
+ "exports": {
28
+ ".": {
29
+ "source": "./src/index.ts",
30
+ "types": "./dist/index.d.ts",
31
+ "default": "./dist/index.js"
32
+ },
33
+ "./protocol": {
34
+ "source": "./src/protocol/index.ts",
35
+ "types": "./dist/protocol/index.d.ts",
36
+ "default": "./dist/protocol/index.js"
37
+ },
38
+ "./host": {
39
+ "source": "./src/host/index.ts",
40
+ "types": "./dist/host/index.d.ts",
41
+ "default": "./dist/host/index.js"
42
+ },
43
+ "./testing": {
44
+ "source": "./src/testing/index.ts",
45
+ "types": "./dist/testing/index.d.ts",
46
+ "default": "./dist/testing/index.js"
47
+ }
48
+ },
49
+ "scripts": {
50
+ "build": "bun scripts/build.ts",
51
+ "typecheck": "tsc --noEmit",
52
+ "test": "bun test",
53
+ "test:dom": "bun test --preload ./src/testing/dom/preload.ts interaction",
54
+ "helper:build": "cargo build --release --locked --manifest-path helper/Cargo.toml",
55
+ "helper:check": "cargo fmt --manifest-path helper/Cargo.toml --check && cargo clippy --locked --manifest-path helper/Cargo.toml --all-targets -- -D warnings",
56
+ "helper:test": "cargo test --locked --manifest-path helper/Cargo.toml"
57
+ },
58
+ "dependencies": {
59
+ "@base-ui-components/react": "^1.0.0-rc.0",
60
+ "clsx": "^2.1.1",
61
+ "lucide-react": "^1.47.0"
62
+ },
63
+ "optionalDependencies": {
64
+ "@adecore/database-darwin-arm64": "0.16.0-beta.0",
65
+ "@adecore/database-linux-arm64": "0.16.0-beta.0",
66
+ "@adecore/database-linux-x64": "0.16.0-beta.0",
67
+ "@adecore/database-win32-x64": "0.16.0-beta.0"
68
+ },
69
+ "peerDependencies": {
70
+ "@adecore/ui": "^0.16.0-beta.0",
71
+ "i18next": "^26.4.2",
72
+ "react": "^19.3.0",
73
+ "react-dom": "^19.3.0",
74
+ "react-i18next": "^17.0.15"
75
+ },
76
+ "devDependencies": {
77
+ "@adecore/ui": "workspace:*",
78
+ "@happy-dom/global-registrator": "^20.14.5",
79
+ "@types/bun": "^1.4.2",
80
+ "@types/node": "^24.13.6",
81
+ "@types/react": "^19.3.0",
82
+ "@types/react-dom": "^19.3.0",
83
+ "i18next": "^26.4.2",
84
+ "oxc-parser": "^0.151.0",
85
+ "react": "^19.3.0",
86
+ "react-dom": "^19.3.0",
87
+ "react-i18next": "^17.0.15",
88
+ "typescript": "^7.0.2"
89
+ }
14
90
  }
@@ -0,0 +1,37 @@
1
+ import { useMemo, useState, type ReactNode } from 'react';
2
+ import { useTranslation } from 'react-i18next';
3
+ import type { DatabaseAction, DatabaseFiles, DatabaseStorage } from './actions.ts';
4
+ import type { DatabaseClient } from './client/types.ts';
5
+ import { DatabaseContext } from './client-context.ts';
6
+ import type { NumberNotation } from './grid/display.ts';
7
+ import { addDatabaseResources } from './locales.ts';
8
+
9
+ export interface DatabaseProviderProps {
10
+ client: DatabaseClient;
11
+ /* Where a table, a console or the designer a view asks for opens. Without it the views offer none of those. */
12
+ onAction?(action: DatabaseAction): void;
13
+ storage?: DatabaseStorage;
14
+ files?: DatabaseFiles;
15
+ /*
16
+ * How cells show integers, decimals and floats. `'database'` draws them as the server wrote them, which is what a
17
+ * database tool is read for; `'region'` draws them in the number format of `@adecore/ui`'s format source.
18
+ * Editing, copying, filters, export and everything sent to the server keep the server's text either way.
19
+ */
20
+ numberNotation?: NumberNotation;
21
+ children: ReactNode;
22
+ }
23
+
24
+ /* Hands every view below it the client and the app's hooks, and adds the package's words to the i18next the app's `UIProvider` was given. Mount it inside that provider. */
25
+ export function DatabaseProvider({ client, onAction, storage, files, numberNotation = 'database', children }: DatabaseProviderProps) {
26
+ const { i18n } = useTranslation();
27
+ const [added, setAdded] = useState<typeof i18n | null>(null);
28
+ // In render, as `UIProvider` does, so the first view already reads its words.
29
+ if (added !== i18n) {
30
+ addDatabaseResources(i18n);
31
+ setAdded(i18n);
32
+ }
33
+
34
+ const value = useMemo(() => ({ client, onAction, storage, files, numberNotation }), [client, onAction, storage, files, numberNotation]);
35
+
36
+ return <DatabaseContext value={value}>{children}</DatabaseContext>;
37
+ }
package/src/actions.ts ADDED
@@ -0,0 +1,34 @@
1
+ import type { TableRef } from './client/types.ts';
2
+
3
+ /*
4
+ * Something a view asks the app to open. The views draw no tabs and no windows of their own: the app
5
+ * decides where a table, a console or the designer lands, such as a tab beside its file tabs.
6
+ */
7
+ export type DatabaseAction =
8
+ /* `where` opens the table filtered, as a jump along a foreign key does. */
9
+ | { readonly kind: 'open-table'; readonly ref: TableRef; readonly view: 'data' | 'structure'; readonly where?: string }
10
+ | { readonly kind: 'open-console'; readonly connectionId: string; readonly schema?: string; readonly sql?: string }
11
+ | { readonly kind: 'new-table'; readonly connectionId: string; readonly schema: string }
12
+ | { readonly kind: 'edit-table'; readonly ref: TableRef }
13
+ /* The app opens its connection manager on this connection. */
14
+ | { readonly kind: 'manage-connection'; readonly connectionId: string };
15
+
16
+ /* What is selected in the explorer: a connection, a schema in it, or a table in that schema. */
17
+ export interface ExplorerSelection {
18
+ readonly connectionId: string;
19
+ readonly schema?: string;
20
+ readonly table?: string;
21
+ }
22
+
23
+ /* Where the views keep what a person set (console history, column widths, filters) across a remount. Synchronous, like `localStorage`. */
24
+ export interface DatabaseStorage {
25
+ get(key: string): string | null;
26
+ /* `null` removes the key. */
27
+ set(key: string, value: string | null): void;
28
+ }
29
+
30
+ /* The app's file dialogs, for export and import. Each resolves the chosen absolute path, or `null` when the person cancelled. */
31
+ export interface DatabaseFiles {
32
+ save(options: { readonly suggestedName: string; readonly format: 'csv' | 'tsv' | 'json' | 'sql' }): Promise<string | null>;
33
+ open(options: { readonly formats: readonly ('csv' | 'tsv')[] }): Promise<string | null>;
34
+ }