andoncloud-prometheus-widget 1.3.17 → 1.3.18
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/dist/assets/thumbnail.svg +42 -0
- package/dist/index.d.ts +3 -3
- package/dist/index.js +5 -5
- package/dist/index.js.map +1 -1
- package/dist/thumbnail-B_DBfYD0.js +6 -0
- package/dist/thumbnail-B_DBfYD0.js.map +1 -0
- package/package.json +14 -14
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 180" fill="none">
|
|
2
|
+
<!-- Grid lines (rgba 255,255,255,0.1) -->
|
|
3
|
+
<line x1="40" y1="20" x2="304" y2="20" stroke="#ffffff1a" stroke-width="1"/>
|
|
4
|
+
<line x1="40" y1="50" x2="304" y2="50" stroke="#ffffff1a" stroke-width="1"/>
|
|
5
|
+
<line x1="40" y1="80" x2="304" y2="80" stroke="#ffffff1a" stroke-width="1"/>
|
|
6
|
+
<line x1="40" y1="110" x2="304" y2="110" stroke="#ffffff1a" stroke-width="1"/>
|
|
7
|
+
<line x1="40" y1="140" x2="304" y2="140" stroke="#ffffff1a" stroke-width="1"/>
|
|
8
|
+
|
|
9
|
+
<!-- Area fills -->
|
|
10
|
+
<defs>
|
|
11
|
+
<linearGradient id="g1" x1="0" y1="0" x2="0" y2="1">
|
|
12
|
+
<stop offset="0%" stop-color="#36A2EB" stop-opacity="0.3"/>
|
|
13
|
+
<stop offset="100%" stop-color="#36A2EB" stop-opacity="0"/>
|
|
14
|
+
</linearGradient>
|
|
15
|
+
<linearGradient id="g2" x1="0" y1="0" x2="0" y2="1">
|
|
16
|
+
<stop offset="0%" stop-color="#FF6384" stop-opacity="0.3"/>
|
|
17
|
+
<stop offset="100%" stop-color="#FF6384" stop-opacity="0"/>
|
|
18
|
+
</linearGradient>
|
|
19
|
+
</defs>
|
|
20
|
+
|
|
21
|
+
<!-- Line 1: Uptime (higher values) -->
|
|
22
|
+
<path d="M40,75 C70,55 100,65 140,40 C180,18 220,45 260,30 L304,36 L304,140 L40,140 Z" fill="url(#g1)"/>
|
|
23
|
+
<path d="M40,75 C70,55 100,65 140,40 C180,18 220,45 260,30 L304,36" stroke="#36A2EB" stroke-width="3" fill="none"/>
|
|
24
|
+
|
|
25
|
+
<!-- Line 2: Downtime (lower values, inverse) -->
|
|
26
|
+
<path d="M40,105 C70,90 100,100 140,80 C180,70 220,85 260,65 L304,70 L304,140 L40,140 Z" fill="url(#g2)"/>
|
|
27
|
+
<path d="M40,105 C70,90 100,100 140,80 C180,70 220,85 260,65 L304,70" stroke="#FF6384" stroke-width="3" fill="none"/>
|
|
28
|
+
|
|
29
|
+
<!-- Line 3: removed -->
|
|
30
|
+
|
|
31
|
+
<!-- X-axis time labels -->
|
|
32
|
+
<text x="60" y="155" text-anchor="middle" font-size="8" font-family="Inter, system-ui" fill="#A7ADB6">06:00</text>
|
|
33
|
+
<text x="126" y="155" text-anchor="middle" font-size="8" font-family="Inter, system-ui" fill="#A7ADB6">08:00</text>
|
|
34
|
+
<text x="192" y="155" text-anchor="middle" font-size="8" font-family="Inter, system-ui" fill="#A7ADB6">10:00</text>
|
|
35
|
+
<text x="258" y="155" text-anchor="middle" font-size="8" font-family="Inter, system-ui" fill="#A7ADB6">12:00</text>
|
|
36
|
+
|
|
37
|
+
<!-- Legend -->
|
|
38
|
+
<line x1="44" y1="10" x2="58" y2="10" stroke="#36A2EB" stroke-width="2"/>
|
|
39
|
+
<text x="62" y="13" font-size="9" font-family="Inter, system-ui" fill="#A7ADB6">Uptime</text>
|
|
40
|
+
<line x1="120" y1="10" x2="134" y2="10" stroke="#FF6384" stroke-width="2"/>
|
|
41
|
+
<text x="138" y="13" font-size="9" font-family="Inter, system-ui" fill="#A7ADB6">Downtime</text>
|
|
42
|
+
</svg>
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { t as thumbnail_default } from "./thumbnail-B_DBfYD0.js";
|
|
1
2
|
import { BaseWidgetData, BaseWidgetSettings, FilterValues, ListShifts_Shift, WidgetProps } from "andoncloud-dashboard-toolkit";
|
|
2
3
|
//#region src/types.d.ts
|
|
3
4
|
interface WidgetSettingsData {
|
|
@@ -30,12 +31,11 @@ declare const getDisplayName: (lang: string) => string;
|
|
|
30
31
|
declare const getTitle: (_data: WidgetData | undefined, settings: WidgetSettings | undefined, _filters: FilterValues | undefined, lang: string) => string;
|
|
31
32
|
//#endregion
|
|
32
33
|
//#region src/version.d.ts
|
|
33
|
-
declare const LIBRARY_VERSION = "1.3.
|
|
34
|
+
declare const LIBRARY_VERSION = "1.3.18";
|
|
34
35
|
//#endregion
|
|
35
36
|
//#region src/index.d.ts
|
|
36
|
-
declare const thumbnail: string | undefined;
|
|
37
37
|
declare const requiredFeatures: string[];
|
|
38
38
|
declare const extraPermissions: string[];
|
|
39
39
|
//#endregion
|
|
40
|
-
export { Widget, extraPermissions, getDisplayName, getTitle, requiredFeatures, thumbnail, LIBRARY_VERSION as version };
|
|
40
|
+
export { Widget, extraPermissions, getDisplayName, getTitle, requiredFeatures, thumbnail_default as thumbnail, LIBRARY_VERSION as version };
|
|
41
41
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { t as thumbnail_default } from "./thumbnail-B_DBfYD0.js";
|
|
1
2
|
import { registerTranslations } from "andoncloud-sdk";
|
|
2
3
|
import { useCallback, useEffect, useRef, useState } from "react";
|
|
3
4
|
import { generateTimeRange, getCurrentShift, getRecentShift, normalizeShifts, useGqlClients } from "andoncloud-dashboard-toolkit";
|
|
@@ -8,12 +9,12 @@ import { TabContext, TabList, TabPanel } from "@mui/lab";
|
|
|
8
9
|
import { Box, Button, FormControl, FormHelperText, IconButton, InputLabel, MenuItem, Select, Stack, Tab, TextField } from "@mui/material";
|
|
9
10
|
import { getIn } from "formik";
|
|
10
11
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
12
|
+
import "chartjs-adapter-dayjs-4";
|
|
11
13
|
import { Line } from "react-chartjs-2";
|
|
12
14
|
import { CategoryScale, Chart, Filler, Legend, LineElement, LinearScale, PointElement, TimeScale, Tooltip } from "chart.js";
|
|
13
|
-
import "chartjs-adapter-dayjs-4";
|
|
14
|
-
import { PrometheusDriver } from "prometheus-query";
|
|
15
15
|
import dayjs from "dayjs";
|
|
16
16
|
import pick from "lodash.pick";
|
|
17
|
+
import { PrometheusDriver } from "prometheus-query";
|
|
17
18
|
import Color from "color";
|
|
18
19
|
import { satisfies } from "compare-versions";
|
|
19
20
|
import * as yup from "yup";
|
|
@@ -69,7 +70,7 @@ const resources = {
|
|
|
69
70
|
};
|
|
70
71
|
//#endregion
|
|
71
72
|
//#region src/version.ts
|
|
72
|
-
const LIBRARY_VERSION = "1.3.
|
|
73
|
+
const LIBRARY_VERSION = "1.3.18";
|
|
73
74
|
//#endregion
|
|
74
75
|
//#region src/types.ts
|
|
75
76
|
let QueriesPeriod = /* @__PURE__ */ function(QueriesPeriod) {
|
|
@@ -591,10 +592,9 @@ const getTitle = (_data, settings, _filters, lang) => {
|
|
|
591
592
|
//#endregion
|
|
592
593
|
//#region src/index.tsx
|
|
593
594
|
registerTranslations(resources);
|
|
594
|
-
const thumbnail = void 0;
|
|
595
595
|
const requiredFeatures = ["feature.prometheus-widget"];
|
|
596
596
|
const extraPermissions = [];
|
|
597
597
|
//#endregion
|
|
598
|
-
export { Widget, extraPermissions, getDisplayName, getTitle, requiredFeatures, thumbnail, LIBRARY_VERSION as version };
|
|
598
|
+
export { Widget, extraPermissions, getDisplayName, getTitle, requiredFeatures, thumbnail_default as thumbnail, LIBRARY_VERSION as version };
|
|
599
599
|
|
|
600
600
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["en","pl","ChartJS","locales","locales"],"sources":["../src/locales/en/translation.json","../src/locales/pl/translation.json","../src/locales/index.ts","../src/version.ts","../src/types.ts","../src/components/SettingsFormContent/index.tsx","../src/helpers.ts","../src/components/PrometheusChart/GradientPlugin.ts","../src/components/PrometheusChart/index.tsx","../src/components/WidgetView/index.tsx","../src/components/Widget/utils.ts","../src/components/Widget/index.tsx","../src/core/title.ts","../src/index.tsx"],"sourcesContent":["","","import en from './en/translation.json';\nimport pl from './pl/translation.json';\n\nconst resources = {\n en: {\n translation: en,\n },\n pl: {\n translation: pl,\n },\n};\n\nexport default resources;\n","export const LIBRARY_VERSION = '1.3.17';\n","import type { BaseWidgetData, BaseWidgetSettings, ListShifts_Shift } from 'andoncloud-dashboard-toolkit';\nimport { BaseWidgetViewProps } from 'andoncloud-widget-base';\n\ninterface WidgetSettingsData {\n shifts: ListShifts_Shift[];\n}\n\nexport interface WidgetData extends BaseWidgetData, WidgetSettingsData {}\n\nexport interface PrometheusQuery {\n query: string;\n displayName?: string;\n}\n\nexport interface WidgetSettings extends BaseWidgetSettings {\n customTitle: string;\n endpointUrl: string;\n queriesPeriod: QueriesPeriod;\n prometheusQueries: PrometheusQuery[];\n displayedQueryParams: string[];\n xAxisUnit: string;\n yAxisUnit: string;\n}\n\nexport interface WidgetViewProps extends BaseWidgetViewProps<WidgetData, WidgetSettings> {}\n\nexport enum QueriesPeriod {\n CURRENT_SHIFT = 'CURRENT_SHIFT',\n PREVIOUS_SHIFT = 'PREVIOUS_SHIFT',\n}\n\nexport interface QueriesTimeRange {\n startedAt: Date | number;\n finishedAt?: Date;\n}\n\nexport interface PrometheusChartProps {\n data: WidgetData;\n settings: WidgetSettings;\n}\n","import { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { Clear } from '@mui/icons-material';\nimport { TabContext, TabList, TabPanel } from '@mui/lab';\nimport {\n Box,\n Button,\n FormControl,\n FormHelperText,\n IconButton,\n InputLabel,\n MenuItem,\n Select,\n Stack,\n Tab,\n TextField,\n} from '@mui/material';\nimport { SettingsFormContentProps } from 'andoncloud-widget-base';\nimport { getIn } from 'formik';\n\nimport { PrometheusQuery, QueriesPeriod, WidgetData, WidgetSettings } from '@/types';\n\nconst SettingsFormContent: React.FC<SettingsFormContentProps<WidgetData, WidgetSettings>> = ({ formProps }) => {\n // -- Local state --\n const [selectedTab, setSelectedTab] = useState('settings');\n const emptyQueryItem = { query: '', displayName: '' };\n const formControlStyles = { mt: 2 };\n\n // -- Translation --\n const { t } = useTranslation();\n\n const setPrometheusQuery = (i: number, item: PrometheusQuery) => {\n const queries = [...(formProps.values.prometheusQueries || [emptyQueryItem])];\n\n queries[i] = { ...queries[i], ...item };\n\n formProps.setFieldValue('prometheusQueries', queries);\n };\n\n const addQueryField = () => {\n const queries = [...(formProps.values.prometheusQueries || [emptyQueryItem])];\n\n formProps.setFieldValue('prometheusQueries', [...queries, emptyQueryItem]);\n };\n\n const removeQueryField = (i: number) => {\n const queries = [...(formProps.values.prometheusQueries || [emptyQueryItem])];\n\n queries.splice(i, 1);\n\n formProps.setFieldValue('prometheusQueries', queries);\n };\n\n const setDisplayedQueryParam = (i: number, value: string) => {\n const params = [...(formProps.values.displayedQueryParams || [''])];\n\n params[i] = value;\n\n formProps.setFieldValue('displayedQueryParams', params);\n };\n\n const addDisplayedQueryParam = () => {\n const params = [...(formProps.values.displayedQueryParams || [''])];\n\n formProps.setFieldValue('displayedQueryParams', [...params, '']);\n };\n\n const removeDisplayedQueryParam = (i: number) => {\n const params = [...(formProps.values.displayedQueryParams || [''])];\n\n params.splice(i, 1);\n\n formProps.setFieldValue('displayedQueryParams', params);\n };\n\n const mapPeriodToLabel = (period: QueriesPeriod) => {\n switch (period) {\n case QueriesPeriod.PREVIOUS_SHIFT:\n return t('prometheusWidget.previousShift');\n default:\n return t('prometheusWidget.currentShift');\n }\n };\n\n return (\n <TabContext value={selectedTab}>\n <TabList onChange={(_, value) => setSelectedTab(value)} centered>\n <Tab label={t('prometheusWidget.settings')} value=\"settings\" />\n <Tab label={t('prometheusWidget.advanced')} value=\"advanced\" />\n </TabList>\n\n <TabPanel value=\"settings\">\n <Box mb={2}>\n <FormControl sx={formControlStyles} fullWidth>\n <TextField\n name=\"endpointUrl\"\n label={t('prometheusWidget.endpointUrl')}\n value={formProps.values.endpointUrl}\n onChange={formProps.handleChange}\n onBlur={formProps.handleBlur}\n error={formProps.touched.endpointUrl && Boolean(formProps.errors.endpointUrl)}\n helperText={formProps.touched.endpointUrl && formProps.errors.endpointUrl}\n data-testid=\"prometheus.settings.endpoint-url\"\n fullWidth\n />\n </FormControl>\n <FormControl sx={formControlStyles} fullWidth>\n <InputLabel id=\"queries-period-label\">{t('prometheusWidget.period')}</InputLabel>\n <Select\n variant=\"outlined\"\n name=\"queriesPeriod\"\n labelId=\"queries-period-label\"\n value={formProps.values.queriesPeriod || QueriesPeriod.CURRENT_SHIFT}\n onChange={formProps.handleChange}\n onBlur={formProps.handleBlur}\n error={formProps.touched.queriesPeriod && Boolean(formProps.errors.queriesPeriod)}\n data-testid=\"prometheus.settings.period-select\"\n fullWidth\n >\n {Object.keys(QueriesPeriod).map((key) => (\n // @ts-expect-error no typings\n <MenuItem key={key} value={QueriesPeriod[key]}>\n {/* @ts-expect-error no typings */}\n {mapPeriodToLabel(QueriesPeriod[key])}\n </MenuItem>\n ))}\n </Select>\n <FormHelperText error>{formProps.touched.queriesPeriod && formProps.errors.queriesPeriod}</FormHelperText>\n </FormControl>\n {(formProps.values.prometheusQueries || [emptyQueryItem]).map(({ query, displayName }, i) => (\n <FormControl key={i} sx={formControlStyles} fullWidth>\n <Stack direction=\"row\" width=\"100%\" gap={1}>\n <TextField\n label={t('prometheusWidget.query')}\n value={query}\n onChange={(e) => setPrometheusQuery(i, { query: e.target.value })}\n onBlur={formProps.handleBlur}\n error={\n formProps.touched.prometheusQueries?.[i]?.query &&\n Boolean(getIn(formProps.errors, `prometheusQueries.[${i}].query`))\n }\n helperText={\n formProps.touched.prometheusQueries?.[i]?.query &&\n getIn(formProps.errors, `prometheusQueries.[${i}].query`)\n }\n data-testid={`prometheus.settings.query-input-${i}`}\n fullWidth\n />\n <TextField\n label={t('prometheusWidget.name')}\n value={displayName}\n onChange={(e) => setPrometheusQuery(i, { query, displayName: e.target.value })}\n onBlur={formProps.handleBlur}\n error={\n formProps.touched.prometheusQueries?.[i]?.displayName &&\n Boolean(getIn(formProps.errors, `prometheusQueries.[${i}].displayName`))\n }\n helperText={\n formProps.touched.prometheusQueries?.[i]?.displayName &&\n getIn(formProps.errors, `prometheusQueries.[${i}].displayName`)\n }\n data-testid={`prometheus.settings.query-name-${i}`}\n fullWidth\n />\n <IconButton\n color=\"error\"\n onClick={() => removeQueryField(i)}\n data-testid={`prometheus.settings.remove-query-${i}`}\n >\n <Clear />\n </IconButton>\n </Stack>\n </FormControl>\n ))}\n <Button\n color=\"secondary\"\n onClick={addQueryField}\n sx={{ mt: (theme) => theme.spacing(2) }}\n data-testid=\"prometheus.settings.add-query\"\n fullWidth\n >\n {t('prometheusWidget.addAnotherQuery')}\n </Button>\n {(formProps.values.displayedQueryParams || ['']).map((param, i) => (\n <FormControl key={i} sx={formControlStyles} fullWidth>\n <Stack direction=\"row\" width=\"100%\">\n <TextField\n label={t('prometheusWidget.displayedQueryParameter')}\n value={param}\n onChange={(e) => setDisplayedQueryParam(i, e.target.value)}\n error={\n // @ts-expect-error no typings\n formProps.touched.displayedQueryParams?.[i] &&\n Boolean(getIn(formProps.errors, `displayedQueryParams.[${i}]`))\n }\n helperText={\n // @ts-expect-error no typings\n formProps.touched.displayedQueryParams?.[i] &&\n getIn(formProps.errors, `displayedQueryParams.[${i}]`)\n }\n data-testid={`prometheus.settings.param-input-${i}`}\n fullWidth\n />\n <IconButton\n color=\"error\"\n onClick={() => removeDisplayedQueryParam(i)}\n data-testid={`prometheus.settings.remove-param-${i}`}\n >\n <Clear />\n </IconButton>\n </Stack>\n </FormControl>\n ))}\n <Button\n color=\"secondary\"\n onClick={addDisplayedQueryParam}\n sx={{ mt: (theme) => theme.spacing(2) }}\n data-testid=\"prometheus.settings.add-param\"\n fullWidth\n >\n {t('prometheusWidget.addAnotherDisplayedQueryParameter')}\n </Button>\n <FormControl sx={formControlStyles} fullWidth>\n <TextField\n name=\"xAxisUnit\"\n label={t('prometheusWidget.xAxisUnit')}\n value={formProps.values.xAxisUnit || ''}\n onChange={formProps.handleChange}\n onBlur={formProps.handleBlur}\n error={formProps.touched.xAxisUnit && Boolean(formProps.errors.xAxisUnit)}\n helperText={formProps.touched.xAxisUnit && formProps.errors.xAxisUnit}\n data-testid=\"prometheus.settings.x-axis-unit\"\n fullWidth\n />\n </FormControl>\n <FormControl sx={formControlStyles} fullWidth>\n <TextField\n name=\"yAxisUnit\"\n label={t('prometheusWidget.yAxisUnit')}\n value={formProps.values.yAxisUnit || ''}\n onChange={formProps.handleChange}\n onBlur={formProps.handleBlur}\n error={formProps.touched.yAxisUnit && Boolean(formProps.errors.yAxisUnit)}\n helperText={formProps.touched.yAxisUnit && formProps.errors.yAxisUnit}\n data-testid=\"prometheus.settings.y-axis-unit\"\n fullWidth\n />\n </FormControl>\n </Box>\n </TabPanel>\n\n <TabPanel value=\"advanced\">\n <TextField\n name=\"customTitle\"\n label={t('prometheusWidget.customTitle')}\n value={formProps.values.customTitle}\n onChange={formProps.handleChange}\n data-testid=\"prometheus.settings.custom-title\"\n fullWidth\n />\n </TabPanel>\n </TabContext>\n );\n};\n\nexport default SettingsFormContent;\n","import { generateTimeRange, getCurrentShift, getRecentShift, normalizeShifts } from 'andoncloud-dashboard-toolkit';\nimport dayjs from 'dayjs';\n\nimport { QueriesPeriod, QueriesTimeRange, WidgetData } from './types';\n\nexport { generateTimeRange };\n\nexport const getQueriesTimeRange = (period: QueriesPeriod, data: WidgetData): QueriesTimeRange | null => {\n const currentDate = dayjs();\n const normalizedShifts = normalizeShifts(data?.shifts, currentDate);\n const currentShift = getCurrentShift(currentDate, normalizedShifts);\n const recentShift = getRecentShift(currentDate, normalizedShifts);\n\n switch (period) {\n case QueriesPeriod.CURRENT_SHIFT:\n if (currentShift) {\n return {\n startedAt: currentShift.startedAt.toDate(),\n finishedAt: currentShift.finishedAt.toDate(),\n };\n }\n if (recentShift) {\n return {\n startedAt: recentShift.startedAt.toDate(),\n finishedAt: recentShift.finishedAt.toDate(),\n };\n }\n return null;\n case QueriesPeriod.PREVIOUS_SHIFT:\n if (recentShift) {\n return {\n startedAt: recentShift.startedAt.toDate(),\n finishedAt: recentShift.finishedAt.toDate(),\n };\n }\n return null;\n default:\n return null;\n }\n};\n","import { Chart, ChartArea, Plugin } from 'chart.js';\nimport Color from 'color';\n\nconst createGradient = (ctx: CanvasRenderingContext2D, area: ChartArea) => {\n return ctx.createLinearGradient(0, area.bottom, 0, area.top);\n};\n\nconst GradientPlugin: Plugin = {\n id: 'gradient',\n beforeDatasetsUpdate(chart: Chart) {\n const ctx = chart.ctx;\n const datasets = chart.data.datasets;\n\n if (ctx && datasets) {\n for (let i = 0; i < datasets.length; i++) {\n const dataset = datasets[i];\n const meta = chart.getDatasetMeta(i);\n const scale = chart.scales[meta.yAxisID as string];\n\n if (scale) {\n const gradient = createGradient(ctx, scale);\n const borderColor = Color(dataset.borderColor as string);\n\n gradient.addColorStop(0, borderColor.alpha(0.1).hexa());\n gradient.addColorStop(1, borderColor.alpha(0.5).hexa());\n\n dataset.backgroundColor = gradient;\n }\n }\n }\n },\n};\n\nexport default GradientPlugin;\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport { Line } from 'react-chartjs-2';\n\nimport {\n Chart as ChartJS,\n CategoryScale,\n LinearScale,\n TimeScale,\n PointElement,\n LineElement,\n Filler,\n Legend,\n Tooltip,\n ChartData,\n} from 'chart.js';\nimport 'chartjs-adapter-dayjs-4';\nimport { PrometheusDriver } from 'prometheus-query';\nimport dayjs from 'dayjs';\nimport pick from 'lodash.pick';\n\nimport { generateTimeRange, getQueriesTimeRange } from '@/helpers';\nimport { PrometheusChartProps, QueriesPeriod, QueriesTimeRange } from '@/types';\n\nimport GradientPlugin from './GradientPlugin';\n\nChartJS.register(CategoryScale, LinearScale, TimeScale, PointElement, LineElement, Filler, Legend, Tooltip);\n\nChartJS.defaults.font.size = 12;\nChartJS.defaults.color = 'rgba(255, 255, 255, 0.75)';\n\nconst COLORS = [\n '#36A2EB', '#FF6384', '#4BC0C0', '#FF9F40', '#9966FF',\n '#FFCD56', '#C9CBCF', '#7BC8A4', '#E7E9ED', '#FF6B6B',\n];\n\nconst PrometheusChart: React.FC<PrometheusChartProps> = ({ data, settings }) => {\n const chart = useRef<ChartJS<'line'>>(null);\n const [chartData, setChartData] = useState<ChartData<'line'>>({ labels: [], datasets: [] });\n const [queriesTimeRange, setQueriesTimeRange] = useState<QueriesTimeRange | null>(null);\n const [timeLabels, setTimeLabels] = useState<Date[]>([]);\n const hiddenSeriesRef = useRef<Record<string, boolean>>({});\n\n const fetchData = useCallback(async (timeRange: QueriesTimeRange) => {\n if (!settings.endpointUrl || !settings.prometheusQueries?.length) return;\n\n const driver = new PrometheusDriver({ endpoint: settings.endpointUrl });\n const start = new Date(timeRange.startedAt);\n const end = timeRange.finishedAt ? new Date(timeRange.finishedAt) : new Date();\n const step = 30;\n\n // Save hidden state before updating\n if (chart.current) {\n for (let i = 0; i < chart.current.data.datasets.length; i++) {\n const ds = chart.current.data.datasets[i];\n if (ds.label) {\n hiddenSeriesRef.current[ds.label] = !chart.current.isDatasetVisible(i);\n }\n }\n }\n\n const queries = settings.prometheusQueries.map(({ query }) => query);\n const results = await Promise.all(\n queries.map((query) => driver.rangeQuery(query, start, end, step)),\n );\n\n let seriesIndex = 0;\n const datasets = results.flatMap((result, queryIndex) =>\n result.result.map((serie) => {\n const idx = seriesIndex++;\n const queryConfig = settings.prometheusQueries[queryIndex];\n const metricLabels = serie.metric.labels || {};\n const filteredValues = Object.values(pick(metricLabels, settings.displayedQueryParams)).join(' - ');\n\n let label: string;\n if (queryConfig?.displayName) {\n label = filteredValues ? `${queryConfig.displayName} - ${filteredValues}` : queryConfig.displayName;\n } else {\n const metricName = serie.metric.name || queryConfig?.query || '';\n label = filteredValues ? `${metricName} ${JSON.stringify(pick(metricLabels, settings.displayedQueryParams))}` : metricName;\n }\n\n return {\n label,\n data: serie.values.map((v: { time: Date; value: number }) => ({\n x: v.time,\n y: v.value,\n })),\n fill: true,\n tension: 0.4,\n borderColor: COLORS[idx % COLORS.length],\n backgroundColor: COLORS[idx % COLORS.length],\n borderWidth: 3,\n pointRadius: 0,\n hidden: hiddenSeriesRef.current[label] || false,\n };\n }),\n );\n\n setChartData({ labels: [], datasets });\n }, [settings.endpointUrl, settings.prometheusQueries]);\n\n useEffect(() => {\n if (queriesTimeRange) {\n const startedAt = dayjs(queriesTimeRange.startedAt);\n const finishedAt = dayjs(queriesTimeRange.finishedAt);\n setTimeLabels(generateTimeRange(startedAt, finishedAt, 'minutes', 15).map((d) => d.toDate()));\n fetchData(queriesTimeRange);\n }\n }, [queriesTimeRange, fetchData]);\n\n useEffect(() => {\n setQueriesTimeRange(getQueriesTimeRange(settings.queriesPeriod, data));\n\n if (settings?.queriesPeriod === QueriesPeriod.CURRENT_SHIFT) {\n const intervalId = setInterval(() => {\n const nextTimeRange = getQueriesTimeRange(settings.queriesPeriod, data);\n setQueriesTimeRange(nextTimeRange);\n }, 30_000);\n\n return () => {\n clearInterval(intervalId);\n };\n }\n return () => {};\n }, [data, settings]);\n\n return (\n queriesTimeRange && (\n <Line\n ref={chart}\n data={chartData}\n plugins={[GradientPlugin]}\n options={{\n scales: {\n x: {\n type: 'time',\n labels: timeLabels as unknown as string[],\n time: {\n displayFormats: {\n millisecond: 'HH:mm:ss.SSS',\n second: 'HH:mm:ss',\n minute: 'HH:mm',\n hour: 'HH',\n },\n },\n ticks: {\n source: 'labels',\n },\n grid: {\n color: 'rgba(255, 255, 255, 0.1)',\n },\n ...(settings.xAxisUnit && {\n title: {\n display: true,\n text: settings.xAxisUnit,\n },\n }),\n },\n y: {\n grid: {\n color: 'rgba(255, 255, 255, 0.1)',\n },\n ...(settings.yAxisUnit && {\n title: {\n display: true,\n text: settings.yAxisUnit,\n },\n }),\n },\n },\n elements: {\n point: {\n radius: 0,\n },\n },\n maintainAspectRatio: false,\n animation: {\n duration: 0,\n },\n plugins: {\n legend: {},\n },\n }}\n />\n )\n );\n};\n\nexport default PrometheusChart;\n","import { Box } from '@mui/material';\n\nimport { WidgetViewProps } from '@/types';\n\nimport PrometheusChart from '../PrometheusChart';\n\nconst WidgetView: React.FC<WidgetViewProps> = ({ data, settings }) => {\n return (\n <Box display=\"flex\" width=\"100%\" minWidth=\"500px\" height=\"100%\" minHeight=\"250px\" p={2}>\n {settings && <PrometheusChart data={data} settings={settings} />}\n </Box>\n );\n};\n\nexport default WidgetView;\n","import { satisfies } from 'compare-versions';\nimport { TFunction } from 'i18next';\nimport * as yup from 'yup';\n\nimport { QueriesPeriod, WidgetSettings } from '@/types';\n\nexport const getSettingsFormProps = (t: TFunction) => {\n yup.setLocale({\n mixed: {\n required: t('prometheusWidget.thisFieldIsRequired'),\n },\n });\n return {\n initialValues: {\n customTitle: '',\n endpointUrl: '',\n queriesPeriod: QueriesPeriod.CURRENT_SHIFT,\n prometheusQueries: [],\n displayedQueryParams: [],\n xAxisUnit: '',\n yAxisUnit: '',\n },\n validationSchema: yup.object({\n endpointUrl: yup.string().required(),\n queriesPeriod: yup.string().required(),\n prometheusQueries: yup.array().of(\n yup.object().shape({\n query: yup.string().required(),\n displayName: yup.string().required(),\n }),\n ),\n displayedQueryParams: yup.array().of(yup.string().required()),\n xAxisUnit: yup.string().required(),\n yAxisUnit: yup.string().required(),\n }),\n };\n};\n\nexport const migrateSettings = (settings: WidgetSettings) => {\n if (!satisfies(settings.version || '1.0.0', '>=1.2.5')) {\n return {\n ...settings,\n prometheusQueries: settings.prometheusQueries.map((query) => ({ query, displayName: '' })),\n };\n }\n return settings;\n};\n","import { useEffect, useState } from 'react';\n\nimport { useGqlClients, WidgetProps } from 'andoncloud-dashboard-toolkit';\nimport { BaseWidget } from 'andoncloud-widget-base';\n\nimport locales from '@/locales';\nimport { WidgetData, WidgetSettings } from '@/types';\nimport { LIBRARY_VERSION } from '@/version';\n\nimport SettingsFormContent from '../SettingsFormContent';\nimport WidgetView from '../WidgetView';\n\nimport { getSettingsFormProps, migrateSettings } from './utils';\n\nconst Widget: React.FC<WidgetProps<WidgetData, WidgetSettings>> = ({ url, wsUrl, lang, data, ...widgetProps }) => {\n const { graphqlSdk, gqlWsClient } = useGqlClients({ url, wsUrl, lang });\n const [widgetData, setWidgetData] = useState<WidgetData | undefined>(data);\n\n useEffect(() => {\n if (!data && graphqlSdk) {\n graphqlSdk\n .listShifts()\n .then(({ shifts }) =>\n setWidgetData((current: WidgetData) => ({\n ...(current || {}),\n shifts,\n })),\n )\n .catch(() => {});\n }\n }, [data, graphqlSdk]);\n\n return (\n <BaseWidget\n {...widgetProps}\n url={url}\n lang={lang}\n locales={locales}\n data={widgetData}\n gqlClients={{ graphqlSdk, gqlWsClient }}\n WidgetView={WidgetView}\n getSettingsFormProps={getSettingsFormProps}\n SettingsFormContent={SettingsFormContent}\n migrateSettings={migrateSettings}\n version={LIBRARY_VERSION}\n data-testid=\"prometheus-widget\"\n />\n );\n};\n\nexport default Widget;\n","import type { FilterValues } from 'andoncloud-dashboard-toolkit';\nimport i18n from 'i18next';\n\nimport type { WidgetData, WidgetSettings } from '../types';\n\nconst ns = 'prometheusWidget';\n\nconst t = (key: string, lng: string, options?: Record<string, unknown>) => i18n.t(`${ns}.${key}`, { lng, ...options });\n\nexport const getDisplayName = (lang: string) => t('displayName', lang);\n\nexport const getTitle = (\n _data: WidgetData | undefined,\n settings: WidgetSettings | undefined,\n _filters: FilterValues | undefined,\n lang: string,\n): string => {\n const name = getDisplayName(lang);\n\n if (!settings?.prometheusQueries?.length) return name;\n\n const queryCount = settings.prometheusQueries.length;\n const period =\n settings.queriesPeriod === 'CURRENT_SHIFT' ? t('titleCurrentShift', lang) : t('titlePreviousShift', lang);\n\n return `${name} — ${t('titleQueries', lang, { count: queryCount })}, ${period}`;\n};\n","import { registerTranslations } from 'andoncloud-sdk';\n\nimport locales from './locales';\n\nregisterTranslations(locales);\n\nexport { default as Widget } from './components/Widget';\nexport { getDisplayName, getTitle } from './core/title';\n\nexport const thumbnail: string | undefined = undefined;\n\nexport const requiredFeatures: string[] = ['feature.prometheus-widget'];\nexport const extraPermissions: string[] = [];\n\nexport { LIBRARY_VERSION as version } from './version';\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["en","pl","ChartJS","locales","locales"],"sources":["../src/locales/en/translation.json","../src/locales/pl/translation.json","../src/locales/index.ts","../src/version.ts","../src/types.ts","../src/components/SettingsFormContent/index.tsx","../src/helpers.ts","../src/components/PrometheusChart/GradientPlugin.ts","../src/components/PrometheusChart/index.tsx","../src/components/WidgetView/index.tsx","../src/components/Widget/utils.ts","../src/components/Widget/index.tsx","../src/core/title.ts","../src/index.tsx"],"sourcesContent":["","","import en from './en/translation.json';\nimport pl from './pl/translation.json';\n\nconst resources = {\n en: {\n translation: en,\n },\n pl: {\n translation: pl,\n },\n};\n\nexport default resources;\n","export const LIBRARY_VERSION = '1.3.18';\n","import type { BaseWidgetData, BaseWidgetSettings, ListShifts_Shift } from 'andoncloud-dashboard-toolkit';\nimport { BaseWidgetViewProps } from 'andoncloud-widget-base';\n\ninterface WidgetSettingsData {\n shifts: ListShifts_Shift[];\n}\n\nexport interface WidgetData extends BaseWidgetData, WidgetSettingsData {}\n\nexport interface PrometheusQuery {\n query: string;\n displayName?: string;\n}\n\nexport interface WidgetSettings extends BaseWidgetSettings {\n customTitle: string;\n endpointUrl: string;\n queriesPeriod: QueriesPeriod;\n prometheusQueries: PrometheusQuery[];\n displayedQueryParams: string[];\n xAxisUnit: string;\n yAxisUnit: string;\n}\n\nexport interface WidgetViewProps extends BaseWidgetViewProps<WidgetData, WidgetSettings> {}\n\nexport enum QueriesPeriod {\n CURRENT_SHIFT = 'CURRENT_SHIFT',\n PREVIOUS_SHIFT = 'PREVIOUS_SHIFT',\n}\n\nexport interface QueriesTimeRange {\n startedAt: Date | number;\n finishedAt?: Date;\n}\n\nexport interface PrometheusChartProps {\n data: WidgetData;\n settings: WidgetSettings;\n}\n","import { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { Clear } from '@mui/icons-material';\nimport { TabContext, TabList, TabPanel } from '@mui/lab';\nimport {\n Box,\n Button,\n FormControl,\n FormHelperText,\n IconButton,\n InputLabel,\n MenuItem,\n Select,\n Stack,\n Tab,\n TextField,\n} from '@mui/material';\nimport { SettingsFormContentProps } from 'andoncloud-widget-base';\nimport { getIn } from 'formik';\n\nimport { PrometheusQuery, QueriesPeriod, WidgetData, WidgetSettings } from '@/types';\n\nconst SettingsFormContent: React.FC<SettingsFormContentProps<WidgetData, WidgetSettings>> = ({ formProps }) => {\n // -- Local state --\n const [selectedTab, setSelectedTab] = useState('settings');\n const emptyQueryItem = { query: '', displayName: '' };\n const formControlStyles = { mt: 2 };\n\n // -- Translation --\n const { t } = useTranslation();\n\n const setPrometheusQuery = (i: number, item: PrometheusQuery) => {\n const queries = [...(formProps.values.prometheusQueries || [emptyQueryItem])];\n\n queries[i] = { ...queries[i], ...item };\n\n formProps.setFieldValue('prometheusQueries', queries);\n };\n\n const addQueryField = () => {\n const queries = [...(formProps.values.prometheusQueries || [emptyQueryItem])];\n\n formProps.setFieldValue('prometheusQueries', [...queries, emptyQueryItem]);\n };\n\n const removeQueryField = (i: number) => {\n const queries = [...(formProps.values.prometheusQueries || [emptyQueryItem])];\n\n queries.splice(i, 1);\n\n formProps.setFieldValue('prometheusQueries', queries);\n };\n\n const setDisplayedQueryParam = (i: number, value: string) => {\n const params = [...(formProps.values.displayedQueryParams || [''])];\n\n params[i] = value;\n\n formProps.setFieldValue('displayedQueryParams', params);\n };\n\n const addDisplayedQueryParam = () => {\n const params = [...(formProps.values.displayedQueryParams || [''])];\n\n formProps.setFieldValue('displayedQueryParams', [...params, '']);\n };\n\n const removeDisplayedQueryParam = (i: number) => {\n const params = [...(formProps.values.displayedQueryParams || [''])];\n\n params.splice(i, 1);\n\n formProps.setFieldValue('displayedQueryParams', params);\n };\n\n const mapPeriodToLabel = (period: QueriesPeriod) => {\n switch (period) {\n case QueriesPeriod.PREVIOUS_SHIFT:\n return t('prometheusWidget.previousShift');\n default:\n return t('prometheusWidget.currentShift');\n }\n };\n\n return (\n <TabContext value={selectedTab}>\n <TabList onChange={(_, value) => setSelectedTab(value)} centered>\n <Tab label={t('prometheusWidget.settings')} value=\"settings\" />\n <Tab label={t('prometheusWidget.advanced')} value=\"advanced\" />\n </TabList>\n\n <TabPanel value=\"settings\">\n <Box mb={2}>\n <FormControl sx={formControlStyles} fullWidth>\n <TextField\n name=\"endpointUrl\"\n label={t('prometheusWidget.endpointUrl')}\n value={formProps.values.endpointUrl}\n onChange={formProps.handleChange}\n onBlur={formProps.handleBlur}\n error={formProps.touched.endpointUrl && Boolean(formProps.errors.endpointUrl)}\n helperText={formProps.touched.endpointUrl && formProps.errors.endpointUrl}\n data-testid=\"prometheus.settings.endpoint-url\"\n fullWidth\n />\n </FormControl>\n <FormControl sx={formControlStyles} fullWidth>\n <InputLabel id=\"queries-period-label\">{t('prometheusWidget.period')}</InputLabel>\n <Select\n variant=\"outlined\"\n name=\"queriesPeriod\"\n labelId=\"queries-period-label\"\n value={formProps.values.queriesPeriod || QueriesPeriod.CURRENT_SHIFT}\n onChange={formProps.handleChange}\n onBlur={formProps.handleBlur}\n error={formProps.touched.queriesPeriod && Boolean(formProps.errors.queriesPeriod)}\n data-testid=\"prometheus.settings.period-select\"\n fullWidth\n >\n {Object.keys(QueriesPeriod).map((key) => (\n // @ts-expect-error no typings\n <MenuItem key={key} value={QueriesPeriod[key]}>\n {/* @ts-expect-error no typings */}\n {mapPeriodToLabel(QueriesPeriod[key])}\n </MenuItem>\n ))}\n </Select>\n <FormHelperText error>{formProps.touched.queriesPeriod && formProps.errors.queriesPeriod}</FormHelperText>\n </FormControl>\n {(formProps.values.prometheusQueries || [emptyQueryItem]).map(({ query, displayName }, i) => (\n <FormControl key={i} sx={formControlStyles} fullWidth>\n <Stack direction=\"row\" width=\"100%\" gap={1}>\n <TextField\n label={t('prometheusWidget.query')}\n value={query}\n onChange={(e) => setPrometheusQuery(i, { query: e.target.value })}\n onBlur={formProps.handleBlur}\n error={\n formProps.touched.prometheusQueries?.[i]?.query &&\n Boolean(getIn(formProps.errors, `prometheusQueries.[${i}].query`))\n }\n helperText={\n formProps.touched.prometheusQueries?.[i]?.query &&\n getIn(formProps.errors, `prometheusQueries.[${i}].query`)\n }\n data-testid={`prometheus.settings.query-input-${i}`}\n fullWidth\n />\n <TextField\n label={t('prometheusWidget.name')}\n value={displayName}\n onChange={(e) => setPrometheusQuery(i, { query, displayName: e.target.value })}\n onBlur={formProps.handleBlur}\n error={\n formProps.touched.prometheusQueries?.[i]?.displayName &&\n Boolean(getIn(formProps.errors, `prometheusQueries.[${i}].displayName`))\n }\n helperText={\n formProps.touched.prometheusQueries?.[i]?.displayName &&\n getIn(formProps.errors, `prometheusQueries.[${i}].displayName`)\n }\n data-testid={`prometheus.settings.query-name-${i}`}\n fullWidth\n />\n <IconButton\n color=\"error\"\n onClick={() => removeQueryField(i)}\n data-testid={`prometheus.settings.remove-query-${i}`}\n >\n <Clear />\n </IconButton>\n </Stack>\n </FormControl>\n ))}\n <Button\n color=\"secondary\"\n onClick={addQueryField}\n sx={{ mt: (theme) => theme.spacing(2) }}\n data-testid=\"prometheus.settings.add-query\"\n fullWidth\n >\n {t('prometheusWidget.addAnotherQuery')}\n </Button>\n {(formProps.values.displayedQueryParams || ['']).map((param, i) => (\n <FormControl key={i} sx={formControlStyles} fullWidth>\n <Stack direction=\"row\" width=\"100%\">\n <TextField\n label={t('prometheusWidget.displayedQueryParameter')}\n value={param}\n onChange={(e) => setDisplayedQueryParam(i, e.target.value)}\n error={\n // @ts-expect-error no typings\n formProps.touched.displayedQueryParams?.[i] &&\n Boolean(getIn(formProps.errors, `displayedQueryParams.[${i}]`))\n }\n helperText={\n // @ts-expect-error no typings\n formProps.touched.displayedQueryParams?.[i] &&\n getIn(formProps.errors, `displayedQueryParams.[${i}]`)\n }\n data-testid={`prometheus.settings.param-input-${i}`}\n fullWidth\n />\n <IconButton\n color=\"error\"\n onClick={() => removeDisplayedQueryParam(i)}\n data-testid={`prometheus.settings.remove-param-${i}`}\n >\n <Clear />\n </IconButton>\n </Stack>\n </FormControl>\n ))}\n <Button\n color=\"secondary\"\n onClick={addDisplayedQueryParam}\n sx={{ mt: (theme) => theme.spacing(2) }}\n data-testid=\"prometheus.settings.add-param\"\n fullWidth\n >\n {t('prometheusWidget.addAnotherDisplayedQueryParameter')}\n </Button>\n <FormControl sx={formControlStyles} fullWidth>\n <TextField\n name=\"xAxisUnit\"\n label={t('prometheusWidget.xAxisUnit')}\n value={formProps.values.xAxisUnit || ''}\n onChange={formProps.handleChange}\n onBlur={formProps.handleBlur}\n error={formProps.touched.xAxisUnit && Boolean(formProps.errors.xAxisUnit)}\n helperText={formProps.touched.xAxisUnit && formProps.errors.xAxisUnit}\n data-testid=\"prometheus.settings.x-axis-unit\"\n fullWidth\n />\n </FormControl>\n <FormControl sx={formControlStyles} fullWidth>\n <TextField\n name=\"yAxisUnit\"\n label={t('prometheusWidget.yAxisUnit')}\n value={formProps.values.yAxisUnit || ''}\n onChange={formProps.handleChange}\n onBlur={formProps.handleBlur}\n error={formProps.touched.yAxisUnit && Boolean(formProps.errors.yAxisUnit)}\n helperText={formProps.touched.yAxisUnit && formProps.errors.yAxisUnit}\n data-testid=\"prometheus.settings.y-axis-unit\"\n fullWidth\n />\n </FormControl>\n </Box>\n </TabPanel>\n\n <TabPanel value=\"advanced\">\n <TextField\n name=\"customTitle\"\n label={t('prometheusWidget.customTitle')}\n value={formProps.values.customTitle}\n onChange={formProps.handleChange}\n data-testid=\"prometheus.settings.custom-title\"\n fullWidth\n />\n </TabPanel>\n </TabContext>\n );\n};\n\nexport default SettingsFormContent;\n","import { generateTimeRange, getCurrentShift, getRecentShift, normalizeShifts } from 'andoncloud-dashboard-toolkit';\nimport dayjs from 'dayjs';\n\nimport { QueriesPeriod, QueriesTimeRange, WidgetData } from './types';\n\nexport { generateTimeRange };\n\nexport const getQueriesTimeRange = (period: QueriesPeriod, data: WidgetData): QueriesTimeRange | null => {\n const currentDate = dayjs();\n const normalizedShifts = normalizeShifts(data?.shifts, currentDate);\n const currentShift = getCurrentShift(currentDate, normalizedShifts);\n const recentShift = getRecentShift(currentDate, normalizedShifts);\n\n switch (period) {\n case QueriesPeriod.CURRENT_SHIFT:\n if (currentShift) {\n return {\n startedAt: currentShift.startedAt.toDate(),\n finishedAt: currentShift.finishedAt.toDate(),\n };\n }\n if (recentShift) {\n return {\n startedAt: recentShift.startedAt.toDate(),\n finishedAt: recentShift.finishedAt.toDate(),\n };\n }\n return null;\n case QueriesPeriod.PREVIOUS_SHIFT:\n if (recentShift) {\n return {\n startedAt: recentShift.startedAt.toDate(),\n finishedAt: recentShift.finishedAt.toDate(),\n };\n }\n return null;\n default:\n return null;\n }\n};\n","import { Chart, ChartArea, Plugin } from 'chart.js';\nimport Color from 'color';\n\nconst createGradient = (ctx: CanvasRenderingContext2D, area: ChartArea) => {\n return ctx.createLinearGradient(0, area.bottom, 0, area.top);\n};\n\nconst GradientPlugin: Plugin = {\n id: 'gradient',\n beforeDatasetsUpdate(chart: Chart) {\n const ctx = chart.ctx;\n const datasets = chart.data.datasets;\n\n if (ctx && datasets) {\n for (let i = 0; i < datasets.length; i++) {\n const dataset = datasets[i];\n const meta = chart.getDatasetMeta(i);\n const scale = chart.scales[meta.yAxisID as string];\n\n if (scale) {\n const gradient = createGradient(ctx, scale);\n const borderColor = Color(dataset.borderColor as string);\n\n gradient.addColorStop(0, borderColor.alpha(0.1).hexa());\n gradient.addColorStop(1, borderColor.alpha(0.5).hexa());\n\n dataset.backgroundColor = gradient;\n }\n }\n }\n },\n};\n\nexport default GradientPlugin;\n","import 'chartjs-adapter-dayjs-4';\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { Line } from 'react-chartjs-2';\n\nimport {\n CategoryScale,\n Chart as ChartJS,\n ChartData,\n Filler,\n Legend,\n LinearScale,\n LineElement,\n PointElement,\n TimeScale,\n Tooltip,\n} from 'chart.js';\nimport dayjs from 'dayjs';\nimport pick from 'lodash.pick';\nimport { PrometheusDriver } from 'prometheus-query';\n\nimport { generateTimeRange, getQueriesTimeRange } from '@/helpers';\nimport { PrometheusChartProps, QueriesPeriod, QueriesTimeRange } from '@/types';\n\nimport GradientPlugin from './GradientPlugin';\n\nChartJS.register(CategoryScale, LinearScale, TimeScale, PointElement, LineElement, Filler, Legend, Tooltip);\n\nChartJS.defaults.font.size = 12;\nChartJS.defaults.color = 'rgba(255, 255, 255, 0.75)';\n\nconst COLORS = [\n '#36A2EB',\n '#FF6384',\n '#4BC0C0',\n '#FF9F40',\n '#9966FF',\n '#FFCD56',\n '#C9CBCF',\n '#7BC8A4',\n '#E7E9ED',\n '#FF6B6B',\n];\n\nconst PrometheusChart: React.FC<PrometheusChartProps> = ({ data, settings }) => {\n const chart = useRef<ChartJS<'line'>>(null);\n const [chartData, setChartData] = useState<ChartData<'line'>>({ labels: [], datasets: [] });\n const [queriesTimeRange, setQueriesTimeRange] = useState<QueriesTimeRange | null>(null);\n const [timeLabels, setTimeLabels] = useState<Date[]>([]);\n const hiddenSeriesRef = useRef<Record<string, boolean>>({});\n\n const fetchData = useCallback(\n async (timeRange: QueriesTimeRange) => {\n if (!settings.endpointUrl || !settings.prometheusQueries?.length) return;\n\n const driver = new PrometheusDriver({ endpoint: settings.endpointUrl });\n const start = new Date(timeRange.startedAt);\n const end = timeRange.finishedAt ? new Date(timeRange.finishedAt) : new Date();\n const step = 30;\n\n // Save hidden state before updating\n if (chart.current) {\n for (let i = 0; i < chart.current.data.datasets.length; i++) {\n const ds = chart.current.data.datasets[i];\n if (ds.label) {\n hiddenSeriesRef.current[ds.label] = !chart.current.isDatasetVisible(i);\n }\n }\n }\n\n const queries = settings.prometheusQueries.map(({ query }) => query);\n const results = await Promise.all(queries.map((query) => driver.rangeQuery(query, start, end, step)));\n\n let seriesIndex = 0;\n const datasets = results.flatMap((result, queryIndex) =>\n result.result.map((serie) => {\n const idx = seriesIndex++;\n const queryConfig = settings.prometheusQueries[queryIndex];\n const metricLabels = serie.metric.labels || {};\n const filteredValues = Object.values(pick(metricLabels, settings.displayedQueryParams)).join(' - ');\n\n let label: string;\n if (queryConfig?.displayName) {\n label = filteredValues ? `${queryConfig.displayName} - ${filteredValues}` : queryConfig.displayName;\n } else {\n const metricName = serie.metric.name || queryConfig?.query || '';\n label = filteredValues\n ? `${metricName} ${JSON.stringify(pick(metricLabels, settings.displayedQueryParams))}`\n : metricName;\n }\n\n return {\n label,\n data: serie.values.map((v: { time: Date; value: number }) => ({\n x: v.time,\n y: v.value,\n })),\n fill: true,\n tension: 0.4,\n borderColor: COLORS[idx % COLORS.length],\n backgroundColor: COLORS[idx % COLORS.length],\n borderWidth: 3,\n pointRadius: 0,\n hidden: hiddenSeriesRef.current[label] || false,\n };\n }),\n );\n\n setChartData({ labels: [], datasets });\n },\n [settings.endpointUrl, settings.prometheusQueries],\n );\n\n useEffect(() => {\n if (queriesTimeRange) {\n const startedAt = dayjs(queriesTimeRange.startedAt);\n const finishedAt = dayjs(queriesTimeRange.finishedAt);\n setTimeLabels(generateTimeRange(startedAt, finishedAt, 'minutes', 15).map((d) => d.toDate()));\n fetchData(queriesTimeRange);\n }\n }, [queriesTimeRange, fetchData]);\n\n useEffect(() => {\n setQueriesTimeRange(getQueriesTimeRange(settings.queriesPeriod, data));\n\n if (settings?.queriesPeriod === QueriesPeriod.CURRENT_SHIFT) {\n const intervalId = setInterval(() => {\n const nextTimeRange = getQueriesTimeRange(settings.queriesPeriod, data);\n setQueriesTimeRange(nextTimeRange);\n }, 30_000);\n\n return () => {\n clearInterval(intervalId);\n };\n }\n return () => {};\n }, [data, settings]);\n\n return (\n queriesTimeRange && (\n <Line\n ref={chart}\n data={chartData}\n plugins={[GradientPlugin]}\n options={{\n scales: {\n x: {\n type: 'time',\n labels: timeLabels as unknown as string[],\n time: {\n displayFormats: {\n millisecond: 'HH:mm:ss.SSS',\n second: 'HH:mm:ss',\n minute: 'HH:mm',\n hour: 'HH',\n },\n },\n ticks: {\n source: 'labels',\n },\n grid: {\n color: 'rgba(255, 255, 255, 0.1)',\n },\n ...(settings.xAxisUnit && {\n title: {\n display: true,\n text: settings.xAxisUnit,\n },\n }),\n },\n y: {\n grid: {\n color: 'rgba(255, 255, 255, 0.1)',\n },\n ...(settings.yAxisUnit && {\n title: {\n display: true,\n text: settings.yAxisUnit,\n },\n }),\n },\n },\n elements: {\n point: {\n radius: 0,\n },\n },\n maintainAspectRatio: false,\n animation: {\n duration: 0,\n },\n plugins: {\n legend: {},\n },\n }}\n />\n )\n );\n};\n\nexport default PrometheusChart;\n","import { Box } from '@mui/material';\n\nimport { WidgetViewProps } from '@/types';\n\nimport PrometheusChart from '../PrometheusChart';\n\nconst WidgetView: React.FC<WidgetViewProps> = ({ data, settings }) => {\n return (\n <Box display=\"flex\" width=\"100%\" minWidth=\"500px\" height=\"100%\" minHeight=\"250px\" p={2}>\n {settings && <PrometheusChart data={data} settings={settings} />}\n </Box>\n );\n};\n\nexport default WidgetView;\n","import { satisfies } from 'compare-versions';\nimport { TFunction } from 'i18next';\nimport * as yup from 'yup';\n\nimport { QueriesPeriod, WidgetSettings } from '@/types';\n\nexport const getSettingsFormProps = (t: TFunction) => {\n yup.setLocale({\n mixed: {\n required: t('prometheusWidget.thisFieldIsRequired'),\n },\n });\n return {\n initialValues: {\n customTitle: '',\n endpointUrl: '',\n queriesPeriod: QueriesPeriod.CURRENT_SHIFT,\n prometheusQueries: [],\n displayedQueryParams: [],\n xAxisUnit: '',\n yAxisUnit: '',\n },\n validationSchema: yup.object({\n endpointUrl: yup.string().required(),\n queriesPeriod: yup.string().required(),\n prometheusQueries: yup.array().of(\n yup.object().shape({\n query: yup.string().required(),\n displayName: yup.string().required(),\n }),\n ),\n displayedQueryParams: yup.array().of(yup.string().required()),\n xAxisUnit: yup.string().required(),\n yAxisUnit: yup.string().required(),\n }),\n };\n};\n\nexport const migrateSettings = (settings: WidgetSettings) => {\n if (!satisfies(settings.version || '1.0.0', '>=1.2.5')) {\n return {\n ...settings,\n prometheusQueries: settings.prometheusQueries.map((query) => ({ query, displayName: '' })),\n };\n }\n return settings;\n};\n","import { useEffect, useState } from 'react';\n\nimport { useGqlClients, WidgetProps } from 'andoncloud-dashboard-toolkit';\nimport { BaseWidget } from 'andoncloud-widget-base';\n\nimport locales from '@/locales';\nimport { WidgetData, WidgetSettings } from '@/types';\nimport { LIBRARY_VERSION } from '@/version';\n\nimport SettingsFormContent from '../SettingsFormContent';\nimport WidgetView from '../WidgetView';\n\nimport { getSettingsFormProps, migrateSettings } from './utils';\n\nconst Widget: React.FC<WidgetProps<WidgetData, WidgetSettings>> = ({ url, wsUrl, lang, data, ...widgetProps }) => {\n const { graphqlSdk, gqlWsClient } = useGqlClients({ url, wsUrl, lang });\n const [widgetData, setWidgetData] = useState<WidgetData | undefined>(data);\n\n useEffect(() => {\n if (!data && graphqlSdk) {\n graphqlSdk\n .listShifts()\n .then(({ shifts }) =>\n setWidgetData((current: WidgetData) => ({\n ...(current || {}),\n shifts,\n })),\n )\n .catch(() => {});\n }\n }, [data, graphqlSdk]);\n\n return (\n <BaseWidget\n {...widgetProps}\n url={url}\n lang={lang}\n locales={locales}\n data={widgetData}\n gqlClients={{ graphqlSdk, gqlWsClient }}\n WidgetView={WidgetView}\n getSettingsFormProps={getSettingsFormProps}\n SettingsFormContent={SettingsFormContent}\n migrateSettings={migrateSettings}\n version={LIBRARY_VERSION}\n data-testid=\"prometheus-widget\"\n />\n );\n};\n\nexport default Widget;\n","import type { FilterValues } from 'andoncloud-dashboard-toolkit';\nimport i18n from 'i18next';\n\nimport type { WidgetData, WidgetSettings } from '../types';\n\nconst ns = 'prometheusWidget';\n\nconst t = (key: string, lng: string, options?: Record<string, unknown>) => i18n.t(`${ns}.${key}`, { lng, ...options });\n\nexport const getDisplayName = (lang: string) => t('displayName', lang);\n\nexport const getTitle = (\n _data: WidgetData | undefined,\n settings: WidgetSettings | undefined,\n _filters: FilterValues | undefined,\n lang: string,\n): string => {\n const name = getDisplayName(lang);\n\n if (!settings?.prometheusQueries?.length) return name;\n\n const queryCount = settings.prometheusQueries.length;\n const period =\n settings.queriesPeriod === 'CURRENT_SHIFT' ? t('titleCurrentShift', lang) : t('titlePreviousShift', lang);\n\n return `${name} — ${t('titleQueries', lang, { count: queryCount })}, ${period}`;\n};\n","import { registerTranslations } from 'andoncloud-sdk';\n\nimport locales from './locales';\n\nregisterTranslations(locales);\n\nexport { default as Widget } from './components/Widget';\nexport { getDisplayName, getTitle } from './core/title';\n\nexport { default as thumbnail } from './assets/thumbnail.svg';\n\nexport const requiredFeatures: string[] = ['feature.prometheus-widget'];\nexport const extraPermissions: string[] = [];\n\nexport { LIBRARY_VERSION as version } from './version';\n"],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
//#region src/assets/thumbnail.svg
|
|
2
|
+
var thumbnail_default = "data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 180\" fill=\"none\">%0A <!-- Grid lines (rgba 255,255,255,0.1) -->%0A <line x1=\"40\" y1=\"20\" x2=\"304\" y2=\"20\" stroke=\"%23ffffff1a\" stroke-width=\"1\"/>%0A <line x1=\"40\" y1=\"50\" x2=\"304\" y2=\"50\" stroke=\"%23ffffff1a\" stroke-width=\"1\"/>%0A <line x1=\"40\" y1=\"80\" x2=\"304\" y2=\"80\" stroke=\"%23ffffff1a\" stroke-width=\"1\"/>%0A <line x1=\"40\" y1=\"110\" x2=\"304\" y2=\"110\" stroke=\"%23ffffff1a\" stroke-width=\"1\"/>%0A <line x1=\"40\" y1=\"140\" x2=\"304\" y2=\"140\" stroke=\"%23ffffff1a\" stroke-width=\"1\"/>%0A%0A <!-- Area fills -->%0A <defs>%0A <linearGradient id=\"g1\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">%0A <stop offset=\"0%\" stop-color=\"%2336A2EB\" stop-opacity=\"0.3\"/>%0A <stop offset=\"100%\" stop-color=\"%2336A2EB\" stop-opacity=\"0\"/>%0A </linearGradient>%0A <linearGradient id=\"g2\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">%0A <stop offset=\"0%\" stop-color=\"%23FF6384\" stop-opacity=\"0.3\"/>%0A <stop offset=\"100%\" stop-color=\"%23FF6384\" stop-opacity=\"0\"/>%0A </linearGradient>%0A </defs>%0A%0A <!-- Line 1: Uptime (higher values) -->%0A <path d=\"M40,75 C70,55 100,65 140,40 C180,18 220,45 260,30 L304,36 L304,140 L40,140 Z\" fill=\"url(%23g1)\"/>%0A <path d=\"M40,75 C70,55 100,65 140,40 C180,18 220,45 260,30 L304,36\" stroke=\"%2336A2EB\" stroke-width=\"3\" fill=\"none\"/>%0A%0A <!-- Line 2: Downtime (lower values, inverse) -->%0A <path d=\"M40,105 C70,90 100,100 140,80 C180,70 220,85 260,65 L304,70 L304,140 L40,140 Z\" fill=\"url(%23g2)\"/>%0A <path d=\"M40,105 C70,90 100,100 140,80 C180,70 220,85 260,65 L304,70\" stroke=\"%23FF6384\" stroke-width=\"3\" fill=\"none\"/>%0A%0A <!-- Line 3: removed -->%0A%0A <!-- X-axis time labels -->%0A <text x=\"60\" y=\"155\" text-anchor=\"middle\" font-size=\"8\" font-family=\"Inter, system-ui\" fill=\"%23A7ADB6\">06:00</text>%0A <text x=\"126\" y=\"155\" text-anchor=\"middle\" font-size=\"8\" font-family=\"Inter, system-ui\" fill=\"%23A7ADB6\">08:00</text>%0A <text x=\"192\" y=\"155\" text-anchor=\"middle\" font-size=\"8\" font-family=\"Inter, system-ui\" fill=\"%23A7ADB6\">10:00</text>%0A <text x=\"258\" y=\"155\" text-anchor=\"middle\" font-size=\"8\" font-family=\"Inter, system-ui\" fill=\"%23A7ADB6\">12:00</text>%0A%0A <!-- Legend -->%0A <line x1=\"44\" y1=\"10\" x2=\"58\" y2=\"10\" stroke=\"%2336A2EB\" stroke-width=\"2\"/>%0A <text x=\"62\" y=\"13\" font-size=\"9\" font-family=\"Inter, system-ui\" fill=\"%23A7ADB6\">Uptime</text>%0A <line x1=\"120\" y1=\"10\" x2=\"134\" y2=\"10\" stroke=\"%23FF6384\" stroke-width=\"2\"/>%0A <text x=\"138\" y=\"13\" font-size=\"9\" font-family=\"Inter, system-ui\" fill=\"%23A7ADB6\">Downtime</text>%0A</svg>%0A";
|
|
3
|
+
//#endregion
|
|
4
|
+
export { thumbnail_default as t };
|
|
5
|
+
|
|
6
|
+
//# sourceMappingURL=thumbnail-B_DBfYD0.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thumbnail-B_DBfYD0.js","names":[],"sources":["../src/assets/thumbnail.svg"],"sourcesContent":["\"data:image/svg+xml,<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 320 180\\\" fill=\\\"none\\\">%0A <!-- Grid lines (rgba 255,255,255,0.1) -->%0A <line x1=\\\"40\\\" y1=\\\"20\\\" x2=\\\"304\\\" y2=\\\"20\\\" stroke=\\\"%23ffffff1a\\\" stroke-width=\\\"1\\\"/>%0A <line x1=\\\"40\\\" y1=\\\"50\\\" x2=\\\"304\\\" y2=\\\"50\\\" stroke=\\\"%23ffffff1a\\\" stroke-width=\\\"1\\\"/>%0A <line x1=\\\"40\\\" y1=\\\"80\\\" x2=\\\"304\\\" y2=\\\"80\\\" stroke=\\\"%23ffffff1a\\\" stroke-width=\\\"1\\\"/>%0A <line x1=\\\"40\\\" y1=\\\"110\\\" x2=\\\"304\\\" y2=\\\"110\\\" stroke=\\\"%23ffffff1a\\\" stroke-width=\\\"1\\\"/>%0A <line x1=\\\"40\\\" y1=\\\"140\\\" x2=\\\"304\\\" y2=\\\"140\\\" stroke=\\\"%23ffffff1a\\\" stroke-width=\\\"1\\\"/>%0A%0A <!-- Area fills -->%0A <defs>%0A <linearGradient id=\\\"g1\\\" x1=\\\"0\\\" y1=\\\"0\\\" x2=\\\"0\\\" y2=\\\"1\\\">%0A <stop offset=\\\"0%\\\" stop-color=\\\"%2336A2EB\\\" stop-opacity=\\\"0.3\\\"/>%0A <stop offset=\\\"100%\\\" stop-color=\\\"%2336A2EB\\\" stop-opacity=\\\"0\\\"/>%0A </linearGradient>%0A <linearGradient id=\\\"g2\\\" x1=\\\"0\\\" y1=\\\"0\\\" x2=\\\"0\\\" y2=\\\"1\\\">%0A <stop offset=\\\"0%\\\" stop-color=\\\"%23FF6384\\\" stop-opacity=\\\"0.3\\\"/>%0A <stop offset=\\\"100%\\\" stop-color=\\\"%23FF6384\\\" stop-opacity=\\\"0\\\"/>%0A </linearGradient>%0A </defs>%0A%0A <!-- Line 1: Uptime (higher values) -->%0A <path d=\\\"M40,75 C70,55 100,65 140,40 C180,18 220,45 260,30 L304,36 L304,140 L40,140 Z\\\" fill=\\\"url(%23g1)\\\"/>%0A <path d=\\\"M40,75 C70,55 100,65 140,40 C180,18 220,45 260,30 L304,36\\\" stroke=\\\"%2336A2EB\\\" stroke-width=\\\"3\\\" fill=\\\"none\\\"/>%0A%0A <!-- Line 2: Downtime (lower values, inverse) -->%0A <path d=\\\"M40,105 C70,90 100,100 140,80 C180,70 220,85 260,65 L304,70 L304,140 L40,140 Z\\\" fill=\\\"url(%23g2)\\\"/>%0A <path d=\\\"M40,105 C70,90 100,100 140,80 C180,70 220,85 260,65 L304,70\\\" stroke=\\\"%23FF6384\\\" stroke-width=\\\"3\\\" fill=\\\"none\\\"/>%0A%0A <!-- Line 3: removed -->%0A%0A <!-- X-axis time labels -->%0A <text x=\\\"60\\\" y=\\\"155\\\" text-anchor=\\\"middle\\\" font-size=\\\"8\\\" font-family=\\\"Inter, system-ui\\\" fill=\\\"%23A7ADB6\\\">06:00</text>%0A <text x=\\\"126\\\" y=\\\"155\\\" text-anchor=\\\"middle\\\" font-size=\\\"8\\\" font-family=\\\"Inter, system-ui\\\" fill=\\\"%23A7ADB6\\\">08:00</text>%0A <text x=\\\"192\\\" y=\\\"155\\\" text-anchor=\\\"middle\\\" font-size=\\\"8\\\" font-family=\\\"Inter, system-ui\\\" fill=\\\"%23A7ADB6\\\">10:00</text>%0A <text x=\\\"258\\\" y=\\\"155\\\" text-anchor=\\\"middle\\\" font-size=\\\"8\\\" font-family=\\\"Inter, system-ui\\\" fill=\\\"%23A7ADB6\\\">12:00</text>%0A%0A <!-- Legend -->%0A <line x1=\\\"44\\\" y1=\\\"10\\\" x2=\\\"58\\\" y2=\\\"10\\\" stroke=\\\"%2336A2EB\\\" stroke-width=\\\"2\\\"/>%0A <text x=\\\"62\\\" y=\\\"13\\\" font-size=\\\"9\\\" font-family=\\\"Inter, system-ui\\\" fill=\\\"%23A7ADB6\\\">Uptime</text>%0A <line x1=\\\"120\\\" y1=\\\"10\\\" x2=\\\"134\\\" y2=\\\"10\\\" stroke=\\\"%23FF6384\\\" stroke-width=\\\"2\\\"/>%0A <text x=\\\"138\\\" y=\\\"13\\\" font-size=\\\"9\\\" font-family=\\\"Inter, system-ui\\\" fill=\\\"%23A7ADB6\\\">Downtime</text>%0A</svg>%0A\""],"mappings":";wBAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "andoncloud-prometheus-widget",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.18",
|
|
4
4
|
"description": "Made with create-andoncloud-widget",
|
|
5
5
|
"author": "Adrian Olszewski",
|
|
6
6
|
"license": "MIT",
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"start": "run-p build:watch start:preview",
|
|
19
19
|
"start:preview": "cd preview && npm run start",
|
|
20
20
|
"test": "cypress run --component",
|
|
21
|
-
"update": "ncu -u --reject graphql-request && npm install --ignore-scripts && cd preview && ncu -u && npm install",
|
|
21
|
+
"update": "ncu -u --reject graphql-request,typescript,@mui/material,@mui/icons-material,@mui/lab,@mui/x-date-pickers && npm install --ignore-scripts && cd preview && ncu -u && npm install --ignore-scripts",
|
|
22
22
|
"version:bump": "npm version --no-git-tag-version patch"
|
|
23
23
|
},
|
|
24
24
|
"peerDependencies": {
|
|
@@ -46,25 +46,25 @@
|
|
|
46
46
|
"@types/lodash.pick": "^4.4.9",
|
|
47
47
|
"@types/react": "^19.2.14",
|
|
48
48
|
"ajv": "^8.18.0",
|
|
49
|
-
"andoncloud-dashboard-toolkit": "^1.5.
|
|
49
|
+
"andoncloud-dashboard-toolkit": "^1.5.79",
|
|
50
50
|
"andoncloud-library-scripts": "^2.0.0",
|
|
51
|
-
"andoncloud-sdk": "^1.7.
|
|
52
|
-
"andoncloud-widget-base": "^1.2.
|
|
53
|
-
"cypress": "^15.
|
|
51
|
+
"andoncloud-sdk": "^1.7.30",
|
|
52
|
+
"andoncloud-widget-base": "^1.2.30",
|
|
53
|
+
"cypress": "^15.13.1",
|
|
54
54
|
"eslint-config-andoncloud": "^1.1.0",
|
|
55
55
|
"graphql-request": "^6.1.0",
|
|
56
|
-
"i18next": "^
|
|
56
|
+
"i18next": "^26.0.5",
|
|
57
57
|
"mobx": "^6.15.0",
|
|
58
58
|
"mobx-react-lite": "^4.1.1",
|
|
59
|
-
"npm-check-updates": "^
|
|
59
|
+
"npm-check-updates": "^21.0.0",
|
|
60
60
|
"npm-run-all": "^4.1.5",
|
|
61
|
-
"postcss": "^8.5.
|
|
62
|
-
"react": "^19.2.
|
|
63
|
-
"react-dom": "^19.2.
|
|
64
|
-
"react-i18next": "^
|
|
65
|
-
"react-router-dom": "^7.
|
|
61
|
+
"postcss": "^8.5.9",
|
|
62
|
+
"react": "^19.2.5",
|
|
63
|
+
"react-dom": "^19.2.5",
|
|
64
|
+
"react-i18next": "^17.0.3",
|
|
65
|
+
"react-router-dom": "^7.14.1",
|
|
66
66
|
"react-scripts": "^5.0.1",
|
|
67
|
-
"tsdown": "^0.21.
|
|
67
|
+
"tsdown": "^0.21.8",
|
|
68
68
|
"typescript": "~5.9.3",
|
|
69
69
|
"webpack-dev-server": "^5.2.3"
|
|
70
70
|
},
|