diff --git a/package.json b/package.json index 2814f546..bf6e11e4 100644 --- a/package.json +++ b/package.json @@ -43,14 +43,14 @@ "@patternfly/react-core": "^5.3.4", "@patternfly/react-icons": "^5.3.2", "@patternfly/react-table": "5.3.4", - "@tanstack/react-query": "^5.51.15", - "axios": "^1.7.2", + "@tanstack/react-query": "^5.51.21", + "axios": "^1.7.3", "date-fns": "^3.6.0", - "framer-motion": "^11.3.19", + "framer-motion": "^11.3.21", "react": "^18.3.1", "react-dom": "^18.3.1", "react-error-boundary": "^4.0.13", - "react-router-dom": "^6.25.1" + "react-router-dom": "^6.26.0" }, "devDependencies": { "@commitlint/cli": "^19.3.0", @@ -62,8 +62,8 @@ "@types/jest": "^29.5.12", "@types/react": "^18.3.3", "@types/react-dom": "^18.3.0", - "@typescript-eslint/eslint-plugin": "^7.17.0", - "@typescript-eslint/parser": "^7.17.0", + "@typescript-eslint/eslint-plugin": "^7.18.0", + "@typescript-eslint/parser": "^7.18.0", "commitizen": "^4.3.0", "copy-webpack-plugin": "^12.0.2", "css-loader": "^7.1.2", @@ -74,11 +74,11 @@ "eslint-config-prettier": "^9.1.0", "eslint-import-resolver-typescript": "^3.6.1", "eslint-plugin-import": "^2.29.1", - "eslint-plugin-jest": "^28.6.0", + "eslint-plugin-jest": "^28.7.0", "eslint-plugin-react": "^7.35.0", "eslint-plugin-react-hooks": "^4.6.2", "html-webpack-plugin": "^5.6.0", - "husky": "^9.1.3", + "husky": "^9.1.4", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", "mini-css-extract-plugin": "^2.9.0", @@ -87,7 +87,7 @@ "start-server-and-test": "^2.0.5", "style-loader": "^4.0.0", "terser-webpack-plugin": "^5.3.10", - "ts-jest": "^29.2.3", + "ts-jest": "^29.2.4", "ts-loader": "^9.5.1", "ts-node": "^10.9.2", "ts-prune": "^0.10.3", diff --git a/src/config/config.ts b/src/config/config.ts index 488ec0a8..4ea276a1 100644 --- a/src/config/config.ts +++ b/src/config/config.ts @@ -30,5 +30,5 @@ export const IDS_GROUP_SEPARATOR = '~'; export const IDS_MULTIPLE_SELECTION_SEPARATOR = ','; export const PAIR_SEPARATOR = '-to-'; -export const MIN_DRAWER_WIDTH = 450; +export const MIN_DRAWER_WIDTH = 500; export const MAX_DRAWER_WIDTH = 800; diff --git a/src/core/components/SKSanckeyChart/SkSankeyChart.interfaces.ts b/src/core/components/SKSanckeyChart/SkSankeyChart.interfaces.ts index 0be86dfe..f049ea0e 100644 --- a/src/core/components/SKSanckeyChart/SkSankeyChart.interfaces.ts +++ b/src/core/components/SKSanckeyChart/SkSankeyChart.interfaces.ts @@ -1,16 +1,3 @@ -import { VarColors } from '@config/colors'; - -export interface ThemesProps { - labelTextColor: VarColors; - fontFamily: string; - fontSize: number; - tooltip: { container: { color: string } }; -} - -export interface Themes { - [key: string]: ThemesProps; -} - export interface SkSankeyChartNode { id: string; nodeColor?: string; diff --git a/src/core/components/SkGraph/Graph.constants.ts b/src/core/components/SkGraph/Graph.constants.ts index e7e83f35..f0e94735 100644 --- a/src/core/components/SkGraph/Graph.constants.ts +++ b/src/core/components/SkGraph/Graph.constants.ts @@ -7,8 +7,8 @@ export const NODE_LABEL_TEXT_COLOR = HexColors.Black900; export const NODE_LABEL_BACKGROUND_COLOR = HexColors.White; export const NODE_SELECT_BORDER = HexColors.DefaultHighLight; export const NODE_HIGHLIGHT_BORDER = HexColors.DefaultHighLight; -export const NODE_BADGE_GROUP_ELEMENTS_BACKGROUND = HexColors.DefaultStatusBackground; -export const NODE_BADGE_GROUP_ELEMENTS_TEXT = HexColors.DefaultStatusText; +export const NODE_BADGE_GROUP_ELEMENTS_BACKGROUND = HexColors.Black500; +export const NODE_BADGE_GROUP_ELEMENTS_TEXT = HexColors.White; export const EDGE_LINE_COLOR = HexColors.DefaultEdge; export const EDGE_TERMINAL_COLOR = HexColors.DefaultEdge; diff --git a/src/core/components/SkGraph/Graph.interfaces.ts b/src/core/components/SkGraph/Graph.interfaces.ts index 6cdfb10a..3f8e6618 100644 --- a/src/core/components/SkGraph/Graph.interfaces.ts +++ b/src/core/components/SkGraph/Graph.interfaces.ts @@ -1,6 +1,6 @@ import { LayoutOptions } from '@antv/g6'; -export type GraphIconKeys = 'component' | 'process' | 'site' | 'podman' | 'kubernetes' | 'skupper'; +type GraphIconKeys = 'component' | 'process' | 'site' | 'podman' | 'kubernetes' | 'skupper'; export type GraphIconsMap = { [key in GraphIconKeys]: HTMLImageElement; diff --git a/src/core/components/SkGraph/components/CustomElements.ts b/src/core/components/SkGraph/components/CustomElements.ts index d06920bf..008c3099 100644 --- a/src/core/components/SkGraph/components/CustomElements.ts +++ b/src/core/components/SkGraph/components/CustomElements.ts @@ -124,7 +124,7 @@ const DEFAULT_NODE_CONFIG: NodeOptions = { }; // EDGE -export const DEFAULT_DATA_EDGE_CONFIG: EdgeOptions = { +const DEFAULT_DATA_EDGE_CONFIG: EdgeOptions = { style: { visibility: 'visible', opacity: 1, diff --git a/src/core/components/SkGraph/services/index.ts b/src/core/components/SkGraph/services/index.ts index 2760278e..fc2eb3c5 100644 --- a/src/core/components/SkGraph/services/index.ts +++ b/src/core/components/SkGraph/services/index.ts @@ -1,5 +1,7 @@ import { ComboData, EdgeData, NodeData } from '@antv/g6'; +import { ellipsisInTheMiddle } from '@core/utils/EllipsisInTheMiddle'; + import { graphIconsMap } from '../Graph.config'; import { GraphCombo, @@ -249,21 +251,6 @@ function markPairs(data: GraphEdge[]) { }); } -function ellipsisInTheMiddle(str: string) { - const maxLength = 20; - const leftPartLength = 15; - const rightPartLength = 5; - - if (str.length <= maxLength) { - return str; - } - - const leftPart = str.substring(0, leftPartLength); - const rightPart = str.substring(str.length - rightPartLength); - - return `${leftPart}...${rightPart}`; -} - /** * Normalizes a given metric value (such as bitrate) to a line thickness value * for visual representations like graphs or charts. The normalization is done diff --git a/src/core/utils/EllipsisInTheMiddle.ts b/src/core/utils/EllipsisInTheMiddle.ts new file mode 100644 index 00000000..963c9cf4 --- /dev/null +++ b/src/core/utils/EllipsisInTheMiddle.ts @@ -0,0 +1,17 @@ +export function ellipsisInTheMiddle( + str: string, + options?: { maxLength?: number; leftPartLenth?: number; rightPartLength?: number } +) { + const maxLength = options?.maxLength || 20; + const leftPartLength = options?.leftPartLenth || 15; + const rightPartLength = options?.rightPartLength || 5; + + if (str.length <= maxLength) { + return str; + } + + const leftPart = str.substring(0, leftPartLength); + const rightPart = str.substring(str.length - rightPartLength); + + return `${leftPart}...${rightPart}`; +} diff --git a/src/pages/Processes/Processes.enum.ts b/src/pages/Processes/Processes.enum.ts index 37b56e08..4d473170 100644 --- a/src/pages/Processes/Processes.enum.ts +++ b/src/pages/Processes/Processes.enum.ts @@ -61,6 +61,6 @@ export enum ProcessesLabels { Latency = 'Latency', Name = 'Name', Component = 'Component', - ByteRateRx = 'Rx byte rate', + ByteRateRx = 'Byte rate In', Exposed = 'Exposed' } diff --git a/src/pages/Topology/Topology.interfaces.ts b/src/pages/Topology/Topology.interfaces.ts index f442aa27..e6bdd0f4 100644 --- a/src/pages/Topology/Topology.interfaces.ts +++ b/src/pages/Topology/Topology.interfaces.ts @@ -1,18 +1,5 @@ import { PrometheusMetric, PrometheusLabels } from '@API/Prometheus.interfaces'; import { ProcessPairsResponse, ProcessResponse } from '@API/REST.interfaces'; -import { CustomItemsProps, GraphIconKeys } from '@core/components/SkGraph/Graph.interfaces'; - -export interface Entity { - id: string; - combo?: string; - comboName?: string; - groupId?: string; - groupName?: string; - label: string; - iconName: GraphIconKeys; - type?: CustomItemsProps; - groupedNodeCount?: number; -} export interface TopologyMetrics { bytesByProcessPairs: PrometheusMetric<'vector'>[]; @@ -56,7 +43,7 @@ export interface DisplayOptions { export interface NodeOrEdgeListProps { ids?: string[]; items: ProcessResponse[] | ProcessPairsResponse[]; - metrics: TopologyMetrics | null; + metrics: TopologyMetrics; modalType: 'process' | 'processPair'; } diff --git a/src/pages/Topology/__tests__/NodeOrEdgeList.spec.tsx b/src/pages/Topology/__tests__/NodeOrEdgeList.spec.tsx index b955dec8..54baa98c 100644 --- a/src/pages/Topology/__tests__/NodeOrEdgeList.spec.tsx +++ b/src/pages/Topology/__tests__/NodeOrEdgeList.spec.tsx @@ -7,7 +7,7 @@ import processesPairsData from '@mocks/data/PROCESS_PAIRS.json'; import processesData from '@mocks/data/PROCESSES.json'; import { loadMockServer } from '@mocks/server'; -import NodeOrEdgeList from '../components/NodeOrEdgeList'; +import TopologyDetails from '../components/TopologyDetails'; const processesResults = processesData.results as ProcessResponse[]; const processPairsResults = processesPairsData.results as ProcessPairsResponse[]; @@ -31,12 +31,58 @@ describe('NodeOrEdgeList', () => { render( - + ); expect(screen.getByText(processesResults[0].name)).toBeInTheDocument(); - expect(screen.getByText(`${processesResults[0].sourceHost}/${processesResults[0].hostName}`)).toBeInTheDocument(); expect(screen.getAllByText(processesResults[0].groupName)[0]).toBeInTheDocument(); expect(screen.getAllByText(processesResults[0].parentName)[0]).toBeInTheDocument(); expect( @@ -48,17 +94,51 @@ describe('NodeOrEdgeList', () => { it('should render a list of process pairs when modalType is "process-pair"', () => { const items = processPairsResults; - const ids = [processPairsResults[3].identity, processPairsResults[2].identity]; + const ids = [processPairsResults[2].identity]; render( - + ); expect(screen.getByText(processPairsResults[2].sourceName)).toBeInTheDocument(); expect(screen.getByText(processPairsResults[2].destinationName)).toBeInTheDocument(); - expect(screen.getByText(processPairsResults[3].sourceName)).toBeInTheDocument(); - expect(screen.getByText(processPairsResults[3].destinationName)).toBeInTheDocument(); }); }); diff --git a/src/pages/Topology/components/NodeOrEdgeList.tsx b/src/pages/Topology/components/EdgeDetails.tsx similarity index 51% rename from src/pages/Topology/components/NodeOrEdgeList.tsx rename to src/pages/Topology/components/EdgeDetails.tsx index e5295dc7..c87e55ef 100644 --- a/src/pages/Topology/components/NodeOrEdgeList.tsx +++ b/src/pages/Topology/components/EdgeDetails.tsx @@ -1,4 +1,4 @@ -import { FC, Fragment } from 'react'; +import { FC } from 'react'; import { DataList, @@ -12,145 +12,21 @@ import { DescriptionListGroup, DescriptionListTerm, Flex, - FlexItem, Stack, - StackItem, - Title + StackItem } from '@patternfly/react-core'; import { Link } from 'react-router-dom'; -import { ProcessPairsResponse, ProcessResponse } from '@API/REST.interfaces'; +import { ProcessPairsResponse } from '@API/REST.interfaces'; import ResourceIcon from '@core/components/ResourceIcon'; -import SkExposureCell from '@core/components/SkExposureCell'; import { formatByteRate, formatBytes } from '@core/utils/formatBytes'; import { formatLatency } from '@core/utils/formatLatency'; import { ProcessesLabels, ProcessesRoutesPaths } from '@pages/Processes/Processes.enum'; -import { ComponentRoutesPaths } from '@pages/ProcessGroups/ProcessGroups.enum'; -import { SitesRoutesPaths } from '@pages/Sites/Sites.enum'; import { TopologyLabels } from '../Topology.enum'; -import { NodeOrEdgeListProps, TopologyMetrics } from '../Topology.interfaces'; +import { TopologyMetrics } from '../Topology.interfaces'; -const NodeOrEdgeList: FC = function ({ ids, items, metrics, modalType }) { - const filteredItems = items.filter(({ identity }) => ids?.includes(identity)); - - return ( -
- {modalType === 'process' ? ( - - ) : ( - - )} -
- ); -}; - -export default NodeOrEdgeList; - -const ProcessesGrouped: FC<{ data: ProcessResponse[] }> = function ({ data }) { - return ( - - {data.map((itemSelected) => { - const goToLink = `${ProcessesRoutesPaths.Processes}/${itemSelected.name}@${itemSelected.identity}`; - - return ( - - - - - - - - <ResourceIcon type="process" /> - {itemSelected.name} - - - {itemSelected.sourceHost}/{itemSelected.hostName} - - - - - - - - - - - - - - - - - {itemSelected.parentName} - - - - - - - {itemSelected.groupName} - - - - - {itemSelected?.addresses?.map((service) => ( - - - - {service.split('@')[0]} - - - ))} - - - - - - , - - - - - {TopologyLabels.TopologyModalAction1} - - - - - - {TopologyLabels.TopologyModalAction2} - - - - - - {TopologyLabels.TopologyModalAction3} - - - - - ]} - /> - - - ); - })} - - ); -}; - -const ProcessesPairsGrouped: FC<{ data: ProcessPairsResponse[]; metrics: TopologyMetrics | null }> = function ({ +const EdgeDetails: FC<{ data: ProcessPairsResponse[]; metrics: TopologyMetrics | null }> = function ({ data, metrics }) { @@ -274,3 +150,5 @@ const ProcessesPairsGrouped: FC<{ data: ProcessPairsResponse[]; metrics: Topolog ); }; + +export default EdgeDetails; diff --git a/src/pages/Topology/components/NodeDetails.tsx b/src/pages/Topology/components/NodeDetails.tsx new file mode 100644 index 00000000..91a1e547 --- /dev/null +++ b/src/pages/Topology/components/NodeDetails.tsx @@ -0,0 +1,254 @@ +import { FC, Fragment } from 'react'; + +import { + Card, + CardBody, + CardHeader, + CardTitle, + DescriptionList, + DescriptionListDescription, + DescriptionListGroup, + DescriptionListTerm, + Flex, + FlexItem, + Split, + SplitItem, + Stack, + StackItem, + Title +} from '@patternfly/react-core'; +import { Table, Tbody, Td, Th, Thead, Tr } from '@patternfly/react-table'; +import { Link } from 'react-router-dom'; + +import { FlowDirection } from '@API/REST.enum'; +import { ProcessResponse } from '@API/REST.interfaces'; +import ResourceIcon from '@core/components/ResourceIcon'; +import SkExposureCell from '@core/components/SkExposureCell'; +import { ellipsisInTheMiddle } from '@core/utils/EllipsisInTheMiddle'; +import { formatByteRate, formatBytes } from '@core/utils/formatBytes'; +import { ProcessesLabels, ProcessesRoutesPaths } from '@pages/Processes/Processes.enum'; +import { ComponentRoutesPaths } from '@pages/ProcessGroups/ProcessGroups.enum'; +import { MetricsLabels } from '@pages/shared/Metrics/Metrics.enum'; +import { SitesRoutesPaths } from '@pages/Sites/Sites.enum'; + +import { TopologyLabels } from '../Topology.enum'; +import { TopologyMetrics } from '../Topology.interfaces'; + +type Totals = { + totalBytesIn: Record; + totalBytesOut: Record; + totalByteRateIn: Record; + totalByteRateOut: Record; +}; + +const NodeDetails: FC<{ data: ProcessResponse[]; metrics: TopologyMetrics }> = function ({ data, metrics }) { + const names = data.map((itemSelected) => itemSelected.name); + + const initialTotals: Totals = { + totalBytesIn: {}, + totalBytesOut: {}, + totalByteRateIn: {}, + totalByteRateOut: {} + }; + + const bytes = metrics?.bytesByProcessPairs.reduce((acc, { metric, value }) => { + if (names.includes(metric.sourceProcess) && metric.direction === FlowDirection.Incoming) { + acc.totalBytesOut[metric.sourceProcess] = (acc.totalBytesOut[metric.sourceProcess] || 0) + Number(value[1]); + } + + if (names.includes(metric.destProcess) && metric.direction === FlowDirection.Incoming) { + acc.totalBytesIn[metric.destProcess] = (acc.totalBytesIn[metric.destProcess] || 0) + Number(value[1]); + } + + return acc; + }, initialTotals); + + const byteRates = metrics?.byteRateByProcessPairs.reduce((acc, { metric, value }) => { + if (names.includes(metric.sourceProcess) && metric.direction === FlowDirection.Incoming) { + acc.totalByteRateOut[metric.sourceProcess] = (acc.totalByteRateOut[metric.sourceProcess] || 0) + Number(value[1]); + } + + if (names.includes(metric.destProcess) && metric.direction === FlowDirection.Incoming) { + acc.totalByteRateIn[metric.destProcess] = (acc.totalByteRateIn[metric.destProcess] || 0) + Number(value[1]); + } + + return acc; + }, initialTotals); + + const byteRateInValues = Object.values(byteRates.totalByteRateIn); + const byteRateOutValues = Object.values(byteRates.totalByteRateOut); + + const totalBytesInSum = Object.values(bytes.totalBytesIn).reduce((acc, val) => acc + val, 0); + const totalBytesOutSum = Object.values(bytes.totalBytesOut).reduce((acc, val) => acc + val, 0); + const totalByteRateInSum = byteRateInValues.reduce((acc, val) => acc + val, 0); + const totalByteRateOutSum = byteRateOutValues.reduce((acc, val) => acc + val, 0); + + const avgByteRateInSum = totalByteRateInSum / (byteRateInValues.length || 1); + const avgByteRateOutSum = totalByteRateOutSum / (byteRateOutValues.length || 1); + + return ( + <> + + + Summary + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ {MetricsLabels.TrafficReceived}{MetricsLabels.TrafficSent}
+ {ProcessesLabels.ByteRate} + {formatByteRate(totalByteRateInSum)}{formatByteRate(totalByteRateOutSum)}
+ Avg. {ProcessesLabels.ByteRate} + {formatByteRate(avgByteRateInSum)}{formatByteRate(avgByteRateOutSum)}
+ {ProcessesLabels.Bytes} + {formatBytes(totalBytesInSum)}{formatBytes(totalBytesOutSum)}
+
+
+ + + + + {data.map((itemSelected) => { + const goToLink = `${ProcessesRoutesPaths.Processes}/${itemSelected.name}@${itemSelected.identity}`; + + return ( + + + + + + + <ResourceIcon type="process" /> + {ellipsisInTheMiddle(itemSelected.name, { rightPartLength: 10 })} + + + + + + + + + + + {TopologyLabels.TopologyModalAction1} + + + + + + {TopologyLabels.TopologyModalAction2} + + + + + + {TopologyLabels.TopologyModalAction3} + + + + + + + + + + + + + + + + + + + + + + + +
+ {MetricsLabels.TrafficReceived}{MetricsLabels.TrafficSent}
+ {ProcessesLabels.ByteRate} + {formatBytes(byteRates?.totalByteRateIn[itemSelected.name] || 0)}{formatBytes(byteRates?.totalByteRateOut[itemSelected.name] || 0)}
+ {ProcessesLabels.Bytes} + {formatBytes(bytes?.totalBytesIn[itemSelected.name] || 0)}{formatBytes(bytes?.totalBytesOut[itemSelected.name] || 0)}
+ + + + + Resources + + + + + + + {itemSelected.parentName} + + + + + + + {itemSelected.groupName} + + + + + {itemSelected?.addresses?.map((service) => ( + + + + {service.split('@')[0]} + + + ))} + + + + + +
+
+
+ ); + })} +
+
+
+ + ); +}; + +export default NodeDetails; diff --git a/src/pages/Topology/components/TopologyDetails.tsx b/src/pages/Topology/components/TopologyDetails.tsx new file mode 100644 index 00000000..f090b74b --- /dev/null +++ b/src/pages/Topology/components/TopologyDetails.tsx @@ -0,0 +1,23 @@ +import { FC } from 'react'; + +import { ProcessPairsResponse, ProcessResponse } from '@API/REST.interfaces'; + +import EdgeDetails from './EdgeDetails'; +import NodeDetails from './NodeDetails'; +import { NodeOrEdgeListProps } from '../Topology.interfaces'; + +const TopologyDetails: FC = function ({ ids, items, metrics, modalType }) { + const filteredItems = items.filter(({ identity }) => ids?.includes(identity)); + + return ( +
+ {modalType === 'process' ? ( + + ) : ( + + )} +
+ ); +}; + +export default TopologyDetails; diff --git a/src/pages/Topology/components/TopologyProcesses.tsx b/src/pages/Topology/components/TopologyProcesses.tsx index 2d56534e..02cc9a54 100644 --- a/src/pages/Topology/components/TopologyProcesses.tsx +++ b/src/pages/Topology/components/TopologyProcesses.tsx @@ -21,7 +21,7 @@ import SkGraph from '@core/components/SkGraph'; import { SkGraphProps } from '@core/components/SkGraph/Graph.interfaces'; import { ProcessesLabels, ProcessesRoutesPaths } from '@pages/Processes/Processes.enum'; -import NodeOrEdgeList from './NodeOrEdgeList'; +import TopologyDetails from './TopologyDetails'; import TopologyToolbar from './TopologyToolbar'; import useTopologyProcessData from './useTopologyProcessData'; import useServiceState from './useTopologyServiceState'; @@ -47,7 +47,7 @@ const TopologyProcesses: FC<{ ids?: string[]; GraphComponent?: ComponentType; ModalComponent?: ComponentType; -}> = function ({ serviceIds, ids: processIds, GraphComponent = SkGraph, ModalComponent = NodeOrEdgeList }) { +}> = function ({ serviceIds, ids: processIds, GraphComponent = SkGraph, ModalComponent = TopologyDetails }) { const navigate = useNavigate(); // TODO: The graph doesn't resize its children if the drawer is opened before the graph is mounted. diff --git a/src/pages/shared/FlowPairs/FlowPair.enum.ts b/src/pages/shared/FlowPairs/FlowPair.enum.ts index 5e615bcd..860289f3 100644 --- a/src/pages/shared/FlowPairs/FlowPair.enum.ts +++ b/src/pages/shared/FlowPairs/FlowPair.enum.ts @@ -20,16 +20,16 @@ export enum FlowPairLabels { Client = 'Client', From = 'From client', To = 'To server', - TxBytes = 'Tx data', - RxBytes = 'Rx data', - TxByteRate = 'Tx rate', - RxByteRate = 'Rx rate', - TxLatency = 'Tx Latency', - RxLatency = 'Rx Latency', - TxUnacked = 'Tx unkacked', - RxUnacked = 'Rx unacked', - TxWindow = 'Tx window size', - RxWindow = 'Rx window size', + TxBytes = 'Data Out', + RxBytes = 'Data In', + TxByteRate = 'Rate In', + RxByteRate = 'Rate Out', + TxLatency = 'Latency In', + RxLatency = 'Latency Out', + TxUnacked = 'Unkacked In', + RxUnacked = 'Unacked Out', + TxWindow = 'Window size Out', + RxWindow = 'Window size In', TTFB = 'TTFB', Completed = 'Completed', ClientPort = 'Client port', diff --git a/src/pages/shared/Metrics/Metrics.enum.ts b/src/pages/shared/Metrics/Metrics.enum.ts index 96708a51..22a76db2 100644 --- a/src/pages/shared/Metrics/Metrics.enum.ts +++ b/src/pages/shared/Metrics/Metrics.enum.ts @@ -1,6 +1,6 @@ export enum MetricsLabels { - TrafficSent = 'Tx', - TrafficReceived = 'Rx', + TrafficSent = 'Out', + TrafficReceived = 'In', ClientErrorRDistributionSeriesAxisYLabel = 'Error distribution', ErrorLabel = 'errors', ErrorRateSeriesAxisYLabel = 'error rate', diff --git a/yarn.lock b/yarn.lock index 2a573fdf..f2e74e8a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -825,10 +825,10 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" -"@cypress/request@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@cypress/request/-/request-3.0.0.tgz#7f58dfda087615ed4e6aab1b25fffe7630d6dd85" - integrity sha512-GKFCqwZwMYmL3IBoNeR2MM1SnxRIGERsQOTWeQKoYBt2JLqcqiy7JXqO894FLrpjZYqGxW92MNwRH2BN56obdQ== +"@cypress/request@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@cypress/request/-/request-3.0.1.tgz#72d7d5425236a2413bd3d8bb66d02d9dc3168960" + integrity sha512-TWivJlJi8ZDx2wGOw1dbLuHJKUYX7bWySw377nlnGOW3hP9/MUKIsEdXT/YngWxVdgNCHRBmFlBipE+5/2ZZlQ== dependencies: aws-sign2 "~0.7.0" aws4 "^1.8.0" @@ -843,7 +843,7 @@ json-stringify-safe "~5.0.1" mime-types "~2.1.19" performance-now "^2.1.0" - qs "~6.10.3" + qs "6.10.4" safe-buffer "^5.1.2" tough-cookie "^4.1.3" tunnel-agent "^0.6.0" @@ -1486,10 +1486,10 @@ "@react-spring/shared" "~9.7.3" "@react-spring/types" "~9.7.3" -"@remix-run/router@1.18.0": - version "1.18.0" - resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.18.0.tgz#20b033d1f542a100c1d57cfd18ecf442d1784732" - integrity sha512-L3jkqmqoSVBVKHfpGZmLrex0lxR5SucGA0sUfFzGctehw+S/ggL9L/0NnC5mw6P8HUWpFZ3nQw3cRApjjWx9Sw== +"@remix-run/router@1.19.0": + version "1.19.0" + resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.19.0.tgz#745dbffbce67f05386d57ca22c51dfd85c979593" + integrity sha512-zDICCLKEwbVYTS6TjYaWtHXxkdoUvD/QXvyVZjGCsWz5vyH7aFeONlPffPdW+Y/t6KT0MgXb2Mfjun9YpWN1dA== "@sideway/address@^4.1.3": version "4.1.4" @@ -1537,17 +1537,17 @@ dependencies: "@sinonjs/commons" "^2.0.0" -"@tanstack/query-core@5.51.15": - version "5.51.15" - resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-5.51.15.tgz#7aee6a2d5d3f64de3e54096607233b1132dc6afd" - integrity sha512-xyobHDJ0yhPE3+UkSQ2/4X1fLSg7ICJI5J1JyU9yf7F3deQfEwSImCDrB1WSRrauJkMtXW7YIEcC0oA6ZZWt5A== +"@tanstack/query-core@5.51.21": + version "5.51.21" + resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-5.51.21.tgz#a510469c6c30d3de2a8b8798e340169a4b0fd08f" + integrity sha512-POQxm42IUp6n89kKWF4IZi18v3fxQWFRolvBA6phNVmA8psdfB1MvDnGacCJdS+EOX12w/CyHM62z//rHmYmvw== -"@tanstack/react-query@^5.51.15": - version "5.51.15" - resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-5.51.15.tgz#059bb2966f828263adb355de81410d107e22b5bc" - integrity sha512-UgFg23SrdIYrmfTSxAUn9g+J64VQy11pb9/EefoY/u2+zWuNMeqEOnvpJhf52XQy0yztQoyM9p6x8PFyTNaxXg== +"@tanstack/react-query@^5.51.21": + version "5.51.21" + resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-5.51.21.tgz#cdd14677bcc809a83e01b6c38842c841ce7420af" + integrity sha512-Q/V81x3sAYgCsxjwOkfLXfrmoG+FmDhLeHH5okC/Bp8Aaw2c33lbEo/mMcMnkxUPVtB2FLpzHT0tq3c+OlZEbw== dependencies: - "@tanstack/query-core" "5.51.15" + "@tanstack/query-core" "5.51.21" "@testing-library/dom@^10.4.0": version "10.4.0" @@ -1918,11 +1918,6 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== -"@types/json-schema@^7.0.15": - version "7.0.15" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" - integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== - "@types/json5@^0.0.29": version "0.0.29" resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" @@ -1990,11 +1985,6 @@ resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.2.tgz#ed279a64fa438bb69f2480eda44937912bb7480a" integrity sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow== -"@types/semver@^7.5.8": - version "7.5.8" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" - integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== - "@types/serve-index@^1.9.4": version "1.9.4" resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.4.tgz#e6ae13d5053cb06ed36392110b4f9a49ac4ec898" @@ -2072,75 +2062,75 @@ dependencies: "@types/node" "*" -"@typescript-eslint/eslint-plugin@^7.17.0": - version "7.17.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.17.0.tgz#c8ed1af1ad2928ede5cdd207f7e3090499e1f77b" - integrity sha512-pyiDhEuLM3PuANxH7uNYan1AaFs5XE0zw1hq69JBvGvE7gSuEoQl1ydtEe/XQeoC3GQxLXyOVa5kNOATgM638A== +"@typescript-eslint/eslint-plugin@^7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz#b16d3cf3ee76bf572fdf511e79c248bdec619ea3" + integrity sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw== dependencies: "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "7.17.0" - "@typescript-eslint/type-utils" "7.17.0" - "@typescript-eslint/utils" "7.17.0" - "@typescript-eslint/visitor-keys" "7.17.0" + "@typescript-eslint/scope-manager" "7.18.0" + "@typescript-eslint/type-utils" "7.18.0" + "@typescript-eslint/utils" "7.18.0" + "@typescript-eslint/visitor-keys" "7.18.0" graphemer "^1.4.0" ignore "^5.3.1" natural-compare "^1.4.0" ts-api-utils "^1.3.0" -"@typescript-eslint/parser@^7.17.0": - version "7.17.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.17.0.tgz#be8e32c159190cd40a305a2121220eadea5a88e7" - integrity sha512-puiYfGeg5Ydop8eusb/Hy1k7QmOU6X3nvsqCgzrB2K4qMavK//21+PzNE8qeECgNOIoertJPUC1SpegHDI515A== +"@typescript-eslint/parser@^7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.18.0.tgz#83928d0f1b7f4afa974098c64b5ce6f9051f96a0" + integrity sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg== dependencies: - "@typescript-eslint/scope-manager" "7.17.0" - "@typescript-eslint/types" "7.17.0" - "@typescript-eslint/typescript-estree" "7.17.0" - "@typescript-eslint/visitor-keys" "7.17.0" + "@typescript-eslint/scope-manager" "7.18.0" + "@typescript-eslint/types" "7.18.0" + "@typescript-eslint/typescript-estree" "7.18.0" + "@typescript-eslint/visitor-keys" "7.18.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@7.17.0": - version "7.17.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.17.0.tgz#e072d0f914662a7bfd6c058165e3c2b35ea26b9d" - integrity sha512-0P2jTTqyxWp9HiKLu/Vemr2Rg1Xb5B7uHItdVZ6iAenXmPo4SZ86yOPCJwMqpCyaMiEHTNqizHfsbmCFT1x9SA== +"@typescript-eslint/scope-manager@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz#c928e7a9fc2c0b3ed92ab3112c614d6bd9951c83" + integrity sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA== dependencies: - "@typescript-eslint/types" "7.17.0" - "@typescript-eslint/visitor-keys" "7.17.0" + "@typescript-eslint/types" "7.18.0" + "@typescript-eslint/visitor-keys" "7.18.0" -"@typescript-eslint/scope-manager@7.8.0": - version "7.8.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.8.0.tgz#bb19096d11ec6b87fb6640d921df19b813e02047" - integrity sha512-viEmZ1LmwsGcnr85gIq+FCYI7nO90DVbE37/ll51hjv9aG+YZMb4WDE2fyWpUR4O/UrhGRpYXK/XajcGTk2B8g== +"@typescript-eslint/scope-manager@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.0.0.tgz#d14df46c9e43c53af7699dfa800cd615d7dfc118" + integrity sha512-V0aa9Csx/ZWWv2IPgTfY7T4agYwJyILESu/PVqFtTFz9RIS823mAze+NbnBI8xiwdX3iqeQbcTYlvB04G9wyQw== dependencies: - "@typescript-eslint/types" "7.8.0" - "@typescript-eslint/visitor-keys" "7.8.0" + "@typescript-eslint/types" "8.0.0" + "@typescript-eslint/visitor-keys" "8.0.0" -"@typescript-eslint/type-utils@7.17.0": - version "7.17.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.17.0.tgz#c5da78feb134c9c9978cbe89e2b1a589ed22091a" - integrity sha512-XD3aaBt+orgkM/7Cei0XNEm1vwUxQ958AOLALzPlbPqb8C1G8PZK85tND7Jpe69Wualri81PLU+Zc48GVKIMMA== +"@typescript-eslint/type-utils@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz#2165ffaee00b1fbbdd2d40aa85232dab6998f53b" + integrity sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA== dependencies: - "@typescript-eslint/typescript-estree" "7.17.0" - "@typescript-eslint/utils" "7.17.0" + "@typescript-eslint/typescript-estree" "7.18.0" + "@typescript-eslint/utils" "7.18.0" debug "^4.3.4" ts-api-utils "^1.3.0" -"@typescript-eslint/types@7.17.0": - version "7.17.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.17.0.tgz#7ce8185bdf06bc3494e73d143dbf3293111b9cff" - integrity sha512-a29Ir0EbyKTKHnZWbNsrc/gqfIBqYPwj3F2M+jWE/9bqfEHg0AMtXzkbUkOG6QgEScxh2+Pz9OXe11jHDnHR7A== +"@typescript-eslint/types@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.18.0.tgz#b90a57ccdea71797ffffa0321e744f379ec838c9" + integrity sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ== -"@typescript-eslint/types@7.8.0": - version "7.8.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.8.0.tgz#1fd2577b3ad883b769546e2d1ef379f929a7091d" - integrity sha512-wf0peJ+ZGlcH+2ZS23aJbOv+ztjeeP8uQ9GgwMJGVLx/Nj9CJt17GWgWWoSmoRVKAX2X+7fzEnAjxdvK2gqCLw== +"@typescript-eslint/types@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.0.0.tgz#7195ea9369fe5ee46b958d7ffca6bd26511cce18" + integrity sha512-wgdSGs9BTMWQ7ooeHtu5quddKKs5Z5dS+fHLbrQI+ID0XWJLODGMHRfhwImiHoeO2S5Wir2yXuadJN6/l4JRxw== -"@typescript-eslint/typescript-estree@7.17.0": - version "7.17.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.17.0.tgz#dcab3fea4c07482329dd6107d3c6480e228e4130" - integrity sha512-72I3TGq93t2GoSBWI093wmKo0n6/b7O4j9o8U+f65TVD0FS6bI2180X5eGEr8MA8PhKMvYe9myZJquUT2JkCZw== +"@typescript-eslint/typescript-estree@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz#b5868d486c51ce8f312309ba79bdb9f331b37931" + integrity sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA== dependencies: - "@typescript-eslint/types" "7.17.0" - "@typescript-eslint/visitor-keys" "7.17.0" + "@typescript-eslint/types" "7.18.0" + "@typescript-eslint/visitor-keys" "7.18.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" @@ -2148,13 +2138,13 @@ semver "^7.6.0" ts-api-utils "^1.3.0" -"@typescript-eslint/typescript-estree@7.8.0": - version "7.8.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.8.0.tgz#b028a9226860b66e623c1ee55cc2464b95d2987c" - integrity sha512-5pfUCOwK5yjPaJQNy44prjCwtr981dO8Qo9J9PwYXZ0MosgAbfEMB008dJ5sNo3+/BN6ytBPuSvXUg9SAqB0dg== +"@typescript-eslint/typescript-estree@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.0.0.tgz#d172385ced7cb851a038b5c834c245a97a0f9cf6" + integrity sha512-5b97WpKMX+Y43YKi4zVcCVLtK5F98dFls3Oxui8LbnmRsseKenbbDinmvxrWegKDMmlkIq/XHuyy0UGLtpCDKg== dependencies: - "@typescript-eslint/types" "7.8.0" - "@typescript-eslint/visitor-keys" "7.8.0" + "@typescript-eslint/types" "8.0.0" + "@typescript-eslint/visitor-keys" "8.0.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" @@ -2162,43 +2152,40 @@ semver "^7.6.0" ts-api-utils "^1.3.0" -"@typescript-eslint/utils@7.17.0": - version "7.17.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.17.0.tgz#815cd85b9001845d41b699b0ce4f92d6dfb84902" - integrity sha512-r+JFlm5NdB+JXc7aWWZ3fKSm1gn0pkswEwIYsrGPdsT2GjsRATAKXiNtp3vgAAO1xZhX8alIOEQnNMl3kbTgJw== +"@typescript-eslint/utils@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.18.0.tgz#bca01cde77f95fc6a8d5b0dbcbfb3d6ca4be451f" + integrity sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw== dependencies: "@eslint-community/eslint-utils" "^4.4.0" - "@typescript-eslint/scope-manager" "7.17.0" - "@typescript-eslint/types" "7.17.0" - "@typescript-eslint/typescript-estree" "7.17.0" + "@typescript-eslint/scope-manager" "7.18.0" + "@typescript-eslint/types" "7.18.0" + "@typescript-eslint/typescript-estree" "7.18.0" -"@typescript-eslint/utils@^6.0.0 || ^7.0.0": - version "7.8.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.8.0.tgz#57a79f9c0c0740ead2f622e444cfaeeb9fd047cd" - integrity sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ== +"@typescript-eslint/utils@^6.0.0 || ^7.0.0 || ^8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.0.0.tgz#1794d6f4b37ec253172a173dc938ae68651b9b99" + integrity sha512-k/oS/A/3QeGLRvOWCg6/9rATJL5rec7/5s1YmdS0ZU6LHveJyGFwBvLhSRBv6i9xaj7etmosp+l+ViN1I9Aj/Q== dependencies: "@eslint-community/eslint-utils" "^4.4.0" - "@types/json-schema" "^7.0.15" - "@types/semver" "^7.5.8" - "@typescript-eslint/scope-manager" "7.8.0" - "@typescript-eslint/types" "7.8.0" - "@typescript-eslint/typescript-estree" "7.8.0" - semver "^7.6.0" + "@typescript-eslint/scope-manager" "8.0.0" + "@typescript-eslint/types" "8.0.0" + "@typescript-eslint/typescript-estree" "8.0.0" -"@typescript-eslint/visitor-keys@7.17.0": - version "7.17.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.17.0.tgz#680465c734be30969e564b4647f38d6cdf49bfb0" - integrity sha512-RVGC9UhPOCsfCdI9pU++K4nD7to+jTcMIbXTSOcrLqUEW6gF2pU1UUbYJKc9cvcRSK1UDeMJ7pdMxf4bhMpV/A== +"@typescript-eslint/visitor-keys@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz#0564629b6124d67607378d0f0332a0495b25e7d7" + integrity sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg== dependencies: - "@typescript-eslint/types" "7.17.0" + "@typescript-eslint/types" "7.18.0" eslint-visitor-keys "^3.4.3" -"@typescript-eslint/visitor-keys@7.8.0": - version "7.8.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.8.0.tgz#7285aab991da8bee411a42edbd5db760d22fdd91" - integrity sha512-q4/gibTNBQNA0lGyYQCmWRS5D15n8rXh4QjK3KV+MBPlTYHpfBUT3D3PaPR/HeNiI9W6R7FvlkcGhNyAoP+caA== +"@typescript-eslint/visitor-keys@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.0.0.tgz#224a67230190d267e6e78586bd7d8dfbd32ae4f3" + integrity sha512-oN0K4nkHuOyF3PVMyETbpP5zp6wfyOvm7tWhTMfoqxSSsPmJIh6JNASuZDlODE8eE+0EB9uar+6+vxr9DBTYOA== dependencies: - "@typescript-eslint/types" "7.8.0" + "@typescript-eslint/types" "8.0.0" eslint-visitor-keys "^3.4.3" "@ungap/structured-clone@^1.2.0": @@ -2784,10 +2771,10 @@ axios@^1.6.1: form-data "^4.0.0" proxy-from-env "^1.1.0" -axios@^1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.2.tgz#b625db8a7051fbea61c35a3cbb3a1daa7b9c7621" - integrity sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw== +axios@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.3.tgz#a1125f2faf702bc8e8f2104ec3a76fab40257d85" + integrity sha512-Ar7ND9pU99eJ9GpoGQKhKf58GpUOgnzuaB7ueNQ5BMi0p+LZ5oaEnfF999fAArcTIBwXTCHAmGcHOZJaWPq9Nw== dependencies: follow-redirects "^1.15.6" form-data "^4.0.0" @@ -3749,11 +3736,11 @@ csstype@^3.0.2: integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== cypress@^13.13.1: - version "13.13.1" - resolved "https://registry.yarnpkg.com/cypress/-/cypress-13.13.1.tgz#860c1142a6e58ea412a764f0ce6ad07567721129" - integrity sha512-8F9UjL5MDUdgC/S5hr8CGLHbS5gGht5UOV184qc2pFny43fnkoaKxlzH/U6//zmGu/xRTaKimNfjknLT8+UDFg== + version "13.13.2" + resolved "https://registry.yarnpkg.com/cypress/-/cypress-13.13.2.tgz#c71f8d92056c430b1b879e5313f6de25ccce0eda" + integrity sha512-PvJQU33933NvS1StfzEb8/mu2kMy4dABwCF+yd5Bi7Qly1HOVf+Bufrygee/tlmty/6j5lX+KIi8j9Q3JUMbhA== dependencies: - "@cypress/request" "^3.0.0" + "@cypress/request" "^3.0.1" "@cypress/xvfb" "^1.2.4" "@types/sinonjs__fake-timers" "8.1.1" "@types/sizzle" "^2.3.2" @@ -4952,12 +4939,12 @@ eslint-plugin-import@^2.29.1: semver "^6.3.1" tsconfig-paths "^3.15.0" -eslint-plugin-jest@^28.6.0: - version "28.6.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-28.6.0.tgz#8410588d60bcafa68a91b6ec272e4a415502302a" - integrity sha512-YG28E1/MIKwnz+e2H7VwYPzHUYU4aMa19w0yGcwXnnmJH6EfgHahTJ2un3IyraUxNfnz/KUhJAFXNNwWPo12tg== +eslint-plugin-jest@^28.7.0: + version "28.7.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-28.7.0.tgz#8ff262c26520242492f85f9268995bbf624758a4" + integrity sha512-fzPGN7awL2ftVRQh/bsCi+16ArUZWujZnD1b8EGJqy8nr4//7tZ3BIdc/9edcJBtB3hpci3GtdMNFVDwHU0Eag== dependencies: - "@typescript-eslint/utils" "^6.0.0 || ^7.0.0" + "@typescript-eslint/utils" "^6.0.0 || ^7.0.0 || ^8.0.0" eslint-plugin-react-hooks@^4.6.2: version "4.6.2" @@ -5557,10 +5544,10 @@ forwarded@0.2.0: resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== -framer-motion@^11.3.19: - version "11.3.19" - resolved "https://registry.yarnpkg.com/framer-motion/-/framer-motion-11.3.19.tgz#7a2bd72ed1dd04a47d8ecb8444447cfc47c70984" - integrity sha512-+luuQdx4AsamyMcvzW7jUAJYIKvQs1KE7oHvKkW3eNzmo0S+3PSDWjBuQkuIP9WyneGnKGMLUSuHs8OP7jKpQg== +framer-motion@^11.3.21: + version "11.3.21" + resolved "https://registry.yarnpkg.com/framer-motion/-/framer-motion-11.3.21.tgz#bdf06cf3ced9f14ddf055e098c1566795f353466" + integrity sha512-D+hfIsvzV8eL/iycld4K+tKlg2Q2LdwnrcBEohtGw3cG1AIuNYATbT5RUqIM1ndsAk+EfGhoSGf0UaiFodc5Tw== dependencies: tslib "^2.4.0" @@ -6169,10 +6156,10 @@ human-signals@^5.0.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== -husky@^9.1.3: - version "9.1.3" - resolved "https://registry.yarnpkg.com/husky/-/husky-9.1.3.tgz#46cddff01f9a551f87b39accc67860bce5d00680" - integrity sha512-ET3TQmQgdIu0pt+jKkpo5oGyg/4MQZpG6xcam5J5JyNJV+CBT23OBpCF15bKHKycRyMH9k6ONy8g2HdGIsSkMQ== +husky@^9.1.4: + version "9.1.4" + resolved "https://registry.yarnpkg.com/husky/-/husky-9.1.4.tgz#926fd19c18d345add5eab0a42b2b6d9a80259b34" + integrity sha512-bho94YyReb4JV7LYWRWxZ/xr6TtOTt8cMfmQ39MQYJ7f/YE268s3GdghGwi+y4zAeqewE5zYLvuhV0M0ijsDEA== iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" @@ -8750,6 +8737,13 @@ pure-rand@^6.0.0: resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.1.tgz#31207dddd15d43f299fdcdb2f572df65030c19af" integrity sha512-t+x1zEHDjBwkDGY5v5ApnZ/utcd4XYDiJsaQQoptTXgUXX95sDg1elCdJghzicm7n2mbCBJ3uYWr6M22SO19rg== +qs@6.10.4: + version "6.10.4" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.4.tgz#6a3003755add91c0ec9eacdc5f878b034e73f9e7" + integrity sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g== + dependencies: + side-channel "^1.0.4" + qs@6.11.0: version "6.11.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" @@ -8757,13 +8751,6 @@ qs@6.11.0: dependencies: side-channel "^1.0.4" -qs@~6.10.3: - version "6.10.5" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.5.tgz#974715920a80ff6a262264acd2c7e6c2a53282b4" - integrity sha512-O5RlPh0VFtR78y79rgcgKK4wbAI0C5zGVLztOIdpWX6ep368q5Hv6XRxDvXuZ9q3C6v+e3n8UfZZJw7IIG27eQ== - dependencies: - side-channel "^1.0.4" - querystringify@^2.1.1: version "2.2.0" resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" @@ -8852,20 +8839,20 @@ react-is@^18.0.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== -react-router-dom@^6.25.1: - version "6.25.1" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.25.1.tgz#b89f8d63fc8383ea4e89c44bf31c5843e1f7afa0" - integrity sha512-0tUDpbFvk35iv+N89dWNrJp+afLgd+y4VtorJZuOCXK0kkCWjEvb3vTJM++SYvMEpbVwXKf3FjeVveVEb6JpDQ== +react-router-dom@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.26.0.tgz#8debe13295c58605c04f93018d659a763245e58c" + integrity sha512-RRGUIiDtLrkX3uYcFiCIxKFWMcWQGMojpYZfcstc63A1+sSnVgILGIm9gNUA6na3Fm1QuPGSBQH2EMbAZOnMsQ== dependencies: - "@remix-run/router" "1.18.0" - react-router "6.25.1" + "@remix-run/router" "1.19.0" + react-router "6.26.0" -react-router@6.25.1: - version "6.25.1" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.25.1.tgz#70b4f1af79954cfcfd23f6ddf5c883e8c904203e" - integrity sha512-u8ELFr5Z6g02nUtpPAggP73Jigj1mRePSwhS/2nkTrlPU5yEkH1vYzWNyvSnSzeeE2DNqWdH+P8OhIh9wuXhTw== +react-router@6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.26.0.tgz#d5af4c46835b202348ef2b7ddacd32a2db539fde" + integrity sha512-wVQq0/iFYd3iZ9H2l3N3k4PL8EEHcb0XlU2Na8nEwmiXgIUElEH6gaJDtUQxJ+JFzmIXaQjfdpcGWaM6IoQGxg== dependencies: - "@remix-run/router" "1.18.0" + "@remix-run/router" "1.19.0" react@^18.3.1: version "18.3.1" @@ -10061,10 +10048,10 @@ ts-api-utils@^1.3.0: resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== -ts-jest@^29.2.3: - version "29.2.3" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.2.3.tgz#3d226ac36b8b820151a38f164414f9f6b412131f" - integrity sha512-yCcfVdiBFngVz9/keHin9EnsrQtQtEu3nRykNy9RVp+FiPFFbPJ3Sg6Qg4+TkmH0vMP5qsTKgXSsk80HRwvdgQ== +ts-jest@^29.2.4: + version "29.2.4" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.2.4.tgz#38ccf487407d7a63054a72689f6f99b075e296e5" + integrity sha512-3d6tgDyhCI29HlpwIq87sNuI+3Q6GLTTCeYRHCs7vDz+/3GCMwEtV9jezLyl4ZtnBgx00I7hm8PCP8cTksMGrw== dependencies: bs-logger "0.x" ejs "^3.1.10"