@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,456 @@
1
+ import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
+ import { c } from "react-compiler-runtime";
3
+ import { useState, useRef, useEffect } from "react";
4
+ import { CircularProgress, iconSize, Typography, Chip, IconButton, cls, defaultBorderMixin, Button } from "@rebasepro/ui";
5
+ import { CalendarIcon, RefreshCwIcon, PauseIcon, PlayIcon, AlertCircleIcon, HistoryIcon, CheckCircleIcon } from "lucide-react";
6
+ import { useRebaseClient, useSnackbarController } from "@rebasepro/core";
7
+ function formatDuration(ms) {
8
+ if (ms < 1e3) return `${ms}ms`;
9
+ if (ms < 6e4) return `${(ms / 1e3).toFixed(1)}s`;
10
+ return `${(ms / 6e4).toFixed(1)}m`;
11
+ }
12
+ function formatRelative(iso) {
13
+ if (!iso) return "—";
14
+ const d = new Date(iso);
15
+ const now = Date.now();
16
+ const diff = d.getTime() - now;
17
+ const abs = Math.abs(diff);
18
+ if (abs < 6e4) return diff > 0 ? "in <1m" : "<1m ago";
19
+ if (abs < 36e5) {
20
+ const m = Math.round(abs / 6e4);
21
+ return diff > 0 ? `in ${m}m` : `${m}m ago`;
22
+ }
23
+ if (abs < 864e5) {
24
+ const h = Math.round(abs / 36e5);
25
+ return diff > 0 ? `in ${h}h` : `${h}h ago`;
26
+ }
27
+ return d.toLocaleString();
28
+ }
29
+ const stateColors = {
30
+ idle: "bg-emerald-500",
31
+ running: "bg-blue-500",
32
+ success: "bg-emerald-500",
33
+ error: "bg-red-500",
34
+ disabled: "bg-surface-400"
35
+ };
36
+ function CronJobsView() {
37
+ const client = useRebaseClient();
38
+ const snackbar = useSnackbarController();
39
+ const [jobs, setJobs] = useState([]);
40
+ const [loading, setLoading] = useState(true);
41
+ const [selectedId, setSelectedId] = useState(null);
42
+ const [logs, setLogs] = useState([]);
43
+ const [logsLoading, setLogsLoading] = useState(false);
44
+ const [triggering, setTriggering] = useState(null);
45
+ const clientRef = useRef(client);
46
+ clientRef.current = client;
47
+ const snackbarRef = useRef(snackbar);
48
+ snackbarRef.current = snackbar;
49
+ useEffect(() => {
50
+ let cancelled = false;
51
+ async function load() {
52
+ const c2 = clientRef.current;
53
+ if (!c2?.cron) {
54
+ setLoading(false);
55
+ return;
56
+ }
57
+ try {
58
+ const res = await c2.cron.listJobs();
59
+ if (!cancelled) setJobs(res.jobs);
60
+ } catch (e) {
61
+ if (!cancelled) {
62
+ snackbarRef.current.open({
63
+ type: "error",
64
+ message: e instanceof Error ? e.message : String(e)
65
+ });
66
+ }
67
+ } finally {
68
+ if (!cancelled) setLoading(false);
69
+ }
70
+ }
71
+ load();
72
+ const t = setInterval(load, 15e3);
73
+ return () => {
74
+ cancelled = true;
75
+ clearInterval(t);
76
+ };
77
+ }, []);
78
+ useEffect(() => {
79
+ if (!selectedId) {
80
+ setLogs([]);
81
+ return;
82
+ }
83
+ let cancelled_0 = false;
84
+ const c_0 = clientRef.current;
85
+ if (!c_0?.cron) return;
86
+ setLogsLoading(true);
87
+ c_0.cron.getJobLogs(selectedId, {
88
+ limit: 25
89
+ }).then((res_0) => {
90
+ if (!cancelled_0) setLogs(res_0.logs);
91
+ }).catch(() => {
92
+ if (!cancelled_0) setLogs([]);
93
+ }).finally(() => {
94
+ if (!cancelled_0) setLogsLoading(false);
95
+ });
96
+ return () => {
97
+ cancelled_0 = true;
98
+ };
99
+ }, [selectedId]);
100
+ async function refreshJobs() {
101
+ const c_1 = clientRef.current;
102
+ if (!c_1?.cron) return;
103
+ try {
104
+ const res_1 = await c_1.cron.listJobs();
105
+ setJobs(res_1.jobs);
106
+ } catch {
107
+ }
108
+ }
109
+ async function refreshLogs(id) {
110
+ const c_2 = clientRef.current;
111
+ if (!c_2?.cron) return;
112
+ setLogsLoading(true);
113
+ try {
114
+ const res_2 = await c_2.cron.getJobLogs(id, {
115
+ limit: 25
116
+ });
117
+ setLogs(res_2.logs);
118
+ } catch {
119
+ setLogs([]);
120
+ } finally {
121
+ setLogsLoading(false);
122
+ }
123
+ }
124
+ const handleTrigger = async (id_0) => {
125
+ const c_3 = clientRef.current;
126
+ if (!c_3?.cron) return;
127
+ setTriggering(id_0);
128
+ try {
129
+ await c_3.cron.triggerJob(id_0);
130
+ snackbarRef.current.open({
131
+ type: "success",
132
+ message: "Job triggered"
133
+ });
134
+ await refreshJobs();
135
+ if (selectedId === id_0) refreshLogs(id_0);
136
+ } catch (e_0) {
137
+ snackbarRef.current.open({
138
+ type: "error",
139
+ message: e_0 instanceof Error ? e_0.message : String(e_0)
140
+ });
141
+ } finally {
142
+ setTriggering(null);
143
+ }
144
+ };
145
+ const handleToggle = async (id_1, enabled) => {
146
+ const c_4 = clientRef.current;
147
+ if (!c_4?.cron) return;
148
+ try {
149
+ await c_4.cron.toggleJob(id_1, enabled);
150
+ snackbarRef.current.open({
151
+ type: "success",
152
+ message: enabled ? "Job enabled" : "Job paused"
153
+ });
154
+ await refreshJobs();
155
+ } catch (e_1) {
156
+ snackbarRef.current.open({
157
+ type: "error",
158
+ message: e_1 instanceof Error ? e_1.message : String(e_1)
159
+ });
160
+ }
161
+ };
162
+ const selectedJob = jobs.find((j) => j.id === selectedId);
163
+ if (loading) return /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center h-full", children: /* @__PURE__ */ jsx(CircularProgress, {}) });
164
+ if (jobs.length === 0) return /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center justify-center h-full gap-4 text-center p-8", children: [
165
+ /* @__PURE__ */ jsx(CalendarIcon, { size: iconSize.medium, className: "text-surface-300 dark:text-surface-600" }),
166
+ /* @__PURE__ */ jsx(Typography, { variant: "h6", color: "secondary", children: "No Cron Jobs Registered" }),
167
+ /* @__PURE__ */ jsxs(Typography, { variant: "body2", color: "disabled", className: "max-w-md", children: [
168
+ "Create a file in your ",
169
+ /* @__PURE__ */ jsx("code", { className: "text-xs bg-surface-100 dark:bg-surface-950 px-1.5 py-0.5 rounded font-mono", children: "crons/" }),
170
+ " directory that default-exports a ",
171
+ /* @__PURE__ */ jsx("code", { className: "text-xs bg-surface-100 dark:bg-surface-950 px-1.5 py-0.5 rounded font-mono", children: "CronJobDefinition" }),
172
+ "."
173
+ ] })
174
+ ] });
175
+ return /* @__PURE__ */ jsxs("div", { className: "flex h-full w-full overflow-hidden bg-white dark:bg-surface-950", children: [
176
+ /* @__PURE__ */ jsxs("div", { className: cls("flex flex-col w-[340px] min-w-[280px] border-r h-full", defaultBorderMixin), children: [
177
+ /* @__PURE__ */ jsxs("div", { className: cls("flex items-center justify-between px-4 py-2.5 border-b bg-surface-50 dark:bg-surface-900 min-h-[48px]", defaultBorderMixin), children: [
178
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
179
+ /* @__PURE__ */ jsx(CalendarIcon, { size: iconSize.smallest, className: "text-primary" }),
180
+ /* @__PURE__ */ jsx(Typography, { variant: "subtitle2", className: "font-semibold", children: "Cron Jobs" }),
181
+ /* @__PURE__ */ jsx(Chip, { size: "smallest", className: "bg-surface-200 dark:bg-surface-700 text-surface-600 dark:text-surface-300", children: jobs.length })
182
+ ] }),
183
+ /* @__PURE__ */ jsx(IconButton, { size: "small", onClick: refreshJobs, title: "Refresh", children: /* @__PURE__ */ jsx(RefreshCwIcon, { size: iconSize.smallest }) })
184
+ ] }),
185
+ /* @__PURE__ */ jsx("div", { className: "flex-1 overflow-y-auto p-2 space-y-1", children: jobs.map((job) => /* @__PURE__ */ jsxs("div", { onClick: () => setSelectedId(job.id), className: cls("flex items-center gap-3 px-3 py-2.5 rounded-lg cursor-pointer transition-all", selectedId === job.id ? "bg-primary/10 dark:bg-primary/15 ring-1 ring-primary/30" : "hover:bg-surface-100 dark:hover:bg-surface-950"), children: [
186
+ /* @__PURE__ */ jsx("div", { className: cls("w-2 h-2 rounded-full shrink-0", stateColors[job.state] || "bg-surface-400") }),
187
+ /* @__PURE__ */ jsxs("div", { className: "flex-1 min-w-0", children: [
188
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", className: "truncate font-medium text-[13px]", children: job.name }),
189
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "secondary", className: "truncate text-[11px] font-mono", children: job.schedule })
190
+ ] }),
191
+ job.state === "running" && /* @__PURE__ */ jsx(CircularProgress, { size: "smallest" })
192
+ ] }, job.id)) })
193
+ ] }),
194
+ /* @__PURE__ */ jsx("div", { className: "flex-1 flex flex-col min-w-0 h-full overflow-hidden", children: !selectedJob ? /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center h-full", children: /* @__PURE__ */ jsx(Typography, { variant: "body2", color: "disabled", children: "Select a cron job to view details" }) }) : /* @__PURE__ */ jsxs(Fragment, { children: [
195
+ /* @__PURE__ */ jsxs("div", { className: cls("flex items-center justify-between px-5 py-3 border-b bg-white dark:bg-surface-950 min-h-[56px]", defaultBorderMixin), children: [
196
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 min-w-0", children: [
197
+ /* @__PURE__ */ jsx("div", { className: cls("w-2.5 h-2.5 rounded-full", stateColors[selectedJob.state]) }),
198
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
199
+ /* @__PURE__ */ jsx(Typography, { variant: "subtitle1", className: "font-semibold truncate", children: selectedJob.name }),
200
+ selectedJob.description && /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "secondary", className: "truncate", children: selectedJob.description })
201
+ ] })
202
+ ] }),
203
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 shrink-0", children: [
204
+ /* @__PURE__ */ jsx(IconButton, { title: selectedJob.enabled ? "Pause job" : "Enable job", size: "small", onClick: () => handleToggle(selectedJob.id, !selectedJob.enabled), children: selectedJob.enabled ? /* @__PURE__ */ jsx(PauseIcon, { size: iconSize.small }) : /* @__PURE__ */ jsx(PlayIcon, { size: iconSize.smallest }) }),
205
+ /* @__PURE__ */ jsx(Button, { size: "small", color: "primary", onClick: () => handleTrigger(selectedJob.id), disabled: triggering === selectedJob.id, startIcon: triggering === selectedJob.id ? /* @__PURE__ */ jsx(CircularProgress, { size: "smallest" }) : /* @__PURE__ */ jsx(PlayIcon, { size: iconSize.smallest }), children: "Run Now" })
206
+ ] })
207
+ ] }),
208
+ /* @__PURE__ */ jsxs("div", { className: "px-5 py-4 bg-surface-50 dark:bg-surface-900/50", children: [
209
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 md:grid-cols-4 gap-3", children: [
210
+ /* @__PURE__ */ jsx(StatCard, { label: "Schedule", value: selectedJob.schedule, mono: true }),
211
+ /* @__PURE__ */ jsx(StatCard, { label: "Last Run", value: formatRelative(selectedJob.lastRunAt) }),
212
+ /* @__PURE__ */ jsx(StatCard, { label: "Next Run", value: selectedJob.enabled ? formatRelative(selectedJob.nextRunAt) : "Paused" }),
213
+ /* @__PURE__ */ jsx(StatCard, { label: "Duration", value: selectedJob.lastDurationMs !== void 0 ? formatDuration(selectedJob.lastDurationMs) : "—" })
214
+ ] }),
215
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-3 gap-3 mt-3", children: [
216
+ /* @__PURE__ */ jsx(StatCard, { label: "Status", value: selectedJob.state.toUpperCase(), chipColor: selectedJob.state === "error" ? "red" : selectedJob.state === "disabled" ? "gray" : "green" }),
217
+ /* @__PURE__ */ jsx(StatCard, { label: "Total Runs", value: String(selectedJob.totalRuns) }),
218
+ /* @__PURE__ */ jsx(StatCard, { label: "Failures", value: String(selectedJob.totalFailures), highlight: selectedJob.totalFailures > 0 })
219
+ ] }),
220
+ selectedJob.lastError && /* @__PURE__ */ jsxs("div", { className: "mt-3 p-3 rounded-lg bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800/50", children: [
221
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 mb-1", children: [
222
+ /* @__PURE__ */ jsx(AlertCircleIcon, { size: iconSize.smallest, className: "text-red-500" }),
223
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", className: "font-semibold text-red-700 dark:text-red-400", children: "Last Error" })
224
+ ] }),
225
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", className: "font-mono text-red-600 dark:text-red-300 text-[11px] break-all", children: selectedJob.lastError })
226
+ ] })
227
+ ] }),
228
+ /* @__PURE__ */ jsxs("div", { className: cls("flex items-center justify-between px-5 py-2 border-y bg-white dark:bg-surface-950", defaultBorderMixin), children: [
229
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
230
+ /* @__PURE__ */ jsx(HistoryIcon, { size: iconSize.smallest, className: "text-surface-400" }),
231
+ /* @__PURE__ */ jsx(Typography, { variant: "subtitle2", className: "font-semibold text-[13px]", children: "Execution History" })
232
+ ] }),
233
+ /* @__PURE__ */ jsx(IconButton, { size: "small", onClick: () => refreshLogs(selectedJob.id), title: "Refresh logs", children: /* @__PURE__ */ jsx(RefreshCwIcon, { size: iconSize.smallest }) })
234
+ ] }),
235
+ /* @__PURE__ */ jsx("div", { className: "flex-1 overflow-y-auto", children: logsLoading ? /* @__PURE__ */ jsx("div", { className: "flex justify-center p-8", children: /* @__PURE__ */ jsx(CircularProgress, { size: "small" }) }) : logs.length === 0 ? /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center h-32", children: /* @__PURE__ */ jsx(Typography, { variant: "body2", color: "disabled", children: "No executions yet" }) }) : /* @__PURE__ */ jsx("div", { className: "divide-y divide-surface-100 dark:divide-surface-950", children: logs.map((log, idx) => /* @__PURE__ */ jsx(LogRow, { log }, idx)) }) })
236
+ ] }) })
237
+ ] });
238
+ }
239
+ function StatCard(t0) {
240
+ const $ = c(15);
241
+ const {
242
+ label,
243
+ value,
244
+ mono,
245
+ chipColor,
246
+ highlight
247
+ } = t0;
248
+ let t1;
249
+ if ($[0] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
250
+ t1 = cls("px-3 py-2 rounded-lg border bg-white dark:bg-surface-900", defaultBorderMixin);
251
+ $[0] = t1;
252
+ } else {
253
+ t1 = $[0];
254
+ }
255
+ let t2;
256
+ if ($[1] !== label) {
257
+ t2 = /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "secondary", className: "text-[10px] uppercase tracking-wider font-medium", children: label });
258
+ $[1] = label;
259
+ $[2] = t2;
260
+ } else {
261
+ t2 = $[2];
262
+ }
263
+ const t3 = mono && "font-mono";
264
+ const t4 = highlight && "text-red-500 dark:text-red-400";
265
+ const t5 = chipColor === "red" && "text-red-500";
266
+ const t6 = chipColor === "green" && "text-emerald-500";
267
+ const t7 = chipColor === "gray" && "text-surface-400";
268
+ let t8;
269
+ if ($[3] !== t3 || $[4] !== t4 || $[5] !== t5 || $[6] !== t6 || $[7] !== t7) {
270
+ t8 = cls("mt-0.5 font-semibold text-[13px]", t3, t4, t5, t6, t7);
271
+ $[3] = t3;
272
+ $[4] = t4;
273
+ $[5] = t5;
274
+ $[6] = t6;
275
+ $[7] = t7;
276
+ $[8] = t8;
277
+ } else {
278
+ t8 = $[8];
279
+ }
280
+ let t9;
281
+ if ($[9] !== t8 || $[10] !== value) {
282
+ t9 = /* @__PURE__ */ jsx(Typography, { variant: "body2", className: t8, children: value });
283
+ $[9] = t8;
284
+ $[10] = value;
285
+ $[11] = t9;
286
+ } else {
287
+ t9 = $[11];
288
+ }
289
+ let t10;
290
+ if ($[12] !== t2 || $[13] !== t9) {
291
+ t10 = /* @__PURE__ */ jsxs("div", { className: t1, children: [
292
+ t2,
293
+ t9
294
+ ] });
295
+ $[12] = t2;
296
+ $[13] = t9;
297
+ $[14] = t10;
298
+ } else {
299
+ t10 = $[14];
300
+ }
301
+ return t10;
302
+ }
303
+ function LogRow(t0) {
304
+ const $ = c(36);
305
+ const {
306
+ log
307
+ } = t0;
308
+ const [expanded, setExpanded] = useState(false);
309
+ let t1;
310
+ if ($[0] !== expanded) {
311
+ t1 = () => setExpanded(!expanded);
312
+ $[0] = expanded;
313
+ $[1] = t1;
314
+ } else {
315
+ t1 = $[1];
316
+ }
317
+ let t2;
318
+ if ($[2] !== log.success) {
319
+ t2 = log.success ? /* @__PURE__ */ jsx(CheckCircleIcon, { size: iconSize.smallest, className: "text-emerald-500 shrink-0" }) : /* @__PURE__ */ jsx(AlertCircleIcon, { size: iconSize.smallest, className: "text-red-500 shrink-0" });
320
+ $[2] = log.success;
321
+ $[3] = t2;
322
+ } else {
323
+ t2 = $[3];
324
+ }
325
+ let t3;
326
+ if ($[4] !== log.startedAt) {
327
+ t3 = new Date(log.startedAt).toLocaleString();
328
+ $[4] = log.startedAt;
329
+ $[5] = t3;
330
+ } else {
331
+ t3 = $[5];
332
+ }
333
+ let t4;
334
+ if ($[6] !== t3) {
335
+ t4 = /* @__PURE__ */ jsx("div", { className: "flex-1 min-w-0", children: /* @__PURE__ */ jsx(Typography, { variant: "caption", className: "font-mono text-[11px] text-surface-500", children: t3 }) });
336
+ $[6] = t3;
337
+ $[7] = t4;
338
+ } else {
339
+ t4 = $[7];
340
+ }
341
+ let t5;
342
+ if ($[8] !== log.manual) {
343
+ t5 = log.manual && /* @__PURE__ */ jsx(Chip, { size: "smallest", className: "bg-blue-100 dark:bg-blue-900/30 text-blue-700 dark:text-blue-300", children: "manual" });
344
+ $[8] = log.manual;
345
+ $[9] = t5;
346
+ } else {
347
+ t5 = $[9];
348
+ }
349
+ let t6;
350
+ if ($[10] !== log.durationMs) {
351
+ t6 = formatDuration(log.durationMs);
352
+ $[10] = log.durationMs;
353
+ $[11] = t6;
354
+ } else {
355
+ t6 = $[11];
356
+ }
357
+ let t7;
358
+ if ($[12] !== t6) {
359
+ t7 = /* @__PURE__ */ jsx(Typography, { variant: "caption", className: "font-mono text-[11px]", children: t6 });
360
+ $[12] = t6;
361
+ $[13] = t7;
362
+ } else {
363
+ t7 = $[13];
364
+ }
365
+ const t8 = expanded && "rotate-180";
366
+ let t9;
367
+ if ($[14] !== t8) {
368
+ t9 = cls("w-3 h-3 transition-transform text-surface-400", t8);
369
+ $[14] = t8;
370
+ $[15] = t9;
371
+ } else {
372
+ t9 = $[15];
373
+ }
374
+ let t10;
375
+ if ($[16] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
376
+ t10 = /* @__PURE__ */ jsx("path", { d: "M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z" });
377
+ $[16] = t10;
378
+ } else {
379
+ t10 = $[16];
380
+ }
381
+ let t11;
382
+ if ($[17] !== t9) {
383
+ t11 = /* @__PURE__ */ jsx("svg", { className: t9, fill: "currentColor", viewBox: "0 0 20 20", children: t10 });
384
+ $[17] = t9;
385
+ $[18] = t11;
386
+ } else {
387
+ t11 = $[18];
388
+ }
389
+ let t12;
390
+ if ($[19] !== t11 || $[20] !== t5 || $[21] !== t7) {
391
+ t12 = /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 shrink-0", children: [
392
+ t5,
393
+ t7,
394
+ t11
395
+ ] });
396
+ $[19] = t11;
397
+ $[20] = t5;
398
+ $[21] = t7;
399
+ $[22] = t12;
400
+ } else {
401
+ t12 = $[22];
402
+ }
403
+ let t13;
404
+ if ($[23] !== t1 || $[24] !== t12 || $[25] !== t2 || $[26] !== t4) {
405
+ t13 = /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 cursor-pointer", onClick: t1, children: [
406
+ t2,
407
+ t4,
408
+ t12
409
+ ] });
410
+ $[23] = t1;
411
+ $[24] = t12;
412
+ $[25] = t2;
413
+ $[26] = t4;
414
+ $[27] = t13;
415
+ } else {
416
+ t13 = $[27];
417
+ }
418
+ let t14;
419
+ if ($[28] !== expanded || $[29] !== log.error || $[30] !== log.logs || $[31] !== log.result) {
420
+ t14 = expanded && /* @__PURE__ */ jsxs("div", { className: "mt-2 ml-6 space-y-2", children: [
421
+ log.error && /* @__PURE__ */ jsx("div", { className: "p-2 rounded bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800/50", children: /* @__PURE__ */ jsx(Typography, { variant: "caption", className: "font-mono text-[11px] text-red-600 dark:text-red-300 break-all", children: log.error }) }),
422
+ log.logs.length > 0 && /* @__PURE__ */ jsx("div", { className: "p-2 rounded bg-surface-50 dark:bg-surface-900 border border-surface-200 dark:border-surface-700 max-h-40 overflow-auto", children: log.logs.map(_temp) }),
423
+ log.result !== void 0 && /* @__PURE__ */ jsxs("div", { className: "p-2 rounded bg-surface-50 dark:bg-surface-900 border border-surface-200 dark:border-surface-700", children: [
424
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", className: "text-[10px] uppercase tracking-wider text-surface-400 mb-1 block", children: "Result" }),
425
+ /* @__PURE__ */ jsx("pre", { className: "font-mono text-[11px] text-surface-600 dark:text-surface-400 whitespace-pre-wrap break-all", children: JSON.stringify(log.result, null, 2) })
426
+ ] })
427
+ ] });
428
+ $[28] = expanded;
429
+ $[29] = log.error;
430
+ $[30] = log.logs;
431
+ $[31] = log.result;
432
+ $[32] = t14;
433
+ } else {
434
+ t14 = $[32];
435
+ }
436
+ let t15;
437
+ if ($[33] !== t13 || $[34] !== t14) {
438
+ t15 = /* @__PURE__ */ jsxs("div", { className: "px-5 py-2.5 hover:bg-surface-50 dark:hover:bg-surface-950/50 transition-colors", children: [
439
+ t13,
440
+ t14
441
+ ] });
442
+ $[33] = t13;
443
+ $[34] = t14;
444
+ $[35] = t15;
445
+ } else {
446
+ t15 = $[35];
447
+ }
448
+ return t15;
449
+ }
450
+ function _temp(line, i) {
451
+ return /* @__PURE__ */ jsx("div", { className: "font-mono text-[11px] text-surface-600 dark:text-surface-400 leading-relaxed", children: line }, i);
452
+ }
453
+ export {
454
+ CronJobsView
455
+ };
456
+ //# sourceMappingURL=CronJobsView-CijCToeK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CronJobsView-CijCToeK.js","sources":["../src/components/CronJobs/CronJobsView.tsx"],"sourcesContent":["\nimport React, { useState, useEffect, useRef } from \"react\";\nimport { Typography, cls, defaultBorderMixin, Button, Chip, CircularProgress, IconButton, Card, Paper , iconSize } from \"@rebasepro/ui\";\nimport { PauseIcon, CalendarIcon, RefreshCwIcon, PlayIcon, CheckCircleIcon, AlertCircleIcon, HistoryIcon } from \"lucide-react\";\nimport { useRebaseClient, useSnackbarController } from \"@rebasepro/core\";\nimport type { CronJobStatus, CronJobLogEntry } from \"@rebasepro/types\";\nimport type { RebaseClient } from \"@rebasepro/client\";\n\nfunction formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\n return `${(ms / 60000).toFixed(1)}m`;\n}\n\nfunction formatRelative(iso: string | undefined): string {\n if (!iso) return \"—\";\n const d = new Date(iso);\n const now = Date.now();\n const diff = d.getTime() - now;\n const abs = Math.abs(diff);\n if (abs < 60000) return diff > 0 ? \"in <1m\" : \"<1m ago\";\n if (abs < 3600000) { const m = Math.round(abs / 60000); return diff > 0 ? `in ${m}m` : `${m}m ago`; }\n if (abs < 86400000) { const h = Math.round(abs / 3600000); return diff > 0 ? `in ${h}h` : `${h}h ago`; }\n return d.toLocaleString();\n}\n\nconst stateColors: Record<string, string> = {\n idle: \"bg-emerald-500\",\nrunning: \"bg-blue-500\",\nsuccess: \"bg-emerald-500\",\n error: \"bg-red-500\",\ndisabled: \"bg-surface-400\"\n};\n\nexport function CronJobsView() {\n const client = useRebaseClient<RebaseClient>();\n const snackbar = useSnackbarController();\n const [jobs, setJobs] = useState<CronJobStatus[]>([]);\n const [loading, setLoading] = useState(true);\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const [logs, setLogs] = useState<CronJobLogEntry[]>([]);\n const [logsLoading, setLogsLoading] = useState(false);\n const [triggering, setTriggering] = useState<string | null>(null);\n\n // Refs so effects never re-fire due to identity changes\n const clientRef = useRef(client);\n clientRef.current = client;\n const snackbarRef = useRef(snackbar);\n snackbarRef.current = snackbar;\n\n // ── Fetch jobs on mount + poll every 15s ──\n useEffect(() => {\n let cancelled = false;\n\n async function load() {\n const c = clientRef.current;\n if (!c?.cron) {\n setLoading(false);\n return;\n }\n try {\n const res = await c.cron.listJobs();\n if (!cancelled) setJobs(res.jobs);\n } catch (e: unknown) {\n if (!cancelled) {\n snackbarRef.current.open({\n type: \"error\",\n message: e instanceof Error ? e.message : String(e)\n });\n }\n } finally {\n if (!cancelled) setLoading(false);\n }\n }\n\n load();\n const t = setInterval(load, 15_000);\n return () => { cancelled = true; clearInterval(t); };\n }, []); // runs once\n\n // ── Fetch logs when selection changes ──\n useEffect(() => {\n if (!selectedId) {\n setLogs([]);\n return;\n }\n let cancelled = false;\n const c = clientRef.current;\n if (!c?.cron) return;\n\n setLogsLoading(true);\n c.cron.getJobLogs(selectedId, { limit: 25 })\n .then(res => { if (!cancelled) setLogs(res.logs); })\n .catch(() => { if (!cancelled) setLogs([]); })\n .finally(() => { if (!cancelled) setLogsLoading(false); });\n\n return () => { cancelled = true; };\n }, [selectedId]);\n\n // ── Imperative helpers (not in any dep array) ──\n async function refreshJobs() {\n const c = clientRef.current;\n if (!c?.cron) return;\n try {\n const res = await c.cron.listJobs();\n setJobs(res.jobs);\n } catch { /* swallow */ }\n }\n\n async function refreshLogs(id: string) {\n const c = clientRef.current;\n if (!c?.cron) return;\n setLogsLoading(true);\n try {\n const res = await c.cron.getJobLogs(id, { limit: 25 });\n setLogs(res.logs);\n } catch { setLogs([]); }\n finally { setLogsLoading(false); }\n }\n\n const handleTrigger = async (id: string) => {\n const c = clientRef.current;\n if (!c?.cron) return;\n setTriggering(id);\n try {\n await c.cron.triggerJob(id);\n snackbarRef.current.open({ type: \"success\",\nmessage: \"Job triggered\" });\n await refreshJobs();\n if (selectedId === id) refreshLogs(id);\n } catch (e: unknown) {\n snackbarRef.current.open({ type: \"error\",\nmessage: e instanceof Error ? e.message : String(e) });\n } finally { setTriggering(null); }\n };\n\n const handleToggle = async (id: string, enabled: boolean) => {\n const c = clientRef.current;\n if (!c?.cron) return;\n try {\n await c.cron.toggleJob(id, enabled);\n snackbarRef.current.open({ type: \"success\",\nmessage: enabled ? \"Job enabled\" : \"Job paused\" });\n await refreshJobs();\n } catch (e: unknown) {\n snackbarRef.current.open({ type: \"error\",\nmessage: e instanceof Error ? e.message : String(e) });\n }\n };\n\n const selectedJob = jobs.find(j => j.id === selectedId);\n\n if (loading) return <div className=\"flex items-center justify-center h-full\"><CircularProgress/></div>;\n\n if (jobs.length === 0) return (\n <div className=\"flex flex-col items-center justify-center h-full gap-4 text-center p-8\">\n <CalendarIcon size={iconSize.medium} className=\"text-surface-300 dark:text-surface-600\"/>\n <Typography variant=\"h6\" color=\"secondary\">No Cron Jobs Registered</Typography>\n <Typography variant=\"body2\" color=\"disabled\" className=\"max-w-md\">\n Create a file in your <code className=\"text-xs bg-surface-100 dark:bg-surface-950 px-1.5 py-0.5 rounded font-mono\">crons/</code> directory that default-exports a <code className=\"text-xs bg-surface-100 dark:bg-surface-950 px-1.5 py-0.5 rounded font-mono\">CronJobDefinition</code>.\n </Typography>\n </div>\n );\n\n return (\n <div className=\"flex h-full w-full overflow-hidden bg-white dark:bg-surface-950\">\n {/* ── Job List ── */}\n <div className={cls(\"flex flex-col w-[340px] min-w-[280px] border-r h-full\", defaultBorderMixin)}>\n <div className={cls(\"flex items-center justify-between px-4 py-2.5 border-b bg-surface-50 dark:bg-surface-900 min-h-[48px]\", defaultBorderMixin)}>\n <div className=\"flex items-center gap-2\">\n <CalendarIcon size={iconSize.smallest} className=\"text-primary\"/>\n <Typography variant=\"subtitle2\" className=\"font-semibold\">Cron Jobs</Typography>\n <Chip size=\"smallest\" className=\"bg-surface-200 dark:bg-surface-700 text-surface-600 dark:text-surface-300\">{jobs.length}</Chip>\n </div>\n <IconButton size=\"small\" onClick={refreshJobs} title=\"Refresh\"><RefreshCwIcon size={iconSize.smallest}/></IconButton>\n </div>\n <div className=\"flex-1 overflow-y-auto p-2 space-y-1\">\n {jobs.map(job => (\n <div\n key={job.id}\n onClick={() => setSelectedId(job.id)}\n className={cls(\n \"flex items-center gap-3 px-3 py-2.5 rounded-lg cursor-pointer transition-all\",\n selectedId === job.id\n ? \"bg-primary/10 dark:bg-primary/15 ring-1 ring-primary/30\"\n : \"hover:bg-surface-100 dark:hover:bg-surface-950\"\n )}\n >\n <div className={cls(\"w-2 h-2 rounded-full shrink-0\", stateColors[job.state] || \"bg-surface-400\")}/>\n <div className=\"flex-1 min-w-0\">\n <Typography variant=\"body2\" className=\"truncate font-medium text-[13px]\">{job.name}</Typography>\n <Typography variant=\"caption\" color=\"secondary\" className=\"truncate text-[11px] font-mono\">{job.schedule}</Typography>\n </div>\n {job.state === \"running\" && <CircularProgress size=\"smallest\"/>}\n </div>\n ))}\n </div>\n </div>\n\n {/* ── Detail Panel ── */}\n <div className=\"flex-1 flex flex-col min-w-0 h-full overflow-hidden\">\n {!selectedJob ? (\n <div className=\"flex items-center justify-center h-full\">\n <Typography variant=\"body2\" color=\"disabled\">Select a cron job to view details</Typography>\n </div>\n ) : (\n <>\n {/* Header */}\n <div className={cls(\"flex items-center justify-between px-5 py-3 border-b bg-white dark:bg-surface-950 min-h-[56px]\", defaultBorderMixin)}>\n <div className=\"flex items-center gap-3 min-w-0\">\n <div className={cls(\"w-2.5 h-2.5 rounded-full\", stateColors[selectedJob.state])}/>\n <div className=\"min-w-0\">\n <Typography variant=\"subtitle1\" className=\"font-semibold truncate\">{selectedJob.name}</Typography>\n {selectedJob.description && <Typography variant=\"caption\" color=\"secondary\" className=\"truncate\">{selectedJob.description}</Typography>}\n </div>\n </div>\n <div className=\"flex items-center gap-2 shrink-0\">\n <IconButton title={selectedJob.enabled ? \"Pause job\" : \"Enable job\"} size=\"small\" onClick={() => handleToggle(selectedJob.id, !selectedJob.enabled)}>\n {selectedJob.enabled ? <PauseIcon size={iconSize.small}/> : <PlayIcon size={iconSize.smallest}/>}\n </IconButton>\n <Button\n size=\"small\"\n color=\"primary\"\n onClick={() => handleTrigger(selectedJob.id)}\n disabled={triggering === selectedJob.id}\n startIcon={triggering === selectedJob.id ? <CircularProgress size=\"smallest\"/> : <PlayIcon size={iconSize.smallest}/>}\n >\n Run Now\n </Button>\n </div>\n </div>\n\n {/* Stats Cards */}\n <div className=\"px-5 py-4 bg-surface-50 dark:bg-surface-900/50\">\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-3\">\n <StatCard label=\"Schedule\" value={selectedJob.schedule} mono/>\n <StatCard label=\"Last Run\" value={formatRelative(selectedJob.lastRunAt)}/>\n <StatCard label=\"Next Run\" value={selectedJob.enabled ? formatRelative(selectedJob.nextRunAt) : \"Paused\"}/>\n <StatCard label=\"Duration\" value={selectedJob.lastDurationMs !== undefined ? formatDuration(selectedJob.lastDurationMs) : \"—\"}/>\n </div>\n <div className=\"grid grid-cols-3 gap-3 mt-3\">\n <StatCard label=\"Status\" value={selectedJob.state.toUpperCase()} chipColor={selectedJob.state === \"error\" ? \"red\" : selectedJob.state === \"disabled\" ? \"gray\" : \"green\"}/>\n <StatCard label=\"Total Runs\" value={String(selectedJob.totalRuns)}/>\n <StatCard label=\"Failures\" value={String(selectedJob.totalFailures)} highlight={selectedJob.totalFailures > 0}/>\n </div>\n {selectedJob.lastError && (\n <div className=\"mt-3 p-3 rounded-lg bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800/50\">\n <div className=\"flex items-center gap-2 mb-1\">\n <AlertCircleIcon size={iconSize.smallest} className=\"text-red-500\"/>\n <Typography variant=\"caption\" className=\"font-semibold text-red-700 dark:text-red-400\">Last Error</Typography>\n </div>\n <Typography variant=\"caption\" className=\"font-mono text-red-600 dark:text-red-300 text-[11px] break-all\">{selectedJob.lastError}</Typography>\n </div>\n )}\n </div>\n\n {/* Logs Section */}\n <div className={cls(\"flex items-center justify-between px-5 py-2 border-y bg-white dark:bg-surface-950\", defaultBorderMixin)}>\n <div className=\"flex items-center gap-2\">\n <HistoryIcon size={iconSize.smallest} className=\"text-surface-400\"/>\n <Typography variant=\"subtitle2\" className=\"font-semibold text-[13px]\">Execution History</Typography>\n </div>\n <IconButton size=\"small\" onClick={() => refreshLogs(selectedJob.id)} title=\"Refresh logs\"><RefreshCwIcon size={iconSize.smallest}/></IconButton>\n </div>\n <div className=\"flex-1 overflow-y-auto\">\n {logsLoading ? (\n <div className=\"flex justify-center p-8\"><CircularProgress size=\"small\"/></div>\n ) : logs.length === 0 ? (\n <div className=\"flex items-center justify-center h-32\">\n <Typography variant=\"body2\" color=\"disabled\">No executions yet</Typography>\n </div>\n ) : (\n <div className=\"divide-y divide-surface-100 dark:divide-surface-950\">\n {logs.map((log, idx) => (\n <LogRow key={idx} log={log}/>\n ))}\n </div>\n )}\n </div>\n </>\n )}\n </div>\n </div>\n );\n}\n\nfunction StatCard({ label, value, mono, chipColor, highlight }: {\n label: string; value: string; mono?: boolean; chipColor?: string; highlight?: boolean;\n}) {\n return (\n <div className={cls(\"px-3 py-2 rounded-lg border bg-white dark:bg-surface-900\", defaultBorderMixin)}>\n <Typography variant=\"caption\" color=\"secondary\" className=\"text-[10px] uppercase tracking-wider font-medium\">{label}</Typography>\n <Typography variant=\"body2\" className={cls(\n \"mt-0.5 font-semibold text-[13px]\",\n mono && \"font-mono\",\n highlight && \"text-red-500 dark:text-red-400\",\n chipColor === \"red\" && \"text-red-500\",\n chipColor === \"green\" && \"text-emerald-500\",\n chipColor === \"gray\" && \"text-surface-400\"\n )}>{value}</Typography>\n </div>\n );\n}\n\nfunction LogRow({ log }: { log: CronJobLogEntry }) {\n const [expanded, setExpanded] = useState(false);\n return (\n <div className=\"px-5 py-2.5 hover:bg-surface-50 dark:hover:bg-surface-950/50 transition-colors\">\n <div className=\"flex items-center gap-3 cursor-pointer\" onClick={() => setExpanded(!expanded)}>\n {log.success\n ? <CheckCircleIcon size={iconSize.smallest} className=\"text-emerald-500 shrink-0\"/>\n : <AlertCircleIcon size={iconSize.smallest} className=\"text-red-500 shrink-0\"/>}\n <div className=\"flex-1 min-w-0\">\n <Typography variant=\"caption\" className=\"font-mono text-[11px] text-surface-500\">{new Date(log.startedAt).toLocaleString()}</Typography>\n </div>\n <div className=\"flex items-center gap-2 shrink-0\">\n {log.manual && <Chip size=\"smallest\" className=\"bg-blue-100 dark:bg-blue-900/30 text-blue-700 dark:text-blue-300\">manual</Chip>}\n <Typography variant=\"caption\" className=\"font-mono text-[11px]\">{formatDuration(log.durationMs)}</Typography>\n <svg className={cls(\"w-3 h-3 transition-transform text-surface-400\", expanded && \"rotate-180\")} fill=\"currentColor\" viewBox=\"0 0 20 20\"><path d=\"M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z\"/></svg>\n </div>\n </div>\n {expanded && (\n <div className=\"mt-2 ml-6 space-y-2\">\n {log.error && (\n <div className=\"p-2 rounded bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800/50\">\n <Typography variant=\"caption\" className=\"font-mono text-[11px] text-red-600 dark:text-red-300 break-all\">{log.error}</Typography>\n </div>\n )}\n {log.logs.length > 0 && (\n <div className=\"p-2 rounded bg-surface-50 dark:bg-surface-900 border border-surface-200 dark:border-surface-700 max-h-40 overflow-auto\">\n {log.logs.map((line, i) => (\n <div key={i} className=\"font-mono text-[11px] text-surface-600 dark:text-surface-400 leading-relaxed\">{line}</div>\n ))}\n </div>\n )}\n {log.result !== undefined && (\n <div className=\"p-2 rounded bg-surface-50 dark:bg-surface-900 border border-surface-200 dark:border-surface-700\">\n <Typography variant=\"caption\" className=\"text-[10px] uppercase tracking-wider text-surface-400 mb-1 block\">Result</Typography>\n <pre className=\"font-mono text-[11px] text-surface-600 dark:text-surface-400 whitespace-pre-wrap break-all\">{JSON.stringify(log.result, null, 2)}</pre>\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n"],"names":["formatDuration","ms","toFixed","formatRelative","iso","d","Date","now","diff","getTime","abs","Math","m","round","h","toLocaleString","stateColors","idle","running","success","error","disabled","CronJobsView","client","useRebaseClient","snackbar","useSnackbarController","jobs","setJobs","useState","loading","setLoading","selectedId","setSelectedId","logs","setLogs","logsLoading","setLogsLoading","triggering","setTriggering","clientRef","useRef","current","snackbarRef","useEffect","cancelled","load","c","cron","res","listJobs","e","open","type","message","Error","String","t","setInterval","clearInterval","getJobLogs","limit","then","catch","finally","refreshJobs","refreshLogs","id","handleTrigger","triggerJob","handleToggle","enabled","toggleJob","selectedJob","find","j","length","iconSize","medium","cls","defaultBorderMixin","smallest","map","job","state","name","schedule","description","small","lastRunAt","nextRunAt","lastDurationMs","undefined","toUpperCase","totalRuns","totalFailures","lastError","log","idx","StatCard","t0","$","_c","label","value","mono","chipColor","highlight","t1","Symbol","for","t2","t3","t4","t5","t6","t7","t8","t9","t10","LogRow","expanded","setExpanded","startedAt","manual","durationMs","t11","t12","t13","t14","result","_temp","JSON","stringify","t15","line","i"],"mappings":"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"}