@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.
- package/LICENSE +114 -0
- package/README.md +159 -0
- package/dist/ApiExplorer-gMJt5JrS.js +1053 -0
- package/dist/ApiExplorer-gMJt5JrS.js.map +1 -0
- package/dist/AuthSimulationSelector-BF4rkRGp.js +118 -0
- package/dist/AuthSimulationSelector-BF4rkRGp.js.map +1 -0
- package/dist/BranchesView-DcHZtvXo.js +292 -0
- package/dist/BranchesView-DcHZtvXo.js.map +1 -0
- package/dist/CronJobsView-CijCToeK.js +456 -0
- package/dist/CronJobsView-CijCToeK.js.map +1 -0
- package/dist/JSEditor-D8nVp3Lp.js +1308 -0
- package/dist/JSEditor-D8nVp3Lp.js.map +1 -0
- package/dist/MonacoEditor-CMYEjiRf.js +161 -0
- package/dist/MonacoEditor-CMYEjiRf.js.map +1 -0
- package/dist/RLSEditor-DBH09u9v.js +1831 -0
- package/dist/RLSEditor-DBH09u9v.js.map +1 -0
- package/dist/SQLEditor-CkVx9vgr.js +1792 -0
- package/dist/SQLEditor-CkVx9vgr.js.map +1 -0
- package/dist/SchemaVisualizer-BgD5Zb77.js +1069 -0
- package/dist/SchemaVisualizer-BgD5Zb77.js.map +1 -0
- package/dist/StorageView-CTqGFhY9.js +907 -0
- package/dist/StorageView-CTqGFhY9.js.map +1 -0
- package/dist/common/src/collections/CollectionRegistry.d.ts +56 -0
- package/dist/common/src/collections/index.d.ts +1 -0
- package/dist/common/src/data/buildRebaseData.d.ts +14 -0
- package/dist/common/src/index.d.ts +3 -0
- package/dist/common/src/util/builders.d.ts +57 -0
- package/dist/common/src/util/callbacks.d.ts +6 -0
- package/dist/common/src/util/collections.d.ts +11 -0
- package/dist/common/src/util/common.d.ts +2 -0
- package/dist/common/src/util/conditions.d.ts +26 -0
- package/dist/common/src/util/entities.d.ts +58 -0
- package/dist/common/src/util/enums.d.ts +3 -0
- package/dist/common/src/util/index.d.ts +16 -0
- package/dist/common/src/util/navigation_from_path.d.ts +34 -0
- package/dist/common/src/util/navigation_utils.d.ts +20 -0
- package/dist/common/src/util/parent_references_from_path.d.ts +6 -0
- package/dist/common/src/util/paths.d.ts +14 -0
- package/dist/common/src/util/permissions.d.ts +5 -0
- package/dist/common/src/util/references.d.ts +2 -0
- package/dist/common/src/util/relations.d.ts +22 -0
- package/dist/common/src/util/resolutions.d.ts +72 -0
- package/dist/common/src/util/storage.d.ts +24 -0
- package/dist/core/src/components/AIIcon.d.ts +16 -0
- package/dist/core/src/components/ConfirmationDialog.d.ts +9 -0
- package/dist/core/src/components/Debug/UIReferenceView.d.ts +1 -0
- package/dist/core/src/components/Debug/UIStyleGuide.d.ts +1 -0
- package/dist/core/src/components/ErrorTooltip.d.ts +2 -0
- package/dist/core/src/components/ErrorView.d.ts +21 -0
- package/dist/core/src/components/LanguageToggle.d.ts +1 -0
- package/dist/core/src/components/LoginView/LoginView.d.ts +68 -0
- package/dist/core/src/components/LoginView/index.d.ts +2 -0
- package/dist/core/src/components/NotFoundPage.d.ts +1 -0
- package/dist/core/src/components/RebaseAuth.d.ts +10 -0
- package/dist/core/src/components/RebaseLogo.d.ts +7 -0
- package/dist/core/src/components/UnsavedChangesDialog.d.ts +9 -0
- package/dist/core/src/components/UserDisplay.d.ts +7 -0
- package/dist/core/src/components/UserSelectPopover.d.ts +62 -0
- package/dist/core/src/components/UserSettingsView.d.ts +1 -0
- package/dist/core/src/components/common/index.d.ts +6 -0
- package/dist/core/src/components/common/table_height.d.ts +5 -0
- package/dist/core/src/components/common/types.d.ts +63 -0
- package/dist/core/src/components/common/useColumnsIds.d.ts +9 -0
- package/dist/core/src/components/common/useDataTableController.d.ts +45 -0
- package/dist/core/src/components/common/useDebouncedData.d.ts +9 -0
- package/dist/core/src/components/common/useScrollRestoration.d.ts +14 -0
- package/dist/core/src/components/index.d.ts +16 -0
- package/dist/core/src/contexts/AdminModeController.d.ts +4 -0
- package/dist/core/src/contexts/AnalyticsContext.d.ts +3 -0
- package/dist/core/src/contexts/AuthControllerContext.d.ts +3 -0
- package/dist/core/src/contexts/CustomizationControllerContext.d.ts +3 -0
- package/dist/core/src/contexts/DataDriverContext.d.ts +3 -0
- package/dist/core/src/contexts/DatabaseAdminContext.d.ts +3 -0
- package/dist/core/src/contexts/DialogsProvider.d.ts +4 -0
- package/dist/core/src/contexts/EffectiveRoleController.d.ts +4 -0
- package/dist/core/src/contexts/InternalUserManagementContext.d.ts +3 -0
- package/dist/core/src/contexts/ModeController.d.ts +4 -0
- package/dist/core/src/contexts/RebaseClientInstanceContext.d.ts +6 -0
- package/dist/core/src/contexts/RebaseDataContext.d.ts +3 -0
- package/dist/core/src/contexts/SnackbarProvider.d.ts +2 -0
- package/dist/core/src/contexts/StorageSourceContext.d.ts +3 -0
- package/dist/core/src/contexts/UserConfigurationPersistenceContext.d.ts +3 -0
- package/dist/core/src/contexts/index.d.ts +13 -0
- package/dist/core/src/core/PluginLifecycleManager.d.ts +17 -0
- package/dist/core/src/core/PluginProviderStack.d.ts +21 -0
- package/dist/core/src/core/Rebase.d.ts +14 -0
- package/dist/core/src/core/RebaseProps.d.ts +136 -0
- package/dist/core/src/core/RebaseRouter.d.ts +4 -0
- package/dist/core/src/core/RebaseRoutes.d.ts +17 -0
- package/dist/core/src/core/index.d.ts +4 -0
- package/dist/core/src/hooks/ApiConfigContext.d.ts +24 -0
- package/dist/core/src/hooks/data/delete.d.ts +31 -0
- package/dist/core/src/hooks/data/save.d.ts +34 -0
- package/dist/core/src/hooks/data/useCollectionFetch.d.ts +51 -0
- package/dist/core/src/hooks/data/useData.d.ts +13 -0
- package/dist/core/src/hooks/data/useDataOrder.d.ts +12 -0
- package/dist/core/src/hooks/data/useEntityFetch.d.ts +38 -0
- package/dist/core/src/hooks/data/useRelationSelector.d.ts +52 -0
- package/dist/core/src/hooks/data/useUserSelector.d.ts +31 -0
- package/dist/core/src/hooks/index.d.ts +37 -0
- package/dist/core/src/hooks/useAdminModeController.d.ts +19 -0
- package/dist/core/src/hooks/useAnalyticsController.d.ts +5 -0
- package/dist/core/src/hooks/useAuthController.d.ts +11 -0
- package/dist/core/src/hooks/useAuthSubscription.d.ts +2 -0
- package/dist/core/src/hooks/useBackendStorageSource.d.ts +30 -0
- package/dist/core/src/hooks/useBridgeRegistration.d.ts +18 -0
- package/dist/core/src/hooks/useBrowserTitleAndIcon.d.ts +6 -0
- package/dist/core/src/hooks/useBuildAdminModeController.d.ts +6 -0
- package/dist/core/src/hooks/useBuildEffectiveRoleController.d.ts +8 -0
- package/dist/core/src/hooks/useBuildLocalConfigurationPersistence.d.ts +2 -0
- package/dist/core/src/hooks/useBuildModeController.d.ts +6 -0
- package/dist/core/src/hooks/useClipboard.d.ts +57 -0
- package/dist/core/src/hooks/useCollapsedGroups.d.ts +12 -0
- package/dist/core/src/hooks/useCustomizationController.d.ts +11 -0
- package/dist/core/src/hooks/useDialogsController.d.ts +11 -0
- package/dist/core/src/hooks/useEffectiveRoleController.d.ts +7 -0
- package/dist/core/src/hooks/useInternalUserManagementController.d.ts +12 -0
- package/dist/core/src/hooks/useLargeLayout.d.ts +1 -0
- package/dist/core/src/hooks/useModeController.d.ts +19 -0
- package/dist/core/src/hooks/usePermissions.d.ts +12 -0
- package/dist/core/src/hooks/useRebaseClient.d.ts +5 -0
- package/dist/core/src/hooks/useRebaseContext.d.ts +11 -0
- package/dist/core/src/hooks/useRebaseRegistry.d.ts +34 -0
- package/dist/core/src/hooks/useSlot.d.ts +18 -0
- package/dist/core/src/hooks/useSnackbarController.d.ts +20 -0
- package/dist/core/src/hooks/useStorageSource.d.ts +7 -0
- package/dist/core/src/hooks/useStudioBridge.d.ts +91 -0
- package/dist/core/src/hooks/useTranslation.d.ts +17 -0
- package/dist/core/src/hooks/useUnsavedChangesDialog.d.ts +12 -0
- package/dist/core/src/hooks/useUserConfigurationPersistence.d.ts +8 -0
- package/dist/core/src/hooks/useValidateAuthenticator.d.ts +21 -0
- package/dist/core/src/i18n/RebaseI18nProvider.d.ts +33 -0
- package/dist/core/src/index.d.ts +15 -0
- package/dist/core/src/internal/common.d.ts +3 -0
- package/dist/core/src/internal/useRestoreScroll.d.ts +6 -0
- package/dist/core/src/locales/de.d.ts +2 -0
- package/dist/core/src/locales/en.d.ts +10 -0
- package/dist/core/src/locales/es.d.ts +10 -0
- package/dist/core/src/locales/fr.d.ts +2 -0
- package/dist/core/src/locales/hi.d.ts +2 -0
- package/dist/core/src/locales/it.d.ts +2 -0
- package/dist/core/src/locales/pt.d.ts +7 -0
- package/dist/core/src/util/constants.d.ts +1 -0
- package/dist/core/src/util/createFormexStub.d.ts +2 -0
- package/dist/core/src/util/entity_cache.d.ts +27 -0
- package/dist/core/src/util/enums.d.ts +5 -0
- package/dist/core/src/util/icon_list.d.ts +5 -0
- package/dist/core/src/util/icon_synonyms.d.ts +1 -0
- package/dist/core/src/util/icons.d.ts +20 -0
- package/dist/core/src/util/index.d.ts +10 -0
- package/dist/core/src/util/previews.d.ts +4 -0
- package/dist/core/src/util/useStorageUploadController.d.ts +38 -0
- package/dist/core/src/util/useTraceUpdate.d.ts +2 -0
- package/dist/formex/src/Field.d.ts +52 -0
- package/dist/formex/src/Formex.d.ts +7 -0
- package/dist/formex/src/index.d.ts +5 -0
- package/dist/formex/src/types.d.ts +40 -0
- package/dist/formex/src/useCreateFormex.d.ts +14 -0
- package/dist/formex/src/utils.d.ts +16 -0
- package/dist/index.es.js +726 -0
- package/dist/index.es.js.map +1 -0
- package/dist/index.umd.js +9647 -0
- package/dist/index.umd.js.map +1 -0
- package/dist/studio/src/components/ApiExplorer/ApiExplorer.d.ts +9 -0
- package/dist/studio/src/components/ApiExplorer/EndpointDetail.d.ts +9 -0
- package/dist/studio/src/components/ApiExplorer/TryItPanel.d.ts +15 -0
- package/dist/studio/src/components/ApiExplorer/parseSpec.d.ts +16 -0
- package/dist/studio/src/components/ApiExplorer/types.d.ts +90 -0
- package/dist/studio/src/components/AuthSimulationSelector.d.ts +11 -0
- package/dist/studio/src/components/Branches/BranchesView.d.ts +1 -0
- package/dist/studio/src/components/CronJobs/CronJobsView.d.ts +1 -0
- package/dist/studio/src/components/JSEditor/JSEditor.d.ts +1 -0
- package/dist/studio/src/components/JSEditor/JSEditorSidebar.d.ts +21 -0
- package/dist/studio/src/components/JSEditor/JSMonacoEditor.d.ts +18 -0
- package/dist/studio/src/components/RLSEditor/PolicyEditor.d.ts +9 -0
- package/dist/studio/src/components/RLSEditor/RLSEditor.d.ts +19 -0
- package/dist/studio/src/components/RLSEditor/index.d.ts +1 -0
- package/dist/studio/src/components/RebaseStudio.d.ts +2 -0
- package/dist/studio/src/components/SQLEditor/ExplainVisualizer.d.ts +24 -0
- package/dist/studio/src/components/SQLEditor/MonacoEditor.d.ts +17 -0
- package/dist/studio/src/components/SQLEditor/SQLEditor.d.ts +11 -0
- package/dist/studio/src/components/SQLEditor/SQLEditorSidebar.d.ts +21 -0
- package/dist/studio/src/components/SQLEditor/SchemaBrowser.d.ts +8 -0
- package/dist/studio/src/components/SchemaVisualizer/RelationEdge.d.ts +3 -0
- package/dist/studio/src/components/SchemaVisualizer/SchemaVisualizer.d.ts +2 -0
- package/dist/studio/src/components/SchemaVisualizer/TableNode.d.ts +3 -0
- package/dist/studio/src/components/SchemaVisualizer/index.d.ts +5 -0
- package/dist/studio/src/components/SchemaVisualizer/schema-visualizer.utils.d.ts +42 -0
- package/dist/studio/src/components/SchemaVisualizer/useSchemaGraph.d.ts +37 -0
- package/dist/studio/src/components/StorageView/StorageView.d.ts +1 -0
- package/dist/studio/src/components/StudioHomePage.d.ts +9 -0
- package/dist/studio/src/index.d.ts +4 -0
- package/dist/studio/src/utils/entities.d.ts +0 -0
- package/dist/studio/src/utils/pgColumnToProperty.d.ts +6 -0
- package/dist/studio/src/utils/sql_utils.d.ts +52 -0
- package/dist/types/src/controllers/analytics_controller.d.ts +7 -0
- package/dist/types/src/controllers/auth.d.ts +119 -0
- package/dist/types/src/controllers/client.d.ts +170 -0
- package/dist/types/src/controllers/collection_registry.d.ts +45 -0
- package/dist/types/src/controllers/customization_controller.d.ts +60 -0
- package/dist/types/src/controllers/data.d.ts +168 -0
- package/dist/types/src/controllers/data_driver.d.ts +160 -0
- package/dist/types/src/controllers/database_admin.d.ts +11 -0
- package/dist/types/src/controllers/dialogs_controller.d.ts +36 -0
- package/dist/types/src/controllers/effective_role.d.ts +4 -0
- package/dist/types/src/controllers/email.d.ts +34 -0
- package/dist/types/src/controllers/index.d.ts +18 -0
- package/dist/types/src/controllers/local_config_persistence.d.ts +20 -0
- package/dist/types/src/controllers/navigation.d.ts +213 -0
- package/dist/types/src/controllers/registry.d.ts +54 -0
- package/dist/types/src/controllers/side_dialogs_controller.d.ts +67 -0
- package/dist/types/src/controllers/side_entity_controller.d.ts +90 -0
- package/dist/types/src/controllers/snackbar.d.ts +24 -0
- package/dist/types/src/controllers/storage.d.ts +171 -0
- package/dist/types/src/index.d.ts +4 -0
- package/dist/types/src/rebase_context.d.ts +105 -0
- package/dist/types/src/types/backend.d.ts +536 -0
- package/dist/types/src/types/builders.d.ts +15 -0
- package/dist/types/src/types/chips.d.ts +5 -0
- package/dist/types/src/types/collections.d.ts +856 -0
- package/dist/types/src/types/cron.d.ts +102 -0
- package/dist/types/src/types/data_source.d.ts +64 -0
- package/dist/types/src/types/entities.d.ts +145 -0
- package/dist/types/src/types/entity_actions.d.ts +98 -0
- package/dist/types/src/types/entity_callbacks.d.ts +173 -0
- package/dist/types/src/types/entity_link_builder.d.ts +7 -0
- package/dist/types/src/types/entity_overrides.d.ts +10 -0
- package/dist/types/src/types/entity_views.d.ts +61 -0
- package/dist/types/src/types/export_import.d.ts +21 -0
- package/dist/types/src/types/index.d.ts +23 -0
- package/dist/types/src/types/locales.d.ts +4 -0
- package/dist/types/src/types/modify_collections.d.ts +5 -0
- package/dist/types/src/types/plugins.d.ts +279 -0
- package/dist/types/src/types/properties.d.ts +1176 -0
- package/dist/types/src/types/property_config.d.ts +70 -0
- package/dist/types/src/types/relations.d.ts +336 -0
- package/dist/types/src/types/slots.d.ts +252 -0
- package/dist/types/src/types/translations.d.ts +870 -0
- package/dist/types/src/types/user_management_delegate.d.ts +121 -0
- package/dist/types/src/types/websockets.d.ts +78 -0
- package/dist/types/src/users/index.d.ts +2 -0
- package/dist/types/src/users/roles.d.ts +22 -0
- package/dist/types/src/users/user.d.ts +46 -0
- package/dist/ui/src/components/Alert.d.ts +12 -0
- package/dist/ui/src/components/Autocomplete.d.ts +21 -0
- package/dist/ui/src/components/Avatar.d.ts +11 -0
- package/dist/ui/src/components/Badge.d.ts +8 -0
- package/dist/ui/src/components/BooleanSwitch.d.ts +14 -0
- package/dist/ui/src/components/BooleanSwitchWithLabel.d.ts +17 -0
- package/dist/ui/src/components/Button.d.ts +14 -0
- package/dist/ui/src/components/Card.d.ts +9 -0
- package/dist/ui/src/components/CenteredView.d.ts +9 -0
- package/dist/ui/src/components/Checkbox.d.ts +13 -0
- package/dist/ui/src/components/Chip.d.ts +26 -0
- package/dist/ui/src/components/CircularProgress.d.ts +5 -0
- package/dist/ui/src/components/CircularProgressCenter.d.ts +11 -0
- package/dist/ui/src/components/Collapse.d.ts +9 -0
- package/dist/ui/src/components/ColorPicker.d.ts +30 -0
- package/dist/ui/src/components/Container.d.ts +8 -0
- package/dist/ui/src/components/DateTimeField.d.ts +24 -0
- package/dist/ui/src/components/DebouncedTextField.d.ts +2 -0
- package/dist/ui/src/components/Dialog.d.ts +39 -0
- package/dist/ui/src/components/DialogActions.d.ts +7 -0
- package/dist/ui/src/components/DialogContent.d.ts +7 -0
- package/dist/ui/src/components/DialogTitle.d.ts +10 -0
- package/dist/ui/src/components/ErrorBoundary.d.ts +11 -0
- package/dist/ui/src/components/ExpandablePanel.d.ts +12 -0
- package/dist/ui/src/components/FileUpload.d.ts +23 -0
- package/dist/ui/src/components/IconButton.d.ts +12 -0
- package/dist/ui/src/components/InfoLabel.d.ts +5 -0
- package/dist/ui/src/components/InputLabel.d.ts +11 -0
- package/dist/ui/src/components/Label.d.ts +7 -0
- package/dist/ui/src/components/LoadingButton.d.ts +7 -0
- package/dist/ui/src/components/Markdown.d.ts +10 -0
- package/dist/ui/src/components/Menu.d.ts +23 -0
- package/dist/ui/src/components/Menubar.d.ts +80 -0
- package/dist/ui/src/components/MultiSelect.d.ts +48 -0
- package/dist/ui/src/components/Paper.d.ts +6 -0
- package/dist/ui/src/components/Popover.d.ts +24 -0
- package/dist/ui/src/components/RadioGroup.d.ts +28 -0
- package/dist/ui/src/components/ResizablePanels.d.ts +18 -0
- package/dist/ui/src/components/SearchBar.d.ts +22 -0
- package/dist/ui/src/components/Select.d.ts +43 -0
- package/dist/ui/src/components/Separator.d.ts +5 -0
- package/dist/ui/src/components/Sheet.d.ts +22 -0
- package/dist/ui/src/components/Skeleton.d.ts +6 -0
- package/dist/ui/src/components/Slider.d.ts +21 -0
- package/dist/ui/src/components/Table.d.ts +34 -0
- package/dist/ui/src/components/Tabs.d.ts +19 -0
- package/dist/ui/src/components/TextField.d.ts +58 -0
- package/dist/ui/src/components/TextareaAutosize.d.ts +43 -0
- package/dist/ui/src/components/ToggleButtonGroup.d.ts +30 -0
- package/dist/ui/src/components/Tooltip.d.ts +19 -0
- package/dist/ui/src/components/Typography.d.ts +36 -0
- package/dist/ui/src/components/VirtualTable/VirtualTable.d.ts +11 -0
- package/dist/ui/src/components/VirtualTable/VirtualTableCell.d.ts +21 -0
- package/dist/ui/src/components/VirtualTable/VirtualTableHeader.d.ts +29 -0
- package/dist/ui/src/components/VirtualTable/VirtualTableHeaderRow.d.ts +2 -0
- package/dist/ui/src/components/VirtualTable/VirtualTableProps.d.ts +243 -0
- package/dist/ui/src/components/VirtualTable/VirtualTableRow.d.ts +3 -0
- package/dist/ui/src/components/VirtualTable/index.d.ts +3 -0
- package/dist/ui/src/components/VirtualTable/types.d.ts +38 -0
- package/dist/ui/src/components/common/SelectInputLabel.d.ts +5 -0
- package/dist/ui/src/components/index.d.ts +53 -0
- package/dist/ui/src/hooks/PortalContainerContext.d.ts +31 -0
- package/dist/ui/src/hooks/index.d.ts +6 -0
- package/dist/ui/src/hooks/useDebounceCallback.d.ts +1 -0
- package/dist/ui/src/hooks/useDebounceValue.d.ts +1 -0
- package/dist/ui/src/hooks/useDebouncedCallback.d.ts +1 -0
- package/dist/ui/src/hooks/useInjectStyles.d.ts +7 -0
- package/dist/ui/src/hooks/useOutsideAlerter.d.ts +5 -0
- package/dist/ui/src/icons/GitHubIcon.d.ts +2 -0
- package/dist/ui/src/icons/HandleIcon.d.ts +1 -0
- package/dist/ui/src/icons/Icon.d.ts +20 -0
- package/dist/ui/src/icons/cool_icon_keys.d.ts +1 -0
- package/dist/ui/src/icons/icon_keys.d.ts +1 -0
- package/dist/ui/src/icons/index.d.ts +6 -0
- package/dist/ui/src/index.d.ts +5 -0
- package/dist/ui/src/styles.d.ts +12 -0
- package/dist/ui/src/util/chip_colors.d.ts +4 -0
- package/dist/ui/src/util/cls.d.ts +2 -0
- package/dist/ui/src/util/debounce.d.ts +10 -0
- package/dist/ui/src/util/hash.d.ts +1 -0
- package/dist/ui/src/util/index.d.ts +4 -0
- package/dist/ui/src/util/key_to_icon_component.d.ts +1 -0
- package/package.json +84 -0
- package/src/components/ApiExplorer/ApiExplorer.tsx +290 -0
- package/src/components/ApiExplorer/EndpointDetail.tsx +271 -0
- package/src/components/ApiExplorer/TryItPanel.tsx +510 -0
- package/src/components/ApiExplorer/parseSpec.ts +104 -0
- package/src/components/ApiExplorer/types.ts +84 -0
- package/src/components/AuthSimulationSelector.tsx +77 -0
- package/src/components/Branches/BranchesView.tsx +370 -0
- package/src/components/CronJobs/CronJobsView.tsx +346 -0
- package/src/components/JSEditor/JSEditor.tsx +1033 -0
- package/src/components/JSEditor/JSEditorSidebar.tsx +340 -0
- package/src/components/JSEditor/JSMonacoEditor.tsx +390 -0
- package/src/components/RLSEditor/PolicyEditor.tsx +444 -0
- package/src/components/RLSEditor/RLSEditor.tsx +692 -0
- package/src/components/RLSEditor/index.ts +1 -0
- package/src/components/RebaseStudio.tsx +121 -0
- package/src/components/SQLEditor/ExplainVisualizer.tsx +128 -0
- package/src/components/SQLEditor/MonacoEditor.tsx +203 -0
- package/src/components/SQLEditor/SQLEditor.tsx +1419 -0
- package/src/components/SQLEditor/SQLEditorSidebar.tsx +174 -0
- package/src/components/SQLEditor/SchemaBrowser.tsx +158 -0
- package/src/components/SchemaVisualizer/RelationEdge.tsx +102 -0
- package/src/components/SchemaVisualizer/SchemaVisualizer.tsx +665 -0
- package/src/components/SchemaVisualizer/TableNode.tsx +257 -0
- package/src/components/SchemaVisualizer/index.ts +5 -0
- package/src/components/SchemaVisualizer/schema-visualizer.utils.ts +140 -0
- package/src/components/SchemaVisualizer/useSchemaGraph.ts +397 -0
- package/src/components/StorageView/StorageView.tsx +1035 -0
- package/src/components/StudioHomePage.tsx +357 -0
- package/src/index.ts +31 -0
- package/src/utils/entities.ts +2 -0
- package/src/utils/pgColumnToProperty.test.ts +401 -0
- package/src/utils/pgColumnToProperty.ts +275 -0
- package/src/utils/sql_utils.test.ts +265 -0
- package/src/utils/sql_utils.ts +291 -0
- package/src/vite-env.d.ts +1 -0
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
import { jsxs, jsx, Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { c } from "react-compiler-runtime";
|
|
3
|
+
import { useState, useRef, useCallback, useEffect } from "react";
|
|
4
|
+
import { iconSize, Typography, CircularProgress, Chip, IconButton, cls, defaultBorderMixin, Button, Alert, Dialog, DialogTitle, DialogContent, TextField, Select, SelectItem, DialogActions } from "@rebasepro/ui";
|
|
5
|
+
import { GitBranchIcon, RefreshCwIcon, PlusIcon, CopyIcon, Trash2Icon } from "lucide-react";
|
|
6
|
+
import { useRebaseContext, useSnackbarController, ConfirmationDialog } from "@rebasepro/core";
|
|
7
|
+
import { isBranchAdmin } from "@rebasepro/types";
|
|
8
|
+
function formatSize(bytes) {
|
|
9
|
+
if (bytes === void 0 || bytes === null) return "—";
|
|
10
|
+
if (bytes < 1024) return `${bytes} B`;
|
|
11
|
+
if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;
|
|
12
|
+
if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
|
|
13
|
+
return `${(bytes / (1024 * 1024 * 1024)).toFixed(2)} GB`;
|
|
14
|
+
}
|
|
15
|
+
function formatRelative(date) {
|
|
16
|
+
if (!date) return "—";
|
|
17
|
+
const d = date instanceof Date ? date : new Date(date);
|
|
18
|
+
if (isNaN(d.getTime())) return "—";
|
|
19
|
+
const now = Date.now();
|
|
20
|
+
const diff = now - d.getTime();
|
|
21
|
+
if (diff < 6e4) return "just now";
|
|
22
|
+
if (diff < 36e5) {
|
|
23
|
+
const m = Math.round(diff / 6e4);
|
|
24
|
+
return `${m}m ago`;
|
|
25
|
+
}
|
|
26
|
+
if (diff < 864e5) {
|
|
27
|
+
const h = Math.round(diff / 36e5);
|
|
28
|
+
return `${h}h ago`;
|
|
29
|
+
}
|
|
30
|
+
if (diff < 6048e5) {
|
|
31
|
+
const d2 = Math.round(diff / 864e5);
|
|
32
|
+
return `${d2}d ago`;
|
|
33
|
+
}
|
|
34
|
+
return d.toLocaleDateString();
|
|
35
|
+
}
|
|
36
|
+
function BranchesView() {
|
|
37
|
+
const {
|
|
38
|
+
databaseAdmin
|
|
39
|
+
} = useRebaseContext();
|
|
40
|
+
const snackbar = useSnackbarController();
|
|
41
|
+
const [branches, setBranches] = useState([]);
|
|
42
|
+
const [loading, setLoading] = useState(true);
|
|
43
|
+
const [selectedBranch, setSelectedBranch] = useState(null);
|
|
44
|
+
const [createOpen, setCreateOpen] = useState(false);
|
|
45
|
+
const [newBranchName, setNewBranchName] = useState("");
|
|
46
|
+
const [sourceBranch, setSourceBranch] = useState(void 0);
|
|
47
|
+
const [creating, setCreating] = useState(false);
|
|
48
|
+
const [deleteTarget, setDeleteTarget] = useState(null);
|
|
49
|
+
const [deleting, setDeleting] = useState(false);
|
|
50
|
+
const snackbarRef = useRef(snackbar);
|
|
51
|
+
snackbarRef.current = snackbar;
|
|
52
|
+
const branchAdmin = isBranchAdmin(databaseAdmin) ? databaseAdmin : void 0;
|
|
53
|
+
const loadBranches = useCallback(async () => {
|
|
54
|
+
if (!branchAdmin) {
|
|
55
|
+
setLoading(false);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
try {
|
|
59
|
+
const result = await branchAdmin.listBranches();
|
|
60
|
+
setBranches(result);
|
|
61
|
+
} catch (e) {
|
|
62
|
+
snackbarRef.current.open({
|
|
63
|
+
type: "error",
|
|
64
|
+
message: e instanceof Error ? e.message : String(e)
|
|
65
|
+
});
|
|
66
|
+
} finally {
|
|
67
|
+
setLoading(false);
|
|
68
|
+
}
|
|
69
|
+
}, [branchAdmin]);
|
|
70
|
+
useEffect(() => {
|
|
71
|
+
loadBranches();
|
|
72
|
+
}, [loadBranches]);
|
|
73
|
+
const handleCreate = async () => {
|
|
74
|
+
if (!branchAdmin || !newBranchName.trim()) return;
|
|
75
|
+
setCreating(true);
|
|
76
|
+
try {
|
|
77
|
+
await branchAdmin.createBranch(newBranchName.trim(), sourceBranch ? {
|
|
78
|
+
source: sourceBranch
|
|
79
|
+
} : void 0);
|
|
80
|
+
snackbarRef.current.open({
|
|
81
|
+
type: "success",
|
|
82
|
+
message: `Branch "${newBranchName.trim()}" created successfully`
|
|
83
|
+
});
|
|
84
|
+
setCreateOpen(false);
|
|
85
|
+
setNewBranchName("");
|
|
86
|
+
setSourceBranch(void 0);
|
|
87
|
+
await loadBranches();
|
|
88
|
+
} catch (e_0) {
|
|
89
|
+
snackbarRef.current.open({
|
|
90
|
+
type: "error",
|
|
91
|
+
message: e_0 instanceof Error ? e_0.message : String(e_0)
|
|
92
|
+
});
|
|
93
|
+
} finally {
|
|
94
|
+
setCreating(false);
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
const handleDelete = async () => {
|
|
98
|
+
if (!branchAdmin || !deleteTarget) return;
|
|
99
|
+
setDeleting(true);
|
|
100
|
+
try {
|
|
101
|
+
await branchAdmin.deleteBranch(deleteTarget);
|
|
102
|
+
snackbarRef.current.open({
|
|
103
|
+
type: "success",
|
|
104
|
+
message: `Branch "${deleteTarget}" deleted`
|
|
105
|
+
});
|
|
106
|
+
if (selectedBranch === deleteTarget) setSelectedBranch(null);
|
|
107
|
+
setDeleteTarget(null);
|
|
108
|
+
await loadBranches();
|
|
109
|
+
} catch (e_1) {
|
|
110
|
+
snackbarRef.current.open({
|
|
111
|
+
type: "error",
|
|
112
|
+
message: e_1 instanceof Error ? e_1.message : String(e_1)
|
|
113
|
+
});
|
|
114
|
+
} finally {
|
|
115
|
+
setDeleting(false);
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
if (!branchAdmin) {
|
|
119
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center justify-center h-full gap-4 text-center p-8", children: [
|
|
120
|
+
/* @__PURE__ */ jsx(GitBranchIcon, { size: iconSize.large, className: "text-surface-300 dark:text-surface-600" }),
|
|
121
|
+
/* @__PURE__ */ jsx(Typography, { variant: "h6", color: "secondary", children: "Database Branching Not Available" }),
|
|
122
|
+
/* @__PURE__ */ jsxs(Typography, { variant: "body2", color: "disabled", className: "max-w-md", children: [
|
|
123
|
+
"Branching requires a PostgreSQL backend with an admin connection configured. Set ",
|
|
124
|
+
/* @__PURE__ */ jsx("code", { className: "text-xs bg-surface-100 dark:bg-surface-950 px-1.5 py-0.5 rounded font-mono", children: "adminConnectionString" }),
|
|
125
|
+
" in your server configuration."
|
|
126
|
+
] })
|
|
127
|
+
] });
|
|
128
|
+
}
|
|
129
|
+
if (loading) {
|
|
130
|
+
return /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center h-full", children: /* @__PURE__ */ jsx(CircularProgress, {}) });
|
|
131
|
+
}
|
|
132
|
+
const selected = branches.find((b) => b.name === selectedBranch);
|
|
133
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex h-full w-full overflow-hidden bg-white dark:bg-surface-950", children: [
|
|
134
|
+
/* @__PURE__ */ jsxs("div", { className: cls("flex flex-col w-[340px] min-w-[280px] border-r h-full", defaultBorderMixin), children: [
|
|
135
|
+
/* @__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: [
|
|
136
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
137
|
+
/* @__PURE__ */ jsx(GitBranchIcon, { size: iconSize.small, className: "text-primary" }),
|
|
138
|
+
/* @__PURE__ */ jsx(Typography, { variant: "subtitle2", className: "font-semibold", children: "Branches" }),
|
|
139
|
+
/* @__PURE__ */ jsx(Chip, { size: "smallest", className: "bg-surface-200 dark:bg-surface-700 text-surface-600 dark:text-surface-300", children: branches.length })
|
|
140
|
+
] }),
|
|
141
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
|
|
142
|
+
/* @__PURE__ */ jsx(IconButton, { size: "small", onClick: loadBranches, title: "Refresh", children: /* @__PURE__ */ jsx(RefreshCwIcon, { size: iconSize.smallest }) }),
|
|
143
|
+
/* @__PURE__ */ jsx(IconButton, { size: "small", onClick: () => setCreateOpen(true), title: "Create branch", className: "text-primary", children: /* @__PURE__ */ jsx(PlusIcon, { size: iconSize.smallest }) })
|
|
144
|
+
] })
|
|
145
|
+
] }),
|
|
146
|
+
/* @__PURE__ */ jsx("div", { className: "flex-1 overflow-y-auto p-2 space-y-1", children: branches.length === 0 ? /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center justify-center h-full gap-3 text-center px-4", children: [
|
|
147
|
+
/* @__PURE__ */ jsx(CopyIcon, { size: iconSize.small, className: "text-surface-300 dark:text-surface-600" }),
|
|
148
|
+
/* @__PURE__ */ jsx(Typography, { variant: "body2", color: "disabled", className: "text-[13px]", children: "No branches yet. Create one to start working with an isolated database copy." }),
|
|
149
|
+
/* @__PURE__ */ jsx(Button, { size: "small", variant: "outlined", onClick: () => setCreateOpen(true), startIcon: /* @__PURE__ */ jsx(PlusIcon, { size: iconSize.smallest }), children: "Create Branch" })
|
|
150
|
+
] }) : branches.map((branch) => /* @__PURE__ */ jsxs("div", { onClick: () => setSelectedBranch(branch.name), className: cls("flex items-center gap-3 px-3 py-2.5 rounded-lg cursor-pointer transition-all", selectedBranch === branch.name ? "bg-primary/10 dark:bg-primary/15 ring-1 ring-primary/30" : "hover:bg-surface-100 dark:hover:bg-surface-950"), children: [
|
|
151
|
+
/* @__PURE__ */ jsx("div", { className: "w-2 h-2 rounded-full shrink-0 bg-emerald-500" }),
|
|
152
|
+
/* @__PURE__ */ jsxs("div", { className: "flex-1 min-w-0", children: [
|
|
153
|
+
/* @__PURE__ */ jsx(Typography, { variant: "body2", className: "truncate font-medium text-[13px]", children: branch.name }),
|
|
154
|
+
/* @__PURE__ */ jsxs(Typography, { variant: "caption", color: "secondary", className: "truncate text-[11px]", children: [
|
|
155
|
+
"from ",
|
|
156
|
+
branch.parentDatabase,
|
|
157
|
+
" · ",
|
|
158
|
+
formatRelative(branch.createdAt)
|
|
159
|
+
] })
|
|
160
|
+
] }),
|
|
161
|
+
branch.sizeBytes !== void 0 && /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "disabled", className: "font-mono text-[10px] shrink-0", children: formatSize(branch.sizeBytes) })
|
|
162
|
+
] }, branch.name)) })
|
|
163
|
+
] }),
|
|
164
|
+
/* @__PURE__ */ jsx("div", { className: "flex-1 flex flex-col min-w-0 h-full overflow-hidden", children: !selected ? /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center justify-center h-full gap-3", children: [
|
|
165
|
+
/* @__PURE__ */ jsx(GitBranchIcon, { size: iconSize.large, className: "text-surface-200 dark:text-surface-700" }),
|
|
166
|
+
/* @__PURE__ */ jsx(Typography, { variant: "body2", color: "disabled", children: branches.length === 0 ? "Create a branch to get started" : "Select a branch to view details" })
|
|
167
|
+
] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
168
|
+
/* @__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: [
|
|
169
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 min-w-0", children: [
|
|
170
|
+
/* @__PURE__ */ jsx("div", { className: "w-2.5 h-2.5 rounded-full bg-emerald-500" }),
|
|
171
|
+
/* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
|
|
172
|
+
/* @__PURE__ */ jsx(Typography, { variant: "subtitle1", className: "font-semibold truncate", children: selected.name }),
|
|
173
|
+
/* @__PURE__ */ jsxs(Typography, { variant: "caption", color: "secondary", className: "truncate", children: [
|
|
174
|
+
"Created from ",
|
|
175
|
+
/* @__PURE__ */ jsx("span", { className: "font-mono text-[11px]", children: selected.parentDatabase })
|
|
176
|
+
] })
|
|
177
|
+
] })
|
|
178
|
+
] }),
|
|
179
|
+
/* @__PURE__ */ jsx("div", { className: "flex items-center gap-2 shrink-0", children: /* @__PURE__ */ jsx(Button, { size: "small", color: "error", variant: "outlined", onClick: () => setDeleteTarget(selected.name), startIcon: /* @__PURE__ */ jsx(Trash2Icon, { size: iconSize.smallest }), children: "Delete" }) })
|
|
180
|
+
] }),
|
|
181
|
+
/* @__PURE__ */ jsx("div", { className: "px-5 py-4 bg-surface-50 dark:bg-surface-900/50", children: /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 md:grid-cols-4 gap-3", children: [
|
|
182
|
+
/* @__PURE__ */ jsx(StatCard, { label: "Branch Name", value: selected.name, mono: true }),
|
|
183
|
+
/* @__PURE__ */ jsx(StatCard, { label: "Source Database", value: selected.parentDatabase, mono: true }),
|
|
184
|
+
/* @__PURE__ */ jsx(StatCard, { label: "Created", value: formatRelative(selected.createdAt) }),
|
|
185
|
+
/* @__PURE__ */ jsx(StatCard, { label: "Size", value: formatSize(selected.sizeBytes) })
|
|
186
|
+
] }) }),
|
|
187
|
+
/* @__PURE__ */ jsxs("div", { className: "flex-1 overflow-y-auto px-5 py-4", children: [
|
|
188
|
+
/* @__PURE__ */ jsx(Alert, { color: "info", children: /* @__PURE__ */ jsxs(Typography, { variant: "body2", className: "text-[13px]", children: [
|
|
189
|
+
/* @__PURE__ */ jsx("strong", { children: "How to use this branch:" }),
|
|
190
|
+
" Switch your application's database connection to",
|
|
191
|
+
/* @__PURE__ */ jsx("code", { className: "mx-1 px-1.5 py-0.5 rounded bg-surface-100 dark:bg-surface-950 font-mono text-[12px]", children: selected.name }),
|
|
192
|
+
"to work with an isolated copy of your data. Changes made to this branch won't affect your main database."
|
|
193
|
+
] }) }),
|
|
194
|
+
/* @__PURE__ */ jsxs("div", { className: "mt-4 p-4 rounded-lg border bg-surface-50 dark:bg-surface-900 border-surface-200 dark:border-surface-700", children: [
|
|
195
|
+
/* @__PURE__ */ jsx(Typography, { variant: "caption", className: "text-[10px] uppercase tracking-wider text-surface-400 mb-2 block font-medium", children: "Connection Details" }),
|
|
196
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
|
|
197
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
198
|
+
/* @__PURE__ */ jsx(Typography, { variant: "caption", color: "secondary", className: "w-24 shrink-0 text-[11px]", children: "Database:" }),
|
|
199
|
+
/* @__PURE__ */ jsx(Typography, { variant: "body2", className: "font-mono text-[12px]", children: selected.name })
|
|
200
|
+
] }),
|
|
201
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
202
|
+
/* @__PURE__ */ jsx(Typography, { variant: "caption", color: "secondary", className: "w-24 shrink-0 text-[11px]", children: "Branched from:" }),
|
|
203
|
+
/* @__PURE__ */ jsx(Typography, { variant: "body2", className: "font-mono text-[12px]", children: selected.parentDatabase })
|
|
204
|
+
] }),
|
|
205
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
206
|
+
/* @__PURE__ */ jsx(Typography, { variant: "caption", color: "secondary", className: "w-24 shrink-0 text-[11px]", children: "Created at:" }),
|
|
207
|
+
/* @__PURE__ */ jsx(Typography, { variant: "body2", className: "font-mono text-[12px]", children: selected.createdAt instanceof Date ? selected.createdAt.toLocaleString() : new Date(selected.createdAt).toLocaleString() })
|
|
208
|
+
] })
|
|
209
|
+
] })
|
|
210
|
+
] })
|
|
211
|
+
] })
|
|
212
|
+
] }) }),
|
|
213
|
+
/* @__PURE__ */ jsxs(Dialog, { open: createOpen, onOpenChange: setCreateOpen, children: [
|
|
214
|
+
/* @__PURE__ */ jsx(DialogTitle, { children: "Create New Branch" }),
|
|
215
|
+
/* @__PURE__ */ jsxs(DialogContent, { className: "space-y-4 min-w-[400px]", children: [
|
|
216
|
+
/* @__PURE__ */ jsx(Typography, { variant: "body2", color: "secondary", className: "text-[13px]", children: "Create an isolated database copy. The branch will be a full clone of the source database at this point in time." }),
|
|
217
|
+
/* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx(TextField, { label: "Branch Name", value: newBranchName, onChange: (e_2) => setNewBranchName(e_2.target.value), placeholder: "e.g. feature-auth, staging, preview-pr-42", size: "small", autoFocus: true }) }),
|
|
218
|
+
branches.length > 0 && /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsxs(Select, { label: "Source Database", value: sourceBranch ?? "", onValueChange: (v) => setSourceBranch(v || void 0), placeholder: "Default (main database)", size: "small", renderValue: (v_0) => v_0 || "Default (main database)", children: [
|
|
219
|
+
/* @__PURE__ */ jsx(SelectItem, { value: "", children: "Default (main database)" }),
|
|
220
|
+
branches.map((b_0) => /* @__PURE__ */ jsx(SelectItem, { value: b_0.name, children: b_0.name }, b_0.name))
|
|
221
|
+
] }) })
|
|
222
|
+
] }),
|
|
223
|
+
/* @__PURE__ */ jsxs(DialogActions, { children: [
|
|
224
|
+
/* @__PURE__ */ jsx(Button, { variant: "text", onClick: () => setCreateOpen(false), disabled: creating, children: "Cancel" }),
|
|
225
|
+
/* @__PURE__ */ jsx(Button, { color: "primary", onClick: handleCreate, disabled: !newBranchName.trim() || creating, startIcon: creating ? /* @__PURE__ */ jsx(CircularProgress, { size: "smallest" }) : /* @__PURE__ */ jsx(PlusIcon, { size: iconSize.smallest }), children: creating ? "Creating..." : "Create Branch" })
|
|
226
|
+
] })
|
|
227
|
+
] }),
|
|
228
|
+
/* @__PURE__ */ jsx(ConfirmationDialog, { open: !!deleteTarget, onAccept: handleDelete, onCancel: () => setDeleteTarget(null), title: "Delete Branch", body: /* @__PURE__ */ jsxs(Typography, { variant: "body2", children: [
|
|
229
|
+
"Are you sure you want to permanently delete the branch ",
|
|
230
|
+
/* @__PURE__ */ jsx("strong", { children: deleteTarget }),
|
|
231
|
+
"? This action cannot be undone and all data in this branch will be lost."
|
|
232
|
+
] }), loading: deleting })
|
|
233
|
+
] });
|
|
234
|
+
}
|
|
235
|
+
function StatCard(t0) {
|
|
236
|
+
const $ = c(11);
|
|
237
|
+
const {
|
|
238
|
+
label,
|
|
239
|
+
value,
|
|
240
|
+
mono
|
|
241
|
+
} = t0;
|
|
242
|
+
let t1;
|
|
243
|
+
if ($[0] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
|
|
244
|
+
t1 = cls("px-3 py-2 rounded-lg border bg-white dark:bg-surface-900", defaultBorderMixin);
|
|
245
|
+
$[0] = t1;
|
|
246
|
+
} else {
|
|
247
|
+
t1 = $[0];
|
|
248
|
+
}
|
|
249
|
+
let t2;
|
|
250
|
+
if ($[1] !== label) {
|
|
251
|
+
t2 = /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "secondary", className: "text-[10px] uppercase tracking-wider font-medium", children: label });
|
|
252
|
+
$[1] = label;
|
|
253
|
+
$[2] = t2;
|
|
254
|
+
} else {
|
|
255
|
+
t2 = $[2];
|
|
256
|
+
}
|
|
257
|
+
const t3 = mono && "font-mono";
|
|
258
|
+
let t4;
|
|
259
|
+
if ($[3] !== t3) {
|
|
260
|
+
t4 = cls("mt-0.5 font-semibold text-[13px] truncate", t3);
|
|
261
|
+
$[3] = t3;
|
|
262
|
+
$[4] = t4;
|
|
263
|
+
} else {
|
|
264
|
+
t4 = $[4];
|
|
265
|
+
}
|
|
266
|
+
let t5;
|
|
267
|
+
if ($[5] !== t4 || $[6] !== value) {
|
|
268
|
+
t5 = /* @__PURE__ */ jsx(Typography, { variant: "body2", className: t4, children: value });
|
|
269
|
+
$[5] = t4;
|
|
270
|
+
$[6] = value;
|
|
271
|
+
$[7] = t5;
|
|
272
|
+
} else {
|
|
273
|
+
t5 = $[7];
|
|
274
|
+
}
|
|
275
|
+
let t6;
|
|
276
|
+
if ($[8] !== t2 || $[9] !== t5) {
|
|
277
|
+
t6 = /* @__PURE__ */ jsxs("div", { className: t1, children: [
|
|
278
|
+
t2,
|
|
279
|
+
t5
|
|
280
|
+
] });
|
|
281
|
+
$[8] = t2;
|
|
282
|
+
$[9] = t5;
|
|
283
|
+
$[10] = t6;
|
|
284
|
+
} else {
|
|
285
|
+
t6 = $[10];
|
|
286
|
+
}
|
|
287
|
+
return t6;
|
|
288
|
+
}
|
|
289
|
+
export {
|
|
290
|
+
BranchesView
|
|
291
|
+
};
|
|
292
|
+
//# sourceMappingURL=BranchesView-DcHZtvXo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BranchesView-DcHZtvXo.js","sources":["../src/components/Branches/BranchesView.tsx"],"sourcesContent":["\nimport React, { useState, useEffect, useRef, useCallback } from \"react\";\nimport { Typography, cls, defaultBorderMixin, Button, Chip, CircularProgress, IconButton, Paper, Dialog, DialogTitle, DialogContent, DialogActions, TextField, Select, SelectItem, Alert , iconSize } from \"@rebasepro/ui\";\nimport { GitBranchIcon, Trash2Icon, RefreshCwIcon, PlusIcon, CopyIcon } from \"lucide-react\";\nimport { useRebaseContext, useSnackbarController, ConfirmationDialog } from \"@rebasepro/core\";\nimport { isBranchAdmin } from \"@rebasepro/types\";\nimport type { BranchInfo } from \"@rebasepro/types\";\n\nfunction formatSize(bytes: number | undefined): string {\n if (bytes === undefined || bytes === null) return \"—\";\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(2)} GB`;\n}\n\nfunction formatRelative(date: Date | string | undefined): string {\n if (!date) return \"—\";\n const d = date instanceof Date ? date : new Date(date);\n if (isNaN(d.getTime())) return \"—\";\n const now = Date.now();\n const diff = now - d.getTime();\n if (diff < 60_000) return \"just now\";\n if (diff < 3_600_000) { const m = Math.round(diff / 60_000); return `${m}m ago`; }\n if (diff < 86_400_000) { const h = Math.round(diff / 3_600_000); return `${h}h ago`; }\n if (diff < 604_800_000) { const d2 = Math.round(diff / 86_400_000); return `${d2}d ago`; }\n return d.toLocaleDateString();\n}\n\nexport function BranchesView() {\n const { databaseAdmin } = useRebaseContext();\n const snackbar = useSnackbarController();\n\n const [branches, setBranches] = useState<BranchInfo[]>([]);\n const [loading, setLoading] = useState(true);\n const [selectedBranch, setSelectedBranch] = useState<string | null>(null);\n\n // Create dialog\n const [createOpen, setCreateOpen] = useState(false);\n const [newBranchName, setNewBranchName] = useState(\"\");\n const [sourceBranch, setSourceBranch] = useState<string | undefined>(undefined);\n const [creating, setCreating] = useState(false);\n\n // Delete confirm\n const [deleteTarget, setDeleteTarget] = useState<string | null>(null);\n const [deleting, setDeleting] = useState(false);\n\n // Refs\n const snackbarRef = useRef(snackbar);\n snackbarRef.current = snackbar;\n\n const branchAdmin = isBranchAdmin(databaseAdmin) ? databaseAdmin : undefined;\n\n const loadBranches = useCallback(async () => {\n if (!branchAdmin) {\n setLoading(false);\n return;\n }\n try {\n const result = await branchAdmin.listBranches();\n setBranches(result);\n } catch (e: unknown) {\n snackbarRef.current.open({\n type: \"error\",\n message: e instanceof Error ? e.message : String(e)\n });\n } finally {\n setLoading(false);\n }\n }, [branchAdmin]);\n\n useEffect(() => {\n loadBranches();\n }, [loadBranches]);\n\n const handleCreate = async () => {\n if (!branchAdmin || !newBranchName.trim()) return;\n setCreating(true);\n try {\n await branchAdmin.createBranch(newBranchName.trim(), sourceBranch ? { source: sourceBranch } : undefined);\n snackbarRef.current.open({\n type: \"success\",\n message: `Branch \"${newBranchName.trim()}\" created successfully`\n });\n setCreateOpen(false);\n setNewBranchName(\"\");\n setSourceBranch(undefined);\n await loadBranches();\n } catch (e: unknown) {\n snackbarRef.current.open({\n type: \"error\",\n message: e instanceof Error ? e.message : String(e)\n });\n } finally {\n setCreating(false);\n }\n };\n\n const handleDelete = async () => {\n if (!branchAdmin || !deleteTarget) return;\n setDeleting(true);\n try {\n await branchAdmin.deleteBranch(deleteTarget);\n snackbarRef.current.open({\n type: \"success\",\n message: `Branch \"${deleteTarget}\" deleted`\n });\n if (selectedBranch === deleteTarget) setSelectedBranch(null);\n setDeleteTarget(null);\n await loadBranches();\n } catch (e: unknown) {\n snackbarRef.current.open({\n type: \"error\",\n message: e instanceof Error ? e.message : String(e)\n });\n } finally {\n setDeleting(false);\n }\n };\n\n // Not supported\n if (!branchAdmin) {\n return (\n <div className=\"flex flex-col items-center justify-center h-full gap-4 text-center p-8\">\n <GitBranchIcon size={iconSize.large} className=\"text-surface-300 dark:text-surface-600\"/>\n <Typography variant=\"h6\" color=\"secondary\">Database Branching Not Available</Typography>\n <Typography variant=\"body2\" color=\"disabled\" className=\"max-w-md\">\n Branching requires a PostgreSQL backend with an admin connection configured.\n Set <code className=\"text-xs bg-surface-100 dark:bg-surface-950 px-1.5 py-0.5 rounded font-mono\">adminConnectionString</code> in your server configuration.\n </Typography>\n </div>\n );\n }\n\n if (loading) {\n return (\n <div className=\"flex items-center justify-center h-full\">\n <CircularProgress/>\n </div>\n );\n }\n\n const selected = branches.find(b => b.name === selectedBranch);\n\n return (\n <div className=\"flex h-full w-full overflow-hidden bg-white dark:bg-surface-950\">\n {/* ── Branch 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 <GitBranchIcon size={iconSize.small} className=\"text-primary\"/>\n <Typography variant=\"subtitle2\" className=\"font-semibold\">Branches</Typography>\n <Chip size=\"smallest\" className=\"bg-surface-200 dark:bg-surface-700 text-surface-600 dark:text-surface-300\">{branches.length}</Chip>\n </div>\n <div className=\"flex items-center gap-1\">\n <IconButton size=\"small\" onClick={loadBranches} title=\"Refresh\">\n <RefreshCwIcon size={iconSize.smallest}/>\n </IconButton>\n <IconButton size=\"small\" onClick={() => setCreateOpen(true)} title=\"Create branch\" className=\"text-primary\">\n <PlusIcon size={iconSize.smallest}/>\n </IconButton>\n </div>\n </div>\n <div className=\"flex-1 overflow-y-auto p-2 space-y-1\">\n {branches.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center h-full gap-3 text-center px-4\">\n <CopyIcon size={iconSize.small} className=\"text-surface-300 dark:text-surface-600\"/>\n <Typography variant=\"body2\" color=\"disabled\" className=\"text-[13px]\">\n No branches yet. Create one to start working with an isolated database copy.\n </Typography>\n <Button\n size=\"small\"\n variant=\"outlined\"\n onClick={() => setCreateOpen(true)}\n startIcon={<PlusIcon size={iconSize.smallest}/>}\n >\n Create Branch\n </Button>\n </div>\n ) : (\n branches.map(branch => (\n <div\n key={branch.name}\n onClick={() => setSelectedBranch(branch.name)}\n className={cls(\n \"flex items-center gap-3 px-3 py-2.5 rounded-lg cursor-pointer transition-all\",\n selectedBranch === branch.name\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=\"w-2 h-2 rounded-full shrink-0 bg-emerald-500\"/>\n <div className=\"flex-1 min-w-0\">\n <Typography variant=\"body2\" className=\"truncate font-medium text-[13px]\">{branch.name}</Typography>\n <Typography variant=\"caption\" color=\"secondary\" className=\"truncate text-[11px]\">\n from {branch.parentDatabase} · {formatRelative(branch.createdAt)}\n </Typography>\n </div>\n {branch.sizeBytes !== undefined && (\n <Typography variant=\"caption\" color=\"disabled\" className=\"font-mono text-[10px] shrink-0\">\n {formatSize(branch.sizeBytes)}\n </Typography>\n )}\n </div>\n ))\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 {!selected ? (\n <div className=\"flex flex-col items-center justify-center h-full gap-3\">\n <GitBranchIcon size={iconSize.large} className=\"text-surface-200 dark:text-surface-700\"/>\n <Typography variant=\"body2\" color=\"disabled\">\n {branches.length === 0 ? \"Create a branch to get started\" : \"Select a branch to view details\"}\n </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=\"w-2.5 h-2.5 rounded-full bg-emerald-500\"/>\n <div className=\"min-w-0\">\n <Typography variant=\"subtitle1\" className=\"font-semibold truncate\">{selected.name}</Typography>\n <Typography variant=\"caption\" color=\"secondary\" className=\"truncate\">\n Created from <span className=\"font-mono text-[11px]\">{selected.parentDatabase}</span>\n </Typography>\n </div>\n </div>\n <div className=\"flex items-center gap-2 shrink-0\">\n <Button\n size=\"small\"\n color=\"error\"\n variant=\"outlined\"\n onClick={() => setDeleteTarget(selected.name)}\n startIcon={<Trash2Icon size={iconSize.smallest}/>}\n >\n Delete\n </Button>\n </div>\n </div>\n\n {/* Info 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=\"Branch Name\" value={selected.name} mono/>\n <StatCard label=\"Source Database\" value={selected.parentDatabase} mono/>\n <StatCard label=\"Created\" value={formatRelative(selected.createdAt)}/>\n <StatCard label=\"Size\" value={formatSize(selected.sizeBytes)}/>\n </div>\n </div>\n\n {/* Usage Info */}\n <div className=\"flex-1 overflow-y-auto px-5 py-4\">\n <Alert color=\"info\">\n <Typography variant=\"body2\" className=\"text-[13px]\">\n <strong>How to use this branch:</strong> Switch your application's database connection to\n <code className=\"mx-1 px-1.5 py-0.5 rounded bg-surface-100 dark:bg-surface-950 font-mono text-[12px]\">{selected.name}</code>\n to work with an isolated copy of your data. Changes made to this branch won't affect your main database.\n </Typography>\n </Alert>\n <div className=\"mt-4 p-4 rounded-lg border bg-surface-50 dark:bg-surface-900 border-surface-200 dark:border-surface-700\">\n <Typography variant=\"caption\" className=\"text-[10px] uppercase tracking-wider text-surface-400 mb-2 block font-medium\">Connection Details</Typography>\n <div className=\"space-y-2\">\n <div className=\"flex items-center gap-2\">\n <Typography variant=\"caption\" color=\"secondary\" className=\"w-24 shrink-0 text-[11px]\">Database:</Typography>\n <Typography variant=\"body2\" className=\"font-mono text-[12px]\">{selected.name}</Typography>\n </div>\n <div className=\"flex items-center gap-2\">\n <Typography variant=\"caption\" color=\"secondary\" className=\"w-24 shrink-0 text-[11px]\">Branched from:</Typography>\n <Typography variant=\"body2\" className=\"font-mono text-[12px]\">{selected.parentDatabase}</Typography>\n </div>\n <div className=\"flex items-center gap-2\">\n <Typography variant=\"caption\" color=\"secondary\" className=\"w-24 shrink-0 text-[11px]\">Created at:</Typography>\n <Typography variant=\"body2\" className=\"font-mono text-[12px]\">\n {selected.createdAt instanceof Date\n ? selected.createdAt.toLocaleString()\n : new Date(selected.createdAt).toLocaleString()}\n </Typography>\n </div>\n </div>\n </div>\n </div>\n </>\n )}\n </div>\n\n {/* ── Create Dialog ── */}\n <Dialog open={createOpen} onOpenChange={setCreateOpen}>\n <DialogTitle>Create New Branch</DialogTitle>\n <DialogContent className=\"space-y-4 min-w-[400px]\">\n <Typography variant=\"body2\" color=\"secondary\" className=\"text-[13px]\">\n Create an isolated database copy. The branch will be a full clone of the source database at this point in time.\n </Typography>\n <div>\n <TextField\n label=\"Branch Name\"\n value={newBranchName}\n onChange={(e) => setNewBranchName(e.target.value)}\n placeholder=\"e.g. feature-auth, staging, preview-pr-42\"\n size=\"small\"\n autoFocus\n />\n </div>\n {branches.length > 0 && (\n <div>\n <Select\n label=\"Source Database\"\n value={sourceBranch ?? \"\"}\n onValueChange={(v) => setSourceBranch(v || undefined)}\n placeholder=\"Default (main database)\"\n size=\"small\"\n renderValue={(v) => v || \"Default (main database)\"}\n >\n <SelectItem value=\"\">Default (main database)</SelectItem>\n {branches.map(b => (\n <SelectItem key={b.name} value={b.name}>{b.name}</SelectItem>\n ))}\n </Select>\n </div>\n )}\n </DialogContent>\n <DialogActions>\n <Button variant=\"text\" onClick={() => setCreateOpen(false)} disabled={creating}>\n Cancel\n </Button>\n <Button\n color=\"primary\"\n onClick={handleCreate}\n disabled={!newBranchName.trim() || creating}\n startIcon={creating ? <CircularProgress size=\"smallest\"/> : <PlusIcon size={iconSize.smallest}/>}\n >\n {creating ? \"Creating...\" : \"Create Branch\"}\n </Button>\n </DialogActions>\n </Dialog>\n\n {/* ── Delete Confirm ── */}\n <ConfirmationDialog\n open={!!deleteTarget}\n onAccept={handleDelete}\n onCancel={() => setDeleteTarget(null)}\n title=\"Delete Branch\"\n body={\n <Typography variant=\"body2\">\n Are you sure you want to permanently delete the branch <strong>{deleteTarget}</strong>?\n This action cannot be undone and all data in this branch will be lost.\n </Typography>\n }\n loading={deleting}\n />\n </div>\n );\n}\n\nfunction StatCard({ label, value, mono }: {\n label: string; value: string; mono?: 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] truncate\",\n mono && \"font-mono\"\n )}>{value}</Typography>\n </div>\n );\n}\n"],"names":["formatSize","bytes","undefined","toFixed","formatRelative","date","d","Date","isNaN","getTime","now","diff","m","Math","round","h","d2","toLocaleDateString","BranchesView","databaseAdmin","useRebaseContext","snackbar","useSnackbarController","branches","setBranches","useState","loading","setLoading","selectedBranch","setSelectedBranch","createOpen","setCreateOpen","newBranchName","setNewBranchName","sourceBranch","setSourceBranch","creating","setCreating","deleteTarget","setDeleteTarget","deleting","setDeleting","snackbarRef","useRef","current","branchAdmin","isBranchAdmin","loadBranches","useCallback","result","listBranches","e","open","type","message","Error","String","useEffect","handleCreate","trim","createBranch","source","handleDelete","deleteBranch","iconSize","large","selected","find","b","name","cls","defaultBorderMixin","small","length","smallest","map","branch","parentDatabase","createdAt","sizeBytes","toLocaleString","target","value","v","StatCard","t0","$","_c","label","mono","t1","Symbol","for","t2","t3","t4","t5","t6"],"mappings":"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"}
|