@rebasepro/plugin-insights 0.0.1-canary.4f204c2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +6 -0
- package/dist/common/src/collections/CollectionRegistry.d.ts +56 -0
- package/dist/common/src/collections/index.d.ts +1 -0
- package/dist/common/src/data/buildRebaseData.d.ts +14 -0
- package/dist/common/src/index.d.ts +3 -0
- package/dist/common/src/util/builders.d.ts +57 -0
- package/dist/common/src/util/callbacks.d.ts +6 -0
- package/dist/common/src/util/collections.d.ts +11 -0
- package/dist/common/src/util/common.d.ts +2 -0
- package/dist/common/src/util/conditions.d.ts +26 -0
- package/dist/common/src/util/entities.d.ts +58 -0
- package/dist/common/src/util/enums.d.ts +3 -0
- package/dist/common/src/util/index.d.ts +16 -0
- package/dist/common/src/util/navigation_from_path.d.ts +34 -0
- package/dist/common/src/util/navigation_utils.d.ts +20 -0
- package/dist/common/src/util/parent_references_from_path.d.ts +6 -0
- package/dist/common/src/util/paths.d.ts +14 -0
- package/dist/common/src/util/permissions.d.ts +5 -0
- package/dist/common/src/util/references.d.ts +2 -0
- package/dist/common/src/util/relations.d.ts +22 -0
- package/dist/common/src/util/resolutions.d.ts +72 -0
- package/dist/common/src/util/storage.d.ts +24 -0
- package/dist/core/src/components/AIIcon.d.ts +16 -0
- package/dist/core/src/components/ConfirmationDialog.d.ts +9 -0
- package/dist/core/src/components/Debug/UIReferenceView.d.ts +1 -0
- package/dist/core/src/components/Debug/UIStyleGuide.d.ts +1 -0
- package/dist/core/src/components/ErrorTooltip.d.ts +2 -0
- package/dist/core/src/components/ErrorView.d.ts +21 -0
- package/dist/core/src/components/LanguageToggle.d.ts +1 -0
- package/dist/core/src/components/LoginView/LoginView.d.ts +68 -0
- package/dist/core/src/components/LoginView/index.d.ts +2 -0
- package/dist/core/src/components/NotFoundPage.d.ts +1 -0
- package/dist/core/src/components/RebaseAuth.d.ts +10 -0
- package/dist/core/src/components/RebaseLogo.d.ts +7 -0
- package/dist/core/src/components/UnsavedChangesDialog.d.ts +9 -0
- package/dist/core/src/components/UserDisplay.d.ts +7 -0
- package/dist/core/src/components/UserSelectPopover.d.ts +62 -0
- package/dist/core/src/components/UserSettingsView.d.ts +1 -0
- package/dist/core/src/components/common/index.d.ts +6 -0
- package/dist/core/src/components/common/table_height.d.ts +5 -0
- package/dist/core/src/components/common/types.d.ts +63 -0
- package/dist/core/src/components/common/useColumnsIds.d.ts +9 -0
- package/dist/core/src/components/common/useDataTableController.d.ts +45 -0
- package/dist/core/src/components/common/useDebouncedData.d.ts +9 -0
- package/dist/core/src/components/common/useScrollRestoration.d.ts +14 -0
- package/dist/core/src/components/index.d.ts +16 -0
- package/dist/core/src/contexts/AdminModeController.d.ts +4 -0
- package/dist/core/src/contexts/AnalyticsContext.d.ts +3 -0
- package/dist/core/src/contexts/AuthControllerContext.d.ts +3 -0
- package/dist/core/src/contexts/CustomizationControllerContext.d.ts +3 -0
- package/dist/core/src/contexts/DataDriverContext.d.ts +3 -0
- package/dist/core/src/contexts/DatabaseAdminContext.d.ts +3 -0
- package/dist/core/src/contexts/DialogsProvider.d.ts +4 -0
- package/dist/core/src/contexts/EffectiveRoleController.d.ts +4 -0
- package/dist/core/src/contexts/InternalUserManagementContext.d.ts +3 -0
- package/dist/core/src/contexts/ModeController.d.ts +4 -0
- package/dist/core/src/contexts/RebaseClientInstanceContext.d.ts +6 -0
- package/dist/core/src/contexts/RebaseDataContext.d.ts +3 -0
- package/dist/core/src/contexts/SnackbarProvider.d.ts +2 -0
- package/dist/core/src/contexts/StorageSourceContext.d.ts +3 -0
- package/dist/core/src/contexts/UserConfigurationPersistenceContext.d.ts +3 -0
- package/dist/core/src/contexts/index.d.ts +13 -0
- package/dist/core/src/core/PluginLifecycleManager.d.ts +17 -0
- package/dist/core/src/core/PluginProviderStack.d.ts +21 -0
- package/dist/core/src/core/Rebase.d.ts +14 -0
- package/dist/core/src/core/RebaseProps.d.ts +136 -0
- package/dist/core/src/core/RebaseRouter.d.ts +4 -0
- package/dist/core/src/core/RebaseRoutes.d.ts +17 -0
- package/dist/core/src/core/index.d.ts +4 -0
- package/dist/core/src/hooks/ApiConfigContext.d.ts +24 -0
- package/dist/core/src/hooks/data/delete.d.ts +31 -0
- package/dist/core/src/hooks/data/save.d.ts +34 -0
- package/dist/core/src/hooks/data/useCollectionFetch.d.ts +51 -0
- package/dist/core/src/hooks/data/useData.d.ts +13 -0
- package/dist/core/src/hooks/data/useDataOrder.d.ts +12 -0
- package/dist/core/src/hooks/data/useEntityFetch.d.ts +38 -0
- package/dist/core/src/hooks/data/useRelationSelector.d.ts +52 -0
- package/dist/core/src/hooks/data/useUserSelector.d.ts +31 -0
- package/dist/core/src/hooks/index.d.ts +37 -0
- package/dist/core/src/hooks/useAdminModeController.d.ts +19 -0
- package/dist/core/src/hooks/useAnalyticsController.d.ts +5 -0
- package/dist/core/src/hooks/useAuthController.d.ts +11 -0
- package/dist/core/src/hooks/useAuthSubscription.d.ts +2 -0
- package/dist/core/src/hooks/useBackendStorageSource.d.ts +30 -0
- package/dist/core/src/hooks/useBridgeRegistration.d.ts +18 -0
- package/dist/core/src/hooks/useBrowserTitleAndIcon.d.ts +6 -0
- package/dist/core/src/hooks/useBuildAdminModeController.d.ts +6 -0
- package/dist/core/src/hooks/useBuildEffectiveRoleController.d.ts +8 -0
- package/dist/core/src/hooks/useBuildLocalConfigurationPersistence.d.ts +2 -0
- package/dist/core/src/hooks/useBuildModeController.d.ts +6 -0
- package/dist/core/src/hooks/useClipboard.d.ts +57 -0
- package/dist/core/src/hooks/useCollapsedGroups.d.ts +12 -0
- package/dist/core/src/hooks/useCustomizationController.d.ts +11 -0
- package/dist/core/src/hooks/useDialogsController.d.ts +11 -0
- package/dist/core/src/hooks/useEffectiveRoleController.d.ts +7 -0
- package/dist/core/src/hooks/useInternalUserManagementController.d.ts +12 -0
- package/dist/core/src/hooks/useLargeLayout.d.ts +1 -0
- package/dist/core/src/hooks/useModeController.d.ts +19 -0
- package/dist/core/src/hooks/usePermissions.d.ts +12 -0
- package/dist/core/src/hooks/useRebaseClient.d.ts +5 -0
- package/dist/core/src/hooks/useRebaseContext.d.ts +11 -0
- package/dist/core/src/hooks/useRebaseRegistry.d.ts +34 -0
- package/dist/core/src/hooks/useSlot.d.ts +18 -0
- package/dist/core/src/hooks/useSnackbarController.d.ts +20 -0
- package/dist/core/src/hooks/useStorageSource.d.ts +7 -0
- package/dist/core/src/hooks/useStudioBridge.d.ts +91 -0
- package/dist/core/src/hooks/useTranslation.d.ts +17 -0
- package/dist/core/src/hooks/useUnsavedChangesDialog.d.ts +12 -0
- package/dist/core/src/hooks/useUserConfigurationPersistence.d.ts +8 -0
- package/dist/core/src/hooks/useValidateAuthenticator.d.ts +21 -0
- package/dist/core/src/i18n/RebaseI18nProvider.d.ts +33 -0
- package/dist/core/src/index.d.ts +15 -0
- package/dist/core/src/internal/common.d.ts +3 -0
- package/dist/core/src/internal/useRestoreScroll.d.ts +6 -0
- package/dist/core/src/locales/de.d.ts +2 -0
- package/dist/core/src/locales/en.d.ts +10 -0
- package/dist/core/src/locales/es.d.ts +10 -0
- package/dist/core/src/locales/fr.d.ts +2 -0
- package/dist/core/src/locales/hi.d.ts +2 -0
- package/dist/core/src/locales/it.d.ts +2 -0
- package/dist/core/src/locales/pt.d.ts +7 -0
- package/dist/core/src/util/constants.d.ts +1 -0
- package/dist/core/src/util/createFormexStub.d.ts +2 -0
- package/dist/core/src/util/entity_cache.d.ts +27 -0
- package/dist/core/src/util/enums.d.ts +5 -0
- package/dist/core/src/util/icon_list.d.ts +5 -0
- package/dist/core/src/util/icon_synonyms.d.ts +1 -0
- package/dist/core/src/util/icons.d.ts +20 -0
- package/dist/core/src/util/index.d.ts +10 -0
- package/dist/core/src/util/previews.d.ts +4 -0
- package/dist/core/src/util/useStorageUploadController.d.ts +38 -0
- package/dist/core/src/util/useTraceUpdate.d.ts +2 -0
- package/dist/formex/src/Field.d.ts +52 -0
- package/dist/formex/src/Formex.d.ts +7 -0
- package/dist/formex/src/index.d.ts +5 -0
- package/dist/formex/src/types.d.ts +40 -0
- package/dist/formex/src/useCreateFormex.d.ts +14 -0
- package/dist/formex/src/utils.d.ts +16 -0
- package/dist/index.es.js +945 -0
- package/dist/index.es.js.map +1 -0
- package/dist/index.umd.js +944 -0
- package/dist/index.umd.js.map +1 -0
- package/dist/plugin-insights/src/components/CollectionInsightsInline.d.ts +16 -0
- package/dist/plugin-insights/src/components/HomeCardInsightSlot.d.ts +16 -0
- package/dist/plugin-insights/src/components/HomeInsightsSlot.d.ts +13 -0
- package/dist/plugin-insights/src/components/InsightWidget.d.ts +19 -0
- package/dist/plugin-insights/src/components/InsightWidgetSkeleton.d.ts +20 -0
- package/dist/plugin-insights/src/components/InsightsScorecardView.d.ts +19 -0
- package/dist/plugin-insights/src/engine/InsightsCache.d.ts +18 -0
- package/dist/plugin-insights/src/engine/InsightsProvider.d.ts +22 -0
- package/dist/plugin-insights/src/engine/useInsightsData.d.ts +17 -0
- package/dist/plugin-insights/src/index.d.ts +8 -0
- package/dist/plugin-insights/src/types/engine.d.ts +79 -0
- package/dist/plugin-insights/src/types/index.d.ts +2 -0
- package/dist/plugin-insights/src/types/widgets.d.ts +59 -0
- package/dist/plugin-insights/src/useInsightsPlugin.d.ts +37 -0
- package/dist/types/src/controllers/analytics_controller.d.ts +7 -0
- package/dist/types/src/controllers/auth.d.ts +119 -0
- package/dist/types/src/controllers/client.d.ts +170 -0
- package/dist/types/src/controllers/collection_registry.d.ts +45 -0
- package/dist/types/src/controllers/customization_controller.d.ts +60 -0
- package/dist/types/src/controllers/data.d.ts +168 -0
- package/dist/types/src/controllers/data_driver.d.ts +160 -0
- package/dist/types/src/controllers/database_admin.d.ts +11 -0
- package/dist/types/src/controllers/dialogs_controller.d.ts +36 -0
- package/dist/types/src/controllers/effective_role.d.ts +4 -0
- package/dist/types/src/controllers/email.d.ts +34 -0
- package/dist/types/src/controllers/index.d.ts +18 -0
- package/dist/types/src/controllers/local_config_persistence.d.ts +20 -0
- package/dist/types/src/controllers/navigation.d.ts +213 -0
- package/dist/types/src/controllers/registry.d.ts +54 -0
- package/dist/types/src/controllers/side_dialogs_controller.d.ts +67 -0
- package/dist/types/src/controllers/side_entity_controller.d.ts +90 -0
- package/dist/types/src/controllers/snackbar.d.ts +24 -0
- package/dist/types/src/controllers/storage.d.ts +171 -0
- package/dist/types/src/index.d.ts +4 -0
- package/dist/types/src/rebase_context.d.ts +105 -0
- package/dist/types/src/types/backend.d.ts +536 -0
- package/dist/types/src/types/builders.d.ts +15 -0
- package/dist/types/src/types/chips.d.ts +5 -0
- package/dist/types/src/types/collections.d.ts +856 -0
- package/dist/types/src/types/cron.d.ts +102 -0
- package/dist/types/src/types/data_source.d.ts +64 -0
- package/dist/types/src/types/entities.d.ts +145 -0
- package/dist/types/src/types/entity_actions.d.ts +98 -0
- package/dist/types/src/types/entity_callbacks.d.ts +173 -0
- package/dist/types/src/types/entity_link_builder.d.ts +7 -0
- package/dist/types/src/types/entity_overrides.d.ts +10 -0
- package/dist/types/src/types/entity_views.d.ts +61 -0
- package/dist/types/src/types/export_import.d.ts +21 -0
- package/dist/types/src/types/index.d.ts +23 -0
- package/dist/types/src/types/locales.d.ts +4 -0
- package/dist/types/src/types/modify_collections.d.ts +5 -0
- package/dist/types/src/types/plugins.d.ts +279 -0
- package/dist/types/src/types/properties.d.ts +1176 -0
- package/dist/types/src/types/property_config.d.ts +70 -0
- package/dist/types/src/types/relations.d.ts +336 -0
- package/dist/types/src/types/slots.d.ts +252 -0
- package/dist/types/src/types/translations.d.ts +870 -0
- package/dist/types/src/types/user_management_delegate.d.ts +121 -0
- package/dist/types/src/types/websockets.d.ts +78 -0
- package/dist/types/src/users/index.d.ts +2 -0
- package/dist/types/src/users/roles.d.ts +22 -0
- package/dist/types/src/users/user.d.ts +46 -0
- package/dist/ui/src/components/Alert.d.ts +12 -0
- package/dist/ui/src/components/Autocomplete.d.ts +21 -0
- package/dist/ui/src/components/Avatar.d.ts +11 -0
- package/dist/ui/src/components/Badge.d.ts +8 -0
- package/dist/ui/src/components/BooleanSwitch.d.ts +14 -0
- package/dist/ui/src/components/BooleanSwitchWithLabel.d.ts +17 -0
- package/dist/ui/src/components/Button.d.ts +14 -0
- package/dist/ui/src/components/Card.d.ts +9 -0
- package/dist/ui/src/components/CenteredView.d.ts +9 -0
- package/dist/ui/src/components/Checkbox.d.ts +13 -0
- package/dist/ui/src/components/Chip.d.ts +26 -0
- package/dist/ui/src/components/CircularProgress.d.ts +5 -0
- package/dist/ui/src/components/CircularProgressCenter.d.ts +11 -0
- package/dist/ui/src/components/Collapse.d.ts +9 -0
- package/dist/ui/src/components/ColorPicker.d.ts +30 -0
- package/dist/ui/src/components/Container.d.ts +8 -0
- package/dist/ui/src/components/DateTimeField.d.ts +24 -0
- package/dist/ui/src/components/DebouncedTextField.d.ts +2 -0
- package/dist/ui/src/components/Dialog.d.ts +39 -0
- package/dist/ui/src/components/DialogActions.d.ts +7 -0
- package/dist/ui/src/components/DialogContent.d.ts +7 -0
- package/dist/ui/src/components/DialogTitle.d.ts +10 -0
- package/dist/ui/src/components/ErrorBoundary.d.ts +11 -0
- package/dist/ui/src/components/ExpandablePanel.d.ts +12 -0
- package/dist/ui/src/components/FileUpload.d.ts +23 -0
- package/dist/ui/src/components/IconButton.d.ts +12 -0
- package/dist/ui/src/components/InfoLabel.d.ts +5 -0
- package/dist/ui/src/components/InputLabel.d.ts +11 -0
- package/dist/ui/src/components/Label.d.ts +7 -0
- package/dist/ui/src/components/LoadingButton.d.ts +7 -0
- package/dist/ui/src/components/Markdown.d.ts +10 -0
- package/dist/ui/src/components/Menu.d.ts +23 -0
- package/dist/ui/src/components/Menubar.d.ts +80 -0
- package/dist/ui/src/components/MultiSelect.d.ts +48 -0
- package/dist/ui/src/components/Paper.d.ts +6 -0
- package/dist/ui/src/components/Popover.d.ts +24 -0
- package/dist/ui/src/components/RadioGroup.d.ts +28 -0
- package/dist/ui/src/components/ResizablePanels.d.ts +18 -0
- package/dist/ui/src/components/SearchBar.d.ts +22 -0
- package/dist/ui/src/components/Select.d.ts +43 -0
- package/dist/ui/src/components/Separator.d.ts +5 -0
- package/dist/ui/src/components/Sheet.d.ts +22 -0
- package/dist/ui/src/components/Skeleton.d.ts +6 -0
- package/dist/ui/src/components/Slider.d.ts +21 -0
- package/dist/ui/src/components/Table.d.ts +34 -0
- package/dist/ui/src/components/Tabs.d.ts +19 -0
- package/dist/ui/src/components/TextField.d.ts +58 -0
- package/dist/ui/src/components/TextareaAutosize.d.ts +43 -0
- package/dist/ui/src/components/ToggleButtonGroup.d.ts +30 -0
- package/dist/ui/src/components/Tooltip.d.ts +19 -0
- package/dist/ui/src/components/Typography.d.ts +36 -0
- package/dist/ui/src/components/VirtualTable/VirtualTable.d.ts +11 -0
- package/dist/ui/src/components/VirtualTable/VirtualTableCell.d.ts +21 -0
- package/dist/ui/src/components/VirtualTable/VirtualTableHeader.d.ts +29 -0
- package/dist/ui/src/components/VirtualTable/VirtualTableHeaderRow.d.ts +2 -0
- package/dist/ui/src/components/VirtualTable/VirtualTableProps.d.ts +243 -0
- package/dist/ui/src/components/VirtualTable/VirtualTableRow.d.ts +3 -0
- package/dist/ui/src/components/VirtualTable/index.d.ts +3 -0
- package/dist/ui/src/components/VirtualTable/types.d.ts +38 -0
- package/dist/ui/src/components/common/SelectInputLabel.d.ts +5 -0
- package/dist/ui/src/components/index.d.ts +53 -0
- package/dist/ui/src/hooks/PortalContainerContext.d.ts +31 -0
- package/dist/ui/src/hooks/index.d.ts +6 -0
- package/dist/ui/src/hooks/useDebounceCallback.d.ts +1 -0
- package/dist/ui/src/hooks/useDebounceValue.d.ts +1 -0
- package/dist/ui/src/hooks/useDebouncedCallback.d.ts +1 -0
- package/dist/ui/src/hooks/useInjectStyles.d.ts +7 -0
- package/dist/ui/src/hooks/useOutsideAlerter.d.ts +5 -0
- package/dist/ui/src/icons/GitHubIcon.d.ts +2 -0
- package/dist/ui/src/icons/HandleIcon.d.ts +1 -0
- package/dist/ui/src/icons/Icon.d.ts +20 -0
- package/dist/ui/src/icons/cool_icon_keys.d.ts +1 -0
- package/dist/ui/src/icons/icon_keys.d.ts +1 -0
- package/dist/ui/src/icons/index.d.ts +6 -0
- package/dist/ui/src/index.d.ts +5 -0
- package/dist/ui/src/styles.d.ts +12 -0
- package/dist/ui/src/util/chip_colors.d.ts +4 -0
- package/dist/ui/src/util/cls.d.ts +2 -0
- package/dist/ui/src/util/debounce.d.ts +10 -0
- package/dist/ui/src/util/hash.d.ts +1 -0
- package/dist/ui/src/util/index.d.ts +4 -0
- package/dist/ui/src/util/key_to_icon_component.d.ts +1 -0
- package/package.json +80 -0
- package/src/components/CollectionInsightsInline.tsx +30 -0
- package/src/components/HomeCardInsightSlot.tsx +36 -0
- package/src/components/HomeInsightsSlot.tsx +30 -0
- package/src/components/InsightWidget.tsx +65 -0
- package/src/components/InsightWidgetSkeleton.tsx +122 -0
- package/src/components/InsightsScorecardView.tsx +160 -0
- package/src/engine/InsightsCache.ts +52 -0
- package/src/engine/InsightsProvider.tsx +38 -0
- package/src/engine/useInsightsData.ts +100 -0
- package/src/index.ts +22 -0
- package/src/types/engine.ts +85 -0
- package/src/types/index.ts +5 -0
- package/src/types/widgets.ts +66 -0
- package/src/useInsightsPlugin.tsx +117 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.umd.js","sources":["../src/engine/InsightsCache.ts","../src/engine/InsightsProvider.tsx","../src/engine/useInsightsData.ts","../src/components/InsightsScorecardView.tsx","../src/components/InsightWidgetSkeleton.tsx","../src/components/InsightWidget.tsx","../src/components/HomeCardInsightSlot.tsx","../src/components/HomeInsightsSlot.tsx","../src/components/CollectionInsightsInline.tsx","../src/useInsightsPlugin.tsx"],"sourcesContent":["import type { InsightDataResult } from \"../types\";\n\ninterface CacheEntry {\n data: InsightDataResult;\n timestamp: number;\n}\n\n/**\n * In-memory cache for insight query results.\n * Supports TTL-based expiry and inflight request deduplication\n * to prevent redundant network requests when multiple widgets\n * share the same query.\n */\nexport class InsightsCache {\n private cache = new Map<string, CacheEntry>();\n private inflight = new Map<string, Promise<InsightDataResult>>();\n\n constructor(private ttl: number = 60_000) {}\n\n get(key: string): InsightDataResult | null {\n const entry = this.cache.get(key);\n if (!entry) return null;\n if (Date.now() - entry.timestamp > this.ttl) {\n this.cache.delete(key);\n return null;\n }\n return entry.data;\n }\n\n set(key: string, data: InsightDataResult): void {\n this.cache.set(key, { data, timestamp: Date.now() });\n this.inflight.delete(key);\n }\n\n getInflight(key: string): Promise<InsightDataResult> | null {\n return this.inflight.get(key) ?? null;\n }\n\n setInflight(key: string, promise: Promise<InsightDataResult>): void {\n this.inflight.set(key, promise);\n }\n\n invalidate(key?: string): void {\n if (key) {\n this.cache.delete(key);\n this.inflight.delete(key);\n } else {\n this.cache.clear();\n this.inflight.clear();\n }\n }\n}\n","import React, { createContext, useContext, useMemo, type PropsWithChildren } from \"react\";\nimport { InsightsCache } from \"./InsightsCache\";\n\ninterface InsightsContextValue {\n cache: InsightsCache;\n}\n\nconst InsightsContext = createContext<InsightsContextValue | null>(null);\n\n/**\n * Root-level provider for the insights data engine.\n * Injected automatically by the plugin via `providers: [{ scope: \"root\" }]`.\n *\n * Manages a single `InsightsCache` instance shared by all insight widgets\n * for TTL-based caching and inflight request deduplication.\n */\nexport function InsightsProvider({\n cacheTTL,\n children\n}: PropsWithChildren<{ cacheTTL?: number }>) {\n const cache = useMemo(() => new InsightsCache(cacheTTL), [cacheTTL]);\n const value = useMemo(() => ({ cache }), [cache]);\n\n return (\n <InsightsContext.Provider value={value}>\n {children}\n </InsightsContext.Provider>\n );\n}\n\n/**\n * Access the insights cache (for advanced usage).\n * Returns null when called outside of an `InsightsProvider`\n * (e.g. during auth-loading phase before plugin providers mount).\n */\nexport function useInsightsEngine(): InsightsContextValue | null {\n return useContext(InsightsContext);\n}\n","import { useEffect, useState } from \"react\";\nimport type { InsightDefinition, InsightDataResult } from \"../types\";\nimport { useInsightsEngine } from \"./InsightsProvider\";\nimport { useAuthController } from \"@rebasepro/core\";\n\n/**\n * Hook that fetches and caches data for a single insight definition.\n *\n * Calls the definition's own `data()` callback and manages:\n * - TTL-based caching via InsightsCache\n * - Inflight request deduplication (multiple mounts of the same widget)\n * - Loading and error state management\n *\n * @param definition - The insight to fetch data for\n * @param collectionSlug - Optional collection context for cache key scoping\n */\nexport function useInsightsData(\n definition: InsightDefinition,\n collectionSlug?: string\n): {\n data: InsightDataResult | null;\n loading: boolean;\n error: Error | null;\n} {\n const engine = useInsightsEngine();\n const cache = engine?.cache ?? null;\n const { initialLoading, authLoading, user, loginSkipped } = useAuthController();\n const authReady = !initialLoading && !authLoading && (Boolean(user) || loginSkipped);\n const [data, setData] = useState<InsightDataResult | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const cacheKey = `${definition.id}:${collectionSlug ?? \"global\"}`;\n\n useEffect(() => {\n // Keep showing skeleton until both auth and engine are ready\n if (!authReady || !cache) {\n return;\n }\n\n let cancelled = false;\n\n // 1. Check cache\n const cached = cache.get(cacheKey);\n if (cached) {\n setData(cached);\n setLoading(false);\n return;\n }\n\n // 2. Check inflight — deduplicate concurrent requests for the same widget\n const inflight = cache.getInflight(cacheKey);\n if (inflight) {\n setLoading(true);\n inflight\n .then((result) => {\n if (!cancelled) {\n setData(result);\n }\n })\n .catch((err) => {\n if (!cancelled) setError(err instanceof Error ? err : new Error(String(err)));\n })\n .finally(() => {\n if (!cancelled) setLoading(false);\n });\n return;\n }\n\n // 3. Fresh fetch — invoke the definition's own data callback\n setLoading(true);\n setError(null);\n\n const promise = definition.data();\n\n cache.setInflight(cacheKey, promise);\n\n promise\n .then((result) => {\n cache.set(cacheKey, result);\n if (!cancelled) {\n setData(result);\n }\n })\n .catch((err) => {\n if (!cancelled) {\n setError(err instanceof Error ? err : new Error(String(err)));\n }\n })\n .finally(() => {\n if (!cancelled) setLoading(false);\n });\n\n return () => {\n cancelled = true;\n };\n }, [definition.id, definition.data, collectionSlug, cacheKey, cache, authReady]);\n\n return { data, loading, error };\n}\n","import React, { useRef, useState } from \"react\";\nimport { getIcon } from \"@rebasepro/core\";\nimport { cls, defaultBorderMixin } from \"@rebasepro/ui\";\nimport type { DataRow, ScorecardConfig, ScorecardFormat } from \"../types\";\n\nfunction formatNumber(value: number, format?: ScorecardFormat): string {\n if (value === null || value === undefined) return \"N/A\";\n\n const options: Intl.NumberFormatOptions = {\n style: format?.style ?? \"decimal\",\n notation: format?.notation ?? \"standard\",\n maximumFractionDigits: format?.decimals ?? 1,\n minimumFractionDigits: format?.decimals ?? 1,\n };\n\n if (format?.style === \"currency\") {\n options.currency = format.currency ?? \"USD\";\n }\n\n let formatted = new Intl.NumberFormat(\"en-US\", options).format(value);\n\n if (format?.showSign && value > 0) {\n formatted = \"+\" + formatted;\n }\n\n return formatted;\n}\n\n/**\n * Scorecard widget for the Rebase design system.\n *\n * Renders a single KPI metric with optional comparison value and icon.\n * Uses Tailwind `dark:` classes — no JS dark mode detection.\n * Icons are resolved via `getIcon` from `@rebasepro/core`.\n */\nexport function InsightsScorecardView({\n config,\n data,\n title,\n compact = false,\n embedded = false,\n}: {\n config: ScorecardConfig;\n data: DataRow;\n title: string;\n compact?: boolean;\n /** When true, skip own border/bg since the parent card provides them. */\n embedded?: boolean;\n}) {\n const containerRef = useRef<HTMLDivElement>(null);\n const [containerWidth, setContainerWidth] = useState<number | null>(null);\n\n React.useLayoutEffect(() => {\n if (!containerRef.current) return;\n // Read initial width synchronously before paint\n setContainerWidth(containerRef.current.offsetWidth);\n const observer = new ResizeObserver((entries) => {\n for (const entry of entries) {\n setContainerWidth(entry.contentRect.width);\n }\n });\n observer.observe(containerRef.current);\n return () => observer.disconnect();\n }, []);\n\n const mainValue = data[config.value.field];\n const formattedValue = typeof mainValue === \"number\"\n ? formatNumber(mainValue, config.value.format)\n : String(mainValue ?? \"N/A\");\n\n // Comparison rendering\n let comparisonElement: React.ReactNode = null;\n if (config.comparison) {\n const comparisonValue = data[config.comparison.field];\n if (typeof comparisonValue === \"number\") {\n const formattedComparison = formatNumber(comparisonValue, config.comparison.format);\n const isPositive = comparisonValue > 0;\n const isNegative = comparisonValue < 0;\n\n let colorClass = \"text-surface-500 dark:text-surface-400\";\n if (config.comparison.intent === \"increase_is_good\") {\n if (isPositive) colorClass = \"text-emerald-500\";\n if (isNegative) colorClass = \"text-red-500\";\n } else if (config.comparison.intent === \"decrease_is_good\") {\n if (isPositive) colorClass = \"text-red-500\";\n if (isNegative) colorClass = \"text-emerald-500\";\n }\n\n comparisonElement = (\n <span className={`font-medium ${compact ? \"text-[10px]\" : \"text-xs\"} ${colorClass}`}>\n {formattedComparison}\n </span>\n );\n }\n }\n\n const isSmall = compact || (containerWidth !== null && containerWidth < 200);\n\n // Resolve icon via getIcon (Lucide-based resolution)\n const iconElement = config.icon\n ? getIcon(config.icon, \"text-surface-400 dark:text-surface-500\", undefined, isSmall ? 14 : 18)\n : null;\n\n // ── Compact card-inline layout ──────────────────────────────────────\n if (compact) {\n return (\n <div className={cls(\"flex flex-col gap-0.5 px-2.5 py-2 rounded-md bg-transparent border min-w-0\", defaultBorderMixin)}>\n <span className=\"text-[10px] uppercase tracking-wider text-surface-400 dark:text-surface-500 truncate\">\n {title}\n </span>\n <div className=\"flex items-baseline gap-1.5\">\n <span className=\"text-sm font-semibold tabular-nums text-surface-800 dark:text-surface-100\">\n {formattedValue}\n </span>\n {comparisonElement}\n </div>\n </div>\n );\n }\n\n // ── Standard scorecard layout ───────────────────────────────────────\n const baseClass = embedded\n ? `flex flex-col min-w-0 h-full ${isSmall ? \"px-3.5 py-3\" : \"px-5 py-4\"}`\n : cls(\"rounded-lg flex flex-col min-w-0 bg-transparent border\", defaultBorderMixin, isSmall ? \"px-3.5 py-3\" : \"px-5 py-4\");\n\n return (\n <div ref={containerRef} className={baseClass} style={embedded ? undefined : { minHeight: isSmall ? 68 : 92 }}>\n {/* Title row */}\n <div className={`flex items-center justify-between ${isSmall ? \"mb-1\" : \"mb-2\"}`}>\n <div className=\"flex flex-col min-w-0\">\n <span className={`font-medium leading-snug truncate text-surface-500 dark:text-surface-400 ${isSmall ? \"text-[11px]\" : \"text-xs\"}`}>\n {title}\n </span>\n {config.dateRange && !isSmall && (\n <span className=\"text-[10px] text-surface-400 dark:text-surface-500 truncate mt-0.5\">\n {config.dateRange}\n </span>\n )}\n </div>\n {iconElement && (\n <span className=\"ml-2 shrink-0\">{iconElement}</span>\n )}\n </div>\n\n {/* Main value */}\n <div className={`font-semibold leading-tight tracking-tight break-all text-surface-800 dark:text-surface-100 ${isSmall ? \"text-lg\" : (containerWidth !== null && containerWidth < 300) ? \"text-xl\" : \"text-2xl\"}`}>\n {formattedValue}\n </div>\n\n {/* Comparison */}\n {comparisonElement && (\n <div className={isSmall ? \"mt-0.5\" : \"mt-1\"}>\n {comparisonElement}\n </div>\n )}\n </div>\n );\n}\n\nInsightsScorecardView.displayName = \"InsightsScorecardView\";\n","import React from \"react\";\nimport { cls, defaultBorderMixin } from \"@rebasepro/ui\";\nimport type { ScorecardConfig } from \"../types\";\n\n/**\n * Skeleton loader for scorecard insight widgets — displays animated\n * shimmer placeholders that exactly match the final rendered layout\n * of InsightsScorecardView for a given config, preventing layout shift.\n *\n * The skeleton receives the scorecard config so it can conditionally\n * render placeholder lines for comparison, dateRange, and icon —\n * only when the loaded view will also render them.\n */\nexport function InsightWidgetSkeleton({\n config,\n compact = false,\n embedded = false,\n}: {\n /** Scorecard config — used to match optional elements (comparison, dateRange, icon). */\n config: ScorecardConfig;\n compact?: boolean;\n /** When true, skip own border since the parent card provides it. */\n embedded?: boolean;\n}) {\n const hasComparison = Boolean(config.comparison);\n const hasIcon = Boolean(config.icon);\n const hasDateRange = Boolean(config.dateRange);\n\n // ── Compact scorecard skeleton ──────────────────────────────────────\n // Matches InsightsScorecardView compact layout:\n // container: flex flex-col gap-0.5 px-2.5 py-2 rounded-md border\n // title: text-[10px] uppercase → line-height ~14px\n // value row: text-sm font-semibold → line-height ~20px\n // + optional comparison text-[10px] inside value row\n if (compact) {\n return (\n <div\n className={cls(\n \"animate-pulse\",\n embedded\n ? \"h-full px-2.5 py-2\"\n : \"flex flex-col gap-0.5 rounded-md bg-transparent border min-w-0 px-2.5 py-2\",\n !embedded && defaultBorderMixin\n )}\n >\n {/* Title line */}\n <div className=\"bg-surface-200 dark:bg-surface-700 rounded-sm\"\n style={{ height: 14, width: 48 }}\n />\n {/* Value + optional comparison row */}\n <div className=\"flex items-baseline gap-1.5\">\n <div className=\"bg-surface-200 dark:bg-surface-700 rounded-sm\"\n style={{ height: 20, width: 40 }}\n />\n {hasComparison && (\n <div className=\"bg-surface-200/60 dark:bg-surface-700/60 rounded-sm\"\n style={{ height: 14, width: 28 }}\n />\n )}\n </div>\n </div>\n );\n }\n\n // ── Standard scorecard skeleton ─────────────────────────────────────\n // Matches InsightsScorecardView standard layout (isSmall = false):\n // container: rounded-lg px-5 py-4 border, minHeight 92\n // title row: flex justify-between mb-2\n // title: text-xs → line-height ~16px\n // dateRange: text-[10px] mt-0.5 → ~14px (optional)\n // icon: 18×18 ml-2 (optional)\n // value: text-2xl → line-height ~32px\n // comparison: text-xs mt-1 → ~16px (optional)\n return (\n <div\n className={cls(\n \"animate-pulse\",\n embedded\n ? \"h-full px-5 py-4\"\n : \"rounded-lg bg-transparent border px-5 py-4\",\n !embedded && defaultBorderMixin\n )}\n style={embedded ? undefined : { minHeight: 92 }}\n >\n {/* Title row */}\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"flex flex-col min-w-0\">\n {/* Title */}\n <div className=\"bg-surface-200 dark:bg-surface-700 rounded\"\n style={{ height: 16, width: \"60%\" }}\n />\n {/* DateRange (only if config has it) */}\n {hasDateRange && (\n <div className=\"bg-surface-200/60 dark:bg-surface-700/60 rounded mt-0.5\"\n style={{ height: 14, width: \"40%\" }}\n />\n )}\n </div>\n {/* Icon placeholder (only if config has it) */}\n {hasIcon && (\n <div className=\"bg-surface-200 dark:bg-surface-700 rounded ml-2 shrink-0\"\n style={{ height: 18, width: 18 }}\n />\n )}\n </div>\n\n {/* Main value */}\n <div className=\"bg-surface-200 dark:bg-surface-700 rounded\"\n style={{ height: 32, width: \"40%\" }}\n />\n\n {/* Comparison (only if config has it) */}\n {hasComparison && (\n <div className=\"bg-surface-200/60 dark:bg-surface-700/60 rounded mt-1\"\n style={{ height: 16, width: \"25%\" }}\n />\n )}\n </div>\n );\n}\n\nInsightWidgetSkeleton.displayName = \"InsightWidgetSkeleton\";\n","import React from \"react\";\nimport type { InsightDefinition, DataRow } from \"../types\";\nimport { useInsightsData } from \"../engine/useInsightsData\";\nimport { InsightsScorecardView } from \"./InsightsScorecardView\";\nimport { InsightWidgetSkeleton } from \"./InsightWidgetSkeleton\";\n\n/**\n * Single insight widget orchestrator.\n *\n * Fetches data via the engine, renders the scorecard visualization,\n * and manages loading/error states.\n *\n * All theme-awareness is handled via Tailwind `dark:` classes.\n */\nexport function InsightWidget({\n definition,\n collectionSlug,\n compact = false,\n embedded = false,\n}: {\n definition: InsightDefinition;\n collectionSlug?: string;\n compact?: boolean;\n /** When true, inner views skip their own borders since the parent card provides them. */\n embedded?: boolean;\n}) {\n const { data, loading, error } = useInsightsData(definition, collectionSlug);\n\n if (loading) {\n return <InsightWidgetSkeleton config={definition.scorecard} compact={compact} embedded={embedded} />;\n }\n\n if (error) {\n return (\n <div\n className={`text-red-500/70 dark:text-red-400/70 text-[0.8125rem] ${embedded ? \"px-5 py-4 h-full\" : `rounded-lg bg-red-500/5 dark:bg-red-400/5 border border-red-500/10 dark:border-red-400/10 ${compact ? \"px-3.5 py-3\" : \"px-5 py-4\"}`}`}\n >\n <div className=\"font-semibold mb-1\">{definition.title}</div>\n <div>{error.message}</div>\n </div>\n );\n }\n\n if (!data || data.rows.length === 0) {\n return (\n <div\n className={`text-surface-400 dark:text-surface-500 text-[0.8125rem] ${embedded ? \"px-5 py-4 h-full\" : `rounded-lg bg-surface-100 dark:bg-surface-800 border border-surface-200 dark:border-surface-700 ${compact ? \"px-3.5 py-3\" : \"px-5 py-4\"}`}`}\n >\n {definition.title} — No data\n </div>\n );\n }\n\n return (\n <InsightsScorecardView\n config={definition.scorecard}\n data={data.rows[0] as DataRow}\n title={definition.title}\n compact={compact}\n embedded={embedded}\n />\n );\n}\n\nInsightWidget.displayName = \"InsightWidget\";\n","import React from \"react\";\nimport type { InsightDefinition } from \"../types\";\nimport { InsightWidget } from \"./InsightWidget\";\n\n/**\n * Renders compact insight widgets inline within a home page collection card.\n * Injected via the `home.card.insight` slot.\n *\n * Uses a horizontal flex layout so multiple cards sit side by side.\n */\nexport function HomeCardInsightSlot({\n slug,\n insights,\n}: {\n slug: string;\n collection: unknown;\n context: unknown;\n insights: InsightDefinition[];\n}) {\n if (!insights || insights.length === 0) return null;\n\n return (\n <div className=\"flex flex-wrap items-center gap-1.5 mt-2\" style={{ minHeight: 46 }}>\n {insights.map((def) => (\n <InsightWidget\n key={def.id}\n definition={def}\n collectionSlug={slug}\n compact={true}\n />\n ))}\n </div>\n );\n}\n\nHomeCardInsightSlot.displayName = \"HomeCardInsightSlot\";\n","import React from \"react\";\nimport type { InsightDefinition } from \"../types\";\nimport { InsightWidget } from \"./InsightWidget\";\n\n/**\n * Scorecard insights panel rendered at the top of the home page.\n * Injected via the `home.children.start` slot.\n *\n * Renders scorecards in a responsive grid (up to 4 columns).\n */\nexport function HomeInsightsSlot({\n insights,\n}: {\n insights: InsightDefinition[];\n}) {\n if (!insights || insights.length === 0) return null;\n\n return (\n <div\n className=\"grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 gap-3 pb-6\"\n style={{ minHeight: 92 }}\n >\n {insights.map((def) => (\n <InsightWidget key={def.id} definition={def} />\n ))}\n </div>\n );\n}\n\nHomeInsightsSlot.displayName = \"HomeInsightsSlot\";\n","import React from \"react\";\nimport type { InsightDefinition } from \"../types\";\nimport { InsightWidget } from \"./InsightWidget\";\n\n/**\n * Renders scorecard insight widgets inline within a collection's list view,\n * positioned below the title and above the main data list.\n *\n * Injected via the `collection.insights` slot.\n */\nexport function CollectionInsightsInline({\n insights,\n}: {\n path: string;\n collection: unknown;\n parentCollectionIds: string[];\n insights: InsightDefinition[];\n}) {\n if (!insights || insights.length === 0) return null;\n\n return (\n <div className=\"grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 gap-3 pb-4\">\n {insights.map((def) => (\n <InsightWidget key={def.id} definition={def} />\n ))}\n </div>\n );\n}\n\nCollectionInsightsInline.displayName = \"CollectionInsightsInline\";\n","import React from \"react\";\nimport type { RebasePlugin, SlotContribution } from \"@rebasepro/types\";\nimport type { InsightsPluginConfig } from \"./types\";\nimport { InsightsProvider } from \"./engine/InsightsProvider\";\nimport { HomeCardInsightSlot } from \"./components/HomeCardInsightSlot\";\nimport { HomeInsightsSlot } from \"./components/HomeInsightsSlot\";\nimport { CollectionInsightsInline } from \"./components/CollectionInsightsInline\";\n\n/**\n * Creates the Insights plugin for Rebase.\n *\n * This plugin injects scorecard widgets into key UI locations:\n * - **Home page header**: KPI overview via `home.children.start` slot\n * - **Collection list view**: Scorecards inline (below title, above list) via `collection.insights` slot\n * - **Home page cards**: Compact scorecard metrics auto-extracted from collection insights via `home.card.insight` slot\n *\n * Collection-level insights (`collections.<slug>`) are the single source of truth:\n * scorecards render in the collection list view and are automatically extracted\n * to show as compact widgets on the corresponding home page card.\n *\n * Each insight owns its own `data()` callback — use the Rebase client SDK,\n * call a custom function, or hit any external API. Full flexibility, zero new endpoints.\n *\n * @example\n * ```typescript\n * import { useInsightsPlugin } from \"@rebasepro/plugin-insights\";\n *\n * const insightsPlugin = useInsightsPlugin({\n * cacheTTL: 120_000,\n * insights: {\n * home: [\n * { id: \"revenue\", title: \"Revenue\", data: async () => ..., scorecard: { ... } },\n * ],\n * collections: {\n * orders: [\n * { id: \"total\", title: \"Total Orders\", data: async () => ..., scorecard: { ... } },\n * ],\n * },\n * },\n * });\n * ```\n */\nexport function useInsightsPlugin(config: InsightsPluginConfig): RebasePlugin {\n const { insights, cacheTTL } = config;\n const slots: SlotContribution[] = [];\n\n // ── Home page insights ────────────────────────────────────────────\n if (insights.home && insights.home.length > 0) {\n const homeInsights = insights.home;\n slots.push({\n slot: \"home.children.start\" as const,\n Component: (props: Record<string, unknown>) => (\n <HomeInsightsSlot\n {...props}\n insights={homeInsights}\n />\n ),\n order: 10,\n });\n }\n\n // ── Per-collection insights ───────────────────────────────────────\n // A single `collections.<slug>` definition serves two slots:\n // 1. collection.insights → inline scorecards in the list view\n // 2. home.card.insight → compact scorecards on the home card\n if (insights.collections) {\n for (const [slug, defs] of Object.entries(insights.collections)) {\n if (defs.length === 0) continue;\n const collectionInsights = defs;\n\n // 1. Inline in collection list view\n slots.push({\n slot: \"collection.insights\" as const,\n Component: (props: Record<string, unknown>) => {\n const path = props.path as string;\n const collectionSlug = path?.split(\"/\").filter(Boolean).pop() ?? \"\";\n if (collectionSlug !== slug) return null;\n return (\n <CollectionInsightsInline\n {...props as { path: string; collection: unknown; parentCollectionIds: string[] }}\n insights={collectionInsights}\n />\n );\n },\n order: 10,\n });\n\n // 2. Auto-extract scorecards for home page card\n slots.push({\n slot: \"home.card.insight\" as const,\n Component: (props: Record<string, unknown>) => {\n const cardSlug = props.slug as string;\n if (cardSlug !== slug) return null;\n return (\n <HomeCardInsightSlot\n {...props as { slug: string; collection: unknown; context: unknown }}\n insights={collectionInsights}\n />\n );\n },\n order: 10,\n });\n }\n }\n\n return {\n key: \"plugin-insights\",\n slots,\n providers: [\n {\n scope: \"root\" as const,\n Component: InsightsProvider as React.ComponentType<React.PropsWithChildren<Record<string, unknown>>>,\n props: { cacheTTL },\n },\n ],\n };\n}\n"],"names":["InsightsCache","constructor","ttl","cache","Map","inflight","get","key","entry","Date","now","timestamp","delete","data","set","getInflight","setInflight","promise","invalidate","clear","InsightsContext","createContext","InsightsProvider","t0","$","_c","cacheTTL","children","t1","t2","t3","t4","value","t5","jsx","useInsightsEngine","useContext","useInsightsData","definition","collectionSlug","engine","initialLoading","authLoading","user","loginSkipped","useAuthController","authReady","Boolean","setData","useState","loading","setLoading","error","setError","cacheKey","id","cancelled","cached","then","result","catch","err","Error","String","finally","result_0","err_0","useEffect","formatNumber","format","undefined","options","style","notation","maximumFractionDigits","decimals","minimumFractionDigits","currency","formatted","Intl","NumberFormat","showSign","InsightsScorecardView","config","title","compact","embedded","containerRef","useRef","containerWidth","setContainerWidth","Symbol","for","current","offsetWidth","observer","ResizeObserver","entries","contentRect","width","observe","disconnect","React","useLayoutEffect","mainValue","field","formattedValue","comparisonElement","comparison","comparisonValue","t6","formattedComparison","isPositive","isNegative","colorClass","intent","t7","t8","isSmall","icon","getIcon","iconElement","cls","defaultBorderMixin","t9","t10","jsxs","t11","baseClass","minHeight","t12","dateRange","t13","t14","t15","t16","t17","t18","t19","displayName","InsightWidgetSkeleton","hasComparison","hasIcon","hasDateRange","height","InsightWidget","scorecard","message","rows","length","HomeCardInsightSlot","slug","insights","def","map","HomeInsightsSlot","_temp","CollectionInsightsInline","useInsightsPlugin","slots","home","homeInsights","push","slot","Component","props","order","collections","defs","Object","collectionInsights","path","split","filter","pop","cardSlug","providers","scope"],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { InsightDefinition } from "../types";
|
|
2
|
+
/**
|
|
3
|
+
* Renders scorecard insight widgets inline within a collection's list view,
|
|
4
|
+
* positioned below the title and above the main data list.
|
|
5
|
+
*
|
|
6
|
+
* Injected via the `collection.insights` slot.
|
|
7
|
+
*/
|
|
8
|
+
export declare function CollectionInsightsInline({ insights, }: {
|
|
9
|
+
path: string;
|
|
10
|
+
collection: unknown;
|
|
11
|
+
parentCollectionIds: string[];
|
|
12
|
+
insights: InsightDefinition[];
|
|
13
|
+
}): import("react/jsx-runtime").JSX.Element | null;
|
|
14
|
+
export declare namespace CollectionInsightsInline {
|
|
15
|
+
var displayName: string;
|
|
16
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { InsightDefinition } from "../types";
|
|
2
|
+
/**
|
|
3
|
+
* Renders compact insight widgets inline within a home page collection card.
|
|
4
|
+
* Injected via the `home.card.insight` slot.
|
|
5
|
+
*
|
|
6
|
+
* Uses a horizontal flex layout so multiple cards sit side by side.
|
|
7
|
+
*/
|
|
8
|
+
export declare function HomeCardInsightSlot({ slug, insights, }: {
|
|
9
|
+
slug: string;
|
|
10
|
+
collection: unknown;
|
|
11
|
+
context: unknown;
|
|
12
|
+
insights: InsightDefinition[];
|
|
13
|
+
}): import("react/jsx-runtime").JSX.Element | null;
|
|
14
|
+
export declare namespace HomeCardInsightSlot {
|
|
15
|
+
var displayName: string;
|
|
16
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { InsightDefinition } from "../types";
|
|
2
|
+
/**
|
|
3
|
+
* Scorecard insights panel rendered at the top of the home page.
|
|
4
|
+
* Injected via the `home.children.start` slot.
|
|
5
|
+
*
|
|
6
|
+
* Renders scorecards in a responsive grid (up to 4 columns).
|
|
7
|
+
*/
|
|
8
|
+
export declare function HomeInsightsSlot({ insights, }: {
|
|
9
|
+
insights: InsightDefinition[];
|
|
10
|
+
}): import("react/jsx-runtime").JSX.Element | null;
|
|
11
|
+
export declare namespace HomeInsightsSlot {
|
|
12
|
+
var displayName: string;
|
|
13
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { InsightDefinition } from "../types";
|
|
2
|
+
/**
|
|
3
|
+
* Single insight widget orchestrator.
|
|
4
|
+
*
|
|
5
|
+
* Fetches data via the engine, renders the scorecard visualization,
|
|
6
|
+
* and manages loading/error states.
|
|
7
|
+
*
|
|
8
|
+
* All theme-awareness is handled via Tailwind `dark:` classes.
|
|
9
|
+
*/
|
|
10
|
+
export declare function InsightWidget({ definition, collectionSlug, compact, embedded, }: {
|
|
11
|
+
definition: InsightDefinition;
|
|
12
|
+
collectionSlug?: string;
|
|
13
|
+
compact?: boolean;
|
|
14
|
+
/** When true, inner views skip their own borders since the parent card provides them. */
|
|
15
|
+
embedded?: boolean;
|
|
16
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
17
|
+
export declare namespace InsightWidget {
|
|
18
|
+
var displayName: string;
|
|
19
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ScorecardConfig } from "../types";
|
|
2
|
+
/**
|
|
3
|
+
* Skeleton loader for scorecard insight widgets — displays animated
|
|
4
|
+
* shimmer placeholders that exactly match the final rendered layout
|
|
5
|
+
* of InsightsScorecardView for a given config, preventing layout shift.
|
|
6
|
+
*
|
|
7
|
+
* The skeleton receives the scorecard config so it can conditionally
|
|
8
|
+
* render placeholder lines for comparison, dateRange, and icon —
|
|
9
|
+
* only when the loaded view will also render them.
|
|
10
|
+
*/
|
|
11
|
+
export declare function InsightWidgetSkeleton({ config, compact, embedded, }: {
|
|
12
|
+
/** Scorecard config — used to match optional elements (comparison, dateRange, icon). */
|
|
13
|
+
config: ScorecardConfig;
|
|
14
|
+
compact?: boolean;
|
|
15
|
+
/** When true, skip own border since the parent card provides it. */
|
|
16
|
+
embedded?: boolean;
|
|
17
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
18
|
+
export declare namespace InsightWidgetSkeleton {
|
|
19
|
+
var displayName: string;
|
|
20
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { DataRow, ScorecardConfig } from "../types";
|
|
2
|
+
/**
|
|
3
|
+
* Scorecard widget for the Rebase design system.
|
|
4
|
+
*
|
|
5
|
+
* Renders a single KPI metric with optional comparison value and icon.
|
|
6
|
+
* Uses Tailwind `dark:` classes — no JS dark mode detection.
|
|
7
|
+
* Icons are resolved via `getIcon` from `@rebasepro/core`.
|
|
8
|
+
*/
|
|
9
|
+
export declare function InsightsScorecardView({ config, data, title, compact, embedded, }: {
|
|
10
|
+
config: ScorecardConfig;
|
|
11
|
+
data: DataRow;
|
|
12
|
+
title: string;
|
|
13
|
+
compact?: boolean;
|
|
14
|
+
/** When true, skip own border/bg since the parent card provides them. */
|
|
15
|
+
embedded?: boolean;
|
|
16
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
17
|
+
export declare namespace InsightsScorecardView {
|
|
18
|
+
var displayName: string;
|
|
19
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { InsightDataResult } from "../types";
|
|
2
|
+
/**
|
|
3
|
+
* In-memory cache for insight query results.
|
|
4
|
+
* Supports TTL-based expiry and inflight request deduplication
|
|
5
|
+
* to prevent redundant network requests when multiple widgets
|
|
6
|
+
* share the same query.
|
|
7
|
+
*/
|
|
8
|
+
export declare class InsightsCache {
|
|
9
|
+
private ttl;
|
|
10
|
+
private cache;
|
|
11
|
+
private inflight;
|
|
12
|
+
constructor(ttl?: number);
|
|
13
|
+
get(key: string): InsightDataResult | null;
|
|
14
|
+
set(key: string, data: InsightDataResult): void;
|
|
15
|
+
getInflight(key: string): Promise<InsightDataResult> | null;
|
|
16
|
+
setInflight(key: string, promise: Promise<InsightDataResult>): void;
|
|
17
|
+
invalidate(key?: string): void;
|
|
18
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type PropsWithChildren } from "react";
|
|
2
|
+
import { InsightsCache } from "./InsightsCache";
|
|
3
|
+
interface InsightsContextValue {
|
|
4
|
+
cache: InsightsCache;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Root-level provider for the insights data engine.
|
|
8
|
+
* Injected automatically by the plugin via `providers: [{ scope: "root" }]`.
|
|
9
|
+
*
|
|
10
|
+
* Manages a single `InsightsCache` instance shared by all insight widgets
|
|
11
|
+
* for TTL-based caching and inflight request deduplication.
|
|
12
|
+
*/
|
|
13
|
+
export declare function InsightsProvider({ cacheTTL, children }: PropsWithChildren<{
|
|
14
|
+
cacheTTL?: number;
|
|
15
|
+
}>): import("react/jsx-runtime").JSX.Element;
|
|
16
|
+
/**
|
|
17
|
+
* Access the insights cache (for advanced usage).
|
|
18
|
+
* Returns null when called outside of an `InsightsProvider`
|
|
19
|
+
* (e.g. during auth-loading phase before plugin providers mount).
|
|
20
|
+
*/
|
|
21
|
+
export declare function useInsightsEngine(): InsightsContextValue | null;
|
|
22
|
+
export {};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { InsightDefinition, InsightDataResult } from "../types";
|
|
2
|
+
/**
|
|
3
|
+
* Hook that fetches and caches data for a single insight definition.
|
|
4
|
+
*
|
|
5
|
+
* Calls the definition's own `data()` callback and manages:
|
|
6
|
+
* - TTL-based caching via InsightsCache
|
|
7
|
+
* - Inflight request deduplication (multiple mounts of the same widget)
|
|
8
|
+
* - Loading and error state management
|
|
9
|
+
*
|
|
10
|
+
* @param definition - The insight to fetch data for
|
|
11
|
+
* @param collectionSlug - Optional collection context for cache key scoping
|
|
12
|
+
*/
|
|
13
|
+
export declare function useInsightsData(definition: InsightDefinition, collectionSlug?: string): {
|
|
14
|
+
data: InsightDataResult | null;
|
|
15
|
+
loading: boolean;
|
|
16
|
+
error: Error | null;
|
|
17
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type { DataRow, ScorecardFormat, ScorecardConfig, InsightDataResult, InsightDefinition, InsightsPluginConfig, } from "./types";
|
|
2
|
+
export { useInsightsPlugin } from "./useInsightsPlugin";
|
|
3
|
+
export { InsightsProvider, useInsightsEngine } from "./engine/InsightsProvider";
|
|
4
|
+
export { InsightsCache } from "./engine/InsightsCache";
|
|
5
|
+
export { useInsightsData } from "./engine/useInsightsData";
|
|
6
|
+
export { InsightsScorecardView } from "./components/InsightsScorecardView";
|
|
7
|
+
export { InsightWidget } from "./components/InsightWidget";
|
|
8
|
+
export { InsightWidgetSkeleton } from "./components/InsightWidgetSkeleton";
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import type { DataRow, ScorecardConfig } from "./widgets";
|
|
2
|
+
/**
|
|
3
|
+
* Result returned by an insight's data callback.
|
|
4
|
+
*/
|
|
5
|
+
export interface InsightDataResult {
|
|
6
|
+
rows: DataRow[];
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* A single insight definition — the "dry" configuration that describes
|
|
10
|
+
* what data to fetch and how to render it.
|
|
11
|
+
*
|
|
12
|
+
* Each insight owns its own `data()` callback, giving the developer
|
|
13
|
+
* full flexibility: use the Rebase client SDK, call a custom function,
|
|
14
|
+
* hit an external API — whatever makes sense for that widget.
|
|
15
|
+
*/
|
|
16
|
+
export interface InsightDefinition {
|
|
17
|
+
/** Unique identifier for this insight */
|
|
18
|
+
id: string;
|
|
19
|
+
/** Display title */
|
|
20
|
+
title: string;
|
|
21
|
+
/** Optional description */
|
|
22
|
+
description?: string;
|
|
23
|
+
/**
|
|
24
|
+
* Async callback that fetches data for this insight.
|
|
25
|
+
*
|
|
26
|
+
* The developer has full control — they can use any data source:
|
|
27
|
+
* - `rebaseClient.data.orders.find({ limit: 100 })`
|
|
28
|
+
* - `rebaseClient.call("functions/my-analytics", { ... })`
|
|
29
|
+
* - A plain `fetch()` to any external API
|
|
30
|
+
* - Static data for prototyping
|
|
31
|
+
*
|
|
32
|
+
* @returns Tabular data as `{ rows: DataRow[] }`.
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```typescript
|
|
36
|
+
* data: async () => {
|
|
37
|
+
* const res = await rebaseClient.data.orders.find({
|
|
38
|
+
* limit: 1000,
|
|
39
|
+
* orderBy: "created_at",
|
|
40
|
+
* });
|
|
41
|
+
* return { rows: res.data };
|
|
42
|
+
* }
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
data: () => Promise<InsightDataResult>;
|
|
46
|
+
/** Scorecard field mapping + formatting. */
|
|
47
|
+
scorecard: ScorecardConfig;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Full plugin configuration passed to `useInsightsPlugin`.
|
|
51
|
+
*
|
|
52
|
+
* The developer defines scorecard widgets by placement and provides
|
|
53
|
+
* their own data callbacks. No global fetch function needed — each
|
|
54
|
+
* widget is self-contained.
|
|
55
|
+
*
|
|
56
|
+
* Collection-level insights (`collections.<slug>`) are rendered in two places
|
|
57
|
+
* automatically:
|
|
58
|
+
* - **Collection list view**: Scorecards appear inline below the title and
|
|
59
|
+
* above the data list.
|
|
60
|
+
* - **Home page cards**: Scorecards are auto-extracted and rendered as compact
|
|
61
|
+
* widgets inside each collection's card on the home page.
|
|
62
|
+
*
|
|
63
|
+
* This eliminates the need to duplicate definitions across different locations.
|
|
64
|
+
*/
|
|
65
|
+
export interface InsightsPluginConfig {
|
|
66
|
+
/**
|
|
67
|
+
* Insight definitions keyed by placement.
|
|
68
|
+
*
|
|
69
|
+
* - `home`: Rendered at the top of the home page via `home.children.start`.
|
|
70
|
+
* - `collections.<slug>`: Rendered inline in that collection's list view
|
|
71
|
+
* and auto-extracted as compact scorecards on the home card.
|
|
72
|
+
*/
|
|
73
|
+
insights: {
|
|
74
|
+
home?: InsightDefinition[];
|
|
75
|
+
collections?: Record<string, InsightDefinition[]>;
|
|
76
|
+
};
|
|
77
|
+
/** Optional cache TTL in milliseconds (default: 60_000) */
|
|
78
|
+
cacheTTL?: number;
|
|
79
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tabular data types used by insight widgets.
|
|
3
|
+
*/
|
|
4
|
+
/** A single row of data as key-value pairs. */
|
|
5
|
+
export type DataRow = Record<string, string | number | boolean | null>;
|
|
6
|
+
/**
|
|
7
|
+
* Formatting options for scorecard numbers.
|
|
8
|
+
* Uses Intl.NumberFormat standard.
|
|
9
|
+
*/
|
|
10
|
+
export interface ScorecardFormat {
|
|
11
|
+
/**
|
|
12
|
+
* The style of formatting.
|
|
13
|
+
* - `decimal`: 1,234.5
|
|
14
|
+
* - `currency`: $1,234.50
|
|
15
|
+
* - `percent`: 12.5%
|
|
16
|
+
*/
|
|
17
|
+
style: "decimal" | "currency" | "percent";
|
|
18
|
+
/**
|
|
19
|
+
* How to display the number.
|
|
20
|
+
* - `standard`: 1,234,567 (default)
|
|
21
|
+
* - `compact`: 1.2M
|
|
22
|
+
*/
|
|
23
|
+
notation?: "standard" | "compact";
|
|
24
|
+
/** Required if style is 'currency' (e.g., "USD", "EUR") */
|
|
25
|
+
currency?: string;
|
|
26
|
+
/** Number of decimal places to show */
|
|
27
|
+
decimals?: number;
|
|
28
|
+
/** If true, adds a '+' sign for positive numbers (e.g., +12.5%) */
|
|
29
|
+
showSign?: boolean;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Scorecard widget configuration — field mapping + formatting.
|
|
33
|
+
*/
|
|
34
|
+
export interface ScorecardConfig {
|
|
35
|
+
/** Main value configuration */
|
|
36
|
+
value: {
|
|
37
|
+
/** The column name from the query result for the main value */
|
|
38
|
+
field: string;
|
|
39
|
+
/** How to format this number */
|
|
40
|
+
format?: ScorecardFormat;
|
|
41
|
+
};
|
|
42
|
+
/** Comparison value configuration (optional) */
|
|
43
|
+
comparison?: {
|
|
44
|
+
/** The column name from the query result for the comparison value */
|
|
45
|
+
field: string;
|
|
46
|
+
/** How to format this number */
|
|
47
|
+
format?: ScorecardFormat;
|
|
48
|
+
/**
|
|
49
|
+
* Determines the color (green/red) based on the value.
|
|
50
|
+
* - `increase_is_good`: Positive = green, negative = red.
|
|
51
|
+
* - `decrease_is_good`: Positive = red, negative = green.
|
|
52
|
+
*/
|
|
53
|
+
intent: "increase_is_good" | "decrease_is_good";
|
|
54
|
+
};
|
|
55
|
+
/** Optional icon key (e.g., "shopping_cart", "users") — resolved via getIcon */
|
|
56
|
+
icon?: string;
|
|
57
|
+
/** Optional date range text (e.g., "Last 30 days") */
|
|
58
|
+
dateRange?: string;
|
|
59
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { RebasePlugin } from "@rebasepro/types";
|
|
2
|
+
import type { InsightsPluginConfig } from "./types";
|
|
3
|
+
/**
|
|
4
|
+
* Creates the Insights plugin for Rebase.
|
|
5
|
+
*
|
|
6
|
+
* This plugin injects scorecard widgets into key UI locations:
|
|
7
|
+
* - **Home page header**: KPI overview via `home.children.start` slot
|
|
8
|
+
* - **Collection list view**: Scorecards inline (below title, above list) via `collection.insights` slot
|
|
9
|
+
* - **Home page cards**: Compact scorecard metrics auto-extracted from collection insights via `home.card.insight` slot
|
|
10
|
+
*
|
|
11
|
+
* Collection-level insights (`collections.<slug>`) are the single source of truth:
|
|
12
|
+
* scorecards render in the collection list view and are automatically extracted
|
|
13
|
+
* to show as compact widgets on the corresponding home page card.
|
|
14
|
+
*
|
|
15
|
+
* Each insight owns its own `data()` callback — use the Rebase client SDK,
|
|
16
|
+
* call a custom function, or hit any external API. Full flexibility, zero new endpoints.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* import { useInsightsPlugin } from "@rebasepro/plugin-insights";
|
|
21
|
+
*
|
|
22
|
+
* const insightsPlugin = useInsightsPlugin({
|
|
23
|
+
* cacheTTL: 120_000,
|
|
24
|
+
* insights: {
|
|
25
|
+
* home: [
|
|
26
|
+
* { id: "revenue", title: "Revenue", data: async () => ..., scorecard: { ... } },
|
|
27
|
+
* ],
|
|
28
|
+
* collections: {
|
|
29
|
+
* orders: [
|
|
30
|
+
* { id: "total", title: "Total Orders", data: async () => ..., scorecard: { ... } },
|
|
31
|
+
* ],
|
|
32
|
+
* },
|
|
33
|
+
* },
|
|
34
|
+
* });
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export declare function useInsightsPlugin(config: InsightsPluginConfig): RebasePlugin;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type AnalyticsController = {
|
|
2
|
+
/**
|
|
3
|
+
* Callback used to get analytics events from the CMS
|
|
4
|
+
*/
|
|
5
|
+
onAnalyticsEvent?: (event: AnalyticsEvent, data?: object) => void;
|
|
6
|
+
};
|
|
7
|
+
export type AnalyticsEvent = "entity_click" | "entity_click_from_reference" | "reference_selection_clear" | "reference_selection_toggle" | "reference_selected_single" | "reference_selection_new_entity" | "edit_entity_clicked" | "entity_edited" | "new_entity_click" | "new_entity_saved" | "copy_entity_click" | "entity_copied" | "single_delete_dialog_open" | "multiple_delete_dialog_open" | "single_entity_deleted" | "multiple_entities_deleted" | "drawer_navigate_to_home" | "drawer_navigate_to_collection" | "drawer_navigate_to_view" | "home_navigate_to_collection" | "home_favorite_navigate_to_collection" | "home_navigate_to_view" | "home_navigate_to_admin_view" | "home_favorite_navigate_to_view" | "home_move_card" | "home_move_group" | "home_drop_new_group" | "collection_inline_editing" | "view_mode_changed" | "kanban_card_moved" | "kanban_column_reorder" | "kanban_property_changed" | "kanban_new_entity_in_column" | "kanban_backfill_order" | "card_view_entity_click" | "unmapped_event";
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { StorageSource } from "./storage";
|
|
2
|
+
import { Role, User } from "../users";
|
|
3
|
+
import { RebaseData } from "./data";
|
|
4
|
+
/**
|
|
5
|
+
* Capabilities advertised by an auth provider.
|
|
6
|
+
* UI components use this to show/hide features dynamically
|
|
7
|
+
* (e.g. password reset, registration, session management).
|
|
8
|
+
* @group Hooks and utilities
|
|
9
|
+
*/
|
|
10
|
+
export interface AuthCapabilities {
|
|
11
|
+
emailPasswordLogin?: boolean;
|
|
12
|
+
googleLogin?: boolean;
|
|
13
|
+
registration?: boolean;
|
|
14
|
+
passwordReset?: boolean;
|
|
15
|
+
sessionManagement?: boolean;
|
|
16
|
+
profileUpdate?: boolean;
|
|
17
|
+
emailVerification?: boolean;
|
|
18
|
+
/** List of enabled OAuth provider IDs (e.g. ["google", "github", "discord"]) */
|
|
19
|
+
enabledProviders?: string[];
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Controller for retrieving the logged user or performing auth related operations.
|
|
23
|
+
* Note that if you are implementing your AuthController, you probably will want
|
|
24
|
+
* to do it as the result of a hook.
|
|
25
|
+
* @group Hooks and utilities
|
|
26
|
+
*/
|
|
27
|
+
export type AuthController<USER extends User = User, ExtraData = unknown> = {
|
|
28
|
+
/**
|
|
29
|
+
* The user currently logged in
|
|
30
|
+
* The values can be: the user object, null if they skipped login
|
|
31
|
+
*/
|
|
32
|
+
user: USER | null;
|
|
33
|
+
/**
|
|
34
|
+
* Initial loading flag. It is used not to display the login screen
|
|
35
|
+
* when the app first loads, and it has not been checked whether the user
|
|
36
|
+
* is logged in or not.
|
|
37
|
+
*/
|
|
38
|
+
initialLoading?: boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Loading flag. It is used to display a loading screen when the user is
|
|
41
|
+
* logging in or out.
|
|
42
|
+
*/
|
|
43
|
+
authLoading: boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Sign out
|
|
46
|
+
*/
|
|
47
|
+
signOut: () => Promise<void>;
|
|
48
|
+
/**
|
|
49
|
+
* Error initializing the authentication
|
|
50
|
+
*/
|
|
51
|
+
authError?: unknown;
|
|
52
|
+
/**
|
|
53
|
+
* Error dispatched by the auth provider
|
|
54
|
+
*/
|
|
55
|
+
authProviderError?: unknown;
|
|
56
|
+
/**
|
|
57
|
+
* You can use this method to retrieve the auth token for the current user.
|
|
58
|
+
*/
|
|
59
|
+
getAuthToken: () => Promise<string>;
|
|
60
|
+
/**
|
|
61
|
+
* Has the user skipped the login process
|
|
62
|
+
*/
|
|
63
|
+
loginSkipped: boolean;
|
|
64
|
+
extra: ExtraData;
|
|
65
|
+
setExtra: (extra: ExtraData) => void;
|
|
66
|
+
setUser?(user: USER | null): void;
|
|
67
|
+
setUserRoles?(roles: Role[]): void;
|
|
68
|
+
/**
|
|
69
|
+
* Capabilities advertised by the auth provider.
|
|
70
|
+
* UI components use this to feature-detect what the backend supports.
|
|
71
|
+
*/
|
|
72
|
+
capabilities?: AuthCapabilities;
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* Extended auth controller with common optional auth methods.
|
|
76
|
+
* Backend implementations (Rebase backend, Firebase, Supabase, etc.)
|
|
77
|
+
* extend this with their own backend-specific extras.
|
|
78
|
+
* @group Hooks and utilities
|
|
79
|
+
*/
|
|
80
|
+
export interface AuthControllerExtended<USER extends User = User, ExtraData = unknown> extends AuthController<USER, ExtraData> {
|
|
81
|
+
/** Login with email and password */
|
|
82
|
+
emailPasswordLogin?(email: string, password: string): Promise<void>;
|
|
83
|
+
/** Login with a Google ID token or trigger Google popup */
|
|
84
|
+
googleLogin?(idToken: string): Promise<void>;
|
|
85
|
+
/** Register a new user */
|
|
86
|
+
register?(email: string, password: string, displayName?: string): Promise<void>;
|
|
87
|
+
/** Skip login (for anonymous access if enabled) */
|
|
88
|
+
skipLogin?(): void;
|
|
89
|
+
/** Request password reset email */
|
|
90
|
+
forgotPassword?(email: string): Promise<void>;
|
|
91
|
+
/** Reset password using a token */
|
|
92
|
+
resetPassword?(token: string, password: string): Promise<void>;
|
|
93
|
+
/** Change password for the authenticated user */
|
|
94
|
+
changePassword?(oldPassword: string, newPassword: string): Promise<void>;
|
|
95
|
+
/** Update user profile */
|
|
96
|
+
updateProfile?(displayName?: string, photoURL?: string): Promise<USER>;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Implement this function to allow access to specific users.
|
|
100
|
+
* @group Hooks and utilities
|
|
101
|
+
*/
|
|
102
|
+
export type Authenticator<USER extends User = User> = (props: {
|
|
103
|
+
/**
|
|
104
|
+
* Logged-in user or null
|
|
105
|
+
*/
|
|
106
|
+
user: USER | null;
|
|
107
|
+
/**
|
|
108
|
+
* AuthController
|
|
109
|
+
*/
|
|
110
|
+
authController: AuthController<USER>;
|
|
111
|
+
/**
|
|
112
|
+
* Unified data access API
|
|
113
|
+
*/
|
|
114
|
+
data: RebaseData;
|
|
115
|
+
/**
|
|
116
|
+
* Used storage implementation
|
|
117
|
+
*/
|
|
118
|
+
storageSource: StorageSource;
|
|
119
|
+
}) => boolean | Promise<boolean>;
|