@rebasepro/studio 0.0.1-canary.09e5ec5

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 (361) hide show
  1. package/LICENSE +114 -0
  2. package/README.md +159 -0
  3. package/dist/ApiExplorer-gMJt5JrS.js +1053 -0
  4. package/dist/ApiExplorer-gMJt5JrS.js.map +1 -0
  5. package/dist/AuthSimulationSelector-BF4rkRGp.js +118 -0
  6. package/dist/AuthSimulationSelector-BF4rkRGp.js.map +1 -0
  7. package/dist/BranchesView-DcHZtvXo.js +292 -0
  8. package/dist/BranchesView-DcHZtvXo.js.map +1 -0
  9. package/dist/CronJobsView-CijCToeK.js +456 -0
  10. package/dist/CronJobsView-CijCToeK.js.map +1 -0
  11. package/dist/JSEditor-D8nVp3Lp.js +1308 -0
  12. package/dist/JSEditor-D8nVp3Lp.js.map +1 -0
  13. package/dist/MonacoEditor-CMYEjiRf.js +161 -0
  14. package/dist/MonacoEditor-CMYEjiRf.js.map +1 -0
  15. package/dist/RLSEditor-DBH09u9v.js +1831 -0
  16. package/dist/RLSEditor-DBH09u9v.js.map +1 -0
  17. package/dist/SQLEditor-CkVx9vgr.js +1792 -0
  18. package/dist/SQLEditor-CkVx9vgr.js.map +1 -0
  19. package/dist/SchemaVisualizer-BgD5Zb77.js +1069 -0
  20. package/dist/SchemaVisualizer-BgD5Zb77.js.map +1 -0
  21. package/dist/StorageView-CTqGFhY9.js +907 -0
  22. package/dist/StorageView-CTqGFhY9.js.map +1 -0
  23. package/dist/common/src/collections/CollectionRegistry.d.ts +56 -0
  24. package/dist/common/src/collections/index.d.ts +1 -0
  25. package/dist/common/src/data/buildRebaseData.d.ts +14 -0
  26. package/dist/common/src/index.d.ts +3 -0
  27. package/dist/common/src/util/builders.d.ts +57 -0
  28. package/dist/common/src/util/callbacks.d.ts +6 -0
  29. package/dist/common/src/util/collections.d.ts +11 -0
  30. package/dist/common/src/util/common.d.ts +2 -0
  31. package/dist/common/src/util/conditions.d.ts +26 -0
  32. package/dist/common/src/util/entities.d.ts +58 -0
  33. package/dist/common/src/util/enums.d.ts +3 -0
  34. package/dist/common/src/util/index.d.ts +16 -0
  35. package/dist/common/src/util/navigation_from_path.d.ts +34 -0
  36. package/dist/common/src/util/navigation_utils.d.ts +20 -0
  37. package/dist/common/src/util/parent_references_from_path.d.ts +6 -0
  38. package/dist/common/src/util/paths.d.ts +14 -0
  39. package/dist/common/src/util/permissions.d.ts +5 -0
  40. package/dist/common/src/util/references.d.ts +2 -0
  41. package/dist/common/src/util/relations.d.ts +22 -0
  42. package/dist/common/src/util/resolutions.d.ts +72 -0
  43. package/dist/common/src/util/storage.d.ts +24 -0
  44. package/dist/core/src/components/AIIcon.d.ts +16 -0
  45. package/dist/core/src/components/ConfirmationDialog.d.ts +9 -0
  46. package/dist/core/src/components/Debug/UIReferenceView.d.ts +1 -0
  47. package/dist/core/src/components/Debug/UIStyleGuide.d.ts +1 -0
  48. package/dist/core/src/components/ErrorTooltip.d.ts +2 -0
  49. package/dist/core/src/components/ErrorView.d.ts +21 -0
  50. package/dist/core/src/components/LanguageToggle.d.ts +1 -0
  51. package/dist/core/src/components/LoginView/LoginView.d.ts +68 -0
  52. package/dist/core/src/components/LoginView/index.d.ts +2 -0
  53. package/dist/core/src/components/NotFoundPage.d.ts +1 -0
  54. package/dist/core/src/components/RebaseAuth.d.ts +10 -0
  55. package/dist/core/src/components/RebaseLogo.d.ts +7 -0
  56. package/dist/core/src/components/UnsavedChangesDialog.d.ts +9 -0
  57. package/dist/core/src/components/UserDisplay.d.ts +7 -0
  58. package/dist/core/src/components/UserSelectPopover.d.ts +62 -0
  59. package/dist/core/src/components/UserSettingsView.d.ts +1 -0
  60. package/dist/core/src/components/common/index.d.ts +6 -0
  61. package/dist/core/src/components/common/table_height.d.ts +5 -0
  62. package/dist/core/src/components/common/types.d.ts +63 -0
  63. package/dist/core/src/components/common/useColumnsIds.d.ts +9 -0
  64. package/dist/core/src/components/common/useDataTableController.d.ts +45 -0
  65. package/dist/core/src/components/common/useDebouncedData.d.ts +9 -0
  66. package/dist/core/src/components/common/useScrollRestoration.d.ts +14 -0
  67. package/dist/core/src/components/index.d.ts +16 -0
  68. package/dist/core/src/contexts/AdminModeController.d.ts +4 -0
  69. package/dist/core/src/contexts/AnalyticsContext.d.ts +3 -0
  70. package/dist/core/src/contexts/AuthControllerContext.d.ts +3 -0
  71. package/dist/core/src/contexts/CustomizationControllerContext.d.ts +3 -0
  72. package/dist/core/src/contexts/DataDriverContext.d.ts +3 -0
  73. package/dist/core/src/contexts/DatabaseAdminContext.d.ts +3 -0
  74. package/dist/core/src/contexts/DialogsProvider.d.ts +4 -0
  75. package/dist/core/src/contexts/EffectiveRoleController.d.ts +4 -0
  76. package/dist/core/src/contexts/InternalUserManagementContext.d.ts +3 -0
  77. package/dist/core/src/contexts/ModeController.d.ts +4 -0
  78. package/dist/core/src/contexts/RebaseClientInstanceContext.d.ts +6 -0
  79. package/dist/core/src/contexts/RebaseDataContext.d.ts +3 -0
  80. package/dist/core/src/contexts/SnackbarProvider.d.ts +2 -0
  81. package/dist/core/src/contexts/StorageSourceContext.d.ts +3 -0
  82. package/dist/core/src/contexts/UserConfigurationPersistenceContext.d.ts +3 -0
  83. package/dist/core/src/contexts/index.d.ts +13 -0
  84. package/dist/core/src/core/PluginLifecycleManager.d.ts +17 -0
  85. package/dist/core/src/core/PluginProviderStack.d.ts +21 -0
  86. package/dist/core/src/core/Rebase.d.ts +14 -0
  87. package/dist/core/src/core/RebaseProps.d.ts +136 -0
  88. package/dist/core/src/core/RebaseRouter.d.ts +4 -0
  89. package/dist/core/src/core/RebaseRoutes.d.ts +17 -0
  90. package/dist/core/src/core/index.d.ts +4 -0
  91. package/dist/core/src/hooks/ApiConfigContext.d.ts +24 -0
  92. package/dist/core/src/hooks/data/delete.d.ts +31 -0
  93. package/dist/core/src/hooks/data/save.d.ts +34 -0
  94. package/dist/core/src/hooks/data/useCollectionFetch.d.ts +51 -0
  95. package/dist/core/src/hooks/data/useData.d.ts +13 -0
  96. package/dist/core/src/hooks/data/useDataOrder.d.ts +12 -0
  97. package/dist/core/src/hooks/data/useEntityFetch.d.ts +38 -0
  98. package/dist/core/src/hooks/data/useRelationSelector.d.ts +52 -0
  99. package/dist/core/src/hooks/data/useUserSelector.d.ts +31 -0
  100. package/dist/core/src/hooks/index.d.ts +37 -0
  101. package/dist/core/src/hooks/useAdminModeController.d.ts +19 -0
  102. package/dist/core/src/hooks/useAnalyticsController.d.ts +5 -0
  103. package/dist/core/src/hooks/useAuthController.d.ts +11 -0
  104. package/dist/core/src/hooks/useAuthSubscription.d.ts +2 -0
  105. package/dist/core/src/hooks/useBackendStorageSource.d.ts +30 -0
  106. package/dist/core/src/hooks/useBridgeRegistration.d.ts +18 -0
  107. package/dist/core/src/hooks/useBrowserTitleAndIcon.d.ts +6 -0
  108. package/dist/core/src/hooks/useBuildAdminModeController.d.ts +6 -0
  109. package/dist/core/src/hooks/useBuildEffectiveRoleController.d.ts +8 -0
  110. package/dist/core/src/hooks/useBuildLocalConfigurationPersistence.d.ts +2 -0
  111. package/dist/core/src/hooks/useBuildModeController.d.ts +6 -0
  112. package/dist/core/src/hooks/useClipboard.d.ts +57 -0
  113. package/dist/core/src/hooks/useCollapsedGroups.d.ts +12 -0
  114. package/dist/core/src/hooks/useCustomizationController.d.ts +11 -0
  115. package/dist/core/src/hooks/useDialogsController.d.ts +11 -0
  116. package/dist/core/src/hooks/useEffectiveRoleController.d.ts +7 -0
  117. package/dist/core/src/hooks/useInternalUserManagementController.d.ts +12 -0
  118. package/dist/core/src/hooks/useLargeLayout.d.ts +1 -0
  119. package/dist/core/src/hooks/useModeController.d.ts +19 -0
  120. package/dist/core/src/hooks/usePermissions.d.ts +12 -0
  121. package/dist/core/src/hooks/useRebaseClient.d.ts +5 -0
  122. package/dist/core/src/hooks/useRebaseContext.d.ts +11 -0
  123. package/dist/core/src/hooks/useRebaseRegistry.d.ts +34 -0
  124. package/dist/core/src/hooks/useSlot.d.ts +18 -0
  125. package/dist/core/src/hooks/useSnackbarController.d.ts +20 -0
  126. package/dist/core/src/hooks/useStorageSource.d.ts +7 -0
  127. package/dist/core/src/hooks/useStudioBridge.d.ts +91 -0
  128. package/dist/core/src/hooks/useTranslation.d.ts +17 -0
  129. package/dist/core/src/hooks/useUnsavedChangesDialog.d.ts +12 -0
  130. package/dist/core/src/hooks/useUserConfigurationPersistence.d.ts +8 -0
  131. package/dist/core/src/hooks/useValidateAuthenticator.d.ts +21 -0
  132. package/dist/core/src/i18n/RebaseI18nProvider.d.ts +33 -0
  133. package/dist/core/src/index.d.ts +15 -0
  134. package/dist/core/src/internal/common.d.ts +3 -0
  135. package/dist/core/src/internal/useRestoreScroll.d.ts +6 -0
  136. package/dist/core/src/locales/de.d.ts +2 -0
  137. package/dist/core/src/locales/en.d.ts +10 -0
  138. package/dist/core/src/locales/es.d.ts +10 -0
  139. package/dist/core/src/locales/fr.d.ts +2 -0
  140. package/dist/core/src/locales/hi.d.ts +2 -0
  141. package/dist/core/src/locales/it.d.ts +2 -0
  142. package/dist/core/src/locales/pt.d.ts +7 -0
  143. package/dist/core/src/util/constants.d.ts +1 -0
  144. package/dist/core/src/util/createFormexStub.d.ts +2 -0
  145. package/dist/core/src/util/entity_cache.d.ts +27 -0
  146. package/dist/core/src/util/enums.d.ts +5 -0
  147. package/dist/core/src/util/icon_list.d.ts +5 -0
  148. package/dist/core/src/util/icon_synonyms.d.ts +1 -0
  149. package/dist/core/src/util/icons.d.ts +20 -0
  150. package/dist/core/src/util/index.d.ts +10 -0
  151. package/dist/core/src/util/previews.d.ts +4 -0
  152. package/dist/core/src/util/useStorageUploadController.d.ts +38 -0
  153. package/dist/core/src/util/useTraceUpdate.d.ts +2 -0
  154. package/dist/formex/src/Field.d.ts +52 -0
  155. package/dist/formex/src/Formex.d.ts +7 -0
  156. package/dist/formex/src/index.d.ts +5 -0
  157. package/dist/formex/src/types.d.ts +40 -0
  158. package/dist/formex/src/useCreateFormex.d.ts +14 -0
  159. package/dist/formex/src/utils.d.ts +16 -0
  160. package/dist/index.es.js +726 -0
  161. package/dist/index.es.js.map +1 -0
  162. package/dist/index.umd.js +9647 -0
  163. package/dist/index.umd.js.map +1 -0
  164. package/dist/studio/src/components/ApiExplorer/ApiExplorer.d.ts +9 -0
  165. package/dist/studio/src/components/ApiExplorer/EndpointDetail.d.ts +9 -0
  166. package/dist/studio/src/components/ApiExplorer/TryItPanel.d.ts +15 -0
  167. package/dist/studio/src/components/ApiExplorer/parseSpec.d.ts +16 -0
  168. package/dist/studio/src/components/ApiExplorer/types.d.ts +90 -0
  169. package/dist/studio/src/components/AuthSimulationSelector.d.ts +11 -0
  170. package/dist/studio/src/components/Branches/BranchesView.d.ts +1 -0
  171. package/dist/studio/src/components/CronJobs/CronJobsView.d.ts +1 -0
  172. package/dist/studio/src/components/JSEditor/JSEditor.d.ts +1 -0
  173. package/dist/studio/src/components/JSEditor/JSEditorSidebar.d.ts +21 -0
  174. package/dist/studio/src/components/JSEditor/JSMonacoEditor.d.ts +18 -0
  175. package/dist/studio/src/components/RLSEditor/PolicyEditor.d.ts +9 -0
  176. package/dist/studio/src/components/RLSEditor/RLSEditor.d.ts +19 -0
  177. package/dist/studio/src/components/RLSEditor/index.d.ts +1 -0
  178. package/dist/studio/src/components/RebaseStudio.d.ts +2 -0
  179. package/dist/studio/src/components/SQLEditor/ExplainVisualizer.d.ts +24 -0
  180. package/dist/studio/src/components/SQLEditor/MonacoEditor.d.ts +17 -0
  181. package/dist/studio/src/components/SQLEditor/SQLEditor.d.ts +11 -0
  182. package/dist/studio/src/components/SQLEditor/SQLEditorSidebar.d.ts +21 -0
  183. package/dist/studio/src/components/SQLEditor/SchemaBrowser.d.ts +8 -0
  184. package/dist/studio/src/components/SchemaVisualizer/RelationEdge.d.ts +3 -0
  185. package/dist/studio/src/components/SchemaVisualizer/SchemaVisualizer.d.ts +2 -0
  186. package/dist/studio/src/components/SchemaVisualizer/TableNode.d.ts +3 -0
  187. package/dist/studio/src/components/SchemaVisualizer/index.d.ts +5 -0
  188. package/dist/studio/src/components/SchemaVisualizer/schema-visualizer.utils.d.ts +42 -0
  189. package/dist/studio/src/components/SchemaVisualizer/useSchemaGraph.d.ts +37 -0
  190. package/dist/studio/src/components/StorageView/StorageView.d.ts +1 -0
  191. package/dist/studio/src/components/StudioHomePage.d.ts +9 -0
  192. package/dist/studio/src/index.d.ts +4 -0
  193. package/dist/studio/src/utils/entities.d.ts +0 -0
  194. package/dist/studio/src/utils/pgColumnToProperty.d.ts +6 -0
  195. package/dist/studio/src/utils/sql_utils.d.ts +52 -0
  196. package/dist/types/src/controllers/analytics_controller.d.ts +7 -0
  197. package/dist/types/src/controllers/auth.d.ts +119 -0
  198. package/dist/types/src/controllers/client.d.ts +170 -0
  199. package/dist/types/src/controllers/collection_registry.d.ts +45 -0
  200. package/dist/types/src/controllers/customization_controller.d.ts +60 -0
  201. package/dist/types/src/controllers/data.d.ts +168 -0
  202. package/dist/types/src/controllers/data_driver.d.ts +160 -0
  203. package/dist/types/src/controllers/database_admin.d.ts +11 -0
  204. package/dist/types/src/controllers/dialogs_controller.d.ts +36 -0
  205. package/dist/types/src/controllers/effective_role.d.ts +4 -0
  206. package/dist/types/src/controllers/email.d.ts +34 -0
  207. package/dist/types/src/controllers/index.d.ts +18 -0
  208. package/dist/types/src/controllers/local_config_persistence.d.ts +20 -0
  209. package/dist/types/src/controllers/navigation.d.ts +213 -0
  210. package/dist/types/src/controllers/registry.d.ts +54 -0
  211. package/dist/types/src/controllers/side_dialogs_controller.d.ts +67 -0
  212. package/dist/types/src/controllers/side_entity_controller.d.ts +90 -0
  213. package/dist/types/src/controllers/snackbar.d.ts +24 -0
  214. package/dist/types/src/controllers/storage.d.ts +171 -0
  215. package/dist/types/src/index.d.ts +4 -0
  216. package/dist/types/src/rebase_context.d.ts +105 -0
  217. package/dist/types/src/types/backend.d.ts +536 -0
  218. package/dist/types/src/types/builders.d.ts +15 -0
  219. package/dist/types/src/types/chips.d.ts +5 -0
  220. package/dist/types/src/types/collections.d.ts +856 -0
  221. package/dist/types/src/types/cron.d.ts +102 -0
  222. package/dist/types/src/types/data_source.d.ts +64 -0
  223. package/dist/types/src/types/entities.d.ts +145 -0
  224. package/dist/types/src/types/entity_actions.d.ts +98 -0
  225. package/dist/types/src/types/entity_callbacks.d.ts +173 -0
  226. package/dist/types/src/types/entity_link_builder.d.ts +7 -0
  227. package/dist/types/src/types/entity_overrides.d.ts +10 -0
  228. package/dist/types/src/types/entity_views.d.ts +61 -0
  229. package/dist/types/src/types/export_import.d.ts +21 -0
  230. package/dist/types/src/types/index.d.ts +23 -0
  231. package/dist/types/src/types/locales.d.ts +4 -0
  232. package/dist/types/src/types/modify_collections.d.ts +5 -0
  233. package/dist/types/src/types/plugins.d.ts +279 -0
  234. package/dist/types/src/types/properties.d.ts +1176 -0
  235. package/dist/types/src/types/property_config.d.ts +70 -0
  236. package/dist/types/src/types/relations.d.ts +336 -0
  237. package/dist/types/src/types/slots.d.ts +252 -0
  238. package/dist/types/src/types/translations.d.ts +870 -0
  239. package/dist/types/src/types/user_management_delegate.d.ts +121 -0
  240. package/dist/types/src/types/websockets.d.ts +78 -0
  241. package/dist/types/src/users/index.d.ts +2 -0
  242. package/dist/types/src/users/roles.d.ts +22 -0
  243. package/dist/types/src/users/user.d.ts +46 -0
  244. package/dist/ui/src/components/Alert.d.ts +12 -0
  245. package/dist/ui/src/components/Autocomplete.d.ts +21 -0
  246. package/dist/ui/src/components/Avatar.d.ts +11 -0
  247. package/dist/ui/src/components/Badge.d.ts +8 -0
  248. package/dist/ui/src/components/BooleanSwitch.d.ts +14 -0
  249. package/dist/ui/src/components/BooleanSwitchWithLabel.d.ts +17 -0
  250. package/dist/ui/src/components/Button.d.ts +14 -0
  251. package/dist/ui/src/components/Card.d.ts +9 -0
  252. package/dist/ui/src/components/CenteredView.d.ts +9 -0
  253. package/dist/ui/src/components/Checkbox.d.ts +13 -0
  254. package/dist/ui/src/components/Chip.d.ts +26 -0
  255. package/dist/ui/src/components/CircularProgress.d.ts +5 -0
  256. package/dist/ui/src/components/CircularProgressCenter.d.ts +11 -0
  257. package/dist/ui/src/components/Collapse.d.ts +9 -0
  258. package/dist/ui/src/components/ColorPicker.d.ts +30 -0
  259. package/dist/ui/src/components/Container.d.ts +8 -0
  260. package/dist/ui/src/components/DateTimeField.d.ts +24 -0
  261. package/dist/ui/src/components/DebouncedTextField.d.ts +2 -0
  262. package/dist/ui/src/components/Dialog.d.ts +39 -0
  263. package/dist/ui/src/components/DialogActions.d.ts +7 -0
  264. package/dist/ui/src/components/DialogContent.d.ts +7 -0
  265. package/dist/ui/src/components/DialogTitle.d.ts +10 -0
  266. package/dist/ui/src/components/ErrorBoundary.d.ts +11 -0
  267. package/dist/ui/src/components/ExpandablePanel.d.ts +12 -0
  268. package/dist/ui/src/components/FileUpload.d.ts +23 -0
  269. package/dist/ui/src/components/IconButton.d.ts +12 -0
  270. package/dist/ui/src/components/InfoLabel.d.ts +5 -0
  271. package/dist/ui/src/components/InputLabel.d.ts +11 -0
  272. package/dist/ui/src/components/Label.d.ts +7 -0
  273. package/dist/ui/src/components/LoadingButton.d.ts +7 -0
  274. package/dist/ui/src/components/Markdown.d.ts +10 -0
  275. package/dist/ui/src/components/Menu.d.ts +23 -0
  276. package/dist/ui/src/components/Menubar.d.ts +80 -0
  277. package/dist/ui/src/components/MultiSelect.d.ts +48 -0
  278. package/dist/ui/src/components/Paper.d.ts +6 -0
  279. package/dist/ui/src/components/Popover.d.ts +24 -0
  280. package/dist/ui/src/components/RadioGroup.d.ts +28 -0
  281. package/dist/ui/src/components/ResizablePanels.d.ts +18 -0
  282. package/dist/ui/src/components/SearchBar.d.ts +22 -0
  283. package/dist/ui/src/components/Select.d.ts +43 -0
  284. package/dist/ui/src/components/Separator.d.ts +5 -0
  285. package/dist/ui/src/components/Sheet.d.ts +22 -0
  286. package/dist/ui/src/components/Skeleton.d.ts +6 -0
  287. package/dist/ui/src/components/Slider.d.ts +21 -0
  288. package/dist/ui/src/components/Table.d.ts +34 -0
  289. package/dist/ui/src/components/Tabs.d.ts +19 -0
  290. package/dist/ui/src/components/TextField.d.ts +58 -0
  291. package/dist/ui/src/components/TextareaAutosize.d.ts +43 -0
  292. package/dist/ui/src/components/ToggleButtonGroup.d.ts +30 -0
  293. package/dist/ui/src/components/Tooltip.d.ts +19 -0
  294. package/dist/ui/src/components/Typography.d.ts +36 -0
  295. package/dist/ui/src/components/VirtualTable/VirtualTable.d.ts +11 -0
  296. package/dist/ui/src/components/VirtualTable/VirtualTableCell.d.ts +21 -0
  297. package/dist/ui/src/components/VirtualTable/VirtualTableHeader.d.ts +29 -0
  298. package/dist/ui/src/components/VirtualTable/VirtualTableHeaderRow.d.ts +2 -0
  299. package/dist/ui/src/components/VirtualTable/VirtualTableProps.d.ts +243 -0
  300. package/dist/ui/src/components/VirtualTable/VirtualTableRow.d.ts +3 -0
  301. package/dist/ui/src/components/VirtualTable/index.d.ts +3 -0
  302. package/dist/ui/src/components/VirtualTable/types.d.ts +38 -0
  303. package/dist/ui/src/components/common/SelectInputLabel.d.ts +5 -0
  304. package/dist/ui/src/components/index.d.ts +53 -0
  305. package/dist/ui/src/hooks/PortalContainerContext.d.ts +31 -0
  306. package/dist/ui/src/hooks/index.d.ts +6 -0
  307. package/dist/ui/src/hooks/useDebounceCallback.d.ts +1 -0
  308. package/dist/ui/src/hooks/useDebounceValue.d.ts +1 -0
  309. package/dist/ui/src/hooks/useDebouncedCallback.d.ts +1 -0
  310. package/dist/ui/src/hooks/useInjectStyles.d.ts +7 -0
  311. package/dist/ui/src/hooks/useOutsideAlerter.d.ts +5 -0
  312. package/dist/ui/src/icons/GitHubIcon.d.ts +2 -0
  313. package/dist/ui/src/icons/HandleIcon.d.ts +1 -0
  314. package/dist/ui/src/icons/Icon.d.ts +20 -0
  315. package/dist/ui/src/icons/cool_icon_keys.d.ts +1 -0
  316. package/dist/ui/src/icons/icon_keys.d.ts +1 -0
  317. package/dist/ui/src/icons/index.d.ts +6 -0
  318. package/dist/ui/src/index.d.ts +5 -0
  319. package/dist/ui/src/styles.d.ts +12 -0
  320. package/dist/ui/src/util/chip_colors.d.ts +4 -0
  321. package/dist/ui/src/util/cls.d.ts +2 -0
  322. package/dist/ui/src/util/debounce.d.ts +10 -0
  323. package/dist/ui/src/util/hash.d.ts +1 -0
  324. package/dist/ui/src/util/index.d.ts +4 -0
  325. package/dist/ui/src/util/key_to_icon_component.d.ts +1 -0
  326. package/package.json +84 -0
  327. package/src/components/ApiExplorer/ApiExplorer.tsx +290 -0
  328. package/src/components/ApiExplorer/EndpointDetail.tsx +271 -0
  329. package/src/components/ApiExplorer/TryItPanel.tsx +510 -0
  330. package/src/components/ApiExplorer/parseSpec.ts +104 -0
  331. package/src/components/ApiExplorer/types.ts +84 -0
  332. package/src/components/AuthSimulationSelector.tsx +77 -0
  333. package/src/components/Branches/BranchesView.tsx +370 -0
  334. package/src/components/CronJobs/CronJobsView.tsx +346 -0
  335. package/src/components/JSEditor/JSEditor.tsx +1033 -0
  336. package/src/components/JSEditor/JSEditorSidebar.tsx +340 -0
  337. package/src/components/JSEditor/JSMonacoEditor.tsx +390 -0
  338. package/src/components/RLSEditor/PolicyEditor.tsx +444 -0
  339. package/src/components/RLSEditor/RLSEditor.tsx +692 -0
  340. package/src/components/RLSEditor/index.ts +1 -0
  341. package/src/components/RebaseStudio.tsx +121 -0
  342. package/src/components/SQLEditor/ExplainVisualizer.tsx +128 -0
  343. package/src/components/SQLEditor/MonacoEditor.tsx +203 -0
  344. package/src/components/SQLEditor/SQLEditor.tsx +1419 -0
  345. package/src/components/SQLEditor/SQLEditorSidebar.tsx +174 -0
  346. package/src/components/SQLEditor/SchemaBrowser.tsx +158 -0
  347. package/src/components/SchemaVisualizer/RelationEdge.tsx +102 -0
  348. package/src/components/SchemaVisualizer/SchemaVisualizer.tsx +665 -0
  349. package/src/components/SchemaVisualizer/TableNode.tsx +257 -0
  350. package/src/components/SchemaVisualizer/index.ts +5 -0
  351. package/src/components/SchemaVisualizer/schema-visualizer.utils.ts +140 -0
  352. package/src/components/SchemaVisualizer/useSchemaGraph.ts +397 -0
  353. package/src/components/StorageView/StorageView.tsx +1035 -0
  354. package/src/components/StudioHomePage.tsx +357 -0
  355. package/src/index.ts +31 -0
  356. package/src/utils/entities.ts +2 -0
  357. package/src/utils/pgColumnToProperty.test.ts +401 -0
  358. package/src/utils/pgColumnToProperty.ts +275 -0
  359. package/src/utils/sql_utils.test.ts +265 -0
  360. package/src/utils/sql_utils.ts +291 -0
  361. package/src/vite-env.d.ts +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SQLEditor-CkVx9vgr.js","sources":["../src/components/SQLEditor/SchemaBrowser.tsx","../src/components/SQLEditor/SQLEditorSidebar.tsx","../src/utils/sql_utils.ts","../src/components/SQLEditor/ExplainVisualizer.tsx","../src/components/SQLEditor/SQLEditor.tsx"],"sourcesContent":["\nimport React, { useState } from \"react\";\nimport { Typography, CircularProgress, cls, IconButton, defaultBorderMixin, Menu, MenuItem, Button , iconSize } from \"@rebasepro/ui\";\nimport { CopyIcon, MoreVerticalIcon, RefreshCwIcon } from \"lucide-react\";\nimport { TableInfo } from \"./SQLEditor\";\nimport { ErrorView, useTranslation } from \"@rebasepro/core\";\n\nexport const SchemaBrowser = ({\n onTableClick,\n schemas,\n isSchemaLoading,\n schemaError,\n onRetrySchema\n}: {\n onTableClick?: (tableName: string) => void,\n schemas: Record<string, TableInfo[]>,\n isSchemaLoading: boolean,\n schemaError: string | null,\n onRetrySchema: () => void\n}) => {\n const [expandedSchemas, setExpandedSchemas] = useState<Record<string, boolean>>({ public: true });\n const [expandedTables, setExpandedTables] = useState<Record<string, boolean>>({});\n const { t } = useTranslation();\n\n if (isSchemaLoading) return <div className=\"p-4 flex justify-center\"><CircularProgress size=\"small\"/></div>;\n if (schemaError) return (\n <div className=\"p-2\">\n <ErrorView error={schemaError} onRetry={onRetrySchema}/>\n </div>\n );\n\n return (\n <div className=\"flex flex-col h-full overflow-hidden\">\n <div className={cls(\"flex items-center justify-between px-3 py-2 border-b bg-surface-50 dark:bg-surface-900 min-h-[48px]\", defaultBorderMixin)}>\n <Typography variant=\"caption\" className=\"font-bold uppercase tracking-wider text-text-disabled dark:text-text-disabled-dark\">{t(\"studio_schema_tables\")}</Typography>\n <IconButton size=\"small\" onClick={onRetrySchema} title=\"Refresh schema\">\n <RefreshCwIcon size={iconSize.smallest}/>\n </IconButton>\n </div>\n\n <div className=\"flex-grow overflow-y-auto no-scrollbar p-1\">\n {Object.keys(schemas).length === 0 ? (\n <div className=\"p-4 text-center\">\n <Typography variant=\"caption\" className=\"text-text-disabled dark:text-text-disabled-dark italic\">{t(\"studio_schema_no_tables\")}</Typography>\n </div>\n ) : Object.entries(schemas).map(([schemaName, tables]) => (\n <div key={schemaName} className=\"mb-2\">\n <div\n className=\"flex items-center p-1 cursor-pointer hover:bg-surface-100 dark:hover:bg-surface-950 rounded transition-colors\"\n onClick={() => setExpandedSchemas(prev => ({ ...prev,\n[schemaName]: !prev[schemaName] }))}\n >\n <svg className={cls(\"w-3 h-3 mr-1 transition-transform\", expandedSchemas[schemaName] ? \"rotate-90\" : \"\")} fill=\"currentColor\" viewBox=\"0 0 20 20\"><path d=\"M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z\"/></svg>\n <Typography variant=\"body2\" className=\"text-text-primary dark:text-text-primary-dark font-medium text-xs truncate flex-grow\">{schemaName}</Typography>\n </div>\n\n {expandedSchemas[schemaName] && (\n <div className=\"ml-3 mt-1 space-y-1\">\n {tables.map(table => (\n <div key={table.tableName}>\n <div\n className=\"flex items-center p-1 cursor-pointer hover:bg-surface-100 dark:hover:bg-surface-950 rounded transition-colors group relative\"\n onClick={() => setExpandedTables(prev => ({ ...prev,\n[`${schemaName}.${table.tableName}`]: !prev[`${schemaName}.${table.tableName}`] }))}\n >\n <svg className={cls(\"w-3 h-3 mr-1 transition-transform shrink-0\", expandedTables[`${schemaName}.${table.tableName}`] ? \"rotate-90\" : \"\")} fill=\"currentColor\" viewBox=\"0 0 20 20\"><path d=\"M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z\"/></svg>\n <svg className=\"w-3.5 h-3.5 mr-1 shrink-0 text-text-disabled dark:text-text-disabled-dark\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 10h18M3 14h18m-9-4v8m-7 0h14a2 2 0 002-2V8a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z\"/></svg>\n <Typography variant=\"body2\" className=\"text-text-secondary dark:text-text-secondary-dark text-xs truncate flex-1 min-w-0\">{table.tableName}</Typography>\n\n <div className=\"flex opacity-0 group-hover:opacity-100 focus-within:opacity-100 absolute right-1 items-center bg-surface-100 dark:bg-surface-950 px-1 gap-1 rounded transition-opacity\">\n <IconButton\n size=\"smallest\"\n className=\"transition-colors text-text-secondary hover:text-text-primary pointer-events-auto\"\n onClick={(e) => {\n e.stopPropagation();\n navigator.clipboard.writeText(table.tableName);\n }}\n title=\"CopyIcon table name\"\n >\n <CopyIcon size={iconSize.smallest}/>\n </IconButton>\n\n <Menu\n trigger={\n <IconButton\n size={\"smallest\"}\n className=\"transition-colors text-text-secondary hover:text-text-primary pointer-events-auto\"\n onClick={(e) => e.stopPropagation()}\n title=\"Generate SQL templates\"\n >\n <MoreVerticalIcon size={iconSize.smallest}/>\n </IconButton>\n }\n >\n <MenuItem dense className=\"text-xs\" onClick={(e: React.MouseEvent) => {\n e.stopPropagation();\n onTableClick?.(`SELECT * FROM ${schemaName !== \"public\" ? `${schemaName}.` : \"\"}${table.tableName} LIMIT 100;`);\n }}>SELECT (Top 100)</MenuItem>\n <MenuItem dense className=\"text-xs\" onClick={(e: React.MouseEvent) => {\n e.stopPropagation();\n onTableClick?.(`SELECT \\n ${table.columns.map(c => c.name).join(\",\\n \")}\\nFROM ${schemaName !== \"public\" ? `${schemaName}.` : \"\"}${table.tableName};`);\n }}>SELECT (All columns)</MenuItem>\n <MenuItem dense className=\"text-xs\" onClick={(e: React.MouseEvent) => {\n e.stopPropagation();\n onTableClick?.(`INSERT INTO ${schemaName !== \"public\" ? `${schemaName}.` : \"\"}${table.tableName} (\\n ${table.columns.map(c => c.name).join(\",\\n \")}\\n) VALUES (\\n ${table.columns.map(() => \"?\").join(\",\\n \")}\\n);`);\n }}>INSERT statement</MenuItem>\n <MenuItem dense className=\"text-xs\" onClick={(e: React.MouseEvent) => {\n e.stopPropagation();\n onTableClick?.(`UPDATE ${schemaName !== \"public\" ? `${schemaName}.` : \"\"}${table.tableName} \\nSET \\n ${table.columns.map(c => `${c.name} = ?`).join(\",\\n \")}\\nWHERE id = ?;`);\n }}>UPDATE statement</MenuItem>\n </Menu>\n\n <Button\n variant=\"text\"\n size=\"small\"\n className=\"text-[10px] text-primary uppercase min-h-0 py-0.5 px-1 font-medium ml-1 flex-shrink-0 leading-none h-[22px]\"\n onClick={(e) => {\n e.stopPropagation();\n onTableClick?.(`SELECT * FROM ${schemaName !== \"public\" ? `${schemaName}.` : \"\"}${table.tableName} LIMIT 100;`);\n }}\n >\n SELECT\n </Button>\n </div>\n </div>\n\n {expandedTables[`${schemaName}.${table.tableName}`] && (\n <div className={cls(\"ml-5 mt-1 space-y-0.5 border-l\", defaultBorderMixin)}>\n {table.columns.map(col => (\n <div key={col.name} className=\"flex items-center p-1 group pl-2 hover:bg-surface-50 dark:hover:bg-surface-950 rounded-r relative min-h-[28px]\">\n <svg className=\"w-3 h-3 mr-1.5 text-text-disabled dark:text-text-disabled-dark shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M9 4.5v15m6-15v15m-10.5-1.5h15c.621 0 1.125-.504 1.125-1.125V5.625c0-.621-.504-1.125-1.125-1.125h-15c-.621 0-1.125.504-1.125 1.125v12.75c0 .621.504 1.125 1.125 1.125Z\"/></svg>\n <Typography variant=\"caption\" className=\"text-text-primary dark:text-text-primary-dark text-[11px] truncate flex-grow mr-2\">{col.name}</Typography>\n <Typography variant=\"caption\" className=\"text-text-disabled dark:text-text-disabled-dark text-[9px] truncate mr-1 uppercase shrink-0\" title={col.dataType}>{col.dataType}</Typography>\n <IconButton\n size=\"smallest\"\n className=\"opacity-0 group-hover:opacity-100 absolute right-1 bg-surface-50 dark:bg-surface-950 transition-colors pointer-events-auto\"\n onClick={(e) => {\n e.stopPropagation();\n navigator.clipboard.writeText(col.name);\n }}\n title=\"CopyIcon column name\"\n >\n <CopyIcon size={iconSize.smallest}/>\n </IconButton>\n </div>\n ))}\n </div>\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n ))}\n </div>\n </div>\n );\n};\n","\nimport React, { useState } from \"react\";\nimport { Typography, cls, defaultBorderMixin, Tabs, Tab, IconButton , iconSize } from \"@rebasepro/ui\";\nimport { Trash2Icon } from \"lucide-react\";\nimport { useTranslation } from \"@rebasepro/core\";\nimport { SchemaBrowser } from \"./SchemaBrowser\";\nimport { TableInfo } from \"./SQLEditor\";\n\nexport interface Snippet {\n id: string;\n name: string;\n sql: string;\n createdAt: number;\n isFavorite?: boolean;\n}\n\ninterface SQLEditorSidebarProps {\n onSelectSnippet: (sql: string) => void;\n onTableClick: (tableName: string) => void;\n snippets: Snippet[];\n history: string[];\n onDeleteSnippet: (id: string) => void;\n schemas: Record<string, TableInfo[]>;\n isSchemaLoading: boolean;\n schemaError: string | null;\n onRetrySchema: () => void;\n}\n\nexport const SQLEditorSidebar = ({\n onSelectSnippet,\n onTableClick,\n snippets,\n history,\n onDeleteSnippet,\n schemas,\n isSchemaLoading,\n schemaError,\n onRetrySchema\n}: SQLEditorSidebarProps) => {\n const [activeTab, setActiveTab] = useState<\"schema\" | \"snippets\" | \"history\">(\"schema\");\n const { t } = useTranslation();\n\n return (\n <div className={cls(\"flex flex-col h-full w-full bg-white dark:bg-surface-950 border-r\", defaultBorderMixin)}>\n <Tabs value={activeTab} onValueChange={(v) => setActiveTab(v as \"schema\" | \"snippets\" | \"history\")} variant=\"boxy\" className=\"border-b border-surface-200 dark:border-surface-950\">\n <Tab value=\"schema\">{t(\"studio_sql_sidebar_schema\")}</Tab>\n <Tab value=\"snippets\">{t(\"studio_sql_sidebar_snippets\")}</Tab>\n <Tab value=\"history\">{t(\"studio_sql_sidebar_history\")}</Tab>\n </Tabs>\n\n <div className=\"flex-grow overflow-hidden relative\">\n {activeTab === \"schema\" && (\n <SchemaBrowser\n onTableClick={onTableClick}\n schemas={schemas}\n isSchemaLoading={isSchemaLoading}\n schemaError={schemaError}\n onRetrySchema={onRetrySchema}\n />\n )}\n\n {activeTab === \"snippets\" && (() => {\n const favorites = snippets.filter(s => s.isFavorite);\n const others = snippets.filter(s => !s.isFavorite);\n\n return (\n <div className=\"flex flex-col h-full\">\n <div className={cls(\"flex items-center justify-between px-3 py-2 border-b bg-surface-50 dark:bg-surface-900 min-h-[48px]\", defaultBorderMixin)}>\n <Typography variant=\"caption\" className=\"font-bold uppercase tracking-wider text-text-disabled dark:text-text-disabled-dark\">{t(\"studio_sql_sidebar_snippets\")}</Typography>\n </div>\n <div className=\"flex-grow overflow-y-auto p-2 space-y-2 no-scrollbar\">\n {snippets.length === 0 ? (\n <div className=\"p-4 text-center\">\n <Typography variant=\"caption\" className=\"text-text-disabled dark:text-text-disabled-dark\">{t(\"studio_sql_sidebar_no_snippets\")}</Typography>\n </div>\n ) : (\n <>\n {favorites.length > 0 && (\n <div className=\"mb-4\">\n <Typography variant=\"caption\" className=\"text-[10px] font-bold uppercase tracking-wider text-text-disabled dark:text-text-disabled-dark mb-2 px-1 flex items-center\">\n <svg className=\"w-3 h-3 mr-1 text-red-500\" fill=\"currentColor\" viewBox=\"0 0 20 20\"><path fillRule=\"evenodd\" d=\"M3.172 5.172a4 4 0 015.656 0L10 6.343l1.172-1.171a4 4 0 115.656 5.656L10 17.657l-6.828-6.829a4 4 0 010-5.656z\" clipRule=\"evenodd\"/></svg>\n Favorites\n </Typography>\n <div className=\"space-y-2\">\n {favorites.map(snippet => (\n <div\n key={snippet.id}\n className={cls(\"group p-2 rounded border hover:border-surface-400 dark:hover:border-surface-600 bg-white dark:bg-surface-900 transition-all cursor-pointer relative\", defaultBorderMixin)}\n onClick={() => onSelectSnippet(snippet.sql)}\n >\n <Typography variant=\"body2\" className=\"text-text-primary dark:text-text-primary-dark font-medium text-[13px] truncate pr-6\">{snippet.name}</Typography>\n <Typography variant=\"caption\" className=\"text-text-secondary dark:text-text-secondary-dark text-[10px] block mt-1 truncate\">{snippet.sql}</Typography>\n <IconButton\n size=\"smallest\"\n className=\"absolute right-1 top-1 opacity-0 group-hover:opacity-100 text-text-disabled hover:text-red-500 transition-opacity\"\n onClick={(e) => {\n e.stopPropagation();\n onDeleteSnippet(snippet.id);\n }}\n >\n <Trash2Icon size={iconSize.smallest}/>\n </IconButton>\n </div>\n ))}\n </div>\n </div>\n )}\n {others.length > 0 && (\n <div>\n {favorites.length > 0 && (\n <Typography variant=\"caption\" className=\"text-[10px] font-bold uppercase tracking-wider text-text-disabled dark:text-text-disabled-dark mb-2 px-1 mt-4\">\n Others\n </Typography>\n )}\n <div className=\"space-y-2\">\n {others.map(snippet => (\n <div\n key={snippet.id}\n className={cls(\"group p-2 rounded border hover:border-surface-400 dark:hover:border-surface-600 bg-white dark:bg-surface-900 transition-all cursor-pointer relative\", defaultBorderMixin)}\n onClick={() => onSelectSnippet(snippet.sql)}\n >\n <Typography variant=\"body2\" className=\"text-text-primary dark:text-text-primary-dark font-medium text-[13px] truncate pr-6\">{snippet.name}</Typography>\n <Typography variant=\"caption\" className=\"text-text-secondary dark:text-text-secondary-dark text-[10px] block mt-1 truncate\">{snippet.sql}</Typography>\n <IconButton\n size=\"smallest\"\n className=\"absolute right-1 top-1 opacity-0 group-hover:opacity-100 text-text-disabled hover:text-red-500 transition-opacity\"\n onClick={(e) => {\n e.stopPropagation();\n onDeleteSnippet(snippet.id);\n }}\n >\n <Trash2Icon size={iconSize.smallest}/>\n </IconButton>\n </div>\n ))}\n </div>\n </div>\n )}\n </>\n )}\n </div>\n </div>\n );\n })()}\n\n {activeTab === \"history\" && (\n <div className=\"flex flex-col h-full\">\n <div className={cls(\"flex items-center justify-between px-3 py-2 border-b bg-surface-50 dark:bg-surface-900 min-h-[48px]\", defaultBorderMixin)}>\n <Typography variant=\"caption\" className=\"font-bold uppercase tracking-wider text-text-disabled dark:text-text-disabled-dark\">{t(\"studio_sql_sidebar_history\")}</Typography>\n </div>\n <div className=\"flex-grow overflow-y-auto p-1 space-y-1 no-scrollbar\">\n {history.length === 0 ? (\n <div className=\"p-4 text-center\">\n <Typography variant=\"caption\" className=\"text-text-disabled dark:text-text-disabled-dark\">{t(\"studio_sql_sidebar_no_history\")}</Typography>\n </div>\n ) : (\n [...history].reverse().map((sql, i) => (\n <div\n key={i}\n className=\"p-2 py-1.5 rounded hover:bg-surface-100 dark:hover:bg-surface-950 cursor-pointer group transition-colors flex items-start\"\n onClick={() => onSelectSnippet(sql)}\n >\n <svg className=\"w-3 h-3 mt-1 mr-2 text-text-disabled dark:text-text-disabled-dark group-hover:text-primary transition-colors flex-shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z\"/></svg>\n <Typography variant=\"caption\" className=\"text-text-secondary dark:text-text-secondary-dark group-hover:text-text-primary dark:group-hover:text-text-primary-dark text-[11px] line-clamp-2 leading-tight flex-grow\">{sql}</Typography>\n </div>\n ))\n )}\n </div>\n </div>\n )}\n </div>\n </div>\n );\n};\n","import { parseFirst } from \"pgsql-ast-parser\";\nimport { TableInfo } from \"../components/SQLEditor/SQLEditor\";\nimport { EntityCollection } from \"@rebasepro/types\";\n\n/**\n * A table extracted from a SQL query's FROM/JOIN clauses.\n */\nexport interface ExtractedTable {\n name: string;\n alias?: string;\n}\n\n/**\n * A collection matched to a table in a SQL query.\n */\nexport interface ResolvedQueryCollection {\n /** DB table name from the SQL AST (e.g. \"blog_posts\") */\n tableName: string;\n /** SQL alias if present (e.g. \"bp\") */\n tableAlias?: string;\n /** The matched collection */\n collection: EntityCollection;\n /** Columns from this table that are present in the result set */\n columns: string[];\n /** The result column name that holds the primary key for this table (e.g. \"id\", \"author_id\") */\n pkColumn?: string;\n}\n\n/**\n * Extract all tables referenced in a SQL query's FROM and JOIN clauses.\n * Returns an empty array for non-SELECT queries or parse failures.\n */\nexport function extractTablesFromQuery(sqlString: string): ExtractedTable[] {\n try {\n const ast = parseFirst(sqlString);\n if (ast.type !== \"select\") return [];\n\n const tables: ExtractedTable[] = [];\n\n // pgsql-ast-parser From items — tables and joins with left/right branches\n type FromNode = { type: string; name?: { name: string; alias?: string }; left?: FromNode; right?: FromNode };\n const processFrom = (fromItems: FromNode[]) => {\n for (const item of fromItems) {\n if (item.type === \"table\" && item.name) {\n tables.push({ name: item.name.name,\nalias: item.name.alias });\n }\n if (item.type === \"join\") {\n if (item.left) processFrom([item.left]);\n if (item.right) processFrom([item.right]);\n }\n }\n };\n\n if (ast.from) {\n processFrom(ast.from);\n }\n\n return tables;\n } catch {\n return [];\n }\n}\n\nimport { toSnakeCase } from \"@rebasepro/utils\";\n\n/**\n * Resolve which collections are referenced by a SQL query.\n *\n * Parses the SQL, extracts table names, and matches each against\n * registered collections via `collection.table` (falling back to\n * snake_case of `collection.slug`).\n *\n * For each matched collection, determines which result columns\n * belong to that table using the database schema information.\n */\nexport function resolveQueryCollections(\n sqlString: string,\n schemas: Record<string, TableInfo[]>,\n collections: EntityCollection[],\n resultColumns?: string[]\n): ResolvedQueryCollection[] {\n const tables = extractTablesFromQuery(sqlString);\n if (tables.length === 0) return [];\n\n // Parse the AST to resolve SELECT column aliases\n const selectColumns: { table?: string; column: string; alias?: string }[] = [];\n try {\n const ast = parseFirst(sqlString);\n if (ast.type === \"select\" && ast.columns) {\n for (const col of ast.columns) {\n if (col.expr?.type === \"ref\") {\n selectColumns.push({\n table: col.expr.table?.name,\n column: col.expr.name,\n alias: col.alias?.name\n });\n }\n }\n }\n } catch { /* parse failure is ok, we'll fall back */ }\n\n const results: ResolvedQueryCollection[] = [];\n\n for (const table of tables) {\n // Match table name against collection table or slug->snake_case\n const matched = collections.find(c => {\n const tableName = (c as any).table || toSnakeCase(c.slug);\n return tableName === table.name;\n });\n\n if (!matched) continue;\n\n // Find columns belonging to this table from the schema\n const tableColumns: string[] = [];\n for (const schemaEntries of Object.values(schemas)) {\n const tableInfo = schemaEntries.find(t => t.tableName === table.name);\n if (tableInfo) {\n tableColumns.push(...tableInfo.columns.map(c => c.name));\n break;\n }\n }\n\n // Determine which result column holds the PK (\"id\") for this table.\n // 1. Check parsed SELECT columns for an explicit \"id\" column from this table (by name or alias)\n // 2. Fall back to checking if result columns contain \"id\"\n let pkColumn: string | undefined;\n\n // Look in the AST select columns for `table.id` or `alias.id`\n const tableRef = table.alias || table.name;\n const idSelectCol = selectColumns.find(\n sc => sc.column === \"id\" && (!sc.table || sc.table === tableRef || sc.table === table.name)\n );\n if (idSelectCol) {\n pkColumn = idSelectCol.alias || idSelectCol.column; // use alias if present\n }\n\n // If we didn't find it from the AST (e.g. SELECT *), check if result columns have \"id\"\n if (!pkColumn && resultColumns) {\n if (resultColumns.includes(\"id\")) {\n pkColumn = \"id\";\n }\n }\n\n // If still not found, fall back to checking tableColumns\n if (!pkColumn && tableColumns.includes(\"id\")) {\n pkColumn = \"id\";\n }\n\n results.push({\n tableName: table.name,\n tableAlias: table.alias,\n collection: matched,\n columns: tableColumns,\n pkColumn\n });\n }\n\n return results;\n}\n\nexport interface PKMapping {\n /** The actual column name in the database table */\n dbColumn: string;\n /** The column name as it appears in the query result set (may be aliased) */\n resultColumn: string;\n}\n\nexport interface TableAndPKResult {\n tableName?: string;\n primaryKeys?: PKMapping[];\n error?: string;\n}\n\nexport function determineTableAndPK(sqlString: string, columnKey: string, schemas: Record<string, TableInfo[]>): TableAndPKResult {\n try {\n const tables = extractTablesFromQuery(sqlString);\n\n const ast = parseFirst(sqlString);\n if (ast.type !== \"select\") {\n return { error: \"Inline editing is only supported for SELECT queries.\" };\n }\n\n if (tables.length === 0) {\n return { error: \"Could not find any tables in the query.\" };\n }\n\n // Parse SELECT columns to resolve aliases\n const selectColumns: { table?: string; column: string; alias?: string }[] = [];\n if (ast.columns) {\n for (const col of ast.columns) {\n if (col.expr?.type === \"ref\") {\n selectColumns.push({\n table: col.expr.table?.name,\n column: col.expr.name,\n alias: col.alias?.name\n });\n }\n }\n }\n\n // Resolve which DB column `columnKey` refers to (it might be aliased)\n const resolvedColumn = selectColumns.find(\n sc => (sc.alias === columnKey) || (!sc.alias && sc.column === columnKey)\n );\n const actualDbColumnName = resolvedColumn?.column ?? columnKey;\n const columnTableRef = resolvedColumn?.table; // e.g. \"p\" or \"posts\"\n\n // Resolve the table for the edited column\n let resolvedTableName: string | null = null;\n\n if (tables.length === 1) {\n resolvedTableName = tables[0].name;\n } else {\n // If the AST tells us which table, use that\n if (columnTableRef) {\n const matchedTable = tables.find(\n t => t.alias === columnTableRef || t.name === columnTableRef\n );\n if (matchedTable) {\n resolvedTableName = matchedTable.name;\n }\n }\n\n // Otherwise, look up which schema table has this column\n if (!resolvedTableName) {\n const matchedTables = tables.filter(t => {\n for (const schema of Object.values(schemas)) {\n const tableInfo = schema.find(ti => ti.tableName === t.name);\n if (tableInfo && tableInfo.columns.some(c => c.name === actualDbColumnName)) {\n return true;\n }\n }\n return false;\n });\n\n if (matchedTables.length === 1) {\n resolvedTableName = matchedTables[0].name;\n } else if (matchedTables.length > 1) {\n return { error: `Ambiguous column \"${columnKey}\": Found in multiple queried tables.` };\n } else {\n return { error: `Could not find column \"${columnKey}\" in the queried tables.` };\n }\n }\n }\n\n if (!resolvedTableName) {\n return { error: \"Could not resolve the target table.\" };\n }\n\n // Find the table's actual primary key columns from the schema\n let pkDbColumns: string[] = [];\n for (const schema of Object.values(schemas)) {\n const tableInfo = schema.find(t => t.tableName === resolvedTableName);\n if (tableInfo) {\n pkDbColumns = tableInfo.columns\n .filter(c => c.isPrimaryKey)\n .map(c => c.name);\n break;\n }\n }\n\n if (pkDbColumns.length === 0) {\n return { error: `Table \"${resolvedTableName}\" has no primary key defined.` };\n }\n\n // Find the table's alias in the query (for resolving PK result column names)\n const tableEntry = tables.find(t => t.name === resolvedTableName);\n const tableAlias = tableEntry?.alias;\n\n // Map each PK db column to its result column name (resolving aliases)\n const primaryKeys: PKMapping[] = pkDbColumns.map(dbCol => {\n // Find the SELECT column for this PK\n const selectCol = selectColumns.find(\n sc => sc.column === dbCol &&\n (!sc.table || sc.table === (tableAlias || resolvedTableName))\n );\n return {\n dbColumn: dbCol,\n resultColumn: selectCol?.alias || selectCol?.column || dbCol\n };\n });\n\n return { tableName: resolvedTableName,\nprimaryKeys };\n } catch (e: unknown) {\n console.warn(\"Failed to parse SQL AST:\", e);\n const message = e instanceof Error ? e.message : String(e);\n return { error: `Could not safely parse query for inline editing: ${message}` };\n }\n}\n","import React, { useState } from \"react\";\nimport { Typography, cls, defaultBorderMixin, Collapse } from \"@rebasepro/ui\";\n\nexport interface ExplainPlanNode {\n \"Node Type\": string;\n \"Relation Name\"?: string;\n \"Alias\"?: string;\n \"Startup Cost\": number;\n \"Total Cost\": number;\n \"Plan Rows\": number;\n \"Plan Width\": number;\n \"Actual Startup Time\"?: number;\n \"Actual Total Time\"?: number;\n \"Actual Rows\"?: number;\n \"Actual Loops\"?: number;\n \"Filter\"?: string;\n \"Index Cond\"?: string;\n \"Hash Cond\"?: string;\n \"Plans\"?: ExplainPlanNode[];\n [key: string]: unknown;\n}\n\nexport interface ExplainVisualizerProps {\n plan: ExplainPlanNode;\n isRoot?: boolean;\n}\n\nexport const ExplainVisualizer: React.FC<ExplainVisualizerProps> = ({ plan, isRoot = true }) => {\n const [expanded, setExpanded] = useState(true);\n\n const hasChildren = plan.Plans && plan.Plans.length > 0;\n\n // Determine color based on cost\n const cost = plan[\"Total Cost\"];\n let costColor = \"text-green-500 dark:text-green-400\";\n if (cost > 1000) costColor = \"text-red-500 dark:text-red-400\";\n else if (cost > 100) costColor = \"text-orange-500 dark:text-orange-400\";\n\n return (\n <div className={cls(\"flex flex-col\", isRoot ? \"p-4\" : \"pl-6 mt-2 relative\")}>\n {/* Tree branch line */}\n {!isRoot && (\n <div className=\"absolute left-2.5 top-0 bottom-0 w-px bg-surface-200 dark:bg-surface-950 -z-10\"></div>\n )}\n {!isRoot && (\n <div className=\"absolute left-2.5 top-5 w-3 h-px bg-surface-200 dark:bg-surface-950 -z-10\"></div>\n )}\n\n <div className={cls(\"border rounded-md bg-white dark:bg-surface-900 text-text-primary dark:text-text-primary-dark shadow-xs relative z-10 w-[420px] max-w-full\", defaultBorderMixin)}>\n <div\n className={cls(\"px-4 py-3 flex justify-between items-center cursor-pointer select-none\")}\n onClick={() => setExpanded(!expanded)}\n >\n <div className=\"flex items-center space-x-2\">\n {hasChildren ? (\n <svg className={cls(\"w-4 h-4 text-text-secondary transition-transform\", !expanded ? \"-rotate-90\" : \"\")} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\"/></svg>\n ) : (\n <div className=\"w-4 h-4\"></div>\n )}\n\n <Typography variant=\"body1\" className=\"flex items-center\">\n {plan[\"Node Type\"]}\n </Typography>\n\n {plan[\"Relation Name\"] && (\n <span className=\"font-mono text-[11px] text-text-secondary dark:text-text-secondary-dark px-2 py-0.5 rounded bg-surface-200 dark:bg-surface-950 ml-2\">\n on {plan[\"Relation Name\"]} {plan.Alias && plan.Alias !== plan[\"Relation Name\"] ? `(${plan.Alias})` : \"\"}\n </span>\n )}\n </div>\n\n <div className=\"flex space-x-6 items-center\">\n <div className=\"flex flex-col text-right\">\n <span className=\"text-[10px] uppercase text-text-disabled dark:text-text-disabled-dark font-semibold tracking-wide leading-tight mb-0.5\">Cost</span>\n <span className={cls(\"font-mono font-medium text-[13px] leading-none\", costColor)}>{cost.toFixed(2)}</span>\n </div>\n <div className=\"flex flex-col text-right\">\n <span className=\"text-[10px] uppercase text-text-disabled dark:text-text-disabled-dark font-semibold tracking-wide leading-tight mb-0.5\">Rows</span>\n <span className=\"font-mono text-[13px] text-text-secondary dark:text-text-secondary-dark leading-none\">{plan[\"Plan Rows\"]}</span>\n </div>\n </div>\n </div>\n\n <Collapse in={expanded}>\n <div className=\"px-4 py-3 border-t border-surface-200 dark:border-surface-950 text-[13px] flex flex-col gap-2\">\n <div className=\"flex items-center space-x-6\">\n <div className=\"flex items-center space-x-2\">\n <span className=\"text-text-disabled dark:text-text-disabled-dark\">Startup Cost:</span>\n <span className=\"font-mono font-medium\">{plan[\"Startup Cost\"].toFixed(2)}</span>\n </div>\n <div className=\"flex items-center space-x-2\">\n <span className=\"text-text-disabled dark:text-text-disabled-dark\">Width:</span>\n <span className=\"font-mono font-medium\">{plan[\"Plan Width\"]} bytes</span>\n </div>\n </div>\n\n {plan.Filter && (\n <div className=\"mt-1\">\n <span className=\"text-text-disabled dark:text-text-disabled-dark block mb-1\">Filter:</span>\n <code className=\"block w-full p-2 bg-surface-50 dark:bg-surface-950 border dark:border-surface-950 rounded font-mono text-[12px] truncate\">{plan.Filter}</code>\n </div>\n )}\n {plan[\"Index Cond\"] && (\n <div className=\"mt-1\">\n <span className=\"text-text-disabled dark:text-text-disabled-dark block mb-1\">Index Cond:</span>\n <code className=\"block w-full p-2 bg-surface-50 dark:bg-surface-950 border dark:border-surface-950 rounded font-mono text-[12px] truncate\">{plan[\"Index Cond\"]}</code>\n </div>\n )}\n {plan[\"Hash Cond\"] && (\n <div className=\"mt-1\">\n <span className=\"text-text-disabled dark:text-text-disabled-dark block mb-1\">Hash Cond:</span>\n <code className=\"block w-full p-2 bg-surface-50 dark:bg-surface-950 border dark:border-surface-950 rounded font-mono text-[12px] truncate\">{plan[\"Hash Cond\"]}</code>\n </div>\n )}\n </div>\n </Collapse>\n </div>\n\n {expanded && hasChildren && (\n <div className=\"flex flex-col space-y-2 mt-[-4px]\">\n {plan.Plans!.map((childPlan, idx) => (\n <ExplainVisualizer key={idx} plan={childPlan} isRoot={false}/>\n ))}\n </div>\n )}\n </div>\n );\n};\n","\nimport { IconForView } from \"@rebasepro/core\";\nimport { useStudioCollectionRegistry, useStudioSideEntityController } from \"@rebasepro/core\";\nimport React, { useState, useEffect, useCallback, useRef, useMemo } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { Button, Paper, Typography, CircularProgress, cls, IconButton, InputLabel, Dialog, DialogContent, DialogActions, DialogTitle, TextField, Tooltip, Alert, Tabs, Tab, defaultBorderMixin, Select, SelectItem, Menu, MenuItem, ResizablePanels, Chip, VirtualTable, VirtualTableColumn , iconSize } from \"@rebasepro/ui\";\nimport { DatabaseIcon, TerminalIcon, XIcon, PlusIcon, PencilIcon, MoreVerticalIcon, MenuIcon, PlayIcon } from \"lucide-react\";\n// VirtualTableInput is conditionally loaded from CMS when available\nlet VirtualTableInput: React.ComponentType<any> | null = null;\ntry {\n // @ts-ignore — optional peer dependency\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const cms = require(\"@rebasepro/admin\");\n VirtualTableInput = cms.VirtualTableInput;\n} catch { /* CMS not available */ }\nimport { useRebaseContext, useSnackbarController, ConfirmationDialog, ErrorView, useTranslation } from \"@rebasepro/core\";\nimport { MonacoEditor } from \"./MonacoEditor\";\nimport { SQLEditorSidebar, Snippet } from \"./SQLEditorSidebar\";\nimport { parseFirst } from \"pgsql-ast-parser\";\nimport { determineTableAndPK, resolveQueryCollections, ResolvedQueryCollection } from \"../../utils/sql_utils\";\nimport { ExplainVisualizer } from \"./ExplainVisualizer\";\n\nexport interface SQLEditorColumnInfo {\n name: string;\n dataType: string;\n isPrimaryKey: boolean;\n}\n\nexport interface TableInfo {\n schemaName: string;\n tableName: string;\n columns: SQLEditorColumnInfo[];\n}\n\nconst QueryLoadingView = () => {\n const [elapsed, setElapsed] = useState(0);\n\n useEffect(() => {\n const start = Date.now();\n const interval = setInterval(() => {\n setElapsed(Date.now() - start);\n }, 100);\n return () => clearInterval(interval);\n }, []);\n\n return (\n <div className=\"flex-grow flex items-center justify-center\">\n <div className=\"text-center\">\n <CircularProgress size=\"medium\"/>\n <Typography variant=\"body2\" className=\"mt-4 text-text-secondary dark:text-text-secondary-dark font-mono tracking-tight animate-pulse\">\n EXECUTING QUERY...\n </Typography>\n <div className=\"mt-2 text-xs font-mono text-text-disabled dark:text-text-disabled-dark\">\n {(elapsed / 1000).toFixed(1)}s elapsed\n </div>\n </div>\n </div>\n );\n};\n\nconst STORAGE_KEY_TABS = \"rebase_sql_tabs\";\nconst STORAGE_KEY_ACTIVE_TAB = \"rebase_sql_active_tab\";\n\nconst FixedEditorOverlay = ({ \n displayValue, \n onSave, \n onCancel \n}: { \n displayValue: string, \n onSave: (val: string | null) => void, \n onCancel: () => void \n}) => {\n const [rect, setRect] = useState<DOMRect | null>(null);\n const [windowSize, setWindowSize] = useState({ width: 1000, height: 1000 });\n const anchorRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (anchorRef.current && anchorRef.current.parentElement) {\n setRect(anchorRef.current.parentElement.getBoundingClientRect());\n }\n if (typeof window !== \"undefined\") {\n setWindowSize({ width: window.innerWidth, height: window.innerHeight });\n const handleResize = () => setWindowSize({ width: window.innerWidth, height: window.innerHeight });\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }\n return undefined;\n }, []);\n\n if (!rect) {\n return <div ref={anchorRef} className=\"w-full h-full min-h-[20px]\" />;\n }\n\n let top = rect.top - 2;\n let left = rect.left - 2;\n const minWidth = Math.max(rect.width + 4, 250);\n const minHeight = rect.height + 4;\n\n if (left + minWidth > windowSize.width) {\n left = Math.max(10, windowSize.width - minWidth - 10);\n }\n \n // Calculate a max height that doesn't overflow the bottom\n const maxAvailableHeight = Math.max(50, windowSize.height - top - 10);\n const resolvedMaxHeight = Math.min(300, maxAvailableHeight);\n\n // If even the min height overflows, adjust top\n if (top + minHeight > windowSize.height) {\n top = Math.max(10, windowSize.height - minHeight - 10);\n }\n\n return (\n <div ref={anchorRef} className=\"w-full h-full min-h-[20px]\">\n {createPortal(\n <div \n className=\"fixed z-[9999] bg-surface-50 dark:bg-surface-900 border-2 border-primary dark:border-primary-dark shadow-xl flex flex-col\"\n style={{ \n top, \n left, \n minWidth, \n minHeight, \n maxWidth: Math.min(400, windowSize.width - left - 10)\n }}\n >\n <textarea\n className=\"w-full h-full bg-transparent outline-none border-none ring-0 font-mono text-[13px] text-text-primary dark:text-text-primary-dark px-4 py-1.5 resize-none overflow-y-auto\"\n defaultValue={displayValue}\n autoFocus\n style={{ minHeight: '32px' }}\n onFocus={(e) => {\n const val = e.target.value;\n e.target.value = \"\";\n e.target.value = val;\n e.target.style.height = 'auto';\n e.target.style.height = `${Math.min(e.target.scrollHeight, resolvedMaxHeight)}px`;\n }}\n onChange={(e) => {\n e.target.style.height = 'auto';\n e.target.style.height = `${Math.min(e.target.scrollHeight, resolvedMaxHeight)}px`;\n }}\n onBlur={(e) => {\n onSave(e.target.value || null);\n onCancel();\n }}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n onSave((e.currentTarget as HTMLTextAreaElement).value || null);\n onCancel();\n }\n if (e.key === \"Escape\") onCancel();\n }}\n />\n </div>,\n document.body\n )}\n </div>\n );\n};\n\nexport const SQLEditor = () => {\n const { databaseAdmin } = useRebaseContext();\n const sideEntityController = useStudioSideEntityController();\n const snackbarController = useSnackbarController();\n const collectionRegistry = useStudioCollectionRegistry();\n\n const { t } = useTranslation();\n\n // Schema state\n const [schemas, setSchemas] = useState<Record<string, TableInfo[]>>({});\n const [isSchemaLoading, setIsSchemaLoading] = useState(true);\n const schemaFetchedRef = useRef(false);\n const [schemaError, setSchemaError] = useState<string | null>(null);\n\n // Connection state\n const [selectedDatabase, setSelectedDatabase] = useState<string | undefined>(() => {\n return localStorage.getItem(\"rebase_sql_selected_db\") || undefined;\n });\n const [selectedRole, setSelectedRole] = useState<string | undefined>(() => {\n return localStorage.getItem(\"rebase_sql_selected_role\") || undefined;\n });\n\n const [availableDatabases, setAvailableDatabases] = useState<string[]>([]);\n const [availableRoles, setAvailableRoles] = useState<string[]>([]);\n const [isLoadingConfig, setIsLoadingConfig] = useState(true);\n const [connectionConfigError, setConnectionConfigError] = useState<string | null>(null);\n\n // Tabbed interface state\n const [tabs, setTabs] = useState<Array<{\n id: string,\n name: string,\n sql: string,\n database?: string,\n role?: string,\n results: Record<string, unknown>[] | null,\n loading: boolean,\n error: string | null,\n execTime: number | null,\n lastExecutedSql: string | null\n }>>(() => {\n const saved = localStorage.getItem(STORAGE_KEY_TABS);\n if (saved) {\n const parsed = JSON.parse(saved);\n return parsed.map((t: Record<string, unknown>) => ({\n ...t,\n results: null,\n loading: false,\n error: null,\n execTime: null,\n lastExecutedSql: null\n }));\n }\n return [{\n id: \"1\",\n name: \"Query 1\",\n sql: \"SELECT * FROM \",\n database: localStorage.getItem(\"rebase_sql_selected_db\") || undefined,\n role: localStorage.getItem(\"rebase_sql_selected_role\") || undefined,\n results: null,\n loading: false,\n error: null,\n execTime: null,\n lastExecutedSql: null\n }];\n });\n const [activeTabId, setActiveTabId] = useState<string>(() => {\n return localStorage.getItem(STORAGE_KEY_ACTIVE_TAB) || \"1\";\n });\n\n const activeTab = tabs.find(t => t.id === activeTabId) || tabs[0];\n\n // Helper to update active tab state\n const updateActiveTab = useCallback((update: Partial<typeof activeTab>) => {\n setTabs(prev => prev.map(t => t.id === activeTabId ? { ...t,\n...update } : t));\n }, [activeTabId]);\n\n const sql = activeTab.sql;\n const results = activeTab.results;\n const loading = activeTab.loading;\n const error = activeTab.error;\n const execTime = activeTab.execTime;\n\n const setSql = (newSql: string) => updateActiveTab({ sql: newSql });\n const setResults = (newResults: Record<string, unknown>[] | null) => updateActiveTab({ results: newResults });\n const setLoading = (newLoading: boolean) => updateActiveTab({ loading: newLoading });\n const setError = (newError: string | null) => updateActiveTab({ error: newError });\n\n useEffect(() => {\n let mounted = true;\n const fetchConnectionConfig = async () => {\n if (!databaseAdmin?.fetchAvailableDatabases || !databaseAdmin?.fetchAvailableRoles) {\n setConnectionConfigError(t(\"studio_sql_sql_not_supported\"));\n setIsLoadingConfig(false);\n return;\n }\n\n try {\n const [dbs, roles, currentDbFromApi] = await Promise.all([\n databaseAdmin.fetchAvailableDatabases(),\n databaseAdmin.fetchAvailableRoles(),\n typeof databaseAdmin?.fetchCurrentDatabase === \"function\" ? databaseAdmin.fetchCurrentDatabase() : Promise.resolve(undefined)\n ]);\n\n if (mounted) {\n setAvailableDatabases(dbs);\n setAvailableRoles(roles);\n\n const loadedDb = localStorage.getItem(\"rebase_sql_selected_db\") || undefined;\n const loadedRole = localStorage.getItem(\"rebase_sql_selected_role\") || undefined;\n\n const initialActiveTabId = localStorage.getItem(STORAGE_KEY_ACTIVE_TAB) || \"1\";\n let initialTabs: any[] = [];\n try {\n const savedTabs = localStorage.getItem(STORAGE_KEY_TABS);\n if (savedTabs) initialTabs = JSON.parse(savedTabs);\n } catch (e) { /* ignore */ }\n const currentActiveTab = initialTabs.find(t => t.id === initialActiveTabId);\n\n let actualDb = currentActiveTab?.database || loadedDb;\n if (actualDb && !dbs.includes(actualDb)) actualDb = undefined;\n if (!actualDb && dbs.length > 0) {\n actualDb = currentDbFromApi && dbs.includes(currentDbFromApi) ? currentDbFromApi : dbs[0];\n }\n\n if (actualDb) {\n setSelectedDatabase(actualDb);\n localStorage.setItem(\"rebase_sql_selected_db\", actualDb);\n setTabs(prev => prev.map(t => t.id === initialActiveTabId && !t.database ? { ...t,\ndatabase: actualDb } : t));\n }\n\n let actualRole = currentActiveTab?.role || loadedRole;\n if (actualRole && !roles.includes(actualRole)) actualRole = undefined;\n if (!actualRole && roles.length > 0) {\n actualRole = roles.includes(\"postgres\") ? \"postgres\" : roles[0];\n }\n\n if (actualRole) {\n setSelectedRole(actualRole);\n localStorage.setItem(\"rebase_sql_selected_role\", actualRole);\n setTabs(prev => prev.map(t => t.id === initialActiveTabId && !t.role ? { ...t,\nrole: actualRole } : t));\n }\n }\n } catch (err: unknown) {\n console.error(\"Failed to fetch databases or roles:\", err);\n if (mounted) {\n const message = err instanceof Error ? err.message : String(err);\n setConnectionConfigError(t(\"studio_sql_fetch_error\", { message }));\n }\n } finally {\n if (mounted) {\n setIsLoadingConfig(false);\n }\n }\n };\n\n fetchConnectionConfig();\n\n return () => { mounted = false; };\n }, [databaseAdmin]);\n\n const handleDatabaseChange = (db: string, tabId?: string) => {\n setSelectedDatabase(db);\n localStorage.setItem(\"rebase_sql_selected_db\", db);\n setTabs(prev => prev.map(t => t.id === (tabId || activeTabId) ? { ...t,\ndatabase: db } : t));\n // Reset so the schema will be re-fetched for the new database\n schemaFetchedRef.current = false;\n };\n\n const handleRoleChange = (role: string, tabId?: string) => {\n setSelectedRole(role);\n localStorage.setItem(\"rebase_sql_selected_role\", role);\n setTabs(prev => prev.map(t => t.id === (tabId || activeTabId) ? { ...t,\nrole } : t));\n };\n\n const handleTabChange = useCallback((newTabId: string) => {\n setActiveTabId(newTabId);\n const newTab = tabs.find(t => t.id === newTabId);\n if (newTab) {\n if (newTab.database && newTab.database !== selectedDatabase) {\n setSelectedDatabase(newTab.database);\n localStorage.setItem(\"rebase_sql_selected_db\", newTab.database);\n schemaFetchedRef.current = false;\n } else if (!newTab.database && selectedDatabase) {\n setTabs(prev => prev.map(t => t.id === newTabId ? { ...t,\ndatabase: selectedDatabase } : t));\n }\n\n if (newTab.role && newTab.role !== selectedRole) {\n setSelectedRole(newTab.role);\n localStorage.setItem(\"rebase_sql_selected_role\", newTab.role);\n } else if (!newTab.role && selectedRole) {\n setTabs(prev => prev.map(t => t.id === newTabId ? { ...t,\nrole: selectedRole } : t));\n }\n }\n }, [tabs, selectedDatabase, selectedRole]);\n\n const fetchSchema = useCallback(async () => {\n if (!databaseAdmin?.executeSql) {\n setSchemaError(t(\"studio_sql_sql_not_supported\"));\n setIsSchemaLoading(false);\n return;\n }\n\n setIsSchemaLoading(true);\n setSchemaError(null);\n try {\n const sql = `\n SELECT \n c.table_schema as schema, \n c.table_name as \"table\", \n c.column_name as \"column\",\n c.data_type as \"data_type\",\n CASE WHEN kcu.column_name IS NOT NULL THEN true ELSE false END as \"is_pk\"\n FROM \n information_schema.columns c\n LEFT JOIN information_schema.table_constraints tc\n ON tc.table_schema = c.table_schema \n AND tc.table_name = c.table_name \n AND tc.constraint_type = 'PRIMARY KEY'\n LEFT JOIN information_schema.key_column_usage kcu\n ON kcu.constraint_name = tc.constraint_name\n AND kcu.table_schema = tc.table_schema\n AND kcu.table_name = tc.table_name\n AND kcu.column_name = c.column_name\n WHERE \n c.table_schema NOT IN ('information_schema', 'pg_catalog')\n ORDER BY \n c.table_schema, c.table_name, c.ordinal_position;\n `;\n // Pass the selected database so schema introspection targets the right DB.\n const result = await databaseAdmin!.executeSql!(sql, { database: selectedDatabase });\n\n const processGrouped = (data: Record<string, unknown>[]) => {\n const grouped = data.reduce((acc: Record<string, TableInfo[]>, curr: Record<string, unknown>) => {\n const schema = (curr.schema || curr.SCHEMA || curr.table_schema || \"public\") as string;\n const table = (curr.table || curr.TABLE || curr.table_name) as string;\n const column = (curr.column || curr.COLUMN || curr.column_name) as string;\n const dataType = (curr.data_type || curr.DATA_TYPE || \"\") as string;\n const isPrimaryKey = curr.is_pk === true || curr.is_pk === \"true\";\n\n if (!acc[schema]) acc[schema] = [];\n let tableInfo = acc[schema].find(t => t.tableName === table);\n if (!tableInfo) {\n tableInfo = { schemaName: schema,\ntableName: table,\ncolumns: [] };\n acc[schema].push(tableInfo);\n }\n tableInfo.columns.push({ name: column,\ndataType,\nisPrimaryKey });\n return acc;\n }, {});\n setSchemas(grouped);\n };\n\n if (!result || !Array.isArray(result)) {\n if (result && typeof result === \"object\" && \"rows\" in result && Array.isArray((result as { rows: Record<string, unknown>[] }).rows)) {\n processGrouped((result as { rows: Record<string, unknown>[] }).rows);\n } else {\n setSchemaError(t(\"studio_sql_unexpected_format\", { type: typeof result }));\n setSchemas({});\n }\n } else if (result.length === 0) {\n setSchemas({});\n setSchemaError(t(\"studio_sql_no_tables\"));\n } else {\n processGrouped(result);\n }\n\n schemaFetchedRef.current = true;\n } catch (e: unknown) {\n console.error(\"Schema fetch error:\", e);\n const message = e instanceof Error ? e.message : String(e);\n setSchemaError(t(\"studio_sql_schema_fetch_error\", { message }));\n } finally {\n setIsSchemaLoading(false);\n }\n }, [databaseAdmin, selectedDatabase]);\n\n useEffect(() => {\n // Fetch schema after config finishes loading, and re-fetch when the selected database changes.\n if (!isLoadingConfig && !schemaFetchedRef.current) {\n fetchSchema();\n }\n }, [fetchSchema, isLoadingConfig, selectedDatabase]);\n\n const [autoLimit, setAutoLimit] = useState(true);\n const [isConfirmDialogOpen, setIsConfirmDialogOpen] = useState(false);\n const [pendingAction, setPendingAction] = useState<(() => void) | null>(null);\n\n // Inline editing state\n const [editingCell, setEditingCell] = useState<{ rowIndex: number, columnKey: string, initialValue: unknown } | null>(null);\n\n const handleDoubleClick = useCallback((rowIndex: number, columnKey: string, initialValue: unknown, rowData: Record<string, unknown>) => {\n if (!activeTab.lastExecutedSql) {\n snackbarController.open({\n type: \"error\",\n message: t(\"studio_sql_cannot_edit_missing_query\")\n });\n return;\n }\n\n const resolution = determineTableAndPK(activeTab.lastExecutedSql, columnKey, schemas);\n\n if (resolution.error || !resolution.primaryKeys || resolution.primaryKeys.length === 0) {\n snackbarController.open({\n type: \"error\",\n message: resolution.error || t(\"studio_sql_cannot_resolve_table\")\n });\n return;\n }\n\n // Check all PK values are present in the row\n const missingPKs = resolution.primaryKeys.filter(\n pk => rowData[pk.resultColumn] === undefined || rowData[pk.resultColumn] === null\n );\n if (missingPKs.length > 0) {\n snackbarController.open({\n type: \"error\",\n message: t(\"studio_sql_missing_pk\", { columns: missingPKs.map(pk => `\"${pk.resultColumn}\"`).join(\", \") })\n });\n return;\n }\n\n setEditingCell({ rowIndex,\ncolumnKey,\ninitialValue });\n }, [activeTab.lastExecutedSql, schemas, snackbarController]);\n\n const handleCellSave = useCallback(async (newValue: string | null, rowData: Record<string, unknown>, columnKey: string, rowIndex: number) => {\n if (!editingCell || !activeTab.lastExecutedSql) return;\n\n setEditingCell(null); // Optimistically close\n\n if (newValue === editingCell.initialValue) return;\n\n const resolution = determineTableAndPK(activeTab.lastExecutedSql, columnKey, schemas);\n if (resolution.error || !resolution.tableName || !resolution.primaryKeys || resolution.primaryKeys.length === 0) {\n snackbarController.open({ type: \"error\",\nmessage: resolution.error || \"Resolution failed.\" });\n return;\n }\n\n const tableName = resolution.tableName;\n\n const formatValue = (val: unknown) => {\n if (val === null || val === undefined) return \"NULL\";\n if (typeof val === \"number\") return val;\n if (typeof val === \"boolean\") return val ? \"TRUE\" : \"FALSE\";\n return `'${String(val).replace(/'/g, \"''\")}'`;\n };\n\n // Resolve the actual DB column name for the edited column (may differ from the result alias)\n // e.g. if the query has `a.name AS author_name`, columnKey = \"author_name\" but DB column = \"name\"\n const resolveDbColumnName = (resultColKey: string): string => {\n try {\n const ast = parseFirst(activeTab.lastExecutedSql!);\n if (ast.type === \"select\" && ast.columns) {\n for (const col of ast.columns) {\n if (col.expr?.type === \"ref\") {\n const alias = col.alias?.name;\n const colName = col.expr.name;\n if (alias === resultColKey || (!alias && colName === resultColKey)) {\n return colName;\n }\n }\n }\n }\n } catch { /* fall back to columnKey */ }\n return resultColKey;\n };\n\n const dbColumnName = resolveDbColumnName(columnKey);\n\n // Build composite WHERE clause\n const whereConditions = resolution.primaryKeys.map(\n pk => `\"${pk.dbColumn}\" = ${formatValue(rowData[pk.resultColumn])}`\n ).join(\" AND \");\n\n const updateSql = `UPDATE \"${tableName}\" SET \"${dbColumnName}\" = ${formatValue(newValue)} WHERE ${whereConditions};`;\n\n try {\n if (databaseAdmin?.executeSql) {\n await databaseAdmin.executeSql(updateSql, { database: selectedDatabase,\nrole: selectedRole });\n\n const newResults = [...(activeTab.results || [])];\n if (newResults[rowIndex]) {\n newResults[rowIndex] = { ...newResults[rowIndex],\n[columnKey]: newValue };\n }\n updateActiveTab({ results: newResults });\n\n snackbarController.open({\n type: \"success\",\n message: t(\"studio_sql_row_updated\")\n });\n }\n } catch (e: unknown) {\n snackbarController.open({\n type: \"error\",\n message: t(\"studio_sql_update_failed\", { message: e instanceof Error ? e.message : String(e) })\n });\n }\n }, [editingCell, schemas, activeTab.lastExecutedSql, activeTab.results, databaseAdmin, updateActiveTab, snackbarController, selectedDatabase, selectedRole]);\n\n const [columnWidths, setColumnWidths] = useState<Record<string, Record<string, number>>>(() => {\n const saved = localStorage.getItem(\"rebase_sql_column_widths\");\n return saved ? JSON.parse(saved) : {};\n });\n const [snippets, setSnippets] = useState<Snippet[]>([]);\n const [history, setHistory] = useState<string[]>([]);\n const [isSaveDialogOpen, setIsSaveDialogOpen] = useState(false);\n const [newSnippetName, setNewSnippetName] = useState(\"\");\n\n // Load from local storage\n useEffect(() => {\n const savedSnippets = localStorage.getItem(\"rebase_sql_snippets\");\n if (savedSnippets) setSnippets(JSON.parse(savedSnippets));\n\n const savedHistory = localStorage.getItem(\"rebase_sql_history\");\n if (savedHistory) setHistory(JSON.parse(savedHistory));\n }, []);\n\n // Save tabs and active tab to local storage\n useEffect(() => {\n const sanitizedTabs = tabs.map(t => ({\n id: t.id,\n name: t.name,\n sql: t.sql,\n database: t.database,\n role: t.role\n }));\n localStorage.setItem(STORAGE_KEY_TABS, JSON.stringify(sanitizedTabs));\n }, [tabs]);\n\n useEffect(() => {\n localStorage.setItem(STORAGE_KEY_ACTIVE_TAB, activeTabId);\n }, [activeTabId]);\n\n const saveSnippets = (newSnippets: Snippet[]) => {\n setSnippets(newSnippets);\n localStorage.setItem(\"rebase_sql_snippets\", JSON.stringify(newSnippets));\n };\n\n const saveHistory = (newHistory: string[]) => {\n setHistory(newHistory);\n localStorage.setItem(\"rebase_sql_history\", JSON.stringify(newHistory.slice(-50)));\n };\n\n const handleDeleteSnippet = (id: string) => {\n saveSnippets(snippets.filter(s => s.id !== id));\n };\n\n const handleAddTab = () => {\n const newId = Math.random().toString(36).substring(2, 9);\n\n // Find the next available query number\n let maxNumber = 0;\n tabs.forEach(tab => {\n const match = tab.name.match(/^Query (\\d+)$/);\n if (match) {\n const num = parseInt(match[1], 10);\n if (num > maxNumber) maxNumber = num;\n }\n });\n const name = `Query ${maxNumber + 1}`;\n setTabs(prev => [...prev, {\n id: newId,\n name,\n sql: \"SELECT * FROM \",\n database: selectedDatabase,\n role: selectedRole,\n results: null,\n loading: false,\n error: null,\n execTime: null,\n lastExecutedSql: null\n }]);\n setActiveTabId(newId);\n };\n\n const handleCloseTab = (id: string, e: React.MouseEvent) => {\n e.stopPropagation();\n if (tabs.length === 1) return;\n\n const tabIndex = tabs.findIndex(t => t.id === id);\n const newTabs = tabs.filter(t => t.id !== id);\n setTabs(newTabs);\n\n if (activeTabId === id) {\n // Find a new active tab: the one at the same index, or the last one if we closed the last\n const nextIndex = Math.min(tabIndex, newTabs.length - 1);\n if (newTabs[nextIndex]) {\n setActiveTabId(newTabs[nextIndex].id);\n }\n }\n };\n\n const handleColumnResize = useCallback(({ key, width }: { key: string, width: number }) => {\n setColumnWidths(prev => {\n const newWidths = {\n ...prev,\n [activeTab.sql]: {\n ...(prev[activeTab.sql] || {}),\n [key]: width\n }\n };\n localStorage.setItem(\"rebase_sql_column_widths\", JSON.stringify(newWidths));\n return newWidths;\n });\n }, [activeTab.sql]);\n\n const handlePrettify = () => {\n // Simple formatting for now\n const formatted = activeTab.sql\n .replace(/\\s+/g, \" \")\n .replace(/\\s?,\\s?/g, \", \")\n .replace(/\\s?=\\s?/g, \" = \")\n .trim();\n setSql(formatted);\n };\n\n const handleExplain = async () => {\n const explainSql = `EXPLAIN (FORMAT JSON, ANALYZE) ${activeTab.sql}`;\n updateActiveTab({ loading: true,\nerror: null,\nresults: null });\n const start = performance.now();\n try {\n if (databaseAdmin?.executeSql) {\n const result = await databaseAdmin.executeSql(explainSql, { database: selectedDatabase,\nrole: selectedRole });\n updateActiveTab({ results: result,\nexecTime: Math.round(performance.now() - start) });\n }\n } catch (e: unknown) {\n const message = e instanceof Error ? e.message : String(e);\n updateActiveTab({ error: message || t(\"studio_sql_error_explaining\") });\n } finally {\n updateActiveTab({ loading: false });\n }\n };\n\n const executeRun = useCallback(async (sqlOverride?: string) => {\n let sqlToRun = sqlOverride || activeTab.sql;\n const upperSql = sqlToRun.toUpperCase();\n \n const isAggregate = /\\b(COUNT|SUM|AVG|MIN|MAX)\\s*\\(/i.test(sqlToRun);\n const isExplain = /\\bEXPLAIN\\b/i.test(sqlToRun);\n\n if (autoLimit && upperSql.includes(\"SELECT\") && !upperSql.includes(\"LIMIT\") && !isAggregate && !isExplain) {\n // Remove trailing semicolon if present to safely append LIMIT\n sqlToRun = sqlToRun.trim().replace(/;$/, \"\");\n sqlToRun = `${sqlToRun} LIMIT 1000;`;\n }\n\n updateActiveTab({ loading: true,\nerror: null,\nresults: null });\n const start = performance.now();\n\n try {\n if (databaseAdmin?.executeSql) {\n const result = await databaseAdmin.executeSql(sqlToRun, { database: selectedDatabase,\nrole: selectedRole });\n updateActiveTab({\n results: result,\n execTime: Math.round(performance.now() - start),\n lastExecutedSql: sqlToRun\n });\n\n if (history[history.length - 1] !== activeTab.sql) {\n saveHistory([...history, activeTab.sql]);\n }\n } else {\n updateActiveTab({ error: t(\"studio_sql_execution_not_supported\") });\n }\n } catch (e: unknown) {\n const message = e instanceof Error ? e.message : String(e);\n updateActiveTab({ error: message || t(\"studio_sql_error_executing\") });\n } finally {\n updateActiveTab({ loading: false });\n }\n }, [activeTab.sql, autoLimit, databaseAdmin, history, updateActiveTab]);\n\n const handleRun = useCallback(async (selectedText?: string) => {\n const sqlTarget = selectedText || activeTab.sql;\n if (!sqlTarget.trim()) return;\n\n // Destructive operation check\n const destructiveKeywords = [\"DELETE\", \"DROP\", \"TRUNCATE\", \"UPDATE\"];\n const hasDestructive = destructiveKeywords.some(kw => sqlTarget.toUpperCase().includes(kw));\n const hasWhere = sqlTarget.toUpperCase().includes(\"WHERE\");\n\n if (hasDestructive && (!hasWhere || sqlTarget.toUpperCase().includes(\"DROP\") || sqlTarget.toUpperCase().includes(\"TRUNCATE\"))) {\n setPendingAction(() => () => executeRun(selectedText));\n setIsConfirmDialogOpen(true);\n return;\n }\n\n executeRun(selectedText);\n }, [activeTab.sql, executeRun]);\n\n // Global keybindings\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if ((e.metaKey || e.ctrlKey) && e.key === \"Enter\") {\n // If we are in an input or textarea (except the code editor which handles its own), we might not want to run\n const activeElement = document.activeElement;\n const isInput = activeElement?.tagName === \"INPUT\" || activeElement?.tagName === \"TEXTAREA\";\n // If it's the monaco editor textarea, it's fine, let's trigger handleRun\n // Actually the monaco editor already has its own action, so we don't need a global one IF focused in monaco.\n // But wait, if we have both, it might run twice.\n // Let's check if we're focused in monaco.\n const isMonaco = activeElement?.className?.includes(\"monaco-mouse-cursor-text\");\n\n if (!isMonaco && !isInput) {\n e.preventDefault();\n handleRun();\n }\n }\n };\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, [handleRun]);\n\n const handleSaveSnippet = () => {\n if (!newSnippetName.trim() || !sql.trim()) return;\n\n const newSnippet: Snippet = {\n id: Math.random().toString(36).substring(2, 9),\n name: newSnippetName,\n sql: sql,\n createdAt: Date.now()\n };\n\n saveSnippets([...snippets, newSnippet]);\n setNewSnippetName(\"\");\n setIsSaveDialogOpen(false);\n snackbarController.open({\n type: \"success\",\n message: t(\"studio_sql_snippet_saved\", { name: newSnippetName })\n });\n };\n\n const handleExportCSV = () => {\n if (!results || results.length === 0) return;\n\n const headers = Object.keys(results[0]).join(\",\");\n const rows = results.map(row =>\n Object.values(row).map(val => {\n const str = String(val);\n return str.includes(\",\") ? `\"${str}\"` : str;\n }).join(\",\")\n );\n const csv = [headers, ...rows].join(\"\\n\");\n const blob = new Blob([csv], { type: \"text/csv\" });\n const url = window.URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = `query_results_${new Date().toISOString().slice(0, 19)}.csv`;\n a.click();\n window.URL.revokeObjectURL(url);\n };\n\n const handleExportJSON = () => {\n if (!results || results.length === 0) return;\n\n const json = JSON.stringify(results, null, 2);\n const blob = new Blob([json], { type: \"application/json\" });\n const url = window.URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = `query_results_${new Date().toISOString().slice(0, 19)}.json`;\n a.click();\n window.URL.revokeObjectURL(url);\n };\n\n const handleExportMarkdown = () => {\n if (!results || results.length === 0) return;\n\n const headers = Object.keys(results[0]);\n const headerRow = `| ${headers.join(\" | \")} |`;\n const dividerRow = `| ${headers.map(() => \"---\").join(\" | \")} |`;\n const dataRows = results.map(row =>\n `| ${headers.map(header => {\n const val = row[header];\n if (val === null) return \"null\";\n if (val === undefined) return \"\";\n // Replace pipes and newlines to avoid breaking the markdown table\n return String(val).replace(/\\|/g, \"\\\\|\").replace(/\\n/g, \" \");\n }).join(\" | \")} |`\n );\n\n const markdown = [headerRow, dividerRow, ...dataRows].join(\"\\n\");\n navigator.clipboard.writeText(markdown).then(() => {\n snackbarController.open({\n type: \"success\",\n message: t(\"studio_sql_markdown_copied\")\n });\n }).catch(() => {\n snackbarController.open({\n type: \"error\",\n message: t(\"studio_sql_markdown_copy_failed\")\n });\n });\n };\n\n const renderResults = () => {\n if (loading) {\n return (\n <div className=\"flex-grow flex items-center justify-center\">\n <div className=\"text-center\">\n <CircularProgress size=\"medium\"/>\n <Typography variant=\"body2\" className=\"mt-4 text-text-secondary dark:text-text-secondary-dark font-mono tracking-tight animate-pulse\">{t(\"studio_sql_executing_query\")}</Typography>\n </div>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"flex-grow flex items-center justify-center p-6 overflow-auto\">\n <ErrorView title={t(\"studio_sql_query_error\")} error={error}/>\n </div>\n );\n }\n\n if (!results) {\n return (\n <div className=\"flex-grow flex items-center justify-center text-text-disabled dark:text-text-disabled-dark\">\n <div className=\"text-center\">\n <svg className=\"w-12 h-12 mx-auto mb-4 opacity-50\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1} d=\"M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4m0 5c0 2.21-3.582 4-8 4s-8-1.79-8-4\"/></svg>\n <Typography variant=\"body2\">{t(\"studio_sql_run_query_placeholder\")}</Typography>\n </div>\n </div>\n );\n }\n\n // Check for EXPLAIN (FORMAT JSON) response\n if (results.length === 1 && results[0][\"QUERY PLAN\"] && Array.isArray(results[0][\"QUERY PLAN\"])) {\n try {\n const plan = results[0][\"QUERY PLAN\"][0].Plan;\n if (plan) {\n return (\n <div className=\"flex-grow overflow-auto p-4 bg-surface-50 dark:bg-surface-900 flex flex-col items-start\">\n <Typography variant=\"caption\" className=\"font-bold text-text-secondary mb-4 tracking-wider uppercase\">{t(\"studio_sql_visual_execution_plan\")}</Typography>\n <div className=\"pb-12\">\n <ExplainVisualizer plan={plan}/>\n </div>\n </div>\n );\n }\n } catch (e) {\n console.warn(\"Failed to parse EXPLAIN JSON output:\", e);\n }\n }\n\n if (results.length === 0) {\n return (\n <div className=\"flex-grow p-6 flex flex-col items-center justify-center\">\n <Typography variant=\"body2\" className=\"text-text-secondary dark:text-text-secondary-dark font-mono border-b border-surface-200 dark:border-surface-950 pb-2 mb-2\">{t(\"studio_sql_success\")}</Typography>\n <Typography variant=\"caption\" className=\"text-text-disabled dark:text-text-disabled-dark\">{t(\"studio_sql_no_results\")}</Typography>\n </div>\n );\n }\n\n const savedWidths = columnWidths[activeTab.sql] || {};\n const resultColumnKeys = Object.keys(results[0]);\n\n // Compute matched collections for this query, including PK column detection\n const matchedCollections: ResolvedQueryCollection[] = (() => {\n if (!activeTab.lastExecutedSql || !collectionRegistry.collections) return [];\n try {\n return resolveQueryCollections(activeTab.lastExecutedSql, schemas, collectionRegistry.collections, resultColumnKeys);\n } catch {\n return [];\n }\n })();\n\n // Only collections that have a PK column in the result set can be opened\n const actionableCollections = matchedCollections.filter(mc => mc.pkColumn && resultColumnKeys.includes(mc.pkColumn));\n\n // For each row, determine which entities can be opened\n const getRowEntityActions = (rowData: Record<string, unknown>): { collection: ResolvedQueryCollection, entityId: string | number }[] => {\n if (!rowData) return [];\n return actionableCollections\n .filter(mc => rowData[mc.pkColumn!] != null)\n .map(mc => ({\n collection: mc,\n entityId: rowData[mc.pkColumn!] as string | number\n }));\n };\n\n // Build the columns array. If we have actionable collections, prepend a dedicated action column.\n const dataColumns: VirtualTableColumn[] = resultColumnKeys.map(key => ({\n key,\n title: key,\n width: savedWidths[key] ?? 150,\n sortable: false,\n resizable: true\n }));\n\n const columns: VirtualTableColumn[] = actionableCollections.length > 0\n ? [{ key: \"__cms_action__\",\ntitle: \"\",\nwidth: 36,\nsortable: false,\nresizable: false }, ...dataColumns]\n : dataColumns;\n\n return (\n <div className=\"flex-grow flex flex-col overflow-hidden min-h-0\">\n {/* Collection Badges Bar */}\n {actionableCollections.length > 0 && (\n <div className={cls(\"px-4 py-1.5 border-b flex items-center gap-2 shrink-0 bg-surface-50 dark:bg-surface-900\", defaultBorderMixin)}>\n <Tooltip title={t(\"studio_sql_cms_collections_tooltip\")}>\n <Typography variant=\"caption\" className=\"text-[10px] font-bold uppercase tracking-widest text-text-disabled dark:text-text-disabled-dark mr-1 shrink-0 cursor-help\">{t(\"studio_sql_cms\")}</Typography>\n </Tooltip>\n <div className=\"flex items-center gap-1.5 overflow-x-auto no-scrollbar\">\n {actionableCollections.map(mc => (\n <Tooltip key={mc.tableName} title={`Table \"${mc.tableName}\" → ${mc.collection.name} (PK: ${mc.pkColumn})`}>\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-[11px] font-medium bg-primary/10 dark:bg-primary-dark/15 text-primary dark:text-primary-dark whitespace-nowrap border border-primary/20 dark:border-primary-dark/20\">\n {typeof mc.collection.icon === \"string\" && (\n <IconForView collectionOrView={mc.collection} className=\"text-[12px]\"/>\n )}\n {mc.collection.name}\n </span>\n </Tooltip>\n ))}\n </div>\n </div>\n )}\n <div className=\"flex-grow relative h-full min-h-0 min-w-0\">\n <VirtualTable\n data={results}\n columns={columns}\n rowHeight={32}\n headerHeight={32}\n extraData={editingCell}\n onColumnResizeEnd={handleColumnResize}\n cellRenderer={({ rowData, column, rowIndex }) => {\n // Dedicated collection action column\n if (column.key === \"__cms_action__\") {\n const rowActions = getRowEntityActions(rowData);\n if (rowActions.length === 0) {\n return <div className=\"h-full w-full\"/>;\n }\n if (rowActions.length === 1) {\n const ra = rowActions[0];\n return (\n <div className=\"h-full flex items-center justify-center\">\n <Tooltip title={t(\"studio_sql_edit_entity\", { name: ra.collection.collection.name,\nid: String(ra.entityId) })}>\n <IconButton\n size=\"small\"\n className=\"text-surface-400 dark:text-surface-500 hover:text-surface-600 dark:hover:text-surface-300 transition-colors\"\n onClick={(e) => {\n e.stopPropagation();\n sideEntityController?.open({\n path: ra.collection.collection.slug,\n entityId: ra.entityId,\n collection: ra.collection.collection,\n updateUrl: false\n });\n }}\n >\n <PencilIcon size={iconSize.smallest}/>\n </IconButton>\n </Tooltip>\n </div>\n );\n }\n // Multiple matched collections (JOIN) — show a dropdown\n return (\n <div className=\"h-full flex items-center justify-center\">\n <Menu\n trigger={\n <IconButton\n size=\"small\"\n className=\"text-surface-400 dark:text-surface-500 hover:text-surface-600 dark:hover:text-surface-300 transition-colors\"\n onClick={(e) => e.stopPropagation()}\n >\n <MoreVerticalIcon size={iconSize.smallest}/>\n </IconButton>\n }\n >\n {rowActions.map(ra => (\n <MenuItem\n key={ra.collection.tableName}\n dense\n onClick={() => {\n sideEntityController?.open({\n path: ra.collection.collection.slug,\n entityId: ra.entityId,\n collection: ra.collection.collection,\n updateUrl: false\n });\n }}\n >\n {t(\"studio_sql_edit_entity\", { name: ra.collection.collection.name,\nid: String(ra.entityId) })}\n </MenuItem>\n ))}\n </Menu>\n </div>\n );\n }\n\n // Regular data cell\n const isEditing = editingCell?.rowIndex === rowIndex && editingCell?.columnKey === column.key;\n const value = rowData ? rowData[column.key] : null;\n const displayValue = typeof value === \"object\" && value !== null ? JSON.stringify(value) : String(value ?? \"\");\n\n if (isEditing) {\n return (\n <FixedEditorOverlay\n displayValue={displayValue}\n onSave={(val) => handleCellSave(val, rowData, column.key, rowIndex)}\n onCancel={() => setEditingCell(null)}\n />\n );\n }\n\n return (\n <div\n className=\"px-4 py-1.5 h-full flex items-center whitespace-nowrap text-[13px] text-text-primary dark:text-text-primary-dark font-mono cursor-text group/cell\"\n onDoubleClick={() => handleDoubleClick(rowIndex, column.key, displayValue, rowData)}\n >\n <div className=\"truncate flex-grow\" title={displayValue}>\n {displayValue === \"\" ? <span className=\"text-text-disabled dark:text-text-disabled-dark italic text-[11px]\">NULL</span> : displayValue}\n </div>\n </div>\n );\n }}\n />\n </div>\n\n <div className={cls(\"p-2 px-4 border-t bg-surface-50 dark:bg-surface-900 flex justify-between items-center shrink-0\", defaultBorderMixin)}>\n <div className=\"flex space-x-4\">\n <div className=\"flex items-center text-[11px]\">\n <span className=\"font-bold text-text-disabled dark:text-text-disabled-dark mr-2 uppercase tracking-tighter\">{t(\"studio_sql_rows\")}</span>\n <span className=\"font-mono text-text-secondary dark:text-text-secondary-dark\">{results.length}</span>\n </div>\n <div className=\"flex items-center text-[11px]\">\n <span className=\"font-bold text-text-disabled dark:text-text-disabled-dark mr-2 uppercase tracking-tighter\">{t(\"studio_sql_time\")}</span>\n <span className=\"font-mono text-text-secondary dark:text-text-secondary-dark\">{execTime}ms</span>\n </div>\n </div>\n <div className=\"flex gap-2 overflow-x-auto no-scrollbar items-center px-2\">\n <Button\n size=\"small\"\n variant=\"text\"\n className=\"text-[10px] uppercase font-bold text-text-secondary dark:text-text-secondary-dark whitespace-nowrap\"\n onClick={handleExportMarkdown}\n >\n {t(\"studio_sql_copy_markdown\")}\n </Button>\n <Button\n size=\"small\"\n variant=\"text\"\n className=\"text-[10px] uppercase font-bold text-text-secondary dark:text-text-secondary-dark whitespace-nowrap\"\n onClick={handleExportJSON}\n >\n {t(\"studio_sql_export_json\")}\n </Button>\n <Button\n size=\"small\"\n variant=\"text\"\n className=\"text-[10px] uppercase font-bold text-text-secondary dark:text-text-secondary-dark whitespace-nowrap\"\n onClick={handleExportCSV}\n >\n {t(\"studio_sql_export_csv\")}\n </Button>\n </div>\n </div>\n </div>\n );\n };\n\n const [sidebarSize, setSidebarSize] = useState(() => {\n try {\n const saved = localStorage.getItem(\"rebase_sql_editor_sidebar_size\");\n return saved !== null ? parseFloat(saved) : 20;\n } catch (e) {\n return 20;\n }\n });\n const [editorHeight, setEditorHeight] = useState(() => {\n try {\n const saved = localStorage.getItem(\"rebase_sql_editor_height\");\n return saved !== null ? parseFloat(saved) : 50;\n } catch (e) {\n return 50;\n }\n });\n\n useEffect(() => {\n try {\n localStorage.setItem(\"rebase_sql_editor_sidebar_size\", sidebarSize.toString());\n } catch (e) { /* ignore */ }\n }, [sidebarSize]);\n\n useEffect(() => {\n try {\n localStorage.setItem(\"rebase_sql_editor_height\", editorHeight.toString());\n } catch (e) { /* ignore */ }\n }, [editorHeight]);\n\n const activeSnippet = snippets.find(s => s.sql === activeTab.sql);\n const isFavorite = activeSnippet?.isFavorite || false;\n\n return (\n <div className=\"flex h-full w-full bg-white dark:bg-surface-950 overflow-hidden text-text-primary dark:text-text-primary-dark\">\n <ResizablePanels\n orientation=\"horizontal\"\n panelSizePercent={sidebarSize}\n onPanelSizeChange={setSidebarSize}\n minPanelSizePx={220}\n firstPanel={\n <SQLEditorSidebar\n snippets={snippets}\n history={history}\n onSelectSnippet={setSql}\n onTableClick={setSql}\n onDeleteSnippet={handleDeleteSnippet}\n schemas={schemas}\n isSchemaLoading={isSchemaLoading}\n schemaError={schemaError}\n onRetrySchema={fetchSchema}\n />\n }\n secondPanel={\n <div className=\"flex-grow flex flex-col min-w-0 h-full w-full\">\n {/* Toolbar */}\n <div className={cls(\"flex items-center justify-between pr-2 border-b bg-white dark:bg-surface-950\", defaultBorderMixin)}>\n <div className=\"flex items-center flex-grow overflow-hidden mr-4\">\n <div className=\"flex items-center no-scrollbar overflow-x-auto min-w-0\">\n <Tabs value={activeTabId} onValueChange={handleTabChange} variant=\"boxy\" className=\"w-[unset] flex-shrink-0\" innerClassName=\"bg-white dark:bg-surface-950\">\n {tabs.map(tab => (\n <Tab key={tab.id} value={tab.id} className=\"flex items-center justify-between group max-w-[200px]\">\n <TerminalIcon size={iconSize.smallest} className=\"text-blue-500 mr-1.5 flex-shrink-0\"/>\n <span className=\"truncate\">{tab.name}</span>\n {tabs.length > 1 && (\n <IconButton\n size=\"smallest\"\n onClick={(e) => handleCloseTab(tab.id, e)}\n className=\"ml-1 !p-0.5 opacity-0 group-hover:opacity-100 hover:text-red-500 transition-opacity\"\n >\n <XIcon size={iconSize.smallest}/>\n </IconButton>\n )}\n </Tab>\n ))}\n </Tabs>\n <IconButton\n size=\"small\"\n onClick={handleAddTab}\n className=\"ml-2 flex-shrink-0\"\n >\n <PlusIcon size={iconSize.smallest}/>\n </IconButton>\n </div>\n </div>\n <div className=\"flex shrink-0 items-center justify-end pr-2 gap-1.5\">\n <Tooltip title={t(\"studio_sql_format_sql\")}>\n <IconButton size=\"small\" onClick={handlePrettify} className=\"text-text-secondary hover:text-text-primary transition-colors\">\n <MenuIcon size={iconSize.smallest}/>\n </IconButton>\n </Tooltip>\n\n <Button\n variant=\"text\"\n size=\"small\"\n onClick={handleExplain}\n disabled={loading}\n >\n {t(\"studio_sql_explain\")}\n </Button>\n\n <div className=\"h-4 w-px bg-surface-200 dark:bg-surface-950 mx-1\"></div>\n\n <div className=\"flex items-center space-x-2 px-2 cursor-pointer\" onClick={() => setAutoLimit(!autoLimit)}>\n <Typography variant=\"caption\" className=\"text-[11px] text-text-secondary cursor-pointer select-none\">{t(\"studio_sql_limit_1000\")}</Typography>\n <input\n type=\"checkbox\"\n checked={autoLimit}\n onChange={(e) => setAutoLimit(e.target.checked)}\n onClick={(e) => e.stopPropagation()}\n className=\"w-3.5 h-3.5 rounded border-surface-300 text-primary focus:ring-primary cursor-pointer\"\n />\n </div>\n\n <div className=\"h-4 w-px bg-surface-200 dark:bg-surface-950 mx-1\"></div>\n\n <Tooltip title={isFavorite ? t(\"studio_sql_remove_from_favorites\") : t(\"studio_sql_add_to_favorites\")}>\n <IconButton\n size=\"small\"\n onClick={() => {\n if (!activeSnippet) {\n snackbarController.open({\n type: \"info\",\n message: t(\"studio_sql_save_first_to_favorite\")\n });\n return;\n }\n saveSnippets(snippets.map(s => s.id === activeSnippet.id ? { ...s,\nisFavorite: !s.isFavorite } : s));\n }}\n >\n <svg className={`w-4 h-4 ${isFavorite ? \"text-red-500 fill-current\" : \"text-text-disabled dark:text-text-disabled-dark hover:text-text-primary\"}`} fill={isFavorite ? \"currentColor\" : \"none\"} stroke=\"currentColor\" strokeWidth={2} viewBox=\"0 0 24 24\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z\"/></svg>\n </IconButton>\n </Tooltip>\n\n <Button\n variant=\"text\"\n size=\"small\"\n onClick={() => setIsSaveDialogOpen(true)}\n >\n {t(\"studio_sql_save\")}\n </Button>\n\n <div className=\"h-4 w-px bg-surface-200 dark:bg-surface-950 mx-1\"></div>\n\n <Menu\n trigger={\n <Button\n size=\"small\"\n variant=\"outlined\"\n className=\"text-text-secondary dark:text-text-secondary-dark font-medium mr-2\"\n >\n <DatabaseIcon size={iconSize.small} className=\"mr-1.5 text-text-disabled dark:text-text-disabled-dark\"/>\n <span className=\"max-w-[80px] truncate\">{isLoadingConfig ? \"...\" : (selectedDatabase || t(\"studio_sql_select_db\"))}</span>\n </Button>\n }\n >\n <div className=\"max-h-64 overflow-y-auto\">\n <div className=\"px-3 py-1.5 border-b border-surface-200 dark:border-surface-950 mb-1\">\n <Typography variant=\"caption\" className=\"font-bold uppercase tracking-wider text-[9px] text-text-disabled dark:text-text-disabled-dark\">{t(\"studio_sql_database\")}</Typography>\n </div>\n {isLoadingConfig ? (\n <div className=\"flex items-center justify-center p-4\">\n <CircularProgress size=\"small\"/>\n </div>\n ) : connectionConfigError ? (\n <div className=\"px-3 py-2 text-xs text-red-500 dark:text-red-400 max-w-[200px] break-words\">\n {connectionConfigError}\n </div>\n ) : (\n <>\n {availableDatabases.map(db => (\n <MenuItem key={db} dense onClick={() => handleDatabaseChange(db)} className={cls(\"text-xs\", selectedDatabase === db && \"text-primary dark:text-primary-dark\")}>\n {db}\n </MenuItem>\n ))}\n\n <div className=\"px-3 py-1.5 border-y border-surface-200 dark:border-surface-950 mb-1 mt-1\">\n <Typography variant=\"caption\" className=\"font-bold uppercase tracking-wider text-[9px] text-text-disabled dark:text-text-disabled-dark\">{t(\"studio_sql_role\")}</Typography>\n </div>\n {availableRoles.map(role => (\n <MenuItem key={role} dense onClick={() => handleRoleChange(role)} className={cls(\"text-xs\", selectedRole === role && \"text-primary dark:text-primary-dark\")}>\n {role}{role === \"postgres\" ? \" \" + t(\"studio_sql_admin\") : \"\"}\n </MenuItem>\n ))}\n </>\n )}\n </div>\n </Menu>\n\n <Button\n onClick={() => handleRun()}\n disabled={loading}\n size=\"small\"\n color=\"primary\"\n >\n {loading ? <CircularProgress size=\"smallest\" className=\"mr-2\"/> : <PlayIcon size={iconSize.smallest} className=\"mr-2\"/>}\n {t(\"studio_sql_run\")}\n </Button>\n </div>\n </div>\n\n <ResizablePanels\n orientation=\"vertical\"\n panelSizePercent={editorHeight}\n onPanelSizeChange={setEditorHeight}\n minPanelSizePx={100}\n firstPanel={\n <div className=\"h-full w-full relative flex flex-col min-h-0\">\n <MonacoEditor\n value={sql}\n onChange={(v) => setSql(v || \"\")}\n onRun={handleRun}\n schemas={schemas}\n />\n </div>\n }\n secondPanel={\n <div className=\"h-full w-full flex flex-col bg-surface-50 dark:bg-surface-950 overflow-hidden min-h-0\">\n <div className={cls(\"p-2 px-4 bg-surface-100 dark:bg-surface-900 border-b shrink-0 flex items-center\", defaultBorderMixin)}>\n <Typography variant=\"caption\" className=\"font-bold text-text-disabled dark:text-text-disabled-dark uppercase tracking-widest text-[10px]\">{t(\"studio_sql_query_results\")}</Typography>\n </div>\n <div className=\"flex-grow flex flex-col min-h-0 overflow-hidden\">\n {renderResults()}\n </div>\n </div>\n }\n />\n\n </div>\n }\n />\n\n <Dialog open={isSaveDialogOpen} onOpenChange={setIsSaveDialogOpen}>\n <DialogTitle>{t(\"studio_sql_save_snippet\")}</DialogTitle>\n <DialogContent>\n <div className=\"py-4 flex flex-col gap-4\">\n <TextField\n label={t(\"studio_sql_snippet_name\")}\n autoFocus\n placeholder={t(\"studio_sql_snippet_name_placeholder\")}\n value={newSnippetName}\n onChange={(e) => setNewSnippetName(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n handleSaveSnippet();\n }\n }}\n />\n <Typography variant=\"caption\" className=\"text-text-disabled dark:text-text-disabled-dark block\">{t(\"studio_sql_snippet_saved_local\")}</Typography>\n </div>\n </DialogContent>\n <DialogActions>\n <Button variant=\"text\" onClick={() => setIsSaveDialogOpen(false)}>{t(\"studio_sql_cancel\")}</Button>\n <Button onClick={handleSaveSnippet} color=\"primary\" disabled={!newSnippetName.trim()}>{t(\"studio_sql_save\")}</Button>\n </DialogActions>\n </Dialog>\n {/* Confirmation Dialog */}\n <ConfirmationDialog\n open={isConfirmDialogOpen}\n onCancel={() => setIsConfirmDialogOpen(false)}\n title={t(\"studio_sql_dangerous_operation\")}\n body={t(\"studio_sql_dangerous_operation_body\")}\n onAccept={() => {\n if (pendingAction) pendingAction();\n setIsConfirmDialogOpen(false);\n }}\n />\n </div>\n );\n};\n"],"names":["SchemaBrowser","onTableClick","schemas","isSchemaLoading","schemaError","onRetrySchema","expandedSchemas","setExpandedSchemas","useState","public","expandedTables","setExpandedTables","t","useTranslation","cls","defaultBorderMixin","iconSize","smallest","Object","keys","length","entries","map","schemaName","tables","prev","table","tableName","e","stopPropagation","navigator","clipboard","writeText","columns","c","name","join","col","dataType","SQLEditorSidebar","onSelectSnippet","snippets","history","onDeleteSnippet","activeTab","setActiveTab","v","favorites","filter","s","isFavorite","others","snippet","sql","id","reverse","i","extractTablesFromQuery","sqlString","ast","parseFirst","type","processFrom","fromItems","item","push","alias","left","right","from","resolveQueryCollections","collections","resultColumns","selectColumns","expr","column","results","matched","find","toSnakeCase","slug","tableColumns","schemaEntries","values","tableInfo","pkColumn","tableRef","idSelectCol","sc","includes","tableAlias","collection","determineTableAndPK","columnKey","error","resolvedColumn","actualDbColumnName","columnTableRef","resolvedTableName","matchedTable","matchedTables","schema","ti","some","pkDbColumns","isPrimaryKey","tableEntry","primaryKeys","dbCol","selectCol","dbColumn","resultColumn","console","warn","message","Error","String","ExplainVisualizer","t0","$","_c","plan","isRoot","t1","undefined","expanded","setExpanded","hasChildren","Plans","cost","costColor","t2","t3","t4","t5","t6","t7","Symbol","for","t8","t9","t10","t11","t12","Alias","t13","t14","t15","t16","toFixed","t17","t18","t19","t20","t21","t22","t23","t24","t25","t26","t27","t28","t29","t30","t31","Filter","t32","t33","t34","t35","t36","t37","_temp","t38","childPlan","idx","VirtualTableInput","cms","require","STORAGE_KEY_TABS","STORAGE_KEY_ACTIVE_TAB","FixedEditorOverlay","displayValue","onSave","onCancel","rect","setRect","width","height","windowSize","setWindowSize","anchorRef","useRef","current","parentElement","getBoundingClientRect","window","innerWidth","innerHeight","handleResize","addEventListener","removeEventListener","useEffect","top","minWidth","Math","max","minHeight","maxAvailableHeight","resolvedMaxHeight","min","maxWidth","val","target","value","style","scrollHeight","e_0","e_1","e_2","key","shiftKey","preventDefault","currentTarget","createPortal","document","body","SQLEditor","databaseAdmin","useRebaseContext","sideEntityController","useStudioSideEntityController","snackbarController","useSnackbarController","collectionRegistry","useStudioCollectionRegistry","setSchemas","setIsSchemaLoading","schemaFetchedRef","setSchemaError","selectedDatabase","setSelectedDatabase","localStorage","getItem","selectedRole","setSelectedRole","availableDatabases","setAvailableDatabases","availableRoles","setAvailableRoles","isLoadingConfig","setIsLoadingConfig","connectionConfigError","setConnectionConfigError","tabs","setTabs","saved","parsed","JSON","parse","loading","execTime","lastExecutedSql","database","role","activeTabId","setActiveTabId","updateActiveTab","useCallback","update","setSql","newSql","mounted","fetchConnectionConfig","fetchAvailableDatabases","fetchAvailableRoles","dbs","roles","currentDbFromApi","Promise","all","fetchCurrentDatabase","resolve","loadedDb","loadedRole","initialActiveTabId","initialTabs","savedTabs","currentActiveTab","actualDb","setItem","actualRole","err","handleDatabaseChange","db","tabId","handleRoleChange","handleTabChange","newTabId","newTab","fetchSchema","executeSql","result","processGrouped","data","grouped","reduce","acc","curr","SCHEMA","table_schema","TABLE","table_name","COLUMN","column_name","data_type","DATA_TYPE","is_pk","Array","isArray","rows","autoLimit","setAutoLimit","isConfirmDialogOpen","setIsConfirmDialogOpen","pendingAction","setPendingAction","editingCell","setEditingCell","handleDoubleClick","rowIndex","initialValue","rowData","open","resolution","missingPKs","pk","handleCellSave","newValue","formatValue","replace","resolveDbColumnName","resultColKey","colName","dbColumnName","whereConditions","updateSql","newResults","columnWidths","setColumnWidths","setSnippets","setHistory","isSaveDialogOpen","setIsSaveDialogOpen","newSnippetName","setNewSnippetName","savedSnippets","savedHistory","sanitizedTabs","stringify","saveSnippets","newSnippets","saveHistory","newHistory","slice","handleDeleteSnippet","handleAddTab","newId","random","toString","substring","maxNumber","forEach","tab","match","num","parseInt","handleCloseTab","tabIndex","findIndex","newTabs","nextIndex","handleColumnResize","newWidths","handlePrettify","formatted","trim","handleExplain","explainSql","start","performance","now","round","executeRun","sqlOverride","sqlToRun","upperSql","toUpperCase","isAggregate","test","isExplain","handleRun","selectedText","sqlTarget","destructiveKeywords","hasDestructive","kw","hasWhere","handleKeyDown","metaKey","ctrlKey","activeElement","isInput","tagName","isMonaco","className","handleSaveSnippet","newSnippet","createdAt","Date","handleExportCSV","headers","row","str","csv","blob","Blob","url","URL","createObjectURL","a","createElement","href","download","toISOString","click","revokeObjectURL","handleExportJSON","json","handleExportMarkdown","headerRow","dividerRow","dataRows","header","markdown","then","catch","renderResults","Plan","savedWidths","resultColumnKeys","matchedCollections","actionableCollections","mc","getRowEntityActions","entityId","dataColumns","title","sortable","resizable","icon","rowActions","ra","path","updateUrl","isEditing","sidebarSize","setSidebarSize","parseFloat","editorHeight","setEditorHeight","activeSnippet","checked","small"],"mappings":"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"}