From 783b826268b8c7faecb140e515b702b0401c5800 Mon Sep 17 00:00:00 2001 From: Valerii Sidorenko Date: Tue, 2 Apr 2024 11:13:46 +0200 Subject: [PATCH 1/4] feat!: update uikit 6 --- .eslintrc | 24 +- .husky/commit-msg | 5 +- .husky/pre-commit | 5 +- .stylelintrc | 1 - package-lock.json | 7981 ++++++++++------- package.json | 123 +- playwright.config.ts | 3 +- src/.eslintrc | 30 +- .../BasicNodeViewer/BasicNodeViewer.tsx | 12 +- .../ButtonWithConfirmDialog.tsx | 15 +- .../CellWithPopover/CellWithPopover.tsx | 5 +- .../CircularProgressBar.tsx | 6 +- .../ClipboardButton/ClipboardButton.tsx | 8 +- .../ComponentsProvider/ComponentsProvider.tsx | 1 + .../ComponentsProvider/componentsRegistry.ts | 7 +- src/components/ComponentsProvider/registry.ts | 7 +- .../ContentWithPopup/ContentWithPopup.tsx | 17 +- .../CriticalActionDialog.tsx | 18 +- src/components/DateRange/DateRange.tsx | 7 +- .../DiagnosticCard/DiagnosticCard.tsx | 5 +- .../DiskPageTitle/DiskPageTitle.tsx | 6 +- .../DiskStateProgressBar.tsx | 4 +- src/components/Divider/Divider.tsx | 2 +- src/components/EmptyState/EmptyState.tsx | 10 +- .../EnableFullscreenButton.tsx | 3 +- .../EntitiesCount/EntitiesCount.tsx | 1 + src/components/EntitiesCount/i18n/index.ts | 7 +- src/components/EntityStatus/EntityStatus.tsx | 38 +- .../ErrorBoundary/ErrorBoundary.tsx | 16 +- src/components/ErrorBoundary/i18n/index.ts | 7 +- src/components/Errors/403/AccessDenied.tsx | 4 +- .../Errors/ResponseError/ResponseError.tsx | 1 - src/components/Errors/i18n/index.ts | 7 +- .../FormattedBytes/FormattedBytes.tsx | 3 +- src/components/FormattedBytes/utils.tsx | 1 + .../FullNodeViewer/FullNodeViewer.tsx | 9 +- src/components/Fullscreen/Fullscreen.scss | 5 +- src/components/Fullscreen/Fullscreen.tsx | 10 +- src/components/GroupInfo/GroupInfo.tsx | 4 +- src/components/Illustration/Illustration.tsx | 12 +- src/components/InfoViewer/InfoViewer.tsx | 15 +- .../InfoViewer/formatters/cdcStream.ts | 4 +- .../InfoViewer/formatters/common.ts | 4 +- .../InfoViewer/formatters/pqGroup.ts | 9 +- .../InfoViewer/formatters/schema.ts | 1 - src/components/InfoViewer/formatters/table.ts | 1 - src/components/InfoViewer/i18n/index.ts | 7 +- .../InfoViewer/schemaInfo/TableIndexInfo.tsx | 6 +- .../schemaOverview/CDCStreamOverview.tsx | 13 +- .../schemaOverview/PersQueueGroupOverview.tsx | 14 +- src/components/InfoViewer/utils.ts | 10 +- .../InfoViewerSkeleton/InfoViewerSkeleton.tsx | 6 +- src/components/InternalLink/InternalLink.tsx | 8 +- .../LabelWithPopover/LabelWithPopover.tsx | 6 +- .../LagPopoverContent/LagPopoverContent.tsx | 5 +- .../LinkToSchemaObject/LinkToSchemaObject.tsx | 8 +- src/components/LinkWithIcon/LinkWithIcon.tsx | 13 +- src/components/Loader/Loader.tsx | 6 +- src/components/MetricChart/MetricChart.tsx | 43 +- .../{convertReponse.ts => convertResponse.ts} | 1 + src/components/MetricChart/getChartData.ts | 4 +- .../MonitoringButton/MonitoringButton.tsx | 4 +- .../NodeHostWrapper/NodeHostWrapper.tsx | 12 +- src/components/PDiskInfo/PDiskInfo.scss | 1 - src/components/PDiskInfo/PDiskInfo.tsx | 17 +- src/components/PDiskPopup/PDiskPopup.tsx | 19 +- src/components/PageMeta/PageMeta.tsx | 2 + src/components/PoolBar/PoolBar.tsx | 6 +- src/components/PoolUsage/PoolUsage.tsx | 5 +- src/components/PoolsGraph/PoolsGraph.tsx | 6 +- .../ProblemFilter/ProblemFilter.tsx | 2 +- .../ProgressViewer/ProgressViewer.tsx | 4 +- .../QueryExecutionStatus.scss | 3 +- .../QueryExecutionStatus.tsx | 8 +- src/components/QueryResultTable/Cell/Cell.tsx | 7 +- .../QueryResultTable/QueryResultTable.tsx | 12 +- src/components/QueryResultTable/i18n/index.ts | 7 +- src/components/Search/Search.tsx | 11 +- src/components/ShortyString/ShortyString.tsx | 8 +- src/components/ShortyString/i18n/index.ts | 7 +- .../SpeedMultiMeter/SpeedMultiMeter.tsx | 22 +- src/components/SpeedMultiMeter/i18n/index.ts | 7 +- src/components/SplitPane/SplitPane.scss | 5 +- src/components/SplitPane/SplitPane.tsx | 14 +- src/components/Stack/Stack.scss | 10 +- src/components/Stack/Stack.tsx | 6 +- src/components/StatusIcon/StatusIcon.tsx | 5 +- .../TableSkeleton/TableSkeleton.tsx | 8 +- .../TableWithControlsLayout.tsx | 8 +- src/components/Tablet/Tablet.tsx | 8 +- src/components/TabletIcon/TabletIcon.tsx | 2 +- .../TabletsOverall/TabletsOverall.scss | 3 +- .../TabletsOverall/TabletsOverall.tsx | 26 +- .../TabletsStatistic/TabletsStatistic.tsx | 9 +- src/components/Tag/Tag.tsx | 2 +- src/components/Tags/Tags.tsx | 6 +- .../TimeFrameSelector/TimeFrameSelector.scss | 1 - .../TimeFrameSelector/TimeFrameSelector.tsx | 3 +- .../NodeEndpointsTooltipContent.tsx | 9 +- .../PoolTooltipContent/PoolTooltipContent.tsx | 1 - .../TabletTooltipContent.tsx | 1 - .../TruncatedQuery/TruncatedQuery.tsx | 9 +- src/components/UptimeFIlter/UptimeFilter.tsx | 2 +- src/components/UsageLabel/UsageLabel.tsx | 5 +- src/components/VDisk/VDisk.tsx | 19 +- src/components/VDisk/VDiskWithDonorsStack.tsx | 4 +- src/components/VDiskInfo/VDiskInfo.scss | 1 - src/components/VDiskInfo/VDiskInfo.tsx | 14 +- src/components/VDiskPopup/VDiskPopup.tsx | 23 +- src/components/VirtualTable/TableChunk.tsx | 10 +- src/components/VirtualTable/TableHead.tsx | 20 +- src/components/VirtualTable/TableRow.tsx | 8 +- src/components/VirtualTable/VirtualTable.tsx | 72 +- src/components/VirtualTable/i18n/index.ts | 7 +- src/components/VirtualTable/reducer.ts | 4 +- src/components/VirtualTable/shared.ts | 2 +- src/components/VirtualTable/types.ts | 14 +- .../VirtualTable/useIntersectionObserver.ts | 8 +- src/components/slots/SlotMap.ts | 2 +- src/components/slots/types.ts | 6 +- src/components/slots/utils.ts | 2 +- src/containers/App/App.tsx | 20 +- src/containers/App/Content.tsx | 53 +- src/containers/App/Providers.tsx | 14 +- src/containers/App/appSlots.tsx | 8 +- src/containers/App/i18n/index.ts | 7 +- .../AppWithClusters/AppWithClusters.tsx | 16 +- .../ExtendedCluster/ExtendedCluster.tsx | 18 +- .../ExtendedNode/ExtendedNode.tsx | 3 +- .../ExtendedTenant/ExtendedTenant.tsx | 6 +- src/containers/AppWithClusters/i18n/index.ts | 7 +- .../AppWithClusters/useClusterData.ts | 7 +- .../AsideNavigation/AsideNavigation.tsx | 26 +- src/containers/AsideNavigation/Navigation.tsx | 7 +- .../YdbInternalUser/YdbInternalUser.tsx | 8 +- src/containers/AsideNavigation/i18n/index.ts | 7 +- .../AsideNavigation/useNavigationMenuItems.ts | 16 +- .../Authentication/Authentication.scss | 2 +- .../Authentication/Authentication.tsx | 32 +- src/containers/Cluster/Cluster.tsx | 54 +- .../Cluster/ClusterInfo/ClusterInfo.scss | 1 - .../Cluster/ClusterInfo/ClusterInfo.tsx | 36 +- src/containers/Cluster/ClusterInfo/utils.ts | 3 +- .../Cluster/VersionsBar/VersionsBar.tsx | 5 +- src/containers/Cluster/i18n/index.ts | 7 +- src/containers/Cluster/utils.tsx | 2 +- .../ClusterModeGuard/ClusterModeGuard.tsx | 7 +- src/containers/Clusters/Clusters.tsx | 41 +- .../Clusters/ClustersStatistics.tsx | 5 +- src/containers/Clusters/columns.tsx | 24 +- src/containers/Clusters/shared.ts | 2 +- src/containers/Clusters/useClustersList.ts | 3 +- src/containers/Clusters/useSelectedColumns.ts | 8 +- src/containers/Header/Header.tsx | 20 +- src/containers/Header/breadcrumbs.tsx | 10 +- src/containers/Heatmap/Heatmap.tsx | 23 +- .../Heatmap/HeatmapCanvas/HeatmapCanvas.js | 19 +- src/containers/Heatmap/Histogram/Histogram.js | 9 +- src/containers/Node/Node.tsx | 33 +- src/containers/Node/NodePages.ts | 3 +- .../Node/NodeStructure/NodeStructure.tsx | 23 +- .../Node/NodeStructure/PDiskTitleBadge.tsx | 5 +- src/containers/Node/NodeStructure/Pdisk.tsx | 32 +- src/containers/Node/NodeStructure/Vdisk.tsx | 8 +- src/containers/Nodes/Nodes.tsx | 60 +- src/containers/Nodes/NodesWrapper.tsx | 2 +- src/containers/Nodes/VirtualNodes.tsx | 59 +- src/containers/Nodes/getNodesColumns.tsx | 19 +- src/containers/Nodes/i18n/index.ts | 7 +- src/containers/PDiskPage/PDiskGroups.tsx | 15 +- src/containers/PDiskPage/PDiskPage.scss | 3 +- src/containers/PDiskPage/PDiskPage.tsx | 33 +- src/containers/ReduxTooltip/ReduxTooltip.js | 7 +- .../Storage/EmptyFilter/i18n/index.ts | 7 +- src/containers/Storage/PDisk/PDisk.tsx | 18 +- src/containers/Storage/Storage.tsx | 67 +- .../StorageControls/StorageControls.tsx | 15 +- .../Storage/StorageGroups/StorageGroups.tsx | 16 +- .../StorageGroupsEmptyDataMessage.tsx | 3 +- .../StorageGroups/VirtualStorageGroups.tsx | 22 +- .../StorageGroups/getStorageGroupsColumns.tsx | 31 +- .../Storage/StorageGroups/i18n/index.ts | 7 +- .../Storage/StorageNodes/StorageNodes.tsx | 14 +- .../StorageNodesEmptyDataMessage.tsx | 3 +- .../StorageNodes/VirtualStorageNodes.tsx | 31 +- .../StorageNodes/getStorageNodesColumns.tsx | 13 +- .../Storage/StorageNodes/i18n/index.ts | 7 +- src/containers/Storage/StorageNodes/shared.ts | 3 +- .../StorageTypeFilter/StorageTypeFilter.tsx | 2 +- .../StorageVisibleEntitiesFilter.tsx | 2 +- src/containers/Storage/StorageWrapper.tsx | 2 +- .../Storage/UsageFilter/UsageFilter.tsx | 17 +- .../Storage/UsageFilter/i18n/index.ts | 7 +- src/containers/Storage/VirtualStorage.tsx | 22 +- src/containers/Storage/i18n/index.ts | 7 +- src/containers/Storage/shared.ts | 2 +- src/containers/Tablet/Tablet.tsx | 46 +- .../Tablet/TabletControls/TabletControls.tsx | 14 +- .../Tablet/TabletInfo/TabletInfo.tsx | 10 +- .../Tablet/TabletTable/TabletTable.tsx | 5 +- src/containers/Tablets/Tablets.scss | 3 +- src/containers/Tablets/Tablets.tsx | 30 +- src/containers/Tablets/i18n/index.ts | 7 +- .../TabletsFilters/TabletsFilters.js | 34 +- src/containers/Tenant/Acl/Acl.tsx | 20 +- .../Diagnostics/Consumers/Consumers.tsx | 31 +- .../Diagnostics/Consumers/Headers/Headers.tsx | 9 +- .../TopicStats/ConsumersTopicStats.tsx | 7 +- .../Diagnostics/Consumers/columns/columns.tsx | 20 +- .../Diagnostics/Consumers/i18n/index.ts | 7 +- .../Tenant/Diagnostics/Describe/Describe.tsx | 25 +- .../DetailedOverview/DetailedOverview.scss | 2 +- .../DetailedOverview/DetailedOverview.tsx | 4 +- .../Tenant/Diagnostics/Diagnostics.tsx | 47 +- .../Tenant/Diagnostics/DiagnosticsPages.ts | 2 +- .../Tenant/Diagnostics/HotKeys/HotKeys.scss | 3 +- .../Tenant/Diagnostics/HotKeys/HotKeys.tsx | 27 +- .../Tenant/Diagnostics/HotKeys/i18n/index.ts | 6 +- .../Tenant/Diagnostics/Network/Network.js | 15 +- .../Network/NodeNetwork/NodeNetwork.js | 3 +- .../ChangefeedInfo/ChangefeedInfo.tsx | 10 +- .../Tenant/Diagnostics/Overview/Overview.tsx | 32 +- .../Overview/TableInfo/TableInfo.tsx | 14 +- .../Overview/TableInfo/i18n/index.ts | 7 +- .../Overview/TableInfo/prepareTableInfo.ts | 20 +- .../Overview/TopicInfo/TopicInfo.tsx | 9 +- .../Overview/TopicStats/TopicStats.tsx | 21 +- .../Overview/TopicStats/i18n/index.ts | 7 +- .../Overview/utils/prepareTopicSchemaInfo.ts | 19 +- .../Partitions/Headers/Headers.tsx | 9 +- .../Diagnostics/Partitions/Partitions.tsx | 59 +- .../PartitionsControls/PartitionsControls.tsx | 40 +- .../Partitions/columns/columns.tsx | 31 +- .../Diagnostics/Partitions/i18n/index.ts | 7 +- .../Diagnostics/Partitions/utils/index.ts | 1 + .../utils/useGetPartitionsColumns.ts | 11 +- .../DefaultOverviewContent.tsx | 1 + .../Healthcheck/Healthcheck.scss | 9 +- .../Healthcheck/HealthcheckDetails.tsx | 13 +- .../Healthcheck/HealthcheckPreview.tsx | 18 +- .../Healthcheck/IssuesViewer/IssueTree.tsx | 54 +- .../IssueTreeItem/IssueTreeItem.tsx | 5 +- .../TenantOverview/Healthcheck/i18n/index.ts | 7 +- .../MetricsCards/MetricCard/MetricCard.tsx | 6 +- .../MetricsCards/MetricsCards.tsx | 18 +- .../TenantOverview/TenantCpu/TenantCpu.tsx | 13 +- .../TenantCpu/TopNodesByCpu.tsx | 22 +- .../TenantCpu/TopNodesByLoad.tsx | 22 +- .../TenantOverview/TenantCpu/TopQueries.tsx | 13 +- .../TenantOverview/TenantCpu/TopShards.tsx | 9 +- .../TenantDashboard/TenantDashboard.tsx | 21 +- .../TenantMemory/TenantMemory.tsx | 9 +- .../TenantMemory/TopNodesByMemory.tsx | 22 +- .../TenantOverview/TenantOverview.scss | 5 +- .../TenantOverview/TenantOverview.tsx | 24 +- .../TenantOverviewTableLayout.tsx | 15 +- .../TenantStorage/TenantStorage.tsx | 21 +- .../TenantStorage/TopGroups.tsx | 18 +- .../TenantStorage/TopTables.tsx | 11 +- .../TenantOverview/getSectionTitle.tsx | 6 +- .../Diagnostics/TenantOverview/i18n/index.ts | 6 +- .../TenantOverview/useHealthcheck.ts | 9 +- .../Diagnostics/TopQueries/TopQueries.tsx | 45 +- .../TopQueries/getTopQueriesColumns.tsx | 14 +- .../Diagnostics/TopQueries/i18n/index.ts | 7 +- .../Diagnostics/TopShards/Filters/Filters.tsx | 14 +- .../Diagnostics/TopShards/TopShards.tsx | 35 +- .../TopShards/getTopShardsColumns.tsx | 14 +- .../Diagnostics/TopShards/i18n/index.ts | 7 +- .../ExternalDataSource/ExternalDataSource.tsx | 18 +- .../Info/ExternalTable/ExternalTable.tsx | 20 +- src/containers/Tenant/Info/i18n/index.ts | 7 +- .../Tenant/ObjectGeneral/ObjectGeneral.tsx | 16 +- .../Tenant/ObjectSummary/ObjectSummary.tsx | 21 +- .../Query/ExecuteResult/ExecuteResult.tsx | 17 +- .../Query/ExplainResult/ExplainResult.js | 60 +- .../Tenant/Query/ExplainResult/utils.ts | 41 + src/containers/Tenant/Query/Issues/Issues.tsx | 20 +- src/containers/Tenant/Query/Issues/models.ts | 2 +- .../Tenant/Query/Preview/Preview.tsx | 25 +- .../Query/QueriesHistory/QueriesHistory.tsx | 13 +- src/containers/Tenant/Query/Query.tsx | 15 +- .../Query/QueryDuration/QueryDuration.tsx | 8 +- .../Tenant/Query/QueryEditor/QueryEditor.tsx | 74 +- .../Tenant/Query/QueryEditor/helpers.ts | 6 +- .../QueryEditorControls.scss | 3 +- .../QueryEditorControls.tsx | 17 +- .../Tenant/Query/QueryTabs/QueryTabs.tsx | 9 +- .../Tenant/Query/SaveQuery/SaveQuery.js | 13 +- .../Query/SavedQueries/SavedQueries.tsx | 32 +- .../Tenant/Schema/SchemaTree/SchemaTree.tsx | 7 +- .../Schema/SchemaViewer/SchemaViewer.tsx | 13 +- src/containers/Tenant/Tenant.tsx | 50 +- src/containers/Tenant/utils/index.ts | 3 +- .../utils/paneVisibilityToggleHelpers.tsx | 3 +- src/containers/Tenant/utils/schemaActions.ts | 11 +- .../Tenant/utils/schemaControls.tsx | 13 +- src/containers/Tenants/Tenants.tsx | 40 +- src/containers/UserSettings/Setting.tsx | 11 +- src/containers/UserSettings/UserSettings.tsx | 7 +- src/containers/UserSettings/settings.tsx | 11 +- src/containers/VDiskPage/VDiskPage.scss | 5 +- src/containers/VDiskPage/VDiskPage.tsx | 44 +- .../GroupedNodesTree/GroupedNodesTree.scss | 3 +- .../GroupedNodesTree/GroupedNodesTree.tsx | 13 +- .../Versions/NodesTable/NodesTable.tsx | 12 +- .../NodesTreeTitle/NodesTreeTitle.tsx | 6 +- src/containers/Versions/Versions.tsx | 28 +- src/containers/Versions/groupNodes.ts | 5 +- src/containers/Versions/types.ts | 2 +- src/index.tsx | 14 +- src/routes.ts | 4 +- src/services/api.ts | 44 +- src/services/parsers/parseMetaCluster.ts | 1 - src/services/parsers/parseMetaTenants.ts | 3 +- src/services/settings.ts | 7 +- src/setupTests.js | 7 +- src/store/configureStore.ts | 12 +- .../reducers/authentication/authentication.ts | 2 +- src/store/reducers/authentication/types.ts | 2 +- src/store/reducers/cluster/cluster.ts | 6 +- .../reducers/clusterNodes/clusterNodes.tsx | 5 +- src/store/reducers/clusterNodes/types.ts | 2 +- src/store/reducers/clusters/clusters.ts | 2 +- src/store/reducers/clusters/selectors.ts | 5 +- src/store/reducers/clusters/types.ts | 6 +- src/store/reducers/describe.ts | 6 +- src/store/reducers/executeQuery.ts | 9 +- .../executeTopQueries/executeTopQueries.ts | 7 +- src/store/reducers/executeTopQueries/types.ts | 9 +- src/store/reducers/executeTopQueries/utils.ts | 2 +- src/store/reducers/explainQuery.ts | 10 +- src/store/reducers/header/types.ts | 18 +- .../healthcheckInfo/healthcheckInfo.ts | 6 +- src/store/reducers/healthcheckInfo/types.ts | 3 +- src/store/reducers/heatmap.ts | 3 +- src/store/reducers/host.ts | 3 +- src/store/reducers/hotKeys/hotKeys.ts | 4 +- src/store/reducers/hotKeys/types.ts | 1 + src/store/reducers/index.ts | 66 +- src/store/reducers/network/network.ts | 2 +- src/store/reducers/network/types.ts | 2 +- src/store/reducers/node/node.ts | 2 +- src/store/reducers/node/types.ts | 2 +- src/store/reducers/node/utils.ts | 1 + src/store/reducers/nodes/nodes.ts | 7 +- src/store/reducers/nodes/selectors.ts | 11 +- src/store/reducers/nodes/types.ts | 10 +- src/store/reducers/nodesList.ts | 4 +- src/store/reducers/olapStats.ts | 4 +- src/store/reducers/overview/overview.ts | 4 +- src/store/reducers/overview/types.ts | 6 +- src/store/reducers/partitions/partitions.ts | 2 +- src/store/reducers/partitions/types.ts | 2 +- src/store/reducers/partitions/utils.ts | 4 +- src/store/reducers/pdisk/pdisk.ts | 3 +- src/store/reducers/pdisk/types.ts | 1 + src/store/reducers/preview.ts | 4 +- src/store/reducers/schema/schema.ts | 11 +- src/store/reducers/schema/types.ts | 6 +- src/store/reducers/schemaAcl/schemaAcl.ts | 2 +- src/store/reducers/schemaAcl/types.ts | 2 +- src/store/reducers/settings/settings.ts | 8 +- src/store/reducers/settings/types.ts | 10 +- .../reducers/shardsWorkload/shardsWorkload.ts | 3 +- src/store/reducers/shardsWorkload/types.ts | 5 +- src/store/reducers/storage/selectors.ts | 14 +- src/store/reducers/storage/storage.ts | 7 +- src/store/reducers/storage/types.ts | 6 +- src/store/reducers/storage/utils.ts | 9 +- src/store/reducers/tablet.ts | 3 +- src/store/reducers/tablets.ts | 5 +- src/store/reducers/tabletsFilters.js | 3 +- src/store/reducers/tenant/tenant.ts | 4 +- src/store/reducers/tenant/types.ts | 12 +- .../executeTopTables/executeTopTables.ts | 1 + .../tenantOverview/executeTopTables/types.ts | 3 +- .../topNodesByCpu/topNodesByCpu.ts | 3 +- .../tenantOverview/topNodesByCpu/types.ts | 3 +- .../topNodesByLoad/topNodesByLoad.ts | 3 +- .../tenantOverview/topNodesByLoad/types.ts | 3 +- .../topNodesByMemory/topNodesByMemory.ts | 5 +- .../tenantOverview/topNodesByMemory/types.ts | 3 +- .../topQueries/tenantOverviewTopQueries.ts | 2 +- .../tenantOverview/topQueries/types.ts | 6 +- .../topShards/tenantOverviewTopShards.ts | 5 +- .../tenantOverview/topShards/types.ts | 6 +- .../topStorageGroups/topStorageGroups.ts | 3 +- .../tenantOverview/topStorageGroups/types.ts | 3 +- .../tenantOverview/topStorageGroups/utils.ts | 3 +- src/store/reducers/tenants/selectors.ts | 8 +- src/store/reducers/tenants/tenants.ts | 2 +- src/store/reducers/tenants/types.ts | 10 +- src/store/reducers/tenants/utils.ts | 1 + src/store/reducers/tooltip.ts | 4 +- src/store/reducers/topic.ts | 5 +- src/store/reducers/vdisk/types.ts | 1 + src/store/reducers/vdisk/utils.ts | 1 + src/store/reducers/vdisk/vdisk.ts | 3 +- src/store/state-url-mapping.ts | 18 +- src/store/utils.ts | 3 +- src/styles/mixins.scss | 6 + src/types/additionalProps.ts | 7 +- src/types/api/compute.ts | 6 +- src/types/api/consumer.ts | 2 +- src/types/api/nodes.ts | 8 +- src/types/api/pdisk.ts | 2 +- src/types/api/query.ts | 8 +- src/types/api/schema/table.ts | 2 +- src/types/api/storage.ts | 4 +- src/types/api/systemState.ts | 2 +- src/types/api/tablet.ts | 2 +- src/types/api/tenant.ts | 6 +- src/types/api/topic.ts | 10 +- src/types/api/vdisk.ts | 4 +- src/types/assets.d.ts | 5 +- src/types/bem-cn-lite.d.ts | 26 - src/types/redux-location-state.d.ts | 8 +- src/types/store/describe.ts | 8 +- src/types/store/executeQuery.ts | 7 +- src/types/store/explainQuery.ts | 3 +- src/types/store/heatmap.ts | 5 +- src/types/store/host.ts | 3 +- src/types/store/nodesList.ts | 3 +- src/types/store/olapStats.ts | 3 +- src/types/store/query.ts | 7 +- src/types/store/tablet.ts | 7 +- src/types/store/tablets.ts | 9 +- src/types/store/tooltip.ts | 4 +- src/types/store/topic.ts | 2 +- src/types/window.d.ts | 3 +- src/utils/__test__/parseBalancer.test.ts | 6 +- src/utils/__test__/prepareBackend.test.ts | 2 +- src/utils/additionalProps.ts | 2 +- .../bytesParsers/convertBytesObjectToSpeed.ts | 1 - src/utils/bytesParsers/formatBytes.ts | 2 +- src/utils/bytesParsers/i18n/index.ts | 7 +- src/utils/clusterVersionColors.ts | 1 + src/utils/cn.ts | 7 +- src/utils/createToast.tsx | 6 +- src/utils/dataFormatters/dataFormatters.ts | 8 +- src/utils/dataFormatters/i18n/index.ts | 7 +- src/utils/diagnostics.ts | 2 +- src/utils/disks/calculatePDiskSeverity.ts | 1 + src/utils/disks/calculateVDiskSeverity.ts | 3 +- src/utils/disks/helpers.ts | 1 + src/utils/disks/prepareDisks.ts | 1 + src/utils/disks/types.ts | 1 + src/utils/filters.ts | 3 +- src/utils/hooks/useAutofetcher.ts | 10 +- src/utils/hooks/useNodesRequestParams.ts | 9 +- src/utils/hooks/useQueryModes.ts | 1 + src/utils/hooks/useSetting.ts | 6 +- src/utils/hooks/useStorageRequestParams.ts | 5 +- src/utils/hooks/useTableResize.ts | 27 +- src/utils/hooks/useTableSort.ts | 6 +- src/utils/hooks/useTypedDispatch.ts | 1 + src/utils/hooks/useTypedSelector.ts | 3 +- src/utils/i18n/i18n.ts | 11 +- src/utils/lazyComponent.tsx | 5 +- .../monaco/s-expression/registerLanguage.ts | 1 + .../yqlSuggestions/generateSuggestions.ts | 4 +- .../registerCompletionItemProvider.ts | 1 + .../monaco/yqlSuggestions/yqlSuggestions.ts | 12 +- src/utils/nodes.ts | 12 +- src/utils/prepareQueryExplain.ts | 6 +- src/utils/query.test.ts | 1 + src/utils/tests/providers.tsx | 7 +- src/utils/timeParsers/i18n/index.ts | 7 +- src/utils/timeParsers/parsers.ts | 2 +- src/utils/timeParsers/protobufParsers.ts | 1 - src/utils/tooltip.js | 5 +- src/utils/utils.js | 2 +- .../versions/parseNodesToVersionsValues.ts | 1 + tests/models/BaseModel.ts | 2 +- tests/models/PageModel.ts | 2 +- .../internalViewer/internalViewer.test.ts | 2 +- tests/suites/nodes/NodesPage.ts | 4 +- tests/suites/nodes/nodes.test.ts | 2 +- tests/suites/storage/StoragePage.ts | 4 +- tests/suites/storage/storage.test.ts | 2 +- tests/suites/tenant/TenantPage.ts | 6 +- .../suites/tenant/queryEditor/QueryEditor.ts | 4 +- .../tenant/queryEditor/queryEditor.test.ts | 4 +- tests/suites/tenants/TenantsPage.ts | 4 +- tests/suites/tenants/tenants.test.ts | 2 +- tests/utils/selectContentTable.ts | 2 +- tsconfig.json | 3 +- tsconfig.package.json | 1 + 489 files changed, 7278 insertions(+), 5920 deletions(-) rename src/components/MetricChart/{convertReponse.ts => convertResponse.ts} (99%) delete mode 100644 src/types/bem-cn-lite.d.ts diff --git a/.eslintrc b/.eslintrc index af03540019..5f81ea8606 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,12 +1,26 @@ { - "extends": ["@gravity-ui/eslint-config", "@gravity-ui/eslint-config/prettier"], + "extends": [ + "@gravity-ui/eslint-config", + "@gravity-ui/eslint-config/import-order", + "@gravity-ui/eslint-config/prettier", + ], "root": true, "overrides": [ { "files": ["config-overrides.js", "commitlint.config.js"], "env": { - "node": true - } - } - ] + "node": true, + }, + }, + ], + "parserOptions": { + "project": "./tsconfig.json", + }, + "rules": { + "import/consistent-type-specifier-style": ["error", "prefer-top-level"], + "@typescript-eslint/consistent-type-imports": [ + "error", + {"prefer": "type-imports", "fixStyle": "separate-type-imports"}, + ], + }, } diff --git a/.husky/commit-msg b/.husky/commit-msg index 8796e175e7..a78cc751d8 100755 --- a/.husky/commit-msg +++ b/.husky/commit-msg @@ -1,4 +1 @@ -#!/bin/sh -. "$(dirname "$0")/_/husky.sh" - -npx commitlint --edit $1 \ No newline at end of file +npx commitlint --edit $1 diff --git a/.husky/pre-commit b/.husky/pre-commit index c37466e2b3..2312dc587f 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,4 +1 @@ -#!/bin/sh -. "$(dirname "$0")/_/husky.sh" - -npx lint-staged \ No newline at end of file +npx lint-staged diff --git a/.stylelintrc b/.stylelintrc index 4fd50f6803..7e9b288436 100644 --- a/.stylelintrc +++ b/.stylelintrc @@ -5,7 +5,6 @@ "@gravity-ui/stylelint-config/prettier" ], "rules": { - "declaration-colon-space-after": "always-single-line", "declaration-no-important": null } } diff --git a/package-lock.json b/package-lock.json index 47dde1c6bc..b14ca74c1c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,88 +8,88 @@ "name": "ydb-embedded-ui", "version": "5.5.0", "dependencies": { + "@bem-react/classname": "^1.6.0", "@gravity-ui/axios-wrapper": "^1.4.1", - "@gravity-ui/chartkit": "^4.23.0", - "@gravity-ui/components": "^2.12.0", - "@gravity-ui/date-utils": "^1.4.2", - "@gravity-ui/i18n": "^1.2.0", - "@gravity-ui/icons": "^2.8.1", - "@gravity-ui/navigation": "^1.9.0", - "@gravity-ui/paranoid": "^1.4.0", - "@gravity-ui/react-data-table": "^1.2.0", - "@gravity-ui/uikit": "^5.30.1", + "@gravity-ui/chartkit": "^5.2.2", + "@gravity-ui/components": "^3.4.1", + "@gravity-ui/date-utils": "^2.1.0", + "@gravity-ui/i18n": "^1.4.0", + "@gravity-ui/icons": "^2.9.1", + "@gravity-ui/navigation": "^2.5.0", + "@gravity-ui/paranoid": "^1.4.1", + "@gravity-ui/react-data-table": "^2.0.1", + "@gravity-ui/uikit": "^6.8.0", "@gravity-ui/websql-autocomplete": "^8.0.2", - "@reduxjs/toolkit": "^2.2.1", - "axios": "^1.6.7", - "bem-cn-lite": "^4.1.0", + "@reduxjs/toolkit": "^2.2.3", + "axios": "^1.6.8", "colord": "^2.9.3", "copy-to-clipboard": "^3.3.3", "crc-32": "^1.2.2", "history": "^4.10.1", - "lodash": "^4.17.11", - "monaco-editor": "^0.31.1", + "lodash": "^4.17.21", + "monaco-editor": "^0.44.0", "numeral": "^2.0.6", "path-to-regexp": "^3.0.0", - "qs": "^6.11.0", - "react-error-boundary": "^4.0.12", + "qs": "^6.12.0", + "react-error-boundary": "^4.0.13", "react-helmet-async": "2.0.4", "react-json-inspector": "^7.1.1", - "react-list": "^0.8.11", - "react-monaco-editor": "^0.47.0", - "react-redux": "^7.2.6", - "react-router": "^5.2.1", - "react-router-dom": "^5.3.0", + "react-list": "^0.8.17", + "react-monaco-editor": "^0.55.0", + "react-redux": "^9.1.0", + "react-router": "^5.3.4", + "react-router-dom": "^5.3.4", "react-split": "^2.0.14", "redux": "^5.0.1", "redux-location-state": "^2.8.2", "tslib": "^2.6.2", - "url": "^0.11.0", + "url": "^0.11.3", "use-query-params": "^2.2.1", "web-vitals": "^1.1.2", - "ydb-ui-components": "^3.6.0" + "ydb-ui-components": "^4.0.0" }, "devDependencies": { - "@commitlint/cli": "^15.0.0", - "@commitlint/config-conventional": "^15.0.0", - "@gravity-ui/eslint-config": "^1.0.2", - "@gravity-ui/prettier-config": "^1.0.1", - "@gravity-ui/stylelint-config": "^1.0.1", + "@commitlint/cli": "^19.2.1", + "@commitlint/config-conventional": "^19.1.0", + "@gravity-ui/eslint-config": "^3.1.1", + "@gravity-ui/prettier-config": "^1.1.0", + "@gravity-ui/stylelint-config": "^4.0.1", "@gravity-ui/tsconfig": "^1.0.0", - "@playwright/test": "^1.31.1", - "@testing-library/jest-dom": "^5.15.0", - "@testing-library/react": "^11.2.7", - "@testing-library/user-event": "^12.8.3", - "@types/lodash": "^4.14.178", - "@types/numeral": "^2.0.2", - "@types/qs": "^6.9.7", - "@types/react": "^17.0.58", - "@types/react-dom": "^17.0.11", - "@types/react-router": "^5.1.17", - "@types/react-router-dom": "^5.3.2", + "@playwright/test": "^1.42.1", + "@testing-library/jest-dom": "^6.4.2", + "@testing-library/react": "^14.2.2", + "@testing-library/user-event": "^14.5.2", + "@types/jest": "^29.5.12", + "@types/lodash": "^4.17.0", + "@types/numeral": "^2.0.5", + "@types/qs": "^6.9.14", + "@types/react": "^18.2.73", + "@types/react-dom": "^18.2.23", + "@types/react-router": "^5.1.20", + "@types/react-router-dom": "^5.3.3", "copyfiles": "^2.4.1", - "eslint-config-prettier": "^8.3.0", "http-proxy-middleware": "^2.0.6", - "husky": "^7.0.4", - "jest-transform-css": "^4.0.1", - "lint-staged": "^12.3.7", + "husky": "^9.0.11", + "jest-transform-css": "^6.0.1", + "lint-staged": "^15.2.2", "npm-run-all": "^4.1.5", - "postcss": "^8.4.6", - "prettier": "^2.5.1", + "postcss": "^8.4.38", + "prettier": "^3.2.5", "prop-types": "^15.8.1", - "react": "^17.0.2", - "react-app-rewired": "^2.1.11", - "react-dom": "^17.0.2", + "react": "^18.2.0", + "react-app-rewired": "^2.2.1", + "react-dom": "^18.2.0", "react-scripts": "^5.0.1", - "sass": "^1.32.8", + "sass": "^1.72.0", "source-map-explorer": "^2.5.3", - "stylelint": "^14.3.0", - "ts-jest": "^28.0.7", - "typescript": "^4.5.5" + "stylelint": "^15.0.0", + "ts-jest": "^29.1.2", + "typescript": "^5.4.3" }, "peerDependencies": { "prop-types": "^15.8.1", - "react": "^17.0.2", - "react-dom": "^17.0.2" + "react": "^18.2.0", + "react-dom": "^18.2.0" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -101,6 +101,25 @@ "node": ">=0.10.0" } }, + "node_modules/@adobe/css-tools": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.3.tgz", + "integrity": "sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==", + "dev": true + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@apideck/better-ajv-errors": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", @@ -119,80 +138,18 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", + "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", "dev": true, "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" + "@babel/highlight": "^7.24.2", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/code-frame/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/code-frame/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/code-frame/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/compat-data": { "version": "7.23.5", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", @@ -203,26 +160,26 @@ } }, "node_modules/@babel/core": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.0.tgz", - "integrity": "sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.16.0", - "@babel/generator": "^7.16.0", - "@babel/helper-compilation-targets": "^7.16.0", - "@babel/helper-module-transforms": "^7.16.0", - "@babel/helpers": "^7.16.0", - "@babel/parser": "^7.16.0", - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.0", - "@babel/types": "^7.16.0", - "convert-source-map": "^1.7.0", + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.3.tgz", + "integrity": "sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.1", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.24.1", + "@babel/parser": "^7.24.1", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.1", + "@babel/types": "^7.24.0", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -232,6 +189,12 @@ "url": "https://opencollective.com/babel" } }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -241,30 +204,21 @@ "semver": "bin/semver.js" } }, - "node_modules/@babel/core/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/@babel/eslint-parser": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.16.3.tgz", - "integrity": "sha512-iB4ElZT0jAt7PKVaeVulOECdGe6UnmA/O0P9jlF5g5GBOwDVbna8AXhHRu4s27xQf6OkveyA8iTDv1jHdDejgQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.24.1.tgz", + "integrity": "sha512-d5guuzMlPeDfZIbpQ8+g1NaCNuAGBBGNECh0HVqz1sjOeVLh2CEaifuOysCH18URW6R7pqXINvf5PaR/dC6jLQ==", "dev": true, "dependencies": { - "eslint-scope": "^5.1.1", + "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", "eslint-visitor-keys": "^2.1.0", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "engines": { "node": "^10.13.0 || ^12.13.0 || >=14.0.0" }, "peerDependencies": { - "@babel/core": ">=7.11.0", + "@babel/core": "^7.11.0", "eslint": "^7.5.0 || ^8.0.0" } }, @@ -278,14 +232,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.1.tgz", + "integrity": "sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==", "dev": true, "dependencies": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", + "@babel/types": "^7.24.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" }, "engines": { @@ -293,12 +247,12 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -523,9 +477,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", + "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", "dev": true, "engines": { "node": ">=6.9.0" @@ -645,28 +599,29 @@ } }, "node_modules/@babel/helpers": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz", - "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.1.tgz", + "integrity": "sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==", "dev": true, "dependencies": { - "@babel/template": "^7.23.9", - "@babel/traverse": "^7.23.9", - "@babel/types": "^7.23.9" + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.1", + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", + "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" @@ -735,9 +690,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", - "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.1.tgz", + "integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -1206,12 +1161,12 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", - "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz", + "integrity": "sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1738,12 +1693,12 @@ } }, "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.23.3.tgz", - "integrity": "sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.1.tgz", + "integrity": "sha512-mvoQg2f9p2qlpDQRBC7M3c3XTr0k7cp/0+kFKKO/7Gtu0LSw16eKB+Fabe2bDT/UpsyasTBBkAnbdsLrkD5XMw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1753,16 +1708,16 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.20.13.tgz", - "integrity": "sha512-MmTZx/bkUrfJhhYAYt3Urjm+h8DQGrPrnKQ94jLo7NLuOU+T89a7IByhKmrb8SKhrIYIQ0FN0CHMbnFRen4qNw==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz", + "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-jsx": "^7.18.6", - "@babel/types": "^7.20.7" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.23.3", + "@babel/types": "^7.23.4" }, "engines": { "node": ">=6.9.0" @@ -1772,12 +1727,12 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", - "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", + "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", "dev": true, "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.18.6" + "@babel/plugin-transform-react-jsx": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1787,13 +1742,13 @@ } }, "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz", - "integrity": "sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.1.tgz", + "integrity": "sha512-+pWEAaDJvSm9aFvJNpLiM2+ktl2Sn2U5DdyiWdZBxmLc6+xGt88dvFqsHiAiDS+8WqUwbDfkKz9jRxK3M0k+kA==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2101,17 +2056,17 @@ } }, "node_modules/@babel/preset-react": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.16.0.tgz", - "integrity": "sha512-d31IFW2bLRB28uL1WoElyro8RH5l6531XfxMtCeCmp6RVAF1uTfxxUA0LH1tXl+psZdwfmIbwoG4U5VwgbhtLw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.1.tgz", + "integrity": "sha512-eFa8up2/8cZXLIpkafhaADTXSnl7IsUFCYenRWrARBz0/qZwcT0RBXpys0LJU4+WfPoF2ZG6ew6s2V6izMCwRA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "@babel/plugin-transform-react-display-name": "^7.16.0", - "@babel/plugin-transform-react-jsx": "^7.16.0", - "@babel/plugin-transform-react-jsx-development": "^7.16.0", - "@babel/plugin-transform-react-pure-annotations": "^7.16.0" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-transform-react-display-name": "^7.24.1", + "@babel/plugin-transform-react-jsx": "^7.23.4", + "@babel/plugin-transform-react-jsx-development": "^7.22.5", + "@babel/plugin-transform-react-pure-annotations": "^7.24.1" }, "engines": { "node": ">=6.9.0" @@ -2154,52 +2109,39 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/runtime-corejs3": { - "version": "7.17.2", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.17.2.tgz", - "integrity": "sha512-NcKtr2epxfIrNM4VOmPKO46TvDMCBhgi2CrSHaEarrz+Plk2K5r9QemmOFTGpZaoKnWoGH5MO+CzeRsih/Fcgg==", - "dev": true, - "dependencies": { - "core-js-pure": "^3.20.2", - "regenerator-runtime": "^0.13.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/runtime/node_modules/regenerator-runtime": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, "node_modules/@babel/template": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", - "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", "dev": true, "dependencies": { "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9" + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", - "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", + "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", + "@babel/code-frame": "^7.24.1", + "@babel/generator": "^7.24.1", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9", + "@babel/parser": "^7.24.1", + "@babel/types": "^7.24.0", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -2208,9 +2150,9 @@ } }, "node_modules/@babel/types": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", - "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.23.4", @@ -2233,26 +2175,24 @@ "integrity": "sha512-SFBwUHMcb7TFFK5ld88+JhecoEun3/kHZ6KvLDjj3w5hv/tfRV8mtGHA8N42uMctXLF4bPEcr96xwXXcRFuweg==" }, "node_modules/@commitlint/cli": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-15.0.0.tgz", - "integrity": "sha512-Y5xmDCweytqzo4N4lOI2YRiuX35xTjcs8n5hUceBH8eyK0YbwtgWX50BJOH2XbkwEmII9blNhlBog6AdQsqicg==", - "dev": true, - "dependencies": { - "@commitlint/format": "^15.0.0", - "@commitlint/lint": "^15.0.0", - "@commitlint/load": "^15.0.0", - "@commitlint/read": "^15.0.0", - "@commitlint/types": "^15.0.0", - "lodash": "^4.17.19", - "resolve-from": "5.0.0", - "resolve-global": "1.0.0", + "version": "19.2.1", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-19.2.1.tgz", + "integrity": "sha512-cbkYUJsLqRomccNxvoJTyv5yn0bSy05BBizVyIcLACkRbVUqYorC351Diw/XFSWC/GtpwiwT2eOvQgFZa374bg==", + "dev": true, + "dependencies": { + "@commitlint/format": "^19.0.3", + "@commitlint/lint": "^19.1.0", + "@commitlint/load": "^19.2.0", + "@commitlint/read": "^19.2.1", + "@commitlint/types": "^19.0.3", + "execa": "^8.0.1", "yargs": "^17.0.0" }, "bin": { "commitlint": "cli.js" }, "engines": { - "node": ">=v12" + "node": ">=v18" } }, "node_modules/@commitlint/cli/node_modules/cliui": { @@ -2269,13 +2209,138 @@ "node": ">=12" } }, - "node_modules/@commitlint/cli/node_modules/resolve-from": { + "node_modules/@commitlint/cli/node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@commitlint/cli/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/cli/node_modules/human-signals": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", "dev": true, "engines": { - "node": ">=8" + "node": ">=16.17.0" + } + }, + "node_modules/@commitlint/cli/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/cli/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/cli/node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/cli/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/cli/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/cli/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@commitlint/cli/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@commitlint/cli/node_modules/wrap-ansi": { @@ -2323,499 +2388,760 @@ } }, "node_modules/@commitlint/config-conventional": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-15.0.0.tgz", - "integrity": "sha512-eZBRL8Lk3hMNHp1wUMYj0qrZQEsST1ai7KHR8J1IDD9aHgT7L2giciibuQ+Og7vxVhR5WtYDvh9xirXFVPaSkQ==", + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-19.1.0.tgz", + "integrity": "sha512-KIKD2xrp6Uuk+dcZVj3++MlzIr/Su6zLE8crEDQCZNvWHNQSeeGbzOlNtsR32TUy6H3JbP7nWgduAHCaiGQ6EA==", + "dev": true, + "dependencies": { + "@commitlint/types": "^19.0.3", + "conventional-changelog-conventionalcommits": "^7.0.2" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/config-validator": { + "version": "19.0.3", + "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-19.0.3.tgz", + "integrity": "sha512-2D3r4PKjoo59zBc2auodrSCaUnCSALCx54yveOFwwP/i2kfEAQrygwOleFWswLqK0UL/F9r07MFi5ev2ohyM4Q==", "dev": true, "dependencies": { - "conventional-changelog-conventionalcommits": "^4.3.1" + "@commitlint/types": "^19.0.3", + "ajv": "^8.11.0" }, "engines": { - "node": ">=v12" + "node": ">=v18" } }, "node_modules/@commitlint/ensure": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-15.0.0.tgz", - "integrity": "sha512-7DV4iNIald3vycwaWBNGk5FbonaNzOlU8nBe5m5AgU2dIeNKuXwLm+zzJzG27j0Ho56rgz//3F6RIvmsoxY9ZA==", + "version": "19.0.3", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-19.0.3.tgz", + "integrity": "sha512-SZEpa/VvBLoT+EFZVb91YWbmaZ/9rPH3ESrINOl0HD2kMYsjvl0tF7nMHh0EpTcv4+gTtZBAe1y/SS6/OhfZzQ==", "dev": true, "dependencies": { - "@commitlint/types": "^15.0.0", - "lodash": "^4.17.19" + "@commitlint/types": "^19.0.3", + "lodash.camelcase": "^4.3.0", + "lodash.kebabcase": "^4.1.1", + "lodash.snakecase": "^4.1.1", + "lodash.startcase": "^4.4.0", + "lodash.upperfirst": "^4.3.1" }, "engines": { - "node": ">=v12" + "node": ">=v18" } }, "node_modules/@commitlint/execute-rule": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-15.0.0.tgz", - "integrity": "sha512-pyE4ApxjbWhb1TXz5vRiGwI2ssdMMgZbaaheZq1/7WC0xRnqnIhE1yUC1D2q20qPtvkZPstTYvMiRVtF+DvjUg==", + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-19.0.0.tgz", + "integrity": "sha512-mtsdpY1qyWgAO/iOK0L6gSGeR7GFcdW7tIjcNFxcWkfLDF5qVbPHKuGATFqRMsxcO8OUKNj0+3WOHB7EHm4Jdw==", "dev": true, "engines": { - "node": ">=v12" + "node": ">=v18" } }, "node_modules/@commitlint/format": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-15.0.0.tgz", - "integrity": "sha512-bPhAfqwRhPk92WiuY0ktEJNpRRHSCd+Eg1MdhGyL9Bl3U25E5zvuInA+dNctnzZiOBSH/37ZaD0eOKCpQE6acg==", + "version": "19.0.3", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-19.0.3.tgz", + "integrity": "sha512-QjjyGyoiVWzx1f5xOteKHNLFyhyweVifMgopozSgx1fGNrGV8+wp7k6n1t6StHdJ6maQJ+UUtO2TcEiBFRyR6Q==", "dev": true, "dependencies": { - "@commitlint/types": "^15.0.0", - "chalk": "^4.0.0" + "@commitlint/types": "^19.0.3", + "chalk": "^5.3.0" }, "engines": { - "node": ">=v12" + "node": ">=v18" } }, "node_modules/@commitlint/format/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { - "node": ">=10" + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/@commitlint/is-ignored": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-15.0.0.tgz", - "integrity": "sha512-edtnkf2QZ/7e/YCJDgn1WDw9wfF1WfOitW5YEoSOb4SxjJEb/oE87kxNPZ2j8mnDMuunspcMfGHeg6fRlwaEWg==", + "version": "19.0.3", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-19.0.3.tgz", + "integrity": "sha512-MqDrxJaRSVSzCbPsV6iOKG/Lt52Y+PVwFVexqImmYYFhe51iVJjK2hRhOG2jUAGiUHk4jpdFr0cZPzcBkSzXDQ==", "dev": true, "dependencies": { - "@commitlint/types": "^15.0.0", - "semver": "7.3.5" + "@commitlint/types": "^19.0.3", + "semver": "^7.6.0" }, "engines": { - "node": ">=v12" + "node": ">=v18" } }, "node_modules/@commitlint/lint": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-15.0.0.tgz", - "integrity": "sha512-hUi2+Im/2dJ5FBvWnodypTkg+5haCgsDzB0fyMApWLUA1IucYUAqRCQCW5em1Mhk9Crw1pd5YzFNikhIclkqCw==", + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-19.1.0.tgz", + "integrity": "sha512-ESjaBmL/9cxm+eePyEr6SFlBUIYlYpI80n+Ltm7IA3MAcrmiP05UMhJdAD66sO8jvo8O4xdGn/1Mt2G5VzfZKw==", "dev": true, "dependencies": { - "@commitlint/is-ignored": "^15.0.0", - "@commitlint/parse": "^15.0.0", - "@commitlint/rules": "^15.0.0", - "@commitlint/types": "^15.0.0" + "@commitlint/is-ignored": "^19.0.3", + "@commitlint/parse": "^19.0.3", + "@commitlint/rules": "^19.0.3", + "@commitlint/types": "^19.0.3" }, "engines": { - "node": ">=v12" + "node": ">=v18" } }, "node_modules/@commitlint/load": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-15.0.0.tgz", - "integrity": "sha512-Ak1YPeOhvxmY3ioe0o6m1yLGvUAYb4BdfGgShU8jiTCmU3Mnmms0Xh/kfQz8AybhezCC3AmVTyBLaBZxOHR8kg==", - "dev": true, - "dependencies": { - "@commitlint/execute-rule": "^15.0.0", - "@commitlint/resolve-extends": "^15.0.0", - "@commitlint/types": "^15.0.0", - "@endemolshinegroup/cosmiconfig-typescript-loader": "^3.0.2", - "chalk": "^4.0.0", - "cosmiconfig": "^7.0.0", - "lodash": "^4.17.19", - "resolve-from": "^5.0.0", - "typescript": "^4.4.3" + "version": "19.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-19.2.0.tgz", + "integrity": "sha512-XvxxLJTKqZojCxaBQ7u92qQLFMMZc4+p9qrIq/9kJDy8DOrEa7P1yx7Tjdc2u2JxIalqT4KOGraVgCE7eCYJyQ==", + "dev": true, + "dependencies": { + "@commitlint/config-validator": "^19.0.3", + "@commitlint/execute-rule": "^19.0.0", + "@commitlint/resolve-extends": "^19.1.0", + "@commitlint/types": "^19.0.3", + "chalk": "^5.3.0", + "cosmiconfig": "^9.0.0", + "cosmiconfig-typescript-loader": "^5.0.0", + "lodash.isplainobject": "^4.0.6", + "lodash.merge": "^4.6.2", + "lodash.uniq": "^4.5.0" }, "engines": { - "node": ">=v12" + "node": ">=v18" } }, + "node_modules/@commitlint/load/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "node_modules/@commitlint/load/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@commitlint/load/node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" }, "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@commitlint/load/node_modules/resolve-from": { + "node_modules/@commitlint/load/node_modules/cosmiconfig-typescript-loader": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-5.0.0.tgz", + "integrity": "sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==", "dev": true, + "dependencies": { + "jiti": "^1.19.1" + }, "engines": { - "node": ">=8" + "node": ">=v16" + }, + "peerDependencies": { + "@types/node": "*", + "cosmiconfig": ">=8.2", + "typescript": ">=4" + } + }, + "node_modules/@commitlint/load/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, "node_modules/@commitlint/message": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-15.0.0.tgz", - "integrity": "sha512-L8euabzboKavPuDJsdIYAY2wx97LbiGEYsckMo6NmV8pOun50c8hQx6ouXFSAx4pp+mX9yUGmMiVqfrk2LKDJQ==", + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-19.0.0.tgz", + "integrity": "sha512-c9czf6lU+9oF9gVVa2lmKaOARJvt4soRsVmbR7Njwp9FpbBgste5i7l/2l5o8MmbwGh4yE1snfnsy2qyA2r/Fw==", "dev": true, "engines": { - "node": ">=v12" + "node": ">=v18" } }, "node_modules/@commitlint/parse": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-15.0.0.tgz", - "integrity": "sha512-7fweM67tZfBNS7zw1KTuuT5K2u9nGytUJqFqT/1Ln3Na9cBCsoAqR47mfsNOTlRCgGwakm4xiQ7BpS2gN0OGuw==", + "version": "19.0.3", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-19.0.3.tgz", + "integrity": "sha512-Il+tNyOb8VDxN3P6XoBBwWJtKKGzHlitEuXA5BP6ir/3loWlsSqDr5aecl6hZcC/spjq4pHqNh0qPlfeWu38QA==", "dev": true, "dependencies": { - "@commitlint/types": "^15.0.0", - "conventional-changelog-angular": "^5.0.11", - "conventional-commits-parser": "^3.2.2" + "@commitlint/types": "^19.0.3", + "conventional-changelog-angular": "^7.0.0", + "conventional-commits-parser": "^5.0.0" }, "engines": { - "node": ">=v12" + "node": ">=v18" } }, "node_modules/@commitlint/read": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-15.0.0.tgz", - "integrity": "sha512-5yI1o2HKZFVe7RTjL7IhuhHMKar/MDNY34vEHqqz9gMI7BK/rdP8uVb4Di1efl2V0UPnwID0nPKWESjQ8Ti0gw==", + "version": "19.2.1", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-19.2.1.tgz", + "integrity": "sha512-qETc4+PL0EUv7Q36lJbPG+NJiBOGg7SSC7B5BsPWOmei+Dyif80ErfWQ0qXoW9oCh7GTpTNRoaVhiI8RbhuaNw==", "dev": true, "dependencies": { - "@commitlint/top-level": "^15.0.0", - "@commitlint/types": "^15.0.0", - "fs-extra": "^10.0.0", - "git-raw-commits": "^2.0.0" + "@commitlint/top-level": "^19.0.0", + "@commitlint/types": "^19.0.3", + "execa": "^8.0.1", + "git-raw-commits": "^4.0.0", + "minimist": "^1.2.8" }, "engines": { - "node": ">=v12" + "node": ">=v18" } }, - "node_modules/@commitlint/resolve-extends": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-15.0.0.tgz", - "integrity": "sha512-7apfRJjgJsKja7lHsPfEFixKjA/fk/UeD3owkOw1174yYu4u8xBDLSeU3IinGPdMuF9m245eX8wo7vLUy+EBSg==", + "node_modules/@commitlint/read/node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", "dev": true, "dependencies": { - "import-fresh": "^3.0.0", - "lodash": "^4.17.19", - "resolve-from": "^5.0.0", - "resolve-global": "^1.0.0" + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" }, "engines": { - "node": ">=v12" + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/@commitlint/resolve-extends/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "node_modules/@commitlint/read/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", "dev": true, "engines": { - "node": ">=8" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@commitlint/rules": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-15.0.0.tgz", - "integrity": "sha512-SqXfp6QUlwBS+0IZm4FEA/NmmAwcFQIkG3B05BtemOVWXQdZ8j1vV6hDwvA9oMPCmUSrrGpHOtZK7HaHhng2yA==", + "node_modules/@commitlint/read/node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", "dev": true, - "dependencies": { - "@commitlint/ensure": "^15.0.0", - "@commitlint/message": "^15.0.0", - "@commitlint/to-lines": "^15.0.0", - "@commitlint/types": "^15.0.0", - "execa": "^5.0.0" - }, "engines": { - "node": ">=v12" + "node": ">=16.17.0" } }, - "node_modules/@commitlint/to-lines": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-15.0.0.tgz", - "integrity": "sha512-mY3MNA9ujPqVpiJjTYG9MDsYCobue5PJFO0MfcIzS1mCVvngH8ZFTPAh1fT5t+t1h876boS88+9WgqjRvbYItw==", + "node_modules/@commitlint/read/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, "engines": { - "node": ">=v12" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@commitlint/top-level": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-15.0.0.tgz", - "integrity": "sha512-7Gz3t7xcuuUw1d1Nou6YLaztzp2Em+qZ6YdCzrqYc+aquca3Vt0O696nuiBDU/oE+tls4Hx2CNpAbWhTgEwB5A==", + "node_modules/@commitlint/read/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "dev": true, - "dependencies": { - "find-up": "^5.0.0" - }, "engines": { - "node": ">=v12" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@commitlint/top-level/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "node_modules/@commitlint/read/node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dev": true, "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "path-key": "^4.0.0" }, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@commitlint/top-level/node_modules/locate-path": { + "node_modules/@commitlint/read/node_modules/onetime": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, "dependencies": { - "p-locate": "^5.0.0" + "mimic-fn": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@commitlint/top-level/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "node_modules/@commitlint/read/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@commitlint/top-level/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "node_modules/@commitlint/read/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, - "dependencies": { - "p-limit": "^3.0.2" + "engines": { + "node": ">=14" }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@commitlint/read/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@commitlint/types": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-15.0.0.tgz", - "integrity": "sha512-OMSLX+QJnyNoTwws54ULv9sOvuw9GdVezln76oyUd4YbMMJyaav62aSXDuCdWyL2sm9hTkSzyEi52PNaIj/vqw==", + "node_modules/@commitlint/resolve-extends": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-19.1.0.tgz", + "integrity": "sha512-z2riI+8G3CET5CPgXJPlzftH+RiWYLMYv4C9tSLdLXdr6pBNimSKukYP9MS27ejmscqCTVA4almdLh0ODD2KYg==", "dev": true, "dependencies": { - "chalk": "^4.0.0" + "@commitlint/config-validator": "^19.0.3", + "@commitlint/types": "^19.0.3", + "global-directory": "^4.0.1", + "import-meta-resolve": "^4.0.0", + "lodash.mergewith": "^4.6.2", + "resolve-from": "^5.0.0" }, "engines": { - "node": ">=v12" + "node": ">=v18" } }, - "node_modules/@commitlint/types/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@commitlint/resolve-extends/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=8" } }, - "node_modules/@csstools/normalize.css": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.0.0.tgz", - "integrity": "sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg==", - "dev": true - }, - "node_modules/@csstools/postcss-cascade-layers": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz", - "integrity": "sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==", + "node_modules/@commitlint/rules": { + "version": "19.0.3", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-19.0.3.tgz", + "integrity": "sha512-TspKb9VB6svklxNCKKwxhELn7qhtY1rFF8ls58DcFd0F97XoG07xugPjjbVnLqmMkRjZDbDIwBKt9bddOfLaPw==", "dev": true, "dependencies": { - "@csstools/selector-specificity": "^2.0.2", - "postcss-selector-parser": "^6.0.10" + "@commitlint/ensure": "^19.0.3", + "@commitlint/message": "^19.0.0", + "@commitlint/to-lines": "^19.0.0", + "@commitlint/types": "^19.0.3", + "execa": "^8.0.1" }, "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "node": ">=v18" } }, - "node_modules/@csstools/postcss-color-function": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz", - "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==", + "node_modules/@commitlint/rules/node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", "dev": true, "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" }, "engines": { - "node": "^12 || ^14 || >=16" + "node": ">=16.17" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/@csstools/postcss-font-format-keywords": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz", - "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==", + "node_modules/@commitlint/rules/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, "engines": { - "node": "^12 || ^14 || >=16" + "node": ">=16" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@csstools/postcss-hwb-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz", - "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==", + "node_modules/@commitlint/rules/node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, "engines": { - "node": "^12 || ^14 || >=16" + "node": ">=16.17.0" + } + }, + "node_modules/@commitlint/rules/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@csstools/postcss-ic-unit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz", - "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==", + "node_modules/@commitlint/rules/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "dev": true, - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, "engines": { - "node": "^12 || ^14 || >=16" + "node": ">=12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@csstools/postcss-is-pseudo-class": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz", - "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==", + "node_modules/@commitlint/rules/node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dev": true, "dependencies": { - "@csstools/selector-specificity": "^2.0.0", - "postcss-selector-parser": "^6.0.10" + "path-key": "^4.0.0" }, "engines": { - "node": "^12 || ^14 || >=16" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@csstools/postcss-nested-calc": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz", - "integrity": "sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==", + "node_modules/@commitlint/rules/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, "dependencies": { - "postcss-value-parser": "^4.2.0" + "mimic-fn": "^4.0.0" }, "engines": { - "node": "^12 || ^14 || >=16" + "node": ">=12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/rules/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" }, - "peerDependencies": { - "postcss": "^8.2" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@csstools/postcss-normalize-display-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz", - "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==", + "node_modules/@commitlint/rules/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@commitlint/rules/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/to-lines": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-19.0.0.tgz", + "integrity": "sha512-vkxWo+VQU5wFhiP9Ub9Sre0FYe019JxFikrALVoD5UGa8/t3yOJEpEhxC5xKiENKKhUkTpEItMTRAjHw2SCpZw==", + "dev": true, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/top-level": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-19.0.0.tgz", + "integrity": "sha512-KKjShd6u1aMGNkCkaX4aG1jOGdn7f8ZI8TR1VEuNqUOjWTOdcDSsmglinglJ18JTjuBX5I1PtjrhQCRcixRVFQ==", "dev": true, "dependencies": { - "postcss-value-parser": "^4.2.0" + "find-up": "^7.0.0" }, "engines": { - "node": "^12 || ^14 || >=16" + "node": ">=v18" + } + }, + "node_modules/@commitlint/top-level/node_modules/find-up": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-7.0.0.tgz", + "integrity": "sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==", + "dev": true, + "dependencies": { + "locate-path": "^7.2.0", + "path-exists": "^5.0.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/top-level/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/top-level/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/top-level/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/top-level/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/@commitlint/top-level/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/types": { + "version": "19.0.3", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-19.0.3.tgz", + "integrity": "sha512-tpyc+7i6bPG9mvaBbtKUeghfyZSDgWquIDfMgqYtTbmZ9Y9VzEm2je9EYcQ0aoz5o7NvGS+rcDec93yO08MHYA==", + "dev": true, + "dependencies": { + "@types/conventional-commits-parser": "^5.0.0", + "chalk": "^5.3.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/types/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.6.1.tgz", + "integrity": "sha512-ubEkAaTfVZa+WwGhs5jbo5Xfqpeaybr/RvWzvFxRs4jfq16wH8l8Ty/QEEpINxll4xhuGfdMbipRyz5QZh9+FA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": "^14 || ^16 || >=18" }, "peerDependencies": { - "postcss": "^8.2" + "@csstools/css-tokenizer": "^2.2.4" } }, - "node_modules/@csstools/postcss-oklab-function": { + "node_modules/@csstools/css-tokenizer": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.2.4.tgz", + "integrity": "sha512-PuWRAewQLbDhGeTvFuq2oClaSCKPIBmHyIobCV39JHRYN0byDcUWJl5baPeNUcqrjtdMNqFooE0FGl31I3JOqw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": "^14 || ^16 || >=18" + } + }, + "node_modules/@csstools/media-query-list-parser": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.9.tgz", + "integrity": "sha512-qqGuFfbn4rUmyOB0u8CVISIp5FfJ5GAR3mBrZ9/TKndHakdnm6pY0L/fbLcpPnrzwCyyTEZl1nUcXAYHEWneTA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^2.6.1", + "@csstools/css-tokenizer": "^2.2.4" + } + }, + "node_modules/@csstools/normalize.css": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.0.0.tgz", + "integrity": "sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg==", + "dev": true + }, + "node_modules/@csstools/postcss-cascade-layers": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz", - "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz", + "integrity": "sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==", "dev": true, "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" + "@csstools/selector-specificity": "^2.0.2", + "postcss-selector-parser": "^6.0.10" }, "engines": { "node": "^12 || ^14 || >=16" @@ -2828,25 +3154,30 @@ "postcss": "^8.2" } }, - "node_modules/@csstools/postcss-progressive-custom-properties": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", - "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", + "node_modules/@csstools/postcss-color-function": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz", + "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==", "dev": true, "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^12 || ^14 || >=16" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, "peerDependencies": { - "postcss": "^8.3" + "postcss": "^8.2" } }, - "node_modules/@csstools/postcss-stepped-value-functions": { + "node_modules/@csstools/postcss-font-format-keywords": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz", - "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==", + "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz", + "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" @@ -2862,10 +3193,10 @@ "postcss": "^8.2" } }, - "node_modules/@csstools/postcss-text-decoration-shorthand": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz", - "integrity": "sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==", + "node_modules/@csstools/postcss-hwb-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz", + "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" @@ -2881,16 +3212,17 @@ "postcss": "^8.2" } }, - "node_modules/@csstools/postcss-trigonometric-functions": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz", - "integrity": "sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==", + "node_modules/@csstools/postcss-ic-unit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz", + "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==", "dev": true, "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^14 || >=16" + "node": "^12 || ^14 || >=16" }, "funding": { "type": "opencollective", @@ -2900,11 +3232,15 @@ "postcss": "^8.2" } }, - "node_modules/@csstools/postcss-unset-value": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz", - "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==", + "node_modules/@csstools/postcss-is-pseudo-class": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz", + "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==", "dev": true, + "dependencies": { + "@csstools/selector-specificity": "^2.0.0", + "postcss-selector-parser": "^6.0.10" + }, "engines": { "node": "^12 || ^14 || >=16" }, @@ -2916,40 +3252,168 @@ "postcss": "^8.2" } }, - "node_modules/@csstools/selector-specificity": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.1.1.tgz", - "integrity": "sha512-jwx+WCqszn53YHOfvFMJJRd/B2GqkCBt+1MJSG6o5/s8+ytHMvDZXsJgUEWLk12UnLd7HYKac4BYU5i/Ron1Cw==", + "node_modules/@csstools/postcss-nested-calc": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz", + "integrity": "sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==", "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, "engines": { - "node": "^14 || ^16 || >=18" + "node": "^12 || ^14 || >=16" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/csstools" }, "peerDependencies": { - "postcss": "^8.4", - "postcss-selector-parser": "^6.0.10" + "postcss": "^8.2" } }, - "node_modules/@endemolshinegroup/cosmiconfig-typescript-loader": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@endemolshinegroup/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-3.0.2.tgz", - "integrity": "sha512-QRVtqJuS1mcT56oHpVegkKBlgtWjXw/gHNWO3eL9oyB5Sc7HBoc2OLG/nYpVfT/Jejvo3NUrD0Udk7XgoyDKkA==", + "node_modules/@csstools/postcss-normalize-display-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz", + "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==", "dev": true, "dependencies": { - "lodash.get": "^4", - "make-error": "^1", - "ts-node": "^9", - "tslib": "^2" + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=10.0.0" + "node": "^12 || ^14 || >=16" }, - "peerDependencies": { - "cosmiconfig": ">=6" - } + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-oklab-function": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz", + "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==", + "dev": true, + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-progressive-custom-properties": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", + "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/@csstools/postcss-stepped-value-functions": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz", + "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-text-decoration-shorthand": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz", + "integrity": "sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-trigonometric-functions": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz", + "integrity": "sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-unset-value": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz", + "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==", + "dev": true, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/selector-specificity": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.1.1.tgz", + "integrity": "sha512-jwx+WCqszn53YHOfvFMJJRd/B2GqkCBt+1MJSG6o5/s8+ytHMvDZXsJgUEWLk12UnLd7HYKac4BYU5i/Ron1Cw==", + "dev": true, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.4", + "postcss-selector-parser": "^6.0.10" + } }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", @@ -3075,96 +3539,111 @@ } }, "node_modules/@gravity-ui/chartkit": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/@gravity-ui/chartkit/-/chartkit-4.23.0.tgz", - "integrity": "sha512-lshwcFKf8u5WvL2d2A+UFZ2XEYVF3XDlh5dfn+ui5h4x2Odapz6jC7bWvLU8zP1/ovmgbH4lUwJw2gSiIhmyQg==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@gravity-ui/chartkit/-/chartkit-5.2.2.tgz", + "integrity": "sha512-2cTIshm23Vm2UCadUWZOaLLYCkGNsoP/l0M3tNs6sjkMrdu8XHNF4FB3ePHHJnbgO4vUy8hNyld5e/gi+jAwSw==", "dependencies": { "@bem-react/classname": "^1.6.0", - "@gravity-ui/date-utils": "^1.4.2", + "@gravity-ui/date-utils": "^2.1.0", + "@gravity-ui/i18n": "^1.0.0", "@gravity-ui/yagr": "^4.2.3", "afterframe": "^1.0.2", "d3": "^7.8.5", "lodash": "^4.17.21", - "react-split-pane": "^0.1.92" + "react-split-pane": "^0.1.92", + "tslib": "^2.6.2" }, "peerDependencies": { - "@gravity-ui/uikit": "^5.0.0", + "@gravity-ui/uikit": "^6.0.0", "react": "^16.0.0 || ^17.0.0 || ^18.0.0" } }, "node_modules/@gravity-ui/components": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/@gravity-ui/components/-/components-2.12.0.tgz", - "integrity": "sha512-T1TZS+/BfApcYwQXEhlzoabiww70zzigv8yI3S//gaQg0Esrbtas5kq5BYR+K2YWblf8ldZgzTJK5IbO9YTMsg==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@gravity-ui/components/-/components-3.4.1.tgz", + "integrity": "sha512-fH/N8IIi6LaSvl2rSpO+Q2X+EKJi8FbP7jFrUA8dmGJqryx1ddJszYFAik5TxFnxhOU9j9fYvwVe8ulLfd4lfQ==", "dependencies": { "@bem-react/classname": "^1.6.0", - "@gravity-ui/i18n": "^1.1.0", - "@gravity-ui/icons": "^2.4.0", + "@gravity-ui/date-utils": "^2.1.0", + "@gravity-ui/i18n": "^1.2.0", + "@gravity-ui/icons": "^2.8.1", "lodash": "^4.17.21", "resize-observer-polyfill": "^1.5.1", - "universal-cookie": "^6.1.1" + "universal-cookie": "^6.1.3" }, "peerDependencies": { - "@gravity-ui/uikit": "^5.12.0", + "@gravity-ui/uikit": "^6.0.0", "react": "^16.0.0 || ^17.0.0 || ^18.0.0", "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0" } }, "node_modules/@gravity-ui/date-utils": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@gravity-ui/date-utils/-/date-utils-1.4.2.tgz", - "integrity": "sha512-q966eCe6fJkVVYMixgDnpoWYahMvlJGxMymKipP9pkZPJKR9epmQ4RKdKFs+m8umosj8aIHrXH/aVMRveQKUCQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@gravity-ui/date-utils/-/date-utils-2.1.0.tgz", + "integrity": "sha512-f7PsINb3/Q4gDDNZnZkE5SjDQqCba6NKa1e4W6976Zc7MkJ8fNTDnhC8sQP3Xpgme/yXAOx6U1rAJiijFaJY9Q==", "dependencies": { - "dayjs": "^1.11.7", + "dayjs": "1.11.10", "lodash": "^4.17.0" } }, "node_modules/@gravity-ui/eslint-config": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@gravity-ui/eslint-config/-/eslint-config-1.0.2.tgz", - "integrity": "sha512-988w7swpqZ8bwhPTNSVNvwJK3hJ4EBKA4dY7Sd0sTgXtjKLZhpff/I7Rncr76c8pgcXsvmHD2++kPnXe5oqx2Q==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@gravity-ui/eslint-config/-/eslint-config-3.1.1.tgz", + "integrity": "sha512-iOfvKASXHp+3XVtJxaBOJHWWXAM4yqnYNxK5EVzQXfnPC4ELNaNq0cww/8NaV8o3gpBGwi4r4C+YXFu2cc2AhA==", "dev": true, "dependencies": { - "@babel/core": "7.16.0", - "@babel/eslint-parser": "7.16.3", - "@babel/preset-react": "7.16.0", - "@typescript-eslint/eslint-plugin": "5.3.1", - "@typescript-eslint/parser": "5.3.1", - "eslint-config-prettier": "8.3.0", - "eslint-plugin-prettier": "4.0.0", - "eslint-plugin-react": "7.27.0", - "eslint-plugin-react-hooks": "4.3.0", - "eslint-plugin-security": "1.4.0" + "@babel/core": "^7.22.0", + "@babel/eslint-parser": "^7.22.0", + "@babel/preset-react": "^7.22.0", + "@typescript-eslint/eslint-plugin": "^6.4.1", + "@typescript-eslint/parser": "^6.4.1", + "eslint-config-prettier": "^9.0.0", + "eslint-import-resolver-typescript": "^3.6.0", + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-prettier": "^5.0.0", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-security": "^1.7.1" }, "peerDependencies": { - "eslint": "^8.0.0" + "eslint": "^8.0.0", + "prettier": "^3.0.0" + }, + "peerDependenciesMeta": { + "prettier": { + "optional": true + } } }, "node_modules/@gravity-ui/eslint-config/node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.3.1.tgz", - "integrity": "sha512-cFImaoIr5Ojj358xI/SDhjog57OK2NqlpxwdcgyxDA3bJlZcJq5CPzUXtpD7CxI2Hm6ATU7w5fQnnkVnmwpHqw==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", + "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", "dev": true, "dependencies": { - "@typescript-eslint/experimental-utils": "5.3.1", - "@typescript-eslint/scope-manager": "5.3.1", - "debug": "^4.3.2", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.1.8", - "regexpp": "^3.2.0", - "semver": "^7.3.5", - "tsutils": "^3.21.0" + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/type-utils": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -3172,41 +3651,27 @@ } } }, - "node_modules/@gravity-ui/eslint-config/node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@gravity-ui/eslint-config/node_modules/@typescript-eslint/parser": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.3.1.tgz", - "integrity": "sha512-TD+ONlx5c+Qhk21x9gsJAMRohWAUMavSOmJgv3JGy9dgPhuBd5Wok0lmMClZDyJNLLZK1JRKiATzCKZNUmoyfw==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.3.1", - "@typescript-eslint/types": "5.3.1", - "@typescript-eslint/typescript-estree": "5.3.1", - "debug": "^4.3.2" + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -3215,29 +3680,56 @@ } }, "node_modules/@gravity-ui/eslint-config/node_modules/@typescript-eslint/scope-manager": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.3.1.tgz", - "integrity": "sha512-XksFVBgAq0Y9H40BDbuPOTUIp7dn4u8oOuhcgGq7EoDP50eqcafkMVGrypyVGvDYHzjhdUCUwuwVUK4JhkMAMg==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.3.1", - "@typescript-eslint/visitor-keys": "5.3.1" + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@gravity-ui/eslint-config/node_modules/@typescript-eslint/type-utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", + "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@gravity-ui/eslint-config/node_modules/@typescript-eslint/types": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.3.1.tgz", - "integrity": "sha512-bG7HeBLolxKHtdHG54Uac750eXuQQPpdJfCYuw4ZI3bZ7+GgKClMWM8jExBtp7NSP4m8PmLRM8+lhzkYnSmSxQ==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -3245,21 +3737,22 @@ } }, "node_modules/@gravity-ui/eslint-config/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.3.1.tgz", - "integrity": "sha512-PwFbh/PKDVo/Wct6N3w+E4rLZxUDgsoII/GrWM2A62ETOzJd4M6s0Mu7w4CWsZraTbaC5UQI+dLeyOIFF1PquQ==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.3.1", - "@typescript-eslint/visitor-keys": "5.3.1", - "debug": "^4.3.2", - "globby": "^11.0.4", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "globby": "^11.1.0", "is-glob": "^4.0.3", - "semver": "^7.3.5", - "tsutils": "^3.21.0" + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -3271,82 +3764,61 @@ } } }, - "node_modules/@gravity-ui/eslint-config/node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "node_modules/@gravity-ui/eslint-config/node_modules/@typescript-eslint/utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", "dev": true, "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "semver": "^7.5.4" }, "engines": { - "node": ">=10" + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" } }, "node_modules/@gravity-ui/eslint-config/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.3.1.tgz", - "integrity": "sha512-3cHUzUuVTuNHx0Gjjt5pEHa87+lzyqOiHXy/Gz+SJOCW1mpw9xQHIIEwnKn+Thph1mgWyZ90nboOcSuZr/jTTQ==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.3.1", - "eslint-visitor-keys": "^3.0.0" + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@gravity-ui/eslint-config/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "node_modules/@gravity-ui/eslint-config/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" + "balanced-match": "^1.0.0" } }, - "node_modules/@gravity-ui/eslint-config/node_modules/eslint-plugin-react": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.27.0.tgz", - "integrity": "sha512-0Ut+CkzpppgFtoIhdzi2LpdpxxBvgFf99eFqWxJnUrO7mMe0eOiNpou6rvNYeVVV6lWZvTah0BFne7k5xHjARg==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.4", - "array.prototype.flatmap": "^1.2.5", - "doctrine": "^2.1.0", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.0.4", - "object.entries": "^1.1.5", - "object.fromentries": "^2.0.5", - "object.hasown": "^1.1.0", - "object.values": "^1.1.5", - "prop-types": "^15.7.2", - "resolve": "^2.0.0-next.3", - "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.6" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/@gravity-ui/eslint-config/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "node_modules/@gravity-ui/eslint-config/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3355,135 +3827,112 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@gravity-ui/eslint-config/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/@gravity-ui/eslint-config/node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "node_modules/@gravity-ui/eslint-config/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "brace-expansion": "^2.0.1" }, - "bin": { - "resolve": "bin/resolve" + "engines": { + "node": ">=16 || 14 >=14.17" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/@gravity-ui/eslint-config/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@gravity-ui/i18n": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@gravity-ui/i18n/-/i18n-1.2.0.tgz", - "integrity": "sha512-1FNZmbxeT3arwU2bv1p77u/K7rYoX4pGrXf0SNwg45HbbgI0XV0WapXbWr/GIB7EXdjiOvQ7kzXCfVIFV4ifYw==" + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@gravity-ui/i18n/-/i18n-1.4.0.tgz", + "integrity": "sha512-zeszlWxzZuqzX509Vnc3KujGqq9Ln5NKYRaIpgkF2/ODvZMsWToGtNV3MibtljN8moiCQCtVrmW50/oKiF2+qA==" }, "node_modules/@gravity-ui/icons": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/@gravity-ui/icons/-/icons-2.8.1.tgz", - "integrity": "sha512-cldaFAN3W2OAzEZBiurD7RsqyqGhS7xoVS9TC4DrOG9bXy8dWUvNEeeOnKgpIvZgAGFlTmg01BK6jMH0IFFSPw==" + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@gravity-ui/icons/-/icons-2.9.1.tgz", + "integrity": "sha512-0OH6YrVxFpHjk3x1f5GWlC+3Ek7LncNy95C9g94C13MhRtMRe0l/ZwSgbOmQ72lDxvQrmidt095Ft+mfID9XmQ==", + "peerDependencies": { + "react": "*" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + } + } }, "node_modules/@gravity-ui/navigation": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@gravity-ui/navigation/-/navigation-1.9.0.tgz", - "integrity": "sha512-0NweIUakKIvBR0TxjXr/NGp6FZIQaQbJcZomS436N9GCtkLUxQxDlpqjQ4QEHGdw3Mex25zXDsYaMHuZCxkiiA==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@gravity-ui/navigation/-/navigation-2.5.0.tgz", + "integrity": "sha512-3QsT0BJQ8G6Es4CLV2c99sXPOiEnFy6DjaRbdLxliv6YT5E7GSKbz65ElMjGFKPogCMXnvNLpQgPMtN6Af262Q==", "dependencies": { - "@gravity-ui/i18n": "^1.1.0", "react-transition-group": "^4.4.1", "tslib": "^2.4.0" }, "peerDependencies": { "@bem-react/classname": "^1.6.0", - "@gravity-ui/components": "^2.0.0", + "@gravity-ui/components": "^3.0.0", "@gravity-ui/icons": "^2.2.0", - "@gravity-ui/uikit": "^5.1.0", + "@gravity-ui/uikit": "^6.0.0", "react": "^16.0.0 || ^17.0.0 || ^18.0.0", "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0" } }, "node_modules/@gravity-ui/paranoid": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@gravity-ui/paranoid/-/paranoid-1.4.0.tgz", - "integrity": "sha512-Rubd4TNTbi6gYysMkz6rbLWRSaUjaoOWnJUYHonWBrBaGuDWY6sF/oDB4xFWxe64cLUuzi05y9PVuUshAFcs9Q==", - "dependencies": { - "copy-to-clipboard": "3.3.1", - "fabric": "4.2.0", - "resize-observer-polyfill": "1.5.1" - } - }, - "node_modules/@gravity-ui/paranoid/node_modules/copy-to-clipboard": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz", - "integrity": "sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@gravity-ui/paranoid/-/paranoid-1.4.1.tgz", + "integrity": "sha512-XXkUnSolGnTajnImPZyKeFmgotiaYOuYCbKItTDmsj3YS3GkCo7zfmUkClDYZgnXxN/KfnTlL4PXbTEGqf7SKA==", "dependencies": { - "toggle-selection": "^1.0.6" + "copy-to-clipboard": "^3.3.1", + "fabric": "^4.2.0", + "lodash": "^4.17.20", + "resize-observer-polyfill": "^1.5.1" + }, + "peerDependencies": { + "react": ">=16.12.0" } }, "node_modules/@gravity-ui/prettier-config": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@gravity-ui/prettier-config/-/prettier-config-1.0.1.tgz", - "integrity": "sha512-VpTM+OiUMgXjwc7HBo0ekxBFghzELsnE/RFBYwbkbIqm0NrL4SiEPzne1IyEY/WsfI8om1hpn81t+qjGbicMSw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@gravity-ui/prettier-config/-/prettier-config-1.1.0.tgz", + "integrity": "sha512-Q97lMSOqdAf337qblkq06mLgK9OEEGglPAj8ncs3WnaZ2rBtOxtNsCIubv5U64TZkxaNPzxd7rDL24VIv1sxJg==", "dev": true, "peerDependencies": { - "prettier": "^2.2.1" + "prettier": "*" } }, "node_modules/@gravity-ui/react-data-table": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@gravity-ui/react-data-table/-/react-data-table-1.2.0.tgz", - "integrity": "sha512-+FzUT7KlNy3MrakMxRHWSRjhph01EkH6Oil4pFptdp2QNXBZlyr8Y5fMu6pzAybbPs/E/pFbrpBo3oxT1QGWYw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@gravity-ui/react-data-table/-/react-data-table-2.0.1.tgz", + "integrity": "sha512-b926wU0jHEJyLS28VnYLD88IICYqUI6ys1YEnM/+vIUcyJ/9fUP56xQFCrlLZnxbqww6TIXEQ9RC3GJ5qJwdaA==", "dependencies": { - "react-list": "0.8.16" - }, - "peerDependencies": { "@bem-react/classname": ">=1.6.0", - "prop-types": ">=15.8.0", - "react": ">=16.14.0" - } - }, - "node_modules/@gravity-ui/react-data-table/node_modules/react-list": { - "version": "0.8.16", - "resolved": "https://registry.npmjs.org/react-list/-/react-list-0.8.16.tgz", - "integrity": "sha512-LSxfvdwB9Ip+E+8NBtLPW2pcIngzuV0rSoH9nMt9C2lFjZEbnoBY/ib/Zx121jPgFgg3xYkMlMXSzx5gaiP5ig==", - "dependencies": { - "prop-types": "15" + "react-list": "^0.8.17", + "tslib": "^2.6.2" }, "peerDependencies": { - "react": "0.14 || 15 || 16 || 17" + "react": ">=16.14.0" } }, "node_modules/@gravity-ui/stylelint-config": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@gravity-ui/stylelint-config/-/stylelint-config-1.0.1.tgz", - "integrity": "sha512-vm2ST9/5BmSsw3IcuU6inQZ38wbY19dk4ePkPo1UUzcFB39AKW+7JBnHlnWuwzrv0VwYCk8wahDFm7zkwHDurw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@gravity-ui/stylelint-config/-/stylelint-config-4.0.1.tgz", + "integrity": "sha512-Yn5gnfnLt46e0XqTAt41c7OTEMGVt2Cx7cLv1awTKYo7GLTyWuW3Ir7zx5N0J2QiC/LWfouwglOF+KqwVUkXug==", "dev": true, "dependencies": { - "postcss-scss": "4.0.2", - "stylelint-config-prettier": "9.0.3", - "stylelint-order": "5.0.0", - "stylelint-prettier": "2.0.0", - "stylelint-scss": "4.0.0" + "postcss-scss": "^4.0.7", + "stylelint-order": "^6.0.3", + "stylelint-prettier": "^4.0.2", + "stylelint-scss": "^5.1.0" }, "peerDependencies": { "postcss": "^8.0.0", - "stylelint": "^14.0.0" + "prettier": "^3.0.0", + "stylelint": "^15.8.0" + }, + "peerDependenciesMeta": { + "prettier": { + "optional": true + } } }, "node_modules/@gravity-ui/tsconfig": { @@ -3493,37 +3942,32 @@ "dev": true }, "node_modules/@gravity-ui/uikit": { - "version": "5.30.1", - "resolved": "https://registry.npmjs.org/@gravity-ui/uikit/-/uikit-5.30.1.tgz", - "integrity": "sha512-FWM1j8F37jzSPMzRA4UD/Xhst7JEYjGwVqCOCVim9F3uACjcQcBlE0LiFPUMeu8katl+6pDcFqG1DNZuvDFDHw==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@gravity-ui/uikit/-/uikit-6.8.0.tgz", + "integrity": "sha512-6DKkQguosvYIx7zd5j5t16B1sEAK8Oa0EtbrN2KnLrlYUkokgjJJINJPU/liaSt2zexsjEDMZUDSGh8alBwLTA==", "dependencies": { "@bem-react/classname": "^1.6.0", - "@gravity-ui/i18n": "^1.1.0", - "@gravity-ui/icons": "^2.5.0", + "@gravity-ui/i18n": "^1.3.0", + "@gravity-ui/icons": "^2.8.1", "@popperjs/core": "^2.11.8", "blueimp-md5": "^2.19.0", - "focus-trap": "^7.5.2", + "focus-trap": "^7.5.4", "lodash": "^4.17.21", + "rc-slider": "^10.5.0", "react-beautiful-dnd": "^13.1.1", "react-copy-to-clipboard": "^5.1.0", "react-popper": "^2.3.0", "react-transition-group": "^4.4.5", - "react-virtualized-auto-sizer": "^1.0.20", - "react-window": "^1.8.9", + "react-virtualized-auto-sizer": "^1.0.21", + "react-window": "^1.8.10", "tabbable": "^6.2.0", - "tslib": "^2.6.1", - "utility-types": "^3.10.0" + "tslib": "^2.6.2" }, "peerDependencies": { "react": "^16.0.0 || ^17.0.0 || ^18.0.0", "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/@gravity-ui/uikit/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, "node_modules/@gravity-ui/websql-autocomplete": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@gravity-ui/websql-autocomplete/-/websql-autocomplete-8.0.2.tgz", @@ -3624,20 +4068,21 @@ } }, "node_modules/@jest/console": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", - "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, + "peer": true, "dependencies": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/console/node_modules/chalk": { @@ -3645,6 +4090,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -3657,12 +4103,13 @@ } }, "node_modules/@jest/console/node_modules/jest-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", - "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, + "peer": true, "dependencies": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -3670,48 +4117,47 @@ "picomatch": "^2.2.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/core": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-28.1.3.tgz", - "integrity": "sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, "peer": true, "dependencies": { - "@jest/console": "^28.1.3", - "@jest/reporters": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^28.1.3", - "jest-config": "^28.1.3", - "jest-haste-map": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-resolve": "^28.1.3", - "jest-resolve-dependencies": "^28.1.3", - "jest-runner": "^28.1.3", - "jest-runtime": "^28.1.3", - "jest-snapshot": "^28.1.3", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", - "jest-watcher": "^28.1.3", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", "micromatch": "^4.0.4", - "pretty-format": "^28.1.3", - "rimraf": "^3.0.0", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" @@ -3740,70 +4186,70 @@ } }, "node_modules/@jest/core/node_modules/jest-haste-map": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", - "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "peer": true, "dependencies": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "optionalDependencies": { "fsevents": "^2.3.2" } }, "node_modules/@jest/core/node_modules/jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true, "peer": true, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/core/node_modules/jest-resolve": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-28.1.3.tgz", - "integrity": "sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, "peer": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", + "jest-haste-map": "^29.7.0", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", + "resolve.exports": "^2.0.0", "slash": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/core/node_modules/jest-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", - "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "peer": true, "dependencies": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -3811,40 +4257,41 @@ "picomatch": "^2.2.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/core/node_modules/jest-validate": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-28.1.3.tgz", - "integrity": "sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "peer": true, "dependencies": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "camelcase": "^6.2.0", "chalk": "^4.0.0", - "jest-get-type": "^28.0.2", + "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^28.1.3" + "pretty-format": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/core/node_modules/jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "peer": true, "dependencies": { "@types/node": "*", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/core/node_modules/jest-worker/node_modules/supports-color": { @@ -3863,65 +4310,74 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/@jest/core/node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10" + } + }, "node_modules/@jest/environment": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-28.1.3.tgz", - "integrity": "sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, "peer": true, "dependencies": { - "@jest/fake-timers": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^28.1.3" + "jest-mock": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-28.1.3.tgz", - "integrity": "sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, "peer": true, "dependencies": { - "expect": "^28.1.3", - "jest-snapshot": "^28.1.3" + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.3.tgz", - "integrity": "sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, - "peer": true, "dependencies": { - "jest-get-type": "^28.0.2" + "jest-get-type": "^29.6.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/fake-timers": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-28.1.3.tgz", - "integrity": "sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, "peer": true, "dependencies": { - "@jest/types": "^28.1.3", - "@sinonjs/fake-timers": "^9.1.2", + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^28.1.3", - "jest-mock": "^28.1.3", - "jest-util": "^28.1.3" + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/fake-timers/node_modules/chalk": { @@ -3942,13 +4398,13 @@ } }, "node_modules/@jest/fake-timers/node_modules/jest-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", - "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "peer": true, "dependencies": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -3956,37 +4412,38 @@ "picomatch": "^2.2.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-28.1.3.tgz", - "integrity": "sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, "peer": true, "dependencies": { - "@jest/environment": "^28.1.3", - "@jest/expect": "^28.1.3", - "@jest/types": "^28.1.3" + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-28.1.3.tgz", - "integrity": "sha512-JuAy7wkxQZVNU/V6g9xKzCGC5LVXx9FDcABKsSXp5MiKPEE2144a/vXTEDoyzjUpZKfVwp08Wqg5A4WfTMAzjg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, "peer": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "@jridgewell/trace-mapping": "^0.3.13", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", @@ -3994,21 +4451,20 @@ "glob": "^7.1.3", "graceful-fs": "^4.2.9", "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-instrument": "^6.0.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", - "terminal-link": "^2.0.0", "v8-to-istanbul": "^9.0.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" @@ -4036,14 +4492,31 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/@jest/reporters/node_modules/istanbul-lib-instrument": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz", + "integrity": "sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@jest/reporters/node_modules/jest-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", - "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "peer": true, "dependencies": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -4051,22 +4524,23 @@ "picomatch": "^2.2.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters/node_modules/jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "peer": true, "dependencies": { "@types/node": "*", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters/node_modules/jest-worker/node_modules/supports-color": { @@ -4086,61 +4560,62 @@ } }, "node_modules/@jest/schemas": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", - "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, "dependencies": { - "@sinclair/typebox": "^0.24.1" + "@sinclair/typebox": "^0.27.8" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/source-map": { - "version": "28.1.2", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-28.1.2.tgz", - "integrity": "sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", "dev": true, "peer": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.13", + "@jridgewell/trace-mapping": "^0.3.18", "callsites": "^3.0.0", "graceful-fs": "^4.2.9" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/test-result": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", - "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, + "peer": true, "dependencies": { - "@jest/console": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/test-sequencer": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-28.1.3.tgz", - "integrity": "sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, "peer": true, "dependencies": { - "@jest/test-result": "^28.1.3", + "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", + "jest-haste-map": "^29.7.0", "slash": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/test-sequencer/node_modules/chalk": { @@ -4161,49 +4636,49 @@ } }, "node_modules/@jest/test-sequencer/node_modules/jest-haste-map": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", - "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "peer": true, "dependencies": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "optionalDependencies": { "fsevents": "^2.3.2" } }, "node_modules/@jest/test-sequencer/node_modules/jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true, "peer": true, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/test-sequencer/node_modules/jest-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", - "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "peer": true, "dependencies": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -4211,22 +4686,23 @@ "picomatch": "^2.2.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/test-sequencer/node_modules/jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "peer": true, "dependencies": { "@types/node": "*", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/test-sequencer/node_modules/jest-worker/node_modules/supports-color": { @@ -4246,30 +4722,30 @@ } }, "node_modules/@jest/transform": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz", - "integrity": "sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "peer": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/types": "^28.1.3", - "@jridgewell/trace-mapping": "^0.3.13", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", - "write-file-atomic": "^4.0.1" + "write-file-atomic": "^4.0.2" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/transform/node_modules/chalk": { @@ -4289,50 +4765,57 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/@jest/transform/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "peer": true + }, "node_modules/@jest/transform/node_modules/jest-haste-map": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", - "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "peer": true, "dependencies": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "optionalDependencies": { "fsevents": "^2.3.2" } }, "node_modules/@jest/transform/node_modules/jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true, "peer": true, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/transform/node_modules/jest-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", - "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "peer": true, "dependencies": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -4340,22 +4823,23 @@ "picomatch": "^2.2.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/transform/node_modules/jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "peer": true, "dependencies": { "@types/node": "*", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/transform/node_modules/jest-worker/node_modules/supports-color": { @@ -4375,12 +4859,12 @@ } }, "node_modules/@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, "dependencies": { - "@jest/schemas": "^28.1.3", + "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", @@ -4388,7 +4872,7 @@ "chalk": "^4.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/types/node_modules/chalk": { @@ -4408,14 +4892,14 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" @@ -4431,9 +4915,9 @@ } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, "engines": { "node": ">=6.0.0" @@ -4456,13 +4940,13 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@leichtgewicht/ip-codec": { @@ -4491,6 +4975,15 @@ "node-pre-gyp": "bin/node-pre-gyp" } }, + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { + "version": "5.1.1-v1", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", + "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", + "dev": true, + "dependencies": { + "eslint-scope": "5.1.1" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -4526,35 +5019,31 @@ "node": ">= 8" } }, - "node_modules/@playwright/test": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.31.1.tgz", - "integrity": "sha512-IsytVZ+0QLDh1Hj83XatGp/GsI1CDJWbyDaBGbainsh0p2zC7F4toUocqowmjS6sQff2NGT3D9WbDj/3K2CJiA==", + "node_modules/@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", "dev": true, - "dependencies": { - "@types/node": "*", - "playwright-core": "1.31.1" - }, - "bin": { - "playwright": "cli.js" - }, "engines": { - "node": ">=14" + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" }, - "optionalDependencies": { - "fsevents": "2.3.2" + "funding": { + "url": "https://opencollective.com/unts" } }, - "node_modules/@playwright/test/node_modules/playwright-core": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.31.1.tgz", - "integrity": "sha512-JTyX4kV3/LXsvpHkLzL2I36aCdml4zeE35x+G5aPc4bkLsiRiQshU5lWeVpHFAuC8xAcbI6FDcw/8z3q2xtJSQ==", + "node_modules/@playwright/test": { + "version": "1.42.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.42.1.tgz", + "integrity": "sha512-Gq9rmS54mjBL/7/MvBaNOBwbfnh7beHvS6oS4srqXFcQHpQCV1+c8JXWE8VLPyRDhgS3H8x8A7hztqI9VnwrAQ==", "dev": true, + "dependencies": { + "playwright": "1.42.1" + }, "bin": { "playwright": "cli.js" }, "engines": { - "node": ">=14" + "node": ">=16" } }, "node_modules/@pmmmwh/react-refresh-webpack-plugin": { @@ -4687,9 +5176,9 @@ } }, "node_modules/@reduxjs/toolkit": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.2.1.tgz", - "integrity": "sha512-8CREoqJovQW/5I4yvvijm/emUiCCmcs4Ev4XPWd4mizSO+dD3g5G6w34QK5AGeNrSH7qM8Fl66j4vuV7dpOdkw==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.2.3.tgz", + "integrity": "sha512-76dll9EnJXg4EVcI5YNxZA/9hSAmZsFqzMmNRHvIlzw2WS/twfcVX3ysYrWGJMClwEmChQFC4yRq74tn6fdzRA==", "dependencies": { "immer": "^10.0.3", "redux": "^5.0.1", @@ -4798,9 +5287,9 @@ "dev": true }, "node_modules/@sinclair/typebox": { - "version": "0.24.27", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.27.tgz", - "integrity": "sha512-K7C7IlQ3zLePEZleUN21ceBA2aLcMnLHTLph8QWk1JK37L90obdpY+QGY8bXMKxf1ht1Z0MNewvXxWv0oGDYFg==", + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "dev": true }, "node_modules/@sinonjs/commons": { @@ -4813,13 +5302,23 @@ } }, "node_modules/@sinonjs/fake-timers": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", - "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, "peer": true, "dependencies": { - "@sinonjs/commons": "^1.7.0" + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@sinonjs/fake-timers/node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "peer": true, + "dependencies": { + "type-detect": "4.0.8" } }, "node_modules/@surma/rollup-plugin-off-main-thread": { @@ -5056,47 +5555,22 @@ } }, "node_modules/@testing-library/dom": { - "version": "7.31.2", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-7.31.2.tgz", - "integrity": "sha512-3UqjCpey6HiTZT92vODYLPxTBWlM8ZOOjr3LX5F37/VRipW2M1kX6I/Cm4VXzteZqfGfagg8yXywpcOgQBlNsQ==", + "version": "9.3.4", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.4.tgz", + "integrity": "sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==", "dev": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", - "@types/aria-query": "^4.2.0", - "aria-query": "^4.2.2", + "@types/aria-query": "^5.0.1", + "aria-query": "5.1.3", "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.6", - "lz-string": "^1.4.4", - "pretty-format": "^26.6.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@testing-library/dom/node_modules/@jest/types": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", - "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" }, "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@testing-library/dom/node_modules/@types/yargs": { - "version": "15.0.19", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.19.tgz", - "integrity": "sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" + "node": ">=14" } }, "node_modules/@testing-library/dom/node_modules/chalk": { @@ -5116,69 +5590,116 @@ } }, "node_modules/@testing-library/dom/node_modules/pretty-format": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", - "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", "dev": true, "dependencies": { - "@jest/types": "^26.6.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", "react-is": "^17.0.1" }, "engines": { - "node": ">= 10" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@testing-library/dom/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/@testing-library/jest-dom": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.15.0.tgz", - "integrity": "sha512-lOMuQidnL1tWHLEWIhL6UvSZC1Qt3OkNe1khvi2h6xFiqpe5O8arYs46OU0qyUGq0cSTbroQyMktYNXu3a7sAA==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.4.2.tgz", + "integrity": "sha512-CzqH0AFymEMG48CpzXFriYYkOjk6ZGPCLMhW9e9jg3KMCn5OfJecF8GtGW7yGfR/IgCe3SX8BSwjdzI6BBbZLw==", "dev": true, "dependencies": { + "@adobe/css-tools": "^4.3.2", "@babel/runtime": "^7.9.2", - "@types/testing-library__jest-dom": "^5.9.1", - "aria-query": "^4.2.2", + "aria-query": "^5.0.0", "chalk": "^3.0.0", - "css": "^3.0.0", "css.escape": "^1.5.1", - "dom-accessibility-api": "^0.5.6", + "dom-accessibility-api": "^0.6.3", "lodash": "^4.17.15", "redent": "^3.0.0" }, "engines": { - "node": ">=8", + "node": ">=14", "npm": ">=6", "yarn": ">=1" + }, + "peerDependencies": { + "@jest/globals": ">= 28", + "@types/bun": "latest", + "@types/jest": ">= 28", + "jest": ">= 28", + "vitest": ">= 0.32" + }, + "peerDependenciesMeta": { + "@jest/globals": { + "optional": true + }, + "@types/bun": { + "optional": true + }, + "@types/jest": { + "optional": true + }, + "jest": { + "optional": true + }, + "vitest": { + "optional": true + } + } + }, + "node_modules/@testing-library/jest-dom/node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "dependencies": { + "dequal": "^2.0.3" } }, + "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", + "dev": true + }, "node_modules/@testing-library/react": { - "version": "11.2.7", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-11.2.7.tgz", - "integrity": "sha512-tzRNp7pzd5QmbtXNG/mhdcl7Awfu/Iz1RaVHY75zTdOkmHCuzMhRL83gWHSgOAcjS3CCbyfwUHMZgRJb4kAfpA==", + "version": "14.2.2", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-14.2.2.tgz", + "integrity": "sha512-SOUuM2ysCvjUWBXTNfQ/ztmnKDmqaiPV3SvoIuyxMUca45rbSWWAT/qB8CUs/JQ/ux/8JFs9DNdFQ3f6jH3crA==", "dev": true, "dependencies": { "@babel/runtime": "^7.12.5", - "@testing-library/dom": "^7.28.1" + "@testing-library/dom": "^9.0.0", + "@types/react-dom": "^18.0.0" }, "engines": { - "node": ">=10" + "node": ">=14" }, "peerDependencies": { - "react": "*", - "react-dom": "*" + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, "node_modules/@testing-library/user-event": { - "version": "12.8.3", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-12.8.3.tgz", - "integrity": "sha512-IR0iWbFkgd56Bu5ZI/ej8yQwrkCv8Qydx6RzwbKz9faXazR/+5tvYKsZQgyXJiwgpcva127YO6JcWy7YlCfofQ==", + "version": "14.5.2", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.5.2.tgz", + "integrity": "sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==", "dev": true, - "dependencies": { - "@babel/runtime": "^7.12.5" - }, "engines": { - "node": ">=10", + "node": ">=12", "npm": ">=6" }, "peerDependencies": { @@ -5204,9 +5725,9 @@ } }, "node_modules/@types/aria-query": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.2.tgz", - "integrity": "sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", "dev": true }, "node_modules/@types/babel__core": { @@ -5288,10 +5809,19 @@ "@types/node": "*" } }, + "node_modules/@types/conventional-commits-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz", + "integrity": "sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/cookie": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.5.4.tgz", - "integrity": "sha512-7z/eR6O859gyWIAjuvBWFzNURmf2oPBmJlfVWkwehU5nzIyjwBsTh7WMmEEV4JFnHuQ3ex4oyTvfKzcyJVDBNA==" + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==" }, "node_modules/@types/eslint": { "version": "8.21.1", @@ -5358,9 +5888,9 @@ "dev": true }, "node_modules/@types/hoist-non-react-statics": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", - "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz", + "integrity": "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==", "dependencies": { "@types/react": "*", "hoist-non-react-statics": "^3.3.0" @@ -5406,19 +5936,19 @@ } }, "node_modules/@types/jest": { - "version": "28.1.6", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-28.1.6.tgz", - "integrity": "sha512-0RbGAFMfcBJKOmqRazM8L98uokwuwD5F8rHrv/ZMbrZBwVOWZUyPG6VFNscjYr/vjM3Vu4fRrCPbOs42AfemaQ==", + "version": "29.5.12", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", + "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", "dev": true, "dependencies": { - "jest-matcher-utils": "^28.0.0", - "pretty-format": "^28.0.0" + "expect": "^29.0.0", + "pretty-format": "^29.0.0" } }, "node_modules/@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, "node_modules/@types/json5": { @@ -5428,9 +5958,9 @@ "dev": true }, "node_modules/@types/lodash": { - "version": "4.14.178", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.178.tgz", - "integrity": "sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.0.tgz", + "integrity": "sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==", "dev": true }, "node_modules/@types/mime": { @@ -5440,9 +5970,9 @@ "dev": true }, "node_modules/@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", "dev": true }, "node_modules/@types/node": { @@ -5452,15 +5982,15 @@ "dev": true }, "node_modules/@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", "dev": true }, "node_modules/@types/numeral": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@types/numeral/-/numeral-2.0.2.tgz", - "integrity": "sha512-A8F30k2gYJ/6e07spSCPpkuZu79LCnkPTvqmIWQzNGcrzwFKpVOydG41lNt5wZXjSI149qjyzC2L1+F2PD/NUA==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/numeral/-/numeral-2.0.5.tgz", + "integrity": "sha512-kH8I7OSSwQu9DS9JYdFWbuvhVzvFRoCPCkGxNwoGgaPeDfEPJlcxNvEOypZhQ3XXHsGbfIuYcxcJxKUfJHnRfw==", "dev": true }, "node_modules/@types/parse-json": { @@ -5487,9 +6017,9 @@ "dev": true }, "node_modules/@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "version": "6.9.14", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.14.tgz", + "integrity": "sha512-5khscbd3SwWMhFqylJBLQ0zIu7c1K6Vz0uBIt915BI3zV0q1nfjRQD3RqSBcPaO6PHEF4ov/t9y89fSiyThlPA==", "dev": true }, "node_modules/@types/range-parser": { @@ -5499,28 +6029,27 @@ "dev": true }, "node_modules/@types/react": { - "version": "17.0.58", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.58.tgz", - "integrity": "sha512-c1GzVY97P0fGxwGxhYq989j4XwlcHQoto6wQISOC2v6wm3h0PORRWJFHlkRjfGsiG3y1609WdQ+J+tKxvrEd6A==", + "version": "18.2.73", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.73.tgz", + "integrity": "sha512-XcGdod0Jjv84HOC7N5ziY3x+qL0AfmubvKOZ9hJjJ2yd5EE+KYjWhdOjt387e9HPheHkdggF9atTifMRtyAaRA==", "dependencies": { "@types/prop-types": "*", - "@types/scheduler": "*", "csstype": "^3.0.2" } }, "node_modules/@types/react-dom": { - "version": "17.0.11", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.11.tgz", - "integrity": "sha512-f96K3k+24RaLGVu/Y2Ng3e1EbZ8/cVJvypZWd7cy0ofCBaf2lcM46xNhycMZ2xGwbBjRql7hOlZ+e2WlJ5MH3Q==", + "version": "18.2.23", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.23.tgz", + "integrity": "sha512-ZQ71wgGOTmDYpnav2knkjr3qXdAFu0vsk8Ci5w3pGAIdj7/kKAyn+VsQDhXsmzzzepAiI9leWMmubXz690AI/A==", "dev": true, "dependencies": { "@types/react": "*" } }, "node_modules/@types/react-redux": { - "version": "7.1.23", - "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.23.tgz", - "integrity": "sha512-D02o3FPfqQlfu2WeEYwh3x2otYd2Dk1o8wAfsA0B1C2AJEFxE663Ozu7JzuWbznGgW248NaOF6wsqCGNq9d3qw==", + "version": "7.1.33", + "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.33.tgz", + "integrity": "sha512-NF8m5AjWCkert+fosDsN3hAlHzpjSiXlVy9EgQEmLoBhaNXbmyeGs/aj5dQzKuF+/q+S7JQagorGDW8pJ28Hmg==", "dependencies": { "@types/hoist-non-react-statics": "^3.3.0", "@types/react": "*", @@ -5529,22 +6058,22 @@ } }, "node_modules/@types/react-router": { - "version": "5.1.17", - "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.17.tgz", - "integrity": "sha512-RNSXOyb3VyRs/EOGmjBhhGKTbnN6fHWvy5FNLzWfOWOGjgVUKqJZXfpKzLmgoU8h6Hj8mpALj/mbXQASOb92wQ==", + "version": "5.1.20", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", + "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", "dev": true, "dependencies": { - "@types/history": "*", + "@types/history": "^4.7.11", "@types/react": "*" } }, "node_modules/@types/react-router-dom": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.2.tgz", - "integrity": "sha512-ELEYRUie2czuJzaZ5+ziIp9Hhw+juEw8b7C11YNA4QdLCVbQ3qLi2l4aq8XnlqM7V31LZX8dxUuFUCrzHm6sqQ==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", + "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", "dev": true, "dependencies": { - "@types/history": "*", + "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router": "*" } @@ -5564,15 +6093,10 @@ "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", "dev": true }, - "node_modules/@types/scheduler": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" - }, "node_modules/@types/semver": { - "version": "7.3.13", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", "dev": true }, "node_modules/@types/serve-index": { @@ -5609,21 +6133,17 @@ "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", "dev": true }, - "node_modules/@types/testing-library__jest-dom": { - "version": "5.14.5", - "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.5.tgz", - "integrity": "sha512-SBwbxYoyPIvxHbeHxTZX2Pe/74F/tX2/D3mMvzabdeJ25bBojfW0TyB8BHrbq/9zaaKICJZjLP+8r6AeZMFCuQ==", - "dev": true, - "dependencies": { - "@types/jest": "*" - } - }, "node_modules/@types/trusted-types": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.3.tgz", "integrity": "sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==", "dev": true }, + "node_modules/@types/use-sync-external-store": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz", + "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==" + }, "node_modules/@types/ws": { "version": "8.5.4", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", @@ -5682,21 +6202,6 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@typescript-eslint/experimental-utils": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.3.1.tgz", @@ -5918,21 +6423,6 @@ } } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@typescript-eslint/utils": { "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", @@ -5959,21 +6449,6 @@ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/@typescript-eslint/utils/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@typescript-eslint/visitor-keys": { "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", @@ -6319,19 +6794,6 @@ "node": ">= 6.0.0" } }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/ajv": { "version": "8.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", @@ -6501,7 +6963,9 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/argparse": { "version": "1.0.10", @@ -6513,26 +6977,25 @@ } }, "node_modules/aria-query": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", - "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", "dev": true, "dependencies": { - "@babel/runtime": "^7.10.2", - "@babel/runtime-corejs3": "^7.10.2" - }, - "engines": { - "node": ">=6.0" + "deep-equal": "^2.0.5" } }, "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6553,7 +7016,7 @@ "node_modules/array-ify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", + "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", "dev": true }, "node_modules/array-includes": { @@ -6584,15 +7047,35 @@ "node": ">=8" } }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array.prototype.flat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -6603,14 +7086,14 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -6653,17 +7136,18 @@ } }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", - "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "dev": true, "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", "is-shared-array-buffer": "^1.0.2" }, "engines": { @@ -6673,6 +7157,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", @@ -6741,18 +7234,6 @@ "node": ">= 4.0.0" } }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true, - "bin": { - "atob": "bin/atob.js" - }, - "engines": { - "node": ">= 4.5.0" - } - }, "node_modules/autoprefixer": { "version": "10.4.13", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", @@ -6787,10 +7268,13 @@ } }, "node_modules/available-typed-arrays": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.6.tgz", - "integrity": "sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -6823,11 +7307,11 @@ } }, "node_modules/axios": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.7.tgz", - "integrity": "sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==", + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", + "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", "dependencies": { - "follow-redirects": "^1.15.4", + "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -6855,22 +7339,22 @@ } }, "node_modules/babel-jest": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-28.1.3.tgz", - "integrity": "sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, "peer": true, "dependencies": { - "@jest/transform": "^28.1.3", + "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^28.1.3", + "babel-preset-jest": "^29.6.3", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "@babel/core": "^7.8.0" @@ -6978,9 +7462,9 @@ } }, "node_modules/babel-plugin-jest-hoist": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.1.3.tgz", - "integrity": "sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, "peer": true, "dependencies": { @@ -6990,7 +7474,7 @@ "@types/babel__traverse": "^7.0.6" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/babel-plugin-macros": { @@ -7095,17 +7579,17 @@ } }, "node_modules/babel-preset-jest": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-28.1.3.tgz", - "integrity": "sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, "peer": true, "dependencies": { - "babel-plugin-jest-hoist": "^28.1.3", + "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "@babel/core": "^7.0.0" @@ -7156,19 +7640,6 @@ "tweetnacl": "^0.14.3" } }, - "node_modules/bem-cn": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/bem-cn/-/bem-cn-3.0.1.tgz", - "integrity": "sha512-kWC76a09vSk6cJXDYsH1erjxdBf856HTxl0IHOvYItSmBC6wQCsRCf9bmKR0hmeUDcUP5XPMr8MNXDgKbKJi0A==" - }, - "node_modules/bem-cn-lite": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bem-cn-lite/-/bem-cn-lite-4.1.0.tgz", - "integrity": "sha512-0IEVRYK2MQKQO00P3sY3hNv7vH8P+Z8mR46qFcaiwsQAWp0MuMWpLSuUUhZEjKD2HzTGXMqMsFysWEeeJa1drQ==", - "dependencies": { - "bem-cn": "^3.0.1" - } - }, "node_modules/bfj": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.0.2.tgz", @@ -7261,6 +7732,21 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/bonjour-service": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.0.tgz", @@ -7400,13 +7886,18 @@ } }, "node_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7453,29 +7944,33 @@ } }, "node_modules/camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-7.0.2.tgz", + "integrity": "sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==", "dev": true, "dependencies": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" + "camelcase": "^6.3.0", + "map-obj": "^4.1.0", + "quick-lru": "^5.1.1", + "type-fest": "^1.2.1" }, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/camelcase-keys/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "node_modules/camelcase-keys/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", "dev": true, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/caniuse-api": { @@ -7640,6 +8135,11 @@ "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", "dev": true }, + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" + }, "node_modules/clean-css": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz", @@ -7652,38 +8152,32 @@ "node": ">= 10.0" } }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", "dev": true, "dependencies": { - "restore-cursor": "^3.1.0" + "restore-cursor": "^4.0.0" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cli-truncate": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", - "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", "dev": true, "dependencies": { "slice-ansi": "^5.0.0", - "string-width": "^5.0.0" + "string-width": "^7.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -7714,9 +8208,9 @@ } }, "node_modules/cli-truncate/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", + "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", "dev": true }, "node_modules/cli-truncate/node_modules/is-fullwidth-code-point": { @@ -7748,17 +8242,17 @@ } }, "node_modules/cli-truncate/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz", + "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==", "dev": true, "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -7807,27 +8301,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/clone-regexp": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-2.2.0.tgz", - "integrity": "sha512-beMpP7BOtTipFuW8hrJvREQ2DrRu3BE7by0ZpibtfBA+qfHYvMGTc2Yb1JMYPKg/JUw0CHYvpg796aNTSW9z7Q==", - "dev": true, - "dependencies": { - "is-regexp": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/clone-regexp/node_modules/is-regexp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-2.1.0.tgz", - "integrity": "sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -7953,9 +8426,9 @@ "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" }, "node_modules/colorette": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", - "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, "node_modules/combined-stream": { @@ -8108,59 +8581,45 @@ } }, "node_modules/conventional-changelog-angular": { - "version": "5.0.13", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", - "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz", + "integrity": "sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==", "dev": true, "dependencies": { - "compare-func": "^2.0.0", - "q": "^1.5.1" + "compare-func": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=16" } }, "node_modules/conventional-changelog-conventionalcommits": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.6.3.tgz", - "integrity": "sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.2.tgz", + "integrity": "sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==", "dev": true, "dependencies": { - "compare-func": "^2.0.0", - "lodash": "^4.17.15", - "q": "^1.5.1" + "compare-func": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=16" } }, "node_modules/conventional-commits-parser": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", - "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz", + "integrity": "sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==", "dev": true, "dependencies": { - "is-text-path": "^1.0.1", - "JSONStream": "^1.0.4", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" + "is-text-path": "^2.0.0", + "JSONStream": "^1.3.5", + "meow": "^12.0.1", + "split2": "^4.0.0" }, "bin": { - "conventional-commits-parser": "cli.js" + "conventional-commits-parser": "cli.mjs" }, "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-commits-parser/node_modules/through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dev": true, - "dependencies": { - "readable-stream": "3" + "node": ">=16" } }, "node_modules/convert-source-map": { @@ -8173,6 +8632,7 @@ "version": "0.5.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -8278,6 +8738,63 @@ "node": ">=0.8" } }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "peer": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/create-jest/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "peer": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/create-react-class": { "version": "15.7.0", "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.7.0.tgz", @@ -8291,7 +8808,9 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/cross-spawn": { "version": "7.0.3", @@ -8331,17 +8850,6 @@ "node": ">=8" } }, - "node_modules/css": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz", - "integrity": "sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==", - "dev": true, - "dependencies": { - "inherits": "^2.0.4", - "source-map": "^0.6.1", - "source-map-resolve": "^0.6.0" - } - }, "node_modules/css-blank-pseudo": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", @@ -8380,6 +8888,15 @@ "postcss": "^8.0.9" } }, + "node_modules/css-functions-list": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.1.tgz", + "integrity": "sha512-Nj5YcaGgBtuUmn1D7oHqPW0c9iui7xsTsj5lIX8ZgevdfhmjFfKB3r8moHJtNJnctnYXJyYX5I1pp90HM4TPgQ==", + "dev": true, + "engines": { + "node": ">=12 || >=16" + } + }, "node_modules/css-has-pseudo": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", @@ -8424,21 +8941,6 @@ "webpack": "^5.0.0" } }, - "node_modules/css-loader/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/css-minimizer-webpack-plugin": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz", @@ -9106,12 +9608,15 @@ "dev": true }, "node_modules/dargs": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", - "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-8.1.0.tgz", + "integrity": "sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==", "dev": true, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/dashdash": { @@ -9163,6 +9668,57 @@ "webidl-conversions": "^4.0.2" } }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/date-now": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/date-now/-/date-now-1.0.1.tgz", @@ -9199,23 +9755,38 @@ } }, "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-5.0.1.tgz", + "integrity": "sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", "dev": true, "dependencies": { "decamelize": "^1.1.0", "map-obj": "^1.0.0" }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decamelize-keys/node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -9235,15 +9806,6 @@ "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", "dev": true }, - "node_modules/decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, "node_modules/decompress-response": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", @@ -9324,16 +9886,19 @@ } }, "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/define-lazy-prop": { @@ -9505,17 +10070,19 @@ "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=0.3.1" } }, "node_modules/diff-sequences": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", - "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/dir-glob": { @@ -9714,12 +10281,6 @@ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "dev": true }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, "node_modules/ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -9758,10 +10319,11 @@ "dev": true }, "node_modules/emittery": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", - "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "dev": true, + "peer": true, "engines": { "node": ">=12" }, @@ -9815,6 +10377,15 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -9834,50 +10405,57 @@ } }, "node_modules/es-abstract": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", - "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.2", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.5", - "es-set-tostringtag": "^2.0.1", + "version": "1.23.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.2.tgz", + "integrity": "sha512-60s3Xv2T2p1ICykc7c+DNDPLDMm9t4QxCOUU0K9JxiLjM3C1zB9YVdN7tjxrFd4+AkZ8CdX1ovUga4P2+1e+/w==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.2", - "get-symbol-description": "^1.0.0", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", "has-symbols": "^1.0.3", - "hasown": "^2.0.0", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", + "is-shared-array-buffer": "^1.0.3", "is-string": "^1.0.7", - "is-typed-array": "^1.1.12", + "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", "object-inspect": "^1.13.1", "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "safe-array-concat": "^1.0.1", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.5", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.13" + "which-typed-array": "^1.1.15" }, "engines": { "node": ">= 0.4" @@ -9892,6 +10470,25 @@ "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", "dev": true }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-get-iterator": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", @@ -9946,27 +10543,39 @@ "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", "dev": true }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" } }, "node_modules/es-to-primitive": { @@ -10089,9 +10698,9 @@ } }, "node_modules/eslint-config-prettier": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", - "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", "dev": true, "bin": { "eslint-config-prettier": "bin/cli.js" @@ -10129,14 +10738,14 @@ } }, "node_modules/eslint-import-resolver-node": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", - "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, "dependencies": { "debug": "^3.2.7", - "is-core-module": "^2.11.0", - "resolve": "^1.22.1" + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" } }, "node_modules/eslint-import-resolver-node/node_modules/debug": { @@ -10148,10 +10757,35 @@ "ms": "^2.1.1" } }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz", + "integrity": "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "enhanced-resolve": "^5.12.0", + "eslint-module-utils": "^2.7.4", + "fast-glob": "^3.3.1", + "get-tsconfig": "^4.5.0", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*" + } + }, "node_modules/eslint-module-utils": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", - "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", + "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", "dev": true, "dependencies": { "debug": "^3.2.7" @@ -10193,26 +10827,28 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.27.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", - "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", "dev": true, "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "array.prototype.flatmap": "^1.3.1", + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.7", - "eslint-module-utils": "^2.7.4", - "has": "^1.0.3", - "is-core-module": "^2.11.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.values": "^1.1.6", - "resolve": "^1.22.1", - "semver": "^6.3.0", - "tsconfig-paths": "^3.14.1" + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" @@ -10330,21 +10966,30 @@ } }, "node_modules/eslint-plugin-prettier": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz", - "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz", + "integrity": "sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==", "dev": true, "dependencies": { - "prettier-linter-helpers": "^1.0.0" + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.6" }, "engines": { - "node": ">=6.0.0" + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" }, "peerDependencies": { - "eslint": ">=7.28.0", - "prettier": ">=2.0.0" + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": "*", + "prettier": ">=3.0.0" }, "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, "eslint-config-prettier": { "optional": true } @@ -10381,9 +11026,9 @@ } }, "node_modules/eslint-plugin-react-hooks": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.3.0.tgz", - "integrity": "sha512-XslZy0LnMn+84NEG9jSGR6eGqaZB3133L8xewQo3fQagbQuGt7a63gf+P1NGKZavEYEC3UXaWEAA/AqDkuN6xA==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", "dev": true, "engines": { "node": ">=10" @@ -10440,12 +11085,12 @@ } }, "node_modules/eslint-plugin-security": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-1.4.0.tgz", - "integrity": "sha512-xlS7P2PLMXeqfhyf3NpqbvbnW04kN8M9NtmhpR3XGyOvt/vNKS7XPXT5EDbwKW9vCjWH4PpfQvgD/+JgN0VJKA==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-1.7.1.tgz", + "integrity": "sha512-sMStceig8AFglhhT2LqlU5r+/fn9OwsA72O5bBuQVTssPCdQAOQzL+oMn/ZcpeUY6KcNfLJArgcrsSULNjYYdQ==", "dev": true, "dependencies": { - "safe-regex": "^1.1.0" + "safe-regex": "^2.1.1" } }, "node_modules/eslint-plugin-testing-library": { @@ -10975,18 +11620,6 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/execall": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/execall/-/execall-2.0.0.tgz", - "integrity": "sha512-0FU2hZ5Hh6iQnarpRtQurM/aAvp3RIbfvgLHrcqJYzhXyV2KFruhuChf9NC6waAhiUR7FFtlugkI4p7f2Fqlow==", - "dev": true, - "dependencies": { - "clone-regexp": "^2.1.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", @@ -10997,20 +11630,19 @@ } }, "node_modules/expect": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/expect/-/expect-28.1.3.tgz", - "integrity": "sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, - "peer": true, "dependencies": { - "@jest/expect-utils": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3" + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/expect/node_modules/chalk": { @@ -11018,7 +11650,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -11031,13 +11662,12 @@ } }, "node_modules/expect/node_modules/jest-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", - "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, - "peer": true, "dependencies": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -11045,7 +11675,7 @@ "picomatch": "^2.2.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/express": { @@ -11117,6 +11747,21 @@ "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", "dev": true }, + "node_modules/express/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -11185,10 +11830,13 @@ "devOptional": true }, "node_modules/fastest-levenshtein": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", - "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", - "dev": true + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "engines": { + "node": ">= 4.9.1" + } }, "node_modules/fastq": { "version": "1.13.0", @@ -11367,12 +12015,13 @@ } }, "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, "dependencies": { - "flatted": "^3.1.0", + "flatted": "^3.2.9", + "keyv": "^4.5.3", "rimraf": "^3.0.2" }, "engines": { @@ -11380,9 +12029,9 @@ } }, "node_modules/flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, "node_modules/focus-trap": { @@ -11394,9 +12043,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", - "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "funding": [ { "type": "individual", @@ -11431,68 +12080,38 @@ } }, "node_modules/fork-ts-checker-webpack-plugin": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz", - "integrity": "sha512-m5cUmF30xkZ7h4tWUgTAcEaKmUW7tfyUyTqNNOz7OxWJ0v1VWKTcOvH8FWHUwSjlW/356Ijc9vi3XfcPstpQKA==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-9.0.2.tgz", + "integrity": "sha512-Uochze2R8peoN1XqlSi/rGUkDQpRogtLFocP9+PGu68zk1BDAKXfdeCdyVZpgTk8V8WFVQXdEz426VKjXLO1Gg==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.8.3", - "@types/json-schema": "^7.0.5", - "chalk": "^4.1.0", - "chokidar": "^3.4.2", - "cosmiconfig": "^6.0.0", + "@babel/code-frame": "^7.16.7", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "cosmiconfig": "^8.2.0", "deepmerge": "^4.2.2", - "fs-extra": "^9.0.0", - "glob": "^7.1.6", - "memfs": "^3.1.2", + "fs-extra": "^10.0.0", + "memfs": "^3.4.1", "minimatch": "^3.0.4", - "schema-utils": "2.7.0", - "semver": "^7.3.2", - "tapable": "^1.0.0" + "node-abort-controller": "^3.0.1", + "schema-utils": "^3.1.1", + "semver": "^7.3.5", + "tapable": "^2.2.1" }, "engines": { - "node": ">=10", + "node": ">=12.13.0", "yarn": ">=1.0.0" }, "peerDependencies": { - "eslint": ">= 6", - "typescript": ">= 2.7", - "vue-template-compiler": "*", - "webpack": ">= 4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - }, - "vue-template-compiler": { - "optional": true - } - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "typescript": ">3.6.0", + "webpack": "^5.11.0" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } + "node_modules/fork-ts-checker-webpack-plugin/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/chalk": { "version": "4.1.2", @@ -11511,67 +12130,41 @@ } }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", "dev": true, "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "node": ">=14" }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" + "funding": { + "url": "https://github.com/sponsors/d-fischer" }, - "engines": { - "node": ">= 8.9.0" + "peerDependencies": { + "typescript": ">=4.9.5" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "node_modules/fork-ts-checker-webpack-plugin/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, - "engines": { - "node": ">=6" + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, "node_modules/form-data": { @@ -11697,12 +12290,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, "node_modules/functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", @@ -11768,16 +12355,32 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-east-asian-width": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", + "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dependencies": { + "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -11797,18 +12400,6 @@ "node": ">=8.0.0" } }, - "node_modules/get-stdin": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", - "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -11822,13 +12413,14 @@ } }, "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" }, "engines": { "node": ">= 0.4" @@ -11837,6 +12429,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-tsconfig": { + "version": "4.7.3", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.3.tgz", + "integrity": "sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==", + "dev": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, "node_modules/getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -11847,31 +12451,20 @@ } }, "node_modules/git-raw-commits": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", - "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-4.0.0.tgz", + "integrity": "sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==", "dev": true, "dependencies": { - "dargs": "^7.0.0", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" + "dargs": "^8.0.0", + "meow": "^12.0.1", + "split2": "^4.0.0" }, "bin": { - "git-raw-commits": "cli.js" + "git-raw-commits": "cli.mjs" }, "engines": { - "node": ">=10" - } - }, - "node_modules/git-raw-commits/node_modules/through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dev": true, - "dependencies": { - "readable-stream": "3" + "node": ">=16" } }, "node_modules/glob": { @@ -11912,16 +12505,28 @@ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true }, - "node_modules/global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "node_modules/global-directory": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", + "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", "dev": true, "dependencies": { - "ini": "^1.3.4" + "ini": "4.1.1" }, "engines": { - "node": ">=4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/global-directory/node_modules/ini": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/global-modules": { @@ -12141,20 +12746,20 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dependencies": { - "get-intrinsic": "^1.2.2" + "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "engines": { "node": ">= 0.4" }, @@ -12195,9 +12800,9 @@ "optional": true }, "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dependencies": { "function-bind": "^1.1.2" }, @@ -12346,12 +12951,15 @@ } }, "node_modules/html-tags": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz", - "integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", "dev": true, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/html-webpack-plugin": { @@ -12566,15 +13174,15 @@ } }, "node_modules/husky": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/husky/-/husky-7.0.4.tgz", - "integrity": "sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ==", + "version": "9.0.11", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.0.11.tgz", + "integrity": "sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==", "dev": true, "bin": { - "husky": "lib/bin.js" + "husky": "bin.mjs" }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/typicode" @@ -12629,9 +13237,9 @@ } }, "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "dev": true, "engines": { "node": ">= 4" @@ -12647,17 +13255,11 @@ "url": "https://opencollective.com/immer" } }, - "node_modules/import-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", - "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", - "dev": true, - "dependencies": { - "import-from": "^2.1.0" - }, - "engines": { - "node": ">=4" - } + "node_modules/immutable": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", + "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==", + "dev": true }, "node_modules/import-fresh": { "version": "3.3.0", @@ -12675,27 +13277,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-from": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", - "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", - "dev": true, - "dependencies": { - "resolve-from": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/import-from/node_modules/resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/import-lazy": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", @@ -12724,6 +13305,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/import-meta-resolve": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.0.0.tgz", + "integrity": "sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -12765,12 +13356,12 @@ "dev": true }, "node_modules/internal-slot": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", - "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.2", + "es-errors": "^1.3.0", "hasown": "^2.0.0", "side-channel": "^1.0.4" }, @@ -12829,14 +13420,16 @@ } }, "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -12927,6 +13520,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-date-object": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", @@ -12942,15 +13550,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", @@ -13048,9 +13647,9 @@ "dev": true }, "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, "engines": { "node": ">= 0.4" @@ -13160,12 +13759,15 @@ } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -13214,15 +13816,15 @@ } }, "node_modules/is-text-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", - "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz", + "integrity": "sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==", "dev": true, "dependencies": { - "text-extensions": "^1.0.0" + "text-extensions": "^2.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/is-typed-array": { @@ -13372,21 +13974,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/istanbul-lib-report/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/istanbul-lib-source-maps": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", @@ -13462,22 +14049,22 @@ } }, "node_modules/jest": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest/-/jest-28.1.3.tgz", - "integrity": "sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, "peer": true, "dependencies": { - "@jest/core": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", "import-local": "^3.0.2", - "jest-cli": "^28.1.3" + "jest-cli": "^29.7.0" }, "bin": { "jest": "bin/jest.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" @@ -13489,17 +14076,53 @@ } }, "node_modules/jest-changed-files": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-28.1.3.tgz", - "integrity": "sha512-esaOfUWJXk2nfZt9SPyC8gA1kNfdKLkQWyzsMlqq8msYSlNKfmZxfRgZn4Cd4MGVUF+7v6dBs0d5TOAKa7iIiA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, "peer": true, "dependencies": { "execa": "^5.0.0", + "jest-util": "^29.7.0", "p-limit": "^3.1.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-changed-files/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-changed-files/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "peer": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-changed-files/node_modules/p-limit": { @@ -13519,34 +14142,35 @@ } }, "node_modules/jest-circus": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-28.1.3.tgz", - "integrity": "sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, "peer": true, "dependencies": { - "@jest/environment": "^28.1.3", - "@jest/expect": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", - "dedent": "^0.7.0", + "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", - "jest-each": "^28.1.3", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-runtime": "^28.1.3", - "jest-snapshot": "^28.1.3", - "jest-util": "^28.1.3", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "p-limit": "^3.1.0", - "pretty-format": "^28.1.3", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-circus/node_modules/chalk": { @@ -13566,14 +14190,29 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/jest-circus/node_modules/dedent": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", + "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", + "dev": true, + "peer": true, + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, "node_modules/jest-circus/node_modules/jest-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", - "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "peer": true, "dependencies": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -13581,7 +14220,7 @@ "picomatch": "^2.2.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-circus/node_modules/p-limit": { @@ -13601,30 +14240,29 @@ } }, "node_modules/jest-cli": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-28.1.3.tgz", - "integrity": "sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, "peer": true, "dependencies": { - "@jest/core": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", "chalk": "^4.0.0", + "create-jest": "^29.7.0", "exit": "^0.1.2", - "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^28.1.3", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", - "prompts": "^2.0.1", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "yargs": "^17.3.1" }, "bin": { "jest": "bin/jest.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" @@ -13668,13 +14306,13 @@ } }, "node_modules/jest-cli/node_modules/jest-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", - "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "peer": true, "dependencies": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -13682,25 +14320,25 @@ "picomatch": "^2.2.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-cli/node_modules/jest-validate": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-28.1.3.tgz", - "integrity": "sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "peer": true, "dependencies": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "camelcase": "^6.2.0", "chalk": "^4.0.0", - "jest-get-type": "^28.0.2", + "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^28.1.3" + "pretty-format": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-cli/node_modules/wrap-ansi": { @@ -13751,37 +14389,37 @@ } }, "node_modules/jest-config": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-28.1.3.tgz", - "integrity": "sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, "peer": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^28.1.3", - "@jest/types": "^28.1.3", - "babel-jest": "^28.1.3", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^28.1.3", - "jest-environment-node": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-regex-util": "^28.0.2", - "jest-resolve": "^28.1.3", - "jest-runner": "^28.1.3", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^28.1.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "@types/node": "*", @@ -13814,70 +14452,70 @@ } }, "node_modules/jest-config/node_modules/jest-haste-map": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", - "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "peer": true, "dependencies": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "optionalDependencies": { "fsevents": "^2.3.2" } }, "node_modules/jest-config/node_modules/jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true, "peer": true, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-config/node_modules/jest-resolve": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-28.1.3.tgz", - "integrity": "sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, "peer": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", + "jest-haste-map": "^29.7.0", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", + "resolve.exports": "^2.0.0", "slash": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-config/node_modules/jest-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", - "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "peer": true, "dependencies": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -13885,40 +14523,41 @@ "picomatch": "^2.2.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-config/node_modules/jest-validate": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-28.1.3.tgz", - "integrity": "sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "peer": true, "dependencies": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "camelcase": "^6.2.0", "chalk": "^4.0.0", - "jest-get-type": "^28.0.2", + "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^28.1.3" + "pretty-format": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-config/node_modules/jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "peer": true, "dependencies": { "@types/node": "*", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-config/node_modules/jest-worker/node_modules/supports-color": { @@ -13937,19 +14576,29 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/jest-config/node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10" + } + }, "node_modules/jest-diff": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", - "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "diff-sequences": "^28.1.1", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-diff/node_modules/chalk": { @@ -13969,33 +14618,33 @@ } }, "node_modules/jest-docblock": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-28.1.1.tgz", - "integrity": "sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, "peer": true, "dependencies": { "detect-newline": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-each": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-28.1.3.tgz", - "integrity": "sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, "peer": true, "dependencies": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "chalk": "^4.0.0", - "jest-get-type": "^28.0.2", - "jest-util": "^28.1.3", - "pretty-format": "^28.1.3" + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-each/node_modules/chalk": { @@ -14016,13 +14665,13 @@ } }, "node_modules/jest-each/node_modules/jest-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", - "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "peer": true, "dependencies": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -14030,7 +14679,7 @@ "picomatch": "^2.2.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-environment-jsdom": { @@ -14451,21 +15100,21 @@ } }, "node_modules/jest-environment-node": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-28.1.3.tgz", - "integrity": "sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "peer": true, "dependencies": { - "@jest/environment": "^28.1.3", - "@jest/fake-timers": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^28.1.3", - "jest-util": "^28.1.3" + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-environment-node/node_modules/chalk": { @@ -14486,13 +15135,13 @@ } }, "node_modules/jest-environment-node/node_modules/jest-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", - "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "peer": true, "dependencies": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -14500,16 +15149,16 @@ "picomatch": "^2.2.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-haste-map": { @@ -15001,32 +15650,32 @@ } }, "node_modules/jest-leak-detector": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-28.1.3.tgz", - "integrity": "sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, "peer": true, "dependencies": { - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz", - "integrity": "sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils/node_modules/chalk": { @@ -15046,23 +15695,23 @@ } }, "node_modules/jest-message-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", - "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^28.1.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-message-util/node_modules/chalk": { @@ -15082,28 +15731,64 @@ } }, "node_modules/jest-mock": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-28.1.3.tgz", - "integrity": "sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "peer": true, "dependencies": { - "@jest/types": "^28.1.3", - "@types/node": "*" + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "node_modules/jest-mock/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "engines": { - "node": ">=6" - }, - "peerDependencies": { + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-mock/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "peer": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { "jest-resolve": "*" }, "peerDependenciesMeta": { @@ -15143,27 +15828,27 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.3.tgz", - "integrity": "sha512-qa0QO2Q0XzQoNPouMbCc7Bvtsem8eQgVPNkwn9LnS+R2n8DaVDPL/U1gngC0LTl1RYXJU0uJa2BMC2DbTfFrHA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, "peer": true, "dependencies": { - "jest-regex-util": "^28.0.2", - "jest-snapshot": "^28.1.3" + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-resolve-dependencies/node_modules/jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true, "peer": true, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-resolve/node_modules/@jest/types": { @@ -15208,36 +15893,36 @@ } }, "node_modules/jest-runner": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-28.1.3.tgz", - "integrity": "sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, "peer": true, "dependencies": { - "@jest/console": "^28.1.3", - "@jest/environment": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "emittery": "^0.10.2", + "emittery": "^0.13.1", "graceful-fs": "^4.2.9", - "jest-docblock": "^28.1.1", - "jest-environment-node": "^28.1.3", - "jest-haste-map": "^28.1.3", - "jest-leak-detector": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-resolve": "^28.1.3", - "jest-runtime": "^28.1.3", - "jest-util": "^28.1.3", - "jest-watcher": "^28.1.3", - "jest-worker": "^28.1.3", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner/node_modules/chalk": { @@ -15258,70 +15943,70 @@ } }, "node_modules/jest-runner/node_modules/jest-haste-map": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", - "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "peer": true, "dependencies": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "optionalDependencies": { "fsevents": "^2.3.2" } }, "node_modules/jest-runner/node_modules/jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true, "peer": true, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner/node_modules/jest-resolve": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-28.1.3.tgz", - "integrity": "sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, "peer": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", + "jest-haste-map": "^29.7.0", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", + "resolve.exports": "^2.0.0", "slash": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner/node_modules/jest-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", - "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "peer": true, "dependencies": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -15329,40 +16014,41 @@ "picomatch": "^2.2.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner/node_modules/jest-validate": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-28.1.3.tgz", - "integrity": "sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "peer": true, "dependencies": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "camelcase": "^6.2.0", "chalk": "^4.0.0", - "jest-get-type": "^28.0.2", + "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^28.1.3" + "pretty-format": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner/node_modules/jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "peer": true, "dependencies": { "@types/node": "*", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner/node_modules/jest-worker/node_modules/supports-color": { @@ -15397,6 +16083,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/jest-runner/node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10" + } + }, "node_modules/jest-runner/node_modules/source-map-support": { "version": "0.5.13", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", @@ -15409,37 +16105,37 @@ } }, "node_modules/jest-runtime": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-28.1.3.tgz", - "integrity": "sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dev": true, "peer": true, "dependencies": { - "@jest/environment": "^28.1.3", - "@jest/fake-timers": "^28.1.3", - "@jest/globals": "^28.1.3", - "@jest/source-map": "^28.1.2", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", - "execa": "^5.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-mock": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-resolve": "^28.1.3", - "jest-snapshot": "^28.1.3", - "jest-util": "^28.1.3", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runtime/node_modules/chalk": { @@ -15460,70 +16156,70 @@ } }, "node_modules/jest-runtime/node_modules/jest-haste-map": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", - "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "peer": true, "dependencies": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "optionalDependencies": { "fsevents": "^2.3.2" } }, "node_modules/jest-runtime/node_modules/jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true, "peer": true, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runtime/node_modules/jest-resolve": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-28.1.3.tgz", - "integrity": "sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, "peer": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", + "jest-haste-map": "^29.7.0", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", + "resolve.exports": "^2.0.0", "slash": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runtime/node_modules/jest-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", - "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "peer": true, "dependencies": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -15531,40 +16227,41 @@ "picomatch": "^2.2.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runtime/node_modules/jest-validate": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-28.1.3.tgz", - "integrity": "sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "peer": true, "dependencies": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "camelcase": "^6.2.0", "chalk": "^4.0.0", - "jest-get-type": "^28.0.2", + "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^28.1.3" + "pretty-format": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runtime/node_modules/jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "peer": true, "dependencies": { "@types/node": "*", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runtime/node_modules/jest-worker/node_modules/supports-color": { @@ -15583,6 +16280,16 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/jest-runtime/node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10" + } + }, "node_modules/jest-runtime/node_modules/strip-bom": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", @@ -15607,38 +16314,35 @@ } }, "node_modules/jest-snapshot": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.3.tgz", - "integrity": "sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, "peer": true, "dependencies": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/babel__traverse": "^7.0.6", - "@types/prettier": "^2.1.5", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^28.1.3", + "expect": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-haste-map": "^28.1.3", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "natural-compare": "^1.4.0", - "pretty-format": "^28.1.3", - "semver": "^7.3.5" + "pretty-format": "^29.7.0", + "semver": "^7.5.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-snapshot/node_modules/chalk": { @@ -15658,50 +16362,14 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-snapshot/node_modules/jest-haste-map": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", - "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/types": "^28.1.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-snapshot/node_modules/jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", - "dev": true, - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, "node_modules/jest-snapshot/node_modules/jest-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", - "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "peer": true, "dependencies": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -15709,50 +16377,18 @@ "picomatch": "^2.2.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", - "dev": true, - "peer": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-transform-css": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jest-transform-css/-/jest-transform-css-4.0.1.tgz", - "integrity": "sha512-/rhrYXnLACL2rQ4ME6KtPGR2bKM27HDI6nRHGzGBrZXqkErN+PwxCz+wz6oflIf783szH8HWL0p5Iu7RXTSHYQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/jest-transform-css/-/jest-transform-css-6.0.1.tgz", + "integrity": "sha512-i78Pi2MW6vcdsUFSRx1kPbjbEIO0pBWwh1Y+PcDrLwTv/6e5p7fzsV/gxFW/SYMHS8DUvMdRVTwVCkA/y+t0iQ==", "dev": true, "dependencies": { "common-tags": "1.8.2", - "cosmiconfig": "7.0.1", "cross-spawn": "7.0.3", - "postcss-load-config": "2.0.0", + "postcss-load-config": "4.0.1", "postcss-modules": "4.3.1", "style-inject": "0.3.0" }, @@ -15760,45 +16396,45 @@ "postcss": "^8.4.12" } }, - "node_modules/jest-transform-css/node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/jest-transform-css/node_modules/postcss-load-config": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.0.0.tgz", - "integrity": "sha512-V5JBLzw406BB8UIfsAWSK2KSwIJ5yoEIVFb4gVkXci0QdKgA24jLmHZ/ghe/GgX0lJ0/D1uUK1ejhzEY94MChQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", "dev": true, "dependencies": { - "cosmiconfig": "^4.0.0", - "import-cwd": "^2.0.0" + "lilconfig": "^2.0.5", + "yaml": "^2.1.1" }, "engines": { - "node": ">= 4" + "node": ">= 14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } } }, - "node_modules/jest-transform-css/node_modules/postcss-load-config/node_modules/cosmiconfig": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-4.0.0.tgz", - "integrity": "sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ==", + "node_modules/jest-transform-css/node_modules/yaml": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz", + "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==", "dev": true, - "dependencies": { - "is-directory": "^0.3.1", - "js-yaml": "^3.9.0", - "parse-json": "^4.0.0", - "require-from-string": "^2.0.1" + "bin": { + "yaml": "bin.mjs" }, "engines": { - "node": ">=4" + "node": ">= 14" } }, "node_modules/jest-util": { @@ -15952,140 +16588,32 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/jest-watch-typeahead": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz", - "integrity": "sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==", + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, + "peer": true, "dependencies": { - "ansi-escapes": "^4.3.1", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", - "jest-regex-util": "^28.0.0", - "jest-watcher": "^28.0.0", - "slash": "^4.0.0", - "string-length": "^5.0.1", - "strip-ansi": "^7.0.1" + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "jest": "^27.0.0 || ^28.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-watch-typeahead/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/jest-watch-typeahead/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-watch-typeahead/node_modules/char-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.1.tgz", - "integrity": "sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==", - "dev": true, - "engines": { - "node": ">=12.20" - } - }, - "node_modules/jest-watch-typeahead/node_modules/jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", - "dev": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-watch-typeahead/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watch-typeahead/node_modules/string-length": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz", - "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==", - "dev": true, - "dependencies": { - "char-regex": "^2.0.0", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watch-typeahead/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/jest-watcher": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz", - "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==", - "dev": true, - "dependencies": { - "@jest/test-result": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.10.2", - "jest-util": "^28.1.3", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-watcher/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/jest-watcher/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -16098,12 +16626,13 @@ } }, "node_modules/jest-watcher/node_modules/jest-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", - "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, + "peer": true, "dependencies": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -16111,7 +16640,7 @@ "picomatch": "^2.2.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-worker": { @@ -16143,6 +16672,15 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/jiti": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, "node_modules/js-sdsl": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", @@ -16272,6 +16810,12 @@ "node": ">=4" } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, "node_modules/json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", @@ -16335,7 +16879,7 @@ "node_modules/jsonparse": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", "dev": true, "engines": [ "node >= 0.2.0" @@ -16396,6 +16940,15 @@ "node": ">=4.0" } }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -16424,9 +16977,9 @@ } }, "node_modules/known-css-properties": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.24.0.tgz", - "integrity": "sha512-RTSoaUAfLvpR357vWzAz/50Q/BmHfmE6ETSWfutT0AJiw10e6CmcdYRQJlLRd95B53D0Y2aD1jSxD3V3ySF+PA==", + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.29.0.tgz", + "integrity": "sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==", "dev": true }, "node_modules/language-subtag-registry": { @@ -16467,9 +17020,9 @@ } }, "node_modules/lilconfig": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz", - "integrity": "sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", "dev": true, "engines": { "node": ">=10" @@ -16482,131 +17035,228 @@ "dev": true }, "node_modules/lint-staged": { - "version": "12.3.7", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-12.3.7.tgz", - "integrity": "sha512-/S4D726e2GIsDVWIk1XGvheCaDm1SJRQp8efamZFWJxQMVEbOwSysp7xb49Oo73KYCdy97mIWinhlxcoNqIfIQ==", - "dev": true, - "dependencies": { - "cli-truncate": "^3.1.0", - "colorette": "^2.0.16", - "commander": "^8.3.0", - "debug": "^4.3.3", - "execa": "^5.1.1", - "lilconfig": "2.0.4", - "listr2": "^4.0.1", - "micromatch": "^4.0.4", - "normalize-path": "^3.0.0", - "object-inspect": "^1.12.0", - "pidtree": "^0.5.0", - "string-argv": "^0.3.1", - "supports-color": "^9.2.1", - "yaml": "^1.10.2" + "version": "15.2.2", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.2.tgz", + "integrity": "sha512-TiTt93OPh1OZOsb5B7k96A/ATl2AjIZo+vnzFZ6oHK5FuTk63ByDtxGQpHm+kFETjEWqgkF95M8FRXKR/LEBcw==", + "dev": true, + "dependencies": { + "chalk": "5.3.0", + "commander": "11.1.0", + "debug": "4.3.4", + "execa": "8.0.1", + "lilconfig": "3.0.0", + "listr2": "8.0.1", + "micromatch": "4.0.5", + "pidtree": "0.6.0", + "string-argv": "0.3.2", + "yaml": "2.3.4" }, "bin": { "lint-staged": "bin/lint-staged.js" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18.12.0" }, "funding": { "url": "https://opencollective.com/lint-staged" } }, + "node_modules/lint-staged/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/lint-staged/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", "dev": true, "engines": { - "node": ">= 12" + "node": ">=16" } }, - "node_modules/lint-staged/node_modules/supports-color": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.4.0.tgz", - "integrity": "sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==", + "node_modules/lint-staged/node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, "engines": { - "node": ">=12" + "node": ">=16.17" }, "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/listr2": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-4.0.5.tgz", - "integrity": "sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA==", + "node_modules/lint-staged/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", "dev": true, - "dependencies": { - "cli-truncate": "^2.1.0", - "colorette": "^2.0.16", - "log-update": "^4.0.0", - "p-map": "^4.0.0", - "rfdc": "^1.3.0", - "rxjs": "^7.5.5", - "through": "^2.3.8", - "wrap-ansi": "^7.0.0" + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/lint-staged/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/lilconfig": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", + "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/lint-staged/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, "engines": { "node": ">=12" }, - "peerDependencies": { - "enquirer": ">= 2.3.0 < 3" - }, - "peerDependenciesMeta": { - "enquirer": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/listr2/node_modules/cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "node_modules/lint-staged/node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dev": true, "dependencies": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" + "path-key": "^4.0.0" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/listr2/node_modules/slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "node_modules/lint-staged/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" + "mimic-fn": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/listr2/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/lint-staged/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "engines": { + "node": ">=12" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/lint-staged/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/yaml": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", + "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/listr2": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.0.1.tgz", + "integrity": "sha512-ovJXBXkKGfq+CwmKTjluEqFi3p4h8xvkxGQQAQan22YCgef4KZ1mKGjzfGh6PL6AW5Csw0QiQPNuQyH+6Xk3hA==", + "dev": true, + "dependencies": { + "cli-truncate": "^4.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.0.0", + "rfdc": "^1.3.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18.0.0" } }, + "node_modules/listr2/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true + }, "node_modules/load-json-file": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", @@ -16696,10 +17346,16 @@ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "dev": true }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, + "node_modules/lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", "dev": true }, "node_modules/lodash.memoize": { @@ -16714,16 +17370,34 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "node_modules/lodash.mergewith": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", + "dev": true + }, + "node_modules/lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==", + "dev": true + }, "node_modules/lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", "devOptional": true }, + "node_modules/lodash.startcase": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", + "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", + "dev": true + }, "node_modules/lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", "dev": true }, "node_modules/lodash.uniq": { @@ -16732,24 +17406,113 @@ "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", "dev": true }, + "node_modules/lodash.upperfirst": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", + "integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==", + "dev": true + }, "node_modules/log-update": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.0.0.tgz", + "integrity": "sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==", "dev": true, "dependencies": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" + "ansi-escapes": "^6.2.0", + "cli-cursor": "^4.0.0", + "slice-ansi": "^7.0.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" }, "engines": { - "node": ">=10" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-escapes": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz", + "integrity": "sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/log-update/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", + "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", + "dev": true, + "dependencies": { + "get-east-asian-width": "^1.0.0" + }, + "engines": { + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", + "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -16783,9 +17546,9 @@ } }, "node_modules/lz-string": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz", - "integrity": "sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", "dev": true, "bin": { "lz-string": "bin/bin.js" @@ -16908,64 +17671,12 @@ } }, "node_modules/meow": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", - "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", - "dev": true, - "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/meow/node_modules/normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/meow/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz", + "integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==", "dev": true, "engines": { - "node": ">=10" + "node": ">=16.10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -17075,20 +17786,6 @@ "node": ">=4" } }, - "node_modules/mini-create-react-context": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz", - "integrity": "sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dependencies": { - "@babel/runtime": "^7.12.1", - "tiny-warning": "^1.0.3" - }, - "peerDependencies": { - "prop-types": "^15.0.0", - "react": "^0.14.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, "node_modules/mini-css-extract-plugin": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.2.tgz", @@ -17168,15 +17865,6 @@ "node": ">= 6" } }, - "node_modules/minimist-options/node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/minipass": { "version": "3.1.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", @@ -17215,9 +17903,9 @@ } }, "node_modules/monaco-editor": { - "version": "0.31.1", - "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.31.1.tgz", - "integrity": "sha512-FYPwxGZAeP6mRRyrr5XTGHD9gRXVjy7GUzF4IPChnyt3fS5WrNxIkS8DNujWf6EQy0Zlzpxw8oTVE+mWI2/D1Q==" + "version": "0.44.0", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.44.0.tgz", + "integrity": "sha512-5SmjNStN6bSuSE5WPT2ZV+iYn1/yI9sd4Igtk23ChvqB7kDk9lZbB9F5frsuvpB+2njdIeGGFf2G4gbE6rCC9Q==" }, "node_modules/ms": { "version": "2.1.2", @@ -17299,6 +17987,12 @@ "tslib": "^2.0.3" } }, + "node_modules/node-abort-controller": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", + "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", + "dev": true + }, "node_modules/node-fetch": { "version": "2.6.7", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", @@ -17422,12 +18116,6 @@ "node": ">=0.10.0" } }, - "node_modules/normalize-selector": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/normalize-selector/-/normalize-selector-0.2.0.tgz", - "integrity": "sha1-0LFF62kRicY6eNIB3E/bEpPvDAM=", - "dev": true - }, "node_modules/normalize-url": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", @@ -17768,14 +18456,15 @@ } }, "node_modules/object.fromentries": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", - "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -17802,6 +18491,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/object.hasown": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", @@ -17944,21 +18647,6 @@ "node": ">=8" } }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/p-retry": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", @@ -18118,9 +18806,9 @@ } }, "node_modules/pidtree": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.5.0.tgz", - "integrity": "sha512-9nxspIM7OpZuhBxPg73Zvyq7j1QMPMPsGKTqRc2XOaFQauDvoNz9fM1Wdkjmeo7l9GXOZiRs97sPkuayl39wjA==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", "dev": true, "bin": { "pidtree": "bin/pidtree.js" @@ -18217,16 +18905,55 @@ "node": ">=4" } }, + "node_modules/playwright": { + "version": "1.42.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.42.1.tgz", + "integrity": "sha512-PgwB03s2DZBcNRoW+1w9E+VkLBxweib6KTXM0M3tkiT4jVxKSi6PmVJ591J+0u10LUrgxB7dLRbiJqO5s2QPMg==", + "dev": true, + "dependencies": { + "playwright-core": "1.42.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=16" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.42.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.42.1.tgz", + "integrity": "sha512-mxz6zclokgrke9p1vtdy/COWBH+eOZgYUVVU34C73M+4j4HLlQJHtfcqiqqxpP0o8HhMkflvfbquLX5dg6wlfA==", + "dev": true, + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/pn": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", "optional": true }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/postcss": { - "version": "8.4.33", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", - "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", "dev": true, "funding": [ { @@ -18245,7 +18972,7 @@ "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "source-map-js": "^1.2.0" }, "engines": { "node": "^10 || ^12 || >=14" @@ -18738,15 +19465,6 @@ } } }, - "node_modules/postcss-load-config/node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/postcss-loader": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", @@ -19384,19 +20102,29 @@ "dev": true }, "node_modules/postcss-scss": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.2.tgz", - "integrity": "sha512-xfdkU128CkKKKVAwkyt0M8OdnelJ3MRcIRAPPQkRpoPeuzWY3RIeg7piRCpZ79MK7Q16diLXMMAD9dN5mauPlQ==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz", + "integrity": "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-scss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "engines": { "node": ">=12.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, "peerDependencies": { - "postcss": "^8.3.3" + "postcss": "^8.4.29" } }, "node_modules/postcss-selector-not": { @@ -19432,12 +20160,12 @@ } }, "node_modules/postcss-sorting": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-sorting/-/postcss-sorting-7.0.1.tgz", - "integrity": "sha512-iLBFYz6VRYyLJEJsBJ8M3TCqNcckVzz4wFounSc5Oez35ogE/X+aoC5fFu103Ot7NyvjU3/xqIXn93Gp3kJk4g==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/postcss-sorting/-/postcss-sorting-8.0.2.tgz", + "integrity": "sha512-M9dkSrmU00t/jK7rF6BZSZauA5MAaBW4i5EnJXspMwt4iqTh/L9j6fgMnbElEOfyRyfLfVbIHj/R52zHzAPe1Q==", "dev": true, "peerDependencies": { - "postcss": "^8.3.9" + "postcss": "^8.4.20" } }, "node_modules/postcss-svgo": { @@ -19607,15 +20335,18 @@ } }, "node_modules/prettier": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz", - "integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", "dev": true, "bin": { - "prettier": "bin-prettier.js" + "prettier": "bin/prettier.cjs" }, "engines": { - "node": ">=10.13.0" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, "node_modules/prettier-linter-helpers": { @@ -19653,18 +20384,17 @@ } }, "node_modules/pretty-format": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", - "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/pretty-format/node_modules/ansi-styles": { @@ -19770,6 +20500,23 @@ "node": ">=6" } }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "peer": true + }, "node_modules/q": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", @@ -19781,11 +20528,11 @@ } }, "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.0.tgz", + "integrity": "sha512-trVZiI6RMOkO476zLGaBIzszOdFPnCCXHPG9kn0yuS1uz6xdVxPfZdB3vUig9pxPFDM9BRAgz/YUIVQ1/vuiUg==", "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" }, "engines": { "node": ">=0.6" @@ -19794,15 +20541,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", - "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", - "engines": { - "node": ">=0.4.x" - } - }, "node_modules/querystringify": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", @@ -19830,12 +20568,15 @@ ] }, "node_modules/quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", "dev": true, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/raf": { @@ -19894,13 +20635,47 @@ "node": ">= 0.8" } }, + "node_modules/rc-slider": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-10.5.0.tgz", + "integrity": "sha512-xiYght50cvoODZYI43v3Ylsqiw14+D7ELsgzR40boDZaya1HFa1Etnv9MDkQE8X/UrXAffwv2AcNAhslgYuDTw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.27.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-util": { + "version": "5.39.1", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.39.1.tgz", + "integrity": "sha512-OW/ERynNDgNr4y0oiFmtes3rbEamXw7GHGbkbNd9iRr7kgT03T6fT0b9WpJ3mbxKhyOcAHnGcIoh5u/cjrC2OQ==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "react-is": "^18.2.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-util/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, "node_modules/react": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", - "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "loose-envify": "^1.1.0" }, "engines": { "node": ">=0.10.0" @@ -19924,9 +20699,9 @@ } }, "node_modules/react-app-rewired": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/react-app-rewired/-/react-app-rewired-2.1.11.tgz", - "integrity": "sha512-zRIqJUPsCoPnfYtea3xgPbKR42vx0NoH5oo8R8FELXqzkjJHa39V6zD8CAdkLJoYL8V3JScWHAfKMZOzi1Ydmw==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/react-app-rewired/-/react-app-rewired-2.2.1.tgz", + "integrity": "sha512-uFQWTErXeLDrMzOJHKp0h8P1z0LV9HzPGsJ6adOtGlA/B9WfT6Shh4j2tLTTGlXOfiVx6w6iWpp7SOC5pvk+gA==", "dev": true, "dependencies": { "semver": "^5.6.0" @@ -19965,6 +20740,30 @@ "react-dom": "^16.8.5 || ^17.0.0 || ^18.0.0" } }, + "node_modules/react-beautiful-dnd/node_modules/react-redux": { + "version": "7.2.9", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.9.tgz", + "integrity": "sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==", + "dependencies": { + "@babel/runtime": "^7.15.4", + "@types/react-redux": "^7.1.20", + "hoist-non-react-statics": "^3.3.2", + "loose-envify": "^1.4.0", + "prop-types": "^15.7.2", + "react-is": "^17.0.2" + }, + "peerDependencies": { + "react": "^16.8.3 || ^17 || ^18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, "node_modules/react-copy-to-clipboard": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.1.0.tgz", @@ -20111,22 +20910,21 @@ } }, "node_modules/react-dom": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", - "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", "dependencies": { "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" + "scheduler": "^0.23.0" }, "peerDependencies": { - "react": "17.0.2" + "react": "^18.2.0" } }, "node_modules/react-error-boundary": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-4.0.12.tgz", - "integrity": "sha512-kJdxdEYlb7CPC1A0SeUY38cHpjuu6UkvzKiAmqmOFL21VRfMhOcWxTCBgLVCO0VEMh9JhFNcVaXlV4/BTpiwOA==", + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-4.0.13.tgz", + "integrity": "sha512-b6PwbdSv8XeOSYvjt8LpgpKrZ0yGdtZokYwkwV2wlcZbxgopHX/hgPl5VgpnoVOWd868n1hktM8Qm4b+02MiLQ==", "dependencies": { "@babel/runtime": "^7.12.5" }, @@ -20204,16 +21002,16 @@ } }, "node_modules/react-monaco-editor": { - "version": "0.47.0", - "resolved": "https://registry.npmjs.org/react-monaco-editor/-/react-monaco-editor-0.47.0.tgz", - "integrity": "sha512-uXZMzYJReIHSA41Qjka2LZckEEawPQC0smpeUgkUvyaMiT8y9qFodIcQtLmSUj3g7gd/6W15a73jBs1d6sr+Mw==", + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/react-monaco-editor/-/react-monaco-editor-0.55.0.tgz", + "integrity": "sha512-GdEP0Q3Rn1dczfKEEyY08Nes5plWwIYU4sWRBQO0+jsQWQsKMHKCC6+hPRwR7G/4aA3V/iU9jSmWPzVJYMVFSQ==", "dependencies": { "prop-types": "^15.8.1" }, "peerDependencies": { - "@types/react": "^17.x", - "monaco-editor": "^0.31.1", - "react": "^17.x" + "@types/react": ">=16 <= 18", + "monaco-editor": "^0.44.0", + "react": ">=16 <= 18" } }, "node_modules/react-popper": { @@ -20231,26 +21029,28 @@ } }, "node_modules/react-redux": { - "version": "7.2.6", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.6.tgz", - "integrity": "sha512-10RPdsz0UUrRL1NZE0ejTkucnclYSgXp5q+tB5SWx2qeG2ZJQJyymgAhwKy73yiL/13btfB6fPr+rgbMAaZIAQ==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.1.0.tgz", + "integrity": "sha512-6qoDzIO+gbrza8h3hjMA9aq4nwVFCKFtY2iLxCtVT38Swyy2C/dJCGBXHeHLtx6qlg/8qzc2MrhOeduf5K32wQ==", "dependencies": { - "@babel/runtime": "^7.15.4", - "@types/react-redux": "^7.1.20", - "hoist-non-react-statics": "^3.3.2", - "loose-envify": "^1.4.0", - "prop-types": "^15.7.2", - "react-is": "^17.0.2" + "@types/use-sync-external-store": "^0.0.3", + "use-sync-external-store": "^1.0.0" }, "peerDependencies": { - "react": "^16.8.3 || ^17" + "@types/react": "^18.2.25", + "react": "^18.0", + "react-native": ">=0.69", + "redux": "^5.0.0" }, "peerDependenciesMeta": { - "react-dom": { + "@types/react": { "optional": true }, "react-native": { "optional": true + }, + "redux": { + "optional": true } } }, @@ -20264,15 +21064,14 @@ } }, "node_modules/react-router": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.2.1.tgz", - "integrity": "sha512-lIboRiOtDLFdg1VTemMwud9vRVuOCZmUIT/7lUoZiSpPODiiH1UQlfXy+vPLC/7IWdFYnhRwAyNqA/+I7wnvKQ==", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", + "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", "dependencies": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", "hoist-non-react-statics": "^3.1.0", "loose-envify": "^1.3.1", - "mini-create-react-context": "^0.4.0", "path-to-regexp": "^1.7.0", "prop-types": "^15.6.2", "react-is": "^16.6.0", @@ -20284,15 +21083,15 @@ } }, "node_modules/react-router-dom": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.0.tgz", - "integrity": "sha512-ObVBLjUZsphUUMVycibxgMdh5jJ1e3o+KpAZBVeHcNQZ4W+uUGGWsokurzlF4YOldQYRQL4y6yFRWM4m3svmuQ==", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", + "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", "dependencies": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", "loose-envify": "^1.3.1", "prop-types": "^15.6.2", - "react-router": "5.2.1", + "react-router": "5.3.4", "tiny-invariant": "^1.0.2", "tiny-warning": "^1.0.0" }, @@ -20540,6 +21339,18 @@ } } }, + "node_modules/react-scripts/node_modules/@jest/schemas": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", + "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.24.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, "node_modules/react-scripts/node_modules/@jest/source-map": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", @@ -20626,6 +21437,12 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/react-scripts/node_modules/@sinclair/typebox": { + "version": "0.24.51", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", + "dev": true + }, "node_modules/react-scripts/node_modules/@sinonjs/fake-timers": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", @@ -20964,177 +21781,473 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/react-scripts/node_modules/jest-leak-detector": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", - "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", + "node_modules/react-scripts/node_modules/jest-leak-detector": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", + "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", + "dev": true, + "dependencies": { + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/react-scripts/node_modules/jest-matcher-utils": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/react-scripts/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/react-scripts/node_modules/jest-mock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", + "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/react-scripts/node_modules/jest-resolve-dependencies": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", + "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-snapshot": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/react-scripts/node_modules/jest-runner": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", + "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", + "dev": true, + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-leak-detector": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "source-map-support": "^0.5.6", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/react-scripts/node_modules/jest-runtime": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", + "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", + "dev": true, + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/globals": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "execa": "^5.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/react-scripts/node_modules/jest-snapshot": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", + "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.7.2", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.0.0", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^27.5.1", + "semver": "^7.3.2" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/react-scripts/node_modules/jest-watch-typeahead": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz", + "integrity": "sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.3.1", + "chalk": "^4.0.0", + "jest-regex-util": "^28.0.0", + "jest-watcher": "^28.0.0", + "slash": "^4.0.0", + "string-length": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "jest": "^27.0.0 || ^28.0.0" + } + }, + "node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/@jest/console": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", + "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", + "dev": true, + "dependencies": { + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^28.1.3", + "jest-util": "^28.1.3", + "slash": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/@jest/console/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/@jest/test-result": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", + "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", + "dev": true, + "dependencies": { + "@jest/console": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/@jest/types": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", + "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/@types/yargs": { + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/emittery": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", + "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/jest-message-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", + "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^28.1.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^28.1.3", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/jest-message-util/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/jest-regex-util": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", + "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/jest-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "dev": true, + "dependencies": { + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/jest-watcher": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz", + "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==", "dev": true, "dependencies": { - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" + "@jest/test-result": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.10.2", + "jest-util": "^28.1.3", + "string-length": "^4.0.1" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "node_modules/react-scripts/node_modules/jest-matcher-utils": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", - "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/jest-watcher/node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=10" } }, - "node_modules/react-scripts/node_modules/jest-message-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", - "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/jest-watcher/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.5.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" + "ansi-regex": "^5.0.1" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=8" } }, - "node_modules/react-scripts/node_modules/jest-mock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", - "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + "node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/pretty-format": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", + "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", "dev": true, "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*" + "@jest/schemas": "^28.1.3", + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "node_modules/react-scripts/node_modules/jest-resolve-dependencies": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", - "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", + "node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", "dev": true, - "dependencies": { - "@jest/types": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-snapshot": "^27.5.1" - }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/react-scripts/node_modules/jest-runner": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", - "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", + "node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/string-length": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz", + "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==", "dev": true, "dependencies": { - "@jest/console": "^27.5.1", - "@jest/environment": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^27.5.1", - "jest-environment-jsdom": "^27.5.1", - "jest-environment-node": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-leak-detector": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "source-map-support": "^0.5.6", - "throat": "^6.0.1" + "char-regex": "^2.0.0", + "strip-ansi": "^7.0.1" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/react-scripts/node_modules/jest-runtime": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", - "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", + "node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/string-length/node_modules/char-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.1.tgz", + "integrity": "sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==", "dev": true, - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/globals": "^27.5.1", - "@jest/source-map": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "execa": "^5.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-mock": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=12.20" } }, - "node_modules/react-scripts/node_modules/jest-snapshot": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", - "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", + "node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "dependencies": { - "@babel/core": "^7.7.2", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.0.0", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^27.5.1", - "graceful-fs": "^4.2.9", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-util": "^27.5.1", - "natural-compare": "^1.4.0", - "pretty-format": "^27.5.1", - "semver": "^7.3.2" + "ansi-regex": "^6.0.1" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, "node_modules/react-scripts/node_modules/jest-watcher": { @@ -21275,12 +22388,12 @@ } }, "node_modules/react-virtualized-auto-sizer": { - "version": "1.0.20", - "resolved": "https://registry.npmjs.org/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.20.tgz", - "integrity": "sha512-OdIyHwj4S4wyhbKHOKM1wLSj/UDXm839Z3Cvfg2a9j+He6yDa6i5p0qQvEiCnyQlGO/HyfSnigQwuxvYalaAXA==", + "version": "1.0.24", + "resolved": "https://registry.npmjs.org/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.24.tgz", + "integrity": "sha512-3kCn7N9NEb3FlvJrSHWGQ4iVl+ydQObq2fHMn12i5wbtm74zHOPhz/i64OL3c1S1vi9i2GXtZqNqUJTQ+BnNfg==", "peerDependencies": { - "react": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0-rc", - "react-dom": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0-rc" + "react": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0", + "react-dom": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0" } }, "node_modules/react-window": { @@ -21299,63 +22412,160 @@ "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/read-pkg": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-6.0.0.tgz", + "integrity": "sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^3.0.2", + "parse-json": "^5.2.0", + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-8.0.0.tgz", + "integrity": "sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==", + "dev": true, + "dependencies": { + "find-up": "^5.0.0", + "read-pkg": "^6.0.0", + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "dependencies": { - "pify": "^2.3.0" + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" + "p-limit": "^3.0.2" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", "dev": true, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" } }, "node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", "dev": true, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/readable-stream": { @@ -21495,15 +22705,25 @@ "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==", "dev": true }, + "node_modules/regexp-tree": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", + "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", + "dev": true, + "bin": { + "regexp-tree": "bin/regexp-tree" + } + }, "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -21845,23 +23065,20 @@ "node": ">=4" } }, - "node_modules/resolve-global": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", - "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", - "dev": true, - "dependencies": { - "global-dirs": "^0.1.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/resolve-pathname": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, "node_modules/resolve-url-loader": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz", @@ -21923,25 +23140,19 @@ } }, "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", "dev": true, "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" }, "engines": { - "node": ">=8" - } - }, - "node_modules/ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true, - "engines": { - "node": ">=0.12" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/retry": { @@ -21964,9 +23175,9 @@ } }, "node_modules/rfdc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", - "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz", + "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==", "dev": true }, "node_modules/rimraf": { @@ -22071,23 +23282,14 @@ "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" }, - "node_modules/rxjs": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz", - "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==", - "dev": true, - "dependencies": { - "tslib": "^2.1.0" - } - }, "node_modules/safe-array-concat": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", - "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", "dev": true, "dependencies": { - "call-bind": "^1.0.5", - "get-intrinsic": "^1.2.2", + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, @@ -22125,24 +23327,27 @@ ] }, "node_modules/safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", + "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", "dev": true, "dependencies": { - "ret": "~0.1.10" + "regexp-tree": "~0.1.1" } }, "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", "is-regex": "^1.1.4" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -22159,18 +23364,20 @@ "dev": true }, "node_modules/sass": { - "version": "1.32.8", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.32.8.tgz", - "integrity": "sha512-Sl6mIeGpzjIUZqvKnKETfMf0iDAswD9TNlv13A7aAF3XZlRPMq4VvJWBC2N2DXbp94MQVdNSFG6LfF/iOXrPHQ==", + "version": "1.72.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.72.0.tgz", + "integrity": "sha512-Gpczt3WA56Ly0Mn8Sl21Vj94s1axi9hDIzDFn9Ph9x3C3p4nNyvsqJoQyVXKou6cBlfFWEgRW4rT8Tb4i3XnVA==", "dev": true, "dependencies": { - "chokidar": ">=2.0.0 <4.0.0" + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" }, "bin": { "sass": "sass.js" }, "engines": { - "node": ">=8.9.0" + "node": ">=14.0.0" } }, "node_modules/sass-loader": { @@ -22230,12 +23437,11 @@ } }, "node_modules/scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "loose-envify": "^1.1.0" } }, "node_modules/schema-utils": { @@ -22306,9 +23512,9 @@ } }, "node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "devOptional": true, "dependencies": { "lru-cache": "^6.0.0" @@ -22479,15 +23685,16 @@ "optional": true }, "node_modules/set-function-length": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz", - "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dependencies": { - "define-data-property": "^1.1.1", + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.2", + "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.1" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -22549,13 +23756,17 @@ } }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -22734,9 +23945,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", "dev": true, "engines": { "node": ">=0.10.0" @@ -22775,17 +23986,6 @@ "node": ">=0.10.0" } }, - "node_modules/source-map-resolve": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", - "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", - "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", - "dev": true, - "dependencies": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0" - } - }, "node_modules/source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", @@ -22865,27 +24065,18 @@ "wbuf": "^1.7.3" } }, - "node_modules/specificity": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.4.1.tgz", - "integrity": "sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==", - "dev": true, - "bin": { - "specificity": "bin/specificity" - } - }, "node_modules/split.js": { "version": "1.6.5", "resolved": "https://registry.npmjs.org/split.js/-/split.js-1.6.5.tgz", "integrity": "sha512-mPTnGCiS/RiuTNsVhCm9De9cCAUsrNFFviRbADdKiiV+Kk8HKp/0fWu7Kr8pi3/yBmsqLFHuXGT9UUZ+CNLwFw==" }, "node_modules/split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", "dev": true, - "dependencies": { - "readable-stream": "^3.0.0" + "engines": { + "node": ">= 10.x" } }, "node_modules/sprintf-js": { @@ -22999,9 +24190,9 @@ "devOptional": true }, "node_modules/string-argv": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", - "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", "dev": true, "engines": { "node": ">=0.6.19" @@ -23084,14 +24275,15 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -23101,14 +24293,14 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -23259,130 +24451,193 @@ } }, "node_modules/stylelint": { - "version": "14.3.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.3.0.tgz", - "integrity": "sha512-PZXSwtJe4f4qBPWBwAbHL0M0Qjrv8iHN+cLpUNsffaVMS3YzpDDRI73+2lsqLAYfQEzxRwpll6BDKImREbpHWA==", + "version": "15.11.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.11.0.tgz", + "integrity": "sha512-78O4c6IswZ9TzpcIiQJIN49K3qNoXTM8zEJzhaTE/xRTCZswaovSEVIa/uwbOltZrk16X4jAxjaOhzz/hTm1Kw==", "dev": true, "dependencies": { + "@csstools/css-parser-algorithms": "^2.3.1", + "@csstools/css-tokenizer": "^2.2.0", + "@csstools/media-query-list-parser": "^2.1.4", + "@csstools/selector-specificity": "^3.0.0", "balanced-match": "^2.0.0", - "colord": "^2.9.2", - "cosmiconfig": "^7.0.1", - "debug": "^4.3.3", - "execall": "^2.0.0", - "fast-glob": "^3.2.11", - "fastest-levenshtein": "^1.0.12", - "file-entry-cache": "^6.0.1", - "get-stdin": "^8.0.0", + "colord": "^2.9.3", + "cosmiconfig": "^8.2.0", + "css-functions-list": "^3.2.1", + "css-tree": "^2.3.1", + "debug": "^4.3.4", + "fast-glob": "^3.3.1", + "fastest-levenshtein": "^1.0.16", + "file-entry-cache": "^7.0.0", "global-modules": "^2.0.0", "globby": "^11.1.0", "globjoin": "^0.1.4", - "html-tags": "^3.1.0", - "ignore": "^5.2.0", + "html-tags": "^3.3.1", + "ignore": "^5.2.4", "import-lazy": "^4.0.0", "imurmurhash": "^0.1.4", "is-plain-object": "^5.0.0", - "known-css-properties": "^0.24.0", + "known-css-properties": "^0.29.0", "mathml-tag-names": "^2.1.3", - "meow": "^9.0.0", - "micromatch": "^4.0.4", + "meow": "^10.1.5", + "micromatch": "^4.0.5", "normalize-path": "^3.0.0", - "normalize-selector": "^0.2.0", "picocolors": "^1.0.0", - "postcss": "^8.4.5", - "postcss-media-query-parser": "^0.2.3", + "postcss": "^8.4.28", "postcss-resolve-nested-selector": "^0.1.1", "postcss-safe-parser": "^6.0.0", - "postcss-selector-parser": "^6.0.9", + "postcss-selector-parser": "^6.0.13", "postcss-value-parser": "^4.2.0", "resolve-from": "^5.0.0", - "specificity": "^0.4.1", "string-width": "^4.2.3", "strip-ansi": "^6.0.1", "style-search": "^0.1.0", - "supports-hyperlinks": "^2.2.0", + "supports-hyperlinks": "^3.0.0", "svg-tags": "^1.0.0", - "table": "^6.8.0", - "v8-compile-cache": "^2.3.0", - "write-file-atomic": "^4.0.0" + "table": "^6.8.1", + "write-file-atomic": "^5.0.1" }, "bin": { - "stylelint": "bin/stylelint.js" + "stylelint": "bin/stylelint.mjs" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": "^14.13.1 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/stylelint" } }, - "node_modules/stylelint-config-prettier": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/stylelint-config-prettier/-/stylelint-config-prettier-9.0.3.tgz", - "integrity": "sha512-5n9gUDp/n5tTMCq1GLqSpA30w2sqWITSSEiAWQlpxkKGAUbjcemQ0nbkRvRUa0B1LgD3+hCvdL7B1eTxy1QHJg==", + "node_modules/stylelint-order": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/stylelint-order/-/stylelint-order-6.0.4.tgz", + "integrity": "sha512-0UuKo4+s1hgQ/uAxlYU4h0o0HS4NiQDud0NAUNI0aa8FJdmYHA5ZZTFHiV5FpmE3071e9pZx5j0QpVJW5zOCUA==", "dev": true, - "bin": { - "stylelint-config-prettier": "bin/check.js", - "stylelint-config-prettier-check": "bin/check.js" + "dependencies": { + "postcss": "^8.4.32", + "postcss-sorting": "^8.0.2" + }, + "peerDependencies": { + "stylelint": "^14.0.0 || ^15.0.0 || ^16.0.1" + } + }, + "node_modules/stylelint-prettier": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/stylelint-prettier/-/stylelint-prettier-4.1.0.tgz", + "integrity": "sha512-dd653q/d1IfvsSQshz1uAMe+XDm6hfM/7XiFH0htYY8Lse/s5ERTg7SURQehZPwVvm/rs7AsFhda9EQ2E9TS0g==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0" }, "engines": { - "node": ">= 12" + "node": "^14.17.0 || >=16.0.0" }, "peerDependencies": { - "stylelint": ">=11.0.0" + "prettier": ">=3.0.0", + "stylelint": ">=15.8.0" } }, - "node_modules/stylelint-order": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/stylelint-order/-/stylelint-order-5.0.0.tgz", - "integrity": "sha512-OWQ7pmicXufDw5BlRqzdz3fkGKJPgLyDwD1rFY3AIEfIH/LQY38Vu/85v8/up0I+VPiuGRwbc2Hg3zLAsJaiyw==", + "node_modules/stylelint-scss": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-5.3.2.tgz", + "integrity": "sha512-4LzLaayFhFyneJwLo0IUa8knuIvj+zF0vBFueQs4e3tEaAMIQX8q5th8ziKkgOavr6y/y9yoBe+RXN/edwLzsQ==", "dev": true, "dependencies": { - "postcss": "^8.3.11", - "postcss-sorting": "^7.0.1" + "known-css-properties": "^0.29.0", + "postcss-media-query-parser": "^0.2.3", + "postcss-resolve-nested-selector": "^0.1.1", + "postcss-selector-parser": "^6.0.13", + "postcss-value-parser": "^4.2.0" }, "peerDependencies": { - "stylelint": "^14.0.0" + "stylelint": "^14.5.1 || ^15.0.0" } }, - "node_modules/stylelint-prettier": { + "node_modules/stylelint/node_modules/@csstools/selector-specificity": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.0.2.tgz", + "integrity": "sha512-RpHaZ1h9LE7aALeQXmXrJkRG84ZxIsctEN2biEUmFyKpzFM3zZ35eUMcIzZFsw/2olQE6v69+esEqU2f1MKycg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^6.0.13" + } + }, + "node_modules/stylelint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/stylelint/node_modules/balanced-match": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/stylelint-prettier/-/stylelint-prettier-2.0.0.tgz", - "integrity": "sha512-jvT3G+9lopkeB0ARmDPszyfaOnvnIF+30QCjZxyt7E6fynI1T9mOKgYDNb9bXX17M7PXMZaX3j/26wqakjp1tw==", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", + "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", + "dev": true + }, + "node_modules/stylelint/node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", "dev": true, "dependencies": { - "prettier-linter-helpers": "^1.0.0" + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" }, "peerDependencies": { - "prettier": ">=2.0.0", - "stylelint": ">=14.0.0" + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/stylelint-scss": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-4.0.0.tgz", - "integrity": "sha512-lIRhPqtI6I065EJ6aI4mWKsmQt8Krnu6aF9XSL9s8Nd2f/cDKImST0T9TfjnUul3ReKYWozkG9dlpNTZH2FB9w==", + "node_modules/stylelint/node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", "dev": true, "dependencies": { - "lodash": "^4.17.15", - "postcss-media-query-parser": "^0.2.3", - "postcss-resolve-nested-selector": "^0.1.1", - "postcss-selector-parser": "^6.0.6", - "postcss-value-parser": "^4.1.0" + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" }, - "peerDependencies": { - "stylelint": "^14.0.0" + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/stylelint/node_modules/file-entry-cache": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-7.0.2.tgz", + "integrity": "sha512-TfW7/1iI4Cy7Y8L6iqNdZQVvdXn0f8B4QcIXmkIbtTIe/Okm/nSlHb4IwGzRVOd3WfSieCgvf5cMzEfySAIl0g==", + "dev": true, + "dependencies": { + "flat-cache": "^3.2.0" + }, + "engines": { + "node": ">=12.0.0" } }, - "node_modules/stylelint/node_modules/balanced-match": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", - "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", - "dev": true - }, "node_modules/stylelint/node_modules/hosted-git-info": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", @@ -23395,6 +24650,18 @@ "node": ">=10" } }, + "node_modules/stylelint/node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/stylelint/node_modules/is-plain-object": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", @@ -23404,27 +24671,45 @@ "node": ">=0.10.0" } }, + "node_modules/stylelint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/stylelint/node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "dev": true + }, "node_modules/stylelint/node_modules/meow": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", - "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", + "version": "10.1.5", + "resolved": "https://registry.npmjs.org/meow/-/meow-10.1.5.tgz", + "integrity": "sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==", "dev": true, "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize": "^1.2.0", + "@types/minimist": "^1.2.2", + "camelcase-keys": "^7.0.0", + "decamelize": "^5.0.0", "decamelize-keys": "^1.1.0", "hard-rejection": "^2.1.0", "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" + "normalize-package-data": "^3.0.2", + "read-pkg-up": "^8.0.0", + "redent": "^4.0.0", + "trim-newlines": "^4.0.2", + "type-fest": "^1.2.2", + "yargs-parser": "^20.2.9" }, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -23461,6 +24746,22 @@ "postcss": "^8.3.3" } }, + "node_modules/stylelint/node_modules/redent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz", + "integrity": "sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==", + "dev": true, + "dependencies": { + "indent-string": "^5.0.0", + "strip-indent": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/stylelint/node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -23470,10 +24771,50 @@ "node": ">=8" } }, + "node_modules/stylelint/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/stylelint/node_modules/strip-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", + "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylelint/node_modules/supports-hyperlinks": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.0.0.tgz", + "integrity": "sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=14.18" + } + }, "node_modules/stylelint/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", "dev": true, "engines": { "node": ">=10" @@ -23482,6 +24823,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/stylelint/node_modules/write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -23495,9 +24849,9 @@ } }, "node_modules/supports-hyperlinks": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", - "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", "dev": true, "dependencies": { "has-flag": "^4.0.0", @@ -23639,15 +24993,31 @@ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "devOptional": true }, + "node_modules/synckit": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz", + "integrity": "sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==", + "dev": true, + "dependencies": { + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, "node_modules/tabbable": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==" }, "node_modules/table": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz", - "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==", + "version": "6.8.2", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz", + "integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==", "dev": true, "dependencies": { "ajv": "^8.0.1", @@ -23719,27 +25089,6 @@ "node": ">=10.13.0" } }, - "node_modules/tailwindcss/node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/tailwindcss/node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -23931,12 +25280,15 @@ } }, "node_modules/text-extensions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", - "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-2.4.0.tgz", + "integrity": "sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==", "dev": true, "engines": { - "node": ">=0.10" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/text-table": { @@ -23954,7 +25306,7 @@ "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "dev": true }, "node_modules/through2": { @@ -24072,12 +25424,15 @@ "optional": true }, "node_modules/trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.1.1.tgz", + "integrity": "sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==", "dev": true, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/tryer": { @@ -24086,33 +25441,45 @@ "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", "dev": true }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, "node_modules/ts-jest": { - "version": "28.0.7", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-28.0.7.tgz", - "integrity": "sha512-wWXCSmTwBVmdvWrOpYhal79bDpioDy4rTT+0vyUnE3ZzM7LOAAGG9NXwzkEL/a516rQEgnMmS/WKP9jBPCVJyA==", + "version": "29.1.2", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.2.tgz", + "integrity": "sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==", "dev": true, "dependencies": { "bs-logger": "0.x", "fast-json-stable-stringify": "2.x", - "jest-util": "^28.0.0", - "json5": "^2.2.1", + "jest-util": "^29.0.0", + "json5": "^2.2.3", "lodash.memoize": "4.x", "make-error": "1.x", - "semver": "7.x", + "semver": "^7.5.3", "yargs-parser": "^21.0.1" }, "bin": { "ts-jest": "cli.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^16.10.0 || ^18.0.0 || >=20.0.0" }, "peerDependencies": { "@babel/core": ">=7.0.0-beta.0 <8", - "@jest/types": "^28.0.0", - "babel-jest": "^28.0.0", - "jest": "^28.0.0", - "typescript": ">=4.3" + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3 <6" }, "peerDependenciesMeta": { "@babel/core": { @@ -24146,12 +25513,12 @@ } }, "node_modules/ts-jest/node_modules/jest-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", - "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "dependencies": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -24159,7 +25526,7 @@ "picomatch": "^2.2.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/ts-jest/node_modules/yargs-parser": { @@ -24176,6 +25543,8 @@ "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz", "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "arg": "^4.1.0", "create-require": "^1.1.0", @@ -24198,13 +25567,13 @@ } }, "node_modules/tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, "dependencies": { "@types/json5": "^0.0.29", - "json5": "^1.0.1", + "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } @@ -24312,29 +25681,30 @@ } }, "node_modules/typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" } }, "node_modules/typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -24344,16 +25714,17 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -24363,14 +25734,20 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -24386,16 +25763,16 @@ } }, "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.3.tgz", + "integrity": "sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==", "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=14.17" } }, "node_modules/unbox-primitive": { @@ -24453,6 +25830,18 @@ "node": ">=4" } }, + "node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/unique-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", @@ -24466,12 +25855,20 @@ } }, "node_modules/universal-cookie": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/universal-cookie/-/universal-cookie-6.1.1.tgz", - "integrity": "sha512-33S9x3CpdUnnjwTNs2Fgc41WGve2tdLtvaK2kPSbZRc5pGpz2vQFbRWMxlATsxNNe/Cy8SzmnmbuBM85jpZPtA==", + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/universal-cookie/-/universal-cookie-6.1.3.tgz", + "integrity": "sha512-AETYRrhpRgl9T1YtnODmQE32G81U3A+f3HO3ZeK7efbXqe3x+RNOW4RTpV0iff7zJWhGYJA6EI0Mm+w50aFTAw==", "dependencies": { - "@types/cookie": "^0.5.1", - "cookie": "^0.5.0" + "@types/cookie": "^0.6.0", + "cookie": "^0.6.0" + } + }, + "node_modules/universal-cookie/node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "engines": { + "node": ">= 0.6" } }, "node_modules/universalify": { @@ -24562,12 +25959,12 @@ } }, "node_modules/url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.3.tgz", + "integrity": "sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==", "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" + "punycode": "^1.4.1", + "qs": "^6.11.2" } }, "node_modules/url-parse": { @@ -24581,9 +25978,9 @@ } }, "node_modules/url/node_modules/punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" }, "node_modules/use-memo-one": { "version": "1.1.3", @@ -24615,6 +26012,14 @@ } } }, + "node_modules/use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -24642,14 +26047,6 @@ "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", "dev": true }, - "node_modules/utility-types": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz", - "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==", - "engines": { - "node": ">= 4" - } - }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -24669,12 +26066,6 @@ "uuid": "bin/uuid" } }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, "node_modules/v8-to-istanbul": { "version": "9.2.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", @@ -25170,16 +26561,16 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", - "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.6", - "call-bind": "^1.0.5", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.1" + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -25480,17 +26871,82 @@ } }, "node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", "dev": true, "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", + "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", + "dev": true + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz", + "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==", + "dev": true, + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/wrappy": { @@ -25504,6 +26960,7 @@ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, + "peer": true, "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -25606,16 +27063,16 @@ } }, "node_modules/ydb-ui-components": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/ydb-ui-components/-/ydb-ui-components-3.6.0.tgz", - "integrity": "sha512-zM1B98Fr3iF/MIpe+wS0tGju2fJuzXJ9/+9LVBM8Ja4+2yie99xbVXkC3jDtkRIqka1viI7E8zbrPIYeIRneZg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ydb-ui-components/-/ydb-ui-components-4.0.0.tgz", + "integrity": "sha512-beNwE3AR7VSXP1kXu3Ap38bRo868JVHtmRyJxd3F4pIPrXkEei83lEp1lYdvbrl0GHuY6hWWXstXYJlwxq1exg==", "dependencies": { - "@gravity-ui/i18n": "^1.0.0", - "bem-cn-lite": "^4.1.0", - "react-list": "^0.8.17" + "@bem-react/classname": "^1.6.0", + "react-list": "^0.8.17", + "tslib": "^2.6.2" }, "peerDependencies": { - "@gravity-ui/uikit": "^5.0.0", + "@gravity-ui/uikit": "^6.0.0", "react": "^16.0.0 || ^17.0.0 || ^18.0.0", "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0" } @@ -25625,6 +27082,8 @@ "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=6" } diff --git a/package.json b/package.json index 082b057f22..b4cb458991 100644 --- a/package.json +++ b/package.json @@ -10,45 +10,45 @@ "url": "git@github.com:ydb-platform/ydb-embedded-ui.git" }, "dependencies": { + "@bem-react/classname": "^1.6.0", "@gravity-ui/axios-wrapper": "^1.4.1", - "@gravity-ui/chartkit": "^4.23.0", - "@gravity-ui/components": "^2.12.0", - "@gravity-ui/date-utils": "^1.4.2", - "@gravity-ui/i18n": "^1.2.0", - "@gravity-ui/icons": "^2.8.1", - "@gravity-ui/navigation": "^1.9.0", - "@gravity-ui/paranoid": "^1.4.0", - "@gravity-ui/react-data-table": "^1.2.0", - "@gravity-ui/uikit": "^5.30.1", + "@gravity-ui/chartkit": "^5.2.2", + "@gravity-ui/components": "^3.4.1", + "@gravity-ui/date-utils": "^2.1.0", + "@gravity-ui/i18n": "^1.4.0", + "@gravity-ui/icons": "^2.9.1", + "@gravity-ui/navigation": "^2.5.0", + "@gravity-ui/paranoid": "^1.4.1", + "@gravity-ui/react-data-table": "^2.0.1", + "@gravity-ui/uikit": "^6.8.0", "@gravity-ui/websql-autocomplete": "^8.0.2", - "@reduxjs/toolkit": "^2.2.1", - "axios": "^1.6.7", - "bem-cn-lite": "^4.1.0", + "@reduxjs/toolkit": "^2.2.3", + "axios": "^1.6.8", "colord": "^2.9.3", "copy-to-clipboard": "^3.3.3", "crc-32": "^1.2.2", "history": "^4.10.1", - "lodash": "^4.17.11", - "monaco-editor": "^0.31.1", + "lodash": "^4.17.21", + "monaco-editor": "^0.44.0", "numeral": "^2.0.6", "path-to-regexp": "^3.0.0", - "qs": "^6.11.0", - "react-error-boundary": "^4.0.12", + "qs": "^6.12.0", + "react-error-boundary": "^4.0.13", "react-helmet-async": "2.0.4", "react-json-inspector": "^7.1.1", - "react-list": "^0.8.11", - "react-monaco-editor": "^0.47.0", - "react-redux": "^7.2.6", - "react-router": "^5.2.1", - "react-router-dom": "^5.3.0", + "react-list": "^0.8.17", + "react-monaco-editor": "^0.55.0", + "react-redux": "^9.1.0", + "react-router": "^5.3.4", + "react-router-dom": "^5.3.4", "react-split": "^2.0.14", "redux": "^5.0.1", "redux-location-state": "^2.8.2", "tslib": "^2.6.2", - "url": "^0.11.0", + "url": "^0.11.3", "use-query-params": "^2.2.1", "web-vitals": "^1.1.2", - "ydb-ui-components": "^3.6.0" + "ydb-ui-components": "^4.0.0" }, "scripts": { "analyze": "source-map-explorer 'build/static/js/*.js'", @@ -62,14 +62,14 @@ "lint:js": "eslint --ext .js,.jsx,.ts,.tsx .", "lint:styles": "stylelint 'src/**/*.{css,scss}'", "lint:other": "npm run prettier -- --check", - "prettier": "prettier --check '**/*.{json,yaml,yml,md}'", + "prettier": "prettier '**/*.{json,yaml,yml,md}'", "unimported": "npx unimported --no-cache", "package": "rm -rf dist && tsc -p tsconfig.package.json && copyfiles -u 1 'src/**/*.{css,scss,svg}' dist", "test": "react-app-rewired test", "eject": "react-scripts eject", "prepublishOnly": "npm run package", "typecheck": "tsc --noEmit", - "prepare": "husky install", + "prepare": "husky", "test:e2e:install": "npx playwright install --with-deps chromium", "test:e2e": "npx playwright test --config=playwright.config.ts" }, @@ -103,7 +103,8 @@ "testEnvironment": "jsdom", "moduleNameMapper": { "\\.(css|less|scss|sass)$": "jest-transform-css", - "^axios$": "axios/dist/node/axios.cjs" + "^axios$": "axios/dist/node/axios.cjs", + "^@gravity-ui/uikit/toaster-singleton-react-18$": "@gravity-ui/uikit/build/cjs/toaster-singleton-react-18.js" } }, "browserslist": { @@ -119,51 +120,53 @@ ] }, "devDependencies": { - "@commitlint/cli": "^15.0.0", - "@commitlint/config-conventional": "^15.0.0", - "@gravity-ui/eslint-config": "^1.0.2", - "@gravity-ui/prettier-config": "^1.0.1", - "@gravity-ui/stylelint-config": "^1.0.1", + "@commitlint/cli": "^19.2.1", + "@commitlint/config-conventional": "^19.1.0", + "@gravity-ui/eslint-config": "^3.1.1", + "@gravity-ui/prettier-config": "^1.1.0", + "@gravity-ui/stylelint-config": "^4.0.1", "@gravity-ui/tsconfig": "^1.0.0", - "@playwright/test": "^1.31.1", - "@testing-library/jest-dom": "^5.15.0", - "@testing-library/react": "^11.2.7", - "@testing-library/user-event": "^12.8.3", - "@types/lodash": "^4.14.178", - "@types/numeral": "^2.0.2", - "@types/qs": "^6.9.7", - "@types/react": "^17.0.58", - "@types/react-dom": "^17.0.11", - "@types/react-router": "^5.1.17", - "@types/react-router-dom": "^5.3.2", + "@playwright/test": "^1.42.1", + "@testing-library/jest-dom": "^6.4.2", + "@testing-library/react": "^14.2.2", + "@testing-library/user-event": "^14.5.2", + "@types/jest": "^29.5.12", + "@types/lodash": "^4.17.0", + "@types/numeral": "^2.0.5", + "@types/qs": "^6.9.14", + "@types/react": "^18.2.73", + "@types/react-dom": "^18.2.23", + "@types/react-router": "^5.1.20", + "@types/react-router-dom": "^5.3.3", "copyfiles": "^2.4.1", - "eslint-config-prettier": "^8.3.0", "http-proxy-middleware": "^2.0.6", - "husky": "^7.0.4", - "jest-transform-css": "^4.0.1", - "lint-staged": "^12.3.7", + "husky": "^9.0.11", + "jest-transform-css": "^6.0.1", + "lint-staged": "^15.2.2", "npm-run-all": "^4.1.5", - "postcss": "^8.4.6", - "prettier": "^2.5.1", + "postcss": "^8.4.38", + "prettier": "^3.2.5", "prop-types": "^15.8.1", - "react": "^17.0.2", - "react-app-rewired": "^2.1.11", - "react-dom": "^17.0.2", + "react": "^18.2.0", + "react-app-rewired": "^2.2.1", + "react-dom": "^18.2.0", "react-scripts": "^5.0.1", - "sass": "^1.32.8", + "sass": "^1.72.0", "source-map-explorer": "^2.5.3", - "stylelint": "^14.3.0", - "ts-jest": "^28.0.7", - "typescript": "^4.5.5" + "stylelint": "^15.0.0", + "ts-jest": "^29.1.2", + "typescript": "^5.4.3" }, "peerDependencies": { "prop-types": "^15.8.1", - "react": "^17.0.2", - "react-dom": "^17.0.2" + "react": "^18.2.0", + "react-dom": "^18.2.0" }, "overrides": { - "react": "^17.0.2", - "react-dom": "^17.0.2", - "redux": "^5.0.1" + "fork-ts-checker-webpack-plugin": "^9.0.2", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "redux": "^5.0.1", + "typescript": "^5.4.3" } } diff --git a/playwright.config.ts b/playwright.config.ts index e94b2026f2..f831268c01 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -1,4 +1,5 @@ -import {PlaywrightTestConfig, devices} from '@playwright/test'; +import type {PlaywrightTestConfig} from '@playwright/test'; +import {devices} from '@playwright/test'; const baseUrl = process.env.PLAYWRIGHT_BASE_URL; diff --git a/src/.eslintrc b/src/.eslintrc index eab44348cf..e861c8caa6 100644 --- a/src/.eslintrc +++ b/src/.eslintrc @@ -1,28 +1,26 @@ { - "parser": "@typescript-eslint/parser", "extends": "@gravity-ui/eslint-config/client", - "plugins": ["@typescript-eslint"], "rules": { "react/jsx-uses-react": "off", "react/react-in-jsx-scope": "off", "react-hooks/exhaustive-deps": [ "warn", { - "additionalHooks": "(useAutofetcher)" - } + "additionalHooks": "(useAutofetcher)", + }, ], "valid-jsdoc": "off", - "@typescript-eslint/naming-convention": [ - "warn", + "react/jsx-fragments": ["error", "element"], + "no-restricted-syntax": [ + "error", + { + "selector": "ImportDeclaration[source.value='react'] :matches(ImportNamespaceSpecifier, ImportSpecifier)", + "message": "Please use import React from 'react' instead.", + }, { - "selector": "typeLike", - "format": ["PascalCase"], - "leadingUnderscore": "forbid", - "custom": { - "regex": "^I[A-Z]", - "match": false - } - } - ] - } + "selector": "TSTypeReference>TSQualifiedName[left.name='React'][right.name='FC']", + "message": "Don't use React.FC", + }, + ], + }, } diff --git a/src/components/BasicNodeViewer/BasicNodeViewer.tsx b/src/components/BasicNodeViewer/BasicNodeViewer.tsx index c85f6f8be2..67625325a6 100644 --- a/src/components/BasicNodeViewer/BasicNodeViewer.tsx +++ b/src/components/BasicNodeViewer/BasicNodeViewer.tsx @@ -1,11 +1,11 @@ -import cn from 'bem-cn-lite'; +import React from 'react'; -import type {AdditionalNodesProps} from '../../types/additionalProps'; import type {PreparedNode} from '../../store/reducers/node/types'; - +import type {AdditionalNodesProps} from '../../types/additionalProps'; +import {cn} from '../../utils/cn'; import {EntityStatus} from '../EntityStatus/EntityStatus'; -import {Tags} from '../Tags'; import {Icon} from '../Icon'; +import {Tags} from '../Tags'; import './BasicNodeViewer.scss'; @@ -25,7 +25,7 @@ export const BasicNodeViewer = ({node, additionalNodesProps, className}: BasicNo return (
{node ? ( - <> +
Node
{nodeHref && ( @@ -46,7 +46,7 @@ export const BasicNodeViewer = ({node, additionalNodesProps, className}: BasicNo {node.DC && } {node.Roles && } - +
) : (
no data
)} diff --git a/src/components/ButtonWithConfirmDialog/ButtonWithConfirmDialog.tsx b/src/components/ButtonWithConfirmDialog/ButtonWithConfirmDialog.tsx index f0a89e4018..40ccd0827c 100644 --- a/src/components/ButtonWithConfirmDialog/ButtonWithConfirmDialog.tsx +++ b/src/components/ButtonWithConfirmDialog/ButtonWithConfirmDialog.tsx @@ -1,11 +1,12 @@ -import {useState, type ReactNode} from 'react'; +import React from 'react'; -import {Button, type ButtonProps} from '@gravity-ui/uikit'; +import {Button} from '@gravity-ui/uikit'; +import type {ButtonProps} from '@gravity-ui/uikit'; import {CriticalActionDialog} from '../CriticalActionDialog'; interface ButtonWithConfirmDialogProps { - children: ReactNode; + children: React.ReactNode; onConfirmAction: () => Promise; onConfirmActionSuccess?: (() => Promise) | VoidFunction; dialogContent: string; @@ -23,8 +24,8 @@ export function ButtonWithConfirmDialog({ buttonView = 'action', buttonClassName, }: ButtonWithConfirmDialogProps) { - const [isConfirmDialogVisible, setIsConfirmDialogVisible] = useState(false); - const [buttonLoading, setButtonLoading] = useState(false); + const [isConfirmDialogVisible, setIsConfirmDialogVisible] = React.useState(false); + const [buttonLoading, setButtonLoading] = React.useState(false); const handleConfirmAction = async () => { setButtonLoading(true); @@ -50,7 +51,7 @@ export function ButtonWithConfirmDialog({ }; return ( - <> + ({ > {children} - + ); } diff --git a/src/components/CellWithPopover/CellWithPopover.tsx b/src/components/CellWithPopover/CellWithPopover.tsx index 845b3298ef..272df0dd78 100644 --- a/src/components/CellWithPopover/CellWithPopover.tsx +++ b/src/components/CellWithPopover/CellWithPopover.tsx @@ -1,6 +1,7 @@ -import cn from 'bem-cn-lite'; +import {Popover} from '@gravity-ui/uikit'; +import type {PopoverProps} from '@gravity-ui/uikit'; -import {Popover, type PopoverProps} from '@gravity-ui/uikit'; +import {cn} from '../../utils/cn'; import './CellWithPopover.scss'; diff --git a/src/components/CircularProgressBar/CircularProgressBar.tsx b/src/components/CircularProgressBar/CircularProgressBar.tsx index cfd4610824..0fd442ba41 100644 --- a/src/components/CircularProgressBar/CircularProgressBar.tsx +++ b/src/components/CircularProgressBar/CircularProgressBar.tsx @@ -1,8 +1,6 @@ -import cn from 'bem-cn-lite'; -import type {ReactNode} from 'react'; - import type {MetricStatus} from '../../store/reducers/tenants/types'; import {normalizeProgress} from '../../store/reducers/tenants/utils'; +import {cn} from '../../utils/cn'; import './CircularProgressBar.scss'; @@ -12,7 +10,7 @@ interface CircularProgressBarProps { size?: number; progress?: number; strokeWidth?: number; - content?: ReactNode; + content?: React.ReactNode; status?: MetricStatus; circleBgClassName?: string; } diff --git a/src/components/ClipboardButton/ClipboardButton.tsx b/src/components/ClipboardButton/ClipboardButton.tsx index 5d5439cd08..71c454752c 100644 --- a/src/components/ClipboardButton/ClipboardButton.tsx +++ b/src/components/ClipboardButton/ClipboardButton.tsx @@ -1,12 +1,12 @@ +import type {ButtonProps, CopyToClipboardStatus} from '@gravity-ui/uikit'; import { Button, - ButtonProps, ClipboardIcon, CopyToClipboard as CopyToClipboardUiKit, - CopyToClipboardStatus, Tooltip, } from '@gravity-ui/uikit'; -import cn from 'bem-cn-lite'; + +import {cn} from '../../utils/cn'; const b = cn('clipboard-button'); @@ -27,7 +27,7 @@ function InnerButton({ }: Omit & {status: CopyToClipboardStatus}) { return ( (undefined); diff --git a/src/components/ComponentsProvider/componentsRegistry.ts b/src/components/ComponentsProvider/componentsRegistry.ts index 6e727c49ac..8c56eaf0da 100644 --- a/src/components/ComponentsProvider/componentsRegistry.ts +++ b/src/components/ComponentsProvider/componentsRegistry.ts @@ -1,8 +1,9 @@ -import {StaffCard} from '../User/StaffCard'; import {AsideNavigation} from '../../containers/AsideNavigation/AsideNavigation'; - -import {ComponentsRegistryTemplate, Registry} from './registry'; import {ErrorBoundaryInner} from '../ErrorBoundary/ErrorBoundary'; +import {StaffCard} from '../User/StaffCard'; + +import type {ComponentsRegistryTemplate} from './registry'; +import {Registry} from './registry'; const componentsRegistryInner = new Registry() .register('StaffCard', StaffCard) diff --git a/src/components/ComponentsProvider/registry.ts b/src/components/ComponentsProvider/registry.ts index a0ea8363fc..14468cde8d 100644 --- a/src/components/ComponentsProvider/registry.ts +++ b/src/components/ComponentsProvider/registry.ts @@ -23,9 +23,10 @@ export class Registry { } } -type ComponentType = T extends React.ComponentType - ? React.ComponentType> - : never; +type ComponentType = + T extends React.ComponentType + ? React.ComponentType> + : never; export interface ComponentsRegistryTemplate> { set(id: Id, entity: ComponentType): this; diff --git a/src/components/ContentWithPopup/ContentWithPopup.tsx b/src/components/ContentWithPopup/ContentWithPopup.tsx index bb5ef53559..3acf381871 100644 --- a/src/components/ContentWithPopup/ContentWithPopup.tsx +++ b/src/components/ContentWithPopup/ContentWithPopup.tsx @@ -1,11 +1,12 @@ -import {ReactNode, useRef, useState} from 'react'; +import React from 'react'; -import {Popup, PopupProps} from '@gravity-ui/uikit'; +import type {PopupProps} from '@gravity-ui/uikit'; +import {Popup} from '@gravity-ui/uikit'; interface ContentWithPopupProps extends PopupProps { - content: ReactNode; + content: React.ReactNode; className?: string; - children?: ReactNode; + children?: React.ReactNode; } export const ContentWithPopup = ({ @@ -16,8 +17,8 @@ export const ContentWithPopup = ({ placement = ['top', 'bottom'], ...props }: ContentWithPopupProps) => { - const [isPopupVisible, setIsPopupVisible] = useState(false); - const anchor = useRef(null); + const [isPopupVisible, setIsPopupVisible] = React.useState(false); + const anchor = React.useRef(null); const showPopup = () => { setIsPopupVisible(true); @@ -28,7 +29,7 @@ export const ContentWithPopup = ({ }; return ( - <> + {children} - + ); }; diff --git a/src/components/CriticalActionDialog/CriticalActionDialog.tsx b/src/components/CriticalActionDialog/CriticalActionDialog.tsx index fb20406dff..756e13b0fe 100644 --- a/src/components/CriticalActionDialog/CriticalActionDialog.tsx +++ b/src/components/CriticalActionDialog/CriticalActionDialog.tsx @@ -1,10 +1,12 @@ -import {FormEvent, useState} from 'react'; -import cn from 'bem-cn-lite'; -import {Dialog} from '@gravity-ui/uikit'; +import React from 'react'; + import {CircleXmarkFill} from '@gravity-ui/icons'; +import {Dialog} from '@gravity-ui/uikit'; import type {IResponseError} from '../../types/api/error'; +import {cn} from '../../utils/cn'; import {Icon} from '../Icon'; + import {criticalActionDialogKeyset} from './i18n'; import './CriticalActionDialog.scss'; @@ -39,10 +41,10 @@ export function CriticalActionDialog({ onConfirmActionSuccess, onConfirmActionError, }: CriticalActionDialogProps) { - const [isLoading, setIsLoading] = useState(false); - const [error, setError] = useState(); + const [isLoading, setIsLoading] = React.useState(false); + const [error, setError] = React.useState(); - const onSubmit = async (e: FormEvent) => { + const onSubmit = async (e: React.FormEvent) => { e.preventDefault(); setIsLoading(true); @@ -63,7 +65,7 @@ export function CriticalActionDialog({ const renderDialogContent = () => { if (error) { return ( - <> + @@ -77,7 +79,7 @@ export function CriticalActionDialog({ textButtonCancel={criticalActionDialogKeyset('button-close')} onClickButtonCancel={onClose} /> - + ); } diff --git a/src/components/DateRange/DateRange.tsx b/src/components/DateRange/DateRange.tsx index c1498b0eb2..1696da963f 100644 --- a/src/components/DateRange/DateRange.tsx +++ b/src/components/DateRange/DateRange.tsx @@ -1,5 +1,4 @@ -import {ChangeEventHandler} from 'react'; -import cn from 'bem-cn-lite'; +import {cn} from '../../utils/cn'; import './DateRange.scss'; @@ -28,7 +27,7 @@ const toTimezonelessISOString = (timestamp?: number) => { }; export const DateRange = ({from, to, className, onChange}: DateRangeProps) => { - const handleFromChange: ChangeEventHandler = ({target: {value}}) => { + const handleFromChange: React.ChangeEventHandler = ({target: {value}}) => { let newFrom = value ? new Date(value).getTime() : undefined; // some browsers allow selecting time after the boundary specified in `max` @@ -39,7 +38,7 @@ export const DateRange = ({from, to, className, onChange}: DateRangeProps) => { onChange?.({from: newFrom, to}); }; - const handleToChange: ChangeEventHandler = ({target: {value}}) => { + const handleToChange: React.ChangeEventHandler = ({target: {value}}) => { let newTo = value ? new Date(value).getTime() : undefined; // some browsers allow selecting time before the boundary specified in `min` diff --git a/src/components/DiagnosticCard/DiagnosticCard.tsx b/src/components/DiagnosticCard/DiagnosticCard.tsx index b8c71a366b..19a6681969 100644 --- a/src/components/DiagnosticCard/DiagnosticCard.tsx +++ b/src/components/DiagnosticCard/DiagnosticCard.tsx @@ -1,12 +1,11 @@ -import type {ReactNode} from 'react'; -import cn from 'bem-cn-lite'; +import {cn} from '../../utils/cn'; import './DiagnosticCard.scss'; const b = cn('ydb-diagnostic-card'); interface DiagnosticCardProps { - children?: ReactNode; + children?: React.ReactNode; className?: string; active?: boolean; } diff --git a/src/components/DiskPageTitle/DiskPageTitle.tsx b/src/components/DiskPageTitle/DiskPageTitle.tsx index 06a089e592..975794c0f5 100644 --- a/src/components/DiskPageTitle/DiskPageTitle.tsx +++ b/src/components/DiskPageTitle/DiskPageTitle.tsx @@ -1,5 +1,3 @@ -import type {ReactNode} from 'react'; - import type {EFlag} from '../../types/api/enums'; import {cn} from '../../utils/cn'; import {StatusIcon} from '../StatusIcon/StatusIcon'; @@ -9,9 +7,9 @@ import './DiskPageTitle.scss'; const b = cn('ydb-disk-page-title'); interface DiskPageTitleProps { - entityName: ReactNode; + entityName: React.ReactNode; status: EFlag; - id: ReactNode; + id: React.ReactNode; className?: string; } diff --git a/src/components/DiskStateProgressBar/DiskStateProgressBar.tsx b/src/components/DiskStateProgressBar/DiskStateProgressBar.tsx index 7e538ac37a..ed3d493f3b 100644 --- a/src/components/DiskStateProgressBar/DiskStateProgressBar.tsx +++ b/src/components/DiskStateProgressBar/DiskStateProgressBar.tsx @@ -1,9 +1,9 @@ import React from 'react'; -import cn from 'bem-cn-lite'; +import {cn} from '../../utils/cn'; import {INVERTED_DISKS_KEY} from '../../utils/constants'; -import {useSetting} from '../../utils/hooks'; import {getSeverityColor} from '../../utils/disks/helpers'; +import {useSetting} from '../../utils/hooks'; import './DiskStateProgressBar.scss'; diff --git a/src/components/Divider/Divider.tsx b/src/components/Divider/Divider.tsx index 9d69197d9a..2b335863a6 100644 --- a/src/components/Divider/Divider.tsx +++ b/src/components/Divider/Divider.tsx @@ -1,4 +1,4 @@ -import cn from 'bem-cn-lite'; +import {cn} from '../../utils/cn'; import './Divider.scss'; diff --git a/src/components/EmptyState/EmptyState.tsx b/src/components/EmptyState/EmptyState.tsx index f2e6fce39f..8052bedbde 100644 --- a/src/components/EmptyState/EmptyState.tsx +++ b/src/components/EmptyState/EmptyState.tsx @@ -1,6 +1,4 @@ -import {ReactNode} from 'react'; -import cn from 'bem-cn-lite'; - +import {cn} from '../../utils/cn'; import {Icon} from '../Icon'; import './EmptyState.scss'; @@ -15,9 +13,9 @@ const sizes = { export interface EmptyStateProps { title: string; - image?: ReactNode; - description?: ReactNode; - actions?: ReactNode[]; + image?: React.ReactNode; + description?: React.ReactNode; + actions?: React.ReactNode[]; size?: keyof typeof sizes; position?: 'left' | 'center'; } diff --git a/src/components/EnableFullscreenButton/EnableFullscreenButton.tsx b/src/components/EnableFullscreenButton/EnableFullscreenButton.tsx index f272416455..307e791261 100644 --- a/src/components/EnableFullscreenButton/EnableFullscreenButton.tsx +++ b/src/components/EnableFullscreenButton/EnableFullscreenButton.tsx @@ -1,6 +1,7 @@ import {Button} from '@gravity-ui/uikit'; -import {useTypedDispatch} from '../../utils/hooks'; + import {enableFullscreen} from '../../store/reducers/fullscreen'; +import {useTypedDispatch} from '../../utils/hooks'; import {Icon} from '../Icon'; interface EnableFullscreenButtonProps { diff --git a/src/components/EntitiesCount/EntitiesCount.tsx b/src/components/EntitiesCount/EntitiesCount.tsx index 82bc9a787e..a6722c15ea 100644 --- a/src/components/EntitiesCount/EntitiesCount.tsx +++ b/src/components/EntitiesCount/EntitiesCount.tsx @@ -1,4 +1,5 @@ import {Label} from '@gravity-ui/uikit'; + import i18n from './i18n'; interface EntitiesCountProps { diff --git a/src/components/EntitiesCount/i18n/index.ts b/src/components/EntitiesCount/i18n/index.ts index bf0b97d3bb..80a9c509e7 100644 --- a/src/components/EntitiesCount/i18n/index.ts +++ b/src/components/EntitiesCount/i18n/index.ts @@ -1,11 +1,8 @@ -import {i18n, Lang} from '../../../utils/i18n'; +import {registerKeysets} from '../../../utils/i18n'; import en from './en.json'; import ru from './ru.json'; const COMPONENT = 'ydb-entities-count'; -i18n.registerKeyset(Lang.En, COMPONENT, en); -i18n.registerKeyset(Lang.Ru, COMPONENT, ru); - -export default i18n.keyset(COMPONENT); +export default registerKeysets(COMPONENT, {ru, en}); diff --git a/src/components/EntityStatus/EntityStatus.tsx b/src/components/EntityStatus/EntityStatus.tsx index dda59ff55f..197966f61d 100644 --- a/src/components/EntityStatus/EntityStatus.tsx +++ b/src/components/EntityStatus/EntityStatus.tsx @@ -1,11 +1,12 @@ -import {Link} from 'react-router-dom'; -import cn from 'bem-cn-lite'; - import {Link as UIKitLink} from '@gravity-ui/uikit'; +import {Link} from 'react-router-dom'; import {EFlag} from '../../types/api/enums'; -import {StatusIcon, type StatusIconMode, type StatusIconSize} from '../StatusIcon/StatusIcon'; +import {cn} from '../../utils/cn'; import {ClipboardButton} from '../ClipboardButton'; +import {StatusIcon} from '../StatusIcon/StatusIcon'; +import type {StatusIconMode, StatusIconSize} from '../StatusIcon/StatusIcon'; + import './EntityStatus.scss'; const b = cn('entity-status'); @@ -56,33 +57,34 @@ export function EntityStatus({ return ; }; - const renderStatusLink = () => { + const renderStatusLink = (href: string) => { return ( - + {renderIcon()} ); }; const renderLink = () => { - if (externalLink) { + if (path) { + if (externalLink) { + return ( + + {name} + + ); + } + return ( - + {name} - + ); } - - return path ? ( - - {name} - - ) : ( - name && {name} - ); + return name && {name}; }; return (
- {iconPath ? renderStatusLink() : renderIcon()} + {iconPath ? renderStatusLink(iconPath) : renderIcon()} {label && ( {label} diff --git a/src/components/ErrorBoundary/ErrorBoundary.tsx b/src/components/ErrorBoundary/ErrorBoundary.tsx index 596747d1fc..8b5e1085e6 100644 --- a/src/components/ErrorBoundary/ErrorBoundary.tsx +++ b/src/components/ErrorBoundary/ErrorBoundary.tsx @@ -1,24 +1,24 @@ -import type {ReactNode} from 'react'; -import {ErrorBoundary as ErrorBoundaryBase} from 'react-error-boundary'; -import cn from 'bem-cn-lite'; - import {Button, Disclosure} from '@gravity-ui/uikit'; +import {ErrorBoundary as ErrorBoundaryBase} from 'react-error-boundary'; +import {cn} from '../../utils/cn'; import {registerError} from '../../utils/registerError'; -import {Illustration} from '../Illustration'; import {useComponent} from '../ComponentsProvider/ComponentsProvider'; +import {Illustration} from '../Illustration'; + import i18n from './i18n'; + import './ErrorBoundary.scss'; const b = cn('ydb-error-boundary'); -export function ErrorBoundary({children}: {children?: ReactNode}) { +export function ErrorBoundary({children}: {children?: React.ReactNode}) { const ErrorBoundaryComponent = useComponent('ErrorBoundary'); return {children}; } interface ErrorBoundaryProps { - children?: ReactNode; + children?: React.ReactNode; useRetry?: boolean; onReportProblem?: (error?: Error) => void; } @@ -31,7 +31,7 @@ export function ErrorBoundaryInner({ return ( { - registerError(error, info.componentStack, 'error-boundary'); + registerError(error, info.componentStack ?? undefined, 'error-boundary'); }} fallbackRender={({error, resetErrorBoundary}) => { return ( diff --git a/src/components/ErrorBoundary/i18n/index.ts b/src/components/ErrorBoundary/i18n/index.ts index ba354eac9a..f4fb03e376 100644 --- a/src/components/ErrorBoundary/i18n/index.ts +++ b/src/components/ErrorBoundary/i18n/index.ts @@ -1,11 +1,8 @@ -import {i18n, Lang} from '../../../utils/i18n'; +import {registerKeysets} from '../../../utils/i18n'; import en from './en.json'; import ru from './ru.json'; const COMPONENT = 'ydb-error-boundary'; -i18n.registerKeyset(Lang.En, COMPONENT, en); -i18n.registerKeyset(Lang.Ru, COMPONENT, ru); - -export default i18n.keyset(COMPONENT); +export default registerKeysets(COMPONENT, {ru, en}); diff --git a/src/components/Errors/403/AccessDenied.tsx b/src/components/Errors/403/AccessDenied.tsx index 868405f1b5..53555cc26f 100644 --- a/src/components/Errors/403/AccessDenied.tsx +++ b/src/components/Errors/403/AccessDenied.tsx @@ -1,6 +1,6 @@ -import {EmptyState, type EmptyStateProps} from '../../EmptyState'; +import {EmptyState} from '../../EmptyState'; +import type {EmptyStateProps} from '../../EmptyState'; import {Illustration} from '../../Illustration'; - import i18n from '../i18n'; interface AccessDeniedProps extends Omit { diff --git a/src/components/Errors/ResponseError/ResponseError.tsx b/src/components/Errors/ResponseError/ResponseError.tsx index 4e59d4215a..d30cec98ad 100644 --- a/src/components/Errors/ResponseError/ResponseError.tsx +++ b/src/components/Errors/ResponseError/ResponseError.tsx @@ -1,5 +1,4 @@ import type {IResponseError} from '../../../types/api/error'; - import i18n from '../i18n'; interface ResponseErrorProps { diff --git a/src/components/Errors/i18n/index.ts b/src/components/Errors/i18n/index.ts index fddc0e3111..2440cb7f21 100644 --- a/src/components/Errors/i18n/index.ts +++ b/src/components/Errors/i18n/index.ts @@ -1,11 +1,8 @@ -import {i18n, Lang} from '../../../utils/i18n'; +import {registerKeysets} from '../../../utils/i18n'; import en from './en.json'; import ru from './ru.json'; const COMPONENT = 'ydb-errors-access-denied'; -i18n.registerKeyset(Lang.En, COMPONENT, en); -i18n.registerKeyset(Lang.Ru, COMPONENT, ru); - -export default i18n.keyset(COMPONENT); +export default registerKeysets(COMPONENT, {ru, en}); diff --git a/src/components/FormattedBytes/FormattedBytes.tsx b/src/components/FormattedBytes/FormattedBytes.tsx index a5e9a7db10..d4338ffa5d 100644 --- a/src/components/FormattedBytes/FormattedBytes.tsx +++ b/src/components/FormattedBytes/FormattedBytes.tsx @@ -1,4 +1,5 @@ -import {FormatBytesArgs, formatBytes} from '../../utils/bytesParsers'; +import type {FormatBytesArgs} from '../../utils/bytesParsers'; +import {formatBytes} from '../../utils/bytesParsers'; type FormattedBytesProps = FormatBytesArgs; diff --git a/src/components/FormattedBytes/utils.tsx b/src/components/FormattedBytes/utils.tsx index 1f2eecb567..9f6ce0326c 100644 --- a/src/components/FormattedBytes/utils.tsx +++ b/src/components/FormattedBytes/utils.tsx @@ -1,4 +1,5 @@ import type {FormatBytesArgs} from '../../utils/bytesParsers'; + import {FormattedBytes} from './FormattedBytes'; export const toFormattedSize = ( diff --git a/src/components/FullNodeViewer/FullNodeViewer.tsx b/src/components/FullNodeViewer/FullNodeViewer.tsx index 3823a43284..667c33deff 100644 --- a/src/components/FullNodeViewer/FullNodeViewer.tsx +++ b/src/components/FullNodeViewer/FullNodeViewer.tsx @@ -1,11 +1,10 @@ -import cn from 'bem-cn-lite'; - import type {PreparedNode} from '../../store/reducers/node/types'; +import {cn} from '../../utils/cn'; import {LOAD_AVERAGE_TIME_INTERVALS} from '../../utils/constants'; - -import InfoViewer, {type InfoViewerItem} from '../InfoViewer/InfoViewer'; -import {ProgressViewer} from '../ProgressViewer/ProgressViewer'; +import InfoViewer from '../InfoViewer/InfoViewer'; +import type {InfoViewerItem} from '../InfoViewer/InfoViewer'; import {PoolUsage} from '../PoolUsage/PoolUsage'; +import {ProgressViewer} from '../ProgressViewer/ProgressViewer'; import './FullNodeViewer.scss'; diff --git a/src/components/Fullscreen/Fullscreen.scss b/src/components/Fullscreen/Fullscreen.scss index 5ee305c040..be4c80883c 100644 --- a/src/components/Fullscreen/Fullscreen.scss +++ b/src/components/Fullscreen/Fullscreen.scss @@ -3,10 +3,7 @@ // counts on .gn-aside-header__content to have position: relative, it is set in App.scss position: absolute; z-index: 10; - top: 0; - right: 0; - bottom: 0; - left: 0; + inset: 0; display: flex; overflow: hidden; diff --git a/src/components/Fullscreen/Fullscreen.tsx b/src/components/Fullscreen/Fullscreen.tsx index 9602aacbea..104ac9c8c8 100644 --- a/src/components/Fullscreen/Fullscreen.tsx +++ b/src/components/Fullscreen/Fullscreen.tsx @@ -1,11 +1,11 @@ -import React, {useEffect} from 'react'; -import ReactDOM from 'react-dom'; +import React from 'react'; import {Button} from '@gravity-ui/uikit'; -import cn from 'bem-cn-lite'; +import ReactDOM from 'react-dom'; -import {useTypedDispatch} from '../../utils/hooks'; import {disableFullscreen} from '../../store/reducers/fullscreen'; +import {cn} from '../../utils/cn'; +import {useTypedDispatch} from '../../utils/hooks'; import {Icon} from '../Icon'; import './Fullscreen.scss'; @@ -55,7 +55,7 @@ function Fullscreen(props: FullscreenProps) { dispatch(disableFullscreen()); }, [dispatch]); - useEffect(() => { + React.useEffect(() => { const escFunction = (event: KeyboardEvent) => { if (event.key === 'Escape') { onDisableFullScreen(); diff --git a/src/components/GroupInfo/GroupInfo.tsx b/src/components/GroupInfo/GroupInfo.tsx index 48d4ce4f57..4472afeb6b 100644 --- a/src/components/GroupInfo/GroupInfo.tsx +++ b/src/components/GroupInfo/GroupInfo.tsx @@ -1,10 +1,10 @@ import type {PreparedStorageGroup} from '../../store/reducers/storage/types'; import {valueIsDefined} from '../../utils'; import {formatStorageValuesToGb} from '../../utils/dataFormatters/dataFormatters'; - -import type {InfoViewerProps} from '../InfoViewer/InfoViewer'; import {InfoViewer} from '../InfoViewer'; +import type {InfoViewerProps} from '../InfoViewer/InfoViewer'; import {ProgressViewer} from '../ProgressViewer/ProgressViewer'; + import {groupInfoKeyset} from './i18n'; interface GroupInfoProps> diff --git a/src/components/Illustration/Illustration.tsx b/src/components/Illustration/Illustration.tsx index 4263fb3b16..d4b70e8acd 100644 --- a/src/components/Illustration/Illustration.tsx +++ b/src/components/Illustration/Illustration.tsx @@ -1,8 +1,10 @@ -import {ImgHTMLAttributes, useEffect, useState} from 'react'; -import cn from 'bem-cn-lite'; +import React from 'react'; + import {useThemeValue} from '@gravity-ui/uikit'; -export interface IllustrationProps extends ImgHTMLAttributes { +import {cn} from '../../utils/cn'; + +export interface IllustrationProps extends React.ImgHTMLAttributes { name: string; className?: string; } @@ -26,10 +28,10 @@ const b = cn('kv-illustration'); export const Illustration = ({name, className, ...props}: IllustrationProps) => { const theme = useThemeValue(); - const [src, setSrc] = useState(''); + const [src, setSrc] = React.useState(''); const srcGetter = store[theme] && store[theme][name]; - useEffect(() => { + React.useEffect(() => { if (typeof srcGetter === 'function') { srcGetter() .then((svg) => setSrc(svg.default)) diff --git a/src/components/InfoViewer/InfoViewer.tsx b/src/components/InfoViewer/InfoViewer.tsx index 50f1189799..7804970280 100644 --- a/src/components/InfoViewer/InfoViewer.tsx +++ b/src/components/InfoViewer/InfoViewer.tsx @@ -1,11 +1,12 @@ -import type {ReactNode} from 'react'; -import cn from 'bem-cn-lite'; +import React from 'react'; + +import {cn} from '../../utils/cn'; import './InfoViewer.scss'; export interface InfoViewerItem { - label: ReactNode; - value: ReactNode; + label: React.ReactNode; + value: React.ReactNode; } export interface InfoViewerProps { @@ -15,7 +16,7 @@ export interface InfoViewerProps { size?: 's'; className?: string; multilineLabels?: boolean; - renderEmptyState?: (props?: Pick) => ReactNode; + renderEmptyState?: (props?: Pick) => React.ReactNode; } const b = cn('info-viewer'); @@ -30,7 +31,7 @@ export const InfoViewer = ({ renderEmptyState, }: InfoViewerProps) => { if ((!info || !info.length) && renderEmptyState) { - return <>{renderEmptyState({title, size})}; + return {renderEmptyState({title, size})}; } return ( @@ -52,7 +53,7 @@ export const InfoViewer = ({ ))}
) : ( - <>No {title} data + No {title} data )}
); diff --git a/src/components/InfoViewer/formatters/cdcStream.ts b/src/components/InfoViewer/formatters/cdcStream.ts index 408d386d04..b394daafe2 100644 --- a/src/components/InfoViewer/formatters/cdcStream.ts +++ b/src/components/InfoViewer/formatters/cdcStream.ts @@ -1,10 +1,10 @@ -import {TCdcStreamDescription} from '../../../types/api/schema'; - +import type {TCdcStreamDescription} from '../../../types/api/schema'; import {createInfoFormatter} from '../utils'; export const formatCdcStreamItem = createInfoFormatter({ values: { Mode: (value) => value?.substring('ECdcStreamMode'.length), Format: (value) => value?.substring('ECdcStreamFormat'.length), + PathId: (value) => JSON.stringify(value), }, }); diff --git a/src/components/InfoViewer/formatters/common.ts b/src/components/InfoViewer/formatters/common.ts index 3f3e0dd3ef..43c5921887 100644 --- a/src/components/InfoViewer/formatters/common.ts +++ b/src/components/InfoViewer/formatters/common.ts @@ -1,9 +1,7 @@ import type {TDirEntry} from '../../../types/api/schema'; import {formatDateTime} from '../../../utils/dataFormatters/dataFormatters'; - -import {createInfoFormatter} from '../utils'; - import i18n from '../i18n'; +import {createInfoFormatter} from '../utils'; export const formatCommonItem = createInfoFormatter({ values: { diff --git a/src/components/InfoViewer/formatters/pqGroup.ts b/src/components/InfoViewer/formatters/pqGroup.ts index bac524ad87..4a6db8688b 100644 --- a/src/components/InfoViewer/formatters/pqGroup.ts +++ b/src/components/InfoViewer/formatters/pqGroup.ts @@ -1,12 +1,11 @@ -import { - EMeteringMode, - TPersQueueGroupDescription, +import type { TPQPartitionConfig, TPQTabletConfig, + TPersQueueGroupDescription, } from '../../../types/api/schema'; -import {formatBps, formatBytes, formatNumber} from '../../../utils/dataFormatters/dataFormatters'; +import {EMeteringMode} from '../../../types/api/schema'; import {HOUR_IN_SECONDS} from '../../../utils/constants'; - +import {formatBps, formatBytes, formatNumber} from '../../../utils/dataFormatters/dataFormatters'; import {createInfoFormatter} from '../utils'; const EMeteringModeToNames: Record = { diff --git a/src/components/InfoViewer/formatters/schema.ts b/src/components/InfoViewer/formatters/schema.ts index cc00dfc86b..22192966a0 100644 --- a/src/components/InfoViewer/formatters/schema.ts +++ b/src/components/InfoViewer/formatters/schema.ts @@ -1,6 +1,5 @@ import type {TIndexDescription} from '../../../types/api/schema'; import {toFormattedSize} from '../../FormattedBytes/utils'; - import {createInfoFormatter} from '../utils'; export const formatTableIndexItem = createInfoFormatter({ diff --git a/src/components/InfoViewer/formatters/table.ts b/src/components/InfoViewer/formatters/table.ts index 919dbc356a..44e3750cce 100644 --- a/src/components/InfoViewer/formatters/table.ts +++ b/src/components/InfoViewer/formatters/table.ts @@ -7,7 +7,6 @@ import { formatNumber, } from '../../../utils/dataFormatters/dataFormatters'; import {toFormattedSize} from '../../FormattedBytes/utils'; - import {createInfoFormatter} from '../utils'; export const formatTabletMetricsItem = createInfoFormatter({ diff --git a/src/components/InfoViewer/i18n/index.ts b/src/components/InfoViewer/i18n/index.ts index c43cce6aba..33853de369 100644 --- a/src/components/InfoViewer/i18n/index.ts +++ b/src/components/InfoViewer/i18n/index.ts @@ -1,11 +1,8 @@ -import {i18n, Lang} from '../../../utils/i18n'; +import {registerKeysets} from '../../../utils/i18n'; import en from './en.json'; import ru from './ru.json'; const COMPONENT = 'ydb-components-info-viewer'; -i18n.registerKeyset(Lang.En, COMPONENT, en); -i18n.registerKeyset(Lang.Ru, COMPONENT, ru); - -export default i18n.keyset(COMPONENT); +export default registerKeysets(COMPONENT, {ru, en}); diff --git a/src/components/InfoViewer/schemaInfo/TableIndexInfo.tsx b/src/components/InfoViewer/schemaInfo/TableIndexInfo.tsx index 0dc94fbf2e..ba5650ce23 100644 --- a/src/components/InfoViewer/schemaInfo/TableIndexInfo.tsx +++ b/src/components/InfoViewer/schemaInfo/TableIndexInfo.tsx @@ -1,8 +1,8 @@ -import type {TEvDescribeSchemeResult, TIndexDescription} from '../../../types/api/schema'; +import type {InfoViewerItem} from '..'; +import {InfoViewer} from '..'; import {getEntityName} from '../../../containers/Tenant/utils'; - +import type {TEvDescribeSchemeResult, TIndexDescription} from '../../../types/api/schema'; import {formatTableIndexItem} from '../formatters'; -import {InfoViewer, InfoViewerItem} from '..'; const DISPLAYED_FIELDS: Set = new Set([ 'Type', diff --git a/src/components/InfoViewer/schemaOverview/CDCStreamOverview.tsx b/src/components/InfoViewer/schemaOverview/CDCStreamOverview.tsx index c023a3c1d4..f61fa35db3 100644 --- a/src/components/InfoViewer/schemaOverview/CDCStreamOverview.tsx +++ b/src/components/InfoViewer/schemaOverview/CDCStreamOverview.tsx @@ -1,6 +1,8 @@ -import type {TEvDescribeSchemeResult, TCdcStreamDescription} from '../../../types/api/schema'; +import React from 'react'; -import {InfoViewer, InfoViewerItem} from '..'; +import type {InfoViewerItem} from '..'; +import {InfoViewer} from '..'; +import type {TCdcStreamDescription, TEvDescribeSchemeResult} from '../../../types/api/schema'; import {formatCdcStreamItem, formatCommonItem} from '../formatters'; const DISPLAYED_FIELDS: Set = new Set(['Mode', 'Format']); @@ -23,9 +25,14 @@ export const CDCStreamOverview = ({data}: CDCStreamOverviewProps) => { let key: keyof TCdcStreamDescription; for (key in TableIndex) { if (DISPLAYED_FIELDS.has(key)) { + //@ts-expect-error info.push(formatCdcStreamItem(key, TableIndex?.[key])); } } - return <>{info.length ? : <>Empty}; + return ( + + {info.length ? : 'Empty'} + + ); }; diff --git a/src/components/InfoViewer/schemaOverview/PersQueueGroupOverview.tsx b/src/components/InfoViewer/schemaOverview/PersQueueGroupOverview.tsx index e6bb301b81..a18939afe4 100644 --- a/src/components/InfoViewer/schemaOverview/PersQueueGroupOverview.tsx +++ b/src/components/InfoViewer/schemaOverview/PersQueueGroupOverview.tsx @@ -1,7 +1,9 @@ -import type {TEvDescribeSchemeResult} from '../../../types/api/schema'; +import React from 'react'; +import type {InfoViewerItem} from '..'; +import {InfoViewer} from '..'; +import type {TEvDescribeSchemeResult} from '../../../types/api/schema'; import {formatCommonItem, formatPQGroupItem} from '../formatters'; -import {InfoViewer, InfoViewerItem} from '..'; interface PersQueueGroupOverviewProps { data?: TEvDescribeSchemeResult; @@ -18,13 +20,19 @@ export const PersQueueGroupOverview = ({data}: PersQueueGroupOverviewProps) => { info.push(formatCommonItem('PathType', data.PathDescription?.Self?.PathType)); info.push(formatCommonItem('CreateStep', data.PathDescription?.Self?.CreateStep)); + //@ts-expect-error info.push(formatPQGroupItem('Partitions', pqGroup?.Partitions || [])); info.push( + //@ts-expect-error formatPQGroupItem( 'PQTabletConfig', pqGroup?.PQTabletConfig || {PartitionConfig: {LifetimeSeconds: 0}}, ), ); - return <>{info.length ? : <>Empty}; + return ( + + {info.length ? : 'Empty'} + + ); }; diff --git a/src/components/InfoViewer/utils.ts b/src/components/InfoViewer/utils.ts index 4228e5614f..0178d27723 100644 --- a/src/components/InfoViewer/utils.ts +++ b/src/components/InfoViewer/utils.ts @@ -1,13 +1,13 @@ -import type {ReactNode} from 'react'; +import type React from 'react'; -import {InfoViewerItem} from './InfoViewer'; +import type {InfoViewerItem} from './InfoViewer'; type LabelMap = { [label in keyof T]?: string; }; type ValueFormatters = { - [label in keyof T]?: (value: T[label]) => ReactNode; + [label in keyof T]?: (value: T[label]) => React.ReactNode; }; function formatLabel(label: keyof Shape, map: LabelMap) { @@ -18,7 +18,7 @@ function formatValue( label: Key, value: Shape[Key], formatters: ValueFormatters, - defaultFormatter?: (value: Shape[Key]) => ReactNode, + defaultFormatter?: (value: Shape[Key]) => React.ReactNode, ) { const formatter = formatters[label] || defaultFormatter; const formattedValue = formatter ? formatter(value) : value; @@ -29,7 +29,7 @@ function formatValue( interface CreateInfoFormatterOptions { values?: ValueFormatters; labels?: LabelMap; - defaultValueFormatter?: (value: Shape[keyof Shape]) => ReactNode; + defaultValueFormatter?: (value: Shape[keyof Shape]) => React.ReactNode; } export function createInfoFormatter>({ diff --git a/src/components/InfoViewerSkeleton/InfoViewerSkeleton.tsx b/src/components/InfoViewerSkeleton/InfoViewerSkeleton.tsx index c6414f748c..eaae8966c8 100644 --- a/src/components/InfoViewerSkeleton/InfoViewerSkeleton.tsx +++ b/src/components/InfoViewerSkeleton/InfoViewerSkeleton.tsx @@ -1,10 +1,10 @@ -import block from 'bem-cn-lite'; - import {Skeleton} from '@gravity-ui/uikit'; +import {cn} from '../../utils/cn'; + import './InfoViewerSkeleton.scss'; -const b = block('ydb-info-viewer-skeleton'); +const b = cn('ydb-info-viewer-skeleton'); const SkeletonLabel = () => (
diff --git a/src/components/InternalLink/InternalLink.tsx b/src/components/InternalLink/InternalLink.tsx index 152fd342f6..3d7779c4c1 100644 --- a/src/components/InternalLink/InternalLink.tsx +++ b/src/components/InternalLink/InternalLink.tsx @@ -1,7 +1,9 @@ -import {Link, LinkProps} from 'react-router-dom'; -import cn from 'bem-cn-lite'; +import type {LinkProps} from 'react-router-dom'; +import {Link} from 'react-router-dom'; -const bLink = cn('yc-link'); +import {cn} from '../../utils/cn'; + +const bLink = cn('g-link'); interface InternalLinkProps extends Omit { to?: LinkProps['to']; diff --git a/src/components/LabelWithPopover/LabelWithPopover.tsx b/src/components/LabelWithPopover/LabelWithPopover.tsx index 09fed720c2..de5328b1f9 100644 --- a/src/components/LabelWithPopover/LabelWithPopover.tsx +++ b/src/components/LabelWithPopover/LabelWithPopover.tsx @@ -1,10 +1,8 @@ -import type {ReactNode} from 'react'; - import {HelpPopover} from '@gravity-ui/components'; interface LabelWithPopoverProps { - text: ReactNode; - popoverContent: ReactNode; + text: React.ReactNode; + popoverContent: React.ReactNode; className?: string; contentClassName?: string; } diff --git a/src/components/LagPopoverContent/LagPopoverContent.tsx b/src/components/LagPopoverContent/LagPopoverContent.tsx index ec09312100..03fb8c609a 100644 --- a/src/components/LagPopoverContent/LagPopoverContent.tsx +++ b/src/components/LagPopoverContent/LagPopoverContent.tsx @@ -1,10 +1,9 @@ -import block from 'bem-cn-lite'; - +import {cn} from '../../utils/cn'; import {ReadLagImage, WriteLagImage} from '../LagImages'; import './LagPopoverContent.scss'; -const b = block('ydb-lag-popover-content'); +const b = cn('ydb-lag-popover-content'); interface LagPopoverContentProps { text: string; diff --git a/src/components/LinkToSchemaObject/LinkToSchemaObject.tsx b/src/components/LinkToSchemaObject/LinkToSchemaObject.tsx index 92a44f8a83..a741d2971e 100644 --- a/src/components/LinkToSchemaObject/LinkToSchemaObject.tsx +++ b/src/components/LinkToSchemaObject/LinkToSchemaObject.tsx @@ -1,10 +1,10 @@ +import {Link} from '@gravity-ui/uikit'; +import type {LinkProps} from '@gravity-ui/uikit'; import type {Location} from 'history'; -import {Link, type LinkProps} from '@gravity-ui/uikit'; - import {createExternalUILink, parseQuery} from '../../routes'; -interface LinkToSchemaObjectProps extends LinkProps { +interface LinkToSchemaObjectProps extends Omit { path: string; location: Location; } @@ -16,5 +16,5 @@ export function LinkToSchemaObject({path, location, ...props}: LinkToSchemaObjec schema: path, }); - return ; + return ; } diff --git a/src/components/LinkWithIcon/LinkWithIcon.tsx b/src/components/LinkWithIcon/LinkWithIcon.tsx index 288429a493..0961e3211d 100644 --- a/src/components/LinkWithIcon/LinkWithIcon.tsx +++ b/src/components/LinkWithIcon/LinkWithIcon.tsx @@ -1,13 +1,14 @@ -import block from 'bem-cn-lite'; - -import {Link} from '@gravity-ui/uikit'; +import React from 'react'; import {ArrowUpRightFromSquare} from '@gravity-ui/icons'; +import {Link} from '@gravity-ui/uikit'; +import {cn} from '../../utils/cn'; import {InternalLink} from '../InternalLink'; + import './LinkWithIcon.scss'; -const b = block('ydb-link-with-icon'); +const b = cn('ydb-link-with-icon'); interface ExternalLinkWithIconProps { title: string; @@ -17,11 +18,11 @@ interface ExternalLinkWithIconProps { export const LinkWithIcon = ({title, url, external = true}: ExternalLinkWithIconProps) => { const linkContent = ( - <> + {title} {'\u00a0'} - + ); if (external) { diff --git a/src/components/Loader/Loader.tsx b/src/components/Loader/Loader.tsx index f33adac68a..651fea7561 100644 --- a/src/components/Loader/Loader.tsx +++ b/src/components/Loader/Loader.tsx @@ -1,5 +1,7 @@ -import cn from 'bem-cn-lite'; -import {Loader as KitLoader, LoaderSize} from '@gravity-ui/uikit'; +import type {LoaderSize} from '@gravity-ui/uikit'; +import {Loader as KitLoader} from '@gravity-ui/uikit'; + +import {cn} from '../../utils/cn'; import './Loader.scss'; diff --git a/src/components/MetricChart/MetricChart.tsx b/src/components/MetricChart/MetricChart.tsx index a354f080ac..5c6e7fc0a5 100644 --- a/src/components/MetricChart/MetricChart.tsx +++ b/src/components/MetricChart/MetricChart.tsx @@ -1,26 +1,21 @@ -import {useCallback, useEffect, useReducer, useRef} from 'react'; +import React from 'react'; -import {YagrPlugin, YagrSeriesData, YagrWidgetData} from '@gravity-ui/chartkit/yagr'; import ChartKit, {settings} from '@gravity-ui/chartkit'; +import type {YagrSeriesData, YagrWidgetData} from '@gravity-ui/chartkit/yagr'; +import {YagrPlugin} from '@gravity-ui/chartkit/yagr'; import type {IResponseError} from '../../types/api/error'; -import type {TimeFrame} from '../../utils/timeframes'; -import {useAutofetcher} from '../../utils/hooks'; - import {cn} from '../../utils/cn'; - -import {Loader} from '../Loader'; +import {useAutofetcher} from '../../utils/hooks'; +import type {TimeFrame} from '../../utils/timeframes'; import {ResponseError} from '../Errors/ResponseError'; +import {Loader} from '../Loader'; -import type { - ChartOptions, - MetricDescription, - OnChartDataStatusChange, - PreparedMetricsData, -} from './types'; -import {convertResponse} from './convertReponse'; -import {getDefaultDataFormatter} from './getDefaultDataFormatter'; +import {colorToRGBA, colors} from './colors'; +import {convertResponse} from './convertResponse'; import {getChartData} from './getChartData'; +import {getDefaultDataFormatter} from './getDefaultDataFormatter'; +import i18n from './i18n'; import { chartReducer, initialChartState, @@ -29,8 +24,12 @@ import { setChartDataWasNotLoaded, setChartError, } from './reducer'; -import {colorToRGBA, colors} from './colors'; -import i18n from './i18n'; +import type { + ChartOptions, + MetricDescription, + OnChartDataStatusChange, + PreparedMetricsData, +} from './types'; import './MetricChart.scss'; @@ -143,21 +142,21 @@ export const MetricChart = ({ onChartDataStatusChange, isChartVisible, }: DiagnosticsChartProps) => { - const mounted = useRef(false); + const mounted = React.useRef(false); - useEffect(() => { + React.useEffect(() => { mounted.current = true; return () => { mounted.current = false; }; }, []); - const [{loading, wasLoaded, data, error}, dispatch] = useReducer( + const [{loading, wasLoaded, data, error}, dispatch] = React.useReducer( chartReducer, initialChartState, ); - useEffect(() => { + React.useEffect(() => { if (error) { return onChartDataStatusChange?.('error'); } @@ -171,7 +170,7 @@ export const MetricChart = ({ return undefined; }, [loading, wasLoaded, error, onChartDataStatusChange]); - const fetchChartData = useCallback( + const fetchChartData = React.useCallback( async (isBackground: boolean) => { dispatch(setChartDataLoading()); diff --git a/src/components/MetricChart/convertReponse.ts b/src/components/MetricChart/convertResponse.ts similarity index 99% rename from src/components/MetricChart/convertReponse.ts rename to src/components/MetricChart/convertResponse.ts index 7520d07880..95e6b844bc 100644 --- a/src/components/MetricChart/convertReponse.ts +++ b/src/components/MetricChart/convertResponse.ts @@ -1,4 +1,5 @@ import type {MetricData} from '../../types/api/render'; + import type {MetricDescription, PreparedMetric, PreparedMetricsData} from './types'; export const convertResponse = ( diff --git a/src/components/MetricChart/getChartData.ts b/src/components/MetricChart/getChartData.ts index 9b39031988..95117d3471 100644 --- a/src/components/MetricChart/getChartData.ts +++ b/src/components/MetricChart/getChartData.ts @@ -1,4 +1,6 @@ -import {TIMEFRAMES, type TimeFrame} from '../../utils/timeframes'; +import {TIMEFRAMES} from '../../utils/timeframes'; +import type {TimeFrame} from '../../utils/timeframes'; + import type {MetricDescription} from './types'; interface GetChartDataParams { diff --git a/src/components/MonitoringButton/MonitoringButton.tsx b/src/components/MonitoringButton/MonitoringButton.tsx index cb5d32c7a8..e8dd0157ff 100644 --- a/src/components/MonitoringButton/MonitoringButton.tsx +++ b/src/components/MonitoringButton/MonitoringButton.tsx @@ -1,6 +1,6 @@ -import cn from 'bem-cn-lite'; - import {Button} from '@gravity-ui/uikit'; + +import {cn} from '../../utils/cn'; import {Icon} from '../Icon'; import './MonitoringButton.scss'; diff --git a/src/components/NodeHostWrapper/NodeHostWrapper.tsx b/src/components/NodeHostWrapper/NodeHostWrapper.tsx index 2e751f4f92..d731c2720d 100644 --- a/src/components/NodeHostWrapper/NodeHostWrapper.tsx +++ b/src/components/NodeHostWrapper/NodeHostWrapper.tsx @@ -1,20 +1,18 @@ -import block from 'bem-cn-lite'; - import {Button, PopoverBehavior} from '@gravity-ui/uikit'; +import {getDefaultNodePath} from '../../containers/Node/NodePages'; import type {NodesPreparedEntity} from '../../store/reducers/nodes/types'; import type {NodeAddress} from '../../types/additionalProps'; -import {getDefaultNodePath} from '../../containers/Node/NodePages'; +import {cn} from '../../utils/cn'; import {isUnavailableNode} from '../../utils/nodes'; - +import {CellWithPopover} from '../CellWithPopover/CellWithPopover'; import {EntityStatus} from '../EntityStatus/EntityStatus'; -import {NodeEndpointsTooltipContent} from '../TooltipsContent'; import {Icon} from '../Icon'; -import {CellWithPopover} from '../CellWithPopover/CellWithPopover'; +import {NodeEndpointsTooltipContent} from '../TooltipsContent'; import './NodeHostWrapper.scss'; -const b = block('ydb-node-host-wrapper'); +const b = cn('ydb-node-host-wrapper'); interface NodeHostWrapperProps { node: NodesPreparedEntity; diff --git a/src/components/PDiskInfo/PDiskInfo.scss b/src/components/PDiskInfo/PDiskInfo.scss index 0313bf2fde..7685a1fad7 100644 --- a/src/components/PDiskInfo/PDiskInfo.scss +++ b/src/components/PDiskInfo/PDiskInfo.scss @@ -2,7 +2,6 @@ &__links { display: flex; flex-flow: row wrap; - gap: 12px; } } diff --git a/src/components/PDiskInfo/PDiskInfo.tsx b/src/components/PDiskInfo/PDiskInfo.tsx index 3f5875c6e0..c60cc01414 100644 --- a/src/components/PDiskInfo/PDiskInfo.tsx +++ b/src/components/PDiskInfo/PDiskInfo.tsx @@ -1,16 +1,17 @@ -import type {PreparedPDisk} from '../../utils/disks/types'; -import {createPDiskDeveloperUILink} from '../../utils/developerUI/developerUI'; -import {cn} from '../../utils/cn'; -import {formatStorageValuesToGb} from '../../utils/dataFormatters/dataFormatters'; +import {getPDiskPagePath} from '../../routes'; import {valueIsDefined} from '../../utils'; +import {cn} from '../../utils/cn'; import {EMPTY_DATA_PLACEHOLDER} from '../../utils/constants'; -import {getPDiskPagePath} from '../../routes'; - -import type {InfoViewerItem} from '../InfoViewer'; -import {InfoViewer, type InfoViewerProps} from '../InfoViewer/InfoViewer'; +import {formatStorageValuesToGb} from '../../utils/dataFormatters/dataFormatters'; +import {createPDiskDeveloperUILink} from '../../utils/developerUI/developerUI'; +import type {PreparedPDisk} from '../../utils/disks/types'; import {EntityStatus} from '../EntityStatus/EntityStatus'; +import type {InfoViewerItem} from '../InfoViewer'; +import {InfoViewer} from '../InfoViewer/InfoViewer'; +import type {InfoViewerProps} from '../InfoViewer/InfoViewer'; import {LinkWithIcon} from '../LinkWithIcon/LinkWithIcon'; import {ProgressViewer} from '../ProgressViewer/ProgressViewer'; + import {pDiskInfoKeyset} from './i18n'; import './PDiskInfo.scss'; diff --git a/src/components/PDiskPopup/PDiskPopup.tsx b/src/components/PDiskPopup/PDiskPopup.tsx index a839b184a4..a65102f0db 100644 --- a/src/components/PDiskPopup/PDiskPopup.tsx +++ b/src/components/PDiskPopup/PDiskPopup.tsx @@ -1,16 +1,17 @@ -import {useMemo} from 'react'; -import cn from 'bem-cn-lite'; +import React from 'react'; -import {Popup, PopupProps} from '@gravity-ui/uikit'; +import type {PopupProps} from '@gravity-ui/uikit'; +import {Popup} from '@gravity-ui/uikit'; -import type {NodesMap} from '../../types/store/nodesList'; import {EFlag} from '../../types/api/enums'; -import type {PreparedPDisk} from '../../utils/disks/types'; +import type {NodesMap} from '../../types/store/nodesList'; +import {cn} from '../../utils/cn'; +import {EMPTY_DATA_PLACEHOLDER} from '../../utils/constants'; import {getPDiskId} from '../../utils/dataFormatters/dataFormatters'; +import type {PreparedPDisk} from '../../utils/disks/types'; import {bytesToGB} from '../../utils/utils'; -import {EMPTY_DATA_PLACEHOLDER} from '../../utils/constants'; - -import {InfoViewer, InfoViewerItem} from '../InfoViewer'; +import type {InfoViewerItem} from '../InfoViewer'; +import {InfoViewer} from '../InfoViewer'; import './PDiskPopup.scss'; @@ -61,7 +62,7 @@ interface PDiskPopupProps extends PopupProps { } export const PDiskPopup = ({data, nodes, ...props}: PDiskPopupProps) => { - const info = useMemo(() => preparePDiskData(data, nodes), [data, nodes]); + const info = React.useMemo(() => preparePDiskData(data, nodes), [data, nodes]); return ( { if (usage >= 75) { diff --git a/src/components/PoolUsage/PoolUsage.tsx b/src/components/PoolUsage/PoolUsage.tsx index 63bca5a990..ab5615a462 100644 --- a/src/components/PoolUsage/PoolUsage.tsx +++ b/src/components/PoolUsage/PoolUsage.tsx @@ -1,10 +1,9 @@ -import block from 'bem-cn-lite'; - import type {TPoolStats} from '../../types/api/nodes'; +import {cn} from '../../utils/cn'; import './PoolUsage.scss'; -const b = block('ydb-pool-usage'); +const b = cn('ydb-pool-usage'); const getLineType = (fillWidth: number) => { let fillColor = 'green'; diff --git a/src/components/PoolsGraph/PoolsGraph.tsx b/src/components/PoolsGraph/PoolsGraph.tsx index dfec936304..8f9adf038a 100644 --- a/src/components/PoolsGraph/PoolsGraph.tsx +++ b/src/components/PoolsGraph/PoolsGraph.tsx @@ -1,12 +1,10 @@ -import block from 'bem-cn-lite'; - import type {TPoolStats} from '../../types/api/nodes'; - +import {cn} from '../../utils/cn'; import {PoolBar} from '../PoolBar/PoolBar'; import './PoolsGraph.scss'; -const b = block('ydb-pools-graph'); +const b = cn('ydb-pools-graph'); interface PoolsGraphProps { pools?: TPoolStats[]; diff --git a/src/components/ProblemFilter/ProblemFilter.tsx b/src/components/ProblemFilter/ProblemFilter.tsx index b76d18a0af..3ee00b4a8a 100644 --- a/src/components/ProblemFilter/ProblemFilter.tsx +++ b/src/components/ProblemFilter/ProblemFilter.tsx @@ -1,7 +1,7 @@ import {RadioButton} from '@gravity-ui/uikit'; -import type {ProblemFilterValue} from '../../store/reducers/settings/types'; import {ProblemFilterValues} from '../../store/reducers/settings/settings'; +import type {ProblemFilterValue} from '../../store/reducers/settings/types'; interface ProblemFilterProps { value: ProblemFilterValue; diff --git a/src/components/ProgressViewer/ProgressViewer.tsx b/src/components/ProgressViewer/ProgressViewer.tsx index 4ae44bd81a..2454f72432 100644 --- a/src/components/ProgressViewer/ProgressViewer.tsx +++ b/src/components/ProgressViewer/ProgressViewer.tsx @@ -1,9 +1,9 @@ -import cn from 'bem-cn-lite'; import {useTheme} from '@gravity-ui/uikit'; import type {ValueOf} from '../../types/common'; -import {isNumeric} from '../../utils/utils'; +import {cn} from '../../utils/cn'; import {formatNumber, roundToPrecision} from '../../utils/dataFormatters/dataFormatters'; +import {isNumeric} from '../../utils/utils'; import './ProgressViewer.scss'; diff --git a/src/components/QueryExecutionStatus/QueryExecutionStatus.scss b/src/components/QueryExecutionStatus/QueryExecutionStatus.scss index 67faa6c411..cc59d52a81 100644 --- a/src/components/QueryExecutionStatus/QueryExecutionStatus.scss +++ b/src/components/QueryExecutionStatus/QueryExecutionStatus.scss @@ -1,8 +1,7 @@ .kv-query-execution-status { display: flex; - gap: 4px; - align-items: center; + gap: 4px; color: var(--g-color-text-complementary); &__result-status-icon { diff --git a/src/components/QueryExecutionStatus/QueryExecutionStatus.tsx b/src/components/QueryExecutionStatus/QueryExecutionStatus.tsx index 352d58780f..b44baaa0fb 100644 --- a/src/components/QueryExecutionStatus/QueryExecutionStatus.tsx +++ b/src/components/QueryExecutionStatus/QueryExecutionStatus.tsx @@ -1,9 +1,7 @@ -import type {ReactNode} from 'react'; -import type {AxiosError} from 'axios'; -import cn from 'bem-cn-lite'; - import {Icon as UiKitIcon} from '@gravity-ui/uikit'; +import type {AxiosError} from 'axios'; +import {cn} from '../../utils/cn'; import {Icon} from '../Icon'; import questionIcon from '../../assets/icons/question.svg'; @@ -19,7 +17,7 @@ interface QueryExecutionStatusProps { } export const QueryExecutionStatus = ({className, error}: QueryExecutionStatusProps) => { - let icon: ReactNode; + let icon: React.ReactNode; let label: string; if (typeof error === 'object' && error?.code === 'ECONNABORTED') { diff --git a/src/components/QueryResultTable/Cell/Cell.tsx b/src/components/QueryResultTable/Cell/Cell.tsx index f08463154c..41b98dadc7 100644 --- a/src/components/QueryResultTable/Cell/Cell.tsx +++ b/src/components/QueryResultTable/Cell/Cell.tsx @@ -1,8 +1,7 @@ -import React, {useEffect} from 'react'; +import React from 'react'; +import {hideTooltip, showTooltip} from '../../../store/reducers/tooltip'; import {useTypedDispatch} from '../../../utils/hooks'; -import {showTooltip, hideTooltip} from '../../../store/reducers/tooltip'; - import {b} from '../QueryResultTable'; interface CellProps { @@ -15,7 +14,7 @@ export const Cell = React.memo(function Cell(props: CellProps) { const dispatch = useTypedDispatch(); - useEffect( + React.useEffect( () => () => { dispatch(hideTooltip()); }, diff --git a/src/components/QueryResultTable/QueryResultTable.tsx b/src/components/QueryResultTable/QueryResultTable.tsx index 8e09c18324..133ec737b2 100644 --- a/src/components/QueryResultTable/QueryResultTable.tsx +++ b/src/components/QueryResultTable/QueryResultTable.tsx @@ -1,17 +1,17 @@ -import {useMemo} from 'react'; -import cn from 'bem-cn-lite'; +import React from 'react'; import DataTable from '@gravity-ui/react-data-table'; import type {Column, DataTableProps, Settings} from '@gravity-ui/react-data-table'; import type {ColumnType, KeyValueRow} from '../../types/api/query'; +import {cn} from '../../utils/cn'; import {DEFAULT_TABLE_SETTINGS} from '../../utils/constants'; import {getColumnType, prepareQueryResponse} from '../../utils/query'; import {isNumeric} from '../../utils/utils'; import {Cell} from './Cell'; - import i18n from './i18n'; + import './QueryResultTable.scss'; const TABLE_SETTINGS: Settings = { @@ -78,11 +78,11 @@ interface QueryResultTableProps export const QueryResultTable = (props: QueryResultTableProps) => { const {columns: rawColumns, data: rawData, settings: settingsMix, ...restProps} = props; - const data = useMemo(() => prepareQueryResponse(rawData), [rawData]); - const columns = useMemo(() => { + const data = React.useMemo(() => prepareQueryResponse(rawData), [rawData]); + const columns = React.useMemo(() => { return rawColumns ? prepareTypedColumns(rawColumns) : prepareGenericColumns(data); }, [data, rawColumns]); - const settings = useMemo( + const settings = React.useMemo( () => ({ ...TABLE_SETTINGS, ...settingsMix, diff --git a/src/components/QueryResultTable/i18n/index.ts b/src/components/QueryResultTable/i18n/index.ts index 333e8fe57d..69ee2f9d1c 100644 --- a/src/components/QueryResultTable/i18n/index.ts +++ b/src/components/QueryResultTable/i18n/index.ts @@ -1,11 +1,8 @@ -import {i18n, Lang} from '../../../utils/i18n'; +import {registerKeysets} from '../../../utils/i18n'; import en from './en.json'; import ru from './ru.json'; const COMPONENT = 'ydb-query-result-table'; -i18n.registerKeyset(Lang.En, COMPONENT, en); -i18n.registerKeyset(Lang.Ru, COMPONENT, ru); - -export default i18n.keyset(COMPONENT); +export default registerKeysets(COMPONENT, {ru, en}); diff --git a/src/components/Search/Search.tsx b/src/components/Search/Search.tsx index 3c1354f18d..7beef51eba 100644 --- a/src/components/Search/Search.tsx +++ b/src/components/Search/Search.tsx @@ -1,8 +1,9 @@ -import {useRef, useEffect, useState} from 'react'; -import cn from 'bem-cn-lite'; +import React from 'react'; import {TextInput} from '@gravity-ui/uikit'; +import {cn} from '../../utils/cn'; + import './Search.scss'; const b = cn('ydb-search'); @@ -22,11 +23,11 @@ export const Search = ({ debounce = 200, placeholder, }: SearchProps) => { - const [searchValue, setSearchValue] = useState(value); + const [searchValue, setSearchValue] = React.useState(value); - const timer = useRef(); + const timer = React.useRef(); - useEffect(() => { + React.useEffect(() => { setSearchValue((prevValue) => { if (prevValue !== value) { return value; diff --git a/src/components/ShortyString/ShortyString.tsx b/src/components/ShortyString/ShortyString.tsx index ba99be0b4c..b5764ef395 100644 --- a/src/components/ShortyString/ShortyString.tsx +++ b/src/components/ShortyString/ShortyString.tsx @@ -1,9 +1,11 @@ -import * as React from 'react'; -import cn from 'bem-cn-lite'; +import React from 'react'; import {Link} from '@gravity-ui/uikit'; +import {cn} from '../../utils/cn'; + import i18n from './i18n'; + import './ShortyString.scss'; const block = cn('kv-shorty-string'); @@ -49,8 +51,10 @@ export default function ShortyString({ {hasToggle ? ( { e.stopPropagation(); + e.preventDefault(); setExpanded((v) => !v); onToggle?.(); }} diff --git a/src/components/ShortyString/i18n/index.ts b/src/components/ShortyString/i18n/index.ts index 3ae9ffb927..8d0cdb3279 100644 --- a/src/components/ShortyString/i18n/index.ts +++ b/src/components/ShortyString/i18n/index.ts @@ -1,11 +1,8 @@ -import {i18n, Lang} from '../../../utils/i18n'; +import {registerKeysets} from '../../../utils/i18n'; import en from './en.json'; import ru from './ru.json'; const COMPONENT = 'ydb-shorty-string'; -i18n.registerKeyset(Lang.En, COMPONENT, en); -i18n.registerKeyset(Lang.Ru, COMPONENT, ru); - -export default i18n.keyset(COMPONENT); +export default registerKeysets(COMPONENT, {ru, en}); diff --git a/src/components/SpeedMultiMeter/SpeedMultiMeter.tsx b/src/components/SpeedMultiMeter/SpeedMultiMeter.tsx index e496b5698c..4fe59d1e20 100644 --- a/src/components/SpeedMultiMeter/SpeedMultiMeter.tsx +++ b/src/components/SpeedMultiMeter/SpeedMultiMeter.tsx @@ -1,13 +1,15 @@ -import {useState} from 'react'; -import cn from 'bem-cn-lite'; -import {Popover} from '@gravity-ui/uikit'; +import React from 'react'; -import {formatBytes, BytesSizes, ProcessSpeedStats} from '../../utils/bytesParsers'; +import {Popover} from '@gravity-ui/uikit'; -import './SpeedMultiMeter.scss'; +import type {BytesSizes, ProcessSpeedStats} from '../../utils/bytesParsers'; +import {formatBytes} from '../../utils/bytesParsers'; +import {cn} from '../../utils/cn'; import i18n from './i18n'; +import './SpeedMultiMeter.scss'; + const b = cn('speed-multimeter'); interface SpeedMultiMeterProps { @@ -35,11 +37,11 @@ export const SpeedMultiMeter = ({ {value: formatValue(perDay), label: i18n('perDay')}, ]; - const [valueToDisplay, setValueToDisplay] = useState(perMinute); - const [highlightedValueIndex, setHighlightedValueIndex] = useState(withValue ? 0 : undefined); - const [highlightedContainerIndex, setHighlightedContainerIndex] = useState< - number | undefined - >(); + const [valueToDisplay, setValueToDisplay] = React.useState(perMinute); + const [highlightedValueIndex, setHighlightedValueIndex] = React.useState( + withValue ? 0 : undefined, + ); + const [highlightedContainerIndex, setHighlightedContainerIndex] = React.useState(); const onEnterDiagram = (values: number[], index: number) => { setValueToDisplay(values[index]); diff --git a/src/components/SpeedMultiMeter/i18n/index.ts b/src/components/SpeedMultiMeter/i18n/index.ts index e68ff76302..74d7017cf7 100644 --- a/src/components/SpeedMultiMeter/i18n/index.ts +++ b/src/components/SpeedMultiMeter/i18n/index.ts @@ -1,11 +1,8 @@ -import {i18n, Lang} from '../../../utils/i18n'; +import {registerKeysets} from '../../../utils/i18n'; import en from './en.json'; import ru from './ru.json'; const COMPONENT = 'ydb-components-speed-multimeter'; -i18n.registerKeyset(Lang.En, COMPONENT, en); -i18n.registerKeyset(Lang.Ru, COMPONENT, ru); - -export default i18n.keyset(COMPONENT); +export default registerKeysets(COMPONENT, {ru, en}); diff --git a/src/components/SplitPane/SplitPane.scss b/src/components/SplitPane/SplitPane.scss index 39ac812fbe..e05af1df46 100644 --- a/src/components/SplitPane/SplitPane.scss +++ b/src/components/SplitPane/SplitPane.scss @@ -28,10 +28,7 @@ &::after { position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; + inset: 0; content: ''; diff --git a/src/components/SplitPane/SplitPane.tsx b/src/components/SplitPane/SplitPane.tsx index f97d84bda9..9e49a8231e 100644 --- a/src/components/SplitPane/SplitPane.tsx +++ b/src/components/SplitPane/SplitPane.tsx @@ -1,7 +1,9 @@ -import cn from 'bem-cn-lite'; -import React, {useEffect, useState} from 'react'; +import React from 'react'; -import SplitPaneLib, {SplitProps} from 'react-split'; +import type {SplitProps} from 'react-split'; +import SplitPaneLib from 'react-split'; + +import {cn} from '../../utils/cn'; import './SplitPane.scss'; @@ -25,7 +27,7 @@ const minSizeDefaultInner = [0, 100]; const sizesDefaultInner = [50, 50]; function SplitPane(props: SplitPaneProps) { - const [innerSizes, setInnerSizes] = useState(); + const [innerSizes, setInnerSizes] = React.useState(); const getDefaultSizePane = () => { const {defaultSizePaneKey, defaultSizes = sizesDefaultInner, initialSizes} = props; @@ -55,7 +57,7 @@ function SplitPane(props: SplitPaneProps) { setInnerSizes(undefined); }; - useEffect(() => { + React.useEffect(() => { const {collapsedSizes, triggerCollapse} = props; if (triggerCollapse) { const newSizes = collapsedSizes || minSizeDefaultInner; @@ -64,7 +66,7 @@ function SplitPane(props: SplitPaneProps) { } }, [props.triggerCollapse]); - useEffect(() => { + React.useEffect(() => { const {triggerExpand, defaultSizes} = props; const newSizes = defaultSizes || sizesDefaultInner; if (triggerExpand) { diff --git a/src/components/Stack/Stack.scss b/src/components/Stack/Stack.scss index bdd1dc8947..9a12f95c00 100644 --- a/src/components/Stack/Stack.scss +++ b/src/components/Stack/Stack.scss @@ -44,12 +44,14 @@ .stack__layer + .stack__layer { transform: translate( calc( - var(--ydb-stack-level) * (var(--ydb-stack-offset-x-hover) * 2) - - var(--ydb-stack-offset-x-hover) + var(--ydb-stack-level) * (var(--ydb-stack-offset-x-hover) * 2) - var( + --ydb-stack-offset-x-hover + ) ), calc( - var(--ydb-stack-level) * (var(--ydb-stack-offset-y-hover) * 2) - - var(--ydb-stack-offset-y-hover) + var(--ydb-stack-level) * (var(--ydb-stack-offset-y-hover) * 2) - var( + --ydb-stack-offset-y-hover + ) ) ); } diff --git a/src/components/Stack/Stack.tsx b/src/components/Stack/Stack.tsx index 237dbccf50..0dad36ff6e 100644 --- a/src/components/Stack/Stack.tsx +++ b/src/components/Stack/Stack.tsx @@ -1,17 +1,19 @@ import React from 'react'; -import cn from 'bem-cn-lite'; + +import {cn} from '../../utils/cn'; import './Stack.scss'; interface StackProps { className?: string; + children: React.ReactNode; } const LAYER_CSS_VAR = '--ydb-stack-level'; const b = cn('stack'); -export const Stack: React.FC = ({children, className}) => ( +export const Stack = ({children, className}: StackProps) => (
{React.Children.map(children, (child, index) => { if (!React.isValidElement(child)) { diff --git a/src/components/StatusIcon/StatusIcon.tsx b/src/components/StatusIcon/StatusIcon.tsx index 3e7628cbbd..f0e0c7fafa 100644 --- a/src/components/StatusIcon/StatusIcon.tsx +++ b/src/components/StatusIcon/StatusIcon.tsx @@ -1,12 +1,13 @@ import {Icon} from '@gravity-ui/uikit'; +import {EFlag} from '../../types/api/enums'; +import {cn} from '../../utils/cn'; + import CircleExclamationFillIcon from '@gravity-ui/icons/svgs/circle-exclamation-fill.svg'; import CircleInfoFillIcon from '@gravity-ui/icons/svgs/circle-info-fill.svg'; import CircleXmarkFillIcon from '@gravity-ui/icons/svgs/circle-xmark-fill.svg'; import TriangleExclamationFillIcon from '@gravity-ui/icons/svgs/triangle-exclamation-fill.svg'; -import {EFlag} from '../../types/api/enums'; -import {cn} from '../../utils/cn'; import './StatusIcon.scss'; const b = cn('ydb-status-icon'); diff --git a/src/components/TableSkeleton/TableSkeleton.tsx b/src/components/TableSkeleton/TableSkeleton.tsx index 1378d2d924..004eb75847 100644 --- a/src/components/TableSkeleton/TableSkeleton.tsx +++ b/src/components/TableSkeleton/TableSkeleton.tsx @@ -1,17 +1,17 @@ -import {FC} from 'react'; -import block from 'bem-cn-lite'; import {Skeleton} from '@gravity-ui/uikit'; +import {cn} from '../../utils/cn'; + import './TableSkeleton.scss'; -const b = block('table-skeleton'); +const b = cn('table-skeleton'); interface TableSkeletonProps { className?: string; rows?: number; } -export const TableSkeleton: FC = ({rows = 2, className}) => ( +export const TableSkeleton = ({rows = 2, className}: TableSkeletonProps) => (
diff --git a/src/components/TableWithControlsLayout/TableWithControlsLayout.tsx b/src/components/TableWithControlsLayout/TableWithControlsLayout.tsx index 5b1a54bcf5..16a74fc4e3 100644 --- a/src/components/TableWithControlsLayout/TableWithControlsLayout.tsx +++ b/src/components/TableWithControlsLayout/TableWithControlsLayout.tsx @@ -1,14 +1,12 @@ -import type {ReactNode} from 'react'; -import block from 'bem-cn-lite'; - +import {cn} from '../../utils/cn'; import {TableSkeleton} from '../TableSkeleton/TableSkeleton'; import './TableWithControlsLayout.scss'; -const b = block('ydb-table-with-controls-layout'); +const b = cn('ydb-table-with-controls-layout'); interface TableWithControlsLayoutItemProps { - children: ReactNode; + children: React.ReactNode; className?: string; } diff --git a/src/components/Tablet/Tablet.tsx b/src/components/Tablet/Tablet.tsx index 37132afb23..6d48a2c5d2 100644 --- a/src/components/Tablet/Tablet.tsx +++ b/src/components/Tablet/Tablet.tsx @@ -1,12 +1,10 @@ -import cn from 'bem-cn-lite'; - +import routes, {createHref} from '../../routes'; import type {TTabletStateInfo} from '../../types/api/tablet'; +import {cn} from '../../utils/cn'; import {getTabletLabel} from '../../utils/constants'; -import routes, {createHref} from '../../routes'; - import {ContentWithPopup} from '../ContentWithPopup/ContentWithPopup'; -import {TabletIcon} from '../TabletIcon/TabletIcon'; import {InternalLink} from '../InternalLink'; +import {TabletIcon} from '../TabletIcon/TabletIcon'; import {TabletTooltipContent} from '../TooltipsContent'; import './Tablet.scss'; diff --git a/src/components/TabletIcon/TabletIcon.tsx b/src/components/TabletIcon/TabletIcon.tsx index ffb187ba7c..bad1768eca 100644 --- a/src/components/TabletIcon/TabletIcon.tsx +++ b/src/components/TabletIcon/TabletIcon.tsx @@ -1,4 +1,4 @@ -import cn from 'bem-cn-lite'; +import {cn} from '../../utils/cn'; import './TabletIcon.scss'; diff --git a/src/components/TabletsOverall/TabletsOverall.scss b/src/components/TabletsOverall/TabletsOverall.scss index 66c5ea2678..19c6229629 100644 --- a/src/components/TabletsOverall/TabletsOverall.scss +++ b/src/components/TabletsOverall/TabletsOverall.scss @@ -1,9 +1,8 @@ .kv-tablets-overall { &__row { display: flex; - gap: 8px; - align-items: center; + gap: 8px; &_overall { .yc-progress { diff --git a/src/components/TabletsOverall/TabletsOverall.tsx b/src/components/TabletsOverall/TabletsOverall.tsx index 872fb6afca..bef76212ab 100644 --- a/src/components/TabletsOverall/TabletsOverall.tsx +++ b/src/components/TabletsOverall/TabletsOverall.tsx @@ -1,10 +1,9 @@ -import cn from 'bem-cn-lite'; - import {Progress} from '@gravity-ui/uikit'; import {hideTooltip, showTooltip} from '../../store/reducers/tooltip'; -import {useTypedDispatch} from '../../utils/hooks'; +import {cn} from '../../utils/cn'; import {COLORS_PRIORITY} from '../../utils/constants'; +import {useTypedDispatch} from '../../utils/hooks'; import './TabletsOverall.scss'; @@ -47,16 +46,19 @@ function TabletsOverall({tablets}: TabletsOverallProps) { }; // determine how many tablets of what color are in "tablets" - const statesForOverallProgress: Record = tablets.reduce((acc, tablet) => { - const color = tablet.Overall?.toLowerCase(); - if (color && !acc[color]) { - acc[color] = 1; - } else if (color) { - acc[color]++; - } + const statesForOverallProgress: Record = tablets.reduce( + (acc, tablet) => { + const color = tablet.Overall?.toLowerCase(); + if (color && !acc[color]) { + acc[color] = 1; + } else if (color) { + acc[color]++; + } - return acc; - }, {} as Record); + return acc; + }, + {} as Record, + ); const tooltipData: {color: string; percents: number; value: number; total: number}[] = []; diff --git a/src/components/TabletsStatistic/TabletsStatistic.tsx b/src/components/TabletsStatistic/TabletsStatistic.tsx index 28d9d37c54..cd0428848e 100644 --- a/src/components/TabletsStatistic/TabletsStatistic.tsx +++ b/src/components/TabletsStatistic/TabletsStatistic.tsx @@ -1,12 +1,11 @@ -import cn from 'bem-cn-lite'; import {Link} from 'react-router-dom'; -import {getTabletLabel} from '../../utils/constants'; -import {mapTabletStateToColorState} from '../../utils/tablet'; import routes, {createHref} from '../../routes'; - -import type {TTabletStateInfo as TFullTabletStateInfo} from '../../types/api/tablet'; import type {TTabletStateInfo as TComputeTabletStateInfo} from '../../types/api/compute'; +import type {TTabletStateInfo as TFullTabletStateInfo} from '../../types/api/tablet'; +import {cn} from '../../utils/cn'; +import {getTabletLabel} from '../../utils/constants'; +import {mapTabletStateToColorState} from '../../utils/tablet'; import './TabletsStatistic.scss'; diff --git a/src/components/Tag/Tag.tsx b/src/components/Tag/Tag.tsx index d3a1fd8ee2..241e91d1b1 100644 --- a/src/components/Tag/Tag.tsx +++ b/src/components/Tag/Tag.tsx @@ -1,4 +1,4 @@ -import cn from 'bem-cn-lite'; +import {cn} from '../../utils/cn'; import './Tag.scss'; diff --git a/src/components/Tags/Tags.tsx b/src/components/Tags/Tags.tsx index d177adf0a1..ee0054dfbc 100644 --- a/src/components/Tags/Tags.tsx +++ b/src/components/Tags/Tags.tsx @@ -1,6 +1,6 @@ -import cn from 'bem-cn-lite'; - -import {Tag, TagType} from '../Tag'; +import {cn} from '../../utils/cn'; +import type {TagType} from '../Tag'; +import {Tag} from '../Tag'; import './Tags.scss'; diff --git a/src/components/TimeFrameSelector/TimeFrameSelector.scss b/src/components/TimeFrameSelector/TimeFrameSelector.scss index f4ff043f2f..d9d7f03fa8 100644 --- a/src/components/TimeFrameSelector/TimeFrameSelector.scss +++ b/src/components/TimeFrameSelector/TimeFrameSelector.scss @@ -1,5 +1,4 @@ .ydb-timeframe-selector { display: flex; - gap: 2px; } diff --git a/src/components/TimeFrameSelector/TimeFrameSelector.tsx b/src/components/TimeFrameSelector/TimeFrameSelector.tsx index 5729f25355..83f5910b6f 100644 --- a/src/components/TimeFrameSelector/TimeFrameSelector.tsx +++ b/src/components/TimeFrameSelector/TimeFrameSelector.tsx @@ -1,7 +1,8 @@ import {Button} from '@gravity-ui/uikit'; import {cn} from '../../utils/cn'; -import {TIMEFRAMES, type TimeFrame} from '../../utils/timeframes'; +import {TIMEFRAMES} from '../../utils/timeframes'; +import type {TimeFrame} from '../../utils/timeframes'; import './TimeFrameSelector.scss'; diff --git a/src/components/TooltipsContent/NodeEndpointsTooltipContent/NodeEndpointsTooltipContent.tsx b/src/components/TooltipsContent/NodeEndpointsTooltipContent/NodeEndpointsTooltipContent.tsx index c6cecb6ad2..336f446f67 100644 --- a/src/components/TooltipsContent/NodeEndpointsTooltipContent/NodeEndpointsTooltipContent.tsx +++ b/src/components/TooltipsContent/NodeEndpointsTooltipContent/NodeEndpointsTooltipContent.tsx @@ -1,12 +1,11 @@ -import block from 'bem-cn-lite'; - import type {TSystemStateInfo} from '../../../types/api/nodes'; - -import {InfoViewer, InfoViewerItem} from '../../InfoViewer'; +import {cn} from '../../../utils/cn'; +import type {InfoViewerItem} from '../../InfoViewer'; +import {InfoViewer} from '../../InfoViewer'; import './NodeEndpointsTooltipContent.scss'; -const b = block('ydb-node-endpoints-tooltip-content'); +const b = cn('ydb-node-endpoints-tooltip-content'); interface NodeEdpointsTooltipProps { data?: TSystemStateInfo; diff --git a/src/components/TooltipsContent/PoolTooltipContent/PoolTooltipContent.tsx b/src/components/TooltipsContent/PoolTooltipContent/PoolTooltipContent.tsx index 048e6b6bdb..a25aa25aa0 100644 --- a/src/components/TooltipsContent/PoolTooltipContent/PoolTooltipContent.tsx +++ b/src/components/TooltipsContent/PoolTooltipContent/PoolTooltipContent.tsx @@ -1,5 +1,4 @@ import type {TPoolStats} from '../../../types/api/nodes'; - import {InfoViewer, createInfoFormatter, formatObject} from '../../InfoViewer'; const formatPool = createInfoFormatter({ diff --git a/src/components/TooltipsContent/TabletTooltipContent/TabletTooltipContent.tsx b/src/components/TooltipsContent/TabletTooltipContent/TabletTooltipContent.tsx index 57ce5e89e3..9ef3569be7 100644 --- a/src/components/TooltipsContent/TabletTooltipContent/TabletTooltipContent.tsx +++ b/src/components/TooltipsContent/TabletTooltipContent/TabletTooltipContent.tsx @@ -1,5 +1,4 @@ import type {TTabletStateInfo} from '../../../types/api/tablet'; - import {calcUptime} from '../../../utils/dataFormatters/dataFormatters'; import {InfoViewer, createInfoFormatter, formatObject} from '../../InfoViewer'; diff --git a/src/components/TruncatedQuery/TruncatedQuery.tsx b/src/components/TruncatedQuery/TruncatedQuery.tsx index bedc8977d3..60ff1593aa 100644 --- a/src/components/TruncatedQuery/TruncatedQuery.tsx +++ b/src/components/TruncatedQuery/TruncatedQuery.tsx @@ -1,5 +1,6 @@ -import cn from 'bem-cn-lite'; +import React from 'react'; +import {cn} from '../../utils/cn'; import {CellWithPopover} from '../CellWithPopover/CellWithPopover'; import './TruncatedQuery.scss'; @@ -20,13 +21,13 @@ export const TruncatedQuery = ({value = '', maxQueryHeight = 6}: TruncatedQueryP const message = '\n...\nThe request was truncated. Click on the line to show the full query on the query tab'; return ( - <> + {content} {message} - + ); } - return <>{value}; + return {value}; }; interface OneLineQueryWithPopoverProps { diff --git a/src/components/UptimeFIlter/UptimeFilter.tsx b/src/components/UptimeFIlter/UptimeFilter.tsx index 2f8a4acee2..4b83241107 100644 --- a/src/components/UptimeFIlter/UptimeFilter.tsx +++ b/src/components/UptimeFIlter/UptimeFilter.tsx @@ -1,6 +1,6 @@ import {RadioButton} from '@gravity-ui/uikit'; -import {NodesUptimeFilterValues, NodesUptimeFilterTitles} from '../../utils/nodes'; +import {NodesUptimeFilterTitles, NodesUptimeFilterValues} from '../../utils/nodes'; interface UptimeFilterProps { value: NodesUptimeFilterValues; diff --git a/src/components/UsageLabel/UsageLabel.tsx b/src/components/UsageLabel/UsageLabel.tsx index f7446c3e38..b6cbc5bcc4 100644 --- a/src/components/UsageLabel/UsageLabel.tsx +++ b/src/components/UsageLabel/UsageLabel.tsx @@ -1,6 +1,7 @@ -import cn from 'bem-cn-lite'; +import {Label} from '@gravity-ui/uikit'; +import type {LabelProps} from '@gravity-ui/uikit'; -import {Label, type LabelProps} from '@gravity-ui/uikit'; +import {cn} from '../../utils/cn'; import './UsageLabel.scss'; diff --git a/src/components/VDisk/VDisk.tsx b/src/components/VDisk/VDisk.tsx index 7ef45f9c3f..611f889513 100644 --- a/src/components/VDisk/VDisk.tsx +++ b/src/components/VDisk/VDisk.tsx @@ -1,18 +1,15 @@ -import React, {useState, useRef} from 'react'; -import cn from 'bem-cn-lite'; +import React from 'react'; -import type {NodesMap} from '../../types/store/nodesList'; - -import type {PreparedVDisk} from '../../utils/disks/types'; +import {STRUCTURE} from '../../containers/Node/NodePages'; import routes, {createHref} from '../../routes'; +import type {NodesMap} from '../../types/store/nodesList'; +import {cn} from '../../utils/cn'; import {stringifyVdiskId} from '../../utils/dataFormatters/dataFormatters'; import {isFullVDiskData} from '../../utils/disks/helpers'; - -import {STRUCTURE} from '../../containers/Node/NodePages'; - -import {VDiskPopup} from '../VDiskPopup/VDiskPopup'; +import type {PreparedVDisk} from '../../utils/disks/types'; import {DiskStateProgressBar} from '../DiskStateProgressBar/DiskStateProgressBar'; import {InternalLink} from '../InternalLink'; +import {VDiskPopup} from '../VDiskPopup/VDiskPopup'; import './VDisk.scss'; @@ -27,9 +24,9 @@ interface VDiskProps { export const VDisk = ({data = {}, nodes, compact}: VDiskProps) => { const isFullData = isFullVDiskData(data); - const [isPopupVisible, setIsPopupVisible] = useState(false); + const [isPopupVisible, setIsPopupVisible] = React.useState(false); - const anchor = useRef(null); + const anchor = React.useRef(null); const showPopup = () => { setIsPopupVisible(true); diff --git a/src/components/VDisk/VDiskWithDonorsStack.tsx b/src/components/VDisk/VDiskWithDonorsStack.tsx index 221ccea31c..f7f0a2babb 100644 --- a/src/components/VDisk/VDiskWithDonorsStack.tsx +++ b/src/components/VDisk/VDiskWithDonorsStack.tsx @@ -1,9 +1,9 @@ import type {NodesMap} from '../../types/store/nodesList'; -import type {PreparedVDisk} from '../../utils/disks/types'; import {stringifyVdiskId} from '../../utils/dataFormatters/dataFormatters'; import {isFullVDiskData} from '../../utils/disks/helpers'; - +import type {PreparedVDisk} from '../../utils/disks/types'; import {Stack} from '../Stack/Stack'; + import {VDisk} from './VDisk'; interface VDiskWithDonorsStackProps { diff --git a/src/components/VDiskInfo/VDiskInfo.scss b/src/components/VDiskInfo/VDiskInfo.scss index 244b93dccc..ac8d681385 100644 --- a/src/components/VDiskInfo/VDiskInfo.scss +++ b/src/components/VDiskInfo/VDiskInfo.scss @@ -2,7 +2,6 @@ &__links { display: flex; flex-flow: row wrap; - gap: 12px; } } diff --git a/src/components/VDiskInfo/VDiskInfo.tsx b/src/components/VDiskInfo/VDiskInfo.tsx index 92f2873f99..90c7c3b368 100644 --- a/src/components/VDiskInfo/VDiskInfo.tsx +++ b/src/components/VDiskInfo/VDiskInfo.tsx @@ -1,16 +1,16 @@ -import type {PreparedVDisk} from '../../utils/disks/types'; +import {getVDiskPagePath} from '../../routes'; import {valueIsDefined} from '../../utils'; -import {formatStorageValuesToGb} from '../../utils/dataFormatters/dataFormatters'; -import {bytesToSpeed} from '../../utils/utils'; import {cn} from '../../utils/cn'; +import {formatStorageValuesToGb} from '../../utils/dataFormatters/dataFormatters'; import {createVDiskDeveloperUILink} from '../../utils/developerUI/developerUI'; -import {getVDiskPagePath} from '../../routes'; - -import type {InfoViewerProps} from '../InfoViewer/InfoViewer'; -import {InfoViewer} from '../InfoViewer'; +import type {PreparedVDisk} from '../../utils/disks/types'; +import {bytesToSpeed} from '../../utils/utils'; import {EntityStatus} from '../EntityStatus/EntityStatus'; +import {InfoViewer} from '../InfoViewer'; +import type {InfoViewerProps} from '../InfoViewer/InfoViewer'; import {LinkWithIcon} from '../LinkWithIcon/LinkWithIcon'; import {ProgressViewer} from '../ProgressViewer/ProgressViewer'; + import {vDiskInfoKeyset} from './i18n'; import './VDiskInfo.scss'; diff --git a/src/components/VDiskPopup/VDiskPopup.tsx b/src/components/VDiskPopup/VDiskPopup.tsx index 5238b1acbd..d09c355248 100644 --- a/src/components/VDiskPopup/VDiskPopup.tsx +++ b/src/components/VDiskPopup/VDiskPopup.tsx @@ -1,19 +1,20 @@ -import {useMemo} from 'react'; -import cn from 'bem-cn-lite'; +import React from 'react'; -import {Label, Popup, PopupProps} from '@gravity-ui/uikit'; +import type {PopupProps} from '@gravity-ui/uikit'; +import {Label, Popup} from '@gravity-ui/uikit'; -import type {NodesMap} from '../../types/store/nodesList'; import {EFlag} from '../../types/api/enums'; import type {TVDiskStateInfo} from '../../types/api/vdisk'; -import type {UnavailableDonor} from '../../utils/disks/types'; +import type {NodesMap} from '../../types/store/nodesList'; +import {cn} from '../../utils/cn'; +import {EMPTY_DATA_PLACEHOLDER} from '../../utils/constants'; import {stringifyVdiskId} from '../../utils/dataFormatters/dataFormatters'; -import {bytesToGB, bytesToSpeed} from '../../utils/utils'; import {isFullVDiskData} from '../../utils/disks/helpers'; -import {EMPTY_DATA_PLACEHOLDER} from '../../utils/constants'; - +import type {UnavailableDonor} from '../../utils/disks/types'; +import {bytesToGB, bytesToSpeed} from '../../utils/utils'; +import type {InfoViewerItem} from '../InfoViewer'; +import {InfoViewer} from '../InfoViewer'; import {preparePDiskData} from '../PDiskPopup/PDiskPopup'; -import {InfoViewer, InfoViewerItem} from '../InfoViewer'; import './VDiskPopup.scss'; @@ -134,11 +135,11 @@ interface VDiskPopupProps extends PopupProps { export const VDiskPopup = ({data, nodes, ...props}: VDiskPopupProps) => { const isFullData = isFullVDiskData(data); - const vdiskInfo = useMemo( + const vdiskInfo = React.useMemo( () => (isFullData ? prepareVDiskData(data) : prepareUnavailableVDiskData(data)), [data, isFullData], ); - const pdiskInfo = useMemo( + const pdiskInfo = React.useMemo( () => isFullData && data.PDisk && preparePDiskData(data.PDisk, nodes), [data, nodes, isFullData], ); diff --git a/src/components/VirtualTable/TableChunk.tsx b/src/components/VirtualTable/TableChunk.tsx index 7a5126eaaf..e8e50a01f6 100644 --- a/src/components/VirtualTable/TableChunk.tsx +++ b/src/components/VirtualTable/TableChunk.tsx @@ -1,12 +1,12 @@ -import {useEffect, useRef, memo} from 'react'; +import React from 'react'; import {getArray} from '../../utils'; -import type {Column, Chunk, GetRowClassName} from './types'; import {LoadingTableRow, TableRow} from './TableRow'; +import type {Chunk, Column, GetRowClassName} from './types'; // With original memo generic types are lost -const typedMemo: (Component: T) => T = memo; +const typedMemo: (Component: T) => T = React.memo; interface TableChunkProps { id: number; @@ -28,9 +28,9 @@ export const TableChunk = typedMemo(function TableChunk({ observer, getRowClassName, }: TableChunkProps) { - const ref = useRef(null); + const ref = React.useRef(null); - useEffect(() => { + React.useEffect(() => { const el = ref.current; if (el) { observer.observe(el); diff --git a/src/components/VirtualTable/TableHead.tsx b/src/components/VirtualTable/TableHead.tsx index 06e5340c3b..e477206fc6 100644 --- a/src/components/VirtualTable/TableHead.tsx +++ b/src/components/VirtualTable/TableHead.tsx @@ -1,11 +1,10 @@ -import {useCallback, useEffect, useMemo, useRef, useState} from 'react'; +import React from 'react'; import type { HandleTableColumnsResize, TableColumnsWidthSetup, } from '../../utils/hooks/useTableResize'; -import type {Column, OnSort, SortOrderType, SortParams} from './types'; import { ASCENDING, DEFAULT_RESIZEABLE, @@ -14,6 +13,7 @@ import { DESCENDING, } from './constants'; import {b} from './shared'; +import type {Column, OnSort, SortOrderType, SortParams} from './types'; const COLUMN_NAME_HTML_ATTRIBUTE = 'data-columnname'; @@ -70,9 +70,9 @@ export const TableHeadCell = ({ onCellMount, onCellUnMount, }: TableHeadCellProps) => { - const cellWrapperRef = useRef(null); + const cellWrapperRef = React.useRef(null); - useEffect(() => { + React.useEffect(() => { const cellWrapper = cellWrapperRef.current; if (cellWrapper) { onCellMount?.(cellWrapper); @@ -138,11 +138,11 @@ export const TableHead = ({ defaultSortOrder = DEFAULT_SORT_ORDER, rowHeight = DEFAULT_TABLE_ROW_HEIGHT, }: TableHeadProps) => { - const [sortParams, setSortParams] = useState({}); + const [sortParams, setSortParams] = React.useState({}); const isTableResizeable = Boolean(onColumnsResize); - const resizeObserver: ResizeObserver | undefined = useMemo(() => { + const resizeObserver: ResizeObserver | undefined = React.useMemo(() => { if (!isTableResizeable) { return undefined; } @@ -159,13 +159,13 @@ export const TableHead = ({ }); }, [onColumnsResize, isTableResizeable]); - const handleCellMount = useCallback( + const handleCellMount = React.useCallback( (element: Element) => { resizeObserver?.observe(element); }, [resizeObserver], ); - const handleCellUnMount = useCallback( + const handleCellUnMount = React.useCallback( (element: Element) => { resizeObserver?.unobserve(element); }, @@ -242,9 +242,9 @@ export const TableHead = ({ }; return ( - <> + {renderTableColGroups()} {renderTableHead()} - + ); }; diff --git a/src/components/VirtualTable/TableRow.tsx b/src/components/VirtualTable/TableRow.tsx index b9aa717818..7d80c68573 100644 --- a/src/components/VirtualTable/TableRow.tsx +++ b/src/components/VirtualTable/TableRow.tsx @@ -1,16 +1,14 @@ -import {type ReactNode} from 'react'; - import {Skeleton} from '@gravity-ui/uikit'; -import type {AlignType, Column, GetRowClassName} from './types'; import {DEFAULT_ALIGN} from './constants'; import {b} from './shared'; +import type {AlignType, Column, GetRowClassName} from './types'; interface TableCellProps { height: number; width: number; align?: AlignType; - children: ReactNode; + children: React.ReactNode; className?: string; } @@ -90,7 +88,7 @@ export const TableRow = ({row, index, columns, getRowClassName, height}: Tab interface EmptyTableRowProps { columns: Column[]; - children?: ReactNode; + children?: React.ReactNode; } export const EmptyTableRow = ({columns, children}: EmptyTableRowProps) => { diff --git a/src/components/VirtualTable/VirtualTable.tsx b/src/components/VirtualTable/VirtualTable.tsx index c126188401..48beca0705 100644 --- a/src/components/VirtualTable/VirtualTable.tsx +++ b/src/components/VirtualTable/VirtualTable.tsx @@ -1,25 +1,16 @@ -import {useState, useReducer, useRef, useCallback, useEffect} from 'react'; - -import type {HandleTableColumnsResize} from '../../utils/hooks/useTableResize'; +import React from 'react'; import type {IResponseError} from '../../types/api/error'; import {getArray} from '../../utils'; - -import {TableWithControlsLayout} from '../TableWithControlsLayout/TableWithControlsLayout'; +import type {HandleTableColumnsResize} from '../../utils/hooks/useTableResize'; import {ResponseError} from '../Errors/ResponseError'; +import {TableWithControlsLayout} from '../TableWithControlsLayout/TableWithControlsLayout'; -import type { - Column, - OnSort, - FetchData, - SortParams, - RenderControls, - OnEntry, - OnLeave, - GetRowClassName, - RenderEmptyDataMessage, - RenderErrorMessage, -} from './types'; +import {TableChunk} from './TableChunk'; +import {TableHead} from './TableHead'; +import {EmptyTableRow} from './TableRow'; +import {DEFAULT_REQUEST_TIMEOUT, DEFAULT_TABLE_ROW_HEIGHT} from './constants'; +import i18n from './i18n'; import { createVirtualTableReducer, initChunk, @@ -29,13 +20,20 @@ import { setChunkError, setChunkLoading, } from './reducer'; -import {DEFAULT_REQUEST_TIMEOUT, DEFAULT_TABLE_ROW_HEIGHT} from './constants'; -import {TableHead} from './TableHead'; -import {TableChunk} from './TableChunk'; -import {EmptyTableRow} from './TableRow'; -import {useIntersectionObserver} from './useIntersectionObserver'; -import i18n from './i18n'; import {b} from './shared'; +import type { + Column, + FetchData, + GetRowClassName, + OnEntry, + OnLeave, + OnSort, + RenderControls, + RenderEmptyDataMessage, + RenderErrorMessage, + SortParams, +} from './types'; +import {useIntersectionObserver} from './useIntersectionObserver'; import './VirtualTable.scss'; @@ -70,21 +68,21 @@ export const VirtualTable = ({ renderErrorMessage, dependencyArray, }: VirtualTableProps) => { - const inited = useRef(false); - const tableContainer = useRef(null); + const inited = React.useRef(false); + const tableContainer = React.useRef(null); - const [state, dispatch] = useReducer(createVirtualTableReducer(), {}); + const [state, dispatch] = React.useReducer(createVirtualTableReducer(), {}); - const [sortParams, setSortParams] = useState(initialSortParams); + const [sortParams, setSortParams] = React.useState(initialSortParams); - const [totalEntities, setTotalEntities] = useState(limit); - const [foundEntities, setFoundEntities] = useState(0); + const [totalEntities, setTotalEntities] = React.useState(limit); + const [foundEntities, setFoundEntities] = React.useState(0); - const [error, setError] = useState(); + const [error, setError] = React.useState(); - const pendingRequests = useRef>>({}); + const pendingRequests = React.useRef>>({}); - const fetchChunkData = useCallback( + const fetchChunkData = React.useCallback( async (id: string) => { dispatch(setChunkLoading(id)); @@ -122,11 +120,11 @@ export const VirtualTable = ({ [fetchData, limit, sortParams], ); - const onEntry = useCallback((id) => { + const onEntry = React.useCallback((id) => { dispatch(initChunk(id)); }, []); - const onLeave = useCallback((id) => { + const onLeave = React.useCallback((id) => { dispatch(removeChunk(id)); // If there is a pending request for the removed chunk, cancel it @@ -139,7 +137,7 @@ export const VirtualTable = ({ }, []); // Cancel all pending requests on component unmount - useEffect(() => { + React.useEffect(() => { return () => { Object.values(pendingRequests.current).forEach((timer) => { window.clearTimeout(timer); @@ -151,7 +149,7 @@ export const VirtualTable = ({ // Load chunks if they become active // This mecanism helps to set chunk active state from different sources, but load data only once // Only currently active chunks should be in state so iteration by the whole state shouldn't be a problem - useEffect(() => { + React.useEffect(() => { for (const id of Object.keys(state)) { const chunk = state[Number(id)]; @@ -162,7 +160,7 @@ export const VirtualTable = ({ }, [fetchChunkData, state]); // Reset table on filters change - useEffect(() => { + React.useEffect(() => { // Reset counts, so table unmount unneeded chunks setTotalEntities(limit); setFoundEntities(0); diff --git a/src/components/VirtualTable/i18n/index.ts b/src/components/VirtualTable/i18n/index.ts index a1da51ba0c..3cae5eeb32 100644 --- a/src/components/VirtualTable/i18n/index.ts +++ b/src/components/VirtualTable/i18n/index.ts @@ -1,11 +1,8 @@ -import {i18n, Lang} from '../../../utils/i18n'; +import {registerKeysets} from '../../../utils/i18n'; import en from './en.json'; import ru from './ru.json'; const COMPONENT = 'ydb-virtual-table'; -i18n.registerKeyset(Lang.En, COMPONENT, en); -i18n.registerKeyset(Lang.Ru, COMPONENT, ru); - -export default i18n.keyset(COMPONENT); +export default registerKeysets(COMPONENT, {ru, en}); diff --git a/src/components/VirtualTable/reducer.ts b/src/components/VirtualTable/reducer.ts index 2206187914..d651e2c8ea 100644 --- a/src/components/VirtualTable/reducer.ts +++ b/src/components/VirtualTable/reducer.ts @@ -1,5 +1,3 @@ -import type {Reducer} from 'react'; - import type {IResponseError} from '../../types/api/error'; import type {Chunk} from './types'; @@ -73,7 +71,7 @@ type VirtualTableAction = // Reducer wrapped in additional function to pass generic type export const createVirtualTableReducer = - (): Reducer, VirtualTableAction> => + (): React.Reducer, VirtualTableAction> => (state, action) => { switch (action.type) { case SET_CHUNK_DATA: { diff --git a/src/components/VirtualTable/shared.ts b/src/components/VirtualTable/shared.ts index 3471df3704..e3f9fa8333 100644 --- a/src/components/VirtualTable/shared.ts +++ b/src/components/VirtualTable/shared.ts @@ -1,3 +1,3 @@ -import cn from 'bem-cn-lite'; +import {cn} from '../../utils/cn'; export const b = cn('ydb-virtual-table'); diff --git a/src/components/VirtualTable/types.ts b/src/components/VirtualTable/types.ts index e129c84fa4..5f6d5a82ae 100644 --- a/src/components/VirtualTable/types.ts +++ b/src/components/VirtualTable/types.ts @@ -1,8 +1,6 @@ -import type {ReactNode} from 'react'; - import type {IResponseError} from '../../types/api/error'; -import {ASCENDING, CENTER, DESCENDING, LEFT, RIGHT} from './constants'; +import type {ASCENDING, CENTER, DESCENDING, LEFT, RIGHT} from './constants'; export interface Chunk { active: boolean; @@ -25,11 +23,11 @@ export type OnSort = (params: SortParams) => void; export interface Column { name: string; - header?: ReactNode; + header?: React.ReactNode; className?: string; sortable?: boolean; resizeable?: boolean; - render: (props: {row: T; index: number}) => ReactNode; + render: (props: {row: T; index: number}) => React.ReactNode; width: number; align: AlignType; } @@ -54,8 +52,8 @@ interface ControlsParams { inited: boolean; } -export type RenderControls = (params: ControlsParams) => ReactNode; -export type RenderEmptyDataMessage = () => ReactNode; -export type RenderErrorMessage = (error: IResponseError) => ReactNode; +export type RenderControls = (params: ControlsParams) => React.ReactNode; +export type RenderEmptyDataMessage = () => React.ReactNode; +export type RenderErrorMessage = (error: IResponseError) => React.ReactNode; export type GetRowClassName = (row: T) => string | undefined; diff --git a/src/components/VirtualTable/useIntersectionObserver.ts b/src/components/VirtualTable/useIntersectionObserver.ts index 2913f282d1..af987c1ae8 100644 --- a/src/components/VirtualTable/useIntersectionObserver.ts +++ b/src/components/VirtualTable/useIntersectionObserver.ts @@ -1,7 +1,7 @@ -import {useEffect, useRef} from 'react'; +import React from 'react'; -import type {OnEntry, OnLeave} from './types'; import {DEFAULT_INTERSECTION_OBSERVER_MARGIN} from './constants'; +import type {OnEntry, OnLeave} from './types'; interface UseIntersectionObserverProps { onEntry: OnEntry; @@ -15,9 +15,9 @@ export const useIntersectionObserver = ({ onLeave, parentContainer, }: UseIntersectionObserverProps) => { - const observer = useRef(); + const observer = React.useRef(); - useEffect(() => { + React.useEffect(() => { const callback = (entries: IntersectionObserverEntry[]) => { entries.forEach((entry) => { if (entry.isIntersecting) { diff --git a/src/components/slots/SlotMap.ts b/src/components/slots/SlotMap.ts index 98ca4e5e93..468aa78274 100644 --- a/src/components/slots/SlotMap.ts +++ b/src/components/slots/SlotMap.ts @@ -1,7 +1,7 @@ import React from 'react'; -import {isSlotComponent, isSlotElement} from './utils'; import type {SlotComponent, SlotItem} from './types'; +import {isSlotComponent, isSlotElement} from './utils'; export class SlotMap { readonly children?: React.ReactNode = null; diff --git a/src/components/slots/types.ts b/src/components/slots/types.ts index e2c8257f2c..cf44ae655d 100644 --- a/src/components/slots/types.ts +++ b/src/components/slots/types.ts @@ -1,5 +1,5 @@ export interface SlotComponent - extends React.FC> { + extends React.FC}> { /** * @internal */ @@ -16,5 +16,5 @@ export interface SlotItem { type ExtractChildrenType = Props extends {children: infer Children} ? Children : Props extends {children?: infer Children} - ? Children | undefined - : never; + ? Children | undefined + : never; diff --git a/src/components/slots/utils.ts b/src/components/slots/utils.ts index 775b610884..f1acada7aa 100644 --- a/src/components/slots/utils.ts +++ b/src/components/slots/utils.ts @@ -4,7 +4,7 @@ import type {SlotComponent} from './types'; export function isSlotElement

( node: React.ReactNode, -): node is React.ReactElement> & React.RefAttributes { +): node is React.ReactElement> & {ref?: React.Ref} { return React.isValidElement(node) && isSlotComponent(node.type); } diff --git a/src/containers/App/App.tsx b/src/containers/App/App.tsx index 666b2ca677..9c316531a8 100644 --- a/src/containers/App/App.tsx +++ b/src/containers/App/App.tsx @@ -1,20 +1,20 @@ import React from 'react'; -import {connect} from 'react-redux'; + +import type {Store} from '@reduxjs/toolkit'; +import type {History} from 'history'; import {Helmet} from 'react-helmet-async'; +import {connect} from 'react-redux'; -import ContentWrapper, {Content} from './Content'; -import ReduxTooltip from '../ReduxTooltip/ReduxTooltip'; +import {ErrorBoundary} from '../../components/ErrorBoundary/ErrorBoundary'; +import type {RootState} from '../../store'; import AppIcons from '../AppIcons/AppIcons'; import {Navigation} from '../AsideNavigation/Navigation'; - -import {ErrorBoundary} from '../../components/ErrorBoundary/ErrorBoundary'; +import ReduxTooltip from '../ReduxTooltip/ReduxTooltip'; import {settings} from '../UserSettings/settings'; -import {Providers} from './Providers'; - -import type {Store} from '@reduxjs/toolkit'; -import type {History} from 'history'; import type {YDBEmbeddedUISettings} from '../UserSettings/settings'; -import type {RootState} from '../../store'; + +import ContentWrapper, {Content} from './Content'; +import {Providers} from './Providers'; import './App.scss'; diff --git a/src/containers/App/Content.tsx b/src/containers/App/Content.tsx index bfb79a7497..6382561a22 100644 --- a/src/containers/App/Content.tsx +++ b/src/containers/App/Content.tsx @@ -1,45 +1,45 @@ import React from 'react'; -import {Switch, Route, Redirect, RedirectProps} from 'react-router-dom'; -import cn from 'bem-cn-lite'; -import {connect} from 'react-redux'; -import routes from '../../routes'; +import {connect, shallowEqual} from 'react-redux'; +import type {RedirectProps} from 'react-router-dom'; +import {Redirect, Route, Switch} from 'react-router-dom'; -import {Clusters} from '../Clusters/Clusters'; +import {useSlots} from '../../components/slots'; +import type {SlotMap} from '../../components/slots/SlotMap'; +import type {SlotComponent} from '../../components/slots/types'; +import routes from '../../routes'; +import type {RootState} from '../../store'; +import {getUser} from '../../store/reducers/authentication/authentication'; +import {getNodesList} from '../../store/reducers/nodesList'; +import {cn} from '../../utils/cn'; +import {useTypedDispatch, useTypedSelector} from '../../utils/hooks'; +import Authentication from '../Authentication/Authentication'; import Cluster from '../Cluster/Cluster'; -import Tenant from '../Tenant/Tenant'; +import {getClusterPath} from '../Cluster/utils'; +import {Clusters} from '../Clusters/Clusters'; +import Header from '../Header/Header'; +import type {RawBreadcrumbItem} from '../Header/breadcrumbs'; import Node from '../Node/Node'; import {PDiskPage} from '../PDiskPage/PDiskPage'; -import {VDiskPage} from '../VDiskPage/VDiskPage'; import {Tablet} from '../Tablet'; import TabletsFilters from '../TabletsFilters/TabletsFilters'; -import Header from '../Header/Header'; -import Authentication from '../Authentication/Authentication'; +import Tenant from '../Tenant/Tenant'; +import {VDiskPage} from '../VDiskPage/VDiskPage'; -import {getUser} from '../../store/reducers/authentication/authentication'; -import {getNodesList} from '../../store/reducers/nodesList'; -import {getClusterPath} from '../Cluster/utils'; -import {useSlots} from '../../components/slots'; -import {useTypedSelector, useTypedDispatch} from '../../utils/hooks'; import { ClusterSlot, ClustersSlot, NodeSlot, PDiskPageSlot, - VDiskPageSlot, RedirectSlot, RoutesSlot, TabletSlot, TabletsFiltersSlot, TenantSlot, + VDiskPageSlot, } from './appSlots'; - -import type {SlotComponent} from '../../components/slots/types'; -import type {SlotMap} from '../../components/slots/SlotMap'; -import type {RawBreadcrumbItem} from '../Header/breadcrumbs'; -import type {RootState} from '../../store'; - import i18n from './i18n'; + import './App.scss'; const b = cn('app'); @@ -160,10 +160,13 @@ export function Content(props: ContentProps) { function GetUser() { const dispatch = useTypedDispatch(); - const {isAuthenticated, isInternalUser} = useTypedSelector((state) => ({ - isAuthenticated: state.authentication.isAuthenticated, - isInternalUser: Boolean(state.authentication.user), - })); + const {isAuthenticated, isInternalUser} = useTypedSelector( + (state) => ({ + isAuthenticated: state.authentication.isAuthenticated, + isInternalUser: Boolean(state.authentication.user), + }), + shallowEqual, + ); React.useEffect(() => { if (isAuthenticated && !isInternalUser) { diff --git a/src/containers/App/Providers.tsx b/src/containers/App/Providers.tsx index 640fffdb52..85ea859df4 100644 --- a/src/containers/App/Providers.tsx +++ b/src/containers/App/Providers.tsx @@ -1,19 +1,19 @@ import React from 'react'; + +import {ThemeProvider} from '@gravity-ui/uikit'; +import type {Store} from '@reduxjs/toolkit'; +import type {History} from 'history'; +import {HelmetProvider} from 'react-helmet-async'; import {Provider} from 'react-redux'; import {Router} from 'react-router'; import {QueryParamProvider} from 'use-query-params'; import {ReactRouter5Adapter} from 'use-query-params/adapters/react-router-5'; -import {ThemeProvider} from '@gravity-ui/uikit'; -import {HelmetProvider} from 'react-helmet-async'; import {ComponentsProvider} from '../../components/ComponentsProvider/ComponentsProvider'; import {componentsRegistry as defaultComponentsRegistry} from '../../components/ComponentsProvider/componentsRegistry'; -import {useSetting} from '../../utils/hooks'; -import {THEME_KEY} from '../../utils/constants'; - -import type {Store} from '@reduxjs/toolkit'; -import type {History} from 'history'; import type {ComponentsRegistry} from '../../components/ComponentsProvider/componentsRegistry'; +import {THEME_KEY} from '../../utils/constants'; +import {useSetting} from '../../utils/hooks'; interface ProvidersProps { store: Store; diff --git a/src/containers/App/appSlots.tsx b/src/containers/App/appSlots.tsx index 6c591f22ee..7161f7e4b6 100644 --- a/src/containers/App/appSlots.tsx +++ b/src/containers/App/appSlots.tsx @@ -1,14 +1,14 @@ -import {createSlot} from '../../components/slots'; - import type {RedirectProps, RouteComponentProps} from 'react-router'; + +import {createSlot} from '../../components/slots'; import type Cluster from '../Cluster/Cluster'; import type {Clusters} from '../Clusters/Clusters'; import type Node from '../Node/Node'; import type {PDiskPage} from '../PDiskPage/PDiskPage'; -import type {VDiskPage} from '../VDiskPage/VDiskPage'; import type {Tablet} from '../Tablet'; import type TabletsFilters from '../TabletsFilters/TabletsFilters'; import type Tenant from '../Tenant/Tenant'; +import type {VDiskPage} from '../VDiskPage/VDiskPage'; export const ClustersSlot = createSlot<{ children: @@ -51,5 +51,5 @@ export const TabletsFiltersSlot = createSlot<{ | ((props: {component: typeof TabletsFilters} & RouteComponentProps) => React.ReactNode); }>('tabletsFilters'); -export const RoutesSlot = createSlot('routes'); +export const RoutesSlot = createSlot<{children: React.ReactNode}>('routes'); export const RedirectSlot = createSlot('redirect'); diff --git a/src/containers/App/i18n/index.ts b/src/containers/App/i18n/index.ts index 94b83b0685..ae8a8fc8df 100644 --- a/src/containers/App/i18n/index.ts +++ b/src/containers/App/i18n/index.ts @@ -1,11 +1,8 @@ -import {i18n, Lang} from '../../../utils/i18n'; +import {registerKeysets} from '../../../utils/i18n'; import en from './en.json'; import ru from './ru.json'; const COMPONENT = 'ydb-app-content'; -i18n.registerKeyset(Lang.En, COMPONENT, en); -i18n.registerKeyset(Lang.Ru, COMPONENT, ru); - -export default i18n.keyset(COMPONENT); +export default registerKeysets(COMPONENT, {ru, en}); diff --git a/src/containers/AppWithClusters/AppWithClusters.tsx b/src/containers/AppWithClusters/AppWithClusters.tsx index 2141dce1bb..84d8d24ab3 100644 --- a/src/containers/AppWithClusters/AppWithClusters.tsx +++ b/src/containers/AppWithClusters/AppWithClusters.tsx @@ -1,22 +1,22 @@ -import {App, AppSlots} from '../App'; +import React from 'react'; -import type {History} from 'history'; import type {Store} from '@reduxjs/toolkit'; +import type {History} from 'history'; +import {USE_CLUSTER_BALANCER_AS_BACKEND_KEY} from '../../utils/constants'; import type {GetMonitoringClusterLink, GetMonitoringLink} from '../../utils/monitoring'; - import { - getMonitoringLink as getMonitoringLinkDefault, getMonitoringClusterLink as getMonitoringClusterLinkDefault, + getMonitoringLink as getMonitoringLinkDefault, } from '../../utils/monitoring'; +import {App, AppSlots} from '../App'; +import type {YDBEmbeddedUISettings} from '../UserSettings/settings'; +import {settings} from '../UserSettings/settings'; + import {ExtendedCluster} from './ExtendedCluster/ExtendedCluster'; import {ExtendedNode} from './ExtendedNode/ExtendedNode'; import {ExtendedTenant} from './ExtendedTenant/ExtendedTenant'; -import {YDBEmbeddedUISettings, settings} from '../UserSettings/settings'; -import {USE_CLUSTER_BALANCER_AS_BACKEND_KEY} from '../../utils/constants'; - import i18n from './i18n'; -import React from 'react'; export interface AppWithClustersProps { store: Store; diff --git a/src/containers/AppWithClusters/ExtendedCluster/ExtendedCluster.tsx b/src/containers/AppWithClusters/ExtendedCluster/ExtendedCluster.tsx index b284c16354..8fdc6ebb1f 100644 --- a/src/containers/AppWithClusters/ExtendedCluster/ExtendedCluster.tsx +++ b/src/containers/AppWithClusters/ExtendedCluster/ExtendedCluster.tsx @@ -1,26 +1,24 @@ -import block from 'bem-cn-lite'; - import {ClipboardButton} from '@gravity-ui/uikit'; -import {MonitoringButton} from '../../../components/MonitoringButton/MonitoringButton'; -import type {ETenantType} from '../../../types/api/tenant'; +import {MonitoringButton} from '../../../components/MonitoringButton/MonitoringButton'; import type { AdditionalClusterProps, AdditionalTenantsProps, AdditionalVersionsProps, } from '../../../types/additionalProps'; -import type Cluster from '../../Cluster/Cluster'; import type {MetaClusterVersion} from '../../../types/api/meta'; -import type {GetMonitoringLink, GetMonitoringClusterLink} from '../../../utils/monitoring'; - +import type {ETenantType} from '../../../types/api/tenant'; import {getVersionColors, getVersionMap} from '../../../utils/clusterVersionColors'; -import {removeViewerPathname, getCleanBalancerValue} from '../../../utils/parseBalancer'; +import {cn} from '../../../utils/cn'; +import type {GetMonitoringClusterLink, GetMonitoringLink} from '../../../utils/monitoring'; +import {getCleanBalancerValue, removeViewerPathname} from '../../../utils/parseBalancer'; import {getBackendFromNodeHost} from '../../../utils/prepareBackend'; +import type Cluster from '../../Cluster/Cluster'; import {useClusterData} from '../useClusterData'; import './ExtendedCluster.scss'; -const b = block('extended-cluster'); +const b = cn('extended-cluster'); const getAdditionalBalancerInfo = (balancer: string) => { const cleanedValue = getCleanBalancerValue(balancer); @@ -30,7 +28,7 @@ const getAdditionalBalancerInfo = (balancer: string) => { value: (

{cleanedValue} - +
), }; diff --git a/src/containers/AppWithClusters/ExtendedNode/ExtendedNode.tsx b/src/containers/AppWithClusters/ExtendedNode/ExtendedNode.tsx index 48b19cccc3..aae4afaee9 100644 --- a/src/containers/AppWithClusters/ExtendedNode/ExtendedNode.tsx +++ b/src/containers/AppWithClusters/ExtendedNode/ExtendedNode.tsx @@ -1,6 +1,5 @@ -import {useClusterData} from '../useClusterData'; - import type Node from '../../Node/Node'; +import {useClusterData} from '../useClusterData'; export function ExtendedNode({component: NodeComponent}: {component: typeof Node}) { const {additionalNodesProps} = useClusterData(); diff --git a/src/containers/AppWithClusters/ExtendedTenant/ExtendedTenant.tsx b/src/containers/AppWithClusters/ExtendedTenant/ExtendedTenant.tsx index db0e4f1b34..f743c6d56a 100644 --- a/src/containers/AppWithClusters/ExtendedTenant/ExtendedTenant.tsx +++ b/src/containers/AppWithClusters/ExtendedTenant/ExtendedTenant.tsx @@ -1,10 +1,8 @@ -import type Tenant from '../../Tenant/Tenant'; +import {MonitoringButton} from '../../../components/MonitoringButton/MonitoringButton'; import type {GetMonitoringLink} from '../../../utils/monitoring'; - +import type Tenant from '../../Tenant/Tenant'; import {useClusterData} from '../useClusterData'; -import {MonitoringButton} from '../../../components/MonitoringButton/MonitoringButton'; - export interface ExtendedTenantProps { component: typeof Tenant; getMonitoringLink?: GetMonitoringLink; diff --git a/src/containers/AppWithClusters/i18n/index.ts b/src/containers/AppWithClusters/i18n/index.ts index bb1695541c..acc497755b 100644 --- a/src/containers/AppWithClusters/i18n/index.ts +++ b/src/containers/AppWithClusters/i18n/index.ts @@ -1,11 +1,8 @@ -import {Lang, i18n} from '../../../utils/i18n'; +import {registerKeysets} from '../../../utils/i18n'; import en from './en.json'; import ru from './ru.json'; const COMPONENT = 'ydb-extended-user-settings'; -i18n.registerKeyset(Lang.En, COMPONENT, en); -i18n.registerKeyset(Lang.Ru, COMPONENT, ru); - -export default i18n.keyset(COMPONENT); +export default registerKeysets(COMPONENT, {ru, en}); diff --git a/src/containers/AppWithClusters/useClusterData.ts b/src/containers/AppWithClusters/useClusterData.ts index 08c2138500..e4c80aa09b 100644 --- a/src/containers/AppWithClusters/useClusterData.ts +++ b/src/containers/AppWithClusters/useClusterData.ts @@ -1,10 +1,11 @@ import {useLocation} from 'react-router'; -import {useClustersList} from '../Clusters/useClustersList'; + import {parseQuery} from '../../routes'; -import {useSetting, useTypedSelector} from '../../utils/hooks'; import {selectClusterInfo} from '../../store/reducers/clusters/selectors'; -import {USE_CLUSTER_BALANCER_AS_BACKEND_KEY} from '../../utils/constants'; import {getAdditionalNodesProps} from '../../utils/additionalProps'; +import {USE_CLUSTER_BALANCER_AS_BACKEND_KEY} from '../../utils/constants'; +import {useSetting, useTypedSelector} from '../../utils/hooks'; +import {useClustersList} from '../Clusters/useClustersList'; export function useClusterData() { useClustersList(); diff --git a/src/containers/AsideNavigation/AsideNavigation.tsx b/src/containers/AsideNavigation/AsideNavigation.tsx index 3acdc1d67a..58bcdab308 100644 --- a/src/containers/AsideNavigation/AsideNavigation.tsx +++ b/src/containers/AsideNavigation/AsideNavigation.tsx @@ -1,19 +1,21 @@ -import React, {useState} from 'react'; +import React from 'react'; + +import type {MenuItem} from '@gravity-ui/navigation'; +import {AsideHeader, FooterItem} from '@gravity-ui/navigation'; import {useHistory} from 'react-router-dom'; -import cn from 'bem-cn-lite'; -import {AsideHeader, FooterItem, MenuItem} from '@gravity-ui/navigation'; +import {cn} from '../../utils/cn'; +import {ASIDE_HEADER_COMPACT_KEY} from '../../utils/constants'; +import {useSetting, useTypedSelector} from '../../utils/hooks'; + +import i18n from './i18n'; -import ydbLogoIcon from '../../assets/icons/ydb.svg'; -import userSecret from '../../assets/icons/user-secret.svg'; -import userChecked from '../../assets/icons/user-check.svg'; import settingsIcon from '../../assets/icons/settings.svg'; import supportIcon from '../../assets/icons/support.svg'; +import userChecked from '../../assets/icons/user-check.svg'; +import userSecret from '../../assets/icons/user-secret.svg'; +import ydbLogoIcon from '../../assets/icons/ydb.svg'; -import {useSetting, useTypedSelector} from '../../utils/hooks'; -import {ASIDE_HEADER_COMPACT_KEY} from '../../utils/constants'; - -import i18n from './i18n'; import './AsideNavigation.scss'; const b = cn('kv-navigation'); @@ -28,7 +30,7 @@ interface YdbUserDropdownProps { } function YdbUserDropdown({isCompact, popupAnchor, ydbUser, children}: YdbUserDropdownProps) { - const [isUserDropdownVisible, setIsUserDropdownVisible] = useState(false); + const [isUserDropdownVisible, setIsUserDropdownVisible] = React.useState(false); const iconData = ydbUser.login ? userChecked : userSecret; return ( (); + const [visiblePanel, setVisiblePanel] = React.useState(); const {user: ydbUser} = useTypedSelector((state) => state.authentication); const [compact, setIsCompact] = useSetting(ASIDE_HEADER_COMPACT_KEY); diff --git a/src/containers/AsideNavigation/Navigation.tsx b/src/containers/AsideNavigation/Navigation.tsx index 45891542bd..9ef9d55906 100644 --- a/src/containers/AsideNavigation/Navigation.tsx +++ b/src/containers/AsideNavigation/Navigation.tsx @@ -1,10 +1,9 @@ -import {YdbInternalUser} from './YdbInternalUser/YdbInternalUser'; +import {useComponent} from '../../components/ComponentsProvider/ComponentsProvider'; import {UserSettings} from '../UserSettings/UserSettings'; +import type {YDBEmbeddedUISettings} from '../UserSettings/settings'; +import {YdbInternalUser} from './YdbInternalUser/YdbInternalUser'; import {useNavigationMenuItems} from './useNavigationMenuItems'; -import {useComponent} from '../../components/ComponentsProvider/ComponentsProvider'; - -import type {YDBEmbeddedUISettings} from '../UserSettings/settings'; interface NavigationProps { userSettings?: YDBEmbeddedUISettings; diff --git a/src/containers/AsideNavigation/YdbInternalUser/YdbInternalUser.tsx b/src/containers/AsideNavigation/YdbInternalUser/YdbInternalUser.tsx index deb3557c21..a6c1505432 100644 --- a/src/containers/AsideNavigation/YdbInternalUser/YdbInternalUser.tsx +++ b/src/containers/AsideNavigation/YdbInternalUser/YdbInternalUser.tsx @@ -1,17 +1,15 @@ -import {useHistory} from 'react-router'; - import {Button, Icon} from '@gravity-ui/uikit'; +import {useHistory} from 'react-router'; import routes, {createHref} from '../../../routes'; -import {useTypedSelector, useTypedDispatch} from '../../../utils/hooks'; import {logout} from '../../../store/reducers/authentication/authentication'; import {cn} from '../../../utils/cn'; +import {useTypedDispatch, useTypedSelector} from '../../../utils/hooks'; +import i18n from '../i18n'; import signOutIcon from '@gravity-ui/icons/svgs/arrow-right-from-square.svg'; import signInIcon from '@gravity-ui/icons/svgs/arrow-right-to-square.svg'; -import i18n from '../i18n'; - import './YdbInternalUser.scss'; const b = cn('kv-ydb-internal-user'); diff --git a/src/containers/AsideNavigation/i18n/index.ts b/src/containers/AsideNavigation/i18n/index.ts index 85ddaa753d..95323257a5 100644 --- a/src/containers/AsideNavigation/i18n/index.ts +++ b/src/containers/AsideNavigation/i18n/index.ts @@ -1,11 +1,8 @@ -import {i18n, Lang} from '../../../utils/i18n'; +import {registerKeysets} from '../../../utils/i18n'; import en from './en.json'; import ru from './ru.json'; const COMPONENT = 'ydb-aside-navigation'; -i18n.registerKeyset(Lang.En, COMPONENT, en); -i18n.registerKeyset(Lang.Ru, COMPONENT, ru); - -export default i18n.keyset(COMPONENT); +export default registerKeysets(COMPONENT, {ru, en}); diff --git a/src/containers/AsideNavigation/useNavigationMenuItems.ts b/src/containers/AsideNavigation/useNavigationMenuItems.ts index 809cec45ea..da35c42af3 100644 --- a/src/containers/AsideNavigation/useNavigationMenuItems.ts +++ b/src/containers/AsideNavigation/useNavigationMenuItems.ts @@ -1,24 +1,24 @@ import React from 'react'; + +import type {MenuItem as AsideHeaderMenuItem} from '@gravity-ui/navigation'; +import type {IconData} from '@gravity-ui/uikit'; import {useHistory, useLocation} from 'react-router'; -import {useSetting, useTypedSelector} from '../../utils/hooks'; import routes, {parseQuery} from '../../routes'; -import {getTenantPath} from '../Tenant/TenantPages'; - import {TENANT_PAGE, TENANT_PAGES_IDS} from '../../store/reducers/tenant/constants'; import {TENANT_INITIAL_PAGE_KEY} from '../../utils/constants'; +import {useSetting, useTypedSelector} from '../../utils/hooks'; +import {getTenantPath} from '../Tenant/TenantPages'; -import type {MenuItem as AsideHeaderMenuItem} from '@gravity-ui/navigation'; +import i18n from './i18n'; -import terminalIcon from '@gravity-ui/icons/svgs/terminal.svg'; import pulseIcon from '@gravity-ui/icons/svgs/pulse.svg'; - -import i18n from './i18n'; +import terminalIcon from '@gravity-ui/icons/svgs/terminal.svg'; interface MenuItem { id: string; title: string; - icon: SVGIconData; + icon: IconData; iconSize: string | number; location: string; locationKeys?: string[]; diff --git a/src/containers/Authentication/Authentication.scss b/src/containers/Authentication/Authentication.scss index 894a3cb6e2..b455062360 100644 --- a/src/containers/Authentication/Authentication.scss +++ b/src/containers/Authentication/Authentication.scss @@ -35,10 +35,10 @@ &__logo { display: flex; align-items: center; + gap: 8px; font-size: 16px; font-weight: 600; - gap: 8px; } &__title { diff --git a/src/containers/Authentication/Authentication.tsx b/src/containers/Authentication/Authentication.tsx index 723ad95a5f..cb81a9b789 100644 --- a/src/containers/Authentication/Authentication.tsx +++ b/src/containers/Authentication/Authentication.tsx @@ -1,17 +1,17 @@ -import {KeyboardEvent, useEffect, useState} from 'react'; -import {useHistory, useLocation} from 'react-router'; -import cn from 'bem-cn-lite'; +import React from 'react'; -import {Button, TextInput, Icon, Link as ExternalLink} from '@gravity-ui/uikit'; +import {Button, Link as ExternalLink, Icon, TextInput} from '@gravity-ui/uikit'; +import {useHistory, useLocation} from 'react-router'; -import {authenticate} from '../../store/reducers/authentication/authentication'; -import {useTypedSelector, useTypedDispatch} from '../../utils/hooks'; import {parseQuery} from '../../routes'; +import {authenticate} from '../../store/reducers/authentication/authentication'; +import {cn} from '../../utils/cn'; +import {useTypedDispatch, useTypedSelector} from '../../utils/hooks'; -import ydbLogoIcon from '../../assets/icons/ydb.svg'; -import showIcon from '../../assets/icons/show.svg'; -import hideIcon from '../../assets/icons/hide.svg'; import closeIcon from '../../assets/icons/close.svg'; +import hideIcon from '../../assets/icons/hide.svg'; +import showIcon from '../../assets/icons/show.svg'; +import ydbLogoIcon from '../../assets/icons/ydb.svg'; import './Authentication.scss'; @@ -30,13 +30,13 @@ function Authentication({closable = false}: AuthenticationProps) { const {error} = useTypedSelector((state) => state.authentication); - const [login, setLogin] = useState(''); - const [pass, setPass] = useState(''); - const [loginError, setLoginError] = useState(''); - const [passwordError, setPasswordError] = useState(''); - const [showPassword, setShowPassword] = useState(false); + const [login, setLogin] = React.useState(''); + const [pass, setPass] = React.useState(''); + const [loginError, setLoginError] = React.useState(''); + const [passwordError, setPasswordError] = React.useState(''); + const [showPassword, setShowPassword] = React.useState(false); - useEffect(() => { + React.useEffect(() => { if (error?.data?.error?.includes('user')) { setLoginError(error.data.error); } @@ -70,7 +70,7 @@ function Authentication({closable = false}: AuthenticationProps) { }); }; - const onEnterClick = (e: KeyboardEvent) => { + const onEnterClick = (e: React.KeyboardEvent) => { if (e.keyCode === 13) { onLoginClick(); } diff --git a/src/containers/Cluster/Cluster.tsx b/src/containers/Cluster/Cluster.tsx index 06b5c6000d..c2d2523446 100644 --- a/src/containers/Cluster/Cluster.tsx +++ b/src/containers/Cluster/Cluster.tsx @@ -1,35 +1,34 @@ -import {useEffect, useMemo, useRef} from 'react'; -import {Redirect, Switch, Route, useLocation, useRouteMatch} from 'react-router'; -import {Helmet} from 'react-helmet-async'; -import cn from 'bem-cn-lite'; -import qs from 'qs'; +import React from 'react'; import {Skeleton, Tabs} from '@gravity-ui/uikit'; +import qs from 'qs'; +import {Helmet} from 'react-helmet-async'; +import {Redirect, Route, Switch, useLocation, useRouteMatch} from 'react-router'; +import {EntityStatus} from '../../components/EntityStatus/EntityStatus'; +import {InternalLink} from '../../components/InternalLink'; +import routes, {getLocationObjectFromHref} from '../../routes'; +import {getClusterInfo, updateDefaultClusterTab} from '../../store/reducers/cluster/cluster'; +import {getClusterNodes} from '../../store/reducers/clusterNodes/clusterNodes'; +import {setHeaderBreadcrumbs} from '../../store/reducers/header/header'; import type { AdditionalClusterProps, + AdditionalNodesProps, AdditionalTenantsProps, AdditionalVersionsProps, - AdditionalNodesProps, } from '../../types/additionalProps'; -import routes, {getLocationObjectFromHref} from '../../routes'; - -import {setHeaderBreadcrumbs} from '../../store/reducers/header/header'; -import {getClusterInfo, updateDefaultClusterTab} from '../../store/reducers/cluster/cluster'; -import {getClusterNodes} from '../../store/reducers/clusterNodes/clusterNodes'; +import {cn} from '../../utils/cn'; +import {CLUSTER_DEFAULT_TITLE} from '../../utils/constants'; +import {useAutofetcher, useTypedDispatch, useTypedSelector} from '../../utils/hooks'; import {parseNodesToVersionsValues, parseVersionsToVersionToColorMap} from '../../utils/versions'; -import {useAutofetcher, useTypedSelector, useTypedDispatch} from '../../utils/hooks'; - -import {InternalLink} from '../../components/InternalLink'; -import {Tenants} from '../Tenants/Tenants'; -import {StorageWrapper} from '../Storage/StorageWrapper'; import {NodesWrapper} from '../Nodes/NodesWrapper'; +import {StorageWrapper} from '../Storage/StorageWrapper'; +import {Tenants} from '../Tenants/Tenants'; import {Versions} from '../Versions/Versions'; -import {EntityStatus} from '../../components/EntityStatus/EntityStatus'; -import {CLUSTER_DEFAULT_TITLE} from '../../utils/constants'; import {ClusterInfo} from './ClusterInfo/ClusterInfo'; -import {ClusterTab, clusterTabs, clusterTabsIds, getClusterPath, isClusterTab} from './utils'; +import type {ClusterTab} from './utils'; +import {clusterTabs, clusterTabsIds, getClusterPath, isClusterTab} from './utils'; import './Cluster.scss'; @@ -48,7 +47,7 @@ function Cluster({ additionalNodesProps, additionalVersionsProps, }: ClusterProps) { - const container = useRef(null); + const container = React.useRef(null); const dispatch = useTypedDispatch(); @@ -77,7 +76,7 @@ function Cluster({ const infoLoading = (clusterLoading && !clusterWasLoaded) || (nodesLoading && !nodesWasLoaded); - useEffect(() => { + React.useEffect(() => { dispatch(getClusterNodes()); }, [dispatch]); @@ -87,18 +86,18 @@ function Cluster({ true, ); - useEffect(() => { + React.useEffect(() => { dispatch(setHeaderBreadcrumbs('cluster', {})); }, [dispatch, Name]); - const versionToColor = useMemo(() => { + const versionToColor = React.useMemo(() => { if (additionalVersionsProps?.getVersionToColorMap) { return additionalVersionsProps?.getVersionToColorMap(); } return parseVersionsToVersionToColorMap(cluster?.Versions); }, [additionalVersionsProps, cluster]); - const versionsValues = useMemo(() => { + const versionsValues = React.useMemo(() => { return parseNodesToVersionsValues(nodes, versionToColor); }, [nodes, versionToColor]); @@ -118,7 +117,10 @@ function Cluster({ }; const clusterTitle = cluster?.Name ?? clusterName ?? CLUSTER_DEFAULT_TITLE; - const activeTab = useMemo(() => clusterTabs.find(({id}) => id === activeTabId), [activeTabId]); + const activeTab = React.useMemo( + () => clusterTabs.find(({id}) => id === activeTabId), + [activeTabId], + ); return (
@@ -228,7 +230,7 @@ function useClusterTab() { activeTab = defaultTab; } - useEffect(() => { + React.useEffect(() => { if (activeTab !== defaultTab) { dispatch(updateDefaultClusterTab(activeTab)); } diff --git a/src/containers/Cluster/ClusterInfo/ClusterInfo.scss b/src/containers/Cluster/ClusterInfo/ClusterInfo.scss index a98be143b6..7511ad63f8 100644 --- a/src/containers/Cluster/ClusterInfo/ClusterInfo.scss +++ b/src/containers/Cluster/ClusterInfo/ClusterInfo.scss @@ -44,7 +44,6 @@ &__links { display: flex; flex-flow: row wrap; - gap: 12px; } diff --git a/src/containers/Cluster/ClusterInfo/ClusterInfo.tsx b/src/containers/Cluster/ClusterInfo/ClusterInfo.tsx index 948d73428c..2d9a7795fe 100644 --- a/src/containers/Cluster/ClusterInfo/ClusterInfo.tsx +++ b/src/containers/Cluster/ClusterInfo/ClusterInfo.tsx @@ -1,29 +1,27 @@ -import block from 'bem-cn-lite'; - -import {ProgressViewer} from '../../../components/ProgressViewer/ProgressViewer'; -import InfoViewer, {InfoViewerItem} from '../../../components/InfoViewer/InfoViewer'; -import {Tags} from '../../../components/Tags'; -import {Tablet} from '../../../components/Tablet'; -import {ResponseError} from '../../../components/Errors/ResponseError'; -import {LinkWithIcon} from '../../../components/LinkWithIcon/LinkWithIcon'; import {ContentWithPopup} from '../../../components/ContentWithPopup/ContentWithPopup'; +import {ResponseError} from '../../../components/Errors/ResponseError'; +import type {InfoViewerItem} from '../../../components/InfoViewer/InfoViewer'; +import InfoViewer from '../../../components/InfoViewer/InfoViewer'; import {InfoViewerSkeleton} from '../../../components/InfoViewerSkeleton/InfoViewerSkeleton'; - -import type {IResponseError} from '../../../types/api/error'; -import type {AdditionalClusterProps, ClusterLink} from '../../../types/additionalProps'; -import type {VersionValue} from '../../../types/versions'; -import type {TClusterInfo} from '../../../types/api/cluster'; +import {LinkWithIcon} from '../../../components/LinkWithIcon/LinkWithIcon'; +import {ProgressViewer} from '../../../components/ProgressViewer/ProgressViewer'; +import {Tablet} from '../../../components/Tablet'; +import {Tags} from '../../../components/Tags'; import {backend, customBackend} from '../../../store'; -import {formatStorageValues} from '../../../utils/dataFormatters/dataFormatters'; -import {useTypedSelector} from '../../../utils/hooks'; -import {formatBytes, getSizeWithSignificantDigits} from '../../../utils/bytesParsers'; -import {DEVELOPER_UI_TITLE} from '../../../utils/constants'; import type { ClusterGroupsStats, DiskErasureGroupsStats, DiskGroupsStats, } from '../../../store/reducers/cluster/types'; - +import type {AdditionalClusterProps, ClusterLink} from '../../../types/additionalProps'; +import type {TClusterInfo} from '../../../types/api/cluster'; +import type {IResponseError} from '../../../types/api/error'; +import type {VersionValue} from '../../../types/versions'; +import {formatBytes, getSizeWithSignificantDigits} from '../../../utils/bytesParsers'; +import {cn} from '../../../utils/cn'; +import {DEVELOPER_UI_TITLE} from '../../../utils/constants'; +import {formatStorageValues} from '../../../utils/dataFormatters/dataFormatters'; +import {useTypedSelector} from '../../../utils/hooks'; import {VersionsBar} from '../VersionsBar/VersionsBar'; import i18n from '../i18n'; @@ -31,7 +29,7 @@ import {compareTablets} from './utils'; import './ClusterInfo.scss'; -const b = block('cluster-info'); +const b = cn('cluster-info'); interface GroupsStatsPopupContentProps { stats: DiskErasureGroupsStats; diff --git a/src/containers/Cluster/ClusterInfo/utils.ts b/src/containers/Cluster/ClusterInfo/utils.ts index 05237d008a..7a34e9f871 100644 --- a/src/containers/Cluster/ClusterInfo/utils.ts +++ b/src/containers/Cluster/ClusterInfo/utils.ts @@ -1,4 +1,5 @@ -import {TTabletStateInfo, EType} from '../../../types/api/tablet'; +import type {TTabletStateInfo} from '../../../types/api/tablet'; +import {EType} from '../../../types/api/tablet'; export const compareTablets = (tablet1: TTabletStateInfo, tablet2: TTabletStateInfo) => { if (tablet1.Type === EType.TxAllocator) { diff --git a/src/containers/Cluster/VersionsBar/VersionsBar.tsx b/src/containers/Cluster/VersionsBar/VersionsBar.tsx index 0a2755ff79..1458a3d689 100644 --- a/src/containers/Cluster/VersionsBar/VersionsBar.tsx +++ b/src/containers/Cluster/VersionsBar/VersionsBar.tsx @@ -1,12 +1,11 @@ -import block from 'bem-cn-lite'; - import {Progress} from '@gravity-ui/uikit'; import type {VersionValue} from '../../../types/versions'; +import {cn} from '../../../utils/cn'; import './VersionsBar.scss'; -const b = block('ydb-cluster-versions-bar'); +const b = cn('ydb-cluster-versions-bar'); interface VersionsBarProps { versionsValues?: VersionValue[]; diff --git a/src/containers/Cluster/i18n/index.ts b/src/containers/Cluster/i18n/index.ts index 7f1d6b5ae7..758b317b3e 100644 --- a/src/containers/Cluster/i18n/index.ts +++ b/src/containers/Cluster/i18n/index.ts @@ -1,11 +1,8 @@ -import {i18n, Lang} from '../../../utils/i18n'; +import {registerKeysets} from '../../../utils/i18n'; import en from './en.json'; import ru from './ru.json'; const COMPONENT = 'ydb-cluster'; -i18n.registerKeyset(Lang.En, COMPONENT, en); -i18n.registerKeyset(Lang.Ru, COMPONENT, ru); - -export default i18n.keyset(COMPONENT); +export default registerKeysets(COMPONENT, {ru, en}); diff --git a/src/containers/Cluster/utils.tsx b/src/containers/Cluster/utils.tsx index 3ea4c3816c..0350aeea96 100644 --- a/src/containers/Cluster/utils.tsx +++ b/src/containers/Cluster/utils.tsx @@ -1,5 +1,5 @@ -import type {ValueOf} from '../../types/common'; import routes, {createHref} from '../../routes'; +import type {ValueOf} from '../../types/common'; export const clusterTabsIds = { overview: 'overview', diff --git a/src/containers/ClusterModeGuard/ClusterModeGuard.tsx b/src/containers/ClusterModeGuard/ClusterModeGuard.tsx index f3cd9ca613..bbb4876303 100644 --- a/src/containers/ClusterModeGuard/ClusterModeGuard.tsx +++ b/src/containers/ClusterModeGuard/ClusterModeGuard.tsx @@ -1,8 +1,9 @@ -import {ReactNode} from 'react'; +import React from 'react'; + import {useTypedSelector} from '../../lib'; export interface ClusterModeGuardProps { - children: ReactNode; + children: React.ReactNode; mode: 'single' | 'multi'; } @@ -11,5 +12,5 @@ export function ClusterModeGuard({children, mode}: ClusterModeGuardProps) { mode === 'single' ? state.singleClusterMode : !state.singleClusterMode, ); - return shouldRender ? <>{children} : null; + return shouldRender ? {children} : null; } diff --git a/src/containers/Clusters/Clusters.tsx b/src/containers/Clusters/Clusters.tsx index 7834863314..b51870870d 100644 --- a/src/containers/Clusters/Clusters.tsx +++ b/src/containers/Clusters/Clusters.tsx @@ -1,39 +1,38 @@ -import {useCallback, useMemo} from 'react'; -import {Helmet} from 'react-helmet-async'; +import React from 'react'; import DataTable from '@gravity-ui/react-data-table'; -import {TableColumnSetup, Select} from '@gravity-ui/uikit'; +import {Select, TableColumnSetup} from '@gravity-ui/uikit'; +import {Helmet} from 'react-helmet-async'; -import {Search} from '../../components/Search'; import {Loader} from '../../components/Loader'; -import {DEFAULT_TABLE_SETTINGS} from '../../utils/constants'; -import {useAutofetcher, useTypedSelector, useTypedDispatch} from '../../utils/hooks'; - -import {fetchClustersList, changeClustersFilters} from '../../store/reducers/clusters/clusters'; +import {Search} from '../../components/Search'; +import {changeClustersFilters, fetchClustersList} from '../../store/reducers/clusters/clusters'; import { + selectClusterNameFilter, + selectClustersAggregation, selectClustersList, + selectFilteredClusters, selectLoadingFlag, - selectClusterNameFilter, - selectStatusFilter, selectServiceFilter, + selectStatusFilter, selectVersionFilter, selectVersions, - selectFilteredClusters, - selectClustersAggregation, } from '../../store/reducers/clusters/selectors'; +import {DEFAULT_TABLE_SETTINGS} from '../../utils/constants'; +import {useAutofetcher, useTypedDispatch, useTypedSelector} from '../../utils/hooks'; +import {ClustersStatistics} from './ClustersStatistics'; +import {CLUSTERS_COLUMNS} from './columns'; import { + CLUSTER_STATUSES, COLUMNS_NAMES, COLUMNS_TITLES, - CLUSTER_STATUSES, DEFAULT_COLUMNS, SELECTED_COLUMNS_KEY, } from './constants'; -import {ClustersStatistics} from './ClustersStatistics'; -import {CLUSTERS_COLUMNS} from './columns'; -import {useSelectedColumns} from './useSelectedColumns'; -import {b} from './shared'; import i18n from './i18n'; +import {b} from './shared'; +import {useSelectedColumns} from './useSelectedColumns'; import './Clusters.scss'; @@ -50,7 +49,7 @@ export function Clusters() { const version = useTypedSelector(selectVersionFilter); const versions = useTypedSelector(selectVersions); - const fetchData = useCallback(() => { + const fetchData = React.useCallback(() => { dispatch(fetchClustersList()); }, [dispatch]); @@ -77,7 +76,7 @@ export function Clusters() { [COLUMNS_NAMES.TITLE], ); - const servicesToSelect = useMemo(() => { + const servicesToSelect = React.useMemo(() => { const clustersServices = new Set(); clusters.forEach((cluster) => { @@ -156,11 +155,9 @@ export function Clusters() {
diff --git a/src/containers/Clusters/ClustersStatistics.tsx b/src/containers/Clusters/ClustersStatistics.tsx index 21d961a18d..8cca6859d9 100644 --- a/src/containers/Clusters/ClustersStatistics.tsx +++ b/src/containers/Clusters/ClustersStatistics.tsx @@ -1,10 +1,9 @@ import {ProgressViewer} from '../../components/ProgressViewer/ProgressViewer'; -import {formatStorageValues} from '../../utils/dataFormatters/dataFormatters'; - import type {ClusterDataAggregation} from '../../store/reducers/clusters/types'; +import {formatStorageValues} from '../../utils/dataFormatters/dataFormatters'; -import {b} from './shared'; import i18n from './i18n'; +import {b} from './shared'; interface ClustersStatisticsProps { count: number; diff --git a/src/containers/Clusters/columns.tsx b/src/containers/Clusters/columns.tsx index e6920d600d..d303e865ac 100644 --- a/src/containers/Clusters/columns.tsx +++ b/src/containers/Clusters/columns.tsx @@ -1,18 +1,20 @@ -import DataTable, {type Column} from '@gravity-ui/react-data-table'; -import {Link as ExternalLink, Progress, ClipboardButton} from '@gravity-ui/uikit'; +import React from 'react'; + import {HelpPopover} from '@gravity-ui/components'; +import DataTable from '@gravity-ui/react-data-table'; +import type {Column} from '@gravity-ui/react-data-table'; +import {ClipboardButton, Link as ExternalLink, Progress} from '@gravity-ui/uikit'; -import {UserCard} from '../../components/User/User'; import {ProgressViewer} from '../../components/ProgressViewer/ProgressViewer'; -import {clusterTabsIds, getClusterPath} from '../Cluster/utils'; -import {formatStorageValuesToTb} from '../../utils/dataFormatters/dataFormatters'; - +import {UserCard} from '../../components/User/User'; import type {PreparedCluster} from '../../store/reducers/clusters/types'; -import {removeViewerPathname, getCleanBalancerValue} from '../../utils/parseBalancer'; +import {formatStorageValuesToTb} from '../../utils/dataFormatters/dataFormatters'; +import {getCleanBalancerValue, removeViewerPathname} from '../../utils/parseBalancer'; +import {clusterTabsIds, getClusterPath} from '../Cluster/utils'; import {COLUMNS_NAMES, COLUMNS_TITLES} from './constants'; -import {b} from './shared'; import i18n from './i18n'; +import {b} from './shared'; const EMPTY_CELL = —; @@ -99,7 +101,7 @@ export const CLUSTERS_COLUMNS: Column[] = [ className={b('cluster-versions')} href={getClusterPath(clusterTabsIds.versions, {backend, clusterName})} > - <> + {preparedVersions.map((item, index) => (
[] = [
))} {} - +
) ); @@ -264,7 +266,7 @@ export const CLUSTERS_COLUMNS: Column[] = [ return (
{cleanedValue}
- +
); }, diff --git a/src/containers/Clusters/shared.ts b/src/containers/Clusters/shared.ts index 9b533ad2c4..71f97e352f 100644 --- a/src/containers/Clusters/shared.ts +++ b/src/containers/Clusters/shared.ts @@ -1,3 +1,3 @@ -import cn from 'bem-cn-lite'; +import {cn} from '../../utils/cn'; export const b = cn('clusters'); diff --git a/src/containers/Clusters/useClustersList.ts b/src/containers/Clusters/useClustersList.ts index 7dc41c9da8..596c48c6dd 100644 --- a/src/containers/Clusters/useClustersList.ts +++ b/src/containers/Clusters/useClustersList.ts @@ -1,6 +1,7 @@ import React from 'react'; -import {useTypedDispatch} from '../../utils/hooks'; + import {fetchClustersList} from '../../store/reducers/clusters/clusters'; +import {useTypedDispatch} from '../../utils/hooks'; export function useClustersList() { const dispatch = useTypedDispatch(); diff --git a/src/containers/Clusters/useSelectedColumns.ts b/src/containers/Clusters/useSelectedColumns.ts index b2d2bc9c55..8b8b18fda9 100644 --- a/src/containers/Clusters/useSelectedColumns.ts +++ b/src/containers/Clusters/useSelectedColumns.ts @@ -1,5 +1,5 @@ -import {type Column} from '@gravity-ui/react-data-table'; -import {type TableColumnSetupItem} from '@gravity-ui/uikit/build/esm/components/Table/hoc/withTableSettings/withTableSettings'; +import type {Column} from '@gravity-ui/react-data-table'; +import type {TableColumnSetupItem, TableColumnSetupProps} from '@gravity-ui/uikit'; import {useSetting} from '../../utils/hooks'; @@ -30,8 +30,8 @@ export const useSelectedColumns = ( }; }); - const setColumns = (value: TableColumnSetupItem[]) => { - const selectedColumns = value.filter((el) => el.selected).map((el) => el.id); + const setColumns: TableColumnSetupProps['onUpdate'] = (value) => { + const selectedColumns = value.filter((el) => el.isSelected).map((el) => el.id); setSelectedColumnsIds(selectedColumns); }; diff --git a/src/containers/Header/Header.tsx b/src/containers/Header/Header.tsx index 8a1e533954..b24b74031f 100644 --- a/src/containers/Header/Header.tsx +++ b/src/containers/Header/Header.tsx @@ -1,22 +1,22 @@ -import {useEffect, useMemo} from 'react'; -import {useHistory, useLocation} from 'react-router'; -import block from 'bem-cn-lite'; +import React from 'react'; import {Breadcrumbs} from '@gravity-ui/uikit'; +import {useHistory, useLocation} from 'react-router'; import {LinkWithIcon} from '../../components/LinkWithIcon/LinkWithIcon'; - +import {parseQuery} from '../../routes'; import {backend, customBackend} from '../../store'; import {getClusterInfo} from '../../store/reducers/cluster/cluster'; -import {useTypedSelector, useTypedDispatch} from '../../utils/hooks'; +import {cn} from '../../utils/cn'; import {DEVELOPER_UI_TITLE} from '../../utils/constants'; -import {parseQuery} from '../../routes'; +import {useTypedDispatch, useTypedSelector} from '../../utils/hooks'; -import {RawBreadcrumbItem, getBreadcrumbs} from './breadcrumbs'; +import type {RawBreadcrumbItem} from './breadcrumbs'; +import {getBreadcrumbs} from './breadcrumbs'; import './Header.scss'; -const b = block('header'); +const b = cn('header'); const getInternalLink = (singleClusterMode: boolean) => { if (singleClusterMode && !customBackend) { @@ -45,11 +45,11 @@ function Header({mainPage}: HeaderProps) { const clusterNameFinal = data?.Name || clusterNameFromQuery; - useEffect(() => { + React.useEffect(() => { dispatch(getClusterInfo(clusterNameFromQuery)); }, [dispatch, clusterNameFromQuery]); - const breadcrumbItems = useMemo(() => { + const breadcrumbItems = React.useMemo(() => { const rawBreadcrumbs: RawBreadcrumbItem[] = []; let options = pageBreadcrumbsOptions; diff --git a/src/containers/Header/breadcrumbs.tsx b/src/containers/Header/breadcrumbs.tsx index 18eb31744a..5aaa876f78 100644 --- a/src/containers/Header/breadcrumbs.tsx +++ b/src/containers/Header/breadcrumbs.tsx @@ -1,10 +1,12 @@ import { NodesRight as ClusterIcon, - Database as DatabaseIcon, Cpu as ComputeNodeIcon, + Database as DatabaseIcon, HardDrive as StorageNodeIcon, } from '@gravity-ui/icons'; +import {TabletIcon} from '../../components/TabletIcon/TabletIcon'; +import routes, {createHref, getPDiskPagePath} from '../../routes'; import type { BreadcrumbsOptions, ClusterBreadcrumbsOptions, @@ -21,13 +23,11 @@ import { TENANT_PAGE, TENANT_PAGES_IDS, } from '../../store/reducers/tenant/constants'; -import {TabletIcon} from '../../components/TabletIcon/TabletIcon'; -import routes, {createHref, getPDiskPagePath} from '../../routes'; import {CLUSTER_DEFAULT_TITLE, getTabletLabel} from '../../utils/constants'; - import {getClusterPath} from '../Cluster/utils'; -import {TenantTabsGroups, getTenantPath} from '../Tenant/TenantPages'; import {getDefaultNodePath} from '../Node/NodePages'; +import {TenantTabsGroups, getTenantPath} from '../Tenant/TenantPages'; + import {headerKeyset} from './i18n'; const prepareTenantName = (tenantName: string) => { diff --git a/src/containers/Heatmap/Heatmap.tsx b/src/containers/Heatmap/Heatmap.tsx index 517b586901..e338dfc025 100644 --- a/src/containers/Heatmap/Heatmap.tsx +++ b/src/containers/Heatmap/Heatmap.tsx @@ -1,20 +1,19 @@ -import React, {useCallback, useEffect, useState} from 'react'; -import cn from 'bem-cn-lite'; +import React from 'react'; import {Checkbox, Select} from '@gravity-ui/uikit'; -import type {IHeatmapMetricValue} from '../../types/store/heatmap'; +import {ResponseError} from '../../components/Errors/ResponseError'; +import {Loader} from '../../components/Loader'; import {getTabletsInfo, setHeatmapOptions} from '../../store/reducers/heatmap'; -import {showTooltip, hideTooltip} from '../../store/reducers/tooltip'; +import {hideTooltip, showTooltip} from '../../store/reducers/tooltip'; +import type {IHeatmapMetricValue} from '../../types/store/heatmap'; +import {cn} from '../../utils/cn'; import {formatNumber} from '../../utils/dataFormatters/dataFormatters'; -import {useAutofetcher, useTypedSelector, useTypedDispatch} from '../../utils/hooks'; - -import {Loader} from '../../components/Loader'; -import {ResponseError} from '../../components/Errors/ResponseError'; +import {useAutofetcher, useTypedDispatch, useTypedSelector} from '../../utils/hooks'; -import {COLORS_RANGE_SIZE, getColorRange, getColorIndex, getCurrentMetricLimits} from './util'; import {HeatmapCanvas} from './HeatmapCanvas/HeatmapCanvas'; import {Histogram} from './Histogram/Histogram'; +import {COLORS_RANGE_SIZE, getColorIndex, getColorRange, getCurrentMetricLimits} from './util'; import './Heatmap.scss'; @@ -42,9 +41,9 @@ export const Heatmap = ({path}: HeatmapProps) => { data: tablets = [], } = useTypedSelector((state) => state.heatmap); - const [selectedMetric, setSelectedMetric] = useState(['']); + const [selectedMetric, setSelectedMetric] = React.useState(['']); - useEffect(() => { + React.useEffect(() => { if (!currentMetric && metrics && metrics.length) { dispatch( setHeatmapOptions({ @@ -57,7 +56,7 @@ export const Heatmap = ({path}: HeatmapProps) => { } }, [currentMetric, metrics, dispatch]); - const fetchData = useCallback( + const fetchData = React.useCallback( (isBackground: boolean) => { if (!isBackground) { dispatch(setHeatmapOptions({wasLoaded: false})); diff --git a/src/containers/Heatmap/HeatmapCanvas/HeatmapCanvas.js b/src/containers/Heatmap/HeatmapCanvas/HeatmapCanvas.js index a1aa49d96c..87ab1631bf 100644 --- a/src/containers/Heatmap/HeatmapCanvas/HeatmapCanvas.js +++ b/src/containers/Heatmap/HeatmapCanvas/HeatmapCanvas.js @@ -1,10 +1,11 @@ -import {useEffect, useLayoutEffect, useRef, useState} from 'react'; -import PropTypes from 'prop-types'; -import cn from 'bem-cn-lite'; +import React from 'react'; + import throttle from 'lodash/throttle'; +import PropTypes from 'prop-types'; -import {basename as appBasename} from '../../../store/index'; import routes, {createHref} from '../../../routes'; +import {basename as appBasename} from '../../../store/index'; +import {cn} from '../../../utils/cn'; const b = cn('heatmap'); const defaultDimensions = {width: 0, height: 0}; @@ -13,10 +14,10 @@ const TABLET_SIZE = 10; const TABLET_PADDING = 2; export const HeatmapCanvas = (props) => { - const [dimensions, setDimensions] = useState(defaultDimensions); + const [dimensions, setDimensions] = React.useState(defaultDimensions); const {tablets} = props; - const canvasRef = useRef(null); - const containerRef = useRef(null); + const canvasRef = React.useRef(null); + const containerRef = React.useRef(null); function drawTablet(ctx) { return (tablet, index) => { @@ -29,7 +30,7 @@ export const HeatmapCanvas = (props) => { }; } - useEffect(() => { + React.useEffect(() => { const canvas = canvasRef.current; const ctx = canvas.getContext('2d'); @@ -37,7 +38,7 @@ export const HeatmapCanvas = (props) => { tablets.map(drawTablet(ctx)); }); - useLayoutEffect(() => { + React.useLayoutEffect(() => { const container = containerRef.current; if (container) { diff --git a/src/containers/Heatmap/Histogram/Histogram.js b/src/containers/Heatmap/Histogram/Histogram.js index 54b2ec4403..3d8054deed 100644 --- a/src/containers/Heatmap/Histogram/Histogram.js +++ b/src/containers/Heatmap/Histogram/Histogram.js @@ -1,16 +1,17 @@ -import {useRef} from 'react'; +import React from 'react'; + import PropTypes from 'prop-types'; -import cn from 'bem-cn-lite'; -import {getColorRange, getCurrentMetricLimits} from '../util'; +import {cn} from '../../../utils/cn'; import {formatNumber} from '../../../utils/dataFormatters/dataFormatters'; +import {getColorRange, getCurrentMetricLimits} from '../util'; import './Histogram.scss'; const b = cn('histogram'); const HistogramBar = (props) => { - const barRef = useRef(); + const barRef = React.useRef(); const {data = {}, maxCount} = props; const {count, leftBound, rightBound, color} = data; const height = (count / maxCount) * 100; diff --git a/src/containers/Node/Node.tsx b/src/containers/Node/Node.tsx index cf1435d735..11d1d9d39b 100644 --- a/src/containers/Node/Node.tsx +++ b/src/containers/Node/Node.tsx @@ -1,26 +1,25 @@ -import {useEffect, useMemo, useRef} from 'react'; -import {useLocation, useRouteMatch} from 'react-router'; -import cn from 'bem-cn-lite'; -import {Helmet} from 'react-helmet-async'; +import React from 'react'; import {Tabs} from '@gravity-ui/uikit'; +import {Helmet} from 'react-helmet-async'; +import {useLocation, useRouteMatch} from 'react-router'; import {Link} from 'react-router-dom'; -import {TABLETS, STORAGE, NODE_PAGES, OVERVIEW, STRUCTURE} from './NodePages'; -import {Tablets} from '../Tablets'; -import {StorageWrapper} from '../Storage/StorageWrapper'; -import NodeStructure from './NodeStructure/NodeStructure'; -import {Loader} from '../../components/Loader'; import {BasicNodeViewer} from '../../components/BasicNodeViewer'; import {FullNodeViewer} from '../../components/FullNodeViewer/FullNodeViewer'; - -import {getNodeInfo, resetNode} from '../../store/reducers/node/node'; +import {Loader} from '../../components/Loader'; import routes, {createHref, parseQuery} from '../../routes'; import {setHeaderBreadcrumbs} from '../../store/reducers/header/header'; +import {getNodeInfo, resetNode} from '../../store/reducers/node/node'; +import type {AdditionalNodesProps} from '../../types/additionalProps'; import {AutoFetcher} from '../../utils/autofetcher'; -import {useTypedSelector, useTypedDispatch} from '../../utils/hooks'; +import {cn} from '../../utils/cn'; +import {useTypedDispatch, useTypedSelector} from '../../utils/hooks'; +import {StorageWrapper} from '../Storage/StorageWrapper'; +import {Tablets} from '../Tablets'; -import type {AdditionalNodesProps} from '../../types/additionalProps'; +import {NODE_PAGES, OVERVIEW, STORAGE, STRUCTURE, TABLETS} from './NodePages'; +import NodeStructure from './NodeStructure/NodeStructure'; import './Node.scss'; @@ -36,7 +35,7 @@ interface NodeProps { } function Node(props: NodeProps) { - const container = useRef(null); + const container = React.useRef(null); const dispatch = useTypedDispatch(); const location = useLocation(); @@ -49,7 +48,7 @@ function Node(props: NodeProps) { const {id: nodeId, activeTab} = match.params; const {tenantName: tenantNameFromQuery} = parseQuery(location); - const {activeTabVerified, nodeTabs} = useMemo(() => { + const {activeTabVerified, nodeTabs} = React.useMemo(() => { const hasStorage = node?.Roles?.find((el) => el === STORAGE_ROLE); const nodePages = hasStorage ? NODE_PAGES : NODE_PAGES.filter((el) => el.id !== STORAGE); @@ -69,7 +68,7 @@ function Node(props: NodeProps) { return {activeTabVerified: actualActiveTab, nodeTabs: actualNodeTabs}; }, [activeTab, node]); - useEffect(() => { + React.useEffect(() => { const tenantName = node?.Tenants?.[0] || tenantNameFromQuery?.toString(); dispatch( @@ -80,7 +79,7 @@ function Node(props: NodeProps) { ); }, [dispatch, node, nodeId, tenantNameFromQuery]); - useEffect(() => { + React.useEffect(() => { const fetchData = () => dispatch(getNodeInfo(nodeId)); fetchData(); autofetcher.start(); diff --git a/src/containers/Node/NodePages.ts b/src/containers/Node/NodePages.ts index 84976705b8..25b38d362b 100644 --- a/src/containers/Node/NodePages.ts +++ b/src/containers/Node/NodePages.ts @@ -1,4 +1,5 @@ -import routes, {Query, createHref} from '../../routes'; +import type {Query} from '../../routes'; +import routes, {createHref} from '../../routes'; export const STORAGE = 'storage'; export const TABLETS = 'tablets'; diff --git a/src/containers/Node/NodeStructure/NodeStructure.tsx b/src/containers/Node/NodeStructure/NodeStructure.tsx index 8f81a2acfa..dac74e3337 100644 --- a/src/containers/Node/NodeStructure/NodeStructure.tsx +++ b/src/containers/Node/NodeStructure/NodeStructure.tsx @@ -1,16 +1,15 @@ -import {useEffect, useRef} from 'react'; import url from 'url'; -import isEmpty from 'lodash/isEmpty'; -import cn from 'bem-cn-lite'; +import React from 'react'; -import {Loader} from '../.././../components/Loader'; +import isEmpty from 'lodash/isEmpty'; +import {Loader} from '../.././../components/Loader'; import {getNodeStructure} from '../../../store/reducers/node/node'; import {selectNodeStructure} from '../../../store/reducers/node/selectors'; - import {AutoFetcher} from '../../../utils/autofetcher'; -import {useTypedSelector, useTypedDispatch} from '../../../utils/hooks'; +import {cn} from '../../../utils/cn'; +import {useTypedDispatch, useTypedSelector} from '../../../utils/hooks'; import {PDisk} from './Pdisk'; @@ -41,13 +40,13 @@ function NodeStructure({nodeId, className}: NodeStructureProps) { true, ).query; - const scrollContainerRef = useRef(null); + const scrollContainerRef = React.useRef(null); - const isReady = useRef(false); + const isReady = React.useRef(false); - const scrolled = useRef(false); + const scrolled = React.useRef(false); - useEffect(() => { + React.useEffect(() => { dispatch(getNodeStructure(nodeId)); autofetcher.start(); autofetcher.fetch(() => dispatch(getNodeStructure(nodeId))); @@ -59,13 +58,13 @@ function NodeStructure({nodeId, className}: NodeStructureProps) { }; }, [nodeId, dispatch]); - useEffect(() => { + React.useEffect(() => { if (!isEmpty(nodeStructure) && scrollContainerRef.current) { isReady.current = true; } }, [nodeStructure]); - useEffect(() => { + React.useEffect(() => { if (isReady.current && !scrolled.current && scrollContainerRef.current) { const element = document.getElementById( generateId({type: 'pdisk', id: pdiskIdFromUrl as string}), diff --git a/src/containers/Node/NodeStructure/PDiskTitleBadge.tsx b/src/containers/Node/NodeStructure/PDiskTitleBadge.tsx index 3796d911d5..6533b6072f 100644 --- a/src/containers/Node/NodeStructure/PDiskTitleBadge.tsx +++ b/src/containers/Node/NodeStructure/PDiskTitleBadge.tsx @@ -1,11 +1,10 @@ -import {ReactNode} from 'react'; -import cn from 'bem-cn-lite'; +import {cn} from '../../../utils/cn'; const b = cn('kv-node-structure'); interface PDiskTitleBadgeProps { label?: string; - value: ReactNode; + value: React.ReactNode; className?: string; } diff --git a/src/containers/Node/NodeStructure/Pdisk.tsx b/src/containers/Node/NodeStructure/Pdisk.tsx index 655e4af8d1..9e24df939c 100644 --- a/src/containers/Node/NodeStructure/Pdisk.tsx +++ b/src/containers/Node/NodeStructure/Pdisk.tsx @@ -1,30 +1,30 @@ -import {useState} from 'react'; -import cn from 'bem-cn-lite'; -import isEmpty from 'lodash/isEmpty'; +import React from 'react'; +import DataTable from '@gravity-ui/react-data-table'; +import type {Column} from '@gravity-ui/react-data-table'; import {ArrowToggle, Button, Popover} from '@gravity-ui/uikit'; +import isEmpty from 'lodash/isEmpty'; -import DataTable, {type Column} from '@gravity-ui/react-data-table'; - -import type {ValueOf} from '../../../types/common'; -import {EFlag} from '../../../types/api/enums'; +import {EntityStatus} from '../../../components/EntityStatus/EntityStatus'; +import {Icon} from '../../../components/Icon'; +import {PDiskInfo} from '../../../components/PDiskInfo/PDiskInfo'; +import {ProgressViewer} from '../../../components/ProgressViewer/ProgressViewer'; import type { PreparedStructurePDisk, PreparedStructureVDisk, } from '../../../store/reducers/node/types'; +import {EFlag} from '../../../types/api/enums'; import {EVDiskState} from '../../../types/api/vdisk'; -import {formatStorageValuesToGb} from '../../../utils/dataFormatters/dataFormatters'; -import {DEFAULT_TABLE_SETTINGS} from '../../../utils/constants'; +import type {ValueOf} from '../../../types/common'; import {valueIsDefined} from '../../../utils'; +import {cn} from '../../../utils/cn'; +import {DEFAULT_TABLE_SETTINGS} from '../../../utils/constants'; +import {formatStorageValuesToGb} from '../../../utils/dataFormatters/dataFormatters'; import {createVDiskDeveloperUILink} from '../../../utils/developerUI/developerUI'; -import {EntityStatus} from '../../../components/EntityStatus/EntityStatus'; -import {ProgressViewer} from '../../../components/ProgressViewer/ProgressViewer'; -import {Icon} from '../../../components/Icon'; -import {PDiskInfo} from '../../../components/PDiskInfo/PDiskInfo'; - import i18n from '../i18n'; -import {Vdisk} from './Vdisk'; + import {PDiskTitleBadge} from './PDiskTitleBadge'; +import {Vdisk} from './Vdisk'; const b = cn('kv-node-structure'); @@ -167,7 +167,7 @@ export function PDisk({ nodeId, unfolded: unfoldedFromProps, }: PDiskProps) { - const [unfolded, setUnfolded] = useState(unfoldedFromProps ?? false); + const [unfolded, setUnfolded] = React.useState(unfoldedFromProps ?? false); const {TotalSize = 0, AvailableSize = 0, Device, PDiskId, Type, vDisks} = data; diff --git a/src/containers/Node/NodeStructure/Vdisk.tsx b/src/containers/Node/NodeStructure/Vdisk.tsx index cfbe12cc96..96f30d71ce 100644 --- a/src/containers/Node/NodeStructure/Vdisk.tsx +++ b/src/containers/Node/NodeStructure/Vdisk.tsx @@ -1,12 +1,12 @@ import React from 'react'; -import cn from 'bem-cn-lite'; +import {EntityStatus} from '../../../components/EntityStatus/EntityStatus'; +import {VDiskInfo} from '../../../components/VDiskInfo/VDiskInfo'; import type {PreparedStructureVDisk} from '../../../store/reducers/node/types'; -import {EVDiskState} from '../../../types/api/vdisk'; import {EFlag} from '../../../types/api/enums'; +import {EVDiskState} from '../../../types/api/vdisk'; +import {cn} from '../../../utils/cn'; import {stringifyVdiskId} from '../../../utils/dataFormatters/dataFormatters'; -import {EntityStatus} from '../../../components/EntityStatus/EntityStatus'; -import {VDiskInfo} from '../../../components/VDiskInfo/VDiskInfo'; const b = cn('kv-node-structure'); diff --git a/src/containers/Nodes/Nodes.tsx b/src/containers/Nodes/Nodes.tsx index d141f3cd01..addba471ca 100644 --- a/src/containers/Nodes/Nodes.tsx +++ b/src/containers/Nodes/Nodes.tsx @@ -1,54 +1,50 @@ -import {useCallback, useEffect} from 'react'; -import cn from 'bem-cn-lite'; +import React from 'react'; import DataTable from '@gravity-ui/react-data-table'; import {ASCENDING} from '@gravity-ui/react-data-table/build/esm/lib/constants'; -import type {ProblemFilterValue} from '../../store/reducers/settings/types'; -import type {NodesSortParams} from '../../store/reducers/nodes/types'; - +import {EntitiesCount} from '../../components/EntitiesCount'; import {AccessDenied} from '../../components/Errors/403'; +import {ResponseError} from '../../components/Errors/ResponseError'; import {Illustration} from '../../components/Illustration'; -import {Search} from '../../components/Search'; import {ProblemFilter} from '../../components/ProblemFilter'; -import {UptimeFilter} from '../../components/UptimeFIlter'; -import {EntitiesCount} from '../../components/EntitiesCount'; +import {Search} from '../../components/Search'; import {TableWithControlsLayout} from '../../components/TableWithControlsLayout/TableWithControlsLayout'; -import {ResponseError} from '../../components/Errors/ResponseError'; - +import {UptimeFilter} from '../../components/UptimeFIlter'; +import { + getComputeNodes, + getNodes, + resetNodesState, + setDataWasNotLoaded, + setNodesUptimeFilter, + setSearchValue, + setSort, +} from '../../store/reducers/nodes/nodes'; +import {selectFilteredNodes} from '../../store/reducers/nodes/selectors'; +import type {NodesSortParams} from '../../store/reducers/nodes/types'; +import {ProblemFilterValues, changeFilter} from '../../store/reducers/settings/settings'; +import type {ProblemFilterValue} from '../../store/reducers/settings/types'; +import type {AdditionalNodesProps} from '../../types/additionalProps'; +import {cn} from '../../utils/cn'; import {DEFAULT_TABLE_SETTINGS, USE_NODES_ENDPOINT_IN_DIAGNOSTICS_KEY} from '../../utils/constants'; import { useAutofetcher, useSetting, - useTypedSelector, useTableSort, useTypedDispatch, + useTypedSelector, } from '../../utils/hooks'; import { + NodesUptimeFilterValues, isSortableNodesProperty, isUnavailableNode, - NodesUptimeFilterValues, } from '../../utils/nodes'; -import { - getNodes, - setNodesUptimeFilter, - setSearchValue, - resetNodesState, - getComputeNodes, - setDataWasNotLoaded, - setSort, -} from '../../store/reducers/nodes/nodes'; -import {selectFilteredNodes} from '../../store/reducers/nodes/selectors'; -import {changeFilter, ProblemFilterValues} from '../../store/reducers/settings/settings'; -import type {AdditionalNodesProps} from '../../types/additionalProps'; - import {getNodesColumns} from './getNodesColumns'; +import i18n from './i18n'; import './Nodes.scss'; -import i18n from './i18n'; - const b = cn('ydb-nodes'); interface NodesProps { @@ -64,7 +60,7 @@ export const Nodes = ({path, additionalNodesProps = {}}: NodesProps) => { // Since Nodes component is used in several places, // we need to reset filters, searchValue and loading state // in nodes reducer when path changes - useEffect(() => { + React.useEffect(() => { dispatch(resetNodesState()); }, [dispatch, path]); @@ -85,8 +81,8 @@ export const Nodes = ({path, additionalNodesProps = {}}: NodesProps) => { const [useNodesEndpoint] = useSetting(USE_NODES_ENDPOINT_IN_DIAGNOSTICS_KEY); - const fetchNodes = useCallback( - (isBackground) => { + const fetchNodes = React.useCallback( + (isBackground: boolean) => { if (!isBackground) { dispatch(setDataWasNotLoaded()); } @@ -121,7 +117,7 @@ export const Nodes = ({path, additionalNodesProps = {}}: NodesProps) => { const renderControls = () => { return ( - <> + { label={'Nodes'} loading={loading && !wasLoaded} /> - + ); }; diff --git a/src/containers/Nodes/NodesWrapper.tsx b/src/containers/Nodes/NodesWrapper.tsx index 53d6416ff6..04a2d28f4d 100644 --- a/src/containers/Nodes/NodesWrapper.tsx +++ b/src/containers/Nodes/NodesWrapper.tsx @@ -2,8 +2,8 @@ import type {AdditionalNodesProps} from '../../types/additionalProps'; import {USE_BACKEND_PARAMS_FOR_TABLES_KEY} from '../../utils/constants'; import {useSetting} from '../../utils/hooks'; -import {VirtualNodes} from './VirtualNodes'; import {Nodes} from './Nodes'; +import {VirtualNodes} from './VirtualNodes'; interface NodesWrapperProps { path?: string; diff --git a/src/containers/Nodes/VirtualNodes.tsx b/src/containers/Nodes/VirtualNodes.tsx index 9899cae574..eec5eece28 100644 --- a/src/containers/Nodes/VirtualNodes.tsx +++ b/src/containers/Nodes/VirtualNodes.tsx @@ -1,37 +1,36 @@ -import {useCallback, useMemo, useState} from 'react'; -import cn from 'bem-cn-lite'; +import React from 'react'; -import type {AdditionalNodesProps} from '../../types/additionalProps'; -import type {ProblemFilterValue} from '../../store/reducers/settings/types'; +import {EntitiesCount} from '../../components/EntitiesCount'; +import {AccessDenied} from '../../components/Errors/403'; +import {ResponseError} from '../../components/Errors/ResponseError'; +import {Illustration} from '../../components/Illustration'; +import {ProblemFilter} from '../../components/ProblemFilter'; +import {Search} from '../../components/Search'; +import {UptimeFilter} from '../../components/UptimeFIlter'; +import {VirtualTable} from '../../components/VirtualTable'; +import type { + FetchData, + GetRowClassName, + RenderControls, + RenderErrorMessage, +} from '../../components/VirtualTable'; import type {NodesPreparedEntity} from '../../store/reducers/nodes/types'; import {ProblemFilterValues} from '../../store/reducers/settings/settings'; +import type {ProblemFilterValue} from '../../store/reducers/settings/types'; +import type {AdditionalNodesProps} from '../../types/additionalProps'; +import {cn} from '../../utils/cn'; +import {updateColumnsWidth, useTableResize} from '../../utils/hooks/useTableResize'; import { - NodesSortValue, NodesUptimeFilterValues, getProblemParamValue, getUptimeParamValue, isSortableNodesProperty, isUnavailableNode, } from '../../utils/nodes'; -import {updateColumnsWidth, useTableResize} from '../../utils/hooks/useTableResize'; +import type {NodesSortValue} from '../../utils/nodes'; -import {Search} from '../../components/Search'; -import {ProblemFilter} from '../../components/ProblemFilter'; -import {UptimeFilter} from '../../components/UptimeFIlter'; -import {EntitiesCount} from '../../components/EntitiesCount'; -import {AccessDenied} from '../../components/Errors/403'; -import {ResponseError} from '../../components/Errors/ResponseError'; -import {Illustration} from '../../components/Illustration'; -import { - type FetchData, - type RenderControls, - type RenderErrorMessage, - VirtualTable, - GetRowClassName, -} from '../../components/VirtualTable'; - -import {getNodesColumns} from './getNodesColumns'; import {getNodes} from './getNodes'; +import {getNodesColumns} from './getNodesColumns'; import i18n from './i18n'; import './Nodes.scss'; @@ -45,19 +44,21 @@ interface NodesProps { } export const VirtualNodes = ({path, parentContainer, additionalNodesProps}: NodesProps) => { - const [searchValue, setSearchValue] = useState(''); - const [problemFilter, setProblemFilter] = useState(ProblemFilterValues.ALL); - const [uptimeFilter, setUptimeFilter] = useState( + const [searchValue, setSearchValue] = React.useState(''); + const [problemFilter, setProblemFilter] = React.useState( + ProblemFilterValues.ALL, + ); + const [uptimeFilter, setUptimeFilter] = React.useState( NodesUptimeFilterValues.All, ); const [tableColumnsWidthSetup, setTableColumnsWidth] = useTableResize('nodesTableColumnsWidth'); - const filters = useMemo(() => { + const filters = React.useMemo(() => { return [path, searchValue, problemFilter, uptimeFilter]; }, [path, searchValue, problemFilter, uptimeFilter]); - const fetchData = useCallback>( + const fetchData = React.useCallback>( async (limit, offset, {sortOrder, columnId} = {}) => { return await getNodes({ limit, @@ -79,7 +80,7 @@ export const VirtualNodes = ({path, parentContainer, additionalNodesProps}: Node const renderControls: RenderControls = ({totalEntities, foundEntities, inited}) => { return ( - <> + - + ); }; diff --git a/src/containers/Nodes/getNodesColumns.tsx b/src/containers/Nodes/getNodesColumns.tsx index 1fb3e6d539..995eaa5636 100644 --- a/src/containers/Nodes/getNodesColumns.tsx +++ b/src/containers/Nodes/getNodesColumns.tsx @@ -1,20 +1,21 @@ -import DataTable, {type Column as DataTableColumn} from '@gravity-ui/react-data-table'; +import DataTable from '@gravity-ui/react-data-table'; +import type {Column as DataTableColumn} from '@gravity-ui/react-data-table'; -import type {Column as VirtualTableColumn} from '../../components/VirtualTable'; +import {CellWithPopover} from '../../components/CellWithPopover/CellWithPopover'; +import {NodeHostWrapper} from '../../components/NodeHostWrapper/NodeHostWrapper'; import {PoolsGraph} from '../../components/PoolsGraph/PoolsGraph'; import {ProgressViewer} from '../../components/ProgressViewer/ProgressViewer'; import {TabletsStatistic} from '../../components/TabletsStatistic'; -import {NodeHostWrapper} from '../../components/NodeHostWrapper/NodeHostWrapper'; +import {UsageLabel} from '../../components/UsageLabel/UsageLabel'; +import type {Column as VirtualTableColumn} from '../../components/VirtualTable'; +import type {NodesPreparedEntity} from '../../store/reducers/nodes/types'; +import {getLoadSeverityForNode} from '../../store/reducers/nodes/utils'; +import type {GetNodeRefFunc} from '../../types/additionalProps'; +import {EMPTY_DATA_PLACEHOLDER} from '../../utils/constants'; import { formatBytesToGigabyte, formatStorageValuesToGb, } from '../../utils/dataFormatters/dataFormatters'; -import type {NodesPreparedEntity} from '../../store/reducers/nodes/types'; -import type {GetNodeRefFunc} from '../../types/additionalProps'; -import {getLoadSeverityForNode} from '../../store/reducers/nodes/utils'; -import {UsageLabel} from '../../components/UsageLabel/UsageLabel'; -import {CellWithPopover} from '../../components/CellWithPopover/CellWithPopover'; -import {EMPTY_DATA_PLACEHOLDER} from '../../utils/constants'; const NODES_COLUMNS_IDS = { NodeId: 'NodeId', diff --git a/src/containers/Nodes/i18n/index.ts b/src/containers/Nodes/i18n/index.ts index dc437f41d2..71b11c937b 100644 --- a/src/containers/Nodes/i18n/index.ts +++ b/src/containers/Nodes/i18n/index.ts @@ -1,11 +1,8 @@ -import {i18n, Lang} from '../../../utils/i18n'; +import {registerKeysets} from '../../../utils/i18n'; import en from './en.json'; import ru from './ru.json'; const COMPONENT = 'ydb-nodes'; -i18n.registerKeyset(Lang.En, COMPONENT, en); -i18n.registerKeyset(Lang.Ru, COMPONENT, ru); - -export default i18n.keyset(COMPONENT); +export default registerKeysets(COMPONENT, {ru, en}); diff --git a/src/containers/PDiskPage/PDiskGroups.tsx b/src/containers/PDiskPage/PDiskGroups.tsx index 80bfd4a9b2..f6ecdbe3f9 100644 --- a/src/containers/PDiskPage/PDiskGroups.tsx +++ b/src/containers/PDiskPage/PDiskGroups.tsx @@ -1,18 +1,15 @@ -import {useMemo} from 'react'; +import React from 'react'; import DataTable from '@gravity-ui/react-data-table'; +import {TableSkeleton} from '../../components/TableSkeleton/TableSkeleton'; import type {PreparedStorageGroup} from '../../store/reducers/storage/types'; import type {NodesMap} from '../../types/store/nodesList'; - -import {TableSkeleton} from '../../components/TableSkeleton/TableSkeleton'; - import {DEFAULT_TABLE_SETTINGS} from '../../utils/constants'; - import {getPDiskStorageColumns} from '../Storage/StorageGroups/getStorageGroupsColumns'; -import {pdiskPageCn} from './shared'; import {pDiskPageKeyset} from './i18n'; +import {pdiskPageCn} from './shared'; interface PDiskGroupsProps { data: PreparedStorageGroup[]; @@ -21,7 +18,7 @@ interface PDiskGroupsProps { } export function PDiskGroups({data, nodesMap, loading}: PDiskGroupsProps) { - const pDiskStorageColumns = useMemo(() => { + const pDiskStorageColumns = React.useMemo(() => { return getPDiskStorageColumns(nodesMap); }, [nodesMap]); @@ -41,9 +38,9 @@ export function PDiskGroups({data, nodesMap, loading}: PDiskGroupsProps) { }; return ( - <> +
{pDiskPageKeyset('groups')}
{renderContent()}
- +
); } diff --git a/src/containers/PDiskPage/PDiskPage.scss b/src/containers/PDiskPage/PDiskPage.scss index 602c3daa35..14d20973ad 100644 --- a/src/containers/PDiskPage/PDiskPage.scss +++ b/src/containers/PDiskPage/PDiskPage.scss @@ -6,13 +6,12 @@ display: flex; overflow: auto; flex-direction: column; + gap: 20px; height: 100%; padding-top: 20px; padding-left: 20px; - gap: 20px; - &__meta, &__title, &__info, diff --git a/src/containers/PDiskPage/PDiskPage.tsx b/src/containers/PDiskPage/PDiskPage.tsx index 88229f6306..4f43c66528 100644 --- a/src/containers/PDiskPage/PDiskPage.tsx +++ b/src/containers/PDiskPage/PDiskPage.tsx @@ -1,31 +1,30 @@ -import {useCallback, useEffect} from 'react'; -import {StringParam, useQueryParams} from 'use-query-params'; -import {Helmet} from 'react-helmet-async'; +import React from 'react'; import {Icon} from '@gravity-ui/uikit'; -import ArrowRotateLeftIcon from '@gravity-ui/icons/svgs/arrow-rotate-left.svg'; +import {Helmet} from 'react-helmet-async'; +import {StringParam, useQueryParams} from 'use-query-params'; +import {ButtonWithConfirmDialog} from '../../components/ButtonWithConfirmDialog/ButtonWithConfirmDialog'; +import {DiskPageTitle} from '../../components/DiskPageTitle/DiskPageTitle'; +import {InfoViewerSkeleton} from '../../components/InfoViewerSkeleton/InfoViewerSkeleton'; +import {PDiskInfo} from '../../components/PDiskInfo/PDiskInfo'; +import {PageMeta} from '../../components/PageMeta/PageMeta'; +import {setHeaderBreadcrumbs} from '../../store/reducers/header/header'; +import {selectNodesMap} from '../../store/reducers/nodesList'; import { getPDiskData, getPDiskStorage, setPDiskDataWasNotLoaded, } from '../../store/reducers/pdisk/pdisk'; -import {setHeaderBreadcrumbs} from '../../store/reducers/header/header'; -import {selectNodesMap} from '../../store/reducers/nodesList'; - import {valueIsDefined} from '../../utils'; -import {useAutofetcher, useTypedDispatch, useTypedSelector} from '../../utils/hooks'; import {getSeverityColor} from '../../utils/disks/helpers'; - -import {PageMeta} from '../../components/PageMeta/PageMeta'; -import {PDiskInfo} from '../../components/PDiskInfo/PDiskInfo'; -import {InfoViewerSkeleton} from '../../components/InfoViewerSkeleton/InfoViewerSkeleton'; -import {DiskPageTitle} from '../../components/DiskPageTitle/DiskPageTitle'; -import {ButtonWithConfirmDialog} from '../../components/ButtonWithConfirmDialog/ButtonWithConfirmDialog'; +import {useAutofetcher, useTypedDispatch, useTypedSelector} from '../../utils/hooks'; import {PDiskGroups} from './PDiskGroups'; -import {pdiskPageCn} from './shared'; import {pDiskPageKeyset} from './i18n'; +import {pdiskPageCn} from './shared'; + +import ArrowRotateLeftIcon from '@gravity-ui/icons/svgs/arrow-rotate-left.svg'; import './PDiskPage.scss'; @@ -42,11 +41,11 @@ export function PDiskPage() { pDiskId: StringParam, }); - useEffect(() => { + React.useEffect(() => { dispatch(setHeaderBreadcrumbs('pDisk', {nodeId, pDiskId})); }, [dispatch, nodeId, pDiskId]); - const fetchData = useCallback( + const fetchData = React.useCallback( async (isBackground?: boolean) => { if (!isBackground) { dispatch(setPDiskDataWasNotLoaded()); diff --git a/src/containers/ReduxTooltip/ReduxTooltip.js b/src/containers/ReduxTooltip/ReduxTooltip.js index 10c59f8a33..3de5abca60 100644 --- a/src/containers/ReduxTooltip/ReduxTooltip.js +++ b/src/containers/ReduxTooltip/ReduxTooltip.js @@ -1,7 +1,8 @@ -import React, {useEffect} from 'react'; +import React from 'react'; + +import {Popup, useVirtualElementRef} from '@gravity-ui/uikit'; import PropTypes from 'prop-types'; import {connect} from 'react-redux'; -import {Popup, useVirtualElementRef} from '@gravity-ui/uikit'; import {hideTooltip} from '../../store/reducers/tooltip'; import {tooltipTemplates} from '../../utils/tooltip'; @@ -22,7 +23,7 @@ function ReduxTooltip(props) { rect: {top: props.positions?.top, left: props.positions?.left}, }); - useEffect(() => { + React.useEffect(() => { window.addEventListener('scroll', handleScroll, true); return () => { window.removeEventListener('scroll', handleScroll); diff --git a/src/containers/Storage/EmptyFilter/i18n/index.ts b/src/containers/Storage/EmptyFilter/i18n/index.ts index 5cdcfe8267..fa42957d03 100644 --- a/src/containers/Storage/EmptyFilter/i18n/index.ts +++ b/src/containers/Storage/EmptyFilter/i18n/index.ts @@ -1,11 +1,8 @@ -import {i18n, Lang} from '../../../../utils/i18n'; +import {registerKeysets} from '../../../../utils/i18n'; import en from './en.json'; import ru from './ru.json'; const COMPONENT = 'ydb-storage-empty-filter'; -i18n.registerKeyset(Lang.En, COMPONENT, en); -i18n.registerKeyset(Lang.Ru, COMPONENT, ru); - -export default i18n.keyset(COMPONENT); +export default registerKeysets(COMPONENT, {ru, en}); diff --git a/src/containers/Storage/PDisk/PDisk.tsx b/src/containers/Storage/PDisk/PDisk.tsx index 907a1f4e10..d62aad6556 100644 --- a/src/containers/Storage/PDisk/PDisk.tsx +++ b/src/containers/Storage/PDisk/PDisk.tsx @@ -1,16 +1,14 @@ -import React, {useState, useRef} from 'react'; -import cn from 'bem-cn-lite'; +import React from 'react'; -import type {TVDiskStateInfo} from '../../../types/api/vdisk'; -import {InternalLink} from '../../../components/InternalLink'; -import {VDiskWithDonorsStack} from '../../../components/VDisk/VDiskWithDonorsStack'; import {DiskStateProgressBar} from '../../../components/DiskStateProgressBar/DiskStateProgressBar'; +import {InternalLink} from '../../../components/InternalLink'; import {PDiskPopup} from '../../../components/PDiskPopup/PDiskPopup'; - -import type {PreparedPDisk} from '../../../utils/disks/types'; +import {VDiskWithDonorsStack} from '../../../components/VDisk/VDiskWithDonorsStack'; import routes, {createHref} from '../../../routes'; +import type {TVDiskStateInfo} from '../../../types/api/vdisk'; +import {cn} from '../../../utils/cn'; import {stringifyVdiskId} from '../../../utils/dataFormatters/dataFormatters'; - +import type {PreparedPDisk} from '../../../utils/disks/types'; import {STRUCTURE} from '../../Node/NodePages'; import './PDisk.scss'; @@ -24,9 +22,9 @@ interface PDiskProps { } export const PDisk = ({nodeId, data = {}, vDisks}: PDiskProps) => { - const [isPopupVisible, setIsPopupVisible] = useState(false); + const [isPopupVisible, setIsPopupVisible] = React.useState(false); - const anchor = useRef(null); + const anchor = React.useRef(null); const showPopup = () => { setIsPopupVisible(true); diff --git a/src/containers/Storage/Storage.tsx b/src/containers/Storage/Storage.tsx index 490c2e48a6..21a47ca218 100644 --- a/src/containers/Storage/Storage.tsx +++ b/src/containers/Storage/Storage.tsx @@ -1,53 +1,52 @@ -import {useCallback, useEffect} from 'react'; +import React from 'react'; import {AccessDenied} from '../../components/Errors/403'; -import {TableWithControlsLayout} from '../../components/TableWithControlsLayout/TableWithControlsLayout'; import {ResponseError} from '../../components/Errors/ResponseError'; - -import type { - StorageSortParams, - StorageType, - VisibleEntities, -} from '../../store/reducers/storage/types'; +import {TableWithControlsLayout} from '../../components/TableWithControlsLayout/TableWithControlsLayout'; import type {NodesSortParams} from '../../store/reducers/nodes/types'; -import type {AdditionalNodesProps} from '../../types/additionalProps'; -import { - setInitialState, - setVisibleEntities, - setStorageTextFilter, - setUsageFilter, - setStorageType, - setNodesUptimeFilter, - setDataWasNotLoaded, - getStorageNodesInfo, - getStorageGroupsInfo, - setNodesSortParams, - setGroupsSortParams, -} from '../../store/reducers/storage/storage'; +import {selectNodesMap} from '../../store/reducers/nodesList'; +import {STORAGE_TYPES, VISIBLE_ENTITIES} from '../../store/reducers/storage/constants'; import { + selectEntitiesCount, selectFilteredGroups, selectFilteredNodes, - selectEntitiesCount, - selectUsageFilterOptions, - selectNodesSortParams, selectGroupsSortParams, + selectNodesSortParams, + selectUsageFilterOptions, } from '../../store/reducers/storage/selectors'; -import {VISIBLE_ENTITIES, STORAGE_TYPES} from '../../store/reducers/storage/constants'; -import {selectNodesMap} from '../../store/reducers/nodesList'; +import { + getStorageGroupsInfo, + getStorageNodesInfo, + setDataWasNotLoaded, + setGroupsSortParams, + setInitialState, + setNodesSortParams, + setNodesUptimeFilter, + setStorageTextFilter, + setStorageType, + setUsageFilter, + setVisibleEntities, +} from '../../store/reducers/storage/storage'; +import type { + StorageSortParams, + StorageType, + VisibleEntities, +} from '../../store/reducers/storage/types'; +import type {AdditionalNodesProps} from '../../types/additionalProps'; +import {DEFAULT_TABLE_SETTINGS} from '../../utils/constants'; import { useAutofetcher, useNodesRequestParams, useStorageRequestParams, useTableSort, - useTypedSelector, useTypedDispatch, + useTypedSelector, } from '../../utils/hooks'; import {NodesUptimeFilterValues} from '../../utils/nodes'; -import {DEFAULT_TABLE_SETTINGS} from '../../utils/constants'; +import {StorageControls} from './StorageControls/StorageControls'; import {StorageGroups} from './StorageGroups/StorageGroups'; import {StorageNodes} from './StorageNodes/StorageNodes'; -import {StorageControls} from './StorageControls/StorageControls'; import {b} from './shared'; import './Storage.scss'; @@ -84,7 +83,7 @@ export const Storage = ({additionalNodesProps, tenant, nodeId}: StorageProps) => const isNodePage = nodeId !== undefined; const storageType = isNodePage ? STORAGE_TYPES.groups : type; - useEffect(() => { + React.useEffect(() => { return () => { // Clean data on component unmount dispatch(setInitialState()); @@ -108,7 +107,7 @@ export const Storage = ({additionalNodesProps, tenant, nodeId}: StorageProps) => dispatch(setGroupsSortParams(params as StorageSortParams)), ); - const fetchData = useCallback( + const fetchData = React.useCallback( (isBackground: boolean) => { if (!isBackground) { dispatch(setDataWasNotLoaded()); @@ -165,7 +164,7 @@ export const Storage = ({additionalNodesProps, tenant, nodeId}: StorageProps) => const renderDataTable = () => { return ( - <> + {storageType === STORAGE_TYPES.groups && ( handleSort={handleNodesSort} /> )} - + ); }; diff --git a/src/containers/Storage/StorageControls/StorageControls.tsx b/src/containers/Storage/StorageControls/StorageControls.tsx index 3cc42176c9..48476bbe22 100644 --- a/src/containers/Storage/StorageControls/StorageControls.tsx +++ b/src/containers/Storage/StorageControls/StorageControls.tsx @@ -1,14 +1,15 @@ +import React from 'react'; + import {EntitiesCount} from '../../../components/EntitiesCount/EntitiesCount'; import {Search} from '../../../components/Search/Search'; import {UptimeFilter} from '../../../components/UptimeFIlter'; - -import type {StorageType, VisibleEntities} from '../../../store/reducers/storage/types'; import {STORAGE_TYPES} from '../../../store/reducers/storage/constants'; -import {NodesUptimeFilterValues} from '../../../utils/nodes'; - -import {UsageFilter, type UsageFilterItem} from '../UsageFilter/UsageFilter'; +import type {StorageType, VisibleEntities} from '../../../store/reducers/storage/types'; +import type {NodesUptimeFilterValues} from '../../../utils/nodes'; import {StorageTypeFilter} from '../StorageTypeFilter/StorageTypeFilter'; import {StorageVisibleEntitiesFilter} from '../StorageVisibleEntitiesFilter/StorageVisibleEntitiesFilter'; +import {UsageFilter} from '../UsageFilter/UsageFilter'; +import type {UsageFilterItem} from '../UsageFilter/UsageFilter'; import i18n from '../i18n'; import {b} from '../shared'; @@ -63,7 +64,7 @@ export const StorageControls = ({ const entityName = isNodes ? i18n('nodes') : i18n('groups'); return ( - <> + - + ); }; diff --git a/src/containers/Storage/StorageGroups/StorageGroups.tsx b/src/containers/Storage/StorageGroups/StorageGroups.tsx index 7f83d5285c..9d4120af78 100644 --- a/src/containers/Storage/StorageGroups/StorageGroups.tsx +++ b/src/containers/Storage/StorageGroups/StorageGroups.tsx @@ -1,15 +1,17 @@ -import {useMemo} from 'react'; +import React from 'react'; -import DataTable, {Settings, SortOrder} from '@gravity-ui/react-data-table'; +import type {Settings, SortOrder} from '@gravity-ui/react-data-table'; +import DataTable from '@gravity-ui/react-data-table'; -import type {NodesMap} from '../../../types/store/nodesList'; +import {VISIBLE_ENTITIES} from '../../../store/reducers/storage/constants'; import type {PreparedStorageGroup, VisibleEntities} from '../../../store/reducers/storage/types'; +import type {NodesMap} from '../../../types/store/nodesList'; import type {HandleSort} from '../../../utils/hooks/useTableSort'; -import {VISIBLE_ENTITIES} from '../../../store/reducers/storage/constants'; -import {getPreparedStorageGroupsColumns} from './getStorageGroupsColumns'; -import {StorageGroupsEmptyDataMessage} from './StorageGroupsEmptyDataMessage'; +import {StorageGroupsEmptyDataMessage} from './StorageGroupsEmptyDataMessage'; +import {getPreparedStorageGroupsColumns} from './getStorageGroupsColumns'; import i18n from './i18n'; + import './StorageGroups.scss'; interface StorageGroupsProps { @@ -31,7 +33,7 @@ export function StorageGroups({ sort, handleSort, }: StorageGroupsProps) { - const columns = useMemo(() => { + const columns = React.useMemo(() => { return getPreparedStorageGroupsColumns(nodes, visibleEntities); }, [nodes, visibleEntities]); diff --git a/src/containers/Storage/StorageGroups/StorageGroupsEmptyDataMessage.tsx b/src/containers/Storage/StorageGroups/StorageGroupsEmptyDataMessage.tsx index 80513953fb..623edd976b 100644 --- a/src/containers/Storage/StorageGroups/StorageGroupsEmptyDataMessage.tsx +++ b/src/containers/Storage/StorageGroups/StorageGroupsEmptyDataMessage.tsx @@ -1,6 +1,7 @@ -import type {VisibleEntities} from '../../../store/reducers/storage/types'; import {VISIBLE_ENTITIES} from '../../../store/reducers/storage/constants'; +import type {VisibleEntities} from '../../../store/reducers/storage/types'; import {EmptyFilter} from '../EmptyFilter/EmptyFilter'; + import i18n from './i18n'; interface StorageNodesEmptyDataMessageProps { diff --git a/src/containers/Storage/StorageGroups/VirtualStorageGroups.tsx b/src/containers/Storage/StorageGroups/VirtualStorageGroups.tsx index 61086e635f..7ee0570cc8 100644 --- a/src/containers/Storage/StorageGroups/VirtualStorageGroups.tsx +++ b/src/containers/Storage/StorageGroups/VirtualStorageGroups.tsx @@ -1,19 +1,15 @@ -import {useCallback, useMemo} from 'react'; +import React from 'react'; +import {VirtualTable} from '../../../components/VirtualTable'; +import type {FetchData, RenderControls, RenderErrorMessage} from '../../../components/VirtualTable'; +import {VISIBLE_ENTITIES} from '../../../store/reducers/storage/constants'; +import type {PreparedStorageGroup, VisibleEntities} from '../../../store/reducers/storage/types'; import type {NodesMap} from '../../../types/store/nodesList'; import type {StorageSortValue} from '../../../utils/storage'; -import { - VirtualTable, - type FetchData, - type RenderControls, - type RenderErrorMessage, -} from '../../../components/VirtualTable'; -import type {PreparedStorageGroup, VisibleEntities} from '../../../store/reducers/storage/types'; -import {VISIBLE_ENTITIES} from '../../../store/reducers/storage/constants'; import {StorageGroupsEmptyDataMessage} from './StorageGroupsEmptyDataMessage'; -import {getPreparedStorageGroupsColumns} from './getStorageGroupsColumns'; import {getStorageGroups} from './getGroups'; +import {getPreparedStorageGroupsColumns} from './getStorageGroupsColumns'; import i18n from './i18n'; interface VirtualStorageGroupsProps { @@ -41,11 +37,11 @@ export const VirtualStorageGroups = ({ renderControls, renderErrorMessage, }: VirtualStorageGroupsProps) => { - const filters = useMemo(() => { + const filters = React.useMemo(() => { return [searchValue, visibleEntities, tenant, nodeId]; }, [searchValue, visibleEntities, tenant, nodeId]); - const fetchData = useCallback>( + const fetchData = React.useCallback>( async (limit, offset, {sortOrder, columnId} = {}) => { return await getStorageGroups({ limit, @@ -62,7 +58,7 @@ export const VirtualStorageGroups = ({ [nodeId, searchValue, tenant, visibleEntities], ); - const columns = useMemo(() => { + const columns = React.useMemo(() => { return getPreparedStorageGroupsColumns(nodesMap, visibleEntities); }, [nodesMap, visibleEntities]); diff --git a/src/containers/Storage/StorageGroups/getStorageGroupsColumns.tsx b/src/containers/Storage/StorageGroups/getStorageGroupsColumns.tsx index 89c1354250..44814cab07 100644 --- a/src/containers/Storage/StorageGroups/getStorageGroupsColumns.tsx +++ b/src/containers/Storage/StorageGroups/getStorageGroupsColumns.tsx @@ -1,23 +1,28 @@ -import cn from 'bem-cn-lite'; +import React from 'react'; -import DataTable, {type Column as DataTableColumn} from '@gravity-ui/react-data-table'; +import DataTable from '@gravity-ui/react-data-table'; +import type {Column as DataTableColumn} from '@gravity-ui/react-data-table'; import {Icon, Label, Popover, PopoverBehavior} from '@gravity-ui/uikit'; -import {EFlag} from '../../../types/api/enums'; +import {CellWithPopover} from '../../../components/CellWithPopover/CellWithPopover'; +import {EntityStatus} from '../../../components/EntityStatus/EntityStatus'; +import {UsageLabel} from '../../../components/UsageLabel/UsageLabel'; +import {VDiskWithDonorsStack} from '../../../components/VDisk/VDiskWithDonorsStack'; import type {Column as VirtualTableColumn} from '../../../components/VirtualTable'; -import shieldIcon from '../../../assets/icons/shield.svg'; -import type {NodesMap} from '../../../types/store/nodesList'; -import type {PreparedStorageGroup, VisibleEntities} from '../../../store/reducers/storage/types'; import {VISIBLE_ENTITIES} from '../../../store/reducers/storage/constants'; +import type {PreparedStorageGroup, VisibleEntities} from '../../../store/reducers/storage/types'; +import {EFlag} from '../../../types/api/enums'; +import type {NodesMap} from '../../../types/store/nodesList'; +import {cn} from '../../../utils/cn'; +import {stringifyVdiskId} from '../../../utils/dataFormatters/dataFormatters'; import {isSortableStorageProperty} from '../../../utils/storage'; import {bytesToGB, bytesToSpeed} from '../../../utils/utils'; -import {stringifyVdiskId} from '../../../utils/dataFormatters/dataFormatters'; -import {EntityStatus} from '../../../components/EntityStatus/EntityStatus'; -import {CellWithPopover} from '../../../components/CellWithPopover/CellWithPopover'; -import {UsageLabel} from '../../../components/UsageLabel/UsageLabel'; -import {VDiskWithDonorsStack} from '../../../components/VDisk/VDiskWithDonorsStack'; import {getDegradedSeverity, getUsageSeverityForStorageGroup} from '../utils'; + import i18n from './i18n'; + +import shieldIcon from '../../../assets/icons/shield.svg'; + import './StorageGroups.scss'; const b = cn('global-storage-groups'); @@ -68,7 +73,7 @@ const typeColumn: StorageGroupsColumn = { width: 100, align: DataTable.LEFT, render: ({row}) => ( - <> + {'\u00a0'} {row.Encryption && ( @@ -82,7 +87,7 @@ const typeColumn: StorageGroupsColumn = { )} - + ), sortable: false, }; diff --git a/src/containers/Storage/StorageGroups/i18n/index.ts b/src/containers/Storage/StorageGroups/i18n/index.ts index 380cae2a73..55ce872966 100644 --- a/src/containers/Storage/StorageGroups/i18n/index.ts +++ b/src/containers/Storage/StorageGroups/i18n/index.ts @@ -1,11 +1,8 @@ -import {i18n, Lang} from '../../../../utils/i18n'; +import {registerKeysets} from '../../../../utils/i18n'; import en from './en.json'; import ru from './ru.json'; const COMPONENT = 'ydb-storage-groups'; -i18n.registerKeyset(Lang.En, COMPONENT, en); -i18n.registerKeyset(Lang.Ru, COMPONENT, ru); - -export default i18n.keyset(COMPONENT); +export default registerKeysets(COMPONENT, {ru, en}); diff --git a/src/containers/Storage/StorageNodes/StorageNodes.tsx b/src/containers/Storage/StorageNodes/StorageNodes.tsx index 94b9099eed..dac1e81567 100644 --- a/src/containers/Storage/StorageNodes/StorageNodes.tsx +++ b/src/containers/Storage/StorageNodes/StorageNodes.tsx @@ -1,17 +1,17 @@ -import DataTable, {Settings, SortOrder} from '@gravity-ui/react-data-table'; +import type {Settings, SortOrder} from '@gravity-ui/react-data-table'; +import DataTable from '@gravity-ui/react-data-table'; +import {VISIBLE_ENTITIES} from '../../../store/reducers/storage/constants'; import type {PreparedStorageNode, VisibleEntities} from '../../../store/reducers/storage/types'; -import type {HandleSort} from '../../../utils/hooks/useTableSort'; import type {AdditionalNodesProps} from '../../../types/additionalProps'; - -import {VISIBLE_ENTITIES} from '../../../store/reducers/storage/constants'; +import type {HandleSort} from '../../../utils/hooks/useTableSort'; import {NodesUptimeFilterValues} from '../../../utils/nodes'; -import {getPreparedStorageNodesColumns} from './getStorageNodesColumns'; - import {StorageNodesEmptyDataMessage} from './StorageNodesEmptyDataMessage'; -import {getRowUnavailableClassName} from './shared'; +import {getPreparedStorageNodesColumns} from './getStorageNodesColumns'; import i18n from './i18n'; +import {getRowUnavailableClassName} from './shared'; + import './StorageNodes.scss'; interface StorageNodesProps { diff --git a/src/containers/Storage/StorageNodes/StorageNodesEmptyDataMessage.tsx b/src/containers/Storage/StorageNodes/StorageNodesEmptyDataMessage.tsx index b847dc9832..2091614c4f 100644 --- a/src/containers/Storage/StorageNodes/StorageNodesEmptyDataMessage.tsx +++ b/src/containers/Storage/StorageNodes/StorageNodesEmptyDataMessage.tsx @@ -1,7 +1,8 @@ -import type {VisibleEntities} from '../../../store/reducers/storage/types'; import {VISIBLE_ENTITIES} from '../../../store/reducers/storage/constants'; +import type {VisibleEntities} from '../../../store/reducers/storage/types'; import {NodesUptimeFilterValues} from '../../../utils/nodes'; import {EmptyFilter} from '../EmptyFilter/EmptyFilter'; + import i18n from './i18n'; interface StorageNodesEmptyDataMessageProps { diff --git a/src/containers/Storage/StorageNodes/VirtualStorageNodes.tsx b/src/containers/Storage/StorageNodes/VirtualStorageNodes.tsx index 9f74b4dcb6..6e675ed54c 100644 --- a/src/containers/Storage/StorageNodes/VirtualStorageNodes.tsx +++ b/src/containers/Storage/StorageNodes/VirtualStorageNodes.tsx @@ -1,25 +1,18 @@ -import {useCallback, useMemo} from 'react'; +import React from 'react'; -import type {AdditionalNodesProps} from '../../../types/additionalProps'; -import { - getUptimeParamValue, - NodesUptimeFilterValues, - type NodesSortValue, -} from '../../../utils/nodes'; -import { - VirtualTable, - type FetchData, - type RenderControls, - type RenderErrorMessage, -} from '../../../components/VirtualTable'; -import type {PreparedStorageNode, VisibleEntities} from '../../../store/reducers/storage/types'; +import {VirtualTable} from '../../../components/VirtualTable'; +import type {FetchData, RenderControls, RenderErrorMessage} from '../../../components/VirtualTable'; import {VISIBLE_ENTITIES} from '../../../store/reducers/storage/constants'; +import type {PreparedStorageNode, VisibleEntities} from '../../../store/reducers/storage/types'; +import type {AdditionalNodesProps} from '../../../types/additionalProps'; +import {NodesUptimeFilterValues, getUptimeParamValue} from '../../../utils/nodes'; +import type {NodesSortValue} from '../../../utils/nodes'; import {StorageNodesEmptyDataMessage} from './StorageNodesEmptyDataMessage'; -import {getPreparedStorageNodesColumns} from './getStorageNodesColumns'; import {getStorageNodes} from './getNodes'; -import {getRowUnavailableClassName} from './shared'; +import {getPreparedStorageNodesColumns} from './getStorageNodesColumns'; import i18n from './i18n'; +import {getRowUnavailableClassName} from './shared'; interface VirtualStorageNodesProps { searchValue: string; @@ -46,11 +39,11 @@ export const VirtualStorageNodes = ({ renderControls, renderErrorMessage, }: VirtualStorageNodesProps) => { - const filters = useMemo(() => { + const filters = React.useMemo(() => { return [searchValue, visibleEntities, nodesUptimeFilter, tenant]; }, [searchValue, visibleEntities, nodesUptimeFilter, tenant]); - const fetchData = useCallback>( + const fetchData = React.useCallback>( async (limit, offset, {sortOrder, columnId} = {}) => { return await getStorageNodes({ limit, @@ -67,7 +60,7 @@ export const VirtualStorageNodes = ({ [nodesUptimeFilter, searchValue, tenant, visibleEntities], ); - const columns = useMemo(() => { + const columns = React.useMemo(() => { return getPreparedStorageNodesColumns(additionalNodesProps, visibleEntities); }, [additionalNodesProps, visibleEntities]); diff --git a/src/containers/Storage/StorageNodes/getStorageNodesColumns.tsx b/src/containers/Storage/StorageNodes/getStorageNodesColumns.tsx index 8070b787a4..582f9ed7d0 100644 --- a/src/containers/Storage/StorageNodes/getStorageNodesColumns.tsx +++ b/src/containers/Storage/StorageNodes/getStorageNodesColumns.tsx @@ -1,14 +1,15 @@ -import DataTable, {type Column as DataTableColumn} from '@gravity-ui/react-data-table'; +import DataTable from '@gravity-ui/react-data-table'; +import type {Column as DataTableColumn} from '@gravity-ui/react-data-table'; -import type {PreparedStorageNode, VisibleEntities} from '../../../store/reducers/storage/types'; -import type {AdditionalNodesProps} from '../../../types/additionalProps'; +import {NodeHostWrapper} from '../../../components/NodeHostWrapper/NodeHostWrapper'; import type {Column as VirtualTableColumn} from '../../../components/VirtualTable'; import {VISIBLE_ENTITIES} from '../../../store/reducers/storage/constants'; -import {NodeHostWrapper} from '../../../components/NodeHostWrapper/NodeHostWrapper'; -import {isSortableNodesProperty} from '../../../utils/nodes'; +import type {PreparedStorageNode, VisibleEntities} from '../../../store/reducers/storage/types'; +import type {AdditionalNodesProps} from '../../../types/additionalProps'; import {EMPTY_DATA_PLACEHOLDER} from '../../../utils/constants'; - +import {isSortableNodesProperty} from '../../../utils/nodes'; import {PDisk} from '../PDisk/PDisk'; + import {b} from './shared'; export const STORAGE_NODES_COLUMNS_IDS = { diff --git a/src/containers/Storage/StorageNodes/i18n/index.ts b/src/containers/Storage/StorageNodes/i18n/index.ts index 4ce2d3d484..5d6376781d 100644 --- a/src/containers/Storage/StorageNodes/i18n/index.ts +++ b/src/containers/Storage/StorageNodes/i18n/index.ts @@ -1,11 +1,8 @@ -import {i18n, Lang} from '../../../../utils/i18n'; +import {registerKeysets} from '../../../../utils/i18n'; import en from './en.json'; import ru from './ru.json'; const COMPONENT = 'ydb-storage-nodes'; -i18n.registerKeyset(Lang.En, COMPONENT, en); -i18n.registerKeyset(Lang.Ru, COMPONENT, ru); - -export default i18n.keyset(COMPONENT); +export default registerKeysets(COMPONENT, {ru, en}); diff --git a/src/containers/Storage/StorageNodes/shared.ts b/src/containers/Storage/StorageNodes/shared.ts index f706117eec..45d441aa45 100644 --- a/src/containers/Storage/StorageNodes/shared.ts +++ b/src/containers/Storage/StorageNodes/shared.ts @@ -1,6 +1,5 @@ -import cn from 'bem-cn-lite'; - import type {PreparedStorageNode} from '../../../store/reducers/storage/types'; +import {cn} from '../../../utils/cn'; import {isUnavailableNode} from '../../../utils/nodes'; export const b = cn('global-storage-nodes'); diff --git a/src/containers/Storage/StorageTypeFilter/StorageTypeFilter.tsx b/src/containers/Storage/StorageTypeFilter/StorageTypeFilter.tsx index efabe76c82..084f26e453 100644 --- a/src/containers/Storage/StorageTypeFilter/StorageTypeFilter.tsx +++ b/src/containers/Storage/StorageTypeFilter/StorageTypeFilter.tsx @@ -1,7 +1,7 @@ import {RadioButton} from '@gravity-ui/uikit'; -import type {StorageType} from '../../../store/reducers/storage/types'; import {STORAGE_TYPES} from '../../../store/reducers/storage/constants'; +import type {StorageType} from '../../../store/reducers/storage/types'; const StorageTypesTitles = { [STORAGE_TYPES.groups]: 'Groups', diff --git a/src/containers/Storage/StorageVisibleEntitiesFilter/StorageVisibleEntitiesFilter.tsx b/src/containers/Storage/StorageVisibleEntitiesFilter/StorageVisibleEntitiesFilter.tsx index b608070686..9c17c984c5 100644 --- a/src/containers/Storage/StorageVisibleEntitiesFilter/StorageVisibleEntitiesFilter.tsx +++ b/src/containers/Storage/StorageVisibleEntitiesFilter/StorageVisibleEntitiesFilter.tsx @@ -1,7 +1,7 @@ import {RadioButton} from '@gravity-ui/uikit'; -import type {VisibleEntities} from '../../../store/reducers/storage/types'; import {VISIBLE_ENTITIES} from '../../../store/reducers/storage/constants'; +import type {VisibleEntities} from '../../../store/reducers/storage/types'; export const VisibleEntitiesTitles = { [VISIBLE_ENTITIES.all]: 'All', diff --git a/src/containers/Storage/StorageWrapper.tsx b/src/containers/Storage/StorageWrapper.tsx index 0d5f7c52fa..0701dda7e9 100644 --- a/src/containers/Storage/StorageWrapper.tsx +++ b/src/containers/Storage/StorageWrapper.tsx @@ -2,8 +2,8 @@ import type {AdditionalNodesProps} from '../../types/additionalProps'; import {USE_BACKEND_PARAMS_FOR_TABLES_KEY} from '../../utils/constants'; import {useSetting} from '../../utils/hooks'; -import {VirtualStorage} from './VirtualStorage'; import {Storage} from './Storage'; +import {VirtualStorage} from './VirtualStorage'; interface StorageWrapperProps { tenant?: string; diff --git a/src/containers/Storage/UsageFilter/UsageFilter.tsx b/src/containers/Storage/UsageFilter/UsageFilter.tsx index d2db7e62cc..f9bd29bee3 100644 --- a/src/containers/Storage/UsageFilter/UsageFilter.tsx +++ b/src/containers/Storage/UsageFilter/UsageFilter.tsx @@ -1,13 +1,14 @@ -import {useEffect, useMemo, useRef, useState} from 'react'; -import cn from 'bem-cn-lite'; +import React from 'react'; -import {Select, SelectOption} from '@gravity-ui/uikit'; +import type {SelectOption} from '@gravity-ui/uikit'; +import {Select} from '@gravity-ui/uikit'; import {EntityStatus} from '../../../components/EntityStatus/EntityStatus'; - +import {cn} from '../../../utils/cn'; import {getUsageSeverityForEntityStatus} from '../utils'; import i18n from './i18n'; + import './UsageFilter.scss'; export interface UsageFilterItem { @@ -28,10 +29,10 @@ const b = cn('usage-filter'); export const UsageFilter = (props: UsageFilterProps) => { const {className, value = [], groups = [], onChange, debounce = 200} = props; - const [filterValue, setFilterValue] = useState(value); - const timer = useRef(); + const [filterValue, setFilterValue] = React.useState(value); + const timer = React.useRef(); - useEffect(() => { + React.useEffect(() => { // sync inner state with external value setFilterValue((prevValue) => { if (prevValue.join(',') !== value.join(',')) { @@ -42,7 +43,7 @@ export const UsageFilter = (props: UsageFilterProps) => { }); }, [value]); - const options = useMemo( + const options = React.useMemo( () => groups.map(({threshold, count}) => ({ value: String(threshold), diff --git a/src/containers/Storage/UsageFilter/i18n/index.ts b/src/containers/Storage/UsageFilter/i18n/index.ts index edb403e655..38b7f03577 100644 --- a/src/containers/Storage/UsageFilter/i18n/index.ts +++ b/src/containers/Storage/UsageFilter/i18n/index.ts @@ -1,11 +1,8 @@ -import {i18n, Lang} from '../../../../utils/i18n'; +import {registerKeysets} from '../../../../utils/i18n'; import en from './en.json'; import ru from './ru.json'; const COMPONENT = 'ydb-usage-filter'; -i18n.registerKeyset(Lang.En, COMPONENT, en); -i18n.registerKeyset(Lang.Ru, COMPONENT, ru); - -export default i18n.keyset(COMPONENT); +export default registerKeysets(COMPONENT, {ru, en}); diff --git a/src/containers/Storage/VirtualStorage.tsx b/src/containers/Storage/VirtualStorage.tsx index 0130cfe35d..2de5bb5c12 100644 --- a/src/containers/Storage/VirtualStorage.tsx +++ b/src/containers/Storage/VirtualStorage.tsx @@ -1,14 +1,14 @@ -import {useState} from 'react'; +import React from 'react'; -import type {AdditionalNodesProps} from '../../types/additionalProps'; -import type {RenderControls, RenderErrorMessage} from '../../components/VirtualTable'; -import type {StorageType, VisibleEntities} from '../../store/reducers/storage/types'; -import {STORAGE_TYPES, VISIBLE_ENTITIES} from '../../store/reducers/storage/constants'; -import {NodesUptimeFilterValues} from '../../utils/nodes'; import {AccessDenied} from '../../components/Errors/403/AccessDenied'; import {ResponseError} from '../../components/Errors/ResponseError/ResponseError'; +import type {RenderControls, RenderErrorMessage} from '../../components/VirtualTable'; import {selectNodesMap} from '../../store/reducers/nodesList'; +import {STORAGE_TYPES, VISIBLE_ENTITIES} from '../../store/reducers/storage/constants'; +import type {StorageType, VisibleEntities} from '../../store/reducers/storage/types'; +import type {AdditionalNodesProps} from '../../types/additionalProps'; import {useTypedSelector} from '../../utils/hooks'; +import {NodesUptimeFilterValues} from '../../utils/nodes'; import {StorageControls} from './StorageControls/StorageControls'; import {VirtualStorageGroups} from './StorageGroups/VirtualStorageGroups'; @@ -27,10 +27,12 @@ export const VirtualStorage = ({ parentContainer, additionalNodesProps, }: VirtualStorageProps) => { - const [searchValue, setSearchValue] = useState(''); - const [storageType, setStorageType] = useState(STORAGE_TYPES.groups); - const [visibleEntities, setVisibleEntities] = useState(VISIBLE_ENTITIES.all); - const [nodesUptimeFilter, setNodesUptimeFilter] = useState( + const [searchValue, setSearchValue] = React.useState(''); + const [storageType, setStorageType] = React.useState(STORAGE_TYPES.groups); + const [visibleEntities, setVisibleEntities] = React.useState( + VISIBLE_ENTITIES.all, + ); + const [nodesUptimeFilter, setNodesUptimeFilter] = React.useState( NodesUptimeFilterValues.All, ); diff --git a/src/containers/Storage/i18n/index.ts b/src/containers/Storage/i18n/index.ts index c1c06b62c3..c5605734c2 100644 --- a/src/containers/Storage/i18n/index.ts +++ b/src/containers/Storage/i18n/index.ts @@ -1,11 +1,8 @@ -import {i18n, Lang} from '../../../utils/i18n'; +import {registerKeysets} from '../../../utils/i18n'; import en from './en.json'; import ru from './ru.json'; const COMPONENT = 'ydb-storage'; -i18n.registerKeyset(Lang.En, COMPONENT, en); -i18n.registerKeyset(Lang.Ru, COMPONENT, ru); - -export default i18n.keyset(COMPONENT); +export default registerKeysets(COMPONENT, {ru, en}); diff --git a/src/containers/Storage/shared.ts b/src/containers/Storage/shared.ts index dee29330e1..be94080698 100644 --- a/src/containers/Storage/shared.ts +++ b/src/containers/Storage/shared.ts @@ -1,3 +1,3 @@ -import cn from 'bem-cn-lite'; +import {cn} from '../../utils/cn'; export const b = cn('global-storage'); diff --git a/src/containers/Tablet/Tablet.tsx b/src/containers/Tablet/Tablet.tsx index 7c4c99851a..ef67270518 100644 --- a/src/containers/Tablet/Tablet.tsx +++ b/src/containers/Tablet/Tablet.tsx @@ -1,29 +1,27 @@ -import {useCallback, useEffect, useRef} from 'react'; -import {useLocation, useParams} from 'react-router'; -import cn from 'bem-cn-lite'; +import React from 'react'; + import {Link as ExternalLink} from '@gravity-ui/uikit'; import {Helmet} from 'react-helmet-async'; +import {useLocation, useParams} from 'react-router'; -import {backend} from '../../store'; -import {getTablet, getTabletDescribe, clearTabletData} from '../../store/reducers/tablet'; -import {setHeaderBreadcrumbs} from '../../store/reducers/header/header'; - -import {useAutofetcher, useTypedSelector, useTypedDispatch} from '../../utils/hooks'; -import {CLUSTER_DEFAULT_TITLE, DEVELOPER_UI_TITLE} from '../../utils/constants'; -import {parseQuery} from '../../routes'; - -import type {EType} from '../../types/api/tablet'; +import {EmptyState} from '../../components/EmptyState'; import {EntityStatus} from '../../components/EntityStatus/EntityStatus'; import {ResponseError} from '../../components/Errors/ResponseError'; -import {Tag} from '../../components/Tag'; import {Icon} from '../../components/Icon'; -import {EmptyState} from '../../components/EmptyState'; import {Loader} from '../../components/Loader'; +import {Tag} from '../../components/Tag'; +import {parseQuery} from '../../routes'; +import {backend} from '../../store'; +import {setHeaderBreadcrumbs} from '../../store/reducers/header/header'; +import {clearTabletData, getTablet, getTabletDescribe} from '../../store/reducers/tablet'; +import type {EType} from '../../types/api/tablet'; +import {cn} from '../../utils/cn'; +import {CLUSTER_DEFAULT_TITLE, DEVELOPER_UI_TITLE} from '../../utils/constants'; +import {useAutofetcher, useTypedDispatch, useTypedSelector} from '../../utils/hooks'; -import {TabletTable} from './TabletTable'; -import {TabletInfo} from './TabletInfo'; import {TabletControls} from './TabletControls'; - +import {TabletInfo} from './TabletInfo'; +import {TabletTable} from './TabletTable'; import i18n from './i18n'; import './Tablet.scss'; @@ -31,7 +29,7 @@ import './Tablet.scss'; export const b = cn('tablet-page'); export const Tablet = () => { - const isFirstDataFetchRef = useRef(true); + const isFirstDataFetchRef = React.useRef(true); const dispatch = useTypedDispatch(); const location = useLocation(); @@ -59,26 +57,26 @@ export const Tablet = () => { const type = tablet.Type || (queryTabletType?.toString() as EType | undefined); // NOTE: should be reviewed when migrating to React 18 - useEffect(() => { + React.useEffect(() => { return () => { dispatch(clearTabletData()); }; }, [dispatch]); - useEffect(() => { + React.useEffect(() => { if (isFirstDataFetchRef.current && tablet && tablet.TenantId) { dispatch(getTabletDescribe(tablet.TenantId)); isFirstDataFetchRef.current = false; } }, [dispatch, tablet]); - const fetchData = useCallback(() => { + const fetchData = React.useCallback(() => { return dispatch(getTablet(id)); }, [dispatch, id]); useAutofetcher(fetchData, [fetchData], true); - useEffect(() => { + React.useEffect(() => { dispatch( setHeaderBreadcrumbs('tablet', { nodeIds: nodeId ? [nodeId] : [], @@ -155,13 +153,13 @@ export const Tablet = () => { ); }; return ( - <> + {`${id} — ${i18n('tablet.header')} — ${ tenantName || queryClusterName || CLUSTER_DEFAULT_TITLE }`} {renderView()} - + ); }; diff --git a/src/containers/Tablet/TabletControls/TabletControls.tsx b/src/containers/Tablet/TabletControls/TabletControls.tsx index a82a777178..c9f7a9b514 100644 --- a/src/containers/Tablet/TabletControls/TabletControls.tsx +++ b/src/containers/Tablet/TabletControls/TabletControls.tsx @@ -1,9 +1,11 @@ -import {ETabletState, type TTabletStateInfo} from '../../../types/api/tablet'; -import type {ITabletHandledResponse} from '../../../types/store/tablet'; -import {ButtonWithConfirmDialog} from '../../../components/ButtonWithConfirmDialog/ButtonWithConfirmDialog'; +import React from 'react'; -import i18n from '../i18n'; +import {ButtonWithConfirmDialog} from '../../../components/ButtonWithConfirmDialog/ButtonWithConfirmDialog'; +import {ETabletState} from '../../../types/api/tablet'; +import type {TTabletStateInfo} from '../../../types/api/tablet'; +import type {ITabletHandledResponse} from '../../../types/store/tablet'; import {b} from '../Tablet'; +import i18n from '../i18n'; interface TabletControlsProps { tablet: TTabletStateInfo; @@ -47,7 +49,7 @@ export const TabletControls = ({tablet, fetchData}: TabletControlsProps) => { {i18n('controls.kill')} {hasHiveId() ? ( - <> + { > {i18n('controls.resume')} - + ) : null}
); diff --git a/src/containers/Tablet/TabletInfo/TabletInfo.tsx b/src/containers/Tablet/TabletInfo/TabletInfo.tsx index 8fd2f264eb..9577cf95e3 100644 --- a/src/containers/Tablet/TabletInfo/TabletInfo.tsx +++ b/src/containers/Tablet/TabletInfo/TabletInfo.tsx @@ -1,13 +1,13 @@ -import {Link} from 'react-router-dom'; - import {Link as UIKitLink} from '@gravity-ui/uikit'; +import {Link} from 'react-router-dom'; -import {ETabletState, TTabletStateInfo} from '../../../types/api/tablet'; -import {InfoViewer, InfoViewerItem} from '../../../components/InfoViewer'; +import type {InfoViewerItem} from '../../../components/InfoViewer'; +import {InfoViewer} from '../../../components/InfoViewer'; import routes, {createHref} from '../../../routes'; +import {ETabletState} from '../../../types/api/tablet'; +import type {TTabletStateInfo} from '../../../types/api/tablet'; import {calcUptime} from '../../../utils/dataFormatters/dataFormatters'; import {getDefaultNodePath} from '../../Node/NodePages'; - import {b} from '../Tablet'; interface TabletInfoProps { diff --git a/src/containers/Tablet/TabletTable/TabletTable.tsx b/src/containers/Tablet/TabletTable/TabletTable.tsx index 5f64e3e278..91d8cd8cea 100644 --- a/src/containers/Tablet/TabletTable/TabletTable.tsx +++ b/src/containers/Tablet/TabletTable/TabletTable.tsx @@ -1,12 +1,11 @@ -import DataTable, {Column} from '@gravity-ui/react-data-table'; +import type {Column} from '@gravity-ui/react-data-table'; +import DataTable from '@gravity-ui/react-data-table'; import {EntityStatus} from '../../../components/EntityStatus/EntityStatus'; import {InternalLink} from '../../../components/InternalLink/InternalLink'; - import type {ITabletPreparedHistoryItem} from '../../../types/store/tablet'; import {calcUptime} from '../../../utils/dataFormatters/dataFormatters'; import {getDefaultNodePath} from '../../Node/NodePages'; - import {b} from '../Tablet'; const columns: Column[] = [ diff --git a/src/containers/Tablets/Tablets.scss b/src/containers/Tablets/Tablets.scss index 6f6aa61c11..9ef4c0786d 100644 --- a/src/containers/Tablets/Tablets.scss +++ b/src/containers/Tablets/Tablets.scss @@ -5,9 +5,8 @@ &__header { display: flex; - gap: 12px; - align-items: center; + gap: 12px; margin-bottom: 16px; } diff --git a/src/containers/Tablets/Tablets.tsx b/src/containers/Tablets/Tablets.tsx index e188adc4f0..e41307035d 100644 --- a/src/containers/Tablets/Tablets.tsx +++ b/src/containers/Tablets/Tablets.tsx @@ -1,27 +1,25 @@ -import {useCallback, useEffect, useMemo, useState} from 'react'; -import cn from 'bem-cn-lite'; -import ReactList from 'react-list'; +import React from 'react'; import {Select} from '@gravity-ui/uikit'; +import ReactList from 'react-list'; +import {Loader} from '../../components/Loader'; import {Tablet} from '../../components/Tablet'; import TabletsOverall from '../../components/TabletsOverall/TabletsOverall'; -import {Loader} from '../../components/Loader'; - -import {useAutofetcher, useTypedSelector, useTypedDispatch} from '../../utils/hooks'; -import {ETabletState, EType, TTabletStateInfo} from '../../types/api/tablet'; - import { - getTabletsInfo, clearWasLoadingFlag, + getTabletsInfo, setStateFilter, setTypeFilter, } from '../../store/reducers/tablets'; - -import './Tablets.scss'; +import type {ETabletState, EType, TTabletStateInfo} from '../../types/api/tablet'; +import {cn} from '../../utils/cn'; +import {useAutofetcher, useTypedDispatch, useTypedSelector} from '../../utils/hooks'; import i18n from './i18n'; +import './Tablets.scss'; + const b = cn('tablets'); interface TabletsProps { @@ -38,10 +36,10 @@ export const Tablets = ({path, nodeId, className}: TabletsProps) => { ); const {autorefresh} = useTypedSelector((state) => state.schema); - const tablets = useMemo(() => data?.TabletStateInfo || [], [data]); + const tablets = React.useMemo(() => data?.TabletStateInfo || [], [data]); - const fetchData = useCallback( - (isBackground) => { + const fetchData = React.useCallback( + (isBackground: boolean) => { if (!isBackground) { dispatch(clearWasLoadingFlag()); } @@ -56,9 +54,9 @@ export const Tablets = ({path, nodeId, className}: TabletsProps) => { useAutofetcher(fetchData, [fetchData], autorefresh); - const [tabletsToRender, setTabletsToRender] = useState([]); + const [tabletsToRender, setTabletsToRender] = React.useState([]); - useEffect(() => { + React.useEffect(() => { let filteredTablets = tablets; if (typeFilter.length > 0) { diff --git a/src/containers/Tablets/i18n/index.ts b/src/containers/Tablets/i18n/index.ts index 8fa6ea8ee7..4fbb01e210 100644 --- a/src/containers/Tablets/i18n/index.ts +++ b/src/containers/Tablets/i18n/index.ts @@ -1,11 +1,8 @@ -import {i18n, Lang} from '../../../utils/i18n'; +import {registerKeysets} from '../../../utils/i18n'; import en from './en.json'; import ru from './ru.json'; const COMPONENT = 'ydb-tablets'; -i18n.registerKeyset(Lang.En, COMPONENT, en); -i18n.registerKeyset(Lang.Ru, COMPONENT, ru); - -export default i18n.keyset(COMPONENT); +export default registerKeysets(COMPONENT, {ru, en}); diff --git a/src/containers/TabletsFilters/TabletsFilters.js b/src/containers/TabletsFilters/TabletsFilters.js index 44c7d83b99..57ce1a94f9 100644 --- a/src/containers/TabletsFilters/TabletsFilters.js +++ b/src/containers/TabletsFilters/TabletsFilters.js @@ -1,29 +1,29 @@ import React from 'react'; -import PropTypes from 'prop-types'; -import {connect} from 'react-redux'; -import cn from 'bem-cn-lite'; -import map from 'lodash/map'; -import isEqual from 'lodash/isEqual'; -import {Helmet} from 'react-helmet-async'; import {Loader, Select} from '@gravity-ui/uikit'; +import isEqual from 'lodash/isEqual'; +import map from 'lodash/map'; +import PropTypes from 'prop-types'; +import {Helmet} from 'react-helmet-async'; import ReactList from 'react-list'; +import {connect} from 'react-redux'; -import {Tablet} from '../../components/Tablet'; import {AccessDenied} from '../../components/Errors/403'; - +import {Tablet} from '../../components/Tablet'; +import {parseQuery} from '../../routes'; import {setHeaderBreadcrumbs} from '../../store/reducers/header/header'; -import {tabletColorToTabletState, tabletStates} from '../../utils/tablet'; import { - getTabletsInfo, clearWasLoadingFlag, - setStateFilter, - setTypeFilter, getFilteredTablets, getTablets, + getTabletsInfo, + setStateFilter, + setTypeFilter, } from '../../store/reducers/tabletsFilters'; -import {parseQuery} from '../../routes'; +import {cn} from '../../utils/cn'; import {CLUSTER_DEFAULT_TITLE} from '../../utils/constants'; +import {tabletColorToTabletState, tabletStates} from '../../utils/tablet'; + import i18n from './i18n'; import './TabletsFilters.scss'; @@ -185,9 +185,9 @@ export class TabletsFilters extends React.Component {
{tenantPath ? (
- <> + Database: {tenantPath} - +
) : null} + {`${i18n('page.title')} — ${ tenantPath || clusterName || CLUSTER_DEFAULT_TITLE }`} {this.renderView()} - + ); } } diff --git a/src/containers/Tenant/Acl/Acl.tsx b/src/containers/Tenant/Acl/Acl.tsx index da4e7b62e3..3dafd055a1 100644 --- a/src/containers/Tenant/Acl/Acl.tsx +++ b/src/containers/Tenant/Acl/Acl.tsx @@ -1,18 +1,18 @@ -import {useEffect} from 'react'; -import cn from 'bem-cn-lite'; +import React from 'react'; -import DataTable, {Column} from '@gravity-ui/react-data-table'; - -import type {TACE} from '../../../types/api/acl'; -import {DEFAULT_TABLE_SETTINGS} from '../../../utils/constants'; -import {useTypedSelector, useTypedDispatch} from '../../../utils/hooks'; -import {getSchemaAcl, setAclWasNotLoaded} from '../../../store/reducers/schemaAcl/schemaAcl'; +import type {Column} from '@gravity-ui/react-data-table'; +import DataTable from '@gravity-ui/react-data-table'; import {ResponseError} from '../../../components/Errors/ResponseError'; import {Loader} from '../../../components/Loader'; +import {getSchemaAcl, setAclWasNotLoaded} from '../../../store/reducers/schemaAcl/schemaAcl'; +import type {TACE} from '../../../types/api/acl'; +import {cn} from '../../../utils/cn'; +import {DEFAULT_TABLE_SETTINGS} from '../../../utils/constants'; +import {useTypedDispatch, useTypedSelector} from '../../../utils/hooks'; +import i18n from '../i18n'; import './Acl.scss'; -import i18n from '../i18n'; const b = cn('ydb-acl'); @@ -74,7 +74,7 @@ export const Acl = () => { const {currentSchemaPath} = useTypedSelector((state) => state.schema); const {loading, error, acl, owner, wasLoaded} = useTypedSelector((state) => state.schemaAcl); - useEffect(() => { + React.useEffect(() => { if (currentSchemaPath) { dispatch(getSchemaAcl({path: currentSchemaPath})); } diff --git a/src/containers/Tenant/Diagnostics/Consumers/Consumers.tsx b/src/containers/Tenant/Diagnostics/Consumers/Consumers.tsx index 69c28297a1..b9d6eca593 100644 --- a/src/containers/Tenant/Diagnostics/Consumers/Consumers.tsx +++ b/src/containers/Tenant/Diagnostics/Consumers/Consumers.tsx @@ -1,35 +1,30 @@ -import {useCallback, useMemo, useState} from 'react'; -import block from 'bem-cn-lite'; -import escapeRegExp from 'lodash/escapeRegExp'; +import React from 'react'; import DataTable from '@gravity-ui/react-data-table'; +import escapeRegExp from 'lodash/escapeRegExp'; -import type {EPathType} from '../../../../types/api/schema'; - +import {ResponseError} from '../../../../components/Errors/ResponseError'; import {Loader} from '../../../../components/Loader'; import {Search} from '../../../../components/Search'; -import {ResponseError} from '../../../../components/Errors/ResponseError'; - -import {useAutofetcher, useTypedSelector, useTypedDispatch} from '../../../../utils/hooks'; -import {DEFAULT_TABLE_SETTINGS} from '../../../../utils/constants'; - import { + getTopic, selectPreparedConsumersData, selectPreparedTopicStats, - getTopic, setDataWasNotLoaded, } from '../../../../store/reducers/topic'; - +import type {EPathType} from '../../../../types/api/schema'; +import {cn} from '../../../../utils/cn'; +import {DEFAULT_TABLE_SETTINGS} from '../../../../utils/constants'; +import {useAutofetcher, useTypedDispatch, useTypedSelector} from '../../../../utils/hooks'; import {isCdcStreamEntityType} from '../../utils/schema'; import {ConsumersTopicStats} from './TopicStats'; import {columns} from './columns'; - import i18n from './i18n'; import './Consumers.scss'; -const b = block('ydb-diagnostics-consumers'); +const b = cn('ydb-diagnostics-consumers'); interface ConsumersProps { path: string; @@ -41,7 +36,7 @@ export const Consumers = ({path, type}: ConsumersProps) => { const dispatch = useTypedDispatch(); - const [searchValue, setSearchValue] = useState(''); + const [searchValue, setSearchValue] = React.useState(''); const {autorefresh} = useTypedSelector((state) => state.schema); const {loading, wasLoaded, error} = useTypedSelector((state) => state.topic); @@ -49,8 +44,8 @@ export const Consumers = ({path, type}: ConsumersProps) => { const consumers = useTypedSelector((state) => selectPreparedConsumersData(state)); const topic = useTypedSelector((state) => selectPreparedTopicStats(state)); - const fetchData = useCallback( - (isBackground) => { + const fetchData = React.useCallback( + (isBackground: boolean) => { if (!isBackground) { dispatch(setDataWasNotLoaded); } @@ -62,7 +57,7 @@ export const Consumers = ({path, type}: ConsumersProps) => { useAutofetcher(fetchData, [fetchData], autorefresh); - const dataToRender = useMemo(() => { + const dataToRender = React.useMemo(() => { if (!consumers) { return []; } diff --git a/src/containers/Tenant/Diagnostics/Consumers/Headers/Headers.tsx b/src/containers/Tenant/Diagnostics/Consumers/Headers/Headers.tsx index a52b6f66b0..9fdcb1362e 100644 --- a/src/containers/Tenant/Diagnostics/Consumers/Headers/Headers.tsx +++ b/src/containers/Tenant/Diagnostics/Consumers/Headers/Headers.tsx @@ -1,15 +1,12 @@ -import block from 'bem-cn-lite'; - import {LabelWithPopover} from '../../../../../components/LabelWithPopover'; import {LagPopoverContent} from '../../../../../components/LagPopoverContent'; - -import {CONSUMERS_COLUMNS_IDS, CONSUMERS_COLUMNS_TITILES} from '../utils/constants'; - +import {cn} from '../../../../../utils/cn'; import i18n from '../i18n'; +import {CONSUMERS_COLUMNS_IDS, CONSUMERS_COLUMNS_TITILES} from '../utils/constants'; import './Headers.scss'; -const b = block('ydb-diagnostics-consumers-columns-header'); +const b = cn('ydb-diagnostics-consumers-columns-header'); export const ReadLagsHeader = () => ( [] = [ { diff --git a/src/containers/Tenant/Diagnostics/Consumers/i18n/index.ts b/src/containers/Tenant/Diagnostics/Consumers/i18n/index.ts index eae471d108..5495a1e6c7 100644 --- a/src/containers/Tenant/Diagnostics/Consumers/i18n/index.ts +++ b/src/containers/Tenant/Diagnostics/Consumers/i18n/index.ts @@ -1,11 +1,8 @@ -import {i18n, Lang} from '../../../../../utils/i18n'; +import {registerKeysets} from '../../../../../utils/i18n'; import en from './en.json'; import ru from './ru.json'; const COMPONENT = 'ydb-diagnostics-consumers'; -i18n.registerKeyset(Lang.En, COMPONENT, en); -i18n.registerKeyset(Lang.Ru, COMPONENT, ru); - -export default i18n.keyset(COMPONENT); +export default registerKeysets(COMPONENT, {ru, en}); diff --git a/src/containers/Tenant/Diagnostics/Describe/Describe.tsx b/src/containers/Tenant/Diagnostics/Describe/Describe.tsx index 08b34ab4d0..cc55b51ec3 100644 --- a/src/containers/Tenant/Diagnostics/Describe/Describe.tsx +++ b/src/containers/Tenant/Diagnostics/Describe/Describe.tsx @@ -1,25 +1,24 @@ -import {useCallback, useEffect, useState} from 'react'; -import {shallowEqual} from 'react-redux'; -import cn from 'bem-cn-lite'; +import React from 'react'; + import JSONTree from 'react-json-inspector'; -import 'react-json-inspector/json-inspector.css'; +import {shallowEqual} from 'react-redux'; -import {Loader} from '../../../../components/Loader'; import {ResponseError} from '../../../../components/Errors/ResponseError'; - -import {useAutofetcher, useTypedSelector, useTypedDispatch} from '../../../../utils/hooks'; +import {Loader} from '../../../../components/Loader'; import { getDescribe, - setDataWasNotLoaded, - setCurrentDescribePath, getDescribeBatched, + setCurrentDescribePath, + setDataWasNotLoaded, } from '../../../../store/reducers/describe'; import {selectSchemaMergedChildrenPaths} from '../../../../store/reducers/schema/schema'; import type {EPathType} from '../../../../types/api/schema'; - +import {cn} from '../../../../utils/cn'; +import {useAutofetcher, useTypedDispatch, useTypedSelector} from '../../../../utils/hooks'; import {isEntityWithMergedImplementation} from '../../utils/schema'; import './Describe.scss'; +import 'react-json-inspector/json-inspector.css'; const b = cn('kv-describe'); @@ -37,9 +36,9 @@ const Describe = ({tenant, type}: IDescribeProps) => { (state) => state.describe, ); - const [preparedDescribeData, setPreparedDescribeData] = useState(); + const [preparedDescribeData, setPreparedDescribeData] = React.useState(); - useEffect(() => { + React.useEffect(() => { if (currentDescribe) { const paths = Object.keys(currentDescribe); @@ -60,7 +59,7 @@ const Describe = ({tenant, type}: IDescribeProps) => { shallowEqual, ); - const fetchData = useCallback( + const fetchData = React.useCallback( (isBackground: boolean) => { if (!isBackground) { dispatch(setDataWasNotLoaded()); diff --git a/src/containers/Tenant/Diagnostics/DetailedOverview/DetailedOverview.scss b/src/containers/Tenant/Diagnostics/DetailedOverview/DetailedOverview.scss index 95fb02e8d8..c76c1ee5a9 100644 --- a/src/containers/Tenant/Diagnostics/DetailedOverview/DetailedOverview.scss +++ b/src/containers/Tenant/Diagnostics/DetailedOverview/DetailedOverview.scss @@ -1,9 +1,9 @@ .kv-detailed-overview { display: flex; + gap: 20px; width: 100%; height: 100%; - gap: 20px; &__section { display: flex; diff --git a/src/containers/Tenant/Diagnostics/DetailedOverview/DetailedOverview.tsx b/src/containers/Tenant/Diagnostics/DetailedOverview/DetailedOverview.tsx index df4ff92e4f..17f19a70e2 100644 --- a/src/containers/Tenant/Diagnostics/DetailedOverview/DetailedOverview.tsx +++ b/src/containers/Tenant/Diagnostics/DetailedOverview/DetailedOverview.tsx @@ -1,8 +1,8 @@ import {useSelector} from 'react-redux'; -import cn from 'bem-cn-lite'; -import type {EPathType} from '../../../../types/api/schema'; import type {AdditionalNodesProps, AdditionalTenantsProps} from '../../../../types/additionalProps'; +import type {EPathType} from '../../../../types/api/schema'; +import {cn} from '../../../../utils/cn'; import Overview from '../Overview/Overview'; import {TenantOverview} from '../TenantOverview/TenantOverview'; diff --git a/src/containers/Tenant/Diagnostics/Diagnostics.tsx b/src/containers/Tenant/Diagnostics/Diagnostics.tsx index f2f86c7b9e..d2ba24f0ef 100644 --- a/src/containers/Tenant/Diagnostics/Diagnostics.tsx +++ b/src/containers/Tenant/Diagnostics/Diagnostics.tsx @@ -1,42 +1,37 @@ -import {useMemo, useRef} from 'react'; -import qs from 'qs'; -import cn from 'bem-cn-lite'; -import {Link} from 'react-router-dom'; -import {useLocation} from 'react-router'; -import {Helmet} from 'react-helmet-async'; +import React from 'react'; import {Switch, Tabs} from '@gravity-ui/uikit'; +import qs from 'qs'; +import {Helmet} from 'react-helmet-async'; +import {useLocation} from 'react-router'; +import {Link} from 'react-router-dom'; -import type {EPathType} from '../../../types/api/schema'; -import type {AdditionalTenantsProps, AdditionalNodesProps} from '../../../types/additionalProps'; - -import {useTypedSelector, useTypedDispatch} from '../../../utils/hooks'; +import {Loader} from '../../../components/Loader'; import routes, {createHref} from '../../../routes'; -import type {TenantDiagnosticsTab} from '../../../store/reducers/tenant/types'; -import {enableAutorefresh, disableAutorefresh} from '../../../store/reducers/schema/schema'; -import {setDiagnosticsTab} from '../../../store/reducers/tenant/tenant'; +import {disableAutorefresh, enableAutorefresh} from '../../../store/reducers/schema/schema'; import {TENANT_DIAGNOSTICS_TABS_IDS} from '../../../store/reducers/tenant/constants'; - -import {Loader} from '../../../components/Loader'; - +import {setDiagnosticsTab} from '../../../store/reducers/tenant/tenant'; +import type {TenantDiagnosticsTab} from '../../../store/reducers/tenant/types'; +import type {AdditionalNodesProps, AdditionalTenantsProps} from '../../../types/additionalProps'; +import type {EPathType} from '../../../types/api/schema'; +import {cn} from '../../../utils/cn'; +import {useTypedDispatch, useTypedSelector} from '../../../utils/hooks'; import {Heatmap} from '../../Heatmap'; import {NodesWrapper} from '../../Nodes/NodesWrapper'; import {StorageWrapper} from '../../Storage/StorageWrapper'; import {Tablets} from '../../Tablets'; +import {TenantTabsGroups} from '../TenantPages'; +import {isDatabaseEntityType} from '../utils/schema'; +import {Consumers} from './Consumers'; import Describe from './Describe/Describe'; +import DetailedOverview from './DetailedOverview/DetailedOverview'; +import {DATABASE_PAGES, getPagesByType} from './DiagnosticsPages'; import {HotKeys} from './HotKeys/HotKeys'; import Network from './Network/Network'; import {Partitions} from './Partitions/Partitions'; -import {Consumers} from './Consumers'; import {TopQueries} from './TopQueries'; import {TopShards} from './TopShards'; -import DetailedOverview from './DetailedOverview/DetailedOverview'; - -import {isDatabaseEntityType} from '../utils/schema'; - -import {TenantTabsGroups} from '../TenantPages'; -import {DATABASE_PAGES, getPagesByType} from './DiagnosticsPages'; import './Diagnostics.scss'; @@ -49,7 +44,7 @@ interface DiagnosticsProps { const b = cn('kv-tenant-diagnostics'); function Diagnostics(props: DiagnosticsProps) { - const container = useRef(null); + const container = React.useRef(null); const dispatch = useTypedDispatch(); const {currentSchemaPath, autorefresh, wasLoaded} = useTypedSelector((state) => state.schema); @@ -67,7 +62,7 @@ function Diagnostics(props: DiagnosticsProps) { const tenantName = isDatabaseEntityType(props.type) ? currentSchemaPath : rootTenantName; const isDatabase = isDatabaseEntityType(props.type) || currentSchemaPath === rootTenantName; - const pages = useMemo(() => { + const pages = React.useMemo(() => { if (isDatabase) { return DATABASE_PAGES; } @@ -78,7 +73,7 @@ function Diagnostics(props: DiagnosticsProps) { const forwardToDiagnosticTab = (tab: TenantDiagnosticsTab) => { dispatch(setDiagnosticsTab(tab)); }; - const activeTab = useMemo(() => { + const activeTab = React.useMemo(() => { if (wasLoaded) { let page = pages.find((el) => el.id === diagnosticsTab); if (!page) { diff --git a/src/containers/Tenant/Diagnostics/DiagnosticsPages.ts b/src/containers/Tenant/Diagnostics/DiagnosticsPages.ts index 649811446f..8316c6780b 100644 --- a/src/containers/Tenant/Diagnostics/DiagnosticsPages.ts +++ b/src/containers/Tenant/Diagnostics/DiagnosticsPages.ts @@ -1,5 +1,5 @@ -import type {TenantDiagnosticsTab} from '../../../store/reducers/tenant/types'; import {TENANT_DIAGNOSTICS_TABS_IDS} from '../../../store/reducers/tenant/constants'; +import type {TenantDiagnosticsTab} from '../../../store/reducers/tenant/types'; import {EPathType} from '../../../types/api/schema'; type Page = { diff --git a/src/containers/Tenant/Diagnostics/HotKeys/HotKeys.scss b/src/containers/Tenant/Diagnostics/HotKeys/HotKeys.scss index 6225c426a7..1aac9acd9a 100644 --- a/src/containers/Tenant/Diagnostics/HotKeys/HotKeys.scss +++ b/src/containers/Tenant/Diagnostics/HotKeys/HotKeys.scss @@ -11,8 +11,7 @@ &__primary-key-column { display: flex; - gap: 5px; - align-items: center; + gap: 5px; } } diff --git a/src/containers/Tenant/Diagnostics/HotKeys/HotKeys.tsx b/src/containers/Tenant/Diagnostics/HotKeys/HotKeys.tsx index 81192f6087..f9aaf57f77 100644 --- a/src/containers/Tenant/Diagnostics/HotKeys/HotKeys.tsx +++ b/src/containers/Tenant/Diagnostics/HotKeys/HotKeys.tsx @@ -1,23 +1,26 @@ -import {useEffect, useMemo, useRef} from 'react'; -import DataTable, {type Column} from '@gravity-ui/react-data-table'; +import React from 'react'; + +import DataTable from '@gravity-ui/react-data-table'; +import type {Column} from '@gravity-ui/react-data-table'; -import type {HotKey} from '../../../../types/api/hotkeys'; -import type {IResponseError} from '../../../../types/api/error'; -import {Icon} from '../../../../components/Icon'; import {ResponseError} from '../../../../components/Errors/ResponseError'; -import {useTypedSelector, useTypedDispatch} from '../../../../utils/hooks'; -import {cn} from '../../../../utils/cn'; -import {DEFAULT_TABLE_SETTINGS} from '../../../../utils/constants'; +import {Icon} from '../../../../components/Icon'; import { setHotKeysData, setHotKeysDataWasNotLoaded, setHotKeysError, setHotKeysLoading, } from '../../../../store/reducers/hotKeys/hotKeys'; +import type {IResponseError} from '../../../../types/api/error'; +import type {HotKey} from '../../../../types/api/hotkeys'; +import {cn} from '../../../../utils/cn'; +import {DEFAULT_TABLE_SETTINGS} from '../../../../utils/constants'; +import {useTypedDispatch, useTypedSelector} from '../../../../utils/hooks'; -import './HotKeys.scss'; import i18n from './i18n'; +import './HotKeys.scss'; + const b = cn('ydb-hot-keys'); const tableColumnsIds = { @@ -58,18 +61,18 @@ interface HotKeysProps { export function HotKeys({path}: HotKeysProps) { const dispatch = useTypedDispatch(); - const collectSamplesTimerRef = useRef>(); + const collectSamplesTimerRef = React.useRef>(); const {loading, wasLoaded, data, error} = useTypedSelector((state) => state.hotKeys); const {loading: schemaLoading, data: schemaData} = useTypedSelector((state) => state.schema); const keyColumnsIds = schemaData[path]?.PathDescription?.Table?.KeyColumnNames; - const tableColumns = useMemo(() => { + const tableColumns = React.useMemo(() => { return getHotKeysColumns(keyColumnsIds); }, [keyColumnsIds]); - useEffect(() => { + React.useEffect(() => { const fetchHotkeys = async (enableSampling: boolean) => { // Set hotkeys error, but not data, since data is set conditionally try { diff --git a/src/containers/Tenant/Diagnostics/HotKeys/i18n/index.ts b/src/containers/Tenant/Diagnostics/HotKeys/i18n/index.ts index 80c7c4d561..4669aa45e0 100644 --- a/src/containers/Tenant/Diagnostics/HotKeys/i18n/index.ts +++ b/src/containers/Tenant/Diagnostics/HotKeys/i18n/index.ts @@ -1,9 +1,7 @@ -import {i18n, Lang} from '../../../../../utils/i18n'; +import {registerKeysets} from '../../../../../utils/i18n'; import en from './en.json'; const COMPONENT = 'ydb-hot-keys'; -i18n.registerKeyset(Lang.En, COMPONENT, en); - -export default i18n.keyset(COMPONENT); +export default registerKeysets(COMPONENT, {en}); diff --git a/src/containers/Tenant/Diagnostics/Network/Network.js b/src/containers/Tenant/Diagnostics/Network/Network.js index 112c2b6e5c..fd5b2bd27f 100644 --- a/src/containers/Tenant/Diagnostics/Network/Network.js +++ b/src/containers/Tenant/Diagnostics/Network/Network.js @@ -1,23 +1,22 @@ import React from 'react'; -import cn from 'bem-cn-lite'; + +import {Checkbox, Loader} from '@gravity-ui/uikit'; +import reduce from 'lodash/reduce'; import PropTypes from 'prop-types'; import {connect} from 'react-redux'; -import reduce from 'lodash/reduce'; - import {Link} from 'react-router-dom'; -import {Loader, Checkbox} from '@gravity-ui/uikit'; -import NodeNetwork from './NodeNetwork/NodeNetwork'; import {Icon} from '../../../../components/Icon'; -import {ProblemFilter} from '../../../../components/ProblemFilter'; import {Illustration} from '../../../../components/Illustration'; - +import {ProblemFilter} from '../../../../components/ProblemFilter'; import {getNetworkInfo, setDataWasNotLoaded} from '../../../../store/reducers/network/network'; +import {ProblemFilterValues, changeFilter} from '../../../../store/reducers/settings/settings'; import {hideTooltip, showTooltip} from '../../../../store/reducers/tooltip'; -import {changeFilter, ProblemFilterValues} from '../../../../store/reducers/settings/settings'; import {AutoFetcher} from '../../../../utils/autofetcher'; +import {cn} from '../../../../utils/cn'; import {getDefaultNodePath} from '../../../Node/NodePages'; +import NodeNetwork from './NodeNetwork/NodeNetwork'; import {getConnectedNodesCount} from './utils'; import './Network.scss'; diff --git a/src/containers/Tenant/Diagnostics/Network/NodeNetwork/NodeNetwork.js b/src/containers/Tenant/Diagnostics/Network/NodeNetwork/NodeNetwork.js index bd2114fedc..5cfa07a961 100644 --- a/src/containers/Tenant/Diagnostics/Network/NodeNetwork/NodeNetwork.js +++ b/src/containers/Tenant/Diagnostics/Network/NodeNetwork/NodeNetwork.js @@ -1,8 +1,9 @@ import React from 'react'; -import cn from 'bem-cn-lite'; + import PropTypes from 'prop-types'; import {EFlag} from '../../../../../types/api/enums'; +import {cn} from '../../../../../utils/cn'; import './NodeNetwork.scss'; diff --git a/src/containers/Tenant/Diagnostics/Overview/ChangefeedInfo/ChangefeedInfo.tsx b/src/containers/Tenant/Diagnostics/Overview/ChangefeedInfo/ChangefeedInfo.tsx index 8b3763005c..761de47647 100644 --- a/src/containers/Tenant/Diagnostics/Overview/ChangefeedInfo/ChangefeedInfo.tsx +++ b/src/containers/Tenant/Diagnostics/Overview/ChangefeedInfo/ChangefeedInfo.tsx @@ -1,17 +1,13 @@ -import type {TEvDescribeSchemeResult} from '../../../../../types/api/schema'; - -import {formatObject, InfoViewer, InfoViewerItem} from '../../../../../components/InfoViewer'; +import type {InfoViewerItem} from '../../../../../components/InfoViewer'; +import {InfoViewer, formatObject} from '../../../../../components/InfoViewer'; import { formatCdcStreamItem, formatCommonItem, } from '../../../../../components/InfoViewer/formatters'; - +import type {TEvDescribeSchemeResult} from '../../../../../types/api/schema'; import {useTypedSelector} from '../../../../../utils/hooks'; - import {getEntityName} from '../../../utils'; - import {TopicStats} from '../TopicStats'; - import {prepareTopicSchemaInfo} from '../utils'; const prepareChangefeedInfo = ( diff --git a/src/containers/Tenant/Diagnostics/Overview/Overview.tsx b/src/containers/Tenant/Diagnostics/Overview/Overview.tsx index 6f6bc56c54..b8a8aabbd2 100644 --- a/src/containers/Tenant/Diagnostics/Overview/Overview.tsx +++ b/src/containers/Tenant/Diagnostics/Overview/Overview.tsx @@ -1,14 +1,10 @@ -import {ReactNode, useCallback} from 'react'; +import React from 'react'; + import {shallowEqual} from 'react-redux'; -import {Loader} from '../../../../components/Loader'; -import {TableIndexInfo} from '../../../../components/InfoViewer/schemaInfo'; import {ResponseError} from '../../../../components/Errors/ResponseError'; - -import {EPathType} from '../../../../types/api/schema'; -import {useAutofetcher, useTypedSelector, useTypedDispatch} from '../../../../utils/hooks'; -import {selectSchemaMergedChildrenPaths} from '../../../../store/reducers/schema/schema'; -import {getTopic} from '../../../../store/reducers/topic'; +import {TableIndexInfo} from '../../../../components/InfoViewer/schemaInfo'; +import {Loader} from '../../../../components/Loader'; import { getOlapStats, resetLoadingState as resetOlapLoadingState, @@ -19,20 +15,22 @@ import { setCurrentOverviewPath, setDataWasNotLoaded, } from '../../../../store/reducers/overview/overview'; - +import {selectSchemaMergedChildrenPaths} from '../../../../store/reducers/schema/schema'; +import {getTopic} from '../../../../store/reducers/topic'; +import {EPathType} from '../../../../types/api/schema'; +import {useAutofetcher, useTypedDispatch, useTypedSelector} from '../../../../utils/hooks'; +import {ExternalDataSourceInfo} from '../../Info/ExternalDataSource/ExternalDataSource'; +import {ExternalTableInfo} from '../../Info/ExternalTable/ExternalTable'; import { - isEntityWithMergedImplementation, isColumnEntityType, - isTableType, + isEntityWithMergedImplementation, isPathTypeWithTopic, + isTableType, } from '../../utils/schema'; -import {ExternalTableInfo} from '../../Info/ExternalTable/ExternalTable'; -import {ExternalDataSourceInfo} from '../../Info/ExternalDataSource/ExternalDataSource'; - -import {TopicInfo} from './TopicInfo'; import {ChangefeedInfo} from './ChangefeedInfo'; import {TableInfo} from './TableInfo'; +import {TopicInfo} from './TopicInfo'; interface OverviewProps { type?: EPathType; @@ -68,7 +66,7 @@ function Overview({type, tenantName}: OverviewProps) { (overviewLoading && !overviewWasLoaded) || (olapStatsLoading && !olapStatsWasLoaded); const entityNotReady = isEntityWithMergedImpl && !mergedChildrenPaths; - const fetchData = useCallback( + const fetchData = React.useCallback( (isBackground: boolean) => { const schemaPath = currentSchemaPath || tenantName; @@ -115,7 +113,7 @@ function Overview({type, tenantName}: OverviewProps) { const data = rawData ?? undefined; // verbose mapping to guarantee a correct render for new path types // TS will error when a new type is added but not mapped here - const pathTypeToComponent: Record ReactNode) | undefined> = { + const pathTypeToComponent: Record React.ReactNode) | undefined> = { [EPathType.EPathTypeInvalid]: undefined, [EPathType.EPathTypeDir]: undefined, [EPathType.EPathTypeTable]: undefined, diff --git a/src/containers/Tenant/Diagnostics/Overview/TableInfo/TableInfo.tsx b/src/containers/Tenant/Diagnostics/Overview/TableInfo/TableInfo.tsx index d33042ab38..07fb6513a8 100644 --- a/src/containers/Tenant/Diagnostics/Overview/TableInfo/TableInfo.tsx +++ b/src/containers/Tenant/Diagnostics/Overview/TableInfo/TableInfo.tsx @@ -1,15 +1,13 @@ -import {useMemo} from 'react'; -import cn from 'bem-cn-lite'; +import React from 'react'; -import type {EPathType, TEvDescribeSchemeResult} from '../../../../../types/api/schema'; -import type {KeyValueRow} from '../../../../../types/api/query'; import {InfoViewer} from '../../../../../components/InfoViewer'; - +import type {KeyValueRow} from '../../../../../types/api/query'; +import type {EPathType, TEvDescribeSchemeResult} from '../../../../../types/api/schema'; +import {cn} from '../../../../../utils/cn'; import {getEntityName} from '../../../utils'; -import {prepareTableInfo} from './prepareTableInfo'; - import i18n from './i18n'; +import {prepareTableInfo} from './prepareTableInfo'; import './TableInfo.scss'; @@ -29,7 +27,7 @@ export const TableInfo = ({data, type, olapStats}: TableInfoProps) => { tableStatsInfo = [], tabletMetricsInfo = [], partitionConfigInfo = [], - } = useMemo(() => prepareTableInfo(data, type, olapStats), [data, type, olapStats]); + } = React.useMemo(() => prepareTableInfo(data, type, olapStats), [data, type, olapStats]); return (
diff --git a/src/containers/Tenant/Diagnostics/Overview/TableInfo/i18n/index.ts b/src/containers/Tenant/Diagnostics/Overview/TableInfo/i18n/index.ts index a70266bdda..a39d32c69c 100644 --- a/src/containers/Tenant/Diagnostics/Overview/TableInfo/i18n/index.ts +++ b/src/containers/Tenant/Diagnostics/Overview/TableInfo/i18n/index.ts @@ -1,11 +1,8 @@ -import {i18n, Lang} from '../../../../../../utils/i18n'; +import {registerKeysets} from '../../../../../../utils/i18n'; import en from './en.json'; import ru from './ru.json'; const COMPONENT = 'ydb-diagnostics-overview-table-info'; -i18n.registerKeyset(Lang.En, COMPONENT, en); -i18n.registerKeyset(Lang.Ru, COMPONENT, ru); - -export default i18n.keyset(COMPONENT); +export default registerKeysets(COMPONENT, {ru, en}); diff --git a/src/containers/Tenant/Diagnostics/Overview/TableInfo/prepareTableInfo.ts b/src/containers/Tenant/Diagnostics/Overview/TableInfo/prepareTableInfo.ts index 8fc4bd6abb..da7b39cfad 100644 --- a/src/containers/Tenant/Diagnostics/Overview/TableInfo/prepareTableInfo.ts +++ b/src/containers/Tenant/Diagnostics/Overview/TableInfo/prepareTableInfo.ts @@ -1,3 +1,12 @@ +import type {InfoViewerItem} from '../../../../../components/InfoViewer'; +import {formatObject} from '../../../../../components/InfoViewer'; +import { + formatFollowerGroupItem, + formatPartitionConfigItem, + formatTableStatsItem, + formatTabletMetricsItem, +} from '../../../../../components/InfoViewer/formatters'; +import type {KeyValueRow} from '../../../../../types/api/query'; import type { TColumnDataLifeCycle, TColumnTableDescription, @@ -5,18 +14,10 @@ import type { TPartitionConfig, TTTLSettings, } from '../../../../../types/api/schema'; -import type {KeyValueRow} from '../../../../../types/api/query'; import {EPathType} from '../../../../../types/api/schema'; -import {isNumeric} from '../../../../../utils/utils'; import {formatBytes, formatNumber} from '../../../../../utils/dataFormatters/dataFormatters'; import {formatDurationToShortTimeFormat} from '../../../../../utils/timeParsers'; -import {formatObject, InfoViewerItem} from '../../../../../components/InfoViewer'; -import { - formatFollowerGroupItem, - formatPartitionConfigItem, - formatTableStatsItem, - formatTabletMetricsItem, -} from '../../../../../components/InfoViewer/formatters'; +import {isNumeric} from '../../../../../utils/utils'; const isInStoreColumnTable = (table: TColumnTableDescription) => { // SchemaPresetId could be 0 @@ -234,6 +235,7 @@ export const prepareTableInfo = ( ]; } + //@ts-expect-error const tabletMetricsInfo = formatObject(formatTabletMetricsItem, TabletMetrics); let partitionConfigInfo: InfoViewerItem[] = []; diff --git a/src/containers/Tenant/Diagnostics/Overview/TopicInfo/TopicInfo.tsx b/src/containers/Tenant/Diagnostics/Overview/TopicInfo/TopicInfo.tsx index 5f38d5f4bc..580827b800 100644 --- a/src/containers/Tenant/Diagnostics/Overview/TopicInfo/TopicInfo.tsx +++ b/src/containers/Tenant/Diagnostics/Overview/TopicInfo/TopicInfo.tsx @@ -1,14 +1,9 @@ -import type {TEvDescribeSchemeResult} from '../../../../../types/api/schema'; - import {InfoViewer} from '../../../../../components/InfoViewer'; - +import type {TEvDescribeSchemeResult} from '../../../../../types/api/schema'; import {useTypedSelector} from '../../../../../utils/hooks'; - import {getEntityName} from '../../../utils'; - -import {prepareTopicSchemaInfo} from '../utils'; - import {TopicStats} from '../TopicStats'; +import {prepareTopicSchemaInfo} from '../utils'; interface TopicInfoProps { data?: TEvDescribeSchemeResult; diff --git a/src/containers/Tenant/Diagnostics/Overview/TopicStats/TopicStats.tsx b/src/containers/Tenant/Diagnostics/Overview/TopicStats/TopicStats.tsx index dbebb1cc40..4e3aa1c903 100644 --- a/src/containers/Tenant/Diagnostics/Overview/TopicStats/TopicStats.tsx +++ b/src/containers/Tenant/Diagnostics/Overview/TopicStats/TopicStats.tsx @@ -1,19 +1,16 @@ -import cn from 'bem-cn-lite'; - -import type {IPreparedTopicStats} from '../../../../../types/store/topic'; - -import {Loader} from '../../../../../components/Loader'; -import {InfoViewerItem, InfoViewer} from '../../../../../components/InfoViewer'; -import {SpeedMultiMeter} from '../../../../../components/SpeedMultiMeter'; +import {ResponseError} from '../../../../../components/Errors/ResponseError'; +import type {InfoViewerItem} from '../../../../../components/InfoViewer'; +import {InfoViewer} from '../../../../../components/InfoViewer'; import {LabelWithPopover} from '../../../../../components/LabelWithPopover'; import {LagPopoverContent} from '../../../../../components/LagPopoverContent'; -import {ResponseError} from '../../../../../components/Errors/ResponseError'; - +import {Loader} from '../../../../../components/Loader'; +import {SpeedMultiMeter} from '../../../../../components/SpeedMultiMeter'; +import {selectPreparedTopicStats} from '../../../../../store/reducers/topic'; +import type {IPreparedTopicStats} from '../../../../../types/store/topic'; +import {cn} from '../../../../../utils/cn'; +import {formatBps, formatBytes} from '../../../../../utils/dataFormatters/dataFormatters'; import {useTypedSelector} from '../../../../../utils/hooks'; import {formatDurationToShortTimeFormat} from '../../../../../utils/timeParsers'; -import {formatBps, formatBytes} from '../../../../../utils/dataFormatters/dataFormatters'; - -import {selectPreparedTopicStats} from '../../../../../store/reducers/topic'; import i18n from './i18n'; diff --git a/src/containers/Tenant/Diagnostics/Overview/TopicStats/i18n/index.ts b/src/containers/Tenant/Diagnostics/Overview/TopicStats/i18n/index.ts index fe924faf40..bc7e77f131 100644 --- a/src/containers/Tenant/Diagnostics/Overview/TopicStats/i18n/index.ts +++ b/src/containers/Tenant/Diagnostics/Overview/TopicStats/i18n/index.ts @@ -1,11 +1,8 @@ -import {i18n, Lang} from '../../../../../../utils/i18n'; +import {registerKeysets} from '../../../../../../utils/i18n'; import en from './en.json'; import ru from './ru.json'; const COMPONENT = 'ydb-diagnostics-overview-topic-stats'; -i18n.registerKeyset(Lang.En, COMPONENT, en); -i18n.registerKeyset(Lang.Ru, COMPONENT, ru); - -export default i18n.keyset(COMPONENT); +export default registerKeysets(COMPONENT, {ru, en}); diff --git a/src/containers/Tenant/Diagnostics/Overview/utils/prepareTopicSchemaInfo.ts b/src/containers/Tenant/Diagnostics/Overview/utils/prepareTopicSchemaInfo.ts index 1e6a69441b..f8668a887d 100644 --- a/src/containers/Tenant/Diagnostics/Overview/utils/prepareTopicSchemaInfo.ts +++ b/src/containers/Tenant/Diagnostics/Overview/utils/prepareTopicSchemaInfo.ts @@ -1,16 +1,16 @@ -import type { - TEvDescribeSchemeResult, - TPersQueueGroupDescription, - TPQTabletConfig, - TPQPartitionConfig, -} from '../../../../../types/api/schema'; - -import {formatObject, InfoViewerItem} from '../../../../../components/InfoViewer'; +import type {InfoViewerItem} from '../../../../../components/InfoViewer'; +import {formatObject} from '../../../../../components/InfoViewer'; import { formatPQGroupItem, formatPQPartitionConfig, formatPQTabletConfig, } from '../../../../../components/InfoViewer/formatters'; +import type { + TEvDescribeSchemeResult, + TPQPartitionConfig, + TPQTabletConfig, + TPersQueueGroupDescription, +} from '../../../../../types/api/schema'; export const prepareTopicSchemaInfo = (data?: TEvDescribeSchemeResult): Array => { const pqGroupData = data?.PathDescription?.PersQueueGroup; @@ -24,14 +24,17 @@ export const prepareTopicSchemaInfo = (data?: TEvDescribeSchemeResult): Array(formatPQGroupItem, { Partitions, PQTabletConfig, }); + //@ts-expect-error const pqPartitionInfo = formatObject(formatPQPartitionConfig, { StorageLimitBytes, WriteSpeedInBytesPerSecond, }); + //@ts-expect-error const pqTabletInfo = formatObject(formatPQTabletConfig, { Codecs, MeteringMode, diff --git a/src/containers/Tenant/Diagnostics/Partitions/Headers/Headers.tsx b/src/containers/Tenant/Diagnostics/Partitions/Headers/Headers.tsx index ac753efdb4..98e76afc56 100644 --- a/src/containers/Tenant/Diagnostics/Partitions/Headers/Headers.tsx +++ b/src/containers/Tenant/Diagnostics/Partitions/Headers/Headers.tsx @@ -1,15 +1,12 @@ -import block from 'bem-cn-lite'; - import {LabelWithPopover} from '../../../../../components/LabelWithPopover'; import {LagPopoverContent} from '../../../../../components/LagPopoverContent'; - -import {PARTITIONS_COLUMNS_IDS, PARTITIONS_COLUMNS_TITILES} from '../utils/constants'; - +import {cn} from '../../../../../utils/cn'; import i18n from '../i18n'; +import {PARTITIONS_COLUMNS_IDS, PARTITIONS_COLUMNS_TITILES} from '../utils/constants'; import './Headers.scss'; -const b = block('ydb-diagnostics-partitions-columns-header'); +const b = cn('ydb-diagnostics-partitions-columns-header'); interface MultilineHeaderProps { title: string; diff --git a/src/containers/Tenant/Diagnostics/Partitions/Partitions.tsx b/src/containers/Tenant/Diagnostics/Partitions/Partitions.tsx index 60ddba157a..0e914a9a7a 100644 --- a/src/containers/Tenant/Diagnostics/Partitions/Partitions.tsx +++ b/src/containers/Tenant/Diagnostics/Partitions/Partitions.tsx @@ -1,42 +1,39 @@ -import block from 'bem-cn-lite'; -import {useCallback, useEffect, useMemo, useState} from 'react'; +import React from 'react'; import DataTable from '@gravity-ui/react-data-table'; -import { - useAutofetcher, - useTypedSelector, - useTypedDispatch, - useSetting, -} from '../../../../utils/hooks'; -import {DEFAULT_TABLE_SETTINGS, PARTITIONS_HIDDEN_COLUMNS_KEY} from '../../../../utils/constants'; - +import {ResponseError} from '../../../../components/Errors/ResponseError'; +import {TableSkeleton} from '../../../../components/TableSkeleton/TableSkeleton'; import {selectNodesMap} from '../../../../store/reducers/nodesList'; +import { + getPartitions, + setDataWasNotLoaded as setPartitionsDataWasNotLoaded, + setSelectedConsumer, +} from '../../../../store/reducers/partitions/partitions'; import { cleanTopicData, getTopic, selectConsumersNames, setDataWasNotLoaded as setTopicDataWasNotLoaded, } from '../../../../store/reducers/topic'; +import {cn} from '../../../../utils/cn'; +import {DEFAULT_TABLE_SETTINGS, PARTITIONS_HIDDEN_COLUMNS_KEY} from '../../../../utils/constants'; import { - getPartitions, - setDataWasNotLoaded as setPartitionsDataWasNotLoaded, - setSelectedConsumer, -} from '../../../../store/reducers/partitions/partitions'; - -import {TableSkeleton} from '../../../../components/TableSkeleton/TableSkeleton'; -import {ResponseError} from '../../../../components/Errors/ResponseError'; + useAutofetcher, + useSetting, + useTypedDispatch, + useTypedSelector, +} from '../../../../utils/hooks'; -import type {PreparedPartitionDataWithHosts} from './utils/types'; -import {addHostToPartitions} from './utils'; import {PartitionsControls} from './PartitionsControls/PartitionsControls'; -import {useGetPartitionsColumns} from './utils/useGetPartitionsColumns'; - import i18n from './i18n'; +import {addHostToPartitions} from './utils'; +import type {PreparedPartitionDataWithHosts} from './utils/types'; +import {useGetPartitionsColumns} from './utils/useGetPartitionsColumns'; import './Partitions.scss'; -export const b = block('ydb-diagnostics-partitions'); +export const b = cn('ydb-diagnostics-partitions'); interface PartitionsProps { path?: string; @@ -47,11 +44,11 @@ export const Partitions = ({path}: PartitionsProps) => { // Manual path control to ensure that topic state will be reset before data fetch // so no request with wrong params will be sent - const [componentCurrentPath, setComponentCurrentPath] = useState(path); + const [componentCurrentPath, setComponentCurrentPath] = React.useState(path); - const [partitionsToRender, setPartitionsToRender] = useState( - [], - ); + const [partitionsToRender, setPartitionsToRender] = React.useState< + PreparedPartitionDataWithHosts[] + >([]); const consumers = useTypedSelector(selectConsumersNames); const nodesMap = useTypedSelector(selectNodesMap); @@ -78,7 +75,7 @@ export const Partitions = ({path}: PartitionsProps) => { const [columns, columnsIdsForSelector] = useGetPartitionsColumns(selectedConsumer); - useEffect(() => { + React.useEffect(() => { dispatch(cleanTopicData()); dispatch(setTopicDataWasNotLoaded()); @@ -87,11 +84,11 @@ export const Partitions = ({path}: PartitionsProps) => { setComponentCurrentPath(path); }, [dispatch, path]); - const partitionsWithHosts = useMemo(() => { + const partitionsWithHosts = React.useMemo(() => { return addHostToPartitions(rawPartitions, nodesMap); }, [rawPartitions, nodesMap]); - const fetchData = useCallback( + const fetchData = React.useCallback( (isBackground: boolean) => { if (!isBackground) { dispatch(setPartitionsDataWasNotLoaded()); @@ -107,7 +104,7 @@ export const Partitions = ({path}: PartitionsProps) => { // Wrong consumer could be passed in search query // Reset consumer if it doesn't exist for current topic - useEffect(() => { + React.useEffect(() => { const isTopicWithoutConsumers = topicWasLoaded && !consumers; const wrongSelectedConsumer = selectedConsumer && consumers && !consumers.includes(selectedConsumer); @@ -117,7 +114,7 @@ export const Partitions = ({path}: PartitionsProps) => { } }, [dispatch, topicWasLoaded, selectedConsumer, consumers]); - const columnsToShow = useMemo(() => { + const columnsToShow = React.useMemo(() => { return columns.filter((column) => !hiddenColumns.includes(column.name)); }, [columns, hiddenColumns]); diff --git a/src/containers/Tenant/Diagnostics/Partitions/PartitionsControls/PartitionsControls.tsx b/src/containers/Tenant/Diagnostics/Partitions/PartitionsControls/PartitionsControls.tsx index 67067282a5..56d94be1b4 100644 --- a/src/containers/Tenant/Diagnostics/Partitions/PartitionsControls/PartitionsControls.tsx +++ b/src/containers/Tenant/Diagnostics/Partitions/PartitionsControls/PartitionsControls.tsx @@ -1,17 +1,15 @@ -import {useEffect, useMemo, useState} from 'react'; -import escapeRegExp from 'lodash/escapeRegExp'; - -import {TableColumnSetupItem} from '@gravity-ui/uikit/build/esm/components/Table/hoc/withTableSettings/withTableSettings'; -import {Select, SelectOption, TableColumnSetup} from '@gravity-ui/uikit'; +import React from 'react'; -import type {ValueOf} from '../../../../../types/common'; +import type {SelectOption, TableColumnSetupProps} from '@gravity-ui/uikit'; +import {Select, TableColumnSetup} from '@gravity-ui/uikit'; +import escapeRegExp from 'lodash/escapeRegExp'; import {Search} from '../../../../../components/Search/Search'; - -import type {PreparedPartitionDataWithHosts} from '../utils/types'; -import {PARTITIONS_COLUMNS_IDS, PARTITIONS_COLUMNS_TITILES} from '../utils/constants'; -import i18n from '../i18n'; +import type {ValueOf} from '../../../../../types/common'; import {b} from '../Partitions'; +import i18n from '../i18n'; +import {PARTITIONS_COLUMNS_IDS, PARTITIONS_COLUMNS_TITILES} from '../utils/constants'; +import type {PreparedPartitionDataWithHosts} from '../utils/types'; interface PartitionsControlsProps { consumers: string[] | undefined; @@ -36,10 +34,10 @@ export const PartitionsControls = ({ onHiddenColumnsChange, initialColumnsIds, }: PartitionsControlsProps) => { - const [generalSearchValue, setGeneralSearchValue] = useState(''); - const [partitionIdSearchValue, setPartitionIdSearchValue] = useState(''); + const [generalSearchValue, setGeneralSearchValue] = React.useState(''); + const [partitionIdSearchValue, setPartitionIdSearchValue] = React.useState(''); - useEffect(() => { + React.useEffect(() => { if (!partitions) { return; } @@ -80,7 +78,7 @@ export const PartitionsControls = ({ onSearchChange(filteredPartitions); }, [partitionIdSearchValue, generalSearchValue, partitions, onSearchChange]); - const consumersToSelect = useMemo(() => { + const consumersToSelect = React.useMemo(() => { const options = consumers && consumers.length ? consumers.map((consumer) => ({ @@ -92,7 +90,7 @@ export const PartitionsControls = ({ return [{value: '', content: i18n('controls.consumerSelector.emptyOption')}, ...options]; }, [consumers]); - const columnsToSelect = useMemo(() => { + const columnsToSelect = React.useMemo(() => { return initialColumnsIds.map((id) => { return { title: PARTITIONS_COLUMNS_TITILES[id as ValueOf], @@ -115,16 +113,16 @@ export const PartitionsControls = ({ setGeneralSearchValue(value); }; - const hadleTableColumnsSetupChange = (value: TableColumnSetupItem[]) => { + const handleTableColumnsSetupChange: TableColumnSetupProps['onUpdate'] = (value) => { const result = [...hiddenColumns]; // Process current set of columns // This way we do not remove from hidden these columns, that are not displayed currently // The reasons: set of columns differs for partitions with and without consumers value.forEach((el) => { - if (!el.selected && !hiddenColumns.includes(el.id)) { + if (!el.isSelected && !hiddenColumns.includes(el.id)) { result.push(el.id); - } else if (el.selected && hiddenColumns.includes(el.id)) { + } else if (el.isSelected && hiddenColumns.includes(el.id)) { result.splice(hiddenColumns.indexOf(el.id)); } }); @@ -165,10 +163,10 @@ export const PartitionsControls = ({ />
); diff --git a/src/containers/Tenant/Diagnostics/Partitions/columns/columns.tsx b/src/containers/Tenant/Diagnostics/Partitions/columns/columns.tsx index 1067e0573b..7f5a0bd6f0 100644 --- a/src/containers/Tenant/Diagnostics/Partitions/columns/columns.tsx +++ b/src/containers/Tenant/Diagnostics/Partitions/columns/columns.tsx @@ -1,12 +1,20 @@ -import DataTable, {Column} from '@gravity-ui/react-data-table'; -import block from 'bem-cn-lite'; +import type {Column} from '@gravity-ui/react-data-table'; +import DataTable from '@gravity-ui/react-data-table'; -import {SpeedMultiMeter} from '../../../../../components/SpeedMultiMeter'; import {EntityStatus} from '../../../../../components/EntityStatus/EntityStatus'; -import {getDefaultNodePath} from '../../../../Node/NodePages'; +import {SpeedMultiMeter} from '../../../../../components/SpeedMultiMeter'; +import {cn} from '../../../../../utils/cn'; import {formatBytes, formatMsToUptime} from '../../../../../utils/dataFormatters/dataFormatters'; import {isNumeric} from '../../../../../utils/utils'; - +import {getDefaultNodePath} from '../../../../Node/NodePages'; +import { + MultilineHeader, + ReadLagsHeader, + ReadSessionHeader, + UncommitedMessagesHeader, + UnreadMessagesHeader, + WriteLagsHeader, +} from '../Headers'; import { PARTITIONS_COLUMNS_IDS, PARTITIONS_COLUMNS_TITILES, @@ -18,18 +26,9 @@ import { } from '../utils/constants'; import type {PreparedPartitionDataWithHosts} from '../utils/types'; -import { - MultilineHeader, - ReadLagsHeader, - ReadSessionHeader, - UncommitedMessagesHeader, - UnreadMessagesHeader, - WriteLagsHeader, -} from '../Headers'; - import './Columns.scss'; -const b = block('ydb-diagnostics-partitions-columns'); +const b = cn('ydb-diagnostics-partitions-columns'); export const allColumns: Column[] = [ { @@ -250,6 +249,6 @@ export const allColumns: Column[] = [ // These columns will be empty and should not be displayed export const generalColumns = allColumns.filter((column) => { return generalPartitionColumnsIds.includes( - column.name as typeof generalPartitionColumnsIds[number], + column.name as (typeof generalPartitionColumnsIds)[number], ); }); diff --git a/src/containers/Tenant/Diagnostics/Partitions/i18n/index.ts b/src/containers/Tenant/Diagnostics/Partitions/i18n/index.ts index 41e09632d0..bd62098dc7 100644 --- a/src/containers/Tenant/Diagnostics/Partitions/i18n/index.ts +++ b/src/containers/Tenant/Diagnostics/Partitions/i18n/index.ts @@ -1,11 +1,8 @@ -import {i18n, Lang} from '../../../../../utils/i18n'; +import {registerKeysets} from '../../../../../utils/i18n'; import en from './en.json'; import ru from './ru.json'; const COMPONENT = 'ydb-diagnostics-partitions'; -i18n.registerKeyset(Lang.En, COMPONENT, en); -i18n.registerKeyset(Lang.Ru, COMPONENT, ru); - -export default i18n.keyset(COMPONENT); +export default registerKeysets(COMPONENT, {ru, en}); diff --git a/src/containers/Tenant/Diagnostics/Partitions/utils/index.ts b/src/containers/Tenant/Diagnostics/Partitions/utils/index.ts index 89f164d718..982cb89a0d 100644 --- a/src/containers/Tenant/Diagnostics/Partitions/utils/index.ts +++ b/src/containers/Tenant/Diagnostics/Partitions/utils/index.ts @@ -1,5 +1,6 @@ import type {PreparedPartitionData} from '../../../../../store/reducers/partitions/types'; import type {NodesMap} from '../../../../../types/store/nodesList'; + import type {PreparedPartitionDataWithHosts} from './types'; export const addHostToPartitions = ( diff --git a/src/containers/Tenant/Diagnostics/Partitions/utils/useGetPartitionsColumns.ts b/src/containers/Tenant/Diagnostics/Partitions/utils/useGetPartitionsColumns.ts index 64a90653e6..5b83a47813 100644 --- a/src/containers/Tenant/Diagnostics/Partitions/utils/useGetPartitionsColumns.ts +++ b/src/containers/Tenant/Diagnostics/Partitions/utils/useGetPartitionsColumns.ts @@ -1,19 +1,20 @@ -import {useEffect, useState} from 'react'; +import React from 'react'; import type {Column} from '@gravity-ui/react-data-table'; -import type {PreparedPartitionDataWithHosts} from './types'; import {allColumns, generalColumns} from '../columns'; + import {allPartitionsColumnsIds, generalPartitionColumnsIds} from './constants'; +import type {PreparedPartitionDataWithHosts} from './types'; // Columns are different for partitions with consumers and without export const useGetPartitionsColumns = ( selectedConsumer: string | undefined, ): [Column[], string[]] => { - const [columns, setColumns] = useState[]>([]); - const [columnsIdsForSelector, setColumnsIdsForSelector] = useState([]); + const [columns, setColumns] = React.useState[]>([]); + const [columnsIdsForSelector, setColumnsIdsForSelector] = React.useState([]); - useEffect(() => { + React.useEffect(() => { if (selectedConsumer) { setColumns(allColumns); setColumnsIdsForSelector(allPartitionsColumnsIds); diff --git a/src/containers/Tenant/Diagnostics/TenantOverview/DefaultOverviewContent/DefaultOverviewContent.tsx b/src/containers/Tenant/Diagnostics/TenantOverview/DefaultOverviewContent/DefaultOverviewContent.tsx index 179dc405d3..da411d2103 100644 --- a/src/containers/Tenant/Diagnostics/TenantOverview/DefaultOverviewContent/DefaultOverviewContent.tsx +++ b/src/containers/Tenant/Diagnostics/TenantOverview/DefaultOverviewContent/DefaultOverviewContent.tsx @@ -1,4 +1,5 @@ import {TenantDashboard} from '../TenantDashboard/TenantDashboard'; + import {defaultDashboardConfig} from './defaultDashboardConfig'; interface DefaultOverviewContentProps { diff --git a/src/containers/Tenant/Diagnostics/TenantOverview/Healthcheck/Healthcheck.scss b/src/containers/Tenant/Diagnostics/TenantOverview/Healthcheck/Healthcheck.scss index a139f1ff41..4b8b4f4d45 100644 --- a/src/containers/Tenant/Diagnostics/TenantOverview/Healthcheck/Healthcheck.scss +++ b/src/containers/Tenant/Diagnostics/TenantOverview/Healthcheck/Healthcheck.scss @@ -30,8 +30,9 @@ } &__preview-header { - margin-bottom: var(--diagnostics-section-title-margin); gap: 8px; + + margin-bottom: var(--diagnostics-section-title-margin); } &__preview-title { @@ -46,20 +47,18 @@ &__preview-title-wrapper { display: flex; align-items: center; + gap: 8px; margin-bottom: 4px; - - gap: 8px; } &__issues-statistics { display: flex; flex-wrap: wrap; align-items: center; + gap: 10px; margin: 8px 0; - - gap: 10px; } &__self-check-status-indicator { diff --git a/src/containers/Tenant/Diagnostics/TenantOverview/Healthcheck/HealthcheckDetails.tsx b/src/containers/Tenant/Diagnostics/TenantOverview/Healthcheck/HealthcheckDetails.tsx index c0d9c62e4b..bd40b3662a 100644 --- a/src/containers/Tenant/Diagnostics/TenantOverview/Healthcheck/HealthcheckDetails.tsx +++ b/src/containers/Tenant/Diagnostics/TenantOverview/Healthcheck/HealthcheckDetails.tsx @@ -1,13 +1,14 @@ -import cn from 'bem-cn-lite'; +import React from 'react'; -import type {IResponseError} from '../../../../../types/api/error'; -import type {IssuesTree} from '../../../../../store/reducers/healthcheckInfo/types'; import {ResponseError} from '../../../../../components/Errors/ResponseError'; import {Loader} from '../../../../../components/Loader'; +import type {IssuesTree} from '../../../../../store/reducers/healthcheckInfo/types'; +import type {IResponseError} from '../../../../../types/api/error'; +import {cn} from '../../../../../utils/cn'; import IssueTree from './IssuesViewer/IssueTree'; - import i18n from './i18n'; + import './Healthcheck.scss'; const b = cn('healthcheck'); @@ -36,11 +37,11 @@ export function HealthcheckDetails(props: HealthcheckDetailsProps) { } return ( - <> + {issueTrees.map((issueTree) => ( ))} - + ); }; diff --git a/src/containers/Tenant/Diagnostics/TenantOverview/Healthcheck/HealthcheckPreview.tsx b/src/containers/Tenant/Diagnostics/TenantOverview/Healthcheck/HealthcheckPreview.tsx index fd8708a8e0..f4ccaa0cd9 100644 --- a/src/containers/Tenant/Diagnostics/TenantOverview/Healthcheck/HealthcheckPreview.tsx +++ b/src/containers/Tenant/Diagnostics/TenantOverview/Healthcheck/HealthcheckPreview.tsx @@ -1,18 +1,20 @@ -import cn from 'bem-cn-lite'; +import React from 'react'; import {Button, Icon} from '@gravity-ui/uikit'; -import updateArrow from '../../../../../assets/icons/update-arrow.svg'; - -import {SelfCheckResult, type StatusFlag} from '../../../../../types/api/healthcheck'; -import type {IResponseError} from '../../../../../types/api/error'; -import {hcStatusToColorFlag} from '../../../../../store/reducers/healthcheckInfo/utils'; import {DiagnosticCard} from '../../../../../components/DiagnosticCard/DiagnosticCard'; import {EntityStatus} from '../../../../../components/EntityStatus/EntityStatus'; import {ResponseError} from '../../../../../components/Errors/ResponseError'; import {Loader} from '../../../../../components/Loader'; +import {hcStatusToColorFlag} from '../../../../../store/reducers/healthcheckInfo/utils'; +import type {IResponseError} from '../../../../../types/api/error'; +import type {SelfCheckResult, StatusFlag} from '../../../../../types/api/healthcheck'; +import {cn} from '../../../../../utils/cn'; import i18n from './i18n'; + +import updateArrow from '../../../../../assets/icons/update-arrow.svg'; + import './Healthcheck.scss'; const b = cn('healthcheck'); @@ -66,7 +68,7 @@ export function HealthcheckPreview(props: HealthcheckPreviewProps) { {!issuesStatistics || !issuesStatistics.length ? ( i18n('status_message.ok') ) : ( - <> +
{i18n('label.issues')}
{issuesStatistics.map(([status, count]) => ( @@ -79,7 +81,7 @@ export function HealthcheckPreview(props: HealthcheckPreviewProps) { /> ))}
- +
)} ); diff --git a/src/containers/Tenant/Diagnostics/TenantOverview/Healthcheck/IssuesViewer/IssueTree.tsx b/src/containers/Tenant/Diagnostics/TenantOverview/Healthcheck/IssuesViewer/IssueTree.tsx index f626ec7a14..99152ce47f 100644 --- a/src/containers/Tenant/Diagnostics/TenantOverview/Healthcheck/IssuesViewer/IssueTree.tsx +++ b/src/containers/Tenant/Diagnostics/TenantOverview/Healthcheck/IssuesViewer/IssueTree.tsx @@ -1,13 +1,12 @@ -import {useCallback, useState} from 'react'; -import cn from 'bem-cn-lite'; -import _omit from 'lodash/omit'; +import React from 'react'; +import _omit from 'lodash/omit'; import JSONTree from 'react-json-inspector'; - import {TreeView} from 'ydb-ui-components'; -import {IssuesTree} from '../../../../../../store/reducers/healthcheckInfo/types'; +import type {IssuesTree} from '../../../../../../store/reducers/healthcheckInfo/types'; import {hcStatusToColorFlag} from '../../../../../../store/reducers/healthcheckInfo/utils'; +import {cn} from '../../../../../../utils/cn'; import {IssueTreeItem} from './IssueTreeItem'; @@ -20,9 +19,26 @@ interface IssuesViewerProps { } const IssueTree = ({issueTree}: IssuesViewerProps) => { - const [collapsedIssues, setCollapsedIssues] = useState>({}); - - const renderTree = useCallback( + const [collapsedIssues, setCollapsedIssues] = React.useState>({}); + + const renderInfoPanel = React.useCallback((info?: object) => { + if (!info) { + return null; + } + + return ( +
+ true} + className={b('inspector')} + /> +
+ ); + }, []); + + const renderTree = React.useCallback( (data: IssuesTree[]) => { return data.map((item) => { const {id} = item; @@ -60,27 +76,7 @@ const IssueTree = ({issueTree}: IssuesViewerProps) => { ); }); }, - [issueTree, collapsedIssues], - ); - - const renderInfoPanel = useCallback( - (info) => { - if (!info) { - return null; - } - - return ( -
- true} - className={b('inspector')} - /> -
- ); - }, - [issueTree], + [collapsedIssues, renderInfoPanel], ); return ( diff --git a/src/containers/Tenant/Diagnostics/TenantOverview/Healthcheck/IssuesViewer/IssueTreeItem/IssueTreeItem.tsx b/src/containers/Tenant/Diagnostics/TenantOverview/Healthcheck/IssuesViewer/IssueTreeItem/IssueTreeItem.tsx index 61913429e4..1dac61e59c 100644 --- a/src/containers/Tenant/Diagnostics/TenantOverview/Healthcheck/IssuesViewer/IssueTreeItem/IssueTreeItem.tsx +++ b/src/containers/Tenant/Diagnostics/TenantOverview/Healthcheck/IssuesViewer/IssueTreeItem/IssueTreeItem.tsx @@ -1,7 +1,6 @@ -import cn from 'bem-cn-lite'; - -import type {EFlag} from '../../../../../../../types/api/enums'; import {EntityStatus} from '../../../../../../../components/EntityStatus/EntityStatus'; +import type {EFlag} from '../../../../../../../types/api/enums'; +import {cn} from '../../../../../../../utils/cn'; import './IssueTreeItem.scss'; diff --git a/src/containers/Tenant/Diagnostics/TenantOverview/Healthcheck/i18n/index.ts b/src/containers/Tenant/Diagnostics/TenantOverview/Healthcheck/i18n/index.ts index a855a79030..b0fa69fde3 100644 --- a/src/containers/Tenant/Diagnostics/TenantOverview/Healthcheck/i18n/index.ts +++ b/src/containers/Tenant/Diagnostics/TenantOverview/Healthcheck/i18n/index.ts @@ -1,11 +1,8 @@ -import {i18n, Lang} from '../../../../../../utils/i18n'; +import {registerKeysets} from '../../../../../../utils/i18n'; import en from './en.json'; import ru from './ru.json'; const COMPONENT = 'ydb-diagnostics-healthcheck'; -i18n.registerKeyset(Lang.En, COMPONENT, en); -i18n.registerKeyset(Lang.Ru, COMPONENT, ru); - -export default i18n.keyset(COMPONENT); +export default registerKeysets(COMPONENT, {ru, en}); diff --git a/src/containers/Tenant/Diagnostics/TenantOverview/MetricsCards/MetricCard/MetricCard.tsx b/src/containers/Tenant/Diagnostics/TenantOverview/MetricsCards/MetricCard/MetricCard.tsx index 55bc831e00..c29ff829d5 100644 --- a/src/containers/Tenant/Diagnostics/TenantOverview/MetricsCards/MetricCard/MetricCard.tsx +++ b/src/containers/Tenant/Diagnostics/TenantOverview/MetricsCards/MetricCard/MetricCard.tsx @@ -1,10 +1,8 @@ -import cn from 'bem-cn-lite'; - import {CircularProgressBar} from '../../../../../../components/CircularProgressBar/CircularProgressBar'; import {DiagnosticCard} from '../../../../../../components/DiagnosticCard/DiagnosticCard'; -import {formatUsage} from '../../../../../../store/reducers/tenants/utils'; import type {MetricStatus} from '../../../../../../store/reducers/tenants/types'; - +import {formatUsage} from '../../../../../../store/reducers/tenants/utils'; +import {cn} from '../../../../../../utils/cn'; import i18n from '../../i18n'; import './MetricCard.scss'; diff --git a/src/containers/Tenant/Diagnostics/TenantOverview/MetricsCards/MetricsCards.tsx b/src/containers/Tenant/Diagnostics/TenantOverview/MetricsCards/MetricsCards.tsx index d8300900b1..988d1c2da7 100644 --- a/src/containers/Tenant/Diagnostics/TenantOverview/MetricsCards/MetricsCards.tsx +++ b/src/containers/Tenant/Diagnostics/TenantOverview/MetricsCards/MetricsCards.tsx @@ -1,22 +1,22 @@ -import cn from 'bem-cn-lite'; - import {Link, useLocation} from 'react-router-dom'; -import type {TenantMetricsTab} from '../../../../../store/reducers/tenant/types'; -import {TENANT_METRICS_TABS_IDS} from '../../../../../store/reducers/tenant/constants'; -import {useTypedSelector} from '../../../../../utils/hooks'; import {parseQuery} from '../../../../../routes'; -import {TenantTabsGroups, getTenantPath} from '../../../TenantPages'; +import {TENANT_METRICS_TABS_IDS} from '../../../../../store/reducers/tenant/constants'; +import type {TenantMetricsTab} from '../../../../../store/reducers/tenant/types'; import { calculateUsage, cpuUsageToStatus, - storageUsageToStatus, - memoryUsageToStatus, formatTenantMetrics, + memoryUsageToStatus, + storageUsageToStatus, } from '../../../../../store/reducers/tenants/utils'; -import type {SelfCheckResult, StatusFlag} from '../../../../../types/api/healthcheck'; import type {IResponseError} from '../../../../../types/api/error'; +import type {SelfCheckResult, StatusFlag} from '../../../../../types/api/healthcheck'; +import {cn} from '../../../../../utils/cn'; +import {useTypedSelector} from '../../../../../utils/hooks'; +import {TenantTabsGroups, getTenantPath} from '../../../TenantPages'; import {HealthcheckPreview} from '../Healthcheck/HealthcheckPreview'; + import {MetricCard} from './MetricCard/MetricCard'; import './MetricsCards.scss'; diff --git a/src/containers/Tenant/Diagnostics/TenantOverview/TenantCpu/TenantCpu.tsx b/src/containers/Tenant/Diagnostics/TenantOverview/TenantCpu/TenantCpu.tsx index cd19f50b84..705266b769 100644 --- a/src/containers/Tenant/Diagnostics/TenantOverview/TenantCpu/TenantCpu.tsx +++ b/src/containers/Tenant/Diagnostics/TenantOverview/TenantCpu/TenantCpu.tsx @@ -1,10 +1,13 @@ +import React from 'react'; + import type {AdditionalNodesProps} from '../../../../../types/additionalProps'; import {TenantDashboard} from '../TenantDashboard/TenantDashboard'; -import {cpuDashboardConfig} from './cpuDashboardConfig'; -import {TopNodesByLoad} from './TopNodesByLoad'; + import {TopNodesByCpu} from './TopNodesByCpu'; -import {TopShards} from './TopShards'; +import {TopNodesByLoad} from './TopNodesByLoad'; import {TopQueries} from './TopQueries'; +import {TopShards} from './TopShards'; +import {cpuDashboardConfig} from './cpuDashboardConfig'; interface TenantCpuProps { path: string; @@ -13,12 +16,12 @@ interface TenantCpuProps { export function TenantCpu({path, additionalNodesProps}: TenantCpuProps) { return ( - <> + - + ); } diff --git a/src/containers/Tenant/Diagnostics/TenantOverview/TenantCpu/TopNodesByCpu.tsx b/src/containers/Tenant/Diagnostics/TenantOverview/TenantCpu/TopNodesByCpu.tsx index 1b34568dd3..41a17d9d6a 100644 --- a/src/containers/Tenant/Diagnostics/TenantOverview/TenantCpu/TopNodesByCpu.tsx +++ b/src/containers/Tenant/Diagnostics/TenantOverview/TenantCpu/TopNodesByCpu.tsx @@ -1,22 +1,20 @@ -import {useCallback} from 'react'; +import React from 'react'; -import { - useAutofetcher, - useSearchQuery, - useTypedDispatch, - useTypedSelector, -} from '../../../../../utils/hooks'; +import {TENANT_DIAGNOSTICS_TABS_IDS} from '../../../../../store/reducers/tenant/constants'; import { getTopNodesByCpu, selectTopNodesByCpu, setDataWasNotLoaded, } from '../../../../../store/reducers/tenantOverview/topNodesByCpu/topNodesByCpu'; -import {TENANT_DIAGNOSTICS_TABS_IDS} from '../../../../../store/reducers/tenant/constants'; import type {AdditionalNodesProps} from '../../../../../types/additionalProps'; +import { + useAutofetcher, + useSearchQuery, + useTypedDispatch, + useTypedSelector, +} from '../../../../../utils/hooks'; import {getTopNodesByCpuColumns} from '../../../../Nodes/getNodesColumns'; - import {TenantTabsGroups, getTenantPath} from '../../../TenantPages'; - import {TenantOverviewTableLayout} from '../TenantOverviewTableLayout'; import {getSectionTitle} from '../getSectionTitle'; import i18n from '../i18n'; @@ -36,8 +34,8 @@ export function TopNodesByCpu({path, additionalNodesProps}: TopNodesByCpuProps) const topNodes = useTypedSelector(selectTopNodesByCpu); const columns = getTopNodesByCpuColumns(additionalNodesProps?.getNodeRef); - const fetchNodes = useCallback( - (isBackground) => { + const fetchNodes = React.useCallback( + (isBackground: boolean) => { if (!isBackground) { dispatch(setDataWasNotLoaded()); } diff --git a/src/containers/Tenant/Diagnostics/TenantOverview/TenantCpu/TopNodesByLoad.tsx b/src/containers/Tenant/Diagnostics/TenantOverview/TenantCpu/TopNodesByLoad.tsx index 9d9a9264e1..274e5ee4f4 100644 --- a/src/containers/Tenant/Diagnostics/TenantOverview/TenantCpu/TopNodesByLoad.tsx +++ b/src/containers/Tenant/Diagnostics/TenantOverview/TenantCpu/TopNodesByLoad.tsx @@ -1,22 +1,20 @@ -import {useCallback} from 'react'; +import React from 'react'; -import { - useAutofetcher, - useSearchQuery, - useTypedDispatch, - useTypedSelector, -} from '../../../../../utils/hooks'; +import {TENANT_DIAGNOSTICS_TABS_IDS} from '../../../../../store/reducers/tenant/constants'; import { getTopNodesByLoad, selectTopNodesByLoad, setDataWasNotLoaded, } from '../../../../../store/reducers/tenantOverview/topNodesByLoad/topNodesByLoad'; -import {TENANT_DIAGNOSTICS_TABS_IDS} from '../../../../../store/reducers/tenant/constants'; import type {AdditionalNodesProps} from '../../../../../types/additionalProps'; +import { + useAutofetcher, + useSearchQuery, + useTypedDispatch, + useTypedSelector, +} from '../../../../../utils/hooks'; import {getTopNodesByLoadColumns} from '../../../../Nodes/getNodesColumns'; - import {TenantTabsGroups, getTenantPath} from '../../../TenantPages'; - import {TenantOverviewTableLayout} from '../TenantOverviewTableLayout'; import {getSectionTitle} from '../getSectionTitle'; import i18n from '../i18n'; @@ -36,8 +34,8 @@ export function TopNodesByLoad({path, additionalNodesProps}: TopNodesByLoadProps const topNodes = useTypedSelector(selectTopNodesByLoad); const columns = getTopNodesByLoadColumns(additionalNodesProps?.getNodeRef); - const fetchNodes = useCallback( - (isBackground) => { + const fetchNodes = React.useCallback( + (isBackground: boolean) => { if (!isBackground) { dispatch(setDataWasNotLoaded()); } diff --git a/src/containers/Tenant/Diagnostics/TenantOverview/TenantCpu/TopQueries.tsx b/src/containers/Tenant/Diagnostics/TenantOverview/TenantCpu/TopQueries.tsx index 677a521f0a..86d7b75f9b 100644 --- a/src/containers/Tenant/Diagnostics/TenantOverview/TenantCpu/TopQueries.tsx +++ b/src/containers/Tenant/Diagnostics/TenantOverview/TenantCpu/TopQueries.tsx @@ -1,6 +1,9 @@ +import React from 'react'; + import {useHistory, useLocation} from 'react-router'; -import {useCallback} from 'react'; +import {parseQuery} from '../../../../../routes'; +import {changeUserInput} from '../../../../../store/reducers/executeQuery'; import { TENANT_DIAGNOSTICS_TABS_IDS, TENANT_PAGE, @@ -11,13 +14,9 @@ import { fetchTenantOverviewTopQueries, setDataWasNotLoaded, } from '../../../../../store/reducers/tenantOverview/topQueries/tenantOverviewTopQueries'; -import {changeUserInput} from '../../../../../store/reducers/executeQuery'; import {useAutofetcher, useTypedDispatch, useTypedSelector} from '../../../../../utils/hooks'; -import {parseQuery} from '../../../../../routes'; - import {TenantTabsGroups, getTenantPath} from '../../../TenantPages'; import {getTenantOverviewTopQueriesColumns} from '../../TopQueries/getTopQueriesColumns'; - import {TenantOverviewTableLayout} from '../TenantOverviewTableLayout'; import {getSectionTitle} from '../getSectionTitle'; import i18n from '../i18n'; @@ -55,8 +54,8 @@ export function TopQueries({path}: TopQueriesProps) { autorefresh, ); - const handleRowClick = useCallback( - (row) => { + const handleRowClick = React.useCallback( + (row: any) => { const {QueryText: input} = row; dispatch(changeUserInput({input})); diff --git a/src/containers/Tenant/Diagnostics/TenantOverview/TenantCpu/TopShards.tsx b/src/containers/Tenant/Diagnostics/TenantOverview/TenantCpu/TopShards.tsx index 2a83966ed5..5cd9bff72a 100644 --- a/src/containers/Tenant/Diagnostics/TenantOverview/TenantCpu/TopShards.tsx +++ b/src/containers/Tenant/Diagnostics/TenantOverview/TenantCpu/TopShards.tsx @@ -1,17 +1,14 @@ import {useLocation} from 'react-router'; -import {useAutofetcher, useTypedDispatch, useTypedSelector} from '../../../../../utils/hooks'; import {parseQuery} from '../../../../../routes'; - +import {TENANT_DIAGNOSTICS_TABS_IDS} from '../../../../../store/reducers/tenant/constants'; import { sendTenantOverviewTopShardsQuery, setDataWasNotLoaded, } from '../../../../../store/reducers/tenantOverview/topShards/tenantOverviewTopShards'; -import {TENANT_DIAGNOSTICS_TABS_IDS} from '../../../../../store/reducers/tenant/constants'; -import {getTopShardsColumns} from '../../TopShards/getTopShardsColumns'; - +import {useAutofetcher, useTypedDispatch, useTypedSelector} from '../../../../../utils/hooks'; import {TenantTabsGroups, getTenantPath} from '../../../TenantPages'; - +import {getTopShardsColumns} from '../../TopShards/getTopShardsColumns'; import {TenantOverviewTableLayout} from '../TenantOverviewTableLayout'; import {getSectionTitle} from '../getSectionTitle'; import i18n from '../i18n'; diff --git a/src/containers/Tenant/Diagnostics/TenantOverview/TenantDashboard/TenantDashboard.tsx b/src/containers/Tenant/Diagnostics/TenantOverview/TenantDashboard/TenantDashboard.tsx index 23930af361..8a5fbbb53b 100644 --- a/src/containers/Tenant/Diagnostics/TenantOverview/TenantDashboard/TenantDashboard.tsx +++ b/src/containers/Tenant/Diagnostics/TenantOverview/TenantDashboard/TenantDashboard.tsx @@ -1,16 +1,17 @@ -import {useState} from 'react'; +import React from 'react'; + import {StringParam, useQueryParam} from 'use-query-params'; +import {MetricChart} from '../../../../../components/MetricChart'; +import type { + ChartDataStatus, + ChartOptions, + MetricDescription, +} from '../../../../../components/MetricChart'; +import {TimeFrameSelector} from '../../../../../components/TimeFrameSelector/TimeFrameSelector'; import {cn} from '../../../../../utils/cn'; -import type {TimeFrame} from '../../../../../utils/timeframes'; import {useTypedSelector} from '../../../../../utils/hooks'; -import {TimeFrameSelector} from '../../../../../components/TimeFrameSelector/TimeFrameSelector'; -import { - type ChartOptions, - MetricChart, - type MetricDescription, - type ChartDataStatus, -} from '../../../../../components/MetricChart'; +import type {TimeFrame} from '../../../../../utils/timeframes'; import './TenantDashboard.scss'; @@ -31,7 +32,7 @@ interface TenantDashboardProps { } export const TenantDashboard = ({database, charts}: TenantDashboardProps) => { - const [isDashboardHidden, setIsDashboardHidden] = useState(true); + const [isDashboardHidden, setIsDashboardHidden] = React.useState(true); const [timeFrame = '1h', setTimeframe] = useQueryParam('timeframe', StringParam); diff --git a/src/containers/Tenant/Diagnostics/TenantOverview/TenantMemory/TenantMemory.tsx b/src/containers/Tenant/Diagnostics/TenantOverview/TenantMemory/TenantMemory.tsx index b1d3d36c61..4ec6617d75 100644 --- a/src/containers/Tenant/Diagnostics/TenantOverview/TenantMemory/TenantMemory.tsx +++ b/src/containers/Tenant/Diagnostics/TenantOverview/TenantMemory/TenantMemory.tsx @@ -1,6 +1,9 @@ +import React from 'react'; + import {TenantDashboard} from '../TenantDashboard/TenantDashboard'; -import {memoryDashboardConfig} from './memoryDashboardConfig'; + import {TopNodesByMemory} from './TopNodesByMemory'; +import {memoryDashboardConfig} from './memoryDashboardConfig'; interface TenantMemoryProps { path: string; @@ -8,9 +11,9 @@ interface TenantMemoryProps { export function TenantMemory({path}: TenantMemoryProps) { return ( - <> + - + ); } diff --git a/src/containers/Tenant/Diagnostics/TenantOverview/TenantMemory/TopNodesByMemory.tsx b/src/containers/Tenant/Diagnostics/TenantOverview/TenantMemory/TopNodesByMemory.tsx index 8e29d6e94e..bd47cf5e7b 100644 --- a/src/containers/Tenant/Diagnostics/TenantOverview/TenantMemory/TopNodesByMemory.tsx +++ b/src/containers/Tenant/Diagnostics/TenantOverview/TenantMemory/TopNodesByMemory.tsx @@ -1,22 +1,20 @@ -import {useCallback} from 'react'; +import React from 'react'; -import { - useAutofetcher, - useTypedSelector, - useSearchQuery, - useTypedDispatch, -} from '../../../../../utils/hooks'; +import {TENANT_DIAGNOSTICS_TABS_IDS} from '../../../../../store/reducers/tenant/constants'; import { getTopNodesByMemory, selectTopNodesByMemory, setDataWasNotLoaded, } from '../../../../../store/reducers/tenantOverview/topNodesByMemory/topNodesByMemory'; -import {TENANT_DIAGNOSTICS_TABS_IDS} from '../../../../../store/reducers/tenant/constants'; import type {AdditionalNodesProps} from '../../../../../types/additionalProps'; +import { + useAutofetcher, + useSearchQuery, + useTypedDispatch, + useTypedSelector, +} from '../../../../../utils/hooks'; import {getTopNodesByMemoryColumns} from '../../../../Nodes/getNodesColumns'; - import {TenantTabsGroups, getTenantPath} from '../../../TenantPages'; - import {TenantOverviewTableLayout} from '../TenantOverviewTableLayout'; import {getSectionTitle} from '../getSectionTitle'; import i18n from '../i18n'; @@ -38,8 +36,8 @@ export function TopNodesByMemory({path, additionalNodesProps}: TopNodesByMemoryP getNodeRef: additionalNodesProps?.getNodeRef, }); - const fetchNodes = useCallback( - (isBackground) => { + const fetchNodes = React.useCallback( + (isBackground: boolean) => { if (!isBackground) { dispatch(setDataWasNotLoaded()); } diff --git a/src/containers/Tenant/Diagnostics/TenantOverview/TenantOverview.scss b/src/containers/Tenant/Diagnostics/TenantOverview/TenantOverview.scss index 3057e13033..ae2339b8c7 100644 --- a/src/containers/Tenant/Diagnostics/TenantOverview/TenantOverview.scss +++ b/src/containers/Tenant/Diagnostics/TenantOverview/TenantOverview.scss @@ -19,19 +19,20 @@ &__top { display: flex; align-items: center; + gap: 4px; margin-bottom: 10px; line-height: 24px; - gap: 4px; } &__top-label { + gap: 10px; + margin-bottom: var(--diagnostics-section-title-margin); font-weight: 600; line-height: 24px; - gap: 10px; } &__info { diff --git a/src/containers/Tenant/Diagnostics/TenantOverview/TenantOverview.tsx b/src/containers/Tenant/Diagnostics/TenantOverview/TenantOverview.tsx index 0b8934a51c..2f58c2824f 100644 --- a/src/containers/Tenant/Diagnostics/TenantOverview/TenantOverview.tsx +++ b/src/containers/Tenant/Diagnostics/TenantOverview/TenantOverview.tsx @@ -1,25 +1,27 @@ -import {useCallback} from 'react'; +import React from 'react'; import {Loader} from '@gravity-ui/uikit'; import {EntityStatus} from '../../../../components/EntityStatus/EntityStatus'; -import {TENANT_DEFAULT_TITLE} from '../../../../utils/constants'; import {TENANT_METRICS_TABS_IDS} from '../../../../store/reducers/tenant/constants'; -import {mapDatabaseTypeToDBName} from '../../utils/schema'; -import {useAutofetcher, useTypedSelector, useTypedDispatch} from '../../../../utils/hooks'; -import type {AdditionalNodesProps, AdditionalTenantsProps} from '../../../../types/additionalProps'; import {getTenantInfo, setDataWasNotLoaded} from '../../../../store/reducers/tenant/tenant'; import {calculateTenantMetrics} from '../../../../store/reducers/tenants/utils'; -import {TenantCpu} from './TenantCpu/TenantCpu'; +import type {AdditionalNodesProps, AdditionalTenantsProps} from '../../../../types/additionalProps'; +import {TENANT_DEFAULT_TITLE} from '../../../../utils/constants'; +import {useAutofetcher, useTypedDispatch, useTypedSelector} from '../../../../utils/hooks'; +import {mapDatabaseTypeToDBName} from '../../utils/schema'; + +import {DefaultOverviewContent} from './DefaultOverviewContent/DefaultOverviewContent'; import {HealthcheckDetails} from './Healthcheck/HealthcheckDetails'; -import {MetricsCards, type TenantMetrics} from './MetricsCards/MetricsCards'; -import {TenantStorage} from './TenantStorage/TenantStorage'; +import {MetricsCards} from './MetricsCards/MetricsCards'; +import type {TenantMetrics} from './MetricsCards/MetricsCards'; +import {TenantCpu} from './TenantCpu/TenantCpu'; import {TenantMemory} from './TenantMemory/TenantMemory'; -import {DefaultOverviewContent} from './DefaultOverviewContent/DefaultOverviewContent'; +import {TenantStorage} from './TenantStorage/TenantStorage'; import {useHealthcheck} from './useHealthcheck'; +import {b} from './utils'; import './TenantOverview.scss'; -import {b} from './utils'; interface TenantOverviewProps { tenantName: string; @@ -52,7 +54,7 @@ export function TenantOverview({ error: healthcheckError, } = useHealthcheck(tenantName); - const fetchTenant = useCallback( + const fetchTenant = React.useCallback( (isBackground = true) => { if (!isBackground) { dispatch(setDataWasNotLoaded()); diff --git a/src/containers/Tenant/Diagnostics/TenantOverview/TenantOverviewTableLayout.tsx b/src/containers/Tenant/Diagnostics/TenantOverview/TenantOverviewTableLayout.tsx index 9b7473397c..994789bdc3 100644 --- a/src/containers/Tenant/Diagnostics/TenantOverview/TenantOverviewTableLayout.tsx +++ b/src/containers/Tenant/Diagnostics/TenantOverview/TenantOverviewTableLayout.tsx @@ -1,19 +1,20 @@ -import type {ReactNode} from 'react'; +import React from 'react'; import DataTable from '@gravity-ui/react-data-table'; import type {DataTableProps} from '@gravity-ui/react-data-table'; +import {ResponseError} from '../../../../components/Errors/ResponseError'; +import {TableSkeleton} from '../../../../components/TableSkeleton/TableSkeleton'; +import type {IResponseError} from '../../../../types/api/error'; import { TENANT_OVERVIEW_TABLES_LIMIT, TENANT_OVERVIEW_TABLES_SETTINGS, } from '../../../../utils/constants'; -import type {IResponseError} from '../../../../types/api/error'; -import {TableSkeleton} from '../../../../components/TableSkeleton/TableSkeleton'; -import {ResponseError} from '../../../../components/Errors/ResponseError'; + import {b} from './utils'; interface TenantOverviewTableLayoutProps extends Omit, 'theme'> { - title: ReactNode; + title: React.ReactNode; loading?: boolean; wasLoaded?: boolean; error?: IResponseError; @@ -44,9 +45,9 @@ export function TenantOverviewTableLayout({ ); }; return ( - <> +
{title}
{renderContent()}
- +
); } diff --git a/src/containers/Tenant/Diagnostics/TenantOverview/TenantStorage/TenantStorage.tsx b/src/containers/Tenant/Diagnostics/TenantOverview/TenantStorage/TenantStorage.tsx index 152d449f8f..3649d655c5 100644 --- a/src/containers/Tenant/Diagnostics/TenantOverview/TenantStorage/TenantStorage.tsx +++ b/src/containers/Tenant/Diagnostics/TenantOverview/TenantStorage/TenantStorage.tsx @@ -1,17 +1,18 @@ +import React from 'react'; + import InfoViewer from '../../../../../components/InfoViewer/InfoViewer'; -import {ProgressViewer} from '../../../../../components/ProgressViewer/ProgressViewer'; import {LabelWithPopover} from '../../../../../components/LabelWithPopover'; +import {ProgressViewer} from '../../../../../components/ProgressViewer/ProgressViewer'; import {formatStorageValues} from '../../../../../utils/dataFormatters/dataFormatters'; - import {TenantDashboard} from '../TenantDashboard/TenantDashboard'; +import i18n from '../i18n'; +import {b} from '../utils'; -import '../TenantOverview.scss'; - -import {storageDashboardConfig} from './storageDashboardConfig'; -import {TopTables} from './TopTables'; import {TopGroups} from './TopGroups'; -import {b} from '../utils'; -import i18n from '../i18n'; +import {TopTables} from './TopTables'; +import {storageDashboardConfig} from './storageDashboardConfig'; + +import '../TenantOverview.scss'; export interface TenantStorageMetrics { blobStorageUsed?: number; @@ -68,11 +69,11 @@ export function TenantStorage({tenantName, metrics}: TenantStorageProps) { ]; return ( - <> + - + ); } diff --git a/src/containers/Tenant/Diagnostics/TenantOverview/TenantStorage/TopGroups.tsx b/src/containers/Tenant/Diagnostics/TenantOverview/TenantStorage/TopGroups.tsx index 2fb05c4833..0f89150b2e 100644 --- a/src/containers/Tenant/Diagnostics/TenantOverview/TenantStorage/TopGroups.tsx +++ b/src/containers/Tenant/Diagnostics/TenantOverview/TenantStorage/TopGroups.tsx @@ -1,21 +1,19 @@ -import {useCallback} from 'react'; +import React from 'react'; +import {TENANT_DIAGNOSTICS_TABS_IDS} from '../../../../../store/reducers/tenant/constants'; +import { + getTopStorageGroups, + selectTopStorageGroups, + setDataWasNotLoaded, +} from '../../../../../store/reducers/tenantOverview/topStorageGroups/topStorageGroups'; import { useAutofetcher, useSearchQuery, useTypedDispatch, useTypedSelector, } from '../../../../../utils/hooks'; -import { - setDataWasNotLoaded, - getTopStorageGroups, - selectTopStorageGroups, -} from '../../../../../store/reducers/tenantOverview/topStorageGroups/topStorageGroups'; -import {TENANT_DIAGNOSTICS_TABS_IDS} from '../../../../../store/reducers/tenant/constants'; import {getStorageTopGroupsColumns} from '../../../../Storage/StorageGroups/getStorageGroupsColumns'; - import {TenantTabsGroups, getTenantPath} from '../../../TenantPages'; - import {TenantOverviewTableLayout} from '../TenantOverviewTableLayout'; import {getSectionTitle} from '../getSectionTitle'; import i18n from '../i18n'; @@ -35,7 +33,7 @@ export function TopGroups({tenant}: TopGroupsProps) { const columns = getStorageTopGroupsColumns(); - const fetchData = useCallback( + const fetchData = React.useCallback( (isBackground: boolean) => { if (!isBackground) { dispatch(setDataWasNotLoaded()); diff --git a/src/containers/Tenant/Diagnostics/TenantOverview/TenantStorage/TopTables.tsx b/src/containers/Tenant/Diagnostics/TenantOverview/TenantStorage/TopTables.tsx index 0b29e279e1..839fdf4c50 100644 --- a/src/containers/Tenant/Diagnostics/TenantOverview/TenantStorage/TopTables.tsx +++ b/src/containers/Tenant/Diagnostics/TenantOverview/TenantStorage/TopTables.tsx @@ -1,17 +1,16 @@ +import type {Column} from '@gravity-ui/react-data-table'; +import DataTable from '@gravity-ui/react-data-table'; import {useLocation} from 'react-router'; -import DataTable, {Column} from '@gravity-ui/react-data-table'; - -import {useAutofetcher, useTypedDispatch, useTypedSelector} from '../../../../../utils/hooks'; +import {CellWithPopover} from '../../../../../components/CellWithPopover/CellWithPopover'; +import {LinkToSchemaObject} from '../../../../../components/LinkToSchemaObject/LinkToSchemaObject'; import { fetchTopTables, setDataWasNotLoaded, } from '../../../../../store/reducers/tenantOverview/executeTopTables/executeTopTables'; import type {KeyValueRow} from '../../../../../types/api/query'; import {formatBytes, getSizeWithSignificantDigits} from '../../../../../utils/bytesParsers'; -import {LinkToSchemaObject} from '../../../../../components/LinkToSchemaObject/LinkToSchemaObject'; -import {CellWithPopover} from '../../../../../components/CellWithPopover/CellWithPopover'; - +import {useAutofetcher, useTypedDispatch, useTypedSelector} from '../../../../../utils/hooks'; import {TenantOverviewTableLayout} from '../TenantOverviewTableLayout'; import {getSectionTitle} from '../getSectionTitle'; import i18n from '../i18n'; diff --git a/src/containers/Tenant/Diagnostics/TenantOverview/getSectionTitle.tsx b/src/containers/Tenant/Diagnostics/TenantOverview/getSectionTitle.tsx index 2b96a0aa62..ab03f3ab7c 100644 --- a/src/containers/Tenant/Diagnostics/TenantOverview/getSectionTitle.tsx +++ b/src/containers/Tenant/Diagnostics/TenantOverview/getSectionTitle.tsx @@ -1,3 +1,5 @@ +import React from 'react'; + import {InternalLink} from '../../../../components/InternalLink/InternalLink'; import i18n from './i18n'; @@ -18,9 +20,9 @@ export const getSectionTitle = ({ }: GetSectionTitleParams) => { if (link) { return ( - <> + {prefix} {entity} {postfix} - + ); } diff --git a/src/containers/Tenant/Diagnostics/TenantOverview/i18n/index.ts b/src/containers/Tenant/Diagnostics/TenantOverview/i18n/index.ts index f2246dfd03..d4e3f1d3f8 100644 --- a/src/containers/Tenant/Diagnostics/TenantOverview/i18n/index.ts +++ b/src/containers/Tenant/Diagnostics/TenantOverview/i18n/index.ts @@ -1,9 +1,7 @@ -import {i18n, Lang} from '../../../../../utils/i18n'; +import {registerKeysets} from '../../../../../utils/i18n'; import en from './en.json'; const COMPONENT = 'ydb-diagnostics-tenant-overview'; -i18n.registerKeyset(Lang.En, COMPONENT, en); - -export default i18n.keyset(COMPONENT); +export default registerKeysets(COMPONENT, {en}); diff --git a/src/containers/Tenant/Diagnostics/TenantOverview/useHealthcheck.ts b/src/containers/Tenant/Diagnostics/TenantOverview/useHealthcheck.ts index 6961d8114a..be54290c06 100644 --- a/src/containers/Tenant/Diagnostics/TenantOverview/useHealthcheck.ts +++ b/src/containers/Tenant/Diagnostics/TenantOverview/useHealthcheck.ts @@ -1,4 +1,4 @@ -import {useCallback} from 'react'; +import React from 'react'; import { getHealthcheckInfo, @@ -7,9 +7,10 @@ import { setDataWasNotLoaded, } from '../../../../store/reducers/healthcheckInfo/healthcheckInfo'; import type {IssuesTree} from '../../../../store/reducers/healthcheckInfo/types'; -import {type StatusFlag, SelfCheckResult} from '../../../../types/api/healthcheck'; import type {IResponseError} from '../../../../types/api/error'; -import {useTypedSelector, useTypedDispatch} from '../../../../utils/hooks'; +import {SelfCheckResult} from '../../../../types/api/healthcheck'; +import type {StatusFlag} from '../../../../types/api/healthcheck'; +import {useTypedDispatch, useTypedSelector} from '../../../../utils/hooks'; interface HealthcheckParams { issueTrees: IssuesTree[]; @@ -29,7 +30,7 @@ export const useHealthcheck = (tenantName: string): HealthcheckParams => { const issuesStatistics = useTypedSelector(selectIssuesStatistics); const issueTrees = useTypedSelector(selectIssuesTrees); - const fetchHealthcheck = useCallback( + const fetchHealthcheck = React.useCallback( (isBackground = true) => { if (!isBackground) { dispatch(setDataWasNotLoaded()); diff --git a/src/containers/Tenant/Diagnostics/TopQueries/TopQueries.tsx b/src/containers/Tenant/Diagnostics/TopQueries/TopQueries.tsx index 940344d826..b676faf801 100644 --- a/src/containers/Tenant/Diagnostics/TopQueries/TopQueries.tsx +++ b/src/containers/Tenant/Diagnostics/TopQueries/TopQueries.tsx @@ -1,40 +1,39 @@ -import {useCallback, useEffect, useRef, useState} from 'react'; -import {useHistory, useLocation} from 'react-router'; -import cn from 'bem-cn-lite'; +import React from 'react'; import DataTable from '@gravity-ui/react-data-table'; import {Loader} from '@gravity-ui/uikit'; +import {useHistory, useLocation} from 'react-router'; -import {DateRange, DateRangeValues} from '../../../../components/DateRange'; +import type {DateRangeValues} from '../../../../components/DateRange'; +import {DateRange} from '../../../../components/DateRange'; import {Search} from '../../../../components/Search'; - +import {parseQuery} from '../../../../routes'; import {changeUserInput} from '../../../../store/reducers/executeQuery'; - -import type {EPathType} from '../../../../types/api/schema'; -import type {IQueryResult} from '../../../../types/store/query'; +import { + fetchTopQueries, + setTopQueriesFilters, + setTopQueriesState, +} from '../../../../store/reducers/executeTopQueries/executeTopQueries'; import type {ITopQueriesFilters} from '../../../../store/reducers/executeTopQueries/types'; - import { TENANT_PAGE, TENANT_PAGES_IDS, TENANT_QUERY_TABS_ID, } from '../../../../store/reducers/tenant/constants'; -import { - setTopQueriesFilters, - setTopQueriesState, - fetchTopQueries, -} from '../../../../store/reducers/executeTopQueries/executeTopQueries'; +import type {EPathType} from '../../../../types/api/schema'; +import type {IQueryResult} from '../../../../types/store/query'; +import {cn} from '../../../../utils/cn'; import {HOUR_IN_SECONDS} from '../../../../utils/constants'; +import {isSortableTopQueriesProperty} from '../../../../utils/diagnostics'; import {useAutofetcher, useTypedDispatch, useTypedSelector} from '../../../../utils/hooks'; import {prepareQueryError} from '../../../../utils/query'; -import {parseQuery} from '../../../../routes'; +import {TenantTabsGroups, getTenantPath} from '../../TenantPages'; import {QUERY_TABLE_SETTINGS} from '../../utils/constants'; -import {isSortableTopQueriesProperty} from '../../../../utils/diagnostics'; import {isColumnEntityType} from '../../utils/schema'; -import {TenantTabsGroups, getTenantPath} from '../../TenantPages'; -import {getTopQueriesColumns} from './getTopQueriesColumns'; +import {getTopQueriesColumns} from './getTopQueriesColumns'; import i18n from './i18n'; + import './TopQueries.scss'; const b = cn('kv-top-queries'); @@ -60,14 +59,14 @@ export const TopQueries = ({path, type}: TopQueriesProps) => { } = useTypedSelector((state) => state.executeTopQueries); const rawColumns = getTopQueriesColumns(); - const preventFetch = useRef(false); + const preventFetch = React.useRef(false); // some filters sync between redux state and URL // component state is for default values, // default values are determined from the query response, and should not propagate to URL - const [filters, setFilters] = useState(storeFilters); + const [filters, setFilters] = React.useState(storeFilters); - useEffect(() => { + React.useEffect(() => { dispatch(setTopQueriesFilters(filters)); }, [dispatch, filters]); @@ -124,8 +123,8 @@ export const TopQueries = ({path, type}: TopQueriesProps) => { autorefresh, ); - const handleRowClick = useCallback( - (row) => { + const handleRowClick = React.useCallback( + (row: any) => { const {QueryText: input} = row; dispatch(changeUserInput({input})); diff --git a/src/containers/Tenant/Diagnostics/TopQueries/getTopQueriesColumns.tsx b/src/containers/Tenant/Diagnostics/TopQueries/getTopQueriesColumns.tsx index da8839b81d..e6edebdf83 100644 --- a/src/containers/Tenant/Diagnostics/TopQueries/getTopQueriesColumns.tsx +++ b/src/containers/Tenant/Diagnostics/TopQueries/getTopQueriesColumns.tsx @@ -1,14 +1,14 @@ -import cn from 'bem-cn-lite'; +import DataTable from '@gravity-ui/react-data-table'; +import type {Column} from '@gravity-ui/react-data-table'; -import DataTable, {type Column} from '@gravity-ui/react-data-table'; - -import type {KeyValueRow} from '../../../../types/api/query'; -import {formatDateTime, formatNumber} from '../../../../utils/dataFormatters/dataFormatters'; -import {generateHash} from '../../../../utils/generateHash'; import { - TruncatedQuery, OneLineQueryWithPopover, + TruncatedQuery, } from '../../../../components/TruncatedQuery/TruncatedQuery'; +import type {KeyValueRow} from '../../../../types/api/query'; +import {cn} from '../../../../utils/cn'; +import {formatDateTime, formatNumber} from '../../../../utils/dataFormatters/dataFormatters'; +import {generateHash} from '../../../../utils/generateHash'; import {parseUsToMs} from '../../../../utils/timeParsers'; import {MAX_QUERY_HEIGHT} from '../../utils/constants'; diff --git a/src/containers/Tenant/Diagnostics/TopQueries/i18n/index.ts b/src/containers/Tenant/Diagnostics/TopQueries/i18n/index.ts index 47b8659112..d4b0035c79 100644 --- a/src/containers/Tenant/Diagnostics/TopQueries/i18n/index.ts +++ b/src/containers/Tenant/Diagnostics/TopQueries/i18n/index.ts @@ -1,11 +1,8 @@ -import {i18n, Lang} from '../../../../../utils/i18n'; +import {registerKeysets} from '../../../../../utils/i18n'; import en from './en.json'; import ru from './ru.json'; const COMPONENT = 'ydb-diagnostics-top-queries'; -i18n.registerKeyset(Lang.En, COMPONENT, en); -i18n.registerKeyset(Lang.Ru, COMPONENT, ru); - -export default i18n.keyset(COMPONENT); +export default registerKeysets(COMPONENT, {ru, en}); diff --git a/src/containers/Tenant/Diagnostics/TopShards/Filters/Filters.tsx b/src/containers/Tenant/Diagnostics/TopShards/Filters/Filters.tsx index 85f3b4a80a..c24fb3e096 100644 --- a/src/containers/Tenant/Diagnostics/TopShards/Filters/Filters.tsx +++ b/src/containers/Tenant/Diagnostics/TopShards/Filters/Filters.tsx @@ -1,16 +1,12 @@ import {RadioButton} from '@gravity-ui/uikit'; -import {DateRange, DateRangeValues} from '../../../../../components/DateRange'; - -import { - EShardsWorkloadMode, - type IShardsWorkloadFilters, -} from '../../../../../store/reducers/shardsWorkload/types'; - +import type {DateRangeValues} from '../../../../../components/DateRange'; +import {DateRange} from '../../../../../components/DateRange'; +import {EShardsWorkloadMode} from '../../../../../store/reducers/shardsWorkload/types'; +import type {IShardsWorkloadFilters} from '../../../../../store/reducers/shardsWorkload/types'; import {isEnumMember} from '../../../../../utils/typecheckers'; - -import i18n from '../i18n'; import {b} from '../TopShards'; +import i18n from '../i18n'; import './Filters.scss'; diff --git a/src/containers/Tenant/Diagnostics/TopShards/TopShards.tsx b/src/containers/Tenant/Diagnostics/TopShards/TopShards.tsx index 57f11a8db6..d7be4c0fa6 100644 --- a/src/containers/Tenant/Diagnostics/TopShards/TopShards.tsx +++ b/src/containers/Tenant/Diagnostics/TopShards/TopShards.tsx @@ -1,34 +1,31 @@ -import {useState, useEffect, useMemo} from 'react'; -import cn from 'bem-cn-lite'; -import {useLocation} from 'react-router'; +import React from 'react'; -import DataTable, {Column, Settings, SortOrder} from '@gravity-ui/react-data-table'; +import type {Column, Settings, SortOrder} from '@gravity-ui/react-data-table'; +import DataTable from '@gravity-ui/react-data-table'; import {Loader} from '@gravity-ui/uikit'; +import {useLocation} from 'react-router'; import { sendShardQuery, - setShardsState, setShardsQueryFilters, + setShardsState, } from '../../../../store/reducers/shardsWorkload/shardsWorkload'; -import { - EShardsWorkloadMode, - type IShardsWorkloadFilters, -} from '../../../../store/reducers/shardsWorkload/types'; - -import type {EPathType} from '../../../../types/api/schema'; +import {EShardsWorkloadMode} from '../../../../store/reducers/shardsWorkload/types'; +import type {IShardsWorkloadFilters} from '../../../../store/reducers/shardsWorkload/types'; import type {CellValue, KeyValueRow} from '../../../../types/api/query'; - -import {formatDateTime} from '../../../../utils/dataFormatters/dataFormatters'; +import type {EPathType} from '../../../../types/api/schema'; +import {cn} from '../../../../utils/cn'; import {DEFAULT_TABLE_SETTINGS, HOUR_IN_SECONDS} from '../../../../utils/constants'; +import {formatDateTime} from '../../../../utils/dataFormatters/dataFormatters'; +import {isSortableTopShardsProperty} from '../../../../utils/diagnostics'; import {useAutofetcher, useTypedDispatch, useTypedSelector} from '../../../../utils/hooks'; import {prepareQueryError} from '../../../../utils/query'; -import {isSortableTopShardsProperty} from '../../../../utils/diagnostics'; import {isColumnEntityType} from '../../utils/schema'; import {Filters} from './Filters'; import {getShardsWorkloadColumns} from './getTopShardsColumns'; - import i18n from './i18n'; + import './TopShards.scss'; export const b = cn('top-shards'); @@ -109,7 +106,7 @@ export const TopShards = ({tenantPath, type}: TopShardsProps) => { // default filters shouldn't propagate into URL until user interacts with the control // redux initial value can't be used, as it synchronizes with URL - const [filters, setFilters] = useState(() => { + const [filters, setFilters] = React.useState(() => { const defaultValue = {...storeFilters}; if (!defaultValue.mode) { @@ -123,7 +120,7 @@ export const TopShards = ({tenantPath, type}: TopShardsProps) => { return defaultValue; }); - const [sortOrder, setSortOrder] = useState(tableColumnsNames.CPUCores); + const [sortOrder, setSortOrder] = React.useState(tableColumnsNames.CPUCores); useAutofetcher( () => { @@ -141,7 +138,7 @@ export const TopShards = ({tenantPath, type}: TopShardsProps) => { ); // don't show loader for requests triggered by table sort, only for path change - useEffect(() => { + React.useEffect(() => { dispatch( setShardsState({ wasLoaded: false, @@ -178,7 +175,7 @@ export const TopShards = ({tenantPath, type}: TopShardsProps) => { setFilters((state) => ({...state, ...newStateValue})); }; - const tableColumns = useMemo(() => { + const tableColumns = React.useMemo(() => { const rawColumns: Column[] = getShardsWorkloadColumns(tenantPath, location); const columns: Column[] = rawColumns.map((column) => ({ diff --git a/src/containers/Tenant/Diagnostics/TopShards/getTopShardsColumns.tsx b/src/containers/Tenant/Diagnostics/TopShards/getTopShardsColumns.tsx index 277f7eb63d..dac7a58ef1 100644 --- a/src/containers/Tenant/Diagnostics/TopShards/getTopShardsColumns.tsx +++ b/src/containers/Tenant/Diagnostics/TopShards/getTopShardsColumns.tsx @@ -1,16 +1,16 @@ +import DataTable from '@gravity-ui/react-data-table'; +import type {Column} from '@gravity-ui/react-data-table'; import type {Location} from 'history'; -import DataTable, {type Column} from '@gravity-ui/react-data-table'; - +import {InternalLink} from '../../../../components/InternalLink'; +import {LinkToSchemaObject} from '../../../../components/LinkToSchemaObject/LinkToSchemaObject'; +import {UsageLabel} from '../../../../components/UsageLabel/UsageLabel'; +import routes, {createHref} from '../../../../routes'; +import {getLoadSeverityForShard} from '../../../../store/reducers/tenantOverview/topShards/utils'; import type {KeyValueRow} from '../../../../types/api/query'; import type {ValueOf} from '../../../../types/common'; import {formatNumber, roundToPrecision} from '../../../../utils/dataFormatters/dataFormatters'; -import {getLoadSeverityForShard} from '../../../../store/reducers/tenantOverview/topShards/utils'; -import {InternalLink} from '../../../../components/InternalLink'; -import routes, {createHref} from '../../../../routes'; import {getDefaultNodePath} from '../../../Node/NodePages'; -import {UsageLabel} from '../../../../components/UsageLabel/UsageLabel'; -import {LinkToSchemaObject} from '../../../../components/LinkToSchemaObject/LinkToSchemaObject'; const TOP_SHARDS_COLUMNS_IDS = { TabletId: 'TabletId', diff --git a/src/containers/Tenant/Diagnostics/TopShards/i18n/index.ts b/src/containers/Tenant/Diagnostics/TopShards/i18n/index.ts index f54a401961..d67b3a49c9 100644 --- a/src/containers/Tenant/Diagnostics/TopShards/i18n/index.ts +++ b/src/containers/Tenant/Diagnostics/TopShards/i18n/index.ts @@ -1,11 +1,8 @@ -import {i18n, Lang} from '../../../../../utils/i18n'; +import {registerKeysets} from '../../../../../utils/i18n'; import en from './en.json'; import ru from './ru.json'; const COMPONENT = 'ydb-diagnostics-top-shards'; -i18n.registerKeyset(Lang.En, COMPONENT, en); -i18n.registerKeyset(Lang.Ru, COMPONENT, ru); - -export default i18n.keyset(COMPONENT); +export default registerKeysets(COMPONENT, {ru, en}); diff --git a/src/containers/Tenant/Info/ExternalDataSource/ExternalDataSource.tsx b/src/containers/Tenant/Info/ExternalDataSource/ExternalDataSource.tsx index becfecdd45..3dbb3a519b 100644 --- a/src/containers/Tenant/Info/ExternalDataSource/ExternalDataSource.tsx +++ b/src/containers/Tenant/Info/ExternalDataSource/ExternalDataSource.tsx @@ -1,19 +1,17 @@ -import block from 'bem-cn-lite'; - -import type {TEvDescribeSchemeResult} from '../../../../types/api/schema'; -import {useTypedSelector} from '../../../../utils/hooks'; - -import {InfoViewer, InfoViewerItem} from '../../../../components/InfoViewer'; -import {formatCommonItem} from '../../../../components/InfoViewer/formatters'; import {EntityStatus} from '../../../../components/EntityStatus/EntityStatus'; import {ResponseError} from '../../../../components/Errors/ResponseError'; - +import type {InfoViewerItem} from '../../../../components/InfoViewer'; +import {InfoViewer} from '../../../../components/InfoViewer'; +import {formatCommonItem} from '../../../../components/InfoViewer/formatters'; +import type {TEvDescribeSchemeResult} from '../../../../types/api/schema'; +import {cn} from '../../../../utils/cn'; +import {useTypedSelector} from '../../../../utils/hooks'; import {getEntityName} from '../../utils'; - import i18n from '../i18n'; + import './ExternalDataSource.scss'; -const b = block('ydb-external-data-source-info'); +const b = cn('ydb-external-data-source-info'); const prepareExternalDataSourceSummary = (data: TEvDescribeSchemeResult): InfoViewerItem[] => { return [ diff --git a/src/containers/Tenant/Info/ExternalTable/ExternalTable.tsx b/src/containers/Tenant/Info/ExternalTable/ExternalTable.tsx index cc9ff47fd7..a7242aa578 100644 --- a/src/containers/Tenant/Info/ExternalTable/ExternalTable.tsx +++ b/src/containers/Tenant/Info/ExternalTable/ExternalTable.tsx @@ -1,21 +1,21 @@ import {useLocation} from 'react-router'; -import block from 'bem-cn-lite'; -import type {TEvDescribeSchemeResult} from '../../../../types/api/schema'; -import {useTypedSelector} from '../../../../utils/hooks'; -import {createExternalUILink, parseQuery} from '../../../../routes'; -import {formatCommonItem} from '../../../../components/InfoViewer/formatters'; -import {InfoViewer, InfoViewerItem} from '../../../../components/InfoViewer'; -import {LinkWithIcon} from '../../../../components/LinkWithIcon/LinkWithIcon'; import {EntityStatus} from '../../../../components/EntityStatus/EntityStatus'; import {ResponseError} from '../../../../components/Errors/ResponseError'; - +import type {InfoViewerItem} from '../../../../components/InfoViewer'; +import {InfoViewer} from '../../../../components/InfoViewer'; +import {formatCommonItem} from '../../../../components/InfoViewer/formatters'; +import {LinkWithIcon} from '../../../../components/LinkWithIcon/LinkWithIcon'; +import {createExternalUILink, parseQuery} from '../../../../routes'; +import type {TEvDescribeSchemeResult} from '../../../../types/api/schema'; +import {cn} from '../../../../utils/cn'; +import {useTypedSelector} from '../../../../utils/hooks'; import {getEntityName} from '../../utils'; - import i18n from '../i18n'; + import './ExternalTable.scss'; -const b = block('ydb-external-table-info'); +const b = cn('ydb-external-table-info'); const prepareExternalTableSummary = ( data: TEvDescribeSchemeResult, diff --git a/src/containers/Tenant/Info/i18n/index.ts b/src/containers/Tenant/Info/i18n/index.ts index b45f2f4672..eedac2f26d 100644 --- a/src/containers/Tenant/Info/i18n/index.ts +++ b/src/containers/Tenant/Info/i18n/index.ts @@ -1,11 +1,8 @@ -import {i18n, Lang} from '../../../../utils/i18n'; +import {registerKeysets} from '../../../../utils/i18n'; import en from './en.json'; import ru from './ru.json'; const COMPONENT = 'ydb-tenant-objects-info'; -i18n.registerKeyset(Lang.En, COMPONENT, en); -i18n.registerKeyset(Lang.Ru, COMPONENT, ru); - -export default i18n.keyset(COMPONENT); +export default registerKeysets(COMPONENT, {ru, en}); diff --git a/src/containers/Tenant/ObjectGeneral/ObjectGeneral.tsx b/src/containers/Tenant/ObjectGeneral/ObjectGeneral.tsx index b64e6dc349..2067dc33a5 100644 --- a/src/containers/Tenant/ObjectGeneral/ObjectGeneral.tsx +++ b/src/containers/Tenant/ObjectGeneral/ObjectGeneral.tsx @@ -1,17 +1,15 @@ -import {useLocation} from 'react-router'; -import cn from 'bem-cn-lite'; - import {useThemeValue} from '@gravity-ui/uikit'; +import {useLocation} from 'react-router'; -import type {EPathType} from '../../../types/api/schema'; -import type {AdditionalTenantsProps, AdditionalNodesProps} from '../../../types/additionalProps'; +import {parseQuery} from '../../../routes'; import {TENANT_PAGES_IDS} from '../../../store/reducers/tenant/constants'; -import {useSetting} from '../../../utils/hooks'; +import type {AdditionalNodesProps, AdditionalTenantsProps} from '../../../types/additionalProps'; +import type {EPathType} from '../../../types/api/schema'; +import {cn} from '../../../utils/cn'; import {TENANT_INITIAL_PAGE_KEY} from '../../../utils/constants'; -import {parseQuery} from '../../../routes'; - -import {Query} from '../Query/Query'; +import {useSetting} from '../../../utils/hooks'; import Diagnostics from '../Diagnostics/Diagnostics'; +import {Query} from '../Query/Query'; import './ObjectGeneral.scss'; diff --git a/src/containers/Tenant/ObjectSummary/ObjectSummary.tsx b/src/containers/Tenant/ObjectSummary/ObjectSummary.tsx index fbe53230d9..b7c21eb5b9 100644 --- a/src/containers/Tenant/ObjectSummary/ObjectSummary.tsx +++ b/src/containers/Tenant/ObjectSummary/ObjectSummary.tsx @@ -1,10 +1,11 @@ +import React from 'react'; + import {HelpPopover} from '@gravity-ui/components'; import {Button, Tabs} from '@gravity-ui/uikit'; -import cn from 'bem-cn-lite'; import qs from 'qs'; -import React, {ReactNode, useEffect, useReducer} from 'react'; import {useLocation} from 'react-router'; import {Link} from 'react-router-dom'; + import {ClipboardButton} from '../../../components/ClipboardButton'; import {Icon} from '../../../components/Icon'; import InfoViewer from '../../../components/InfoViewer/InfoViewer'; @@ -22,12 +23,13 @@ import { TENANT_SUMMARY_TABS_IDS, } from '../../../store/reducers/tenant/constants'; import {setQueryTab, setSummaryTab, setTenantPage} from '../../../store/reducers/tenant/tenant'; -import { +import type { EPathSubType, - EPathType, TColumnDescription, TColumnTableDescription, } from '../../../types/api/schema'; +import {EPathType} from '../../../types/api/schema'; +import {cn} from '../../../utils/cn'; import { DEFAULT_IS_TENANT_COMMON_INFO_COLLAPSED, DEFAULT_SIZE_TENANT_SUMMARY_KEY, @@ -35,18 +37,19 @@ import { import {formatDateTime} from '../../../utils/dataFormatters/dataFormatters'; import {useTypedDispatch, useTypedSelector} from '../../../utils/hooks'; import {Acl} from '../Acl/Acl'; -import i18n from '../i18n'; import {ExternalDataSourceSummary} from '../Info/ExternalDataSource/ExternalDataSource'; import {ExternalTableSummary} from '../Info/ExternalTable/ExternalTable'; import {SchemaTree} from '../Schema/SchemaTree/SchemaTree'; import {SchemaViewer} from '../Schema/SchemaViewer/SchemaViewer'; -import {TenantTabsGroups, TENANT_INFO_TABS, TENANT_SCHEMA_TAB} from '../TenantPages'; +import {TENANT_INFO_TABS, TENANT_SCHEMA_TAB, TenantTabsGroups} from '../TenantPages'; +import i18n from '../i18n'; import { PaneVisibilityActionTypes, PaneVisibilityToggleButtons, paneVisibilityToggleReducerCreator, } from '../utils/paneVisibilityToggleHelpers'; import {isColumnEntityType, isExternalTable, isIndexTable, isTableType} from '../utils/schema'; + import './ObjectSummary.scss'; const b = cn('object-summary'); @@ -100,7 +103,7 @@ export function ObjectSummary({ isCollapsed, }: ObjectSummaryProps) { const dispatch = useTypedDispatch(); - const [commonInfoVisibilityState, dispatchCommonInfoVisibilityState] = useReducer( + const [commonInfoVisibilityState, dispatchCommonInfoVisibilityState] = React.useReducer( paneVisibilityToggleReducerCreator(DEFAULT_IS_TENANT_COMMON_INFO_COLLAPSED), undefined, getTenantCommonInfoState, @@ -142,7 +145,7 @@ export function ObjectSummary({ columns = currentObjectData?.PathDescription?.Table?.Columns; } - useEffect(() => { + React.useEffect(() => { const isTable = isTableType(type); if (type && !isTable && !TENANT_INFO_TABS.find((el) => el.id === summaryTab)) { @@ -181,7 +184,7 @@ export function ObjectSummary({ const renderObjectOverview = () => { // verbose mapping to guarantee a correct render for new path types // TS will error when a new type is added but not mapped here - const pathTypeToComponent: Record ReactNode) | undefined> = { + const pathTypeToComponent: Record React.ReactNode) | undefined> = { [EPathType.EPathTypeInvalid]: undefined, [EPathType.EPathTypeDir]: undefined, [EPathType.EPathTypeTable]: undefined, diff --git a/src/containers/Tenant/Query/ExecuteResult/ExecuteResult.tsx b/src/containers/Tenant/Query/ExecuteResult/ExecuteResult.tsx index e496afcb68..a521f936d4 100644 --- a/src/containers/Tenant/Query/ExecuteResult/ExecuteResult.tsx +++ b/src/containers/Tenant/Query/ExecuteResult/ExecuteResult.tsx @@ -1,7 +1,8 @@ +import React from 'react'; + import {RadioButton, Tabs} from '@gravity-ui/uikit'; -import cn from 'bem-cn-lite'; -import React, {useEffect, useState} from 'react'; import JSONTree from 'react-json-inspector'; + import {ClipboardButton} from '../../../../components/ClipboardButton'; import Divider from '../../../../components/Divider/Divider'; import EnableFullscreenButton from '../../../../components/EnableFullscreenButton/EnableFullscreenButton'; @@ -13,12 +14,14 @@ import type {ColumnType, KeyValueRow} from '../../../../types/api/query'; import type {ValueOf} from '../../../../types/common'; import type {IQueryResult, QueryErrorResponse} from '../../../../types/store/query'; import {getArray} from '../../../../utils'; +import {cn} from '../../../../utils/cn'; import {useTypedDispatch, useTypedSelector} from '../../../../utils/hooks'; import {prepareQueryError} from '../../../../utils/query'; import {PaneVisibilityToggleButtons} from '../../utils/paneVisibilityToggleHelpers'; import {ResultIssues} from '../Issues/Issues'; import {QueryDuration} from '../QueryDuration/QueryDuration'; import {getPreparedResult} from '../utils/getPreparedResult'; + import './ExecuteResult.scss'; const b = cn('ydb-query-execute-result'); @@ -52,8 +55,8 @@ export function ExecuteResult({ onCollapseResults, onExpandResults, }: ExecuteResultProps) { - const [selectedResultSet, setSelectedResultSet] = useState(0); - const [activeSection, setActiveSection] = useState(resultOptionsIds.result); + const [selectedResultSet, setSelectedResultSet] = React.useState(0); + const [activeSection, setActiveSection] = React.useState(resultOptionsIds.result); const isFullscreen = useTypedSelector((state) => state.fullscreen); const dispatch = useTypedDispatch(); @@ -65,7 +68,7 @@ export function ExecuteResult({ const textResults = getPreparedResult(currentResult); const copyDisabled = !textResults.length; - useEffect(() => { + React.useEffect(() => { return () => { dispatch(disableFullscreen()); }; @@ -84,7 +87,7 @@ export function ExecuteResult({ const renderContent = () => { return ( - <> + {isMulti && resultsSetsCount > 1 && (
{renderResultTable(currentResult, currentColumns)}
- +
); }; diff --git a/src/containers/Tenant/Query/ExplainResult/ExplainResult.js b/src/containers/Tenant/Query/ExplainResult/ExplainResult.js index 2215587971..692e3808dc 100644 --- a/src/containers/Tenant/Query/ExplainResult/ExplainResult.js +++ b/src/containers/Tenant/Query/ExplainResult/ExplainResult.js @@ -1,28 +1,25 @@ -import React, {useEffect, useRef, useState} from 'react'; -import cn from 'bem-cn-lite'; -import {MonacoEditor} from '../../../../components/MonacoEditor/MonacoEditor'; -import JSONTree from 'react-json-inspector'; -import 'react-json-inspector/json-inspector.css'; +import React from 'react'; -import {TextOverflow, getYdbPlanNodeShape, getTopology} from '@gravity-ui/paranoid'; +import {TextOverflow, getTopology, getYdbPlanNodeShape} from '@gravity-ui/paranoid'; import {Loader, RadioButton} from '@gravity-ui/uikit'; +import JSONTree from 'react-json-inspector'; import Divider from '../../../../components/Divider/Divider'; import EnableFullscreenButton from '../../../../components/EnableFullscreenButton/EnableFullscreenButton'; import Fullscreen from '../../../../components/Fullscreen/Fullscreen'; +import {MonacoEditor} from '../../../../components/MonacoEditor/MonacoEditor'; import {QueryExecutionStatus} from '../../../../components/QueryExecutionStatus'; - import {explainVersions} from '../../../../store/reducers/explainQuery'; import {disableFullscreen} from '../../../../store/reducers/fullscreen'; - -import {LANGUAGE_S_EXPRESSION_ID} from '../../../../utils/monaco/s-expression/constants'; +import {cn} from '../../../../utils/cn'; import {useTypedDispatch, useTypedSelector} from '../../../../utils/hooks'; - +import {LANGUAGE_S_EXPRESSION_ID} from '../../../../utils/monaco/s-expression/constants'; import {PaneVisibilityToggleButtons} from '../../utils/paneVisibilityToggleHelpers'; -import {renderExplainNode} from './utils'; +import {getColors, renderExplainNode} from './utils'; import './ExplainResult.scss'; +import 'react-json-inspector/json-inspector.css'; const b = cn('ydb-query-explain-result'); @@ -49,30 +46,11 @@ const explainOptions = [ ]; function GraphRoot(props) { - const paranoid = useRef(); + const paranoid = React.useRef(); const {data, opts, shapes, theme} = props; - const [componentTheme, updateComponentTheme] = useState(theme); - - useEffect(() => { - updateComponentTheme(theme); - }, [theme]); - - const render = () => { - paranoid.current = getTopology('graphRoot', data, opts, shapes); - paranoid.current.render(); - }; - - useEffect(() => { - render(); - - return () => { - paranoid.current = undefined; - }; - }, []); - - useEffect(() => { + React.useEffect(() => { const graphRoot = document.getElementById('graphRoot'); if (!graphRoot) { @@ -81,10 +59,14 @@ function GraphRoot(props) { graphRoot.innerHTML = ''; - render(); - }, [componentTheme]); + paranoid.current = getTopology('graphRoot', data, {...opts, colors: getColors()}, shapes); + paranoid.current.render(); + return () => { + paranoid.current = undefined; + }; + }, [theme]); - useEffect(() => { + React.useEffect(() => { paranoid.current?.updateData?.(props.data); }, [props.data]); @@ -93,15 +75,15 @@ function GraphRoot(props) { export function ExplainResult(props) { const dispatch = useTypedDispatch(); - const [activeOption, setActiveOption] = useState(ExplainOptionIds.schema); + const [activeOption, setActiveOption] = React.useState(ExplainOptionIds.schema); const isFullscreen = useTypedSelector((state) => state.fullscreen); - useEffect(() => { + React.useEffect(() => { return () => { dispatch(disableFullscreen()); }; - }, []); + }, [dispatch]); const onSelectOption = (tabId) => { setActiveOption(tabId); @@ -162,8 +144,6 @@ export function ExplainResult(props) { value={props.ast} options={EDITOR_OPTIONS} wrappingIndent="indent" - // pass noop otherwise it will throw error - editorWillUnmount={() => {}} /> ); diff --git a/src/containers/Tenant/Query/ExplainResult/utils.ts b/src/containers/Tenant/Query/ExplainResult/utils.ts index 3056c39ad1..2bac451412 100644 --- a/src/containers/Tenant/Query/ExplainResult/utils.ts +++ b/src/containers/Tenant/Query/ExplainResult/utils.ts @@ -4,3 +4,44 @@ export const renderExplainNode = (node: GraphNode): string => { const parts = node.name.split('|'); return parts.length > 1 ? parts[1] : node.name; }; + +export function getColors() { + const colorsMap: Record = { + success: '--g-color-text-positive', + error: '--g-color-text-danger', + warning: '--g-color-text-warning', + errorBackground: '--g-color-base-danger-medium', + warningBackground: '--g-color-base-warning-medium', + mute: '--g-color-line-generic', + stroke: '--g-color-text-hint', + fill: '--g-color-base-generic-ultralight', + nodeFill: '--g-color-base-float', + nodeShadow: '--g-color-sfx-shadow', + titleColor: '--g-color-text-primary', + textColor: '--g-color-text-complementary', + buttonBorderColor: '--g-color-line-generic', + // groupBorderColor: '--g-color-celestial-thunder', + // groupFill: '--g-color-celestial', + titleHoverColor: '--g-color-text-link-hover', + nodeHover: '--g-color-base-float-hover', + specialHover: '--g-color-line-focus', + }; + + const style = getComputedStyle(document.body); + const colors = Object.keys(colorsMap).reduce( + (acc, key) => { + const color = style.getPropertyValue(colorsMap[key]).replace(/ /g, ''); + if (color) { + acc[key] = color; + } + return acc; + }, + {} as Record, + ); + + const getCommonColor = (name: string) => { + return style.getPropertyValue(`--g-color-${name}`).replace(/ /g, ''); + }; + + return {...colors, getCommonColor}; +} diff --git a/src/containers/Tenant/Query/Issues/Issues.tsx b/src/containers/Tenant/Query/Issues/Issues.tsx index 4b7d7426e6..38ba5af1e3 100644 --- a/src/containers/Tenant/Query/Issues/Issues.tsx +++ b/src/containers/Tenant/Query/Issues/Issues.tsx @@ -1,17 +1,19 @@ -import * as React from 'react'; -import cn from 'bem-cn-lite'; +import React from 'react'; -import {Button, Icon, ArrowToggle} from '@gravity-ui/uikit'; -import ShortyString from '../../../../components/ShortyString/ShortyString'; +import type {IconData} from '@gravity-ui/uikit'; +import {ArrowToggle, Button, Icon} from '@gravity-ui/uikit'; +import ShortyString from '../../../../components/ShortyString/ShortyString'; import type {ErrorResponse, IssueMessage} from '../../../../types/api/query'; +import {cn} from '../../../../utils/cn'; + +import type {SEVERITY} from './models'; +import {getSeverity} from './models'; -import fatalIcon from '../../../../assets/icons/circle-xmark.svg'; -import errorIcon from '../../../../assets/icons/triangle-exclamation.svg'; import warningIcon from '../../../../assets/icons/circle-exclamation.svg'; import infoIcon from '../../../../assets/icons/circle-info.svg'; - -import {SEVERITY, getSeverity} from './models'; +import fatalIcon from '../../../../assets/icons/circle-xmark.svg'; +import errorIcon from '../../../../assets/icons/triangle-exclamation.svg'; import './Issues.scss'; @@ -143,7 +145,7 @@ function IssueList(props: {issues: IssueMessage[]; expanded: boolean; level: num ); } -const severityIcons: Record = { +const severityIcons: Record = { S_INFO: infoIcon, S_WARNING: warningIcon, S_ERROR: errorIcon, diff --git a/src/containers/Tenant/Query/Issues/models.ts b/src/containers/Tenant/Query/Issues/models.ts index 93fc0a538c..cc61603d71 100644 --- a/src/containers/Tenant/Query/Issues/models.ts +++ b/src/containers/Tenant/Query/Issues/models.ts @@ -1,6 +1,6 @@ export const SEVERITY_LIST = ['S_FATAL', 'S_ERROR', 'S_WARNING', 'S_INFO'] as const; -export type SEVERITY = typeof SEVERITY_LIST[number]; +export type SEVERITY = (typeof SEVERITY_LIST)[number]; // Severity values from ydb/library/yql/public/issue/protos/issue_severity.proto // FATAL = 0; diff --git a/src/containers/Tenant/Query/Preview/Preview.tsx b/src/containers/Tenant/Query/Preview/Preview.tsx index 1d2ce248f4..949d208ed8 100644 --- a/src/containers/Tenant/Query/Preview/Preview.tsx +++ b/src/containers/Tenant/Query/Preview/Preview.tsx @@ -1,21 +1,18 @@ -import {useCallback} from 'react'; -import cn from 'bem-cn-lite'; +import React from 'react'; -import {Loader, Button} from '@gravity-ui/uikit'; +import {Button, Loader} from '@gravity-ui/uikit'; -import type {EPathType} from '../../../../types/api/schema'; +import EnableFullscreenButton from '../../../../components/EnableFullscreenButton/EnableFullscreenButton'; +import Fullscreen from '../../../../components/Fullscreen/Fullscreen'; +import {Icon} from '../../../../components/Icon'; +import {QueryResultTable} from '../../../../components/QueryResultTable'; import {sendQuery, setQueryOptions} from '../../../../store/reducers/preview'; import {setShowPreview} from '../../../../store/reducers/schema/schema'; -import {prepareQueryError} from '../../../../utils/query'; +import type {EPathType} from '../../../../types/api/schema'; +import {cn} from '../../../../utils/cn'; import {useAutofetcher, useTypedDispatch, useTypedSelector} from '../../../../utils/hooks'; - -import {Icon} from '../../../../components/Icon'; -import Fullscreen from '../../../../components/Fullscreen/Fullscreen'; -import {QueryResultTable} from '../../../../components/QueryResultTable'; -import EnableFullscreenButton from '../../../../components/EnableFullscreenButton/EnableFullscreenButton'; - +import {prepareQueryError} from '../../../../utils/query'; import {isExternalTable, isTableType} from '../../utils/schema'; - import i18n from '../i18n'; import './Preview.scss'; @@ -34,8 +31,8 @@ export const Preview = ({database, type}: PreviewProps) => { const {autorefresh, currentSchemaPath} = useTypedSelector((state) => state.schema); const isFullscreen = useTypedSelector((state) => state.fullscreen); - const sendQueryForPreview = useCallback( - (isBackground) => { + const sendQueryForPreview = React.useCallback( + (isBackground: boolean) => { if (!isTableType(type)) { return; } diff --git a/src/containers/Tenant/Query/QueriesHistory/QueriesHistory.tsx b/src/containers/Tenant/Query/QueriesHistory/QueriesHistory.tsx index 3fe44e1707..627e4cfa99 100644 --- a/src/containers/Tenant/Query/QueriesHistory/QueriesHistory.tsx +++ b/src/containers/Tenant/Query/QueriesHistory/QueriesHistory.tsx @@ -1,21 +1,20 @@ -import block from 'bem-cn-lite'; +import type {Column} from '@gravity-ui/react-data-table'; +import DataTable from '@gravity-ui/react-data-table'; -import DataTable, {Column} from '@gravity-ui/react-data-table'; - -import type {QueryInHistory} from '../../../../types/store/executeQuery'; import {TruncatedQuery} from '../../../../components/TruncatedQuery/TruncatedQuery'; -import {setQueryTab} from '../../../../store/reducers/tenant/tenant'; import {selectQueriesHistory} from '../../../../store/reducers/executeQuery'; import {TENANT_QUERY_TABS_ID} from '../../../../store/reducers/tenant/constants'; +import {setQueryTab} from '../../../../store/reducers/tenant/tenant'; +import type {QueryInHistory} from '../../../../types/store/executeQuery'; +import {cn} from '../../../../utils/cn'; import {useQueryModes, useTypedDispatch, useTypedSelector} from '../../../../utils/hooks'; import {QUERY_MODES, QUERY_SYNTAX} from '../../../../utils/query'; import {MAX_QUERY_HEIGHT, QUERY_TABLE_SETTINGS} from '../../utils/constants'; - import i18n from '../i18n'; import './QueriesHistory.scss'; -const b = block('ydb-queries-history'); +const b = cn('ydb-queries-history'); interface QueriesHistoryProps { changeUserInput: (value: {input: string}) => void; diff --git a/src/containers/Tenant/Query/Query.tsx b/src/containers/Tenant/Query/Query.tsx index 29835e839b..6d819309b9 100644 --- a/src/containers/Tenant/Query/Query.tsx +++ b/src/containers/Tenant/Query/Query.tsx @@ -1,22 +1,23 @@ import React from 'react'; + import {Helmet} from 'react-helmet-async'; -import block from 'bem-cn-lite'; -import type {EPathType} from '../../../types/api/schema'; -import type {SavedQuery} from '../../../types/store/query'; import {changeUserInput} from '../../../store/reducers/executeQuery'; import {TENANT_QUERY_TABS_ID} from '../../../store/reducers/tenant/constants'; -import {useSetting, useTypedDispatch, useTypedSelector} from '../../../utils/hooks'; +import type {EPathType} from '../../../types/api/schema'; +import type {SavedQuery} from '../../../types/store/query'; +import {cn} from '../../../utils/cn'; import {SAVED_QUERIES_KEY} from '../../../utils/constants'; +import {useSetting, useTypedDispatch, useTypedSelector} from '../../../utils/hooks'; -import {QueryTabs, queryEditorTabs} from './QueryTabs/QueryTabs'; -import {SavedQueries} from './SavedQueries/SavedQueries'; import QueriesHistory from './QueriesHistory/QueriesHistory'; import QueryEditor from './QueryEditor/QueryEditor'; +import {QueryTabs, queryEditorTabs} from './QueryTabs/QueryTabs'; +import {SavedQueries} from './SavedQueries/SavedQueries'; import './Query.scss'; -const b = block('ydb-query'); +const b = cn('ydb-query'); interface QueryProps { theme: string; diff --git a/src/containers/Tenant/Query/QueryDuration/QueryDuration.tsx b/src/containers/Tenant/Query/QueryDuration/QueryDuration.tsx index 1b067640fd..b459687ae6 100644 --- a/src/containers/Tenant/Query/QueryDuration/QueryDuration.tsx +++ b/src/containers/Tenant/Query/QueryDuration/QueryDuration.tsx @@ -1,8 +1,6 @@ -import block from 'bem-cn-lite'; - -import {formatDurationToShortTimeFormat, parseUsToMs} from '../../../../utils/timeParsers'; import {LabelWithPopover} from '../../../../components/LabelWithPopover'; - +import {cn} from '../../../../utils/cn'; +import {formatDurationToShortTimeFormat, parseUsToMs} from '../../../../utils/timeParsers'; import i18n from '../i18n'; import './QueryDuration.scss'; @@ -11,7 +9,7 @@ interface QueryDurationProps { duration?: string | number; } -const b = block('ydb-query-duration'); +const b = cn('ydb-query-duration'); export const QueryDuration = ({duration}: QueryDurationProps) => { if (!duration) { diff --git a/src/containers/Tenant/Query/QueryEditor/QueryEditor.tsx b/src/containers/Tenant/Query/QueryEditor/QueryEditor.tsx index 4f8b196302..e65e0116f7 100644 --- a/src/containers/Tenant/Query/QueryEditor/QueryEditor.tsx +++ b/src/containers/Tenant/Query/QueryEditor/QueryEditor.tsx @@ -1,52 +1,50 @@ -import {useEffect, useReducer, useRef, useState} from 'react'; -import {connect} from 'react-redux'; -import cn from 'bem-cn-lite'; +import React from 'react'; + import throttle from 'lodash/throttle'; -import {MonacoEditor} from '../../../../components/MonacoEditor/MonacoEditor'; import type Monaco from 'monaco-editor'; +import {connect} from 'react-redux'; +import {MonacoEditor} from '../../../../components/MonacoEditor/MonacoEditor'; import SplitPane from '../../../../components/SplitPane'; - +import type {RootState} from '../../../../store'; import { - sendExecuteQuery, - saveQueryToHistory, - goToPreviousQuery, goToNextQuery, + goToPreviousQuery, + saveQueryToHistory, + sendExecuteQuery, setTenantPath, } from '../../../../store/reducers/executeQuery'; import {getExplainQuery, getExplainQueryAst} from '../../../../store/reducers/explainQuery'; import {setShowPreview} from '../../../../store/reducers/schema/schema'; +import type {EPathType} from '../../../../types/api/schema'; +import type {ValueOf} from '../../../../types/common'; +import type {ExecuteQueryState} from '../../../../types/store/executeQuery'; +import type {ExplainQueryState} from '../../../../types/store/explainQuery'; +import type {QueryAction, QueryMode, SavedQuery} from '../../../../types/store/query'; +import {cn} from '../../../../utils/cn'; import { DEFAULT_IS_QUERY_RESULT_COLLAPSED, DEFAULT_SIZE_RESULT_PANE_KEY, - SAVED_QUERIES_KEY, LAST_USED_QUERY_ACTION_KEY, QUERY_USE_MULTI_SCHEMA_KEY, + SAVED_QUERIES_KEY, } from '../../../../utils/constants'; -import {useSetting, useQueryModes} from '../../../../utils/hooks'; +import {useQueryModes, useSetting} from '../../../../utils/hooks'; import {QUERY_ACTIONS} from '../../../../utils/query'; import {parseJson} from '../../../../utils/utils'; -import {useEditorOptions} from './helpers'; - +import type {InitialPaneState} from '../../utils/paneVisibilityToggleHelpers'; import { - InitialPaneState, PaneVisibilityActionTypes, paneVisibilityToggleReducerCreator, } from '../../utils/paneVisibilityToggleHelpers'; -import {Preview} from '../Preview/Preview'; - import {ExecuteResult} from '../ExecuteResult/ExecuteResult'; import {ExplainResult} from '../ExplainResult/ExplainResult'; +import {Preview} from '../Preview/Preview'; import {QueryEditorControls} from '../QueryEditorControls/QueryEditorControls'; - -import type {QueryAction, QueryMode, SavedQuery} from '../../../../types/store/query'; -import type {ExecuteQueryState} from '../../../../types/store/executeQuery'; -import type {ExplainQueryState} from '../../../../types/store/explainQuery'; -import type {ValueOf} from '../../../../types/common'; -import type {EPathType} from '../../../../types/api/schema'; -import type {RootState} from '../../../../store'; import i18n from '../i18n'; +import {useEditorOptions} from './helpers'; + import './QueryEditor.scss'; const CONTEXT_MENU_GROUP_ID = 'navigation'; @@ -99,20 +97,20 @@ function QueryEditor(props: QueryEditorProps) { } = props; const {tenantPath: savedPath} = executeQuery; - const [resultType, setResultType] = useState(RESULT_TYPES.EXECUTE); + const [resultType, setResultType] = React.useState(RESULT_TYPES.EXECUTE); - const [isResultLoaded, setIsResultLoaded] = useState(false); + const [isResultLoaded, setIsResultLoaded] = React.useState(false); const [queryMode, setQueryMode] = useQueryModes(); const [useMultiSchema] = useSetting(QUERY_USE_MULTI_SCHEMA_KEY); const [lastUsedQueryAction, setLastUsedQueryAction] = useSetting( LAST_USED_QUERY_ACTION_KEY, ); const [savedQueries, setSavedQueries] = useSetting(SAVED_QUERIES_KEY); - const [monacoHotKey, setMonacoHotKey] = useState | null>( - null, - ); + const [monacoHotKey, setMonacoHotKey] = React.useState | null>(null); - useEffect(() => { + React.useEffect(() => { if (savedPath !== path) { if (savedPath) { changeUserInput({input: ''}); @@ -121,14 +119,14 @@ function QueryEditor(props: QueryEditorProps) { } }, [changeUserInput, setPath, path, savedPath]); - const [resultVisibilityState, dispatchResultVisibilityState] = useReducer( + const [resultVisibilityState, dispatchResultVisibilityState] = React.useReducer( paneVisibilityToggleReducerCreator(DEFAULT_IS_QUERY_RESULT_COLLAPSED), initialTenantCommonInfoState, ); - const editorRef = useRef(); + const editorRef = React.useRef(); - useEffect(() => { + React.useEffect(() => { const updateEditor = () => { if (editorRef.current) { editorRef.current.layout(); @@ -147,7 +145,7 @@ function QueryEditor(props: QueryEditorProps) { }; }, []); - useEffect(() => { + React.useEffect(() => { const storageEventHandler = (event: StorageEvent) => { if (event.key === SAVED_QUERIES_KEY) { const v = parseJson(event.newValue); @@ -161,11 +159,11 @@ function QueryEditor(props: QueryEditorProps) { }; }, [setSavedQueries]); - useEffect(() => { + React.useEffect(() => { dispatchResultVisibilityState(PaneVisibilityActionTypes.triggerCollapse); }, []); - useEffect(() => { + React.useEffect(() => { if (props.showPreview || isResultLoaded) { dispatchResultVisibilityState(PaneVisibilityActionTypes.triggerExpand); } else { @@ -173,7 +171,7 @@ function QueryEditor(props: QueryEditorProps) { } }, [props.showPreview, isResultLoaded]); - useEffect(() => { + React.useEffect(() => { const {input, history} = executeQuery; const hasUnsavedInput = input @@ -240,7 +238,7 @@ function QueryEditor(props: QueryEditorProps) { dispatchResultVisibilityState(PaneVisibilityActionTypes.triggerExpand); }; - useEffect(() => { + React.useEffect(() => { if (monacoHotKey === null) { return; } @@ -293,7 +291,7 @@ function QueryEditor(props: QueryEditorProps) { run: () => setMonacoHotKey(MONACO_HOT_KEY_ACTIONS.sendQuery), }); - const canSendSelectedText = editor.createContextKey('canSendSelectedText', false); + const canSendSelectedText = editor.createContextKey('canSendSelectedText', false); editor.onDidChangeCursorSelection(({selection, secondarySelections}) => { const notEmpty = selection.selectionStartLineNumber !== selection.positionLineNumber || @@ -419,8 +417,6 @@ function QueryEditor(props: QueryEditorProps) { options={editorOptions} onChange={onChange} editorDidMount={editorDidMount} - // pass noop otherwise it will throw error - editorWillUnmount={() => {}} theme={`vs-${theme}`} /> diff --git a/src/containers/Tenant/Query/QueryEditor/helpers.ts b/src/containers/Tenant/Query/QueryEditor/helpers.ts index 9cc5a0234e..97dfdf774f 100644 --- a/src/containers/Tenant/Query/QueryEditor/helpers.ts +++ b/src/containers/Tenant/Query/QueryEditor/helpers.ts @@ -1,6 +1,8 @@ +import React from 'react'; + import type Monaco from 'monaco-editor'; + import {ENABLE_AUTOCOMPLETE, useSetting} from '../../../../lib'; -import {useMemo} from 'react'; export type EditorOptions = Monaco.editor.IEditorOptions & Monaco.editor.IGlobalEditorOptions; @@ -15,7 +17,7 @@ export const EDITOR_OPTIONS: EditorOptions = { export function useEditorOptions() { const [enableAutocomplete] = useSetting(ENABLE_AUTOCOMPLETE); - const options = useMemo(() => { + const options = React.useMemo(() => { const useAutocomplete = Boolean(enableAutocomplete); return { quickSuggestions: useAutocomplete, diff --git a/src/containers/Tenant/Query/QueryEditorControls/QueryEditorControls.scss b/src/containers/Tenant/Query/QueryEditorControls/QueryEditorControls.scss index cfc2187579..4241d69f95 100644 --- a/src/containers/Tenant/Query/QueryEditorControls/QueryEditorControls.scss +++ b/src/containers/Tenant/Query/QueryEditorControls/QueryEditorControls.scss @@ -3,12 +3,11 @@ flex: 0 0 40px; justify-content: space-between; align-items: flex-end; + gap: 24px; min-height: 40px; padding: 5px 0px; - gap: 24px; - &__left { display: flex; gap: 12px; diff --git a/src/containers/Tenant/Query/QueryEditorControls/QueryEditorControls.tsx b/src/containers/Tenant/Query/QueryEditorControls/QueryEditorControls.tsx index 2248fa0b25..5486de6a5b 100644 --- a/src/containers/Tenant/Query/QueryEditorControls/QueryEditorControls.tsx +++ b/src/containers/Tenant/Query/QueryEditorControls/QueryEditorControls.tsx @@ -1,15 +1,14 @@ -import block from 'bem-cn-lite'; +import React from 'react'; -import {Button, ButtonView, DropdownMenu} from '@gravity-ui/uikit'; -import {useMemo} from 'react'; +import type {ButtonView} from '@gravity-ui/uikit'; +import {Button, DropdownMenu} from '@gravity-ui/uikit'; -import type {QueryAction, QueryMode} from '../../../../types/store/query'; -import {QUERY_MODES, QUERY_MODES_TITLES} from '../../../../utils/query'; import {Icon} from '../../../../components/Icon'; import {LabelWithPopover} from '../../../../components/LabelWithPopover'; - +import type {QueryAction, QueryMode} from '../../../../types/store/query'; +import {cn} from '../../../../utils/cn'; +import {QUERY_MODES, QUERY_MODES_TITLES} from '../../../../utils/query'; import SaveQuery from '../SaveQuery/SaveQuery'; - import i18n from '../i18n'; import './QueryEditorControls.scss'; @@ -17,7 +16,7 @@ import './QueryEditorControls.scss'; const queryModeSelectorQa = 'query-mode-selector'; const queryModeSelectorPopupQa = 'query-mode-selector-popup'; -const b = block('ydb-query-editor-controls'); +const b = cn('ydb-query-editor-controls'); const QueryModeSelectorOptions = { [QUERY_MODES.script]: { @@ -67,7 +66,7 @@ export const QueryEditorControls = ({ queryMode, highlightedAction, }: QueryEditorControlsProps) => { - const querySelectorMenuItems = useMemo(() => { + const querySelectorMenuItems = React.useMemo(() => { return Object.entries(QueryModeSelectorOptions).map(([mode, {title, description}]) => { return { text: ( diff --git a/src/containers/Tenant/Query/QueryTabs/QueryTabs.tsx b/src/containers/Tenant/Query/QueryTabs/QueryTabs.tsx index 0e6a7eb991..047c81cd2d 100644 --- a/src/containers/Tenant/Query/QueryTabs/QueryTabs.tsx +++ b/src/containers/Tenant/Query/QueryTabs/QueryTabs.tsx @@ -1,14 +1,11 @@ -import {useLocation} from 'react-router'; - import {Tabs} from '@gravity-ui/uikit'; +import {useLocation} from 'react-router'; -import type {TenantQueryTab} from '../../../../store/reducers/tenant/types'; -import {TENANT_QUERY_TABS_ID} from '../../../../store/reducers/tenant/constants'; import {InternalLink} from '../../../../components/InternalLink/InternalLink'; import {parseQuery} from '../../../../routes'; - +import {TENANT_QUERY_TABS_ID} from '../../../../store/reducers/tenant/constants'; +import type {TenantQueryTab} from '../../../../store/reducers/tenant/types'; import {TenantTabsGroups, getTenantPath} from '../../TenantPages'; - import i18n from '../i18n'; const newQuery = { diff --git a/src/containers/Tenant/Query/SaveQuery/SaveQuery.js b/src/containers/Tenant/Query/SaveQuery/SaveQuery.js index 2a29762402..d0db3fa253 100644 --- a/src/containers/Tenant/Query/SaveQuery/SaveQuery.js +++ b/src/containers/Tenant/Query/SaveQuery/SaveQuery.js @@ -1,9 +1,10 @@ -import React, {useState} from 'react'; +import React from 'react'; + +import {Button, Dialog, DropdownMenu, TextInput} from '@gravity-ui/uikit'; import some from 'lodash/some'; -import cn from 'bem-cn-lite'; -import {Dialog, DropdownMenu, TextInput, Button} from '@gravity-ui/uikit'; import {setQueryNameToEdit} from '../../../../store/reducers/saveQuery'; +import {cn} from '../../../../utils/cn'; import {useTypedDispatch, useTypedSelector} from '../../../../utils/hooks'; import './SaveQuery.scss'; @@ -12,9 +13,9 @@ const b = cn('kv-save-query'); function SaveQuery({savedQueries, onSaveQuery, saveButtonDisabled}) { const singleClusterMode = useTypedSelector((state) => state.singleClusterMode); - const [isDialogVisible, setIsDialogVisible] = useState(false); - const [queryName, setQueryName] = useState(''); - const [validationError, setValidationError] = useState(null); + const [isDialogVisible, setIsDialogVisible] = React.useState(false); + const [queryName, setQueryName] = React.useState(''); + const [validationError, setValidationError] = React.useState(null); const queryNameToEdit = useTypedSelector((state) => state.saveQuery); const dispatch = useTypedDispatch(); diff --git a/src/containers/Tenant/Query/SavedQueries/SavedQueries.tsx b/src/containers/Tenant/Query/SavedQueries/SavedQueries.tsx index 6676beac6d..9d8adc1d6d 100644 --- a/src/containers/Tenant/Query/SavedQueries/SavedQueries.tsx +++ b/src/containers/Tenant/Query/SavedQueries/SavedQueries.tsx @@ -1,25 +1,23 @@ -import {MouseEvent, useState} from 'react'; -import block from 'bem-cn-lite'; +import React from 'react'; -import {Dialog, Button} from '@gravity-ui/uikit'; -import DataTable, {Column} from '@gravity-ui/react-data-table'; +import type {Column} from '@gravity-ui/react-data-table'; +import DataTable from '@gravity-ui/react-data-table'; +import {Button, Dialog} from '@gravity-ui/uikit'; -import type {SavedQuery} from '../../../../types/store/query'; +import {Icon} from '../../../../components/Icon'; +import {TruncatedQuery} from '../../../../components/TruncatedQuery/TruncatedQuery'; import {setQueryNameToEdit} from '../../../../store/reducers/saveQuery'; -import {setQueryTab} from '../../../../store/reducers/tenant/tenant'; import {TENANT_QUERY_TABS_ID} from '../../../../store/reducers/tenant/constants'; - -import {TruncatedQuery} from '../../../../components/TruncatedQuery/TruncatedQuery'; -import {Icon} from '../../../../components/Icon'; - +import {setQueryTab} from '../../../../store/reducers/tenant/tenant'; +import type {SavedQuery} from '../../../../types/store/query'; +import {cn} from '../../../../utils/cn'; import {useTypedDispatch} from '../../../../utils/hooks'; import {MAX_QUERY_HEIGHT, QUERY_TABLE_SETTINGS} from '../../utils/constants'; - import i18n from '../i18n'; import './SavedQueries.scss'; -const b = block('ydb-saved-queries'); +const b = cn('ydb-saved-queries'); interface DeleteDialogProps { visible: boolean; @@ -61,8 +59,8 @@ interface SavedQueriesProps { export const SavedQueries = ({savedQueries, changeUserInput, onDeleteQuery}: SavedQueriesProps) => { const dispatch = useTypedDispatch(); - const [isDeleteDialogVisible, setIsDeleteDialogVisible] = useState(false); - const [queryNameToDelete, setQueryNameToDelete] = useState(''); + const [isDeleteDialogVisible, setIsDeleteDialogVisible] = React.useState(false); + const [queryNameToDelete, setQueryNameToDelete] = React.useState(''); const closeDeleteDialog = () => { setIsDeleteDialogVisible(false); @@ -86,7 +84,7 @@ export const SavedQueries = ({savedQueries, changeUserInput, onDeleteQuery}: Sav }; const onDeleteQueryClick = (queryName: string) => { - return (event: MouseEvent) => { + return (event: React.MouseEvent) => { event.stopPropagation(); setIsDeleteDialogVisible(true); setQueryNameToDelete(queryName); @@ -123,7 +121,7 @@ export const SavedQueries = ({savedQueries, changeUserInput, onDeleteQuery}: Sav ]; return ( - <> +
- + ); }; diff --git a/src/containers/Tenant/Schema/SchemaTree/SchemaTree.tsx b/src/containers/Tenant/Schema/SchemaTree/SchemaTree.tsx index a30aab53b0..8fc33e635e 100644 --- a/src/containers/Tenant/Schema/SchemaTree/SchemaTree.tsx +++ b/src/containers/Tenant/Schema/SchemaTree/SchemaTree.tsx @@ -1,11 +1,10 @@ -import {useEffect} from 'react'; +import React from 'react'; import {NavigationTree} from 'ydb-ui-components'; +import {preloadSchemas, setCurrentSchemaPath} from '../../../../store/reducers/schema/schema'; import type {EPathType, TEvDescribeSchemeResult} from '../../../../types/api/schema'; -import {setCurrentSchemaPath, preloadSchemas} from '../../../../store/reducers/schema/schema'; import {useQueryModes, useTypedDispatch} from '../../../../utils/hooks'; - import {isChildlessPathType, mapPathTypeToNavigationTreeType} from '../../utils/schema'; import {getActions} from '../../utils/schemaActions'; import {getControls} from '../../utils/schemaControls'; @@ -61,7 +60,7 @@ export function SchemaTree(props: SchemaTreeProps) { dispatch(setCurrentSchemaPath(activePath)); }; - useEffect(() => { + React.useEffect(() => { // if the cached path is not in the current tree, show root if (!currentPath?.startsWith(rootPath)) { handleActivePathUpdate(rootPath); diff --git a/src/containers/Tenant/Schema/SchemaViewer/SchemaViewer.tsx b/src/containers/Tenant/Schema/SchemaViewer/SchemaViewer.tsx index 13195fdfb9..c1a3018d61 100644 --- a/src/containers/Tenant/Schema/SchemaViewer/SchemaViewer.tsx +++ b/src/containers/Tenant/Schema/SchemaViewer/SchemaViewer.tsx @@ -1,13 +1,12 @@ -import {useMemo} from 'react'; -import cn from 'bem-cn-lite'; +import React from 'react'; -import DataTable, {Column} from '@gravity-ui/react-data-table'; +import type {Column} from '@gravity-ui/react-data-table'; +import DataTable from '@gravity-ui/react-data-table'; +import {Icon} from '../../../../components/Icon'; import type {EPathType, TColumnDescription} from '../../../../types/api/schema'; +import {cn} from '../../../../utils/cn'; import {DEFAULT_TABLE_SETTINGS} from '../../../../utils/constants'; - -import {Icon} from '../../../../components/Icon'; - import {isExternalTable} from '../../utils/schema'; import './SchemaViewer.scss'; @@ -30,7 +29,7 @@ interface SchemaViewerProps { export const SchemaViewer = ({keyColumnIds = [], columns = [], type}: SchemaViewerProps) => { // Keys should be displayd by their order in keyColumnIds (Primary Key) - const keyColumnsOrderValues = useMemo(() => { + const keyColumnsOrderValues = React.useMemo(() => { return keyColumnIds.reduce>((result, keyColumnId, index) => { // Put columns with negative values, so they will be the first with ascending sort // Minus keyColumnIds.length for the first key, -1 for the last diff --git a/src/containers/Tenant/Tenant.tsx b/src/containers/Tenant/Tenant.tsx index 8cd9ebfa77..34331db07a 100644 --- a/src/containers/Tenant/Tenant.tsx +++ b/src/containers/Tenant/Tenant.tsx @@ -1,28 +1,26 @@ -import {useEffect, useReducer, useRef} from 'react'; -import cn from 'bem-cn-lite'; -import {useLocation} from 'react-router'; +import React from 'react'; + import qs from 'qs'; import {Helmet} from 'react-helmet-async'; +import {useLocation} from 'react-router'; -import type {TEvDescribeSchemeResult} from '../../types/api/schema'; -import type {AdditionalTenantsProps, AdditionalNodesProps} from '../../types/additionalProps'; - -import {DEFAULT_IS_TENANT_SUMMARY_COLLAPSED, DEFAULT_SIZE_TENANT_KEY} from '../../utils/constants'; -import {useTypedSelector, useTypedDispatch} from '../../utils/hooks'; +import {AccessDenied} from '../../components/Errors/403'; +import SplitPane from '../../components/SplitPane'; import {setHeaderBreadcrumbs} from '../../store/reducers/header/header'; import {disableAutorefresh, getSchema} from '../../store/reducers/schema/schema'; +import type {AdditionalNodesProps, AdditionalTenantsProps} from '../../types/additionalProps'; +import type {TEvDescribeSchemeResult} from '../../types/api/schema'; +import {cn} from '../../utils/cn'; +import {DEFAULT_IS_TENANT_SUMMARY_COLLAPSED, DEFAULT_SIZE_TENANT_KEY} from '../../utils/constants'; +import {useTypedDispatch, useTypedSelector} from '../../utils/hooks'; -import SplitPane from '../../components/SplitPane'; -import {AccessDenied} from '../../components/Errors/403'; - -import {ObjectSummary} from './ObjectSummary/ObjectSummary'; import ObjectGeneral from './ObjectGeneral/ObjectGeneral'; - +import {ObjectSummary} from './ObjectSummary/ObjectSummary'; +import i18n from './i18n'; import { PaneVisibilityActionTypes, paneVisibilityToggleReducerCreator, } from './utils/paneVisibilityToggleHelpers'; -import i18n from './i18n'; import './Tenant.scss'; @@ -44,23 +42,23 @@ interface TenantProps { } function Tenant(props: TenantProps) { - const [summaryVisibilityState, dispatchSummaryVisibilityAction] = useReducer( + const [summaryVisibilityState, dispatchSummaryVisibilityAction] = React.useReducer( paneVisibilityToggleReducerCreator(DEFAULT_IS_TENANT_SUMMARY_COLLAPSED), undefined, getTenantSummaryState, ); - const previousTenant = useRef(); + const previousTenant = React.useRef(); const {currentSchemaPath, currentSchema: currentItem = {}} = useTypedSelector( (state) => state.schema, ); - const {PathType: preloadedPathType, PathSubType: preloadedPathSubType} = useTypedSelector( - (state) => + const {PathType: preloadedPathType, PathSubType: preloadedPathSubType} = + useTypedSelector((state) => currentSchemaPath - ? state.schema.data[currentSchemaPath]?.PathDescription?.Self || {} - : {}, - ); + ? state.schema.data[currentSchemaPath]?.PathDescription?.Self + : undefined, + ) || {}; const {PathType: currentPathType, PathSubType: currentPathSubType} = (currentItem as TEvDescribeSchemeResult).PathDescription?.Self || {}; @@ -78,7 +76,7 @@ function Tenant(props: TenantProps) { const {name} = queryParams; const tenantName = name as string; - useEffect(() => { + React.useEffect(() => { if (tenantName && typeof tenantName === 'string' && previousTenant.current !== tenantName) { const register = async () => { const {registerYQLCompletionItemProvider} = await import( @@ -91,21 +89,21 @@ function Tenant(props: TenantProps) { } }, [tenantName]); - useEffect(() => { + React.useEffect(() => { dispatch(getSchema({path: tenantName})); }, [tenantName, dispatch]); - useEffect(() => { + React.useEffect(() => { if (currentSchemaPath) { dispatch(getSchema({path: currentSchemaPath})); } }, [currentSchemaPath, dispatch]); - useEffect(() => { + React.useEffect(() => { dispatch(disableAutorefresh()); }, [currentSchemaPath, tenantName, dispatch]); - useEffect(() => { + React.useEffect(() => { if (tenantName) { dispatch(setHeaderBreadcrumbs('tenant', {tenantName})); } diff --git a/src/containers/Tenant/utils/index.ts b/src/containers/Tenant/utils/index.ts index 212ba4251a..f85b2cccaf 100644 --- a/src/containers/Tenant/utils/index.ts +++ b/src/containers/Tenant/utils/index.ts @@ -1,4 +1,5 @@ -import {TPathDescription} from '../../../types/api/schema'; +import type {TPathDescription} from '../../../types/api/schema'; + import {mapPathTypeToEntityName} from './schema'; export const getEntityName = (pathDescription?: TPathDescription) => { diff --git a/src/containers/Tenant/utils/paneVisibilityToggleHelpers.tsx b/src/containers/Tenant/utils/paneVisibilityToggleHelpers.tsx index 433fc0d001..e756b86686 100644 --- a/src/containers/Tenant/utils/paneVisibilityToggleHelpers.tsx +++ b/src/containers/Tenant/utils/paneVisibilityToggleHelpers.tsx @@ -1,8 +1,9 @@ import React from 'react'; + import {Button} from '@gravity-ui/uikit'; -import cn from 'bem-cn-lite'; import {Icon} from '../../../components/Icon'; +import {cn} from '../../../utils/cn'; import './ToggleButton.scss'; diff --git a/src/containers/Tenant/utils/schemaActions.ts b/src/containers/Tenant/utils/schemaActions.ts index b854472325..eee65e6568 100644 --- a/src/containers/Tenant/utils/schemaActions.ts +++ b/src/containers/Tenant/utils/schemaActions.ts @@ -1,14 +1,11 @@ -import {Dispatch} from 'react'; import copy from 'copy-to-clipboard'; - import type {NavigationTreeNodeType, NavigationTreeProps} from 'ydb-ui-components'; -import type {QueryMode} from '../../../types/store/query'; import {changeUserInput} from '../../../store/reducers/executeQuery'; +import {TENANT_PAGES_IDS, TENANT_QUERY_TABS_ID} from '../../../store/reducers/tenant/constants'; import {setQueryTab, setTenantPage} from '../../../store/reducers/tenant/tenant'; -import {TENANT_QUERY_TABS_ID, TENANT_PAGES_IDS} from '../../../store/reducers/tenant/constants'; +import type {QueryMode} from '../../../types/store/query'; import createToast from '../../../utils/createToast'; - import i18n from '../i18n'; import { @@ -30,7 +27,7 @@ interface ActionsAdditionalEffects { const bindActions = ( path: string, - dispatch: Dispatch, + dispatch: React.Dispatch, additionalEffects: ActionsAdditionalEffects, ) => { const {setActivePath, setQueryMode} = additionalEffects; @@ -79,7 +76,7 @@ const bindActions = ( type ActionsSet = ReturnType['getActions']>; export const getActions = - (dispatch: Dispatch, additionalEffects: ActionsAdditionalEffects) => + (dispatch: React.Dispatch, additionalEffects: ActionsAdditionalEffects) => (path: string, type: NavigationTreeNodeType) => { const actions = bindActions(path, dispatch, additionalEffects); const copyItem = {text: i18n('actions.copyPath'), action: actions.copyPath}; diff --git a/src/containers/Tenant/utils/schemaControls.tsx b/src/containers/Tenant/utils/schemaControls.tsx index 3cc9eedf04..bd4d1cbc00 100644 --- a/src/containers/Tenant/utils/schemaControls.tsx +++ b/src/containers/Tenant/utils/schemaControls.tsx @@ -1,13 +1,10 @@ -import {Dispatch} from 'react'; - -import {NavigationTreeNodeType, NavigationTreeProps} from 'ydb-ui-components'; import {Button} from '@gravity-ui/uikit'; +import type {NavigationTreeNodeType, NavigationTreeProps} from 'ydb-ui-components'; +import {Icon} from '../../../components/Icon'; import {setShowPreview} from '../../../store/reducers/schema/schema'; -import {setQueryTab, setTenantPage} from '../../../store/reducers/tenant/tenant'; import {TENANT_PAGES_IDS, TENANT_QUERY_TABS_ID} from '../../../store/reducers/tenant/constants'; -import {Icon} from '../../../components/Icon'; - +import {setQueryTab, setTenantPage} from '../../../store/reducers/tenant/tenant'; import i18n from '../i18n'; interface ControlsAdditionalEffects { @@ -16,7 +13,7 @@ interface ControlsAdditionalEffects { const bindActions = ( path: string, - dispatch: Dispatch, + dispatch: React.Dispatch, additionalEffects: ControlsAdditionalEffects, ) => { const {setActivePath} = additionalEffects; @@ -34,7 +31,7 @@ const bindActions = ( type Controls = ReturnType['renderAdditionalNodeElements']>; export const getControls = - (dispatch: Dispatch, additionalEffects: ControlsAdditionalEffects) => + (dispatch: React.Dispatch, additionalEffects: ControlsAdditionalEffects) => (path: string, type: NavigationTreeNodeType) => { const options = bindActions(path, dispatch, additionalEffects); const openPreview = ( diff --git a/src/containers/Tenants/Tenants.tsx b/src/containers/Tenants/Tenants.tsx index 291cffbc8e..899907fb16 100644 --- a/src/containers/Tenants/Tenants.tsx +++ b/src/containers/Tenants/Tenants.tsx @@ -1,40 +1,40 @@ -import cn from 'bem-cn-lite'; +import React from 'react'; -import DataTable, {Column} from '@gravity-ui/react-data-table'; +import type {Column} from '@gravity-ui/react-data-table'; +import DataTable from '@gravity-ui/react-data-table'; import {Button} from '@gravity-ui/uikit'; +import {EntitiesCount} from '../../components/EntitiesCount'; import {EntityStatus} from '../../components/EntityStatus/EntityStatus'; +import {ResponseError} from '../../components/Errors/ResponseError'; +import {Illustration} from '../../components/Illustration'; import {PoolsGraph} from '../../components/PoolsGraph/PoolsGraph'; -import {TabletsStatistic} from '../../components/TabletsStatistic'; import {ProblemFilter} from '../../components/ProblemFilter'; -import {Illustration} from '../../components/Illustration'; -import {EntitiesCount} from '../../components/EntitiesCount'; import {Search} from '../../components/Search'; import {TableWithControlsLayout} from '../../components/TableWithControlsLayout/TableWithControlsLayout'; -import {ResponseError} from '../../components/Errors/ResponseError'; - -import type {AdditionalTenantsProps} from '../../types/additionalProps'; +import {TabletsStatistic} from '../../components/TabletsStatistic'; +import {clusterName} from '../../store'; +import { + ProblemFilterValues, + changeFilter, + selectProblemFilter, +} from '../../store/reducers/settings/settings'; import type {ProblemFilterValue} from '../../store/reducers/settings/types'; -import type {PreparedTenant} from '../../store/reducers/tenants/types'; -import {getTenantsInfo, setSearchValue} from '../../store/reducers/tenants/tenants'; import { selectFilteredTenants, selectTenantsSearchValue, } from '../../store/reducers/tenants/selectors'; -import { - changeFilter, - ProblemFilterValues, - selectProblemFilter, -} from '../../store/reducers/settings/settings'; +import {getTenantsInfo, setSearchValue} from '../../store/reducers/tenants/tenants'; +import type {PreparedTenant} from '../../store/reducers/tenants/types'; +import type {AdditionalTenantsProps} from '../../types/additionalProps'; +import {cn} from '../../utils/cn'; +import {DEFAULT_TABLE_SETTINGS} from '../../utils/constants'; import { formatBytesToGigabyte, formatCPU, formatNumber, } from '../../utils/dataFormatters/dataFormatters'; -import {DEFAULT_TABLE_SETTINGS} from '../../utils/constants'; import {useAutofetcher, useTypedDispatch, useTypedSelector} from '../../utils/hooks'; -import {clusterName} from '../../store'; - import {getTenantPath} from '../Tenant/TenantPages'; import './Tenants.scss'; @@ -71,7 +71,7 @@ export const Tenants = ({additionalTenantsProps}: TenantsProps) => { const renderControls = () => { return ( - <> + { label={'Databases'} loading={loading && !wasLoaded} /> - + ); }; diff --git a/src/containers/UserSettings/Setting.tsx b/src/containers/UserSettings/Setting.tsx index a2d2327ace..d3b85516a0 100644 --- a/src/containers/UserSettings/Setting.tsx +++ b/src/containers/UserSettings/Setting.tsx @@ -1,10 +1,7 @@ -import type {ReactNode} from 'react'; - -import {RadioButton, Switch} from '@gravity-ui/uikit'; import {Settings} from '@gravity-ui/navigation'; +import {RadioButton, Switch} from '@gravity-ui/uikit'; import {LabelWithPopover} from '../../components/LabelWithPopover/LabelWithPopover'; - import {useSetting} from '../../utils/hooks'; import {b} from './UserSettings'; @@ -14,9 +11,9 @@ export type SettingsElementType = 'switch' | 'radio'; export interface SettingProps { type?: SettingsElementType; title: string; - description?: ReactNode; + description?: React.ReactNode; settingKey: string; - helpPopoverContent?: ReactNode; + helpPopoverContent?: React.ReactNode; options?: {value: string; content: string}[]; defaultValue?: unknown; onValueUpdate?: VoidFunction; @@ -39,7 +36,7 @@ export const Setting = ({ onValueUpdate?.(); }; - const renderTitleComponent = (value: ReactNode) => { + const renderTitleComponent = (value: React.ReactNode) => { if (helpPopoverContent) { return ( { + React.useEffect(() => { dispatch(setHeaderBreadcrumbs('vDisk', {nodeId, pDiskId, vDiskSlotId})); }, [dispatch, nodeId, pDiskId, vDiskSlotId]); - const fetchData = useCallback( + const fetchData = React.useCallback( async (isBackground?: boolean) => { if (!isBackground) { dispatch(setVDiskDataWasNotLoaded()); @@ -152,7 +152,7 @@ export function VDiskPage() { const renderGroupInfo = () => { if (groupData) { return ( - <> +
{vDiskPageKeyset('group')}
@@ -167,7 +167,7 @@ export function VDiskPage() { ); })}
- +
); } @@ -180,10 +180,10 @@ export function VDiskPage() { } return ( - <> + {renderInfo()} {renderGroupInfo()} - + ); }; diff --git a/src/containers/Versions/GroupedNodesTree/GroupedNodesTree.scss b/src/containers/Versions/GroupedNodesTree/GroupedNodesTree.scss index d0b1b0e41b..852439ee7a 100644 --- a/src/containers/Versions/GroupedNodesTree/GroupedNodesTree.scss +++ b/src/containers/Versions/GroupedNodesTree/GroupedNodesTree.scss @@ -16,8 +16,7 @@ position: relative; z-index: 0; - overflow-x: auto; - overflow-y: hidden; + overflow: auto hidden; margin-right: $margin-size; margin-left: $margin-size; diff --git a/src/containers/Versions/GroupedNodesTree/GroupedNodesTree.tsx b/src/containers/Versions/GroupedNodesTree/GroupedNodesTree.tsx index 21f9081a62..1454fdead5 100644 --- a/src/containers/Versions/GroupedNodesTree/GroupedNodesTree.tsx +++ b/src/containers/Versions/GroupedNodesTree/GroupedNodesTree.tsx @@ -1,14 +1,13 @@ -import {useState, useEffect} from 'react'; -import cn from 'bem-cn-lite'; +import React from 'react'; import {TreeView} from 'ydb-ui-components'; import type {PreparedClusterNode} from '../../../store/reducers/clusterNodes/types'; import type {VersionValue} from '../../../types/versions'; - -import type {GroupedNodesItem} from '../types'; -import {NodesTreeTitle} from '../NodesTreeTitle/NodesTreeTitle'; +import {cn} from '../../../utils/cn'; import {NodesTable} from '../NodesTable/NodesTable'; +import {NodesTreeTitle} from '../NodesTreeTitle/NodesTreeTitle'; +import type {GroupedNodesItem} from '../types'; import './GroupedNodesTree.scss'; @@ -33,9 +32,9 @@ export const GroupedNodesTree = ({ versionsValues, level = 0, }: GroupedNodesTreeProps) => { - const [isOpened, toggleBlock] = useState(false); + const [isOpened, toggleBlock] = React.useState(false); - useEffect(() => { + React.useEffect(() => { toggleBlock(expanded); }, [expanded]); diff --git a/src/containers/Versions/NodesTable/NodesTable.tsx b/src/containers/Versions/NodesTable/NodesTable.tsx index 598f48fde1..21a60d2ffb 100644 --- a/src/containers/Versions/NodesTable/NodesTable.tsx +++ b/src/containers/Versions/NodesTable/NodesTable.tsx @@ -1,15 +1,15 @@ -import DataTable, {Column} from '@gravity-ui/react-data-table'; +import type {Column} from '@gravity-ui/react-data-table'; +import DataTable from '@gravity-ui/react-data-table'; +import {EntityStatus} from '../../../components/EntityStatus/EntityStatus'; +import {PoolsGraph} from '../../../components/PoolsGraph/PoolsGraph'; +import {ProgressViewer} from '../../../components/ProgressViewer/ProgressViewer'; import type {PreparedClusterNode} from '../../../store/reducers/clusterNodes/types'; -import {isUnavailableNode} from '../../../utils/nodes'; import {DEFAULT_TABLE_SETTINGS} from '../../../utils/constants'; import {formatBytes} from '../../../utils/dataFormatters/dataFormatters'; +import {isUnavailableNode} from '../../../utils/nodes'; import {getDefaultNodePath} from '../../Node/NodePages'; -import {ProgressViewer} from '../../../components/ProgressViewer/ProgressViewer'; -import {PoolsGraph} from '../../../components/PoolsGraph/PoolsGraph'; -import {EntityStatus} from '../../../components/EntityStatus/EntityStatus'; - const columns: Column[] = [ { name: 'NodeId', diff --git a/src/containers/Versions/NodesTreeTitle/NodesTreeTitle.tsx b/src/containers/Versions/NodesTreeTitle/NodesTreeTitle.tsx index 373e4867d1..4b930f24da 100644 --- a/src/containers/Versions/NodesTreeTitle/NodesTreeTitle.tsx +++ b/src/containers/Versions/NodesTreeTitle/NodesTreeTitle.tsx @@ -1,12 +1,14 @@ import {Progress} from '@gravity-ui/uikit'; -import block from 'bem-cn-lite'; + import {ClipboardButton} from '../../../components/ClipboardButton'; import type {PreparedClusterNode} from '../../../store/reducers/clusterNodes/types'; import type {VersionValue} from '../../../types/versions'; +import {cn} from '../../../utils/cn'; import type {GroupedNodesItem} from '../types'; + import './NodesTreeTitle.scss'; -const b = block('ydb-versions-nodes-tree-title'); +const b = cn('ydb-versions-nodes-tree-title'); interface NodesTreeTitleProps { title?: string; diff --git a/src/containers/Versions/Versions.tsx b/src/containers/Versions/Versions.tsx index ac32e4356b..292044dd72 100644 --- a/src/containers/Versions/Versions.tsx +++ b/src/containers/Versions/Versions.tsx @@ -1,20 +1,20 @@ -import {useState} from 'react'; -import block from 'bem-cn-lite'; +import React from 'react'; import {Checkbox, RadioButton} from '@gravity-ui/uikit'; +import {Loader} from '../../components/Loader'; +import {getClusterNodes} from '../../store/reducers/clusterNodes/clusterNodes'; import type {VersionToColorMap} from '../../types/versions'; +import {cn} from '../../utils/cn'; import {useAutofetcher, useTypedDispatch, useTypedSelector} from '../../utils/hooks'; -import {getClusterNodes} from '../../store/reducers/clusterNodes/clusterNodes'; -import {Loader} from '../../components/Loader'; -import {getGroupedStorageNodes, getGroupedTenantNodes, getOtherNodes} from './groupNodes'; import {GroupedNodesTree} from './GroupedNodesTree/GroupedNodesTree'; +import {getGroupedStorageNodes, getGroupedTenantNodes, getOtherNodes} from './groupNodes'; import {GroupByValue} from './types'; import './Versions.scss'; -const b = block('ydb-versions'); +const b = cn('ydb-versions'); interface VersionsProps { versionToColor?: VersionToColorMap; @@ -27,8 +27,8 @@ export const Versions = ({versionToColor}: VersionsProps) => { useAutofetcher(() => dispatch(getClusterNodes()), [dispatch], true); - const [groupByValue, setGroupByValue] = useState(GroupByValue.VERSION); - const [expanded, setExpanded] = useState(false); + const [groupByValue, setGroupByValue] = React.useState(GroupByValue.VERSION); + const [expanded, setExpanded] = React.useState(false); const handleGroupByValueChange = (value: string) => { setGroupByValue(value as GroupByValue); @@ -72,7 +72,7 @@ export const Versions = ({versionToColor}: VersionsProps) => { const storageNodes = getGroupedStorageNodes(nodes, versionToColor); const otherNodes = getOtherNodes(nodes, versionToColor); const storageNodesContent = storageNodes?.length ? ( - <> +

Storage nodes

{storageNodes.map(({title, nodes: itemNodes, items, versionColor}) => ( { versionColor={versionColor} /> ))} - +
) : null; const tenantNodesContent = tenantNodes?.length ? ( - <> +

Database nodes

{renderControls()} {tenantNodes.map(({title, nodes: itemNodes, items, versionColor, versionsValues}) => ( @@ -100,10 +100,10 @@ export const Versions = ({versionToColor}: VersionsProps) => { versionsValues={versionsValues} /> ))} - +
) : null; const otherNodesContent = otherNodes?.length ? ( - <> +

Other nodes

{otherNodes.map(({title, nodes: itemNodes, items, versionColor, versionsValues}) => ( { versionsValues={versionsValues} /> ))} - +
) : null; return ( diff --git a/src/containers/Versions/groupNodes.ts b/src/containers/Versions/groupNodes.ts index 135fc49ced..c4df31825c 100644 --- a/src/containers/Versions/groupNodes.ts +++ b/src/containers/Versions/groupNodes.ts @@ -1,10 +1,11 @@ import groupBy from 'lodash/groupBy'; -import type {VersionToColorMap} from '../../types/versions'; import type {PreparedClusterNode} from '../../store/reducers/clusterNodes/types'; +import type {VersionToColorMap} from '../../types/versions'; import {getMinorVersion, parseNodesToVersionsValues} from '../../utils/versions'; -import {GroupByValue, GroupedNodesItem} from './types'; +import type {GroupedNodesItem} from './types'; +import {GroupByValue} from './types'; const sortByTitle = (a: GroupedNodesItem, b: GroupedNodesItem) => a.title?.localeCompare(b.title || '') || -1; diff --git a/src/containers/Versions/types.ts b/src/containers/Versions/types.ts index 051475a8df..0e766cb0fb 100644 --- a/src/containers/Versions/types.ts +++ b/src/containers/Versions/types.ts @@ -1,5 +1,5 @@ -import type {VersionValue} from '../../types/versions'; import type {PreparedClusterNode} from '../../store/reducers/clusterNodes/types'; +import type {VersionValue} from '../../types/versions'; export interface GroupedNodesItem { title?: string; diff --git a/src/index.tsx b/src/index.tsx index 8f0c03d05a..703c9f6730 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -1,11 +1,13 @@ +/* eslint-disable import/order */ import React from 'react'; -import ReactDOM from 'react-dom'; + +import ReactDOM from 'react-dom/client'; import '@gravity-ui/uikit/styles/styles.scss'; import {ErrorBoundary} from './lib'; -import {store, history} from './store/defaultStore'; import reportWebVitals from './reportWebVitals'; +import {history, store} from './store/defaultStore'; import './styles/themes.scss'; import './styles/constants.scss'; @@ -22,13 +24,17 @@ async function render() { App = await import('./lib').then(({MultiClusterApp}) => MultiClusterApp); } - ReactDOM.render( + const container = document.getElementById('root'); + if (!container) { + throw new Error("Can't find root element"); + } + const root = ReactDOM.createRoot(container); + root.render( , - document.getElementById('root'), ); } diff --git a/src/routes.ts b/src/routes.ts index fb4c98b1fd..87d183379f 100644 --- a/src/routes.ts +++ b/src/routes.ts @@ -1,7 +1,7 @@ import type {Location} from 'history'; -import qs from 'qs'; -import {compile} from 'path-to-regexp'; import isEmpty from 'lodash/isEmpty'; +import {compile} from 'path-to-regexp'; +import qs from 'qs'; import {backend, clusterName, webVersion} from './store'; diff --git a/src/services/api.ts b/src/services/api.ts index b2a9593812..90f0e60a35 100644 --- a/src/services/api.ts +++ b/src/services/api.ts @@ -1,6 +1,20 @@ import AxiosWrapper from '@gravity-ui/axios-wrapper'; import type {AxiosRequestConfig} from 'axios'; +import {backend as BACKEND, metaBackend as META_BACKEND} from '../store'; +import type {ComputeApiRequestParams, NodesApiRequestParams} from '../store/reducers/nodes/types'; +import type {StorageApiRequestParams} from '../store/reducers/storage/types'; +import type {TMetaInfo} from '../types/api/acl'; +import type {TClusterInfo} from '../types/api/cluster'; +import type {TComputeInfo} from '../types/api/compute'; +import type {DescribeConsumerResult} from '../types/api/consumer'; +import type {HealthCheckAPIResponse} from '../types/api/healthcheck'; +import type {JsonHotKeysResponse} from '../types/api/hotkeys'; +import type {MetaCluster, MetaClusters, MetaTenants} from '../types/api/meta'; +import type {TNetInfo} from '../types/api/netInfo'; +import type {TNodesInfo} from '../types/api/nodes'; +import type {TEvNodesInfo} from '../types/api/nodesList'; +import type {TEvPDiskStateResponse} from '../types/api/pdisk'; import type { Actions, ExplainActions, @@ -8,42 +22,28 @@ import type { QueryAPIResponse, Schemas, } from '../types/api/query'; +import type {JsonRenderRequestParams, JsonRenderResponse} from '../types/api/render'; +import type {TEvDescribeSchemeResult} from '../types/api/schema'; +import type {TStorageInfo} from '../types/api/storage'; +import type {TEvSystemStateResponse} from '../types/api/systemState'; import type { TDomainKey, TEvTabletStateResponse, UnmergedTEvTabletStateResponse, } from '../types/api/tablet'; -import type {TMetaInfo} from '../types/api/acl'; -import type {TClusterInfo} from '../types/api/cluster'; -import type {TComputeInfo} from '../types/api/compute'; -import type {DescribeConsumerResult} from '../types/api/consumer'; -import type {HealthCheckAPIResponse} from '../types/api/healthcheck'; -import type {TNetInfo} from '../types/api/netInfo'; -import type {TNodesInfo} from '../types/api/nodes'; -import type {TEvNodesInfo} from '../types/api/nodesList'; -import type {TEvDescribeSchemeResult} from '../types/api/schema'; -import type {TStorageInfo} from '../types/api/storage'; -import type {TEvSystemStateResponse} from '../types/api/systemState'; import type {TTenantInfo, TTenants} from '../types/api/tenant'; import type {DescribeTopicResult} from '../types/api/topic'; -import type {TEvPDiskStateResponse} from '../types/api/pdisk'; import type {TEvVDiskStateResponse} from '../types/api/vdisk'; import type {TUserToken} from '../types/api/whoami'; -import type {JsonRenderRequestParams, JsonRenderResponse} from '../types/api/render'; import type {QuerySyntax} from '../types/store/query'; -import type {ComputeApiRequestParams, NodesApiRequestParams} from '../store/reducers/nodes/types'; -import type {StorageApiRequestParams} from '../store/reducers/storage/types'; -import type {MetaCluster, MetaClusters, MetaTenants} from '../types/api/meta'; -import type {JsonHotKeysResponse} from '../types/api/hotkeys'; - -import {backend as BACKEND, metaBackend as META_BACKEND} from '../store'; -import {prepareSortValue} from '../utils/filters'; -import {createPDiskDeveloperUILink} from '../utils/developerUI/developerUI'; import {BINARY_DATA_IN_PLAIN_TEXT_DISPLAY} from '../utils/constants'; +import {createPDiskDeveloperUILink} from '../utils/developerUI/developerUI'; +import {prepareSortValue} from '../utils/filters'; +import type {Nullable} from '../utils/typecheckers'; + import {parseMetaCluster} from './parsers/parseMetaCluster'; import {parseMetaTenants} from './parsers/parseMetaTenants'; import {settingsManager} from './settings'; -import {Nullable} from '../utils/typecheckers'; type AxiosOptions = { concurrentId?: string; diff --git a/src/services/parsers/parseMetaCluster.ts b/src/services/parsers/parseMetaCluster.ts index 11b53e96bf..cda3eb11f6 100644 --- a/src/services/parsers/parseMetaCluster.ts +++ b/src/services/parsers/parseMetaCluster.ts @@ -1,5 +1,4 @@ import type {TClusterInfo} from '../../types/api/cluster'; - import type {MetaCluster} from '../../types/api/meta'; export const parseMetaCluster = (data: MetaCluster): TClusterInfo => { diff --git a/src/services/parsers/parseMetaTenants.ts b/src/services/parsers/parseMetaTenants.ts index c936a33932..af1f963dfb 100644 --- a/src/services/parsers/parseMetaTenants.ts +++ b/src/services/parsers/parseMetaTenants.ts @@ -1,6 +1,5 @@ -import type {TTenantInfo} from '../../types/api/tenant'; - import type {MetaTenants} from '../../types/api/meta'; +import type {TTenantInfo} from '../../types/api/tenant'; export const parseMetaTenants = (data: MetaTenants): TTenantInfo => { return { diff --git a/src/services/settings.ts b/src/services/settings.ts index 5314ece3d9..f6b278c999 100644 --- a/src/services/settings.ts +++ b/src/services/settings.ts @@ -1,7 +1,8 @@ import {TENANT_PAGES_IDS} from '../store/reducers/tenant/constants'; - import { ASIDE_HEADER_COMPACT_KEY, + BINARY_DATA_IN_PLAIN_TEXT_DISPLAY, + ENABLE_AUTOCOMPLETE, INVERTED_DISKS_KEY, LANGUAGE_KEY, LAST_USED_QUERY_ACTION_KEY, @@ -12,10 +13,8 @@ import { TENANT_INITIAL_PAGE_KEY, THEME_KEY, USE_BACKEND_PARAMS_FOR_TABLES_KEY, - USE_NODES_ENDPOINT_IN_DIAGNOSTICS_KEY, USE_CLUSTER_BALANCER_AS_BACKEND_KEY, - BINARY_DATA_IN_PLAIN_TEXT_DISPLAY, - ENABLE_AUTOCOMPLETE, + USE_NODES_ENDPOINT_IN_DIAGNOSTICS_KEY, } from '../utils/constants'; import {QUERY_ACTIONS, QUERY_MODES} from '../utils/query'; import {parseJson} from '../utils/utils'; diff --git a/src/setupTests.js b/src/setupTests.js index af79cff2b9..c894baa7a9 100644 --- a/src/setupTests.js +++ b/src/setupTests.js @@ -1,15 +1,14 @@ +/* eslint-disable import/order */ // jest-dom adds custom jest matchers for asserting on DOM nodes. // allows you to do things like: // expect(element).toHaveTextContent(/react/i) // learn more: https://github.com/testing-library/jest-dom import '@testing-library/jest-dom'; - import {configure as configureUiKit} from '@gravity-ui/uikit'; -import {configure as configureYdbUiComponents} from 'ydb-ui-components'; -import {i18n, Lang} from '../src/utils/i18n'; + +import {Lang, i18n} from '../src/utils/i18n'; i18n.setLang(Lang.En); -configureYdbUiComponents({lang: Lang.En}); configureUiKit({lang: Lang.En}); // only to prevent warnings from history lib diff --git a/src/store/configureStore.ts b/src/store/configureStore.ts index a1357e2021..56188846a8 100644 --- a/src/store/configureStore.ts +++ b/src/store/configureStore.ts @@ -1,14 +1,15 @@ import {configureStore as configureReduxStore} from '@reduxjs/toolkit'; -import {History, createBrowserHistory} from 'history'; +import type {Action, Reducer, UnknownAction} from '@reduxjs/toolkit'; +import type {History} from 'history'; +import {createBrowserHistory} from 'history'; import {listenForHistoryChange} from 'redux-location-state'; -import {getUrlData} from './getUrlData'; -import getLocationMiddleware from './state-url-mapping'; -import rootReducer from './reducers'; import {createApi} from '../services/api'; -import type {Action, Reducer, UnknownAction} from '@reduxjs/toolkit'; +import {getUrlData} from './getUrlData'; +import rootReducer from './reducers'; import {UPDATE_REF} from './reducers/tooltip'; +import getLocationMiddleware from './state-url-mapping'; export let backend: string | undefined, basename: string, clusterName: string | undefined; @@ -77,7 +78,6 @@ export function configureStore({ ); window.api = api; - window.store = store; // TODO: check is it really needed return {history, store}; } diff --git a/src/store/reducers/authentication/authentication.ts b/src/store/reducers/authentication/authentication.ts index 8109289a80..b5cc210184 100644 --- a/src/store/reducers/authentication/authentication.ts +++ b/src/store/reducers/authentication/authentication.ts @@ -1,6 +1,6 @@ import type {Reducer} from '@reduxjs/toolkit'; -import {createRequestActionTypes, createApiRequest} from '../../utils'; +import {createApiRequest, createRequestActionTypes} from '../../utils'; import type {AuthenticationAction, AuthenticationState} from './types'; diff --git a/src/store/reducers/authentication/types.ts b/src/store/reducers/authentication/types.ts index 293ed6ab4e..5aba2838b9 100644 --- a/src/store/reducers/authentication/types.ts +++ b/src/store/reducers/authentication/types.ts @@ -1,7 +1,7 @@ import type {AuthErrorResponse} from '../../../types/api/error'; import type {ApiRequestAction} from '../../utils'; -import {FETCH_USER, SET_AUTHENTICATED, SET_UNAUTHENTICATED} from './authentication'; +import type {FETCH_USER, SET_AUTHENTICATED, SET_UNAUTHENTICATED} from './authentication'; export interface AuthenticationState { isAuthenticated: boolean; diff --git a/src/store/reducers/cluster/cluster.ts b/src/store/reducers/cluster/cluster.ts index a2ea372161..93a9a0a0fc 100644 --- a/src/store/reducers/cluster/cluster.ts +++ b/src/store/reducers/cluster/cluster.ts @@ -1,8 +1,10 @@ import type {Dispatch, Reducer} from '@reduxjs/toolkit'; +import type {ClusterTab} from '../../../containers/Cluster/utils'; +import {clusterTabsIds, isClusterTab} from '../../../containers/Cluster/utils'; import {DEFAULT_CLUSTER_TAB_KEY} from '../../../utils/constants'; -import {clusterTabsIds, isClusterTab, ClusterTab} from '../../../containers/Cluster/utils'; -import {createRequestActionTypes, createApiRequest} from '../../utils'; +import {createApiRequest, createRequestActionTypes} from '../../utils'; + import type {ClusterAction, ClusterState} from './types'; import {createSelectClusterGroupsQuery, parseGroupsStatsQueryResponse} from './utils'; diff --git a/src/store/reducers/clusterNodes/clusterNodes.tsx b/src/store/reducers/clusterNodes/clusterNodes.tsx index 61f8824064..f8b61c8798 100644 --- a/src/store/reducers/clusterNodes/clusterNodes.tsx +++ b/src/store/reducers/clusterNodes/clusterNodes.tsx @@ -1,11 +1,10 @@ import type {Reducer} from '@reduxjs/toolkit'; -import {createRequestActionTypes, createApiRequest} from '../../utils'; +import {calcUptime} from '../../../utils/dataFormatters/dataFormatters'; +import {createApiRequest, createRequestActionTypes} from '../../utils'; import type {ClusterNodesAction, ClusterNodesState, PreparedClusterNode} from './types'; -import {calcUptime} from '../../../utils/dataFormatters/dataFormatters'; - export const FETCH_CLUSTER_NODES = createRequestActionTypes('cluster', 'FETCH_CLUSTER_NODES'); const initialState = {loading: false, wasLoaded: false}; diff --git a/src/store/reducers/clusterNodes/types.ts b/src/store/reducers/clusterNodes/types.ts index 780458fc26..92bfc1dc8f 100644 --- a/src/store/reducers/clusterNodes/types.ts +++ b/src/store/reducers/clusterNodes/types.ts @@ -2,7 +2,7 @@ import type {IResponseError} from '../../../types/api/error'; import type {TSystemStateInfo} from '../../../types/api/nodes'; import type {ApiRequestAction} from '../../utils'; -import {FETCH_CLUSTER_NODES} from './clusterNodes'; +import type {FETCH_CLUSTER_NODES} from './clusterNodes'; export interface PreparedClusterNode extends TSystemStateInfo { uptime: string; diff --git a/src/store/reducers/clusters/clusters.ts b/src/store/reducers/clusters/clusters.ts index 263ec214c5..302e92ddc2 100644 --- a/src/store/reducers/clusters/clusters.ts +++ b/src/store/reducers/clusters/clusters.ts @@ -1,6 +1,6 @@ import type {Reducer} from '@reduxjs/toolkit'; -import {createRequestActionTypes, createApiRequest} from '../../utils'; +import {createApiRequest, createRequestActionTypes} from '../../utils'; import type {ClustersAction, ClustersFilters, ClustersState} from './types'; import {prepareClustersData} from './utils'; diff --git a/src/store/reducers/clusters/selectors.ts b/src/store/reducers/clusters/selectors.ts index 45c62320ab..92b55daf53 100644 --- a/src/store/reducers/clusters/selectors.ts +++ b/src/store/reducers/clusters/selectors.ts @@ -1,9 +1,10 @@ -import {type Selector, createSelector} from '@reduxjs/toolkit'; +import {createSelector} from '@reduxjs/toolkit'; +import type {Selector} from '@reduxjs/toolkit'; import escapeRegExp from 'lodash/escapeRegExp'; +import type {MetaExtendedClusterInfo} from '../../../types/api/meta'; import {getMinorVersion} from '../../../utils/versions'; -import type {MetaExtendedClusterInfo} from '../../../types/api/meta'; import type {ClusterDataAggregation, ClustersStateSlice, PreparedCluster} from './types'; // ==== Filters ==== diff --git a/src/store/reducers/clusters/types.ts b/src/store/reducers/clusters/types.ts index 0ab4e42447..0f027e8d3e 100644 --- a/src/store/reducers/clusters/types.ts +++ b/src/store/reducers/clusters/types.ts @@ -1,8 +1,8 @@ -import type {ApiRequestAction} from '../../utils'; - import type {MetaExtendedClusterInfo} from '../../../types/api/meta'; import type {ExtendedMetaClusterVersion} from '../../../utils/clusterVersionColors'; -import {FETCH_CLUSTERS, changeClustersFilters} from './clusters'; +import type {ApiRequestAction} from '../../utils'; + +import type {FETCH_CLUSTERS, changeClustersFilters} from './clusters'; export interface PreparedCluster extends MetaExtendedClusterInfo { preparedVersions: ExtendedMetaClusterVersion[]; diff --git a/src/store/reducers/describe.ts b/src/store/reducers/describe.ts index 919cf48428..b1c80fee13 100644 --- a/src/store/reducers/describe.ts +++ b/src/store/reducers/describe.ts @@ -1,12 +1,12 @@ import type {Reducer} from '@reduxjs/toolkit'; import type { - IDescribeState, IDescribeAction, - IDescribeHandledResponse, IDescribeData, + IDescribeHandledResponse, + IDescribeState, } from '../../types/store/describe'; -import {createRequestActionTypes, createApiRequest} from '../utils'; +import {createApiRequest, createRequestActionTypes} from '../utils'; export const FETCH_DESCRIBE = createRequestActionTypes('describe', 'FETCH_DESCRIBE'); const SET_CURRENT_DESCRIBE_PATH = 'describe/SET_CURRENT_DESCRIBE_PATH'; diff --git a/src/store/reducers/executeQuery.ts b/src/store/reducers/executeQuery.ts index adbefcbb69..f29b889241 100644 --- a/src/store/reducers/executeQuery.ts +++ b/src/store/reducers/executeQuery.ts @@ -1,5 +1,6 @@ import type {Reducer} from '@reduxjs/toolkit'; +import {settingsManager} from '../../services/settings'; import type {ExecuteActions, Schemas} from '../../types/api/query'; import type { ExecuteQueryAction, @@ -7,13 +8,11 @@ import type { ExecuteQueryStateSlice, QueryInHistory, } from '../../types/store/executeQuery'; -import type {QueryRequestParams, QueryMode, QuerySyntax} from '../../types/store/query'; +import type {QueryMode, QueryRequestParams, QuerySyntax} from '../../types/store/query'; import {QUERIES_HISTORY_KEY} from '../../utils/constants'; -import {QUERY_MODES, QUERY_SYNTAX, parseQueryAPIExecuteResponse} from '../../utils/query'; import {parseQueryError} from '../../utils/error'; -import {settingsManager} from '../../services/settings'; - -import {createRequestActionTypes, createApiRequest} from '../utils'; +import {QUERY_MODES, QUERY_SYNTAX, parseQueryAPIExecuteResponse} from '../../utils/query'; +import {createApiRequest, createRequestActionTypes} from '../utils'; const MAXIMUM_QUERIES_IN_HISTORY = 20; diff --git a/src/store/reducers/executeTopQueries/executeTopQueries.ts b/src/store/reducers/executeTopQueries/executeTopQueries.ts index f18d79b96b..b8021ce1b9 100644 --- a/src/store/reducers/executeTopQueries/executeTopQueries.ts +++ b/src/store/reducers/executeTopQueries/executeTopQueries.ts @@ -1,11 +1,10 @@ -import type {AnyAction, Reducer} from '@reduxjs/toolkit'; -import type {ThunkAction} from 'redux-thunk'; +import type {AnyAction, Reducer, ThunkAction} from '@reduxjs/toolkit'; +import type {RootState} from '../..'; import type {IQueryResult} from '../../../types/store/query'; import {parseQueryAPIExecuteResponse} from '../../../utils/query'; +import {createApiRequest, createRequestActionTypes} from '../../utils'; -import {createRequestActionTypes, createApiRequest} from '../../utils'; -import type {RootState} from '../..'; import type {ITopQueriesAction, ITopQueriesFilters, ITopQueriesState} from './types'; import {getFiltersConditions} from './utils'; diff --git a/src/store/reducers/executeTopQueries/types.ts b/src/store/reducers/executeTopQueries/types.ts index 94e83502f4..f0a106b258 100644 --- a/src/store/reducers/executeTopQueries/types.ts +++ b/src/store/reducers/executeTopQueries/types.ts @@ -1,6 +1,11 @@ -import {FETCH_TOP_QUERIES, setTopQueriesState, setTopQueriesFilters} from './executeTopQueries'; -import type {ApiRequestAction} from '../../utils'; import type {IQueryResult, QueryErrorResponse} from '../../../types/store/query'; +import type {ApiRequestAction} from '../../utils'; + +import type { + FETCH_TOP_QUERIES, + setTopQueriesFilters, + setTopQueriesState, +} from './executeTopQueries'; export interface ITopQueriesFilters { /** ms from epoch */ diff --git a/src/store/reducers/executeTopQueries/utils.ts b/src/store/reducers/executeTopQueries/utils.ts index 210872bf62..e9b72e4605 100644 --- a/src/store/reducers/executeTopQueries/utils.ts +++ b/src/store/reducers/executeTopQueries/utils.ts @@ -1,4 +1,4 @@ -import {ITopQueriesFilters} from './types'; +import type {ITopQueriesFilters} from './types'; const endTimeColumn = 'EndTime'; const intervalEndColumn = 'IntervalEnd'; diff --git a/src/store/reducers/explainQuery.ts b/src/store/reducers/explainQuery.ts index 250fa21586..5b761ae588 100644 --- a/src/store/reducers/explainQuery.ts +++ b/src/store/reducers/explainQuery.ts @@ -1,5 +1,5 @@ -import type {Reducer} from '@reduxjs/toolkit'; import type {ExplainPlanNodeData, GraphNode, Link} from '@gravity-ui/paranoid'; +import type {Reducer} from '@reduxjs/toolkit'; import type {ExplainActions} from '../../types/api/query'; import type { @@ -7,13 +7,11 @@ import type { ExplainQueryState, PreparedExplainResponse, } from '../../types/store/explainQuery'; -import type {QueryRequestParams, QueryMode, QuerySyntax} from '../../types/store/query'; - +import type {QueryMode, QueryRequestParams, QuerySyntax} from '../../types/store/query'; +import {parseQueryError} from '../../utils/error'; import {preparePlan} from '../../utils/prepareQueryExplain'; import {QUERY_SYNTAX, parseQueryAPIExplainResponse, parseQueryExplainPlan} from '../../utils/query'; -import {parseQueryError} from '../../utils/error'; - -import {createRequestActionTypes, createApiRequest} from '../utils'; +import {createApiRequest, createRequestActionTypes} from '../utils'; export const GET_EXPLAIN_QUERY = createRequestActionTypes('query', 'GET_EXPLAIN_QUERY'); export const GET_EXPLAIN_QUERY_AST = createRequestActionTypes('query', 'GET_EXPLAIN_QUERY_AST'); diff --git a/src/store/reducers/header/types.ts b/src/store/reducers/header/types.ts index 1e5414fdde..57183bebaf 100644 --- a/src/store/reducers/header/types.ts +++ b/src/store/reducers/header/types.ts @@ -1,7 +1,7 @@ import type {ClusterTab} from '../../../containers/Cluster/utils'; import type {EType} from '../../../types/api/tablet'; -import {setHeaderBreadcrumbs} from './header'; +import type {setHeaderBreadcrumbs} from './header'; export type Page = | 'cluster' @@ -53,14 +53,14 @@ export type BreadcrumbsOptions = export type PageBreadcrumbsOptions = T extends 'cluster' ? ClusterBreadcrumbsOptions : T extends 'tenant' - ? TenantBreadcrumbsOptions - : T extends 'node' - ? NodeBreadcrumbsOptions - : T extends 'tablets' - ? TabletsBreadcrumbsOptions - : T extends 'tablet' - ? TabletBreadcrumbsOptions - : {}; + ? TenantBreadcrumbsOptions + : T extends 'node' + ? NodeBreadcrumbsOptions + : T extends 'tablets' + ? TabletsBreadcrumbsOptions + : T extends 'tablet' + ? TabletBreadcrumbsOptions + : {}; export interface HeaderState { page?: Page; diff --git a/src/store/reducers/healthcheckInfo/healthcheckInfo.ts b/src/store/reducers/healthcheckInfo/healthcheckInfo.ts index 0e1bd67def..a9c8ab396d 100644 --- a/src/store/reducers/healthcheckInfo/healthcheckInfo.ts +++ b/src/store/reducers/healthcheckInfo/healthcheckInfo.ts @@ -1,15 +1,15 @@ import {createSelector} from '@reduxjs/toolkit'; import type {Reducer, Selector} from '@reduxjs/toolkit'; +import type {IssueLog, StatusFlag} from '../../../types/api/healthcheck'; +import {createApiRequest, createRequestActionTypes} from '../../utils'; + import type { HealthCheckInfoAction, HealthcheckInfoRootStateSlice, HealthcheckInfoState, IssuesTree, } from './types'; -import type {IssueLog, StatusFlag} from '../../../types/api/healthcheck'; - -import {createRequestActionTypes, createApiRequest} from '../../utils'; export const FETCH_HEALTHCHECK = createRequestActionTypes('cluster', 'FETCH_HEALTHCHECK'); diff --git a/src/store/reducers/healthcheckInfo/types.ts b/src/store/reducers/healthcheckInfo/types.ts index 56a2964be0..538b48ae1b 100644 --- a/src/store/reducers/healthcheckInfo/types.ts +++ b/src/store/reducers/healthcheckInfo/types.ts @@ -1,6 +1,7 @@ -import type {HealthCheckAPIResponse, IssueLog} from '../../../types/api/healthcheck'; import type {IResponseError} from '../../../types/api/error'; +import type {HealthCheckAPIResponse, IssueLog} from '../../../types/api/healthcheck'; import type {ApiRequestAction} from '../../utils'; + import type {FETCH_HEALTHCHECK, setDataWasNotLoaded} from './healthcheckInfo'; export interface IssuesTree extends IssueLog { diff --git a/src/store/reducers/heatmap.ts b/src/store/reducers/heatmap.ts index 79a6835c35..3b99654067 100644 --- a/src/store/reducers/heatmap.ts +++ b/src/store/reducers/heatmap.ts @@ -6,8 +6,7 @@ import type { IHeatmapState, IHeatmapTabletData, } from '../../types/store/heatmap'; - -import {createRequestActionTypes, createApiRequest} from '../utils'; +import {createApiRequest, createRequestActionTypes} from '../utils'; export const FETCH_HEATMAP = createRequestActionTypes('heatmap', 'FETCH_HEATMAP'); diff --git a/src/store/reducers/host.ts b/src/store/reducers/host.ts index a3534612bb..045c731811 100644 --- a/src/store/reducers/host.ts +++ b/src/store/reducers/host.ts @@ -1,8 +1,7 @@ import type {Reducer} from '@reduxjs/toolkit'; import type {IHostAction, IHostState} from '../../types/store/host'; - -import {createRequestActionTypes, createApiRequest} from '../utils'; +import {createApiRequest, createRequestActionTypes} from '../utils'; export const FETCH_HOST = createRequestActionTypes('host', 'FETCH_HOST'); diff --git a/src/store/reducers/hotKeys/hotKeys.ts b/src/store/reducers/hotKeys/hotKeys.ts index 2f772bcf6a..5163c68f5d 100644 --- a/src/store/reducers/hotKeys/hotKeys.ts +++ b/src/store/reducers/hotKeys/hotKeys.ts @@ -1,9 +1,9 @@ import type {Reducer} from '@reduxjs/toolkit'; -import type {JsonHotKeysResponse} from '../../../types/api/hotkeys'; import type {IResponseError} from '../../../types/api/error'; - +import type {JsonHotKeysResponse} from '../../../types/api/hotkeys'; import {createRequestActionTypes} from '../../utils'; + import type {HotKeysAction, HotKeysState} from './types'; export const FETCH_HOT_KEYS = createRequestActionTypes('hot_keys', 'FETCH_HOT_KEYS'); diff --git a/src/store/reducers/hotKeys/types.ts b/src/store/reducers/hotKeys/types.ts index d05e90e56f..9c959f1d04 100644 --- a/src/store/reducers/hotKeys/types.ts +++ b/src/store/reducers/hotKeys/types.ts @@ -1,5 +1,6 @@ import type {IResponseError} from '../../../types/api/error'; import type {HotKey} from '../../../types/api/hotkeys'; + import type { setHotKeysData, setHotKeysDataWasNotLoaded, diff --git a/src/store/reducers/index.ts b/src/store/reducers/index.ts index 47219a883f..1b9157396b 100644 --- a/src/store/reducers/index.ts +++ b/src/store/reducers/index.ts @@ -1,49 +1,49 @@ import {combineReducers} from '@reduxjs/toolkit'; -import nodes from './nodes/nodes'; -import {topNodesByLoad} from './tenantOverview/topNodesByLoad/topNodesByLoad'; -import {topNodesByCpu} from './tenantOverview/topNodesByCpu/topNodesByCpu'; -import {topNodesByMemory} from './tenantOverview/topNodesByMemory/topNodesByMemory'; +import authentication from './authentication/authentication'; import cluster from './cluster/cluster'; import clusterNodes from './clusterNodes/clusterNodes'; -import tenant from './tenant/tenant'; -import storage from './storage/storage'; -import topStorageGroups from './tenantOverview/topStorageGroups/topStorageGroups'; -import node from './node/node'; -import tooltip from './tooltip'; -import tablets from './tablets'; +import clusters from './clusters/clusters'; +import describe from './describe'; +import executeQuery from './executeQuery'; +import executeTopQueries from './executeTopQueries/executeTopQueries'; +import explainQuery from './explainQuery'; +import fullscreen from './fullscreen'; +import header from './header/header'; +import healthcheckInfo from './healthcheckInfo/healthcheckInfo'; import heatmap from './heatmap'; -import schema from './schema/schema'; -import overview from './overview/overview'; import host from './host'; +import hotKeys from './hotKeys/hotKeys'; import network from './network/network'; -import tenants from './tenants/tenants'; -import tablet from './tablet'; -import topic from './topic'; +import node from './node/node'; +import nodes from './nodes/nodes'; +import nodesList from './nodesList'; +import olapStats from './olapStats'; +import overview from './overview/overview'; import partitions from './partitions/partitions'; import pDisk from './pdisk/pdisk'; -import executeQuery from './executeQuery'; -import explainQuery from './explainQuery'; -import tabletsFilters from './tabletsFilters'; -import settings from './settings/settings'; import preview from './preview'; -import nodesList from './nodesList'; -import describe from './describe'; +import saveQuery from './saveQuery'; +import schema from './schema/schema'; import schemaAcl from './schemaAcl/schemaAcl'; -import executeTopQueries from './executeTopQueries/executeTopQueries'; -import {tenantOverviewTopQueries} from './tenantOverview/topQueries/tenantOverviewTopQueries'; -import executeTopTables from './tenantOverview/executeTopTables/executeTopTables'; -import healthcheckInfo from './healthcheckInfo/healthcheckInfo'; +import settings from './settings/settings'; import shardsWorkload from './shardsWorkload/shardsWorkload'; -import {tenantOverviewTopShards} from './tenantOverview/topShards/tenantOverviewTopShards'; -import hotKeys from './hotKeys/hotKeys'; -import olapStats from './olapStats'; -import authentication from './authentication/authentication'; -import header from './header/header'; -import saveQuery from './saveQuery'; -import fullscreen from './fullscreen'; import singleClusterMode from './singleClusterMode'; -import clusters from './clusters/clusters'; +import storage from './storage/storage'; +import tablet from './tablet'; +import tablets from './tablets'; +import tabletsFilters from './tabletsFilters'; +import tenant from './tenant/tenant'; +import executeTopTables from './tenantOverview/executeTopTables/executeTopTables'; +import {topNodesByCpu} from './tenantOverview/topNodesByCpu/topNodesByCpu'; +import {topNodesByLoad} from './tenantOverview/topNodesByLoad/topNodesByLoad'; +import {topNodesByMemory} from './tenantOverview/topNodesByMemory/topNodesByMemory'; +import {tenantOverviewTopQueries} from './tenantOverview/topQueries/tenantOverviewTopQueries'; +import {tenantOverviewTopShards} from './tenantOverview/topShards/tenantOverviewTopShards'; +import topStorageGroups from './tenantOverview/topStorageGroups/topStorageGroups'; +import tenants from './tenants/tenants'; +import tooltip from './tooltip'; +import topic from './topic'; import vDisk from './vdisk/vdisk'; export const rootReducer = { diff --git a/src/store/reducers/network/network.ts b/src/store/reducers/network/network.ts index 001f00d4e1..dc1af970c1 100644 --- a/src/store/reducers/network/network.ts +++ b/src/store/reducers/network/network.ts @@ -1,6 +1,6 @@ import type {Reducer} from '@reduxjs/toolkit'; -import {createRequestActionTypes, createApiRequest} from '../../utils'; +import {createApiRequest, createRequestActionTypes} from '../../utils'; import type {NetworkAction, NetworkState} from './types'; diff --git a/src/store/reducers/network/types.ts b/src/store/reducers/network/types.ts index 1b3016c8c8..fd2f39a3b7 100644 --- a/src/store/reducers/network/types.ts +++ b/src/store/reducers/network/types.ts @@ -2,7 +2,7 @@ import type {IResponseError} from '../../../types/api/error'; import type {TNetInfo} from '../../../types/api/netInfo'; import type {ApiRequestAction} from '../../utils'; -import {FETCH_ALL_NODES_NETWORK, setDataWasNotLoaded} from './network'; +import type {FETCH_ALL_NODES_NETWORK, setDataWasNotLoaded} from './network'; export interface NetworkState { loading: boolean; diff --git a/src/store/reducers/node/node.ts b/src/store/reducers/node/node.ts index 1018ca513a..a3ed6383e6 100644 --- a/src/store/reducers/node/node.ts +++ b/src/store/reducers/node/node.ts @@ -1,6 +1,6 @@ import type {Reducer} from '@reduxjs/toolkit'; -import {createRequestActionTypes, createApiRequest} from '../../utils'; +import {createApiRequest, createRequestActionTypes} from '../../utils'; import type {NodeAction, NodeState} from './types'; import {prepareNodeData} from './utils'; diff --git a/src/store/reducers/node/types.ts b/src/store/reducers/node/types.ts index 8e81fba9f7..1f325ab80d 100644 --- a/src/store/reducers/node/types.ts +++ b/src/store/reducers/node/types.ts @@ -5,7 +5,7 @@ import type {PreparedPDisk} from '../../../utils/disks/types'; import type {PreparedNodeSystemState} from '../../../utils/nodes'; import type {ApiRequestAction} from '../../utils'; -import {FETCH_NODE, FETCH_NODE_STRUCTURE, resetNode} from './node'; +import type {FETCH_NODE, FETCH_NODE_STRUCTURE, resetNode} from './node'; interface RawStructurePDisk extends PreparedPDisk { vDisks: Record; diff --git a/src/store/reducers/node/utils.ts b/src/store/reducers/node/utils.ts index 9b464e3954..6be190f825 100644 --- a/src/store/reducers/node/utils.ts +++ b/src/store/reducers/node/utils.ts @@ -1,5 +1,6 @@ import type {TEvSystemStateResponse} from '../../../types/api/systemState'; import {prepareNodeSystemState} from '../../../utils/nodes'; + import type {PreparedNode} from './types'; export const prepareNodeData = (data: TEvSystemStateResponse): PreparedNode => { diff --git a/src/store/reducers/nodes/nodes.ts b/src/store/reducers/nodes/nodes.ts index f666ee58f7..2289fd4e41 100644 --- a/src/store/reducers/nodes/nodes.ts +++ b/src/store/reducers/nodes/nodes.ts @@ -1,9 +1,8 @@ import type {Reducer} from '@reduxjs/toolkit'; -import {NodesUptimeFilterValues} from '../../../utils/nodes'; import {EVersion} from '../../../types/api/compute'; - -import {createRequestActionTypes, createApiRequest} from '../../utils'; +import {NodesUptimeFilterValues} from '../../../utils/nodes'; +import {createApiRequest, createRequestActionTypes} from '../../utils'; import type { ComputeApiRequestParams, @@ -124,7 +123,7 @@ export const setNodesUptimeFilter = (value: NodesUptimeFilterValues) => ({ type: SET_NODES_UPTIME_FILTER, data: value, - } as const); + }) as const; export const setDataWasNotLoaded = () => { return { diff --git a/src/store/reducers/nodes/selectors.ts b/src/store/reducers/nodes/selectors.ts index d128c5562a..35408b86e7 100644 --- a/src/store/reducers/nodes/selectors.ts +++ b/src/store/reducers/nodes/selectors.ts @@ -1,14 +1,15 @@ -import {Selector, createSelector} from '@reduxjs/toolkit'; +import type {Selector} from '@reduxjs/toolkit'; +import {createSelector} from '@reduxjs/toolkit'; import {EFlag} from '../../../types/api/enums'; -import {calcUptimeInSeconds} from '../../../utils/dataFormatters/dataFormatters'; import {HOUR_IN_SECONDS} from '../../../utils/constants'; -import {NodesUptimeFilterValues} from '../../../utils/nodes'; +import {calcUptimeInSeconds} from '../../../utils/dataFormatters/dataFormatters'; import {prepareSearchValue} from '../../../utils/filters'; - +import {NodesUptimeFilterValues} from '../../../utils/nodes'; +import {ProblemFilterValues} from '../settings/settings'; import type {ProblemFilterValue} from '../settings/types'; + import type {NodesPreparedEntity, NodesStateSlice} from './types'; -import {ProblemFilterValues} from '../settings/settings'; // ==== Filters ==== diff --git a/src/store/reducers/nodes/types.ts b/src/store/reducers/nodes/types.ts index 1c6c571845..dc76a939d3 100644 --- a/src/store/reducers/nodes/types.ts +++ b/src/store/reducers/nodes/types.ts @@ -1,18 +1,18 @@ import type {OrderType} from '@gravity-ui/react-data-table'; -import type {IResponseError} from '../../../types/api/error'; -import type {TEndpoint, TPoolStats} from '../../../types/api/nodes'; import type { EVersion, TTabletStateInfo as TComputeTabletStateInfo, } from '../../../types/api/compute'; -import type {TTabletStateInfo as TFullTabletStateInfo} from '../../../types/api/tablet'; import type {EFlag} from '../../../types/api/enums'; +import type {IResponseError} from '../../../types/api/error'; +import type {TEndpoint, TPoolStats} from '../../../types/api/nodes'; +import type {TTabletStateInfo as TFullTabletStateInfo} from '../../../types/api/tablet'; +import type {NodesSortValue, NodesUptimeFilterValues} from '../../../utils/nodes'; import type {ApiRequestAction} from '../../utils'; import type {VisibleEntities} from '../storage/types'; -import type {NodesSortValue, NodesUptimeFilterValues} from '../../../utils/nodes'; -import { +import type { FETCH_NODES, resetNodesState, setDataWasNotLoaded, diff --git a/src/store/reducers/nodesList.ts b/src/store/reducers/nodesList.ts index e0829b7fae..4e71928c3b 100644 --- a/src/store/reducers/nodesList.ts +++ b/src/store/reducers/nodesList.ts @@ -1,12 +1,12 @@ import type {Reducer} from '@reduxjs/toolkit'; import type { - NodesListState, NodesListAction, NodesListRootStateSlice, + NodesListState, } from '../../types/store/nodesList'; -import {createRequestActionTypes, createApiRequest} from '../utils'; import {prepareNodesMap} from '../../utils/nodes'; +import {createApiRequest, createRequestActionTypes} from '../utils'; export const FETCH_NODES_LIST = createRequestActionTypes('nodesList', 'FETCH_NODES_LIST'); diff --git a/src/store/reducers/olapStats.ts b/src/store/reducers/olapStats.ts index 1b13f6f739..6ace287b8a 100644 --- a/src/store/reducers/olapStats.ts +++ b/src/store/reducers/olapStats.ts @@ -1,10 +1,8 @@ import type {Reducer} from '@reduxjs/toolkit'; import type {OlapStatsAction, OlapStatsState} from '../../types/store/olapStats'; - import {parseQueryAPIExecuteResponse} from '../../utils/query'; - -import {createRequestActionTypes, createApiRequest} from '../utils'; +import {createApiRequest, createRequestActionTypes} from '../utils'; export const FETCH_OLAP_STATS = createRequestActionTypes('query', 'SEND_OLAP_STATS_QUERY'); const RESET_LOADING_STATE = 'olapStats/RESET_LOADING_STATE'; diff --git a/src/store/reducers/overview/overview.ts b/src/store/reducers/overview/overview.ts index 6b4bd504aa..b04152f5c7 100644 --- a/src/store/reducers/overview/overview.ts +++ b/src/store/reducers/overview/overview.ts @@ -1,8 +1,8 @@ import type {Reducer} from '@reduxjs/toolkit'; -import type {OverviewState, OverviewAction, OverviewHandledResponse} from './types'; +import {createApiRequest, createRequestActionTypes} from '../../utils'; -import {createRequestActionTypes, createApiRequest} from '../../utils'; +import type {OverviewAction, OverviewHandledResponse, OverviewState} from './types'; export const FETCH_OVERVIEW = createRequestActionTypes('overview', 'FETCH_OVERVIEW'); const SET_CURRENT_OVERVIEW_PATH = 'overview/SET_CURRENT_OVERVIEW_PATH'; diff --git a/src/store/reducers/overview/types.ts b/src/store/reducers/overview/types.ts index f6b110a6ea..5744583013 100644 --- a/src/store/reducers/overview/types.ts +++ b/src/store/reducers/overview/types.ts @@ -1,9 +1,9 @@ -import type {ApiRequestAction} from '../../utils'; import type {IResponseError} from '../../../types/api/error'; import type {TEvDescribeSchemeResult} from '../../../types/api/schema'; +import type {Nullable} from '../../../utils/typecheckers'; +import type {ApiRequestAction} from '../../utils'; -import {FETCH_OVERVIEW, setDataWasNotLoaded, setCurrentOverviewPath} from './overview'; -import {Nullable} from '../../../utils/typecheckers'; +import type {FETCH_OVERVIEW, setCurrentOverviewPath, setDataWasNotLoaded} from './overview'; export interface OverviewState { loading: boolean; diff --git a/src/store/reducers/partitions/partitions.ts b/src/store/reducers/partitions/partitions.ts index 16296c5bb3..a771495615 100644 --- a/src/store/reducers/partitions/partitions.ts +++ b/src/store/reducers/partitions/partitions.ts @@ -1,6 +1,6 @@ import type {Reducer} from '@reduxjs/toolkit'; -import {createRequestActionTypes, createApiRequest} from '../../utils'; +import {createApiRequest, createRequestActionTypes} from '../../utils'; import type {PartitionsAction, PartitionsState} from './types'; import {prepareConsumerPartitions, prepareTopicPartitions} from './utils'; diff --git a/src/store/reducers/partitions/types.ts b/src/store/reducers/partitions/types.ts index 42cace58f1..432e6c3eee 100644 --- a/src/store/reducers/partitions/types.ts +++ b/src/store/reducers/partitions/types.ts @@ -2,7 +2,7 @@ import type {IResponseError} from '../../../types/api/error'; import type {ProcessSpeedStats} from '../../../utils/bytesParsers'; import type {ApiRequestAction} from '../../utils'; -import {FETCH_PARTITIONS, setDataWasNotLoaded, setSelectedConsumer} from './partitions'; +import type {FETCH_PARTITIONS, setDataWasNotLoaded, setSelectedConsumer} from './partitions'; // Fields that could be undefined corresponds to partitions without consumers export interface PreparedPartitionData { diff --git a/src/store/reducers/partitions/utils.ts b/src/store/reducers/partitions/utils.ts index 1c376c9ff4..d29ca8fe7c 100644 --- a/src/store/reducers/partitions/utils.ts +++ b/src/store/reducers/partitions/utils.ts @@ -4,11 +4,11 @@ import type { PartitionStats, } from '../../../types/api/consumer'; import type {PartitionInfo as TopicPartitionInfo} from '../../../types/api/topic'; - import {convertBytesObjectToSpeed} from '../../../utils/bytesParsers'; import {parseLag, parseTimestampToIdleTime} from '../../../utils/timeParsers'; import {isNumeric} from '../../../utils/utils'; -import {PreparedPartitionData} from './types'; + +import type {PreparedPartitionData} from './types'; const prepareGeneralPartitionStats = (partitionStats: PartitionStats | undefined) => { const { diff --git a/src/store/reducers/pdisk/pdisk.ts b/src/store/reducers/pdisk/pdisk.ts index 64d57fe92a..4efb5a5be7 100644 --- a/src/store/reducers/pdisk/pdisk.ts +++ b/src/store/reducers/pdisk/pdisk.ts @@ -1,7 +1,8 @@ import type {Reducer} from '@reduxjs/toolkit'; import {EVersion} from '../../../types/api/storage'; -import {createRequestActionTypes, createApiRequest} from '../../utils'; +import {createApiRequest, createRequestActionTypes} from '../../utils'; + import type {PDiskAction, PDiskState} from './types'; import {preparePDiksDataResponse, preparePDiskStorageResponse} from './utils'; diff --git a/src/store/reducers/pdisk/types.ts b/src/store/reducers/pdisk/types.ts index b3a728fabf..8fcd50d335 100644 --- a/src/store/reducers/pdisk/types.ts +++ b/src/store/reducers/pdisk/types.ts @@ -2,6 +2,7 @@ import type {IResponseError} from '../../../types/api/error'; import type {PreparedPDisk} from '../../../utils/disks/types'; import type {ApiRequestAction} from '../../utils'; import type {PreparedStorageGroup} from '../storage/types'; + import type {FETCH_PDISK, FETCH_PDISK_GROUPS, setPDiskDataWasNotLoaded} from './pdisk'; interface PDiskData extends PreparedPDisk { diff --git a/src/store/reducers/preview.ts b/src/store/reducers/preview.ts index ccfe8ea5de..3a8f0418f3 100644 --- a/src/store/reducers/preview.ts +++ b/src/store/reducers/preview.ts @@ -1,8 +1,8 @@ import type {ExecuteActions} from '../../types/api/query'; import type {IQueryResult, QueryErrorResponse} from '../../types/store/query'; import {parseQueryAPIExecuteResponse} from '../../utils/query'; - -import {createRequestActionTypes, createApiRequest, ApiRequestAction} from '../utils'; +import type {ApiRequestAction} from '../utils'; +import {createApiRequest, createRequestActionTypes} from '../utils'; const SEND_QUERY = createRequestActionTypes('preview', 'SEND_QUERY'); const SET_QUERY_OPTIONS = 'preview/SET_QUERY_OPTIONS'; diff --git a/src/store/reducers/schema/schema.ts b/src/store/reducers/schema/schema.ts index e140ef1a78..a8fa666e7a 100644 --- a/src/store/reducers/schema/schema.ts +++ b/src/store/reducers/schema/schema.ts @@ -1,19 +1,18 @@ -import type {Selector, Reducer} from '@reduxjs/toolkit'; - +import type {Reducer, Selector} from '@reduxjs/toolkit'; import {createSelector} from '@reduxjs/toolkit'; +import {isEntityWithMergedImplementation} from '../../../containers/Tenant/utils/schema'; import type {EPathType} from '../../../types/api/schema'; +import {createApiRequest, createRequestActionTypes} from '../../utils'; + import type { SchemaAction, SchemaData, SchemaHandledResponse, - SchemaStateSlice, SchemaState, + SchemaStateSlice, } from './types'; -import {isEntityWithMergedImplementation} from '../../../containers/Tenant/utils/schema'; -import {createRequestActionTypes, createApiRequest} from '../../utils'; - export const FETCH_SCHEMA = createRequestActionTypes('schema', 'FETCH_SCHEMA'); const PRELOAD_SCHEMAS = 'schema/PRELOAD_SCHEMAS'; const SET_SCHEMA = 'schema/SET_SCHEMA'; diff --git a/src/store/reducers/schema/types.ts b/src/store/reducers/schema/types.ts index 5dbbc46e9d..4439813eed 100644 --- a/src/store/reducers/schema/types.ts +++ b/src/store/reducers/schema/types.ts @@ -1,11 +1,11 @@ -import type {ApiRequestAction} from '../../utils'; import type {IResponseError} from '../../../types/api/error'; import type {TEvDescribeSchemeResult} from '../../../types/api/schema'; +import type {ApiRequestAction} from '../../utils'; -import { +import type { + FETCH_SCHEMA, disableAutorefresh, enableAutorefresh, - FETCH_SCHEMA, preloadSchemas, resetLoadingState, setCurrentSchemaPath, diff --git a/src/store/reducers/schemaAcl/schemaAcl.ts b/src/store/reducers/schemaAcl/schemaAcl.ts index bc97719179..cdef8b44d9 100644 --- a/src/store/reducers/schemaAcl/schemaAcl.ts +++ b/src/store/reducers/schemaAcl/schemaAcl.ts @@ -1,6 +1,6 @@ import type {Reducer} from '@reduxjs/toolkit'; -import {createRequestActionTypes, createApiRequest} from '../../utils'; +import {createApiRequest, createRequestActionTypes} from '../../utils'; import type {SchemaAclAction, SchemaAclState} from './types'; diff --git a/src/store/reducers/schemaAcl/types.ts b/src/store/reducers/schemaAcl/types.ts index 27deb0b0e2..ca9812d757 100644 --- a/src/store/reducers/schemaAcl/types.ts +++ b/src/store/reducers/schemaAcl/types.ts @@ -2,7 +2,7 @@ import type {TACE, TMetaInfo} from '../../../types/api/acl'; import type {IResponseError} from '../../../types/api/error'; import type {ApiRequestAction} from '../../utils'; -import {FETCH_SCHEMA_ACL, setAclWasNotLoaded} from './schemaAcl'; +import type {FETCH_SCHEMA_ACL, setAclWasNotLoaded} from './schemaAcl'; export interface SchemaAclState { loading: boolean; diff --git a/src/store/reducers/settings/settings.ts b/src/store/reducers/settings/settings.ts index e698c8b665..e4c1e50649 100644 --- a/src/store/reducers/settings/settings.ts +++ b/src/store/reducers/settings/settings.ts @@ -1,9 +1,9 @@ -import type {Reducer} from '@reduxjs/toolkit'; -import type {ThunkAction} from 'redux-thunk'; - -import {DEFAULT_USER_SETTINGS, SettingsObject, settingsManager} from '../../../services/settings'; +import type {Reducer, ThunkAction} from '@reduxjs/toolkit'; import type {RootState} from '../..'; +import type {SettingsObject} from '../../../services/settings'; +import {DEFAULT_USER_SETTINGS, settingsManager} from '../../../services/settings'; + import type { ProblemFilterValue, SetSettingValueAction, diff --git a/src/store/reducers/settings/types.ts b/src/store/reducers/settings/types.ts index 761804d4a2..5ab3670646 100644 --- a/src/store/reducers/settings/types.ts +++ b/src/store/reducers/settings/types.ts @@ -1,6 +1,12 @@ -import type {ValueOf} from '../../../types/common'; import type {SettingsObject} from '../../../services/settings'; -import {changeFilter, setUserSettings, ProblemFilterValues, SET_SETTING_VALUE} from './settings'; +import type {ValueOf} from '../../../types/common'; + +import type { + ProblemFilterValues, + SET_SETTING_VALUE, + changeFilter, + setUserSettings, +} from './settings'; export type ProblemFilterValue = ValueOf; diff --git a/src/store/reducers/shardsWorkload/shardsWorkload.ts b/src/store/reducers/shardsWorkload/shardsWorkload.ts index 8da4740d8a..ce0f44c655 100644 --- a/src/store/reducers/shardsWorkload/shardsWorkload.ts +++ b/src/store/reducers/shardsWorkload/shardsWorkload.ts @@ -1,7 +1,8 @@ import type {Reducer} from '@reduxjs/toolkit'; import {parseQueryAPIExecuteResponse} from '../../../utils/query'; -import {createRequestActionTypes, createApiRequest} from '../../utils'; +import {createApiRequest, createRequestActionTypes} from '../../utils'; + import type {IShardsWorkloadAction, IShardsWorkloadFilters, IShardsWorkloadState} from './types'; import {EShardsWorkloadMode} from './types'; diff --git a/src/store/reducers/shardsWorkload/types.ts b/src/store/reducers/shardsWorkload/types.ts index 41e4af9953..2254e70545 100644 --- a/src/store/reducers/shardsWorkload/types.ts +++ b/src/store/reducers/shardsWorkload/types.ts @@ -1,6 +1,7 @@ -import {SEND_SHARD_QUERY, setShardsState, setShardsQueryFilters} from './shardsWorkload'; -import type {ApiRequestAction} from '../../utils'; import type {IQueryResult, QueryErrorResponse} from '../../../types/store/query'; +import type {ApiRequestAction} from '../../utils'; + +import type {SEND_SHARD_QUERY, setShardsQueryFilters, setShardsState} from './shardsWorkload'; export enum EShardsWorkloadMode { Immediate = 'immediate', diff --git a/src/store/reducers/storage/selectors.ts b/src/store/reducers/storage/selectors.ts index 607215a3fe..12faeb5fb0 100644 --- a/src/store/reducers/storage/selectors.ts +++ b/src/store/reducers/storage/selectors.ts @@ -1,19 +1,21 @@ -import {Selector, createSelector} from '@reduxjs/toolkit'; - import type {OrderType} from '@gravity-ui/react-data-table'; import {ASCENDING, DESCENDING} from '@gravity-ui/react-data-table/build/esm/lib/constants'; +import type {Selector} from '@reduxjs/toolkit'; +import {createSelector} from '@reduxjs/toolkit'; -import {NODES_SORT_VALUES, type NodesSortValue} from '../../../utils/nodes'; -import {STORAGE_SORT_VALUES, type StorageSortValue, getUsage} from '../../../utils/storage'; - +import {NODES_SORT_VALUES} from '../../../utils/nodes'; +import type {NodesSortValue} from '../../../utils/nodes'; +import {STORAGE_SORT_VALUES, getUsage} from '../../../utils/storage'; +import type {StorageSortValue} from '../../../utils/storage'; import {filterNodesByUptime} from '../nodes/selectors'; + +import {VISIBLE_ENTITIES} from './constants'; import type { PreparedStorageGroup, PreparedStorageNode, StorageStateSlice, UsageFilter, } from './types'; -import {VISIBLE_ENTITIES} from './constants'; // ==== Filters ==== diff --git a/src/store/reducers/storage/storage.ts b/src/store/reducers/storage/storage.ts index ff8879ee9e..2c9b077fad 100644 --- a/src/store/reducers/storage/storage.ts +++ b/src/store/reducers/storage/storage.ts @@ -2,10 +2,10 @@ import type {Reducer} from '@reduxjs/toolkit'; import {EVersion} from '../../../types/api/storage'; import {NodesUptimeFilterValues} from '../../../utils/nodes'; - -import {createRequestActionTypes, createApiRequest} from '../../utils'; - +import {createApiRequest, createRequestActionTypes} from '../../utils'; import type {NodesApiRequestParams, NodesSortParams} from '../nodes/types'; + +import {STORAGE_TYPES, VISIBLE_ENTITIES} from './constants'; import type { StorageAction, StorageApiRequestParams, @@ -14,7 +14,6 @@ import type { StorageType, VisibleEntities, } from './types'; -import {VISIBLE_ENTITIES, STORAGE_TYPES} from './constants'; import {prepareStorageGroupsResponse, prepareStorageNodesResponse} from './utils'; export const FETCH_STORAGE = createRequestActionTypes('storage', 'FETCH_STORAGE'); diff --git a/src/store/reducers/storage/types.ts b/src/store/reducers/storage/types.ts index a1b92d4d3c..9b8b071095 100644 --- a/src/store/reducers/storage/types.ts +++ b/src/store/reducers/storage/types.ts @@ -3,14 +3,14 @@ import type {OrderType} from '@gravity-ui/react-data-table'; import type {IResponseError} from '../../../types/api/error'; import type {TSystemStateInfo} from '../../../types/api/nodes'; import type {EVersion, TStorageGroupInfo} from '../../../types/api/storage'; -import type {PreparedPDisk, PreparedVDisk} from '../../../utils/disks/types'; import type {ValueOf} from '../../../types/common'; +import type {PreparedPDisk, PreparedVDisk} from '../../../utils/disks/types'; import type {NodesSortValue, NodesUptimeFilterValues} from '../../../utils/nodes'; import type {StorageSortValue} from '../../../utils/storage'; import type {ApiRequestAction} from '../../utils'; -import {STORAGE_TYPES, VISIBLE_ENTITIES} from './constants'; -import { +import type {STORAGE_TYPES, VISIBLE_ENTITIES} from './constants'; +import type { FETCH_STORAGE, setDataWasNotLoaded, setGroupsSortParams, diff --git a/src/store/reducers/storage/utils.ts b/src/store/reducers/storage/utils.ts index d4172c04d0..f40ac00e53 100644 --- a/src/store/reducers/storage/utils.ts +++ b/src/store/reducers/storage/utils.ts @@ -1,16 +1,17 @@ +import {EFlag} from '../../../types/api/enums'; import type {TNodeInfo, TNodesInfo} from '../../../types/api/nodes'; +import {TPDiskState} from '../../../types/api/pdisk'; import type { TStorageGroupInfo, TStorageGroupInfoV2, TStorageInfo, TStoragePoolInfo, } from '../../../types/api/storage'; -import {EVDiskState, type TVDiskStateInfo} from '../../../types/api/vdisk'; -import {TPDiskState} from '../../../types/api/pdisk'; -import {EFlag} from '../../../types/api/enums'; +import {EVDiskState} from '../../../types/api/vdisk'; +import type {TVDiskStateInfo} from '../../../types/api/vdisk'; import {preparePDiskData, prepareVDiskData} from '../../../utils/disks/prepareDisks'; -import {getUsage} from '../../../utils/storage'; import {prepareNodeSystemState} from '../../../utils/nodes'; +import {getUsage} from '../../../utils/storage'; import type {PreparedStorageGroup, PreparedStorageNode, PreparedStorageResponse} from './types'; diff --git a/src/store/reducers/tablet.ts b/src/store/reducers/tablet.ts index aa28a15bfa..e3ea18584f 100644 --- a/src/store/reducers/tablet.ts +++ b/src/store/reducers/tablet.ts @@ -8,9 +8,8 @@ import type { ITabletPreparedHistoryItem, ITabletState, } from '../../types/store/tablet'; - -import {createRequestActionTypes, createApiRequest} from '../utils'; import {prepareNodesMap} from '../../utils/nodes'; +import {createApiRequest, createRequestActionTypes} from '../utils'; export const FETCH_TABLET = createRequestActionTypes('TABLET', 'FETCH_TABLET'); export const FETCH_TABLET_DESCRIBE = createRequestActionTypes('TABLET', 'FETCH_TABLET_DESCRIBE'); diff --git a/src/store/reducers/tablets.ts b/src/store/reducers/tablets.ts index 4ee816a939..00cb758eb8 100644 --- a/src/store/reducers/tablets.ts +++ b/src/store/reducers/tablets.ts @@ -6,8 +6,7 @@ import type { ITabletsApiRequestParams, ITabletsState, } from '../../types/store/tablets'; - -import {createRequestActionTypes, createApiRequest} from '../utils'; +import {createApiRequest, createRequestActionTypes} from '../utils'; export const FETCH_TABLETS = createRequestActionTypes('tablets', 'FETCH_TABLETS'); @@ -87,7 +86,7 @@ export const setTypeFilter = (typeFilter: EType[]) => { export const clearWasLoadingFlag = () => ({ type: CLEAR_WAS_LOADING_TABLETS, - } as const); + }) as const; export function getTabletsInfo(data: ITabletsApiRequestParams) { return createApiRequest({ diff --git a/src/store/reducers/tabletsFilters.js b/src/store/reducers/tabletsFilters.js index a660b10625..cc38bd3413 100644 --- a/src/store/reducers/tabletsFilters.js +++ b/src/store/reducers/tabletsFilters.js @@ -1,6 +1,7 @@ import {createSelector} from '@reduxjs/toolkit'; -import {createRequestActionTypes, createApiRequest} from '../utils'; + import {AUTO_RELOAD_INTERVAL} from '../../utils/constants'; +import {createApiRequest, createRequestActionTypes} from '../utils'; const FETCH_TABLETS_FILTERS = createRequestActionTypes('tabletsFilters', 'FETCH_TABLETS_FILTERS'); diff --git a/src/store/reducers/tenant/tenant.ts b/src/store/reducers/tenant/tenant.ts index 2a94ef1625..b10d1ef831 100644 --- a/src/store/reducers/tenant/tenant.ts +++ b/src/store/reducers/tenant/tenant.ts @@ -1,6 +1,8 @@ import type {Reducer} from '@reduxjs/toolkit'; import type {TTenant} from '../../../types/api/tenant'; +import {createApiRequest, createRequestActionTypes} from '../../utils'; + import type { TenantAction, TenantDiagnosticsTab, @@ -11,8 +13,6 @@ import type { TenantSummaryTab, } from './types'; -import {createRequestActionTypes, createApiRequest} from '../../utils'; - export const FETCH_TENANT = createRequestActionTypes('tenant', 'FETCH_TENANT'); const SET_TOP_LEVEL_TAB = 'tenant/SET_TOP_LEVEL_TAB'; diff --git a/src/store/reducers/tenant/types.ts b/src/store/reducers/tenant/types.ts index 69af7d9fd6..198921dc50 100644 --- a/src/store/reducers/tenant/types.ts +++ b/src/store/reducers/tenant/types.ts @@ -3,22 +3,22 @@ import type {TTenant} from '../../../types/api/tenant'; import type {ValueOf} from '../../../types/common'; import type {ApiRequestAction} from '../../utils'; -import { - TENANT_QUERY_TABS_ID, +import type { TENANT_DIAGNOSTICS_TABS_IDS, + TENANT_METRICS_TABS_IDS, TENANT_PAGES_IDS, + TENANT_QUERY_TABS_ID, TENANT_SUMMARY_TABS_IDS, - TENANT_METRICS_TABS_IDS, } from './constants'; -import { +import type { FETCH_TENANT, clearTenant, + setDataWasNotLoaded, setDiagnosticsTab, + setMetricsTab, setQueryTab, setSummaryTab, - setMetricsTab, setTenantPage, - setDataWasNotLoaded, } from './tenant'; export type TenantPage = ValueOf; diff --git a/src/store/reducers/tenantOverview/executeTopTables/executeTopTables.ts b/src/store/reducers/tenantOverview/executeTopTables/executeTopTables.ts index 9fa27bdff7..9f0faa9a0a 100644 --- a/src/store/reducers/tenantOverview/executeTopTables/executeTopTables.ts +++ b/src/store/reducers/tenantOverview/executeTopTables/executeTopTables.ts @@ -3,6 +3,7 @@ import type {Reducer} from '@reduxjs/toolkit'; import {TENANT_OVERVIEW_TABLES_LIMIT} from '../../../../utils/constants'; import {parseQueryAPIExecuteResponse} from '../../../../utils/query'; import {createApiRequest, createRequestActionTypes} from '../../../utils'; + import type {TopTablesAction, TopTablesState} from './types'; export const FETCH_TOP_TABLES = createRequestActionTypes('top-tables', 'FETCH_TOP_TABLES'); diff --git a/src/store/reducers/tenantOverview/executeTopTables/types.ts b/src/store/reducers/tenantOverview/executeTopTables/types.ts index 9f4873b544..5cad8e605c 100644 --- a/src/store/reducers/tenantOverview/executeTopTables/types.ts +++ b/src/store/reducers/tenantOverview/executeTopTables/types.ts @@ -1,6 +1,7 @@ import type {IQueryResult, QueryErrorResponse} from '../../../../types/store/query'; import type {ApiRequestAction} from '../../../utils'; -import {FETCH_TOP_TABLES, setDataWasNotLoaded} from './executeTopTables'; + +import type {FETCH_TOP_TABLES, setDataWasNotLoaded} from './executeTopTables'; export interface TopTablesState { loading: boolean; diff --git a/src/store/reducers/tenantOverview/topNodesByCpu/topNodesByCpu.ts b/src/store/reducers/tenantOverview/topNodesByCpu/topNodesByCpu.ts index 17737af5a5..fafcfdb20d 100644 --- a/src/store/reducers/tenantOverview/topNodesByCpu/topNodesByCpu.ts +++ b/src/store/reducers/tenantOverview/topNodesByCpu/topNodesByCpu.ts @@ -2,8 +2,9 @@ import type {Reducer} from '@reduxjs/toolkit'; import {TENANT_OVERVIEW_TABLES_LIMIT} from '../../../../utils/constants'; import {createApiRequest, createRequestActionTypes} from '../../../utils'; -import {prepareNodesData} from '../../nodes/utils'; import type {NodesApiRequestParams} from '../../nodes/types'; +import {prepareNodesData} from '../../nodes/utils'; + import type {TopNodesByCpuAction, TopNodesByCpuState, TopPoolsStateSlice} from './types'; export const FETCH_TOP_NODES_BY_CPU = createRequestActionTypes( diff --git a/src/store/reducers/tenantOverview/topNodesByCpu/types.ts b/src/store/reducers/tenantOverview/topNodesByCpu/types.ts index d6a1fe4162..114564e16a 100644 --- a/src/store/reducers/tenantOverview/topNodesByCpu/types.ts +++ b/src/store/reducers/tenantOverview/topNodesByCpu/types.ts @@ -1,7 +1,8 @@ import type {IResponseError} from '../../../../types/api/error'; import type {ApiRequestAction} from '../../../utils'; import type {NodesPreparedEntity} from '../../nodes/types'; -import {FETCH_TOP_NODES_BY_CPU, setDataWasNotLoaded} from './topNodesByCpu'; + +import type {FETCH_TOP_NODES_BY_CPU, setDataWasNotLoaded} from './topNodesByCpu'; export interface TopNodesByCpuState { loading: boolean; diff --git a/src/store/reducers/tenantOverview/topNodesByLoad/topNodesByLoad.ts b/src/store/reducers/tenantOverview/topNodesByLoad/topNodesByLoad.ts index 73af8ccb0b..7a0ad437b5 100644 --- a/src/store/reducers/tenantOverview/topNodesByLoad/topNodesByLoad.ts +++ b/src/store/reducers/tenantOverview/topNodesByLoad/topNodesByLoad.ts @@ -2,8 +2,9 @@ import type {Reducer} from '@reduxjs/toolkit'; import {TENANT_OVERVIEW_TABLES_LIMIT} from '../../../../utils/constants'; import {createApiRequest, createRequestActionTypes} from '../../../utils'; -import {prepareNodesData} from '../../nodes/utils'; import type {NodesApiRequestParams} from '../../nodes/types'; +import {prepareNodesData} from '../../nodes/utils'; + import type {TopNodesByLoadAction, TopNodesByLoadState, TopNodesByLoadStateSlice} from './types'; export const FETCH_TOP_NODES_BY_LOAD = createRequestActionTypes( diff --git a/src/store/reducers/tenantOverview/topNodesByLoad/types.ts b/src/store/reducers/tenantOverview/topNodesByLoad/types.ts index 4e29e4d812..4044fceb02 100644 --- a/src/store/reducers/tenantOverview/topNodesByLoad/types.ts +++ b/src/store/reducers/tenantOverview/topNodesByLoad/types.ts @@ -1,7 +1,8 @@ import type {IResponseError} from '../../../../types/api/error'; import type {ApiRequestAction} from '../../../utils'; import type {NodesPreparedEntity} from '../../nodes/types'; -import {FETCH_TOP_NODES_BY_LOAD, setDataWasNotLoaded} from './topNodesByLoad'; + +import type {FETCH_TOP_NODES_BY_LOAD, setDataWasNotLoaded} from './topNodesByLoad'; export interface TopNodesByLoadState { loading: boolean; diff --git a/src/store/reducers/tenantOverview/topNodesByMemory/topNodesByMemory.ts b/src/store/reducers/tenantOverview/topNodesByMemory/topNodesByMemory.ts index ceefabd1e4..3f97dd3f2e 100644 --- a/src/store/reducers/tenantOverview/topNodesByMemory/topNodesByMemory.ts +++ b/src/store/reducers/tenantOverview/topNodesByMemory/topNodesByMemory.ts @@ -2,9 +2,10 @@ import type {Reducer} from '@reduxjs/toolkit'; import {TENANT_OVERVIEW_TABLES_LIMIT} from '../../../../utils/constants'; import {createApiRequest, createRequestActionTypes} from '../../../utils'; -import {prepareNodesData} from '../../nodes/utils'; import type {NodesApiRequestParams} from '../../nodes/types'; -import type {TopNodesByMemoryAction, TopNodesByMemoryState, TopNodesByMemorySlice} from './types'; +import {prepareNodesData} from '../../nodes/utils'; + +import type {TopNodesByMemoryAction, TopNodesByMemorySlice, TopNodesByMemoryState} from './types'; export const FETCH_TOP_NODES_BY_MEMORY = createRequestActionTypes( 'topNodesByMemory', diff --git a/src/store/reducers/tenantOverview/topNodesByMemory/types.ts b/src/store/reducers/tenantOverview/topNodesByMemory/types.ts index 8600042a6f..c052d212c8 100644 --- a/src/store/reducers/tenantOverview/topNodesByMemory/types.ts +++ b/src/store/reducers/tenantOverview/topNodesByMemory/types.ts @@ -1,7 +1,8 @@ import type {IResponseError} from '../../../../types/api/error'; import type {ApiRequestAction} from '../../../utils'; import type {NodesPreparedEntity} from '../../nodes/types'; -import {FETCH_TOP_NODES_BY_MEMORY, setDataWasNotLoaded} from './topNodesByMemory'; + +import type {FETCH_TOP_NODES_BY_MEMORY, setDataWasNotLoaded} from './topNodesByMemory'; export interface TopNodesByMemoryState { loading: boolean; diff --git a/src/store/reducers/tenantOverview/topQueries/tenantOverviewTopQueries.ts b/src/store/reducers/tenantOverview/topQueries/tenantOverviewTopQueries.ts index 646a107927..4b9d214f67 100644 --- a/src/store/reducers/tenantOverview/topQueries/tenantOverviewTopQueries.ts +++ b/src/store/reducers/tenantOverview/topQueries/tenantOverviewTopQueries.ts @@ -2,8 +2,8 @@ import type {Reducer} from '@reduxjs/toolkit'; import {TENANT_OVERVIEW_TABLES_LIMIT} from '../../../../utils/constants'; import {parseQueryAPIExecuteResponse} from '../../../../utils/query'; +import {createApiRequest, createRequestActionTypes} from '../../../utils'; -import {createRequestActionTypes, createApiRequest} from '../../../utils'; import type {TenantOverviewTopQueriesAction, TenantOverviewTopQueriesState} from './types'; export const FETCH_TENANT_OVERVIEW_TOP_QUERIES = createRequestActionTypes( diff --git a/src/store/reducers/tenantOverview/topQueries/types.ts b/src/store/reducers/tenantOverview/topQueries/types.ts index 31764dc42d..f774501eda 100644 --- a/src/store/reducers/tenantOverview/topQueries/types.ts +++ b/src/store/reducers/tenantOverview/topQueries/types.ts @@ -1,6 +1,10 @@ import type {IQueryResult, QueryErrorResponse} from '../../../../types/store/query'; import type {ApiRequestAction} from '../../../utils'; -import {FETCH_TENANT_OVERVIEW_TOP_QUERIES, setDataWasNotLoaded} from './tenantOverviewTopQueries'; + +import type { + FETCH_TENANT_OVERVIEW_TOP_QUERIES, + setDataWasNotLoaded, +} from './tenantOverviewTopQueries'; export interface TenantOverviewTopQueriesState { loading: boolean; diff --git a/src/store/reducers/tenantOverview/topShards/tenantOverviewTopShards.ts b/src/store/reducers/tenantOverview/topShards/tenantOverviewTopShards.ts index fd7370c2b8..f2ae796800 100644 --- a/src/store/reducers/tenantOverview/topShards/tenantOverviewTopShards.ts +++ b/src/store/reducers/tenantOverview/topShards/tenantOverviewTopShards.ts @@ -2,8 +2,9 @@ import type {Reducer} from '@reduxjs/toolkit'; import {TENANT_OVERVIEW_TABLES_LIMIT} from '../../../../utils/constants'; import {parseQueryAPIExecuteResponse} from '../../../../utils/query'; -import {createRequestActionTypes, createApiRequest} from '../../../utils'; -import {TenantOverviewTopShardsAction, TenantOverviewTopShardsState} from './types'; +import {createApiRequest, createRequestActionTypes} from '../../../utils'; + +import type {TenantOverviewTopShardsAction, TenantOverviewTopShardsState} from './types'; export const FETCH_TENANT_OVERVIEW_TOP_SHARDS = createRequestActionTypes( 'tenantOverviewTopShards', diff --git a/src/store/reducers/tenantOverview/topShards/types.ts b/src/store/reducers/tenantOverview/topShards/types.ts index d679e3109b..029c916442 100644 --- a/src/store/reducers/tenantOverview/topShards/types.ts +++ b/src/store/reducers/tenantOverview/topShards/types.ts @@ -1,6 +1,10 @@ import type {IQueryResult, QueryErrorResponse} from '../../../../types/store/query'; import type {ApiRequestAction} from '../../../utils'; -import {FETCH_TENANT_OVERVIEW_TOP_SHARDS, setDataWasNotLoaded} from './tenantOverviewTopShards'; + +import type { + FETCH_TENANT_OVERVIEW_TOP_SHARDS, + setDataWasNotLoaded, +} from './tenantOverviewTopShards'; export interface TenantOverviewTopShardsState { loading: boolean; diff --git a/src/store/reducers/tenantOverview/topStorageGroups/topStorageGroups.ts b/src/store/reducers/tenantOverview/topStorageGroups/topStorageGroups.ts index 1704f41c66..39baf13d8c 100644 --- a/src/store/reducers/tenantOverview/topStorageGroups/topStorageGroups.ts +++ b/src/store/reducers/tenantOverview/topStorageGroups/topStorageGroups.ts @@ -1,9 +1,10 @@ import type {Reducer} from '@reduxjs/toolkit'; -import {TENANT_OVERVIEW_TABLES_LIMIT} from '../../../../utils/constants'; import {EVersion} from '../../../../types/api/storage'; +import {TENANT_OVERVIEW_TABLES_LIMIT} from '../../../../utils/constants'; import {createApiRequest, createRequestActionTypes} from '../../../utils'; import type {StorageApiRequestParams} from '../../storage/types'; + import type { TopStorageGroupsAction, TopStorageGroupsState, diff --git a/src/store/reducers/tenantOverview/topStorageGroups/types.ts b/src/store/reducers/tenantOverview/topStorageGroups/types.ts index 5d6d764a20..90cb763d85 100644 --- a/src/store/reducers/tenantOverview/topStorageGroups/types.ts +++ b/src/store/reducers/tenantOverview/topStorageGroups/types.ts @@ -1,7 +1,8 @@ import type {IResponseError} from '../../../../types/api/error'; import type {ApiRequestAction} from '../../../utils'; import type {PreparedStorageGroup} from '../../storage/types'; -import {FETCH_TOP_STORAGE_GROUPS, setDataWasNotLoaded} from './topStorageGroups'; + +import type {FETCH_TOP_STORAGE_GROUPS, setDataWasNotLoaded} from './topStorageGroups'; export interface TopStorageGroupsState { loading: boolean; diff --git a/src/store/reducers/tenantOverview/topStorageGroups/utils.ts b/src/store/reducers/tenantOverview/topStorageGroups/utils.ts index 9662bbc7d0..b3f5bf1709 100644 --- a/src/store/reducers/tenantOverview/topStorageGroups/utils.ts +++ b/src/store/reducers/tenantOverview/topStorageGroups/utils.ts @@ -1,6 +1,7 @@ -import {TENANT_OVERVIEW_TABLES_LIMIT} from '../../../../utils/constants'; import type {TStorageInfo} from '../../../../types/api/storage'; +import {TENANT_OVERVIEW_TABLES_LIMIT} from '../../../../utils/constants'; import {prepareStorageGroups} from '../../storage/utils'; + import type {PreparedTopStorageGroupsResponse} from './types'; export const prepareTopStorageGroupsResponse = ( diff --git a/src/store/reducers/tenants/selectors.ts b/src/store/reducers/tenants/selectors.ts index a500469fc0..a1e2c60917 100644 --- a/src/store/reducers/tenants/selectors.ts +++ b/src/store/reducers/tenants/selectors.ts @@ -1,11 +1,11 @@ -import {Selector, createSelector} from '@reduxjs/toolkit'; +import type {Selector} from '@reduxjs/toolkit'; +import {createSelector} from '@reduxjs/toolkit'; import escapeRegExp from 'lodash/escapeRegExp'; -import {EFlag} from '../../../types/api/enums'; - import type {RootState} from '../..'; -import type {ProblemFilterValue} from '../settings/types'; +import {EFlag} from '../../../types/api/enums'; import {ProblemFilterValues, selectProblemFilter} from '../settings/settings'; +import type {ProblemFilterValue} from '../settings/types'; import type {PreparedTenant, TenantsStateSlice} from './types'; diff --git a/src/store/reducers/tenants/tenants.ts b/src/store/reducers/tenants/tenants.ts index 2ddab6d209..cc017dae45 100644 --- a/src/store/reducers/tenants/tenants.ts +++ b/src/store/reducers/tenants/tenants.ts @@ -1,6 +1,6 @@ import type {Reducer} from '@reduxjs/toolkit'; -import {createRequestActionTypes, createApiRequest} from '../../utils'; +import {createApiRequest, createRequestActionTypes} from '../../utils'; import type {TenantsAction, TenantsState} from './types'; import {prepareTenants} from './utils'; diff --git a/src/store/reducers/tenants/types.ts b/src/store/reducers/tenants/types.ts index 14d3c2f61f..36d885ebb8 100644 --- a/src/store/reducers/tenants/types.ts +++ b/src/store/reducers/tenants/types.ts @@ -1,10 +1,10 @@ -import {FETCH_TENANTS, setSearchValue} from './tenants'; - -import {ValueOf} from '../../../types/common'; -import type {TTenant} from '../../../types/api/tenant'; import type {IResponseError} from '../../../types/api/error'; +import type {TTenant} from '../../../types/api/tenant'; +import type {ValueOf} from '../../../types/common'; import type {ApiRequestAction} from '../../utils'; -import {METRIC_STATUS} from './contants'; + +import type {METRIC_STATUS} from './contants'; +import type {FETCH_TENANTS, setSearchValue} from './tenants'; export interface PreparedTenant extends TTenant { backend: string | undefined; diff --git a/src/store/reducers/tenants/utils.ts b/src/store/reducers/tenants/utils.ts index e97e71f022..54d2b91b8d 100644 --- a/src/store/reducers/tenants/utils.ts +++ b/src/store/reducers/tenants/utils.ts @@ -3,6 +3,7 @@ import type {TTenant} from '../../../types/api/tenant'; import {formatBytes} from '../../../utils/bytesParsers'; import {formatCPUWithLabel} from '../../../utils/dataFormatters/dataFormatters'; import {isNumeric} from '../../../utils/utils'; + import {METRIC_STATUS} from './contants'; const getControlPlaneValue = (tenant: TTenant) => { diff --git a/src/store/reducers/tooltip.ts b/src/store/reducers/tooltip.ts index 9b69666d96..76ab9f9fac 100644 --- a/src/store/reducers/tooltip.ts +++ b/src/store/reducers/tooltip.ts @@ -1,7 +1,7 @@ -import isEqual from 'lodash/isEqual'; import type {Reducer} from '@reduxjs/toolkit'; +import isEqual from 'lodash/isEqual'; -import { +import type { ITooltipAction, ITooltipPositions, ITooltipState, diff --git a/src/store/reducers/topic.ts b/src/store/reducers/topic.ts index 02ecd1e95b..ef9eacbd29 100644 --- a/src/store/reducers/topic.ts +++ b/src/store/reducers/topic.ts @@ -9,10 +9,9 @@ import type { ITopicRootStateSlice, ITopicState, } from '../../types/store/topic'; - -import {createRequestActionTypes, createApiRequest} from '../utils'; -import {parseLag, parseTimestampToIdleTime} from '../../utils/timeParsers'; import {convertBytesObjectToSpeed} from '../../utils/bytesParsers'; +import {parseLag, parseTimestampToIdleTime} from '../../utils/timeParsers'; +import {createApiRequest, createRequestActionTypes} from '../utils'; export const FETCH_TOPIC = createRequestActionTypes('topic', 'FETCH_TOPIC'); diff --git a/src/store/reducers/vdisk/types.ts b/src/store/reducers/vdisk/types.ts index 23da407fda..729fb5a610 100644 --- a/src/store/reducers/vdisk/types.ts +++ b/src/store/reducers/vdisk/types.ts @@ -2,6 +2,7 @@ import type {IResponseError} from '../../../types/api/error'; import type {PreparedVDisk} from '../../../utils/disks/types'; import type {ApiRequestAction} from '../../utils'; import type {PreparedStorageGroup} from '../storage/types'; + import type {FETCH_VDISK, setVDiskDataWasNotLoaded} from './vdisk'; export type VDiskGroup = Partial; diff --git a/src/store/reducers/vdisk/utils.ts b/src/store/reducers/vdisk/utils.ts index ae305c7487..d930a0522d 100644 --- a/src/store/reducers/vdisk/utils.ts +++ b/src/store/reducers/vdisk/utils.ts @@ -5,6 +5,7 @@ import type {TEvVDiskStateResponse} from '../../../types/api/vdisk'; import {preparePDiskData, prepareVDiskData} from '../../../utils/disks/prepareDisks'; import {prepareNodeSystemState} from '../../../utils/nodes'; import {prepareStorageGroupData} from '../storage/utils'; + import type {VDiskData} from './types'; export function prepareVDiskDataResponse([vDiskResponse, pDiskResponse, nodeResponse]: [ diff --git a/src/store/reducers/vdisk/vdisk.ts b/src/store/reducers/vdisk/vdisk.ts index ac6e30caa6..4ca9bd0caa 100644 --- a/src/store/reducers/vdisk/vdisk.ts +++ b/src/store/reducers/vdisk/vdisk.ts @@ -2,7 +2,8 @@ import type {Reducer} from '@reduxjs/toolkit'; import {EVersion} from '../../../types/api/storage'; import {valueIsDefined} from '../../../utils'; -import {createRequestActionTypes, createApiRequest} from '../../utils'; +import {createApiRequest, createRequestActionTypes} from '../../utils'; + import type {VDiskAction, VDiskGroup, VDiskState} from './types'; import {prepareVDiskDataResponse, prepareVDiskGroupResponse} from './utils'; diff --git a/src/store/state-url-mapping.ts b/src/store/state-url-mapping.ts index 7178584b51..eab3c5dbf4 100644 --- a/src/store/state-url-mapping.ts +++ b/src/store/state-url-mapping.ts @@ -1,18 +1,18 @@ -import {LocationWithQuery, ParamSetup, createReduxLocationActions} from 'redux-location-state'; -import qs from 'qs'; +import type {Action, Reducer, UnknownAction} from '@reduxjs/toolkit'; +import type {History, Location} from 'history'; import each from 'lodash/each'; import keys from 'lodash/keys'; import merge from 'lodash/merge'; -import {stateToParams} from 'redux-location-state/lib/stateToParams'; -import {parseQuery} from 'redux-location-state/lib/parseQuery'; -import {LOCATION_PUSH, LOCATION_POP} from 'redux-location-state/lib/constants'; +import qs from 'qs'; +import type {LocationWithQuery, ParamSetup} from 'redux-location-state'; +import {createReduxLocationActions} from 'redux-location-state'; +import {LOCATION_POP, LOCATION_PUSH} from 'redux-location-state/lib/constants'; import {getMatchingDeclaredPath} from 'redux-location-state/lib/helpers'; +import {parseQuery} from 'redux-location-state/lib/parseQuery'; +import {stateToParams} from 'redux-location-state/lib/stateToParams'; -import {initialState as initialSettingsState} from './reducers/settings/settings'; import {initialState as initialHeatmapState} from './reducers/heatmap'; - -import type {History, Location} from 'history'; -import type {Action, Reducer, UnknownAction} from '@reduxjs/toolkit'; +import {initialState as initialSettingsState} from './reducers/settings/settings'; const paramSetup: ParamSetup = { global: { diff --git a/src/store/utils.ts b/src/store/utils.ts index 13246502d7..999de0ec82 100644 --- a/src/store/utils.ts +++ b/src/store/utils.ts @@ -1,9 +1,10 @@ import type {Dispatch} from '@reduxjs/toolkit'; -import {AxiosResponse} from 'axios'; +import type {AxiosResponse} from 'axios'; import createToast from '../utils/createToast'; import {SET_UNAUTHENTICATED} from './reducers/authentication/authentication'; + import type {GetState} from '.'; export const nop = (result: any) => result; diff --git a/src/styles/mixins.scss b/src/styles/mixins.scss index 3bfe129860..8d12d5c8d2 100644 --- a/src/styles/mixins.scss +++ b/src/styles/mixins.scss @@ -19,22 +19,27 @@ font-size: var(--g-text-body-1-font-size); line-height: var(--g-text-body-1-line-height); } + @mixin body-2-typography() { font-size: var(--g-text-body-2-font-size); line-height: var(--g-text-body-2-line-height); } + @mixin body-3-typography() { font-size: var(--g-text-body-3-font-size); line-height: var(--g-text-body-3-line-height); } + @mixin lead-typography() { font-size: var(--g-text-subheader-3-font-size); line-height: var(--g-text-subheader-3-line-height); } + @mixin header-1-typography() { font-size: var(--g-text-header-1-font-size); line-height: var(--g-text-header-1-line-height); } + @mixin header-2-typography() { font-size: var(--g-text-header-2-font-size); line-height: var(--g-text-header-2-line-height); @@ -152,6 +157,7 @@ background-color: var(--ydb-data-table-color-hover) !important; } + /* stylelint-disable-next-line order/order */ @for $i from 0 through $nth { & .data-table__td:nth-child(#{$i}), & .data-table__head-row:first-child .data-table__th:nth-child(#{$i}) { diff --git a/src/types/additionalProps.ts b/src/types/additionalProps.ts index 724b28f76e..3ef358b5e9 100644 --- a/src/types/additionalProps.ts +++ b/src/types/additionalProps.ts @@ -1,8 +1,7 @@ -import type {ReactNode} from 'react'; - import type {InfoViewerItem} from '../components/InfoViewer'; -import type {ETenantType} from './api/tenant'; + import type {TSystemStateInfo} from './api/nodes'; +import type {ETenantType} from './api/tenant'; import type {VersionToColorMap} from './versions'; export interface AdditionalVersionsProps { @@ -21,7 +20,7 @@ export interface AdditionalClusterProps { export interface AdditionalTenantsProps { prepareTenantBackend?: (backend: string | undefined) => string | undefined; - getMonitoringLink?: (name?: string, type?: ETenantType) => ReactNode; + getMonitoringLink?: (name?: string, type?: ETenantType) => React.ReactNode; } export type NodeAddress = Pick; diff --git a/src/types/api/compute.ts b/src/types/api/compute.ts index 93481b2a3a..0cf2a54bf6 100644 --- a/src/types/api/compute.ts +++ b/src/types/api/compute.ts @@ -1,6 +1,6 @@ -import {EFlag} from './enums'; -import {TEndpoint, TLegacyNodeLocation, TPoolStats} from './nodes'; -import {TMetrics} from './tenant'; +import type {EFlag} from './enums'; +import type {TEndpoint, TLegacyNodeLocation, TPoolStats} from './nodes'; +import type {TMetrics} from './tenant'; /** * endpoint: viewer/json/compute diff --git a/src/types/api/consumer.ts b/src/types/api/consumer.ts index 97cead593c..c15086cfb7 100644 --- a/src/types/api/consumer.ts +++ b/src/types/api/consumer.ts @@ -1,6 +1,6 @@ /* eslint-disable camelcase */ -import {IProtobufTimeObject} from './common'; +import type {IProtobufTimeObject} from './common'; /** * endpoint: /json/describe_consumer diff --git a/src/types/api/nodes.ts b/src/types/api/nodes.ts index 7f9517303c..acda23fcf6 100644 --- a/src/types/api/nodes.ts +++ b/src/types/api/nodes.ts @@ -1,7 +1,7 @@ -import {EFlag} from './enums'; -import {TPDiskStateInfo} from './pdisk'; -import {TTabletStateInfo} from './tablet'; -import {TVDiskStateInfo} from './vdisk'; +import type {EFlag} from './enums'; +import type {TPDiskStateInfo} from './pdisk'; +import type {TTabletStateInfo} from './tablet'; +import type {TVDiskStateInfo} from './vdisk'; /** * endpoint: /viewer/json/nodes diff --git a/src/types/api/pdisk.ts b/src/types/api/pdisk.ts index fef14a9767..3eb77bc79a 100644 --- a/src/types/api/pdisk.ts +++ b/src/types/api/pdisk.ts @@ -1,4 +1,4 @@ -import {EFlag} from './enums'; +import type {EFlag} from './enums'; /** * endpoint: /viewer/json/pdiskinfo diff --git a/src/types/api/query.ts b/src/types/api/query.ts index 5c15c13b38..ad07918aa0 100644 --- a/src/types/api/query.ts +++ b/src/types/api/query.ts @@ -252,8 +252,8 @@ interface DefaultSchemaResult { type ResultFields = Schema extends 'modern' ? ModernSchemaResult : Schema extends 'multi' - ? MultiSchemaResult - : DefaultSchemaResult; + ? MultiSchemaResult + : DefaultSchemaResult; /** * meta.type = 'query' @@ -291,8 +291,8 @@ export type QueryAPIResponse< > = Action extends ExplainActions ? ExplainResponse : Action extends ExecuteActions - ? ExecuteResponse - : unknown; + ? ExecuteResponse + : unknown; // ==== types to use in query result preparation ==== export type AnyExplainResponse = ExplainQueryResponse | ExplainScriptResponse; diff --git a/src/types/api/schema/table.ts b/src/types/api/schema/table.ts index 94f5ac7946..44b30ca663 100644 --- a/src/types/api/schema/table.ts +++ b/src/types/api/schema/table.ts @@ -1,6 +1,6 @@ import type {TCdcStreamDescription} from './cdcStream'; -import type {TIndexDescription} from './tableIndex'; import type {EColumnCodec, EUnit, TColumnDescription, TPathID, TStorageSettings} from './shared'; +import type {TIndexDescription} from './tableIndex'; export interface TTableDescription { Name?: string; diff --git a/src/types/api/storage.ts b/src/types/api/storage.ts index 0b67891983..8c30788cbe 100644 --- a/src/types/api/storage.ts +++ b/src/types/api/storage.ts @@ -1,5 +1,5 @@ -import {EFlag} from './enums'; -import {TVDiskStateInfo} from './vdisk'; +import type {EFlag} from './enums'; +import type {TVDiskStateInfo} from './vdisk'; /** * endpoint: /viewer/json/storage diff --git a/src/types/api/systemState.ts b/src/types/api/systemState.ts index b183c67e49..c15b172944 100644 --- a/src/types/api/systemState.ts +++ b/src/types/api/systemState.ts @@ -1,4 +1,4 @@ -import {TSystemStateInfo} from './nodes'; +import type {TSystemStateInfo} from './nodes'; /** * endpoint: /viewer/json/sysinfo diff --git a/src/types/api/tablet.ts b/src/types/api/tablet.ts index aef4416385..76dcf5498e 100644 --- a/src/types/api/tablet.ts +++ b/src/types/api/tablet.ts @@ -1,4 +1,4 @@ -import {EFlag} from './enums'; +import type {EFlag} from './enums'; /** * endpoint: /viewer/json/tabletinfo diff --git a/src/types/api/tenant.ts b/src/types/api/tenant.ts index d018d26960..5b00412827 100644 --- a/src/types/api/tenant.ts +++ b/src/types/api/tenant.ts @@ -1,6 +1,6 @@ -import {EFlag} from './enums'; -import {TPoolStats, TSystemStateInfo} from './nodes'; -import {TTabletStateInfo} from './tablet'; +import type {EFlag} from './enums'; +import type {TPoolStats, TSystemStateInfo} from './nodes'; +import type {TTabletStateInfo} from './tablet'; /** * endpoint: /viewer/json/tenants diff --git a/src/types/api/topic.ts b/src/types/api/topic.ts index 5a9e0caf11..ce9158fdd2 100644 --- a/src/types/api/topic.ts +++ b/src/types/api/topic.ts @@ -1,7 +1,13 @@ /* eslint-disable camelcase */ -import {IProtobufTimeObject} from './common'; -import {Consumer, Entry, MultipleWindowsStat, PartitionStats, SupportedCodecs} from './consumer'; +import type {IProtobufTimeObject} from './common'; +import type { + Consumer, + Entry, + MultipleWindowsStat, + PartitionStats, + SupportedCodecs, +} from './consumer'; /** * endpoint: /json/describe_topic diff --git a/src/types/api/vdisk.ts b/src/types/api/vdisk.ts index 516ea22801..41e1191f3e 100644 --- a/src/types/api/vdisk.ts +++ b/src/types/api/vdisk.ts @@ -1,5 +1,5 @@ -import {EFlag} from './enums'; -import {TPDiskStateInfo} from './pdisk'; +import type {EFlag} from './enums'; +import type {TPDiskStateInfo} from './pdisk'; /** * endpoint: /viewer/json/vdiskinfo diff --git a/src/types/assets.d.ts b/src/types/assets.d.ts index 16fb1cff5a..dc5de479a1 100644 --- a/src/types/assets.d.ts +++ b/src/types/assets.d.ts @@ -1,5 +1,6 @@ declare module '*.svg' { - const content: SVGIconData; + // eslint-disable-next-line @typescript-eslint/consistent-type-imports + const content: import('@gravity-ui/uikit').IconData; export default content; } @@ -7,5 +8,3 @@ declare module '*.png'; declare module '*.jpg'; declare module '*.jpeg'; declare module '*.ico'; - -declare type SVGIconData = import('@gravity-ui/uikit/build/esm/components/Icon/types').SVGIconData; diff --git a/src/types/bem-cn-lite.d.ts b/src/types/bem-cn-lite.d.ts deleted file mode 100644 index 477e9bf3ca..0000000000 --- a/src/types/bem-cn-lite.d.ts +++ /dev/null @@ -1,26 +0,0 @@ -// copy from bem-cn-lite with export Modifications -declare module 'bem-cn-lite' { - export interface Modifications { - [name: string]: string | boolean | undefined; - } - - declare function bemClassNameLite(blockName: string): { - ( - elementName: string, - modifiers: Modifications | null, - mixin?: string | string[] | undefined, - ): string; - (elementName: string, mixin?: string | string[] | undefined): string; - (elementName: string, modifiers: Modifications): string; - (mods: Modifications | null, mixin?: string | string[] | undefined): string; - (elementName: string): string; - (mods: Modifications | null): string; - (): string; - builder(): import('bem-cn').Block; - }; - declare namespace bemClassNameLite { - let setup: (config: import('bem-cn').BemSettings) => void; - let reset: () => void; - } - export default bemClassNameLite; -} diff --git a/src/types/redux-location-state.d.ts b/src/types/redux-location-state.d.ts index ed357e7009..29d6fb4151 100644 --- a/src/types/redux-location-state.d.ts +++ b/src/types/redux-location-state.d.ts @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/no-duplicate-imports */ declare module 'redux-location-state' { import type {Middleware, Reducer, Store} from '@reduxjs/toolkit'; - import type {History, Location} from 'History'; + import type {History, Location} from 'history'; export function listenForHistoryChange(store: Store, history: History): void; @@ -42,7 +42,7 @@ declare module 'redux-location-state' { } declare module 'redux-location-state/lib/parseQuery' { - import {ParamSetup} from 'redux-location-state'; + import type {ParamSetup} from 'redux-location-state'; export function parseQuery(setupObject: ParamSetup, payload: any): Record; } @@ -52,13 +52,13 @@ declare module 'redux-location-state/lib/constants' { } declare module 'redux-location-state/lib/helpers' { + import type {Location} from 'history'; import type {ParamSetup} from 'redux-location-state'; - import type {Location} from 'History'; export function getMatchingDeclaredPath(setupObject: ParamSetup, location: Location): string; } declare module 'redux-location-state/lib/stateToParams' { - import type {Location} from 'History'; + import type {Location} from 'history'; import type {ParamSetup} from 'redux-location-state'; export function stateToParams( setupObject: ParamSetup, diff --git a/src/types/store/describe.ts b/src/types/store/describe.ts index 0ce9734009..49c8a32d83 100644 --- a/src/types/store/describe.ts +++ b/src/types/store/describe.ts @@ -1,11 +1,11 @@ -import { +import type { FETCH_DESCRIBE, setCurrentDescribePath, setDataWasNotLoaded, } from '../../store/reducers/describe'; -import {ApiRequestAction} from '../../store/utils'; -import {IResponseError} from '../api/error'; -import {TEvDescribeSchemeResult} from '../api/schema'; +import type {ApiRequestAction} from '../../store/utils'; +import type {IResponseError} from '../api/error'; +import type {TEvDescribeSchemeResult} from '../api/schema'; export type IDescribeData = Record; diff --git a/src/types/store/executeQuery.ts b/src/types/store/executeQuery.ts index a8c94f473e..ee1d71da09 100644 --- a/src/types/store/executeQuery.ts +++ b/src/types/store/executeQuery.ts @@ -1,12 +1,13 @@ -import { +import type { SEND_QUERY, changeUserInput, - saveQueryToHistory, - goToPreviousQuery, goToNextQuery, + goToPreviousQuery, + saveQueryToHistory, setTenantPath, } from '../../store/reducers/executeQuery'; import type {ApiRequestAction} from '../../store/utils'; + import type {IQueryResult, QueryError, QueryErrorResponse} from './query'; export interface QueryInHistory { diff --git a/src/types/store/explainQuery.ts b/src/types/store/explainQuery.ts index 43e80e3960..2de5a94787 100644 --- a/src/types/store/explainQuery.ts +++ b/src/types/store/explainQuery.ts @@ -1,8 +1,9 @@ import type {ExplainPlanNodeData, GraphNode, Link} from '@gravity-ui/paranoid'; -import {GET_EXPLAIN_QUERY, GET_EXPLAIN_QUERY_AST} from '../../store/reducers/explainQuery'; +import type {GET_EXPLAIN_QUERY, GET_EXPLAIN_QUERY_AST} from '../../store/reducers/explainQuery'; import type {ApiRequestAction} from '../../store/utils'; import type {PlanTable, QueryPlan, ScriptPlan} from '../api/query'; + import type {IQueryResult, QueryError, QueryErrorResponse} from './query'; export interface PreparedExplainResponse { diff --git a/src/types/store/heatmap.ts b/src/types/store/heatmap.ts index ff1686943a..289b11475c 100644 --- a/src/types/store/heatmap.ts +++ b/src/types/store/heatmap.ts @@ -1,9 +1,8 @@ +import type {FETCH_HEATMAP, setHeatmapOptions} from '../../store/reducers/heatmap'; import type {ApiRequestAction} from '../../store/utils'; -import {FETCH_HEATMAP, setHeatmapOptions} from '../../store/reducers/heatmap'; - import type {IResponseError} from '../api/error'; -import type {TTabletStateInfo} from '../api/tablet'; import type {TTableStats} from '../api/schema'; +import type {TTabletStateInfo} from '../api/tablet'; import type {TMetrics} from '../api/tenant'; export interface IHeatmapTabletData extends TTabletStateInfo { diff --git a/src/types/store/host.ts b/src/types/store/host.ts index e860d6b8ac..36fa0da768 100644 --- a/src/types/store/host.ts +++ b/src/types/store/host.ts @@ -1,5 +1,4 @@ -import {FETCH_HOST} from '../../store/reducers/host'; - +import type {FETCH_HOST} from '../../store/reducers/host'; import type {ApiRequestAction} from '../../store/utils'; import type {IResponseError} from '../api/error'; import type {TSystemStateInfo} from '../api/nodes'; diff --git a/src/types/store/nodesList.ts b/src/types/store/nodesList.ts index a0fc659342..ae0ad15a2d 100644 --- a/src/types/store/nodesList.ts +++ b/src/types/store/nodesList.ts @@ -1,5 +1,4 @@ -import {FETCH_NODES_LIST} from '../../store/reducers/nodesList'; - +import type {FETCH_NODES_LIST} from '../../store/reducers/nodesList'; import type {ApiRequestAction} from '../../store/utils'; import type {IResponseError} from '../api/error'; import type {TEvNodesInfo} from '../api/nodesList'; diff --git a/src/types/store/olapStats.ts b/src/types/store/olapStats.ts index 01867cd1a5..acc9768f18 100644 --- a/src/types/store/olapStats.ts +++ b/src/types/store/olapStats.ts @@ -1,5 +1,6 @@ -import {FETCH_OLAP_STATS, resetLoadingState} from '../../store/reducers/olapStats'; +import type {FETCH_OLAP_STATS, resetLoadingState} from '../../store/reducers/olapStats'; import type {ApiRequestAction} from '../../store/utils'; + import type {IQueryResult} from './query'; export interface OlapStatsState { diff --git a/src/types/store/query.ts b/src/types/store/query.ts index 069688d44f..aded93c7a8 100644 --- a/src/types/store/query.ts +++ b/src/types/store/query.ts @@ -1,12 +1,11 @@ -import {QUERY_ACTIONS, QUERY_MODES, QUERY_SYNTAX} from '../../utils/query'; - +import type {QUERY_ACTIONS, QUERY_MODES, QUERY_SYNTAX} from '../../utils/query'; import type {IResponseError, NetworkError} from '../api/error'; import type { - KeyValueRow, ColumnType, + KeyValueRow, ErrorResponse as QueryErrorResponseData, - ScriptPlan, QueryPlan, + ScriptPlan, TKqpStatsQuery, } from '../api/query'; import type {ValueOf} from '../common'; diff --git a/src/types/store/tablet.ts b/src/types/store/tablet.ts index 4440a908fe..51854bcd59 100644 --- a/src/types/store/tablet.ts +++ b/src/types/store/tablet.ts @@ -1,9 +1,12 @@ +import type { + FETCH_TABLET, + FETCH_TABLET_DESCRIBE, + clearTabletData, +} from '../../store/reducers/tablet'; import type {ApiRequestAction} from '../../store/utils'; import type {IResponseError} from '../api/error'; import type {ETabletState, TTabletStateInfo} from '../api/tablet'; -import {FETCH_TABLET, FETCH_TABLET_DESCRIBE, clearTabletData} from '../../store/reducers/tablet'; - export interface ITabletPreparedHistoryItem { nodeId: string; generation: number | undefined; diff --git a/src/types/store/tablets.ts b/src/types/store/tablets.ts index 856f86c5c2..30fb0e1cfb 100644 --- a/src/types/store/tablets.ts +++ b/src/types/store/tablets.ts @@ -1,13 +1,12 @@ -import type {ApiRequestAction} from '../../store/utils'; -import { - clearWasLoadingFlag, +import type { FETCH_TABLETS, + clearWasLoadingFlag, setStateFilter, setTypeFilter, } from '../../store/reducers/tablets'; - +import type {ApiRequestAction} from '../../store/utils'; import type {IResponseError} from '../api/error'; -import type {TEvTabletStateResponse, EType, ETabletState} from '../api/tablet'; +import type {ETabletState, EType, TEvTabletStateResponse} from '../api/tablet'; export interface ITabletsState { loading: boolean; diff --git a/src/types/store/tooltip.ts b/src/types/store/tooltip.ts index 989ad7f47a..e3357dbc55 100644 --- a/src/types/store/tooltip.ts +++ b/src/types/store/tooltip.ts @@ -1,5 +1,5 @@ -import {hideTooltip, showTooltip} from '../../store/reducers/tooltip'; -import {tooltipTemplates} from '../../utils/tooltip'; +import type {hideTooltip, showTooltip} from '../../store/reducers/tooltip'; +import type {tooltipTemplates} from '../../utils/tooltip'; export type ITooltipTemplateType = keyof typeof tooltipTemplates; diff --git a/src/types/store/topic.ts b/src/types/store/topic.ts index 09dd1c8697..5706b432c9 100644 --- a/src/types/store/topic.ts +++ b/src/types/store/topic.ts @@ -1,4 +1,4 @@ -import {FETCH_TOPIC, cleanTopicData, setDataWasNotLoaded} from '../../store/reducers/topic'; +import type {FETCH_TOPIC, cleanTopicData, setDataWasNotLoaded} from '../../store/reducers/topic'; import type {ApiRequestAction} from '../../store/utils'; import type {ProcessSpeedStats} from '../../utils/bytesParsers'; import type {IResponseError} from '../api/error'; diff --git a/src/types/window.d.ts b/src/types/window.d.ts index 43a044fe8d..a100bc79d4 100644 --- a/src/types/window.d.ts +++ b/src/types/window.d.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/consistent-type-imports */ enum RumErrorLevel { DEBUG = 'debug', ERROR = 'error', @@ -35,8 +36,6 @@ interface Window { custom_backend?: string; meta_backend?: string; - store?: import('@reduxjs/toolkit').Store; - userSettings?: import('../services/settings').SettingsObject; systemSettings?: import('../services/settings').SettingsObject; diff --git a/src/utils/__test__/parseBalancer.test.ts b/src/utils/__test__/parseBalancer.test.ts index 6b38b418fb..07ee2af3b8 100644 --- a/src/utils/__test__/parseBalancer.test.ts +++ b/src/utils/__test__/parseBalancer.test.ts @@ -1,9 +1,9 @@ import { - removeViewerPathname, - removeProtocol, - removePort, getCleanBalancerValue, parseBalancer, + removePort, + removeProtocol, + removeViewerPathname, } from '../parseBalancer'; describe('parseBalancer', () => { diff --git a/src/utils/__test__/prepareBackend.test.ts b/src/utils/__test__/prepareBackend.test.ts index fa0c71b711..a42cf23672 100644 --- a/src/utils/__test__/prepareBackend.test.ts +++ b/src/utils/__test__/prepareBackend.test.ts @@ -1,4 +1,4 @@ -import {prepareHost, getBackendFromNodeHost, getBackendFromRawNodeData} from '../prepareBackend'; +import {getBackendFromNodeHost, getBackendFromRawNodeData, prepareHost} from '../prepareBackend'; describe('prepareHost', () => { it('should add vm prefix to cloud din nodes', () => { diff --git a/src/utils/additionalProps.ts b/src/utils/additionalProps.ts index 7b7c24ee7c..7ff5c8d21a 100644 --- a/src/utils/additionalProps.ts +++ b/src/utils/additionalProps.ts @@ -1,5 +1,5 @@ -import type {AdditionalNodesProps, NodeAddress} from '../types/additionalProps'; import {backend} from '../store'; +import type {AdditionalNodesProps, NodeAddress} from '../types/additionalProps'; import {getBackendFromRawNodeData} from './prepareBackend'; diff --git a/src/utils/bytesParsers/convertBytesObjectToSpeed.ts b/src/utils/bytesParsers/convertBytesObjectToSpeed.ts index 5ea58afbff..5c6871fbbe 100644 --- a/src/utils/bytesParsers/convertBytesObjectToSpeed.ts +++ b/src/utils/bytesParsers/convertBytesObjectToSpeed.ts @@ -1,5 +1,4 @@ import type {MultipleWindowsStat} from '../../types/api/consumer'; - import {DAY_IN_SECONDS, HOUR_IN_SECONDS, MINUTE_IN_SECONDS} from '../constants'; export interface ProcessSpeedStats { diff --git a/src/utils/bytesParsers/formatBytes.ts b/src/utils/bytesParsers/formatBytes.ts index 607fa3b613..c5d4745986 100644 --- a/src/utils/bytesParsers/formatBytes.ts +++ b/src/utils/bytesParsers/formatBytes.ts @@ -1,5 +1,5 @@ -import {formatNumber, roundToPrecision} from '../dataFormatters/dataFormatters'; import {GIGABYTE, KILOBYTE, MEGABYTE, TERABYTE} from '../constants'; +import {formatNumber, roundToPrecision} from '../dataFormatters/dataFormatters'; import {isNumeric} from '../utils'; import i18n from './i18n'; diff --git a/src/utils/bytesParsers/i18n/index.ts b/src/utils/bytesParsers/i18n/index.ts index 14263047f9..5fb2deaec1 100644 --- a/src/utils/bytesParsers/i18n/index.ts +++ b/src/utils/bytesParsers/i18n/index.ts @@ -1,11 +1,8 @@ -import {i18n, Lang} from '../../i18n'; +import {registerKeysets} from '../../i18n'; import en from './en.json'; import ru from './ru.json'; const COMPONENT = 'ydb-bytes-parsers'; -i18n.registerKeyset(Lang.En, COMPONENT, en); -i18n.registerKeyset(Lang.Ru, COMPONENT, ru); - -export default i18n.keyset(COMPONENT); +export default registerKeysets(COMPONENT, {ru, en}); diff --git a/src/utils/clusterVersionColors.ts b/src/utils/clusterVersionColors.ts index 19425e7e95..c45a1e246d 100644 --- a/src/utils/clusterVersionColors.ts +++ b/src/utils/clusterVersionColors.ts @@ -2,6 +2,7 @@ import uniqBy from 'lodash/uniqBy'; import type {MetaClusterVersion} from '../types/api/meta'; import type {VersionToColorMap} from '../types/versions'; + import {COLORS, GREY_COLOR, getMinorVersion, hashCode} from './versions'; const UNDEFINED_COLOR_INDEX = '__no_color__'; diff --git a/src/utils/cn.ts b/src/utils/cn.ts index 4510275f45..ba14f81e43 100644 --- a/src/utils/cn.ts +++ b/src/utils/cn.ts @@ -1,3 +1,6 @@ -import cn from 'bem-cn-lite'; +import {withNaming} from '@bem-react/classname'; -export {cn}; +export const cn = withNaming({ + e: '__', + m: '_', +}); diff --git a/src/utils/createToast.tsx b/src/utils/createToast.tsx index d78269629d..d2a0e3c3af 100644 --- a/src/utils/createToast.tsx +++ b/src/utils/createToast.tsx @@ -1,6 +1,6 @@ -import {Toaster} from '@gravity-ui/uikit'; +import {toaster} from '@gravity-ui/uikit/toaster-singleton-react-18'; -export const toaster = new Toaster(); +export {toaster}; interface CreateToastProps { name?: string; @@ -13,7 +13,7 @@ function createToast({name, title, type, content}: CreateToastProps) { return toaster.add({ name: name ?? 'Request succeeded', title: title ?? 'Request succeeded', - type: type ?? 'success', + theme: type === 'error' ? 'danger' : 'success', content: content, isClosable: true, autoHiding: type === 'success' ? 5000 : false, diff --git a/src/utils/dataFormatters/dataFormatters.ts b/src/utils/dataFormatters/dataFormatters.ts index 542b991691..063506ce74 100644 --- a/src/utils/dataFormatters/dataFormatters.ts +++ b/src/utils/dataFormatters/dataFormatters.ts @@ -1,14 +1,14 @@ import {dateTimeParse} from '@gravity-ui/date-utils'; import type {TVDiskID, TVSlotId} from '../../types/api/vdisk'; -import {DAY_IN_SECONDS, GIGABYTE} from '../constants'; -import {configuredNumeral} from '../numeral'; -import {isNumeric} from '../utils'; import { - type BytesSizes, formatBytes as formatBytesCustom, getSizeWithSignificantDigits, } from '../bytesParsers/formatBytes'; +import type {BytesSizes} from '../bytesParsers/formatBytes'; +import {DAY_IN_SECONDS, GIGABYTE} from '../constants'; +import {configuredNumeral} from '../numeral'; +import {isNumeric} from '../utils'; import i18n from './i18n'; diff --git a/src/utils/dataFormatters/i18n/index.ts b/src/utils/dataFormatters/i18n/index.ts index ae7d212e21..3a60fdb981 100644 --- a/src/utils/dataFormatters/i18n/index.ts +++ b/src/utils/dataFormatters/i18n/index.ts @@ -1,11 +1,8 @@ -import {i18n, Lang} from '../../i18n'; +import {registerKeysets} from '../../i18n'; import en from './en.json'; import ru from './ru.json'; const COMPONENT = 'ydb-format-cpu'; -i18n.registerKeyset(Lang.En, COMPONENT, en); -i18n.registerKeyset(Lang.Ru, COMPONENT, ru); - -export default i18n.keyset(COMPONENT); +export default registerKeysets(COMPONENT, {ru, en}); diff --git a/src/utils/diagnostics.ts b/src/utils/diagnostics.ts index 7c8a2d1e4d..e0b5f8f1bc 100644 --- a/src/utils/diagnostics.ts +++ b/src/utils/diagnostics.ts @@ -1,4 +1,4 @@ -import {ValueOf} from '../types/common'; +import type {ValueOf} from '../types/common'; const TOP_SHARDS_SORT_VALUES = { CPUCores: 'CPUCores', diff --git a/src/utils/disks/calculatePDiskSeverity.ts b/src/utils/disks/calculatePDiskSeverity.ts index 8c6fe9635b..de4ddcd298 100644 --- a/src/utils/disks/calculatePDiskSeverity.ts +++ b/src/utils/disks/calculatePDiskSeverity.ts @@ -1,6 +1,7 @@ import {EFlag} from '../../types/api/enums'; import type {TPDiskState, TPDiskStateInfo} from '../../types/api/pdisk'; import {generateEvaluator} from '../generateEvaluator'; + import { DISK_COLOR_STATE_TO_NUMERIC_SEVERITY, NOT_AVAILABLE_SEVERITY, diff --git a/src/utils/disks/calculateVDiskSeverity.ts b/src/utils/disks/calculateVDiskSeverity.ts index c44b818890..2e5715f3be 100644 --- a/src/utils/disks/calculateVDiskSeverity.ts +++ b/src/utils/disks/calculateVDiskSeverity.ts @@ -1,5 +1,6 @@ import type {EFlag} from '../../types/api/enums'; -import {EVDiskState, type TVDiskStateInfo} from '../../types/api/vdisk'; +import type {EVDiskState, TVDiskStateInfo} from '../../types/api/vdisk'; + import { DISK_COLOR_STATE_TO_NUMERIC_SEVERITY, NOT_AVAILABLE_SEVERITY, diff --git a/src/utils/disks/helpers.ts b/src/utils/disks/helpers.ts index 5441a6b92b..8370b44ce9 100644 --- a/src/utils/disks/helpers.ts +++ b/src/utils/disks/helpers.ts @@ -1,4 +1,5 @@ import type {TVDiskStateInfo, TVSlotId} from '../../types/api/vdisk'; + import {DISK_NUMERIC_SEVERITY_TO_STATE_COLOR, NOT_AVAILABLE_SEVERITY_COLOR} from './constants'; export function isFullVDiskData(disk: TVDiskStateInfo | TVSlotId): disk is TVDiskStateInfo { diff --git a/src/utils/disks/prepareDisks.ts b/src/utils/disks/prepareDisks.ts index e559247c04..ce0b30bfbe 100644 --- a/src/utils/disks/prepareDisks.ts +++ b/src/utils/disks/prepareDisks.ts @@ -1,6 +1,7 @@ import type {TPDiskStateInfo} from '../../types/api/pdisk'; import type {TVDiskStateInfo} from '../../types/api/vdisk'; import {isNumeric} from '../utils'; + import {calculatePDiskSeverity} from './calculatePDiskSeverity'; import {calculateVDiskSeverity} from './calculateVDiskSeverity'; import {getPDiskType} from './getPDiskType'; diff --git a/src/utils/disks/types.ts b/src/utils/disks/types.ts index fac29e60c9..eba691ae15 100644 --- a/src/utils/disks/types.ts +++ b/src/utils/disks/types.ts @@ -1,6 +1,7 @@ import type {TPDiskStateInfo} from '../../types/api/pdisk'; import type {TVDiskStateInfo, TVSlotId} from '../../types/api/vdisk'; import type {ValueOf} from '../../types/common'; + import type {PDISK_TYPES} from './getPDiskType'; export interface PreparedPDisk extends TPDiskStateInfo { diff --git a/src/utils/filters.ts b/src/utils/filters.ts index d7b357ac15..9fd8e791c9 100644 --- a/src/utils/filters.ts +++ b/src/utils/filters.ts @@ -1,7 +1,6 @@ -import escapeRegExp from 'lodash/escapeRegExp'; - import type {OrderType} from '@gravity-ui/react-data-table'; import {DESCENDING} from '@gravity-ui/react-data-table/build/esm/lib/constants'; +import escapeRegExp from 'lodash/escapeRegExp'; export const prepareSortValue = ( sortValue: string | undefined, diff --git a/src/utils/hooks/useAutofetcher.ts b/src/utils/hooks/useAutofetcher.ts index d9a2a4ab59..16272f75da 100644 --- a/src/utils/hooks/useAutofetcher.ts +++ b/src/utils/hooks/useAutofetcher.ts @@ -1,13 +1,13 @@ -import {DependencyList, useEffect, useRef} from 'react'; +import React from 'react'; import {AutoFetcher} from '../autofetcher'; export const useAutofetcher = ( fetchData: (isBackground: boolean) => void, - deps: DependencyList, + deps: React.DependencyList, enabled = true, ) => { - const ref = useRef(null); + const ref = React.useRef(null); if (ref.current === null) { ref.current = new AutoFetcher(); @@ -16,11 +16,11 @@ export const useAutofetcher = ( const autofetcher = ref.current; // initial fetch - useEffect(() => { + React.useEffect(() => { fetchData(false); }, deps); // eslint-disable-line react-hooks/exhaustive-deps - useEffect(() => { + React.useEffect(() => { autofetcher.stop(); if (enabled) { diff --git a/src/utils/hooks/useNodesRequestParams.ts b/src/utils/hooks/useNodesRequestParams.ts index 86d554e277..4aa047554e 100644 --- a/src/utils/hooks/useNodesRequestParams.ts +++ b/src/utils/hooks/useNodesRequestParams.ts @@ -1,10 +1,11 @@ -import {useMemo} from 'react'; +import React from 'react'; import type {NodesGeneralRequestParams} from '../../store/reducers/nodes/types'; import type {ProblemFilterValue} from '../../store/reducers/settings/types'; - import {USE_BACKEND_PARAMS_FOR_TABLES_KEY} from '../constants'; -import {NodesUptimeFilterValues, getProblemParamValue, getUptimeParamValue} from '../nodes'; +import type {NodesUptimeFilterValues} from '../nodes'; +import {getProblemParamValue, getUptimeParamValue} from '../nodes'; + import {useSetting} from './useSetting'; interface NodesRawRequestParams @@ -24,7 +25,7 @@ export const useNodesRequestParams = ({ // If backend params are enabled, update params value to use them in fetch request // Otherwise no params will be updated, no hooks that depend on requestParams will be triggered - return useMemo(() => { + return React.useMemo(() => { if (useBackendParamsForTables) { const problemsOnly = getProblemParamValue(problemFilter); const uptime = getUptimeParamValue(nodesUptimeFilter); diff --git a/src/utils/hooks/useQueryModes.ts b/src/utils/hooks/useQueryModes.ts index 5e5bc5c6d9..165c1a8d26 100644 --- a/src/utils/hooks/useQueryModes.ts +++ b/src/utils/hooks/useQueryModes.ts @@ -1,5 +1,6 @@ import type {QueryMode} from '../../types/store/query'; import {QUERY_INITIAL_MODE_KEY} from '../constants'; + import {useSetting} from './useSetting'; export const useQueryModes = () => { diff --git a/src/utils/hooks/useSetting.ts b/src/utils/hooks/useSetting.ts index f681867db2..f9e06e7da6 100644 --- a/src/utils/hooks/useSetting.ts +++ b/src/utils/hooks/useSetting.ts @@ -1,9 +1,9 @@ -import {useCallback} from 'react'; +import React from 'react'; import {getSettingValue, setSettingValue} from '../../store/reducers/settings/settings'; -import {useTypedSelector} from './useTypedSelector'; import {useTypedDispatch} from './useTypedDispatch'; +import {useTypedSelector} from './useTypedSelector'; export const useSetting = (key: string, defaultValue?: T): [T, (value: T) => void] => { const dispatch = useTypedDispatch(); @@ -13,7 +13,7 @@ export const useSetting = (key: string, defaultValue?: T): [T, (value: T) => return (getSettingValue(state, key) ?? defaultValue) as T; }); - const setValue = useCallback( + const setValue = React.useCallback( (value: T) => { dispatch(setSettingValue(key, value)); }, diff --git a/src/utils/hooks/useStorageRequestParams.ts b/src/utils/hooks/useStorageRequestParams.ts index a81ab6d5d6..ada435d434 100644 --- a/src/utils/hooks/useStorageRequestParams.ts +++ b/src/utils/hooks/useStorageRequestParams.ts @@ -1,8 +1,9 @@ -import {useMemo} from 'react'; +import React from 'react'; import type {StorageSortAndFilterParams} from '../../store/reducers/storage/types'; import {EVersion} from '../../types/api/storage'; import {USE_BACKEND_PARAMS_FOR_TABLES_KEY} from '../constants'; + import {useSetting} from './useSetting'; export const useStorageRequestParams = ({ @@ -14,7 +15,7 @@ export const useStorageRequestParams = ({ // If backend params are enabled, update params value to use them in fetch request // Otherwise no params will be updated, no hooks that depend on requestParams will be triggered - return useMemo(() => { + return React.useMemo(() => { if (useBackendParamsForTables) { return { version: EVersion.v2, diff --git a/src/utils/hooks/useTableResize.ts b/src/utils/hooks/useTableResize.ts index 481a64b89d..8180a6896c 100644 --- a/src/utils/hooks/useTableResize.ts +++ b/src/utils/hooks/useTableResize.ts @@ -1,6 +1,9 @@ -import {useCallback, useState} from 'react'; +import React from 'react'; + import type {Column as DataTableColumn} from '@gravity-ui/react-data-table'; -import {DEFAULT_RESIZEABLE, type Column as VirtualTableColumn} from '../../components/VirtualTable'; + +import {DEFAULT_RESIZEABLE} from '../../components/VirtualTable'; +import type {Column as VirtualTableColumn} from '../../components/VirtualTable'; import {settingsManager} from '../../services/settings'; export type Column = VirtualTableColumn & DataTableColumn; @@ -26,16 +29,18 @@ export const updateColumnsWidth = ( export const useTableResize = ( localStorageKey: string, ): [TableColumnsWidthSetup, HandleTableColumnsResize] => { - const [tableColumnsWidthSetup, setTableColumnsWidth] = useState(() => { - const setupFromLS = settingsManager.readUserSettingsValue( - localStorageKey, - {}, - ) as TableColumnsWidthSetup; - - return setupFromLS; - }); + const [tableColumnsWidthSetup, setTableColumnsWidth] = React.useState( + () => { + const setupFromLS = settingsManager.readUserSettingsValue( + localStorageKey, + {}, + ) as TableColumnsWidthSetup; + + return setupFromLS; + }, + ); - const handleSetupChange: HandleTableColumnsResize = useCallback( + const handleSetupChange: HandleTableColumnsResize = React.useCallback( (newSetup) => { setTableColumnsWidth((previousSetup) => { // ResizeObserver callback may be triggered only for currently resized column diff --git a/src/utils/hooks/useTableSort.ts b/src/utils/hooks/useTableSort.ts index 11398b604d..e5daeb08c5 100644 --- a/src/utils/hooks/useTableSort.ts +++ b/src/utils/hooks/useTableSort.ts @@ -1,6 +1,6 @@ -import {useMemo} from 'react'; +import React from 'react'; -import {OrderType, SortOrder} from '@gravity-ui/react-data-table'; +import type {OrderType, SortOrder} from '@gravity-ui/react-data-table'; import {DESCENDING} from '@gravity-ui/react-data-table/build/esm/lib/constants'; interface SortParams { @@ -14,7 +14,7 @@ export const useTableSort = ( {sortValue, sortOrder = DESCENDING}: SortParams, onSort: (params: SortParams) => void, ): [SortOrder | undefined, HandleSort] => { - const sort: SortOrder | undefined = useMemo(() => { + const sort: SortOrder | undefined = React.useMemo(() => { if (!sortValue) { return undefined; } diff --git a/src/utils/hooks/useTypedDispatch.ts b/src/utils/hooks/useTypedDispatch.ts index 0784fe0fd0..6be5ec416b 100644 --- a/src/utils/hooks/useTypedDispatch.ts +++ b/src/utils/hooks/useTypedDispatch.ts @@ -1,4 +1,5 @@ import {useDispatch} from 'react-redux'; + import type {AppDispatch} from '../../store'; export const useTypedDispatch: () => AppDispatch = useDispatch; diff --git a/src/utils/hooks/useTypedSelector.ts b/src/utils/hooks/useTypedSelector.ts index 1926b63e6a..a437d789fd 100644 --- a/src/utils/hooks/useTypedSelector.ts +++ b/src/utils/hooks/useTypedSelector.ts @@ -1,4 +1,5 @@ -import {TypedUseSelectorHook, useSelector} from 'react-redux'; +import type {TypedUseSelectorHook} from 'react-redux'; +import {useSelector} from 'react-redux'; import type {RootState} from '../../store'; diff --git a/src/utils/i18n/i18n.ts b/src/utils/i18n/i18n.ts index c4161386c3..09ed7ec269 100644 --- a/src/utils/i18n/i18n.ts +++ b/src/utils/i18n/i18n.ts @@ -1,11 +1,9 @@ -import {I18N, KeysData} from '@gravity-ui/i18n'; +import type {KeysData} from '@gravity-ui/i18n'; +import {I18N} from '@gravity-ui/i18n'; import {configure as configureUiKit} from '@gravity-ui/uikit'; -import {configure as configureUiKitComponents} from '@gravity-ui/components'; -import {configure as configureUiKitNavigation} from '@gravity-ui/navigation'; -import {configure as configureYdbUiComponents} from 'ydb-ui-components'; -import {LANGUAGE_KEY} from '../constants'; import {settingsManager} from '../../services/settings'; +import {LANGUAGE_KEY} from '../constants'; enum Lang { En = 'en', @@ -22,10 +20,7 @@ const i18n = new I18N({ fallbackLang: Lang.En, }); -configureYdbUiComponents({lang: currentLang}); configureUiKit({lang: currentLang}); -configureUiKitComponents({lang: currentLang}); -configureUiKitNavigation({lang: currentLang}); export function registerKeysets(id: string, data: Record) { type Keys = Extract; diff --git a/src/utils/lazyComponent.tsx b/src/utils/lazyComponent.tsx index 7d077b09dc..837890f77f 100644 --- a/src/utils/lazyComponent.tsx +++ b/src/utils/lazyComponent.tsx @@ -1,8 +1,9 @@ -import * as React from 'react'; +import React from 'react'; import {Loader} from '@gravity-ui/uikit'; -import {ErrorBoundaryFallback} from '../components/ErrorBoundary/ErrorBoundary'; + import {useComponent} from '../components/ComponentsProvider/ComponentsProvider'; +import {ErrorBoundaryFallback} from '../components/ErrorBoundary/ErrorBoundary'; export function lazyComponent( moduleLoader: () => Promise, diff --git a/src/utils/monaco/s-expression/registerLanguage.ts b/src/utils/monaco/s-expression/registerLanguage.ts index 1ff5188496..b56e14e7ec 100644 --- a/src/utils/monaco/s-expression/registerLanguage.ts +++ b/src/utils/monaco/s-expression/registerLanguage.ts @@ -1,4 +1,5 @@ import * as monaco from 'monaco-editor'; + import {LANGUAGE_S_EXPRESSION_ID} from './constants'; export function registerSExpressionLanguage() { diff --git a/src/utils/monaco/yqlSuggestions/generateSuggestions.ts b/src/utils/monaco/yqlSuggestions/generateSuggestions.ts index 4f5d402f81..d5b746d13c 100644 --- a/src/utils/monaco/yqlSuggestions/generateSuggestions.ts +++ b/src/utils/monaco/yqlSuggestions/generateSuggestions.ts @@ -1,9 +1,9 @@ -import type * as monaco from 'monaco-editor/esm/vs/editor/editor.api'; import type { ColumnAliasSuggestion, KeywordSuggestion, YqlAutocompleteResult, } from '@gravity-ui/websql-autocomplete'; +import type * as monaco from 'monaco-editor/esm/vs/editor/editor.api'; import { AggregateFunctions, @@ -16,7 +16,7 @@ import { } from './constants'; const CompletionItemKind: { - [K in keyof typeof monaco.languages.CompletionItemKind]: typeof monaco.languages.CompletionItemKind[K]; + [K in keyof typeof monaco.languages.CompletionItemKind]: (typeof monaco.languages.CompletionItemKind)[K]; } = { Method: 0, Function: 1, diff --git a/src/utils/monaco/yqlSuggestions/registerCompletionItemProvider.ts b/src/utils/monaco/yqlSuggestions/registerCompletionItemProvider.ts index 0fc6f5cddd..24bb74b6e7 100644 --- a/src/utils/monaco/yqlSuggestions/registerCompletionItemProvider.ts +++ b/src/utils/monaco/yqlSuggestions/registerCompletionItemProvider.ts @@ -1,4 +1,5 @@ import * as monaco from 'monaco-editor'; + import {createProvideSuggestionsFunction} from './yqlSuggestions'; let completionProvider: monaco.IDisposable | undefined; diff --git a/src/utils/monaco/yqlSuggestions/yqlSuggestions.ts b/src/utils/monaco/yqlSuggestions/yqlSuggestions.ts index 39ed09d000..f3cff89108 100644 --- a/src/utils/monaco/yqlSuggestions/yqlSuggestions.ts +++ b/src/utils/monaco/yqlSuggestions/yqlSuggestions.ts @@ -1,5 +1,5 @@ -import type Monaco from 'monaco-editor'; import type {CursorPosition} from '@gravity-ui/websql-autocomplete'; +import type Monaco from 'monaco-editor'; import { generateAggregateFunctionsSuggestion, @@ -63,14 +63,12 @@ async function getSuggestions( functionsSuggestions = await generateSimpleFunctionsSuggestion(rangeToInsertSuggestion); } if (parseResult.suggestAggregateFunctions) { - aggregateFunctionsSuggestions = await generateAggregateFunctionsSuggestion( - rangeToInsertSuggestion, - ); + aggregateFunctionsSuggestions = + await generateAggregateFunctionsSuggestion(rangeToInsertSuggestion); } if (parseResult.suggestWindowFunctions) { - windowFunctionsSuggestions = await generateWindowFunctionsSuggestion( - rangeToInsertSuggestion, - ); + windowFunctionsSuggestions = + await generateWindowFunctionsSuggestion(rangeToInsertSuggestion); } if (parseResult.suggestTableFunctions) { tableFunctionsSuggestions = await generateTableFunctionsSuggestion(rangeToInsertSuggestion); diff --git a/src/utils/nodes.ts b/src/utils/nodes.ts index ff493cabe1..a7aa66c9da 100644 --- a/src/utils/nodes.ts +++ b/src/utils/nodes.ts @@ -1,14 +1,14 @@ -import type {TSystemStateInfo} from '../types/api/nodes'; -import type {TNodeInfo} from '../types/api/nodesList'; import type {NodesPreparedEntity} from '../store/reducers/nodes/types'; -import type {NodesMap} from '../types/store/nodesList'; -import type {ValueOf} from '../types/common'; -import type {ProblemFilterValue} from '../store/reducers/settings/types'; import {ProblemFilterValues} from '../store/reducers/settings/settings'; +import type {ProblemFilterValue} from '../store/reducers/settings/types'; import {EFlag} from '../types/api/enums'; +import type {TSystemStateInfo} from '../types/api/nodes'; +import type {TNodeInfo} from '../types/api/nodesList'; +import type {ValueOf} from '../types/common'; +import type {NodesMap} from '../types/store/nodesList'; -import {calcUptime} from './dataFormatters/dataFormatters'; import {HOUR_IN_SECONDS} from './constants'; +import {calcUptime} from './dataFormatters/dataFormatters'; export enum NodesUptimeFilterValues { 'All' = 'All', diff --git a/src/utils/prepareQueryExplain.ts b/src/utils/prepareQueryExplain.ts index 58b2435da5..3a61714313 100644 --- a/src/utils/prepareQueryExplain.ts +++ b/src/utils/prepareQueryExplain.ts @@ -1,10 +1,10 @@ import type { - Link, + ExplainPlanNodeData, GraphNode, + Link, TopologyNodeDataStats, - TopologyNodeDataStatsSection, - ExplainPlanNodeData, TopologyNodeDataStatsItem, + TopologyNodeDataStatsSection, } from '@gravity-ui/paranoid'; import type {PlanNode} from '../types/api/query'; diff --git a/src/utils/query.test.ts b/src/utils/query.test.ts index 3ca8d3d6b4..f55daca61f 100644 --- a/src/utils/query.test.ts +++ b/src/utils/query.test.ts @@ -1,4 +1,5 @@ import type {PlanMeta, PlanNode, PlanTable, TKqpStatsQuery} from '../types/api/query'; + import { parseQueryAPIExecuteResponse, parseQueryAPIExplainResponse, diff --git a/src/utils/tests/providers.tsx b/src/utils/tests/providers.tsx index 81592dcb01..c7e3274a35 100644 --- a/src/utils/tests/providers.tsx +++ b/src/utils/tests/providers.tsx @@ -1,7 +1,8 @@ -import React, {PropsWithChildren} from 'react'; -import {Provider} from 'react-redux'; +import React from 'react'; + import {render} from '@testing-library/react'; import type {RenderOptions} from '@testing-library/react'; +import {Provider} from 'react-redux'; import {configureStore} from '../../store'; @@ -18,7 +19,7 @@ export const renderWithStore = ( ) => { const {store} = storeConfiguration; - function Wrapper({children}: PropsWithChildren<{}>) { + function Wrapper({children}: {children?: React.ReactNode}) { return {children}; } diff --git a/src/utils/timeParsers/i18n/index.ts b/src/utils/timeParsers/i18n/index.ts index 61f9288b3b..c12c526a69 100644 --- a/src/utils/timeParsers/i18n/index.ts +++ b/src/utils/timeParsers/i18n/index.ts @@ -1,11 +1,8 @@ -import {i18n, Lang} from '../../i18n'; +import {registerKeysets} from '../../i18n'; import en from './en.json'; import ru from './ru.json'; const COMPONENT = 'ydb-time-parsers'; -i18n.registerKeyset(Lang.En, COMPONENT, en); -i18n.registerKeyset(Lang.Ru, COMPONENT, ru); - -export default i18n.keyset(COMPONENT); +export default registerKeysets(COMPONENT, {ru, en}); diff --git a/src/utils/timeParsers/parsers.ts b/src/utils/timeParsers/parsers.ts index 128269f41d..0ce73b868e 100644 --- a/src/utils/timeParsers/parsers.ts +++ b/src/utils/timeParsers/parsers.ts @@ -1,6 +1,6 @@ import type {IProtobufTimeObject} from '../../types/api/common'; - import {isNumeric} from '../utils'; + import {parseProtobufDurationToMs, parseProtobufTimestampToMs} from './protobufParsers'; export const parseLag = (value: string | IProtobufTimeObject | undefined) => diff --git a/src/utils/timeParsers/protobufParsers.ts b/src/utils/timeParsers/protobufParsers.ts index 09d66e1a96..29203a4126 100644 --- a/src/utils/timeParsers/protobufParsers.ts +++ b/src/utils/timeParsers/protobufParsers.ts @@ -1,5 +1,4 @@ import type {IProtobufTimeObject} from '../../types/api/common'; - import {MS_IN_NANOSECONDS} from '../constants'; /** diff --git a/src/utils/tooltip.js b/src/utils/tooltip.js index 11a542c511..c022876b45 100644 --- a/src/utils/tooltip.js +++ b/src/utils/tooltip.js @@ -1,12 +1,13 @@ -import cn from 'bem-cn-lite'; import JSONTree from 'react-json-inspector'; import { NodeEndpointsTooltipContent, - TabletTooltipContent, PoolTooltipContent, + TabletTooltipContent, } from '../components/TooltipsContent'; +import {cn} from './cn'; + const nodeB = cn('node-tootltip'); const NodeTooltip = (props) => { diff --git a/src/utils/utils.js b/src/utils/utils.js index 7bde297fa7..7d80784e15 100644 --- a/src/utils/utils.js +++ b/src/utils/utils.js @@ -26,7 +26,7 @@ export function bytesToSize(bytes) { return ''; } if (bytes < base) return String(bytes); - let i = parseInt(Math.floor(Math.log(bytes) / Math.log(base))); + let i = parseInt(Math.floor(Math.log(bytes) / Math.log(base)), 10); if (i >= sizes.length) { i = sizes.length - 1; } diff --git a/src/utils/versions/parseNodesToVersionsValues.ts b/src/utils/versions/parseNodesToVersionsValues.ts index 726e8e993a..e9f750c708 100644 --- a/src/utils/versions/parseNodesToVersionsValues.ts +++ b/src/utils/versions/parseNodesToVersionsValues.ts @@ -1,5 +1,6 @@ import type {TSystemStateInfo} from '../../types/api/nodes'; import type {VersionToColorMap, VersionValue} from '../../types/versions'; + import {getMinorVersion} from './parseVersion'; export const parseNodesToVersionsValues = ( diff --git a/tests/models/BaseModel.ts b/tests/models/BaseModel.ts index 9da58cdbf0..afb8f514b2 100644 --- a/tests/models/BaseModel.ts +++ b/tests/models/BaseModel.ts @@ -1,4 +1,4 @@ -import {Page, Locator} from '@playwright/test'; +import type {Locator, Page} from '@playwright/test'; export class BaseModel { readonly page: Page; diff --git a/tests/models/PageModel.ts b/tests/models/PageModel.ts index d0f3c8ea68..7a28345f5b 100644 --- a/tests/models/PageModel.ts +++ b/tests/models/PageModel.ts @@ -1,5 +1,5 @@ +import type {Page} from '@playwright/test'; import qs from 'qs'; -import {Page} from '@playwright/test'; import {BaseModel} from './BaseModel'; diff --git a/tests/suites/internalViewer/internalViewer.test.ts b/tests/suites/internalViewer/internalViewer.test.ts index b8ed564f11..cd44ac1c5c 100644 --- a/tests/suites/internalViewer/internalViewer.test.ts +++ b/tests/suites/internalViewer/internalViewer.test.ts @@ -1,4 +1,4 @@ -import {test, expect} from '@playwright/test'; +import {expect, test} from '@playwright/test'; test.describe('Test InternalViewer', async () => { test('Test internalViewer header link', async ({page}) => { diff --git a/tests/suites/nodes/NodesPage.ts b/tests/suites/nodes/NodesPage.ts index 9d5f406950..f163e37574 100644 --- a/tests/suites/nodes/NodesPage.ts +++ b/tests/suites/nodes/NodesPage.ts @@ -1,8 +1,8 @@ -import {Locator, Page} from '@playwright/test'; +import type {Locator, Page} from '@playwright/test'; +import {PageModel} from '../../models/PageModel'; import {nodesPage} from '../../utils/constants'; import {selectContentTable} from '../../utils/selectContentTable'; -import {PageModel} from '../../models/PageModel'; export class NodesPage extends PageModel { readonly table: Locator; diff --git a/tests/suites/nodes/nodes.test.ts b/tests/suites/nodes/nodes.test.ts index 2497fe6f50..eb629085bc 100644 --- a/tests/suites/nodes/nodes.test.ts +++ b/tests/suites/nodes/nodes.test.ts @@ -1,4 +1,4 @@ -import {test, expect} from '@playwright/test'; +import {expect, test} from '@playwright/test'; import {NodesPage} from './NodesPage'; diff --git a/tests/suites/storage/StoragePage.ts b/tests/suites/storage/StoragePage.ts index c0ee652550..e18e9a2bc9 100644 --- a/tests/suites/storage/StoragePage.ts +++ b/tests/suites/storage/StoragePage.ts @@ -1,8 +1,8 @@ -import {Locator, Page} from '@playwright/test'; +import type {Locator, Page} from '@playwright/test'; +import {PageModel} from '../../models/PageModel'; import {storagePage} from '../../utils/constants'; import {selectContentTable} from '../../utils/selectContentTable'; -import {PageModel} from '../../models/PageModel'; type EntityType = 'Groups' | 'Nodes'; type VisibleEntityType = 'Degraded' | 'Out of space' | 'All'; diff --git a/tests/suites/storage/storage.test.ts b/tests/suites/storage/storage.test.ts index 93040c8274..38b0107068 100644 --- a/tests/suites/storage/storage.test.ts +++ b/tests/suites/storage/storage.test.ts @@ -1,4 +1,4 @@ -import {test, expect} from '@playwright/test'; +import {expect, test} from '@playwright/test'; import {StoragePage} from './StoragePage'; diff --git a/tests/suites/tenant/TenantPage.ts b/tests/suites/tenant/TenantPage.ts index b960a47894..56dfa44298 100644 --- a/tests/suites/tenant/TenantPage.ts +++ b/tests/suites/tenant/TenantPage.ts @@ -1,11 +1,9 @@ -import {Locator, Page} from '@playwright/test'; +import type {Page} from '@playwright/test'; -import {tenantPage} from '../../utils/constants'; import {PageModel} from '../../models/PageModel'; +import {tenantPage} from '../../utils/constants'; export class TenantPage extends PageModel { - readonly table: Locator; - constructor(page: Page) { super(page, tenantPage); } diff --git a/tests/suites/tenant/queryEditor/QueryEditor.ts b/tests/suites/tenant/queryEditor/QueryEditor.ts index 70424c919d..8920cf096e 100644 --- a/tests/suites/tenant/queryEditor/QueryEditor.ts +++ b/tests/suites/tenant/queryEditor/QueryEditor.ts @@ -1,4 +1,4 @@ -import {Locator, Page} from '@playwright/test'; +import type {Locator, Page} from '@playwright/test'; import {BaseModel} from '../../../models/BaseModel'; import {selectContentTable} from '../../../utils/selectContentTable'; @@ -63,7 +63,7 @@ export class QueryEditor extends BaseModel { } protected async selectExplainResultType(type: ExplainResultType) { - const radio = this.selector.locator('.ydb-query-explain-result__controls .yc-radio-button'); + const radio = this.selector.locator('.ydb-query-explain-result__controls .g-radio-button'); await radio.getByLabel(type).click(); } diff --git a/tests/suites/tenant/queryEditor/queryEditor.test.ts b/tests/suites/tenant/queryEditor/queryEditor.test.ts index 99255e605a..e3d4d259a9 100644 --- a/tests/suites/tenant/queryEditor/queryEditor.test.ts +++ b/tests/suites/tenant/queryEditor/queryEditor.test.ts @@ -1,8 +1,8 @@ -import {test, expect} from '@playwright/test'; +import {expect, test} from '@playwright/test'; import {tenantName} from '../../../utils/constants'; - import {TenantPage} from '../TenantPage'; + import {QueryEditor} from './QueryEditor'; test.describe('Test Query Editor', async () => { diff --git a/tests/suites/tenants/TenantsPage.ts b/tests/suites/tenants/TenantsPage.ts index 986995888c..593d972212 100644 --- a/tests/suites/tenants/TenantsPage.ts +++ b/tests/suites/tenants/TenantsPage.ts @@ -1,8 +1,8 @@ -import {Locator, Page} from '@playwright/test'; +import type {Locator, Page} from '@playwright/test'; +import {PageModel} from '../../models/PageModel'; import {tenantsPage} from '../../utils/constants'; import {selectContentTable} from '../../utils/selectContentTable'; -import {PageModel} from '../../models/PageModel'; export class TenantsPage extends PageModel { readonly table: Locator; diff --git a/tests/suites/tenants/tenants.test.ts b/tests/suites/tenants/tenants.test.ts index 0c25c77c37..32f1824ce0 100644 --- a/tests/suites/tenants/tenants.test.ts +++ b/tests/suites/tenants/tenants.test.ts @@ -1,4 +1,4 @@ -import {test, expect} from '@playwright/test'; +import {expect, test} from '@playwright/test'; import {TenantsPage} from './TenantsPage'; diff --git a/tests/utils/selectContentTable.ts b/tests/utils/selectContentTable.ts index 1a86bb9f2e..c95995c59a 100644 --- a/tests/utils/selectContentTable.ts +++ b/tests/utils/selectContentTable.ts @@ -1,4 +1,4 @@ -import {Locator} from '@playwright/test'; +import type {Locator} from '@playwright/test'; // react-data-table has 2 table elements - for header and for the content // so we select content table that is wrapped with .data-table__box diff --git a/tsconfig.json b/tsconfig.json index 263b1963df..58aec18834 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,6 +9,5 @@ "resolveJsonModule": true, "isolatedModules": true, "noEmit": true - }, - "include": ["src/**/*"] + } } diff --git a/tsconfig.package.json b/tsconfig.package.json index 850a68967d..245953dd01 100644 --- a/tsconfig.package.json +++ b/tsconfig.package.json @@ -6,5 +6,6 @@ "noEmit": false, "importHelpers": true }, + "include": ["src/**/*"], "exclude": ["src/setup*", "src/index.tsx", "**/__tests__", "**/tests"] } From d8432007056aea6ca6c064c344e53fb7669fdcb3 Mon Sep 17 00:00:00 2001 From: Valerii Sidorenko Date: Wed, 3 Apr 2024 00:38:37 +0200 Subject: [PATCH 2/4] fix: review --- src/components/CellWithPopover/CellWithPopover.scss | 2 +- .../InfoViewerSkeleton/InfoViewerSkeleton.scss | 2 +- src/components/TableSkeleton/TableSkeleton.scss | 2 +- src/components/TabletsOverall/TabletsOverall.scss | 2 +- src/containers/App/App.scss | 10 +++++----- src/containers/Authentication/Authentication.scss | 4 ++-- src/containers/Cluster/VersionsBar/VersionsBar.scss | 4 ++-- src/containers/Clusters/Clusters.scss | 2 +- src/containers/Heatmap/Heatmap.scss | 2 +- src/containers/Storage/Storage.scss | 2 +- .../Diagnostics/DetailedOverview/DetailedOverview.scss | 2 +- src/containers/Tenant/Diagnostics/Diagnostics.scss | 2 +- .../Versions/GroupedNodesTree/GroupedNodesTree.scss | 2 +- .../Versions/NodesTreeTitle/NodesTreeTitle.scss | 2 +- 14 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/components/CellWithPopover/CellWithPopover.scss b/src/components/CellWithPopover/CellWithPopover.scss index 7b07524640..1d12c3ec40 100644 --- a/src/components/CellWithPopover/CellWithPopover.scss +++ b/src/components/CellWithPopover/CellWithPopover.scss @@ -13,7 +13,7 @@ white-space: nowrap; text-overflow: ellipsis; - .yc-popover__handler { + .g-popover__handler { display: inline; } } diff --git a/src/components/InfoViewerSkeleton/InfoViewerSkeleton.scss b/src/components/InfoViewerSkeleton/InfoViewerSkeleton.scss index 6c0cad6e9e..025f73ad3e 100644 --- a/src/components/InfoViewerSkeleton/InfoViewerSkeleton.scss +++ b/src/components/InfoViewerSkeleton/InfoViewerSkeleton.scss @@ -9,7 +9,7 @@ min-height: var(--g-text-body-2-font-size); - .yc-skeleton { + .g-skeleton { min-height: var(--g-text-body-2-font-size); } } diff --git a/src/components/TableSkeleton/TableSkeleton.scss b/src/components/TableSkeleton/TableSkeleton.scss index a828114b1e..5e9fb52b4c 100644 --- a/src/components/TableSkeleton/TableSkeleton.scss +++ b/src/components/TableSkeleton/TableSkeleton.scss @@ -7,7 +7,7 @@ height: var(--data-table-row-height); - .yc-skeleton { + .g-skeleton { height: var(--g-text-body-2-line-height); } } diff --git a/src/components/TabletsOverall/TabletsOverall.scss b/src/components/TabletsOverall/TabletsOverall.scss index 19c6229629..0e7beb84d4 100644 --- a/src/components/TabletsOverall/TabletsOverall.scss +++ b/src/components/TabletsOverall/TabletsOverall.scss @@ -5,7 +5,7 @@ gap: 8px; &_overall { - .yc-progress { + .g-progress { width: 166px; margin: 0; } diff --git a/src/containers/App/App.scss b/src/containers/App/App.scss index 58f586da42..d806b96fc3 100644 --- a/src/containers/App/App.scss +++ b/src/containers/App/App.scss @@ -9,7 +9,7 @@ font-variant-numeric: tabular-nums; } -.yc-select-popup__tick-icon { +.g-select-popup__tick-icon { // this is a local fix, remove after the refactoring box-sizing: content-box; } @@ -45,11 +45,11 @@ body, --ydb-color-status-black: var(--g-color-base-misc-heavy); } -:is(#tab, .yc-tabs-item_active .yc-tabs-item__title) { +:is(#tab, .g-tabs-item_active .g-tabs-item__title) { color: var(--g-color-text-primary) !important; } -:is(#tab, .yc-tabs-item__title) { +:is(#tab, .g-tabs-item__title) { color: var(--g-color-text-secondary); } @@ -131,7 +131,7 @@ body, background: var(--ydb-data-table-color-hover); } -.yc-table-column-setup__item { +.g-table-column-setup__item { /* stylelint-disable-next-line declaration-no-important*/ padding: 0 8px 0 32px !important; /* stylelint-disable-next-line declaration-no-important*/ @@ -142,6 +142,6 @@ body, font-family: 'Rubik', sans-serif; } -.yc-popup { +.g-popup { max-width: 500px; } diff --git a/src/containers/Authentication/Authentication.scss b/src/containers/Authentication/Authentication.scss index b455062360..4d16cc346b 100644 --- a/src/containers/Authentication/Authentication.scss +++ b/src/containers/Authentication/Authentication.scss @@ -17,7 +17,7 @@ radial-gradient(at 110% 100%, rgba(0, 102, 255, 0.15) 20%, rgba(247, 247, 247, 0) 40%); background-blend-mode: normal; - .yc-text-input { + .g-text-input { display: flex; } @@ -70,7 +70,7 @@ width: 320px; margin-bottom: 16px; - .yc-text-input_state_error { + .g-text-input_state_error { flex-direction: column; } } diff --git a/src/containers/Cluster/VersionsBar/VersionsBar.scss b/src/containers/Cluster/VersionsBar/VersionsBar.scss index f1dbaddd33..df9a9a0c08 100644 --- a/src/containers/Cluster/VersionsBar/VersionsBar.scss +++ b/src/containers/Cluster/VersionsBar/VersionsBar.scss @@ -4,7 +4,7 @@ width: 600px; - & .yc-progress { + & .g-progress { width: 100%; } @@ -21,7 +21,7 @@ white-space: nowrap; } - & .yc-progress__stack { + & .g-progress__stack { cursor: pointer; } } diff --git a/src/containers/Clusters/Clusters.scss b/src/containers/Clusters/Clusters.scss index 3a0d20482d..1188219d11 100644 --- a/src/containers/Clusters/Clusters.scss +++ b/src/containers/Clusters/Clusters.scss @@ -81,7 +81,7 @@ word-break: break-all; } - & .yc-progress__item { + & .g-progress__item { transition: none; } diff --git a/src/containers/Heatmap/Heatmap.scss b/src/containers/Heatmap/Heatmap.scss index e00f3c22fe..3947bfcddc 100644 --- a/src/containers/Heatmap/Heatmap.scss +++ b/src/containers/Heatmap/Heatmap.scss @@ -30,7 +30,7 @@ &_overall { margin: 15px 20px; - .yc-progress { + .g-progress { width: 300px; margin: 0; } diff --git a/src/containers/Storage/Storage.scss b/src/containers/Storage/Storage.scss index cd349ced7f..5520f2f393 100644 --- a/src/containers/Storage/Storage.scss +++ b/src/containers/Storage/Storage.scss @@ -6,7 +6,7 @@ } &__table { - .yc-tooltip { + .g-tooltip { // stylelint-disable-next-line declaration-no-important height: var(--g-text-body-2-line-height) !important; } diff --git a/src/containers/Tenant/Diagnostics/DetailedOverview/DetailedOverview.scss b/src/containers/Tenant/Diagnostics/DetailedOverview/DetailedOverview.scss index c76c1ee5a9..f8fb5fbdad 100644 --- a/src/containers/Tenant/Diagnostics/DetailedOverview/DetailedOverview.scss +++ b/src/containers/Tenant/Diagnostics/DetailedOverview/DetailedOverview.scss @@ -14,7 +14,7 @@ } &__modal { - & .yc-modal__content { + & .g-modal__content { position: relative; } } diff --git a/src/containers/Tenant/Diagnostics/Diagnostics.scss b/src/containers/Tenant/Diagnostics/Diagnostics.scss index 64bbdcaf71..bde358fad8 100644 --- a/src/containers/Tenant/Diagnostics/Diagnostics.scss +++ b/src/containers/Tenant/Diagnostics/Diagnostics.scss @@ -17,7 +17,7 @@ align-items: center; box-shadow: inset 0 -1px 0 0 var(--g-color-line-generic); - & .yc-tabs_direction_horizontal { + & .g-tabs_direction_horizontal { box-shadow: unset; } } diff --git a/src/containers/Versions/GroupedNodesTree/GroupedNodesTree.scss b/src/containers/Versions/GroupedNodesTree/GroupedNodesTree.scss index 852439ee7a..ea599b954d 100644 --- a/src/containers/Versions/GroupedNodesTree/GroupedNodesTree.scss +++ b/src/containers/Versions/GroupedNodesTree/GroupedNodesTree.scss @@ -52,7 +52,7 @@ width: $item-width; } - & .yc-progress__stack { + & .g-progress__stack { cursor: pointer; } } diff --git a/src/containers/Versions/NodesTreeTitle/NodesTreeTitle.scss b/src/containers/Versions/NodesTreeTitle/NodesTreeTitle.scss index eff066f668..5bf100824f 100644 --- a/src/containers/Versions/NodesTreeTitle/NodesTreeTitle.scss +++ b/src/containers/Versions/NodesTreeTitle/NodesTreeTitle.scss @@ -50,7 +50,7 @@ width: 250px; - & .yc-progress { + & .g-progress { width: 200px; } } From 81d99b755e8aa11eb2be6ffd9e006374e6efc9b0 Mon Sep 17 00:00:00 2001 From: Valerii Sidorenko Date: Wed, 10 Apr 2024 12:09:29 +0200 Subject: [PATCH 3/4] fix: fix --- package-lock.json | 24 +++++++-------- package.json | 6 ++-- .../schemaOverview/CDCStreamOverview.tsx | 15 +++------- src/containers/Clusters/Clusters.tsx | 1 + src/containers/Clusters/useSelectedColumns.ts | 6 ++-- .../Partitions/Headers/Headers.tsx | 12 ++++---- .../PartitionsControls/PartitionsControls.tsx | 29 ++++++++++++------- .../Partitions/columns/columns.tsx | 26 +++++++---------- .../Diagnostics/Partitions/utils/constants.ts | 2 +- src/index.tsx | 10 ++----- 10 files changed, 64 insertions(+), 67 deletions(-) diff --git a/package-lock.json b/package-lock.json index b14ca74c1c..1790d29aac 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,13 +12,13 @@ "@gravity-ui/axios-wrapper": "^1.4.1", "@gravity-ui/chartkit": "^5.2.2", "@gravity-ui/components": "^3.4.1", - "@gravity-ui/date-utils": "^2.1.0", + "@gravity-ui/date-utils": "^2.2.0", "@gravity-ui/i18n": "^1.4.0", "@gravity-ui/icons": "^2.9.1", - "@gravity-ui/navigation": "^2.5.0", + "@gravity-ui/navigation": "^2.7.0", "@gravity-ui/paranoid": "^1.4.1", "@gravity-ui/react-data-table": "^2.0.1", - "@gravity-ui/uikit": "^6.8.0", + "@gravity-ui/uikit": "^6.10.0", "@gravity-ui/websql-autocomplete": "^8.0.2", "@reduxjs/toolkit": "^2.2.3", "axios": "^1.6.8", @@ -3578,9 +3578,9 @@ } }, "node_modules/@gravity-ui/date-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@gravity-ui/date-utils/-/date-utils-2.1.0.tgz", - "integrity": "sha512-f7PsINb3/Q4gDDNZnZkE5SjDQqCba6NKa1e4W6976Zc7MkJ8fNTDnhC8sQP3Xpgme/yXAOx6U1rAJiijFaJY9Q==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@gravity-ui/date-utils/-/date-utils-2.2.0.tgz", + "integrity": "sha512-OYz0QulIRiXy1b5lXAPNf5PUg9/a94CZJaEeXcEqIppnB2j6PCdQ4Id82R8J6Y8ohZ3g9DpAbP9Ngq9VbmaM0w==", "dependencies": { "dayjs": "1.11.10", "lodash": "^4.17.0" @@ -3861,9 +3861,9 @@ } }, "node_modules/@gravity-ui/navigation": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@gravity-ui/navigation/-/navigation-2.5.0.tgz", - "integrity": "sha512-3QsT0BJQ8G6Es4CLV2c99sXPOiEnFy6DjaRbdLxliv6YT5E7GSKbz65ElMjGFKPogCMXnvNLpQgPMtN6Af262Q==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@gravity-ui/navigation/-/navigation-2.7.0.tgz", + "integrity": "sha512-HsKB0GiiNQyBoMTv6YYzt7kkoSlalVxf+V/u4BVrNQsUijpIqrnO1/zG8tK2mBKFNSaehZ6rsbNQ5AOY4r697Q==", "dependencies": { "react-transition-group": "^4.4.1", "tslib": "^2.4.0" @@ -3942,9 +3942,9 @@ "dev": true }, "node_modules/@gravity-ui/uikit": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@gravity-ui/uikit/-/uikit-6.8.0.tgz", - "integrity": "sha512-6DKkQguosvYIx7zd5j5t16B1sEAK8Oa0EtbrN2KnLrlYUkokgjJJINJPU/liaSt2zexsjEDMZUDSGh8alBwLTA==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@gravity-ui/uikit/-/uikit-6.10.0.tgz", + "integrity": "sha512-F/CkSUYtC+umAnDsIU2v80pEavFg6HmwrukhsePnqci8m2Lv30Fa7/b8J2bb8M3nLWaxPG/0e0P6T8ce1HV3Gg==", "dependencies": { "@bem-react/classname": "^1.6.0", "@gravity-ui/i18n": "^1.3.0", diff --git a/package.json b/package.json index b4cb458991..362ff6299f 100644 --- a/package.json +++ b/package.json @@ -14,13 +14,13 @@ "@gravity-ui/axios-wrapper": "^1.4.1", "@gravity-ui/chartkit": "^5.2.2", "@gravity-ui/components": "^3.4.1", - "@gravity-ui/date-utils": "^2.1.0", + "@gravity-ui/date-utils": "^2.2.0", "@gravity-ui/i18n": "^1.4.0", "@gravity-ui/icons": "^2.9.1", - "@gravity-ui/navigation": "^2.5.0", + "@gravity-ui/navigation": "^2.7.0", "@gravity-ui/paranoid": "^1.4.1", "@gravity-ui/react-data-table": "^2.0.1", - "@gravity-ui/uikit": "^6.8.0", + "@gravity-ui/uikit": "^6.10.0", "@gravity-ui/websql-autocomplete": "^8.0.2", "@reduxjs/toolkit": "^2.2.3", "axios": "^1.6.8", diff --git a/src/components/InfoViewer/schemaOverview/CDCStreamOverview.tsx b/src/components/InfoViewer/schemaOverview/CDCStreamOverview.tsx index f61fa35db3..01202fcf04 100644 --- a/src/components/InfoViewer/schemaOverview/CDCStreamOverview.tsx +++ b/src/components/InfoViewer/schemaOverview/CDCStreamOverview.tsx @@ -1,12 +1,10 @@ import React from 'react'; import type {InfoViewerItem} from '..'; -import {InfoViewer} from '..'; -import type {TCdcStreamDescription, TEvDescribeSchemeResult} from '../../../types/api/schema'; +import {InfoViewer, formatObject} from '..'; +import type {TEvDescribeSchemeResult} from '../../../types/api/schema'; import {formatCdcStreamItem, formatCommonItem} from '../formatters'; -const DISPLAYED_FIELDS: Set = new Set(['Mode', 'Format']); - interface CDCStreamOverviewProps { data?: TEvDescribeSchemeResult; } @@ -22,13 +20,8 @@ export const CDCStreamOverview = ({data}: CDCStreamOverviewProps) => { info.push(formatCommonItem('PathType', data.PathDescription?.Self?.PathType)); info.push(formatCommonItem('CreateStep', data.PathDescription?.Self?.CreateStep)); - let key: keyof TCdcStreamDescription; - for (key in TableIndex) { - if (DISPLAYED_FIELDS.has(key)) { - //@ts-expect-error - info.push(formatCdcStreamItem(key, TableIndex?.[key])); - } - } + const {Mode, Format} = TableIndex || {}; + info.push(...formatObject(formatCdcStreamItem, {Mode, Format})); return ( diff --git a/src/containers/Clusters/Clusters.tsx b/src/containers/Clusters/Clusters.tsx index b51870870d..07f75c55e4 100644 --- a/src/containers/Clusters/Clusters.tsx +++ b/src/containers/Clusters/Clusters.tsx @@ -157,6 +157,7 @@ export function Clusters() { key="TableColumnSetup" popupWidth={242} items={columnsToSelect} + showStatus onUpdate={setColumns} />
diff --git a/src/containers/Clusters/useSelectedColumns.ts b/src/containers/Clusters/useSelectedColumns.ts index 8b8b18fda9..808f587222 100644 --- a/src/containers/Clusters/useSelectedColumns.ts +++ b/src/containers/Clusters/useSelectedColumns.ts @@ -22,16 +22,18 @@ export const useSelectedColumns = ( ); const columnsToSelect: TableColumnSetupItem[] = columnsIds.map((id) => { + const isRequired = requiredColumnsIds?.includes(id); return { id, title: columnsTitles[id], selected: selectedColumnsIds.includes(id), - required: requiredColumnsIds?.includes(id), + required: isRequired, + sticky: isRequired ? 'start' : undefined, }; }); const setColumns: TableColumnSetupProps['onUpdate'] = (value) => { - const selectedColumns = value.filter((el) => el.isSelected).map((el) => el.id); + const selectedColumns = value.filter((el) => el.selected).map((el) => el.id); setSelectedColumnsIds(selectedColumns); }; diff --git a/src/containers/Tenant/Diagnostics/Partitions/Headers/Headers.tsx b/src/containers/Tenant/Diagnostics/Partitions/Headers/Headers.tsx index 98e76afc56..d30227f43b 100644 --- a/src/containers/Tenant/Diagnostics/Partitions/Headers/Headers.tsx +++ b/src/containers/Tenant/Diagnostics/Partitions/Headers/Headers.tsx @@ -2,7 +2,7 @@ import {LabelWithPopover} from '../../../../../components/LabelWithPopover'; import {LagPopoverContent} from '../../../../../components/LagPopoverContent'; import {cn} from '../../../../../utils/cn'; import i18n from '../i18n'; -import {PARTITIONS_COLUMNS_IDS, PARTITIONS_COLUMNS_TITILES} from '../utils/constants'; +import {PARTITIONS_COLUMNS_IDS, PARTITIONS_COLUMNS_TITLES} from '../utils/constants'; import './Headers.scss'; @@ -18,14 +18,14 @@ export const MultilineHeader = ({title}: MultilineHeaderProps) => ( export const ReadSessionHeader = () => (
- {PARTITIONS_COLUMNS_TITILES[PARTITIONS_COLUMNS_IDS.READ_SESSION_ID]} + {PARTITIONS_COLUMNS_TITLES[PARTITIONS_COLUMNS_IDS.READ_SESSION_ID]}
); export const WriteLagsHeader = () => ( } /> ); @@ -33,7 +33,7 @@ export const WriteLagsHeader = () => ( export const ReadLagsHeader = () => ( } /> ); @@ -41,7 +41,7 @@ export const ReadLagsHeader = () => ( export const UnreadMessagesHeader = () => ( {i18n('headers.unread')} } @@ -51,7 +51,7 @@ export const UnreadMessagesHeader = () => ( export const UncommitedMessagesHeader = () => ( {i18n('headers.uncommited')} } diff --git a/src/containers/Tenant/Diagnostics/Partitions/PartitionsControls/PartitionsControls.tsx b/src/containers/Tenant/Diagnostics/Partitions/PartitionsControls/PartitionsControls.tsx index 56d94be1b4..dff2502c96 100644 --- a/src/containers/Tenant/Diagnostics/Partitions/PartitionsControls/PartitionsControls.tsx +++ b/src/containers/Tenant/Diagnostics/Partitions/PartitionsControls/PartitionsControls.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import type {SelectOption, TableColumnSetupProps} from '@gravity-ui/uikit'; +import type {SelectOption, TableColumnSetupItem, TableColumnSetupProps} from '@gravity-ui/uikit'; import {Select, TableColumnSetup} from '@gravity-ui/uikit'; import escapeRegExp from 'lodash/escapeRegExp'; @@ -8,7 +8,7 @@ import {Search} from '../../../../../components/Search/Search'; import type {ValueOf} from '../../../../../types/common'; import {b} from '../Partitions'; import i18n from '../i18n'; -import {PARTITIONS_COLUMNS_IDS, PARTITIONS_COLUMNS_TITILES} from '../utils/constants'; +import {PARTITIONS_COLUMNS_IDS, PARTITIONS_COLUMNS_TITLES} from '../utils/constants'; import type {PreparedPartitionDataWithHosts} from '../utils/types'; interface PartitionsControlsProps { @@ -91,14 +91,23 @@ export const PartitionsControls = ({ }, [consumers]); const columnsToSelect = React.useMemo(() => { - return initialColumnsIds.map((id) => { - return { - title: PARTITIONS_COLUMNS_TITILES[id as ValueOf], + const columns: TableColumnSetupItem[] = []; + for (const id of initialColumnsIds) { + const isId = id === PARTITIONS_COLUMNS_IDS.PARTITION_ID; + const column: TableColumnSetupItem = { + title: PARTITIONS_COLUMNS_TITLES[id as ValueOf], selected: Boolean(!hiddenColumns.includes(id)), id: id, - required: id === PARTITIONS_COLUMNS_IDS.PARTITION_ID, + required: isId, + sticky: isId ? 'start' : undefined, }; - }); + if (isId) { + columns.unshift(column); + } else { + columns.push(column); + } + } + return columns; }, [initialColumnsIds, hiddenColumns]); const handleConsumerSelectChange = (value: string[]) => { @@ -120,9 +129,9 @@ export const PartitionsControls = ({ // This way we do not remove from hidden these columns, that are not displayed currently // The reasons: set of columns differs for partitions with and without consumers value.forEach((el) => { - if (!el.isSelected && !hiddenColumns.includes(el.id)) { + if (!el.selected && !hiddenColumns.includes(el.id)) { result.push(el.id); - } else if (el.isSelected && hiddenColumns.includes(el.id)) { + } else if (el.selected && hiddenColumns.includes(el.id)) { result.splice(hiddenColumns.indexOf(el.id)); } }); @@ -165,7 +174,7 @@ export const PartitionsControls = ({ key="TableColumnSetup" popupWidth={242} items={columnsToSelect} - // showStatus + showStatus onUpdate={handleTableColumnsSetupChange} /> diff --git a/src/containers/Tenant/Diagnostics/Partitions/columns/columns.tsx b/src/containers/Tenant/Diagnostics/Partitions/columns/columns.tsx index 7f5a0bd6f0..a076a983b4 100644 --- a/src/containers/Tenant/Diagnostics/Partitions/columns/columns.tsx +++ b/src/containers/Tenant/Diagnostics/Partitions/columns/columns.tsx @@ -17,7 +17,7 @@ import { } from '../Headers'; import { PARTITIONS_COLUMNS_IDS, - PARTITIONS_COLUMNS_TITILES, + PARTITIONS_COLUMNS_TITLES, PARTITIONS_READ_LAGS_SUB_COLUMNS_IDS, PARTITIONS_READ_LAGS_SUB_COLUMNS_TITLES, PARTITIONS_WRITE_LAGS_SUB_COLUMNS_IDS, @@ -35,7 +35,7 @@ export const allColumns: Column[] = [ name: PARTITIONS_COLUMNS_IDS.PARTITION_ID, header: ( ), sortAccessor: (row) => isNumeric(row.partitionId) && Number(row.partitionId), @@ -45,23 +45,21 @@ export const allColumns: Column[] = [ { name: PARTITIONS_COLUMNS_IDS.STORE_SIZE, header: ( - + ), align: DataTable.RIGHT, render: ({row}) => formatBytes(row.storeSize), }, { name: PARTITIONS_COLUMNS_IDS.WRITE_SPEED, - header: PARTITIONS_COLUMNS_TITILES[PARTITIONS_COLUMNS_IDS.WRITE_SPEED], + header: PARTITIONS_COLUMNS_TITLES[PARTITIONS_COLUMNS_IDS.WRITE_SPEED], align: DataTable.LEFT, sortAccessor: (row) => row.writeSpeed.perMinute, render: ({row}) => , }, { name: PARTITIONS_COLUMNS_IDS.READ_SPEED, - header: PARTITIONS_COLUMNS_TITILES[PARTITIONS_COLUMNS_IDS.READ_SPEED], + header: PARTITIONS_COLUMNS_TITLES[PARTITIONS_COLUMNS_IDS.READ_SPEED], align: DataTable.LEFT, sortAccessor: (row) => row.readSpeed?.perMinute, render: ({row}) => , @@ -136,7 +134,7 @@ export const allColumns: Column[] = [ name: PARTITIONS_COLUMNS_IDS.START_OFFSET, header: ( ), sortAccessor: (row) => isNumeric(row.startOffset) && Number(row.startOffset), @@ -146,9 +144,7 @@ export const allColumns: Column[] = [ { name: PARTITIONS_COLUMNS_IDS.END_OFFSET, header: ( - + ), sortAccessor: (row) => isNumeric(row.endOffset) && Number(row.endOffset), align: DataTable.RIGHT, @@ -158,7 +154,7 @@ export const allColumns: Column[] = [ name: PARTITIONS_COLUMNS_IDS.COMMITED_OFFSET, header: ( ), sortAccessor: (row) => isNumeric(row.commitedOffset) && Number(row.commitedOffset), @@ -185,7 +181,7 @@ export const allColumns: Column[] = [ name: PARTITIONS_COLUMNS_IDS.READER_NAME, header: ( ), align: DataTable.LEFT, @@ -205,7 +201,7 @@ export const allColumns: Column[] = [ name: PARTITIONS_COLUMNS_IDS.PARTITION_HOST, header: ( ), align: DataTable.LEFT, @@ -226,7 +222,7 @@ export const allColumns: Column[] = [ name: PARTITIONS_COLUMNS_IDS.CONNECTION_HOST, header: ( ), align: DataTable.LEFT, diff --git a/src/containers/Tenant/Diagnostics/Partitions/utils/constants.ts b/src/containers/Tenant/Diagnostics/Partitions/utils/constants.ts index 0e12fc67cc..c4195b6067 100644 --- a/src/containers/Tenant/Diagnostics/Partitions/utils/constants.ts +++ b/src/containers/Tenant/Diagnostics/Partitions/utils/constants.ts @@ -23,7 +23,7 @@ export const PARTITIONS_COLUMNS_IDS = { CONNECTION_HOST: 'connectionHost', } as const; -export const PARTITIONS_COLUMNS_TITILES = { +export const PARTITIONS_COLUMNS_TITLES = { [PARTITIONS_COLUMNS_IDS.PARTITION_ID]: 'Partition ID', [PARTITIONS_COLUMNS_IDS.STORE_SIZE]: 'Store size', diff --git a/src/index.tsx b/src/index.tsx index 703c9f6730..1b437a73cd 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -1,6 +1,4 @@ /* eslint-disable import/order */ -import React from 'react'; - import ReactDOM from 'react-dom/client'; import '@gravity-ui/uikit/styles/styles.scss'; @@ -30,11 +28,9 @@ async function render() { } const root = ReactDOM.createRoot(container); root.render( - - - - - , + + + , ); } From 4caeca66a473e056d6cf4c9a78b17a83cd145730 Mon Sep 17 00:00:00 2001 From: Valerii Sidorenko Date: Wed, 10 Apr 2024 13:20:03 +0000 Subject: [PATCH 4/4] fix: fix --- package-lock.json | 8 ++++---- package.json | 2 +- .../InfoViewer/formatters/cdcStream.ts | 1 - src/containers/Clusters/Clusters.tsx | 17 ++++++++--------- .../PartitionsControls/PartitionsControls.tsx | 1 + 5 files changed, 14 insertions(+), 15 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1790d29aac..2c736bbf3c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,7 @@ "@gravity-ui/navigation": "^2.7.0", "@gravity-ui/paranoid": "^1.4.1", "@gravity-ui/react-data-table": "^2.0.1", - "@gravity-ui/uikit": "^6.10.0", + "@gravity-ui/uikit": "^6.10.2", "@gravity-ui/websql-autocomplete": "^8.0.2", "@reduxjs/toolkit": "^2.2.3", "axios": "^1.6.8", @@ -3942,9 +3942,9 @@ "dev": true }, "node_modules/@gravity-ui/uikit": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@gravity-ui/uikit/-/uikit-6.10.0.tgz", - "integrity": "sha512-F/CkSUYtC+umAnDsIU2v80pEavFg6HmwrukhsePnqci8m2Lv30Fa7/b8J2bb8M3nLWaxPG/0e0P6T8ce1HV3Gg==", + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/@gravity-ui/uikit/-/uikit-6.10.2.tgz", + "integrity": "sha512-pa9rRJPMECbQnLUJRkHWJNHa+ym5awW33sGevJyYyWb9J3M8gzzqfcj+ZCQE89i1N8nRKPpcmh7VrZK+DNU0yg==", "dependencies": { "@bem-react/classname": "^1.6.0", "@gravity-ui/i18n": "^1.3.0", diff --git a/package.json b/package.json index 362ff6299f..bca4525a15 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "@gravity-ui/navigation": "^2.7.0", "@gravity-ui/paranoid": "^1.4.1", "@gravity-ui/react-data-table": "^2.0.1", - "@gravity-ui/uikit": "^6.10.0", + "@gravity-ui/uikit": "^6.10.2", "@gravity-ui/websql-autocomplete": "^8.0.2", "@reduxjs/toolkit": "^2.2.3", "axios": "^1.6.8", diff --git a/src/components/InfoViewer/formatters/cdcStream.ts b/src/components/InfoViewer/formatters/cdcStream.ts index b394daafe2..16a8c94b09 100644 --- a/src/components/InfoViewer/formatters/cdcStream.ts +++ b/src/components/InfoViewer/formatters/cdcStream.ts @@ -5,6 +5,5 @@ export const formatCdcStreamItem = createInfoFormatter({ values: { Mode: (value) => value?.substring('ECdcStreamMode'.length), Format: (value) => value?.substring('ECdcStreamFormat'.length), - PathId: (value) => JSON.stringify(value), }, }); diff --git a/src/containers/Clusters/Clusters.tsx b/src/containers/Clusters/Clusters.tsx index 07f75c55e4..cd9e45376b 100644 --- a/src/containers/Clusters/Clusters.tsx +++ b/src/containers/Clusters/Clusters.tsx @@ -152,15 +152,14 @@ export function Clusters() { />
-
- -
+
diff --git a/src/containers/Tenant/Diagnostics/Partitions/PartitionsControls/PartitionsControls.tsx b/src/containers/Tenant/Diagnostics/Partitions/PartitionsControls/PartitionsControls.tsx index dff2502c96..3348ebb9fc 100644 --- a/src/containers/Tenant/Diagnostics/Partitions/PartitionsControls/PartitionsControls.tsx +++ b/src/containers/Tenant/Diagnostics/Partitions/PartitionsControls/PartitionsControls.tsx @@ -176,6 +176,7 @@ export const PartitionsControls = ({ items={columnsToSelect} showStatus onUpdate={handleTableColumnsSetupChange} + sortable={false} />
);