@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 @@
|
|
|
1
|
+
{"version":3,"file":"StorageView-CTqGFhY9.js","sources":["../src/components/StorageView/StorageView.tsx"],"sourcesContent":["\nimport React, { useState, useEffect, useCallback, useMemo } from \"react\";\nimport { Typography, cls, defaultBorderMixin, Button, IconButton, Tooltip, CircularProgress, ResizablePanels, Chip, Dialog, DialogContent, DialogActions, FileUpload , iconSize } from \"@rebasepro/ui\";\nimport { VideoIcon, Music2Icon, RefreshCwIcon, Trash2Icon, XIcon, PlusIcon, DownloadIcon, UploadCloudIcon, FolderIcon, FileTextIcon, ImageIcon, ArrowLeftIcon, FileIcon, HomeIcon, LayoutGridIcon, ListIcon } from \"lucide-react\";\nimport { useStorageSource, useSnackbarController, ErrorView } from \"@rebasepro/core\";\nimport type { StorageListResult } from \"@rebasepro/types\";\n\n// ──────────────────────────────────────────────\n// Types\n// ──────────────────────────────────────────────\n\ninterface StorageFile {\n name: string;\n fullPath: string;\n isFolder: boolean;\n /** Only populated when metadata is fetched */\n size?: number;\n contentType?: string;\n downloadUrl?: string;\n}\n\n// ──────────────────────────────────────────────\n// Helpers\n// ──────────────────────────────────────────────\n\nfunction formatFileSize(bytes: number): string {\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 getFileIcon(contentType?: string) {\n if (!contentType) return FileTextIcon;\n if (contentType.startsWith(\"image/\")) return ImageIcon;\n if (contentType.startsWith(\"video/\")) return VideoIcon;\n if (contentType.startsWith(\"audio/\")) return Music2Icon;\n return FileTextIcon;\n}\n\nfunction getExtension(name: string): string {\n const parts = name.split(\".\");\n return parts.length > 1 ? parts[parts.length - 1].toUpperCase() : \"\";\n}\n\nfunction breadcrumbSegments(path: string): { label: string; path: string }[] {\n if (!path || path === \"/\") return [{ label: \"Root\",\npath: \"\" }];\n const parts = path.split(\"/\").filter(Boolean);\n const segments = [{ label: \"Root\",\npath: \"\" }];\n let accumulated = \"\";\n for (const part of parts) {\n accumulated = accumulated ? `${accumulated}/${part}` : part;\n segments.push({ label: part,\npath: accumulated });\n }\n return segments;\n}\n\n// ──────────────────────────────────────────────\n// Upload Dialog\n// ──────────────────────────────────────────────\n\nfunction UploadDialog({\n open,\n currentPath,\n onClose,\n onUpload\n}: {\n open: boolean;\n currentPath: string;\n onClose: () => void;\n onUpload: (files: File[]) => Promise<void>;\n}) {\n const [uploading, setUploading] = useState(false);\n const [selectedFiles, setSelectedFiles] = useState<File[]>([]);\n const [error, setError] = useState<string | null>(null);\n\n const handleFilesAdded = useCallback((files: File[]) => {\n setSelectedFiles(prev => [...prev, ...files]);\n }, []);\n\n const handleRemoveFile = useCallback((index: number) => {\n setSelectedFiles(prev => prev.filter((_, i) => i !== index));\n }, []);\n\n const handleUpload = useCallback(async () => {\n if (selectedFiles.length === 0) return;\n setUploading(true);\n setError(null);\n try {\n await onUpload(selectedFiles);\n setSelectedFiles([]);\n onClose();\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Upload failed\");\n } finally {\n setUploading(false);\n }\n }, [selectedFiles, onUpload, onClose]);\n\n const handleClose = useCallback(() => {\n if (!uploading) {\n setSelectedFiles([]);\n setError(null);\n onClose();\n }\n }, [uploading, onClose]);\n\n return (\n <Dialog open={open} onOpenChange={(o) => !o && handleClose()} maxWidth=\"md\">\n <DialogContent className=\"p-0\">\n <div className=\"p-4 border-b border-surface-accent-200 dark:border-surface-accent-700\">\n <Typography variant=\"h6\">Upload Files</Typography>\n <Typography variant=\"caption\" className=\"text-text-secondary dark:text-text-secondary-dark mt-1 block\">\n to <span className=\"font-mono text-primary\">/{currentPath || \"root\"}</span>\n </Typography>\n </div>\n\n <div className=\"p-4\">\n {/* Drop Zone */}\n <FileUpload\n accept={{} as Record<string, string[]>}\n onFilesAdded={handleFilesAdded}\n size=\"large\"\n uploadDescription={\n <div className=\"flex flex-col items-center justify-center pointer-events-none mt-2\">\n <UploadCloudIcon className=\"text-surface-accent-400 mb-2 w-8 h-8\"/>\n <Typography variant=\"h6\" className=\"font-bold\">\n Drop files here or click to browse\n </Typography>\n <Typography variant=\"caption\" className=\"text-surface-accent-500 font-medium\">\n Any file type supported\n </Typography>\n </div>\n }\n />\n\n {error && (\n <Typography variant=\"caption\" className=\"text-red-500 mt-2 block whitespace-pre-line\">\n {error}\n </Typography>\n )}\n\n {selectedFiles.length > 0 && (\n <div className=\"mt-4 space-y-2\">\n <Typography variant=\"caption\" className=\"text-surface-accent-500\">\n Selected files ({selectedFiles.length})\n </Typography>\n <div className=\"max-h-40 overflow-auto space-y-1\">\n {selectedFiles.map((file, index) => (\n <div\n key={`${file.name}-${index}`}\n className={cls(\n \"flex items-center justify-between p-2 rounded\",\n \"bg-surface-accent-50 dark:bg-surface-accent-800\"\n )}\n >\n <div className=\"flex-1 min-w-0 mr-2\">\n <Typography variant=\"body2\" className=\"truncate\">\n {file.name}\n </Typography>\n <Typography variant=\"caption\" className=\"text-surface-accent-500\">\n {formatFileSize(file.size)}\n </Typography>\n </div>\n <Button\n variant=\"text\"\n size=\"small\"\n onClick={(e) => {\n e.stopPropagation();\n handleRemoveFile(index);\n }}\n disabled={uploading}\n >\n Remove\n </Button>\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n </DialogContent>\n\n <DialogActions>\n <Button variant=\"text\" onClick={handleClose} disabled={uploading}>\n Cancel\n </Button>\n <Button\n variant=\"filled\"\n onClick={handleUpload}\n disabled={selectedFiles.length === 0 || uploading}\n >\n {uploading ? (\n <>\n <CircularProgress size=\"smallest\"/>\n Uploading...\n </>\n ) : (\n `Upload ${selectedFiles.length > 0 ? `(${selectedFiles.length})` : \"\"}`\n )}\n </Button>\n </DialogActions>\n </Dialog>\n );\n}\n\n// ──────────────────────────────────────────────\n// FileIcon preview panel\n// ──────────────────────────────────────────────\n\nfunction FilePreviewPanel({\n file,\n onClose,\n onDelete,\n downloadUrl\n}: {\n file: StorageFile;\n onClose: () => void;\n onDelete: () => void;\n downloadUrl: string | null;\n}) {\n const isImage = file.contentType?.startsWith(\"image/\");\n const isVideo = file.contentType?.startsWith(\"video/\");\n const isAudio = file.contentType?.startsWith(\"audio/\");\n const FileIconComponent = getFileIcon(file.contentType);\n const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);\n\n return (\n <>\n <div className={cls(\n \"flex flex-col h-full border-l\",\n defaultBorderMixin,\n \"bg-white dark:bg-surface-950\"\n )}>\n {/* Header */}\n <div className={cls(\"flex items-center justify-between p-3 border-b shrink-0\", defaultBorderMixin)}>\n <Typography variant=\"body2\" className=\"font-medium truncate flex-1 mr-2\">\n {file.name}\n </Typography>\n <div className=\"flex items-center gap-0.5\">\n {downloadUrl && (\n <Tooltip title=\"Download\">\n <IconButton\n size=\"small\"\n onClick={() => window.open(downloadUrl, \"_blank\")}\n >\n <DownloadIcon size={iconSize.smallest}/>\n </IconButton>\n </Tooltip>\n )}\n <Tooltip title=\"Delete\">\n <IconButton\n size=\"small\"\n onClick={() => setDeleteDialogOpen(true)}\n className=\"text-red-500 hover:bg-red-50 dark:hover:bg-red-900/20\"\n >\n <Trash2Icon size={iconSize.smallest}/>\n </IconButton>\n </Tooltip>\n <IconButton size=\"small\" onClick={onClose}>\n <XIcon size={iconSize.smallest}/>\n </IconButton>\n </div>\n </div>\n\n {/* Preview */}\n <div className=\"flex-1 overflow-auto\">\n <div className=\"flex flex-col items-center justify-center min-h-[200px] p-4 bg-surface-50 dark:bg-surface-900 border-b border-surface-accent-200 dark:border-surface-accent-700\">\n {(() => {\n const ext = getExtension(file.name)?.toLowerCase() || \"\";\n const isImage = file.contentType?.startsWith(\"image/\") || [\"jpg\", \"jpeg\", \"png\", \"gif\", \"webp\", \"svg\"].includes(ext);\n const isVideo = file.contentType?.startsWith(\"video/\") || [\"mp4\", \"webm\", \"ogg\", \"mov\"].includes(ext);\n const isAudio = file.contentType?.startsWith(\"audio/\") || [\"mp3\", \"wav\", \"ogg\", \"m4a\"].includes(ext);\n const downloadUrl = file.downloadUrl;\n\n if (isImage && downloadUrl) {\n return (\n <img\n src={downloadUrl}\n alt={file.name}\n className=\"max-w-full max-h-[400px] object-contain rounded-md shadow-sm\"\n />\n );\n } else if (isVideo && downloadUrl) {\n return (\n <video\n src={downloadUrl}\n className=\"max-w-full max-h-[400px] rounded-md\"\n controls\n />\n );\n } else if (isAudio && downloadUrl) {\n return (\n <div className=\"flex flex-col items-center gap-4\">\n <Music2Icon className=\"text-surface-accent-400 w-10 h-10\"/>\n <audio src={downloadUrl} controls className=\"w-full max-w-xs\"/>\n </div>\n );\n } else {\n return (\n <div className=\"flex flex-col items-center gap-3 text-surface-accent-400\">\n <FileIconComponent className=\"w-10 h-10\"/>\n <Typography variant=\"caption\" className=\"text-text-disabled dark:text-text-disabled-dark\">\n No preview available\n </Typography>\n </div>\n );\n }\n })()}\n </div>\n </div>\n\n {/* Metadata */}\n <div className=\"p-4 space-y-3\">\n <div>\n <Typography variant=\"caption\" className=\"text-text-disabled dark:text-text-disabled-dark text-[10px] uppercase tracking-wider font-bold mb-1 block\">\n File Info\n </Typography>\n </div>\n <div className=\"grid grid-cols-2 gap-3\">\n <div>\n <Typography variant=\"caption\" className=\"text-surface-accent-500 text-[11px]\">\n Name\n </Typography>\n <Typography variant=\"body2\" className=\"text-[13px] break-all\">\n {file.name}\n </Typography>\n </div>\n <div>\n <Typography variant=\"caption\" className=\"text-surface-accent-500 text-[11px]\">\n Type\n </Typography>\n <Typography variant=\"body2\" className=\"text-[13px]\">\n {file.contentType || \"Unknown\"}\n </Typography>\n </div>\n {file.size !== undefined && (\n <div>\n <Typography variant=\"caption\" className=\"text-surface-accent-500 text-[11px]\">\n Size\n </Typography>\n <Typography variant=\"body2\" className=\"text-[13px]\">\n {formatFileSize(file.size)}\n </Typography>\n </div>\n )}\n <div>\n <Typography variant=\"caption\" className=\"text-surface-accent-500 text-[11px]\">\n Extension\n </Typography>\n <Typography variant=\"body2\" className=\"text-[13px] font-mono\">\n {getExtension(file.name) || \"—\"}\n </Typography>\n </div>\n <div className=\"col-span-2\">\n <Typography variant=\"caption\" className=\"text-surface-accent-500 text-[11px]\">\n Path\n </Typography>\n <Typography variant=\"body2\" className=\"text-[13px] font-mono break-all\">\n {file.fullPath}\n </Typography>\n </div>\n </div>\n\n {downloadUrl && (\n <div className=\"pt-2\">\n <Typography variant=\"caption\" className=\"text-surface-accent-500 text-[11px] block mb-1\">\n URL\n </Typography>\n <div\n className=\"p-2 rounded bg-surface-100 dark:bg-surface-950 cursor-pointer hover:bg-surface-200 dark:hover:bg-surface-700 transition-colors\"\n onClick={() => {\n navigator.clipboard.writeText(downloadUrl);\n }}\n >\n <Typography variant=\"caption\" className=\"font-mono text-[11px] break-all text-primary\">\n {downloadUrl}\n </Typography>\n <Typography variant=\"caption\" className=\"text-text-disabled dark:text-text-disabled-dark text-[10px] block mt-1\">\n Click to copy\n </Typography>\n </div>\n </div>\n )}\n </div>\n </div>\n\n {/* Delete Confirmation */}\n <Dialog open={deleteDialogOpen} onOpenChange={setDeleteDialogOpen}>\n <DialogContent>\n <Typography variant=\"subtitle1\" className=\"mb-2\">\n Delete File?\n </Typography>\n <Typography className=\"text-surface-accent-600 dark:text-surface-accent-400\">\n Are you sure you want to delete "{file.name}"?\n This action cannot be undone.\n </Typography>\n </DialogContent>\n <DialogActions>\n <Button variant=\"text\" onClick={() => setDeleteDialogOpen(false)}>\n Cancel\n </Button>\n <Button\n variant=\"filled\"\n color=\"error\"\n onClick={() => {\n setDeleteDialogOpen(false);\n onDelete();\n }}\n >\n Delete\n </Button>\n </DialogActions>\n </Dialog>\n </>\n );\n}\n\n// ──────────────────────────────────────────────\n// Sidebar (folder tree)\n// ──────────────────────────────────────────────\n\nfunction StorageSidebar({\n folders,\n currentPath,\n onNavigate,\n loading\n}: {\n folders: StorageFile[];\n currentPath: string;\n onNavigate: (path: string) => void;\n loading: boolean;\n}) {\n const segments = breadcrumbSegments(currentPath);\n\n return (\n <div className={cls(\"flex flex-col h-full w-full bg-white dark:bg-surface-950 border-r\", defaultBorderMixin)}>\n <div className={cls(\"p-3 border-b flex justify-between items-center bg-surface-50 dark:bg-surface-900 shrink-0\", defaultBorderMixin)}>\n <Typography variant=\"caption\" className=\"font-bold uppercase tracking-wider text-text-disabled dark:text-text-disabled-dark\">\n Folders\n </Typography>\n </div>\n\n <div className=\"flex-grow overflow-y-auto no-scrollbar p-1\">\n {/* Folder tree */}\n <div\n className={cls(\n \"flex items-center p-1.5 cursor-pointer rounded transition-colors\",\n currentPath === \"\" || !currentPath\n ? \"bg-primary/10 text-primary dark:bg-primary/20 dark:text-primary-light\"\n : \"hover:bg-surface-100 dark:hover:bg-surface-950 text-text-secondary dark:text-text-secondary-dark\"\n )}\n onClick={() => onNavigate(\"\")}\n >\n <HomeIcon size={iconSize.smallest} className=\"mr-1.5 shrink-0\"/>\n <Typography variant=\"body2\" className=\"text-xs truncate\">Root</Typography>\n </div>\n\n {loading && folders.length === 0 ? (\n <div className=\"flex justify-center p-4\">\n <CircularProgress size=\"small\"/>\n </div>\n ) : (\n <div className=\"mt-1 space-y-0.5\">\n {folders.map(folder => {\n const isSelected = currentPath === folder.fullPath;\n return (\n <div\n key={folder.fullPath}\n className={cls(\n \"flex items-center p-1.5 cursor-pointer rounded transition-colors group\",\n isSelected\n ? \"bg-primary/10 text-primary dark:bg-primary/20 dark:text-primary-light\"\n : \"hover:bg-surface-100 dark:hover:bg-surface-950 text-text-secondary dark:text-text-secondary-dark\"\n )}\n onClick={() => onNavigate(folder.fullPath)}\n >\n <FolderIcon size={iconSize.smallest} className=\"mr-1.5 shrink-0 text-amber-500 dark:text-amber-400\"/>\n <Typography variant=\"body2\" className=\"text-xs truncate flex-1 min-w-0\">\n {folder.name}\n </Typography>\n </div>\n );\n })}\n </div>\n )}\n </div>\n </div>\n );\n}\n\n// ──────────────────────────────────────────────\n// Main StorageView Export\n// ──────────────────────────────────────────────\n\nexport const StorageView = () => {\n const storageSource = useStorageSource();\n const snackbarController = useSnackbarController();\n\n // Navigation\n const [currentPath, setCurrentPath] = useState(\"\");\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n // Contents\n const [folders, setFolders] = useState<StorageFile[]>([]);\n const [files, setFiles] = useState<StorageFile[]>([]);\n\n // Selection and preview\n const [selectedFile, setSelectedFile] = useState<StorageFile | null>(null);\n const [selectedDownloadUrl, setSelectedDownloadUrl] = useState<string | null>(null);\n\n // Upload\n const [uploadDialogOpen, setUploadDialogOpen] = useState(false);\n\n // View mode\n const [viewMode, setViewMode] = useState<\"grid\" | \"list\">(\"grid\");\n\n // Resizable panels\n\n // Resizable panels\n const [sidebarSize, setSidebarSize] = useState(() => {\n try {\n const saved = localStorage.getItem(\"rebase_storage_sidebar_size\");\n return saved !== null ? parseFloat(saved) : 18;\n } catch {\n return 18;\n }\n });\n\n useEffect(() => {\n try {\n localStorage.setItem(\"rebase_storage_sidebar_size\", sidebarSize.toString());\n } catch { /* noop */ }\n }, [sidebarSize]);\n\n // ── Fetch directory contents ──\n const fetchContents = useCallback(async (path: string) => {\n setLoading(true);\n setError(null);\n try {\n const result: StorageListResult = await storageSource.listObjects(path);\n\n const folderItems: StorageFile[] = (result.prefixes ?? []).map(ref => ({\n name: ref.name,\n fullPath: ref.fullPath,\n isFolder: true\n }));\n\n // Build file items and fetch metadata for each\n const fileItems: StorageFile[] = await Promise.all(\n (result.items ?? []).map(async (ref) => {\n try {\n const downloadConfig = await storageSource.getSignedUrl(ref.fullPath);\n return {\n name: ref.name,\n fullPath: ref.fullPath,\n isFolder: false,\n size: downloadConfig.metadata?.size,\n contentType: downloadConfig.metadata?.contentType,\n downloadUrl: downloadConfig.url ?? undefined\n };\n } catch {\n return {\n name: ref.name,\n fullPath: ref.fullPath,\n isFolder: false\n };\n }\n })\n );\n\n setFolders(folderItems);\n setFiles(fileItems);\n } catch (e) {\n console.error(\"Storage list error:\", e);\n setError(e instanceof Error ? e.message : String(e));\n } finally {\n setLoading(false);\n }\n }, [storageSource]);\n\n useEffect(() => {\n fetchContents(currentPath);\n }, [currentPath, fetchContents]);\n\n // Navigate to path\n const handleNavigate = useCallback((path: string) => {\n setCurrentPath(path);\n setSelectedFile(null);\n setSelectedDownloadUrl(null);\n }, []);\n\n // Navigate up one level\n const handleNavigateUp = useCallback(() => {\n const parts = currentPath.split(\"/\").filter(Boolean);\n parts.pop();\n handleNavigate(parts.join(\"/\"));\n }, [currentPath, handleNavigate]);\n\n // Select a file for preview\n const handleSelectFile = useCallback(async (file: StorageFile) => {\n setSelectedFile(file);\n if (file.downloadUrl) {\n setSelectedDownloadUrl(file.downloadUrl);\n } else {\n try {\n const config = await storageSource.getSignedUrl(file.fullPath);\n setSelectedDownloadUrl(config.url);\n } catch {\n setSelectedDownloadUrl(null);\n }\n }\n }, [storageSource]);\n\n // Upload files\n const handleUpload = useCallback(async (uploadFiles: File[]) => {\n for (const file of uploadFiles) {\n const key = currentPath ? `${currentPath}/${file.name}` : file.name;\n await storageSource.putObject({\n file,\n key\n });\n }\n snackbarController.open({\n type: \"success\",\n message: `${uploadFiles.length} file${uploadFiles.length > 1 ? \"s\" : \"\"} uploaded successfully`\n });\n fetchContents(currentPath);\n }, [storageSource, currentPath, snackbarController, fetchContents]);\n\n // Delete a file\n const handleDeleteFile = useCallback(async (file: StorageFile) => {\n try {\n await storageSource.deleteObject(file.fullPath);\n snackbarController.open({ type: \"success\",\nmessage: `\"${file.name}\" deleted` });\n setSelectedFile(null);\n setSelectedDownloadUrl(null);\n fetchContents(currentPath);\n } catch (e) {\n snackbarController.open({ type: \"error\",\nmessage: e instanceof Error ? e.message : String(e) });\n }\n }, [storageSource, currentPath, snackbarController, fetchContents]);\n\n // Handle refresh\n const handleRefresh = useCallback(() => {\n fetchContents(currentPath);\n }, [currentPath, fetchContents]);\n\n const segments = breadcrumbSegments(currentPath);\n\n // ── Render file grid/list ──\n const renderContents = () => {\n if (loading) {\n return (\n <div className=\"flex-grow flex items-center justify-center\">\n <div className=\"text-center\">\n <CircularProgress size=\"medium\"/>\n <Typography variant=\"body2\" className=\"mt-4 text-text-secondary dark:text-text-secondary-dark font-mono tracking-tight animate-pulse\">\n Loading...\n </Typography>\n </div>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"flex-grow flex items-center justify-center p-6 overflow-auto\">\n <ErrorView title=\"Error loading storage\" error={error} onRetry={handleRefresh}/>\n </div>\n );\n }\n\n const allItems = [...folders, ...files];\n\n if (allItems.length === 0) {\n return (\n <div className=\"flex-grow flex items-center justify-center text-text-disabled dark:text-text-disabled-dark\">\n <div className=\"text-center\">\n <svg className=\"w-12 h-12 mx-auto mb-4 opacity-50\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1} d=\"M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-6l-2-2H5a2 2 0 00-2 2z\"/>\n </svg>\n <Typography variant=\"body2\">\n This folder is empty\n </Typography>\n <Button className=\"mt-3\" onClick={() => setUploadDialogOpen(true)}>\n <PlusIcon size={iconSize.smallest}/>\n Upload files\n </Button>\n </div>\n </div>\n );\n }\n\n if (viewMode === \"list\") {\n return (\n <div className=\"flex-grow overflow-auto\">\n <table className=\"w-full\">\n <thead>\n <tr className={cls(\"border-b text-left text-[10px] uppercase tracking-wider text-text-disabled dark:text-text-disabled-dark\", defaultBorderMixin)}>\n <th className=\"px-4 py-2 font-bold\">Name</th>\n <th className=\"px-4 py-2 font-bold w-24\">Type</th>\n <th className=\"px-4 py-2 font-bold w-24 text-right\">Size</th>\n </tr>\n </thead>\n <tbody>\n {folders.map(folder => (\n <tr\n key={folder.fullPath}\n className=\"hover:bg-surface-100 dark:hover:bg-surface-950 cursor-pointer transition-colors border-b border-surface-100 dark:border-surface-950/50\"\n onClick={() => handleNavigate(folder.fullPath)}\n >\n <td className=\"px-4 py-2.5\">\n <div className=\"flex items-center gap-2\">\n <FolderIcon size={iconSize.smallest} className=\"text-amber-500 dark:text-amber-400 shrink-0\"/>\n <Typography variant=\"body2\" className=\"text-[13px] font-medium truncate\">\n {folder.name}\n </Typography>\n </div>\n </td>\n <td className=\"px-4 py-2.5\">\n <Typography variant=\"caption\" className=\"text-text-secondary dark:text-text-secondary-dark\">\n Folder\n </Typography>\n </td>\n <td className=\"px-4 py-2.5 text-right\">\n <Typography variant=\"caption\" className=\"text-text-disabled dark:text-text-disabled-dark\">\n —\n </Typography>\n </td>\n </tr>\n ))}\n {files.map(file => {\n const FileIconComp = getFileIcon(file.contentType);\n const isSelected = selectedFile?.fullPath === file.fullPath;\n return (\n <tr\n key={file.fullPath}\n className={cls(\n \"cursor-pointer transition-colors border-b border-surface-100 dark:border-surface-950/50\",\n isSelected\n ? \"bg-primary/5 dark:bg-primary/10\"\n : \"hover:bg-surface-100 dark:hover:bg-surface-950\"\n )}\n onClick={() => handleSelectFile(file)}\n >\n <td className=\"px-4 py-2.5\">\n <div className=\"flex items-center gap-2\">\n <FileIconComp size={iconSize.smallest} className=\"text-surface-accent-400 shrink-0\"/>\n <Typography variant=\"body2\" className=\"text-[13px] truncate\">\n {file.name}\n </Typography>\n </div>\n </td>\n <td className=\"px-4 py-2.5\">\n <Typography variant=\"caption\" className=\"text-text-secondary dark:text-text-secondary-dark\">\n {getExtension(file.name) || file.contentType?.split(\"/\")[1]?.toUpperCase() || \"—\"}\n </Typography>\n </td>\n <td className=\"px-4 py-2.5 text-right\">\n <Typography variant=\"caption\" className=\"text-text-secondary dark:text-text-secondary-dark font-mono text-[11px]\">\n {file.size !== undefined ? formatFileSize(file.size) : \"—\"}\n </Typography>\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n );\n }\n\n // Grid view\n return (\n <div className=\"flex-grow overflow-auto p-4\">\n {/* Folder cards */}\n {folders.length > 0 && (\n <div className=\"mb-4\">\n <Typography variant=\"caption\" className=\"text-[10px] uppercase tracking-wider font-bold text-text-disabled dark:text-text-disabled-dark mb-2 block\">\n Folders\n </Typography>\n <div className=\"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 xl:grid-cols-6 gap-3\">\n {folders.map(folder => (\n <div\n key={folder.fullPath}\n className={cls(\n \"rounded-lg p-3 cursor-pointer transition-all duration-150 border\",\n defaultBorderMixin,\n \"hover:bg-surface-100 dark:hover:bg-surface-950 hover:shadow-sm\",\n \"flex items-center gap-2\"\n )}\n onClick={() => handleNavigate(folder.fullPath)}\n >\n <FolderIcon size={iconSize.smallest} className=\"text-amber-500 dark:text-amber-400 shrink-0\"/>\n <Typography variant=\"body2\" className=\"text-[13px] font-medium truncate\">\n {folder.name}\n </Typography>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* FileIcon cards */}\n {files.length > 0 && (\n <div>\n <Typography variant=\"caption\" className=\"text-[10px] uppercase tracking-wider font-bold text-text-disabled dark:text-text-disabled-dark mb-2 block\">\n Files ({files.length})\n </Typography>\n <div className=\"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 xl:grid-cols-6 gap-3\">\n {files.map(file => {\n const FileIconComp = getFileIcon(file.contentType);\n const ext = getExtension(file.name)?.toLowerCase() || \"\";\n const isImage = file.contentType?.startsWith(\"image/\") || [\"jpg\", \"jpeg\", \"png\", \"gif\", \"webp\", \"svg\"].includes(ext);\n const isSelected = selectedFile?.fullPath === file.fullPath;\n\n return (\n <div\n key={file.fullPath}\n className={cls(\n \"rounded-lg overflow-hidden cursor-pointer transition-all duration-150 border group\",\n defaultBorderMixin,\n \"hover:shadow-md hover:-translate-y-0.5\",\n isSelected && \"ring-2 ring-primary\"\n )}\n onClick={() => handleSelectFile(file)}\n >\n {/* Thumbnail or icon */}\n <div className=\"aspect-square relative overflow-hidden bg-surface-100 dark:bg-surface-950 flex items-center justify-center\">\n {isImage && file.downloadUrl ? (\n <img\n src={file.downloadUrl}\n alt={file.name}\n className=\"w-full h-full object-cover transition-transform duration-200 group-hover:scale-105\"\n loading=\"lazy\"\n />\n ) : (\n <FileIconComp className=\"text-surface-accent-400 dark:text-surface-accent-500 w-8 h-8\"/>\n )}\n\n {/* Extension badge */}\n {getExtension(file.name) && (\n <div className=\"absolute bottom-1.5 right-1.5 px-1.5 py-0.5 rounded text-[9px] font-bold uppercase bg-black/50 text-white backdrop-blur-sm\">\n {getExtension(file.name)}\n </div>\n )}\n\n {/* Hover overlay */}\n <div className={cls(\n \"absolute inset-0 bg-black/0 group-hover:bg-black/10\",\n \"transition-colors duration-200\"\n )}/>\n </div>\n\n {/* Name & size */}\n <div className=\"p-2.5\">\n <Typography variant=\"body2\" className=\"text-[12px] font-medium truncate text-surface-900 dark:text-white\">\n {file.name}\n </Typography>\n <Typography variant=\"caption\" color=\"secondary\" className=\"truncate block mt-0.5 text-[11px]\">\n {file.size !== undefined ? formatFileSize(file.size) : \"—\"}\n </Typography>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n )}\n </div>\n );\n };\n\n return (\n <div className=\"flex h-full w-full bg-white dark:bg-surface-950 overflow-hidden text-text-primary dark:text-text-primary-dark\">\n <ResizablePanels\n orientation=\"horizontal\"\n panelSizePercent={sidebarSize}\n onPanelSizeChange={setSidebarSize}\n minPanelSizePx={180}\n firstPanel={\n <StorageSidebar\n folders={folders}\n currentPath={currentPath}\n onNavigate={handleNavigate}\n loading={loading}\n />\n }\n secondPanel={\n <div className=\"flex h-full w-full\">\n {/* Main content */}\n <div className=\"flex-grow flex flex-col min-w-0 h-full\">\n {/* Toolbar */}\n <div className={cls(\"flex items-center justify-between pr-2 border-b bg-white dark:bg-surface-950 shrink-0\", defaultBorderMixin)}>\n <div className=\"flex items-center gap-1.5 flex-grow overflow-hidden px-3 py-2\">\n {/* Breadcrumbs */}\n {currentPath && (\n <Tooltip title=\"Go up\">\n <IconButton size=\"small\" onClick={handleNavigateUp}>\n <ArrowLeftIcon size={iconSize.smallest}/>\n </IconButton>\n </Tooltip>\n )}\n <div className=\"flex items-center gap-0.5 overflow-x-auto no-scrollbar\">\n {segments.map((seg, i) => (\n <React.Fragment key={seg.path}>\n {i > 0 && (\n <Typography variant=\"caption\" className=\"text-text-disabled dark:text-text-disabled-dark mx-0.5\">/</Typography>\n )}\n <Button\n variant=\"text\"\n size=\"small\"\n className={cls(\n \"px-1.5 py-0.5 min-h-0 min-w-0 h-6 text-xs whitespace-nowrap normal-case font-normal\",\n i === segments.length - 1\n ? \"text-text-primary dark:text-text-primary-dark font-medium\"\n : \"text-text-secondary dark:text-text-secondary-dark\"\n )}\n onClick={() => handleNavigate(seg.path)}\n >\n {seg.label}\n </Button>\n </React.Fragment>\n ))}\n </div>\n\n <div className=\"flex-1\"/>\n\n {/* FileIcon count */}\n {!loading && (\n <Chip size=\"small\" className=\"shrink-0 text-[10px]\">\n {files.length} file{files.length !== 1 ? \"s\" : \"\"}\n {folders.length > 0 ? `, ${folders.length} folder${folders.length !== 1 ? \"s\" : \"\"}` : \"\"}\n </Chip>\n )}\n </div>\n\n <div className=\"flex shrink-0 items-center justify-end gap-1.5 pr-1\">\n\n <Tooltip title=\"Grid view\">\n <IconButton\n size=\"small\"\n onClick={() => setViewMode(\"grid\")}\n className={cls(viewMode === \"grid\" && \"bg-surface-100 dark:bg-surface-950\")}\n >\n <LayoutGridIcon size={iconSize.smallest}/>\n </IconButton>\n </Tooltip>\n <Tooltip title=\"List view\">\n <IconButton\n size=\"small\"\n onClick={() => setViewMode(\"list\")}\n className={cls(viewMode === \"list\" && \"bg-surface-100 dark:bg-surface-950\")}\n >\n <ListIcon size={iconSize.smallest}/>\n </IconButton>\n </Tooltip>\n\n <div className=\"h-4 w-px bg-surface-200 dark:bg-surface-950 mx-0.5\"/>\n\n <Tooltip title=\"Refresh\">\n <IconButton size=\"small\" onClick={handleRefresh} disabled={loading}>\n <RefreshCwIcon size={iconSize.smallest}/>\n </IconButton>\n </Tooltip>\n\n <Button\n size=\"small\"\n color=\"primary\"\n onClick={() => setUploadDialogOpen(true)}\n >\n <UploadCloudIcon size={iconSize.smallest} className=\"mr-1\"/>\n Upload\n </Button>\n </div>\n </div>\n\n {/* FileIcon grid / list */}\n <div className=\"flex-grow flex flex-col overflow-hidden min-h-0\">\n {renderContents()}\n </div>\n\n {/* Status bar */}\n <div className={cls(\"px-4 py-1.5 border-t bg-surface-50 dark:bg-surface-900 flex items-center justify-between shrink-0\", defaultBorderMixin)}>\n <div className=\"flex items-center gap-4 text-[11px]\">\n <span className=\"text-text-disabled dark:text-text-disabled-dark font-bold uppercase tracking-tighter\">\n Path\n </span>\n <span className=\"font-mono text-text-secondary dark:text-text-secondary-dark\">\n /{currentPath || \"\"}\n </span>\n </div>\n {selectedFile && (\n <div className=\"text-[11px] text-text-secondary dark:text-text-secondary-dark\">\n Selected: <span className=\"font-mono\">{selectedFile.name}</span>\n </div>\n )}\n </div>\n </div>\n\n {/* Preview panel */}\n {selectedFile && (\n <div className=\"w-80 lg:w-96 shrink-0\">\n <FilePreviewPanel\n file={selectedFile}\n downloadUrl={selectedDownloadUrl}\n onClose={() => {\n setSelectedFile(null);\n setSelectedDownloadUrl(null);\n }}\n onDelete={() => handleDeleteFile(selectedFile)}\n />\n </div>\n )}\n </div>\n }\n />\n\n {/* Upload Dialog */}\n <UploadDialog\n open={uploadDialogOpen}\n currentPath={currentPath}\n onClose={() => setUploadDialogOpen(false)}\n onUpload={handleUpload}\n />\n </div>\n );\n};\n"],"names":["formatFileSize","bytes","toFixed","getFileIcon","contentType","FileTextIcon","startsWith","ImageIcon","VideoIcon","Music2Icon","getExtension","name","parts","split","length","toUpperCase","breadcrumbSegments","path","label","filter","Boolean","segments","accumulated","part","push","UploadDialog","open","currentPath","onClose","onUpload","uploading","setUploading","useState","selectedFiles","setSelectedFiles","error","setError","handleFilesAdded","useCallback","files","prev","handleRemoveFile","index","_","i","handleUpload","err","Error","message","handleClose","o","map","file","cls","size","e","stopPropagation","FilePreviewPanel","t0","$","_c","onDelete","downloadUrl","t1","FileIconComponent","deleteDialogOpen","setDeleteDialogOpen","t2","t3","Symbol","for","defaultBorderMixin","t4","t5","window","iconSize","smallest","t6","t7","t8","t9","t10","t11","t12","ext","toLowerCase","isImage_0","includes","isVideo_0","isAudio_0","downloadUrl_0","isImage","t13","isVideo","isAudio","t14","t15","t16","t17","t18","t19","t20","undefined","t21","t22","t23","t24","t25","fullPath","t26","t27","navigator","clipboard","writeText","t28","t29","t30","t31","t32","t33","t34","t35","StorageSidebar","folders","onNavigate","loading","folder","isSelected","StorageView","storageSource","useStorageSource","snackbarController","useSnackbarController","setCurrentPath","setLoading","setFolders","setFiles","selectedFile","setSelectedFile","selectedDownloadUrl","setSelectedDownloadUrl","uploadDialogOpen","setUploadDialogOpen","viewMode","setViewMode","sidebarSize","setSidebarSize","saved","localStorage","getItem","parseFloat","useEffect","setItem","toString","fetchContents","result","listObjects","folderItems","prefixes","ref","isFolder","fileItems","Promise","all","items","downloadConfig","getSignedUrl","metadata","url","console","String","handleNavigate","handleNavigateUp","pop","join","handleSelectFile","config","uploadFiles","key","putObject","type","handleDeleteFile","deleteObject","handleRefresh","renderContents","allItems","FileIconComp","seg"],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { EntityCollection } from "@rebasepro/types";
|
|
2
|
+
export declare class CollectionRegistry {
|
|
3
|
+
private collectionsByTableName;
|
|
4
|
+
private collectionsBySlug;
|
|
5
|
+
private rootCollections;
|
|
6
|
+
private cachedCollectionsList;
|
|
7
|
+
private rawCollectionsByTableName;
|
|
8
|
+
private rawCollectionsBySlug;
|
|
9
|
+
private rawRootCollections;
|
|
10
|
+
private cachedRawCollectionsList;
|
|
11
|
+
private lastRawInputSnapshot;
|
|
12
|
+
constructor(collections?: EntityCollection[]);
|
|
13
|
+
reset(): void;
|
|
14
|
+
/**
|
|
15
|
+
* Registers a collection and its subcollections recursively.
|
|
16
|
+
* Returns true if the collections have changed, false otherwise.
|
|
17
|
+
*
|
|
18
|
+
* Idempotent: compares the raw input (before normalization) against a stored
|
|
19
|
+
* snapshot. Only re-normalizes and re-registers when the raw input actually changed.
|
|
20
|
+
* @param collections
|
|
21
|
+
*/
|
|
22
|
+
registerMultiple(collections: EntityCollection[]): boolean;
|
|
23
|
+
register(collection: EntityCollection, rawCollection?: EntityCollection): void;
|
|
24
|
+
private _registerRecursively;
|
|
25
|
+
normalizeCollection(collection: EntityCollection): EntityCollection;
|
|
26
|
+
/**
|
|
27
|
+
* Extract Relation[] from properties that have inline relation config (i.e. `target` is set).
|
|
28
|
+
* This allows developers to define relations directly on properties without a separate
|
|
29
|
+
* `relations[]` entry on the collection.
|
|
30
|
+
*/
|
|
31
|
+
private extractRelationsFromProperties;
|
|
32
|
+
private normalizeProperties;
|
|
33
|
+
private normalizeProperty;
|
|
34
|
+
get(path: string): EntityCollection | undefined;
|
|
35
|
+
/**
|
|
36
|
+
* Gets the pristine, un-normalized collection exactly as it was provided.
|
|
37
|
+
* Useful for the AST editor so it doesn't accidentally serialize injected metadata back to disk.
|
|
38
|
+
*/
|
|
39
|
+
getRaw(path: string): EntityCollection | undefined;
|
|
40
|
+
/**
|
|
41
|
+
* Get collection by resolving multi-segment paths through relations
|
|
42
|
+
* e.g., "authors/70/posts" resolves to the posts collection
|
|
43
|
+
*/
|
|
44
|
+
getCollectionByPath(collectionPath: string): EntityCollection | undefined;
|
|
45
|
+
getCollections(): EntityCollection[];
|
|
46
|
+
getRawCollections(): EntityCollection[];
|
|
47
|
+
/**
|
|
48
|
+
* Resolves a multi-segment path like "products/123/locales" and returns
|
|
49
|
+
* information about the collections and entity IDs along the path
|
|
50
|
+
*/
|
|
51
|
+
resolvePathToCollections(path: string): {
|
|
52
|
+
collections: EntityCollection[];
|
|
53
|
+
entityIds: (string | number)[];
|
|
54
|
+
finalCollection: EntityCollection;
|
|
55
|
+
};
|
|
56
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./CollectionRegistry";
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { DataDriver, RebaseData } from "@rebasepro/types";
|
|
2
|
+
/**
|
|
3
|
+
* Build a `RebaseData` object from a `DataDriver` using JavaScript Proxy.
|
|
4
|
+
*
|
|
5
|
+
* This is the key bridge: any property access like `data.products` returns
|
|
6
|
+
* a `CollectionAccessor` backed by the underlying DataDriver, without
|
|
7
|
+
* needing per-collection code generation.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* const data = buildRebaseData(driver);
|
|
11
|
+
* await data.products.create({ name: "Camera", price: 299 });
|
|
12
|
+
* const { data: items } = await data.products.find({ where: { status: "eq.published" } });
|
|
13
|
+
*/
|
|
14
|
+
export declare function buildRebaseData(driver: DataDriver): RebaseData;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { AdditionalFieldDelegate, ArrayProperty, BooleanProperty, DateProperty, EntityCallbacks, EntityCollection, EnumValueConfig, EnumValues, GeopointProperty, MapProperty, NumberProperty, Properties, Property, ReferenceProperty, StringProperty, User } from "@rebasepro/types";
|
|
2
|
+
/**
|
|
3
|
+
* Identity function we use to defeat the type system of Typescript and build
|
|
4
|
+
* collection views with all its properties
|
|
5
|
+
* @param collection
|
|
6
|
+
* @group Builder
|
|
7
|
+
*/
|
|
8
|
+
export declare function buildCollection<M extends Record<string, unknown> = Record<string, unknown>, USER extends User = User>(collection: EntityCollection<M, USER>): EntityCollection<M, USER>;
|
|
9
|
+
/**
|
|
10
|
+
* Identity function we use to defeat the type system of Typescript and preserve
|
|
11
|
+
* the property keys.
|
|
12
|
+
* @param property
|
|
13
|
+
* @group Builder
|
|
14
|
+
*/
|
|
15
|
+
export declare function buildProperty<T, P extends Property = Property>(property: P): P extends StringProperty ? StringProperty : P extends NumberProperty ? NumberProperty : P extends BooleanProperty ? BooleanProperty : P extends DateProperty ? DateProperty : P extends GeopointProperty ? GeopointProperty : P extends ReferenceProperty ? ReferenceProperty : P extends ArrayProperty ? ArrayProperty : P extends MapProperty ? MapProperty : never;
|
|
16
|
+
/**
|
|
17
|
+
* Identity function we use to defeat the type system of Typescript and preserve
|
|
18
|
+
* the properties keys.
|
|
19
|
+
* @param properties
|
|
20
|
+
* @group Builder
|
|
21
|
+
*/
|
|
22
|
+
export declare function buildProperties<M extends Record<string, unknown>>(properties: Properties): Properties;
|
|
23
|
+
/**
|
|
24
|
+
* Identity function we use to defeat the type system of Typescript and preserve
|
|
25
|
+
* the properties keys.
|
|
26
|
+
* @param propertiesOrBuilder
|
|
27
|
+
* @group Builder
|
|
28
|
+
*/
|
|
29
|
+
export declare function buildPropertiesOrBuilder<M extends Record<string, unknown>>(propertiesOrBuilder: Properties): Properties;
|
|
30
|
+
/**
|
|
31
|
+
* Identity function we use to defeat the type system of Typescript and preserve
|
|
32
|
+
* the properties keys.
|
|
33
|
+
* @param enumValues
|
|
34
|
+
* @group Builder
|
|
35
|
+
*/
|
|
36
|
+
export declare function buildEnum(enumValues: EnumValues): EnumValues;
|
|
37
|
+
/**
|
|
38
|
+
* Identity function we use to defeat the type system of Typescript and preserve
|
|
39
|
+
* the properties keys.
|
|
40
|
+
* @param enumValueConfig
|
|
41
|
+
* @group Builder
|
|
42
|
+
*/
|
|
43
|
+
export declare function buildEnumValueConfig(enumValueConfig: EnumValueConfig): EnumValueConfig;
|
|
44
|
+
/**
|
|
45
|
+
* Identity function we use to defeat the type system of Typescript and preserve
|
|
46
|
+
* the properties keys.
|
|
47
|
+
* @param callbacks
|
|
48
|
+
* @group Builder
|
|
49
|
+
*/
|
|
50
|
+
export declare function buildEntityCallbacks<M extends Record<string, unknown> = Record<string, unknown>>(callbacks: EntityCallbacks<M>): EntityCallbacks<M>;
|
|
51
|
+
/**
|
|
52
|
+
* Identity function we use to defeat the type system of Typescript and build
|
|
53
|
+
* additional field delegates views with all its properties
|
|
54
|
+
* @param additionalFieldDelegate
|
|
55
|
+
* @group Builder
|
|
56
|
+
*/
|
|
57
|
+
export declare function buildAdditionalFieldDelegate<M extends Record<string, unknown>, USER extends User = User>(additionalFieldDelegate: AdditionalFieldDelegate<M, USER>): AdditionalFieldDelegate<M, USER>;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { EntityCallbacks, Properties } from "@rebasepro/types";
|
|
2
|
+
/**
|
|
3
|
+
* Helper function to extract field-level PropertyCallbacks from a properties schema
|
|
4
|
+
* and wrap them into an EntityCallbacks object recursively.
|
|
5
|
+
*/
|
|
6
|
+
export declare const buildPropertyCallbacks: (properties: Properties) => EntityCallbacks | undefined;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { DefaultSelectedViewBuilder, DefaultSelectedViewParams, EntityCollection, Properties } from "@rebasepro/types";
|
|
2
|
+
export declare function sortProperties<M extends Record<string, unknown>>(properties: Properties, propertiesOrder?: string[]): Properties;
|
|
3
|
+
export declare function resolveDefaultSelectedView(defaultSelectedView: string | DefaultSelectedViewBuilder | undefined, params: DefaultSelectedViewParams): string | undefined;
|
|
4
|
+
export declare function getLocalChangesBackup(collection: EntityCollection): "manual_apply" | "auto_apply";
|
|
5
|
+
/**
|
|
6
|
+
* Returns the primary keys for an entity collection by inspecting the properties
|
|
7
|
+
* and finding any properties with `isId`.
|
|
8
|
+
* Fallbacks to `["id"]` if no properties are marked as `isId: true`.
|
|
9
|
+
* @param collection
|
|
10
|
+
*/
|
|
11
|
+
export declare function getPrimaryKeys<M extends Record<string, unknown>>(collection: EntityCollection<M>): Extract<keyof M, string>[];
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { AuthController, ConditionContext, JsonLogicRule, Property } from "@rebasepro/types";
|
|
2
|
+
/**
|
|
3
|
+
* Register custom JSON Logic operations for Rebase.
|
|
4
|
+
* Call this once at app initialization.
|
|
5
|
+
*/
|
|
6
|
+
export declare function registerConditionOperations(): void;
|
|
7
|
+
/**
|
|
8
|
+
* Evaluate a JSON Logic rule against the given context.
|
|
9
|
+
*/
|
|
10
|
+
export declare function evaluateCondition(rule: JsonLogicRule, context: ConditionContext): unknown;
|
|
11
|
+
/**
|
|
12
|
+
* Build a ConditionContext from the current property resolution context.
|
|
13
|
+
*/
|
|
14
|
+
export declare function buildConditionContext(params: {
|
|
15
|
+
propertyKey?: string;
|
|
16
|
+
values?: Record<string, unknown>;
|
|
17
|
+
previousValues?: Record<string, unknown>;
|
|
18
|
+
path: string;
|
|
19
|
+
entityId?: string;
|
|
20
|
+
index?: number;
|
|
21
|
+
authController: AuthController;
|
|
22
|
+
}): ConditionContext;
|
|
23
|
+
/**
|
|
24
|
+
* Apply PropertyConditions to a resolved property, evaluating all JSON Logic rules.
|
|
25
|
+
*/
|
|
26
|
+
export declare function applyPropertyConditions(property: Property, context: ConditionContext): Property;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { DataType, Entity, EntityReference, EntityRelation, EntityStatus, EntityValues, Properties, Property } from "@rebasepro/types";
|
|
2
|
+
export declare function isReadOnly(property: Property): boolean;
|
|
3
|
+
export declare function isHidden(property: Property): boolean;
|
|
4
|
+
export declare function isPropertyBuilder(property?: Property): boolean;
|
|
5
|
+
export declare function getDefaultValuesFor<M extends Record<string, unknown>>(properties: Properties): Partial<EntityValues<M>>;
|
|
6
|
+
export declare function getDefaultValueFor(property?: Property): {} | null | undefined;
|
|
7
|
+
export declare function getDefaultValueFortype(type: DataType): {} | null;
|
|
8
|
+
/**
|
|
9
|
+
* Update the automatic values in an entity before save
|
|
10
|
+
* @group Driver
|
|
11
|
+
*/
|
|
12
|
+
export declare function updateDateAutoValues<M extends Record<string, unknown>>({ inputValues, properties, status, timestampNowValue }: {
|
|
13
|
+
inputValues: Partial<EntityValues<M>>;
|
|
14
|
+
properties: Properties;
|
|
15
|
+
status: EntityStatus;
|
|
16
|
+
timestampNowValue: unknown;
|
|
17
|
+
}): EntityValues<M>;
|
|
18
|
+
/**
|
|
19
|
+
* Add missing required fields, expected in the collection, to the values of an entity
|
|
20
|
+
* @param values
|
|
21
|
+
* @param properties
|
|
22
|
+
* @group Driver
|
|
23
|
+
*/
|
|
24
|
+
export declare function sanitizeData<M extends Record<string, unknown>>(values: EntityValues<M>, properties: Properties): Record<string, unknown>;
|
|
25
|
+
export declare function getReferenceFrom<M extends Record<string, unknown>>(entity: Entity<M>): EntityReference;
|
|
26
|
+
export declare function getRelationFrom<M extends Record<string, unknown>>(entity: Entity<M>): EntityRelation;
|
|
27
|
+
/**
|
|
28
|
+
* Normalize a value into a proper EntityRelation instance.
|
|
29
|
+
* Handles EntityRelation class instances, and plain objects
|
|
30
|
+
* with `__type === "relation"` or an `isEntityRelation()` method.
|
|
31
|
+
*
|
|
32
|
+
* Returns null if the value cannot be coerced.
|
|
33
|
+
*/
|
|
34
|
+
export declare function normalizeToEntityRelation(value: unknown): EntityRelation | null;
|
|
35
|
+
export declare function traverseValuesProperties<M extends Record<string, unknown>>(inputValues: Partial<EntityValues<M>>, properties: Properties, operation: (value: unknown, property: Property) => unknown): EntityValues<M> | undefined;
|
|
36
|
+
export declare function traverseValueProperty(inputValue: unknown, property: Property, operation: (value: unknown, property: Property) => unknown): unknown;
|
|
37
|
+
/**
|
|
38
|
+
* Relation reference types used throughout the server layer.
|
|
39
|
+
* These replace the 50+ manual `{ id, path, __type: "relation" }` constructions.
|
|
40
|
+
*/
|
|
41
|
+
export interface RelationRef {
|
|
42
|
+
readonly id: string | number;
|
|
43
|
+
readonly path: string;
|
|
44
|
+
readonly __type: "relation";
|
|
45
|
+
}
|
|
46
|
+
export interface RelationRefWithData extends RelationRef {
|
|
47
|
+
readonly data: Entity;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Create a lightweight relation stub for CMS views.
|
|
51
|
+
* Replaces inline `{ id, path, __type: "relation" }` object literals.
|
|
52
|
+
*/
|
|
53
|
+
export declare function createRelationRef(id: string | number, path: string): RelationRef;
|
|
54
|
+
/**
|
|
55
|
+
* Create a hydrated relation reference that includes the full entity data.
|
|
56
|
+
* Used when entity data has been pre-fetched (e.g., via batch loading or JOINs).
|
|
57
|
+
*/
|
|
58
|
+
export declare function createRelationRefWithData(id: string | number, path: string, data: Entity): RelationRefWithData;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { EnumValueConfig, EnumValues } from "@rebasepro/types";
|
|
2
|
+
export declare function enumToObjectEntries(enumValues: EnumValues): EnumValueConfig[];
|
|
3
|
+
export declare function getLabelOrConfigFrom(enumValues: EnumValueConfig[], key?: string | number): EnumValueConfig | undefined;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export * from "./collections";
|
|
2
|
+
export * from "./common";
|
|
3
|
+
export * from "./entities";
|
|
4
|
+
export * from "./enums";
|
|
5
|
+
export * from "./paths";
|
|
6
|
+
export * from "./resolutions";
|
|
7
|
+
export * from "./permissions";
|
|
8
|
+
export * from "./references";
|
|
9
|
+
export * from "./navigation_from_path";
|
|
10
|
+
export * from "./parent_references_from_path";
|
|
11
|
+
export * from "./builders";
|
|
12
|
+
export * from "./storage";
|
|
13
|
+
export * from "./callbacks";
|
|
14
|
+
export * from "./relations";
|
|
15
|
+
export * from "./conditions";
|
|
16
|
+
export * from "./navigation_utils";
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { EntityCollection } from "@rebasepro/types";
|
|
2
|
+
type EntityCustomView<M extends Record<string, unknown> = Record<string, unknown>> = {
|
|
3
|
+
key: string;
|
|
4
|
+
[key: string]: unknown;
|
|
5
|
+
};
|
|
6
|
+
export type NavigationViewInternal<M extends Record<string, unknown> = Record<string, unknown>> = NavigationViewEntityInternal<M> | NavigationViewCollectionInternal<M> | NavigationViewEntityCustomInternal<M>;
|
|
7
|
+
export interface NavigationViewEntityInternal<M extends Record<string, unknown>> {
|
|
8
|
+
type: "entity";
|
|
9
|
+
entityId: string | number;
|
|
10
|
+
slug: string;
|
|
11
|
+
path: string;
|
|
12
|
+
parentCollection: EntityCollection<M>;
|
|
13
|
+
}
|
|
14
|
+
export interface NavigationViewCollectionInternal<M extends Record<string, unknown>> {
|
|
15
|
+
type: "collection";
|
|
16
|
+
id: string;
|
|
17
|
+
slug: string;
|
|
18
|
+
path: string;
|
|
19
|
+
collection: EntityCollection<M>;
|
|
20
|
+
}
|
|
21
|
+
export interface NavigationViewEntityCustomInternal<M extends Record<string, unknown>> {
|
|
22
|
+
type: "custom_view";
|
|
23
|
+
slug: string;
|
|
24
|
+
path: string;
|
|
25
|
+
entityId: string | number;
|
|
26
|
+
view: EntityCustomView<M>;
|
|
27
|
+
}
|
|
28
|
+
export declare function getNavigationEntriesFromPath(props: {
|
|
29
|
+
path: string;
|
|
30
|
+
collections: EntityCollection[] | undefined;
|
|
31
|
+
currentFullPath?: string;
|
|
32
|
+
contextEntityViews?: EntityCustomView[];
|
|
33
|
+
}): NavigationViewInternal[];
|
|
34
|
+
export {};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { EntityCollection } from "@rebasepro/types";
|
|
2
|
+
export declare function removeInitialAndTrailingSlashes(s: string): string;
|
|
3
|
+
export declare function removeInitialSlash(s: string): string;
|
|
4
|
+
export declare function removeTrailingSlash(s: string): string;
|
|
5
|
+
export declare function addInitialSlash(s: string): string;
|
|
6
|
+
export declare function getLastSegment(path: string): string;
|
|
7
|
+
export declare function resolveCollectionPathIds(path: string, allCollections: EntityCollection[]): string;
|
|
8
|
+
/**
|
|
9
|
+
* Find the corresponding view at any depth for a given path.
|
|
10
|
+
* Note that path or segments of the paths can be collection aliases.
|
|
11
|
+
* @param slugOrPath
|
|
12
|
+
* @param collections
|
|
13
|
+
*/
|
|
14
|
+
export declare function getCollectionBySlugWithin(slugOrPath: string, collections: EntityCollection[]): EntityCollection | undefined;
|
|
15
|
+
/**
|
|
16
|
+
* Get the subcollection combinations from a path:
|
|
17
|
+
* "sites/es/locales" => ["sites/es/locales", "sites"]
|
|
18
|
+
* @param subpaths
|
|
19
|
+
*/
|
|
20
|
+
export declare function getCollectionPathsCombinations(subpaths: string[]): string[];
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare const COLLECTION_PATH_SEPARATOR = "::";
|
|
2
|
+
/**
|
|
3
|
+
* Remove the entity ids from a given path
|
|
4
|
+
* `products/B44RG6APH/locales` => `products::locales`
|
|
5
|
+
* @param path
|
|
6
|
+
*/
|
|
7
|
+
export declare function stripCollectionPath(path: string): string;
|
|
8
|
+
export declare function segmentsToStrippedPath(paths: string[]): string;
|
|
9
|
+
/**
|
|
10
|
+
* Extract the collection path routes
|
|
11
|
+
* `products/B44RG6APH/locales` => [`products`, `locales`]
|
|
12
|
+
* @param path
|
|
13
|
+
*/
|
|
14
|
+
export declare function fullPathToCollectionSegments(path: string): string[];
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { AuthController, Entity, EntityCollection, User } from "@rebasepro/types";
|
|
2
|
+
export declare function canReadCollection<M extends Record<string, unknown>, USER extends User>(collection: EntityCollection<M>, authController: AuthController<USER>): boolean;
|
|
3
|
+
export declare function canEditEntity<M extends Record<string, unknown>, USER extends User>(collection: EntityCollection<M>, authController: AuthController<USER>, path: string, entity: Entity<M> | null): boolean;
|
|
4
|
+
export declare function canCreateEntity<M extends Record<string, unknown>, USER extends User>(collection: EntityCollection<M>, authController: AuthController<USER>, path: string, entity: Entity<M> | null): boolean;
|
|
5
|
+
export declare function canDeleteEntity<M extends Record<string, unknown>, USER extends User>(collection: EntityCollection<M>, authController: AuthController<USER>, path: string, entity: Entity<M> | null): boolean;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { EntityCollection, Property, Relation } from "@rebasepro/types";
|
|
2
|
+
export declare function sanitizeRelation(relation: Partial<Relation>, sourceCollection: EntityCollection): Relation;
|
|
3
|
+
export declare function resolveCollectionRelations(collection: EntityCollection): Record<string, Relation>;
|
|
4
|
+
export declare function resolvePropertyRelation({ propertyKey, property, sourceCollection }: {
|
|
5
|
+
propertyKey: string;
|
|
6
|
+
property: Property;
|
|
7
|
+
sourceCollection: EntityCollection;
|
|
8
|
+
}): Relation | undefined;
|
|
9
|
+
export declare function getTableName(collection: EntityCollection): string;
|
|
10
|
+
export declare function getTableVarName(tableName: string): string;
|
|
11
|
+
export declare function getEnumVarName(tableName: string, propName: string): string;
|
|
12
|
+
export declare function getColumnName(fullColumn: string): string;
|
|
13
|
+
/**
|
|
14
|
+
* Look up a relation by key with forgiving normalization.
|
|
15
|
+
*
|
|
16
|
+
* `resolveCollectionRelations` stores each relation under a single canonical
|
|
17
|
+
* key (no aliases). This helper tries the given key as-is, then falls back to
|
|
18
|
+
* slug form (underscores → hyphens) and snake_case form (hyphens → underscores)
|
|
19
|
+
* so that callers that receive a key from external input (URL path segments,
|
|
20
|
+
* user-provided config, etc.) can still find the right entry.
|
|
21
|
+
*/
|
|
22
|
+
export declare function findRelation(resolvedRelations: Record<string, Relation>, key: string): Relation | undefined;
|