@marinoscar/platform-web 0.0.0-stage → 0.1.0-next.3
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/CHANGELOG.md +42 -0
- package/LICENSE +21 -0
- package/README.md +96 -2
- package/dist/core/api-client.d.ts +112 -0
- package/dist/core/api-client.d.ts.map +1 -0
- package/dist/core/api-client.js +24 -0
- package/dist/core/api-client.js.map +1 -0
- package/dist/core/host.d.ts +74 -0
- package/dist/core/host.d.ts.map +1 -0
- package/dist/core/host.js +84 -0
- package/dist/core/host.js.map +1 -0
- package/dist/core/index.d.ts +7 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +5 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/settings-page.d.ts +47 -0
- package/dist/core/settings-page.d.ts.map +1 -0
- package/dist/core/settings-page.js +5 -0
- package/dist/core/settings-page.js.map +1 -0
- package/dist/core/viewer.d.ts +14 -0
- package/dist/core/viewer.d.ts.map +1 -0
- package/dist/core/viewer.js +4 -0
- package/dist/core/viewer.js.map +1 -0
- package/dist/doctor/headless/categories.d.ts +31 -0
- package/dist/doctor/headless/categories.d.ts.map +1 -0
- package/dist/doctor/headless/categories.js +41 -0
- package/dist/doctor/headless/categories.js.map +1 -0
- package/dist/doctor/headless/client.d.ts +33 -0
- package/dist/doctor/headless/client.d.ts.map +1 -0
- package/dist/doctor/headless/client.js +31 -0
- package/dist/doctor/headless/client.js.map +1 -0
- package/dist/doctor/headless/contract.d.ts +18 -0
- package/dist/doctor/headless/contract.d.ts.map +1 -0
- package/dist/doctor/headless/contract.js +15 -0
- package/dist/doctor/headless/contract.js.map +1 -0
- package/dist/doctor/headless/index.d.ts +12 -0
- package/dist/doctor/headless/index.d.ts.map +1 -0
- package/dist/doctor/headless/index.js +8 -0
- package/dist/doctor/headless/index.js.map +1 -0
- package/dist/doctor/headless/use-doctor.d.ts +36 -0
- package/dist/doctor/headless/use-doctor.d.ts.map +1 -0
- package/dist/doctor/headless/use-doctor.js +80 -0
- package/dist/doctor/headless/use-doctor.js.map +1 -0
- package/dist/doctor/headless/use-support-bundle-download.d.ts +68 -0
- package/dist/doctor/headless/use-support-bundle-download.d.ts.map +1 -0
- package/dist/doctor/headless/use-support-bundle-download.js +135 -0
- package/dist/doctor/headless/use-support-bundle-download.js.map +1 -0
- package/dist/doctor/internal/relative-time.d.ts +2 -0
- package/dist/doctor/internal/relative-time.d.ts.map +1 -0
- package/dist/doctor/internal/relative-time.js +29 -0
- package/dist/doctor/internal/relative-time.js.map +1 -0
- package/dist/doctor/internal/status-colors.d.ts +5 -0
- package/dist/doctor/internal/status-colors.d.ts.map +1 -0
- package/dist/doctor/internal/status-colors.js +29 -0
- package/dist/doctor/internal/status-colors.js.map +1 -0
- package/dist/doctor/internal/use-is-mounted.d.ts +2 -0
- package/dist/doctor/internal/use-is-mounted.d.ts.map +1 -0
- package/dist/doctor/internal/use-is-mounted.js +15 -0
- package/dist/doctor/internal/use-is-mounted.js.map +1 -0
- package/dist/doctor/ui/check-row.d.ts +54 -0
- package/dist/doctor/ui/check-row.d.ts.map +1 -0
- package/dist/doctor/ui/check-row.js +100 -0
- package/dist/doctor/ui/check-row.js.map +1 -0
- package/dist/doctor/ui/copy.d.ts +3 -0
- package/dist/doctor/ui/copy.d.ts.map +1 -0
- package/dist/doctor/ui/copy.js +6 -0
- package/dist/doctor/ui/copy.js.map +1 -0
- package/dist/doctor/ui/doctor-page.d.ts +50 -0
- package/dist/doctor/ui/doctor-page.d.ts.map +1 -0
- package/dist/doctor/ui/doctor-page.js +152 -0
- package/dist/doctor/ui/doctor-page.js.map +1 -0
- package/dist/doctor/ui/index.d.ts +8 -0
- package/dist/doctor/ui/index.d.ts.map +1 -0
- package/dist/doctor/ui/index.js +7 -0
- package/dist/doctor/ui/index.js.map +1 -0
- package/dist/doctor/ui/settings-page.d.ts +20 -0
- package/dist/doctor/ui/settings-page.d.ts.map +1 -0
- package/dist/doctor/ui/settings-page.js +32 -0
- package/dist/doctor/ui/settings-page.js.map +1 -0
- package/dist/doctor/ui/support-bundle-button.d.ts +37 -0
- package/dist/doctor/ui/support-bundle-button.d.ts.map +1 -0
- package/dist/doctor/ui/support-bundle-button.js +39 -0
- package/dist/doctor/ui/support-bundle-button.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/telemetry/headless/adapters/TelemetryWebAdapters.d.ts +106 -0
- package/dist/telemetry/headless/adapters/TelemetryWebAdapters.d.ts.map +1 -0
- package/dist/telemetry/headless/adapters/TelemetryWebAdapters.js +58 -0
- package/dist/telemetry/headless/adapters/TelemetryWebAdapters.js.map +1 -0
- package/dist/telemetry/headless/context/TelemetryConfigProvider.d.ts +43 -0
- package/dist/telemetry/headless/context/TelemetryConfigProvider.d.ts.map +1 -0
- package/dist/telemetry/headless/context/TelemetryConfigProvider.js +24 -0
- package/dist/telemetry/headless/context/TelemetryConfigProvider.js.map +1 -0
- package/dist/telemetry/headless/context/telemetryConfig.d.ts +68 -0
- package/dist/telemetry/headless/context/telemetryConfig.d.ts.map +1 -0
- package/dist/telemetry/headless/context/telemetryConfig.js +119 -0
- package/dist/telemetry/headless/context/telemetryConfig.js.map +1 -0
- package/dist/telemetry/headless/guards/RequireTelemetryEnabled.d.ts +35 -0
- package/dist/telemetry/headless/guards/RequireTelemetryEnabled.d.ts.map +1 -0
- package/dist/telemetry/headless/guards/RequireTelemetryEnabled.js +44 -0
- package/dist/telemetry/headless/guards/RequireTelemetryEnabled.js.map +1 -0
- package/dist/telemetry/headless/hooks/useTelemetryAdmin.d.ts +40 -0
- package/dist/telemetry/headless/hooks/useTelemetryAdmin.d.ts.map +1 -0
- package/dist/telemetry/headless/hooks/useTelemetryAdmin.js +111 -0
- package/dist/telemetry/headless/hooks/useTelemetryAdmin.js.map +1 -0
- package/dist/telemetry/headless/hooks/useTelemetryAssistant.d.ts +120 -0
- package/dist/telemetry/headless/hooks/useTelemetryAssistant.d.ts.map +1 -0
- package/dist/telemetry/headless/hooks/useTelemetryAssistant.js +185 -0
- package/dist/telemetry/headless/hooks/useTelemetryAssistant.js.map +1 -0
- package/dist/telemetry/headless/hooks/useTelemetryAssistantAvailable.d.ts +12 -0
- package/dist/telemetry/headless/hooks/useTelemetryAssistantAvailable.d.ts.map +1 -0
- package/dist/telemetry/headless/hooks/useTelemetryAssistantAvailable.js +36 -0
- package/dist/telemetry/headless/hooks/useTelemetryAssistantAvailable.js.map +1 -0
- package/dist/telemetry/headless/hooks/useTelemetryConnection.d.ts +46 -0
- package/dist/telemetry/headless/hooks/useTelemetryConnection.d.ts.map +1 -0
- package/dist/telemetry/headless/hooks/useTelemetryConnection.js +133 -0
- package/dist/telemetry/headless/hooks/useTelemetryConnection.js.map +1 -0
- package/dist/telemetry/headless/hooks/useTelemetryDashboard.d.ts +147 -0
- package/dist/telemetry/headless/hooks/useTelemetryDashboard.d.ts.map +1 -0
- package/dist/telemetry/headless/hooks/useTelemetryDashboard.js +231 -0
- package/dist/telemetry/headless/hooks/useTelemetryDashboard.js.map +1 -0
- package/dist/telemetry/headless/hooks/useTelemetryExplorer.d.ts +95 -0
- package/dist/telemetry/headless/hooks/useTelemetryExplorer.d.ts.map +1 -0
- package/dist/telemetry/headless/hooks/useTelemetryExplorer.js +197 -0
- package/dist/telemetry/headless/hooks/useTelemetryExplorer.js.map +1 -0
- package/dist/telemetry/headless/hooks/useTelemetryStack.d.ts +69 -0
- package/dist/telemetry/headless/hooks/useTelemetryStack.d.ts.map +1 -0
- package/dist/telemetry/headless/hooks/useTelemetryStack.js +129 -0
- package/dist/telemetry/headless/hooks/useTelemetryStack.js.map +1 -0
- package/dist/telemetry/headless/index.d.ts +34 -0
- package/dist/telemetry/headless/index.d.ts.map +1 -0
- package/dist/telemetry/headless/index.js +34 -0
- package/dist/telemetry/headless/index.js.map +1 -0
- package/dist/telemetry/headless/lib/assistantExport.d.ts +12 -0
- package/dist/telemetry/headless/lib/assistantExport.d.ts.map +1 -0
- package/dist/telemetry/headless/lib/assistantExport.js +116 -0
- package/dist/telemetry/headless/lib/assistantExport.js.map +1 -0
- package/dist/telemetry/headless/lib/dashboard/assistantPrompt.d.ts +91 -0
- package/dist/telemetry/headless/lib/dashboard/assistantPrompt.d.ts.map +1 -0
- package/dist/telemetry/headless/lib/dashboard/assistantPrompt.js +246 -0
- package/dist/telemetry/headless/lib/dashboard/assistantPrompt.js.map +1 -0
- package/dist/telemetry/headless/lib/dashboardState.d.ts +58 -0
- package/dist/telemetry/headless/lib/dashboardState.d.ts.map +1 -0
- package/dist/telemetry/headless/lib/dashboardState.js +153 -0
- package/dist/telemetry/headless/lib/dashboardState.js.map +1 -0
- package/dist/telemetry/headless/lib/explorerHandoff.d.ts +62 -0
- package/dist/telemetry/headless/lib/explorerHandoff.d.ts.map +1 -0
- package/dist/telemetry/headless/lib/explorerHandoff.js +77 -0
- package/dist/telemetry/headless/lib/explorerHandoff.js.map +1 -0
- package/dist/telemetry/headless/lib/format.d.ts +113 -0
- package/dist/telemetry/headless/lib/format.d.ts.map +1 -0
- package/dist/telemetry/headless/lib/format.js +280 -0
- package/dist/telemetry/headless/lib/format.js.map +1 -0
- package/dist/telemetry/headless/lib/metrics/metricSections.d.ts +44 -0
- package/dist/telemetry/headless/lib/metrics/metricSections.d.ts.map +1 -0
- package/dist/telemetry/headless/lib/metrics/metricSections.js +61 -0
- package/dist/telemetry/headless/lib/metrics/metricSections.js.map +1 -0
- package/dist/telemetry/headless/lib/metrics/topNPreference.d.ts +15 -0
- package/dist/telemetry/headless/lib/metrics/topNPreference.d.ts.map +1 -0
- package/dist/telemetry/headless/lib/metrics/topNPreference.js +33 -0
- package/dist/telemetry/headless/lib/metrics/topNPreference.js.map +1 -0
- package/dist/telemetry/headless/lib/queryHistory.d.ts +20 -0
- package/dist/telemetry/headless/lib/queryHistory.d.ts.map +1 -0
- package/dist/telemetry/headless/lib/queryHistory.js +53 -0
- package/dist/telemetry/headless/lib/queryHistory.js.map +1 -0
- package/dist/telemetry/headless/lib/starterQueries.d.ts +48 -0
- package/dist/telemetry/headless/lib/starterQueries.d.ts.map +1 -0
- package/dist/telemetry/headless/lib/starterQueries.js +84 -0
- package/dist/telemetry/headless/lib/starterQueries.js.map +1 -0
- package/dist/telemetry/headless/lib/traceLink.d.ts +26 -0
- package/dist/telemetry/headless/lib/traceLink.d.ts.map +1 -0
- package/dist/telemetry/headless/lib/traceLink.js +32 -0
- package/dist/telemetry/headless/lib/traceLink.js.map +1 -0
- package/dist/telemetry/headless/lib/unknownRoutes.d.ts +23 -0
- package/dist/telemetry/headless/lib/unknownRoutes.d.ts.map +1 -0
- package/dist/telemetry/headless/lib/unknownRoutes.js +35 -0
- package/dist/telemetry/headless/lib/unknownRoutes.js.map +1 -0
- package/dist/telemetry/headless/services/client.d.ts +144 -0
- package/dist/telemetry/headless/services/client.d.ts.map +1 -0
- package/dist/telemetry/headless/services/client.js +144 -0
- package/dist/telemetry/headless/services/client.js.map +1 -0
- package/dist/telemetry/headless/services/telemetry.d.ts +483 -0
- package/dist/telemetry/headless/services/telemetry.d.ts.map +1 -0
- package/dist/telemetry/headless/services/telemetry.js +190 -0
- package/dist/telemetry/headless/services/telemetry.js.map +1 -0
- package/dist/telemetry/headless/services/telemetryDashboard.d.ts +321 -0
- package/dist/telemetry/headless/services/telemetryDashboard.d.ts.map +1 -0
- package/dist/telemetry/headless/services/telemetryDashboard.js +103 -0
- package/dist/telemetry/headless/services/telemetryDashboard.js.map +1 -0
- package/dist/telemetry/internal/useIsMounted.d.ts +9 -0
- package/dist/telemetry/internal/useIsMounted.d.ts.map +1 -0
- package/dist/telemetry/internal/useIsMounted.js +19 -0
- package/dist/telemetry/internal/useIsMounted.js.map +1 -0
- package/dist/telemetry/internal/useVisiblePolling.d.ts +55 -0
- package/dist/telemetry/internal/useVisiblePolling.d.ts.map +1 -0
- package/dist/telemetry/internal/useVisiblePolling.js +96 -0
- package/dist/telemetry/internal/useVisiblePolling.js.map +1 -0
- package/dist/telemetry/internal/visuallyHidden.d.ts +12 -0
- package/dist/telemetry/internal/visuallyHidden.d.ts.map +1 -0
- package/dist/telemetry/internal/visuallyHidden.js +15 -0
- package/dist/telemetry/internal/visuallyHidden.js.map +1 -0
- package/dist/telemetry/theme/augment.d.ts +65 -0
- package/dist/telemetry/theme/augment.d.ts.map +1 -0
- package/dist/telemetry/theme/augment.js +37 -0
- package/dist/telemetry/theme/augment.js.map +1 -0
- package/dist/telemetry/theme/telemetryTokens.d.ts +121 -0
- package/dist/telemetry/theme/telemetryTokens.d.ts.map +1 -0
- package/dist/telemetry/theme/telemetryTokens.js +129 -0
- package/dist/telemetry/theme/telemetryTokens.js.map +1 -0
- package/dist/telemetry/ui/admin.d.ts +35 -0
- package/dist/telemetry/ui/admin.d.ts.map +1 -0
- package/dist/telemetry/ui/admin.js +58 -0
- package/dist/telemetry/ui/admin.js.map +1 -0
- package/dist/telemetry/ui/components/AssistantContainer.d.ts +35 -0
- package/dist/telemetry/ui/components/AssistantContainer.d.ts.map +1 -0
- package/dist/telemetry/ui/components/AssistantContainer.js +83 -0
- package/dist/telemetry/ui/components/AssistantContainer.js.map +1 -0
- package/dist/telemetry/ui/components/AssistantPanel.d.ts +22 -0
- package/dist/telemetry/ui/components/AssistantPanel.d.ts.map +1 -0
- package/dist/telemetry/ui/components/AssistantPanel.js +150 -0
- package/dist/telemetry/ui/components/AssistantPanel.js.map +1 -0
- package/dist/telemetry/ui/components/AssistantReport.d.ts +13 -0
- package/dist/telemetry/ui/components/AssistantReport.d.ts.map +1 -0
- package/dist/telemetry/ui/components/AssistantReport.js +89 -0
- package/dist/telemetry/ui/components/AssistantReport.js.map +1 -0
- package/dist/telemetry/ui/components/AssistantTimeline.d.ts +10 -0
- package/dist/telemetry/ui/components/AssistantTimeline.d.ts.map +1 -0
- package/dist/telemetry/ui/components/AssistantTimeline.js +84 -0
- package/dist/telemetry/ui/components/AssistantTimeline.js.map +1 -0
- package/dist/telemetry/ui/components/ResultsGrid.d.ts +10 -0
- package/dist/telemetry/ui/components/ResultsGrid.d.ts.map +1 -0
- package/dist/telemetry/ui/components/ResultsGrid.js +71 -0
- package/dist/telemetry/ui/components/ResultsGrid.js.map +1 -0
- package/dist/telemetry/ui/components/SchemaPanel.d.ts +9 -0
- package/dist/telemetry/ui/components/SchemaPanel.d.ts.map +1 -0
- package/dist/telemetry/ui/components/SchemaPanel.js +42 -0
- package/dist/telemetry/ui/components/SchemaPanel.js.map +1 -0
- package/dist/telemetry/ui/components/SqlEditor.d.ts +21 -0
- package/dist/telemetry/ui/components/SqlEditor.d.ts.map +1 -0
- package/dist/telemetry/ui/components/SqlEditor.js +60 -0
- package/dist/telemetry/ui/components/SqlEditor.js.map +1 -0
- package/dist/telemetry/ui/components/TelemetryConnectionSection.d.ts +14 -0
- package/dist/telemetry/ui/components/TelemetryConnectionSection.d.ts.map +1 -0
- package/dist/telemetry/ui/components/TelemetryConnectionSection.js +243 -0
- package/dist/telemetry/ui/components/TelemetryConnectionSection.js.map +1 -0
- package/dist/telemetry/ui/components/TelemetryCrossLink.d.ts +12 -0
- package/dist/telemetry/ui/components/TelemetryCrossLink.d.ts.map +1 -0
- package/dist/telemetry/ui/components/TelemetryCrossLink.js +21 -0
- package/dist/telemetry/ui/components/TelemetryCrossLink.js.map +1 -0
- package/dist/telemetry/ui/components/TelemetryServicesSection.d.ts +23 -0
- package/dist/telemetry/ui/components/TelemetryServicesSection.d.ts.map +1 -0
- package/dist/telemetry/ui/components/TelemetryServicesSection.js +138 -0
- package/dist/telemetry/ui/components/TelemetryServicesSection.js.map +1 -0
- package/dist/telemetry/ui/components/TelemetrySpinner.d.ts +3 -0
- package/dist/telemetry/ui/components/TelemetrySpinner.d.ts.map +1 -0
- package/dist/telemetry/ui/components/TelemetrySpinner.js +14 -0
- package/dist/telemetry/ui/components/TelemetrySpinner.js.map +1 -0
- package/dist/telemetry/ui/components/dashboard/ApiTimelineChart.d.ts +17 -0
- package/dist/telemetry/ui/components/dashboard/ApiTimelineChart.d.ts.map +1 -0
- package/dist/telemetry/ui/components/dashboard/ApiTimelineChart.js +70 -0
- package/dist/telemetry/ui/components/dashboard/ApiTimelineChart.js.map +1 -0
- package/dist/telemetry/ui/components/dashboard/DashboardFilterBar.d.ts +39 -0
- package/dist/telemetry/ui/components/dashboard/DashboardFilterBar.d.ts.map +1 -0
- package/dist/telemetry/ui/components/dashboard/DashboardFilterBar.js +143 -0
- package/dist/telemetry/ui/components/dashboard/DashboardFilterBar.js.map +1 -0
- package/dist/telemetry/ui/components/dashboard/DashboardPanel.d.ts +58 -0
- package/dist/telemetry/ui/components/dashboard/DashboardPanel.d.ts.map +1 -0
- package/dist/telemetry/ui/components/dashboard/DashboardPanel.js +62 -0
- package/dist/telemetry/ui/components/dashboard/DashboardPanel.js.map +1 -0
- package/dist/telemetry/ui/components/dashboard/EventsFeed.d.ts +21 -0
- package/dist/telemetry/ui/components/dashboard/EventsFeed.d.ts.map +1 -0
- package/dist/telemetry/ui/components/dashboard/EventsFeed.js +96 -0
- package/dist/telemetry/ui/components/dashboard/EventsFeed.js.map +1 -0
- package/dist/telemetry/ui/components/dashboard/KpiTiles.d.ts +13 -0
- package/dist/telemetry/ui/components/dashboard/KpiTiles.d.ts.map +1 -0
- package/dist/telemetry/ui/components/dashboard/KpiTiles.js +82 -0
- package/dist/telemetry/ui/components/dashboard/KpiTiles.js.map +1 -0
- package/dist/telemetry/ui/components/dashboard/LogSeverityChart.d.ts +8 -0
- package/dist/telemetry/ui/components/dashboard/LogSeverityChart.d.ts.map +1 -0
- package/dist/telemetry/ui/components/dashboard/LogSeverityChart.js +34 -0
- package/dist/telemetry/ui/components/dashboard/LogSeverityChart.js.map +1 -0
- package/dist/telemetry/ui/components/dashboard/TopProblems.d.ts +19 -0
- package/dist/telemetry/ui/components/dashboard/TopProblems.d.ts.map +1 -0
- package/dist/telemetry/ui/components/dashboard/TopProblems.js +61 -0
- package/dist/telemetry/ui/components/dashboard/TopProblems.js.map +1 -0
- package/dist/telemetry/ui/components/dashboard/UnknownRoutesPanel.d.ts +12 -0
- package/dist/telemetry/ui/components/dashboard/UnknownRoutesPanel.d.ts.map +1 -0
- package/dist/telemetry/ui/components/dashboard/UnknownRoutesPanel.js +36 -0
- package/dist/telemetry/ui/components/dashboard/UnknownRoutesPanel.js.map +1 -0
- package/dist/telemetry/ui/components/dashboard/VerdictBanner.d.ts +35 -0
- package/dist/telemetry/ui/components/dashboard/VerdictBanner.d.ts.map +1 -0
- package/dist/telemetry/ui/components/dashboard/VerdictBanner.js +68 -0
- package/dist/telemetry/ui/components/dashboard/VerdictBanner.js.map +1 -0
- package/dist/telemetry/ui/components/dashboard/ZoomBrush.d.ts +9 -0
- package/dist/telemetry/ui/components/dashboard/ZoomBrush.d.ts.map +1 -0
- package/dist/telemetry/ui/components/dashboard/ZoomBrush.js +96 -0
- package/dist/telemetry/ui/components/dashboard/ZoomBrush.js.map +1 -0
- package/dist/telemetry/ui/components/dashboard/metrics/MetricSections.d.ts +75 -0
- package/dist/telemetry/ui/components/dashboard/metrics/MetricSections.d.ts.map +1 -0
- package/dist/telemetry/ui/components/dashboard/metrics/MetricSections.js +247 -0
- package/dist/telemetry/ui/components/dashboard/metrics/MetricSections.js.map +1 -0
- package/dist/telemetry/ui/components/dashboard/metrics/MetricSeriesChart.d.ts +19 -0
- package/dist/telemetry/ui/components/dashboard/metrics/MetricSeriesChart.d.ts.map +1 -0
- package/dist/telemetry/ui/components/dashboard/metrics/MetricSeriesChart.js +64 -0
- package/dist/telemetry/ui/components/dashboard/metrics/MetricSeriesChart.js.map +1 -0
- package/dist/telemetry/ui/components/dashboard/metrics/MetricTable.d.ts +74 -0
- package/dist/telemetry/ui/components/dashboard/metrics/MetricTable.d.ts.map +1 -0
- package/dist/telemetry/ui/components/dashboard/metrics/MetricTable.js +126 -0
- package/dist/telemetry/ui/components/dashboard/metrics/MetricTable.js.map +1 -0
- package/dist/telemetry/ui/components/dashboard/severity.d.ts +43 -0
- package/dist/telemetry/ui/components/dashboard/severity.d.ts.map +1 -0
- package/dist/telemetry/ui/components/dashboard/severity.js +66 -0
- package/dist/telemetry/ui/components/dashboard/severity.js.map +1 -0
- package/dist/telemetry/ui/components/dashboard/timelineAxis.d.ts +11 -0
- package/dist/telemetry/ui/components/dashboard/timelineAxis.d.ts.map +1 -0
- package/dist/telemetry/ui/components/dashboard/timelineAxis.js +20 -0
- package/dist/telemetry/ui/components/dashboard/timelineAxis.js.map +1 -0
- package/dist/telemetry/ui/dashboard-page.d.ts +2 -0
- package/dist/telemetry/ui/dashboard-page.d.ts.map +1 -0
- package/dist/telemetry/ui/dashboard-page.js +6 -0
- package/dist/telemetry/ui/dashboard-page.js.map +1 -0
- package/dist/telemetry/ui/explorer-page.d.ts +2 -0
- package/dist/telemetry/ui/explorer-page.d.ts.map +1 -0
- package/dist/telemetry/ui/explorer-page.js +6 -0
- package/dist/telemetry/ui/explorer-page.js.map +1 -0
- package/dist/telemetry/ui/index.d.ts +6 -0
- package/dist/telemetry/ui/index.d.ts.map +1 -0
- package/dist/telemetry/ui/index.js +10 -0
- package/dist/telemetry/ui/index.js.map +1 -0
- package/dist/telemetry/ui/pages/TelemetryDashboardPage.d.ts +14 -0
- package/dist/telemetry/ui/pages/TelemetryDashboardPage.d.ts.map +1 -0
- package/dist/telemetry/ui/pages/TelemetryDashboardPage.js +286 -0
- package/dist/telemetry/ui/pages/TelemetryDashboardPage.js.map +1 -0
- package/dist/telemetry/ui/pages/TelemetryExplorerPage.d.ts +15 -0
- package/dist/telemetry/ui/pages/TelemetryExplorerPage.d.ts.map +1 -0
- package/dist/telemetry/ui/pages/TelemetryExplorerPage.js +197 -0
- package/dist/telemetry/ui/pages/TelemetryExplorerPage.js.map +1 -0
- package/dist/telemetry/ui/pages/TelemetrySettingsPage.d.ts +28 -0
- package/dist/telemetry/ui/pages/TelemetrySettingsPage.d.ts.map +1 -0
- package/dist/telemetry/ui/pages/TelemetrySettingsPage.js +278 -0
- package/dist/telemetry/ui/pages/TelemetrySettingsPage.js.map +1 -0
- package/dist/telemetry/ui/settings-page.d.ts +2 -0
- package/dist/telemetry/ui/settings-page.d.ts.map +1 -0
- package/dist/telemetry/ui/settings-page.js +6 -0
- package/dist/telemetry/ui/settings-page.js.map +1 -0
- package/dist/testing/index.d.ts +3 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +4 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/test-platform-host.d.ts +108 -0
- package/dist/testing/test-platform-host.d.ts.map +1 -0
- package/dist/testing/test-platform-host.js +101 -0
- package/dist/testing/test-platform-host.js.map +1 -0
- package/package.json +132 -4
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export declare const RETENTION_PRESETS: readonly [7, 30, 90, 180, 365];
|
|
2
|
+
/** `null` when valid, else the message to show under the field. */
|
|
3
|
+
export declare function validateInteger(value: string, limits: {
|
|
4
|
+
min: number;
|
|
5
|
+
max: number;
|
|
6
|
+
}): string | null;
|
|
7
|
+
/**
|
|
8
|
+
* `null` when valid (blank is valid: it follows the default), else the message
|
|
9
|
+
* to show under the field. Mirrors the API's pattern; the API is the gate.
|
|
10
|
+
*/
|
|
11
|
+
export declare function validateInstanceId(value: string): string | null;
|
|
12
|
+
/**
|
|
13
|
+
* The Telemetry settings page (`/admin/settings/telemetry`): collection on or
|
|
14
|
+
* off, retention, query limits, the AI assistant's switch and model, the
|
|
15
|
+
* GreptimeDB connection and the telemetry services. Shown to `telemetry:read`;
|
|
16
|
+
* saving needs `telemetry:write` (the controls are disabled without it), the
|
|
17
|
+
* model picker `ai_config:read`, the services section `system_settings:read`
|
|
18
|
+
* (`system_settings:write` to deploy). NOT behind `RequireTelemetryEnabled`:
|
|
19
|
+
* this is where telemetry is switched on. Reads the app through
|
|
20
|
+
* `PlatformHostProvider` and `TelemetryWebAdaptersProvider`.
|
|
21
|
+
*
|
|
22
|
+
* @returns the page.
|
|
23
|
+
*
|
|
24
|
+
* @extensionPoint component
|
|
25
|
+
* @stability experimental
|
|
26
|
+
*/
|
|
27
|
+
export default function TelemetrySettingsPage(): import("react").JSX.Element;
|
|
28
|
+
//# sourceMappingURL=TelemetrySettingsPage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TelemetrySettingsPage.d.ts","sourceRoot":"","sources":["../../../../src/telemetry/ui/pages/TelemetrySettingsPage.tsx"],"names":[],"mappings":"AAwFA,eAAO,MAAM,iBAAiB,gCAAiC,CAAC;AAkDhE,mEAAmE;AACnE,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,GAAG,IAAI,CAMlG;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAK/D;AA0QD;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,OAAO,UAAU,qBAAqB,gCAsZ5C"}
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Console → Observability → Telemetry — issue #537, epic #528.
|
|
4
|
+
*
|
|
5
|
+
* The deployment's telemetry POLICY: whether it is collected, how long it is
|
|
6
|
+
* kept, how this deployment labels what it exports (`app.instance.id`, #565),
|
|
7
|
+
* how much a single explorer query may return, and whether (and with which
|
|
8
|
+
* model) the AI assistant may help. Plus a live status card so an
|
|
9
|
+
* operator can see whether the store is actually there.
|
|
10
|
+
*
|
|
11
|
+
* The Connection section (#558, `components/telemetry/TelemetryConnectionSection`)
|
|
12
|
+
* is where the API's GreptimeDB host and logins are set. It is a section of
|
|
13
|
+
* this page — the same destination — not a card or a tab of its own, and it
|
|
14
|
+
* saves on its own `If-Match` version, separate from the policy form's.
|
|
15
|
+
*
|
|
16
|
+
* The Telemetry services section (#567, `components/telemetry/TelemetryServicesSection`)
|
|
17
|
+
* sits just above it: the GreptimeDB containers' state and a one-click
|
|
18
|
+
* (re)deploy. Also a section, not a card or tab; it is shown for
|
|
19
|
+
* `system_settings:read` and deploys need `system_settings:write` — what the
|
|
20
|
+
* `/admin/telemetry/stack` routes enforce.
|
|
21
|
+
*
|
|
22
|
+
* Gates: the route requires `telemetry:read` (the card's permission, what
|
|
23
|
+
* `telemetry-admin.controller.ts` enforces on its GETs). Saving needs
|
|
24
|
+
* `telemetry:write`; without it every control is disabled — the API is the
|
|
25
|
+
* real gate either way. Saves send `If-Match: <version>`; a 409 means someone
|
|
26
|
+
* else saved first and the page offers a reload.
|
|
27
|
+
*
|
|
28
|
+
* NOT behind `RequireTelemetryEnabled`: this is where telemetry is switched on.
|
|
29
|
+
*/
|
|
30
|
+
import { useContext, useEffect, useMemo, useState } from 'react';
|
|
31
|
+
import { Alert, AlertTitle, Box, Button, Chip, Container, Divider, FormControlLabel, FormHelperText, Link, ListItemText, MenuItem, Paper, Snackbar, Stack, Switch, Table, TableBody, TableCell, TableHead, TableRow, TextField, ToggleButton, ToggleButtonGroup, Typography, useMediaQuery, useTheme, } from '@mui/material';
|
|
32
|
+
import MonitorHeartOutlinedIcon from '@mui/icons-material/MonitorHeartOutlined';
|
|
33
|
+
import { Link as RouterLink, Navigate } from 'react-router-dom';
|
|
34
|
+
import { usePlatformViewer } from '../../../core/index.js';
|
|
35
|
+
import { useTelemetryAdmin } from '../../headless/hooks/useTelemetryAdmin.js';
|
|
36
|
+
import { TelemetryConfigContext, isTelemetryOn, useTelemetryConfig } from '../../headless/context/telemetryConfig.js';
|
|
37
|
+
import { TelemetryCrossLink } from '../components/TelemetryCrossLink.js';
|
|
38
|
+
import { TELEMETRY_DASHBOARD_PATH } from '../../headless/lib/explorerHandoff.js';
|
|
39
|
+
import { useTelemetryWebAdapters } from '../../headless/adapters/TelemetryWebAdapters.js';
|
|
40
|
+
import { TelemetrySpinner } from '../components/TelemetrySpinner.js';
|
|
41
|
+
import { TELEMETRY_CONNECTION_SECTION_ID, TelemetryConnectionSection, } from '../components/TelemetryConnectionSection.js';
|
|
42
|
+
import { TelemetryServicesSection } from '../components/TelemetryServicesSection.js';
|
|
43
|
+
import { telemetryTokens } from '../../theme/telemetryTokens.js';
|
|
44
|
+
import { TELEMETRY_INSTANCE_ID_PATTERN, TELEMETRY_LIMITS, } from '../../headless/services/telemetry.js';
|
|
45
|
+
/** Mirrors the `Telemetry` card in `config/adminSections.tsx`. */
|
|
46
|
+
const PAGE_TITLE = 'Telemetry';
|
|
47
|
+
const PAGE_DESCRIPTION = 'Turn telemetry collection on, choose how long it is kept, set query limits and configure the AI assistant.';
|
|
48
|
+
export const RETENTION_PRESETS = [7, 30, 90, 180, 365];
|
|
49
|
+
const FIELD_LIMITS = {
|
|
50
|
+
retentionDays: TELEMETRY_LIMITS.retentionDays,
|
|
51
|
+
maxRows: TELEMETRY_LIMITS.maxRows,
|
|
52
|
+
timeoutSeconds: TELEMETRY_LIMITS.timeoutSeconds,
|
|
53
|
+
maxResultRowsToModel: TELEMETRY_LIMITS.maxResultRowsToModel,
|
|
54
|
+
maxSteps: TELEMETRY_LIMITS.maxSteps,
|
|
55
|
+
};
|
|
56
|
+
function modelKey(provider, modelId) {
|
|
57
|
+
return provider && modelId ? `${provider}:${modelId}` : '';
|
|
58
|
+
}
|
|
59
|
+
function toFormState(config) {
|
|
60
|
+
const preset = RETENTION_PRESETS.includes(config.retentionDays);
|
|
61
|
+
return {
|
|
62
|
+
enabled: config.enabled,
|
|
63
|
+
instanceId: config.instanceId ?? '',
|
|
64
|
+
retentionMode: preset ? 'preset' : 'custom',
|
|
65
|
+
retentionDays: String(config.retentionDays),
|
|
66
|
+
maxRows: String(config.query.maxRows),
|
|
67
|
+
timeoutSeconds: String(config.query.timeoutSeconds),
|
|
68
|
+
assistantEnabled: config.assistant.enabled,
|
|
69
|
+
model: modelKey(config.assistant.provider, config.assistant.modelId),
|
|
70
|
+
shareResults: config.assistant.shareResults,
|
|
71
|
+
maxResultRowsToModel: String(config.assistant.maxResultRowsToModel),
|
|
72
|
+
maxSteps: String(config.assistant.maxSteps),
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/** `null` when valid, else the message to show under the field. */
|
|
76
|
+
export function validateInteger(value, limits) {
|
|
77
|
+
const trimmed = value.trim();
|
|
78
|
+
if (!/^\d+$/.test(trimmed))
|
|
79
|
+
return `Enter a whole number from ${limits.min} to ${limits.max}.`;
|
|
80
|
+
const n = Number(trimmed);
|
|
81
|
+
if (n < limits.min || n > limits.max)
|
|
82
|
+
return `Must be from ${limits.min} to ${limits.max}.`;
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* `null` when valid (blank is valid: it follows the default), else the message
|
|
87
|
+
* to show under the field. Mirrors the API's pattern; the API is the gate.
|
|
88
|
+
*/
|
|
89
|
+
export function validateInstanceId(value) {
|
|
90
|
+
const trimmed = value.trim();
|
|
91
|
+
if (trimmed === '')
|
|
92
|
+
return null;
|
|
93
|
+
if (TELEMETRY_INSTANCE_ID_PATTERN.test(trimmed))
|
|
94
|
+
return null;
|
|
95
|
+
return 'Use 1-63 lowercase letters, digits, ".", "_" or "-", starting with a letter or digit.';
|
|
96
|
+
}
|
|
97
|
+
function validate(form) {
|
|
98
|
+
const errors = {};
|
|
99
|
+
for (const field of Object.keys(FIELD_LIMITS)) {
|
|
100
|
+
const error = validateInteger(form[field], FIELD_LIMITS[field]);
|
|
101
|
+
if (error)
|
|
102
|
+
errors[field] = error;
|
|
103
|
+
}
|
|
104
|
+
const instanceIdError = validateInstanceId(form.instanceId);
|
|
105
|
+
if (instanceIdError)
|
|
106
|
+
errors.instanceId = instanceIdError;
|
|
107
|
+
return errors;
|
|
108
|
+
}
|
|
109
|
+
function toSettings(form) {
|
|
110
|
+
const separator = form.model.indexOf(':');
|
|
111
|
+
const provider = separator > 0 ? form.model.slice(0, separator) : null;
|
|
112
|
+
const modelId = separator > 0 ? form.model.slice(separator + 1) : null;
|
|
113
|
+
const instanceId = form.instanceId.trim();
|
|
114
|
+
return {
|
|
115
|
+
enabled: form.enabled,
|
|
116
|
+
instanceId: instanceId === '' ? null : instanceId,
|
|
117
|
+
retentionDays: Number(form.retentionDays),
|
|
118
|
+
query: { maxRows: Number(form.maxRows), timeoutSeconds: Number(form.timeoutSeconds) },
|
|
119
|
+
assistant: {
|
|
120
|
+
enabled: form.assistantEnabled,
|
|
121
|
+
provider,
|
|
122
|
+
modelId,
|
|
123
|
+
shareResults: form.shareResults,
|
|
124
|
+
maxResultRowsToModel: Number(form.maxResultRowsToModel),
|
|
125
|
+
maxSteps: Number(form.maxSteps),
|
|
126
|
+
},
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
function formatRows(rows) {
|
|
130
|
+
return rows === null ? '—' : rows.toLocaleString();
|
|
131
|
+
}
|
|
132
|
+
function Section({ title, children }) {
|
|
133
|
+
return (_jsxs(Paper, { sx: { p: { xs: 2, sm: 3 }, mb: 3 }, component: "section", "aria-label": title, children: [_jsx(Typography, { variant: "h6", component: "h2", gutterBottom: true, children: title }), children] }));
|
|
134
|
+
}
|
|
135
|
+
/** An in-page link to the Connection section. */
|
|
136
|
+
function ConnectionLink({ children }) {
|
|
137
|
+
return _jsx(Link, { href: `#${TELEMETRY_CONNECTION_SECTION_ID}`, children: children });
|
|
138
|
+
}
|
|
139
|
+
function StatusCard({ status, error, onRefresh, }) {
|
|
140
|
+
return (_jsxs(Section, { title: "Status", children: [error && (_jsx(Alert, { severity: "error", sx: { mb: 2 }, children: error })), status && !status.configured && (_jsxs(Alert, { severity: "warning", sx: { mb: 2 }, "data-testid": "telemetry-not-configured", children: [_jsx(AlertTitle, { children: "GreptimeDB not configured" }), "The API has no connection to a telemetry store. Enter the GreptimeDB logins in the ", _jsx(ConnectionLink, { children: "Connection" }), " section and save. GreptimeDB is deployed with this application; settings saved here take effect once it is reachable, with no restart needed."] })), status && (_jsxs(_Fragment, { children: [_jsxs(Stack, { direction: "row", spacing: 1, useFlexGap: true, sx: { flexWrap: 'wrap', mb: 2 }, children: [_jsx(Chip, { size: "small", color: status.configured ? 'success' : 'default', label: status.configured ? 'Configured' : 'Not configured' }), status.configured && (_jsx(Chip, { size: "small", color: status.reachable ? 'success' : 'error', label: status.reachable ? 'Reachable' : 'Unreachable' }))] }), status.configured && status.error && (_jsx(Alert, { severity: status.reachable ? 'warning' : 'error', sx: { mb: 2 }, children: status.error })), _jsxs(Box, { component: "dl", sx: {
|
|
141
|
+
display: 'grid',
|
|
142
|
+
gridTemplateColumns: { xs: '1fr', sm: 'max-content 1fr' },
|
|
143
|
+
columnGap: 3,
|
|
144
|
+
rowGap: 0.5,
|
|
145
|
+
m: 0,
|
|
146
|
+
'& dt': { color: 'text.secondary' },
|
|
147
|
+
'& dd': { m: 0, mb: { xs: 1, sm: 0 }, wordBreak: 'break-word' },
|
|
148
|
+
}, children: [_jsx("dt", { children: "Version" }), _jsx("dd", { children: status.version ?? '—' }), _jsx("dt", { children: "Database" }), _jsx("dd", { children: status.database }), _jsx("dt", { children: "Retention in force" }), _jsxs("dd", { children: [status.ttl
|
|
149
|
+
? status.ttl.days !== null
|
|
150
|
+
? `${status.ttl.days} days (${status.ttl.raw})`
|
|
151
|
+
: status.ttl.raw
|
|
152
|
+
: 'None set', status.ttl?.days != null && status.ttl.days !== status.retentionDays && (_jsxs(Typography, { component: "span", variant: "body2", sx: { ml: 1, color: (theme) => telemetryTokens(theme).status.warn }, children: ["(setting is ", status.retentionDays, " days \u2014 the background job has not applied it yet)"] }))] })] }), status.tables.length > 0 && (_jsx(Box, { sx: { mt: 2, overflowX: 'auto' }, children: _jsxs(Table, { size: "small", "aria-label": "Telemetry tables", children: [_jsx(TableHead, { children: _jsxs(TableRow, { children: [_jsx(TableCell, { children: "Table" }), _jsx(TableCell, { align: "right", children: "Rows" })] }) }), _jsx(TableBody, { children: status.tables.map((table) => (_jsxs(TableRow, { children: [_jsx(TableCell, { sx: { fontFamily: 'monospace', wordBreak: 'break-all' }, children: table.name }), _jsx(TableCell, { align: "right", children: formatRows(table.rows) })] }, table.name))) })] }) }))] })), _jsx(Box, { sx: { mt: 2 }, children: _jsx(Button, { size: "small", onClick: onRefresh, children: "Refresh status" }) })] }));
|
|
153
|
+
}
|
|
154
|
+
function modelLabel(model) {
|
|
155
|
+
return model.label || model.modelId;
|
|
156
|
+
}
|
|
157
|
+
function supportsTools(model) {
|
|
158
|
+
return model.supportsToolCalling;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Provider + model picker over the admin AI catalogue (the app's
|
|
162
|
+
* `useAssistantModels` adapter; enabled models only). Tool-calling models are listed first:
|
|
163
|
+
* the assistant works by calling tools. Mounted only for a holder of
|
|
164
|
+
* `ai_config:read`, which the catalogue route requires.
|
|
165
|
+
*/
|
|
166
|
+
function AssistantModelSelect({ value, onChange, disabled, }) {
|
|
167
|
+
const { models, isLoading, error } = useTelemetryWebAdapters().useAssistantModels();
|
|
168
|
+
const sorted = useMemo(() => [...models].sort((a, b) => Number(supportsTools(b)) - Number(supportsTools(a))), [models]);
|
|
169
|
+
const known = sorted.some((model) => modelKey(model.provider, model.modelId) === value);
|
|
170
|
+
return (_jsxs(TextField, { select: true, fullWidth: true, size: "small", label: "Model", value: value, onChange: (event) => onChange(event.target.value), disabled: disabled || isLoading, helperText: error ??
|
|
171
|
+
'Choose an enabled model. Models that support tool calling are listed first — the assistant needs it.', error: !!error, slotProps: { htmlInput: { 'aria-label': 'Assistant model' } }, children: [_jsx(MenuItem, { value: "", children: _jsx(ListItemText, { primary: "Not set", secondary: "The assistant cannot run until a model is chosen" }) }), !known && value && (_jsx(MenuItem, { value: value, children: _jsx(ListItemText, { primary: value, secondary: "Stored, but not an enabled model" }) })), sorted.map((model) => (_jsx(MenuItem, { value: modelKey(model.provider, model.modelId), children: _jsx(ListItemText, { primary: modelLabel(model), secondary: `${model.provider}${supportsTools(model) ? ' · tool calling' : ' · tool calling not declared'}` }) }, model.id)))] }));
|
|
172
|
+
}
|
|
173
|
+
function NumberInput({ label, field, form, errors, disabled, helper, onChange, }) {
|
|
174
|
+
const limits = FIELD_LIMITS[field];
|
|
175
|
+
return (_jsx(TextField, { label: label, type: "number", size: "small", value: form[field], onChange: (event) => onChange(field, event.target.value), disabled: disabled, error: !!errors[field], helperText: errors[field] ?? helper, slotProps: { htmlInput: { min: limits.min, max: limits.max, step: 1, inputMode: 'numeric' } }, sx: { width: { xs: '100%', sm: 260 } } }));
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* The Telemetry settings page (`/admin/settings/telemetry`): collection on or
|
|
179
|
+
* off, retention, query limits, the AI assistant's switch and model, the
|
|
180
|
+
* GreptimeDB connection and the telemetry services. Shown to `telemetry:read`;
|
|
181
|
+
* saving needs `telemetry:write` (the controls are disabled without it), the
|
|
182
|
+
* model picker `ai_config:read`, the services section `system_settings:read`
|
|
183
|
+
* (`system_settings:write` to deploy). NOT behind `RequireTelemetryEnabled`:
|
|
184
|
+
* this is where telemetry is switched on. Reads the app through
|
|
185
|
+
* `PlatformHostProvider` and `TelemetryWebAdaptersProvider`.
|
|
186
|
+
*
|
|
187
|
+
* @returns the page.
|
|
188
|
+
*
|
|
189
|
+
* @extensionPoint component
|
|
190
|
+
* @stability experimental
|
|
191
|
+
*/
|
|
192
|
+
export default function TelemetrySettingsPage() {
|
|
193
|
+
const { hasPermission } = usePlatformViewer();
|
|
194
|
+
const { config, status, isLoading, loadError, statusError, isSaving, saveError, conflict, reload, refreshStatus, save, } = useTelemetryAdmin();
|
|
195
|
+
const { enabled: aiEnabled } = useTelemetryWebAdapters().useAiEnabled();
|
|
196
|
+
// The shell's shared `GET /telemetry/config`. Refreshed after a save so the
|
|
197
|
+
// hub, the rail and the explorer route learn at once. With no shell above
|
|
198
|
+
// (a test), there is nothing to refresh.
|
|
199
|
+
const sharedTelemetryConfig = useContext(TelemetryConfigContext);
|
|
200
|
+
// "Open dashboard" (#579) follows the dashboard route's own gates: the
|
|
201
|
+
// `telemetry` feature (store deployed AND collecting) and `telemetry:query`.
|
|
202
|
+
const { config: publicTelemetryConfig } = useTelemetryConfig();
|
|
203
|
+
const theme = useTheme();
|
|
204
|
+
const isPhone = useMediaQuery(theme.breakpoints.down('sm'));
|
|
205
|
+
const [form, setForm] = useState(null);
|
|
206
|
+
const [savedMessage, setSavedMessage] = useState(null);
|
|
207
|
+
// Bumped after a telemetry services deploy so the Connection section re-reads.
|
|
208
|
+
const [connectionRefresh, setConnectionRefresh] = useState(0);
|
|
209
|
+
useEffect(() => {
|
|
210
|
+
if (config)
|
|
211
|
+
setForm(toFormState(config));
|
|
212
|
+
}, [config]);
|
|
213
|
+
// Defence, not the gate — `App.tsx` wraps the route in `RequirePermission`.
|
|
214
|
+
if (!hasPermission('telemetry:read')) {
|
|
215
|
+
return _jsx(Navigate, { to: "/", replace: true });
|
|
216
|
+
}
|
|
217
|
+
const canWrite = hasPermission('telemetry:write');
|
|
218
|
+
const canOpenDashboard = isTelemetryOn(publicTelemetryConfig) && hasPermission('telemetry:query');
|
|
219
|
+
const canPickModel = hasPermission('ai_config:read');
|
|
220
|
+
// The Telemetry services section (#567) follows `telemetry-stack` routes,
|
|
221
|
+
// which enforce `system_settings:read` / `system_settings:write`.
|
|
222
|
+
const canViewServices = hasPermission('system_settings:read');
|
|
223
|
+
const canDeployServices = hasPermission('system_settings:write');
|
|
224
|
+
if (isLoading && !form) {
|
|
225
|
+
return _jsx(TelemetrySpinner, {});
|
|
226
|
+
}
|
|
227
|
+
const errors = form ? validate(form) : {};
|
|
228
|
+
const invalid = Object.keys(errors).length > 0;
|
|
229
|
+
const isDirty = !!form && !!config && JSON.stringify(form) !== JSON.stringify(toFormState(config));
|
|
230
|
+
const locked = !canWrite || isSaving;
|
|
231
|
+
const update = (key, value) => {
|
|
232
|
+
setForm((prev) => (prev ? { ...prev, [key]: value } : prev));
|
|
233
|
+
};
|
|
234
|
+
const updateNumber = (field, value) => update(field, value);
|
|
235
|
+
const handleSubmit = async (event) => {
|
|
236
|
+
event.preventDefault();
|
|
237
|
+
if (!form || invalid || !canWrite)
|
|
238
|
+
return;
|
|
239
|
+
const ok = await save(toSettings(form));
|
|
240
|
+
if (ok) {
|
|
241
|
+
setSavedMessage('Telemetry settings saved');
|
|
242
|
+
void sharedTelemetryConfig?.refresh();
|
|
243
|
+
}
|
|
244
|
+
};
|
|
245
|
+
const retentionToggleValue = form?.retentionMode === 'custom' ? 'custom' : (form?.retentionDays ?? '');
|
|
246
|
+
return (_jsx(Container, { maxWidth: "lg", children: _jsxs(Box, { sx: { py: 4 }, children: [_jsxs(Stack, { direction: "row", spacing: 1, sx: { alignItems: 'center', mb: 1 }, children: [_jsx(Typography, { variant: "h4", component: "h1", sx: { flex: 1, minWidth: 0 }, children: PAGE_TITLE }), canOpenDashboard && (_jsx(TelemetryCrossLink, { to: TELEMETRY_DASHBOARD_PATH, label: "Open dashboard", compactLabel: "Open Telemetry Dashboard", icon: _jsx(MonitorHeartOutlinedIcon, {}), compact: isPhone }))] }), _jsxs(Typography, { color: "text.secondary", sx: { mb: 2 }, children: [PAGE_DESCRIPTION, !canWrite && ' (read-only)'] }), config?.updatedBy && config.updatedAt && (_jsxs(Typography, { variant: "body2", color: "text.secondary", sx: { mb: 3 }, children: ["Last updated by ", config.updatedBy.email, " on ", new Date(config.updatedAt).toLocaleString()] })), loadError && (_jsx(Alert, { severity: "error", sx: { mb: 3 }, children: loadError })), !canWrite && !loadError && (_jsxs(Alert, { severity: "info", sx: { mb: 3 }, "data-testid": "telemetry-read-only-notice", children: ["You can read this configuration but not change it. Saving needs", ' ', _jsx("code", { children: "telemetry:write" }), "."] })), canViewServices && (_jsx(TelemetryServicesSection, { canDeploy: canDeployServices, onDeployed: () => {
|
|
247
|
+
// A fresh store changes the connection test, `available` and the
|
|
248
|
+
// status — refresh them all, and the shell's shared flag.
|
|
249
|
+
setConnectionRefresh((n) => n + 1);
|
|
250
|
+
void reload();
|
|
251
|
+
void sharedTelemetryConfig?.refresh();
|
|
252
|
+
} })), _jsx(TelemetryConnectionSection, { canWrite: canWrite, refreshToken: connectionRefresh, onChanged: (message) => {
|
|
253
|
+
setSavedMessage(message);
|
|
254
|
+
// The connection decides `available`, `retentionApplicable` and the
|
|
255
|
+
// status, so refresh all three — and the shell's shared flag.
|
|
256
|
+
void reload();
|
|
257
|
+
void sharedTelemetryConfig?.refresh();
|
|
258
|
+
} }), _jsx(StatusCard, { status: status, error: statusError, onRefresh: () => void refreshStatus() }), form && config && (_jsxs(Box, { component: "form", onSubmit: handleSubmit, noValidate: true, children: [_jsxs(Section, { title: "Collection", children: [_jsx(FormControlLabel, { control: _jsx(Switch, { checked: form.enabled, onChange: (event) => update('enabled', event.target.checked), disabled: locked, slotProps: { input: { 'aria-label': 'Collect telemetry' } } }), label: "Collect telemetry" }), _jsx(FormHelperText, { sx: { mt: 0 }, children: "Export of traces, logs and metrics starts or stops within seconds on every instance \u2014 no restart. Nothing is collected while no telemetry store is configured." }), !config.available && (_jsxs(Alert, { severity: "info", sx: { mt: 2 }, children: ["No telemetry store is configured yet, so this switch has no effect until a GreptimeDB connection is saved in the", ' ', _jsx(ConnectionLink, { children: "Connection" }), " section."] })), _jsx(Box, { sx: { mt: 3, maxWidth: { sm: 480 } }, children: _jsx(TextField, { fullWidth: true, size: "small", label: "Instance identifier", value: form.instanceId, onChange: (event) => update('instanceId', event.target.value), disabled: locked, placeholder: config.instanceIdDefault, error: !!errors.instanceId, helperText: _jsxs(_Fragment, { children: [errors.instanceId && (_jsx(Box, { component: "span", sx: { display: 'block' }, children: errors.instanceId })), "Labels every trace, log and metric as ", _jsx("code", { children: "app.instance.id" }), " so dashboards can filter and aggregate across deployments that share a telemetry store. Leave blank to use the default,", ' ', _jsx("code", { children: config.instanceIdDefault }), ". Currently in use:", ' ', _jsx("code", { "data-testid": "telemetry-instance-id-effective", children: config.instanceIdEffective }), "."] }), slotProps: {
|
|
259
|
+
htmlInput: {
|
|
260
|
+
autoCapitalize: 'none',
|
|
261
|
+
autoCorrect: 'off',
|
|
262
|
+
spellCheck: false,
|
|
263
|
+
maxLength: 63,
|
|
264
|
+
},
|
|
265
|
+
} }) })] }), _jsxs(Section, { title: "Retention", children: [_jsxs(ToggleButtonGroup, { exclusive: true, size: "small", value: retentionToggleValue, onChange: (_event, next) => {
|
|
266
|
+
if (next === null)
|
|
267
|
+
return;
|
|
268
|
+
if (next === 'custom') {
|
|
269
|
+
update('retentionMode', 'custom');
|
|
270
|
+
}
|
|
271
|
+
else {
|
|
272
|
+
setForm((prev) => prev ? { ...prev, retentionMode: 'preset', retentionDays: next } : prev);
|
|
273
|
+
}
|
|
274
|
+
}, disabled: locked, "aria-label": "Retention period", sx: { flexWrap: 'wrap', mb: 2 }, children: [RETENTION_PRESETS.map((days) => (_jsxs(ToggleButton, { value: String(days), "aria-label": `${days} days`, children: [days, " days"] }, days))), _jsx(ToggleButton, { value: "custom", "aria-label": "Custom", children: "Custom" })] }), form.retentionMode === 'custom' && (_jsx(Box, { sx: { mb: 2 }, children: _jsx(NumberInput, { label: "Retention (days)", field: "retentionDays", form: form, errors: errors, disabled: locked, helper: "From 1 to 3650 days.", onChange: updateNumber }) })), _jsx(FormHelperText, { sx: { mt: 0 }, children: "Retention is applied to the telemetry store by a background job after each save (and re-asserted nightly), so older data is dropped shortly after, not instantly." }), !config.retentionApplicable && (_jsxs(Alert, { severity: "warning", sx: { mt: 2 }, "data-testid": "retention-not-applicable", children: ["No GreptimeDB admin login is configured, so this retention period is saved but cannot be applied. Add an admin user and password in the", ' ', _jsx(ConnectionLink, { children: "Connection" }), " section."] }))] }), _jsx(Section, { title: "Query limits", children: _jsxs(Stack, { direction: { xs: 'column', sm: 'row' }, spacing: 2, children: [_jsx(NumberInput, { label: "Maximum rows per query", field: "maxRows", form: form, errors: errors, disabled: locked, helper: "From 1 to 100000. Larger results are truncated.", onChange: updateNumber }), _jsx(NumberInput, { label: "Query timeout (seconds)", field: "timeoutSeconds", form: form, errors: errors, disabled: locked, helper: "From 1 to 120.", onChange: updateNumber })] }) }), _jsxs(Section, { title: "AI assistant", children: [!aiEnabled && (_jsxs(Alert, { severity: "info", sx: { mb: 2 }, "data-testid": "telemetry-ai-off", children: ["AI is switched off for this deployment. You can configure the assistant here, but it will not run until AI is turned on in", ' ', _jsx(Link, { component: RouterLink, to: "/admin/settings/ai", children: "AI settings" }), "."] })), _jsx(FormControlLabel, { control: _jsx(Switch, { checked: form.assistantEnabled, onChange: (event) => update('assistantEnabled', event.target.checked), disabled: locked, slotProps: { input: { 'aria-label': 'Enable the telemetry assistant' } } }), label: "Enable the telemetry assistant" }), _jsx(FormHelperText, { sx: { mt: 0, mb: 2 }, children: "Lets explorer users ask questions in plain language; the assistant inspects the schema and writes and runs read-only SQL on their behalf." }), _jsxs(Stack, { spacing: 2, children: [_jsx(Box, { sx: { maxWidth: { sm: 480 } }, children: canPickModel ? (_jsx(AssistantModelSelect, { value: form.model, onChange: (key) => update('model', key), disabled: locked })) : (_jsxs(Typography, { variant: "body2", color: "text.secondary", children: ["Model: ", form.model || 'not set', " (choosing one needs", ' ', _jsx("code", { children: "ai_config:read" }), ")"] })) }), _jsxs(Box, { children: [_jsx(FormControlLabel, { control: _jsx(Switch, { checked: form.shareResults, onChange: (event) => update('shareResults', event.target.checked), disabled: locked, slotProps: {
|
|
275
|
+
input: { 'aria-label': 'Share query results with the model' },
|
|
276
|
+
} }), label: "Share query results with the model" }), _jsx(FormHelperText, { sx: { mt: 0 }, children: "Off: the model sees only column names, row counts and errors, never values." })] }), _jsxs(Stack, { direction: { xs: 'column', sm: 'row' }, spacing: 2, children: [_jsx(NumberInput, { label: "Rows shared per query", field: "maxResultRowsToModel", form: form, errors: errors, disabled: locked || !form.shareResults, helper: "From 1 to 100.", onChange: updateNumber }), _jsx(NumberInput, { label: "Maximum steps", field: "maxSteps", form: form, errors: errors, disabled: locked, helper: "Tool calls per question, from 1 to 20. 15 is recommended for investigations.", onChange: updateNumber })] })] })] }), conflict && (_jsx(Alert, { severity: "warning", sx: { mb: 3 }, "data-testid": "telemetry-conflict", action: _jsx(Button, { color: "inherit", size: "small", onClick: () => void reload(), children: "Reload" }), children: "These settings were changed by someone else since you opened this page. Reload to see the current values, then re-apply your changes." })), saveError && (_jsx(Alert, { severity: "error", sx: { mb: 3 }, children: saveError })), _jsx(Divider, { sx: { mb: 3 } }), _jsx(Button, { type: "submit", variant: "contained", disabled: locked || !isDirty || invalid, children: isSaving ? 'Saving...' : 'Save Changes' })] })), _jsx(Snackbar, { open: !!savedMessage, autoHideDuration: 3000, onClose: () => setSavedMessage(null), message: savedMessage })] }) }));
|
|
277
|
+
}
|
|
278
|
+
//# sourceMappingURL=TelemetrySettingsPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TelemetrySettingsPage.js","sourceRoot":"","sources":["../../../../src/telemetry/ui/pages/TelemetrySettingsPage.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings-page.d.ts","sourceRoot":"","sources":["../../../src/telemetry/ui/settings-page.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,kCAAkC,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
// `@marinoscar/platform-web/telemetry/ui/settings-page`: the TelemetrySettingsPage
|
|
2
|
+
// route component alone (issue #704), as a default and a named export, so
|
|
3
|
+
// the app keeps `lazy(() => import('@marinoscar/platform-web/telemetry/ui/settings-page'))`
|
|
4
|
+
// and the page stays in a chunk of its own. Documented in ../README.md.
|
|
5
|
+
export { default, default as TelemetrySettingsPage } from './pages/TelemetrySettingsPage.js';
|
|
6
|
+
//# sourceMappingURL=settings-page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings-page.js","sourceRoot":"","sources":["../../../src/telemetry/ui/settings-page.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,0EAA0E;AAC1E,4FAA4F;AAC5F,wEAAwE;AAExE,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,kCAAkC,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { createTestApiError, createTestBlobResponse, createTestPlatformHost } from './test-platform-host.js';
|
|
2
|
+
export type { TestApiRequest, TestApiResponse, TestPlatformHost, TestPlatformHostOptions, TestSseFrame, } from './test-platform-host.js';
|
|
3
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAC7G,YAAY,EACV,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,uBAAuB,EACvB,YAAY,GACb,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
// `@marinoscar/platform-web/testing`: test doubles for the web host ports
|
|
2
|
+
// (issue #696). For package tests and app tests; never in production code.
|
|
3
|
+
export { createTestApiError, createTestBlobResponse, createTestPlatformHost } from './test-platform-host.js';
|
|
4
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,2EAA2E;AAE3E,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import type { PlatformApiError, PlatformBlobResponse, PlatformWebHost } from '../core/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* One request a test host received.
|
|
4
|
+
*
|
|
5
|
+
* @stability experimental
|
|
6
|
+
*/
|
|
7
|
+
export interface TestApiRequest {
|
|
8
|
+
/** The HTTP method. */
|
|
9
|
+
method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
|
|
10
|
+
/** The path as the page passed it, query string included. */
|
|
11
|
+
path: string;
|
|
12
|
+
/** The body, for POST, PUT and PATCH. */
|
|
13
|
+
body?: unknown;
|
|
14
|
+
/** The `ifMatch` option of a PUT, PATCH or DELETE. */
|
|
15
|
+
ifMatch?: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* One frame a canned {@link PlatformApiClient.postSse} answer delivers, in order.
|
|
19
|
+
*
|
|
20
|
+
* @stability experimental
|
|
21
|
+
*/
|
|
22
|
+
export interface TestSseFrame {
|
|
23
|
+
/** The frame's `event:` name. */
|
|
24
|
+
event: string;
|
|
25
|
+
/** The frame's parsed `data:`. */
|
|
26
|
+
data: unknown;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* A canned answer: a value (resolved as the response data) or a function of
|
|
30
|
+
* the request (which may return a promise, or throw / reject to fail the call,
|
|
31
|
+
* for example with {@link createTestApiError}).
|
|
32
|
+
*
|
|
33
|
+
* @stability experimental
|
|
34
|
+
*/
|
|
35
|
+
export type TestApiResponse = unknown | ((request: TestApiRequest) => unknown);
|
|
36
|
+
/**
|
|
37
|
+
* What {@link createTestPlatformHost} takes.
|
|
38
|
+
*
|
|
39
|
+
* @stability experimental
|
|
40
|
+
*/
|
|
41
|
+
export interface TestPlatformHostOptions {
|
|
42
|
+
/** The permissions the viewer holds. Default none. */
|
|
43
|
+
permissions?: readonly string[];
|
|
44
|
+
/** The viewer's user id. Default `'test-user'`. */
|
|
45
|
+
userId?: string | null;
|
|
46
|
+
/** Feature switches. Default all off. */
|
|
47
|
+
features?: Readonly<Record<string, boolean>>;
|
|
48
|
+
/**
|
|
49
|
+
* Canned responses, looked up by `"<METHOD> <path with query>"`, then
|
|
50
|
+
* `"<METHOD> <path without query>"`, then `"<path without query>"`. An
|
|
51
|
+
* unmatched request rejects with a 404 {@link PlatformApiError}. A stream
|
|
52
|
+
* (`postSse`) answers from the same table with an array of
|
|
53
|
+
* {@link TestSseFrame}s, delivered in order.
|
|
54
|
+
*/
|
|
55
|
+
responses?: Readonly<Record<string, TestApiResponse>>;
|
|
56
|
+
/** The host's relative-time formatter. Default none (the page's fallback). */
|
|
57
|
+
formatRelativeTime?: (iso: string) => string;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* A {@link PlatformWebHost} for tests, plus the requests it received.
|
|
61
|
+
*
|
|
62
|
+
* @stability experimental
|
|
63
|
+
*/
|
|
64
|
+
export interface TestPlatformHost extends PlatformWebHost {
|
|
65
|
+
/** Every request, oldest first. */
|
|
66
|
+
readonly requests: TestApiRequest[];
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* A rejection value shaped like the app adapter's errors.
|
|
70
|
+
*
|
|
71
|
+
* @param status - the HTTP status.
|
|
72
|
+
* @param message - the API's message.
|
|
73
|
+
* @param code - the API's error code.
|
|
74
|
+
* @returns an `Error` that is also a {@link PlatformApiError}.
|
|
75
|
+
*
|
|
76
|
+
* @stability experimental
|
|
77
|
+
*/
|
|
78
|
+
export declare function createTestApiError(status: number, message: string, code?: string): Error & PlatformApiError;
|
|
79
|
+
/**
|
|
80
|
+
* A canned download for {@link PlatformApiClient.getBlob}: a body and response headers.
|
|
81
|
+
*
|
|
82
|
+
* @param body - the file's text.
|
|
83
|
+
* @param headers - response headers, e.g. `{ 'Content-Disposition': 'attachment; filename="x.json"' }`.
|
|
84
|
+
* @returns the blob response.
|
|
85
|
+
*
|
|
86
|
+
* @stability experimental
|
|
87
|
+
*/
|
|
88
|
+
export declare function createTestBlobResponse(body: string, headers?: Readonly<Record<string, string>>): PlatformBlobResponse;
|
|
89
|
+
/**
|
|
90
|
+
* Builds a host for package tests: canned API responses, a viewer with the
|
|
91
|
+
* given permissions and features, and a log of every request.
|
|
92
|
+
*
|
|
93
|
+
* @param options - see {@link TestPlatformHostOptions}.
|
|
94
|
+
* @returns the host; pass it to `PlatformHostProvider`.
|
|
95
|
+
*
|
|
96
|
+
* @example
|
|
97
|
+
* ```tsx
|
|
98
|
+
* const host = createTestPlatformHost({
|
|
99
|
+
* permissions: ['system_settings:read'],
|
|
100
|
+
* responses: { 'GET /admin/doctor': report },
|
|
101
|
+
* });
|
|
102
|
+
* render(<PlatformHostProvider host={host}><DoctorPage /></PlatformHostProvider>);
|
|
103
|
+
* ```
|
|
104
|
+
*
|
|
105
|
+
* @stability experimental
|
|
106
|
+
*/
|
|
107
|
+
export declare function createTestPlatformHost(options?: TestPlatformHostOptions): TestPlatformHost;
|
|
108
|
+
//# sourceMappingURL=test-platform-host.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-platform-host.d.ts","sourceRoot":"","sources":["../../src/testing/test-platform-host.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAEV,gBAAgB,EAChB,oBAAoB,EAEpB,eAAe,EAChB,MAAM,kBAAkB,CAAC;AAE1B;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,uBAAuB;IACvB,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;IACpD,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb,yCAAyC;IACzC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,sDAAsD;IACtD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,kCAAkC;IAClC,IAAI,EAAE,OAAO,CAAC;CACf;AAED;;;;;;GAMG;AACH,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,CAAC,CAAC,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,CAAC;AAE/E;;;;GAIG;AACH,MAAM,WAAW,uBAAuB;IACtC,sDAAsD;IACtD,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,mDAAmD;IACnD,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,yCAAyC;IACzC,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC7C;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC;IACtD,8EAA8E;IAC9E,kBAAkB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;CAC9C;AAED;;;;GAIG;AACH,MAAM,WAAW,gBAAiB,SAAQ,eAAe;IACvD,mCAAmC;IACnC,QAAQ,CAAC,QAAQ,EAAE,cAAc,EAAE,CAAC;CACrC;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,gBAAgB,CAE3G;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAM,GAAG,oBAAoB,CAMzH;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,GAAE,uBAA4B,GAAG,gBAAgB,CAoD9F"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
// A platform host for PACKAGE tests (issue #696). It answers API calls from a
|
|
2
|
+
// table of canned responses and records every request, so a packaged page can
|
|
3
|
+
// be tested without the app, its transport or a mock server.
|
|
4
|
+
/**
|
|
5
|
+
* A rejection value shaped like the app adapter's errors.
|
|
6
|
+
*
|
|
7
|
+
* @param status - the HTTP status.
|
|
8
|
+
* @param message - the API's message.
|
|
9
|
+
* @param code - the API's error code.
|
|
10
|
+
* @returns an `Error` that is also a {@link PlatformApiError}.
|
|
11
|
+
*
|
|
12
|
+
* @stability experimental
|
|
13
|
+
*/
|
|
14
|
+
export function createTestApiError(status, message, code) {
|
|
15
|
+
return Object.assign(new Error(message), { name: 'PlatformApiError', status, ...(code === undefined ? {} : { code }) });
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* A canned download for {@link PlatformApiClient.getBlob}: a body and response headers.
|
|
19
|
+
*
|
|
20
|
+
* @param body - the file's text.
|
|
21
|
+
* @param headers - response headers, e.g. `{ 'Content-Disposition': 'attachment; filename="x.json"' }`.
|
|
22
|
+
* @returns the blob response.
|
|
23
|
+
*
|
|
24
|
+
* @stability experimental
|
|
25
|
+
*/
|
|
26
|
+
export function createTestBlobResponse(body, headers = {}) {
|
|
27
|
+
const lower = new Map(Object.entries(headers).map(([name, value]) => [name.toLowerCase(), value]));
|
|
28
|
+
return {
|
|
29
|
+
blob: new Blob([body], { type: lower.get('content-type') ?? 'application/octet-stream' }),
|
|
30
|
+
headers: { get: (name) => lower.get(name.toLowerCase()) ?? null },
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Builds a host for package tests: canned API responses, a viewer with the
|
|
35
|
+
* given permissions and features, and a log of every request.
|
|
36
|
+
*
|
|
37
|
+
* @param options - see {@link TestPlatformHostOptions}.
|
|
38
|
+
* @returns the host; pass it to `PlatformHostProvider`.
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* ```tsx
|
|
42
|
+
* const host = createTestPlatformHost({
|
|
43
|
+
* permissions: ['system_settings:read'],
|
|
44
|
+
* responses: { 'GET /admin/doctor': report },
|
|
45
|
+
* });
|
|
46
|
+
* render(<PlatformHostProvider host={host}><DoctorPage /></PlatformHostProvider>);
|
|
47
|
+
* ```
|
|
48
|
+
*
|
|
49
|
+
* @stability experimental
|
|
50
|
+
*/
|
|
51
|
+
export function createTestPlatformHost(options = {}) {
|
|
52
|
+
const requests = [];
|
|
53
|
+
const responses = options.responses ?? {};
|
|
54
|
+
const permissions = new Set(options.permissions ?? []);
|
|
55
|
+
const features = options.features ?? {};
|
|
56
|
+
const call = async (request) => {
|
|
57
|
+
requests.push(request);
|
|
58
|
+
const bare = request.path.split('?')[0] ?? request.path;
|
|
59
|
+
const keys = [`${request.method} ${request.path}`, `${request.method} ${bare}`, bare];
|
|
60
|
+
const key = keys.find((k) => Object.prototype.hasOwnProperty.call(responses, k));
|
|
61
|
+
if (key === undefined) {
|
|
62
|
+
throw createTestApiError(404, `No test response for ${request.method} ${request.path}`);
|
|
63
|
+
}
|
|
64
|
+
const response = responses[key];
|
|
65
|
+
return (await (typeof response === 'function' ? response(request) : response));
|
|
66
|
+
};
|
|
67
|
+
const withIfMatch = (options) => options?.ifMatch === undefined ? {} : { ifMatch: options.ifMatch };
|
|
68
|
+
const api = {
|
|
69
|
+
get: (path) => call({ method: 'GET', path }),
|
|
70
|
+
post: (path, body) => call({ method: 'POST', path, body }),
|
|
71
|
+
put: (path, body, putOptions) => call({ method: 'PUT', path, body, ...withIfMatch(putOptions) }),
|
|
72
|
+
patch: (path, body, patchOptions) => call({ method: 'PATCH', path, body, ...withIfMatch(patchOptions) }),
|
|
73
|
+
delete: (path, deleteOptions) => call({ method: 'DELETE', path, ...withIfMatch(deleteOptions) }),
|
|
74
|
+
// Downloads answer from the same table (`'GET <path>'`, `'POST <path>'`);
|
|
75
|
+
// the canned value is a `PlatformBlobResponse`, e.g. from `createTestBlobResponse`.
|
|
76
|
+
getBlob: (path) => call({ method: 'GET', path }),
|
|
77
|
+
postBlob: (path, body) => call({ method: 'POST', path, body }),
|
|
78
|
+
// A stream answers with an array of frames; anything else delivers none.
|
|
79
|
+
postSse: async (path, body, sseOptions) => {
|
|
80
|
+
const frames = await call({ method: 'POST', path, body });
|
|
81
|
+
if (!Array.isArray(frames))
|
|
82
|
+
return;
|
|
83
|
+
for (const frame of frames) {
|
|
84
|
+
if (sseOptions.signal?.aborted)
|
|
85
|
+
return;
|
|
86
|
+
sseOptions.onFrame(frame.event, frame.data);
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
return {
|
|
91
|
+
api,
|
|
92
|
+
viewer: {
|
|
93
|
+
userId: options.userId === undefined ? 'test-user' : options.userId,
|
|
94
|
+
hasPermission: (permission) => permissions.has(permission),
|
|
95
|
+
isFeatureEnabled: (feature) => features[feature] === true,
|
|
96
|
+
},
|
|
97
|
+
...(options.formatRelativeTime ? { formatRelativeTime: options.formatRelativeTime } : {}),
|
|
98
|
+
requests,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=test-platform-host.js.map
|