@rebasepro/studio 0.4.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +73 -140
- package/dist/ApiExplorer-CdIwR9Ga.js +963 -0
- package/dist/ApiExplorer-CdIwR9Ga.js.map +1 -0
- package/dist/AuthSimulationSelector-iEZ-Or_1.js +56 -0
- package/dist/AuthSimulationSelector-iEZ-Or_1.js.map +1 -0
- package/dist/BranchesView-DncIRcZt.js +461 -0
- package/dist/BranchesView-DncIRcZt.js.map +1 -0
- package/dist/CronJobsView-4gdtJvoe.js +500 -0
- package/dist/CronJobsView-4gdtJvoe.js.map +1 -0
- package/dist/JSEditor-BhAbEjCP.js +1573 -0
- package/dist/JSEditor-BhAbEjCP.js.map +1 -0
- package/dist/LogsExplorer-CqtKILj8.js +240 -0
- package/dist/LogsExplorer-CqtKILj8.js.map +1 -0
- package/dist/MonacoEditor-COZqrIJ1.js +246 -0
- package/dist/MonacoEditor-COZqrIJ1.js.map +1 -0
- package/dist/RLSEditor-CTxYbBdW.js +1362 -0
- package/dist/RLSEditor-CTxYbBdW.js.map +1 -0
- package/dist/SQLEditor-BLuq_zDM.js +1964 -0
- package/dist/SQLEditor-BLuq_zDM.js.map +1 -0
- package/dist/SchemaVisualizer-BJK2u3C0.js +1068 -0
- package/dist/SchemaVisualizer-BJK2u3C0.js.map +1 -0
- package/dist/StorageView-nDaC2foF.js +1382 -0
- package/dist/StorageView-nDaC2foF.js.map +1 -0
- package/dist/{studio/src/components → components}/ApiExplorer/ApiExplorer.d.ts +2 -1
- package/dist/{studio/src/components → components}/ApiExplorer/EndpointDetail.d.ts +2 -1
- package/dist/{studio/src/components → components}/ApiExplorer/TryItPanel.d.ts +2 -1
- package/dist/{studio/src/components → components}/AuthSimulationSelector.d.ts +2 -1
- package/dist/components/Branches/BranchesView.d.ts +2 -0
- package/dist/components/CronJobs/CronJobsView.d.ts +2 -0
- package/dist/components/JSEditor/JSEditor.d.ts +2 -0
- package/dist/{studio/src/components → components}/JSEditor/JSEditorSidebar.d.ts +2 -1
- package/dist/{studio/src/components → components}/JSEditor/JSMonacoEditor.d.ts +2 -1
- package/dist/components/LogsExplorer/LogsExplorer.d.ts +2 -0
- package/dist/{studio/src/components → components}/RLSEditor/PolicyEditor.d.ts +2 -1
- package/dist/{studio/src/components → components}/RLSEditor/RLSEditor.d.ts +2 -7
- package/dist/{studio/src/components → components}/SQLEditor/MonacoEditor.d.ts +2 -1
- package/dist/{studio/src/components → components}/SQLEditor/SQLEditor.d.ts +2 -1
- package/dist/{studio/src/components → components}/SQLEditor/SQLEditorSidebar.d.ts +2 -1
- package/dist/{studio/src/components → components}/SQLEditor/SchemaBrowser.d.ts +2 -1
- package/dist/{studio/src/components → components}/SchemaVisualizer/RelationEdge.d.ts +1 -1
- package/dist/components/SchemaVisualizer/SchemaVisualizer.d.ts +3 -0
- package/dist/{studio/src/components → components}/SchemaVisualizer/TableNode.d.ts +1 -1
- package/dist/{studio/src/components → components}/SchemaVisualizer/schema-visualizer.utils.d.ts +0 -8
- package/dist/components/StorageView/StorageView.d.ts +2 -0
- package/dist/{studio/src/components → components}/StudioHomePage.d.ts +1 -1
- package/dist/index.es.js +688 -746
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +10303 -9572
- package/dist/index.umd.js.map +1 -1
- package/dist/{studio/src/utils → utils}/pgColumnToProperty.d.ts +1 -1
- package/package.json +22 -22
- package/src/components/ApiExplorer/TryItPanel.tsx +15 -18
- package/src/components/CronJobs/CronJobsView.tsx +1 -1
- package/src/components/JSEditor/JSEditor.tsx +10 -15
- package/src/components/LogsExplorer/LogsExplorer.tsx +6 -3
- package/src/components/RLSEditor/PolicyEditor.tsx +0 -1
- package/src/components/RLSEditor/RLSEditor.tsx +1 -1
- package/src/components/SQLEditor/SQLEditor.tsx +40 -30
- package/src/components/SchemaVisualizer/schema-visualizer.utils.ts +3 -3
- package/src/components/SchemaVisualizer/useSchemaGraph.ts +2 -2
- package/src/components/StorageView/StorageView.tsx +22 -11
- package/src/components/StudioHomePage.tsx +51 -15
- package/src/utils/parseSpec.test.ts +41 -20
- package/src/utils/pgColumnToProperty.ts +23 -20
- package/src/utils/sql_utils.ts +1 -1
- package/dist/ApiExplorer-CGHEF1uL.js +0 -1052
- package/dist/ApiExplorer-CGHEF1uL.js.map +0 -1
- package/dist/AuthSimulationSelector-DGoXkWSg.js +0 -105
- package/dist/AuthSimulationSelector-DGoXkWSg.js.map +0 -1
- package/dist/BranchesView-BiTEwIhd.js +0 -291
- package/dist/BranchesView-BiTEwIhd.js.map +0 -1
- package/dist/CronJobsView-3PM_qR8v.js +0 -472
- package/dist/CronJobsView-3PM_qR8v.js.map +0 -1
- package/dist/JSEditor-BCSoElPg.js +0 -1297
- package/dist/JSEditor-BCSoElPg.js.map +0 -1
- package/dist/LogsExplorer-_4sZadKn.js +0 -162
- package/dist/LogsExplorer-_4sZadKn.js.map +0 -1
- package/dist/MonacoEditor-CMYEjiRf.js +0 -161
- package/dist/MonacoEditor-CMYEjiRf.js.map +0 -1
- package/dist/RLSEditor-CHEExeSB.js +0 -1871
- package/dist/RLSEditor-CHEExeSB.js.map +0 -1
- package/dist/SQLEditor-BC0IOUQu.js +0 -1797
- package/dist/SQLEditor-BC0IOUQu.js.map +0 -1
- package/dist/SchemaVisualizer-BGpmzyXT.js +0 -1069
- package/dist/SchemaVisualizer-BGpmzyXT.js.map +0 -1
- package/dist/StorageView-B7AsN2qX.js +0 -869
- package/dist/StorageView-B7AsN2qX.js.map +0 -1
- package/dist/common/src/collections/CollectionRegistry.d.ts +0 -56
- package/dist/common/src/collections/default-collections.d.ts +0 -9
- package/dist/common/src/collections/index.d.ts +0 -2
- package/dist/common/src/data/buildRebaseData.d.ts +0 -14
- package/dist/common/src/data/query_builder.d.ts +0 -55
- package/dist/common/src/index.d.ts +0 -4
- package/dist/common/src/util/builders.d.ts +0 -57
- package/dist/common/src/util/callbacks.d.ts +0 -6
- package/dist/common/src/util/collections.d.ts +0 -11
- package/dist/common/src/util/common.d.ts +0 -2
- package/dist/common/src/util/conditions.d.ts +0 -26
- package/dist/common/src/util/entities.d.ts +0 -58
- package/dist/common/src/util/enums.d.ts +0 -3
- package/dist/common/src/util/index.d.ts +0 -16
- package/dist/common/src/util/navigation_from_path.d.ts +0 -34
- package/dist/common/src/util/navigation_utils.d.ts +0 -20
- package/dist/common/src/util/parent_references_from_path.d.ts +0 -6
- package/dist/common/src/util/paths.d.ts +0 -14
- package/dist/common/src/util/permissions.d.ts +0 -6
- package/dist/common/src/util/references.d.ts +0 -2
- package/dist/common/src/util/relations.d.ts +0 -22
- package/dist/common/src/util/resolutions.d.ts +0 -72
- package/dist/common/src/util/storage.d.ts +0 -24
- package/dist/core/src/components/AIIcon.d.ts +0 -16
- package/dist/core/src/components/BootstrapAdminBanner.d.ts +0 -4
- package/dist/core/src/components/ConfirmationDialog.d.ts +0 -9
- package/dist/core/src/components/Debug/UIReferenceView.d.ts +0 -1
- package/dist/core/src/components/Debug/UIStyleGuide.d.ts +0 -1
- package/dist/core/src/components/ErrorTooltip.d.ts +0 -2
- package/dist/core/src/components/ErrorView.d.ts +0 -21
- package/dist/core/src/components/LanguageToggle.d.ts +0 -1
- package/dist/core/src/components/LoginView/LoginView.d.ts +0 -109
- package/dist/core/src/components/LoginView/index.d.ts +0 -2
- package/dist/core/src/components/NotFoundPage.d.ts +0 -1
- package/dist/core/src/components/RebaseAuth.d.ts +0 -10
- package/dist/core/src/components/RebaseLogo.d.ts +0 -7
- package/dist/core/src/components/UnsavedChangesDialog.d.ts +0 -9
- package/dist/core/src/components/UserDisplay.d.ts +0 -7
- package/dist/core/src/components/UserSelectPopover.d.ts +0 -62
- package/dist/core/src/components/UserSettingsView.d.ts +0 -1
- package/dist/core/src/components/common/index.d.ts +0 -6
- package/dist/core/src/components/common/table_height.d.ts +0 -5
- package/dist/core/src/components/common/types.d.ts +0 -66
- package/dist/core/src/components/common/useColumnsIds.d.ts +0 -9
- package/dist/core/src/components/common/useDataTableController.d.ts +0 -45
- package/dist/core/src/components/common/useDebouncedData.d.ts +0 -9
- package/dist/core/src/components/common/useScrollRestoration.d.ts +0 -14
- package/dist/core/src/components/index.d.ts +0 -17
- package/dist/core/src/contexts/AdminModeController.d.ts +0 -4
- package/dist/core/src/contexts/AnalyticsContext.d.ts +0 -3
- package/dist/core/src/contexts/AuthControllerContext.d.ts +0 -3
- package/dist/core/src/contexts/CustomizationControllerContext.d.ts +0 -3
- package/dist/core/src/contexts/DataDriverContext.d.ts +0 -3
- package/dist/core/src/contexts/DatabaseAdminContext.d.ts +0 -3
- package/dist/core/src/contexts/DialogsProvider.d.ts +0 -4
- package/dist/core/src/contexts/EffectiveRoleController.d.ts +0 -4
- package/dist/core/src/contexts/InternalUserManagementContext.d.ts +0 -3
- package/dist/core/src/contexts/ModeController.d.ts +0 -4
- package/dist/core/src/contexts/RebaseClientInstanceContext.d.ts +0 -6
- package/dist/core/src/contexts/RebaseDataContext.d.ts +0 -3
- package/dist/core/src/contexts/SnackbarProvider.d.ts +0 -2
- package/dist/core/src/contexts/StorageSourceContext.d.ts +0 -3
- package/dist/core/src/contexts/UserConfigurationPersistenceContext.d.ts +0 -3
- package/dist/core/src/contexts/index.d.ts +0 -13
- package/dist/core/src/core/PluginLifecycleManager.d.ts +0 -17
- package/dist/core/src/core/PluginProviderStack.d.ts +0 -21
- package/dist/core/src/core/Rebase.d.ts +0 -14
- package/dist/core/src/core/RebaseProps.d.ts +0 -147
- package/dist/core/src/core/RebaseRouter.d.ts +0 -4
- package/dist/core/src/core/RebaseRoutes.d.ts +0 -17
- package/dist/core/src/core/index.d.ts +0 -4
- package/dist/core/src/hooks/ApiConfigContext.d.ts +0 -24
- package/dist/core/src/hooks/data/delete.d.ts +0 -31
- package/dist/core/src/hooks/data/save.d.ts +0 -34
- package/dist/core/src/hooks/data/useCollectionFetch.d.ts +0 -62
- package/dist/core/src/hooks/data/useData.d.ts +0 -13
- package/dist/core/src/hooks/data/useDataOrder.d.ts +0 -12
- package/dist/core/src/hooks/data/useEntityFetch.d.ts +0 -43
- package/dist/core/src/hooks/data/useRelationSelector.d.ts +0 -52
- package/dist/core/src/hooks/data/useUserSelector.d.ts +0 -31
- package/dist/core/src/hooks/index.d.ts +0 -37
- package/dist/core/src/hooks/useAdminModeController.d.ts +0 -19
- package/dist/core/src/hooks/useAnalyticsController.d.ts +0 -5
- package/dist/core/src/hooks/useAuthController.d.ts +0 -11
- package/dist/core/src/hooks/useAuthSubscription.d.ts +0 -2
- package/dist/core/src/hooks/useBackendStorageSource.d.ts +0 -30
- package/dist/core/src/hooks/useBridgeRegistration.d.ts +0 -18
- package/dist/core/src/hooks/useBrowserTitleAndIcon.d.ts +0 -6
- package/dist/core/src/hooks/useBuildAdminModeController.d.ts +0 -6
- package/dist/core/src/hooks/useBuildEffectiveRoleController.d.ts +0 -8
- package/dist/core/src/hooks/useBuildLocalConfigurationPersistence.d.ts +0 -2
- package/dist/core/src/hooks/useBuildModeController.d.ts +0 -6
- package/dist/core/src/hooks/useClipboard.d.ts +0 -57
- package/dist/core/src/hooks/useCollapsedGroups.d.ts +0 -27
- package/dist/core/src/hooks/useCustomizationController.d.ts +0 -11
- package/dist/core/src/hooks/useDialogsController.d.ts +0 -11
- package/dist/core/src/hooks/useEffectiveRoleController.d.ts +0 -7
- package/dist/core/src/hooks/useInternalUserManagementController.d.ts +0 -12
- package/dist/core/src/hooks/useLargeLayout.d.ts +0 -1
- package/dist/core/src/hooks/useModeController.d.ts +0 -19
- package/dist/core/src/hooks/usePermissions.d.ts +0 -12
- package/dist/core/src/hooks/useRebaseClient.d.ts +0 -5
- package/dist/core/src/hooks/useRebaseContext.d.ts +0 -11
- package/dist/core/src/hooks/useRebaseRegistry.d.ts +0 -34
- package/dist/core/src/hooks/useResolvedComponent.d.ts +0 -47
- package/dist/core/src/hooks/useSlot.d.ts +0 -18
- package/dist/core/src/hooks/useSnackbarController.d.ts +0 -20
- package/dist/core/src/hooks/useStorageSource.d.ts +0 -7
- package/dist/core/src/hooks/useStudioBridge.d.ts +0 -91
- package/dist/core/src/hooks/useTranslation.d.ts +0 -17
- package/dist/core/src/hooks/useUnsavedChangesDialog.d.ts +0 -12
- package/dist/core/src/hooks/useUserConfigurationPersistence.d.ts +0 -8
- package/dist/core/src/i18n/RebaseI18nProvider.d.ts +0 -33
- package/dist/core/src/index.d.ts +0 -15
- package/dist/core/src/internal/common.d.ts +0 -3
- package/dist/core/src/internal/useRestoreScroll.d.ts +0 -6
- package/dist/core/src/locales/de.d.ts +0 -2
- package/dist/core/src/locales/en.d.ts +0 -10
- package/dist/core/src/locales/es.d.ts +0 -10
- package/dist/core/src/locales/fr.d.ts +0 -2
- package/dist/core/src/locales/hi.d.ts +0 -2
- package/dist/core/src/locales/it.d.ts +0 -2
- package/dist/core/src/locales/pt.d.ts +0 -7
- package/dist/core/src/util/constants.d.ts +0 -1
- package/dist/core/src/util/createFormexStub.d.ts +0 -2
- package/dist/core/src/util/entity_cache.d.ts +0 -22
- package/dist/core/src/util/enums.d.ts +0 -5
- package/dist/core/src/util/icon_list.d.ts +0 -5
- package/dist/core/src/util/icons.d.ts +0 -20
- package/dist/core/src/util/index.d.ts +0 -8
- package/dist/core/src/util/previews.d.ts +0 -4
- package/dist/core/src/util/useStorageUploadController.d.ts +0 -38
- package/dist/formex/src/Field.d.ts +0 -52
- package/dist/formex/src/Formex.d.ts +0 -7
- package/dist/formex/src/index.d.ts +0 -5
- package/dist/formex/src/types.d.ts +0 -40
- package/dist/formex/src/useCreateFormex.d.ts +0 -14
- package/dist/formex/src/utils.d.ts +0 -16
- package/dist/studio/src/components/Branches/BranchesView.d.ts +0 -1
- package/dist/studio/src/components/CronJobs/CronJobsView.d.ts +0 -1
- package/dist/studio/src/components/JSEditor/JSEditor.d.ts +0 -1
- package/dist/studio/src/components/LogsExplorer/LogsExplorer.d.ts +0 -1
- package/dist/studio/src/components/SchemaVisualizer/SchemaVisualizer.d.ts +0 -2
- package/dist/studio/src/components/SchemaVisualizer/index.d.ts +0 -5
- package/dist/studio/src/components/StorageView/StorageView.d.ts +0 -1
- package/dist/studio/src/utils/entities.d.ts +0 -0
- package/dist/types/src/controllers/analytics_controller.d.ts +0 -7
- package/dist/types/src/controllers/auth.d.ts +0 -104
- package/dist/types/src/controllers/client.d.ts +0 -168
- package/dist/types/src/controllers/collection_registry.d.ts +0 -46
- package/dist/types/src/controllers/customization_controller.d.ts +0 -60
- package/dist/types/src/controllers/data.d.ts +0 -207
- package/dist/types/src/controllers/data_driver.d.ts +0 -218
- package/dist/types/src/controllers/database_admin.d.ts +0 -11
- package/dist/types/src/controllers/dialogs_controller.d.ts +0 -36
- package/dist/types/src/controllers/effective_role.d.ts +0 -4
- package/dist/types/src/controllers/email.d.ts +0 -36
- package/dist/types/src/controllers/index.d.ts +0 -18
- package/dist/types/src/controllers/local_config_persistence.d.ts +0 -20
- package/dist/types/src/controllers/navigation.d.ts +0 -225
- package/dist/types/src/controllers/registry.d.ts +0 -63
- package/dist/types/src/controllers/side_dialogs_controller.d.ts +0 -67
- package/dist/types/src/controllers/side_entity_controller.d.ts +0 -97
- package/dist/types/src/controllers/snackbar.d.ts +0 -24
- package/dist/types/src/controllers/storage.d.ts +0 -171
- package/dist/types/src/index.d.ts +0 -4
- package/dist/types/src/rebase_context.d.ts +0 -122
- package/dist/types/src/types/auth_adapter.d.ts +0 -301
- package/dist/types/src/types/backend.d.ts +0 -536
- package/dist/types/src/types/backend_hooks.d.ts +0 -172
- package/dist/types/src/types/builders.d.ts +0 -15
- package/dist/types/src/types/chips.d.ts +0 -5
- package/dist/types/src/types/collections.d.ts +0 -941
- package/dist/types/src/types/component_ref.d.ts +0 -47
- package/dist/types/src/types/cron.d.ts +0 -102
- package/dist/types/src/types/data_source.d.ts +0 -64
- package/dist/types/src/types/database_adapter.d.ts +0 -94
- package/dist/types/src/types/entities.d.ts +0 -145
- package/dist/types/src/types/entity_actions.d.ts +0 -104
- package/dist/types/src/types/entity_callbacks.d.ts +0 -173
- package/dist/types/src/types/entity_link_builder.d.ts +0 -7
- package/dist/types/src/types/entity_overrides.d.ts +0 -10
- package/dist/types/src/types/entity_views.d.ts +0 -87
- package/dist/types/src/types/export_import.d.ts +0 -21
- package/dist/types/src/types/formex.d.ts +0 -40
- package/dist/types/src/types/index.d.ts +0 -28
- package/dist/types/src/types/locales.d.ts +0 -4
- package/dist/types/src/types/modify_collections.d.ts +0 -5
- package/dist/types/src/types/plugins.d.ts +0 -282
- package/dist/types/src/types/properties.d.ts +0 -1181
- package/dist/types/src/types/property_config.d.ts +0 -74
- package/dist/types/src/types/relations.d.ts +0 -336
- package/dist/types/src/types/slots.d.ts +0 -262
- package/dist/types/src/types/translations.d.ts +0 -900
- package/dist/types/src/types/user_management_delegate.d.ts +0 -86
- package/dist/types/src/types/websockets.d.ts +0 -78
- package/dist/types/src/users/index.d.ts +0 -1
- package/dist/types/src/users/user.d.ts +0 -50
- package/dist/ui/src/components/Alert.d.ts +0 -12
- package/dist/ui/src/components/Autocomplete.d.ts +0 -21
- package/dist/ui/src/components/Avatar.d.ts +0 -11
- package/dist/ui/src/components/Badge.d.ts +0 -8
- package/dist/ui/src/components/BooleanSwitch.d.ts +0 -14
- package/dist/ui/src/components/BooleanSwitchWithLabel.d.ts +0 -17
- package/dist/ui/src/components/Button.d.ts +0 -14
- package/dist/ui/src/components/Card.d.ts +0 -8
- package/dist/ui/src/components/CenteredView.d.ts +0 -9
- package/dist/ui/src/components/Checkbox.d.ts +0 -13
- package/dist/ui/src/components/Chip.d.ts +0 -26
- package/dist/ui/src/components/CircularProgress.d.ts +0 -5
- package/dist/ui/src/components/CircularProgressCenter.d.ts +0 -11
- package/dist/ui/src/components/Collapse.d.ts +0 -9
- package/dist/ui/src/components/ColorPicker.d.ts +0 -30
- package/dist/ui/src/components/Container.d.ts +0 -8
- package/dist/ui/src/components/DateTimeField.d.ts +0 -24
- package/dist/ui/src/components/DebouncedTextField.d.ts +0 -2
- package/dist/ui/src/components/Dialog.d.ts +0 -39
- package/dist/ui/src/components/DialogActions.d.ts +0 -7
- package/dist/ui/src/components/DialogContent.d.ts +0 -7
- package/dist/ui/src/components/DialogTitle.d.ts +0 -10
- package/dist/ui/src/components/ErrorBoundary.d.ts +0 -33
- package/dist/ui/src/components/ExpandablePanel.d.ts +0 -12
- package/dist/ui/src/components/FileUpload.d.ts +0 -23
- package/dist/ui/src/components/FilterChip.d.ts +0 -34
- package/dist/ui/src/components/IconButton.d.ts +0 -12
- package/dist/ui/src/components/InfoLabel.d.ts +0 -5
- package/dist/ui/src/components/InputLabel.d.ts +0 -11
- package/dist/ui/src/components/Label.d.ts +0 -7
- package/dist/ui/src/components/LoadingButton.d.ts +0 -7
- package/dist/ui/src/components/Markdown.d.ts +0 -10
- package/dist/ui/src/components/Menu.d.ts +0 -23
- package/dist/ui/src/components/Menubar.d.ts +0 -80
- package/dist/ui/src/components/MultiSelect.d.ts +0 -48
- package/dist/ui/src/components/Paper.d.ts +0 -6
- package/dist/ui/src/components/Popover.d.ts +0 -24
- package/dist/ui/src/components/RadioGroup.d.ts +0 -28
- package/dist/ui/src/components/ResizablePanels.d.ts +0 -18
- package/dist/ui/src/components/SearchBar.d.ts +0 -26
- package/dist/ui/src/components/Select.d.ts +0 -43
- package/dist/ui/src/components/Separator.d.ts +0 -5
- package/dist/ui/src/components/Sheet.d.ts +0 -22
- package/dist/ui/src/components/Skeleton.d.ts +0 -6
- package/dist/ui/src/components/Slider.d.ts +0 -21
- package/dist/ui/src/components/Table.d.ts +0 -34
- package/dist/ui/src/components/Tabs.d.ts +0 -19
- package/dist/ui/src/components/TextField.d.ts +0 -58
- package/dist/ui/src/components/TextareaAutosize.d.ts +0 -43
- package/dist/ui/src/components/ToggleButtonGroup.d.ts +0 -30
- package/dist/ui/src/components/Tooltip.d.ts +0 -19
- package/dist/ui/src/components/Typography.d.ts +0 -36
- package/dist/ui/src/components/VirtualTable/VirtualTable.d.ts +0 -11
- package/dist/ui/src/components/VirtualTable/VirtualTableCell.d.ts +0 -21
- package/dist/ui/src/components/VirtualTable/VirtualTableHeader.d.ts +0 -29
- package/dist/ui/src/components/VirtualTable/VirtualTableHeaderRow.d.ts +0 -2
- package/dist/ui/src/components/VirtualTable/VirtualTableProps.d.ts +0 -249
- package/dist/ui/src/components/VirtualTable/VirtualTableRow.d.ts +0 -3
- package/dist/ui/src/components/VirtualTable/index.d.ts +0 -3
- package/dist/ui/src/components/VirtualTable/types.d.ts +0 -38
- package/dist/ui/src/components/common/SelectInputLabel.d.ts +0 -5
- package/dist/ui/src/components/index.d.ts +0 -58
- package/dist/ui/src/hooks/PortalContainerContext.d.ts +0 -31
- package/dist/ui/src/hooks/index.d.ts +0 -6
- package/dist/ui/src/hooks/useDebounceCallback.d.ts +0 -1
- package/dist/ui/src/hooks/useDebounceValue.d.ts +0 -1
- package/dist/ui/src/hooks/useDebouncedCallback.d.ts +0 -1
- package/dist/ui/src/hooks/useInjectStyles.d.ts +0 -7
- package/dist/ui/src/hooks/useOutsideAlerter.d.ts +0 -5
- package/dist/ui/src/icons/GitHubIcon.d.ts +0 -2
- package/dist/ui/src/icons/HandleIcon.d.ts +0 -1
- package/dist/ui/src/icons/Icon.d.ts +0 -20
- package/dist/ui/src/icons/cool_icon_keys.d.ts +0 -1
- package/dist/ui/src/icons/icon_keys.d.ts +0 -1
- package/dist/ui/src/icons/index.d.ts +0 -8
- package/dist/ui/src/index.d.ts +0 -5
- package/dist/ui/src/styles.d.ts +0 -12
- package/dist/ui/src/util/chip_colors.d.ts +0 -4
- package/dist/ui/src/util/cls.d.ts +0 -2
- package/dist/ui/src/util/debounce.d.ts +0 -10
- package/dist/ui/src/util/hash.d.ts +0 -1
- package/dist/ui/src/util/index.d.ts +0 -4
- package/dist/ui/src/util/key_to_icon_component.d.ts +0 -1
- package/src/components/SchemaVisualizer/index.ts +0 -5
- package/src/utils/entities.ts +0 -2
- /package/dist/{studio/src/components → components}/ApiExplorer/parseSpec.d.ts +0 -0
- /package/dist/{studio/src/components → components}/ApiExplorer/types.d.ts +0 -0
- /package/dist/{studio/src/components → components}/RLSEditor/index.d.ts +0 -0
- /package/dist/{studio/src/components → components}/RebaseStudio.d.ts +0 -0
- /package/dist/{studio/src/components → components}/SQLEditor/ExplainVisualizer.d.ts +0 -0
- /package/dist/{studio/src/components → components}/SchemaVisualizer/useSchemaGraph.d.ts +0 -0
- /package/dist/{studio/src/index.d.ts → index.d.ts} +0 -0
- /package/dist/{studio/src/utils → utils}/sql_utils.d.ts +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"BranchesView-BiTEwIhd.js","sources":["../src/components/Branches/BranchesView.tsx"],"sourcesContent":["\nimport React, { useState, useEffect, useRef, useCallback } from \"react\";\nimport {\n Alert,\n Button,\n Chip,\n CircularProgress,\n cls,\n CopyIcon,\n defaultBorderMixin,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n GitBranchIcon,\n IconButton,\n iconSize,\n Paper,\n PlusIcon,\n RefreshCwIcon,\n Select,\n SelectItem,\n TextField,\n Trash2Icon,\n Typography\n} from \"@rebasepro/ui\";\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":";;;;;;AA8BA,SAASA,WAAWC,OAAmC;AACnD,MAAIA,UAAUC,UAAaD,UAAU,KAAM,QAAO;AAClD,MAAIA,QAAQ,KAAM,QAAO,GAAGA,KAAK;AACjC,MAAIA,QAAQ,OAAO,KAAM,QAAO,IAAIA,QAAQ,MAAME,QAAQ,CAAC,CAAC;AAC5D,MAAIF,QAAQ,OAAO,OAAO,KAAM,QAAO,IAAIA,SAAS,OAAO,OAAOE,QAAQ,CAAC,CAAC;AAC5E,SAAO,IAAIF,SAAS,OAAO,OAAO,OAAOE,QAAQ,CAAC,CAAC;AACvD;AAEA,SAASC,eAAeC,MAAyC;AAC7D,MAAI,CAACA,KAAM,QAAO;AAClB,QAAMC,IAAID,gBAAgBE,OAAOF,OAAO,IAAIE,KAAKF,IAAI;AACrD,MAAIG,MAAMF,EAAEG,QAAAA,CAAS,EAAG,QAAO;AAC/B,QAAMC,MAAMH,KAAKG,IAAAA;AACjB,QAAMC,OAAOD,MAAMJ,EAAEG,QAAAA;AACrB,MAAIE,OAAO,IAAQ,QAAO;AAC1B,MAAIA,OAAO,MAAW;AAAE,UAAMC,IAAIC,KAAKC,MAAMH,OAAO,GAAM;AAAG,WAAO,GAAGC,CAAC;AAAA,EAAS;AACjF,MAAID,OAAO,OAAY;AAAE,UAAMI,IAAIF,KAAKC,MAAMH,OAAO,IAAS;AAAG,WAAO,GAAGI,CAAC;AAAA,EAAS;AACrF,MAAIJ,OAAO,QAAa;AAAE,UAAMK,KAAKH,KAAKC,MAAMH,OAAO,KAAU;AAAG,WAAO,GAAGK,EAAE;AAAA,EAAS;AACzF,SAAOV,EAAEW,mBAAAA;AACb;AAEO,SAASC,eAAe;AAC3B,QAAM;AAAA,IAAEC;AAAAA,EAAAA,IAAkBC,iBAAAA;AAC1B,QAAMC,WAAWC,sBAAAA;AAEjB,QAAM,CAACC,UAAUC,WAAW,IAAIC,SAAuB,CAAA,CAAE;AACzD,QAAM,CAACC,SAASC,UAAU,IAAIF,SAAS,IAAI;AAC3C,QAAM,CAACG,gBAAgBC,iBAAiB,IAAIJ,SAAwB,IAAI;AAGxE,QAAM,CAACK,YAAYC,aAAa,IAAIN,SAAS,KAAK;AAClD,QAAM,CAACO,eAAeC,gBAAgB,IAAIR,SAAS,EAAE;AACrD,QAAM,CAACS,cAAcC,eAAe,IAAIV,SAA6BvB,MAAS;AAC9E,QAAM,CAACkC,UAAUC,WAAW,IAAIZ,SAAS,KAAK;AAG9C,QAAM,CAACa,cAAcC,eAAe,IAAId,SAAwB,IAAI;AACpE,QAAM,CAACe,UAAUC,WAAW,IAAIhB,SAAS,KAAK;AAG9C,QAAMiB,cAAcC,OAAOtB,QAAQ;AACnCqB,cAAYE,UAAUvB;AAEtB,QAAMwB,cAAcC,cAAc3B,aAAa,IAAIA,gBAAgBjB;AAEnE,QAAM6C,eAAeC,YAAY,YAAY;AACzC,QAAI,CAACH,aAAa;AACdlB,iBAAW,KAAK;AAChB;AAAA,IACJ;AACA,QAAI;AACA,YAAMsB,SAAS,MAAMJ,YAAYK,aAAAA;AACjC1B,kBAAYyB,MAAM;AAAA,IACtB,SAASE,GAAY;AACjBT,kBAAYE,QAAQQ,KAAK;AAAA,QACrBC,MAAM;AAAA,QACNC,SAASH,aAAaI,QAAQJ,EAAEG,UAAUE,OAAOL,CAAC;AAAA,MAAA,CACrD;AAAA,IACL,UAAA;AACIxB,iBAAW,KAAK;AAAA,IACpB;AAAA,EACJ,GAAG,CAACkB,WAAW,CAAC;AAEhBY,YAAU,MAAM;AACZV,iBAAAA;AAAAA,EACJ,GAAG,CAACA,YAAY,CAAC;AAEjB,QAAMW,eAAe,YAAY;AAC7B,QAAI,CAACb,eAAe,CAACb,cAAc2B,OAAQ;AAC3CtB,gBAAY,IAAI;AAChB,QAAI;AACA,YAAMQ,YAAYe,aAAa5B,cAAc2B,KAAAA,GAAQzB,eAAe;AAAA,QAAE2B,QAAQ3B;AAAAA,MAAAA,IAAiBhC,MAAS;AACxGwC,kBAAYE,QAAQQ,KAAK;AAAA,QACrBC,MAAM;AAAA,QACNC,SAAS,WAAWtB,cAAc2B,KAAAA,CAAM;AAAA,MAAA,CAC3C;AACD5B,oBAAc,KAAK;AACnBE,uBAAiB,EAAE;AACnBE,sBAAgBjC,MAAS;AACzB,YAAM6C,aAAAA;AAAAA,IACV,SAASI,KAAY;AACjBT,kBAAYE,QAAQQ,KAAK;AAAA,QACrBC,MAAM;AAAA,QACNC,SAASH,eAAaI,QAAQJ,IAAEG,UAAUE,OAAOL,GAAC;AAAA,MAAA,CACrD;AAAA,IACL,UAAA;AACId,kBAAY,KAAK;AAAA,IACrB;AAAA,EACJ;AAEA,QAAMyB,eAAe,YAAY;AAC7B,QAAI,CAACjB,eAAe,CAACP,aAAc;AACnCG,gBAAY,IAAI;AAChB,QAAI;AACA,YAAMI,YAAYkB,aAAazB,YAAY;AAC3CI,kBAAYE,QAAQQ,KAAK;AAAA,QACrBC,MAAM;AAAA,QACNC,SAAS,WAAWhB,YAAY;AAAA,MAAA,CACnC;AACD,UAAIV,mBAAmBU,aAAcT,mBAAkB,IAAI;AAC3DU,sBAAgB,IAAI;AACpB,YAAMQ,aAAAA;AAAAA,IACV,SAASI,KAAY;AACjBT,kBAAYE,QAAQQ,KAAK;AAAA,QACrBC,MAAM;AAAA,QACNC,SAASH,eAAaI,QAAQJ,IAAEG,UAAUE,OAAOL,GAAC;AAAA,MAAA,CACrD;AAAA,IACL,UAAA;AACIV,kBAAY,KAAK;AAAA,IACrB;AAAA,EACJ;AAGA,MAAI,CAACI,aAAa;AACd,WACI,qBAAC,OAAA,EAAI,WAAU,0EACX,UAAA;AAAA,MAAA,oBAAC,eAAA,EAAc,MAAMmB,SAASC,OAAO,WAAU,0CAAwC;AAAA,0BACtF,YAAA,EAAW,SAAQ,MAAK,OAAM,aAAY,UAAA,oCAAgC;AAAA,2BAC1E,YAAA,EAAW,SAAQ,SAAQ,OAAM,YAAW,WAAU,YAAU,UAAA;AAAA,QAAA;AAAA,QAEzD,oBAAC,QAAA,EAAK,WAAU,8EAA6E,UAAA,yBAAqB;AAAA,QAAO;AAAA,MAAA,EAAA,CACjI;AAAA,IAAA,GACJ;AAAA,EAER;AAEA,MAAIvC,SAAS;AACT,+BACK,OAAA,EAAI,WAAU,2CACX,UAAA,oBAAC,oBAAgB,GACrB;AAAA,EAER;AAEA,QAAMwC,WAAW3C,SAAS4C,KAAKC,CAAAA,MAAKA,EAAEC,SAASzC,cAAc;AAE7D,SACI,qBAAC,OAAA,EAAI,WAAU,mEAEX,UAAA;AAAA,IAAA,qBAAC,OAAA,EAAI,WAAW0C,IAAI,yDAAyDC,kBAAkB,GAC3F,UAAA;AAAA,MAAA,qBAAC,OAAA,EAAI,WAAWD,IAAI,yGAAyGC,kBAAkB,GAC3I,UAAA;AAAA,QAAA,qBAAC,OAAA,EAAI,WAAU,2BACX,UAAA;AAAA,UAAA,oBAAC,eAAA,EAAc,MAAMP,SAASQ,OAAO,WAAU,gBAAc;AAAA,8BAC5D,YAAA,EAAW,SAAQ,aAAY,WAAU,iBAAgB,UAAA,YAAQ;AAAA,8BACjE,MAAA,EAAK,MAAK,YAAW,WAAU,6EAA6EjD,mBAASkD,OAAAA,CAAO;AAAA,QAAA,GACjI;AAAA,QACA,qBAAC,OAAA,EAAI,WAAU,2BACX,UAAA;AAAA,UAAA,oBAAC,YAAA,EAAW,MAAK,SAAQ,SAAS1B,cAAc,OAAM,WAClD,UAAA,oBAAC,eAAA,EAAc,MAAMiB,SAASU,SAAAA,CAAS,GAC3C;AAAA,8BACC,YAAA,EAAW,MAAK,SAAQ,SAAS,MAAM3C,cAAc,IAAI,GAAG,OAAM,iBAAgB,WAAU,gBACzF,UAAA,oBAAC,YAAS,MAAMiC,SAASU,UAAS,EAAA,CACtC;AAAA,QAAA,EAAA,CACJ;AAAA,MAAA,GACJ;AAAA,MACA,oBAAC,OAAA,EAAI,WAAU,wCACVnD,UAAAA,SAASkD,WAAW,IACjB,qBAAC,OAAA,EAAI,WAAU,2EACX,UAAA;AAAA,QAAA,oBAAC,UAAA,EAAS,MAAMT,SAASQ,OAAO,WAAU,0CAAwC;AAAA,QAClF,oBAAC,cAAW,SAAQ,SAAQ,OAAM,YAAW,WAAU,eAAa,UAAA,+EAAA,CAEpE;AAAA,4BACC,QAAA,EACG,MAAK,SACL,SAAQ,YACR,SAAS,MAAMzC,cAAc,IAAI,GACjC,WAAW,oBAAC,UAAA,EAAS,MAAMiC,SAASU,SAAAA,IAAY,UAAA,gBAAA,CAGpD;AAAA,MAAA,GACJ,IAEAnD,SAASoD,IAAIC,CAAAA,gCACR,OAAA,EAEG,SAAS,MAAM/C,kBAAkB+C,OAAOP,IAAI,GAC5C,WAAWC,IACP,gFACA1C,mBAAmBgD,OAAOP,OACpB,4DACA,gDACV,GAEA,UAAA;AAAA,QAAA,oBAAC,OAAA,EAAI,WAAU,+CAAA,CAA8C;AAAA,QAC7D,qBAAC,OAAA,EAAI,WAAU,kBACX,UAAA;AAAA,UAAA,oBAAC,cAAW,SAAQ,SAAQ,WAAU,oCAAoCO,iBAAOP,MAAK;AAAA,+BACrF,YAAA,EAAW,SAAQ,WAAU,OAAM,aAAY,WAAU,wBAAsB,UAAA;AAAA,YAAA;AAAA,YACtEO,OAAOC;AAAAA,YAAe;AAAA,YAAIzE,eAAewE,OAAOE,SAAS;AAAA,UAAA,EAAA,CACnE;AAAA,QAAA,GACJ;AAAA,QACCF,OAAOG,cAAc7E,UAClB,oBAAC,cAAW,SAAQ,WAAU,OAAM,YAAW,WAAU,kCACpDF,UAAAA,WAAW4E,OAAOG,SAAS,EAAA,CAChC;AAAA,MAAA,KAnBCH,OAAOP,IAqBhB,CACH,EAAA,CAET;AAAA,IAAA,GACJ;AAAA,IAGA,oBAAC,SAAI,WAAU,uDACV,WAACH,WACE,qBAAC,OAAA,EAAI,WAAU,0DACX,UAAA;AAAA,MAAA,oBAAC,eAAA,EAAc,MAAMF,SAASC,OAAO,WAAU,0CAAwC;AAAA,MACvF,oBAAC,YAAA,EAAW,SAAQ,SAAQ,OAAM,YAC7B1C,UAAAA,SAASkD,WAAW,IAAI,mCAAmC,kCAAA,CAChE;AAAA,IAAA,EAAA,CACJ,IAEA,qBAAA,UAAA,EAEI,UAAA;AAAA,MAAA,qBAAC,OAAA,EAAI,WAAWH,IAAI,kGAAkGC,kBAAkB,GACpI,UAAA;AAAA,QAAA,qBAAC,OAAA,EAAI,WAAU,mCACX,UAAA;AAAA,UAAA,oBAAC,OAAA,EAAI,WAAU,0CAAA,CAAyC;AAAA,UACxD,qBAAC,OAAA,EAAI,WAAU,WACX,UAAA;AAAA,YAAA,oBAAC,cAAW,SAAQ,aAAY,WAAU,0BAA0BL,mBAASG,MAAK;AAAA,iCACjF,YAAA,EAAW,SAAQ,WAAU,OAAM,aAAY,WAAU,YAAU,UAAA;AAAA,cAAA;AAAA,cACnD,oBAAC,QAAA,EAAK,WAAU,yBAAyBH,mBAASW,eAAAA,CAAe;AAAA,YAAA,EAAA,CAClF;AAAA,UAAA,EAAA,CACJ;AAAA,QAAA,GACJ;AAAA,QACA,oBAAC,OAAA,EAAI,WAAU,oCACX,UAAA,oBAAC,QAAA,EACG,MAAK,SACL,OAAM,SACN,SAAQ,YACR,SAAS,MAAMtC,gBAAgB2B,SAASG,IAAI,GAC5C,WAAW,oBAAC,YAAA,EAAW,MAAML,SAASU,SAAAA,IAAY,UAAA,SAAA,CAGtD,EAAA,CACJ;AAAA,MAAA,GACJ;AAAA,0BAGC,OAAA,EAAI,WAAU,kDACX,UAAA,qBAAC,OAAA,EAAI,WAAU,yCACX,UAAA;AAAA,QAAA,oBAAC,YAAS,OAAM,eAAc,OAAOR,SAASG,MAAM,MAAI,MAAA;AAAA,QACxD,oBAAC,YAAS,OAAM,mBAAkB,OAAOH,SAASW,gBAAgB,MAAI,MAAA;AAAA,QACtE,oBAAC,YAAS,OAAM,WAAU,OAAOzE,eAAe8D,SAASY,SAAS,GAAE;AAAA,QACpE,oBAAC,YAAS,OAAM,QAAO,OAAO9E,WAAWkE,SAASa,SAAS,EAAA,CAAE;AAAA,MAAA,EAAA,CACjE,EAAA,CACJ;AAAA,MAGA,qBAAC,OAAA,EAAI,WAAU,oCACX,UAAA;AAAA,QAAA,oBAAC,OAAA,EAAM,OAAM,QACT,UAAA,qBAAC,cAAW,SAAQ,SAAQ,WAAU,eAClC,UAAA;AAAA,UAAA,oBAAC,YAAO,UAAA,0BAAA,CAAuB;AAAA,UAAS;AAAA,UACxC,oBAAC,QAAA,EAAK,WAAU,uFAAuFb,mBAASG,MAAK;AAAA,UAAM;AAAA,QAAA,EAAA,CAE/H,EAAA,CACJ;AAAA,QACA,qBAAC,OAAA,EAAI,WAAU,2GACX,UAAA;AAAA,UAAA,oBAAC,YAAA,EAAW,SAAQ,WAAU,WAAU,gFAA+E,UAAA,sBAAkB;AAAA,UACzI,qBAAC,OAAA,EAAI,WAAU,aACX,UAAA;AAAA,YAAA,qBAAC,OAAA,EAAI,WAAU,2BACX,UAAA;AAAA,cAAA,oBAAC,cAAW,SAAQ,WAAU,OAAM,aAAY,WAAU,6BAA4B,UAAA,YAAA,CAAS;AAAA,kCAC9F,YAAA,EAAW,SAAQ,SAAQ,WAAU,yBAAyBH,mBAASG,KAAAA,CAAK;AAAA,YAAA,GACjF;AAAA,YACA,qBAAC,OAAA,EAAI,WAAU,2BACX,UAAA;AAAA,cAAA,oBAAC,cAAW,SAAQ,WAAU,OAAM,aAAY,WAAU,6BAA4B,UAAA,iBAAA,CAAc;AAAA,kCACnG,YAAA,EAAW,SAAQ,SAAQ,WAAU,yBAAyBH,mBAASW,eAAAA,CAAe;AAAA,YAAA,GAC3F;AAAA,YACA,qBAAC,OAAA,EAAI,WAAU,2BACX,UAAA;AAAA,cAAA,oBAAC,cAAW,SAAQ,WAAU,OAAM,aAAY,WAAU,6BAA4B,UAAA,cAAA,CAAW;AAAA,kCAChG,YAAA,EAAW,SAAQ,SAAQ,WAAU,yBACjCX,mBAASY,qBAAqBvE,OACzB2D,SAASY,UAAUE,mBACnB,IAAIzE,KAAK2D,SAASY,SAAS,EAAEE,iBAAe,CACtD;AAAA,YAAA,EAAA,CACJ;AAAA,UAAA,EAAA,CACJ;AAAA,QAAA,EAAA,CACJ;AAAA,MAAA,EAAA,CACJ;AAAA,IAAA,EAAA,CACJ,EAAA,CAER;AAAA,IAGA,qBAAC,QAAA,EAAO,MAAMlD,YAAY,cAAcC,eACpC,UAAA;AAAA,MAAA,oBAAC,eAAY,UAAA,oBAAA,CAAiB;AAAA,MAC9B,qBAAC,eAAA,EAAc,WAAU,2BACrB,UAAA;AAAA,QAAA,oBAAC,cAAW,SAAQ,SAAQ,OAAM,aAAY,WAAU,eAAa,UAAA,kHAAA,CAErE;AAAA,QACA,oBAAC,SACG,UAAA,oBAAC,WAAA,EACG,OAAM,eACN,OAAOC,eACP,UAAWmB,CAAAA,QAAMlB,iBAAiBkB,IAAE8B,OAAOC,KAAK,GAChD,aAAY,6CACZ,MAAK,SACL,WAAS,KAAA,CAAA,EAAA,CAEjB;AAAA,QACC3D,SAASkD,SAAS,KACf,oBAAC,OAAA,EACG,+BAAC,QAAA,EACG,OAAM,mBACN,OAAOvC,gBAAgB,IACvB,eAAgBiD,CAAAA,MAAMhD,gBAAgBgD,KAAKjF,MAAS,GACpD,aAAY,2BACZ,MAAK,SACL,aAAciF,CAAAA,QAAMA,OAAK,2BAEzB,UAAA;AAAA,UAAA,oBAAC,YAAA,EAAW,OAAM,IAAG,UAAA,2BAAuB;AAAA,UAC3C5D,SAASoD,IAAIP,CAAAA,QACV,oBAAC,YAAA,EAAwB,OAAOA,IAAEC,MAAOD,UAAAA,IAAEC,KAAAA,GAA1BD,IAAEC,IAA6B,CACnD;AAAA,QAAA,EAAA,CACL,EAAA,CACJ;AAAA,MAAA,GAER;AAAA,2BACC,eAAA,EACG,UAAA;AAAA,QAAA,oBAAC,QAAA,EAAO,SAAQ,QAAO,SAAS,MAAMtC,cAAc,KAAK,GAAG,UAAUK,UAAS,UAAA,SAAA,CAE/E;AAAA,QACA,oBAAC,QAAA,EACG,OAAM,WACN,SAASsB,cACT,UAAU,CAAC1B,cAAc2B,KAAAA,KAAUvB,UACnC,WAAWA,WAAW,oBAAC,kBAAA,EAAiB,MAAK,WAAA,CAAU,IAAK,oBAAC,UAAA,EAAS,MAAM4B,SAASU,SAAAA,CAAS,GAE7FtC,UAAAA,WAAW,gBAAgB,gBAAA,CAChC;AAAA,MAAA,EAAA,CACJ;AAAA,IAAA,GACJ;AAAA,wBAGC,oBAAA,EACG,MAAM,CAAC,CAACE,cACR,UAAUwB,cACV,UAAU,MAAMvB,gBAAgB,IAAI,GACpC,OAAM,iBACN,MACI,qBAAC,YAAA,EAAW,SAAQ,SAAO,UAAA;AAAA,MAAA;AAAA,MACgC,oBAAC,YAAQD,UAAAA,aAAAA,CAAa;AAAA,MAAS;AAAA,IAAA,GAE1F,GAEJ,SAASE,SAAAA,CAAS;AAAA,EAAA,GAE1B;AAER;AAEA,SAAA4C,SAAAC,IAAA;AAAA,QAAAC,IAAAC,EAAA,EAAA;AAAkB,QAAA;AAAA,IAAAC;AAAAA,IAAAN;AAAAA,IAAAO;AAAAA,EAAAA,IAAAJ;AAEjB,MAAAK;AAAA,MAAAJ,EAAA,CAAA,MAAAK,uBAAAC,IAAA,2BAAA,GAAA;AAEuBF,SAAApB,IAAI,4DAA0DC,kBAAoB;AAACe,WAAAI;AAAAA,EAAA,OAAA;AAAAA,SAAAJ,EAAA,CAAA;AAAA,EAAA;AAAA,MAAAO;AAAA,MAAAP,SAAAE,OAAA;AAC/FK,6BAAC,cAAmB,SAAA,WAAgB,OAAA,aAAsB,WAAA,qEAA0D;AAAaP,WAAAE;AAAAF,WAAAO;AAAAA,EAAA,OAAA;AAAAA,SAAAP,EAAA,CAAA;AAAA,EAAA;AAG7H,QAAAQ,KAAAL,QAAQ;AAAW,MAAAM;AAAA,MAAAT,SAAAQ,IAAA;AAFgBC,SAAAzB,IACnC,6CACAwB,EACJ;AAACR,WAAAQ;AAAAR,WAAAS;AAAAA,EAAA,OAAA;AAAAA,SAAAT,EAAA,CAAA;AAAA,EAAA;AAAA,MAAAU;AAAA,MAAAV,EAAA,CAAA,MAAAS,MAAAT,SAAAJ,OAAA;AAHDc,6BAAC,YAAA,EAAmB,SAAA,SAAmB,WAAAD,qBAG7B;AAAaT,WAAAS;AAAAT,WAAAJ;AAAAI,WAAAU;AAAAA,EAAA,OAAA;AAAAA,SAAAV,EAAA,CAAA;AAAA,EAAA;AAAA,MAAAW;AAAA,MAAAX,EAAA,CAAA,MAAAO,MAAAP,SAAAU,IAAA;AAL3BC,SAAA,qBAAA,OAAA,EAAgB,WAAAP,IACZG,UAAAA;AAAAA,MAAAA;AAAAA,MACAG;AAAAA,IAAAA,GAIJ;AAAMV,WAAAO;AAAAP,WAAAU;AAAAV,YAAAW;AAAAA,EAAA,OAAA;AAAAA,SAAAX,EAAA,EAAA;AAAA,EAAA;AAAA,SANNW;AAMM;"}
|
|
@@ -1,472 +0,0 @@
|
|
|
1
|
-
import { jsx, jsxs, Fragment } from "react/jsx-runtime";
|
|
2
|
-
import { c } from "react-compiler-runtime";
|
|
3
|
-
import { useState, useRef, useEffect } from "react";
|
|
4
|
-
import { CircularProgress, CalendarIcon, iconSize, Typography, Chip, IconButton, RefreshCwIcon, cls, defaultBorderMixin, PauseIcon, PlayIcon, Button, AlertCircleIcon, HistoryIcon, CheckCircleIcon } from "@rebasepro/ui";
|
|
5
|
-
import { useRebaseClient, useSnackbarController } from "@rebasepro/core";
|
|
6
|
-
function formatDuration(ms) {
|
|
7
|
-
if (ms < 1e3) return `${ms}ms`;
|
|
8
|
-
if (ms < 6e4) return `${(ms / 1e3).toFixed(1)}s`;
|
|
9
|
-
return `${(ms / 6e4).toFixed(1)}m`;
|
|
10
|
-
}
|
|
11
|
-
function formatRelative(iso) {
|
|
12
|
-
if (!iso) return "—";
|
|
13
|
-
const d = new Date(iso);
|
|
14
|
-
const now = Date.now();
|
|
15
|
-
const diff = d.getTime() - now;
|
|
16
|
-
const abs = Math.abs(diff);
|
|
17
|
-
if (abs < 6e4) return diff > 0 ? "in <1m" : "<1m ago";
|
|
18
|
-
if (abs < 36e5) {
|
|
19
|
-
const m = Math.round(abs / 6e4);
|
|
20
|
-
return diff > 0 ? `in ${m}m` : `${m}m ago`;
|
|
21
|
-
}
|
|
22
|
-
if (abs < 864e5) {
|
|
23
|
-
const h = Math.round(abs / 36e5);
|
|
24
|
-
return diff > 0 ? `in ${h}h` : `${h}h ago`;
|
|
25
|
-
}
|
|
26
|
-
return d.toLocaleString();
|
|
27
|
-
}
|
|
28
|
-
const stateColors = {
|
|
29
|
-
idle: "bg-emerald-500",
|
|
30
|
-
running: "bg-blue-500",
|
|
31
|
-
success: "bg-emerald-500",
|
|
32
|
-
error: "bg-red-500",
|
|
33
|
-
disabled: "bg-surface-400"
|
|
34
|
-
};
|
|
35
|
-
function CronJobsView() {
|
|
36
|
-
const client = useRebaseClient();
|
|
37
|
-
const snackbar = useSnackbarController();
|
|
38
|
-
const [jobs, setJobs] = useState([]);
|
|
39
|
-
const [loading, setLoading] = useState(true);
|
|
40
|
-
const [selectedId, setSelectedId] = useState(null);
|
|
41
|
-
const [logs, setLogs] = useState([]);
|
|
42
|
-
const [logsLoading, setLogsLoading] = useState(false);
|
|
43
|
-
const [triggering, setTriggering] = useState(null);
|
|
44
|
-
const clientRef = useRef(client);
|
|
45
|
-
clientRef.current = client;
|
|
46
|
-
const snackbarRef = useRef(snackbar);
|
|
47
|
-
snackbarRef.current = snackbar;
|
|
48
|
-
useEffect(() => {
|
|
49
|
-
let cancelled = false;
|
|
50
|
-
async function load() {
|
|
51
|
-
const c2 = clientRef.current;
|
|
52
|
-
if (!c2?.cron) {
|
|
53
|
-
setLoading(false);
|
|
54
|
-
return;
|
|
55
|
-
}
|
|
56
|
-
try {
|
|
57
|
-
const res = await c2.cron.listJobs();
|
|
58
|
-
if (!cancelled) setJobs(res.jobs);
|
|
59
|
-
} catch (e) {
|
|
60
|
-
if (!cancelled) {
|
|
61
|
-
snackbarRef.current.open({
|
|
62
|
-
type: "error",
|
|
63
|
-
message: e instanceof Error ? e.message : String(e)
|
|
64
|
-
});
|
|
65
|
-
}
|
|
66
|
-
} finally {
|
|
67
|
-
if (!cancelled) setLoading(false);
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
load();
|
|
71
|
-
let timeoutId = null;
|
|
72
|
-
const scheduleNext = () => {
|
|
73
|
-
if (cancelled) return;
|
|
74
|
-
timeoutId = setTimeout(async () => {
|
|
75
|
-
if (document.visibilityState === "visible") {
|
|
76
|
-
await load();
|
|
77
|
-
}
|
|
78
|
-
scheduleNext();
|
|
79
|
-
}, 15e3);
|
|
80
|
-
};
|
|
81
|
-
scheduleNext();
|
|
82
|
-
const handleVisibility = () => {
|
|
83
|
-
if (document.visibilityState === "visible") {
|
|
84
|
-
load();
|
|
85
|
-
}
|
|
86
|
-
};
|
|
87
|
-
document.addEventListener("visibilitychange", handleVisibility);
|
|
88
|
-
return () => {
|
|
89
|
-
cancelled = true;
|
|
90
|
-
if (timeoutId) clearTimeout(timeoutId);
|
|
91
|
-
document.removeEventListener("visibilitychange", handleVisibility);
|
|
92
|
-
};
|
|
93
|
-
}, []);
|
|
94
|
-
useEffect(() => {
|
|
95
|
-
if (!selectedId) {
|
|
96
|
-
setLogs([]);
|
|
97
|
-
return;
|
|
98
|
-
}
|
|
99
|
-
let cancelled_0 = false;
|
|
100
|
-
const c_0 = clientRef.current;
|
|
101
|
-
if (!c_0?.cron) return;
|
|
102
|
-
setLogsLoading(true);
|
|
103
|
-
c_0.cron.getJobLogs(selectedId, {
|
|
104
|
-
limit: 25
|
|
105
|
-
}).then((res_0) => {
|
|
106
|
-
if (!cancelled_0) setLogs(res_0.logs);
|
|
107
|
-
}).catch(() => {
|
|
108
|
-
if (!cancelled_0) setLogs([]);
|
|
109
|
-
}).finally(() => {
|
|
110
|
-
if (!cancelled_0) setLogsLoading(false);
|
|
111
|
-
});
|
|
112
|
-
return () => {
|
|
113
|
-
cancelled_0 = true;
|
|
114
|
-
};
|
|
115
|
-
}, [selectedId]);
|
|
116
|
-
async function refreshJobs() {
|
|
117
|
-
const c_1 = clientRef.current;
|
|
118
|
-
if (!c_1?.cron) return;
|
|
119
|
-
try {
|
|
120
|
-
const res_1 = await c_1.cron.listJobs();
|
|
121
|
-
setJobs(res_1.jobs);
|
|
122
|
-
} catch {
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
async function refreshLogs(id) {
|
|
126
|
-
const c_2 = clientRef.current;
|
|
127
|
-
if (!c_2?.cron) return;
|
|
128
|
-
setLogsLoading(true);
|
|
129
|
-
try {
|
|
130
|
-
const res_2 = await c_2.cron.getJobLogs(id, {
|
|
131
|
-
limit: 25
|
|
132
|
-
});
|
|
133
|
-
setLogs(res_2.logs);
|
|
134
|
-
} catch {
|
|
135
|
-
setLogs([]);
|
|
136
|
-
} finally {
|
|
137
|
-
setLogsLoading(false);
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
const handleTrigger = async (id_0) => {
|
|
141
|
-
const c_3 = clientRef.current;
|
|
142
|
-
if (!c_3?.cron) return;
|
|
143
|
-
setTriggering(id_0);
|
|
144
|
-
try {
|
|
145
|
-
await c_3.cron.triggerJob(id_0);
|
|
146
|
-
snackbarRef.current.open({
|
|
147
|
-
type: "success",
|
|
148
|
-
message: "Job triggered"
|
|
149
|
-
});
|
|
150
|
-
await refreshJobs();
|
|
151
|
-
if (selectedId === id_0) refreshLogs(id_0);
|
|
152
|
-
} catch (e_0) {
|
|
153
|
-
snackbarRef.current.open({
|
|
154
|
-
type: "error",
|
|
155
|
-
message: e_0 instanceof Error ? e_0.message : String(e_0)
|
|
156
|
-
});
|
|
157
|
-
} finally {
|
|
158
|
-
setTriggering(null);
|
|
159
|
-
}
|
|
160
|
-
};
|
|
161
|
-
const handleToggle = async (id_1, enabled) => {
|
|
162
|
-
const c_4 = clientRef.current;
|
|
163
|
-
if (!c_4?.cron) return;
|
|
164
|
-
try {
|
|
165
|
-
await c_4.cron.toggleJob(id_1, enabled);
|
|
166
|
-
snackbarRef.current.open({
|
|
167
|
-
type: "success",
|
|
168
|
-
message: enabled ? "Job enabled" : "Job paused"
|
|
169
|
-
});
|
|
170
|
-
await refreshJobs();
|
|
171
|
-
} catch (e_1) {
|
|
172
|
-
snackbarRef.current.open({
|
|
173
|
-
type: "error",
|
|
174
|
-
message: e_1 instanceof Error ? e_1.message : String(e_1)
|
|
175
|
-
});
|
|
176
|
-
}
|
|
177
|
-
};
|
|
178
|
-
const selectedJob = jobs.find((j) => j.id === selectedId);
|
|
179
|
-
if (loading) return /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center h-full", children: /* @__PURE__ */ jsx(CircularProgress, {}) });
|
|
180
|
-
if (jobs.length === 0) return /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center justify-center h-full gap-4 text-center p-8", children: [
|
|
181
|
-
/* @__PURE__ */ jsx(CalendarIcon, { size: iconSize.medium, className: "text-surface-300 dark:text-surface-600" }),
|
|
182
|
-
/* @__PURE__ */ jsx(Typography, { variant: "h6", color: "secondary", children: "No Cron Jobs Registered" }),
|
|
183
|
-
/* @__PURE__ */ jsxs(Typography, { variant: "body2", color: "disabled", className: "max-w-md", children: [
|
|
184
|
-
"Create a file in your ",
|
|
185
|
-
/* @__PURE__ */ jsx("code", { className: "text-xs bg-surface-100 dark:bg-surface-950 px-1.5 py-0.5 rounded font-mono", children: "crons/" }),
|
|
186
|
-
" directory that default-exports a ",
|
|
187
|
-
/* @__PURE__ */ jsx("code", { className: "text-xs bg-surface-100 dark:bg-surface-950 px-1.5 py-0.5 rounded font-mono", children: "CronJobDefinition" }),
|
|
188
|
-
"."
|
|
189
|
-
] })
|
|
190
|
-
] });
|
|
191
|
-
return /* @__PURE__ */ jsxs("div", { className: "flex h-full w-full overflow-hidden bg-white dark:bg-surface-950", children: [
|
|
192
|
-
/* @__PURE__ */ jsxs("div", { className: cls("flex flex-col w-[340px] min-w-[280px] border-r h-full", defaultBorderMixin), children: [
|
|
193
|
-
/* @__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: [
|
|
194
|
-
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
195
|
-
/* @__PURE__ */ jsx(CalendarIcon, { size: iconSize.smallest, className: "text-primary" }),
|
|
196
|
-
/* @__PURE__ */ jsx(Typography, { variant: "subtitle2", className: "font-semibold", children: "Cron Jobs" }),
|
|
197
|
-
/* @__PURE__ */ jsx(Chip, { size: "smallest", className: "bg-surface-200 dark:bg-surface-700 text-surface-600 dark:text-surface-300", children: jobs.length })
|
|
198
|
-
] }),
|
|
199
|
-
/* @__PURE__ */ jsx(IconButton, { size: "small", onClick: refreshJobs, title: "Refresh", children: /* @__PURE__ */ jsx(RefreshCwIcon, { size: iconSize.smallest }) })
|
|
200
|
-
] }),
|
|
201
|
-
/* @__PURE__ */ jsx("div", { className: "flex-1 overflow-y-auto p-2 space-y-1", children: jobs.map((job) => /* @__PURE__ */ jsxs("div", { onClick: () => setSelectedId(job.id), className: cls("flex items-center gap-3 px-3 py-2.5 rounded-lg cursor-pointer transition-all", selectedId === job.id ? "bg-primary/10 dark:bg-primary/15 ring-1 ring-primary/30" : "hover:bg-surface-100 dark:hover:bg-surface-950"), children: [
|
|
202
|
-
/* @__PURE__ */ jsx("div", { className: cls("w-2 h-2 rounded-full shrink-0", stateColors[job.state] || "bg-surface-400") }),
|
|
203
|
-
/* @__PURE__ */ jsxs("div", { className: "flex-1 min-w-0", children: [
|
|
204
|
-
/* @__PURE__ */ jsx(Typography, { variant: "body2", className: "truncate font-medium text-[13px]", children: job.name }),
|
|
205
|
-
/* @__PURE__ */ jsx(Typography, { variant: "caption", color: "secondary", className: "truncate text-[11px] font-mono", children: job.schedule })
|
|
206
|
-
] }),
|
|
207
|
-
job.state === "running" && /* @__PURE__ */ jsx(CircularProgress, { size: "smallest" })
|
|
208
|
-
] }, job.id)) })
|
|
209
|
-
] }),
|
|
210
|
-
/* @__PURE__ */ jsx("div", { className: "flex-1 flex flex-col min-w-0 h-full overflow-hidden", children: !selectedJob ? /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center h-full", children: /* @__PURE__ */ jsx(Typography, { variant: "body2", color: "disabled", children: "Select a cron job to view details" }) }) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
211
|
-
/* @__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: [
|
|
212
|
-
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 min-w-0", children: [
|
|
213
|
-
/* @__PURE__ */ jsx("div", { className: cls("w-2.5 h-2.5 rounded-full", stateColors[selectedJob.state]) }),
|
|
214
|
-
/* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
|
|
215
|
-
/* @__PURE__ */ jsx(Typography, { variant: "subtitle1", className: "font-semibold truncate", children: selectedJob.name }),
|
|
216
|
-
selectedJob.description && /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "secondary", className: "truncate", children: selectedJob.description })
|
|
217
|
-
] })
|
|
218
|
-
] }),
|
|
219
|
-
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 shrink-0", children: [
|
|
220
|
-
/* @__PURE__ */ jsx(IconButton, { title: selectedJob.enabled ? "Pause job" : "Enable job", size: "small", onClick: () => handleToggle(selectedJob.id, !selectedJob.enabled), children: selectedJob.enabled ? /* @__PURE__ */ jsx(PauseIcon, { size: iconSize.small }) : /* @__PURE__ */ jsx(PlayIcon, { size: iconSize.smallest }) }),
|
|
221
|
-
/* @__PURE__ */ jsx(Button, { size: "small", color: "primary", onClick: () => handleTrigger(selectedJob.id), disabled: triggering === selectedJob.id, startIcon: triggering === selectedJob.id ? /* @__PURE__ */ jsx(CircularProgress, { size: "smallest" }) : /* @__PURE__ */ jsx(PlayIcon, { size: iconSize.smallest }), children: "Run Now" })
|
|
222
|
-
] })
|
|
223
|
-
] }),
|
|
224
|
-
/* @__PURE__ */ jsxs("div", { className: "px-5 py-4 bg-surface-50 dark:bg-surface-900/50", children: [
|
|
225
|
-
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 md:grid-cols-4 gap-3", children: [
|
|
226
|
-
/* @__PURE__ */ jsx(StatCard, { label: "Schedule", value: selectedJob.schedule, mono: true }),
|
|
227
|
-
/* @__PURE__ */ jsx(StatCard, { label: "Last Run", value: formatRelative(selectedJob.lastRunAt) }),
|
|
228
|
-
/* @__PURE__ */ jsx(StatCard, { label: "Next Run", value: selectedJob.enabled ? formatRelative(selectedJob.nextRunAt) : "Paused" }),
|
|
229
|
-
/* @__PURE__ */ jsx(StatCard, { label: "Duration", value: selectedJob.lastDurationMs !== void 0 ? formatDuration(selectedJob.lastDurationMs) : "—" })
|
|
230
|
-
] }),
|
|
231
|
-
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-3 gap-3 mt-3", children: [
|
|
232
|
-
/* @__PURE__ */ jsx(StatCard, { label: "Status", value: selectedJob.state.toUpperCase(), chipColor: selectedJob.state === "error" ? "red" : selectedJob.state === "disabled" ? "gray" : "green" }),
|
|
233
|
-
/* @__PURE__ */ jsx(StatCard, { label: "Total Runs", value: String(selectedJob.totalRuns) }),
|
|
234
|
-
/* @__PURE__ */ jsx(StatCard, { label: "Failures", value: String(selectedJob.totalFailures), highlight: selectedJob.totalFailures > 0 })
|
|
235
|
-
] }),
|
|
236
|
-
selectedJob.lastError && /* @__PURE__ */ jsxs("div", { className: "mt-3 p-3 rounded-lg bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800/50", children: [
|
|
237
|
-
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 mb-1", children: [
|
|
238
|
-
/* @__PURE__ */ jsx(AlertCircleIcon, { size: iconSize.smallest, className: "text-red-500" }),
|
|
239
|
-
/* @__PURE__ */ jsx(Typography, { variant: "caption", className: "font-semibold text-red-700 dark:text-red-400", children: "Last Error" })
|
|
240
|
-
] }),
|
|
241
|
-
/* @__PURE__ */ jsx(Typography, { variant: "caption", className: "font-mono text-red-600 dark:text-red-300 text-[11px] break-all", children: selectedJob.lastError })
|
|
242
|
-
] })
|
|
243
|
-
] }),
|
|
244
|
-
/* @__PURE__ */ jsxs("div", { className: cls("flex items-center justify-between px-5 py-2 border-y bg-white dark:bg-surface-950", defaultBorderMixin), children: [
|
|
245
|
-
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
246
|
-
/* @__PURE__ */ jsx(HistoryIcon, { size: iconSize.smallest, className: "text-surface-400" }),
|
|
247
|
-
/* @__PURE__ */ jsx(Typography, { variant: "subtitle2", className: "font-semibold text-[13px]", children: "Execution History" })
|
|
248
|
-
] }),
|
|
249
|
-
/* @__PURE__ */ jsx(IconButton, { size: "small", onClick: () => refreshLogs(selectedJob.id), title: "Refresh logs", children: /* @__PURE__ */ jsx(RefreshCwIcon, { size: iconSize.smallest }) })
|
|
250
|
-
] }),
|
|
251
|
-
/* @__PURE__ */ jsx("div", { className: "flex-1 overflow-y-auto", children: logsLoading ? /* @__PURE__ */ jsx("div", { className: "flex justify-center p-8", children: /* @__PURE__ */ jsx(CircularProgress, { size: "small" }) }) : logs.length === 0 ? /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center h-32", children: /* @__PURE__ */ jsx(Typography, { variant: "body2", color: "disabled", children: "No executions yet" }) }) : /* @__PURE__ */ jsx("div", { className: "divide-y divide-surface-100 dark:divide-surface-950", children: logs.map((log, idx) => /* @__PURE__ */ jsx(LogRow, { log }, idx)) }) })
|
|
252
|
-
] }) })
|
|
253
|
-
] });
|
|
254
|
-
}
|
|
255
|
-
function StatCard(t0) {
|
|
256
|
-
const $ = c(15);
|
|
257
|
-
const {
|
|
258
|
-
label,
|
|
259
|
-
value,
|
|
260
|
-
mono,
|
|
261
|
-
chipColor,
|
|
262
|
-
highlight
|
|
263
|
-
} = t0;
|
|
264
|
-
let t1;
|
|
265
|
-
if ($[0] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
|
|
266
|
-
t1 = cls("px-3 py-2 rounded-lg border bg-white dark:bg-surface-900", defaultBorderMixin);
|
|
267
|
-
$[0] = t1;
|
|
268
|
-
} else {
|
|
269
|
-
t1 = $[0];
|
|
270
|
-
}
|
|
271
|
-
let t2;
|
|
272
|
-
if ($[1] !== label) {
|
|
273
|
-
t2 = /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "secondary", className: "text-[10px] uppercase tracking-wider font-medium", children: label });
|
|
274
|
-
$[1] = label;
|
|
275
|
-
$[2] = t2;
|
|
276
|
-
} else {
|
|
277
|
-
t2 = $[2];
|
|
278
|
-
}
|
|
279
|
-
const t3 = mono && "font-mono";
|
|
280
|
-
const t4 = highlight && "text-red-500 dark:text-red-400";
|
|
281
|
-
const t5 = chipColor === "red" && "text-red-500";
|
|
282
|
-
const t6 = chipColor === "green" && "text-emerald-500";
|
|
283
|
-
const t7 = chipColor === "gray" && "text-surface-400";
|
|
284
|
-
let t8;
|
|
285
|
-
if ($[3] !== t3 || $[4] !== t4 || $[5] !== t5 || $[6] !== t6 || $[7] !== t7) {
|
|
286
|
-
t8 = cls("mt-0.5 font-semibold text-[13px]", t3, t4, t5, t6, t7);
|
|
287
|
-
$[3] = t3;
|
|
288
|
-
$[4] = t4;
|
|
289
|
-
$[5] = t5;
|
|
290
|
-
$[6] = t6;
|
|
291
|
-
$[7] = t7;
|
|
292
|
-
$[8] = t8;
|
|
293
|
-
} else {
|
|
294
|
-
t8 = $[8];
|
|
295
|
-
}
|
|
296
|
-
let t9;
|
|
297
|
-
if ($[9] !== t8 || $[10] !== value) {
|
|
298
|
-
t9 = /* @__PURE__ */ jsx(Typography, { variant: "body2", className: t8, children: value });
|
|
299
|
-
$[9] = t8;
|
|
300
|
-
$[10] = value;
|
|
301
|
-
$[11] = t9;
|
|
302
|
-
} else {
|
|
303
|
-
t9 = $[11];
|
|
304
|
-
}
|
|
305
|
-
let t10;
|
|
306
|
-
if ($[12] !== t2 || $[13] !== t9) {
|
|
307
|
-
t10 = /* @__PURE__ */ jsxs("div", { className: t1, children: [
|
|
308
|
-
t2,
|
|
309
|
-
t9
|
|
310
|
-
] });
|
|
311
|
-
$[12] = t2;
|
|
312
|
-
$[13] = t9;
|
|
313
|
-
$[14] = t10;
|
|
314
|
-
} else {
|
|
315
|
-
t10 = $[14];
|
|
316
|
-
}
|
|
317
|
-
return t10;
|
|
318
|
-
}
|
|
319
|
-
function LogRow(t0) {
|
|
320
|
-
const $ = c(36);
|
|
321
|
-
const {
|
|
322
|
-
log
|
|
323
|
-
} = t0;
|
|
324
|
-
const [expanded, setExpanded] = useState(false);
|
|
325
|
-
let t1;
|
|
326
|
-
if ($[0] !== expanded) {
|
|
327
|
-
t1 = () => setExpanded(!expanded);
|
|
328
|
-
$[0] = expanded;
|
|
329
|
-
$[1] = t1;
|
|
330
|
-
} else {
|
|
331
|
-
t1 = $[1];
|
|
332
|
-
}
|
|
333
|
-
let t2;
|
|
334
|
-
if ($[2] !== log.success) {
|
|
335
|
-
t2 = log.success ? /* @__PURE__ */ jsx(CheckCircleIcon, { size: iconSize.smallest, className: "text-emerald-500 shrink-0" }) : /* @__PURE__ */ jsx(AlertCircleIcon, { size: iconSize.smallest, className: "text-red-500 shrink-0" });
|
|
336
|
-
$[2] = log.success;
|
|
337
|
-
$[3] = t2;
|
|
338
|
-
} else {
|
|
339
|
-
t2 = $[3];
|
|
340
|
-
}
|
|
341
|
-
let t3;
|
|
342
|
-
if ($[4] !== log.startedAt) {
|
|
343
|
-
t3 = new Date(log.startedAt).toLocaleString();
|
|
344
|
-
$[4] = log.startedAt;
|
|
345
|
-
$[5] = t3;
|
|
346
|
-
} else {
|
|
347
|
-
t3 = $[5];
|
|
348
|
-
}
|
|
349
|
-
let t4;
|
|
350
|
-
if ($[6] !== t3) {
|
|
351
|
-
t4 = /* @__PURE__ */ jsx("div", { className: "flex-1 min-w-0", children: /* @__PURE__ */ jsx(Typography, { variant: "caption", className: "font-mono text-[11px] text-surface-500", children: t3 }) });
|
|
352
|
-
$[6] = t3;
|
|
353
|
-
$[7] = t4;
|
|
354
|
-
} else {
|
|
355
|
-
t4 = $[7];
|
|
356
|
-
}
|
|
357
|
-
let t5;
|
|
358
|
-
if ($[8] !== log.manual) {
|
|
359
|
-
t5 = log.manual && /* @__PURE__ */ jsx(Chip, { size: "smallest", className: "bg-blue-100 dark:bg-blue-900/30 text-blue-700 dark:text-blue-300", children: "manual" });
|
|
360
|
-
$[8] = log.manual;
|
|
361
|
-
$[9] = t5;
|
|
362
|
-
} else {
|
|
363
|
-
t5 = $[9];
|
|
364
|
-
}
|
|
365
|
-
let t6;
|
|
366
|
-
if ($[10] !== log.durationMs) {
|
|
367
|
-
t6 = formatDuration(log.durationMs);
|
|
368
|
-
$[10] = log.durationMs;
|
|
369
|
-
$[11] = t6;
|
|
370
|
-
} else {
|
|
371
|
-
t6 = $[11];
|
|
372
|
-
}
|
|
373
|
-
let t7;
|
|
374
|
-
if ($[12] !== t6) {
|
|
375
|
-
t7 = /* @__PURE__ */ jsx(Typography, { variant: "caption", className: "font-mono text-[11px]", children: t6 });
|
|
376
|
-
$[12] = t6;
|
|
377
|
-
$[13] = t7;
|
|
378
|
-
} else {
|
|
379
|
-
t7 = $[13];
|
|
380
|
-
}
|
|
381
|
-
const t8 = expanded && "rotate-180";
|
|
382
|
-
let t9;
|
|
383
|
-
if ($[14] !== t8) {
|
|
384
|
-
t9 = cls("w-3 h-3 transition-transform text-surface-400", t8);
|
|
385
|
-
$[14] = t8;
|
|
386
|
-
$[15] = t9;
|
|
387
|
-
} else {
|
|
388
|
-
t9 = $[15];
|
|
389
|
-
}
|
|
390
|
-
let t10;
|
|
391
|
-
if ($[16] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
|
|
392
|
-
t10 = /* @__PURE__ */ jsx("path", { d: "M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z" });
|
|
393
|
-
$[16] = t10;
|
|
394
|
-
} else {
|
|
395
|
-
t10 = $[16];
|
|
396
|
-
}
|
|
397
|
-
let t11;
|
|
398
|
-
if ($[17] !== t9) {
|
|
399
|
-
t11 = /* @__PURE__ */ jsx("svg", { className: t9, fill: "currentColor", viewBox: "0 0 20 20", children: t10 });
|
|
400
|
-
$[17] = t9;
|
|
401
|
-
$[18] = t11;
|
|
402
|
-
} else {
|
|
403
|
-
t11 = $[18];
|
|
404
|
-
}
|
|
405
|
-
let t12;
|
|
406
|
-
if ($[19] !== t11 || $[20] !== t5 || $[21] !== t7) {
|
|
407
|
-
t12 = /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 shrink-0", children: [
|
|
408
|
-
t5,
|
|
409
|
-
t7,
|
|
410
|
-
t11
|
|
411
|
-
] });
|
|
412
|
-
$[19] = t11;
|
|
413
|
-
$[20] = t5;
|
|
414
|
-
$[21] = t7;
|
|
415
|
-
$[22] = t12;
|
|
416
|
-
} else {
|
|
417
|
-
t12 = $[22];
|
|
418
|
-
}
|
|
419
|
-
let t13;
|
|
420
|
-
if ($[23] !== t1 || $[24] !== t12 || $[25] !== t2 || $[26] !== t4) {
|
|
421
|
-
t13 = /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 cursor-pointer", onClick: t1, children: [
|
|
422
|
-
t2,
|
|
423
|
-
t4,
|
|
424
|
-
t12
|
|
425
|
-
] });
|
|
426
|
-
$[23] = t1;
|
|
427
|
-
$[24] = t12;
|
|
428
|
-
$[25] = t2;
|
|
429
|
-
$[26] = t4;
|
|
430
|
-
$[27] = t13;
|
|
431
|
-
} else {
|
|
432
|
-
t13 = $[27];
|
|
433
|
-
}
|
|
434
|
-
let t14;
|
|
435
|
-
if ($[28] !== expanded || $[29] !== log.error || $[30] !== log.logs || $[31] !== log.result) {
|
|
436
|
-
t14 = expanded && /* @__PURE__ */ jsxs("div", { className: "mt-2 ml-6 space-y-2", children: [
|
|
437
|
-
log.error && /* @__PURE__ */ jsx("div", { className: "p-2 rounded bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800/50", children: /* @__PURE__ */ jsx(Typography, { variant: "caption", className: "font-mono text-[11px] text-red-600 dark:text-red-300 break-all", children: log.error }) }),
|
|
438
|
-
log.logs.length > 0 && /* @__PURE__ */ jsx("div", { className: "p-2 rounded bg-surface-50 dark:bg-surface-900 border border-surface-200 dark:border-surface-700 max-h-40 overflow-auto", children: log.logs.map(_temp) }),
|
|
439
|
-
log.result !== void 0 && /* @__PURE__ */ jsxs("div", { className: "p-2 rounded bg-surface-50 dark:bg-surface-900 border border-surface-200 dark:border-surface-700", children: [
|
|
440
|
-
/* @__PURE__ */ jsx(Typography, { variant: "caption", className: "text-[10px] uppercase tracking-wider text-surface-400 mb-1 block", children: "Result" }),
|
|
441
|
-
/* @__PURE__ */ jsx("pre", { className: "font-mono text-[11px] text-surface-600 dark:text-surface-400 whitespace-pre-wrap break-all", children: JSON.stringify(log.result, null, 2) })
|
|
442
|
-
] })
|
|
443
|
-
] });
|
|
444
|
-
$[28] = expanded;
|
|
445
|
-
$[29] = log.error;
|
|
446
|
-
$[30] = log.logs;
|
|
447
|
-
$[31] = log.result;
|
|
448
|
-
$[32] = t14;
|
|
449
|
-
} else {
|
|
450
|
-
t14 = $[32];
|
|
451
|
-
}
|
|
452
|
-
let t15;
|
|
453
|
-
if ($[33] !== t13 || $[34] !== t14) {
|
|
454
|
-
t15 = /* @__PURE__ */ jsxs("div", { className: "px-5 py-2.5 hover:bg-surface-50 dark:hover:bg-surface-950/50 transition-colors", children: [
|
|
455
|
-
t13,
|
|
456
|
-
t14
|
|
457
|
-
] });
|
|
458
|
-
$[33] = t13;
|
|
459
|
-
$[34] = t14;
|
|
460
|
-
$[35] = t15;
|
|
461
|
-
} else {
|
|
462
|
-
t15 = $[35];
|
|
463
|
-
}
|
|
464
|
-
return t15;
|
|
465
|
-
}
|
|
466
|
-
function _temp(line, i) {
|
|
467
|
-
return /* @__PURE__ */ jsx("div", { className: "font-mono text-[11px] text-surface-600 dark:text-surface-400 leading-relaxed", children: line }, i);
|
|
468
|
-
}
|
|
469
|
-
export {
|
|
470
|
-
CronJobsView
|
|
471
|
-
};
|
|
472
|
-
//# sourceMappingURL=CronJobsView-3PM_qR8v.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CronJobsView-3PM_qR8v.js","sources":["../src/components/CronJobs/CronJobsView.tsx"],"sourcesContent":["\nimport React, { useState, useEffect, useRef } from \"react\";\nimport {\n AlertCircleIcon,\n Button,\n CalendarIcon,\n Card,\n CheckCircleIcon,\n Chip,\n CircularProgress,\n cls,\n defaultBorderMixin,\n HistoryIcon,\n IconButton,\n iconSize,\n Paper,\n PauseIcon,\n PlayIcon,\n RefreshCwIcon,\n Typography\n} from \"@rebasepro/ui\";\nimport { useRebaseClient, useSnackbarController } from \"@rebasepro/core\";\nimport type { CronJobStatus, CronJobLogEntry } from \"@rebasepro/types\";\nimport type { RebaseClient } from \"@rebasepro/client\";\n\nfunction formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\n return `${(ms / 60000).toFixed(1)}m`;\n}\n\nfunction formatRelative(iso: string | undefined): string {\n if (!iso) return \"—\";\n const d = new Date(iso);\n const now = Date.now();\n const diff = d.getTime() - now;\n const abs = Math.abs(diff);\n if (abs < 60000) return diff > 0 ? \"in <1m\" : \"<1m ago\";\n if (abs < 3600000) { const m = Math.round(abs / 60000); return diff > 0 ? `in ${m}m` : `${m}m ago`; }\n if (abs < 86400000) { const h = Math.round(abs / 3600000); return diff > 0 ? `in ${h}h` : `${h}h ago`; }\n return d.toLocaleString();\n}\n\nconst stateColors: Record<string, string> = {\n idle: \"bg-emerald-500\",\nrunning: \"bg-blue-500\",\nsuccess: \"bg-emerald-500\",\n error: \"bg-red-500\",\ndisabled: \"bg-surface-400\"\n};\n\nexport function CronJobsView() {\n const client = useRebaseClient<RebaseClient>();\n const snackbar = useSnackbarController();\n const [jobs, setJobs] = useState<CronJobStatus[]>([]);\n const [loading, setLoading] = useState(true);\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const [logs, setLogs] = useState<CronJobLogEntry[]>([]);\n const [logsLoading, setLogsLoading] = useState(false);\n const [triggering, setTriggering] = useState<string | null>(null);\n\n // Refs so effects never re-fire due to identity changes\n const clientRef = useRef(client);\n clientRef.current = client;\n const snackbarRef = useRef(snackbar);\n snackbarRef.current = snackbar;\n\n // ── Fetch jobs on mount + poll every 15s ──\n useEffect(() => {\n let cancelled = false;\n\n async function load() {\n const c = clientRef.current;\n if (!c?.cron) {\n setLoading(false);\n return;\n }\n try {\n const res = await c.cron.listJobs();\n if (!cancelled) setJobs(res.jobs);\n } catch (e: unknown) {\n if (!cancelled) {\n snackbarRef.current.open({\n type: \"error\",\n message: e instanceof Error ? e.message : String(e)\n });\n }\n } finally {\n if (!cancelled) setLoading(false);\n }\n }\n\n load();\n\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n const scheduleNext = () => {\n if (cancelled) return;\n timeoutId = setTimeout(async () => {\n if (document.visibilityState === \"visible\") {\n await load();\n }\n scheduleNext();\n }, 15_000);\n };\n\n scheduleNext();\n\n const handleVisibility = () => {\n if (document.visibilityState === \"visible\") {\n load();\n }\n };\n document.addEventListener(\"visibilitychange\", handleVisibility);\n\n return () => {\n cancelled = true;\n if (timeoutId) clearTimeout(timeoutId);\n document.removeEventListener(\"visibilitychange\", handleVisibility);\n };\n }, []); // runs once\n\n // ── Fetch logs when selection changes ──\n useEffect(() => {\n if (!selectedId) {\n setLogs([]);\n return;\n }\n let cancelled = false;\n const c = clientRef.current;\n if (!c?.cron) return;\n\n setLogsLoading(true);\n c.cron.getJobLogs(selectedId, { limit: 25 })\n .then(res => { if (!cancelled) setLogs(res.logs); })\n .catch(() => { if (!cancelled) setLogs([]); })\n .finally(() => { if (!cancelled) setLogsLoading(false); });\n\n return () => { cancelled = true; };\n }, [selectedId]);\n\n // ── Imperative helpers (not in any dep array) ──\n async function refreshJobs() {\n const c = clientRef.current;\n if (!c?.cron) return;\n try {\n const res = await c.cron.listJobs();\n setJobs(res.jobs);\n } catch { /* swallow */ }\n }\n\n async function refreshLogs(id: string) {\n const c = clientRef.current;\n if (!c?.cron) return;\n setLogsLoading(true);\n try {\n const res = await c.cron.getJobLogs(id, { limit: 25 });\n setLogs(res.logs);\n } catch { setLogs([]); }\n finally { setLogsLoading(false); }\n }\n\n const handleTrigger = async (id: string) => {\n const c = clientRef.current;\n if (!c?.cron) return;\n setTriggering(id);\n try {\n await c.cron.triggerJob(id);\n snackbarRef.current.open({ type: \"success\",\nmessage: \"Job triggered\" });\n await refreshJobs();\n if (selectedId === id) refreshLogs(id);\n } catch (e: unknown) {\n snackbarRef.current.open({ type: \"error\",\nmessage: e instanceof Error ? e.message : String(e) });\n } finally { setTriggering(null); }\n };\n\n const handleToggle = async (id: string, enabled: boolean) => {\n const c = clientRef.current;\n if (!c?.cron) return;\n try {\n await c.cron.toggleJob(id, enabled);\n snackbarRef.current.open({ type: \"success\",\nmessage: enabled ? \"Job enabled\" : \"Job paused\" });\n await refreshJobs();\n } catch (e: unknown) {\n snackbarRef.current.open({ type: \"error\",\nmessage: e instanceof Error ? e.message : String(e) });\n }\n };\n\n const selectedJob = jobs.find(j => j.id === selectedId);\n\n if (loading) return <div className=\"flex items-center justify-center h-full\"><CircularProgress/></div>;\n\n if (jobs.length === 0) return (\n <div className=\"flex flex-col items-center justify-center h-full gap-4 text-center p-8\">\n <CalendarIcon size={iconSize.medium} className=\"text-surface-300 dark:text-surface-600\"/>\n <Typography variant=\"h6\" color=\"secondary\">No Cron Jobs Registered</Typography>\n <Typography variant=\"body2\" color=\"disabled\" className=\"max-w-md\">\n Create a file in your <code className=\"text-xs bg-surface-100 dark:bg-surface-950 px-1.5 py-0.5 rounded font-mono\">crons/</code> directory that default-exports a <code className=\"text-xs bg-surface-100 dark:bg-surface-950 px-1.5 py-0.5 rounded font-mono\">CronJobDefinition</code>.\n </Typography>\n </div>\n );\n\n return (\n <div className=\"flex h-full w-full overflow-hidden bg-white dark:bg-surface-950\">\n {/* ── Job List ── */}\n <div className={cls(\"flex flex-col w-[340px] min-w-[280px] border-r h-full\", defaultBorderMixin)}>\n <div className={cls(\"flex items-center justify-between px-4 py-2.5 border-b bg-surface-50 dark:bg-surface-900 min-h-[48px]\", defaultBorderMixin)}>\n <div className=\"flex items-center gap-2\">\n <CalendarIcon size={iconSize.smallest} className=\"text-primary\"/>\n <Typography variant=\"subtitle2\" className=\"font-semibold\">Cron Jobs</Typography>\n <Chip size=\"smallest\" className=\"bg-surface-200 dark:bg-surface-700 text-surface-600 dark:text-surface-300\">{jobs.length}</Chip>\n </div>\n <IconButton size=\"small\" onClick={refreshJobs} title=\"Refresh\"><RefreshCwIcon size={iconSize.smallest}/></IconButton>\n </div>\n <div className=\"flex-1 overflow-y-auto p-2 space-y-1\">\n {jobs.map(job => (\n <div\n key={job.id}\n onClick={() => setSelectedId(job.id)}\n className={cls(\n \"flex items-center gap-3 px-3 py-2.5 rounded-lg cursor-pointer transition-all\",\n selectedId === job.id\n ? \"bg-primary/10 dark:bg-primary/15 ring-1 ring-primary/30\"\n : \"hover:bg-surface-100 dark:hover:bg-surface-950\"\n )}\n >\n <div className={cls(\"w-2 h-2 rounded-full shrink-0\", stateColors[job.state] || \"bg-surface-400\")}/>\n <div className=\"flex-1 min-w-0\">\n <Typography variant=\"body2\" className=\"truncate font-medium text-[13px]\">{job.name}</Typography>\n <Typography variant=\"caption\" color=\"secondary\" className=\"truncate text-[11px] font-mono\">{job.schedule}</Typography>\n </div>\n {job.state === \"running\" && <CircularProgress size=\"smallest\"/>}\n </div>\n ))}\n </div>\n </div>\n\n {/* ── Detail Panel ── */}\n <div className=\"flex-1 flex flex-col min-w-0 h-full overflow-hidden\">\n {!selectedJob ? (\n <div className=\"flex items-center justify-center h-full\">\n <Typography variant=\"body2\" color=\"disabled\">Select a cron job to view details</Typography>\n </div>\n ) : (\n <>\n {/* Header */}\n <div className={cls(\"flex items-center justify-between px-5 py-3 border-b bg-white dark:bg-surface-950 min-h-[56px]\", defaultBorderMixin)}>\n <div className=\"flex items-center gap-3 min-w-0\">\n <div className={cls(\"w-2.5 h-2.5 rounded-full\", stateColors[selectedJob.state])}/>\n <div className=\"min-w-0\">\n <Typography variant=\"subtitle1\" className=\"font-semibold truncate\">{selectedJob.name}</Typography>\n {selectedJob.description && <Typography variant=\"caption\" color=\"secondary\" className=\"truncate\">{selectedJob.description}</Typography>}\n </div>\n </div>\n <div className=\"flex items-center gap-2 shrink-0\">\n <IconButton title={selectedJob.enabled ? \"Pause job\" : \"Enable job\"} size=\"small\" onClick={() => handleToggle(selectedJob.id, !selectedJob.enabled)}>\n {selectedJob.enabled ? <PauseIcon size={iconSize.small}/> : <PlayIcon size={iconSize.smallest}/>}\n </IconButton>\n <Button\n size=\"small\"\n color=\"primary\"\n onClick={() => handleTrigger(selectedJob.id)}\n disabled={triggering === selectedJob.id}\n startIcon={triggering === selectedJob.id ? <CircularProgress size=\"smallest\"/> : <PlayIcon size={iconSize.smallest}/>}\n >\n Run Now\n </Button>\n </div>\n </div>\n\n {/* Stats Cards */}\n <div className=\"px-5 py-4 bg-surface-50 dark:bg-surface-900/50\">\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-3\">\n <StatCard label=\"Schedule\" value={selectedJob.schedule} mono/>\n <StatCard label=\"Last Run\" value={formatRelative(selectedJob.lastRunAt)}/>\n <StatCard label=\"Next Run\" value={selectedJob.enabled ? formatRelative(selectedJob.nextRunAt) : \"Paused\"}/>\n <StatCard label=\"Duration\" value={selectedJob.lastDurationMs !== undefined ? formatDuration(selectedJob.lastDurationMs) : \"—\"}/>\n </div>\n <div className=\"grid grid-cols-3 gap-3 mt-3\">\n <StatCard label=\"Status\" value={selectedJob.state.toUpperCase()} chipColor={selectedJob.state === \"error\" ? \"red\" : selectedJob.state === \"disabled\" ? \"gray\" : \"green\"}/>\n <StatCard label=\"Total Runs\" value={String(selectedJob.totalRuns)}/>\n <StatCard label=\"Failures\" value={String(selectedJob.totalFailures)} highlight={selectedJob.totalFailures > 0}/>\n </div>\n {selectedJob.lastError && (\n <div className=\"mt-3 p-3 rounded-lg bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800/50\">\n <div className=\"flex items-center gap-2 mb-1\">\n <AlertCircleIcon size={iconSize.smallest} className=\"text-red-500\"/>\n <Typography variant=\"caption\" className=\"font-semibold text-red-700 dark:text-red-400\">Last Error</Typography>\n </div>\n <Typography variant=\"caption\" className=\"font-mono text-red-600 dark:text-red-300 text-[11px] break-all\">{selectedJob.lastError}</Typography>\n </div>\n )}\n </div>\n\n {/* Logs Section */}\n <div className={cls(\"flex items-center justify-between px-5 py-2 border-y bg-white dark:bg-surface-950\", defaultBorderMixin)}>\n <div className=\"flex items-center gap-2\">\n <HistoryIcon size={iconSize.smallest} className=\"text-surface-400\"/>\n <Typography variant=\"subtitle2\" className=\"font-semibold text-[13px]\">Execution History</Typography>\n </div>\n <IconButton size=\"small\" onClick={() => refreshLogs(selectedJob.id)} title=\"Refresh logs\"><RefreshCwIcon size={iconSize.smallest}/></IconButton>\n </div>\n <div className=\"flex-1 overflow-y-auto\">\n {logsLoading ? (\n <div className=\"flex justify-center p-8\"><CircularProgress size=\"small\"/></div>\n ) : logs.length === 0 ? (\n <div className=\"flex items-center justify-center h-32\">\n <Typography variant=\"body2\" color=\"disabled\">No executions yet</Typography>\n </div>\n ) : (\n <div className=\"divide-y divide-surface-100 dark:divide-surface-950\">\n {logs.map((log, idx) => (\n <LogRow key={idx} log={log}/>\n ))}\n </div>\n )}\n </div>\n </>\n )}\n </div>\n </div>\n );\n}\n\nfunction StatCard({ label, value, mono, chipColor, highlight }: {\n label: string; value: string; mono?: boolean; chipColor?: string; highlight?: boolean;\n}) {\n return (\n <div className={cls(\"px-3 py-2 rounded-lg border bg-white dark:bg-surface-900\", defaultBorderMixin)}>\n <Typography variant=\"caption\" color=\"secondary\" className=\"text-[10px] uppercase tracking-wider font-medium\">{label}</Typography>\n <Typography variant=\"body2\" className={cls(\n \"mt-0.5 font-semibold text-[13px]\",\n mono && \"font-mono\",\n highlight && \"text-red-500 dark:text-red-400\",\n chipColor === \"red\" && \"text-red-500\",\n chipColor === \"green\" && \"text-emerald-500\",\n chipColor === \"gray\" && \"text-surface-400\"\n )}>{value}</Typography>\n </div>\n );\n}\n\nfunction LogRow({ log }: { log: CronJobLogEntry }) {\n const [expanded, setExpanded] = useState(false);\n return (\n <div className=\"px-5 py-2.5 hover:bg-surface-50 dark:hover:bg-surface-950/50 transition-colors\">\n <div className=\"flex items-center gap-3 cursor-pointer\" onClick={() => setExpanded(!expanded)}>\n {log.success\n ? <CheckCircleIcon size={iconSize.smallest} className=\"text-emerald-500 shrink-0\"/>\n : <AlertCircleIcon size={iconSize.smallest} className=\"text-red-500 shrink-0\"/>}\n <div className=\"flex-1 min-w-0\">\n <Typography variant=\"caption\" className=\"font-mono text-[11px] text-surface-500\">{new Date(log.startedAt).toLocaleString()}</Typography>\n </div>\n <div className=\"flex items-center gap-2 shrink-0\">\n {log.manual && <Chip size=\"smallest\" className=\"bg-blue-100 dark:bg-blue-900/30 text-blue-700 dark:text-blue-300\">manual</Chip>}\n <Typography variant=\"caption\" className=\"font-mono text-[11px]\">{formatDuration(log.durationMs)}</Typography>\n <svg className={cls(\"w-3 h-3 transition-transform text-surface-400\", expanded && \"rotate-180\")} fill=\"currentColor\" viewBox=\"0 0 20 20\"><path d=\"M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z\"/></svg>\n </div>\n </div>\n {expanded && (\n <div className=\"mt-2 ml-6 space-y-2\">\n {log.error && (\n <div className=\"p-2 rounded bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800/50\">\n <Typography variant=\"caption\" className=\"font-mono text-[11px] text-red-600 dark:text-red-300 break-all\">{log.error}</Typography>\n </div>\n )}\n {log.logs.length > 0 && (\n <div className=\"p-2 rounded bg-surface-50 dark:bg-surface-900 border border-surface-200 dark:border-surface-700 max-h-40 overflow-auto\">\n {log.logs.map((line, i) => (\n <div key={i} className=\"font-mono text-[11px] text-surface-600 dark:text-surface-400 leading-relaxed\">{line}</div>\n ))}\n </div>\n )}\n {log.result !== undefined && (\n <div className=\"p-2 rounded bg-surface-50 dark:bg-surface-900 border border-surface-200 dark:border-surface-700\">\n <Typography variant=\"caption\" className=\"text-[10px] uppercase tracking-wider text-surface-400 mb-1 block\">Result</Typography>\n <pre className=\"font-mono text-[11px] text-surface-600 dark:text-surface-400 whitespace-pre-wrap break-all\">{JSON.stringify(log.result, null, 2)}</pre>\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n"],"names":["formatDuration","ms","toFixed","formatRelative","iso","d","Date","now","diff","getTime","abs","Math","m","round","h","toLocaleString","stateColors","idle","running","success","error","disabled","CronJobsView","client","useRebaseClient","snackbar","useSnackbarController","jobs","setJobs","useState","loading","setLoading","selectedId","setSelectedId","logs","setLogs","logsLoading","setLogsLoading","triggering","setTriggering","clientRef","useRef","current","snackbarRef","useEffect","cancelled","load","c","cron","res","listJobs","e","open","type","message","Error","String","timeoutId","scheduleNext","setTimeout","document","visibilityState","handleVisibility","addEventListener","removeEventListener","getJobLogs","limit","then","catch","finally","refreshJobs","refreshLogs","id","handleTrigger","triggerJob","handleToggle","enabled","toggleJob","selectedJob","find","j","length","iconSize","medium","cls","defaultBorderMixin","smallest","map","job","state","name","schedule","description","small","lastRunAt","nextRunAt","lastDurationMs","undefined","toUpperCase","totalRuns","totalFailures","lastError","log","idx","StatCard","t0","$","_c","label","value","mono","chipColor","highlight","t1","Symbol","for","t2","t3","t4","t5","t6","t7","t8","t9","t10","LogRow","expanded","setExpanded","startedAt","manual","durationMs","t11","t12","t13","t14","result","_temp","JSON","stringify","t15","line","i"],"mappings":";;;;;AAyBA,SAASA,eAAeC,IAAoB;AACxC,MAAIA,KAAK,IAAM,QAAO,GAAGA,EAAE;AAC3B,MAAIA,KAAK,IAAO,QAAO,IAAIA,KAAK,KAAMC,QAAQ,CAAC,CAAC;AAChD,SAAO,IAAID,KAAK,KAAOC,QAAQ,CAAC,CAAC;AACrC;AAEA,SAASC,eAAeC,KAAiC;AACrD,MAAI,CAACA,IAAK,QAAO;AACjB,QAAMC,IAAI,IAAIC,KAAKF,GAAG;AACtB,QAAMG,MAAMD,KAAKC,IAAAA;AACjB,QAAMC,OAAOH,EAAEI,QAAAA,IAAYF;AAC3B,QAAMG,MAAMC,KAAKD,IAAIF,IAAI;AACzB,MAAIE,MAAM,IAAO,QAAOF,OAAO,IAAI,WAAW;AAC9C,MAAIE,MAAM,MAAS;AAAE,UAAME,IAAID,KAAKE,MAAMH,MAAM,GAAK;AAAG,WAAOF,OAAO,IAAI,MAAMI,CAAC,MAAM,GAAGA,CAAC;AAAA,EAAS;AACpG,MAAIF,MAAM,OAAU;AAAE,UAAMI,IAAIH,KAAKE,MAAMH,MAAM,IAAO;AAAG,WAAOF,OAAO,IAAI,MAAMM,CAAC,MAAM,GAAGA,CAAC;AAAA,EAAS;AACvG,SAAOT,EAAEU,eAAAA;AACb;AAEA,MAAMC,cAAsC;AAAA,EACxCC,MAAM;AAAA,EACVC,SAAS;AAAA,EACTC,SAAS;AAAA,EACLC,OAAO;AAAA,EACXC,UAAU;AACV;AAEO,SAASC,eAAe;AAC3B,QAAMC,SAASC,gBAAAA;AACf,QAAMC,WAAWC,sBAAAA;AACjB,QAAM,CAACC,MAAMC,OAAO,IAAIC,SAA0B,CAAA,CAAE;AACpD,QAAM,CAACC,SAASC,UAAU,IAAIF,SAAS,IAAI;AAC3C,QAAM,CAACG,YAAYC,aAAa,IAAIJ,SAAwB,IAAI;AAChE,QAAM,CAACK,MAAMC,OAAO,IAAIN,SAA4B,CAAA,CAAE;AACtD,QAAM,CAACO,aAAaC,cAAc,IAAIR,SAAS,KAAK;AACpD,QAAM,CAACS,YAAYC,aAAa,IAAIV,SAAwB,IAAI;AAGhE,QAAMW,YAAYC,OAAOlB,MAAM;AAC/BiB,YAAUE,UAAUnB;AACpB,QAAMoB,cAAcF,OAAOhB,QAAQ;AACnCkB,cAAYD,UAAUjB;AAGtBmB,YAAU,MAAM;AACZ,QAAIC,YAAY;AAEhB,mBAAeC,OAAO;AAClB,YAAMC,KAAIP,UAAUE;AACpB,UAAI,CAACK,IAAGC,MAAM;AACVjB,mBAAW,KAAK;AAChB;AAAA,MACJ;AACA,UAAI;AACA,cAAMkB,MAAM,MAAMF,GAAEC,KAAKE,SAAAA;AACzB,YAAI,CAACL,UAAWjB,SAAQqB,IAAItB,IAAI;AAAA,MACpC,SAASwB,GAAY;AACjB,YAAI,CAACN,WAAW;AACZF,sBAAYD,QAAQU,KAAK;AAAA,YACrBC,MAAM;AAAA,YACNC,SAASH,aAAaI,QAAQJ,EAAEG,UAAUE,OAAOL,CAAC;AAAA,UAAA,CACrD;AAAA,QACL;AAAA,MACJ,UAAA;AACI,YAAI,CAACN,UAAWd,YAAW,KAAK;AAAA,MACpC;AAAA,IACJ;AAEAe,SAAAA;AAEA,QAAIW,YAAkD;AAEtD,UAAMC,eAAeA,MAAM;AACvB,UAAIb,UAAW;AACfY,kBAAYE,WAAW,YAAY;AAC/B,YAAIC,SAASC,oBAAoB,WAAW;AACxC,gBAAMf,KAAAA;AAAAA,QACV;AACAY,qBAAAA;AAAAA,MACJ,GAAG,IAAM;AAAA,IACb;AAEAA,iBAAAA;AAEA,UAAMI,mBAAmBA,MAAM;AAC3B,UAAIF,SAASC,oBAAoB,WAAW;AACxCf,aAAAA;AAAAA,MACJ;AAAA,IACJ;AACAc,aAASG,iBAAiB,oBAAoBD,gBAAgB;AAE9D,WAAO,MAAM;AACTjB,kBAAY;AACZ,UAAIY,wBAAwBA,SAAS;AACrCG,eAASI,oBAAoB,oBAAoBF,gBAAgB;AAAA,IACrE;AAAA,EACJ,GAAG,CAAA,CAAE;AAGLlB,YAAU,MAAM;AACZ,QAAI,CAACZ,YAAY;AACbG,cAAQ,CAAA,CAAE;AACV;AAAA,IACJ;AACA,QAAIU,cAAY;AAChB,UAAME,MAAIP,UAAUE;AACpB,QAAI,CAACK,KAAGC,KAAM;AAEdX,mBAAe,IAAI;AACnBU,QAAEC,KAAKiB,WAAWjC,YAAY;AAAA,MAAEkC,OAAO;AAAA,IAAA,CAAI,EACtCC,KAAKlB,CAAAA,UAAO;AAAE,UAAI,CAACJ,YAAWV,SAAQc,MAAIf,IAAI;AAAA,IAAG,CAAC,EAClDkC,MAAM,MAAM;AAAE,UAAI,CAACvB,YAAWV,SAAQ,EAAE;AAAA,IAAG,CAAC,EAC5CkC,QAAQ,MAAM;AAAE,UAAI,CAACxB,YAAWR,gBAAe,KAAK;AAAA,IAAG,CAAC;AAE7D,WAAO,MAAM;AAAEQ,oBAAY;AAAA,IAAM;AAAA,EACrC,GAAG,CAACb,UAAU,CAAC;AAGf,iBAAesC,cAAc;AACzB,UAAMvB,MAAIP,UAAUE;AACpB,QAAI,CAACK,KAAGC,KAAM;AACd,QAAI;AACA,YAAMC,QAAM,MAAMF,IAAEC,KAAKE,SAAAA;AACzBtB,cAAQqB,MAAItB,IAAI;AAAA,IACpB,QAAQ;AAAA,IAAE;AAAA,EACd;AAEA,iBAAe4C,YAAYC,IAAY;AACnC,UAAMzB,MAAIP,UAAUE;AACpB,QAAI,CAACK,KAAGC,KAAM;AACdX,mBAAe,IAAI;AACnB,QAAI;AACA,YAAMY,QAAM,MAAMF,IAAEC,KAAKiB,WAAWO,IAAI;AAAA,QAAEN,OAAO;AAAA,MAAA,CAAI;AACrD/B,cAAQc,MAAIf,IAAI;AAAA,IACpB,QAAQ;AAAEC,cAAQ,CAAA,CAAE;AAAA,IAAG,UAAA;AACbE,qBAAe,KAAK;AAAA,IAAG;AAAA,EACrC;AAEA,QAAMoC,gBAAgB,OAAOD,SAAe;AACxC,UAAMzB,MAAIP,UAAUE;AACpB,QAAI,CAACK,KAAGC,KAAM;AACdT,kBAAciC,IAAE;AAChB,QAAI;AACA,YAAMzB,IAAEC,KAAK0B,WAAWF,IAAE;AAC1B7B,kBAAYD,QAAQU,KAAK;AAAA,QAAEC,MAAM;AAAA,QAC7CC,SAAS;AAAA,MAAA,CAAiB;AACd,YAAMgB,YAAAA;AACN,UAAItC,eAAewC,KAAID,aAAYC,IAAE;AAAA,IACzC,SAASrB,KAAY;AACjBR,kBAAYD,QAAQU,KAAK;AAAA,QAAEC,MAAM;AAAA,QAC7CC,SAASH,eAAaI,QAAQJ,IAAEG,UAAUE,OAAOL,GAAC;AAAA,MAAA,CAAG;AAAA,IAC7C,UAAA;AAAYZ,oBAAc,IAAI;AAAA,IAAG;AAAA,EACrC;AAEA,QAAMoC,eAAe,OAAOH,MAAYI,YAAqB;AACzD,UAAM7B,MAAIP,UAAUE;AACpB,QAAI,CAACK,KAAGC,KAAM;AACd,QAAI;AACA,YAAMD,IAAEC,KAAK6B,UAAUL,MAAII,OAAO;AAClCjC,kBAAYD,QAAQU,KAAK;AAAA,QAAEC,MAAM;AAAA,QAC7CC,SAASsB,UAAU,gBAAgB;AAAA,MAAA,CAAc;AACrC,YAAMN,YAAAA;AAAAA,IACV,SAASnB,KAAY;AACjBR,kBAAYD,QAAQU,KAAK;AAAA,QAAEC,MAAM;AAAA,QAC7CC,SAASH,eAAaI,QAAQJ,IAAEG,UAAUE,OAAOL,GAAC;AAAA,MAAA,CAAG;AAAA,IAC7C;AAAA,EACJ;AAEA,QAAM2B,cAAcnD,KAAKoD,KAAKC,CAAAA,MAAKA,EAAER,OAAOxC,UAAU;AAEtD,MAAIF,gBAAgB,oBAAC,OAAA,EAAI,WAAU,2CAA0C,UAAA,oBAAC,oBAAgB,EAAA,CAAE;AAEhG,MAAIH,KAAKsD,WAAW,UAChB,qBAAC,OAAA,EAAI,WAAU,0EACX,UAAA;AAAA,IAAA,oBAAC,cAAA,EAAa,MAAMC,SAASC,QAAQ,WAAU,0CAAwC;AAAA,wBACtF,YAAA,EAAW,SAAQ,MAAK,OAAM,aAAY,UAAA,2BAAuB;AAAA,yBACjE,YAAA,EAAW,SAAQ,SAAQ,OAAM,YAAW,WAAU,YAAU,UAAA;AAAA,MAAA;AAAA,MACvC,oBAAC,QAAA,EAAK,WAAU,8EAA6E,UAAA,UAAM;AAAA,MAAO;AAAA,MAAkC,oBAAC,QAAA,EAAK,WAAU,8EAA6E,UAAA,qBAAiB;AAAA,MAAO;AAAA,IAAA,EAAA,CAC3R;AAAA,EAAA,GACJ;AAGJ,SACI,qBAAC,OAAA,EAAI,WAAU,mEAEX,UAAA;AAAA,IAAA,qBAAC,OAAA,EAAI,WAAWC,IAAI,yDAAyDC,kBAAkB,GAC3F,UAAA;AAAA,MAAA,qBAAC,OAAA,EAAI,WAAWD,IAAI,yGAAyGC,kBAAkB,GAC3I,UAAA;AAAA,QAAA,qBAAC,OAAA,EAAI,WAAU,2BACX,UAAA;AAAA,UAAA,oBAAC,cAAA,EAAa,MAAMH,SAASI,UAAU,WAAU,gBAAc;AAAA,8BAC9D,YAAA,EAAW,SAAQ,aAAY,WAAU,iBAAgB,UAAA,aAAS;AAAA,8BAClE,MAAA,EAAK,MAAK,YAAW,WAAU,6EAA6E3D,eAAKsD,OAAAA,CAAO;AAAA,QAAA,GAC7H;AAAA,QACA,oBAAC,YAAA,EAAW,MAAK,SAAQ,SAASX,aAAa,OAAM,WAAU,UAAA,oBAAC,eAAA,EAAc,MAAMY,SAASI,UAAS,EAAA,CAAE;AAAA,MAAA,GAC5G;AAAA,MACA,oBAAC,SAAI,WAAU,wCACV3D,eAAK4D,IAAIC,CAAAA,QACN,qBAAC,OAAA,EAEG,SAAS,MAAMvD,cAAcuD,IAAIhB,EAAE,GACnC,WAAWY,IACP,gFACApD,eAAewD,IAAIhB,KACb,4DACA,gDACV,GAEA,UAAA;AAAA,QAAA,oBAAC,OAAA,EAAI,WAAWY,IAAI,iCAAiCpE,YAAYwE,IAAIC,KAAK,KAAK,gBAAgB,EAAA,CAAE;AAAA,QACjG,qBAAC,OAAA,EAAI,WAAU,kBACX,UAAA;AAAA,UAAA,oBAAC,cAAW,SAAQ,SAAQ,WAAU,oCAAoCD,cAAIE,MAAK;AAAA,UACnF,oBAAC,cAAW,SAAQ,WAAU,OAAM,aAAY,WAAU,kCAAkCF,UAAAA,IAAIG,SAAAA,CAAS;AAAA,QAAA,GAC7G;AAAA,QACCH,IAAIC,UAAU,aAAa,oBAAC,kBAAA,EAAiB,MAAK,WAAA,CAAU;AAAA,MAAA,KAdxDD,IAAIhB,EAeb,CACH,EAAA,CACL;AAAA,IAAA,GACJ;AAAA,wBAGC,OAAA,EAAI,WAAU,uDACV,UAAA,CAACM,kCACG,OAAA,EAAI,WAAU,2CACX,UAAA,oBAAC,YAAA,EAAW,SAAQ,SAAQ,OAAM,YAAW,UAAA,oCAAA,CAAiC,EAAA,CAClF,IAEA,qBAAA,UAAA,EAEI,UAAA;AAAA,MAAA,qBAAC,OAAA,EAAI,WAAWM,IAAI,kGAAkGC,kBAAkB,GACpI,UAAA;AAAA,QAAA,qBAAC,OAAA,EAAI,WAAU,mCACX,UAAA;AAAA,UAAA,oBAAC,OAAA,EAAI,WAAWD,IAAI,4BAA4BpE,YAAY8D,YAAYW,KAAK,CAAC,GAAE;AAAA,UAChF,qBAAC,OAAA,EAAI,WAAU,WACX,UAAA;AAAA,YAAA,oBAAC,cAAW,SAAQ,aAAY,WAAU,0BAA0BX,sBAAYY,MAAK;AAAA,YACpFZ,YAAYc,eAAe,oBAAC,YAAA,EAAW,SAAQ,WAAU,OAAM,aAAY,WAAU,YAAYd,UAAAA,YAAYc,YAAAA,CAAY;AAAA,UAAA,EAAA,CAC9H;AAAA,QAAA,GACJ;AAAA,QACA,qBAAC,OAAA,EAAI,WAAU,oCACX,UAAA;AAAA,UAAA,oBAAC,YAAA,EAAW,OAAOd,YAAYF,UAAU,cAAc,cAAc,MAAK,SAAQ,SAAS,MAAMD,aAAaG,YAAYN,IAAI,CAACM,YAAYF,OAAO,GAC7IE,UAAAA,YAAYF,UAAU,oBAAC,WAAA,EAAU,MAAMM,SAASW,MAAAA,CAAM,IAAK,oBAAC,UAAA,EAAS,MAAMX,SAASI,UAAS,GAClG;AAAA,UACA,oBAAC,QAAA,EACG,MAAK,SACL,OAAM,WACN,SAAS,MAAMb,cAAcK,YAAYN,EAAE,GAC3C,UAAUlC,eAAewC,YAAYN,IACrC,WAAWlC,eAAewC,YAAYN,KAAK,oBAAC,oBAAiB,MAAK,YAAU,IAAK,oBAAC,UAAA,EAAS,MAAMU,SAASI,SAAAA,IAAY,UAAA,UAAA,CAG1H;AAAA,QAAA,EAAA,CACJ;AAAA,MAAA,GACJ;AAAA,MAGA,qBAAC,OAAA,EAAI,WAAU,kDACX,UAAA;AAAA,QAAA,qBAAC,OAAA,EAAI,WAAU,yCACX,UAAA;AAAA,UAAA,oBAAC,YAAS,OAAM,YAAW,OAAOR,YAAYa,UAAU,MAAI,MAAA;AAAA,UAC5D,oBAAC,YAAS,OAAM,YAAW,OAAOxF,eAAe2E,YAAYgB,SAAS,GAAE;AAAA,UACxE,oBAAC,UAAA,EAAS,OAAM,YAAW,OAAOhB,YAAYF,UAAUzE,eAAe2E,YAAYiB,SAAS,IAAI,SAAA,CAAS;AAAA,UACzG,oBAAC,UAAA,EAAS,OAAM,YAAW,OAAOjB,YAAYkB,mBAAmBC,SAAYjG,eAAe8E,YAAYkB,cAAc,IAAI,IAAA,CAAI;AAAA,QAAA,GAClI;AAAA,QACA,qBAAC,OAAA,EAAI,WAAU,+BACX,UAAA;AAAA,UAAA,oBAAC,YAAS,OAAM,UAAS,OAAOlB,YAAYW,MAAMS,eAAe,WAAWpB,YAAYW,UAAU,UAAU,QAAQX,YAAYW,UAAU,aAAa,SAAS,SAAQ;AAAA,UACxK,oBAAC,YAAS,OAAM,cAAa,OAAOjC,OAAOsB,YAAYqB,SAAS,GAAE;AAAA,UAClE,oBAAC,UAAA,EAAS,OAAM,YAAW,OAAO3C,OAAOsB,YAAYsB,aAAa,GAAG,WAAWtB,YAAYsB,gBAAgB,EAAA,CAAE;AAAA,QAAA,GAClH;AAAA,QACCtB,YAAYuB,aACT,qBAAC,OAAA,EAAI,WAAU,iGACX,UAAA;AAAA,UAAA,qBAAC,OAAA,EAAI,WAAU,gCACX,UAAA;AAAA,YAAA,oBAAC,iBAAA,EAAgB,MAAMnB,SAASI,UAAU,WAAU,gBAAc;AAAA,gCACjE,YAAA,EAAW,SAAQ,WAAU,WAAU,gDAA+C,UAAA,aAAA,CAAU;AAAA,UAAA,GACrG;AAAA,8BACC,YAAA,EAAW,SAAQ,WAAU,WAAU,kEAAkER,sBAAYuB,UAAAA,CAAU;AAAA,QAAA,EAAA,CACpI;AAAA,MAAA,GAER;AAAA,2BAGC,OAAA,EAAI,WAAWjB,IAAI,qFAAqFC,kBAAkB,GACvH,UAAA;AAAA,QAAA,qBAAC,OAAA,EAAI,WAAU,2BACX,UAAA;AAAA,UAAA,oBAAC,aAAA,EAAY,MAAMH,SAASI,UAAU,WAAU,oBAAkB;AAAA,8BACjE,YAAA,EAAW,SAAQ,aAAY,WAAU,6BAA4B,UAAA,oBAAA,CAAiB;AAAA,QAAA,GAC3F;AAAA,4BACC,YAAA,EAAW,MAAK,SAAQ,SAAS,MAAMf,YAAYO,YAAYN,EAAE,GAAG,OAAM,gBAAe,UAAA,oBAAC,iBAAc,MAAMU,SAASI,UAAS,EAAA,CAAE;AAAA,MAAA,GACvI;AAAA,MACA,oBAAC,SAAI,WAAU,0BACVlD,wBACG,oBAAC,OAAA,EAAI,WAAU,2BAA0B,UAAA,oBAAC,oBAAiB,MAAK,QAAA,CAAO,GAAE,IACzEF,KAAK+C,WAAW,IAChB,oBAAC,OAAA,EAAI,WAAU,yCACX,UAAA,oBAAC,cAAW,SAAQ,SAAQ,OAAM,YAAW,UAAA,oBAAA,CAAiB,GAClE,IAEA,oBAAC,SAAI,WAAU,uDACV/C,eAAKqD,IAAI,CAACe,KAAKC,QACZ,oBAAC,UAAiB,IAAA,GAALA,GAAc,CAC9B,EAAA,CACL,EAAA,CAER;AAAA,IAAA,EAAA,CACJ,EAAA,CAER;AAAA,EAAA,GACJ;AAER;AAEA,SAAAC,SAAAC,IAAA;AAAA,QAAAC,IAAAC,EAAA,EAAA;AAAkB,QAAA;AAAA,IAAAC;AAAAA,IAAAC;AAAAA,IAAAC;AAAAA,IAAAC;AAAAA,IAAAC;AAAAA,EAAAA,IAAAP;AAEjB,MAAAQ;AAAA,MAAAP,EAAA,CAAA,MAAAQ,uBAAAC,IAAA,2BAAA,GAAA;AAEuBF,SAAA7B,IAAI,4DAA0DC,kBAAoB;AAACqB,WAAAO;AAAAA,EAAA,OAAA;AAAAA,SAAAP,EAAA,CAAA;AAAA,EAAA;AAAA,MAAAU;AAAA,MAAAV,SAAAE,OAAA;AAC/FQ,6BAAC,cAAmB,SAAA,WAAgB,OAAA,aAAsB,WAAA,qEAA0D;AAAaV,WAAAE;AAAAF,WAAAU;AAAAA,EAAA,OAAA;AAAAA,SAAAV,EAAA,CAAA;AAAA,EAAA;AAG7H,QAAAW,KAAAP,QAAQ;AACR,QAAAQ,KAAAN,aAAa;AACb,QAAAO,KAAAR,cAAc,SAAS;AACvB,QAAAS,KAAAT,cAAc,WAAW;AACzB,QAAAU,KAAAV,cAAc,UAAU;AAAkB,MAAAW;AAAA,MAAAhB,EAAA,CAAA,MAAAW,MAAAX,EAAA,CAAA,MAAAY,MAAAZ,EAAA,CAAA,MAAAa,MAAAb,EAAA,CAAA,MAAAc,MAAAd,SAAAe,IAAA;AANPC,SAAAtC,IACnC,oCACAiC,IACAC,IACAC,IACAC,IACAC,EACJ;AAACf,WAAAW;AAAAX,WAAAY;AAAAZ,WAAAa;AAAAb,WAAAc;AAAAd,WAAAe;AAAAf,WAAAgB;AAAAA,EAAA,OAAA;AAAAA,SAAAhB,EAAA,CAAA;AAAA,EAAA;AAAA,MAAAiB;AAAA,MAAAjB,EAAA,CAAA,MAAAgB,MAAAhB,UAAAG,OAAA;AAPDc,6BAAC,YAAA,EAAmB,SAAA,SAAmB,WAAAD,qBAO7B;AAAahB,WAAAgB;AAAAhB,YAAAG;AAAAH,YAAAiB;AAAAA,EAAA,OAAA;AAAAA,SAAAjB,EAAA,EAAA;AAAA,EAAA;AAAA,MAAAkB;AAAA,MAAAlB,EAAA,EAAA,MAAAU,MAAAV,UAAAiB,IAAA;AAT3BC,UAAA,qBAAA,OAAA,EAAgB,WAAAX,IACZG,UAAAA;AAAAA,MAAAA;AAAAA,MACAO;AAAAA,IAAAA,GAQJ;AAAMjB,YAAAU;AAAAV,YAAAiB;AAAAjB,YAAAkB;AAAAA,EAAA,OAAA;AAAAA,UAAAlB,EAAA,EAAA;AAAA,EAAA;AAAA,SAVNkB;AAUM;AAId,SAAAC,OAAApB,IAAA;AAAA,QAAAC,IAAAC,EAAA,EAAA;AAAgB,QAAA;AAAA,IAAAL;AAAAA,EAAAA,IAAAG;AACZ,QAAA,CAAAqB,UAAAC,WAAA,IAAgClG,cAAc;AAAE,MAAAoF;AAAA,MAAAP,SAAAoB,UAAA;AAGyBb,SAAAA,MAAMc,YAAW,CAAED,QAAQ;AAACpB,WAAAoB;AAAApB,WAAAO;AAAAA,EAAA,OAAA;AAAAA,SAAAP,EAAA,CAAA;AAAA,EAAA;AAAA,MAAAU;AAAA,MAAAV,EAAA,CAAA,MAAAJ,IAAAnF,SAAA;AACxFiG,SAAAd,IAAGnF,UACE,oBAAC,iBAAA,EAAsB,MAAA+D,SAAAI,UAA6B,WAAA,4BAAA,yBACnD,iBAAA,EAAsB,MAAAJ,SAAAI,UAA6B,WAAA,yBAAuB;AAAEoB,MAAA,CAAA,IAAAJ,IAAAnF;AAAAuF,WAAAU;AAAAA,EAAA,OAAA;AAAAA,SAAAV,EAAA,CAAA;AAAA,EAAA;AAAA,MAAAW;AAAA,MAAAX,EAAA,CAAA,MAAAJ,IAAA0B,WAAA;AAEGX,SAAA,IAAA/G,KAASgG,IAAG0B,SAAA,EAAAjH,eAAAA;AAA4B2F,MAAA,CAAA,IAAAJ,IAAA0B;AAAAtB,WAAAW;AAAAA,EAAA,OAAA;AAAAA,SAAAX,EAAA,CAAA;AAAA,EAAA;AAAA,MAAAY;AAAA,MAAAZ,SAAAW,IAAA;AAD9HC,SAAA,oBAAA,OAAA,EAAe,WAAA,kBACX,UAAA,oBAAC,YAAA,EAAmB,SAAA,WAAoB,WAAA,0CAA0CD,UAAAA,GAAAA,CAAyC,GAC/H;AAAMX,WAAAW;AAAAX,WAAAY;AAAAA,EAAA,OAAA;AAAAA,SAAAZ,EAAA,CAAA;AAAA,EAAA;AAAA,MAAAa;AAAA,MAAAb,EAAA,CAAA,MAAAJ,IAAA2B,QAAA;AAEDV,SAAAjB,IAAG2B,UAAW,oBAAC,MAAA,EAAU,MAAA,YAAqB,WAAA,oEAAmE,UAAA,SAAA,CAAM;AAAOvB,MAAA,CAAA,IAAAJ,IAAA2B;AAAAvB,WAAAa;AAAAA,EAAA,OAAA;AAAAA,SAAAb,EAAA,CAAA;AAAA,EAAA;AAAA,MAAAc;AAAA,MAAAd,EAAA,EAAA,MAAAJ,IAAA4B,YAAA;AAC9DV,SAAAxH,eAAesG,IAAG4B,UAAW;AAACxB,MAAA,EAAA,IAAAJ,IAAA4B;AAAAxB,YAAAc;AAAAA,EAAA,OAAA;AAAAA,SAAAd,EAAA,EAAA;AAAA,EAAA;AAAA,MAAAe;AAAA,MAAAf,UAAAc,IAAA;AAA/FC,6BAAC,YAAA,EAAmB,SAAA,WAAoB,WAAA,yBAAyBD,UAAAA,IAA+B;AAAad,YAAAc;AAAAd,YAAAe;AAAAA,EAAA,OAAA;AAAAA,SAAAf,EAAA,EAAA;AAAA,EAAA;AACxC,QAAAgB,KAAAI,YAAY;AAAY,MAAAH;AAAA,MAAAjB,UAAAgB,IAAA;AAA7EC,SAAAvC,IAAI,iDAAiDsC,EAAwB;AAAChB,YAAAgB;AAAAhB,YAAAiB;AAAAA,EAAA,OAAA;AAAAA,SAAAjB,EAAA,EAAA;AAAA,EAAA;AAAA,MAAAkB;AAAA,MAAAlB,EAAA,EAAA,MAAAQ,uBAAAC,IAAA,2BAAA,GAAA;AAA0CS,UAAA,oBAAA,QAAA,EAAQ,GAAA,qHAAA,CAAoH;AAAElB,YAAAkB;AAAAA,EAAA,OAAA;AAAAA,UAAAlB,EAAA,EAAA;AAAA,EAAA;AAAA,MAAAyB;AAAA,MAAAzB,UAAAiB,IAAA;AAAtQQ,UAAA,oBAAA,SAAgB,WAAAR,IAAqF,MAAA,gBAAuB,SAAA,aAAYC,UAAAA,IAAAA,CAA8H;AAAMlB,YAAAiB;AAAAjB,YAAAyB;AAAAA,EAAA,OAAA;AAAAA,UAAAzB,EAAA,EAAA;AAAA,EAAA;AAAA,MAAA0B;AAAA,MAAA1B,EAAA,EAAA,MAAAyB,OAAAzB,UAAAa,MAAAb,EAAA,EAAA,MAAAe,IAAA;AAHhRW,wCAAe,WAAA,oCACVb,UAAAA;AAAAA,MAAAA;AAAAA,MACDE;AAAAA,MACAU;AAAAA,IAAAA,GACJ;AAAMzB,YAAAyB;AAAAzB,YAAAa;AAAAb,YAAAe;AAAAf,YAAA0B;AAAAA,EAAA,OAAA;AAAAA,UAAA1B,EAAA,EAAA;AAAA,EAAA;AAAA,MAAA2B;AAAA,MAAA3B,EAAA,EAAA,MAAAO,MAAAP,EAAA,EAAA,MAAA0B,OAAA1B,EAAA,EAAA,MAAAU,MAAAV,UAAAY,IAAA;AAXVe,UAAA,qBAAA,OAAA,EAAe,WAAA,0CAAkD,SAAApB,IAC5DG,UAAAA;AAAAA,MAAAA;AAAAA,MAGDE;AAAAA,MAGAc;AAAAA,IAAAA,GAKJ;AAAM1B,YAAAO;AAAAP,YAAA0B;AAAA1B,YAAAU;AAAAV,YAAAY;AAAAZ,YAAA2B;AAAAA,EAAA,OAAA;AAAAA,UAAA3B,EAAA,EAAA;AAAA,EAAA;AAAA,MAAA4B;AAAA,MAAA5B,UAAAoB,YAAApB,EAAA,EAAA,MAAAJ,IAAAlF,SAAAsF,EAAA,EAAA,MAAAJ,IAAApE,QAAAwE,EAAA,EAAA,MAAAJ,IAAAiC,QAAA;AACLD,UAAAR,YACG,qBAAA,OAAA,EAAe,WAAA,uBACVxB,UAAAA;AAAAA,MAAAA,IAAGlF,SACA,oBAAA,OAAA,EAAe,WAAA,yFACX,UAAA,oBAAC,YAAA,EAAmB,SAAA,WAAoB,WAAA,kEAAkEkF,UAAAA,IAAGlF,OAAO,GACxH;AAAA,MAEHkF,IAAGpE,KAAA+C,SAAA,KACA,oBAAA,OAAA,EAAe,WAAA,0HACVqB,UAAAA,IAAGpE,KAAAqD,IAAAiD,KAEH,EAAA,CACL;AAAA,MAEHlC,IAAGiC,WAAAtC,UACA,qBAAA,OAAA,EAAe,WAAA,mGACX,UAAA;AAAA,QAAA,oBAAC,YAAA,EAAmB,SAAA,WAAoB,WAAA,oEAAmE,UAAA,UAAM;AAAA,QACjH,oBAAA,OAAA,EAAe,WAAA,8FAA8FwC,UAAAA,KAAAC,UAAepC,IAAGiC,QAAA,MAAA,CAAgB,EAAA,CAAE;AAAA,MAAA,EAAA,CACrJ;AAAA,IAAA,GAER;AACH7B,YAAAoB;AAAApB,MAAA,EAAA,IAAAJ,IAAAlF;AAAAsF,MAAA,EAAA,IAAAJ,IAAApE;AAAAwE,MAAA,EAAA,IAAAJ,IAAAiC;AAAA7B,YAAA4B;AAAAA,EAAA,OAAA;AAAAA,UAAA5B,EAAA,EAAA;AAAA,EAAA;AAAA,MAAAiC;AAAA,MAAAjC,EAAA,EAAA,MAAA2B,OAAA3B,UAAA4B,KAAA;AAnCLK,UAAA,qBAAA,OAAA,EAAe,WAAA,kFACXN,UAAAA;AAAAA,MAAAA;AAAAA,MAaCC;AAAAA,IAAAA,GAsBL;AAAM5B,YAAA2B;AAAA3B,YAAA4B;AAAA5B,YAAAiC;AAAAA,EAAA,OAAA;AAAAA,UAAAjC,EAAA,EAAA;AAAA,EAAA;AAAA,SApCNiC;AAoCM;AAvCd,SAAAH,MAAAI,MAAAC,GAAA;AAAA,SA2BgC,oBAAA,OAAA,EAAuB,WAAA,gFAAgFD,mBAAK;AAAM;"}
|